Actualizado el 18-oct-2026. Primera versión de la arquitectura de esta épica.
Qué responde. Cómo funciona por dentro FT-FLU-01: 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-01.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-FLU-01-motor-de-estados-configurable.md.
En 30 segundos
Es el motor que decide en qué momento de su vida está cada producto y quién tiene que hacer algo. Un solo flujo para Mercaderías, Suburbia y Marketplace: siete estados, catorce tipos de tarea y un estado por canal. Cada negocio cambia las reglas, no el camino, y el SKU se pide con lo mínimo mientras el enriquecimiento avanza aparte. Sólo el motor cambia estados; los demás módulos le informan hechos.
- Módulo dueño: MS-02 Producto. También participan: MS-01 Catálogo, MS-13 Identidad y acceso, MS-06 Evaluación, MS-15 IA y enriquecimiento, MS-12 Estudio fotográfico, MS-07 Ingesta de archivos, MS-14 Avisos y ayuda, MS-05 Auditoría, MS-03 Migración y convivencia.
- Etapa T · Transversal. Recibe «PE-1 · Propuesta en Borrador», «PE-T · Usuario con permisos y bitácora», «PE-C · Catálogo vigente» y entrega «PE-4 · Propuesta enviada».
- APIs: construye 9 y usa 6 que construyen otras épicas.
- Eventos: publica 8 y consume 6.
1. Dónde encaja
Recibe
| De | Qué |
|---|---|
| PE-1 · Propuesta en Borrador | La propuesta en Borrador, con su negocio, su origen y su dueño, lista para enviarse. |
| PE-T · Usuario con permisos y bitácora | Quien llama ya se identificó, y la bitácora de MS-05 recibe cada cambio. |
| PE-C · Catálogo vigente | La vista efectiva de MS-01 por plantilla y negocio: qué es obligatorio y qué sección tiene dueño. |
| FT-PRD-01 · Modelo canónico de producto | El documento del producto en products, donde viven el estado, las tareas abiertas y los rechazos. |
| FT-USR-02 · Matriz de roles y permisos por módulo, acción, negocio y… | Los roles, áreas y negocios de cada usuario, que da el directorio de MS-13. |
Entrega
| A | Qué |
|---|---|
| PE-4 · Propuesta enviada | La propuesta En revisión, con la Validación automática aprobada y el visto bueno de su negocio abierto. |
| FT-PRD-04 · Propuesta del proveedor de Mercaderías | Las transiciones, las tareas y los plazos con que Compras da el visto bueno. |
| FT-PRD-05 · Edición y aprobación por campo según el dueño del dato | La matriz rol × acción × tarea y el dueño de cada grupo de campos. |
| FT-PRD-06 · Bandeja de pendientes y depuración de borradores… | Las tareas abiertas con su cola, su responsable y su vencimiento. |
| FT-PRD-08 · Plazos de enriquecimiento de Mercaderías hasta la… | El reloj de plazos y las tareas de enriquecimiento que se abren en paralelo después del SKU. |
| FT-FLU-07 · Excepciones de catalogación y preventas con publicación… | El momento de salir de Creación de SKU, en el que se evalúan las excepciones. |
| FT-RAC-05 · Estatus del producto y motivos visibles para seller y… | El estado, las tareas abiertas y su origen, de donde sale la etiqueta que ve el proveedor. |
| FT-PRD-09 · Contrato de propuestas con Entrada Única | Las acciones del flujo (enviar, corregir, cancelar) que usan las pantallas de propuestas. |
| FT-ACT-06 · Recepción del trabajo de Foro y control de edición… | La tarea Foro abierta y, mientras siga abierta, la regla de que el producto sólo se consulta. |
| FT-INT-01 · Publicación a e-commerce | El paso a Aprobado (T08), con el que empieza la publicación por canal. |
| FT-INT-06 · Avisos de cambios a Entrada Única y consumidores | Cada cambio de estado y de tarea, para avisar a Entrada Única mientras siga encendida. |
| FT-INT-07 · Repoblamiento masivo de productos hacia la tienda | La tarea de Repoblamiento y la vuelta a Aprobado que piden republicar. |
| FT-RAC-06 · Métricas de tiempos por paso y clasificación de errores | La apertura y el cierre de cada tarea, para medir el tiempo de cada paso. |
| FT-MIG-04 · Convivencia P360 ↔ nuevo PIM | La tabla de equivalencias con P360 y cada cambio de estado para la convivencia. |
| FT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y… | Las transiciones y tareas del motor, que llegan como STATUS_CHANGED y TASK_CHANGED para guardarse. |
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). |
| T02 | Inicio → Creación de SKU | Alta directa de PLM, MM41 o B2B. |
| T03 | Borrador → En revisión | Envía con los obligatorios completos. |
| T04 | En revisión → Borrador | Rechazo de Compras o de las reglas; se abre Corrección. |
| T05 | En revisión → Creación de SKU | Visto bueno: Compras en Mercaderías; en Marketplace, la Calificación de IA confirma que tiene lo que el SKU necesita (el score decide después la publicación). |
| T06 | Creación de SKU → En enriquecimiento | SAP crea el artículo (archivo 122). |
| T07 | Creación de SKU → En revisión | Gobierno de Datos lo regresa a Compras. |
| T08 | En enriquecimiento → Aprobado | Calidad aprobada y sin tareas que bloqueen. |
| T09 | Aprobado → En modificación | Alguien cambia un producto aprobado. |
| T10 | En modificación → Aprobado | El cambio se aplica o se descarta. |
| T11 | Borrador → Cancelado | Vence el plazo del rechazo (P-01) o se elimina. |
| T12 | En revisión → Cancelado | Compras cancela. |
| T13 | Creación de SKU → Cancelado | Cancelación. |
| T14 | En enriquecimiento → Cancelado | Cancelación. |
Tareas que abre o cierra: Validación automática, Visto bueno de Compras, Calificación de IA, Corrección, SKU en SAP, Gobierno de Datos, Foro: muestra, foto y enriquecimiento, Carga de imagen, Sección con dueño, QA con IA, QA manual, Category, Revisión del cambio, Repoblamiento.
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 | Proveedor | Entrada Única · Vendor Center | Envía su propuesta con los obligatorios completos | — |
| 2 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Pregunta qué acciones puede usar | API-02-027 |
| 3 | MS-02 Producto | MS-13 Identidad y acceso | Lee los roles, áreas y negocios de quien llama | API-13-001 |
| 4 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Pide el plan de la acción SUBMIT | API-02-028 |
| 5 | MS-02 Producto | MS-01 Catálogo | Lee la vista efectiva de su plantilla y negocio | API-01-028 |
| 6 | Entrada Única · Vendor Center | MS-02 Producto (por el BFF) | Confirma el plan | API-02-057 |
| 7 | MS-02 Producto | Base pim | Pasa a En revisión y corre la Validación automática | — |
| 8 | MS-02 Producto | Base pim | Cierra la validación y abre el visto bueno del negocio | — |
| 9 | MS-02 Producto | MS-06 Evaluación | Pide el score si el negocio es Marketplace | API-06-006 |
| 10 | MS-02 Producto | Eventos | Avisa el cambio de estado | catalog.product.changed/STATUS_CHANGED |
| 11 | MS-02 Producto | Eventos | Avisa las tareas que cerró y abrió | catalog.product.changed/TASK_CHANGED |
| 12 | Eventos | MS-05 Auditoría | Entrega el cambio de estado para la bitácora | catalog.product.changed/STATUS_CHANGED |
| 13 | Eventos | MS-14 Avisos y ayuda | Entrega la tarea nueva para avisar al responsable | catalog.product.changed/TASK_CHANGED |
3.1 Segunda carretera: del SKU a Aprobado con tareas en paralelo
3.2 Entrar y salir del ciclo: primer guardado, alta directa y cancelación
3.3 Configuración versionada y convivencia con P360
4. Si algo sale mal
- Alguien pide una acción que no vale en ese estado, tarea o rol. El plan responde 409 NOT_EDITABLE_IN_STATUS o 403 con el motivo y no cambia nada. Es la misma regla que hoy rechaza una combinación de estatus, acción y rol que no está configurada; ningún proceso puede pedir un SKU desde un estado que no lo permite.
- La Validación automática falla después de enviar. La propuesta regresa a Borrador (T04) con una Corrección de origen «reglas» y el error de cada campo. El proveedor ve «Rechazada» y recibe un aviso; al reenviar, el motor la vuelve a validar.
- El score de Marketplace no alcanza el umbral. La propuesta regresa a Borrador con una Corrección de origen «score». El seller ve «Por completar», no «Rechazada», con lo que baja su calificación; al reenviar se vuelve a calificar.
- SAP rechaza el alta (archivo 141). El producto se queda en Creación de SKU y el motor abre Gobierno de Datos, que relanza, regresa la propuesta a Compras (T07), la rechaza al proveedor con una Corrección o la cancela (T13). El proveedor ve «En revisión» mientras Gobierno de Datos trabaja.
- Un producto queda atorado o con un estado que no corresponde. Gobierno de Producto lo corrige con la corrección administrativa (API-02-021), con motivo obligatorio. Sale STATUS_CORRECTED y la bitácora lo marca como corrección, no como un paso del flujo.
5. APIs
Las que construye esta épica (9)
GET /api/v2/workflow/capabilities?productIds= · Qué puede hacer quien llama
| Campo | Valor |
|---|---|
| API | API-02-027 · MS-02 Producto |
| Para qué | Dice, por producto, qué acciones puede usar quien llama según su rol, el estado y la tarea abierta, y cómo puede cambiar cada grupo de campos: directo con el plan de valores (es su dueño), con una solicitud de cambio que revisa el dueño (API-02-310) o sólo lectura. Lo decide el motor; el portal sólo pinta los botones. |
| En esta épica | Botones por producto: acciones y forma de editar cada grupo de campos según rol, estado y tarea |
| Quién la llama | BFF del portal, Gateway de terceros /partner/v1 |
| Permiso | Cualquier usuario o tercero con acceso de lectura al producto |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | productIds = PRD-0004812,PRD-0004813 |
| También la usan | FT-ACT-02, FT-ACT-06, FT-ARQ-01, FT-FLU-02, FT-PRD-04, FT-PRD-05, FT-PRD-09, FT-USR-02 |
Request
null
Response · 200
{
"success": true,
"data": {
"items": [
{
"productId": "PRD-0004812",
"status": "APROBADO",
"openTasks": [],
"version": 12,
"actions": [
"INACTIVATE",
"REQUEST_REPOPULATION"
],
"fieldGroups": [
{
"group": "DATOS_BASE",
"access": "READ_ONLY"
},
{
"group": "ENVASE",
"access": "EDIT_DIRECT",
"owner": "COMPRAS"
},
{
"group": "LOGISTICA",
"access": "EDIT_WITH_REVIEW",
"owner": "LOGISTICA"
},
{
"group": "EAN",
"access": "READ_ONLY",
"note": "El EAN sólo cambia por la liberación de EAN o por Gobierno de Datos"
}
],
"isContentOwner": false
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | Algún producto no existe o no es visible para quien llama |
POST /api/v2/workflow/actions/plans · Pedir una acción del flujo
| Campo | Valor |
|---|---|
| API | API-02-028 · MS-02 Producto |
| Para qué | Prepara una acción del motor de estados sobre 1 a 100 productos y dice qué va a pasar con cada uno, sin cambiar nada todavía. Acciones del motor: SUBMIT, ACCEPT, REJECT, CANCEL, DISCARD, RETURN_TO_BUYER, REPORT_TO_GOVERNANCE, MARK_PRESALE, INACTIVATE, REACTIVATE y REQUEST_REPOPULATION; las etapas suman las suyas en la tabla TRANSITIONS, como CONVERT_TO_OFFER (FT-INT-05), RESEND_TO_SAP (FT-PRD-02) o RETURN_TO_SELLER (FT-RAC-03). |
| En esta épica | Vista previa de cualquier acción del flujo sobre 1 a 100 productos |
| Quién la llama | BFF del portal, Gateway de terceros /partner/v1 |
| Permiso | Lo decide el motor con la matriz rol × acción × tarea: el proveedor dueño para SUBMIT, DISCARD y CANCEL de su propuesta; Compras para ACCEPT, REJECT y CANCEL en visto bueno; Gobierno de Datos para RETURN_TO_BUYER e INACTIVATE |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| También la usan | FT-ACT-02, FT-ACT-05, FT-ACT-06, FT-FLU-02, FT-FLU-07, FT-INT-05, FT-INT-07, FT-PRD-02, FT-PRD-04, FT-PRD-05, FT-PRD-06, FT-PRD-07, FT-PRD-09, FT-RAC-01, FT-RAC-03, FT-USR-02 |
Request
{
"action": "REJECT",
"items": [
{
"productId": "PRD-0004812",
"version": 6
}
],
"reason": {
"code": "DATOS_INCOMPLETOS",
"comment": "Faltan medidas del empaque",
"target": "PROVEEDOR",
"fields": [
{
"attribute": "ALTO_EMPAQUE",
"code": "REQUIRED",
"comment": "Captura el alto en centímetros"
}
]
}
}
Response · 200
{
"success": true,
"data": {
"planId": "pln-7f3a91",
"expiresAt": "2026-10-18T15:14:05Z",
"summary": {
"ok": 1,
"blocked": 0
},
"items": [
{
"productId": "PRD-0004812",
"from": "EN_REVISION",
"to": "BORRADOR",
"closesTasks": [
"VISTO_BUENO_COMPRAS"
],
"opensTasks": [
"CORRECCION"
],
"correctionDueAt": "2026-12-17T15:04:05Z",
"visibleToSupplier": "Rechazada"
}
],
"applyUrl": "/api/v2/product-plans/pln-7f3a91/apply"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | NOT_EDITABLE_IN_STATUS | El producto no está en un estado o tarea que permita esa acción (por ejemplo, cancelar un producto Aprobado) |
| 403 | AUTHORIZATION_ERROR | La matriz del motor no le da esa acción al rol de quien llama |
| 422 | VALIDATION_ERROR | Un rechazo llega sin motivo, sin destino o con un campo que no existe en la plantilla |
POST /api/v2/product-plans/{planId}/apply · Confirmar un plan de Producto
| Campo | Valor |
|---|---|
| API | API-02-057 · MS-02 Producto |
| Para qué | Confirma cualquier plan de MS-02 (una acción del flujo, un comando de tarea, un cambio de valores, de configuración o de excepciones, una carga masiva…). Escribe en una transacción, publica los eventos desde el outbox y deja un recibo. |
| En esta épica | Confirmar cualquier plan de MS-02 en una transacción con su outbox |
| Quién la llama | BFF del portal, Gateway de terceros /partner/v1 |
| Permiso | El mismo que pidió el plan |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| Parámetros | planId = pln-7f3a91 |
| Escribe en | products, tasks, identifier_registry, product_versions, product_delivery_status, product_reference_tables, catalog_exceptions, product_receipts, product_outbox |
| Publica | catalog.product.changed/STATUS_CHANGED, catalog.product.changed/STATUS_CORRECTED, catalog.product.changed/TASK_CHANGED, catalog.product.changed/REJECTION_ADDED, catalog.product.changed/PRODUCT_UPDATED, catalog.product.changed/EAN_CHANGED, catalog.product.publication/SAP_CREATION_REQUESTED, catalog.product.publication/PUBLICATION_REQUESTED |
| También la usan | FT-ACT-02, FT-ACT-04, FT-ACT-05, FT-ACT-06, FT-ARQ-01, FT-ARQ-02, FT-CAT-01, FT-CAT-03, FT-CAT-04, FT-CAT-05, FT-CAT-06, FT-FLU-02, FT-FLU-03, FT-FLU-07, FT-IA-01, FT-IA-02, FT-IA-03, FT-IA-04, FT-IA-05, FT-INT-05, FT-INT-07, FT-MIG-04, FT-PLT-03, FT-PLT-05, FT-PLT-07, FT-PLT-08, FT-PRD-01, FT-PRD-02, FT-PRD-03, FT-PRD-04, FT-PRD-05, FT-PRD-06, FT-PRD-07, FT-PRD-09, FT-PRD-10, FT-RAC-01, FT-RAC-02, FT-RAC-03, FT-RAC-04, FT-RAC-05, FT-REF-02, FT-REF-03, FT-REF-04, FT-USR-02 |
Request
{}
Response · 202
{
"success": true,
"data": {
"requestId": "req-55e0c2",
"status": "ACCEPTED",
"receiptUrl": "/api/v2/product-receipts/req-55e0c2"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | PLAN_EXPIRED | Pasaron más de 10 minutos desde la vista previa |
| 409 | VERSION_CONFLICT | Alguien cambió el mismo grupo de campos o la misma tarea después de la vista previa |
| 409 | IDEMPOTENCY_MISMATCH | Se repite la llave de idempotencia con otro plan |
| 423 | LOCKED | Otro proceso está confirmando una acción sobre el mismo producto |
GET /api/v2/product-receipts/{requestId} · Recibo de una operación de Producto
| Campo | Valor |
|---|---|
| API | API-02-025 · MS-02 Producto |
| Para qué | Dice si una operación confirmada ya terminó y qué cambió en cada producto, con la etiqueta que verá el proveedor. El portal lo consulta después de confirmar. |
| En esta épica | Recibo de cada operación confirmada, con la etiqueta que verá el proveedor |
| Quién la llama | BFF del portal, Gateway de terceros /partner/v1 |
| Permiso | Quien hizo la operación |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | requestId = req-55e0c2 |
| También la usan | FT-ARQ-01, FT-INT-06, FT-INT-07, FT-PLT-03, FT-PRD-10 |
Request
null
Response · 200
{
"success": true,
"data": {
"requestId": "req-55e0c2",
"status": "DONE",
"finishedAt": "2026-10-18T15:04:07Z",
"items": [
{
"productId": "PRD-0004812",
"result": "APPLIED",
"version": 7,
"status": "BORRADOR",
"openTasks": [
"CORRECCION"
],
"visibleToSupplier": "Rechazada"
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | No existe el recibo o no es de quien llama |
GET /api/v2/workflow/statuses · Catálogo de estados, tareas y etiquetas
| Campo | Valor |
|---|---|
| API | API-02-026 · MS-02 Producto |
| Para qué | Devuelve los 7 estados del ciclo de vida, las 14 tareas, los 5 estados por canal y las etiquetas que ve el proveedor con su código de P360 equivalente, para que pantallas, reportes y la API de terceros usen los mismos nombres. |
| En esta épica | Catálogo de estados, tareas, estados por canal y etiquetas |
| Quién la llama | BFF del portal, Gateway de terceros /partner/v1, MS-04 Reportes |
| Permiso | Cualquier usuario o sistema autenticado |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | lang = es |
| También la usan | FT-RAC-05 |
Request
null
Response · 200
{
"success": true,
"data": {
"version": 4,
"statuses": [
{
"code": "BORRADOR",
"label": "Borrador"
},
{
"code": "EN_REVISION",
"label": "En revisión"
},
{
"code": "CREACION_SKU",
"label": "Creación de SKU"
},
{
"code": "EN_ENRIQUECIMIENTO",
"label": "En enriquecimiento"
},
{
"code": "APROBADO",
"label": "Aprobado"
},
{
"code": "EN_MODIFICACION",
"label": "En modificación"
},
{
"code": "CANCELADO",
"label": "Cancelado"
}
],
"tasks": [
{
"code": "VALIDACION_AUTOMATICA",
"attendedBy": "SISTEMA"
},
{
"code": "VISTO_BUENO_COMPRAS",
"attendedBy": "COMPRAS"
},
{
"code": "CALIFICACION_IA",
"attendedBy": "SISTEMA"
},
{
"code": "CORRECCION",
"attendedBy": "PROVEEDOR"
},
{
"code": "SKU_EN_SAP",
"attendedBy": "SISTEMA"
},
{
"code": "GOBIERNO_DE_DATOS",
"attendedBy": "GOBIERNO_DE_DATOS"
},
{
"code": "FORO",
"attendedBy": "ESTUDIO"
},
{
"code": "CARGA_DE_IMAGEN",
"attendedBy": "PROVEEDOR"
},
{
"code": "SECCION_CON_DUENO",
"attendedBy": "AREA_DUENA"
},
{
"code": "QA_CON_IA",
"attendedBy": "SISTEMA"
},
{
"code": "QA_MANUAL",
"attendedBy": "QA"
},
{
"code": "CATEGORY",
"attendedBy": "CATEGORY"
},
{
"code": "REVISION_DEL_CAMBIO",
"attendedBy": "DUENO_DEL_DATO"
},
{
"code": "REPOBLAMIENTO",
"attendedBy": "REPOBLAMIENTO"
}
],
"channelStatuses": [
"PENDIENTE",
"ENVIADO",
"PUBLICADO",
"ERROR",
"RETIRADO"
],
"supplierLabels": [
{
"label": "Borrador",
"p360Code": "10031"
},
{
"label": "Rechazada",
"p360Code": "1027"
},
{
"label": "Revisión de compras",
"p360Code": "1003"
},
{
"label": "En revisión",
"p360Code": "1001"
},
{
"label": "En proceso Liverpool",
"p360Code": "1026"
},
{
"label": "Carga de imagen",
"p360Code": "1004"
},
{
"label": "Aprobada",
"p360Code": "1007"
},
{
"label": "Modificación",
"p360Code": "1008"
},
{
"label": "Por actualizar",
"p360Code": "1006"
},
{
"label": "Cancelada",
"p360Code": "1009"
},
{
"label": "Por completar",
"p360Code": null
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 400 | VALIDATION_ERROR | El idioma pedido no existe |
GET /api/v2/workflow/config/{type} · Leer la configuración del motor
| Campo | Valor |
|---|---|
| API | API-02-030 · MS-02 Producto |
| Para qué | Lee una tabla versionada del motor de estados: TRANSITIONS (transiciones, acciones y reglas por negocio), ROLE_MATRIX (rol × acción × tarea), FIELD_OWNERS (dueño de cada grupo de campos y si cambia directo o con revisión), CHANGE_ROUTES (quién revisa cada tipo de cambio), DEADLINES (plazos), SUPPLIER_LABELS (lo que ve el proveedor), P360_CODES (equivalencia con P360), SWITCHES (por ejemplo, Category por negocio o la IA como segunda regla de calidad) y las que piden las etapas: SKU_TASKS (tareas que abre el 122 por negocio de SAP), SAP_ERROR_PATTERNS (tipos de error de SAP), EAN_RELEASE_RULES (liberación directa de EAN) y QUALITY_RULES (regla de calidad). Migración y Reportes leen P360_CODES con su cuenta de servicio. |
| En esta épica | Leer las tablas versionadas del motor (transiciones, permisos, dueños de campo, plazos, etiquetas, equivalencias) |
| Quién la llama | BFF del portal, MS-03 Migración y convivencia, MS-04 Reportes |
| Permiso | Gobierno de Producto; MS-03 y MS-04 sólo P360_CODES y SUPPLIER_LABELS |
| Cabeceras | Authorization, X-Request-Id |
| Parámetros | type = DEADLINES |
| También la usan | FT-CAT-03, FT-FLU-02, FT-INT-06, FT-MIG-04, FT-PRD-02, FT-PRD-03, FT-PRD-04, FT-PRD-05, FT-PRD-07, FT-PRD-08, FT-RAC-03, FT-RAC-05, FT-USR-02 |
Request
null
Response · 200
{
"success": true,
"data": {
"type": "DEADLINES",
"version": 3,
"rows": [
{
"business": "MER",
"task": "CORRECCION",
"days": 60,
"remindEveryDays": 7,
"onExpire": "CANCEL"
},
{
"business": "MER",
"task": "VISTO_BUENO_COMPRAS",
"days": 30,
"remindEveryDays": 15,
"onExpire": "ESCALATE"
},
{
"business": "MER",
"task": "DRAFT",
"days": 90,
"remindBeforeDays": 7,
"onExpire": "PURGE"
},
{
"business": "MER",
"task": "ENRICHMENT",
"anchor": "RECEPTION",
"offsetDays": -4,
"fallbackDays": 30,
"remindBeforeDays": [
15,
3
],
"onExpire": "RESCUE_TO_FORO"
}
]
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 404 | NOT_FOUND | El tipo de configuración no existe |
| 403 | AUTHORIZATION_ERROR | Quien llama no es Gobierno de Producto ni un servicio autorizado para esa tabla |
POST /api/v2/workflow/config/{type}/plans · Cambiar la configuración del motor
| Campo | Valor |
|---|---|
| API | API-02-031 · MS-02 Producto |
| Para qué | Prepara un cambio a una tabla del motor (un plazo, una transición, el dueño de un grupo de campos, una etiqueta) y dice qué tareas abiertas cambiarían su vencimiento o su revisor; se confirma con el plan, queda como versión nueva y la anterior se conserva. No hace falta desplegar código. |
| En esta épica | Cambiar una tabla del motor con vista previa, sin desplegar código |
| Quién la llama | BFF del portal |
| Permiso | Gobierno de Producto |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key, If-Match |
| Parámetros | type = DEADLINES |
| También la usan | FT-CAT-03, FT-INT-06, FT-PRD-02, FT-PRD-03, FT-PRD-04, FT-PRD-05, FT-PRD-08, FT-RAC-03, FT-RAC-05, FT-USR-02 |
Request
{
"version": 3,
"changes": [
{
"business": "MER",
"task": "CORRECCION",
"days": 45
}
]
}
Response · 200
{
"success": true,
"data": {
"planId": "pln-c2d410",
"expiresAt": "2026-10-18T15:14:05Z",
"impact": {
"openTasks": 214,
"dueAtMovedEarlier": 214
},
"applyUrl": "/api/v2/product-plans/pln-c2d410/apply"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | VERSION_CONFLICT | La configuración cambió desde que se leyó |
| 422 | BUSINESS_ERROR | El cambio deja una tarea sin quién la atienda o una transición fuera del modelo de 7 estados |
POST /api/v2/tasks/plans · Pedir un comando sobre una tarea
| Campo | Valor |
|---|---|
| API | API-02-035 · MS-02 Producto |
| Para qué | Prepara un comando sobre una o varias tareas (tomar, soltar, completar, aprobar, rechazar con motivo por campo, comentar o escalar) y dice qué pasará con cada producto; se confirma con el plan. Sustituye los 22 comandos de las Tareas V1 de Omega. |
| En esta épica | Cerrar, aprobar, rechazar, tomar o reasignar una tarea |
| Quién la llama | BFF del portal |
| Permiso | Lo decide el motor con la matriz rol × acción × tarea: la persona asignada o su área para completar, aprobar y rechazar; el líder de la cola para escalar |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key |
| También la usan | FT-ACT-06, FT-PRD-03, FT-PRD-05, FT-PRD-06, FT-PRD-07, FT-RAC-02, FT-RAC-04 |
Request
{
"command": "APPROVE",
"items": [
{
"taskId": "tsk-52108",
"version": 3
}
],
"comment": "Peso confirmado con la ficha técnica"
}
Response · 200
{
"success": true,
"data": {
"planId": "pln-91be20",
"expiresAt": "2026-10-18T15:14:05Z",
"items": [
{
"taskId": "tsk-52108",
"productId": "PRD-0004812",
"closes": "REVISION_DEL_CAMBIO",
"from": "EN_MODIFICACION",
"to": "APROBADO",
"appliesFields": [
"PESO_EMPAQUE"
],
"republishChannels": [
"TIENDA",
"OMS"
],
"visibleToSupplier": "Aprobada"
}
],
"applyUrl": "/api/v2/product-plans/pln-91be20/apply"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 409 | VERSION_CONFLICT | La tarea cambió (otra persona la tomó, la cerró o la reasignaron) desde que se leyó |
| 423 | LOCKED | La tarea está asignada a otra persona |
| 403 | AUTHORIZATION_ERROR | La matriz del motor no le da ese comando a quien llama |
| 422 | VALIDATION_ERROR | Un rechazo llega sin motivo por campo, o se completa una sección con obligatorios vacíos |
POST /api/v2/products/{id}/status-correction/plans · Corrección administrativa del estado
| Campo | Valor |
|---|---|
| API | API-02-021 · MS-02 Producto |
| Para qué | Gobierno de Producto corrige a mano el estado o las tareas de un producto atorado o con un estado que no corresponde, con motivo obligatorio. Se confirma con el plan y queda en la bitácora como corrección, no como un paso del flujo. |
| En esta épica | Corrección administrativa del estado con motivo |
| Quién la llama | BFF del portal |
| Permiso | ADMIN-W (Gobierno de Producto) |
| Cabeceras | Authorization, X-Request-Id, Idempotency-Key, If-Match |
| Parámetros | id = PRD-0004812 |
Request
{
"version": 9,
"status": "EN_ENRIQUECIMIENTO",
"closeTasks": [
"tsk-40211"
],
"openTasks": [
{
"type": "QA_CON_IA"
}
],
"reason": {
"code": "ESTADO_INCONSISTENTE",
"comment": "Quedó con Gobierno de Datos abierta después de que SAP sí creó el artículo"
}
}
Response · 200
{
"success": true,
"data": {
"planId": "pln-0a91c3",
"expiresAt": "2026-10-18T15:14:05Z",
"item": {
"productId": "PRD-0004812",
"from": {
"status": "EN_ENRIQUECIMIENTO",
"openTasks": [
"GOBIERNO_DE_DATOS"
],
"visibleToSupplier": "En proceso Liverpool"
},
"to": {
"status": "EN_ENRIQUECIMIENTO",
"openTasks": [
"QA_CON_IA"
],
"visibleToSupplier": "En revisión"
},
"warnings": [
"La tarea tsk-40211 sale de la bandeja de Gobierno de Datos"
]
},
"applyUrl": "/api/v2/product-plans/pln-0a91c3/apply"
}
}
Errores
| HTTP | Código | Cuándo |
|---|---|---|
| 403 | AUTHORIZATION_ERROR | Quien llama no tiene ADMIN-W |
| 422 | VALIDATION_ERROR | Falta el motivo o el estado o la tarea no existen |
| 422 | BUSINESS_ERROR | Se intenta reabrir un producto Cancelado: es final y sus EAN ya se liberaron |
| 409 | VERSION_CONFLICT | El producto cambió desde que se leyó |
Las que usa y construye otra épica (6)
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-13-001 | GET /internal/identity/permissions?userId= | Roles, áreas y negocios de quien llama, con caché | FT-USR-01 · Identidad y autenticación de usuarios internos… |
| API-01-028 | GET /api/v2/taxonomies/PRODUCT/nodes/{id}/effective | Obligatorios y secciones con dueño por plantilla y negocio | FT-PLT-06 · Configuración de atributos por plantilla y por negocio… |
| API-06-006 | POST /api/v2/scores | Score de Marketplace al abrir la Calificación de IA | FT-RAC-02 · Score de calidad del producto |
| API-15-005 | POST /api/v2/ai/quality-reviews | Revisión de calidad con IA al cerrarse las tareas de enriquecimiento | FT-IA-05 · Enriquecimiento continuo después de crear el SKU y después… |
| API-02-049 | POST /internal/product/sap/122 | El 122 que cierra SKU en SAP (lo construye FT-PRD-02) | FT-PRD-02 · Creación de SKU con SAP |
| API-02-006 | POST /api/v2/products/guided/plans | El primer guardado que crea el producto en Borrador (lo construye FT-PRD-07) | FT-PRD-07 · Captura guiada por pasos con los mínimos primero |
6. Eventos
Publica
| Evento | Cuándo | Quién lo consume |
|---|---|---|
catalog.product.changed/STATUS_CHANGED | Cada transición del ciclo de vida, de T01 a T14; el cuerpo lleva la etiqueta que verá el proveedor | FT-ACT-05, FT-ARQ-02, FT-CAT-05, 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, se asigna, se cierra o vence una tarea | FT-ACT-05, FT-ACT-06, FT-ARQ-02, FT-CAT-06, 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 |
catalog.product.changed/REJECTION_ADDED | La Validación automática o un revisor rechazan con motivo por campo | FT-INT-07, FT-PRD-04, FT-PRD-05, FT-PRD-10, FT-RAC-01, FT-RAC-03, FT-RAC-05, FT-RAC-06 |
catalog.product.changed/STATUS_CORRECTED | Gobierno de Producto corrige un estado a mano | MS-05 (bitácora) |
catalog.product.changed/EAN_CHANGED | Una cancelación libera los EAN del producto | FT-ARQ-02, FT-PRD-03 |
catalog.product.changed/PRODUCT_CREATED | Entra un alta directa de PLM, MM41 o B2B en Creación de SKU | FT-ARQ-01 |
catalog.product.publication/SAP_CREATION_REQUESTED | Marketplace alcanza el score (T05), entra un alta directa sin SKU, Gobierno de Datos relanza o corrige un dato maestro que usa SAP | FT-PRD-02 |
catalog.product.changed/CONFIG_CHANGED | Se confirma una versión nueva de una tabla del motor | FT-ARQ-02, FT-FLU-07 |
Consume
| Evento | Para qué | Quién lo publica |
|---|---|---|
catalog.product.changed/STATUS_CHANGED | MS-05 guarda cada transición; MS-03 la lleva a P360 mientras P360 sea la fuente; MS-12 cierra el trabajo de un producto cancelado | esta misma épica |
catalog.product.changed/TASK_CHANGED | MS-14 avisa al responsable de la tarea; MS-12 recibe la tarea Foro | esta misma épica |
catalog.studio.changed/CAPTURE_COMPLETED | MS-02 cierra la tarea Foro cuando el estudio termina | FT-ACT-06 |
catalog.identity.changed/ROLE_CHANGED | MS-02 renueva su caché de roles para evaluar la matriz | FT-USR-02 |
catalog.product.changed/CONFIG_CHANGED | MS-05 guarda la versión anterior y la nueva de la tabla | esta misma épica |
catalog.product.changed/STATUS_CORRECTED | MS-05 guarda la corrección marcada como administrativa, con su motivo | 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 |
|---|---|---|---|
products | MS-02 | La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos. | 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 |
identifier_registry | MS-02 | Unicidad de SKU y de EAN por negocio. | escribe |
product_versions | MS-02 | Foto numerada del producto en cada versión. | escribe |
product_reference_tables | MS-02 | Configuración del motor de estados y del matching: transiciones, estados externos y pesos. | 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 |
product_reference_tables | MS-02 | Configuración del motor de estados y del matching: transiciones, estados externos y pesos. | lee |
products | MS-02 | La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos. | lee |
tasks | MS-02 | Todo el trabajo asignado: visto bueno, corrección, Gobierno de Datos, foto, secciones, QA, revisión del cambio y repoblamiento. | lee |
8. Historias que cubre
| Historia | Prioridad | Cómo la cubre |
|---|---|---|
FT-FLU-01·H1 · Las transiciones como configuración con la llave de NextStatus | P1 | flujo «Configuración versionada y convivencia con P360»; API-02-030, API-02-031, API-02-028 |
| FT-FLU-01·H2 · Que el mismo flujo aplique candados, obligatoriedad y cantidad de atributos… | P1 | pasos 3, 5, 8; API-01-028 |
| FT-FLU-01·H3 · Que el SKU se cree con los datos maestros mínimos y el enriquecimiento siga aparte | P1 | flujo «Segunda carretera: del SKU a Aprobado con tareas en paralelo» |
| FT-FLU-01·H4 · Saber si mi producto avanza a la creación del SKU | P1 | pasos 9; API-06-006 |
| FT-FLU-01·H5 · Que cada transición abra la bandeja que toca, junte los rechazos y nunca pida… | P2 | pasos 8, 11, 13; flujo «Segunda carretera: del SKU a Aprobado con tareas en paralelo»; API-02-027, API-02-035 |
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-01-1. El motor es el modelo B guardado como datos: 7 estados, 14 tareas y 5 estados por canal. Sólo tiene las 14 transiciones del ciclo de vida (T01 a T14) y reglas por negocio que deciden qué tareas abre cada una. La llave de NextStatus ya no decide nada: queda como tabla de equivalencias con P360 (P360_CODES). Por qué: Cumple lo que piden los talleres con 7 estados en lugar de 28 y cada combinación conserva su código de P360. Las 239 llaves con estado previo sobran porque el origen de cada rechazo viaja en la tarea. Se apoya en PD-29, DMS-69, ADR-12.
- D-FLU-01-2. Los permisos de dominio viven en el motor de MS-02 como configuración versionada: ROLE_MATRIX (rol × acción × tarea × negocio) y FIELD_OWNERS (dueño de cada grupo de campos). MS-13 sólo dice qué roles, áreas y negocios tiene cada usuario y el BFF sólo decide los permisos de pantalla. La matriz falla cerrada: lo que no está, no se permite. Por qué: Quién puede hacer qué en el flujo es una regla del flujo. Repartirla entre directorio, BFF y motor repetiría el desorden de roles de P360 y dejaría dos lugares que se contradicen. Se apoya en DMS-71, DUD-22, ADR-12.
- D-FLU-01-3. Sólo MS-02 cambia el estado y las tareas, siempre por plan y confirmación (API-02-028, API-02-035 y API-02-057) o por su reloj de plazos. Los demás módulos informan hechos con sus eventos (el estudio terminó, la imagen se validó) o responden cuando el motor los llama (score, revisión con IA); nunca escriben el estado. Por qué: Una sola máquina de estados en lugar de las dos de hoy (P360 y Entrada Única) evita los SKU que cambian de estado sin registro y las propuestas en aprobación que piden SKU. Se apoya en ADR-12, PD-29, RF-ALT-11.
- D-FLU-01-4. Las reglas por negocio son guardas de la misma transición. Al enviar, Mercaderías y Suburbia abren Visto bueno de Compras y Marketplace abre Calificación de IA. Los obligatorios salen de la vista efectiva de MS-01 por negocio (unos 5 en Marketplace frente a 30 o 40 en Liverpool), sin copias en MS-02. Marketplace suma controles (lista negra, coincidencias, coherencia), no más atributos. Por qué: Un solo flujo con candados por negocio: «no son dos plataformas». Se apoya en RN-GEN-02, RN-GEN-05, RF-GEN-02.
- D-FLU-01-5. Dos carreteras: el SKU se pide con los datos maestros mínimos y, al llegar el 122, foto, secciones con dueño y Gobierno de Datos se abren en paralelo. Aprobado sólo espera a las tareas que bloquean: foto, secciones obligatorias, QA y Category si su negocio la tiene encendida (SWITCHES). El enriquecimiento opcional nunca frena el SKU ni la publicación. Por qué: Volumetría, logística comercial y precios no deben detener el SKU. Category se apaga por negocio, sin tocar el motor, cuando se mida el acierto de la IA. Se apoya en RN-GEN-03, RF-GEN-03, DEC-01, P-37.
- D-FLU-01-6. Si el score de Marketplace no alcanza el umbral, la propuesta regresa a Borrador con una Corrección de origen «score», que el seller ve como «Por completar», con lo que baja su calificación. No cuenta como rechazo; es la misma etiqueta que lleva la franja RETENER de FT-RAC-03 después del SKU. Antes del SKU el score sólo mira lo que el SKU necesita; la calidad del contenido frena después la publicación de cada canal. Por qué: En el taller se acordó que no avanzar no es un rechazo. Separar las dos compuertas cumple a la vez «dos carreteras» y el score antes del SKU que dibujan los diagramas. Se apoya en RN-CAL-06, DEC-46, PD-24.
- D-FLU-01-7. Un producto Aprobado o En modificación no se cancela: se retira de cada canal. Cancelar sólo vale de Borrador a En enriquecimiento (T11 a T14), cierra todas sus tareas y libera los EAN en la misma transacción. Si llega un 122 de un producto ya cancelado, no se reabre: queda una tarea de Gobierno de Datos, sin cambiar el estado, para dar de baja el artículo en SAP. Por qué: Hoy se puede cancelar desde cualquier estado y se pierde qué estaba publicado. La baja por canal deja ver qué se retiró y dónde. Se apoya en PD-29, ADR-12.
- D-FLU-01-8. Toda tabla del motor es versionada: el cambio se revisa con vista previa (API-02-031), se confirma con plan y sale como evento para la bitácora. El código de P360 se calcula sólo con P360_CODES, que leen MS-03 mientras P360 sea la fuente y los reportes que todavía lo usen. Ninguna pantalla lee códigos y no hay rutas /public/rt. Por qué: Sin capa de compatibilidad para los fronts (decisión 20 que adopta ADR-12) y con una sola tabla, nadie recalcula estados por su cuenta. Se apoya en DUD-36, ADR-06, ADR-12.
Qué falta decidir
| ID | Qué falta |
|---|---|
| PD-29 | Validar el modelo B con Negocio (Gobierno de Producto con Arquitectura, en ADR-09 del 6-nov); estas épicas ya lo usan. |
| PD-24 | Confirmar con Gobierno de Producto y Marketplace que el score antes del SKU sólo mira lo que el SKU necesita; los umbrales siguen sin dato (DUD-32). |
| DUD-09 | No existe la ERF de Flujos y Estados: la tabla de transiciones de aquí es la propuesta hasta que exista. |
| DUD-22 | La matriz rol × acción × tarea y los dueños de cada campo los firma Negocio con Seguridad; el motor arranca con los perfiles de los talleres. |
| P-37 | Category arranca encendida en los tres negocios hasta medir el acierto de la IA; lo decide Category con Gobierno de Producto. |
| DUD-36 | Saber quién, fuera de Entrada Única y Foro, lee códigos de P360 y si alguno toma 1007 como «ya publicado». |
También siguen abiertos: PEN-55, Cómo se identifica el negocio de un proveedor híbrido al dar de alta: el motor necesita un solo negocio por producto.
Fuentes
- [D]
trazabilidad/features/FT-FLU-01-motor-de-estados-configurable.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.