Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-CAT-05: qué piezas participan, en qué orden hablan, qué APIs hay que construir con su request y su response, y qué le entrega a la épica siguiente.
Para quién. Los equipos que van a construir la épica, QA y arquitectura.
Estado. [Propuesta] del TL del Nuevo PIM, 18-oct-2026, construida sobre ADR-12. La spec de cada épica dice el qué; estas páginas, el cómo.
Fuente. docs/arquitectura/por-epica/epicas/FT-CAT-05.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-CAT-05-sitios-enrutamiento-y-visibilidad.md.
En 30 segundos
Cuando un producto queda Aprobado hay que decidir a qué tiendas en línea (sitios) y a qué sistemas va, según su negocio dueño: lo de Suburbia sólo se prende en Suburbia, lo de Marketplace sólo en Liverpool y lo de Suburbia nunca va al portal de ofertas. Esta épica toma esa decisión en el PIM, sin que el seller elija, la deja registrada, pide publicar a cada canal y guarda lo que contesta cada destino.
- Módulo dueño: MS-02 Producto. También participan: MS-01 Catálogo, MS-08 Adaptadores de salida, MS-10 Exportador al DWH, MS-14 Avisos y ayuda.
- Etapa 8 · Publicación. Recibe «PE-8 · Aprobado», «PE-10 · Cambio aprobado», «PE-M · Producto migrado», «PE-C · Catálogo vigente» y entrega «PE-9 · Publicado por canal».
- APIs: construye 4 y usa 11 que construyen otras épicas.
- Eventos: publica 4 y consume 6.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| PE-8 · Aprobado | El producto Aprobado, con su negocio, sus categorías web y la versión aprobada, listo para publicarse en sus canales. |
| PE-10 · Cambio aprobado | Un cambio aprobado: los canales afectados regresan de Publicado a Enviado con la versión nueva. |
| PE-M · Producto migrado | Un producto migrado con su estado por canal: los canales en Pendiente o Error siguen desde aquí sin repetir etapas. |
| PE-C · Catálogo vigente | La regla de sitios por negocio y la lista oficial de sitios con sus códigos, en MS-01. |
| FT-CAT-02 · Publicación de categorías a la tienda | Las categorías web ya publicadas en la tienda, con su sitio y su ID de catálogo. |
| FT-FLU-07 · Excepciones de catalogación y preventas con publicación… | Lo exceptuado no lleva los canales tienda ni Marketplace; la preventa lleva su bandera y sus fechas. |
| FT-INT-02 · Publicación a OMS, DWH y Señalización | El acuse de OMS con el que el enrutamiento de Producto habilita la venta en la tienda. |
| FT-REF-01 · Datos de referencia administrables | La lista oficial de sitios con sus códigos y su ID de catálogo (API-01-046), que usa la regla de sitios por negocio. |
Entrega
| A | Qué |
|---|---|
| PE-9 · Publicado por canal | Cada destino con su estado: Publicado con el acuse o Error con el motivo, y los sitios decididos guardados en el producto antes de publicar. |
| FT-INT-01 · Publicación a e-commerce | La petición de publicar con sitios y canales ya decididos, y la foto del producto lista para armar el XML de la tienda. |
| FT-INT-02 · Publicación a OMS, DWH y Señalización | La misma petición para OMS, Señalización y DWH, con el XML guardado con su huella. |
Cambios de estado que hace
| Transición | De → a | Cuándo |
|---|---|---|
| C01 | Inicio → Pendiente (por canal) | El producto queda Aprobado. |
| C02 | Pendiente → Enviado (por canal) | Cumple el mínimo del canal y el bus confirma que tomó el mensaje. |
| C03 | Enviado → Publicado (por canal) | Llega el acuse del destino. |
| C04 | Enviado → Error (por canal) | No llega el acuse o el destino rechaza. |
| C05 | Error → Enviado (por canal) | Se republica. |
| C07 | Publicado → Retirado (por canal) | Baja en ese canal. |
| C08 | Retirado → Enviado (por canal) | Se republica. |
2. Diagrama de contexto
Quién participa y cómo se conecta. Las pantallas llegan por el BFF del portal, que valida el token y compone; cada módulo vuelve a validar el token y decide sus permisos con los roles de MS-13.
🟩 Verde: nuevo, se construye · 🟦 Azul: ya existe y se queda, se reutiliza su código · 🟧 Naranja: temporal o se retira (se apaga en R3) · ⬜ Gris: sistema externo · ★ módulo dueño
3. Diagrama de flujo
El camino principal, paso por paso. Cuando una pantalla llama a un módulo se ven dos flechas: la pantalla al BFF y el BFF al módulo. Los eventos salen del outbox del módulo después de guardar; quien los consume ignora los repetidos.
Los pasos en texto
| Paso | De | A | Qué hace | API o evento |
|---|---|---|---|---|
| 1 | MS-02 Producto | MS-01 Catálogo | Lee la regla de sitios del negocio del producto | API-01-016 |
| 2 | MS-02 Producto | Base pim | Decide sitios y canales y los guarda en el producto | — |
| 3 | MS-02 Producto | Base pim | Deja cada canal en Pendiente y revisa su mínimo | — |
| 4 | MS-02 Producto | Eventos | Pide publicar en los canales que cumplen | catalog.product.publication/PUBLICATION_REQUESTED |
| 5 | Eventos | MS-08 Adaptadores de salida | Entrega la petición a los adaptadores | catalog.product.publication/PUBLICATION_REQUESTED |
| 6 | MS-08 Adaptadores de salida | MS-02 Producto | Pide la foto del producto en la versión aprobada | API-02-054 |
| 7 | MS-08 Adaptadores de salida | Tienda en línea | Manda el XML con las categorías de sus sitios | — |
| 8 | MS-08 Adaptadores de salida | OMS | Manda el mismo XML sin clasificaciones | — |
| 9 | MS-08 Adaptadores de salida | Marketplace | Manda el documento de Marketplace o de stock out | — |
| 10 | MS-08 Adaptadores de salida | Archivos e imágenes (almacén y CDN) | Guarda el XML enviado para Señalización y el DWH | — |
| 11 | MS-08 Adaptadores de salida | Eventos | Devuelve el acuse de cada destino | catalog.delivery.result/DELIVERY_RESULT |
| 12 | Eventos | MS-02 Producto | Entrega los acuses de cada canal | catalog.delivery.result/DELIVERY_RESULT |
| 13 | MS-02 Producto | Base pim | Marca cada canal Publicado y guarda el intento | — |
| 14 | MS-02 Producto | Eventos | Avisa el nuevo estado de cada canal | catalog.product.changed/STATUS_CHANGED |
3.1 Si un destino rechaza o no contesta
3.2 Retirar un producto de un canal
3.3 Limpieza de Suburbia con sitio Liverpool
4. Si algo sale mal
- Un destino no contesta. El reloj de MS-02 vigila los canales en Enviado: si no llega acuse en el plazo del canal (30 minutos por omisión para la tienda y OMS), el canal pasa a Error «Sin acuse». Nada se reenvía a ciegas: lo dudoso del lado de MS-08 queda en su revisión de lotes inciertos (API-08-001) y una persona decide reenviar o descartar con motivo (API-08-002).
- Un producto de Suburbia trae una categoría de un sitio Liverpool. La regla de sitios la deja fuera del XML antes de enviar y la marca como aviso en el estado por destino: el producto nunca se prende en Liverpool. La limpieza del dato la hace Gobierno de Datos.
- Falta la categoría web o la imagen principal. El canal tienda se queda en Pendiente con el motivo y entra al reporte diario y a la cola de Category; OMS y Marketplace no la esperan. Una variante sin imagen principal congelada no viaja y las demás sí.
- Un producto no tiene negocio dueño. No se enruta ni se publica a todos los sitios por omisión: sus canales se quedan en Pendiente con «Sin negocio» y el caso entra a la cola de Gobierno de Datos.
- Cambia la regla de sitios en MS-01. MS-02 se entera por catalog.governance.changed y la regla nueva vale para lo que se apruebe después. Lo ya publicado se corrige con una republicación explícita, con vista previa (API-02-039).
5. APIs
Las que construye esta épica (4)
GET /internal/product/products/{id}/publication-snapshot?version= · Foto del producto para publicar
| Campo | Valor |
|---|---|
| API | API-02-054 · MS-02 Producto |
| Para qué | Da a MS-08 todo lo que necesita para armar el XML de una versión aprobada: negocio dueño, sitios decididos, producto y variantes con la marca «procede», atributos con los canales que los usan, categorías con su rama bajo Sitios Web, las últimas categorías enviadas (para retirar las que ya no tiene), imágenes congeladas, tienda del proveedor en Marketplace y envase. |
| En esta épica | La foto del producto en la versión aprobada para armar el XML |
| Quién la llama | MS-08 Adaptadores de salida |
| Permiso | Sólo MS-08 (cuenta de servicio) |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | id = PRD-0004812, version = 9 |
| También la usan | FT-FLU-05, FT-IA-01, FT-IA-03, FT-IA-04, FT-IA-05, FT-INT-01, FT-INT-02, FT-INT-05, FT-INT-07, FT-MIG-03, FT-PLT-08, FT-RAC-02 |
Request
null
Response · 200
{
"success": true,
"data": {
"productId": "PRD-0004812",
"version": 9,
"business": "MER",
"productType": "GENERICO_CON_VARIANTES",
"templateId": "EU4-0412",
"name": "Licuadora de 10 velocidades",
"brand": "MARCA01",
"inventoryOwner": "MER",
"routing": {
"sites": [
{
"site": "LIVERPOOL",
"idCatalog": "ICatalog1000"
}
],
"ruleVersion": 4
},
"attributes": [
{
"attribute": "POTENCIA_W",
"value": "600",
"channels": [
"TIENDA",
"OMS",
"MARKETPLACE"
]
},
{
"attribute": "GARANTIA_MESES",
"value": "12",
"channels": [
"TIENDA"
]
}
],
"variants": [
{
"variantId": "VAR-0004812-01",
"sku": "1000004812",
"ean": "7501234567893",
"eanType": "IE",
"variantSequence": 1,
"procede": true,
"images": [
{
"position": 1,
"type": "PRINCIPAL",
"assetId": "ast-77120",
"frozenPath": "congeladas/PRD-0004812/VAR-0004812-01/1.jpg"
}
]
},
{
"variantId": "VAR-0004812-02",
"sku": "1000004813",
"ean": "7501234567909",
"eanType": "IE",
"variantSequence": 2,
"procede": false,
"reason": "Sin imagen principal congelada",
"images": []
}
],
"categories": [
{
"categoryId": "catst000123",
"site": "LIVERPOOL",
"path": [
"Sitios Web",
"Liverpool",
"Electrodomésticos",
"Licuadoras"
],
"direct": true
}
],
"lastApprovedCategories": [
"catst000120"
],
"supplierShopId": "2001",
"envase": "CAJA",
"baseUnitOfMeasure": "PZA"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El producto o esa versión no existe |
| 422 | BUSINESS_ERROR | La versión pedida no es una versión aprobada |
POST /api/v2/publications/eligibility · ¿Es enviable a cada canal?
| Campo | Valor |
|---|---|
| API | API-02-041 · MS-02 Producto |
| Para qué | Dice, sin enviar nada, si cada producto y cada variante cumple el mínimo de cada canal de su negocio (tienda, OMS, Marketplace, Señalización y DWH), a qué sitios iría y por qué no, para que nadie se entere en la tienda de lo que faltaba. |
| En esta épica | Saber, antes de enviar, si un producto es enviable por canal y por variante |
| Quién la llama | BFF del portal |
| Permiso | ENT-L (Operaciones, Foro, ReportesForo y las áreas internas con lectura) |
| Cabeceras | Authorization, X-Request-Id |
| También la usan | FT-INT-01, FT-MIG-03 |
Request
{
"productIds": [
"PRD-0004812",
"PRD-0007301"
],
"context": "APPROVE"
}
Response · 200
{
"success": true,
"data": {
"items": [
{
"productId": "PRD-0004812",
"business": "MER",
"version": 9,
"channels": [
{
"channel": "TIENDA",
"eligible": true,
"sites": [
"LIVERPOOL"
],
"variants": [
{
"variantId": "VAR-0004812-01",
"eligible": true
},
{
"variantId": "VAR-0004812-02",
"eligible": false,
"reasons": [
{
"code": "MAIN_IMAGE_MISSING",
"message": "Sin imagen principal congelada: esta variante no viaja"
}
]
}
]
},
{
"channel": "OMS",
"eligible": true
},
{
"channel": "MARKETPLACE",
"eligible": true,
"document": "LVP"
},
{
"channel": "SENALIZACION",
"eligible": false,
"reasons": [
{
"code": "NOT_FLAGGED",
"message": "El artículo no está marcado para Señalización"
}
]
},
{
"channel": "DWH",
"eligible": true
}
]
},
{
"productId": "PRD-0007301",
"business": "MKP",
"version": 3,
"channels": [
{
"channel": "TIENDA",
"eligible": false,
"sites": [
"LIVERPOOL"
],
"reasons": [
{
"code": "WEB_CATEGORY_MISSING",
"message": "Sin categoría web del sitio Liverpool"
}
]
},
{
"channel": "OMS",
"eligible": true
},
{
"channel": "MARKETPLACE",
"eligible": true,
"document": "MKT"
},
{
"channel": "DWH",
"eligible": true
}
]
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | Más de 100 productos o un contexto que no existe (APPROVE, REPUBLISH, REPOPULATE) |
| 404 | NOT_FOUND | Algún producto no existe o no es visible para quien llama |
GET /api/v2/delivery-status?productId=&sku= · Estado de un producto en cada destino
| Campo | Valor |
|---|---|
| API | API-02-042 · MS-02 Producto |
| Para qué | Muestra, por producto o por SKU, en qué estado está cada canal (Pendiente, Enviado, Publicado, Error o Retirado), a qué sitios va, qué versión se mandó, cuándo y qué contestó el destino, con el resumen «publicado en 3 de 5 destinos». |
| En esta épica | El estado de cada destino del producto |
| Quién la llama | BFF del portal |
| Permiso | ENT-L; el proveedor o seller dueño ve el de sus productos |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | productId = PRD-0004812 |
| También la usan | FT-CAT-06, FT-INT-01, FT-INT-05, FT-PRD-10, FT-RAC-05 |
Request
null
Response · 200
{
"success": true,
"data": {
"productId": "PRD-0004812",
"business": "MER",
"status": "APROBADO",
"approvedVersion": 9,
"routing": {
"sites": [
"LIVERPOOL"
],
"decidedAt": "2026-10-18T15:20:00Z",
"ruleVersion": 4
},
"summary": "Publicado en 3 de 5 destinos",
"channels": [
{
"channel": "TIENDA",
"state": "PUBLICADO",
"sites": [
"LIVERPOOL"
],
"version": 9,
"sentAt": "2026-10-18T15:20:02Z",
"ackAt": "2026-10-18T15:20:09Z",
"lastResult": "ACCEPTED",
"message": "Se procesó correctamente",
"attempts": 1
},
{
"channel": "OMS",
"state": "PUBLICADO",
"version": 9,
"sentAt": "2026-10-18T15:20:02Z",
"ackAt": "2026-10-18T15:20:05Z",
"lastResult": "ACCEPTED",
"attempts": 1
},
{
"channel": "MARKETPLACE",
"state": "ERROR",
"document": "LVP",
"version": 9,
"sentAt": "2026-10-18T15:20:02Z",
"lastResult": "FAILED",
"message": "El destino rechazó el documento: tienda del proveedor inválida",
"attempts": 2
},
{
"channel": "SENALIZACION",
"state": "PUBLICADO",
"version": 9,
"sentAt": "2026-10-18T15:21:00Z",
"ackAt": "2026-10-18T15:23:00Z",
"lastResult": "ACCEPTED",
"attempts": 1
},
{
"channel": "DWH",
"state": "ENVIADO",
"version": 9,
"sentAt": "2026-10-18T15:21:00Z",
"attempts": 1
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | No trae productId ni sku |
| 404 | NOT_FOUND | El producto o el SKU no existe o no es visible para quien llama |
GET /api/v2/delivery-attempts?productId=&sku=&from=&to= · Bitácora de envíos
| Campo | Valor |
|---|---|
| API | API-02-043 · MS-02 Producto |
| Para qué | Lista cada intento de envío de un producto o SKU en un periodo: operación, canal, versión, cuándo salió, cuándo contestó el destino, qué contestó y la referencia del XML enviado con su SHA-256. |
| En esta épica | La bitácora de envíos con su evidencia |
| Quién la llama | BFF del portal |
| Permiso | ENT-L |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | productId = PRD-0004812, from = 2026-10-01T00:00:00Z, to = 2026-10-18T23:59:59Z, page = 1, size = 50 |
| También la usan | FT-INT-07 |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"attemptId": "att-5512",
"jobId": "job-a1f0",
"operation": "APPROVE",
"channel": "MARKETPLACE",
"document": "LVP",
"version": 9,
"attempt": 1,
"sentAt": "2026-10-18T15:20:02Z",
"ackAt": "2026-10-18T15:20:30Z",
"result": "FAILED",
"destinationResponse": "Tienda del proveedor inválida",
"trackingId": null,
"evidence": {
"xmlRef": "evidencias/publicaciones/2026/10/18/job-a1f0-mkp-001.xml",
"sha256": "1c0be72d9a35"
}
},
{
"attemptId": "att-5508",
"jobId": "job-a1f0",
"operation": "APPROVE",
"channel": "TIENDA",
"version": 9,
"attempt": 1,
"sentAt": "2026-10-18T15:20:02Z",
"ackAt": "2026-10-18T15:20:09Z",
"result": "ACCEPTED",
"destinationResponse": "Se procesó correctamente",
"evidence": {
"xmlRef": "evidencias/publicaciones/2026/10/18/job-a1f0-tienda-001.xml",
"sha256": "9f2c7e11a04b"
}
}
],
"page": 1,
"size": 50,
"total": 2
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | Falta productId o sku, o el periodo pasa de 13 meses |
Las que usa y construye otra épica (11)
Su request y su response están en la página de la épica que la construye.
| API | Método y ruta | Para qué, aquí | La construye |
|---|---|---|---|
| API-01-016 | GET /api/v2/rules?type= | La regla de sitios por negocio (tipo de regla SITE_ROUTING de MS-01) | FT-PLT-07 · Reglas de atributos |
| API-01-017 | POST /api/v2/rules/plans | Gobierno de Producto cambia la regla de sitios con vista previa | FT-PLT-07 · Reglas de atributos |
| API-01-004 | POST /api/v2/catalog-plans/{planId}/apply | Confirmar el cambio de la regla de sitios | FT-PLT-01 · Fundamentos de gobierno de plantillas |
| API-01-046 | GET /api/v2/brands | La lista oficial de sitios con sus tres códigos y su ID de catálogo | FT-REF-01 · Datos de referencia administrables |
| API-02-039 | POST /api/v2/publications/plans | Republicar o retirar de un canal, con vista previa | FT-INT-07 · Repoblamiento masivo de productos hacia la tienda |
| API-02-057 | POST /api/v2/product-plans/{planId}/apply | Confirmar la republicación, el retiro o la limpieza | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-001 | POST /api/v2/products/search | Buscar productos de Suburbia con categorías del sitio Liverpool | FT-PRD-01 · Modelo canónico de producto |
| API-02-016 | POST /api/v2/products/classifications/plans | Quitar categorías en bloque | FT-CAT-03 · Categorización de productos |
| API-14-005 | POST /internal/notifications/messages | Avisar a Operación de un canal en Error | FT-RAC-05 · Estatus del producto y motivos visibles para seller y… |
| API-08-001 | GET /api/v2/egress/review | Los lotes inciertos de cada destino en MS-08 | FT-INT-01 · Publicación a e-commerce |
| API-08-002 | POST /api/v2/egress/review/{batchId}/resolve | Reenviar o descartar un lote incierto, con motivo | FT-INT-01 · Publicación a e-commerce |
6. Eventos
Publica
| Evento | Cuándo | Quién lo consume |
|---|---|---|
catalog.product.publication/PUBLICATION_REQUESTED | El producto queda Aprobado, se aprueba un cambio, se republica un canal o se retira de él | FT-CAT-06, FT-INT-01, FT-INT-02, FT-INT-05, FT-INT-07, FT-PLT-08, FT-PRD-05, FT-RAC-03 |
catalog.product.changed/CLASSIFICATION_CHANGED | La limpieza de Suburbia quita categorías de Liverpool | FT-ACT-05, FT-ACT-06, FT-IA-02, FT-IA-04 |
catalog.product.changed/STATUS_CHANGED | Un canal cambia de estado: el cambio viaja en channels.<destino>.status, sin tipo nuevo | FT-ACT-05, FT-ARQ-02, FT-FLU-01, FT-IA-04, FT-PRD-02, FT-PRD-04, FT-PRD-06, FT-PRD-10, FT-RAC-03, FT-RAC-05, FT-RAC-06 |
catalog.delivery.result/DELIVERY_RESULT | MS-08 devuelve el acuse o el rechazo de cada destino | FT-ARQ-02, FT-CAT-02, FT-CAT-06, FT-IA-05, FT-INT-01, FT-INT-02, FT-INT-05, FT-INT-07, FT-PRD-02, FT-PRD-10, FT-RAC-06 |
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
catalog.product.changed/STATUS_CHANGED | MS-14 avisa al proveedor o seller que su producto quedó publicado | esta misma épica |
catalog.product.changed/CLASSIFICATION_CHANGED | MS-05 guarda en la bitácora qué categorías quitó la limpieza | esta misma épica |
catalog.product.publication/PUBLICATION_REQUESTED | MS-08 arma y manda lo que recibe cada destino | esta misma épica |
catalog.delivery.result/DELIVERY_RESULT | MS-02 marca el canal Publicado, en Error o Retirado y guarda el intento | esta misma épica |
catalog.egress.files/OBJECT_FINALIZE | MS-08 manda a Señalización y MS-10 al DWH el XML guardado | D-ARCHIVOS |
catalog.governance.changed/RULE_CHANGED | MS-02 refresca su copia de la regla de sitios | FT-CAT-04, FT-PLT-07, FT-REF-02 |
7. Datos
Cada colección tiene un solo dueño, el único que escribe en ella.
| Colección | Dueño | Qué guarda | Esta épica |
|---|---|---|---|
products | MS-02 | La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos. | escribe |
product_delivery_status | MS-02 | El estado de publicación por producto y canal: Pendiente, Enviado, Publicado, Error o Retirado. | escribe |
product_jobs | MS-02 | Trabajos asíncronos: cargas masivas de productos, edición masiva y publicación. | escribe |
product_receipts | MS-02 | El recibo de cada escritura confirmada en el producto (antes operation_receipts). | escribe |
product_outbox | MS-02 | Los cambios del producto que esperan salir como evento (antes outbox). | escribe |
publication_rules | MS-02 | El mínimo que pide cada canal para publicar. | lee |
catalog_exceptions | MS-02 | Excepciones de catalogación: qué no se publica o va por la vía rápida. | lee |
governance_rules | MS-01 | Reglas de captura y clasificación: marcas por plantilla, grupo de artículo a plantilla, alcance del proveedor y lista negra de Marketplace. | lee |
brands | MS-01 | Los sitios (banners): Liverpool, Suburbia y los demás. | lee |
categories | MS-01 | Cada categoría web con su lugar en el árbol y su estado. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-CAT-05·H1 · Que el PIM decida de antemano a qué sitios va cada producto | P1 | pasos 1, 2, 3, 4; API-01-016, API-01-017, API-02-041 |
| FT-CAT-05·H2 · Que el seller no elija el sitio | P1 | pasos 2 |
| FT-CAT-05·H3 · Recibir el negocio dueño de cada producto | P1 | pasos 6; API-02-054 |
| FT-CAT-05·H4 · Que nunca se prenda en mi sitio un artículo con inventario de Liverpool | P2 | API-02-054. Fuera: La regla que no consulta el inventario de Liverpool en Suburbia la aplica la tienda (PEN-139); el PIM sólo le manda el negocio dueño y el dueño del inventario en la foto del producto. |
| FT-CAT-05·H5 · Limpiar los productos de Suburbia que tienen el sitio Liverpool | P2 | flujo «Limpieza de Suburbia con sitio Liverpool»; API-02-001, API-02-016 |
| FT-CAT-05·H6 · Una lista oficial de sitios con sus códigos | P2 | pasos 1; API-01-046 |
| FT-CAT-05·H7 · Árbol full y mega menú | P1 | Fuera: Lo resuelve FT-CAT-01 en MS-01 (administración del árbol de categorías web): el árbol full, el del mega menú, el sitio nuevo con su árbol y copiar, mover o eliminar ramas. Aquí sólo se lee el sitio de cada categoría. |
9. Decisiones de esta épica
Las tomó el TL como arquitecto; quedan como [Propuesta] hasta que el equipo de la épica las revise.
- D-CAT-05-1. Canales por negocio, en publication_rules de MS-02: Mercaderías va a la tienda (sitio Liverpool y los que diga la regla por marca), OMS, Marketplace con el documento de stock out (LVP) y DWH; Suburbia va a la tienda sólo en el sitio Suburbia, OMS y DWH, y nunca a Marketplace; Marketplace va a la tienda sólo en el sitio Liverpool, OMS, Marketplace con el documento MKT y DWH. Señalización, en los tres, sólo si el artículo trae la marca de Señalización. Por qué: Es lo que hace hoy el código (Mirakl nunca recibe Suburbia; Marketplace sólo vende en Liverpool) puesto en una tabla, para dejar de enrutar a mano. Se apoya en P-40, RN-CAT-04, RN-CAT-06, PEN-133.
- D-CAT-05-2. La regla de sitios es configuración del catálogo: vive en MS-01 como un tipo nuevo de regla (SITE_ROUTING en governance_rules) que administra Gobierno de Producto con Category. MS-02 la evalúa al aprobar y guarda en el producto los sitios, la versión de la regla y la fecha, antes de publicar. El seller nunca elige sitio. Por qué: Un solo dueño para la regla (el catálogo) y otro para la decisión de cada producto (Producto); así la decisión queda registrada antes de publicar, como pide RF-CAT-11. Se apoya en PEN-42, PEN-89, RF-CAT-11, PD-05.
- D-CAT-05-3. Un sitio es la rama de nivel 0 de «Sitios Web» y se nombra con la tabla oficial de sitios y sus tres códigos. La tienda recibe sólo las categorías de los sitios permitidos para el negocio; las demás se quitan del XML y quedan como aviso. Por qué: Con el código de sitio equivocado la categoría no llega a la tienda, y un producto enrutado a dos sitios anula la lista negra por negocio. Se apoya en DUD-21, DEC-95.
- D-CAT-05-4. El negocio dueño es el campo business del producto (MER, SUB o MKP), fijado al entrar; para lo que nace en SAP se calcula con la regla 1.0 (con EXTWG de S4H, Suburbia; con negocio «ART. MARKETPLACE», Marketplace; si no, Mercaderías). Sin negocio no se publica. Por qué: E-commerce aplica la visibilidad por sitio con este dato y hoy unos 60 mil renglones no lo tienen; un valor por omisión escondería el problema. Se apoya en DUD-19, PD-17.
- D-CAT-05-5. El mínimo de cada canal está en publication_rules: qué revisa por contexto (aprobar, republicar, repoblar) y con qué acción (apagado, aviso o bloqueo). La lista de atributos obligatorios de cada destino la pone MS-01 (FT-PLT-04). La tienda pide al menos una categoría web del sitio; OMS y Marketplace no la esperan; una variante sin imagen principal congelada no viaja. Por qué: Aprobar no espera a los canales y cada canal publica cuando cumple su mínimo; la categoría frena sólo a la tienda, como propone PD-22. Se apoya en PD-22, RF-PUB-12, RF-PUB-01.
- D-CAT-05-6. Estados por canal: Enviado al escribir PUBLICATION_REQUESTED en el outbox, en la misma transacción; Publicado con el acuse ACCEPTED, que sólo dice que el destino leyó el mensaje; Error con FAILED, con UNCERTAIN o si no hay acuse en el plazo del canal. Nada se reenvía solo. La petición lleva jobId, operación, producto, versión y, por canal, sitios y documento; cada cambio de canal sale como STATUS_CHANGED con el cambio en channels.<destino>.status. Por qué: Es la publicación por canal de la máquina de estados; que algo esté «Publicado» no prueba que ya se vea en la tienda, y eso lo vigila FT-RAC-08. Se apoya en PD-29, DUD-36.
- D-CAT-05-7. Señalización y DWH reciben el mismo XML que la tienda, guardado en el almacén con su SHA-256: MS-08 lo manda a Señalización y MS-10 al DWH, y los dos devuelven acuse (se pide que MS-10 publique DELIVERY_RESULT). Por qué: Un solo XML para todos los destinos, como hoy; sin acuse, el canal DWH se quedaría en Enviado para siempre. Se apoya en PD-09, DUD-10.
- D-CAT-05-8. Retirar de un canal es una operación más del plan de publicación (WITHDRAW en API-02-039): un producto aprobado no se cancela, se retira de cada canal, y se republica después si hace falta (C08). Por qué: Hoy la baja es una corrida manual sin estado; así cada canal sabe si el producto está retirado. Se apoya en PD-29.
- D-CAT-05-9. Tienda y OMS salen en la misma petición y la tienda no espera el acuse de OMS; la regla de no vender en línea lo que no llegó a OMS queda configurable en publication_rules y apagada. Por qué: Así funciona hoy y la regla contraria todavía es propuesta; prenderla después es configuración, no código. Se apoya en RN-PUB-05, PD-10.
Qué falta decidir
| ID | Qué falta |
|---|---|
| DUD-21 | La lista oficial de sitios (13 o 14) y sus tres códigos; la ratifica Category antes de publicar categorías. |
| PD-10 | Si el broker se queda para OMS y Marketplace en el primer corte (ADR-07, 13-nov): cambia el adaptador, no el estado por canal. |
También siguen abiertos: PEN-42, Quién administra la regla de sitios; aquí se propone Gobierno de Producto con Category, en MS-01; PEN-89, La tabla de marcas y enrutado que alimenta la regla de sitios; PEN-133, Confirmar con Marketplace que sólo se vende en el sitio Liverpool; PEN-139, Confirmar con e-commerce que ya existe la regla que apaga en Suburbia lo que tiene inventario de Liverpool.
Fuentes
- [D]
trazabilidad/features/FT-CAT-05-sitios-enrutamiento-y-visibilidad.md: la ficha de la épica, con sus historias, reglas y bloqueos. - [D] ADR-12 · Un solo sistema: backend compartido y una sola base (sección 3.4).
- [D]
docs/arquitectura/por-epica/base/: piezas, colecciones, eventos y el hilo de punta a punta. - [D]
docs/arquitectura/omega-a-pim-headless/contratos-api.md: convenciones y endpoints de partida. - [D]
docs/arquitectura/maquina-de-estados-to-be/propuesta-maquina-de-estados.md§7: estados, tareas y canales. - [I] Las decisiones de la sección 9 son del TL sobre esas fuentes.