← Arquitectura por épica

FT-INT-02 · Publicación a OMS, DWH y Señalización

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-02: 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-02.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-INT-02-publicacion-oms-dwh-senalizacion.md.

En 30 segundos

Además de la tienda, cada producto aprobado tiene que llegar a OMS para venderse y surtirse, a Señalización para las etiquetas en tienda y al DWH para análisis, con el contenido que reciben hoy. Esta épica entrega a cada uno su documento desde la misma foto del producto, confirma que llegó y devuelve el acuse. El DWH lo atiende el exportador MS-10, que también manda cada día hábil el diccionario de plantillas.

  • Módulo dueño: MS-08 Adaptadores de salida. También participan: MS-02 Producto, MS-10 Exportador al DWH, MS-01 Catálogo.
  • Etapa 8 · Publicación. Recibe «PE-8 · Aprobado» y entrega «PE-9 · Publicado por canal».
  • APIs: construye 3 y usa 3 que construyen otras épicas.
  • Eventos: publica 1 y consume 4.

1. Dónde encaja

Recibe

DeQué
PE-8 · AprobadoEl producto Aprobado con OMS, Señalización o DWH en Pendiente según su negocio, y la petición de publicar.
FT-INT-01 · Publicación a e-commerceLa foto del producto ya leída y el XML canónico del lote guardado con su huella.
FT-CAT-05 · Sitios, enrutamiento y visibilidad por negocioLa misma petición para OMS, Señalización y DWH, con los canales ya decididos por negocio y el XML guardado con su huella.
FT-PLT-04 · Grupos de atributos y mínimos de información por sistema…Qué atributos van a OMS, Señalización y DWH, con su mínimo, por la misma foto.
FT-INT-03 · Entrada de SKUs creados en SAPEl SKU asignado de cada variante (SKU_ASSIGNED), del que sale el envío exprés a OMS.

Entrega

AQué
PE-9 · Publicado por canalOMS, Señalización y DWH en Publicado o en Error, cada uno con su acuse.
FT-CAT-05 · Sitios, enrutamiento y visibilidad por negocioEl acuse de OMS con el que el enrutamiento de Producto habilita la venta en la tienda.
FT-MIG-04 · Convivencia P360 ↔ nuevo PIMLas salidas a OMS, Señalización y DWH sin P360, condición para apagarlo.

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.

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
SKU_ASSIGNED

Foto del producto para publicar

Guarda el XML canónico del lote con s…

Entrega el XML sin clasificaciones po…
Manda el XML exprés en lotes de 25

Responde que recibió el lote
Acusa cada lote

Deja por SFTP el XML de los artículos…

DELIVERY_RESULT

OBJECT_FINALIZE

Sube el archivo como .part y lo renom…
Lo sube de lunes a viernes a las 18:00

Marca el archivo como entregado al DWH
Arma el diccionario del día con su hu…

DELIVERY_RESULT

DELIVERY_RESULT

GET /internal/governance/template-vie…

Envíos al DWH
Resolver un envío incierto al DWH

Lotes inciertos por destino
Resolver un lote incierto

Repoblamiento

Entrada Única · Vendor Center

Eventos

Base pim

Archivos e imágenes

MS-02 Producto

★ MS-08 Adaptadores de salida

MS-10 Exportador al DWH

MS-01 Catálogo

BFF del portal

OMS

Señalización

DWH

Contexto de FT-INT-02

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.

