Anexo C. Catálogo de eventos
| Tópico | Clave | Tipo | Productor | Consumidores | Eventos |
|---|---|---|---|---|---|
raw.erp.changes |
Tabla y llave | Crudo, 7 días | erp-adapter | erp-adapter | Cambios sin traducir |
raw.wms.changes |
SKU y ubicación | Crudo, 7 días | wms-adapter | wms-adapter | Cambios sin traducir |
andes.catalog.products.v1 |
sku |
Estado, compactado | erp-adapter | pricing, order, inventory | ProductChanged |
andes.pricing.prices.v1 |
sku|channel|priceList |
Estado, compactado | erp-adapter | pricing, order | PriceChanged |
andes.inventory.stock-levels.v1 |
sku|locationId |
Estado, compactado | wms-adapter | inventory | StockLevelChanged |
andes.sources.sync.v1 |
system |
Estado, compactado | erp-adapter, wms-adapter | pricing, inventory | SourceSynced: hasta dónde está al día cada sistema de origen |
andes.inventory.reservations.v1 |
orderId |
Hechos, 14 días | inventory | order | StockReserved, ReservationConfirmed, ReservationReleased, ReservationExpired |
andes.orders.events.v1 |
orderId |
Hechos, 30 días | order | webhook, oms-adapter, crm-adapter (después del MVP; no existe todavía) | OrderCreated, OrderConfirmed, OrderCancelled, OrderDispatched, OrderDelivered |
andes.payments.commands.v1 |
orderId |
Comandos, 7 días | order | payment | PaymentRequested, RefundRequested |
andes.payments.events.v1 |
orderId |
Hechos, 30 días | payment | order, webhook | PaymentApproved, PaymentRejected, PaymentRefunded |
andes.oms.commands.v1 |
orderId |
Comandos, 7 días | order | oms-adapter | CreateOmsOrder, CancelOmsOrder |
andes.oms.events.v1 |
orderId |
Hechos, 14 días | oms-adapter | order | OmsOrderCreated, OmsOrderFailed |
andes.fulfillment.events.v1 |
orderId |
Hechos, 30 días | wms-adapter | order, inventory | DispatchStarted, DeliveryConfirmed |
andes.audit.v1 |
correlationId |
Hechos, archivo permanente | Todos | Archivo de auditoría | Registro de auditoría |
Además, cada grupo consumidor de un tópico de hechos o de comandos tiene su <tópico>.<grupo>.retry y su <tópico>.<grupo>.dlq (11 pares). Particiones, réplicas, limpieza y retención de los 36 tópicos se declaran en el contrato AsyncAPI y de ahí se crean (ADR-017).
Dimensionamiento inicial: 12 particiones para los tópicos de estado de stock y precio, 6 para órdenes, pagos y despacho, 3 para comandos y crudos. Factor de replicación 3, min.insync.replicas 2, productores con acks=all e idempotencia activada.
Eventos que salen a los partners por webhook:
| Requisito del enunciado | Tipo del evento |
|---|---|
| Orden confirmada | com.andesretail.order.confirmed.v1 |
| Pago aprobado | com.andesretail.payment.approved.v1 |
| Pago rechazado | com.andesretail.payment.rejected.v1 |
| Despacho iniciado | com.andesretail.fulfillment.dispatch-started.v1 |
| Entrega confirmada | com.andesretail.fulfillment.delivered.v1 |
| Orden cancelada (adicional) | com.andesretail.order.cancelled.v1 |
Ejemplo de webhook:
POST /andes/webhooks HTTP/1.1
Host: partner.example.com
Content-Type: application/cloudevents+json
X-Andes-Event-Id: evt_01JC8ZD3K7
X-Andes-Signature: t=1794334000,v1=5d41402abc4b2a76b9719d911017c592...
{
"specversion": "1.0",
"id": "evt_01JC8ZD3K7",
"type": "com.andesretail.order.confirmed.v1",
"source": "/order-service",
"subject": "ord_01JC8ZB7Q2X9",
"time": "2026-11-10T18:05:12Z",
"datacontenttype": "application/json",
"correlationid": "5e1d0c7a-93b2-4c41-8d0e-6a7f2b9c3d15",
"data": {
"orderId": "ord_01JC8ZB7Q2X9",
"externalOrderId": "MKP-778899",
"status": "CONFIRMED"
}
}
La firma es HMAC-SHA256 (HMAC: firma con secreto compartido que permite verificar origen e integridad; SHA-256: el algoritmo de resumen criptográfico que usa) de t + "." + cuerpo con el secreto de la suscripción; el partner debe rechazar marcas de tiempo de más de 5 minutos. El partner responde 2xx en menos de 5 segundos o cuenta como fallo. La entrega es al menos una vez y el partner deduplica por id.