← Arquitectura por épica

FT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio

Arquitectura del Nuevo PIM por épica · corte del 18-oct-2026

Propuesta del TL: no sustituye la spec de cada épica

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

DeQué
PE-8 · AprobadoEl producto Aprobado, con su negocio, sus categorías web y la versión aprobada, listo para publicarse en sus canales.
PE-10 · Cambio aprobadoUn cambio aprobado: los canales afectados regresan de Publicado a Enviado con la versión nueva.
PE-M · Producto migradoUn producto migrado con su estado por canal: los canales en Pendiente o Error siguen desde aquí sin repetir etapas.
PE-C · Catálogo vigenteLa 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 tiendaLas 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ónEl acuse de OMS con el que el enrutamiento de Producto habilita la venta en la tienda.
FT-REF-01 · Datos de referencia administrablesLa 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

AQué
PE-9 · Publicado por canalCada 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-commerceLa 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ónLa misma petición para OMS, Señalización y DWH, con el XML guardado con su huella.

Cambios de estado que hace

TransiciónDe → aCuándo
C01Inicio → Pendiente (por canal)El producto queda Aprobado.
C02Pendiente → Enviado (por canal)Cumple el mínimo del canal y el bus confirma que tomó el mensaje.
C03Enviado → Publicado (por canal)Llega el acuse del destino.
C04Enviado → Error (por canal)No llega el acuse o el destino rechaza.
C05Error → Enviado (por canal)Se republica.
C07Publicado → Retirado (por canal)Baja en ese canal.
C08Retirado → 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

Sistemas externos

Nuevo PIM · un solo sistema

Pantallas y sistemas

Personas

Consultar reglas

PUBLICATION_REQUESTED
STATUS_CHANGED
y 1 más

PUBLICATION_REQUESTED

Foto del producto para publicar

Manda el XML con las categorías de su…
Da de baja el producto en la tienda
y 1 más

Manda el mismo XML sin clasificaciones

Manda el documento de Marketplace o d…

Guarda el XML enviado para Señalizaci…

DELIVERY_RESULT

DELIVERY_RESULT

Mandar un aviso explícito

Estado de un producto en cada destino
Bitácora de envíos
y 4 más

Administración del catálogo

Gobierno de Datos

Entrada Única · Vendor Center

BFF del portal

★ MS-02 Producto

MS-01 Catálogo

MS-08 Adaptadores de salida

MS-14 Avisos y ayuda

Base pim

Eventos

Archivos e imágenes

Tienda en línea

OMS

Marketplace

Contexto de FT-CAT-05

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.

ArchivosMarketplaceOMSTienda en líneaMS-08 Adaptadores de salidaEventosBase·pimMS-01 CatálogoMS-02 ProductoArchivosMarketplaceOMSTienda en líneaMS-08 Adaptadores de salidaEventosBase·pimMS-01 CatálogoMS-02 Producto1. Lee la regla de sitios del negocio del productoGET /api/v2/rules?type=2. Decide sitios y canales y los guarda en el producto3. Deja cada canal en Pendiente y revisa su mínimo4. Pide publicar en los canales que cumplenPUBLICATION_REQUESTED5. Entrega la petición a los adaptadoresPUBLICATION_REQUESTED6. Pide la foto del producto en la versión aprobadaGET /internal/product/products/{id}/publication-snapshot?versio…7. Manda el XML con las categorías de sus sitios8. Manda el mismo XML sin clasificaciones9. Manda el documento de Marketplace o de stock out10. Guarda el XML enviado para Señalización y el DWH11. Devuelve el acuse de cada destinoDELIVERY_RESULT12. Entrega los acuses de cada canalDELIVERY_RESULT13. Marca cada canal Publicado y guarda el intento14. Avisa el nuevo estado de cada canalSTATUS_CHANGED
Flujo principal de FT-CAT-05
Los pasos en texto
PasoDeAQué haceAPI o evento
1MS-02 ProductoMS-01 CatálogoLee la regla de sitios del negocio del productoAPI-01-016
2MS-02 ProductoBase pimDecide sitios y canales y los guarda en el producto—
3MS-02 ProductoBase pimDeja cada canal en Pendiente y revisa su mínimo—
4MS-02 ProductoEventosPide publicar en los canales que cumplencatalog.product.publication/PUBLICATION_REQUESTED
5EventosMS-08 Adaptadores de salidaEntrega la petición a los adaptadorescatalog.product.publication/PUBLICATION_REQUESTED
6MS-08 Adaptadores de salidaMS-02 ProductoPide la foto del producto en la versión aprobadaAPI-02-054
7MS-08 Adaptadores de salidaTienda en líneaManda el XML con las categorías de sus sitios—
8MS-08 Adaptadores de salidaOMSManda el mismo XML sin clasificaciones—
9MS-08 Adaptadores de salidaMarketplaceManda el documento de Marketplace o de stock out—
10MS-08 Adaptadores de salidaArchivos e imágenes (almacén y CDN)Guarda el XML enviado para Señalización y el DWH—
11MS-08 Adaptadores de salidaEventosDevuelve el acuse de cada destinocatalog.delivery.result/DELIVERY_RESULT
12EventosMS-02 ProductoEntrega los acuses de cada canalcatalog.delivery.result/DELIVERY_RESULT
13MS-02 ProductoBase pimMarca cada canal Publicado y guarda el intento—
14MS-02 ProductoEventosAvisa el nuevo estado de cada canalcatalog.product.changed/STATUS_CHANGED