Base·pimDWHMS-10 Exportador al DWHSeñalizaciónOMSArchivosMS-02 ProductoMS-08 Adaptadores de salidaEventosBase·pimDWHMS-10 Exportador al DWHSeñalizaciónOMSArchivosMS-02 ProductoMS-08 Adaptadores de salidaEventos1. Entrega la petición para OMS y SeñalizaciónPUBLICATION_REQUESTED2. Pide la foto del producto en esa versiónGET /internal/product/products/{id}/publication-snapshot?versio…3. Guarda el XML canónico del lote con su huella4. Entrega el XML sin clasificaciones por el broker5. Responde que recibió el lote6. Deja por SFTP el XML de los artículos marcados7. Devuelve el acuse de OMS y de SeñalizaciónDELIVERY_RESULT8. Avisa que hay un XML nuevo para el DWHOBJECT_FINALIZE9. Sube el archivo como .part y lo renombra10. Marca el archivo como entregado al DWH11. Devuelve el acuse del DWH por productoDELIVERY_RESULT12. Entrega los acuses de cada canalDELIVERY_RESULT13. Pasa cada canal de Enviado a Publicado
Flujo principal de FT-INT-02
Los pasos en texto
PasoDeAQué haceAPI o evento
1EventosMS-08 Adaptadores de salidaEntrega la petición para OMS y Señalizacióncatalog.product.publication/PUBLICATION_REQUESTED
2MS-08 Adaptadores de salidaMS-02 ProductoPide la foto del producto en esa versiónAPI-02-054
3MS-08 Adaptadores de salidaArchivos e imágenes (almacén y CDN)Guarda el XML canónico del lote con su huella—
4MS-08 Adaptadores de salidaOMSEntrega el XML sin clasificaciones por el broker—
5OMSMS-08 Adaptadores de salidaResponde que recibió el lote—
6MS-08 Adaptadores de salidaSeñalizaciónDeja por SFTP el XML de los artículos marcados—
7MS-08 Adaptadores de salidaEventosDevuelve el acuse de OMS y de Señalizacióncatalog.delivery.result/DELIVERY_RESULT
8Archivos e imágenes (almacén y CDN)MS-10 Exportador al DWHAvisa que hay un XML nuevo para el DWHcatalog.egress.files/OBJECT_FINALIZE
9MS-10 Exportador al DWHDWHSube el archivo como .part y lo renombra—
10MS-10 Exportador al DWHArchivos e imágenes (almacén y CDN)Marca el archivo como entregado al DWH—
11MS-10 Exportador al DWHEventosDevuelve el acuse del DWH por productocatalog.delivery.result/DELIVERY_RESULT
12EventosMS-02 ProductoEntrega los acuses de cada canalcatalog.delivery.result/DELIVERY_RESULT
13MS-02 ProductoBase pimPasa cada canal de Enviado a Publicado—

3.1 Envío exprés a OMS al asignar el SKU

OMSMS-02 ProductoMS-08 Adaptadores de salidaEventosOMSMS-02 ProductoMS-08 Adaptadores de salidaEventos1. Entrega el SKU recién asignadoSKU_ASSIGNED2. Pide la foto del artículoGET /internal/product/products/{id}/publication-snapshot?versio…3. Manda el XML exprés en lotes de 254. Acusa cada lote5. Devuelve el acuse del exprésDELIVERY_RESULT
Envío exprés a OMS al asignar el SKU

3.2 Diccionario de plantillas al DWH

Entrada Única · Vendor CenterDWHArchivosMS-01 CatálogoMS-10 Exportador al DWHEntrada Única · Vendor CenterDWHArchivosMS-01 CatálogoMS-10 Exportador al DWHBFF1. Pide las vistas de plantilla por negocioGET /internal/governance/template-views?business=&changedSince=…2. Arma el diccionario del día con su huella3. Lo sube de lunes a viernes a las 18:004. Revisa los envíos al DWH del díaGET /api/v2/dwh-exports?type=&state=BFF
Diccionario de plantillas al DWH

3.3 Si OMS o el DWH no confirman

MS-10 Exportador al DWHEntrada Única · Vendor CenterEventosBase·pimMS-08 Adaptadores de salidaMS-10 Exportador al DWHEntrada Única · Vendor CenterEventosBase·pimMS-08 Adaptadores de salidaRepoblamientoBFF1. Marca incierto el lote sin respuesta del broker2. Devuelve incierto: el canal pasa a ErrorDELIVERY_RESULT3. Revisa lo incierto de OMS y del DWH4. Pide los lotes inciertos de OMSGET /api/v2/egress/review5. Reenvía igual o descarta, con su motivoPOST /api/v2/egress/review/{batchId}/resolve6. Pide los envíos inciertos al DWHGET /api/v2/dwh-exports?type=&state=7. Vuelve a subir el archivo, con su motivoPOST /api/v2/dwh-exports/{exportId}/resolve8. Devuelve el acuse nuevo por productoDELIVERY_RESULTRepoblamientoBFF
Si OMS o el DWH no confirman

