← Arquitectura por épica

FT-FLU-06 · Plantilla en línea para carga y enriquecimiento masivo

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-FLU-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-FLU-06.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-FLU-06-plantilla-en-linea-carga-masiva.md.

En 30 segundos

Para no depender de Excel, el seller puede capturar o pegar columnas en una plantilla en línea dentro del portal. Cada celda le avisa al momento si falta un obligatorio, si el valor no está en la lista o si no corresponde al campo del que depende; lo demás se valida en segundo plano. No es otro flujo: lo capturado entra a la misma carga masiva, con el mismo reporte y la misma creación.

  • Módulo dueño: MS-02 Producto. También participan: MS-01 Catálogo, MS-06 Evaluación.
  • Etapa 0 · Entrada. Recibe «PE-C · Catálogo vigente», «PE-T · Usuario con permisos y bitácora» y entrega «PE-1 · Propuesta en Borrador».
  • APIs: construye 1 y usa 10 que construyen otras épicas.
  • Eventos: publica 2 y consume 1.

1. Dónde encaja

Recibe

DeQué
FT-FLU-04 · Carga masiva de productos por archivoLa recepción asíncrona, el trabajo de carga, la evaluación por bloque y el reporte por renglón.
PE-C · Catálogo vigenteLa vista efectiva con sus capas de obligatoriedad, las listas de valores y las dependencias de un nivel entre atributos.
PE-T · Usuario con permisos y bitácoraEl seller identificado por el BFF, con sus negocios.

Entrega

AQué
PE-1 · Propuesta en BorradorCada renglón válido de la plantilla en línea nace como propuesta en Borrador con origen BULK, igual que si viniera de un archivo; los completos se envían a revisión en la misma confirmación.

Cambios de estado que hace

TransiciónDe → aCuándo
T01Inicio → BorradorEl proveedor o seller guarda por primera vez (pantalla, archivo, plantilla en línea o API).
T03Borrador → En revisiónEnvía con los obligatorios completos.

Tareas que abre o cierra: Validación automática.

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

Plantilla en línea
Valores de una lista en la captura

Vista efectiva de una plantilla por n…
Valores de una lista

Buscar productos
Subir una carga masiva de producto
y 4 más

Evaluar los renglones de una carga ma…

PRODUCT_CREATED

Ofrece sólo los tonos válidos para es…
Oculta el campo hijo si su padre no a…

Seller

Entrada Única · Vendor Center

BFF del portal

★ MS-02 Producto

MS-01 Catálogo

MS-06 Evaluación

Base pim

Eventos

Contexto de FT-FLU-06

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-06 EvaluaciónMS-02 ProductoMS-01 CatálogoEntrada Única · Vendor CenterEventosBase·pimMS-06 EvaluaciónMS-02 ProductoMS-01 CatálogoEntrada Única · Vendor CenterSellerBFF1. Elige la categoría y abre la plantilla en línea2. Pide la cuadrícula con columnas, listas y prellenadoGET /bff/v1/bulk-loads/online-template3. Lee la vista efectiva con capas y dependenciasGET /api/v2/taxonomies/PRODUCT/nodes/{id}/effective4. Lee las listas de valores cortasGET /api/v2/lovs/{id}/values5. Trae los productos a prellenar por SKU o EANPOST /api/v2/products/search6. Pega columnas completas desde su Excel7. Busca por texto en listas grandes, como marcasGET /bff/v1/catalog/capture-form/values8. Guarda los renglones como carga sin crear nadaPOST /api/v2/product-imports9. Evalúa lista negra y coincidencias de los renglonesPOST /api/v2/evaluations/batches10. Lee el resultado por celda y por renglónGET /api/v2/product-imports/{id}11. Corrige las celdas con aviso y envía12. Confirma los renglones válidosPOST /api/v2/product-imports/{id}/apply13. Crea las propuestas en Borrador y envía las completas14. Avisa cada propuesta nueva con origen BULKPRODUCT_CREATEDSellerBFF
Flujo principal de FT-FLU-06
Los pasos en texto
PasoDeAQué haceAPI o evento
1SellerEntrada Única · Vendor CenterElige la categoría y abre la plantilla en línea—
2Entrada Única · Vendor CenterBFF del portalPide la cuadrícula con columnas, listas y prellenadoAPI-BFF-204
3BFF del portalMS-01 CatálogoLee la vista efectiva con capas y dependenciasAPI-01-028
4BFF del portalMS-01 CatálogoLee las listas de valores cortasAPI-01-007
5BFF del portalMS-02 ProductoTrae los productos a prellenar por SKU o EANAPI-02-001
6SellerEntrada Única · Vendor CenterPega columnas completas desde su Excel—
7Entrada Única · Vendor CenterBFF del portalBusca por texto en listas grandes, como marcasAPI-BFF-102
8Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Guarda los renglones como carga sin crear nadaAPI-02-046
9MS-02 ProductoMS-06 EvaluaciónEvalúa lista negra y coincidencias de los renglonesAPI-06-002
10Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Lee el resultado por celda y por renglónAPI-02-048
11SellerEntrada Única · Vendor CenterCorrige las celdas con aviso y envía—
12Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Confirma los renglones válidosAPI-02-047
13MS-02 ProductoBase pimCrea las propuestas en Borrador y envía las completas—
14MS-02 ProductoEventosAvisa cada propuesta nueva con origen BULKcatalog.product.changed/PRODUCT_CREATED

