7.9 KiB
Sprint 4: Motor de Precios - Resumen
Objetivo
Implementar el motor de precios completo para el vertical de Retail, incluyendo gestión de promociones, cupones y cálculo dinámico de precios.
Componentes Implementados
1. Servicios
PriceEngineService (src/modules/pricing/services/price-engine.service.ts)
Motor central de cálculo de precios con las siguientes capacidades:
-
calculatePrices(): Calcula precios para un conjunto de líneas de pedido
- Aplica promociones automáticas activas
- Soporta múltiples tipos de promoción
- Gestiona stackability (promociones acumulables)
- Aplica cupones si se proporciona código
-
getActivePromotions(): Obtiene promociones activas para sucursal/canal
-
applyCoupon(): Aplica un cupón al resultado de precios
-
validateCoupon(): Valida un código de cupón sin aplicarlo
Tipos de Promoción Soportados:
| Tipo | Descripción |
|---|---|
percentage_discount |
Descuento porcentual |
fixed_discount |
Descuento de monto fijo |
buy_x_get_y |
Compra X, lleva Y |
bundle |
Precio especial por paquete |
flash_sale |
Venta relámpago |
quantity_discount |
Descuento por volumen |
free_shipping |
Envío gratis |
gift_with_purchase |
Regalo con compra |
PromotionService (src/modules/pricing/services/promotion.service.ts)
Servicio CRUD para gestión de promociones:
- createPromotion(): Crear promoción con validación de código único
- updatePromotion(): Actualizar promoción (solo en estado draft/scheduled)
- listPromotions(): Listar con filtros paginados
- activatePromotion(): Activar promoción
- pausePromotion(): Pausar promoción activa
- endPromotion(): Finalizar promoción
- cancelPromotion(): Cancelar promoción
- addProducts(): Agregar productos a promoción
- removeProduct(): Remover producto de promoción
- updatePromotionStatuses(): Actualizar estados automáticamente según fechas
Flujo de Estados:
draft → scheduled → active → ended
↓
paused
↓
cancelled
CouponService (src/modules/pricing/services/coupon.service.ts)
Servicio completo para gestión de cupones:
- createCoupon(): Crear cupón individual
- generateBulkCoupons(): Generar cupones en lote (hasta 1000)
- updateCoupon(): Actualizar cupón
- activateCoupon(): Activar cupón
- deactivateCoupon(): Desactivar cupón
- redeemCoupon(): Canjear cupón con validación completa
- reverseRedemption(): Revertir un canje (devolución)
- getRedemptionHistory(): Historial de canjes paginado
- getCouponStats(): Estadísticas del cupón
Tipos de Cupón:
percentage: Descuento porcentualfixed_amount: Monto fijofree_shipping: Envío gratisfree_product: Producto gratis
2. Validación Zod (src/modules/pricing/validation/pricing.schema.ts)
Schemas completos para:
Promociones:
createPromotionSchema: Creación con todas las opcionesupdatePromotionSchema: Actualización parcialaddPromotionProductsSchema: Agregar productoslistPromotionsQuerySchema: Filtros de listado
Cupones:
createCouponSchema: Creación con opciones completasupdateCouponSchema: Actualización parcialgenerateBulkCouponsSchema: Generación en loteredeemCouponSchema: Canje de cupónvalidateCouponSchema: Validación de códigoreverseRedemptionSchema: Reversión de canjelistCouponsQuerySchema: Filtros de listado
Motor de Precios:
calculatePricesSchema: Entrada para cálculolineItemSchema: Línea de producto
3. Controladores (src/modules/pricing/controllers/pricing.controller.ts)
Endpoints del Motor de Precios (3):
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/pricing/calculate |
Calcular precios |
| POST | /api/pricing/validate-coupon |
Validar cupón |
| GET | /api/pricing/active-promotions |
Promociones activas |
Endpoints de Promociones (11):
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/pricing/promotions |
Listar promociones |
| GET | /api/pricing/promotions/:id |
Obtener promoción |
| POST | /api/pricing/promotions |
Crear promoción |
| PUT | /api/pricing/promotions/:id |
Actualizar promoción |
| POST | /api/pricing/promotions/:id/activate |
Activar |
| POST | /api/pricing/promotions/:id/pause |
Pausar |
| POST | /api/pricing/promotions/:id/end |
Finalizar |
| POST | /api/pricing/promotions/:id/cancel |
Cancelar |
| POST | /api/pricing/promotions/:id/products |
Agregar productos |
| DELETE | /api/pricing/promotions/:id/products/:productId |
Remover producto |
| DELETE | /api/pricing/promotions/:id |
Eliminar (soft) |
Endpoints de Cupones (14):
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/pricing/coupons |
Listar cupones |
| GET | /api/pricing/coupons/:id |
Obtener cupón |
| GET | /api/pricing/coupons/code/:code |
Obtener por código |
| POST | /api/pricing/coupons |
Crear cupón |
| POST | /api/pricing/coupons/bulk |
Generar lote |
| PUT | /api/pricing/coupons/:id |
Actualizar cupón |
| POST | /api/pricing/coupons/:id/activate |
Activar |
| POST | /api/pricing/coupons/:id/deactivate |
Desactivar |
| POST | /api/pricing/coupons/:id/redeem |
Canjear por ID |
| POST | /api/pricing/coupons/redeem |
Canjear por código |
| POST | /api/pricing/coupons/redemptions/:id/reverse |
Revertir canje |
| GET | /api/pricing/coupons/:id/redemptions |
Historial canjes |
| GET | /api/pricing/coupons/:id/stats |
Estadísticas |
| DELETE | /api/pricing/coupons/:id |
Eliminar (soft) |
Total: 28 endpoints
4. Rutas (src/modules/pricing/routes/pricing.routes.ts)
Configuración de rutas con:
- Autenticación JWT requerida
- Middleware de sucursal donde aplica
- Validación Zod de entrada
- Control de permisos granular
Permisos Requeridos:
pricing:calculate,pricing:validate,pricing:viewpromotions:view,promotions:create,promotions:update,promotions:activate,promotions:deletecoupons:view,coupons:create,coupons:update,coupons:activate,coupons:redeem,coupons:reverse,coupons:delete
Características Destacadas
Restricciones de Promociones
- Por fechas (inicio/fin)
- Por días de la semana
- Por horarios específicos
- Por monto mínimo de orden
- Por cantidad mínima de productos
- Por categorías incluidas/excluidas
- Por productos excluidos
- Por sucursales específicas
- Por niveles de cliente
- Solo nuevos clientes
- Solo miembros de lealtad
Stackability (Acumulabilidad)
- Promociones pueden ser acumulables o exclusivas
- Lista de promociones con las que puede combinarse
- Prioridad numérica para resolver conflictos
Tracking de Cupones
- Límite de usos totales
- Límite de usos por cliente
- Tracking de canjes con orden y canal
- Posibilidad de reversión con razón
Estructura de Archivos
src/modules/pricing/
├── controllers/
│ ├── index.ts
│ └── pricing.controller.ts
├── entities/
│ ├── index.ts
│ ├── promotion.entity.ts
│ ├── promotion-product.entity.ts
│ ├── coupon.entity.ts
│ └── coupon-redemption.entity.ts
├── routes/
│ ├── index.ts
│ └── pricing.routes.ts
├── services/
│ ├── index.ts
│ ├── price-engine.service.ts
│ ├── promotion.service.ts
│ └── coupon.service.ts
├── validation/
│ ├── index.ts
│ └── pricing.schema.ts
└── index.ts
Dependencias
- TypeORM 0.3.x
- Zod para validación
- Express para routing
- Entidades existentes: Promotion, Coupon, PromotionProduct, CouponRedemption
Próximos Pasos
El Sprint 5 cubrirá CFDI/Facturación según el roadmap:
- Integración con PAC para timbrado
- Generación de XML CFDI 4.0
- Cancelación de facturas
- Notas de crédito