← Arquitectura por épica

FT-INT-07 · Repoblamiento masivo de productos hacia la tienda

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-INT-07: 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-INT-07.json, generada con generar.py; la ficha de la épica es trazabilidad/features/FT-INT-07-repoblamiento-masivo-productos.md.

En 30 segundos

A veces hay que volver a mandar a la tienda productos que ya están publicados, para corregir el título, la clasificación web o el sitio, sin regresarlos al flujo. Esta épica hace el repoblamiento en masa con vista previa, resultado por producto con la evidencia de lo enviado y la posibilidad de revertir una corrida que salió mal. También atiende la tarea de Repoblamiento: mandar el producto a Compras, al proveedor o aprobarlo.

  • Módulo dueño: MS-02 Producto. También participan: MS-05 Auditoría, MS-08 Adaptadores de salida.
  • Etapa 9 · Modificación. Recibe «PE-9 · Publicado por canal» y entrega «PE-9 · Publicado por canal», «PE-10 · Cambio aprobado».
  • APIs: construye 3 y usa 9 que construyen otras épicas.
  • Eventos: publica 6 y consume 3.

1. Dónde encaja

Recibe

DeQué
PE-9 · Publicado por canalProductos ya publicados en la tienda, con su estado por canal y la versión que se mandó.
FT-RAC-03 · Publicación por rangos de score y revisión de calidad…Lo que QA encuentra mal en algo ya publicado y manda a Repoblamiento.
FT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…La tarea de Repoblamiento que abre la acción REQUEST_REPOPULATION y la vuelta a Aprobado que pide republicar.
FT-INT-01 · Publicación a e-commerceEl adaptador de la tienda que arma el XML sin categorías, sin OMS y sin Marketplace.
FT-CAT-02 · Publicación de categorías a la tiendaLas categorías ya publicadas en la tienda, para que un CatID nunca apunte a algo que no existe.
FT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y…La bitácora con el antes y el después de cada campo, que sostiene el rastro y la reversa.
FT-PLT-03 · Listas de valores y modelo canónico con equivalencias por…El código con su etiqueta o salida nueva (LOV_VALUE_CHANGED), para republicar con su vista previa (API-02-039, REPUBLISH) los productos publicados que lo usan.

Entrega

AQué
PE-9 · Publicado por canalCada producto de la corrida con su canal tienda Publicado o en Error, con su evidencia y sin cambiar su estado.
PE-10 · Cambio aprobadoEl producto que pasó la tarea de Repoblamiento vuelve a Aprobado y sus canales afectados pasan de Publicado a Enviado.
FT-CAT-06 · Agrupadores y corrección masiva de categorías con…El mecanismo de corrida con vista previa, resultado por producto y reversa, que usa la corrección masiva de categorías.

Cambios de estado que hace

TransiciónDe → aCuándo
T09Aprobado → En modificaciónAlguien cambia un producto aprobado.
T10En modificación → AprobadoEl cambio se aplica o se descarta.
C05Error → Enviado (por canal)Se republica.
C06Publicado → Enviado (por canal)Se aprueba un cambio.
C08Retirado → Enviado (por canal)Se republica.

Tareas que abre o cierra: Repoblamiento, Revisión del cambio, 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

Vista previa de una publicación
Confirmar un plan de Producto
y 6 más

PUBLICATION_REQUESTED
STATUS_CHANGED
y 1 más

PUBLICATION_REQUESTED

Foto del producto para publicar

Manda el XML en lotes de hasta 1,000…

Guarda cada XML enviado con su SHA-256

DELIVERY_RESULT

DELIVERY_RESULT

Historia de un objeto

bitácora

Repoblamiento

Entrada Única · Vendor Center

BFF del portal

★ MS-02 Producto

MS-05 Auditoría

MS-08 Adaptadores de salida

Base pim

Eventos

Archivos e imágenes

Tienda en línea

Contexto de FT-INT-07

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.