3.1 Más de 500 renglones: sigue en Excel

MS-02 ProductoEntrada Única · Vendor CenterMS-02 ProductoEntrada Única · Vendor CenterSellerBFF1. Pega 12,000 renglones en la cuadrícula2. Intenta guardar más de 500 renglonesPOST /api/v2/product-imports3. Baja la plantilla de Excel de la misma categoríaGET /api/v2/product-imports/profiles/{p}/template4. Sube el Excel completo a la carga masivaPOST /api/v2/product-importsSellerBFF
Más de 500 renglones: sigue en Excel

3.2 Campo que depende de otro

Entrada Única · Vendor CenterEntrada Única · Vendor CenterSellerBFF1. Elige el color de una variante2. Ofrece sólo los tonos válidos para ese color3. Oculta el campo hijo si su padre no aplica4. Busca la marca por texto, sin el límite de ExcelGET /bff/v1/catalog/capture-form/valuesSellerBFF
Campo que depende de otro

3.3 Retoma lo que guardó sin enviar

MS-02 ProductoEntrada Única · Vendor CenterMS-02 ProductoEntrada Única · Vendor CenterSellerBFF1. Vuelve otro día a su plantilla en línea2. Lista sus cargas guardadas sin aplicarGET /api/v2/product-imports3. Recupera renglones y avisos de esa cargaGET /api/v2/product-imports/{id}SellerBFF
Retoma lo que guardó sin enviar

4. Si algo sale mal

  • Pega un valor que no está en la lista. La celda se marca al momento con el aviso; si se envía así, la validación de MS-02 lo regresa como «por corregir» con la columna y el motivo, y ese renglón no se crea.
  • Intenta guardar más de 500 renglones. MS-02 rechaza el envío completo por el límite (413 LIMIT_EXCEEDED) y el portal le ofrece bajar la plantilla de Excel para seguir fuera de línea.
  • Se corta la sesión antes de enviar. Lo guardado como carga sin aplicar sigue en MS-02 y se retoma desde «Mis cargas»; lo que no se guardó se pierde, porque el portal no guarda datos del catálogo.
  • La plantilla cambia mientras captura. Los renglones a los que les falta algo de la versión vigente salen con TEMPLATE_VERSION_OUTDATED y el portal recarga la cuadrícula con la versión nueva.

5. APIs

Las que construye esta épica (1)

GET /bff/v1/bulk-loads/online-template · Plantilla en línea
CampoValor
APIAPI-BFF-204 · BFF del portal
Para quéJunta la cuadrícula de la plantilla en línea para una plantilla y un negocio: las columnas salen del mismo formulario de captura de API-BFF-101 (capa de obligatoriedad, tipo, listas cortas y dependencias de un nivel, de MS-01) y se les suman los renglones prellenados si se pidieron por SKU o EAN (MS-02). Las listas grandes, como marcas, se buscan aparte con API-BFF-102.
En esta épicaLa cuadrícula: columnas con su capa, listas cortas, dependencias y prellenado
Quién la llamaEntrada Única · Vendor Center (por el BFF)
PermisoLa pantalla de plantilla en línea en el menú del perfil (BFF); al prellenar, sólo productos del proveedor o seller
CabecerasAuthorization, X-Request-Id
ParámetrostemplateId = EU4-0412, business = MKP, prefillSkus = 1000004812,1000004813

