← Arquitectura por épica

FT-PRD-04 · Propuesta del proveedor de Mercaderías

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-PRD-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-PRD-04.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-PRD-04-ciclo-de-vida-propuesta-proveedor.md.

En 30 segundos

Cuando un proveedor de Mercaderías envía una propuesta, Compras tiene que aceptarla, rechazarla o cancelarla antes de que se pida el SKU a SAP. Esta épica cuida ese tramo: la bandeja de Compras, el rechazo con motivo por campo, los avisos al proveedor, los plazos que vencen solos y el historial de lo que se canceló, para que ninguna propuesta se pierda sin explicación.

  • Módulo dueño: MS-02 Producto. También participan: MS-14 Avisos y ayuda, MS-07 Ingesta de archivos, MS-08 Adaptadores de salida, MS-13 Identidad y acceso.
  • Etapa 4 · Visto bueno. Recibe «PE-4 · Propuesta enviada» y entrega «PE-5 · Visto bueno dado».
  • APIs: construye 2 y usa 9 que construyen otras épicas.
  • Eventos: publica 6 y consume 4.

1. Dónde encaja

Recibe

DeQué
PE-4 · Propuesta enviadaLa propuesta en En revisión, con la Validación automática aprobada y la tarea Visto bueno de Compras abierta.
FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…Las transiciones, las tareas y los plazos configurados en el motor de estados.
FT-RAC-01 · Motor de validación en línea y candados de datos…La propuesta enviada con los obligatorios completos.
FT-PLT-07 · Reglas de atributosLos campos calculados del placeholder que viajan a o9 con sus datos maestros.
FT-RAC-02 · Score de calidad del productoEn Mercaderías y Suburbia, la calificación informativa que Compras ve al decidir.
FT-RAC-06 · Métricas de tiempos por paso y clasificación de erroresLa antigüedad y el tiempo de la revisión de Compras, con los que se ratifican sus plazos.

Entrega

AQué
PE-5 · Visto bueno dadoLa propuesta en Creación de SKU, con el visto bueno de Compras registrado y SAP_CREATION_REQUESTED publicado.
FT-PRD-02 · Creación de SKU con SAPLa petición de crear el artículo en SAP.
FT-PRD-08 · Plazos de enriquecimiento de Mercaderías hasta la…La fecha del visto bueno, desde la que corren los plazos de enriquecimiento.

Cambios de estado que hace

TransiciónDe → aCuándo
T04En revisión → BorradorRechazo de Compras o de las reglas; se abre Corrección.
T05En revisión → Creación de SKUVisto 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).
T11Borrador → CanceladoVence el plazo del rechazo (P-01) o se elimina.
T12En revisión → CanceladoCompras cancela.

Tareas que abre o cierra: Visto bueno de Compras, Corrección.

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

Sistemas externos

Nuevo PIM · un solo sistema

Pantallas y sistemas

Personas

Bandeja de tareas
Ficha del producto
y 4 más

STATUS_CHANGED
SAP_CREATION_REQUESTED
y 3 más

STATUS_CHANGED
REJECTION_ADDED

Avisa al proveedor que su propuesta f…
Manda el motivo por campo al proveedor

Mandar un aviso explícito

PLANNING_EXPORT_REQUESTED

Deja el archivo de placeholders en el…

Deja el archivo de respuesta con el e…

OBJECT_FINALIZE

Estatus de o9 por placeholder

permisos

Compras

Proveedor

Entrada Única · Vendor Center

BFF del portal

★ MS-02 Producto

MS-14 Avisos y ayuda

MS-07 Ingesta de archivos

MS-08 Adaptadores de salida

MS-13 Identidad y acceso

Base pim

Eventos

Archivos e imágenes

Servicio de correo

o9 (planeación de compras)

Contexto de FT-PRD-04

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.