ArchivosTienda en líneaMS-08 Adaptadores de salidaEventosBase·pimMS-02 ProductoEntrada Única · Vendor CenterArchivosTienda en líneaMS-08 Adaptadores de salidaEventosBase·pimMS-02 ProductoEntrada Única · Vendor CenterRepoblamientoBFF1. Elige los productos publicados que va a repoblar2. Pide la vista previa de REPOPULATE para la tiendaPOST /api/v2/publications/plans3. Revisa qué se enviará y qué no, con su motivo4. Confirma la corridaPOST /api/v2/product-plans/{planId}/apply5. Crea el trabajo y fija la versión de cada producto6. Pide publicar a la tienda sin categoríasPUBLICATION_REQUESTED7. Entrega cada producto al adaptador de la tiendaPUBLICATION_REQUESTED8. Pide la foto del producto en esa versiónGET /internal/product/products/{id}/publication-snapshot?versio…9. Manda el XML en lotes de hasta 1,000 productos10. Guarda cada XML enviado con su SHA-25611. Devuelve el acuse de cada productoDELIVERY_RESULT12. Entrega los acuses del trabajoDELIVERY_RESULT13. Marca el canal tienda y el avance del trabajo14. Muestra el resultado, el CSV y la evidenciaGET /api/v2/publications/{jobId}RepoblamientoBFF
Flujo principal de FT-INT-07
Los pasos en texto
PasoDeAQué haceAPI o evento
1RepoblamientoEntrada Única · Vendor CenterElige los productos publicados que va a repoblar—
2Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Pide la vista previa de REPOPULATE para la tiendaAPI-02-039
3RepoblamientoEntrada Única · Vendor CenterRevisa qué se enviará y qué no, con su motivo—
4Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Confirma la corridaAPI-02-057
5MS-02 ProductoBase pimCrea el trabajo y fija la versión de cada producto—
6MS-02 ProductoEventosPide publicar a la tienda sin categoríascatalog.product.publication/PUBLICATION_REQUESTED
7EventosMS-08 Adaptadores de salidaEntrega cada producto al adaptador de la tiendacatalog.product.publication/PUBLICATION_REQUESTED
8MS-08 Adaptadores de salidaMS-02 ProductoPide la foto del producto en esa versiónAPI-02-054
9MS-08 Adaptadores de salidaTienda en líneaManda el XML en lotes de hasta 1,000 productos—
10MS-08 Adaptadores de salidaArchivos e imágenes (almacén y CDN)Guarda cada XML enviado con su SHA-256—
11MS-08 Adaptadores de salidaEventosDevuelve el acuse de cada productocatalog.delivery.result/DELIVERY_RESULT
12EventosMS-02 ProductoEntrega los acuses del trabajocatalog.delivery.result/DELIVERY_RESULT
13MS-02 ProductoBase pimMarca el canal tienda y el avance del trabajo—
14Entrada Única · Vendor CenterMS-02 Producto (por el BFF)Muestra el resultado, el CSV y la evidenciaAPI-02-040

3.1 La tarea de Repoblamiento

EventosEntrada Única · Vendor CenterBase·pimMS-02 ProductoEventosEntrada Única · Vendor CenterBase·pimMS-02 ProductoRepoblamientoBFF1. Abre Repoblamiento sobre un producto aprobado2. Abre su bandeja de Repoblamiento3. Pide sus productos asignadosGET /api/v2/task-queues/{cola}/my4. Pide el plan: a Compras, al proveedor o aprobarPOST /api/v2/workflow/actions/plans5. Confirma la decisiónPOST /api/v2/product-plans/{planId}/apply6. Regresa a Aprobado sólo con datos base y obligatorios7. Avisa el cambio de estadoSTATUS_CHANGED8. Pide republicar los canales afectadosPUBLICATION_REQUESTEDRepoblamientoBFF
La tarea de Repoblamiento

3.2 Archivo de repoblamiento: SKU, título y clasificación web