3.1 Si un destino rechaza o no contesta

Entrada Única · Vendor CenterMS-14 Avisos y ayudaBase·pimMS-02 ProductoEventosMS-08 Adaptadores de salidaEntrada Única · Vendor CenterMS-14 Avisos y ayudaBase·pimMS-02 ProductoEventosMS-08 Adaptadores de salidaAdministración del catálogoBFF1. Devuelve el rechazo con la respuesta del destinoDELIVERY_RESULT2. Entrega el rechazoDELIVERY_RESULT3. Marca el canal en Error con el motivo4. Avisa a Operación del canal en ErrorPOST /internal/notifications/messages5. Revisa el estado por destino del producto6. Pide el estado de cada destinoGET /api/v2/delivery-status?productId=&sku=7. Pide los intentos de envío con su evidenciaGET /api/v2/delivery-attempts?productId=&sku=&from=&to=8. Pide el plan de republicar sólo ese canalPOST /api/v2/publications/plans9. Confirma la republicaciónPOST /api/v2/product-plans/{planId}/apply10. Pide publicar otra vez en ese canalPUBLICATION_REQUESTED11. Entrega el acuse nuevo: el canal queda PublicadoDELIVERY_RESULTAdministración del catálogoBFF
Si un destino rechaza o no contesta

3.2 Retirar un producto de un canal

Base·pimTienda en líneaMS-08 Adaptadores de salidaEventosMS-02 ProductoEntrada Única · Vendor CenterBase·pimTienda en líneaMS-08 Adaptadores de salidaEventosMS-02 ProductoEntrada Única · Vendor CenterAdministración del catálogoBFF1. Pide bajar el producto de un canal2. Pide el plan de retiro de ese canalPOST /api/v2/publications/plans3. Confirma el retiroPOST /api/v2/product-plans/{planId}/apply4. Pide retirar el producto de ese canalPUBLICATION_REQUESTED5. Entrega el retiro al adaptadorPUBLICATION_REQUESTED6. Da de baja el producto en la tienda7. Devuelve el acuse del retiroDELIVERY_RESULT8. Entrega el acuse del retiroDELIVERY_RESULT9. Marca el canal Retirado, los demás siguen igualAdministración del catálogoBFF
Retirar un producto de un canal

3.3 Limpieza de Suburbia con sitio Liverpool

