Contrato de API — Sync de productos compuestos (PC Manager → Integrador)¶
Para: equipo PC Manager (Python)
Endpoint: POST /api/supplier-products/sync (Sanctum) — alias POST /api/supplier-products (token estático)
Referencia de diseño: docs/rfc/004-soporte-productos-compuestos.md
Fecha: 2026-07-14
1. Qué cambia¶
El payload de cada producto acepta dos campos nuevos, opcionales:
| Campo | Tipo | Reglas |
|---|---|---|
type |
string | "simple" o "composite". Opcional; default "simple". |
components |
array | Requerido si type = "composite", mínimo 1 elemento. Cada elemento: {"sku": string, "quantity": int >= 1}. |
El sku de cada componente es el sku de product_items del Integrador — el mismo que PC Manager lee de GET /api/products (campo sku). No usar sku_sap ni IDs.
Los productos simples no necesitan ningún cambio: el payload actual sigue siendo 100% válido.
2. Ejemplo — alta/actualización de un combo¶
{
"supplier_id": 1,
"supplier_code": "CL",
"products": [
{
"sku": "pcm-00123",
"name": "PC Gamer X",
"short_description": "",
"long_description": "",
"regular_price": 5500000.0,
"special_price": null,
"special_from_date": null,
"special_to_date": null,
"stock": 5,
"category": "PC ARMADAS",
"brand": "Compulandia",
"active": true,
"images": [],
"type": "composite",
"components": [
{ "sku": "MEM-KING-16", "quantity": 2 },
{ "sku": "SSD-WD-1TB", "quantity": 1 }
]
}
]
}
3. Semántica de actualización (importante)¶
La composición se trata con semántica PATCH: solo se toca si viene en el payload.
| Payload recibido | Comportamiento en el Integrador |
|---|---|
Sin type ni components |
La receta guardada no se toca. Se actualizan solo los campos enviados (precio, stock, etc.). Un combo puede recibir updates de precio/stock sin re-enviar su receta. |
type: "composite" + components |
La receta recibida reemplaza completa a la anterior (snapshot, sin merge). Es la forma de crear el combo y también de comunicar una sustitución de componente: se envía la lista final vigente. |
type: "composite" sin components |
HTTP 422 — rechazado por validación. Si se declara compuesto, la receta debe venir completa. |
components sin type |
Se asume composite (la presencia de receta implica compuesto). |
type: "simple" en un producto que era compuesto |
La receta se elimina y la variante vuelve a simple. Es la forma de "des-armar" un combo. |
Recomendación para PC Manager: enviar type + components completos en cada push del combo (alta, cambio de receta, sustitución), y omitir ambos campos en pushes que solo actualizan precio/stock. Nunca enviar components: [] ni components: null para "no cambiar" — simplemente omitir la clave.
4. Respuesta y warnings¶
La respuesta incluye, por producto, el resultado y los problemas de resolución de componentes:
{
"status": "success",
"message": "Productos procesados correctamente.",
"processed": [
{
"sku": "pcm-00123",
"status": "updated",
"warnings": [
"Componente 'SSD-NUEVO-XYZ': no existe como ProductItem"
]
}
]
}
warningsvacío = receta aceptada (y materializada, si el producto ya está confirmado en el Integrador).- El push nunca falla por un componente no resoluble: el JSON crudo se guarda siempre. Pero atención a la semántica:
- Producto pendiente (aún no confirmado por un operador): los warnings son informativos; la receta se validará al confirmar.
- Producto confirmado: si algún componente no resuelve, la receta nueva NO se aplica — se conserva la anterior hasta recibir un push cuya receta resuelva completa. El warning es la señal para corregir y reenviar.
Motivos posibles de warning por componente: no existe como ProductItem, el ProductItem está inactivo, no tiene sku_sap (sin inventario en SAP).
5. Efectos aguas abajo (contexto)¶
Cuando la receta se materializa en un combo confirmado, el Integrador reindexa el documento del combo en Algolia (product_items_view_index) en el mismo request, agregando:
{ "product_type": "composite",
"components": [
{ "product_item_id": 501, "sku": "MEM-KING-16", "sku_sap": "A00123", "name": "RAM 16GB DDR5", "quantity": 2 }
] }
Por eso importa que PC Manager pushee inmediatamente al sustituir un componente (comportamiento ya confirmado): la ventana en que el OMS puede ver una receta vieja depende solo de ese push.