Vista general de arquitectura
4. Arquitectura de la Solución
4.4 Visión General de la Arquitectura
📨 Especificación de Tópicos del Message Broker
Para la comunicación asíncrona entre SPPD y Power Street, se utilizarán los siguientes tópicos en el Message Broker:
📌 Tópico: commercial.events.v1
- Productor Principal: SPPD
- Consumidor Principal: Power Street
- Propósito: Transportar mensajes que indican creaciones, actualizaciones o bajas para diferentes entidades comerciales:
- Productos
- Listas de precios
- Precios especiales
- Promociones
- Formato de Mensaje: JSON
Cada mensaje incluirá un campoeventTypepara distinguir la naturaleza del evento. - Estrategia de Particionamiento:
Por identificador de entidad principal afectada:
productId,priceListId,promotionId, etc.
Esto asegura procesamiento ordenado por entidad. - Retención: Según necesidades (ej. 7 días)
- Versionamiento:
.v1
📌 Tópico: commercial.responses.v1
- Productor Principal: Power Street
- Consumidor Principal: SPPD (Módulo de Integración)
- Propósito: Transportar acuses de recibo y resultados del procesamiento (éxito o error) de cada evento comercial.
- Formato de Mensaje: JSON
Incluye eltransactionIdoriginal yeventTypeResponsesi es necesario. - Estrategia de Particionamiento: Por
transactionId - Retención: Similar al tópico de eventos
- Versionamiento:
.v1
4.3. 📦 Estructura y Ejemplos de Mensajes
Se mantienen los ejemplos de mensajes para producto y se utilizan los ejemplos detallados previamente para:
PRICE_LIST_UPDATESPECIAL_PRICE_CREATEPROMOTION_CREATE
Es crucial que el
payloaddePROMOTION_CREATEsea lo suficientemente flexible o tipado para representar todos los tipos de promoción especificados en las historias de usuario (HU), incluyendo:
- Descuentos en cascada
- Descuentos por volumen
- Bonificaciones
- Promociones tipo Rappel
- Restricciones de venta
🏷️ Campo Clave en Mensajes de commercial.events.v1
eventType (string)
Identifica la naturaleza del evento. Ejemplos posibles:
📦 Tipos de eventType usados en commercial.events.v1
| Entidad Comercial | Tipos de eventType |
|---|---|
| Producto | PRODUCT_CREATEPRODUCT_UPDATEPRODUCT_DEACTIVATE |
| Lista de Precios | PRICE_LIST_CREATEPRICE_LIST_UPDATEPRICE_LIST_DELETE |
| Precio Especial | SPECIAL_PRICE_CREATESPECIAL_PRICE_UPDATESPECIAL_PRICE_DELETE |
| Reglas de Descuento (%) | DISCOUNT_RULE_CREATEDISCOUNT_RULE_UPDATEDISCOUNT_RULE_DELETE |
| Promociones | PROMOTION_CREATEPROMOTION_UPDATEPROMOTION_DELETE |
| Restricciones de Venta | SALE_RESTRICTION_SETSALE_RESTRICTION_REMOVE |
🧪 Ejemplos de Mensajes (Formato JSON)
✅ eventType: CREATE_PRODUCT
{
"transactionId": "TXN_SPPD_20250530_00001",
"systemOrigin": "SPPD",
"operationType": "CREATE_PRODUCT",
"retryAttempt": 1,
"timestamp": "2025-05-30T10:00:00Z",
"payload": {
"internalProductId": "SPPD_PROD_A456",
"sku": "SKU_XYZ_001",
"name": "Nuevo Producto de Ejemplo",
"description": "Este es un producto de alta calidad con características innovadoras.",
"price": 99.99,
"currency": "MXN",
"category": "Electrónicos de Consumo",
"stock": 100,
"attributes": {
"color": "Negro",
"material": "Aluminio",
"peso_kg": 0.5
},
"isActive": true,
"dimensions": {
"alto_cm": 10,
"ancho_cm": 5,
"profundidad_cm": 2
},
"tags": ["nuevo", "electronico", "oferta_lanzamiento"]
},
"metadata": {
"userId": "admin_sppd",
"sourceSystemVersion": "SPPD_v2.1"
}
}
✅ eventType: UPDATE_PRODUCT
{
"transactionId": "TXN_SPPD_20250530_00002",
"systemOrigin": "SPPD",
"operationType": "UPDATE_PRODUCT",
"retryAttempt": 1,
"timestamp": "2025-05-30T10:05:00Z",
"payload": {
"internalProductId": "SPPD_PROD_B789", // ID del producto a actualizar
"name": "Producto Existente - Nombre Actualizado", // Campo actualizado
"price": 149.50, // Campo actualizado
"stock": 75, // Campo actualizado
"attributes": { // Atributos pueden ser actualizados parcial o totalmente
"color": "Plata"
},
"isActive": true
// Solo se envían los campos que cambian o el payload completo según la estrategia de actualización
},
"metadata": {
"userId": "editor_sppd_03",
"changeReason": "Ajuste de precio por promoción"
}
}
✅ eventType: DEACTIVATE_PRODUCT
{
"transactionId": "TXN_SPPD_20250530_00003",
"systemOrigin": "SPPD",
"operationType": "DEACTIVATE_PRODUCT", // Podría ser DELETE_PRODUCT si es eliminación física
"retryAttempt": 1,
"timestamp": "2025-05-30T10:10:00Z",
"payload": {
"internalProductId": "SPPD_PROD_C101",
"isActive": false // Marcando el producto como inactivo
},
"metadata": {
"userId": "supervisor_sppd",
"deactivationReason": "Producto descontinuado"
}
}
✅ eventType: PRICE_LIST_UPDATE
{
"transactionId": "TXN_SPPD_20250530_00101",
"systemOrigin": "SPPD",
"operationType": "UPDATE",
"eventType": "PRICE_LIST_UPDATE",
"retryAttempt": 1,
"timestamp": "2025-05-30T11:00:00Z",
"payload": {
"priceListId": "PL_BASE_MXN_2025",
"name": "Lista de Precios Base MXN 2025",
"currency": "MXN",
"validFrom": "2025-01-01T00:00:00Z",
"validTo": "2025-12-31T23:59:59Z",
"items": [
{"sku": "SKU_XYZ_001", "price": 105.50},
{"sku": "SKU_ABC_002", "price": 75.00}
],
"conditions": {
"customerSegment": "GENERAL"
}
},
"metadata": {
"userId": "comercial_mgr_01"
}
}
✅ eventType: SPECIAL_PRICE_CREATE
{
"transactionId": "TXN_SPPD_20250530_00102",
"systemOrigin": "SPPD",
"operationType": "CREATE",
"eventType": "SPECIAL_PRICE_CREATE",
"retryAttempt": 1,
"timestamp": "2025-05-30T11:05:00Z",
"payload": {
"specialPriceId": "SP_CLIENTE_VIP_001",
"priceListIdToOverride": "PL_BASE_MXN_2025",
"customerIdentifier": "CLIENT_ID_12345",
"sku": "SKU_XYZ_001",
"specialPrice": 195.00,
"currency": "MXN",
"validFrom": "2025-06-01T00:00:00Z",
"validTo": "2025-08-31T23:59:59Z",
"conditions": ["volumen_minimo_10_unidades"]
},
"metadata": {
"userId": "ventas_coord_02"
}
}
✅ eventType: PROMOTION_CREATE
{
"transactionId": "TXN_SPPD_20250530_00103",
"systemOrigin": "SPPD",
"operationType": "CREATE",
"eventType": "PROMOTION_CREATE",
"retryAttempt": 1,
"timestamp": "2025-05-30T11:10:00Z",
"payload": {
"promotionId": "PROMO_VERANO_001",
"name": "Descuento Verano Electrónicos",
"type": "PERCENTAGE_OFF",
"description": "15% de descuento en electrónicos seleccionados.",
"value": 15,
"validFrom": "2025-07-01T00:00:00Z",
"validTo": "2025-07-31T23:59:59Z",
"conditions": {
"appliesTo": "SPECIFIC_SKUS",
"skuList": ["SKU_XYZ_001", "SKU_XYZ_005"],
"customerSegment": "ALL",
"minimumQuantity": 1
},
"restrictions": [
{
"type": "EXCLUDE_ZONE",
"value": "ZONA_NORTE_FRONTERA"
}
],
"priority": 10
},
"metadata": {
"userId": "mktg_promo_01"
}
}