Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-PLT-04: 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-PLT-04.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-PLT-04-grupos-de-atributos-y-minimos.md.
En 30 segundos
Cada sistema que recibe productos (SAP, la tienda, OMS, Marketplace, Señalización, el almacén de datos) necesita un juego distinto de atributos, y hoy esas listas viven escondidas en código y en siete tipos de «grupo» que no se hablan. Esta épica junta los atributos en grupos con tipo: por destino, por sección, por permiso o para la etapa de placeholder. Así se sabe qué viaja a cada sistema, cuál es su mínimo y qué negocios lo exigen, sin listas fijas en ningún adaptador.
- Módulo dueño: MS-01 Catálogo. También participan: MS-08 Adaptadores de salida.
- Etapa C · Configura el catálogo. Recibe «PE-T · Usuario con permisos y bitácora» y entrega «PE-C · Catálogo vigente».
- APIs: construye 4 y usa 3 que construyen otras épicas.
- Eventos: publica 3 y consume 3.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| PE-T · Usuario con permisos y bitácora | El administrador de Gobierno de Producto ya identificado, con sus roles del directorio de MS-13. |
| FT-PLT-02 · Catálogo de atributos | Los atributos con su relevancia por destino, que son la base de la salida a cada sistema. |
Entrega
| A | Qué |
|---|---|
| PE-C · Catálogo vigente | Los grupos vigentes y la salida efectiva por destino (API-01-105): qué atributos viajan a cada sistema y cuáles son su mínimo. |
| FT-PLT-06 · Configuración de atributos por plantilla y por negocio… | Los mínimos por destino: el de SAP llena la capa de datos maestros de los tres negocios y el de cada canal marca qué es requerido para publicar en él. |
| FT-INT-01 · Publicación a e-commerce | La salida a la tienda y su mínimo de atributos, que el adaptador lee de MS-01 en lugar de una lista propia. |
| FT-INT-02 · Publicación a OMS, DWH y Señalización | La salida a OMS, Señalización y DWH con su mínimo de atributos, por la misma API. |
| FT-USR-02 · Matriz de roles y permisos por módulo, acción, negocio y… | Los grupos de tipo permiso (qué atributos van juntos); quién los ve o edita lo decide la matriz de MS-13. |
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 | Administración del catálogo | Entrada Única · Vendor Center | Abre los grupos de atributos por destino | — |
| 2 | Entrada Única · Vendor Center | MS-01 Catálogo (por el BFF) | Lista los grupos con su tipo y su salida | API-01-014 |
| 3 | Administración del catálogo | Entrada Única · Vendor Center | Agrega tres atributos al grupo de OMS y marca su mínimo | — |
| 4 | Entrada Única · Vendor Center | MS-01 Catálogo (por el BFF) | Pide el plan de pertenencia y mínimo | API-01-015 |
| 5 | Entrada Única · Vendor Center | MS-01 Catálogo (por el BFF) | Confirma y abre la solicitud de cambio | API-01-004 |
| 6 | Entrada Única · Vendor Center | MS-01 Catálogo (por el BFF) | Otro administrador aprueba la solicitud | API-01-103 |
| 7 | MS-01 Catálogo | Base pim | Guarda la pertenencia y la salida efectiva de cada atributo | — |
| 8 | MS-01 Catálogo | Eventos | Avisa el cambio del grupo de OMS | catalog.governance.changed/ATTRIBUTE_GROUP_CHANGED |
| 9 | MS-01 Catálogo | Eventos | Avisa los atributos que ahora viajan a OMS | catalog.governance.changed/ATTRIBUTE_CHANGED |
| 10 | Eventos | MS-08 Adaptadores de salida | Entrega el cambio del grupo al adaptador | catalog.governance.changed/ATTRIBUTE_GROUP_CHANGED |
| 11 | MS-08 Adaptadores de salida | MS-01 Catálogo | Lee la salida efectiva de OMS: atributos 2, 6 y 8 | API-01-105 |
3.1 Matriz de mínimos de una plantilla
3.2 Grupo con comportamiento heredado
3.3 Campos de la etapa placeholder
4. Si algo sale mal
- Un destino exige un atributo que un negocio tiene opcional. La matriz lo marca como hueco; el atributo no frena el envío de la propuesta, pero la vista lo marca requerido para publicar en ese canal y la compuerta de publicación de MS-02 lo cobra.
- Se agrega a un grupo un atributo inactivo o que no existe. El plan responde 422 VALIDATION_ERROR y no se abre ninguna solicitud.
- Dos grupos de un atributo se contradicen (uno lo manda a Marketplace y otro lo excluye). Gana la exclusión explícita y el plan lo dice antes de confirmar; nada viaja por accidente.
- El adaptador no alcanzó a leer la salida nueva. MS-08 aplica los avisos en orden por versión y, al arrancar, relee la salida de cada destino; nunca usa una lista propia.
5. APIs
Las que construye esta épica (4)
GET /api/v2/attribute-groups · Grupos de atributos
| Campo | Valor |
|---|---|
| API | API-01-014 · MS-01 Catálogo |
| Para qué | Lista los grupos de atributos por tipo (sección, despliegue, destino, permiso, placeholder y los de hoy), con su orden, su salida a destinos y cuántos atributos tiene y cuántos son mínimo. Quién ve o edita un grupo de permiso no está aquí: es de MS-13. |
| En esta épica | Listar los grupos con su tipo, su salida y su mínimo |
| Quién la llama | BFF del portal, MS-02 Producto, MS-13 Identidad y acceso |
| Permiso | CAT-L; los módulos, con su cuenta de servicio |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | type = DESTINO, q = oms |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"groupId": "DESTINO:OMS",
"type": "DESTINO",
"name": {
"es": "Lo que viaja a OMS"
},
"exportTo": [
"OMS"
],
"memberCount": 3,
"minimumCount": 2,
"order": 4,
"parentGroupId": null,
"status": "ACTIVE",
"version": 5
}
],
"page": 1,
"size": 50,
"total": 1
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | El tipo de grupo no existe |
POST /api/v2/attribute-groups/plans · Plan de cambio de grupos
| Campo | Valor |
|---|---|
| API | API-01-015 · MS-01 Catálogo |
| Para qué | Revisa sin escribir el alta o el cambio de un grupo, su salida a destinos, la pertenencia de atributos, su marca de mínimo y las exclusiones. Dice, atributo por atributo, a qué destinos viajará antes y después. |
| En esta épica | Alta y cambio de grupos, pertenencia, mínimo y exclusiones |
| Quién la llama | BFF del portal |
| Permiso | CAT-E |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
Request
{
"operation": "ADD_MEMBERS",
"groupId": "DESTINO:OMS",
"version": 5,
"members": [
{
"attributeId": "ATR-0000002",
"minimum": true
},
{
"attributeId": "ATR-0000006",
"minimum": true
},
{
"attributeId": "ATR-0000008",
"minimum": false
}
]
}
Response · 200
{
"success": true,
"data": {
"planId": "pln-9e2b40",
"expiresAt": "2027-01-13T15:10:00Z",
"requiresApproval": true,
"items": [
{
"attributeId": "ATR-0000002",
"outputs": {
"before": [
"TIENDA"
],
"after": [
"TIENDA",
"OMS"
]
},
"minimumFor": {
"after": [
"OMS"
]
}
},
{
"attributeId": "ATR-0000006",
"outputs": {
"before": [
"SAP"
],
"after": [
"SAP",
"OMS"
]
},
"minimumFor": {
"after": [
"OMS"
]
}
},
{
"attributeId": "ATR-0000008",
"outputs": {
"before": [],
"after": [
"OMS"
]
},
"minimumFor": {
"after": []
}
}
],
"impact": {
"views": 0,
"destinations": [
"OMS"
]
},
"applyUrl": "/api/v2/catalog-plans/pln-9e2b40/apply"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 422 | VALIDATION_ERROR | Un atributo no existe o está inactivo |
| 422 | BUSINESS_ERROR | Un grupo de destino apunta a un destino que no existe en el sistema |
| 409 | VERSION_CONFLICT | El grupo cambió desde que se leyó |
GET /api/v2/attribute-outputs · Salida efectiva por destino
| Campo | Valor |
|---|---|
| API | API-01-105 · MS-01 Catálogo |
| Para qué | Dice qué atributos viajan a un destino (SAP, tienda, OMS, Marketplace, Señalización, DWH o el archivo de placeholders) y cuáles son su mínimo, con el motivo de cada uno. La leen los adaptadores y Producto: ninguno guarda listas de campos propias. |
| En esta épica | La salida efectiva por destino que leen los adaptadores y Producto |
| Quién la llama | BFF del portal, MS-02 Producto, MS-08 Adaptadores de salida, MS-10 Exportador al DWH |
| Permiso | CAT-L; los módulos, con su cuenta de servicio |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | destination = OMS |
| También la usan | FT-PLT-02 |
Request
null
Response · 200
{
"success": true,
"data": {
"destination": "OMS",
"version": 12,
"computedAt": "2027-01-13T15:20:02Z",
"attributes": [
{
"attributeId": "ATR-0000002",
"minimum": true,
"because": "GRUPO DESTINO:OMS"
},
{
"attributeId": "ATR-0000006",
"minimum": true,
"because": "GRUPO DESTINO:OMS"
},
{
"attributeId": "ATR-0000008",
"minimum": false,
"because": "GRUPO DESTINO:OMS"
}
],
"excluded": []
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El destino no existe |
GET /api/v2/taxonomies/PRODUCT/nodes/{id}/minimums · Matriz de mínimos de una plantilla
| Campo | Valor |
|---|---|
| API | API-01-106 · MS-01 Catálogo |
| Para qué | Cruza, para una plantilla, lo que cada negocio pide (nivel y capa de la vista efectiva) con lo que exige cada destino, y señala dónde no cuadran: por ejemplo, un atributo que OMS exige y Marketplace tiene opcional. |
| En esta épica | La matriz de mínimos por negocio y destino de una plantilla |
| Quién la llama | BFF del portal |
| Permiso | CAT-L |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | id = EU4-0412 |
Request
null
Response · 200
{
"success": true,
"data": {
"templateId": "EU4-0412",
"rows": [
{
"attributeId": "NOMBRE_COMERCIAL",
"byBusiness": {
"MER": "REQUIRED",
"SUB": "REQUIRED",
"MKP": "REQUIRED"
},
"requiredByDestination": [
"TIENDA",
"MARKETPLACE"
]
},
{
"attributeId": "ATR-0000006",
"byBusiness": {
"MER": "REQUIRED",
"SUB": "REQUIRED",
"MKP": "OPTIONAL"
},
"requiredByDestination": [
"OMS"
]
}
],
"gaps": [
{
"attributeId": "ATR-0000006",
"business": "MKP",
"issue": "OMS lo exige y Marketplace lo tiene opcional"
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | La plantilla no existe |
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.
| API | Método y ruta | Para qué, aquí | La construye |
|---|---|---|---|
| API-01-004 | POST /api/v2/catalog-plans/{planId}/apply | Confirmar el plan y abrir la solicitud | FT-PLT-01 · Fundamentos de gobierno de plantillas |
| API-01-103 | POST /api/v2/catalog-change-requests/{changeRequestId}/decision | Aprobar la solicitud del grupo | FT-PLT-01 · Fundamentos de gobierno de plantillas |
| API-01-053 | POST /internal/governance/bulk-load/{coleccion} | Migrar los grupos de hoy como tipos, con su orden de P360 | FT-PLT-01 · Fundamentos de gobierno de plantillas |
6. Eventos
Publica
| Evento | Cuándo | Quién lo consume |
|---|---|---|
catalog.governance.changed/ATTRIBUTE_GROUP_CHANGED | Se aprueba el alta o el cambio de un grupo: su salida, su orden o su mínimo | FT-ARQ-02 |
catalog.governance.changed/ATTRIBUTE_CHANGED | Cambia la pertenencia, la exclusión o el mínimo de un atributo en sus grupos | FT-ARQ-02, FT-PLT-02, FT-PLT-06 |
catalog.governance.changed/TEMPLATE_VIEW_CHANGED | Un mínimo nuevo cambia lo que es requerido para publicar en las vistas de las plantillas | FT-ACT-01, FT-ACT-05, FT-IA-03, FT-PLT-06, FT-PLT-09, FT-PRD-01, FT-RAC-01, FT-RAC-02 |
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
catalog.governance.changed/ATTRIBUTE_GROUP_CHANGED | MS-08 refresca qué atributos viajan a cada destino y al archivo de placeholders | esta misma épica |
catalog.governance.changed/ATTRIBUTE_GROUP_CHANGED | MS-13 conoce los grupos de tipo permiso para ofrecerlos en la matriz de roles | esta misma épica |
catalog.governance.changed/ATTRIBUTE_CHANGED | MS-01 recalcula las vistas efectivas de las plantillas que usan el atributo | esta misma épica |
7. Datos
Cada colección tiene un solo dueño, el único que escribe en ella.
| Colección | Dueño | Qué guarda | Esta épica |
|---|---|---|---|
attribute_groups | MS-01 | Grupos de atributos, incluidos los de permiso (quién ve y quién edita). | escribe |
attributes | MS-01 | Cada atributo: tipo, lista, restricciones, grupos e identificadores externos. | escribe |
template_views | MS-01 | La vista efectiva ya resuelta por plantilla y negocio: qué atributos pide y cuáles son obligatorios. | escribe |
governance_receipts | MS-01 | El recibo de cada escritura confirmada en el catálogo (antes operation_receipts). | escribe |
governance_outbox | MS-01 | Los cambios del catálogo que esperan salir como evento (antes outbox). | escribe |
attribute_groups | MS-01 | Grupos de atributos, incluidos los de permiso (quién ve y quién edita). | lee |
attributes | MS-01 | Cada atributo: tipo, lista, restricciones, grupos e identificadores externos. | lee |
template_views | MS-01 | La vista efectiva ya resuelta por plantilla y negocio: qué atributos pide y cuáles son obligatorios. | lee |
taxonomy_nodes | MS-01 | Plantillas y nodos de grupo de artículo, con la configuración de atributos de cada plantilla. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-PLT-04·H1 · Matriz de mínimos | P1 | flujo «Matriz de mínimos de una plantilla»; API-01-106 |
| FT-PLT-04·H2 · Salida por sistema | P1 | pasos 3, 4, 7, 8, 9, 10, 11; API-01-105 |
| FT-PLT-04·H3 · Grupos y pertenencia | P1 | pasos 1, 2, 3, 4, 5, 6, 7; API-01-014, API-01-015, API-01-053 |
| FT-PLT-04·H4 · Comportamiento heredado | P2 | flujo «Grupo con comportamiento heredado»; API-01-015 |
| FT-PLT-04·H5 · Placeholder hacia PLM | P3 | flujo «Campos de la etapa placeholder»; API-01-105. Fuera: PLM no tiene contrato ni pieza en el sistema: el grupo de placeholder sirve hoy al archivo de placeholders a o9 (FT-PRD-04) y servirá a PLM cuando se defina su contrato. |
9. Decisiones de esta épica
Las tomó el TL como arquitecto; quedan como [Propuesta] hasta que el equipo de la épica las revise.
- D-PLT-04-1. Un solo modelo de grupo con tipo. Los siete mecanismos de hoy migran como tipos (sección del portal, despliegue, categoría de característica, permiso, ATG, SAP y relevancia) con su orden de P360, y los de la ERF entran como tipos nuevos: destino y placeholder. No se consolidan al corte. Por qué: Cada mecanismo tiene consumidores distintos; consolidarlos en el corte rompería la ficha de la tienda y la captura. La forma del dato no cambia si después se consolidan. Se apoya en PD-14, DUD-16.
- D-PLT-04-2. La salida por destino es una sola cuenta: un atributo viaja a un destino si su relevancia lo dice o si pertenece a un grupo de ese destino, salvo una exclusión explícita, que siempre gana. El mínimo de atributos de cada destino es la marca «mínimo» en su grupo. MS-08, MS-10 y MS-02 la leen de API-01-105 y no guardan listas propias. Por qué: Que ningún sistema destino dependa de una lista escrita en código y que cambiar qué viaja sea una solicitud aprobada, no un despliegue. Se apoya en RF-PLA-07, RF-PLA-01, DEC-04.
- D-PLT-04-3. El mínimo para publicar en cada canal lo decide publication_rules de MS-02 y sólo cita el grupo de MS-01 para la parte de atributos. Precio, categoría web, imagen principal y el orden entre canales (OMS antes que la tienda) son condiciones de MS-02, no grupos de atributos. Por qué: Un dueño por dato: MS-01 sabe de atributos y MS-02 de lo que tiene cada producto. Así el mínimo web «precio, nombre, categoría e imagen» se arma sin copiar ninguna lista. Se apoya en RN-PUB-05, ADR-12.
- D-PLT-04-4. Quién ve o edita un grupo de tipo permiso lo decide sólo la matriz de MS-13 (rol por grupo de atributos); MS-01 dice qué atributos van juntos. Los campos de roles que traía el modelo de datos en el grupo no se usan. Por qué: Los permisos tienen un dueño, el directorio, y la identidad dejó MS-01 (ADR-12 sobre DMS-71). Se apoya en DUD-22, DEC-PLT-09, ADR-12.
- D-PLT-04-5. Los mínimos por destino alimentan la vista efectiva: el mínimo de SAP es la capa 1 (datos maestros) en los tres negocios y frena el envío de la propuesta; el mínimo de cada canal no frena el envío: la vista lo marca requerido para publicar en ese canal. Por qué: Dos carreteras: antes del SKU frena lo indispensable para crear el artículo, y la calidad del contenido frena sólo la publicación por canal. Se apoya en PD-24, RF-PLA-05, RF-PLA-02.
- D-PLT-04-6. El grupo de placeholder dice qué atributos valen en esa etapa y viajan en el archivo de placeholders a o9. PLM no tiene contrato ni pieza en el sistema y queda fuera hasta que se defina; cuando llegue, usará el mismo grupo. Por qué: La etapa de placeholder ya existe con o9 (FT-PRD-04); no se inventa un contrato con PLM que nadie ha descrito. Se apoya en RF-PLA-19.
Qué falta decidir
| ID | Qué falta |
|---|---|
| PD-14 | Gobierno de Producto ratifica la taxonomía de grupos (propuesta del 17-oct: no se consolidan al corte). |
También siguen abiertos: PEN-75, Los equipos de negocio entregan la lista real de obligatorios funcionales por negocio; PEN-76, El equipo del proyecto entrega el mínimo técnico de cada sistema destino; PEN-87, SAP confirma la lista completa de datos maestros que pide para crear el artículo (capa 1); PEN-02, Confirmar si se mantienen mínimos propios por sistema o un modelo único; aquí se propone mínimos por destino derivados de un solo catálogo.
Fuentes
- [D]
trazabilidad/features/FT-PLT-04-grupos-de-atributos-y-minimos.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.