Cómo funciona el sync de inventario
El flujo Odoo → Autoazur → Marketplaces que mantiene tu stock consistente entre canales.
Cómo funciona el sync de inventario
El sync de inventario es el corazón del plugin. Es lo que evita que vendas en MercadoLibre algo que ya se vendió en Liverpool 30 segundos antes.
El flujo en una imagen mental
Odoo (stock real por almacén)
↓ cron cada 30 min
Modelo x_invubisync (cálculo agregado)
↓ Autoazur lee este modelo
Marketplaces (stock publicado por canal)
Detalle técnico
Modelos custom que intervienen
| Modelo | Función |
|---|---|
x_invubisync |
Container del batch (registro principal con almacén de referencia) |
x_lininvsync |
Una línea por producto con su stock calculado |
x_stopper_az |
Detector de stock cero rápido (corre cada 5 min) |
x_logs_autoazur |
Bitácora de cada operación |
Lógica del cron de sync (cada 30 min)
- Toma el almacén configurado en
x_invubisync(DROP Fabato por defecto) más las ubicaciones hijas de NAUC/Almacén General. - Borra todas las líneas anteriores del batch.
- Para cada producto con marca FABATO:
- Suma
available_quantityde los quants en esas ubicaciones. - Resta las cantidades reservadas en pickings con
picking_type_id = 150ypicking.state = 'confirmed'. - Si el resultado es ≤ 1, lo reporta como 0.
- Crea una línea en
x_lininvsynccon el stock calculado. - Autoazur lee este modelo en su próximo ciclo y publica los cambios en cada marketplace.
Stopper rápido (cada 5 min)
El sync corre cada 30 min, pero entre syncs pueden caer ventas que dejan productos en 0. El stopper:
- Busca movimientos de stock en los últimos N minutos en los almacenes monitoreados.
- Para cada producto involucrado, verifica si su
available_quantityes 0. - Si es 0, lo agrega a una lista que Autoazur lee y pausa publicaciones.
- También maneja kits phantom: si un componente está en 0, pausa el kit completo.
La regla ≤1 = 0
Si el stock final calculado es 1 o menos, enviamos 0 a Autoazur. Esto previene sobreventa pero puede causar pérdida de ventas legítimas si tu reabasto es frecuente.
Trade-off explícito: prevenir 1 sobreventa cuesta perder hasta 1 venta por SKU entre reabastos. Para la mayoría de sellers el cálculo conviene; si tu SKU es de muy alta rotación con reabasto ágil, considera ajustar umbrales con tu KAM.
Ubicaciones incluidas
El sync NO mira todo tu Odoo, solo:
- Hijas de la
view_location_iddel almacén DROP Fabato. - Hijas de la
stock.locationID 8 (NAUC/Almacén General).
Si tienes inventario en otros almacenes que también debería estar disponible para venta en marketplaces, hay que ajustarlo. Soporte lo configura.
Verificación rápida desde shell
# 1. Producto
prod = env['product.product'].search([('default_code', '=', 'CODIGO')], limit=1)
# 2. Stock real
print(f"On Hand: {prod.qty_available}, Forecasted: {prod.virtual_available}")
# 3. Qué envía el sync
lineas = env['x_lininvsync'].search([('x_studio_producto', '=', prod.id)])
for l in lineas:
print(f"Sync: {l.x_studio_inventario_por_ubicacin.x_name} | Stock: {l.x_studio_stock}")