← Arquitectura por épica

FT-PLT-09 · Carga masiva de configuración de plantillas con…

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-PLT-09: 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-09.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-PLT-09-carga-masiva-configuracion-plantillas.md.

En 30 segundos

Configurar miles de plantillas una por una es imposible, y hoy se hace con programas de un solo uso que no validan nada. Esta épica deja cargar la configuración del catálogo por archivo CSV o por API: el archivo se valida completo, renglón por renglón, sin tocar la base; si todo está bien, se aplica con la misma aprobación que la pantalla y con los mismos avisos. Sirve para cargar el nivel de cada atributo por negocio en muchas plantillas y para preparar un ambiente vacío.

  • Módulo dueño: MS-01 Catálogo. También participan: MS-02 Producto, MS-04 Reportes, MS-14 Avisos y ayuda, MS-15 IA y enriquecimiento.
  • Etapa C · Configura el catálogo. Recibe «PE-T · Usuario con permisos y bitácora» y entrega «PE-C · Catálogo vigente».
  • APIs: construye 7 y usa 5 que construyen otras épicas.
  • Eventos: publica 5 y consume 1.

1. Dónde encaja

Recibe

DeQué
PE-T · Usuario con permisos y bitácoraEl administrador de Gobierno de Producto ya identificado, con sus roles del directorio de MS-13.
FT-PLT-06 · Configuración de atributos por plantilla y por negocio…El modelo de configuración por plantilla y negocio (nivel, capa, sección, filtro) y sus reglas de validación, que la carga reutiliza tal cual.
FT-PLT-01 · Fundamentos de gobierno de plantillasLa solicitud de cambio con canal IMPORT, API o IA, su aprobación y la secuencia de ID para los nodos nuevos.
FT-RAC-01 · Motor de validación en línea y candados de datos…El formato común de errores por renglón y campo (fila, columna, código y mensaje), para que la carga reporte igual que la validación en línea.

Entrega

AQué
PE-C · Catálogo vigenteLa configuración cargada por archivo, ya aprobada y vigente, con los mismos avisos de catalog.governance.changed que si se hubiera editado en pantalla.

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

Nuevo PIM · un solo sistema

Pantallas y sistemas

Personas

GET /bff/v1/catalog/files

Plantilla de columnas de un perfil
Subir una carga para validarla
y 4 más

Guarda el archivo original con su hue…

POST /internal/product/catalog-usage

Mandar un aviso explícito

TEMPLATE_VIEW_CHANGED
TAXONOMY_NODE_CHANGED

TEMPLATE_VIEW_CHANGED

Subir una carga para validarla
Resultado de una carga

Mis trabajos de Reportes

Administración del catálogo

Entrada Única · Vendor Center

BFF del portal

★ MS-01 Catálogo

MS-02 Producto

MS-04 Reportes

MS-14 Avisos y ayuda

MS-15 IA y enriquecimiento

Base pim

Eventos

Archivos e imágenes

Contexto de FT-PLT-09

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.

