Integrar Odoo con PrestaShop para un negocio B2B implica sincronizar productos, stock por almacén, listas de precios por cliente, pedidos con condiciones comerciales y datos fiscales de empresa. Odoo tiene una arquitectura modular con una API XML-RPC y JSON-RPC bien documentada. PrestaShop expone una WebService API REST. El reto no es la conexión técnica, sino mapear correctamente la lógica B2B entre ambos sistemas.

Odoo es un ERP con ventajas claras para B2B: gestión multi-empresa nativa, listas de precios ilimitadas, reglas de precio por cantidad/fecha/cliente, y un módulo de inventario con multi-almacén y trazabilidad de lotes. PrestaShop, por su parte, tiene funciones B2B sólidas: grupos de clientes, precios específicos, pedidos mínimos y acceso restringido por grupo. La integración conecta estos dos mundos.

Ventajas de Odoo para integraciones B2B

Multi-empresa nativa

Odoo permite gestionar múltiples empresas en la misma instancia con datos compartidos o separados. Productos pueden ser comunes entre empresas, pero precios, stock y pedidos son independientes. Esto es clave para grupos industriales con varias sociedades que comparten catálogo pero tienen condiciones comerciales diferentes.

Listas de precios flexibles

El sistema de precios de Odoo es de los más potentes del mercado ERP. Permite crear listas de precios con reglas complejas: precio base + margen, descuento sobre otra lista, precio fijo, precio por cantidad mínima, precio por fecha (campañas). Cada cliente B2B tiene asignada una lista de precios principal y puede tener reglas adicionales.

API abierta y consistente

La API de Odoo (XML-RPC y JSON-RPC) expone todos los modelos de datos de forma uniforme. Puedes leer, crear, actualizar y eliminar cualquier objeto del ERP. No hay objetos ocultos ni limitaciones artificiales. Esto facilita enormemente la integración comparado con ERPs que limitan el acceso vía API.

Qué sincronizar entre Odoo y PrestaShop B2B

Productos (product.template / product.product)

Odoo tiene un modelo de producto con dos niveles: product.template (producto base) y product.product (variante). Una camiseta es un template; la camiseta en talla L y color azul es un product. PrestaShop tiene una estructura similar con products y combinations. El mapeo es directo pero hay que gestionar los atributos de variante correctamente.

Campos a sincronizar: nombre, referencia interna, descripción, peso, categoría, atributos de variante, impuesto aplicable. La dirección es Odoo → PrestaShop (el ERP es maestro de producto).

Stock multi-almacén

Odoo gestiona stock por ubicación (stock.quant). Cada almacén tiene ubicaciones internas. El stock disponible se calcula como: stock en mano - reservado - en tránsito. Para PrestaShop, necesitas enviar el stock disponible real, no el stock contable.

Si tienes tres almacenes (Madrid, Barcelona, Valencia), puedes sincronizar el stock total al PrestaShop o el stock por almacén si la tienda gestiona envío desde múltiples ubicaciones. El middleware debe consultar stock.quant filtrado por location_id y calcular la cantidad disponible correcta.

Precios B2B por cliente

Este es el flujo más complejo. Odoo puede tener 50 listas de precios diferentes. Cada cliente B2B tiene una lista asignada. El middleware debe:

  1. Leer las listas de precios de Odoo con sus reglas
  2. Calcular el precio final para cada producto en cada lista
  3. Crear grupos de clientes en PrestaShop correspondientes a cada lista de precios
  4. Crear specific_prices en PrestaShop para cada combinación producto-grupo
  5. Asignar cada cliente al grupo correcto

Cuando un cliente B2B inicia sesión en PrestaShop, ve automáticamente los precios de su lista. Si Odoo actualiza una lista de precios, el middleware recalcula y actualiza los specific_prices en PrestaShop.

Pedidos con lógica comercial

Un pedido B2B desde PrestaShop debe crear un sale.order en Odoo con:

  • El partner_id correcto (cliente Odoo mapeado desde el customer de PrestaShop)
  • La lista de precios asignada al cliente (para que Odoo valide los precios)
  • Las condiciones de pago del cliente (payment.term del partner en Odoo)
  • El almacén de origen correcto (warehouse_id según zona de envío)
  • La referencia del pedido de PrestaShop como referencia del cliente en Odoo

Clientes (res.partner)

Un nuevo cliente B2B que se registra en PrestaShop debe crearse como res.partner en Odoo con:

  • Datos fiscales: NIF/CIF, razón social, dirección fiscal
  • Lista de precios asignada (puede ser una lista por defecto para nuevos clientes)
  • Condiciones de pago por defecto
  • Comercial asignado (user_id en Odoo) según zona o criterio

Configuración multi-empresa en la integración

Si tu Odoo gestiona varias empresas, la integración debe tener en cuenta:

  • Contexto de empresa: cada llamada a la API de Odoo debe incluir el company_id en el contexto para acceder a los datos de la empresa correcta.
  • Productos compartidos vs. independientes: un producto puede ser compartido entre empresas (mismo product.template) pero con precios y stock independientes por empresa.
  • Múltiples tiendas: cada empresa puede tener su propio PrestaShop o compartir uno con multi-tienda. El middleware debe mapear empresa Odoo → tienda PrestaShop correctamente.

Ejemplo de flujo completo

Un cliente B2B de la empresa «Industrias López» con lista de precios «Tarifa Distribuidores» compra 100 unidades del producto «VAL-2024» en PrestaShop:

  1. PrestaShop envía el pedido al middleware vía webhook
  2. El middleware busca «Industrias López» en Odoo por NIF → encuentra partner_id 1547
  3. Verifica que el partner tiene la lista de precios «Tarifa Distribuidores» asignada
  4. Busca el producto «VAL-2024» en Odoo → encuentra product_id 892
  5. Verifica stock disponible en el almacén de la zona del cliente → 150 unidades disponibles
  6. Crea sale.order en Odoo con partner_id=1547, product_id=892, qty=100, pricelist=distribuidores
  7. Odoo confirma el pedido y devuelve sale_order_id=SO2024-4521
  8. El middleware actualiza el pedido de PrestaShop con la referencia del ERP
  9. Cuando Odoo genera el albarán (stock.picking), el middleware actualiza el estado en PrestaShop a «Enviado» con tracking

Todo esto ocurre en segundos, sin intervención humana. Y si algo falla en cualquier paso, queda registrado con detalle para su resolución.