Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-INT-06: 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-06.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-INT-06-avisos-idmc-entrada-unica.md.
En 30 segundos
Mientras sigan vivos los backends de Entrada Única y de Foro, tienen que enterarse de cada cambio de estatus, del SKU y el EAN que da SAP, de los precios y de los looks, con los mismos mensajes que hoy les manda P360. Esta épica hace que el PIM publique esos avisos temporales (tópicos idmc_*) desde su outbox y los apague con tráfico cero en R3. Las pantallas nuevas no los usan: leen el estado por el BFF.
- Módulo dueño: MS-02 Producto. También participan: MS-07 Ingesta de archivos.
- Etapa 8 · Publicación. Recibe de otras épicas y entrega a otras épicas.
- APIs: construye 4 y usa 5 que construyen otras épicas.
- Eventos: publica 7 y consume 4.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… | Cada cambio de estado o de tarea que confirma el motor, en el outbox de MS-02, y la tabla P360_CODES con el código de hoy. |
| FT-RAC-05 · Estatus del producto y motivos visibles para seller y… | La tabla de etiquetas SUPPLIER_LABELS con su código de P360, para que el aviso a Entrada Única diga lo mismo que el portal. |
| FT-PRD-02 · Creación de SKU con SAP | Cada SKU y EAN que asigna el 122 y cada error de SAP. |
| FT-INT-04 · Catálogos maestros, precios y costos desde SAP/S4H | Los precios, costos y EAN que manda SAP, ya leídos por MS-07. |
| FT-INT-03 · Entrada de SKUs creados en SAP | Los Conjuntos Look que crea SAP (archivo E14), ya leídos por MS-07. |
Entrega
| A | Qué |
|---|---|
| FT-MIG-04 · Convivencia P360 ↔ nuevo PIM | El interruptor por tópico para encender el emisor del PIM en la misma ventana en que se apaga el de P360, y para apagarlo con tráfico cero en R3. |
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 | Base pim | Confirma un cambio de estado en cualquier etapa | — |
| 2 | MS-02 Producto | Base pim | Revisa si el aviso de ese tópico sigue encendido | — |
| 3 | MS-02 Producto | Base pim | Calcula etiqueta y código de hoy con la tabla única | — |
| 4 | MS-02 Producto | Base pim | Deja el aviso en el outbox, en la misma transacción | — |
| 5 | MS-02 Producto | Eventos | Publica el cambio de estatus con el contrato de hoy | idmc_put_products/(contrato de hoy) |
| 6 | Eventos | Backends de hoy de Entrada Única y Foro | Entrega el aviso a los backends de Entrada Única y Foro | idmc_put_products/(contrato de hoy) |
| 7 | MS-02 Producto | Eventos | Publica el mismo cambio para los módulos nuevos | catalog.product.changed/STATUS_CHANGED |
| 8 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Lee el estado del producto por el BFF | API-02-002 |
3.1 SAP crea el artículo: SKU y EAN a Entrada Única
3.2 Precio, costo y EAN que cambia SAP
3.3 Conjunto Look creado en SAP
4. Si algo sale mal
- Entrada Única o Foro muestran un estatus viejo. Gobierno de Datos reemite el aviso de esos productos sin tocarlos (API-02-405); los backends ignoran lo repetido por eventId y versión.
- el bus de eventos no confirma un lote. El outbox lo reintenta con el mismo messageId, en lotes de hasta 100 como hoy; nada se pierde porque el aviso se escribió en la misma transacción que el cambio.
- Quedan dos emisores a la vez (P360 y el PIM). No debe pasar: el interruptor por tópico enciende el del PIM en la misma ventana en que se apaga el de P360 (FT-MIG-04). Si la medición encuentra avisos duplicados, se apaga el del PIM y se repite la ventana.
- Un estado no tiene renglón en la tabla de estatus de hoy. El aviso sale con la etiqueta «Borrador», como hoy, porque el listener de Entrada Única la espera; el caso queda en el reporte de la tabla para completarla y nunca se inventa un código.
- Un tópico ya no tiene consumidores. Con tráfico cero medido en su suscripción, se apaga su interruptor y el tópico se borra en R3, junto con API-02-405.
5. APIs
Las que construye esta épica (4)
POST /internal/product/sap/look · Recibir un Conjunto Look de SAP
| Campo | Valor |
|---|---|
| API | API-02-050 · MS-02 Producto |
| Para qué | MS-07 entrega los Conjuntos Look que crea SAP (archivo E14: ID de 12 dígitos, sus SKU y el artículo principal). Producto guarda el look como producto de tipo LOOK con referencias a sus productos y, mientras exista el backend de Entrada Única, lo avisa con idmc_post_look. |
| En esta épica | Recibir el Conjunto Look de SAP y avisarlo |
| Quién la llama | MS-07 Ingesta de archivos |
| Permiso | Sólo MS-07 (cuenta de servicio) |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | products, product_groups, product_receipts, product_outbox |
| Publica | catalog.product.changed/PRODUCT_CREATED, idmc_post_look/(contrato de hoy) |
| También la usan | FT-INT-03 |
Request
{
"fileId": "ECC-E14-20261018-160000-01",
"looks": [
{
"recordKey": "ECC-E14-20261018-160000-01#1",
"lookId": "700000004812",
"name": "LOOK COCINA ROJA",
"mainSku": "1000004812",
"skus": [
"1000004812",
"1000004820",
"1000004831"
]
}
]
}
Response · 200
{
"success": true,
"data": {
"fileId": "ECC-E14-20261018-160000-01",
"applied": 1,
"rejected": 0,
"items": [
{
"recordKey": "ECC-E14-20261018-160000-01#1",
"result": "CREATED",
"lookId": "700000004812",
"productId": "PRD-0009120",
"type": "LOOK",
"members": 3,
"unknownSkus": []
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | Un look llega sin ID o sin artículo principal |
| 409 | IDEMPOTENCY_MISMATCH | El mismo registro llega otra vez con otro contenido |
POST /internal/product/sap/prices · Recibir precios y costos de SAP
| Campo | Valor |
|---|---|
| API | API-02-052 · MS-02 Producto |
| Para qué | MS-07 entrega los precios y costos del 142 (primero costos STCTS, después precios STPRS). Producto los guarda en la variante dueña de cada SKU (costo bruto sin IVA y precio sugerido con IVA) y, mientras exista el backend de Entrada Única, avisa datosVenta. Un SKU que no existe queda rechazado en el recibo. |
| En esta épica | Recibir precios y costos y avisar datosVenta |
| Quién la llama | MS-07 Ingesta de archivos |
| Permiso | Sólo MS-07 (cuenta de servicio) |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | products, product_receipts, product_outbox |
| Publica | catalog.product.changed/PRODUCT_UPDATED, idmc_post_products/(contrato de hoy) |
| También la usan | FT-INT-04 |
Request
{
"fileId": "ECC142-20261019-013000-STCTS",
"kind": "STCTS",
"records": [
{
"recordKey": "ECC142-20261019-013000-STCTS#1",
"sku": "1000004812",
"value": 820.0
},
{
"recordKey": "ECC142-20261019-013000-STCTS#2",
"sku": "1000004899",
"value": 455.5
}
]
}
Response · 200
{
"success": true,
"data": {
"fileId": "ECC142-20261019-013000-STCTS",
"kind": "STCTS",
"applied": 1,
"rejected": 1,
"items": [
{
"recordKey": "ECC142-20261019-013000-STCTS#1",
"result": "APPLIED",
"sku": "1000004812",
"productId": "PRD-0004812",
"variantId": "VAR-0004812-01",
"field": "CostobrutoSinIVA"
},
{
"recordKey": "ECC142-20261019-013000-STCTS#2",
"result": "REJECTED",
"sku": "1000004899",
"reason": "SKU_NOT_FOUND"
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | Un valor no es numérico o el tipo no es STCTS ni STPRS |
| 409 | IDEMPOTENCY_MISMATCH | El mismo registro llega otra vez con otro valor |
POST /internal/product/sap/ean · Recibir altas y bajas de EAN de SAP
| Campo | Valor |
|---|---|
| API | API-02-053 · MS-02 Producto |
| Para qué | MS-07 entrega el catálogo de EAN de SAP (por grupo de artículo y deltas). Producto aplica la última acción por relación SKU y EAN en el registro de unicidad; una baja sólo limpia el EAN si la variante todavía lo tiene. Mientras exista el backend de Entrada Única, avisa el EAN nuevo o vacío. |
| En esta épica | Recibir altas y bajas de EAN de SAP y avisar el EAN |
| Quién la llama | MS-07 Ingesta de archivos |
| Permiso | Sólo MS-07 (cuenta de servicio) |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | identifier_registry, products, product_receipts, product_outbox |
| Publica | catalog.product.changed/EAN_CHANGED, idmc_put_products/(contrato de hoy) |
| También la usan | FT-INT-04 |
Request
{
"fileId": "EAN_delta-20261018-160010",
"kind": "DELTA",
"records": [
{
"recordKey": "EAN_delta-20261018-160010#1",
"sku": "1000004812",
"ean": "7501234567916",
"business": "MER",
"itemGroup": "GA-0412",
"action": "ADD"
},
{
"recordKey": "EAN_delta-20261018-160010#2",
"sku": "1000004813",
"ean": "7501234567923",
"business": "MER",
"itemGroup": "GA-0412",
"action": "REMOVE"
}
]
}
Response · 200
{
"success": true,
"data": {
"fileId": "EAN_delta-20261018-160010",
"applied": 1,
"ignored": 1,
"rejected": 0,
"items": [
{
"recordKey": "EAN_delta-20261018-160010#1",
"result": "APPLIED",
"productId": "PRD-0004812",
"variantId": "VAR-0004812-01"
},
{
"recordKey": "EAN_delta-20261018-160010#2",
"result": "IGNORED",
"reason": "La variante ya no tiene ese EAN"
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | Un alta llega sin negocio o un EAN no tiene 8 a 13 dígitos |
| 409 | IDEMPOTENCY_MISMATCH | El mismo registro llega otra vez con otro contenido |
POST /api/v2/compat-notices/replays · Reemitir avisos de convivencia
| Campo | Valor |
|---|---|
| API | API-02-405 · MS-02 Producto |
| Para qué | Vuelve a emitir, sin tocar los productos, el aviso de hoy (idmc_put_products o idmc_post_products) de una lista de productos cuando el backend de Entrada Única o de Foro muestra algo desfasado. Sólo existe mientras vivan esos backends y se borra con los tópicos en R3. |
| En esta épica | Reemitir avisos desfasados de una lista de productos |
| Quién la llama | BFF del portal |
| Permiso | Gobierno (Gobierno de Datos) y Admin |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | product_receipts, product_outbox |
| Publica | idmc_put_products/(contrato de hoy), idmc_post_products/(contrato de hoy) |
Request
{
"topic": "idmc_put_products",
"productIds": [
"PRD-0004812",
"PRD-0004813"
],
"reason": "Entrada Única muestra un estatus viejo"
}
Response · 202
{
"success": true,
"data": {
"requestId": "req-idmc-0412",
"status": "ACCEPTED",
"receiptUrl": "/api/v2/product-receipts/req-idmc-0412",
"products": 2
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | El tópico no es de Producto o la lista pasa de 10,000 productos |
| 422 | BUSINESS_ERROR | El aviso de ese tópico ya está apagado porque no quedan consumidores |
Las que usa y construye otra épica (5)
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-02-049 | POST /internal/product/sap/122 | El 122 que alimenta el aviso de SKU y EAN | FT-PRD-02 · Creación de SKU con SAP |
| API-02-030 | GET /api/v2/workflow/config/{type} | Leer SWITCHES (un interruptor por tópico idmc_*), SUPPLIER_LABELS y P360_CODES | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-031 | POST /api/v2/workflow/config/{type}/plans | Encender o apagar un tópico en la ventana de corte | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
| API-02-002 | GET /api/v2/products/{id} | Las pantallas leen el estado del producto por el BFF, sin idmc_* | FT-PRD-01 · Modelo canónico de producto |
| API-02-025 | GET /api/v2/product-receipts/{requestId} | El recibo de una reemisión | FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas… |
6. Eventos
Publica
| Evento | Cuándo | Quién lo consume |
|---|---|---|
idmc_put_products/(contrato de hoy) | Cada cambio de estatus, de datos o de EAN, mientras exista el backend de Entrada Única o el de Foro | MS-05 (bitácora) |
idmc_post_products/(contrato de hoy) | SAP asigna SKU y EAN (122) o manda precios y costos (142) | MS-05 (bitácora) |
idmc_post_look/(contrato de hoy) | SAP crea un Conjunto Look | MS-05 (bitácora) |
catalog.product.changed/STATUS_CHANGED | El mismo cambio de estado, para los módulos nuevos | FT-ACT-05, FT-ARQ-02, FT-CAT-05, 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.product.changed/PRODUCT_UPDATED | Se aplican precios y costos de SAP | FT-ACT-05, FT-ARQ-02, FT-IA-01, FT-PLT-07, FT-PRD-05, FT-RAC-06 |
catalog.product.changed/EAN_CHANGED | SAP da de alta o de baja un EAN | FT-ARQ-02, FT-PRD-03 |
catalog.product.changed/PRODUCT_CREATED | Se guarda un Conjunto Look nuevo como producto de tipo LOOK | FT-ARQ-01 |
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
idmc_put_products/(contrato de hoy) | Los backends de Entrada Única y Foro actualizan el estatus que muestran | esta misma épica |
idmc_post_products/(contrato de hoy) | Entrada Única actualiza SKU, EAN y datosVenta de la propuesta | esta misma épica |
idmc_post_look/(contrato de hoy) | Entrada Única registra el look | esta misma épica |
catalog.egress.files/OBJECT_FINALIZE | MS-07 lee los archivos de SAP | D-ARCHIVOS |
7. Datos
Cada colección tiene un solo dueño, el único que escribe en ella.
| Colección | Dueño | Qué guarda | Esta épica |
|---|---|---|---|
product_outbox | MS-02 | Los cambios del producto que esperan salir como evento (antes outbox). | escribe |
products | MS-02 | La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos. | escribe |
product_groups | MS-02 | Looks, configurables y venta cruzada. | escribe |
identifier_registry | MS-02 | Unicidad de SKU y de EAN por negocio. | escribe |
product_receipts | MS-02 | El recibo de cada escritura confirmada en el producto (antes operation_receipts). | escribe |
product_reference_tables | MS-02 | Configuración del motor de estados y del matching: transiciones, estados externos y pesos. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-INT-06·H1 · Recibir cada cambio de estatus de una propuesta o producto | P1 | pasos 1, 2, 3, 4, 5, 6; API-02-030 |
| FT-INT-06·H2 · El SKU y el EAN cuando SAP crea el artículo | P1 | flujo «SAP crea el artículo: SKU y EAN a Entrada Única»; API-02-049 |
FT-INT-06·H3 · El precio y el costo (datosVenta) cuando SAP los actualiza | P1 | flujo «Precio, costo y EAN que cambia SAP»; API-02-052, API-02-053 |
| FT-INT-06·H4 · Un emisor TO-BE | P2 | API-02-030, API-02-031, API-02-405 |
| FT-INT-06·H5 · El aviso del Conjunto Look creado en SAP y el owner del producto | P3 | flujo «Conjunto Look creado en SAP»; API-02-050 |
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-06-1. Los idmc_ son sólo para los backends viejos: existen mientras vivan los backends de Entrada Única y de Foro. Las pantallas nuevas leen el estado por el BFF desde MS-02 y no se construyen rutas /public/rt para ellas (ni GetProposals ni AutForoWrite). Con tráfico cero cada tópico se apaga y se borra en R3. Por qué:* ADR-12 adopta las decisiones 19 y 20 del backend compartido: un solo BFF y sin capa de compatibilidad para los fronts. Se apoya en ADR-12, PD-06, DUD-06.
- D-INT-06-2. Un solo emisor por tópico: el del PIM se enciende con un interruptor por tópico en la tabla SWITCHES del motor, en la misma ventana en que se apaga el de P360, en el corte de productos (FT-MIG-04); antes del corte, P360 sigue publicando. Por qué: Dos emisores duplican avisos y uno apagado deja a Entrada Única en silencio sin error visible. Se apoya en PD-06, PD-11, DEC-ARQ-10.
- D-INT-06-3. El aviso de hoy se escribe en el outbox de MS-02 en la misma transacción del cambio, como una proyección del evento nuevo; no hay un servicio aparte ni una tarea programada. Si el interruptor está apagado, no se escribe. Por qué: Así ningún cambio confirmado queda sin aviso y no se mantiene otra pieza para algo temporal. Se apoya en ADR-12, DMS-67.
- D-INT-06-4. La etiqueta sale de SUPPLIER_LABELS (FT-RAC-05) y el código de hoy de P360_CODES (FT-FLU-01), las mismas tablas versionadas de MS-02 que usan el portal, MS-03 y los reportes: estado, tarea abierta y origen dan etiqueta y código, con el orden de §7.5 de la máquina de estados. El aviso no calcula nada por su cuenta. Por qué: Un solo lugar para traducir el modelo nuevo al de hoy, para que Entrada Única diga lo mismo que el portal; Entrada Única lee etiquetas, no códigos. Se apoya en PD-29, PD-06.
- D-INT-06-5. El aviso del 122 conserva la regla de hoy por negocio de SAP: SFERA 1021; REGULAR, MARCAS PROPIAS y SERVICIOS 1002; DUTY FREE y otros 1001, con estatus previo «SKU Creation» y las variantes con SKU y MainBarCode. ECC y S4H mandan el mismo cuerpo: se corrige el defecto de S4H (sin variantes y con previo 1020), probado antes contra el listener de Entrada Única en QA. Por qué: Paridad en lo que Entrada Única espera y una sola lógica para los dos SAP, como pide FT-PRD-02. Se apoya en PD-06, DEC-ARQ-12, RN-ALT-12.
- D-INT-06-6. Por suscripción: el PIM emite los 3 tópicos de producto que hoy tienen emisor en el código (idmc_post_products, idmc_put_products e idmc_post_look; los 2 de catálogo los emite MS-01). Los 12 que tienen suscripción en Entrada Única pero ningún emisor en el código no se emiten, después de confirmar tráfico cero. Los que sólo salen de scripts temporales se retiran. Por qué: Cada una de las 19 suscripciones de Entrada Única y la de Foro queda con decisión antes del corte, sin construir emisores que nadie usa. Se apoya en DUD-06, PD-06.
- D-INT-06-7. El campo owner del aviso se calcula con la regla de hoy (ID de 15 caracteres o más, o proveedor migrado: P360; si no, STEP) sólo para el aviso. No se agrega un valor nuevo para no romper el listener; se retira con el tópico. Por qué: Para Entrada Única «P360» significa «el sistema dueño», que ahora es el PIM; cambiar el valor obliga a cambiar un backend que se va a apagar. Se apoya en DUD-11.
- D-INT-06-8. El Conjunto Look que crea SAP se guarda como producto de tipo LOOK con referencias a sus productos y se avisa con idmc_post_look; el PIM es su fuente de verdad desde el corte. Por qué: Es la propuesta vigente para PD-15: el look no es un árbol, es un producto con referencias. Se apoya en PD-15.
- D-INT-06-9. Para corregir desfases, Gobierno de Datos reemite el aviso de una lista de productos sin tocarlos (API-02-405), con recibo; el comando se borra con los tópicos. Por qué: Hoy hubo que republicar a mano estatus desfasados; sin un comando, el riesgo de que Entrada Única deje de enterarse no tiene remedio. Se apoya en RSG-26.
Qué falta decidir
| ID | Qué falta |
|---|---|
| PD-06 | Ratificar con Entrada Única y Foro que sus backends sólo necesitan estos 3 tópicos de producto hasta R3. |
| DUD-06 | Medir el tráfico real de las 12 suscripciones sin emisor antes de retirarlas. |
| DUD-11 | Si STEP sigue vivo detrás del broker; si no, el valor STEP del owner sobra. |
| PD-11 | El mecanismo de sincronización de P360 al PIM durante la convivencia: los idmc_* no sirven como fuente porque sólo llevan el estatus. |
| DUD-28 | Cómo se conecta Foro con el PIM hasta que su backend se apague en R3. |
Fuentes
- [D]
trazabilidad/features/FT-INT-06-avisos-idmc-entrada-unica.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.