Backend: - Implement delivery module with zones and tracking - Add DeliveryZone entity (radius/polygon types) - Add Delivery entity with full status machine - Implement coverage check with Haversine formula WhatsApp Service: - Add delivery API integration methods - Support coverage check and delivery creation Database: - Add delivery schema with zones, deliveries, status_history, drivers tables - Create triggers for updated_at and status history logging Documentation: - Mark MCH-016 as Completado - Update _MAP.md progress to 60% Sprint 4 Complete: MCH-015, MCH-016, MCH-017 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
357 lines
11 KiB
Markdown
357 lines
11 KiB
Markdown
---
|
|
id: EPIC-MCH-016
|
|
type: Epic
|
|
title: "MCH-016: Entregas a Domicilio"
|
|
code: MCH-016
|
|
status: Completado
|
|
status_real: "Completado"
|
|
status_nota: "Backend delivery module con zonas, tracking, WhatsApp integration"
|
|
phase: 4
|
|
priority: P2
|
|
created_at: 2026-01-07
|
|
updated_at: 2026-01-18
|
|
simco_version: "4.0.1"
|
|
story_points: 34
|
|
dependencies:
|
|
blocks: []
|
|
depends_on: []
|
|
---
|
|
|
|
# MCH-016: Entregas a Domicilio
|
|
|
|
## Metadata
|
|
- **Codigo:** MCH-016
|
|
- **Fase:** 4 - Pedidos y Clientes
|
|
- **Prioridad:** P2
|
|
- **Estado:** Completado
|
|
- **Fecha completado:** 2026-01-18
|
|
- **Story Points:** 34
|
|
|
|
## Descripcion
|
|
|
|
Sistema de entregas a domicilio para micro-negocios: definicion de zonas de cobertura, costos de envio, asignacion de repartidores, y tracking basico del pedido.
|
|
|
|
## Objetivos
|
|
|
|
1. Definir zonas de cobertura
|
|
2. Configurar costos de envio
|
|
3. Asignar repartidores
|
|
4. Tracking basico de entrega
|
|
5. Confirmacion de entrega
|
|
|
|
## Alcance
|
|
|
|
### Incluido
|
|
- Zonas de cobertura (radio o colonias)
|
|
- Costo de envio fijo o por zona
|
|
- Asignacion manual de repartidor
|
|
- Estados: asignado, en camino, entregado
|
|
- Confirmacion con foto/firma
|
|
|
|
### Excluido
|
|
- GPS tracking en tiempo real
|
|
- Optimizacion de rutas
|
|
- Integracion con apps de delivery
|
|
- Repartidores externos (Rappi, Uber)
|
|
|
|
## Modelo de Datos
|
|
|
|
### Tablas Adicionales
|
|
|
|
**delivery_zones**
|
|
- id, tenant_id, name, type (radius/polygon)
|
|
- coordinates (JSONB), delivery_fee
|
|
- min_order, estimated_time, active
|
|
|
|
**deliveries**
|
|
- id, order_id, assigned_to (user_id)
|
|
- status, pickup_at, delivered_at
|
|
- delivery_address, notes
|
|
- proof_photo_url, signature_url
|
|
|
|
## Flujo de Entrega
|
|
|
|
### Cliente Solicita Delivery
|
|
```
|
|
Bot: "¿Como quieres recibir tu pedido?
|
|
[Paso a recoger] [Enviar a domicilio]"
|
|
|
|
Cliente: [Enviar a domicilio]
|
|
|
|
Bot: "¿A que direccion lo enviamos?"
|
|
|
|
Cliente: "Calle Hidalgo 45, Col. Centro"
|
|
|
|
Bot: "Perfecto! Envio a Col. Centro = $25
|
|
Total con envio: $79
|
|
Tiempo estimado: 30-45 min
|
|
|
|
¿Confirmas?
|
|
[Confirmar] [Cambiar direccion]"
|
|
```
|
|
|
|
### Asignacion de Repartidor
|
|
```
|
|
1. Pedido confirmado con delivery
|
|
2. Dueno ve pedido en dashboard
|
|
3. Asigna a repartidor (empleado)
|
|
4. Repartidor recibe notificacion
|
|
5. Cliente notificado: "Tu pedido va en camino"
|
|
```
|
|
|
|
### Confirmacion de Entrega
|
|
```
|
|
1. Repartidor llega a direccion
|
|
2. Entrega pedido
|
|
3. Toma foto de entrega (opcional)
|
|
4. Marca como entregado en app
|
|
5. Cliente recibe: "Pedido entregado!"
|
|
```
|
|
|
|
## Endpoints API
|
|
|
|
| Metodo | Endpoint | Descripcion |
|
|
|--------|----------|-------------|
|
|
| GET | /delivery/zones | Zonas de cobertura |
|
|
| POST | /delivery/zones | Crear zona |
|
|
| PUT | /delivery/zones/:id | Editar zona |
|
|
| DELETE | /delivery/zones/:id | Eliminar zona |
|
|
| POST | /delivery/check-coverage | Verificar cobertura |
|
|
| POST | /orders/:id/assign-delivery | Asignar repartidor |
|
|
| PUT | /deliveries/:id/status | Actualizar estado |
|
|
| POST | /deliveries/:id/confirm | Confirmar entrega |
|
|
|
|
## Configuracion de Zonas
|
|
|
|
### Por Radio
|
|
```typescript
|
|
{
|
|
type: 'radius',
|
|
center: { lat: 19.4326, lng: -99.1332 },
|
|
radius_km: 3,
|
|
delivery_fee: 25,
|
|
estimated_time: 30
|
|
}
|
|
```
|
|
|
|
### Por Colonias
|
|
```typescript
|
|
{
|
|
type: 'polygon',
|
|
name: 'Centro',
|
|
colonias: ['Centro', 'Roma Norte', 'Condesa'],
|
|
delivery_fee: 30,
|
|
estimated_time: 45
|
|
}
|
|
```
|
|
|
|
## UI Components
|
|
|
|
### DeliveryZonesMap
|
|
- Mapa con zonas definidas
|
|
- Edicion visual de poligonos
|
|
- Configuracion de tarifas
|
|
|
|
### DeliveryAssignment
|
|
- Lista de pedidos pendientes de asignar
|
|
- Dropdown de repartidores disponibles
|
|
- Boton asignar
|
|
|
|
### DeliveryTracking (Mobile - Repartidor)
|
|
- Lista de entregas asignadas
|
|
- Boton "En camino"
|
|
- Boton "Entregado" + foto
|
|
|
|
## Historias de Usuario
|
|
|
|
### MCH-US-150: Gestion de Zonas de Cobertura
|
|
**Story Points:** 8
|
|
|
|
**Como** dueno de negocio
|
|
**Quiero** definir zonas de cobertura por radio o poligono
|
|
**Para** controlar las areas donde ofrezco servicio de entrega a domicilio
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-150-1] El sistema permite crear zonas por radio (km desde punto central)
|
|
- [CA-150-2] El sistema permite crear zonas por poligono (lista de colonias)
|
|
- [CA-150-3] Cada zona tiene nombre, tipo, coordenadas y estado activo/inactivo
|
|
- [CA-150-4] Las zonas se visualizan en un mapa interactivo
|
|
- [CA-150-5] Se pueden editar y eliminar zonas existentes
|
|
- [CA-150-6] El sistema valida que no existan zonas con el mismo nombre
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-150-01 | Crear tabla delivery_zones con campos requeridos | 2h |
|
|
| MCH-TT-150-02 | Implementar DeliveryZonesService con CRUD | 4h |
|
|
| MCH-TT-150-03 | Crear endpoints REST para zonas | 3h |
|
|
| MCH-TT-150-04 | Desarrollar componente DeliveryZonesMap | 6h |
|
|
| MCH-TT-150-05 | Implementar edicion visual de poligonos | 4h |
|
|
| MCH-TT-150-06 | Agregar validaciones y tests | 3h |
|
|
|
|
---
|
|
|
|
### MCH-US-151: Configuracion de Costos de Envio
|
|
**Story Points:** 5
|
|
|
|
**Como** dueno de negocio
|
|
**Quiero** configurar tarifas de envio por zona
|
|
**Para** cobrar el costo adecuado segun la distancia de entrega
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-151-1] Cada zona tiene un costo de envio configurable
|
|
- [CA-151-2] Se puede definir un pedido minimo por zona
|
|
- [CA-151-3] Se puede configurar tiempo estimado de entrega por zona
|
|
- [CA-151-4] El bot muestra el costo de envio al cliente antes de confirmar
|
|
- [CA-151-5] El costo de envio se suma correctamente al total del pedido
|
|
- [CA-151-6] Se valida que la direccion este dentro de una zona activa
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-151-01 | Agregar campos delivery_fee, min_order, estimated_time a zonas | 1h |
|
|
| MCH-TT-151-02 | Implementar endpoint check-coverage | 3h |
|
|
| MCH-TT-151-03 | Integrar calculo de costo en flujo de pedido | 4h |
|
|
| MCH-TT-151-04 | Actualizar UI para configurar tarifas | 3h |
|
|
| MCH-TT-151-05 | Agregar validacion de pedido minimo | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-152: Asignacion de Repartidores
|
|
**Story Points:** 8
|
|
|
|
**Como** dueno o empleado del negocio
|
|
**Quiero** asignar pedidos a repartidores disponibles
|
|
**Para** gestionar las entregas de manera organizada
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-152-1] Se pueden ver pedidos pendientes de asignar en dashboard
|
|
- [CA-152-2] Se muestra lista de repartidores disponibles (rol delivery)
|
|
- [CA-152-3] Al asignar, el sistema crea registro en tabla deliveries
|
|
- [CA-152-4] El repartidor recibe notificacion de asignacion
|
|
- [CA-152-5] El cliente recibe notificacion de que su pedido fue asignado
|
|
- [CA-152-6] Se puede reasignar un pedido a otro repartidor
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-152-01 | Crear tabla deliveries con campos requeridos | 2h |
|
|
| MCH-TT-152-02 | Implementar DeliveriesService | 4h |
|
|
| MCH-TT-152-03 | Crear endpoint assign-delivery | 3h |
|
|
| MCH-TT-152-04 | Desarrollar componente DeliveryAssignment | 5h |
|
|
| MCH-TT-152-05 | Implementar notificaciones a repartidor | 3h |
|
|
| MCH-TT-152-06 | Implementar notificaciones a cliente | 2h |
|
|
| MCH-TT-152-07 | Agregar logica de reasignacion | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-153: Tracking de Estado de Entrega
|
|
**Story Points:** 8
|
|
|
|
**Como** repartidor
|
|
**Quiero** actualizar el estado de mis entregas asignadas
|
|
**Para** mantener informados al negocio y al cliente sobre el progreso
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-153-1] El repartidor ve lista de entregas asignadas en app movil
|
|
- [CA-153-2] Puede marcar entrega como "En camino" con timestamp
|
|
- [CA-153-3] Puede marcar entrega como "Entregado" con timestamp
|
|
- [CA-153-4] Los estados validos son: asignado, en_camino, entregado
|
|
- [CA-153-5] El cliente recibe notificacion en cada cambio de estado
|
|
- [CA-153-6] El dashboard muestra estado actual de todas las entregas
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-153-01 | Implementar endpoint update-status | 3h |
|
|
| MCH-TT-153-02 | Desarrollar pantalla mobile DeliveryTracking | 6h |
|
|
| MCH-TT-153-03 | Implementar logica de transicion de estados | 2h |
|
|
| MCH-TT-153-04 | Agregar timestamps pickup_at y delivered_at | 1h |
|
|
| MCH-TT-153-05 | Implementar notificaciones push al cliente | 4h |
|
|
| MCH-TT-153-06 | Actualizar dashboard con estados en tiempo real | 3h |
|
|
|
|
---
|
|
|
|
### MCH-US-154: Confirmacion de Entrega con Evidencia
|
|
**Story Points:** 5
|
|
|
|
**Como** repartidor
|
|
**Quiero** confirmar la entrega con foto o firma opcional
|
|
**Para** tener evidencia de que el pedido fue entregado correctamente
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-154-1] El repartidor puede tomar foto de la entrega
|
|
- [CA-154-2] El repartidor puede capturar firma del cliente (opcional)
|
|
- [CA-154-3] La foto/firma se almacena y vincula a la entrega
|
|
- [CA-154-4] El dueno puede ver la evidencia en el historial
|
|
- [CA-154-5] El cliente recibe mensaje de confirmacion con resumen
|
|
- [CA-154-6] El sistema registra hora exacta de confirmacion
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-154-01 | Implementar endpoint confirm-delivery | 2h |
|
|
| MCH-TT-154-02 | Agregar upload de foto a storage | 3h |
|
|
| MCH-TT-154-03 | Implementar captura de firma en mobile | 4h |
|
|
| MCH-TT-154-04 | Guardar URLs de evidencia en deliveries | 1h |
|
|
| MCH-TT-154-05 | Mostrar evidencia en historial del dashboard | 3h |
|
|
| MCH-TT-154-06 | Enviar confirmacion al cliente via WhatsApp | 2h |
|
|
|
|
---
|
|
|
|
### Resumen de Story Points
|
|
|
|
| Historia | Descripcion | SP |
|
|
|----------|-------------|---:|
|
|
| MCH-US-150 | Gestion de Zonas de Cobertura | 8 |
|
|
| MCH-US-151 | Configuracion de Costos de Envio | 5 |
|
|
| MCH-US-152 | Asignacion de Repartidores | 8 |
|
|
| MCH-US-153 | Tracking de Estado de Entrega | 8 |
|
|
| MCH-US-154 | Confirmacion de Entrega con Evidencia | 5 |
|
|
| **TOTAL** | | **34** |
|
|
|
|
## Entregables
|
|
|
|
| Entregable | Estado | Archivo |
|
|
|------------|--------|---------|
|
|
| delivery.module | Completado | `backend/src/modules/delivery/` |
|
|
| Delivery entities | Completado | `entities/delivery.entity.ts`, `delivery-zone.entity.ts` |
|
|
| DeliveryService | Completado | `delivery.service.ts` |
|
|
| DeliveryController | Completado | `delivery.controller.ts` |
|
|
| DTOs | Completado | `dto/delivery.dto.ts` |
|
|
| DDL schema | Completado | `database/schemas/delivery.sql` |
|
|
| WhatsApp integration | Completado | `whatsapp-service/common/backend-api.service.ts` |
|
|
| DeliveryZonesMap UI | Pendiente | `components/delivery/` |
|
|
| Mobile delivery screen | Pendiente | `mobile/screens/Delivery.tsx` |
|
|
|
|
## Dependencias
|
|
|
|
### Depende de
|
|
- MCH-015 (Pedidos WhatsApp)
|
|
- MCH-002 (Auth - para repartidores)
|
|
|
|
### Bloquea a
|
|
- Ninguno
|
|
|
|
## Criterios de Aceptacion
|
|
|
|
- [x] Zonas de cobertura se configuran (backend API)
|
|
- [x] Costo de envio se calcula correctamente
|
|
- [x] Estados de entrega funcionan (state machine)
|
|
- [x] API endpoints implementados
|
|
- [x] WhatsApp service integration
|
|
- [ ] UI DeliveryZonesMap (futuro sprint)
|
|
- [ ] Mobile delivery screen (futuro sprint)
|
|
|
|
## Roles
|
|
|
|
| Rol | Permisos |
|
|
|-----|----------|
|
|
| owner | Configurar zonas, ver todas las entregas |
|
|
| employee | Asignar entregas, ver entregas |
|
|
| delivery | Ver entregas asignadas, actualizar estado |
|
|
|
|
---
|
|
|
|
**Ultima actualizacion:** 2026-01-18
|