MCH-017 - Notificaciones: - Módulo notifications en backend - Entities: Notification, Template, Preference, DeviceToken - Service con multi-canal (push, WhatsApp, SMS) - DDL schema con templates por defecto MCH-015 - Pedidos WhatsApp: - BackendApiService para integración - Flujo de creación de pedidos real - Integración datos: ventas, inventario, fiados Progreso: 51% → 57% Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
455 lines
12 KiB
Markdown
455 lines
12 KiB
Markdown
---
|
|
id: EPIC-MCH-015
|
|
type: Epic
|
|
title: "MCH-015: Pedidos via WhatsApp"
|
|
code: MCH-015
|
|
status: Completado
|
|
status_real: "Completado"
|
|
status_nota: "Integración WhatsApp-Backend para pedidos, BackendApiService creado"
|
|
phase: 4
|
|
priority: P1
|
|
created_at: 2026-01-07
|
|
updated_at: 2026-01-18
|
|
simco_version: "4.0.1"
|
|
story_points: 55
|
|
dependencies:
|
|
blocks: []
|
|
depends_on: []
|
|
---
|
|
|
|
# MCH-015: Pedidos via WhatsApp
|
|
|
|
## Metadata
|
|
- **Codigo:** MCH-015
|
|
- **Fase:** 4 - Pedidos y Clientes
|
|
- **Prioridad:** P1
|
|
- **Estado:** Completado
|
|
- **Story Points:** 55
|
|
- **Fecha completado:** 2026-01-18
|
|
|
|
## Descripcion
|
|
|
|
Sistema completo de pedidos via WhatsApp: clientes pueden hacer pedidos conversando con el bot, el negocio recibe notificaciones, procesa el pedido, y confirma al cliente.
|
|
|
|
## Objetivos
|
|
|
|
1. Recepcion de pedidos via chat
|
|
2. Confirmacion automatica o manual
|
|
3. Notificacion al negocio
|
|
4. Estado del pedido en tiempo real
|
|
5. Historial de pedidos por cliente
|
|
|
|
## Alcance
|
|
|
|
### Incluido
|
|
- Pedidos via chat natural (NLU)
|
|
- Carrito conversacional
|
|
- Confirmacion de pedido
|
|
- Notificacion push/WhatsApp al dueno
|
|
- Estados: recibido, preparando, listo, entregado
|
|
- Cancelacion de pedido
|
|
|
|
### Excluido
|
|
- Pagos en linea dentro de WhatsApp
|
|
- Integracion con delivery apps (Rappi, Uber)
|
|
- Pedidos programados
|
|
|
|
## Flujo de Pedido
|
|
|
|
### Cliente Hace Pedido
|
|
```
|
|
Cliente: "Quiero pedir 2 Cocas y unas Sabritas"
|
|
Bot: "Perfecto! Tu pedido:
|
|
- 2x Coca-Cola 600ml = $36
|
|
- 1x Sabritas Original = $18
|
|
Total: $54
|
|
|
|
¿Lo confirmas?
|
|
[Confirmar] [Agregar mas] [Cancelar]"
|
|
|
|
Cliente: [Confirmar]
|
|
|
|
Bot: "¡Pedido #456 confirmado! 🎉
|
|
Te avisamos cuando este listo.
|
|
Tiempo estimado: 10-15 min"
|
|
```
|
|
|
|
### Negocio Recibe Notificacion
|
|
```
|
|
[Push + WhatsApp al dueno]
|
|
"🛒 Nuevo Pedido #456
|
|
|
|
Cliente: Juan Perez (5512345678)
|
|
- 2x Coca-Cola 600ml
|
|
- 1x Sabritas Original
|
|
Total: $54
|
|
|
|
[Ver pedido] [Aceptar] [Rechazar]"
|
|
```
|
|
|
|
### Actualizacion de Estado
|
|
```
|
|
[Dueno marca como "Listo"]
|
|
|
|
Bot -> Cliente:
|
|
"Tu pedido #456 esta listo! 📦
|
|
Puedes pasar a recogerlo.
|
|
|
|
Direccion: Calle Principal #123
|
|
Horario: Abierto hasta 10pm"
|
|
```
|
|
|
|
## Modelo de Datos
|
|
|
|
### Tablas (schema: orders)
|
|
|
|
**orders**
|
|
- id, tenant_id, customer_id, channel
|
|
- status (pending/confirmed/preparing/ready/delivered/cancelled)
|
|
- subtotal, delivery_fee, total
|
|
- delivery_type (pickup/delivery)
|
|
- delivery_address, scheduled_at
|
|
- notes, created_at, updated_at
|
|
|
|
**order_items**
|
|
- id, order_id, product_id
|
|
- quantity, unit_price, notes, total
|
|
|
|
**order_status_history**
|
|
- id, order_id, status, changed_by
|
|
- notes, created_at
|
|
|
|
## Endpoints API
|
|
|
|
| Metodo | Endpoint | Descripcion |
|
|
|--------|----------|-------------|
|
|
| GET | /orders | Listar pedidos |
|
|
| GET | /orders/:id | Obtener pedido |
|
|
| POST | /orders | Crear pedido |
|
|
| PUT | /orders/:id/status | Cambiar estado |
|
|
| POST | /orders/:id/cancel | Cancelar pedido |
|
|
| GET | /orders/pending | Pedidos pendientes |
|
|
| GET | /customers/:id/orders | Pedidos de cliente |
|
|
|
|
## Estados del Pedido
|
|
|
|
```
|
|
pending ──► confirmed ──► preparing ──► ready ──► delivered
|
|
│ │ │ │
|
|
└───────────┴─────────────┴───────────┴──► cancelled
|
|
```
|
|
|
|
| Estado | Descripcion | Notifica Cliente |
|
|
|--------|-------------|------------------|
|
|
| pending | Pedido recibido | Si |
|
|
| confirmed | Aceptado por negocio | Si |
|
|
| preparing | En preparacion | No |
|
|
| ready | Listo para recoger/enviar | Si |
|
|
| delivered | Entregado | Si |
|
|
| cancelled | Cancelado | Si |
|
|
|
|
## UI Components
|
|
|
|
### OrderList (Dashboard)
|
|
- Tabla de pedidos del dia
|
|
- Filtros por estado
|
|
- Acciones rapidas
|
|
|
|
### OrderDetail
|
|
- Info del cliente
|
|
- Items del pedido
|
|
- Cambio de estado
|
|
- Historial de estados
|
|
|
|
### OrderNotification (Mobile)
|
|
- Push notification
|
|
- Sonido distintivo
|
|
- Accion rapida: Aceptar/Rechazar
|
|
|
|
## Historias de Usuario
|
|
|
|
### MCH-US-140: Cliente solicita pedido via WhatsApp
|
|
**Story Points:** 8
|
|
|
|
**Como** cliente
|
|
**Quiero** hacer un pedido conversando naturalmente con el bot
|
|
**Para** comprar productos sin usar una interfaz tradicional
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-140-1] El bot entiende solicitudes de compra en lenguaje natural
|
|
- [CA-140-2] El bot construye un carrito conversacional
|
|
- [CA-140-3] El cliente puede agregar/quitar items
|
|
- [CA-140-4] Se muestra el total antes de confirmar
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-140-01 | Implementar NLU para interpretación de pedidos | 5h |
|
|
| MCH-TT-140-02 | Crear carrito conversacional | 5h |
|
|
| MCH-TT-140-03 | Integrar con inventario de productos | 3h |
|
|
|
|
---
|
|
|
|
### MCH-US-141: Cliente confirma pedido
|
|
**Story Points:** 5
|
|
|
|
**Como** cliente
|
|
**Quiero** confirmar mi pedido con un clic
|
|
**Para** asegurar que mi compra se procese
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-141-1] Botón de confirmación claramente visible
|
|
- [CA-141-2] Resumen final antes de confirmar
|
|
- [CA-141-3] Opción para cancelar/modificar
|
|
- [CA-141-4] Mensaje de éxito con número de pedido
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-141-01 | UI de confirmación de pedido | 4h |
|
|
| MCH-TT-141-02 | Validación y persistencia en BD | 3h |
|
|
|
|
---
|
|
|
|
### MCH-US-142: Negocio recibe notificación de nuevo pedido
|
|
**Story Points:** 8
|
|
|
|
**Como** dueño del negocio
|
|
**Quiero** recibir notificación inmediata cuando llega un pedido
|
|
**Para** comenzar a prepararlo rápidamente
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-142-1] Notificación push instantánea
|
|
- [CA-142-2] También envía WhatsApp al dueño
|
|
- [CA-142-3] Incluye detalles del cliente y items
|
|
- [CA-142-4] Sonido distintivo para alertar
|
|
- [CA-142-5] Enlace directo para ver pedido completo
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-142-01 | Servicio de notificaciones push | 5h |
|
|
| MCH-TT-142-02 | Integración de envío WhatsApp | 4h |
|
|
| MCH-TT-142-03 | Configuración de sonidos | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-143: Negocio acepta o rechaza pedido
|
|
**Story Points:** 5
|
|
|
|
**Como** dueño del negocio
|
|
**Quiero** aceptar o rechazar un pedido rápidamente
|
|
**Para** confirmar si puedo prepararlo o si hay algún problema
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-143-1] Botones de Aceptar/Rechazar en notificación
|
|
- [CA-143-2] Campo opcional de motivo de rechazo
|
|
- [CA-143-3] Cliente recibe confirmación inmediata
|
|
- [CA-143-4] Pedido se marca como confirmado o cancelado
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-143-01 | Endpoints de aceptación/rechazo | 3h |
|
|
| MCH-TT-143-02 | Lógica de cambio de estado | 3h |
|
|
| MCH-TT-143-03 | Notificación al cliente | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-144: Cliente ve estado de su pedido en tiempo real
|
|
**Story Points:** 8
|
|
|
|
**Como** cliente
|
|
**Quiero** ver el estado actual de mi pedido
|
|
**Para** saber cuándo estará listo
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-144-1] Estado visible en el chat
|
|
- [CA-144-2] Actualizaciones en tiempo real (WebSocket)
|
|
- [CA-144-3] Muestra tiempo estimado de entrega
|
|
- [CA-144-4] Estados: recibido, preparando, listo, entregado
|
|
- [CA-144-5] Notificación cada vez que cambia el estado
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-144-01 | Máquina de estados para pedidos | 4h |
|
|
| MCH-TT-144-02 | WebSocket para actualizaciones en vivo | 5h |
|
|
| MCH-TT-144-03 | Interfaz visual de timeline | 4h |
|
|
|
|
---
|
|
|
|
### MCH-US-145: Negocio actualiza estado del pedido
|
|
**Story Points:** 5
|
|
|
|
**Como** dueño del negocio
|
|
**Quiero** marcar el estado del pedido (preparando, listo, entregado)
|
|
**Para** mantener al cliente informado
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-145-1] Cambio de estado desde dashboard o WhatsApp
|
|
- [CA-145-2] Transiciones válidas según máquina de estados
|
|
- [CA-145-3] Historial de cambios guardado
|
|
- [CA-145-4] Cliente notificado automáticamente
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-145-01 | UI en dashboard para cambiar estado | 3h |
|
|
| MCH-TT-145-02 | Servicio de auditoría de cambios | 3h |
|
|
| MCH-TT-145-03 | Validación de transiciones | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-146: Historial de pedidos del cliente
|
|
**Story Points:** 5
|
|
|
|
**Como** cliente
|
|
**Quiero** ver mis pedidos anteriores
|
|
**Para** reordenar fácilmente los mismos productos
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-146-1] Lista de todos los pedidos históricos
|
|
- [CA-146-2] Filtros por fecha/estado
|
|
- [CA-146-3] Opción para repetir un pedido anterior
|
|
- [CA-146-4] Detalles de cada pedido disponibles
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-146-01 | API de historial de pedidos | 3h |
|
|
| MCH-TT-146-02 | Interfaz de cliente en chat | 3h |
|
|
| MCH-TT-146-03 | Función de "repetir pedido" | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-147: Cliente cancela pedido
|
|
**Story Points:** 3
|
|
|
|
**Como** cliente
|
|
**Quiero** cancelar mi pedido si cambio de opinión
|
|
**Para** no pagar por algo que no quiero
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-147-1] Opción de cancelación disponible antes de "listo"
|
|
- [CA-147-2] Confirmación antes de cancelar
|
|
- [CA-147-3] Dueño notificado de la cancelación
|
|
- [CA-147-4] Pedido marcado como cancelado en historial
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-147-01 | Endpoint de cancelación | 2h |
|
|
| MCH-TT-147-02 | Validaciones de estado | 1h |
|
|
| MCH-TT-147-03 | Notificación al negocio | 1h |
|
|
|
|
---
|
|
|
|
### MCH-US-148: Dashboard de pedidos del negocio
|
|
**Story Points:** 8
|
|
|
|
**Como** dueño del negocio
|
|
**Quiero** un dashboard con todos mis pedidos
|
|
**Para** gestionar el flujo de trabajo eficientemente
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-148-1] Vista de tabla con pedidos del día
|
|
- [CA-148-2] Filtros por estado (pendiente, preparando, listo)
|
|
- [CA-148-3] Acciones rápidas: aceptar, marcar listo, cancelar
|
|
- [CA-148-4] Sonido/alert para nuevos pedidos
|
|
- [CA-148-5] Información del cliente con teléfono
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-148-01 | Componente OrderList | 4h |
|
|
| MCH-TT-148-02 | Filtros y búsqueda | 3h |
|
|
| MCH-TT-148-03 | Acciones rápidas en UI | 3h |
|
|
|
|
---
|
|
|
|
### MCH-US-149: Historial de estados del pedido
|
|
**Story Points:** 3
|
|
|
|
**Como** usuario (cliente o dueño)
|
|
**Quiero** ver el historial completo de cambios en un pedido
|
|
**Para** verificar cuándo se hizo cada acción
|
|
|
|
#### Criterios de Aceptación
|
|
- [CA-149-1] Timeline de cambios de estado
|
|
- [CA-149-2] Muestra quién hizo el cambio y cuándo
|
|
- [CA-149-3] Notas adicionales si existen
|
|
- [CA-149-4] Accesible desde detalles del pedido
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimación |
|
|
|----|-------|------------|
|
|
| MCH-TT-149-01 | API de historial de estados | 2h |
|
|
| MCH-TT-149-02 | Componente visual de timeline | 2h |
|
|
|
|
---
|
|
|
|
### Resumen de Story Points
|
|
| Historia | Descripción | SP |
|
|
|----------|-------------|-----|
|
|
| MCH-US-140 | Cliente solicita pedido via WhatsApp | 8 |
|
|
| MCH-US-141 | Cliente confirma pedido | 5 |
|
|
| MCH-US-142 | Negocio recibe notificación | 8 |
|
|
| MCH-US-143 | Negocio acepta o rechaza | 5 |
|
|
| MCH-US-144 | Cliente ve estado en tiempo real | 8 |
|
|
| MCH-US-145 | Negocio actualiza estado | 5 |
|
|
| MCH-US-146 | Historial de pedidos cliente | 5 |
|
|
| MCH-US-147 | Cliente cancela pedido | 3 |
|
|
| MCH-US-148 | Dashboard de pedidos negocio | 8 |
|
|
| MCH-US-149 | Historial de estados pedido | 3 |
|
|
| **Total** | | **55** |
|
|
|
|
## Entregables
|
|
|
|
| Entregable | Estado | Archivo |
|
|
|------------|--------|---------|
|
|
| orders.module | Completado | `modules/orders/` |
|
|
| WhatsApp order flow | Pendiente | `whatsapp-service/flows/order.flow.ts` |
|
|
| Order notifications | Pendiente | `services/order-notification.service.ts` |
|
|
| Orders dashboard | Pendiente | `pages/Orders.tsx` |
|
|
|
|
## Dependencias
|
|
|
|
### Depende de
|
|
- MCH-011 (WhatsApp Service)
|
|
- MCH-013 (Chat cliente)
|
|
- MCH-014 (Gestion clientes)
|
|
|
|
### Bloquea a
|
|
- MCH-016 (Entregas a domicilio)
|
|
|
|
## Criterios de Aceptacion
|
|
|
|
- [ ] Pedidos se crean via WhatsApp
|
|
- [ ] Dueno recibe notificacion inmediata
|
|
- [ ] Estados se actualizan correctamente
|
|
- [ ] Cliente recibe confirmaciones
|
|
- [ ] Historial de pedidos funciona
|
|
|
|
## Configuracion por Tenant
|
|
|
|
```typescript
|
|
{
|
|
orders: {
|
|
enabled: true,
|
|
auto_confirm: false, // o true para confirmar automaticamente
|
|
estimated_time_minutes: 15,
|
|
channels: ['whatsapp', 'web'],
|
|
notifications: {
|
|
push: true,
|
|
whatsapp: true,
|
|
sound: 'order_received'
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
**Ultima actualizacion:** 2026-01-17
|