EventosBase·pimMS-14 Avisos y ayudaMS-02 ProductoArchivosMS-01 CatálogoEntrada Única · Vendor CenterEventosBase·pimMS-14 Avisos y ayudaMS-02 ProductoArchivosMS-01 CatálogoEntrada Única · Vendor CenterAdministración del catálogoBFF1. Descarga la plantilla del perfil de configuración2. Pide las columnas del perfil y su CSV vacíoGET /api/v2/catalog-imports/profiles/{p}/template3. Sube el CSV con el nivel por negocio de 37 plantillas4. Sube el archivo para validarlo sin escribirPOST /api/v2/catalog-imports5. Guarda el archivo original con su huella6. Cuenta los productos de las plantillas tocadasPOST /internal/product/catalog-usage7. Avisa que la validación terminóPOST /internal/notifications/messages8. Lee el resumen con altas, cambios e impactoGET /api/v2/catalog-imports/{id}9. Aplica la carga y abre la solicitudPOST /api/v2/catalog-imports/{id}/apply10. Otro administrador aprueba la solicitudPOST /api/v2/catalog-change-requests/{changeRequestId}/decision11. Aplica cada registro en su propia transacción12. Avisa las vistas nuevas por negocioTEMPLATE_VIEW_CHANGED13. Entrega los cambios para validar con lo nuevoTEMPLATE_VIEW_CHANGEDAdministración del catálogoBFF
Flujo principal de FT-PLT-09
Los pasos en texto
PasoDeAQué haceAPI o evento
1Administración del catálogoEntrada Única · Vendor CenterDescarga la plantilla del perfil de configuración—
2Entrada Única · Vendor CenterMS-01 Catálogo (por el BFF)Pide las columnas del perfil y su CSV vacíoAPI-01-030
3Administración del catálogoEntrada Única · Vendor CenterSube el CSV con el nivel por negocio de 37 plantillas—
4Entrada Única · Vendor CenterMS-01 Catálogo (por el BFF)Sube el archivo para validarlo sin escribirAPI-01-031
5MS-01 CatálogoArchivos e imágenes (almacén y CDN)Guarda el archivo original con su huella—
6MS-01 CatálogoMS-02 ProductoCuenta los productos de las plantillas tocadasAPI-02-113
7MS-01 CatálogoMS-14 Avisos y ayudaAvisa que la validación terminóAPI-14-005
8Entrada Única · Vendor CenterMS-01 Catálogo (por el BFF)Lee el resumen con altas, cambios e impactoAPI-01-033
9Entrada Única · Vendor CenterMS-01 Catálogo (por el BFF)Aplica la carga y abre la solicitudAPI-01-032
10Entrada Única · Vendor CenterMS-01 Catálogo (por el BFF)Otro administrador aprueba la solicitudAPI-01-103
11MS-01 CatálogoBase pimAplica cada registro en su propia transacción—
12MS-01 CatálogoEventosAvisa las vistas nuevas por negociocatalog.governance.changed/TEMPLATE_VIEW_CHANGED
13EventosMS-02 ProductoEntrega los cambios para validar con lo nuevocatalog.governance.changed/TEMPLATE_VIEW_CHANGED

3.1 Archivo con errores

Base·pimMS-01 CatálogoEntrada Única · Vendor CenterBase·pimMS-01 CatálogoEntrada Única · Vendor CenterBFFAdministración del catálogo1. Sube 500 valores de lista con dos códigos repetidosPOST /api/v2/catalog-imports2. Marca la carga con errores sin tocar el catálogo3. Baja el reporte con fila, columna, código y mensajeGET /api/v2/catalog-imports/{id}4. Corrige el archivo y lo vuelve a subirBFFAdministración del catálogo
Archivo con errores

3.2 Inicializar un ambiente vacío

EventosBase·pimMS-01 CatálogoEntrada Única · Vendor CenterEventosBase·pimMS-01 CatálogoEntrada Única · Vendor CenterAdministración del catálogoBFF1. Sube listas, atributos, nodos y configuración en un paquete2. Valida el paquete en orden de dependenciaPOST /api/v2/catalog-imports3. Aplica el paquete y abre la solicitudPOST /api/v2/catalog-imports/{id}/apply4. El aprobador del ambiente aprueba la solicitudPOST /api/v2/catalog-change-requests/{changeRequestId}/decision5. Da a cada nodo sin ID el siguiente de su nivel6. Avisa los nodos nuevosTAXONOMY_NODE_CHANGEDAdministración del catálogoBFF
Inicializar un ambiente vacío

3.3 Validación por API y centro de archivos

MS-04 ReportesEntrada Única · Vendor CenterBase·pimMS-01 CatálogoMS-15 IA y enriquecimientoMS-04 ReportesEntrada Única · Vendor CenterBase·pimMS-01 CatálogoMS-15 IA y enriquecimientoAdministración del catálogoBFF1. Manda los mismos renglones en JSON con canal IAPOST /api/v2/catalog-imports2. Valida igual que un archivo y guarda el reporte3. Consulta el avance y el resultadoGET /api/v2/catalog-imports/{id}4. Abre el centro de importaciones y exportaciones5. Pide sus cargas y exportaciones en una listaGET /bff/v1/catalog/files6. Lee las cargas de configuración del usuarioGET /api/v2/catalog-imports7. Lee las exportaciones del usuarioGET /api/v2/receipts?user=&from=&to=Administración del catálogoBFF
Validación por API y centro de archivos