4. Si algo sale mal

  • El broker no responde o responde vacío para OMS. El lote queda incierto y el canal OMS pasa a Error; nada se reenvía solo. Mientras OMS no esté Publicado, Producto no cataloga para venta ese producto en la tienda.
  • Llega un Conjunto Look aprobado. No va a OMS ni al DWH, como hoy: Producto no lo pide para esos canales y el carril de OMS lo quita si viene en un lote mixto.
  • Falla el SFTP de Señalización. Se reintenta con espera creciente hasta 15 minutos; después el canal pasa a Error y el archivo queda intacto en el almacén para reenviarlo igual.
  • El DWH no confirma el cambio de nombre del archivo. El envío queda incierto en el monitor de MS-10 y Operaciones decide subirlo otra vez o descartarlo (API-10-002); los productos del lote quedan en Error mientras tanto.

5. APIs

Las que construye esta épica (3)

GET /api/v2/dwh-exports?type=&state= · Envíos al DWH
CampoValor
APIAPI-10-001 · MS-10 Exportador al DWH
Para quéLista lo que el exportador mandó al DWH: cada lote de productos (S42) y el diccionario de plantillas del día (S41), con su archivo, su huella y si quedó entregado, falló o está incierto. MS-10 no tiene base: lo lee de las marcas que deja en cada archivo del almacén.
En esta épicaEnvíos al DWH: lotes de productos y diccionario
Quién la llamaBFF del portal
PermisoOperaciones y Gobierno de Datos (lectura de integraciones)
CabecerasAuthorization, X-Request-Id
Parámetrostype = PRODUCTS, state = UNCERTAIN, from = 2026-10-17T00:00:00Z, page = 1, size = 50

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "exportId": "dwh-20261018-152011-042",
        "type": "PRODUCTS",
        "state": "UNCERTAIN",
        "sourceEvidenceId": "evd-7a51c0",
        "fileName": "eilstep_20261018_152011_042.xml",
        "sha256": "4c1e0d9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e1d",
        "products": 120,
        "startedAt": "2026-10-18T15:20:11Z",
        "reason": {
          "code": "RENAME_NOT_CONFIRMED",
          "detail": "Se subió el .part y no se pudo confirmar el cambio de nombre"
        }
      },
      {
        "exportId": "dwh-dict-20261017",
        "type": "TEMPLATE_DICTIONARY",
        "state": "DELIVERED",
        "sourceEvidenceId": null,
        "fileName": "diccionario_plantillas_20261017.csv",
        "sha256": "7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c",
        "templates": 4096,
        "startedAt": "2026-10-17T00:00:05Z",
        "reason": null
      }
    ],
    "page": 1,
    "size": 50,
    "total": 2
  }
}

Errores

HTTPCódigoCuándo
400VALIDATION_ERROREl tipo o el estado no existen
POST /api/v2/dwh-exports/{exportId}/resolve · Resolver un envío incierto al DWH
CampoValor
APIAPI-10-002 · MS-10 Exportador al DWH
Para quéUna persona decide qué pasa con un envío al DWH que quedó incierto: RESEND lo vuelve a subir con el mismo nombre y contenido o DISCARD lo cierra como fallido, siempre con motivo. Al resolverse, cada producto del lote recibe su acuse.
En esta épicaResolver un envío incierto al DWH
Quién la llamaBFF del portal
PermisoOperaciones
CabecerasAuthorization, X-Request-Id, Idempotency-Key
ParámetrosexportId = dwh-20261018-152011-042

Request

{
  "decision": "RESEND",
  "reason": "El área del DWH confirmó que el archivo no aparece en su carpeta"
}

Response · 202

{
  "success": true,
  "data": {
    "requestId": "req-dwh-0091",
    "status": "ACCEPTED",
    "receiptUrl": "/api/v2/dwh-exports?exportId=dwh-20261018-152011-042"
  }
}

Errores

