#API Doc — Integración Odoo Producción

Versión 14 | Base path: /api/v1 | Formato: JSON UTF-8 | Autenticación: Bearer Token

#1. Introducción

Esta API conecta un sistema externo con Odoo para soportar procesos del módulo de Producción. Define de forma unificada los endpoints, contratos de datos, validaciones y reglas de sincronización para operar con demanda comercial, órdenes de fabricación y maestros compartidos.

DominioAlcance
VentasRecepción de demanda comercial
ProducciónÓrdenes de fabricación directas o derivadas
MaestrosProductos, BOMs, clientes, almacenes

#2. Casos de integración

#Caso A — Demanda por venta

El sistema externo informa una demanda comercial. La API registra la venta en Odoo y el ERP genera la fabricación mediante su flujo estándar de abastecimiento y MRP.

#Caso B — Producción directa

El sistema externo actúa como planificador y la API crea directamente la orden de fabricación en Odoo con los datos de planificación necesarios.


#3. Autenticación

ElementoValor
HeaderAuthorization: Bearer <token>
Sistema origenX-Source-System: <codigo_sistema>
IdempotenciaIdempotency-Key: <uuid> para POST/PUT
TrazabilidadX-Correlation-Id: <uuid> recomendado

#4. Convenciones

ReglaDetalle
FormatoJSON UTF-8
FechasISO 8601 (2026-06-26T10:00:00Z)
Claves externasexternal_id obligatorio en toda entidad
IdempotenciaCada POST/PUT debe ser idempotente por Idempotency-Key y por external_id
Maestros previosLos maestros primarios deben existir antes de enviar demanda o producción
Referencias cruzadasSe resuelven siempre por clave externa, no por IDs internos de Odoo

#Envelope de respuesta

{
  "success": true,
  "data": {},
  "meta": {
    "correlation_id": "...",
    "timestamp": "2026-06-26T23:30:00Z"
  },
  "errors": []
}

#5. Sincronización de datos maestros

#Prioridad de maestros

MaestroPrioridadUsoObligatorio enClave externa
ProductoPrimarioFabricación / venta / consumoCasos A y Bproduct_external_id
Lista de materialesPrimarioDefinición de componentesCasos A y Bbom_external_id
ClienteSecundarioDemanda comercialCaso Acustomer_external_id
ProveedorSecundarioAbastecimiento / trazabilidadOpcionalvendor_external_id
Almacén / UbicaciónSecundarioStock y reservasCasos A y Bwarehouse_code / location_code
Unidad de medidaSecundarioCantidadesCasos A y Buom_code
Routing / Work CenterSecundarioPlanificación operativaCaso Brouting_external_id

#Estrategia técnica


#6. Endpoints

#Autenticación y headers comunes

Todos los endpoints requieren:

Authorization: Bearer <token>
X-Source-System: <codigo_sistema>
Content-Type: application/json

#6.1 Productos

POST /api/v1/master-data/products/upsert

Crea o actualiza productos necesarios para venta, fabricación y consumo.

#Request

CampoTipoReqDescripción
external_idstringIdentificador único del producto en sistema origen
skustringCódigo de producto
namestringNombre comercial / interno
typestringstorable \consumable \service
uom_codestringUnidad de medida base
can_be_soldbooleanVenta habilitada
can_be_purchasedbooleanCompra habilitada
can_be_manufacturedbooleanFabricación habilitada
trackingstringnone \lot \serial
activebooleanEstado activo
{
  "external_id": "PROD-1001",
  "sku": "PT-1001",
  "name": "Producto terminado A",
  "type": "storable",
  "uom_code": "UN",
  "can_be_sold": true,
  "can_be_manufactured": true,
  "tracking": "lot",
  "active": true
}

#Response

{
  "success": true,
  "data": {
    "external_id": "PROD-1001",
    "odoo_model": "product.product",
    "odoo_id": 2481,
    "status": "upserted"
  },
  "errors": []
}

#6.2 Listas de materiales

POST /api/v1/master-data/boms/upsert

Crea o actualiza listas de materiales y sus componentes.

#Request

CampoTipoReqDescripción
external_idstringIdentificador único de la BOM
product_external_idstringProducto fabricado
uom_codestringUnidad de medida de la BOM
base_quantitynumberCantidad base de fabricación
versionstringVersión lógica
routing_external_idstringRouting asociado
componentsarrayDetalle de materiales

#components[]

CampoTipoReqDescripción
component_product_external_idstringProducto componente
quantitynumberCantidad requerida
uom_codestringUnidad de medida
operation_external_idstringOperación asociada
scrap_factornumberMerma esperada
{
  "external_id": "BOM-PT-1001-V1",
  "product_external_id": "PROD-1001",
  "uom_code": "UN",
  "base_quantity": 1,
  "version": "v1",
  "routing_external_id": "ROUT-010",
  "components": [
    {
      "component_product_external_id": "MAT-2001",
      "quantity": 2,
      "uom_code": "UN"
    },
    {
      "component_product_external_id": "MAT-2002",
      "quantity": 0.5,
      "uom_code": "KG",
      "scrap_factor": 0.03
    }
  ]
}

#6.3 Caso A — Demanda por venta

POST /api/v1/case-a/sales-orders