EventosMS-02 ProductoEntrada Única · Vendor CenterEventosMS-02 ProductoEntrada Única · Vendor CenterRepoblamientoBFF1. Sube el archivo con SKU, título y clasificación web2. Valida el archivo sin escribir nadaPOST /api/v2/product-imports3. Confirma: plancha sólo esos camposPOST /api/v2/product-imports/{id}/apply4. Pide la vista previa de REPOPULATE de lo importadoPOST /api/v2/publications/plans5. Pide la vista previa de SEND_CATIDS del mismo archivoPOST /api/v2/publications/plans6. Confirma los dos trabajosPOST /api/v2/product-plans/{planId}/apply7. Pide publicar el producto y aparte sus categoríasPUBLICATION_REQUESTEDRepoblamientoBFF
Archivo de repoblamiento: SKU, título y clasificación web

3.3 Revertir una corrida

EventosBase·pimMS-05 AuditoríaMS-02 ProductoEntrada Única · Vendor CenterEventosBase·pimMS-05 AuditoríaMS-02 ProductoEntrada Única · Vendor CenterRepoblamientoBFF1. Abre la corrida que bajó los productos visibles2. Pide el resultado y quién la lanzóGET /api/v2/publications/{jobId}3. Revisa el antes y el después por productoGET /api/v2/audit/entities/{entityType}/{entityId}/events4. Pide el plan de reversa de los campos planchadosPOST /api/v2/publications/{jobId}/revert/plans5. Confirma la reversaPOST /api/v2/product-plans/{planId}/apply6. Regresa los campos a su valor anterior7. Avisa los campos regresadosPRODUCT_UPDATED8. Pide republicar lo revertidoPUBLICATION_REQUESTEDRepoblamientoBFF
Revertir una corrida

4. Si algo sale mal

  • Un producto cambió entre la vista previa y la confirmación. Queda BLOCKED en el trabajo con el motivo y no se manda; los demás siguen. Repoblamiento pide otra vista previa para ese producto.
  • A un producto le falta nombre, plantilla, imagen principal congelada o SKU. No se envía y su motivo queda en la vista previa y en el CSV de resultado; la categoría web no se exige para repoblar.
  • La tienda no contesta o contesta algo que no se reconoce. El producto queda REVIEW en el trabajo y su canal en Error; no se reenvía solo y se republica con un trabajo nuevo. «Aceptado» sólo quiere decir que el destino leyó el mensaje.
  • La corrida baja los productos visibles. Se revierte con API-02-403: vuelven los valores anteriores de los campos planchados y se republica; lo que cambió después de la corrida no se toca y queda como conflicto para revisar a mano.
  • El universo es muy grande (cientos de miles de productos). La lista va en un archivo, el trabajo se parte en lotes de 1,000 productos por XML con un ritmo por destino configurable, y la vista previa dice cuántos lotes son y cuánto tardaría.

5. APIs

Las que construye esta épica (3)

POST /api/v2/publications/plans · Vista previa de una publicación
CampoValor
APIAPI-02-039 · MS-02 Producto
Para quéPrepara, sin enviar nada, una operación de publicación sobre productos ya aprobados y dice qué producto y qué canal saldría y cuál no, con su motivo: REPUBLISH (republicar), REPOPULATE (repoblar la tienda sin categorías ni cambio de estado), REPUBLISH_MARKETPLACE, SEND_CATIDS (sólo categorías de Sitios Web) y WITHDRAW (retirar de un canal). El universo se elige por lista de IDs (hasta 10,000), por una lista en archivo (hasta 2 millones), por un nodo de Sitios Web (sólo asignaciones directas) o por una carga masiva ya aplicada (importId). Se confirma con API-02-057, que crea el trabajo.
En esta épicaVista previa de REPOPULATE, REPUBLISH, REPUBLISH_MARKETPLACE, SEND_CATIDS y WITHDRAW
Quién la llamaBFF del portal
PermisoCategory, Admin, Repoblamiento, SoporteMKP y GlobalConfigurator (CF-FRU §8); WITHDRAW sólo Admin y Category; con el rol Repoblamiento, REPUBLISH no manda CatIDs
CabecerasAuthorization, X-Request-Id, Idempotency-Key
También la usanFT-CAT-05, FT-CAT-06, FT-INT-01, FT-PLT-03, FT-RAC-08