HTTPCódigoCuándo
409NOT_EDITABLE_IN_STATUSEl envío ya no está incierto
422VALIDATION_ERRORFalta el motivo o la decisión no es RESEND ni DISCARD
GET /internal/governance/template-views?business=&changedSince=&page=&size= · MS-10 lee por páginas las vistas efectivas ya resueltas (pla
CampoValor
APIAPI-01-111 · MS-01 Catálogo
Para quéMS-10 lee por páginas las vistas efectivas ya resueltas (plantilla, negocio, atributos con tipo, lista y obligatoriedad) para armar el diccionario de plantillas que recibe el DWH, sin pedir una por una las 4,100 plantillas.
En esta épicaLeer por páginas las vistas efectivas de plantilla para el diccionario del DWH

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "templateId": "EU4-0412",
        "name": "Licuadoras",
        "business": "MER",
        "viewVersion": 31,
        "group": "EU3-0398",
        "attributes": [
          {
            "attributeId": "MARCA",
            "label": "Marca",
            "dataType": "LOV",
            "lovId": "MARCAS_ECC_LOV",
            "level": "REQUIRED"
          },
          {
            "attributeId": "POTENCIA_W",
            "label": "Potencia en watts",
            "dataType": "NUMBER",
            "lovId": null,
            "level": "OPTIONAL"
          }
        ]
      }
    ],
    "page": 1,
    "size": 200,
    "total": 12288
  }
}

Errores

HTTPCódigoCuándo
403AUTHORIZATION_ERRORQuien llama no tiene el permiso o no es el módulo autorizado
404NOT_FOUNDNo existe lo que se pide o no es visible para quien llama

Las que usa y construye otra épica (3)

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, con el uso por canal de cada atributoFT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio
API-08-001GET /api/v2/egress/reviewLotes inciertos de OMS y de SeñalizaciónFT-INT-01 · Publicación a e-commerce
API-08-002POST /api/v2/egress/review/{batchId}/resolveReenviar igual o descartar un lote inciertoFT-INT-01 · Publicación a e-commerce

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.delivery.result/DELIVERY_RESULTOMS, Señalización o el DWH confirman, rechazan o no contestan, y cuando acusa un lote exprés de OMSFT-ARQ-02, FT-CAT-02, FT-CAT-05, FT-CAT-06, FT-IA-05, FT-INT-01, FT-INT-05, FT-INT-07, FT-PRD-02, FT-PRD-10, FT-RAC-06

Consume