4. Si algo sale mal

  • El archivo trae una columna que no es de su perfil. Se rechaza completo con 400 UNKNOWN_COLUMN antes de leer una sola fila; nada cambia.
  • Algún renglón tiene errores (código repetido, nivel o negocio que no existe). La carga queda VALIDATED_WITH_ERRORS con fila, columna, código y mensaje de cada error y ningún dato cambia; no se puede aplicar a medias.
  • El archivo pasa el límite de su perfil. Se rechaza completo con 413 LIMIT_EXCEEDED; nunca se trunca.
  • Algo que toca la carga cambió entre la validación y la aprobación. La aprobación deja la solicitud en conflicto sin aplicar nada (409 VERSION_CONFLICT) y se valida otra vez el archivo; una carga lista vale 24 horas.
  • Un registro falla al aplicarse aunque pasó la validación. Cada registro va en su propia transacción: los demás se aplican y el recibo dice cuál falló y por qué, para reintentar sólo ése.

5. APIs

Las que construye esta épica (7)

GET /api/v2/catalog-imports/profiles · Perfiles de carga masiva del catálogo
CampoValor
APIAPI-01-029 · MS-01 Catálogo
Para quéLista los 12 perfiles de carga de catálogo y estructura (listas, valores, atributos, grupos, nodos, metadatos y configuración por plantilla y negocio), con su orden de dependencia y su límite de renglones.
En esta épicaLos 12 perfiles de carga con su orden de dependencia
Quién la llamaBFF del portal, MS-15 IA y enriquecimiento
PermisoCAT-L
CabecerasAuthorization, X-Request-Id

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "profile": "LOOKUP_VALUES_V1",
        "name": "Valores de lista",
        "objectType": "LOV_VALUE",
        "dependencyOrder": 2,
        "maxRows": 50000
      },
      {
        "profile": "ATTRIBUTES_V1",
        "name": "Atributos",
        "objectType": "ATTRIBUTE",
        "dependencyOrder": 3,
        "maxRows": 5000
      },
      {
        "profile": "STRUCTURE_GROUP_CREATE_V1",
        "name": "Alta de nodos",
        "objectType": "TEMPLATE_NODE",
        "dependencyOrder": 5,
        "maxRows": 5000
      },
      {
        "profile": "TEMPLATE_BINDINGS_V1",
        "name": "Configuración por plantilla y negocio",
        "objectType": "BINDING",
        "dependencyOrder": 7,
        "maxRows": 50000
      }
    ],
    "page": 1,
    "size": 50,
    "total": 12
  }
}

Errores

HTTPCódigoCuándo
403AUTHORIZATION_ERRORQuien llama no tiene CAT-L
GET /api/v2/catalog-imports/profiles/{p}/template · Plantilla de columnas de un perfil
CampoValor
APIAPI-01-030 · MS-01 Catálogo
Para quéDa las columnas de un perfil (obligatorias, valores permitidos y un ejemplo) y el CSV vacío para descargar, igual que los CSV que ya usa Gobierno de Producto.
En esta épicaLas columnas de un perfil y su CSV vacío
Quién la llamaBFF del portal, MS-15 IA y enriquecimiento
PermisoCAT-L
CabecerasAuthorization, X-Request-Id
Parámetrosp = TEMPLATE_BINDINGS_V1, format = json
También la usanFT-CAT-01

Request

null

Response · 200