Servicio de correoMS-14 Avisos y ayudaEventosBase·pimMS-02 ProductoEntrada Única · Vendor CenterServicio de correoMS-14 Avisos y ayudaEventosBase·pimMS-02 ProductoEntrada Única · Vendor CenterComprasBFF1. Abre su bandeja de visto bueno2. Pide las tareas de visto bueno de su áreaGET /api/v2/tasks3. Abre la propuesta con sus datos e imágenesGET /api/v2/products/{id}4. Pregunta qué botones puede usarGET /api/v2/workflow/capabilities?productIds=5. Acepta la propuesta6. Pide el plan de la acción ACCEPTPOST /api/v2/workflow/actions/plans7. Confirma el planPOST /api/v2/product-plans/{planId}/apply8. Cierra la tarea y pasa a Creación de SKU9. Avisa el cambio de estadoSTATUS_CHANGED10. Pide crear el artículo en SAPSAP_CREATION_REQUESTED11. Entrega el cambio de estado para avisarSTATUS_CHANGED12. Avisa al proveedor que su propuesta fue aceptadaComprasBFF
Flujo principal de FT-PRD-04
Los pasos en texto
PasoDeAQué haceAPI o evento
1ComprasEntrada Única · Vendor CenterAbre su bandeja de visto bueno—
2Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Pide las tareas de visto bueno de su áreaAPI-02-032
3Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Abre la propuesta con sus datos e imágenesAPI-02-002
4Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Pregunta qué botones puede usarAPI-02-027
5ComprasEntrada Única · Vendor CenterAcepta la propuesta—
6Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Pide el plan de la acción ACCEPTAPI-02-028
7Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Confirma el planAPI-02-057
8MS-02 ProductoBase pimCierra la tarea y pasa a Creación de SKU—
9MS-02 ProductoEventosAvisa el cambio de estadocatalog.product.changed/STATUS_CHANGED
10MS-02 ProductoEventosPide crear el artículo en SAPcatalog.product.publication/SAP_CREATION_REQUESTED
11EventosMS-14 Avisos y ayudaEntrega el cambio de estado para avisarcatalog.product.changed/STATUS_CHANGED
12MS-14 Avisos y ayudaServicio de correoAvisa al proveedor que su propuesta fue aceptada—

3.1 Si Compras rechaza y nadie corrige

Base·pimServicio de correoMS-14 Avisos y ayudaEventosMS-02 ProductoEntrada Única · Vendor CenterBase·pimServicio de correoMS-14 Avisos y ayudaEventosMS-02 ProductoEntrada Única · Vendor CenterBFFProveedor1. Pide el plan REJECT con el motivo por campoPOST /api/v2/workflow/actions/plans2. Confirma el rechazoPOST /api/v2/product-plans/{planId}/apply3. Regresa a Borrador y abre CorrecciónREJECTION_ADDED4. Entrega el rechazo para avisarREJECTION_ADDED5. Manda el motivo por campo al proveedor6. Recuerda cada semana mientras siga sin corregirPOST /internal/notifications/messages7. Al vencer el plazo, cancela y libera los EAN8. Avisa la cancelación y el EAN libreEAN_CHANGED9. Consulta su historial de propuestas canceladas10. Busca sus propuestas canceladas con el motivoPOST /api/v2/products/searchBFFProveedor
Si Compras rechaza y nadie corrige

3.2 Placeholders de pre-compra con o9

Base·pimMS-07 Ingesta de archivosArchivoso9 (planeación de compras)MS-08 Adaptadores de salidaEventosMS-02 ProductoBase·pimMS-07 Ingesta de archivosArchivoso9 (planeación de compras)MS-08 Adaptadores de salidaEventosMS-02 Producto1. Pide mandar los placeholders listos a o9PLANNING_EXPORT_REQUESTED2. Entrega la petición al adaptadorPLANNING_EXPORT_REQUESTED3. Deja el archivo de placeholders en el bucket4. Deja el archivo de respuesta con el estatus5. Avisa que llegó un archivo nuevoOBJECT_FINALIZE6. Entrega el estatus de cada placeholder por su IDPOST /internal/product/planning/o9-status7. Vuelve propuesta cada placeholder aceptado
Placeholders de pre-compra con o9

