← Arquitectura por épica

FT-INT-01 · Publicación a e-commerce

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-INT-01: 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-INT-01.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-INT-01-publicacion-ecommerce-sin-broker.md.

En 30 segundos

Cuando un producto queda aprobado tiene que llegar a la tienda en línea (Product Data Service y commercetools) en uno o dos minutos y sin pasar por el broker. Los adaptadores de salida (MS-08) arman, con la foto del producto, el mismo mensaje que hoy produce la cadena del broker, lo dejan en los tópicos que ya lee la tienda, guardan lo enviado con su huella y devuelven el acuse para que el canal pase a Publicado o a Error.

  • Módulo dueño: MS-08 Adaptadores de salida. También participan: MS-02 Producto, MS-03 Migración y convivencia.
  • Etapa 8 · Publicación. Recibe «PE-8 · Aprobado», «PE-M · Producto migrado» y entrega «PE-9 · Publicado por canal».
  • APIs: construye 5 y usa 4 que construyen otras épicas.
  • Eventos: publica 2 y consume 2.

1. Dónde encaja

Recibe

DeQué
PE-8 · AprobadoEl producto Aprobado con el canal TIENDA en Pendiente: Producto ya revisó el mínimo del canal, decidió sitios y pidió publicar.
PE-M · Producto migradoLos productos migrados con su estado por canal sembrado «en sincronía con legado»: en el corte no se republican y salen sólo cuando cambian.
FT-CAT-05 · Sitios, enrutamiento y visibilidad por negocioLa petición de publicar con sitios y canales decididos y la foto del producto lista para armar el mensaje de la tienda (API-02-054).
FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…El paso a Aprobado (T08), con el que empieza la publicación por canal.
FT-RAC-03 · Publicación por rangos de score y revisión de calidad…La petición de publicar a la tienda lo que alcanzó el umbral de calidad, sin cola de QA.
FT-CAT-02 · Publicación de categorías a la tiendaLa categoría ya publicada en la tienda antes de que llegue un producto que la usa.
FT-CAT-03 · Categorización de productosLas categorías web del producto; sin categoría no sale a la tienda.
FT-CAT-06 · Agrupadores y corrección masiva de categorías con…La petición de republicar sólo la categoría de cada producto corregido.
FT-ACT-02 · Registro, congelado y publicación de URLs de activosLas URL congeladas de las imágenes que viajan en el mensaje.
FT-PLT-04 · Grupos de atributos y mínimos de información por sistema…Qué atributos van a la tienda y su mínimo, que el adaptador lee en la foto en lugar de una lista propia.
FT-PLT-08 · Títulos, nombres y descripciones de productoEl nombre y la descripción que se publican.
FT-PRD-01 · Modelo canónico de productoLa familia con relaciones, banderas con vigencia y variantes publicables.
FT-FLU-07 · Excepciones de catalogación y preventas con publicación…La preventa con su bandera y sus fechas, aunque tenga imagen genérica.

Entrega

AQué
PE-9 · Publicado por canalEl canal TIENDA en Publicado con el acuse de la tienda, o en Error con su motivo para republicar.
FT-INT-02 · Publicación a OMS, DWH y SeñalizaciónLa foto del producto ya leída y el XML canónico del lote guardado con su huella, que reutilizan OMS, Señalización y el DWH.
FT-INT-07 · Repoblamiento masivo de productos hacia la tiendaEl adaptador de la tienda para el repoblamiento: sin categorías, sin OMS y sin Marketplace.
FT-CAT-06 · Agrupadores y corrección masiva de categorías con…La publicación a la tienda y su acuse por producto.
FT-RAC-08 · Monitoreo de visibilidad y alertas de caída de SKUs…La evidencia de lo enviado y el acuse por producto, para vigilar la caída de visibles.
FT-RAC-04 · Consistencia entre sistemas y gobierno de datos proactivoLo que se mandó a la tienda y su acuse, por producto y variante, para la consistencia entre sistemas.
FT-RAC-06 · Métricas de tiempos por paso y clasificación de erroresEl acuse o el rechazo de cada canal (DELIVERY_RESULT) con su motivo, para medir de Aprobado a Publicado.
FT-MIG-03 · Migración inicial de productos desde P360El ensayo sin envío (API-08-005) para comparar lo publicable contra lo que hoy tiene la tienda.
FT-MIG-04 · Convivencia P360 ↔ nuevo PIMLa salida a la tienda sin broker, lista para encenderse en el corte: condición para apagar P360.

