226 lines
7.9 KiB
Markdown
226 lines
7.9 KiB
Markdown
# 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 porcentual
|
|
- `fixed_amount`: Monto fijo
|
|
- `free_shipping`: Envío gratis
|
|
- `free_product`: Producto gratis
|
|
|
|
### 2. Validación Zod (`src/modules/pricing/validation/pricing.schema.ts`)
|
|
|
|
Schemas completos para:
|
|
|
|
**Promociones:**
|
|
- `createPromotionSchema`: Creación con todas las opciones
|
|
- `updatePromotionSchema`: Actualización parcial
|
|
- `addPromotionProductsSchema`: Agregar productos
|
|
- `listPromotionsQuerySchema`: Filtros de listado
|
|
|
|
**Cupones:**
|
|
- `createCouponSchema`: Creación con opciones completas
|
|
- `updateCouponSchema`: Actualización parcial
|
|
- `generateBulkCouponsSchema`: Generación en lote
|
|
- `redeemCouponSchema`: Canje de cupón
|
|
- `validateCouponSchema`: Validación de código
|
|
- `reverseRedemptionSchema`: Reversión de canje
|
|
- `listCouponsQuerySchema`: Filtros de listado
|
|
|
|
**Motor de Precios:**
|
|
- `calculatePricesSchema`: Entrada para cálculo
|
|
- `lineItemSchema`: 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:view`
|
|
- `promotions:view`, `promotions:create`, `promotions:update`, `promotions:activate`, `promotions:delete`
|
|
- `coupons: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
|