Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-FLU-05: 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-05.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-FLU-05-reglas-por-renglon-carga-masiva.md.
En 30 segundos
Un seller puede subir cientos o miles de productos en un archivo. Esta épica aplica a cada renglón las mismas reglas del alta individual (lista negra, coincidencia por EAN con la marca y decisión por negocio), sin imagen, URL ni IA para no frenar la carga, y deja en el reporte la acción de cada renglón: crear, crear multioferta o no se puede. Después de crear los productos, cada uno recibe su calificación con sugerencias para mejorarla.
- Módulo dueño: MS-06 Evaluación. También participan: MS-01 Catálogo, MS-02 Producto.
- Etapa 0 · Entrada. Recibe de otras épicas y entrega «PE-1 · Propuesta en Borrador», «PE-2 · Sin duplicado».
- APIs: construye 3 y usa 9 que construyen otras épicas.
- Eventos: publica 2 y consume 1.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| FT-FLU-04 · Carga masiva de productos por archivo | Los renglones ya revisados en estructura, tipos y listas, en bloques de hasta 500 con su rowRef, su negocio, su plantilla y su dueño. |
| FT-REF-02 · Blacklist de Marketplace por marca, negocio y grupo de… | La lista negra vigente, la misma del alta individual. |
| FT-REF-03 · Servicio de matching | La búsqueda de coincidencias por EAN con la marca como campo de peso, con los mismos pesos y bandas. |
| FT-FLU-03 · Decisión por negocio ante coincidencia | La tabla de decisión por negocio y el texto de cada acción para el reporte. |
| FT-CAT-03 · Categorización de productos | El cálculo de la categoría de cada renglón por el mapeo de su plantilla, que es una de las cuatro reglas. |
Entrega
| A | Qué |
|---|---|
| FT-FLU-04 · Carga masiva de productos por archivo | La acción y el texto de cada renglón para el reporte: crear, crear multioferta porque existe en Marketplace o en Liverpool, EAN duplicado o no se puede catalogar. |
| PE-1 · Propuesta en Borrador | Los renglones que siguen, creados en Borrador con origen BULK y su evaluación guardada. |
| PE-2 · Sin duplicado | Esos mismos renglones ya sin duplicado: su evaluación dice CONTINUE. |
| FT-INT-05 · Multioferta y stock out | Los renglones que ya existen, con su acción (multioferta o stock out) y el SKU sobre el que puede ofertar el seller. |
| FT-PRD-10 · Catalogación por API del proveedor o seller | Las mismas reglas por renglón para los lotes que llegan por la API de terceros. |
| FT-IA-05 · Enriquecimiento continuo después de crear el SKU y después… | Los productos creados sin IA, que se enriquecen después de tener SKU. |
Cambios de estado que hace
| Transición | De → a | Cuándo |
|---|---|---|
| T01 | Inicio → Borrador | El proveedor o seller guarda por primera vez (pantalla, archivo, plantilla en línea o API). |
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 | Seller | Entrada Única · Vendor Center | Sube su archivo de carga masiva | — |
| 2 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Sube el archivo para revisarlo sin escribir | API-02-046 |
| 3 | MS-02 Producto | MS-06 Evaluación | Manda los renglones en bloques de 500 | API-06-002 |
| 4 | MS-06 Evaluación | MS-01 Catálogo | Consulta la lista negra vigente | API-01-016 |
| 5 | MS-06 Evaluación | MS-02 Producto | Pide candidatos por EAN de cada renglón | API-02-123 |
| 6 | MS-06 Evaluación | Base pim | Aplica la tabla y guarda la acción por renglón | — |
| 7 | MS-06 Evaluación | Eventos | Avisa que terminó el bloque | catalog.validation.result/EVALUATION_DONE |
| 8 | Eventos | MS-02 Producto | Entrega el aviso del bloque | catalog.validation.result/EVALUATION_DONE |
| 9 | MS-02 Producto | MS-06 Evaluación | Lee la acción de cada renglón | API-06-003 |
| 10 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Muestra el reporte con la acción por renglón | API-02-205 |
| 11 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Confirma la carga | API-02-047 |
| 12 | MS-02 Producto | Base pim | Crea en Borrador sólo los renglones que siguen | — |
| 13 | MS-02 Producto | Eventos | Avisa las propuestas nuevas | catalog.product.changed/PRODUCT_CREATED |
3.1 Renglones que ya existen o están vetados
3.2 Proveedor de Mercaderías: EAN duplicado
3.3 Calificación después de la carga
4. Si algo sale mal
- Un renglón coincide sólo con Suburbia. Sale «no se puede catalogar» con la explicación de la tabla de decisión; cuando se decida la regla de Suburbia se cambia la fila sin tocar código.
- MS-06 no termina un bloque. MS-02 lo reintenta con la misma llave de idempotencia: lo ya evaluado no se repite. El reporte muestra esos renglones «en revisión» y el resto sigue.
- Cambió la lista negra entre la revisión y la confirmación. Al confirmar, MS-02 vuelve a evaluar sólo los renglones de evaluaciones vencidas o hechas con otra versión de reglas; un renglón que quedó vetado no se crea y el reporte lo dice.
- El archivo trae 20,000 renglones. Son 40 bloques que MS-06 atiende en paralelo con tope; el reporte se llena por bloque y el seller ve el avance.
5. APIs
Las que construye esta épica (3)
POST /api/v2/evaluations/batches · Evaluar los renglones de una carga masiva
| Campo | Valor |
|---|---|
| API | API-06-002 · MS-06 Evaluación |
| Para qué | Evalúa un bloque de hasta 500 renglones de una carga masiva con las mismas reglas del alta individual: lista negra, coincidencia por EAN con la marca como campo de peso y decisión por negocio, sin imagen, URL ni IA. Cada renglón se identifica por su rowRef, nunca por su posición. Responde 202 y avisa con EVALUATION_DONE cuando termina el bloque. |
| En esta épica | Evaluar un bloque de hasta 500 renglones con las reglas del alta individual |
| Quién la llama | MS-02 Producto |
| Permiso | Sólo MS-02 (cuenta de servicio) |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | validation_results |
| Publica | catalog.validation.result/EVALUATION_DONE |
| También la usan | FT-FLU-04, FT-FLU-06, FT-PRD-10, FT-REF-02, FT-REF-03 |
Request
{
"importId": "imp-0000042",
"chunk": 1,
"business": "MKP",
"owner": {
"type": "SELLER",
"id": "SELLER-0001"
},
"templateId": "EU4-0412",
"rows": [
{
"rowRef": "SEL-001-PB20",
"brandCode": "MARCA01",
"model": "PB-20",
"ean": "7501234567893",
"productType": "BATERIA_EXTERNA"
},
{
"rowRef": "SEL-001-PB10",
"brandCode": "MARCA01",
"model": "PB-10",
"ean": "7501234500012",
"productType": "BATERIA_EXTERNA"
},
{
"rowRef": "SEL-001-AUD7",
"brandCode": "MARCA09",
"model": "AUD-7",
"ean": "7501234500029",
"productType": "AUDIFONOS"
}
]
}
Response · 202
{
"success": true,
"data": {
"batchId": "evb-0000318",
"status": "ACCEPTED",
"rows": 3,
"links": {
"self": "/api/v2/evaluations/batches/evb-0000318"
}
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 422 | VALIDATION_ERROR | Más de 500 renglones, o un renglón sin rowRef o con rowRef repetido |
| 409 | IDEMPOTENCY_MISMATCH | El mismo bloque llega otra vez con contenido distinto |
| 503 | DEPENDENCY_UNAVAILABLE | No hay lista negra vigente ni en caché; el bloque queda en espera y MS-02 reintenta |
GET /api/v2/evaluations/batches/{batchId} · Resultado de una evaluación masiva
| Campo | Valor |
|---|---|
| API | API-06-003 · MS-06 Evaluación |
| Para qué | Devuelve, renglón por renglón, la acción que corresponde (crear, crear multioferta, stock out, no se puede catalogar, revisar) con el texto que verá el seller en el reporte. |
| En esta épica | Leer la acción y el texto de cada renglón |
| Quién la llama | MS-02 Producto, Entrada Única · Vendor Center (por el BFF) |
| Permiso | MS-02, y el seller o proveedor dueño de la carga |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | batchId = evb-0000318, page = 1, size = 500 |
| También la usan | FT-FLU-03, FT-FLU-04, FT-REF-02, FT-REF-03 |
Request
null
Response · 200
{
"success": true,
"data": {
"batchId": "evb-0000318",
"importId": "imp-0000042",
"status": "DONE",
"finishedAt": "2026-10-18T16:05:40Z",
"summary": {
"CONTINUE": 1,
"MULTI_OFFER": 1,
"BLOCK": 1
},
"items": [
{
"rowRef": "SEL-001-PB20",
"evaluationId": "evl-0000901",
"action": "MULTI_OFFER",
"reasonCode": "EXISTS_IN_MKP",
"message": "Crear multioferta porque existe en Marketplace",
"targetSku": "1000004812",
"confidence": 1.0
},
{
"rowRef": "SEL-001-PB10",
"evaluationId": "evl-0000902",
"action": "CONTINUE",
"reasonCode": "NO_MATCH",
"message": "Producto nuevo: se crea la propuesta",
"targetSku": null,
"confidence": 0.41
},
{
"rowRef": "SEL-001-AUD7",
"evaluationId": "evl-0000903",
"action": "BLOCK",
"reasonCode": "BRAND_BLOCKED",
"message": "No se puede catalogar: la marca es de productos que comercializa Liverpool (1P o Mercaderías)",
"targetSku": null,
"confidence": null
}
],
"page": 1,
"size": 500,
"total": 3
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El bloque no existe o no es de quien llama |
| 409 | NOT_EDITABLE_IN_STATUS | El bloque sigue en proceso: todavía no hay resultado |
POST /internal/product/match-candidates · La misma ruta interna que pide FT-REF-03: candidatos por EAN
| Campo | Valor |
|---|---|
| API | API-02-123 · MS-02 Producto |
| Para qué | La misma ruta interna que pide FT-REF-03: candidatos por EAN exacto y por marca y modelo normalizados, para varias consultas a la vez (hasta 500 por llamada en la carga masiva). |
| En esta épica | Pedir a MS-02 candidatos por EAN de cada renglón |
| También la usan | FT-REF-03 |
Request
{
"businesses": [
"MER",
"MKP",
"SUB"
],
"maxPerQuery": 5,
"statuses": [
"EN_REVISION",
"CREACION_SKU",
"EN_ENRIQUECIMIENTO",
"APROBADO",
"EN_MODIFICACION"
],
"queries": [
{
"ref": "SEL-001-PB20",
"ean": "7501234567893",
"brandCode": "MARCA01"
},
{
"ref": "SEL-001-PB10",
"ean": "7501234500012",
"brandCode": "MARCA01"
}
]
}
Response · 200
{
"success": true,
"data": {
"items": [
{
"ref": "SEL-001-PB20",
"candidates": [
{
"productId": "PRD-0004812",
"business": "MKP",
"owner": {
"type": "SELLER",
"id": "SELLER-0004"
},
"status": "APROBADO",
"sku": "1000004812",
"lifecycle": "ACTIVO",
"matchedOn": [
"EAN",
"MARCA"
]
}
]
},
{
"ref": "SEL-001-PB10",
"candidates": []
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | Quien llama no tiene el permiso o no es el módulo autorizado |
| 422 | VALIDATION_ERROR | Falta un dato o viene con un formato inválido; el detalle dice qué campo |
| 409 | IDEMPOTENCY_MISMATCH | Se repite la llave de idempotencia con otro cuerpo |
Las que usa y construye otra épica (9)
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-06-006 | POST /api/v2/scores | Calificar en lote los productos creados | FT-RAC-02 · Score de calidad del producto |
| API-06-004 | GET /api/v2/evaluations/{evaluationId} | Ver qué le falta a un producto para subir su calificación | FT-FLU-03 · Decisión por negocio ante coincidencia |
| API-01-016 | GET /api/v2/rules?type= | Leer la lista negra vigente | FT-PLT-07 · Reglas de atributos |
| API-01-028 | GET /api/v2/taxonomies/PRODUCT/nodes/{id}/effective | Leer los niveles de cada atributo para la calificación | FT-PLT-06 · Configuración de atributos por plantilla y por negocio… |
| API-02-046 | POST /api/v2/product-imports | Subir y revisar el archivo sin escribir | FT-FLU-04 · Carga masiva de productos por archivo |
| API-02-047 | POST /api/v2/product-imports/{id}/apply | Confirmar la carga y crear los renglones que siguen | FT-FLU-04 · Carga masiva de productos por archivo |
| API-02-205 | GET /api/v2/product-imports/{id}/report | Mostrar el reporte por renglón | FT-FLU-04 · Carga masiva de productos por archivo |
| API-02-054 | GET /internal/product/products/{id}/publication-snapshot?version= | Leer cada producto creado para calificarlo | FT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio |
| API-02-404 | GET /api/v2/offer-targets/{sku} | Llevar al seller a ofertar sobre el SKU de un renglón que ya existe | FT-INT-05 · Multioferta y stock out |
6. Eventos
Publica
| Evento | Cuándo | Quién lo consume |
|---|---|---|
catalog.validation.result/EVALUATION_DONE | Termina un bloque de renglones o un lote de calificaciones | FT-FLU-02, FT-FLU-03, FT-FLU-04, FT-FLU-06, FT-PRD-10, FT-RAC-06, FT-REF-03 |
catalog.product.changed/PRODUCT_CREATED | MS-02 crea las propuestas de los renglones que siguen | FT-ARQ-01 |
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
catalog.validation.result/EVALUATION_DONE | MS-02 lee la acción de cada renglón para el reporte, o guarda las calificaciones de los productos creados | 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 |
|---|---|---|---|
validation_results | MS-06 | El resultado de cada evaluación: lista negra, coincidencias con su confianza y score. | escribe |
governance_rules | MS-01 | Reglas de captura y clasificación: marcas por plantilla, grupo de artículo a plantilla, alcance del proveedor y lista negra de Marketplace. | lee |
validation_thresholds | MS-06 | Los umbrales de coincidencia y de calificación por negocio. | lee |
identifier_registry | MS-02 | Unicidad de SKU y de EAN por negocio. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-FLU-05·H1 · Mismas reglas en ambos canales | P1 | pasos 3, 4, 5, 6, 9, 10; flujo «Renglones que ya existen o están vetados»; API-06-002, API-06-003 |
| FT-FLU-05·H2 · Acción por renglón cuando el producto existe | P1 | flujo «Renglones que ya existen o están vetados»; API-06-003, API-02-404 |
| FT-FLU-05·H3 · Cuatro reglas, sin IA | P1 | pasos 3, 5, 6; API-06-002 |
| FT-FLU-05·H4 · Score después de la carga | P2 | flujo «Calificación después de la carga»; API-06-006, API-06-004 |
| FT-FLU-05·H5 · Reglas de datos para Mercaderías | P3 | flujo «Proveedor de Mercaderías: EAN duplicado» |
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-05-1. Cada renglón pasa por la misma evaluación que el alta individual, en bloques de hasta 500 identificados por rowRef y con respuesta asíncrona (API-06-002 y EVALUATION_DONE): con los mismos datos, la misma decisión. Por qué: Si la masiva tuviera reglas propias, el seller recibiría respuestas distintas para el mismo producto. Se apoya en RN-MAS-03, DEC-56, RF-MAT-20.
- D-FLU-05-2. Cuatro reglas y en este orden: datos (formato, obligatorios y EAN, que revisa MS-02 en el archivo), lista negra, coincidencia por EAN con la marca como peso, y categoría por el mapeo de la plantilla (FT-CAT-03). Sin imagen, URL ni IA para crear; la IA llega después del SKU (FT-IA-05). Por qué: Enriquecer 450 renglones con IA antes de crearlos tardaría días y costaría de más; el orden es el del alta individual: lista negra antes que coincidencia. Se apoya en RN-MAS-05, DEC-61, DEC-57, RN-MAT-05.
- D-FLU-05-3. La evaluación de un renglón vale 24 horas y guarda con qué versión de reglas se hizo; si el seller confirma después o la lista negra cambió, MS-02 vuelve a evaluar sólo esos renglones antes de crearlos. Por qué: Entre revisar y confirmar puede pasar tiempo; no se puede crear con una lista negra vieja. Se apoya en RN-MAT-05, RF-MAS-07.
- D-FLU-05-4. Los renglones con coincidencia o vetados no se crean: su acción va al reporte con el texto de la tabla de decisión («crear multioferta porque existe en Marketplace», «… porque está en Liverpool», «no se puede catalogar», «EAN duplicado») y la multioferta se hace con FT-INT-05. Por qué: Con coincidencia no se crea SKU ni se enriquece; el reporte reemplaza al mensaje en pantalla. Se apoya en RF-MAS-07, DEC-39, RN-MAS-04.
- D-FLU-05-5. En la carga masiva la calificación se calcula después de crear las propuestas, en lotes de 100 (API-06-006), y no detiene la creación; cuenta para la publicación por rangos (FT-RAC-03) y el seller la ve con sugerencias para mejorarla. Por qué: Dos carreteras: el SKU no espera al contenido; la calidad decide la publicación, no la creación. Se apoya en PD-24, RN-CAL-08, RF-MAS-12.
- D-FLU-05-6. Mercaderías y Suburbia usan la misma carga y la misma evaluación, sin lista negra: sólo reglas de datos y coincidencia por EAN en su negocio, donde un EAN ya usado sale como «EAN duplicado», como hoy. Por qué: La lista negra protege el surtido de Liverpool de los sellers; aplicada a sus propios proveedores lo bloquearía. Se apoya en DUD-32, RF-MAT-01.
Qué falta decidir
| ID | Qué falta |
|---|---|
| PD-24 | Confirmar que en la masiva la calificación no condiciona el SKU (aquí no lo condiciona). |
También siguen abiertos: PEN-19, La regla de Suburbia para los renglones que coinciden sólo con Suburbia (aquí arranca en «no se puede»); PEN-22, Ratificar las bandas de confianza de la coincidencia por EAN y marca; PEN-47, Quién valida lo que la IA agrega después del SKU en productos de carga masiva.
Fuentes
- [D]
trazabilidad/features/FT-FLU-05-reglas-por-renglon-carga-masiva.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.