Cambios de estado que hace

TransiciónDe → aCuándo
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

PUBLICATION_REQUESTED

PUBLICATION_REQUESTED

Foto del producto para publicar

Guarda el XML canónico y el mensaje c…
Deja el mensaje del ensayo con su hue…

Publica producto y SKU en los tópicos…
Vuelve a mandar el mismo mensaje y ll…
y 1 más

Avisa que guardó y mandó a commerceto…
Acusa el cambio

DELIVERY_RESULT

DELIVERY_RESULT

Lotes inciertos por destino
Detalle de un lote de salida
y 2 más

Estado de un producto en cada destino

Ensayo de publicación sin envío

Lee lo que hoy tiene la tienda de esa…

Repoblamiento

Entrada Única · Vendor Center

Eventos

Base pim

Archivos e imágenes

MS-02 Producto

★ MS-08 Adaptadores de salida

MS-03 Migración y convivencia

BFF del portal

Tienda en línea

Contexto de FT-INT-01

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.

Tienda en líneaArchivosBase·pimMS-08 Adaptadores de salidaEventosMS-02 ProductoTienda en líneaArchivosBase·pimMS-08 Adaptadores de salidaEventosMS-02 Producto1. Pide publicar y deja el canal en EnviadoPUBLICATION_REQUESTED2. Entrega la petición al carril de la tiendaPUBLICATION_REQUESTED3. Descarta lo ya enviado en esa versión4. Pide la foto del producto en esa versiónGET /internal/product/products/{id}/publication-snapshot?versio…5. Junta el lote: 30 s o 1,000 productos6. Guarda el XML canónico y el mensaje con su huella7. Publica producto y SKU en los tópicos de la tienda8. Avisa que guardó y mandó a commercetools9. Cierra el lote con el acuse por producto10. Devuelve el acuse de cada productoDELIVERY_RESULT11. Entrega el acuse de la tiendaDELIVERY_RESULT12. Pasa el canal de Enviado a Publicado
Flujo principal de FT-INT-01
Los pasos en texto
PasoDeAQué haceAPI o evento
1MS-02 ProductoEventosPide publicar y deja el canal en Enviadocatalog.product.publication/PUBLICATION_REQUESTED
2EventosMS-08 Adaptadores de salidaEntrega la petición al carril de la tiendacatalog.product.publication/PUBLICATION_REQUESTED
3MS-08 Adaptadores de salidaBase pimDescarta lo ya enviado en esa versión—
4MS-08 Adaptadores de salidaMS-02 ProductoPide la foto del producto en esa versiónAPI-02-054
5MS-08 Adaptadores de salidaBase pimJunta el lote: 30 s o 1,000 productos—
6MS-08 Adaptadores de salidaArchivos e imágenes (almacén y CDN)Guarda el XML canónico y el mensaje con su huella—
7MS-08 Adaptadores de salidaTienda en líneaPublica producto y SKU en los tópicos de la tienda—
8Tienda en líneaMS-08 Adaptadores de salidaAvisa que guardó y mandó a commercetools—
9MS-08 Adaptadores de salidaBase pimCierra el lote con el acuse por producto—
10MS-08 Adaptadores de salidaEventosDevuelve el acuse de cada productocatalog.delivery.result/DELIVERY_RESULT
11EventosMS-02 ProductoEntrega el acuse de la tiendacatalog.delivery.result/DELIVERY_RESULT
12MS-02 ProductoBase pimPasa el canal de Enviado a Publicado—

3.1 Si la tienda no acusa o rechaza