{
  "success": true,
  "data": {
    "profile": "TEMPLATE_BINDINGS_V1",
    "format": "CSV",
    "encoding": "UTF-8",
    "separator": ",",
    "columns": [
      {
        "name": "TEMPLATE_ID",
        "required": true,
        "example": "EU4-0412"
      },
      {
        "name": "ATTRIBUTE_ID",
        "required": true,
        "example": "MATERIAL_VASO"
      },
      {
        "name": "BUSINESS",
        "required": true,
        "allowed": [
          "MER",
          "SUB",
          "MKP"
        ]
      },
      {
        "name": "LEVEL",
        "required": true,
        "allowed": [
          "REQUIRED",
          "RECOMMENDED",
          "OPTIONAL"
        ]
      },
      {
        "name": "LAYER",
        "required": false,
        "allowed": [
          "1",
          "2",
          "3",
          "4",
          "5"
        ]
      },
      {
        "name": "SECTION",
        "required": false,
        "example": "CARACTERISTICAS"
      },
      {
        "name": "VALUE_FILTER",
        "required": false,
        "example": "VID|PLA"
      }
    ],
    "downloadUrl": "/api/v2/catalog-imports/profiles/TEMPLATE_BINDINGS_V1/template?format=csv"
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDEl perfil no existe
POST /api/v2/catalog-imports · Subir una carga para validarla
CampoValor
APIAPI-01-031 · MS-01 Catálogo
Para quéRecibe un CSV por formulario, o los mismos renglones en JSON cuando llama una integración, y lo valida completo sin escribir nada, con las mismas reglas que la pantalla. Responde de inmediato y valida aparte; el resultado se consulta con el importId.
En esta épicaSubir y validar una carga sin escribir, por archivo o por API
Quién la llamaBFF del portal, MS-15 IA y enriquecimiento
PermisoCAT-E
CabecerasAuthorization, X-Request-Id, Idempotency-Key
Escribe enimport_jobs
También la usanFT-CAT-01, FT-CAT-03, FT-IA-04, FT-PLT-01, FT-RAC-07

Request

{
  "profile": "TEMPLATE_BINDINGS_V1",
  "channel": "IMPORT",
  "file": "configuracion-licuadoras.csv (multipart/form-data, campo file)",
  "rows": "sólo por API: los mismos renglones del CSV en JSON, sin archivo"
}

Response · 202

{
  "success": true,
  "data": {
    "importId": "imp-7c21",
    "status": "VALIDATING",
    "rows": 1240,
    "sha256": "9f2c41e0b7d3a8c5",
    "links": {
      "self": "/api/v2/catalog-imports/imp-7c21"
    }
  }
}

Errores

HTTPCódigoCuándo
400UNKNOWN_COLUMNEl archivo trae una columna ajena al perfil: se rechaza completo antes de leer filas
413LIMIT_EXCEEDEDEl archivo pasa el límite de renglones del perfil: se rechaza completo
409WRITE_DISABLEDP360 todavía es la fuente del catálogo (antes del corte de R1)
POST /api/v2/catalog-imports/{id}/apply · Aplicar una carga validada
CampoValor
APIAPI-01-032 · MS-01 Catálogo
Para quéConfirma una carga READY: abre una sola solicitud de cambio con su canal (IMPORT, API o IA) que se aprueba completa; al aprobarse, se aplica registro por registro, cada uno en su transacción con sus idiomas, y el recibo dice qué pasó con cada uno.
En esta épicaAplicar una carga lista: abre la solicitud
Quién la llamaBFF del portal, MS-15 IA y enriquecimiento
PermisoCAT-E; el mismo que subió la carga
CabecerasAuthorization, X-Request-Id, Idempotency-Key
Parámetrosid = imp-7c21
Escribe enimport_jobs, governance_receipts
También la usanFT-CAT-01, FT-CAT-03, FT-IA-04, FT-PLT-01, FT-RAC-07

Request

{
  "comment": "Niveles por negocio que entregó Mercaderías para cocina"
}

Response · 202

{
  "success": true,
  "data": {
    "requestId": "req-3e9a71",
    "status": "PENDING_APPROVAL",
    "changeRequestId": "chg-7f0a33",
    "receiptUrl": "/api/v2/catalog-receipts/req-3e9a71"
  }
}

Errores

HTTPCódigoCuándo
409NOT_EDITABLE_IN_STATUSLa carga no está READY: tiene errores, sigue validando o ya se aplicó
409PLAN_EXPIREDPasaron más de 24 horas desde la validación: se valida otra vez
409VERSION_CONFLICTAlgo que toca la carga cambió desde la validación
GET /api/v2/catalog-imports/{id} · Resultado de una carga
CampoValor
APIAPI-01-033 · MS-01 Catálogo
Para quéDa el avance y el resultado de una carga: READY con el resumen de altas, cambios e impacto en plantillas y productos, o VALIDATED_WITH_ERRORS con fila, columna, código y mensaje de cada error. Con format=csv entrega el reporte para corregir el archivo.
En esta épicaEl avance, el resumen y los errores de una carga
Quién la llamaBFF del portal, MS-15 IA y enriquecimiento
PermisoQuien subió la carga y los aprobadores del catálogo
CabecerasAuthorization, X-Request-Id
Parámetrosid = imp-5a02, view = errors, format = json
También la usanFT-CAT-01

Request

null

Response · 200

{
  "success": true,
  "data": {
    "importId": "imp-5a02",
    "profile": "LOOKUP_VALUES_V1",
    "status": "VALIDATED_WITH_ERRORS",
    "progress": 100,
    "stats": {
      "rows": 500,
      "valid": 498,
      "errors": 2
    },
    "summary": {
      "create": 412,
      "update": 86
    },
    "impact": {
      "templates": 37,
      "products": 5120,
      "views": 111
    },
    "errors": [
      {
        "row": 14,
        "column": "CODE",
        "code": "CONFLICTING_ROWS",
        "message": "El código 0712 se repite en la fila 233"
      },
      {
        "row": 233,
        "column": "CODE",
        "code": "CONFLICTING_ROWS",
        "message": "El código 0712 se repite en la fila 14"
      }
    ],
    "changeRequestId": null,
    "receiptUrl": null
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDLa carga no existe o no es visible para quien llama
GET /api/v2/catalog-imports · Cargas de configuración de un usuario
CampoValor
APIAPI-01-107 · MS-01 Catálogo
Para quéLista las cargas de configuración del catálogo de quien llama (o de su área), con perfil, estado, fechas y su solicitud de cambio. La usa el BFF para armar el centro de importaciones y exportaciones.
En esta épicaLas cargas de configuración de un usuario
Quién la llamaBFF del portal
PermisoCAT-L: ve las suyas y las de su área
CabecerasAuthorization, X-Request-Id
Parámetrosmine = True, status = APPLIED, profile = TEMPLATE_BINDINGS_V1, page = 1, size = 50

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "importId": "imp-7c21",
        "profile": "TEMPLATE_BINDINGS_V1",
        "channel": "IMPORT",
        "status": "APPLIED",
        "rows": 1240,
        "createdAt": "2027-01-15T15:00:00Z",
        "appliedAt": "2027-01-16T10:12:00Z",
        "changeRequestId": "chg-7f0a33"
      }
    ],
    "page": 1,
    "size": 50,
    "total": 1
  }
}