Request

null

Response · 200

{
  "success": true,
  "data": {
    "templateId": "EU4-0412",
    "version": 7,
    "business": "MKP",
    "maxRows": 500,
    "columns": [
      {
        "code": "MARCA",
        "level": "REQUIRED",
        "type": "LIST",
        "list": "MARCA",
        "search": true
      },
      {
        "code": "COLOR",
        "level": "REQUIRED",
        "type": "LIST",
        "list": "COLOR"
      },
      {
        "code": "TONO",
        "level": "OPTIONAL",
        "type": "LIST",
        "list": "TONO",
        "dependsOn": "COLOR"
      },
      {
        "code": "CAPACIDAD",
        "level": "REQUIRED",
        "type": "NUMBER",
        "unit": "MAH"
      },
      {
        "code": "MATERIAL",
        "level": "RECOMMENDED",
        "type": "LIST",
        "list": "MATERIAL"
      }
    ],
    "lists": {
      "COLOR": [
        {
          "code": "NEGRO",
          "label": "Negro"
        },
        {
          "code": "ROJO",
          "label": "Rojo"
        }
      ],
      "TONO": {
        "byParent": {
          "ROJO": [
            {
              "code": "ROJO_VINO",
              "label": "Rojo vino"
            }
          ]
        }
      },
      "MATERIAL": [
        {
          "code": "PLASTICO",
          "label": "Plástico"
        }
      ]
    },
    "rows": [
      {
        "productId": "PRD-0004812",
        "sku": "1000004812",
        "cells": {
          "MARCA": "MARCA01",
          "COLOR": "ROJO",
          "CAPACIDAD": 10000
        }
      }
    ],
    "prefillNote": null
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDLa plantilla no existe o no es una hoja
422VALIDATION_ERRORMás de 500 productos para prellenar: se ofrece el Excel
403AUTHORIZATION_ERROREl perfil no tiene la pantalla o el negocio no es suyo

Las que usa y construye otra épica (10)

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-028GET /api/v2/taxonomies/PRODUCT/nodes/{id}/effectiveVista efectiva con capas y dependencias de un nivelFT-PLT-06 · Configuración de atributos por plantilla y por negocio…
API-01-007GET /api/v2/lovs/{id}/valuesListas de valores cortas para la cuadrículaFT-PLT-03 · Listas de valores y modelo canónico con equivalencias por…
API-02-001POST /api/v2/products/searchProductos a prellenar por SKU o EANFT-PRD-01 · Modelo canónico de producto
API-02-046POST /api/v2/product-importsMandar los renglones a la misma carga masiva (source ROWS, hasta 500)FT-FLU-04 · Carga masiva de productos por archivo
API-06-002POST /api/v2/evaluations/batchesEvaluar los renglones por bloqueFT-FLU-05 · Reglas de negocio en la carga masiva
API-02-048GET /api/v2/product-imports/{id}Resultado por celda y por renglónFT-FLU-04 · Carga masiva de productos por archivo
API-02-047POST /api/v2/product-imports/{id}/applyCrear los renglones válidosFT-FLU-04 · Carga masiva de productos por archivo
API-02-045GET /api/v2/product-imports/profiles/{p}/templateBajar el Excel cuando la cuadrícula no alcanzaFT-FLU-04 · Carga masiva de productos por archivo
API-02-204GET /api/v2/product-importsRetomar una carga guardada sin aplicarFT-FLU-04 · Carga masiva de productos por archivo
API-BFF-102GET /bff/v1/catalog/capture-form/valuesValores de un atributo con búsqueda, páginas y dependencia del padreFT-PLT-10 · Fachada v1 compatible con P360 para Entrada Única y Foro

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.product.changed/PRODUCT_CREATEDSe crea cada renglón válido de la plantilla en líneaFT-ARQ-01
catalog.product.changed/STATUS_CHANGEDUn renglón completo se envía a revisiónFT-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

Consume

EventoPara quéQuién lo publica
catalog.validation.result/EVALUATION_DONEMS-02 completa el resultado por renglón cuando MS-06 terminó de evaluarFT-FLU-03, FT-FLU-05, FT-REF-03

7. Datos

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

ColecciónDueñoQué guardaEsta épica
product_jobsMS-02Trabajos asíncronos: cargas masivas de productos, edición masiva y publicación.escribe
productsMS-02La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos.escribe
identifier_registryMS-02Unicidad de SKU y de EAN por negocio.escribe
tasksMS-02Todo el trabajo asignado: visto bueno, corrección, Gobierno de Datos, foto, secciones, QA, revisión del cambio y repoblamiento.escribe
product_receiptsMS-02El recibo de cada escritura confirmada en el producto (antes operation_receipts).escribe
product_outboxMS-02Los cambios del producto que esperan salir como evento (antes outbox).escribe
template_viewsMS-01La vista efectiva ya resuelta por plantilla y negocio: qué atributos pide y cuáles son obligatorios.lee
lov_valuesMS-01Cada valor de lista: código, etiqueta, orden y equivalencias por sistema.lee
governance_rulesMS-01Reglas de captura y clasificación: marcas por plantilla, grupo de artículo a plantilla, alcance del proveedor y lista negra de Marketplace.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-FLU-06·H1 · Capturar en línea sin descargarP1pasos 1, 2, 3, 4, 5; API-BFF-204
FT-FLU-06·H2 · Pegar columnas desde ExcelP1pasos 6, 8, 9, 10, 11; API-02-046, API-02-048
FT-FLU-06·H3 · Campos dependientes en vivoP2flujo «Campo que depende de otro»; API-BFF-102
FT-FLU-06·H4 · Excel para volúmenes grandesP3pasos 12, 13; flujo «Más de 500 renglones: sigue en Excel»

9. Decisiones de esta épica

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

  • D-FLU-06-1. La plantilla en línea es otra forma de llenar la misma carga masiva: lo capturado se manda a MS-02 como renglones (API-02-046 con source ROWS, origen BULK y canal ONLINE_TEMPLATE), con la misma validación asíncrona, la misma evaluación de MS-06 y el mismo reporte; el SKU se crea con la misma lógica que si viniera de Excel. Por qué: Cumple H4 (misma creación por Excel o en línea) y no agrega un segundo motor de validación que mantener. Se apoya en DEC-55, DEC-54, RN-MAS-02, RN-ALT-12.
  • D-FLU-06-2. En vivo sólo los avisos que salen de los datos de MS-01: obligatorio vacío, valor fuera de lista y dependencia de un nivel entre atributos, que la cuadrícula toma de la vista efectiva compuesta por el BFF. Todo lo demás (tipos, reglas de calidad, lista negra, coincidencias) corre en segundo plano al guardar o al enviar. Por qué: Es lo que pide RF-MAS-11 y evita que la regla viva en el navegador: la lista y la dependencia vienen del dueño del catálogo, y la validación que decide es la de MS-02. Se apoya en RF-MAS-11, RN-GEN-04, RF-CAL-03.
  • D-FLU-06-3. Guardar sin enviar es una carga con applyWhenValidated = false: los renglones y sus resultados quedan en MS-02 y se retoman desde «Mis cargas». El portal no guarda nada. Por qué: Los fronts no guardan datos del catálogo y así no hace falta otro almacén de borradores para la cuadrícula. Se apoya en ADR-12.
  • D-FLU-06-4. Límite de arranque: 500 renglones por envío; para más, Excel. Las listas grandes, como marcas, se buscan por texto contra MS-01 con paginación y nunca se bajan completas. Por qué: Un seller con 12,000 registros sigue con Excel (H4); el valor exacto lo fija la evaluación técnica con la prueba de intermitencia. Se apoya en PEN-58, PEN-91, S10-RF-25.
  • D-FLU-06-5. Se construye después del Excel (ola 3) y sólo si la evaluación técnica la aprueba; no bloquea R2 ni agrega nada al núcleo: es una ruta del BFF sobre la carga de FT-FLU-04. Por qué: La propuesta formal está acordada pero su factibilidad no; así su costo queda en la pantalla y en una composición del BFF. Se apoya en DEC-55, PEN-90.

Qué falta decidir

Nada propio de esta épica: lo que sigue abierto está en las decisiones del programa.

También siguen abiertos: PEN-90, Elaborar la propuesta formal de la plantilla en línea; el corpus no le da responsable; PEN-91, El equipo técnico evalúa capacidad e intermitencia de la cuadrícula con la carga esperada; PEN-58, Fijar el límite de renglones de la versión en línea (aquí arranca en 500).

Fuentes

  1. [D] trazabilidad/features/FT-FLU-06-plantilla-en-linea-carga-masiva.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.