Tienda en líneaEntrada Única · Vendor CenterMS-02 ProductoEventosBase·pimMS-08 Adaptadores de salidaTienda en líneaEntrada Única · Vendor CenterMS-02 ProductoEventosBase·pimMS-08 Adaptadores de salidaRepoblamientoBFF1. Marca incierto el lote sin acuse en 30 minutos2. Devuelve incierto o rechazado por productoDELIVERY_RESULT3. Entrega el resultado: el canal pasa a ErrorDELIVERY_RESULT4. Revisa los lotes inciertos de la tienda5. Pide los lotes inciertos por destinoGET /api/v2/egress/review6. Ve qué llevó el lote y qué respondióGET /api/v2/egress/batches/{batchId}7. Descarga lo que se mandóGET /api/v2/egress/evidence/{evidenceId}8. Decide reenviar igual, con su motivoPOST /api/v2/egress/review/{batchId}/resolve9. Vuelve a mandar el mismo mensaje y llave10. Devuelve el acuse nuevo: el canal queda PublicadoDELIVERY_RESULT11. Ve el estado del canal por productoGET /api/v2/delivery-status?productId=&sku=RepoblamientoBFF
Si la tienda no acusa o rechaza

3.2 Comparar contra el broker antes del corte

Base·pimTienda en líneaArchivosMS-02 ProductoMS-08 Adaptadores de salidaMS-03 Migración y convivenciaBase·pimTienda en líneaArchivosMS-02 ProductoMS-08 Adaptadores de salidaMS-03 Migración y convivencia1. Pide el ensayo de una familia sin mandarlaPOST /internal/egress/rehearsals2. Pide la foto de la familiaGET /internal/product/products/{id}/publication-snapshot?versio…3. Deja el mensaje del ensayo con su huella4. Lee lo que hoy tiene la tienda de esa familia5. Compara agrupación, orden de variantes y campos
Comparar contra el broker antes del corte

3.3 Retirar un producto de la tienda

MS-02 ProductoTienda en líneaMS-08 Adaptadores de salidaEventosMS-02 ProductoTienda en líneaMS-08 Adaptadores de salidaEventos1. Entrega el retiro del canal tiendaPUBLICATION_REQUESTED2. Manda el producto marcado como no publicable3. Acusa el cambio4. Devuelve el acuse del retiroDELIVERY_RESULT5. Entrega el acuse: el canal queda RetiradoDELIVERY_RESULT6. Pide publicar de nuevo cuando vuelvePUBLICATION_REQUESTED
Retirar un producto de la tienda

4. Si algo sale mal

  • La tienda no acusa en 30 minutos. El lote queda incierto y el canal pasa a Error con «sin acuse». Nada se reenvía solo: el lote aparece en la revisión de Repoblamiento y Operaciones, que deciden reenviar igual o descartar, siempre con motivo.
  • La tienda rechaza un producto en su tópico de errores. Ese producto pasa a Error con la respuesta de la tienda y los demás del lote siguen. Se republica desde el portal (API-02-039) cuando se corrige.
  • Una variante no tiene imagen principal congelada. La foto de Producto la trae como «no procede»: esa variante no viaja y sus hermanas sí. Si ninguna tiene principal, Producto no pide publicar y el producto queda «Sin imágenes congeladas».
  • El producto no tiene categoría válida. Producto no pide el canal tienda, así que la tienda nunca recibe un producto sin categoría; OMS y Marketplace no esperan la categoría.
  • Llega dos veces la misma petición. MS-08 la reconoce por producto, versión y destino y no vuelve a mandar; una versión vieja que llega tarde se ignora.

5. APIs

Las que construye esta épica (5)

