Operaciones minoristas¶
Para quién es esta guía
Para operaciones de ventas y contabilidad del canal minorista de Reyder: equipos vendidos por socios como AnyMobile, no mediante órdenes de venta mayoristas normales.
Qué logrará: reservar equipos para un socio minorista y registrar las ventas a medida que ocurren, una por una o mediante un archivo CSV.
Retail o mayorista — qué flujo usar¶
| Situación | Flujo correcto |
|---|---|
| Un cliente B2B hace un pedido específico: “quiero estos 3 IMEI” | Orden de venta |
| Un socio minorista mantiene inventario consignado y vende lo que tenga salida | Retail Reservation + Retail Sale (esta guía) |
En retail no se sabe de antemano qué IMEI venderá el socio. Primero se reserva un lote, el socio vende durante un período y después se registra cada venta en el sistema.
La reserva es obligatoria; no existe una venta retail directa
Las líneas de venta minorista solo permiten equipos con
is_retail_reserved=True y cuyo socio reservado coincide con el socio del encabezado
de la venta. No puede añadir un equipo sin reservarlo primero para ese socio. Para una
venta aislada, cree primero una reserva breve y luego la Retail Sale.
Parte 1 — Reservas minoristas¶
Una reserva separa un conjunto de equipos para un socio minorista específico. Mientras está activa, esos equipos no pueden asignarse a otras órdenes.
Paso 1 — Abrir Reserve/Release Devices¶
Abra Device Ops → Devices → Reserve/Release Devices.
Seleccione el modo apropiado:
- Manual — elegir IMEI individualmente.
- By manifest — incluir todo un receiving manifest.
- By PO — incluir todo lo recibido de una purchase order.
- By filters — filtrar por modelo, capacidad, grado y color.
Complete Retail Partner, Retail Location, Return Storage Location y Expected Return Date, la fecha en que espera recibir los equipos no vendidos. La ubicación de retorno debe pertenecer a la Holding Company. Pulse Reserve Devices.
Configure una vez el estante de retorno
Un administrador debe configurar Settings → Inventory → Retail Operations → Retail Return Storage Location para cada compañía que mantiene físicamente los equipos. Las reservas nuevas copian ese destino seguro. Si queda vacío, Odoo solo usa un destino cuando existe una única ubicación de almacenamiento inequívoca de esa compañía; si hay duda, detiene el proceso en lugar de adivinar.
Qué hace una reserva¶
- Crea un registro
device.retail.reservationen estado Active. - Marca cada equipo con el socio minorista y
is_retail_reserved = True. - Opcionalmente mueve físicamente los equipos a la ubicación retail y crea un registro
device.movementpara la auditoría.
Revise las reservas activas en Device Ops → Devices → Retail Reservations.
Paso 2, más adelante — Liberar la reserva al terminar¶
Cuando el socio devuelve todos los equipos restantes que no vendió, abra Reserve/Release Devices, elija Release, seleccione la reserva y pulse Release Reservation. Esta acción libera toda la reserva; no hay un selector para liberar solo algunas unidades.
- Se elimina el indicador de socio minorista de cada equipo todavía enlazado.
- Los equipos que siguen en la ubicación retail regresan a Return Storage Location, un destino de la compañía que queda guardado al activar la reserva.
Una liberación bloqueada protege los equipos
Si Odoo indica que falta la ubicación de retorno o que es ambigua, no borre la reserva manualmente. Configure Retail Return Storage Location para la Holding Company e inténtelo otra vez. Mientras tanto, la reserva y los IMEI no cambian.
No libere una reserva por una devolución parcial
Si regresaron solamente algunos teléfonos, deténgase y pida a un gerente que divida o corrija primero el registro operativo. Release Reservation funciona todo o nada.
Cierre automático¶
No es necesario liberar manualmente una reserva cuando se vendió todo. Al registrar la venta del último equipo reservado, la reserva cambia automáticamente a Released.
Parte 2 — Ventas minoristas¶
Registre las ventas reales del socio. Cada venta cierra IMEI específicos y publica la contabilidad correspondiente.
Opción A — Registrar ventas una por una¶
Abra Device Ops → Devices → Retail Sales → New.
- Seleccione Retail Partner y Sale Date.
- Añada una línea por IMEI vendido; seleccione el equipo e indique su Sale Price.
- Pulse Confirm cuando la venta esté completa.
Por defecto, el selector limita la lista a equipos reservados para ese socio, con QC Complete y costo de compra positivo. Al confirmar, Odoo comprueba por separado que cada equipo siga Available. Un Sales Manager o Inventory Manager puede marcar Exception Override y explicar el motivo de una excepción de QC/costo; la excepción no omite el control de disponibilidad. Puede cubrir Pending QC, In QC o costo faltante/cero, pero nunca QC Failed.
La excepción es deliberadamente limitada. No permite vender un equipo QC Failed, sin reserva, reservado para otro socio u otra compañía, ya vendido, duplicado en las líneas o con precio de venta cero. Un equipo fallado debe repararse, probarse de nuevo y quedar en el estado QC correcto antes de poder seleccionarlo.
Opción B — Importar un CSV de ventas¶
Es más rápido cuando el socio envía un informe semanal.
Abra Device Ops → Devices → Import Retail Sales.
Cargue un CSV. El asistente reconoce estas columnas sin distinguir mayúsculas y busca
coincidencias parciales en el encabezado; por ejemplo IMEI, imei e IMEI Number
funcionan. Ignora columnas adicionales y filas vacías.
| Columna | Obligatoria | Nota |
|---|---|---|
IMEI, o un encabezado que contenga imei |
Sí | Debe coincidir con un equipo que ya existe en Odoo |
Sale Price, o un encabezado que contenga price |
Sí | Precio real de venta del IMEI; debe ser un número positivo |
Sale Date, o un encabezado que contenga date |
No | Si existe, el importador usa la fecha válida más temprana de todas las filas como fecha de la venta completa; no guarda una fecha distinta por línea |
Puede conservar en el archivo otras columnas del socio, como SKU o marcadores de exportación; Odoo las ignora.
El asistente crea un solo device.retail.sale en Draft y una línea por IMEI. No lo
confirma automáticamente. Revise el borrador y pulse Confirm en el formulario para
publicar la contabilidad.
La importación aplica las mismas reglas de reserva y precio que la entrada manual. La preparación de QC/costo se comprueba al confirmar el borrador, por lo que un gerente puede revisarlo y aplicar Exception Override antes de confirmarlo cuando corresponda.
¿El archivo mezcla ventas de varios socios?
Prepare un archivo por socio minorista. Retail Partner pertenece al encabezado, no a cada línea. Además, cada equipo debe estar reservado de antemano para ese mismo socio.
Una importación equivale a una sola fecha de venta
Si las filas tienen fechas diferentes, Odoo usa la fecha más temprana para toda la venta Draft. Separe el archivo por fecha cuando la contabilidad diaria deba conservar fechas distintas.
Qué ocurre al confirmar una Retail Sale¶
Al pulsar Confirm, todo ocurre dentro de una misma transacción:
- Cada equipo cambia a
Sold. Su línea de venta retail conserva el precio indicado, y el equipo/reporte conserva la Sale Date del encabezado, no la hora posterior en que alguien pulsa Confirm. - Con una configuración contable válida, se publica el asiento de COGS, débito a
COGS / crédito a Valuation, por la suma de los
purchase_costdistintos de cero. Una excepción de costo cero aprobada aporta cero. Si el total de costo aprobado es cero, Odoo no crea asiento COGS y Contabilidad debe revisar la excepción auditada. - Se crea y publica de todos modos una factura al cliente minorista, una línea por equipo al precio de venta y sin impuesto, aunque el total COGS aprobado sea cero.
- Para equipos consignados de Axis, se crean y confirman los informes emparejados. La línea privada de la consignataria guarda el Retail Partner como Customer y la Sale Date del encabezado; la línea de la propietaria no guarda ninguno de esos datos. Axis recibe su factura de proveedor igual que en una venta por SO.
Después de confirmar, el formulario muestra Settlement Reports cuando corresponde. Las referencias de factura y COGS se guardan en la venta, pero actualmente no tienen botones inteligentes en el formulario. Contabilidad debe buscarlas en las listas normales de Invoices y Journal Entries usando la referencia de la Retail Sale.
Problemas comunes¶
El equipo que quiero vender no aparece en la lista
La línea exige que coincidan reserva, socio y Holding Company. Reserve primero el equipo para ese socio. Si está Pending QC, In QC o con costo cero, un gerente puede usar Exception Override. QC Failed nunca aparece como opción de excepción. Un IMEI desactualizado que ya no esté Available se bloquea al confirmar.
Confirm muestra un error de validación
Lea el mensaje completo. Las causas comunes son Sale Price vacío/no positivo, Retail Partner faltante, una reserva desactualizada o un IMEI que ya no está Available.
Confirm indica que el equipo no está listo para vender
Si está Pending QC, In QC o con costo vacío/cero, complete el trabajo o pida a un Sales Manager/Inventory Manager que marque Exception Override y escriba el motivo. El chatter conserva la auditoría. QC Failed es un bloqueo absoluto: repare y pruebe otra vez el equipo o seleccione otro IMEI; no existe excepción.
La importación CSV rechaza el archivo
Odoo normaliza los encabezados: minúsculas y espacios convertidos en guiones bajos; luego
busca imei, price y opcionalmente date. Por eso funcionan IMEI Number, Device
IMEI, Unit Price y variantes. Las fechas mezcladas se convierten en la fecha más
temprana del encabezado. El asistente exige:
- una columna cuyo nombre contenga imei y otra que contenga price;
- que cada IMEI ya exista como
stock.lot; el importador no recibe equipos nuevos; - que cada IMEI esté reservado para el Retail Partner del encabezado;
- un precio de venta que pueda convertirse en número positivo.
Si una fila falla, el mensaje incluye su número para que corrija solamente esa fila.
Se confirmó la venta, pero no apareció un informe de liquidación
Los informes se generan únicamente para equipos consignados, cuando la compañía
propietaria es distinta de la vendedora. Si Reyder era la propietaria, no corresponde
liquidación. Revise owner_company_id en cada equipo.
La factura se publicó en el diario equivocado
Las facturas retail usan el primer diario de ventas configurado para la compañía de la Retail Sale. Este flujo no tiene un selector de diario por cliente. Pida a contabilidad que corrija la configuración de diarios antes de confirmar más ventas; no edite ni vuelva a publicar la factura sin un proceso aprobado.