Tienda en líneaMS-08 Adaptadores de salidaEventosMS-02 ProductoEntrada Única · Vendor CenterTienda en líneaMS-08 Adaptadores de salidaEventosMS-02 ProductoEntrada Única · Vendor CenterGobierno de DatosBFF1. Busca productos de Suburbia con categorías de Liverpool2. Pide la búsqueda por negocio y sitio de la categoríaPOST /api/v2/products/search3. Pide el plan de quitar esas categoríasPOST /api/v2/products/classifications/plans4. Confirma la limpiezaPOST /api/v2/product-plans/{planId}/apply5. Avisa el cambio de clasificaciónCLASSIFICATION_CHANGED6. Pide republicar a la tienda sin esas categoríasPUBLICATION_REQUESTED7. Entrega la republicación al adaptadorPUBLICATION_REQUESTED8. Manda el XML que retira las categorías de Liverpool9. Devuelve el acuse de la tiendaDELIVERY_RESULTGobierno de DatosBFF
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
CampoValor
APIAPI-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 épicaLa foto del producto en la versión aprobada para armar el XML
Quién la llamaMS-08 Adaptadores de salida
PermisoSólo MS-08 (cuenta de servicio)
CabecerasAuthorization, X-Request-Id
Parámetrosid = PRD-0004812, version = 9
También la usanFT-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

HTTPCódigoCuándo
404NOT_FOUNDEl producto o esa versión no existe
422BUSINESS_ERRORLa versión pedida no es una versión aprobada
POST /api/v2/publications/eligibility · ¿Es enviable a cada canal?
CampoValor
APIAPI-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 épicaSaber, antes de enviar, si un producto es enviable por canal y por variante
Quién la llamaBFF del portal
PermisoENT-L (Operaciones, Foro, ReportesForo y las áreas internas con lectura)
CabecerasAuthorization, X-Request-Id
También la usanFT-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

HTTPCódigoCuándo
400VALIDATION_ERRORMás de 100 productos o un contexto que no existe (APPROVE, REPUBLISH, REPOPULATE)
404NOT_FOUNDAlgú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
CampoValor
APIAPI-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 épicaEl estado de cada destino del producto
Quién la llamaBFF del portal
PermisoENT-L; el proveedor o seller dueño ve el de sus productos
CabecerasAuthorization, X-Request-Id
ParámetrosproductId = PRD-0004812
También la usanFT-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

HTTPCódigoCuándo
400VALIDATION_ERRORNo trae productId ni sku
404NOT_FOUNDEl 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
CampoValor
APIAPI-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 épicaLa bitácora de envíos con su evidencia
Quién la llamaBFF del portal
PermisoENT-L
CabecerasAuthorization, X-Request-Id
ParámetrosproductId = PRD-0004812, from = 2026-10-01T00:00:00Z, to = 2026-10-18T23:59:59Z, page = 1, size = 50
También la usanFT-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

HTTPCódigoCuándo
400VALIDATION_ERRORFalta 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.

APIMétodo y rutaPara qué, aquíLa construye
API-01-016GET /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-017POST /api/v2/rules/plansGobierno de Producto cambia la regla de sitios con vista previaFT-PLT-07 · Reglas de atributos
API-01-004POST /api/v2/catalog-plans/{planId}/applyConfirmar el cambio de la regla de sitiosFT-PLT-01 · Fundamentos de gobierno de plantillas
API-01-046GET /api/v2/brandsLa lista oficial de sitios con sus tres códigos y su ID de catálogoFT-REF-01 · Datos de referencia administrables
API-02-039POST /api/v2/publications/plansRepublicar o retirar de un canal, con vista previaFT-INT-07 · Repoblamiento masivo de productos hacia la tienda
API-02-057POST /api/v2/product-plans/{planId}/applyConfirmar la republicación, el retiro o la limpiezaFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-001POST /api/v2/products/searchBuscar productos de Suburbia con categorías del sitio LiverpoolFT-PRD-01 · Modelo canónico de producto
API-02-016POST /api/v2/products/classifications/plansQuitar categorías en bloqueFT-CAT-03 · Categorización de productos
API-14-005POST /internal/notifications/messagesAvisar a Operación de un canal en ErrorFT-RAC-05 · Estatus del producto y motivos visibles para seller y…
API-08-001GET /api/v2/egress/reviewLos lotes inciertos de cada destino en MS-08FT-INT-01 · Publicación a e-commerce
API-08-002POST /api/v2/egress/review/{batchId}/resolveReenviar o descartar un lote incierto, con motivoFT-INT-01 · Publicación a e-commerce

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.product.publication/PUBLICATION_REQUESTEDEl producto queda Aprobado, se aprueba un cambio, se republica un canal o se retira de élFT-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_CHANGEDLa limpieza de Suburbia quita categorías de LiverpoolFT-ACT-05, FT-ACT-06, FT-IA-02, FT-IA-04
catalog.product.changed/STATUS_CHANGEDUn canal cambia de estado: el cambio viaja en channels.<destino>.status, sin tipo nuevoFT-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_RESULTMS-08 devuelve el acuse o el rechazo de cada destinoFT-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