GET /api/v2/egress/review · Lotes inciertos por destino
CampoValor
APIAPI-08-001 · MS-08 Adaptadores de salida
Para quéLista los lotes que salieron a un destino (tienda, OMS, Marketplace, Señalización o SAP) y no tienen un acuse claro: sin respuesta a tiempo, respuesta que no se reconoce o envío interrumpido. Ninguno se reenvía solo: esperan a que una persona decida.
En esta épicaLotes inciertos por destino
Quién la llamaBFF del portal
PermisoPublicación, Repoblamiento y Operaciones
CabecerasAuthorization, X-Request-Id
Parámetrosdestination = OMS, status = UNCERTAIN, from = 2026-10-17T00:00:00Z, page = 1, size = 50
También la usanFT-CAT-05, FT-INT-02, FT-RAC-08

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "batchId": "egb-20261018-oms-0142",
        "destination": "OMS",
        "operation": "APPROVE",
        "status": "UNCERTAIN",
        "reason": {
          "code": "TIMEOUT",
          "detail": "El broker no respondió en 120 s"
        },
        "sentAt": "2026-10-18T15:20:03Z",
        "attempts": 3,
        "products": 120,
        "sampleProductIds": [
          "PRD-0004812",
          "PRD-0004813"
        ],
        "evidenceId": "evd-7a51c0",
        "version": 3
      }
    ],
    "page": 1,
    "size": 50,
    "total": 1
  }
}

Errores

HTTPCódigoCuándo
400VALIDATION_ERROREl destino o el estado no existen
403AUTHORIZATION_ERRORQuien llama no opera publicaciones
POST /api/v2/egress/review/{batchId}/resolve · Resolver un lote incierto
CampoValor
APIAPI-08-002 · MS-08 Adaptadores de salida
Para quéUna persona decide qué pasa con un lote incierto: RESEND lo vuelve a mandar igual (mismo contenido y misma llave, para que el destino lo reconozca si ya lo tenía) o DISCARD lo cierra como fallido. Las dos llevan motivo y dejan la decisión en el lote; nunca es automático.
En esta épicaReenviar igual o descartar un lote incierto, con motivo
Quién la llamaBFF del portal
PermisoPublicación, Repoblamiento y Operaciones
CabecerasAuthorization, X-Request-Id, Idempotency-Key, If-Match
ParámetrosbatchId = egb-20261018-oms-0142
Publicacatalog.delivery.result/DELIVERY_RESULT
También la usanFT-CAT-05, FT-INT-02, FT-RAC-08

Request

{
  "decision": "RESEND",
  "reason": "El equipo de OMS confirmó que el lote no llegó",
  "version": 3
}

Response · 202

{
  "success": true,
  "data": {
    "requestId": "req-eg-8812",
    "status": "ACCEPTED",
    "receiptUrl": "/api/v2/egress/batches/egb-20261018-oms-0142"
  }
}

Errores

HTTPCódigoCuándo
409VERSION_CONFLICTOtra persona ya resolvió el lote o cambió su estado
409NOT_EDITABLE_IN_STATUSEl lote ya no está incierto
422VALIDATION_ERRORFalta el motivo o la decisión no es RESEND ni DISCARD
GET /api/v2/egress/batches/{batchId} · Detalle de un lote de salida
CampoValor
APIAPI-08-003 · MS-08 Adaptadores de salida
Para quéDice qué llevó un lote (productos, versiones y variantes que no procedieron), a qué destino, cuántos intentos hubo, qué respondió el destino y con qué huella quedó guardado lo enviado.
En esta épicaDetalle de un lote y su respuesta
Quién la llamaBFF del portal
PermisoLectura de productos (ENT-L) con Publicación u Operaciones
CabecerasAuthorization, X-Request-Id
ParámetrosbatchId = egb-20261018-ecom-0311

Request

null

Response · 200