Request

{
  "operation": "REPOPULATE",
  "selection": {
    "productIds": [
      "PRD-0004812",
      "PRD-0004890"
    ]
  },
  "channels": [
    "TIENDA"
  ],
  "reason": "Corregir el título sin marca en la tienda"
}

Response · 200

{
  "success": true,
  "data": {
    "planId": "pln-r3p001",
    "expiresAt": "2026-10-18T16:40:00Z",
    "operation": "REPOPULATE",
    "channels": [
      "TIENDA"
    ],
    "includeCatIds": false,
    "includesOms": false,
    "includesMarketplace": false,
    "changesProductStatus": false,
    "summary": {
      "requested": 2,
      "eligible": 1,
      "notEligible": 1,
      "notFound": 0,
      "batches": 1
    },
    "items": [
      {
        "productId": "PRD-0004812",
        "sku": "1000004812",
        "business": "MER",
        "version": 9,
        "contentHash": "sha256:4f1d9a0c",
        "channels": [
          {
            "channel": "TIENDA",
            "sites": [
              "LIVERPOOL"
            ],
            "eligible": true
          }
        ]
      },
      {
        "productId": "PRD-0004890",
        "sku": "1000004890",
        "business": "MER",
        "version": 4,
        "channels": [
          {
            "channel": "TIENDA",
            "eligible": false,
            "reasons": [
              {
                "code": "MAIN_IMAGE_NOT_FROZEN",
                "message": "La variante VAR-0004890-01 no tiene imagen principal congelada"
              }
            ]
          }
        ]
      }
    ],
    "businessFingerprint": "MER:2",
    "applyUrl": "/api/v2/product-plans/pln-r3p001/apply"
  }
}

Errores

HTTPCódigoCuándo
400VALIDATION_ERRORLa selección viene vacía, trae más de 10,000 IDs sin lista en archivo, o SEND_CATIDS apunta a un nodo que no es de Sitios Web
403AUTHORIZATION_ERROREl rol de quien llama no tiene esa operación
422BUSINESS_ERRORREPOPULATE pide un canal que no es la tienda, o WITHDRAW pide un canal en el que el producto no está publicado
GET /api/v2/publications/{jobId} · Avance y resultado de un trabajo de publicación
CampoValor
APIAPI-02-040 · MS-02 Producto
Para quéDice cómo va una corrida de publicación o repoblamiento: quién la lanzó y por qué, cuántos productos van aceptados, en cola, fallidos, por revisar o bloqueados, el resultado de cada uno con la respuesta del destino, y dónde están el CSV de resultado y los XML enviados con su SHA-256. «Aceptado» quiere decir que el destino leyó el mensaje, no que ya se ve en la tienda.
En esta épicaAvance, resultado por producto, CSV y evidencia de la corrida
Quién la llamaBFF del portal
PermisoENT-L; el detalle de la evidencia, quien lanzó la corrida, Repoblamiento, Category y Admin
CabecerasAuthorization, X-Request-Id
ParámetrosjobId = job-9c1e, page = 1, size = 50

Request

null

Response · 200