Errores

HTTPCódigoCuándo
400VALIDATION_ERRORUn filtro trae un estado o un perfil que no existe
GET /bff/v1/catalog/files · La pantalla del centro de importaciones y exportaciones del
CampoValor
APIAPI-BFF-108 · BFF del portal
Para quéLa pantalla del centro de importaciones y exportaciones del catálogo: junta en una sola lista las cargas de configuración del usuario (MS-01, API-01-107) y sus exportaciones de catálogo y estructura (MS-04, API-04-012), con su estado y el enlace a su resultado.
En esta épicaLa pantalla del centro de importaciones y exportaciones del catálogo

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "kind": "IMPORT",
        "id": "imp-7c21",
        "profile": "TEMPLATE_BINDINGS_V1",
        "status": "APPLIED",
        "createdAt": "2027-01-15T15:00:00Z",
        "link": "/api/v2/catalog-imports/imp-7c21"
      },
      {
        "kind": "EXPORT",
        "id": "job-40e8",
        "type": "CATALOG_FILTER",
        "status": "DONE",
        "createdAt": "2027-01-14T18:20:00Z",
        "link": "/api/v2/exports/job-40e8"
      }
    ],
    "page": 1,
    "size": 50,
    "total": 2
  }
}

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 (5)

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-103POST /api/v2/catalog-change-requests/{changeRequestId}/decisionAprobar la solicitud de la cargaFT-PLT-01 · Fundamentos de gobierno de plantillas
API-14-005POST /internal/notifications/messagesAvisar que terminó la validación de un archivo grandeFT-RAC-05 · Estatus del producto y motivos visibles para seller y…
API-04-012GET /api/v2/receipts?user=&from=&to=Las exportaciones del usuario, para el centro de archivosFT-RAC-07 · Reportes, exportes, importes y búsquedas por atributos
API-04-001POST /api/v2/exportsExportar la configuración vigente para editarla y volverla a subirFT-RAC-07 · Reportes, exportes, importes y búsquedas por atributos
API-02-113POST /internal/product/catalog-usageCuántos productos tienen las plantillas que toca la cargaFT-PLT-02 · Catálogo de atributos

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.governance.changed/TEMPLATE_VIEW_CHANGEDSe aplica una carga que cambia la configuración de plantillas por negocioFT-ACT-01, FT-ACT-05, FT-IA-03, FT-PLT-06, FT-PRD-01, FT-RAC-01, FT-RAC-02
catalog.governance.changed/TAXONOMY_NODE_CHANGEDSe aplica una carga que crea o mueve nodosFT-CAT-04, FT-IA-02, FT-PLT-05, FT-PLT-06
catalog.governance.changed/ATTRIBUTE_CHANGEDSe aplica una carga de atributosFT-ARQ-02, FT-PLT-02, FT-PLT-04, FT-PLT-06
catalog.governance.changed/LOV_VALUE_CHANGEDSe aplica una carga de valores de listaFT-ARQ-02, FT-PLT-03, FT-PLT-06, FT-RAC-07
catalog.governance.changed/TEMPLATE_CHANGEDSe aplica una carga de metadatos o configuración de plantillasFT-ARQ-02, FT-PLT-01, FT-PLT-08