{
  "success": true,
  "data": {
    "batchId": "egb-20261018-ecom-0311",
    "destination": "TIENDA",
    "operation": "APPROVE",
    "status": "ACCEPTED",
    "items": [
      {
        "productId": "PRD-0004812",
        "version": 9,
        "business": "MER",
        "variants": 3,
        "excludedVariants": [
          {
            "variantId": "VAR-0004812-04",
            "reason": "NO_MAIN_IMAGE"
          }
        ],
        "result": "ACCEPTED",
        "ackAt": "2026-10-18T15:21:10Z",
        "traceId": "4bf92f3577b34da6a3ce929d0e0e4736"
      }
    ],
    "attempts": [
      {
        "n": 1,
        "at": "2026-10-18T15:20:05Z",
        "outcome": "ACK",
        "detail": "La tienda guardó el producto y lo mandó a commercetools"
      }
    ],
    "evidence": [
      {
        "evidenceId": "evd-7a51c0",
        "format": "STEP_XML",
        "sha256": "4c1e0d9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e1d",
        "bytes": 482113
      },
      {
        "evidenceId": "evd-7a51c1",
        "format": "PDS_JSON",
        "sha256": "0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9",
        "bytes": 96210
      }
    ],
    "version": 2
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDEl lote no existe
GET /api/v2/egress/evidence/{evidenceId} · Descargar lo enviado
CampoValor
APIAPI-08-004 · MS-08 Adaptadores de salida
Para quéDa una liga de descarga, que vence en 15 minutos, del documento exacto que se mandó a un destino (el XML o el mensaje de la tienda) con su huella SHA-256, para revisar un reenvío puntual o el orden de las variantes.
En esta épicaDescargar lo que se mandó, con su huella
Quién la llamaBFF del portal
PermisoLectura de productos (ENT-L) con Publicación u Operaciones
CabecerasAuthorization, X-Request-Id
ParámetrosevidenceId = evd-7a51c0

Request

null

Response · 200

{
  "success": true,
  "data": {
    "evidenceId": "evd-7a51c0",
    "batchId": "egb-20261018-ecom-0311",
    "destination": "TIENDA",
    "format": "STEP_XML",
    "sha256": "4c1e0d9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e1d",
    "bytes": 482113,
    "download": "/api/v2/egress/evidence/evd-7a51c0/content?t=dl-58c1",
    "expiresAt": "2026-10-18T15:45:00Z",
    "keptUntil": "2027-10-18T00:00:00Z"
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDLa evidencia no existe o ya venció su resguardo
403AUTHORIZATION_ERRORQuien llama no puede ver los productos del lote
POST /internal/egress/rehearsals · Ensayo de publicación sin envío
CampoValor
APIAPI-08-005 · MS-08 Adaptadores de salida
Para quéArma, sin mandar nada, lo que recibiría cada destino para una lista de productos y lo deja en el almacén con su huella. Lo usa la migración para comparar campo por campo contra lo que hoy tiene la tienda antes de apagar el broker.
En esta épicaEnsayo sin envío para comparar contra la tienda y el broker
Quién la llamaMS-03 Migración y convivencia
PermisoSólo MS-03 (cuenta de servicio)
CabecerasAuthorization, X-Request-Id, Idempotency-Key
También la usanFT-MIG-03

Request

{
  "rehearsalId": "rh-e2-0004",
  "destinations": [
    "TIENDA",
    "OMS"
  ],
  "items": [
    {
      "productId": "PRD-0004812",
      "version": 1
    },
    {
      "productId": "PRD-0004813",
      "version": 1
    }
  ]
}

Response · 202

{
  "success": true,
  "data": {
    "requestId": "req-rh-0004",
    "status": "ACCEPTED",
    "outputs": [
      {
        "destination": "TIENDA",
        "evidenceId": "evd-rh-0004-ecom",
        "format": "PDS_JSON"
      },
      {
        "destination": "OMS",
        "evidenceId": "evd-rh-0004-oms",
        "format": "STEP_XML"
      }
    ],
    "receiptUrl": "/api/v2/egress/evidence/evd-rh-0004-ecom"
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDUn producto no existe en esa versión
409IDEMPOTENCY_MISMATCHSe repite el ensayo con otra lista

Las que usa y construye otra épica (4)

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-02-054GET /internal/product/products/{id}/publication-snapshot?version=Leer la foto del producto en la versión que se publicaFT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio
API-02-041POST /api/v2/publications/eligibilitySaber por qué un producto o una variante no es enviable a la tiendaFT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio
API-02-042GET /api/v2/delivery-status?productId=&sku=Ver el estado del canal tienda por productoFT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio
API-02-039POST /api/v2/publications/plansRepublicar desde el portal lo que quedó en ErrorFT-INT-07 · Repoblamiento masivo de productos hacia la tienda

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.delivery.result/DELIVERY_RESULTLa tienda acusa, rechaza o no contesta a tiempo, y cuando una persona resuelve un lote inciertoFT-ARQ-02, FT-CAT-02, FT-CAT-05, FT-CAT-06, FT-IA-05, FT-INT-02, FT-INT-05, FT-INT-07, FT-PRD-02, FT-PRD-10, FT-RAC-06
catalog.product.publication/PUBLICATION_REQUESTEDProducto pide publicar, retirar o republicar en la tiendaFT-CAT-05, FT-CAT-06, FT-INT-02, FT-INT-05, FT-INT-07, FT-PLT-08, FT-PRD-05, FT-RAC-03

Consume

EventoPara quéQuién lo publica
catalog.product.publication/PUBLICATION_REQUESTEDMS-08 arma y entrega el mensaje de la tiendaesta misma épica
catalog.delivery.result/DELIVERY_RESULTProducto pasa el canal tienda a Publicado, Error o Retiradoesta misma épica

7. Datos

Cada colección tiene un solo dueño, el único que escribe en ella.

ColecciónDueñoQué guardaEsta épica
egress_batchesMS-08Cada lote que sale a un destino: productos y versiones, intentos, respuesta del destino, huella de lo enviado y, si quedó incierto, la decisión de una persona con su motivo.escribe

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-INT-01·H1 · Que un producto que cumple el mínimo del canal se publique solo, sin brokerP1pasos 1, 2, 4, 5, 7, 8, 10, 11, 12; API-02-054
FT-INT-01·H2 · Recibir producto y SKU por el canal que ya consume el PDSP1pasos 7, 8; API-02-054
FT-INT-01·H3 · Excluir la variante que no procedeP1pasos 4; API-02-054, API-02-041
FT-INT-01·H4 · Bloquear lo que no tiene categoría válida y validar la salida por sistemaP2pasos 1, 4; API-02-041
FT-INT-01·H5 · La secuencia de variantes de la plantilla y la evidencia de lo enviadoP3pasos 6; flujo «Si la tienda no acusa o rechaza»; API-08-003, API-08-004
FT-INT-01·H6 · Un el bus de eventos que rutea a cada destinoP1pasos 2, 10, 11, 12; flujo «Si la tienda no acusa o rechaza», «Retirar un producto de la tienda»; API-08-001, API-08-002, API-02-042
FT-INT-01·H7 · Publicar los agrupados como genérico con variantesP1flujo «Comparar contra el broker antes del corte»; API-08-005

9. Decisiones de esta épica

Las tomó el TL como arquitecto; quedan como [Propuesta] hasta que el equipo de la épica las revise.

  • D-INT-01-1. Sin broker para la tienda: MS-08 publica directo en los tópicos de producto y de SKU que ya lee el Product Data Service (…feed-data-processor.product-message y …sku-message), con source=STIBO, traceId y objectId, como hoy el procesador. La tienda no cambia su receptor. El broker y el procesador dejan de recibir productos en la misma ventana en que se enciende MS-08: nunca dos productores. Por qué: El Product Data Service no lee el XML del broker sino esos mensajes; publicar ahí quita dos saltos y conserva las reglas de la tienda (mezcla parcial, versión, variante maestra). Es lo que propone PD-10 para la tienda y lo que ya se hizo con categorías. Se apoya en PD-10, PD-09, DEC-ARQ-10, RSG-24.
  • D-INT-01-2. MS-08 rehace la traducción que hoy hacen el broker y el procesador, con la foto de Producto como única entrada. La especificación es el cuadre de los 159 campos de la tienda, y se prueba campo por campo contra sus colecciones products y skus antes del corte con el ensayo sin envío (API-08-005). Por qué: Sin esa traducción nadie publica tras apagar P360, el riesgo mayor del programa; compararla contra la tienda es la prueba de que no se pierde nada. Se apoya en RSG-24, PD-23, FT-MIG-03.
  • D-INT-01-3. El acuse es de la tienda, no del tópico: MS-08 marca Publicado cuando el Product Data Service publica hacia commercetools el cambio de ese traceId, y Error cuando lo publica en su tópico de errores. Sin ninguno de los dos en 30 minutos, el lote queda incierto y espera a una persona (API-08-002). Que el bus de eventos acepte el mensaje no es Publicado. Por qué: Enviado y Publicado son estados distintos; sólo el destino sabe si de verdad lo guardó. Se apoya en RF-PUB-14, PD-09, DUD-10.
  • D-INT-01-4. MS-08 no decide qué ni cuándo se publica: el mínimo del canal, la categoría válida, la variante que no procede, los sitios y la espera de OMS son reglas de Producto (publication_rules y su enrutamiento) y llegan resueltas en la petición y en la foto. MS-08 sólo traduce, entrega y devuelve el acuse. Por qué: Un solo dueño de cada regla; hoy las compuertas viven dentro del exportador y nadie las ve. Se apoya en RF-PUB-05, RN-PUB-05, PD-22, FT-CAT-05.
  • D-INT-01-5. Un carril por destino: cada adaptador tiene su suscripción filtrada por canal, su lote (30 s, 1,000 productos o 1 MB, lo que llegue primero), su reintento de 30 s × 2ⁿ hasta 15 minutos y su revisión. Un destino lento no frena a otro. La meta de 1 a 2 minutos se mide de la petición al acuse. Por qué: RF-PUB-01 pide la tienda en 1 a 2 minutos; hoy un solo exportador encadena todo y el 13.7 % de los envíos quedó colgado. Se apoya en RF-PUB-01, RSG-51.
  • D-INT-01-6. Cada lote deja en el almacén el XML canónico de hoy (STEP-ProductInformation) y el mensaje de la tienda, con su SHA-256 y un año de resguardo. Es la evidencia de lo enviado (API-08-004) y la fuente del DWH y de Señalización. Por qué: RF-PUB-08 pide descargar lo enviado; un solo documento evita armar tres veces lo mismo. Se apoya en RF-PUB-08, DMS-66.
  • D-INT-01-7. Los agrupados (genérico Marketplace o genérico dummy) salen como un genérico con sus variantes, cada una con su SKU de SAP y en el orden de la plantilla (variantSequence de la foto). Antes del corte, la salida de MS-08 se compara con la del broker del mismo día. Por qué: Hoy esa transformación la hace el broker; si no se reproduce, el cliente ve productos sueltos. Se apoya en RF-PUB-08, PD-10.
  • D-INT-01-8. Banderas y fechas se mandan como las sabe el PIM: encendidas con sus fechas o apagadas. Lo que no tiene dato no se manda y nunca salen fechas centinela como 0002-11-30 o 9998-11-30. Por qué: El relleno en falso infla el mensaje y las fechas ficticias corrompen la tienda. Se apoya en PD-23, DUD-30.
  • D-INT-01-9. MS-08 se enciende para la tienda en el corte de productos (R3). Antes, P360 sigue publicando por el broker y los cambios que llegan por la convivencia no generan peticiones. En el corte no se republica el catálogo: sólo sale lo que cambie. Por qué: Dos productores duplicarían la tienda y republicar 3.4 millones de productos sin cambios la saturaría. Se apoya en PD-10, FT-MIG-04, DEC-PRD-06.

Qué falta decidir

IDQué falta
PD-10Ratificar en ADR-07 (13-nov) que la tienda va sin broker y que OMS y Mirakl siguen por el broker en el primer corte.
PD-09Confirmar con Prod Ecommerce los tópicos de salida y de errores del Product Data Service que sirven de acuse.
PD-22Ratificar que sin categoría no sale a la tienda y que OMS y Mirakl no la esperan.
PD-23Confirmar con Prod Ecommerce que commercetools distingue una bandera ausente de una apagada.
PD-24El score de Marketplace frena la publicación y no el SKU; lo aplica Producto antes de pedir publicar.

También siguen abiertos: PEN-01, Mínimo de visibilidad de Marketplace con plantillas compartidas de 50 atributos.

Fuentes

  1. [D] trazabilidad/features/FT-INT-01-publicacion-ecommerce-sin-broker.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.