Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-FLU-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-FLU-04.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-FLU-04-carga-masiva-productos-por-archivo.md.
En 30 segundos
Un seller o proveedor con cientos o miles de productos baja una plantilla de Excel por categoría y negocio, la llena fuera de línea y la sube. El PIM le da al momento un número de carga, valida todo en segundo plano (estructura, listas, obligatorios, lista negra y si ya existe) y al final le entrega un reporte por renglón, haya o no errores. Cada renglón válido nace como propuesta en Borrador, igual que si la hubiera capturado en pantalla.
- Módulo dueño: MS-02 Producto. También participan: MS-01 Catálogo, MS-06 Evaluación, MS-14 Avisos y ayuda.
- 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 8 y usa 7 que construyen otras épicas.
- Eventos: publica 4 y consume 1.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| PE-C · Catálogo vigente | La vista efectiva de cada plantilla por negocio: atributos, capa de obligatoriedad, listas cerradas y reglas de marca. |
| PE-T · Usuario con permisos y bitácora | El seller o proveedor identificado por el BFF, con sus negocios y su permiso de alta. |
| FT-PLT-06 · Configuración de atributos por plantilla y por negocio… | Los tres niveles de obligatoriedad por negocio (obligatorio, recomendado, opcional) que pintan los colores de la plantilla. |
| FT-RAC-01 · Motor de validación en línea y candados de datos… | Las validaciones de tipo, lista, longitud y obligatorios, las mismas que corren en la pantalla. |
| FT-FLU-05 · Reglas de negocio en la carga masiva | La decisión de cada renglón: crear, ya existe con su acción (multioferta o stock out) o bloqueado, con el texto para el reporte. |
| FT-ARQ-01 · Núcleo headless | La alta completa en un paso de MS-02, con origen BULK y envío al confirmar. |
| FT-PRD-03 · EAN | La misma revisión de EAN, renglón por renglón: formato, dígito verificador, exentos y si ya existe en su negocio. |
| FT-PLT-10 · Fachada v1 compatible con P360 para Entrada Única y Foro | La revisión de plantilla y sección por renglón para la carga masiva (API-BFF-104), igual que ValidateTemplateSection. |
Entrega
| A | Qué |
|---|---|
| PE-1 · Propuesta en Borrador | Cada renglón válido nace como propuesta en Borrador con origen BULK, su plantilla, su dueño y la evaluación de MS-06 guardada; si trae completos los obligatorios de su negocio, se envía en la misma confirmación y queda En revisión. |
| FT-FLU-05 · Reglas de negocio en la carga masiva | Los renglones ya revisados en estructura, tipos y listas, en bloques de hasta 500 con su rowRef, para evaluar lista negra, coincidencias y decisión por negocio. |
| FT-FLU-06 · Plantilla en línea para carga y enriquecimiento masivo | La recepción asíncrona, el trabajo de carga y el reporte por renglón, que la plantilla en línea reutiliza. |
| FT-PRD-10 · Catalogación por API del proveedor o seller | El mismo trabajo de carga para los lotes que llegan por la API de terceros. |
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). |
| T03 | Borrador → En revisión | Enví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
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 | Abre la carga masiva y elige su negocio | — |
| 2 | Entrada Única · Vendor Center | BFF del portal | Pide la pantalla con sus categorías habituales | API-BFF-203 |
| 3 | Entrada Única · Vendor Center | BFF del portal | Revisa que cada plantilla esté ligada a su sección | API-BFF-104 |
| 4 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Baja la plantilla de hasta cinco categorías | API-02-045 |
| 5 | MS-02 Producto | MS-01 Catálogo | Lee la vista efectiva de cada plantilla | API-01-028 |
| 6 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Sube el archivo lleno y recibe el ID de carga | API-02-046 |
| 7 | MS-02 Producto | Archivos e imágenes (almacén y CDN) | Guarda el archivo original y encola la carga | — |
| 8 | MS-02 Producto | MS-06 Evaluación | Manda a evaluar los renglones bien formados | API-06-002 |
| 9 | Eventos | MS-02 Producto | Entrega la evaluación terminada de cada bloque | catalog.validation.result/EVALUATION_DONE |
| 10 | MS-02 Producto | MS-06 Evaluación | Lee la decisión de cada renglón | API-06-003 |
| 11 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Confirma los renglones válidos tras ver el estatus | API-02-047 |
| 12 | MS-02 Producto | Base pim | Crea las propuestas en Borrador y envía las completas | — |
| 13 | MS-02 Producto | Eventos | Avisa cada propuesta nueva con origen BULK | catalog.product.changed/PRODUCT_CREATED |
| 14 | MS-02 Producto | MS-14 Avisos y ayuda | Avisa que terminó y deja el reporte por renglón | API-14-005 |
3.1 Plantilla prellenada para corregir
3.2 Mercaderías por la misma carga
3.3 Reporte por renglón al terminar
4. Si algo sale mal
- La estructura del archivo no coincide con la plantilla. La subida responde 422 con las columnas que sobran o faltan y no se procesa ningún renglón; el seller ve «esta estructura no coincide» y baja la plantilla vigente.
- Un renglón trae un color fuera de la lista, letras en un número o un EAN repetido. Ese renglón queda «por corregir» con la columna y el motivo (por ejemplo, «EAN duplicado»); los demás siguen. El seller corrige en el mismo archivo y vuelve a subir sólo lo que falló.
- MS-06 no responde o tarda en evaluar. La carga se queda en «evaluando» y MS-02 reintenta por bloque; ningún renglón se crea sin evaluación. Si pasa de dos horas, la carga termina con error de dependencia y el seller recibe el aviso para subirla de nuevo; el archivo original queda guardado.
- La plantilla cambió entre que la bajó y la subió. Los renglones a los que les falta algo que pide la versión vigente salen con TEMPLATE_VERSION_OUTDATED y el detalle de qué falta; si sólo cambió lo opcional, se procesan.
- El archivo pasa de 20,000 renglones o trae más de cinco plantillas. Se rechaza completo con el motivo, nunca se trunca; el seller lo parte en archivos más chicos.
5. APIs
Las que construye esta épica (8)
GET /bff/v1/bulk-loads/start · Pantalla de carga masiva
| Campo | Valor |
|---|---|
| API | API-BFF-203 · BFF del portal |
| Para qué | Junta la pantalla de inicio de la carga masiva: los perfiles que puede usar, sus categorías habituales ya preseleccionadas (las plantillas en que más ha catalogado, calculadas de sus productos en MS-02 y nombradas con la ruta del árbol de MS-01) y sus cargas recientes con su estado. |
| En esta épica | Pantalla de inicio de la carga, con categorías habituales y cargas recientes |
| Quién la llama | Entrada Única · Vendor Center (por el BFF) |
| Permiso | La pantalla de carga masiva en el menú del perfil (BFF) |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | business = MKP |
Request
null
Response · 200
{
"success": true,
"data": {
"business": "MKP",
"profiles": [
{
"profile": "PROPOSALS",
"maxRows": 20000,
"maxTemplates": 5
}
],
"usualTemplates": [
{
"templateId": "EU4-0711",
"path": "Salud > Farmacia > Analgésicos",
"products": 214,
"preselected": true
},
{
"templateId": "EU4-0412",
"path": "Tecnología > Energía > Baterías portátiles",
"products": 37,
"preselected": true
}
],
"recentLoads": [
{
"importId": "imp-20261018-0042",
"status": "DONE_WITH_ERRORS",
"createdAt": "2026-10-18T16:02:11Z",
"summary": {
"rows": 12000,
"created": 11841,
"toCorrect": 101,
"alreadyExists": 49,
"blocked": 7
}
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | El perfil no tiene la pantalla de carga masiva o el negocio no es suyo |
| 503 | DEPENDENCY_UNAVAILABLE | MS-02 no responde |
GET /api/v2/product-imports/profiles · Perfiles de carga masiva de producto
| Campo | Valor |
|---|---|
| API | API-02-044 · MS-02 Producto |
| Para qué | Lista los perfiles de carga que puede usar quien llama: propuestas por plantilla y negocio, placeholders de pre-compra y los seis de paridad con P360 para usuarios internos, cada uno con sus límites y el permiso que pide. |
| En esta épica | Perfiles de carga que puede usar quien llama |
| Quién la llama | Entrada Única · Vendor Center (por el BFF) |
| Permiso | ENT-L; cada perfil dice qué permiso pide para cargar |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | business = MKP |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"profile": "PROPOSALS",
"name": "Propuestas por plantilla y negocio",
"for": [
"PROVEEDOR",
"SELLER",
"INTERNO"
],
"formats": [
"XLSX",
"CSV"
],
"maxRows": 20000,
"maxTemplates": 5,
"permission": "ENT-E"
},
{
"profile": "PLACEHOLDERS",
"name": "Placeholders de pre-compra",
"for": [
"PROVEEDOR",
"INTERNO"
],
"formats": [
"XLSX"
],
"maxRows": 20000,
"maxTemplates": 5,
"permission": "ENT-E"
},
{
"profile": "PRODUCT_VALUES_V1",
"name": "Valores de producto (paridad con P360)",
"for": [
"INTERNO"
],
"formats": [
"CSV",
"XLSX"
],
"maxRows": 100000,
"maxTemplates": null,
"permission": "VAL-E"
}
],
"page": 1,
"size": 50,
"total": 8
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | Quien llama no tiene lectura de productos |
GET /api/v2/product-imports/profiles/{p}/template · Bajar la plantilla de carga
| Campo | Valor |
|---|---|
| API | API-02-045 · MS-02 Producto |
| Para qué | Genera la plantilla descargable de una a cinco plantillas para un negocio con la vista efectiva vigente de MS-01: en blanco si se pidió por categoría, o prellenada con los productos buscados por SKU o EAN para corregirlos. |
| En esta épica | Bajar la plantilla en blanco o prellenada, con colores por negocio |
| Quién la llama | Entrada Única · Vendor Center (por el BFF) |
| Permiso | ENT-L; el proveedor o seller sólo para sus negocios y, al prellenar, sólo con sus productos |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | p = PROPOSALS, business = MKP, templateIds = EU4-0412,EU4-0533, prefillSkus = None, prefillEans = None, format = XLSX |
| También la usan | FT-CAT-03, FT-FLU-06, FT-PRD-05 |
Request
null
Response · 200
"Archivo XLSX: una hoja por plantilla con su versión en el encabezado; cada columna en rojo (obligatorio), amarillo (recomendado) o blanco (opcional) para el negocio; listas cerradas por código; si se pidió por SKU o EAN, un renglón por producto con sus datos. Una hoja «Léeme» explica por qué baja vacía cuando se pidió por categoría."
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El perfil o una plantilla no existen, o la plantilla no es una hoja del árbol |
| 422 | VALIDATION_ERROR | Más de cinco plantillas, o más de 500 productos para prellenar |
| 403 | AUTHORIZATION_ERROR | El negocio no es del proveedor o seller |
POST /api/v2/product-imports · Subir una carga masiva de producto
| Campo | Valor |
|---|---|
| API | API-02-046 · MS-02 Producto |
| Para qué | Recibe un archivo, los renglones de la plantilla en línea o un lote de la API de terceros (source.type = FILE, ROWS o PARTNER_BATCH); responde al momento con el ID de carga y valida en segundo plano, sin escribir productos, la estructura, los tipos, las listas, los obligatorios del negocio y la evaluación de MS-06 de cada renglón (API-06-002). |
| En esta épica | Subir la carga y recibir el ID al momento |
| Quién la llama | Entrada Única · Vendor Center (por el BFF), Gateway de terceros /partner/v1 |
| Permiso | El del perfil: ENT-E para propuestas y placeholders (el proveedor o seller sólo en sus negocios); ENT-E y VAL-E para los perfiles de paridad |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Escribe en | product_jobs |
| También la usan | FT-CAT-06, FT-FLU-05, FT-FLU-06, FT-INT-07, FT-PRD-05, FT-PRD-09, FT-PRD-10, FT-RAC-01 |
Request
{
"profile": "PROPOSALS",
"business": "MKP",
"source": {
"type": "FILE",
"fileName": "carga-octubre.xlsx",
"contentType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"sha256": "9f2c41d0…",
"content": "(el archivo va en la misma petición, multipart/form-data, hasta 50 MB)"
},
"applyWhenValidated": false,
"submitWhenComplete": true,
"notify": [
"SCREEN",
"EMAIL"
]
}
Response · 202
{
"success": true,
"data": {
"importId": "imp-20261018-0042",
"jobId": "job-7c31e0",
"status": "VALIDATING",
"received": {
"rows": 12000,
"templates": 3
},
"links": {
"self": "/api/v2/product-imports/imp-20261018-0042",
"apply": "/api/v2/product-imports/imp-20261018-0042/apply",
"report": "/api/v2/product-imports/imp-20261018-0042/report"
}
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | El archivo no se puede leer o no corresponde al perfil |
| 422 | VALIDATION_ERROR | La estructura no coincide (columnas ajenas UNKNOWN_COLUMN, columnas que faltan o encabezado de otra plantilla): se rechaza completo sin leer renglones |
| 413 | LIMIT_EXCEEDED | Más de 20,000 renglones, más de cinco plantillas, más de 50 MB o, en la plantilla en línea, más de 500 renglones: se rechaza completo, nunca se trunca |
| 403 | AUTHORIZATION_ERROR | El negocio no es del proveedor o seller, o el perfil pide un permiso que no tiene |
| 429 | RATE_LIMITED | Ya tiene dos cargas en proceso |
| 409 | IDEMPOTENCY_MISMATCH | Se repite la llave de idempotencia con otro archivo |
POST /api/v2/product-imports/{id}/apply · Confirmar una carga masiva
| Campo | Valor |
|---|---|
| API | API-02-047 · MS-02 Producto |
| Para qué | Confirma una carga ya validada y aplica, renglón por renglón, sólo los válidos con la misma alta completa que API-02-006 sin productId: cada propuesta nueva nace en Borrador con su origen (BULK, o PARTNER_API si el lote vino del gateway), su plantilla y su evaluación de MS-06, y si trae completos los obligatorios de su negocio se envía en la misma confirmación. Los renglones con ID de producto existente se aplican como cambio (vacío = no cambiar, __NULL__ = vaciar). |
| En esta épica | Confirmar y crear los renglones válidos |
| Quién la llama | Entrada Única · Vendor Center (por el BFF) |
| Permiso | Quien subió la carga |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key, If-Match |
| Parámetros | id = imp-20261018-0042 |
| Escribe en | products, identifier_registry, tasks, product_versions, product_jobs, product_receipts, product_outbox |
| Publica | catalog.product.changed/PRODUCT_CREATED, catalog.product.changed/PRODUCT_UPDATED, catalog.product.changed/STATUS_CHANGED, catalog.product.changed/TASK_CHANGED |
| También la usan | FT-CAT-06, FT-FLU-05, FT-FLU-06, FT-INT-07, FT-PRD-05, FT-PRD-09, FT-RAC-01 |
Request
{
"apply": "ALL_VALID",
"excludeRows": [
118,
4021
],
"submitWhenComplete": true
}
Response · 202
{
"success": true,
"data": {
"importId": "imp-20261018-0042",
"requestId": "req-91d2a4",
"status": "APPLYING",
"toApply": 11841,
"receiptUrl": "/api/v2/product-receipts/req-91d2a4",
"links": {
"self": "/api/v2/product-imports/imp-20261018-0042"
}
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | NOT_EDITABLE_IN_STATUS | La carga todavía se está validando o ya se aplicó |
| 409 | VERSION_CONFLICT | El resultado de la validación cambió desde que se leyó |
| 409 | PLAN_EXPIRED | Pasaron más de 24 horas desde la validación: hay que validar otra vez |
| 409 | IDEMPOTENCY_MISMATCH | Se repite la llave con otra selección de renglones |
GET /api/v2/product-imports/{id} · Estado y resultado de una carga
| Campo | Valor |
|---|---|
| API | API-02-048 · MS-02 Producto |
| Para qué | Dice en qué va una carga (validando, validada, aplicando, terminada o terminada con errores) y qué pasó con cada renglón y cada variante: válido, por corregir con columna y motivo, ya existe con su acción o bloqueado; al aplicar, el ID de cada propuesta creada. |
| En esta épica | Estatus por archivo, por renglón y por variante |
| Quién la llama | Entrada Única · Vendor Center (por el BFF), Gateway de terceros /partner/v1 |
| Permiso | Quien subió la carga; Gobierno de Producto con lectura |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | id = imp-20261018-0042, result = NOT_VALID, page = 1, size = 200 |
| También la usan | FT-FLU-06, FT-PRD-10, FT-RAC-01 |
Request
null
Response · 200
{
"success": true,
"data": {
"importId": "imp-20261018-0042",
"profile": "PROPOSALS",
"business": "MKP",
"origin": "BULK",
"channel": "FILE",
"status": "VALIDATED",
"createdAt": "2026-10-18T16:02:11Z",
"validatedAt": "2026-10-18T16:09:40Z",
"summary": {
"rows": 12000,
"valid": 11843,
"toCorrect": 101,
"alreadyExists": 49,
"blocked": 7,
"created": 0
},
"items": [
{
"row": 7,
"externalRef": "SKU-PROV-00071",
"result": "CORRECTION_REQUIRED",
"errors": [
{
"column": "COLOR",
"attribute": "COLOR",
"variantRow": 2,
"code": "VALUE_NOT_IN_LIST",
"value": "Rojo vino",
"message": "«Rojo vino» no está en la lista; usa el código"
}
]
},
{
"row": 12,
"externalRef": "SKU-PROV-00112",
"result": "ALREADY_EXISTS",
"match": {
"matchType": "EAN",
"catalog": "MARKETPLACE",
"sku": "1000004812"
},
"allowedAction": "MULTI_OFFER",
"message": "Crea una multioferta: el producto ya existe en Marketplace"
},
{
"row": 15,
"externalRef": "SKU-PROV-00115",
"result": "REJECTED",
"errors": [
{
"column": "MARCA",
"code": "BRAND_BLOCKED",
"message": "La marca no se puede catalogar en Marketplace"
}
]
},
{
"row": 31,
"externalRef": "SKU-PROV-00131",
"result": "CORRECTION_REQUIRED",
"errors": [
{
"column": "EAN",
"code": "EAN_DUPLICATED",
"value": "7501234567923",
"message": "EAN duplicado: lo usa otro SKU del mismo negocio"
}
]
}
],
"page": 1,
"size": 200,
"total": 157
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | La carga no existe o no es de quien llama |
GET /api/v2/product-imports · Mis cargas masivas
| Campo | Valor |
|---|---|
| API | API-02-204 · MS-02 Producto |
| Para qué | Lista las cargas de quien llama (o de su proveedor o seller) con su estado y su resumen, para la pantalla de carga y el seguimiento. |
| En esta épica | Mis cargas con su estado |
| Quién la llama | Entrada Única · Vendor Center (por el BFF) |
| Permiso | Quien subió las cargas; el proveedor o seller ve las de su cuenta; Gobierno de Producto con lectura |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | status = DONE_WITH_ERRORS, business = MKP, from = 2026-10-01, page = 1, size = 20 |
| También la usan | FT-FLU-06 |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"importId": "imp-20261018-0042",
"profile": "PROPOSALS",
"business": "MKP",
"channel": "FILE",
"status": "DONE_WITH_ERRORS",
"createdAt": "2026-10-18T16:02:11Z",
"finishedAt": "2026-10-18T16:21:05Z",
"summary": {
"rows": 12000,
"created": 11841,
"toCorrect": 101,
"alreadyExists": 49,
"blocked": 7
}
}
],
"page": 1,
"size": 20,
"total": 1
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | Un filtro trae un valor que no existe |
GET /api/v2/product-imports/{id}/report · Reporte por renglón de una carga
| Campo | Valor |
|---|---|
| API | API-02-205 · MS-02 Producto |
| Para qué | Devuelve el mismo archivo que se subió con tres columnas finales por renglón: resultado (creado, por corregir, ya existe o bloqueado), ID de la propuesta creada y detalle con la columna y el motivo; sale siempre, haya o no errores. |
| En esta épica | Reporte: el mismo archivo con una columna final de resultado |
| Quién la llama | Entrada Única · Vendor Center (por el BFF) |
| Permiso | Quien subió la carga |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | id = imp-20261018-0042, format = XLSX |
| También la usan | FT-FLU-05 |
Request
null
Response · 200
"Archivo XLSX o CSV: el archivo original con las columnas RESULTADO, ID_PROPUESTA y DETALLE al final de cada renglón; por ejemplo «CORRECTION_REQUIRED | | COLOR: «Rojo vino» no está en la lista»."
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | La carga no existe o no es de quien llama |
| 409 | NOT_EDITABLE_IN_STATUS | La carga todavía se está validando: el reporte sale al terminar |
Las que usa y construye otra épica (7)
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-001 | POST /api/v2/products/search | Buscar por SKU o EAN los productos a prellenar | FT-PRD-01 · Modelo canónico de producto |
| API-01-028 | GET /api/v2/taxonomies/PRODUCT/nodes/{id}/effective | Vista efectiva de cada plantilla por negocio | FT-PLT-06 · Configuración de atributos por plantilla y por negocio… |
| API-06-002 | POST /api/v2/evaluations/batches | Evaluar los renglones por bloque con las reglas del alta individual | FT-FLU-05 · Reglas de negocio en la carga masiva |
| API-06-003 | GET /api/v2/evaluations/batches/{batchId} | Leer la decisión de cada renglón | FT-FLU-05 · Reglas de negocio en la carga masiva |
| API-02-006 | POST /api/v2/products/guided/plans | La misma alta completa que corre por cada renglón válido, con origen BULK | FT-PRD-07 · Captura guiada por pasos con los mínimos primero |
| API-14-005 | POST /internal/notifications/messages | Avisar al seller que su carga terminó | FT-RAC-05 · Estatus del producto y motivos visibles para seller y… |
| API-BFF-104 | POST /bff/v1/catalog/template-section-checks | Revisar que cada plantilla elegida esté ligada a la sección y al negocio del proveedor | FT-PLT-10 · Fachada v1 compatible con P360 para Entrada Única y Foro |
6. Eventos
Publica
| Evento | Cuándo | Quién lo consume |
|---|---|---|
catalog.product.changed/PRODUCT_CREATED | Se crea cada renglón válido | FT-ARQ-01 |
catalog.product.changed/PRODUCT_UPDATED | Se aplica un renglón de cambio de un producto que ya existía | FT-ACT-05, FT-ARQ-02, FT-IA-01, FT-PLT-07, FT-PRD-05, FT-RAC-06 |
catalog.product.changed/STATUS_CHANGED | Un renglón completo se envía a revisión | 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/TASK_CHANGED | Se abre la Validación automática o el visto bueno de Compras | FT-ACT-05, FT-ACT-06, FT-ARQ-02, FT-CAT-06, FT-FLU-01, FT-IA-06, FT-PRD-02, FT-PRD-05, FT-PRD-06, FT-PRD-07, FT-PRD-08, FT-RAC-02, FT-RAC-03, FT-RAC-04, FT-RAC-05, FT-RAC-06 |
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
catalog.validation.result/EVALUATION_DONE | MS-02 sigue con la carga cuando MS-06 terminó de evaluar un bloque de renglones | FT-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ón | Dueño | Qué guarda | Esta épica |
|---|---|---|---|
product_jobs | MS-02 | Trabajos asíncronos: cargas masivas de productos, edición masiva y publicación. | escribe |
products | MS-02 | La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos. | escribe |
identifier_registry | MS-02 | Unicidad de SKU y de EAN por negocio. | escribe |
tasks | MS-02 | Todo el trabajo asignado: visto bueno, corrección, Gobierno de Datos, foto, secciones, QA, revisión del cambio y repoblamiento. | escribe |
product_versions | MS-02 | Foto numerada del producto en cada versión. | escribe |
product_receipts | MS-02 | El recibo de cada escritura confirmada en el producto (antes operation_receipts). | escribe |
product_outbox | MS-02 | Los cambios del producto que esperan salir como evento (antes outbox). | escribe |
template_views | MS-01 | La vista efectiva ya resuelta por plantilla y negocio: qué atributos pide y cuáles son obligatorios. | lee |
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_results | MS-06 | El resultado de cada evaluación: lista negra, coincidencias con su confianza y score. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
| FT-FLU-04·H1 · Descargar y subir la plantilla de una categoría | P1 | pasos 1, 2, 4, 5, 6; flujo «Plantilla prellenada para corregir»; API-02-045, API-02-046 |
| FT-FLU-04·H2 · Recepción asíncrona | P1 | pasos 6, 7, 14; flujo «Reporte por renglón al terminar»; API-02-048, API-02-204, API-14-005 |
| FT-FLU-04·H3 · Validación y reporte por renglón | P1 | pasos 8, 9, 10; flujo «Reporte por renglón al terminar»; API-02-205 |
| FT-FLU-04·H4 · Plantilla por negocio con colores | P2 | pasos 4, 5; API-02-045 |
| FT-FLU-04·H5 · Mercaderías por la misma carga | P3 | flujo «Mercaderías por la misma carga» |
| FT-FLU-04·H6 · Mis categorías | P2 | pasos 2; API-BFF-203 |
| FT-FLU-04·H7 · Plantilla prellenada si busco por código | P1 | flujo «Plantilla prellenada para corregir» |
| FT-FLU-04·H8 · Varias plantillas en un archivo | P2 | pasos 3, 4, 6; API-02-044, API-BFF-104 |
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-04-1. La carga masiva es un trabajo de MS-02 (product_jobs) que corre en su despliegue de trabajo, el mismo artefacto del módulo, como hoy product-massive en Entrada Única. El archivo original y el reporte se guardan en el almacén de archivos; la carga sólo guarda su referencia. Por qué: Las cargas pesadas no deben competir con las pantallas, y separar el despliegue no agrega una pieza que operar (decisión 6 de la validación con código). Se apoya en ADR-12, PD-05.
- D-FLU-04-2. Dos pasos, como hoy en Entrada Única (validar y procesar): subir valida todo sin crear nada y da el ID al momento; al terminar, el seller ve el resultado y confirma los válidos. Con applyWhenValidated los válidos se crean solos al terminar la validación: lo usan el gateway para sus lotes y el seller que lo pida. Por qué: Medido en el código del front (18-oct): hoy son validate-proposal-file y process-proposal-file. Mantener los dos pasos no cambia el hábito del seller y sigue la regla de escribir en dos pasos. Se apoya en RN-MAS-02, RN-MAS-01, DEC-54.
- D-FLU-04-3. Renglón por renglón: un renglón malo no tumba la carga y los válidos se crean. El todo o nada se queda para la carga de configuración del catálogo. Por qué: Es lo que pidieron los talleres (S10: se crea lo que no tiene coincidencia) y lo que hace hoy Entrada Única; resuelve la duda de RQ-14. Se apoya en RN-MAS-04, DEC-58, RF-MAS-08.
- D-FLU-04-4. Un archivo es de un solo negocio. Quien vende en varios negocios baja y sube un archivo por negocio, cada uno con sus colores: rojo obligatorio, amarillo recomendado y blanco opcional. Por qué: El encabezado no admite obligatoriedad por negocio; separar por negocio resuelve PEN-56 sin plantillas combinadas y es la misma regla de un negocio por lote de la API de terceros. Se apoya en PEN-55, PEN-56, DUD-32, RF-MAS-09, RF-MAS-10.
- D-FLU-04-5. Límites de arranque: hasta 20,000 renglones, cinco plantillas y 50 MB por archivo, y dos cargas en proceso por cuenta; lo que pasa el límite se rechaza completo con el motivo, nunca se trunca. La plantilla lleva su versión: si la vigente pide algo que el archivo no trae, el renglón sale con TEMPLATE_VERSION_OUTDATED. Por qué: Cubre los 10,000 a 20,000 productos por archivo de los talleres y las cinco plantillas por archivo de P-07; los valores se ajustan con la prueba de carga. Se apoya en RF-MAS-05, P-07, RN-PLA-08.
- D-FLU-04-6. Prellenado sólo cuando se busca por SKU o EAN (hasta 500 productos por descarga); pedida por categoría, la plantilla baja vacía y lo explica. Un renglón con ID de producto existente es un cambio: vacío = no cambiar y __NULL__ = vaciar, con la misma validación y el mismo motor que un cambio en pantalla; si el producto ya está aprobado, abre la revisión del cambio. Por qué: Cubre H7 y la modificación masiva que hoy hace Entrada Única (RQ-15) sin un flujo aparte. Se apoya en RF-MAS-01, RF-MAT-21, FT-PRD-05.
- D-FLU-04-7. Mercaderías y Suburbia usan la misma carga. Cada renglón válido sigue la ruta de su negocio: en Mercaderías se envía al visto bueno de Compras como cualquier propuesta, y las reglas de datos (EAN usado por otro SKU) las corre MS-06 con la evaluación del bloque. Por qué: El SKU se crea con la misma lógica por cualquier canal y Compras no pierde su revisión por el canal de entrada; resuelve la duda de H5. Se apoya en DEC-59, RN-ALT-12, RN-ALT-05.
- D-FLU-04-8. El reporte sale siempre al final: el mismo archivo con tres columnas de resultado (resultado, ID de la propuesta y detalle) y el resultado por renglón en la pantalla. El aviso de fin lo manda MS-14 por pantalla y correo. Sin SLA hasta medir; la referencia es de 5 a 10 minutos. Por qué: «La clave es el reporte»: siempre, por renglón y sin mandar al seller a otra pantalla; el formato elegido resuelve PEN-59. Se apoya en RN-MAS-04, PEN-59, PEN-12.
- D-FLU-04-9. «Mis categorías» no se guardan aparte: el BFF las calcula de los productos del proveedor (cuenta por plantilla en MS-02) y las nombra con la ruta del árbol de MS-01. Por qué: Un dato que se deduce no se duplica y siempre refleja lo que el proveedor sí catalogó (H6). Se apoya en ADR-12.
Qué falta decidir
| ID | Qué falta |
|---|---|
| PD-02 | En R2 la carga del portal pasa al PIM con las reglas de hoy; las reglas TO-BE de Marketplace (evaluación de MS-06 por renglón) dependen de que el alta de sellers suba antes de R4. |
También siguen abiertos: PEN-55, Marketplace con Gobierno de Producto confirma cómo se identifica el negocio de un proveedor híbrido (aquí, un archivo por negocio); PEN-59, Ratificar el formato del reporte (aquí, el mismo archivo con columnas de resultado); PEN-12, Confirmar canal y frecuencia del aviso de fin de carga.
Fuentes
- [D]
trazabilidad/features/FT-FLU-04-carga-masiva-productos-por-archivo.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.