Consume

EventoPara quéQuién lo publica
catalog.governance.changed/TEMPLATE_VIEW_CHANGEDMS-02 valida las propuestas con la configuración cargada, igual que si se hubiera editado en pantallaesta misma épica

7. Datos

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

ColecciónDueñoQué guardaEsta épica
import_jobsMS-01Cargas masivas de configuración del catálogo, con revisión previa y resultado por fila.escribe
governance_change_requestsMS-01Cada solicitud de cambio del catálogo: qué objetos toca, el antes y el después por campo, el canal (pantalla, carga, API, IA o migración), quién la pidió y quién la decidió, su estado (pendiente, aprobada, rechazada, aplicada, en conflicto o vencida) y su recibo.escribe
attributesMS-01Cada atributo: tipo, lista, restricciones, grupos e identificadores externos.escribe
attribute_groupsMS-01Grupos de atributos, incluidos los de permiso (quién ve y quién edita).escribe
lovsMS-01Cabecera de cada lista de valores.escribe
lov_valuesMS-01Cada valor de lista: código, etiqueta, orden y equivalencias por sistema.escribe
taxonomy_nodesMS-01Plantillas y nodos de grupo de artículo, con la configuración de atributos de cada plantilla.escribe
template_viewsMS-01La vista efectiva ya resuelta por plantilla y negocio: qué atributos pide y cuáles son obligatorios.escribe
id_sequencesMS-01El siguiente identificador de plantillas y catálogos.escribe
governance_receiptsMS-01El recibo de cada escritura confirmada en el catálogo (antes operation_receipts).escribe
governance_outboxMS-01Los cambios del catálogo que esperan salir como evento (antes outbox).escribe
import_jobsMS-01Cargas masivas de configuración del catálogo, con revisión previa y resultado por fila.lee
attributesMS-01Cada atributo: tipo, lista, restricciones, grupos e identificadores externos.lee
lovsMS-01Cabecera de cada lista de valores.lee
lov_valuesMS-01Cada valor de lista: código, etiqueta, orden y equivalencias por sistema.lee
taxonomy_nodesMS-01Plantillas y nodos de grupo de artículo, con la configuración de atributos de cada plantilla.lee
taxonomiesMS-01Los árboles: plantillas, grupos de artículo y sitios web.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-PLT-09·H1 · Validar antes de aplicarP1pasos 3, 4, 5, 6, 8; flujo «Archivo con errores»; API-01-031, API-01-033
FT-PLT-09·H2 · Aplicar con aprobaciónP1pasos 9, 10, 11; API-01-032, API-01-103
FT-PLT-09·H3 · Configuración por negocio en loteP1pasos 1, 2, 3, 4, 8, 12; API-01-030, API-01-031
FT-PLT-09·H4 · Inicializar un ambienteP2flujo «Inicializar un ambiente vacío»; API-01-029, API-01-031
FT-PLT-09·H5 · Validación por APIP2flujo «Validación por API y centro de archivos»; API-01-031, API-01-033
FT-PLT-09·H6 · Centro de importaciones y exportacionesP2flujo «Validación por API y centro de archivos»; API-BFF-108, API-01-107, API-04-012, API-04-001

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-09-1. Se valida todo antes de tocar la base, con las mismas reglas que la pantalla: una columna ajena rechaza el archivo antes de leer filas y un solo error deja la carga en VALIDATED_WITH_ERRORS, con fila, columna, código y mensaje, sin aplicar nada. Por qué: La ERF pide validación previa por fila y celda, y la plantilla masiva de hoy tenía un «Validar» que no validaba. Se apoya en DEC-ARQ-12, DEC-PLT-05.
  • D-PLT-09-2. Aplicar una carga lista abre una sola solicitud de cambio con su canal (IMPORT, API o IA), que se aprueba completa. Al aprobarse, se aplica registro por registro, cada uno en su transacción con sus idiomas, y el recibo dice qué pasó con cada uno. Por qué: Mismo control que la pantalla sin pedirle al aprobador miles de decisiones, y sin que un registro malo deshaga todo el archivo. Se apoya en DEC-PLT-05, DEC-ARQ-12.
  • D-PLT-09-3. Formatos: CSV en UTF-8 con los perfiles y columnas de hoy, y la API con los mismos renglones en JSON y el mismo reporte. Excel queda fuera del primer corte. Por qué: Excel reformatea identificadores y códigos (notación científica, ceros a la izquierda); el CSV del perfil se abre en Excel de todos modos. Se apoya en DUD-02.
  • D-PLT-09-4. Toda validación corre aparte: subir responde de inmediato con el identificador de la carga, el avance se consulta y MS-14 avisa al terminar. Una carga lista vale 24 horas. Por qué: Lo que tarda es asíncrono con recibo; la meta de tiempo no tiene fuente y la fija el plan. Se apoya en ADR-12.
  • D-PLT-09-5. Un paquete de varios perfiles se procesa en orden de dependencia (listas, valores, atributos, grupos, nodos, metadatos y configuración) y los nodos sin ID reciben el siguiente EU{nivel+1}-{número}. Reemplaza los programas de un solo uso y el copiado de diccionarios entre ambientes con credenciales en claro. Por qué: Preparar un ambiente vacío sin programas sueltos y sin credenciales en archivos. Se apoya en RSG-40, PD-16.
  • D-PLT-09-6. La IA que crea plantillas usa la misma API de carga con canal IA y pasa por la misma aprobación; ya no escribe directo como hoy. Por qué: Hoy la IA de plantillas escribe nodos, atributos y configuración sin validación previa; así queda con el mismo control que todos. Se apoya en P-19, DEC-PLT-05.
  • D-PLT-09-7. El centro de importaciones y exportaciones es una pantalla del BFF que junta las cargas de MS-01 y las exportaciones de MS-04 (PEDIDA-PLT-09-1); ni MS-01 ni MS-04 componen la lista del otro. Por qué: Decisión 19 del backend compartido que adopta ADR-12: lo que junta datos de varios módulos para una pantalla va al BFF. Se apoya en ADR-12.

Qué falta decidir

IDQué falta
DUD-02Gobierno de Producto fija los campos mínimos de cada perfil de carga que pide la ERF del 24-sep.
PD-12Arquitectura con Gobierno de Datos confirma el orden de corte: hasta R1 la carga sólo valida (P360 es la fuente).
PD-16Ratificar que un ID existente de otro objeto es error y nunca se modifica.

También siguen abiertos: RSG-40, Confirmar el retiro del script que copia diccionarios entre ambientes con credenciales en claro.

Fuentes

  1. [D] trazabilidad/features/FT-PLT-09-carga-masiva-configuracion-plantillas.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.