4. Si algo sale mal

  • Compras rechaza. La propuesta regresa a Borrador con una tarea de Corrección. El proveedor ve «Rechazada» con el motivo de cada campo y recibe un aviso; al reenviar, vuelve a la bandeja de Compras.
  • El proveedor no corrige a tiempo. El reloj de plazos de MS-02 le recuerda cada semana. Al vencer el plazo de corrección, la propuesta pasa a Cancelado, sus EAN quedan libres y el proveedor la ve en su historial con el motivo «Venció el plazo de corrección».
  • Compras no responde a tiempo. La propuesta no se cancela. A los 15 días se le recuerda a Compras y a los 30 la tarea pasa a la cola del área de Gobierno de Producto para reasignarla; el proveedor ve «Revisión de compras» con la fecha en que entró.
  • Otra persona cambió la propuesta mientras Compras la revisaba. La confirmación responde 409 VERSION_CONFLICT; el portal recarga la propuesta y Compras vuelve a decidir sobre la versión nueva.
  • El archivo de o9 trae renglones en otro orden o desconocidos. Cada renglón se aplica por su placeholderId, nunca por posición; los desconocidos quedan en el recibo del archivo como rechazados y no se tocan otros productos.

5. APIs

Las que construye esta épica (2)

GET /api/v2/workflow/comments?productIds= · Motivos de rechazo
CampoValor
APIAPI-02-029 · MS-02 Producto
Para quéDevuelve los motivos de rechazo de una o varias propuestas, por campo, con quién rechazó (por área), a quién le toca corregir y cuándo vence la corrección.
En esta épicaLeer los motivos de rechazo de varias propuestas
Quién la llamaBFF del portal, Gateway de terceros /partner/v1
PermisoEl proveedor o seller dueño, y las áreas internas con lectura
CabecerasAuthorization, X-Request-Id
ParámetrosproductIds = PRD-0004812
También la usanFT-IA-06, FT-PRD-05, FT-PRD-09, FT-PRD-10, FT-RAC-05

Request

null

Response · 200