{
  "success": true,
  "data": {
    "jobId": "job-9c1e",
    "operation": "REPOPULATE",
    "status": "DONE_WITH_ERRORS",
    "createdAt": "2026-10-18T16:12:00Z",
    "finishedAt": "2026-10-18T16:19:40Z",
    "requestedBy": {
      "userId": "usr-20931",
      "role": "Repoblamiento"
    },
    "reason": "Corregir el título sin marca en la tienda",
    "universe": {
      "source": "productIds",
      "count": 2
    },
    "channels": [
      "TIENDA"
    ],
    "progress": {
      "total": 2,
      "accepted": 1,
      "queued": 0,
      "failed": 0,
      "review": 0,
      "blocked": 1
    },
    "items": [
      {
        "productId": "PRD-0004812",
        "sku": "1000004812",
        "channel": "TIENDA",
        "version": 9,
        "result": "ACCEPTED",
        "attempt": 1,
        "destinationResponse": "Se procesó correctamente",
        "evidence": {
          "xmlRef": "evidencias/publicaciones/2026/10/18/job-9c1e-lote-001.xml",
          "sha256": "9f2c7e11a04b"
        }
      },
      {
        "productId": "PRD-0004890",
        "sku": "1000004890",
        "channel": "TIENDA",
        "version": 5,
        "result": "BLOCKED",
        "reason": "Cambió desde la vista previa (versión 4 a 5); no se envió"
      }
    ],
    "resultCsvRef": "evidencias/publicaciones/2026/10/18/job-9c1e-resultado.csv",
    "page": 1,
    "size": 50,
    "total": 2
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDEl trabajo no existe o quien llama no puede verlo
POST /api/v2/publications/{jobId}/revert/plans · Vista previa de la reversa de una corrida
CampoValor
APIAPI-02-403 · MS-02 Producto
Para quéPrepara la reversa de una corrida que salió mal: dice qué campos planchados regresan a su valor anterior en cada producto, cuáles no se pueden regresar porque cambiaron después, y qué se republicará. Se confirma con API-02-057.
En esta épicaVista previa de la reversa de una corrida
Quién la llamaBFF del portal
PermisoRepoblamiento, Category y Admin
CabecerasAuthorization, X-Request-Id, Idempotency-Key
ParámetrosjobId = job-77aa
También la usanFT-ARQ-02, FT-CAT-06

Request

{
  "reason": "La corrida bajó los productos visibles del seller",
  "scope": "FIELDS_CHANGED_BY_JOB"
}

Response · 200

{
  "success": true,
  "data": {
    "planId": "pln-rv0207",
    "expiresAt": "2026-10-18T17:00:00Z",
    "sourceJobId": "job-77aa",
    "summary": {
      "products": 1354,
      "revertible": 1340,
      "conflicts": 14
    },
    "sample": [
      {
        "productId": "PRD-0004812",
        "fields": [
          {
            "attribute": "CATEGORIA_WEB",
            "before": "catst000120",
            "after": "catst000123"
          }
        ],
        "conflict": false
      }
    ],
    "conflicts": [
      {
        "productId": "PRD-0004890",
        "reason": "Cambió después de la corrida (versión 6); se revisa a mano"
      }
    ],
    "thenRepublish": {
      "operation": "REPUBLISH",
      "channels": [
        "TIENDA"
      ],
      "includeCatIds": true
    },
    "applyUrl": "/api/v2/product-plans/pln-rv0207/apply"
  }
}

Errores

HTTPCódigoCuándo
404NOT_FOUNDLa corrida no existe
423LOCKEDLa corrida sigue en curso
422BUSINESS_ERRORLa corrida sólo reenvió y no planchó campos: no hay nada que revertir

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-057POST /api/v2/product-plans/{planId}/applyConfirmar la corrida, la decisión o la reversaFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-025GET /api/v2/product-receipts/{requestId}El recibo de la confirmación, con el ID del trabajoFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-054GET /internal/product/products/{id}/publication-snapshot?version=La foto del producto en la versión fijada por el trabajoFT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio
API-02-038GET /api/v2/task-queues/{cola}/myLa bandeja de RepoblamientoFT-PRD-06 · Bandeja de pendientes y depuración de borradores…
API-02-028POST /api/v2/workflow/actions/plansMandar a Compras, al proveedor con los rechazos por atributo juntos, o aprobarFT-FLU-01 · Motor de estados configurable con dos carreteras y reglas…
API-02-046POST /api/v2/product-importsValidar el archivo de SKU, título y clasificación web sin escribirFT-FLU-04 · Carga masiva de productos por archivo
API-02-047POST /api/v2/product-imports/{id}/applyConfirmar el archivo: plancha sólo esos camposFT-FLU-04 · Carga masiva de productos por archivo
API-05-001GET /api/v2/audit/entities/{entityType}/{entityId}/eventsEl antes y el después de cada campo de cada productoFT-ARQ-02 · Bitácora inmutable y versionado de producto, plantilla y…
API-02-043GET /api/v2/delivery-attempts?productId=&sku=&from=&to=La bitácora de envíos de cada productoFT-CAT-05 · Sitios, enrutamiento y visibilidad por negocio

6. Eventos

Publica

EventoCuándoQuién lo consume
catalog.product.publication/PUBLICATION_REQUESTEDCada producto de una corrida, una republicación por cambio aprobado o una reversaFT-CAT-05, FT-CAT-06, FT-INT-01, FT-INT-02, FT-INT-05, FT-PLT-08, FT-PRD-05, FT-RAC-03
catalog.product.changed/STATUS_CHANGEDRepoblamiento aprueba y el producto vuelve a AprobadoFT-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_CHANGEDSe abre o se cierra Repoblamiento, Revisión del cambio o CorrecciónFT-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/REJECTION_ADDEDRepoblamiento manda al proveedor con los rechazos por atributo juntosFT-PRD-04, FT-PRD-05, FT-PRD-10, FT-RAC-01, FT-RAC-03, FT-RAC-05, FT-RAC-06
catalog.product.changed/PRODUCT_UPDATEDLa reversa regresa los campos planchadosFT-ACT-05, FT-ARQ-02, FT-IA-01, FT-PLT-07, FT-PRD-05, FT-RAC-06
catalog.delivery.result/DELIVERY_RESULTMS-08 devuelve el acuse de la tienda por productoFT-ARQ-02, FT-CAT-02, FT-CAT-05, FT-CAT-06, FT-IA-05, FT-INT-01, FT-INT-02, FT-INT-05, FT-PRD-02, FT-PRD-10, FT-RAC-06

Consume

EventoPara quéQuién lo publica
catalog.product.publication/PUBLICATION_REQUESTEDMS-08 arma el XML de la tienda en lotesesta misma épica
catalog.delivery.result/DELIVERY_RESULTMS-02 marca el canal y el avance del trabajoesta misma épica
catalog.product.changed/REJECTION_ADDEDMS-14 avisa al proveedor qué corregiresta misma épica

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
product_jobsMS-02Trabajos asíncronos: cargas masivas de productos, edición masiva y publicación.escribe
product_delivery_statusMS-02El estado de publicación por producto y canal: Pendiente, Enviado, Publicado, Error o Retirado.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_versionsMS-02Foto numerada del producto en cada versión.lee
publication_rulesMS-02El mínimo que pide cada canal para publicar.lee

8. Historias que cubre

HistoriaPrioridadCómo la cubre
FT-INT-07·H1 · Repoblar sin mover el estadoP1pasos 2, 5, 6, 9; API-02-039
FT-INT-07·H2 · Vista previa y resultadoP1pasos 2, 3, 13, 14; API-02-040
FT-INT-07·H3 · Rastro y reversaP1flujo «Revertir una corrida»; API-02-403, API-05-001, API-02-043
FT-INT-07·H4 · Flujo de Repoblamiento (1031)P1flujo «La tarea de Repoblamiento»; API-02-038, API-02-028
FT-INT-07·H5 · Archivo de repoblamientoP2flujo «Archivo de repoblamiento: SKU, título y clasificación web»; API-02-046, API-02-047
FT-INT-07·H6 · Título al díaP2pasos 5, 8; API-02-054
FT-INT-07·H7 · VolumenP3pasos 9; API-02-039
FT-INT-07·H8 · Repoblar no es reenviarP2flujo «Archivo de repoblamiento: SKU, título y clasificación web»; API-02-039

9. Decisiones de esta épica

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

  • D-INT-07-1. Repoblar no mueve el estado ni cambia datos: reenvía a la tienda la versión aprobada vigente, sin categorías, sin OMS y sin Marketplace. Por qué: Es lo que hace Omega y lo que pide la operación de hoy; la duda de OMS (P360 repuebla con OMS, Omega no) se cierra sin OMS, porque OMS ya recibe los cambios aprobados por la publicación normal. Se apoya en PD-09, DUD-24.
  • D-INT-07-2. Repoblar y mandar categorías son dos operaciones: REPOPULATE (el producto sin categorías) y SEND_CATIDS (sólo categorías de Sitios Web, hasta 1,000 por XML y nunca vacío). El archivo de SKU, título y clasificación web plancha esos campos con la carga masiva y después lanza las dos. Por qué: Las fuentes chocan sobre qué viaja con el archivo; separarlas cumple las dos lecturas y evita mandar lo que no toca. Se apoya en DUD-24, RF-CAT-15.
  • D-INT-07-3. Una corrida es un trabajo de MS-02 (product_jobs) con universo, autor, fecha, motivo y la versión fijada de cada producto; cada envío queda en la bitácora con su XML y su SHA-256 en el almacén. Si un producto cambia después de la vista previa, queda bloqueado. Por qué: Saber qué cambió cada corrida y con qué datos es lo que faltó en la reversa de 3 días. Se apoya en RF-CAL-13, DMS-66.
  • D-INT-07-4. Revertir es regresar a su valor anterior los campos que la corrida planchó (tomados de las versiones del producto) y republicar; no se republica completa una versión vieja. Lo que cambió después de la corrida queda como conflicto para revisar a mano. Por qué: Republicar la versión previa entera borraría cambios buenos hechos después; regresar sólo lo planchado es preciso y se puede revisar. Se apoya en DUD-24, RF-CAL-13.
  • D-INT-07-5. Volumen: hasta 10,000 IDs en la petición o una lista en archivo de hasta 2 millones; lotes de 1,000 productos por XML y ritmo por destino configurable. Por qué: Omega limita a 100 productos por trabajo y el negocio necesita repoblar universos de 23 mil a 700 mil. Se apoya en DUD-24.
  • D-INT-07-6. La tarea de Repoblamiento la abre la acción REQUEST_REPOPULATION del motor (QA, Gobierno de Datos o Category) y pone En modificación un producto aprobado (T09). Mandar a Compras abre Revisión del cambio; mandar al proveedor abre Corrección con los rechazos por atributo juntos; aprobar regresa a Aprobado sólo con datos base y obligatorios (T10) y republica los canales afectados (C06). La tienda conserva lo publicado mientras tanto. Por qué: Es el 1031 de hoy, con sus tres salidas, en el modelo de tres capas. Se apoya en PD-29.
  • D-INT-07-7. La foto que lee el adaptador es siempre la de la versión fijada por el trabajo, que es la aprobada vigente al confirmar: un título recalculado y aprobado antes de confirmar viaja en esa corrida. Por qué: Repoblamiento necesita que el título corregido salga en la carga y aprobación de una hora después. Se apoya en DEC-86, RF-PLA-16.

Qué falta decidir

IDQué falta
DUD-24Qué viaja con el archivo, el SLA, la ventana y el volumen por corrida: Repoblamiento con Publicación y Category.
PD-09El canal de salida a la tienda sin broker; el trabajo no cambia si cambia el adaptador.
PD-10Si el broker se queda en el primer corte (ADR-07, 13-nov).

Fuentes

  1. [D] trazabilidad/features/FT-INT-07-repoblamiento-masivo-productos.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.