El sistema externo envía una demanda comercial. La API crea una orden de venta y Odoo genera la fabricación mediante su flujo estándar de reaprovisionamiento/MRP.

#Request

CampoTipoReqDescripción
external_order_idstringIdentificador único del pedido externo
customer_external_idstringCliente
order_datedatetimeFecha del pedido
requested_datedatetimeFecha deseada
warehouse_codestringAlmacén de ejecución
linesarrayDetalle de demanda
notesstringObservaciones

#lines[]

CampoTipoReqDescripción
line_external_idstringIdentificador de línea
product_external_idstringProducto demandado
quantitynumberCantidad
uom_codestringUnidad de medida
price_unitnumberPrecio unitario
bom_external_idstringBOM a priorizar si aplica
{
  "external_order_id": "SO-EXT-9001",
  "customer_external_id": "CUST-5001",
  "order_date": "2026-06-26T10:00:00Z",
  "warehouse_code": "WH-01",
  "lines": [
    {
      "line_external_id": "SO-EXT-9001-1",
      "product_external_id": "PROD-1001",
      "quantity": 120,
      "uom_code": "UN",
      "price_unit": 0
    }
  ]
}

#Response

{
  "success": true,
  "data": {
    "external_order_id": "SO-EXT-9001",
    "sale_order": {"odoo_id": 981, "name": "S000981"},
    "manufacturing": {"status": "triggered"}
  },
  "errors": []
}

#6.4 Caso B — Producción directa

POST /api/v1/case-b/manufacturing-orders

El sistema externo decide qué producir y la API crea directamente la orden de fabricación en Odoo.

#Request

CampoTipoReqDescripción
external_mo_idstringIdentificador único de orden externa
product_external_idstringProducto a fabricar
bom_external_idstringLista de materiales
quantitynumberCantidad a producir
uom_codestringUnidad de medida
planned_startdatetimeInicio planificado
planned_finishdatetimeFin planificado
warehouse_codestringAlmacén de ejecución
routing_external_idstringRouting específico
prioritystringPrioridad
origin_referencestringReferencia de planificación
{
  "external_mo_id": "MO-EXT-7001",
  "product_external_id": "PROD-1001",
  "bom_external_id": "BOM-PT-1001-V1",
  "quantity": 250,
  "planned_start": "2026-06-27T08:00:00Z",
  "warehouse_code": "WH-01",
  "routing_external_id": "ROUT-010",
  "priority": "high"
}

#Response

{
  "success": true,
  "data": {
    "external_mo_id": "MO-EXT-7001",
    "manufacturing_order": {"odoo_id": 4521, "name": "MO/004521"},
    "state": "confirmed"
  },
  "errors": []
}

#6.5 Consulta de estado

GET /api/v1/status/production-orders/{external_id}

Consulta el estado consolidado de una demanda u orden de producción.

#Response

CampoTipoDescripción
external_idstringIdentificador consultado
case_typestringcase_a o case_b
odoo_documentobjectID y nombre interno
statestringEstado de fabricación
reserved_componentsbooleanReserva de insumos
produced_qtynumberCantidad producida
last_sync_atdatetimeÚltima actualización

#6.6 Maestros secundarios

EndpointUsoCarácterCampos mínimos
POST /api/v1/master-data/customers/upsertDemanda comercial caso ACondicionalexternal_id, name, vat/tax_id
POST /api/v1/master-data/vendors/upsertAbastecimientoOpcionalexternal_id, name, vat/tax_id
POST /api/v1/master-data/warehouses/upsertStock / reservasRecomendadowarehouse_code, name
POST /api/v1/master-data/routings/upsertOperaciones productivasCondicionalexternal_id, name, operations[]

#7. Errores

HTTPCódigoCausaAcción
400VALIDATION_ERRORContrato inválidoCorregir payload
401UNAUTHORIZEDToken inválidoRenovar credenciales
404MASTER_NOT_FOUNDProducto/BOM/cliente inexistenteSincronizar maestro
409DUPLICATED_REQUESTIdempotency-Key o external_id repetidoNo reenviar sin revisar
422BUSINESS_RULE_ERRORRegla de negocio no satisfechaRevisar configuración Odoo
503ODOO_UNAVAILABLEFalla del ERP o adaptadorRetry controlado
{
  "success": false,
  "data": null,
  "errors": [
    {
      "code": "MASTER_NOT_FOUND",
      "message": "No existe product_external_id=PROD-1001",
      "field": "product_external_id"
    }
  ]
}

#8. Mapeo interno con Odoo

API públicaModelo OdooOperación esperada
/master-data/products/upsertproduct.template / product.productAlta/actualización de producto
/master-data/boms/upsertmrp.bom / mrp.bom.lineAlta/actualización de BOM
/master-data/customers/upsertres.partnerAlta/actualización de cliente
/case-a/sales-orderssale.order / sale.order.lineCreación y confirmación de venta
/case-b/manufacturing-ordersmrp.productionCreación, confirmación y planificación
/status/production-orders/{id}mrp.production / stock.move / mrp.workorderLectura de estado consolidado
Nota de implementación: el adaptador Odoo debe resolver referencias externas en tablas de equivalencia o campos dedicados (x_external_id) y preservar unicidad por modelo.

📄 Fuente: Informe de Integración Odoo Producción v14