{
  "success": true,
  "data": {
    "items": [
      {
        "productId": "PRD-0004812",
        "rejectedAt": "2026-10-18T15:04:07Z",
        "rejectedBy": {
          "area": "COMPRAS-HOGAR",
          "role": "COMPRAS"
        },
        "target": "PROVEEDOR",
        "reason": {
          "code": "DATOS_INCOMPLETOS",
          "comment": "Faltan medidas del empaque"
        },
        "fields": [
          {
            "attribute": "ALTO_EMPAQUE",
            "label": "Alto del empaque",
            "code": "REQUIRED",
            "comment": "Captura el alto en centímetros"
          }
        ],
        "correctionDueAt": "2026-12-17T15:04:05Z"
      }
    ]
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDLa propuesta no existe o no es visible para quien llama
POST /internal/product/planning/o9-status · Estatus de o9 por placeholder
CampoValor
APIAPI-02-301 · MS-02 Producto
Para quéMS-07 entrega el archivo de respuesta de o9 ya leído; Producto aplica el estatus a cada placeholder por su identificador y vuelve propuesta a los aceptados.
En esta épicaRecibir el estatus de o9 por placeholder
Quién la llamaMS-07 Ingesta de archivos
PermisoSólo MS-07 (cuenta de servicio)
CabecerasAuthorization, X-Request-Id, Idempotency-Key
Escribe enproducts, product_receipts, product_outbox
Publicacatalog.product.changed/STATUS_CHANGED

Request

{
  "fileId": "o9-resp-20261018-01",
  "records": [
    {
      "placeholderId": "PRD-0007710",
      "status": "ACCEPTED"
    },
    {
      "placeholderId": "PRD-0007711",
      "status": "NOT_RECOMMENDED"
    }
  ]
}

Response · 200

{
  "success": true,
  "data": {
    "fileId": "o9-resp-20261018-01",
    "applied": 2,
    "rejected": 0,
    "items": [
      {
        "placeholderId": "PRD-0007710",
        "result": "APPLIED",
        "nowStatus": "BORRADOR"
      },
      {
        "placeholderId": "PRD-0007711",
        "result": "APPLIED",
        "nowStatus": "PLACEHOLDER_NO_RECOMENDADO"
      }
    ]
  }
}

Errores

HTTPCódigoCuándo
409IDEMPOTENCY_MISMATCHEl mismo archivo llega otra vez con contenido distinto

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.

APIMétodo y rutaPara qué, aquíLa construye
API-02-032GET /api/v2/tasksLa bandeja: tareas de visto bueno por área, estado y antigüedadFT-PRD-06 · Bandeja de pendientes y depuración de borradores…
API-02-002GET /api/v2/products/{id}Ver la propuesta completa antes de decidirFT-PRD-01 · Modelo canónico de producto
API-02-027GET /api/v2/workflow/capabilities?productIds=Saber si puede aceptar, rechazar o cancelarFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-028POST /api/v2/workflow/actions/plansVista previa de ACCEPT, REJECT o CANCEL, con el motivo por campoFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-057POST /api/v2/product-plans/{planId}/applyConfirmar la acciónFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-030GET /api/v2/workflow/config/{type}Leer los plazos de corrección y de revisión por negocioFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-031POST /api/v2/workflow/config/{type}/plansCambiar los plazos (Gobierno de Producto)FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-001POST /api/v2/products/searchHistorial del proveedor: sus propuestas canceladas o vencidasFT-PRD-01 · Modelo canónico de producto
API-14-005POST /internal/notifications/messagesMandar el recordatorio semanal al proveedorFT-RAC-05 · Estatus del producto y motivos visibles para seller y…

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.product.changed/STATUS_CHANGEDCompras acepta o cancela, o vence el plazo de correcciónFT-ACT-05, FT-ARQ-02, FT-CAT-05, FT-FLU-01, FT-IA-04, FT-PRD-02, FT-PRD-06, FT-PRD-10, FT-RAC-03, FT-RAC-05, FT-RAC-06
catalog.product.changed/REJECTION_ADDEDCompras rechaza con motivo por campoFT-INT-07, FT-PRD-05, FT-PRD-10, FT-RAC-01, FT-RAC-03, FT-RAC-05, FT-RAC-06
catalog.product.changed/TASK_CHANGEDSe cierra el visto bueno, se abre Corrección o una tarea se escalaFT-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
catalog.product.changed/EAN_CHANGEDUna cancelación libera los EAN de la propuestaFT-ARQ-02, FT-PRD-03
catalog.product.publication/SAP_CREATION_REQUESTEDCompras acepta: se pide el artículo a SAPFT-PRD-02
catalog.product.publication/PLANNING_EXPORT_REQUESTEDHay placeholders listos para mandar a o9MS-05 (bitácora)

Consume

EventoPara quéQuién lo publica
catalog.product.changed/STATUS_CHANGEDMS-14 avisa al proveedor que su propuesta fue aceptada o canceladaesta misma épica
catalog.product.changed/REJECTION_ADDEDMS-14 manda el motivo del rechazo al proveedoresta misma épica
catalog.product.publication/PLANNING_EXPORT_REQUESTEDMS-08 arma el archivo de placeholders para o9esta misma épica
catalog.egress.files/OBJECT_FINALIZEMS-07 lee el archivo de respuesta de o9D-ARCHIVOS

7. Datos

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

ColecciónDueñoQué guardaEsta épica
productsMS-02La familia del producto con sus variantes, valores, imágenes (URL), clasificaciones, estado, tareas abiertas y rechazos.escribe
tasksMS-02Todo el trabajo asignado: visto bueno, corrección, Gobierno de Datos, foto, secciones, QA, revisión del cambio y repoblamiento.escribe
identifier_registryMS-02Unicidad de SKU y de EAN por negocio.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
product_reference_tablesMS-02Configuración del motor de estados y del matching: transiciones, estados externos y pesos.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-PRD-04·H1 · Rechazo con avisoP1flujo «Si Compras rechaza y nadie corrige»; API-02-028, API-02-029, API-14-005
FT-PRD-04·H2 · HistorialP1flujo «Si Compras rechaza y nadie corrige»; API-02-001
FT-PRD-04·H3 · Vigencia en revisión de ComprasP1pasos 1, 2, 6, 7, 10; API-02-030, API-02-031
FT-PRD-04·H4 · Borrador de pre-compraP2API-02-030. Fuera: Guardar el borrador lo resuelve FT-PRD-07 (captura guiada); aquí sólo se fija su vigencia (D-PRD-04-6).
FT-PRD-04·H5 · CancelaciónP3API-02-028, API-02-057
FT-PRD-04·H6 · Cancelación automática del rechazoP1flujo «Si Compras rechaza y nadie corrige»
FT-PRD-04·H7 · Intercambiar placeholders con o9 por bucketsP2flujo «Placeholders de pre-compra con o9»; API-02-301

9. Decisiones de esta épica

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

  • D-PRD-04-1. La propuesta vive en el PIM (colección products de MS-02) desde que se guarda; el portal de catalogación sólo la muestra y la edita por la API v2. Por qué: Un solo sistema y un solo dueño del dato: si la propuesta se quedara en Entrada Única habría dos copias que reconciliar y dos máquinas de estados. Se apoya en ADR-12, PD-06.
  • D-PRD-04-2. Plazo de corrección de 60 días por omisión, configurable por negocio en el motor (workflow/config tipo DEADLINES), con recordatorio semanal. Al vencer, se cancela sola y libera sus EAN. Por qué: Hoy ningún sistema cancela solo y las propuestas muertas se acumulan; 60 días es el arranque que propone backend compartido y deja margen al proveedor. El valor final lo ratifica el negocio. Se apoya en PEN-211, DUD-24.
  • D-PRD-04-3. La revisión de Compras no cancela nunca: recuerda a los 15 días y a los 30 pasa la tarea a la cola de Gobierno de Producto para reasignarla. Por qué: Cancelar por inacción de Liverpool castigaría al proveedor; escalar hace visible el atraso sin perder la propuesta. Se apoya en DEC-24.
  • D-PRD-04-4. Todos los plazos los vigila un solo reloj en MS-02 que revisa las tareas abiertas y su vencimiento; los avisos los manda MS-14 por pantalla y correo. Por qué: Un solo lugar para plazos evita crons sueltos por sistema, como hoy en Entrada Única y P360. Se apoya en PEN-12, PD-29.
  • D-PRD-04-5. Al cancelar, los EAN se liberan en la misma transacción que el cambio de estado (identifier_registry es de MS-02). Por qué: Si la liberación fuera por evento, un fallo dejaría EAN bloqueados sin propuesta viva. Se apoya en ADR-12.
  • D-PRD-04-6. Un borrador vence a los 90 días sin actividad y el de pre-compra a los 300, con aviso 7 días antes; la depuración la hace FT-PRD-06. Por qué: Concilia la depuración de 30 días de hoy con la pre-compra de unos 9 meses que pidió el taller. Se apoya en RF-ALT-08.

Qué falta decidir

IDQué falta
DUD-24Confirmar si hoy algún proceso borra propuestas a los 30 días, para migrar su efecto.
PD-06Se cierra con ADR-12 cuando la TDA lo registre: la propuesta vive en el PIM.

También siguen abiertos: PEN-211, Ratificar con el negocio el plazo de corrección por negocio (aquí arranca en 60 días); PEN-12, Confirmar el canal y la frecuencia de los avisos al proveedor.

Fuentes

  1. [D] trazabilidad/features/FT-PRD-04-ciclo-de-vida-propuesta-proveedor.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.