EventoPara quéQuién lo publica
catalog.product.publication/PUBLICATION_REQUESTEDMS-08 arma y entrega los documentos de OMS y SeñalizaciónFT-ACT-02, FT-CAT-03, FT-CAT-05, FT-CAT-06, FT-INT-01, FT-INT-05, FT-INT-07, FT-PLT-08, FT-PRD-01, FT-PRD-03, FT-PRD-05, FT-RAC-03
catalog.product.changed/SKU_ASSIGNEDMS-08 manda el envío exprés a OMSFT-INT-03, FT-PRD-02
catalog.egress.files/OBJECT_FINALIZEMS-10 toma cada XML canónico nuevo y lo copia al DWHD-ARCHIVOS
catalog.delivery.result/DELIVERY_RESULTProducto pasa cada canal a Publicado o Erroresta 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
template_viewsMS-01La vista efectiva ya resuelta por plantilla y negocio: qué atributos pide y cuáles son obligatorios.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-INT-02·H1 · Recibir producto y SKU aprobados con el contenido de hoyP1pasos 1, 2, 3, 4, 5; flujo «Envío exprés a OMS al asignar el SKU»; API-02-054
FT-INT-02·H2 · Saber que OMS recibió el productoP1pasos 5, 7, 12, 13; flujo «Si OMS o el DWH no confirman»; API-08-001, API-08-002
FT-INT-02·H3 · La foto de productos por trabajos por lotes en lotes con el contenido de hoyP1pasos 8, 9, 10, 11; API-10-001, API-10-002
FT-INT-02·H4 · Recibir a diario los artículos marcadosP2pasos 6, 7
FT-INT-02·H5 · El diccionario de plantillas y atributos (S41)P2flujo «Diccionario de plantillas al DWH»; API-01-111
FT-INT-02·H6 · Que cada destino reciba sólo los atributos relevantesP3pasos 2; API-02-054
FT-INT-02·H7 · Cada sistema recibe sus negociosP2pasos 1

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-02-1. OMS va por el broker en el primer corte, con el contenido de hoy: el XML canónico sin Classifications ni AttributeList y con SalesItemFamilyMkt renombrado a SalesItemFamily, por la misma ruta. El éxito es la respuesta no vacía del broker. Cuando OMS tenga un contrato sin broker, sólo cambia el carril de MS-08. Por qué: OMS depende hoy de la cola del broker y no tiene dueño identificado para un contrato nuevo; cambiarlo en el corte sumaría un riesgo crítico. Se apoya en PD-10, DUD-10, RSG-25.
  • D-INT-02-2. La tienda espera a OMS: un producto nuevo no se cataloga para venta en la tienda hasta que su canal OMS esté Publicado. La regla vive en el enrutamiento de Producto y usa el acuse que devuelve MS-08. Por qué: No se vende lo que no se puede entregar; la regla es del canal y la decide quien decide los canales. Se apoya en RN-PUB-05, FT-CAT-05, DUD-10.
  • D-INT-02-3. Señalización recibe por el SFTP «pricing», con el nombre output-<época en ms>.xml, el mismo XML de cada lote, sólo con los artículos que Producto pidió para ese canal: los marcados para Access Via (EnvioAV). Es la entrega por lote que hace el código desde el 31-ago; la de las 19:00 de la tabla de integraciones no tiene código. Por qué: Gana el código sobre la tabla; Producto ya sólo pide Señalización para los artículos marcados. Se apoya en DUD-10, RSG-28.
  • D-INT-02-4. El DWH es un canal con adaptador propio: MS-10 copia al SFTP del DWH cada XML canónico que MS-08 deja en el almacén (eilstep_yyyyMMdd_HHmmss_SSS.xml; sube .part y renombra) y devuelve el acuse por producto. MS-10 no transforma ni guarda datos: la marca de entregado vive en el archivo. Por qué: El DWH recibe hoy el mismo XML del comercio electrónico; copiarlo evita un segundo armador y deja el canal con estado. Se apoya en DEC-ARQ-03, DUD-10, FT-CAT-05.
  • D-INT-02-5. El diccionario de plantillas y atributos (S41) lo arma MS-10 de lunes a viernes a las 18:00 con las vistas efectivas de MS-01: identificador, nombre, grupo, tipo de dato, lista y obligatoriedad por negocio, en CSV mientras el DWH no entregue su muestra. Por qué: No hay clase ni muestra de hoy; las vistas de MS-01 ya traen todo resuelto. Se apoya en DUD-10.
  • D-INT-02-6. Cada destino recibe los atributos marcados para él en el catálogo (uso por canal que llega en la foto). Mientras un destino no tenga marcas, recibe lo mismo que hoy. El Conjunto Look nunca va a OMS ni al DWH. Por qué: Dirección aprobó las mejoras en catalogación (DEC-ARQ-12) y el uso por canal ya lo administra FT-PLT-04; sin marcas, se conserva la paridad. Se apoya en DEC-ARQ-12, FT-PLT-04.
  • D-INT-02-7. El envío exprés a OMS al asignar el SKU sigue como hoy: XML propio en lotes de 25 con acuse por lote. Un lote en vuelo o fallido queda en revisión y nunca se reenvía a ciegas. Su acuse se guarda en el historial de envíos sin mover el estado del canal, que nace al aprobar. Por qué: OMS necesita el artículo desde que tiene SKU para surtir; mezclarlo con el estado por canal confundiría Enviado con Publicado. Se apoya en DUD-10, PD-10.
  • D-INT-02-8. Cada sistema recibe sólo sus negocios: lo decide el enrutamiento de Producto (por ejemplo, Suburbia nunca va a Marketplace) y MS-08 y MS-10 entregan sólo lo pedido. Por qué: Un solo lugar decide qué recibe cada destino; el adaptador no filtra por su cuenta. Se apoya en FT-CAT-05, P-40.

Qué falta decidir

IDQué falta
PD-10Ratificar que OMS sigue por el broker en el primer corte (ADR-07, 13-nov).
DUD-10Confirmar con el dueño de OMS si acusa recibo, y con Señalización y el DWH el formato, los campos y la agenda que esperan.
PD-09Contrato final de OMS sin broker y del DWH por trabajos por lotes.

Fuentes

  1. [D] trazabilidad/features/FT-INT-02-publicacion-oms-dwh-senalizacion.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.