EventoPara quéQuién lo publica
catalog.product.changed/STATUS_CHANGEDMS-14 avisa al proveedor o seller que su producto quedó publicadoesta misma épica
catalog.product.changed/CLASSIFICATION_CHANGEDMS-05 guarda en la bitácora qué categorías quitó la limpiezaesta misma épica
catalog.product.publication/PUBLICATION_REQUESTEDMS-08 arma y manda lo que recibe cada destinoesta misma épica
catalog.delivery.result/DELIVERY_RESULTMS-02 marca el canal Publicado, en Error o Retirado y guarda el intentoesta misma épica
catalog.egress.files/OBJECT_FINALIZEMS-08 manda a Señalización y MS-10 al DWH el XML guardadoD-ARCHIVOS
catalog.governance.changed/RULE_CHANGEDMS-02 refresca su copia de la regla de sitiosFT-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ónDueñoQué guardaEsta épica
productsMS-02La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos.escribe
product_delivery_statusMS-02El estado de publicación por producto y canal: Pendiente, Enviado, Publicado, Error o Retirado.escribe
product_jobsMS-02Trabajos asíncronos: cargas masivas de productos, edición masiva y publicación.escribe
product_receiptsMS-02El recibo de cada escritura confirmada en el producto (antes operation_receipts).escribe
product_outboxMS-02Los cambios del producto que esperan salir como evento (antes outbox).escribe
publication_rulesMS-02El mínimo que pide cada canal para publicar.lee
catalog_exceptionsMS-02Excepciones de catalogación: qué no se publica o va por la vía rápida.lee
governance_rulesMS-01Reglas de captura y clasificación: marcas por plantilla, grupo de artículo a plantilla, alcance del proveedor y lista negra de Marketplace.lee
brandsMS-01Los sitios (banners): Liverpool, Suburbia y los demás.lee
categoriesMS-01Cada categoría web con su lugar en el árbol y su estado.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-CAT-05·H1 · Que el PIM decida de antemano a qué sitios va cada productoP1pasos 1, 2, 3, 4; API-01-016, API-01-017, API-02-041
FT-CAT-05·H2 · Que el seller no elija el sitioP1pasos 2
FT-CAT-05·H3 · Recibir el negocio dueño de cada productoP1pasos 6; API-02-054
FT-CAT-05·H4 · Que nunca se prenda en mi sitio un artículo con inventario de LiverpoolP2API-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 LiverpoolP2flujo «Limpieza de Suburbia con sitio Liverpool»; API-02-001, API-02-016
FT-CAT-05·H6 · Una lista oficial de sitios con sus códigosP2pasos 1; API-01-046
FT-CAT-05·H7 · Árbol full y mega menúP1Fuera: 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

IDQué falta
DUD-21La lista oficial de sitios (13 o 14) y sus tres códigos; la ratifica Category antes de publicar categorías.
PD-10Si 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

  1. [D] trazabilidad/features/FT-CAT-05-sitios-enrutamiento-y-visibilidad.md: la ficha de la épica, con sus historias, reglas y bloqueos.
  2. [D] ADR-12 · Un solo sistema: backend compartido y una sola base (sección 3.4).
  3. [D] docs/arquitectura/por-epica/base/: piezas, colecciones, eventos y el hilo de punta a punta.
  4. [D] docs/arquitectura/omega-a-pim-headless/contratos-api.md: convenciones y endpoints de partida.
  5. [D] docs/arquitectura/maquina-de-estados-to-be/propuesta-maquina-de-estados.md §7: estados, tareas y canales.
  6. [I] Las decisiones de la sección 9 son del TL sobre esas fuentes.