Inventario

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)

  1. Toma el almacén configurado en x_invubisync (DROP Fabato por defecto) más las ubicaciones hijas de NAUC/Almacén General.
  2. Borra todas las líneas anteriores del batch.
  3. Para cada producto con marca FABATO:
  4. Suma available_quantity de los quants en esas ubicaciones.
  5. Resta las cantidades reservadas en pickings con picking_type_id = 150 y picking.state = 'confirmed'.
  6. Si el resultado es ≤ 1, lo reporta como 0.
  7. Crea una línea en x_lininvsync con el stock calculado.
  8. 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:

  1. Busca movimientos de stock en los últimos N minutos en los almacenes monitoreados.
  2. Para cada producto involucrado, verifica si su available_quantity es 0.
  3. Si es 0, lo agrega a una lista que Autoazur lee y pausa publicaciones.
  4. 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_id del almacén DROP Fabato.
  • Hijas de la stock.location ID 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}")

Siguientes pasos