docs(modulos): MAI-007 POD y Cierre - Especificacion completa

Nuevo modulo P0 critico especificado:
- README.md: Vision general, alcance, actores, flujo
- REQUERIMIENTOS.md: 4 RF (4.7.1-4.7.4), RNF, validaciones
- RESUMEN-EPICA.md: Valor de negocio, criterios exito, 31 SP

User Stories (5):
- US-MAI007-001: Capturar firma digital (8 SP)
- US-MAI007-002: Registrar tiempos reales (5 SP)
- US-MAI007-003: Adjuntar fotos evidencia (5 SP)
- US-MAI007-004: Validar POD antes de cierre (8 SP)
- US-MAI007-005: Cerrar con excepcion (5 SP)

Este modulo es bloqueante para:
- MAI-009 (Facturacion)
- MAI-010 (Liquidaciones)
- MAE-016 (Carta Porte)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Adrian Flores Cortes 2026-01-27 01:33:03 -06:00
parent 1845cfcaec
commit 7f45eb6383
8 changed files with 1134 additions and 0 deletions

View File

@ -0,0 +1,219 @@
# MAI-007: POD y Cierre Operativo
**Version:** 1.0.0
**Fecha:** 2026-01-27
**Estado:** Diseño
**Prioridad:** P0 (Critico - Bloquea facturacion)
---
## Descripcion General
El modulo POD (Proof of Delivery) y Cierre Operativo es responsable de capturar la evidencia de entrega, registrar tiempos reales y cerrar operativamente los viajes para permitir su facturacion.
**Problema que resuelve:**
- Sin POD no se puede facturar al cliente
- Sin registro de tiempos reales no se pueden calcular recargos por demoras
- El cierre operativo es prerequisito para liquidacion de operadores
---
## Objetivos del Modulo
1. **Captura de POD:** Registrar firma, nombre del receptor, fotos y documentos que comprueban la entrega
2. **Registro de tiempos:** Documentar llegada, inicio/fin de descarga, salida con precision
3. **Validaciones:** Asegurar que no se cierre un viaje sin evidencia completa o justificacion
4. **Cierre contable:** Congelar costos del viaje para calculo de rentabilidad
---
## Alcance Funcional
### Incluido
- Captura de POD desde app movil (online/offline)
- Firma digital del receptor
- Captura fotografica de evidencia
- Escaneo de documentos firmados
- Registro de tiempos reales por parada
- Calculo automatico de detention time
- Validaciones de cierre
- Notificacion a cliente de entrega
- Integracion con facturacion
### Excluido
- Gestion de incidencias (MAI-008)
- Generacion de facturas (MAI-009)
- Liquidacion de operadores (MAI-010)
---
## Actores
| Actor | Rol en el modulo |
|-------|------------------|
| Operador | Captura POD, registra tiempos, toma evidencias |
| Despachador | Valida POD, aprueba cierres con excepciones |
| Cliente | Recibe notificacion de entrega |
| Facturacion | Consulta POD para emitir factura |
---
## Flujo Principal
```
VIAJE EN DESTINO
┌─────────────────┐
│ Registro Arribo │ ← Automatico por geocerca o manual
└────────┬────────┘
┌─────────────────┐
│ Inicio Descarga │ ← Timestamp + evidencias
└────────┬────────┘
┌─────────────────┐
│ Fin Descarga │ ← Timestamp
└────────┬────────┘
┌─────────────────────────┐
│ Captura POD │
│ - Firma digital │
│ - Nombre receptor │
│ - Fotos (opcional) │
│ - Documento escaneado │
└────────┬────────────────┘
┌─────────────────┐
│ Validaciones │ ← POD completo? Tiempos OK?
└────────┬────────┘
┌────┴────┐
│ │
▼ ▼
[APROBADO] [EXCEPCION]
│ │
│ ▼
│ ┌──────────────┐
│ │ Justificacion │
│ │ + Aprobacion │
│ └──────┬───────┘
│ │
▼ ▼
┌─────────────────┐
│ VIAJE CERRADO │
└────────┬────────┘
[Listo para facturar]
```
---
## Datos del Modulo
### Entidades Principales
| Entidad | Descripcion | Estado |
|---------|-------------|--------|
| POD | Prueba de entrega | NO IMPLEMENTADA |
| FirmaDigital | Firma capturada | NO IMPLEMENTADA |
| FotoEntrega | Evidencia fotografica | NO IMPLEMENTADA |
| TiempoReal | Tiempos registrados | NO IMPLEMENTADA |
| CierreViaje | Registro de cierre | NO IMPLEMENTADA |
### Campos Clave POD
| Campo | Tipo | Obligatorio | Descripcion |
|-------|------|-------------|-------------|
| viaje_id | UUID | Si | Referencia al viaje |
| parada_id | UUID | Si | Parada de entrega |
| receptor_nombre | VARCHAR(150) | Si | Nombre de quien recibe |
| receptor_identificacion | VARCHAR(50) | No | ID del receptor |
| firma_digital_id | UUID | Si | Referencia a firma |
| fecha_entrega | TIMESTAMP | Si | Fecha/hora de entrega |
| status | ENUM | Si | PENDIENTE, COMPLETO, EXCEPCION |
| notas | TEXT | No | Observaciones |
---
## Requerimientos Funcionales
Ver archivo: [REQUERIMIENTOS.md](./REQUERIMIENTOS.md)
---
## Metricas del Modulo
| KPI | Formula | Meta |
|-----|---------|------|
| POD Capturados | % viajes con POD | >98% |
| Tiempo promedio captura | Avg(fin_descarga - arribo) | <60 min |
| Detention rate | % viajes con detention | <15% |
| POD con excepciones | % POD con justificacion | <5% |
---
## Dependencias
### Este modulo depende de:
- MAI-005 (Despacho): Viaje debe estar despachado
- MAI-006 (Tracking): Eventos de arribo por geocerca
- MAI-011 (Gestion Flota): Datos de operador
### Otros modulos dependen de este:
- MAI-009 (Facturacion): No puede facturar sin POD
- MAI-010 (Liquidaciones): Cierre para liquidar operador
- MAE-016 (Carta Porte): Expediente fiscal del viaje
---
## Consideraciones Tecnicas
### App Movil
- Debe funcionar offline con sincronizacion posterior
- Compresion de fotos antes de subir
- Captura de firma mediante canvas
- Almacenamiento temporal seguro
### Validaciones
- Coordenadas GPS dentro de geocerca del destino
- Timestamp coherente con eventos previos
- Archivo de firma no vacio
### Integraciones
- Notificacion a cliente via WhatsApp/Email
- Webhook a sistema de facturacion
- Sincronizacion con ERP contable
---
## Historias de Usuario
Ver carpeta: [historias-usuario/](./historias-usuario/)
| US | Titulo | Prioridad |
|----|--------|-----------|
| US-MAI007-001 | Capturar firma digital en entrega | Alta |
| US-MAI007-002 | Registrar tiempos reales de operacion | Alta |
| US-MAI007-003 | Adjuntar fotos de evidencia | Alta |
| US-MAI007-004 | Validar POD antes de cierre | Alta |
| US-MAI007-005 | Cerrar viaje con excepcion justificada | Media |
---
## Referencias
- REQ-GIRO-TRANSPORTISTA.md - Seccion 4.7
- MATRIZ-COHERENCIA-DDL-BACKEND.yml
- MAPEO-RF-GIRO-A-MODULOS.yml
---
*Modulo MAI-007 - ERP Transportistas - Sistema SIMCO v4.0.0*

View File

@ -0,0 +1,176 @@
# REQUERIMIENTOS.md - MAI-007: POD y Cierre Operativo
**Version:** 1.0.0
**Fecha:** 2026-01-27
**Fuente:** REQ-GIRO-TRANSPORTISTA.md - Seccion 4.7
---
## Requerimientos Funcionales
### RF-4.7.1: Captura POD
**Descripcion:**
El sistema debe permitir capturar la prueba de entrega (Proof of Delivery) incluyendo firma digital, nombre/ID del receptor, sello, fotos y documento escaneado.
**Criterios de Aceptacion:**
1. El operador puede capturar firma digital en pantalla tactil
2. El sistema registra nombre y opcionalmente ID del receptor
3. El operador puede adjuntar 1-5 fotos de evidencia
4. El operador puede escanear documento firmado (carta de porte, remision)
5. La captura funciona en modo offline con sincronizacion posterior
6. El sistema valida que la firma no este vacia
7. El sistema registra coordenadas GPS de la captura
**Mapeo a DDL:**
- Tabla: `pod`
- Campos: receptor_nombre, receptor_identificacion, firma_digital_id, foto_ids, documento_url, coordenadas, fecha_captura
**Endpoints Requeridos:**
- `POST /api/v1/pod` - Crear POD
- `PUT /api/v1/pod/:id` - Actualizar POD
- `POST /api/v1/pod/:id/firma` - Subir firma digital
- `POST /api/v1/pod/:id/fotos` - Subir fotos
- `POST /api/v1/pod/:id/documento` - Subir documento escaneado
**Prioridad:** Alta
---
### RF-4.7.2: Validaciones POD
**Descripcion:**
El sistema no debe permitir "cerrar" un viaje sin POD o sin justificacion aprobada por un supervisor.
**Criterios de Aceptacion:**
1. El boton "Cerrar Viaje" esta deshabilitado si no hay POD capturado
2. Si no hay POD, el sistema muestra opcion "Cerrar con Excepcion"
3. Cerrar con excepcion requiere:
- Motivo de excepcion (catalogo + texto libre)
- Aprobacion de supervisor (puede ser posterior)
4. El sistema notifica al supervisor cuando hay excepciones pendientes
5. Las excepciones se registran en bitacora de auditoria
**Mapeo a DDL:**
- Tabla: `pod` campo `status` (COMPLETO, EXCEPCION_PENDIENTE, EXCEPCION_APROBADA)
- Tabla: `excepciones_pod` (viaje_id, motivo, justificacion, aprobador_id, fecha_aprobacion)
**Endpoints Requeridos:**
- `POST /api/v1/viajes/:id/cierre-excepcion` - Solicitar cierre con excepcion
- `PUT /api/v1/excepciones/:id/aprobar` - Aprobar excepcion
- `PUT /api/v1/excepciones/:id/rechazar` - Rechazar excepcion
**Prioridad:** Alta
---
### RF-4.7.3: Tiempos Reales
**Descripcion:**
El sistema debe registrar tiempos de llegada, inicio/fin de descarga y salida para metricas de detention y SLA.
**Criterios de Aceptacion:**
1. El operador puede registrar:
- Hora de arribo al destino
- Hora de inicio de descarga
- Hora de fin de descarga
- Hora de salida del destino
2. Los eventos pueden capturarse automaticamente por geocerca
3. El sistema calcula automaticamente:
- Tiempo de espera (arribo a inicio descarga)
- Tiempo de descarga (inicio a fin)
- Tiempo total en destino
4. El sistema compara vs tolerancia del SLA del cliente
5. Si se excede tolerancia, genera flag de "detention"
6. Los tiempos alimentan calculo de recargos en facturacion
**Mapeo a DDL:**
- Tabla: `tiempos_reales`
- Campos: viaje_id, parada_id, hora_arribo, hora_inicio_descarga, hora_fin_descarga, hora_salida, detention_minutos, excede_sla
**Endpoints Requeridos:**
- `POST /api/v1/tiempos-reales` - Registrar tiempo
- `GET /api/v1/viajes/:id/tiempos` - Consultar tiempos del viaje
- `GET /api/v1/viajes/:id/detention` - Consultar detention calculado
**Prioridad:** Alta
---
### RF-4.7.4: Cierre Contable Operativo
**Descripcion:**
Al cerrar el viaje, el sistema debe congelar los costos (combustible, peajes, viaticos) y calcular rentabilidad preliminar.
**Criterios de Aceptacion:**
1. Al cerrar viaje, el sistema:
- Marca costos como "cerrados" (no editables)
- Suma total de costos del viaje
- Calcula margen vs precio cotizado
- Genera registro de cierre con snapshot de valores
2. El cierre puede revertirse solo con autorizacion especial
3. El sistema genera alerta si margen es negativo
4. El viaje cerrado pasa a estado "LISTO_FACTURAR"
5. El sistema notifica a facturacion que hay viaje listo
**Mapeo a DDL:**
- Tabla: `cierres_viaje`
- Campos: viaje_id, fecha_cierre, usuario_cierre, total_costos, total_ingresos, margen, status
**Endpoints Requeridos:**
- `POST /api/v1/viajes/:id/cerrar` - Cerrar viaje
- `POST /api/v1/viajes/:id/reabrir` - Reabrir viaje (admin)
- `GET /api/v1/viajes/:id/rentabilidad` - Consultar rentabilidad
**Prioridad:** Alta
---
## Requerimientos No Funcionales
### RNF-001: Performance App Movil
La captura de POD debe completarse en menos de 30 segundos incluyendo firma y fotos.
### RNF-002: Disponibilidad Offline
El modulo debe funcionar sin conexion, almacenando datos localmente hasta 72 horas.
### RNF-003: Compresion de Imagenes
Las fotos deben comprimirse a max 500KB antes de sincronizar.
### RNF-004: Seguridad
La firma digital debe almacenarse cifrada y ser verificable contra el registro de entrega.
### RNF-005: Auditoria
Todos los eventos de POD deben registrarse en log de auditoria con usuario, timestamp y coordenadas.
---
## Validaciones de Negocio
| Validacion | Descripcion | Accion si falla |
|------------|-------------|-----------------|
| POD_001 | Firma no puede estar vacia | Rechazar POD |
| POD_002 | Receptor nombre obligatorio | Rechazar POD |
| POD_003 | GPS dentro de geocerca destino | Warning, permitir con nota |
| POD_004 | Tiempos en secuencia logica | Rechazar si arribo > descarga |
| POD_005 | Viaje en estado EN_DESTINO | No permitir captura |
---
## Matriz de Trazabilidad
| RF | Tabla DDL | Entity | Endpoint | US |
|----|-----------|--------|----------|---|
| RF-4.7.1 | pod | POD | POST /api/v1/pod | US-MAI007-001, US-MAI007-003 |
| RF-4.7.2 | excepciones_pod | ExcepcionPOD | POST /viajes/:id/cierre-excepcion | US-MAI007-005 |
| RF-4.7.3 | tiempos_reales | TiempoReal | POST /api/v1/tiempos-reales | US-MAI007-002 |
| RF-4.7.4 | cierres_viaje | CierreViaje | POST /viajes/:id/cerrar | US-MAI007-004 |
---
*MAI-007 REQUERIMIENTOS - ERP Transportistas - Sistema SIMCO v4.0.0*

View File

@ -0,0 +1,190 @@
# RESUMEN-EPICA.md - MAI-007: POD y Cierre Operativo
**Codigo:** MAI-007
**Nombre:** POD y Cierre Operativo
**Version:** 1.0.0
**Fecha:** 2026-01-27
---
## Valor de Negocio
### Problema
Actualmente las empresas transportistas enfrentan:
- Disputas con clientes por falta de evidencia de entrega
- Retrasos en facturacion por documentacion incompleta
- Perdida de ingresos por no documentar detention time
- Imposibilidad de calcular rentabilidad real por viaje
### Solucion
Un sistema robusto de captura de POD que:
- Provee evidencia digital irrefutable de entrega
- Automatiza el registro de tiempos para recargos
- Cierra operativamente el viaje para facturacion inmediata
- Calcula rentabilidad preliminar al cerrar
### Beneficios Esperados
| Beneficio | Metrica | Impacto |
|-----------|---------|---------|
| Reduccion disputas | -80% reclamos sin evidencia | Ahorro legal |
| Facturacion rapida | -3 dias ciclo facturacion | Flujo de caja |
| Recargos detention | +15% captura detention | Ingresos |
| Visibilidad costos | 100% viajes con rentabilidad | Decisiones |
---
## Actores y Stakeholders
### Usuarios Primarios
| Actor | Responsabilidad | Frecuencia |
|-------|-----------------|------------|
| Operador | Captura POD, registra tiempos | Cada entrega |
| Despachador | Valida POD, aprueba excepciones | Continuo |
| Supervisor | Autoriza cierres especiales | Bajo demanda |
### Usuarios Secundarios
| Actor | Interes |
|-------|---------|
| Facturacion | Usa POD para emitir facturas |
| Atencion Cliente | Consulta POD para responder dudas |
| Gerencia | Revisa metricas de entrega |
---
## Flujo Principal
```
┌─────────────────────────────────────────────────────────────────┐
│ VIAJE EN DESTINO │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 1. REGISTRO ARRIBO │
│ - Automatico: Geocerca detecta unidad en destino │
│ - Manual: Operador registra en app │
│ - Sistema: Timestamp + coordenadas │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 2. DESCARGA │
│ - Operador marca inicio descarga │
│ - Operador marca fin descarga │
│ - Sistema: Calcula duracion, compara vs SLA │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 3. CAPTURA POD │
│ - Operador captura firma digital en pantalla │
│ - Operador ingresa nombre receptor │
│ - Operador toma fotos (opcional) │
│ - Operador escanea documento firmado (opcional) │
│ - Sistema: Valida datos minimos │
└─────────────────────────────────────────────────────────────────┘
┌─────────┴─────────┐
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ POD COMPLETO │ │ POD INCOMPLETO │
│ │ │ │
│ Firma OK │ │ Falta firma o │
│ Receptor OK │ │ receptor │
└────────┬─────────┘ └────────┬─────────┘
│ │
│ ▼
│ ┌──────────────────┐
│ │ EXCEPCION │
│ │ │
│ │ Motivo + Notas │
│ │ Enviar a aprobar │
│ └────────┬─────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ 4. CIERRE VIAJE │
│ - Sistema: Congela costos │
│ - Sistema: Calcula rentabilidad │
│ - Sistema: Cambia estado a CERRADO │
│ - Sistema: Notifica a facturacion │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ LISTO PARA FACTURAR │
└─────────────────────────────────────────────────────────────────┘
```
---
## Criterios de Exito
### Funcionales
- [ ] Operador puede capturar POD completo en <2 minutos
- [ ] Sistema funciona offline y sincroniza al reconectar
- [ ] Excepciones requieren aprobacion de supervisor
- [ ] Cierre calcula rentabilidad automaticamente
### Tecnicos
- [ ] Fotos comprimidas a <500KB
- [ ] Firma almacenada como imagen PNG
- [ ] Sincronizacion en <30 segundos con conexion
- [ ] Logs de auditoria completos
### Negocio
- [ ] 98% de viajes con POD capturado
- [ ] <5% de POD con excepciones
- [ ] Facturacion dentro de 24h del cierre
- [ ] 100% viajes con rentabilidad calculada
---
## Riesgos y Mitigaciones
| Riesgo | Probabilidad | Impacto | Mitigacion |
|--------|--------------|---------|------------|
| Operador sin conectividad | Alta | Alto | Modo offline robusto |
| Fotos muy pesadas | Media | Medio | Compresion automatica |
| Firma ilegible | Media | Medio | Validacion de trazos minimos |
| Rechazo de cierre sin POD | Baja | Alto | Flujo de excepciones |
---
## Dependencias
### Prerequisitos
- MAI-005 (Despacho): Viaje despachado
- MAI-006 (Tracking): Geocercas configuradas
- MAI-011 (Flota): Operador asignado
### Habilita
- MAI-009 (Facturacion): Requiere POD para facturar
- MAI-010 (Liquidaciones): Requiere cierre para liquidar
- MAE-016 (Carta Porte): Expediente completo
---
## Story Points Estimados
| Historia | Complejidad | SP |
|----------|-------------|---|
| US-MAI007-001 | Alta | 8 |
| US-MAI007-002 | Media | 5 |
| US-MAI007-003 | Media | 5 |
| US-MAI007-004 | Alta | 8 |
| US-MAI007-005 | Media | 5 |
| **Total** | | **31** |
---
*Epica MAI-007 - ERP Transportistas - Sistema SIMCO v4.0.0*

View File

@ -0,0 +1,90 @@
# US-MAI007-001: Capturar firma digital en entrega
**ID:** US-MAI007-001
**Modulo:** MAI-007 (POD y Cierre)
**Prioridad:** Alta
**Story Points:** 8
---
## Historia de Usuario
**Como** operador de transporte
**Quiero** capturar la firma digital del receptor en mi dispositivo movil
**Para** tener evidencia irrefutable de que la mercancia fue entregada
---
## Criterios de Aceptacion
### CA-001: Captura de firma
**Dado** que estoy en la pantalla de captura POD
**Cuando** el receptor firma con su dedo en el area de firma
**Entonces** el sistema captura la firma como imagen y la muestra en preview
### CA-002: Validacion de firma
**Dado** que intento guardar el POD sin firma
**Cuando** presiono el boton guardar
**Entonces** el sistema muestra error "Firma requerida" y no permite continuar
### CA-003: Datos del receptor
**Dado** que capturo la firma
**Cuando** completo los datos del receptor (nombre obligatorio, ID opcional)
**Entonces** el sistema asocia estos datos a la firma capturada
### CA-004: Limpiar y reintentar
**Dado** que la firma capturada no es satisfactoria
**Cuando** presiono el boton "Limpiar firma"
**Entonces** el area de firma se limpia y puedo capturar nuevamente
### CA-005: Modo offline
**Dado** que no tengo conexion a internet
**Cuando** capturo una firma
**Entonces** el sistema la almacena localmente y sincroniza cuando haya conexion
---
## Mockup / UI
```
┌─────────────────────────────────────────┐
│ POD - Entrega #12345
├─────────────────────────────────────────┤
│ │
│ Nombre receptor: [________________] │
│ ID receptor: [________________] │
│ (opcional) │
│ │
│ ┌─────────────────────────────────┐ │
│ │ │ │
│ │ │ │
│ │ [AREA DE FIRMA] │ │
│ │ │ │
│ │ │ │
│ └─────────────────────────────────┘ │
│ │
│ [Limpiar] [Continuar →] │
│ │
└─────────────────────────────────────────┘
```
---
## Notas Tecnicas
- La firma se almacena como PNG base64 en SQLite local
- Resolucion minima: 300x150 px
- Validar que haya al menos 50 puntos de trazo
- Coordenadas GPS se capturan automaticamente
- Sincronizacion via endpoint POST /api/v1/pod/:id/firma
---
## Definicion de Done
- [ ] Codigo implementado y revisado
- [ ] Tests unitarios (cobertura >80%)
- [ ] Tests de integracion con backend
- [ ] Funciona en modo offline
- [ ] Documentacion de API actualizada
- [ ] Demo aprobada por Product Owner

View File

@ -0,0 +1,106 @@
# US-MAI007-002: Registrar tiempos reales de operacion
**ID:** US-MAI007-002
**Modulo:** MAI-007 (POD y Cierre)
**Prioridad:** Alta
**Story Points:** 5
---
## Historia de Usuario
**Como** operador de transporte
**Quiero** registrar los tiempos de arribo, descarga y salida
**Para** que el sistema calcule automaticamente si hubo detention time
---
## Criterios de Aceptacion
### CA-001: Registro de arribo
**Dado** que llego al destino
**Cuando** presiono "Registrar Arribo" o entro a geocerca
**Entonces** el sistema registra timestamp y coordenadas del arribo
### CA-002: Registro de inicio descarga
**Dado** que estoy en el destino y comienza la descarga
**Cuando** presiono "Iniciar Descarga"
**Entonces** el sistema registra el timestamp de inicio
### CA-003: Registro de fin descarga
**Dado** que la descarga ha terminado
**Cuando** presiono "Finalizar Descarga"
**Entonces** el sistema registra el timestamp de fin y calcula duracion
### CA-004: Calculo de detention
**Dado** que he registrado todos los tiempos
**Cuando** el tiempo de espera (arribo a inicio descarga) excede 2 horas
**Entonces** el sistema marca el evento como "detention" para facturacion
### CA-005: Validacion de secuencia
**Dado** que intento registrar fin descarga antes de inicio
**Cuando** presiono el boton
**Entonces** el sistema muestra error "Registre inicio de descarga primero"
---
## Flujo de Tiempos
```
ARRIBO (10:00)
├─── Tiempo de espera ───┐
│ │
▼ │
INICIO DESCARGA (11:30) │ 90 min (OK, < 2h)
│ │
├─── Tiempo descarga ────┤
│ │
▼ │
FIN DESCARGA (12:15) │ 45 min
│ │
└────────────────────────┘
Total: 2h 15min
```
---
## Mockup / UI
```
┌─────────────────────────────────────────┐
│ Tiempos - Viaje #12345
├─────────────────────────────────────────┤
│ │
│ Destino: Bodega Central CDMX │
│ │
│ ✓ Arribo: 10:00 hrs │
│ ✓ Inicio descarga: 11:30 hrs │
│ ○ Fin descarga: --:-- hrs │
│ │
│ Tiempo espera: 1h 30min ✓ │
│ (Tolerancia SLA: 2h) │
│ │
│ [ Finalizar Descarga ] │
│ │
└─────────────────────────────────────────┘
```
---
## Notas Tecnicas
- Los tiempos se almacenan en UTC
- La geocerca puede disparar arribo automatico
- Tolerancia SLA viene del contrato del cliente
- Detention time se factura segun reglas configuradas
---
## Definicion de Done
- [ ] Registro de 4 eventos (arribo, inicio, fin, salida)
- [ ] Calculo automatico de detention
- [ ] Integracion con geocercas
- [ ] Tests unitarios
- [ ] Funciona offline

View File

@ -0,0 +1,96 @@
# US-MAI007-003: Adjuntar fotos de evidencia
**ID:** US-MAI007-003
**Modulo:** MAI-007 (POD y Cierre)
**Prioridad:** Alta
**Story Points:** 5
---
## Historia de Usuario
**Como** operador de transporte
**Quiero** adjuntar fotos de la entrega como evidencia
**Para** documentar el estado de la mercancia al momento de entrega
---
## Criterios de Aceptacion
### CA-001: Captura de foto
**Dado** que estoy en la pantalla de POD
**Cuando** presiono "Tomar foto"
**Entonces** se abre la camara y puedo capturar una imagen
### CA-002: Seleccion de galeria
**Dado** que ya tome fotos previamente
**Cuando** presiono "Seleccionar de galeria"
**Entonces** puedo elegir fotos existentes del dispositivo
### CA-003: Limite de fotos
**Dado** que ya tengo 5 fotos adjuntas
**Cuando** intento agregar otra
**Entonces** el sistema muestra "Maximo 5 fotos por POD"
### CA-004: Compresion automatica
**Dado** que tomo una foto de alta resolucion
**Cuando** la adjunto al POD
**Entonces** el sistema la comprime a max 500KB automaticamente
### CA-005: Preview y eliminacion
**Dado** que tengo fotos adjuntas
**Cuando** toco una foto en la lista
**Entonces** puedo verla en pantalla completa y eliminarla si es necesario
---
## Mockup / UI
```
┌─────────────────────────────────────────┐
│ Fotos de Evidencia │
├─────────────────────────────────────────┤
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ img │ │ img │ │ img │ │ + │ │
│ │ 1 │ │ 2 │ │ 3 │ │ │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
│ 3 de 5 fotos │
│ │
│ [📷 Tomar foto] [🖼 Galeria] │
│ │
└─────────────────────────────────────────┘
```
---
## Tipos de Evidencia Sugeridos
| Tipo | Descripcion |
|------|-------------|
| Estado mercancia | Foto de cajas/pallets al entregar |
| Documento firmado | Foto de remision con firma |
| Area descarga | Foto del area de descarga |
| Sello roto | Evidencia si se rompe sello |
| Dano | Documentar cualquier dano visible |
---
## Notas Tecnicas
- Fotos se almacenan en cache local hasta sincronizar
- Compresion JPEG calidad 70%
- Metadata EXIF preservada (fecha, GPS si disponible)
- Endpoint: POST /api/v1/pod/:id/fotos (multipart)
---
## Definicion de Done
- [ ] Captura desde camara
- [ ] Seleccion desde galeria
- [ ] Compresion automatica
- [ ] Preview de fotos
- [ ] Eliminacion de fotos
- [ ] Funciona offline

View File

@ -0,0 +1,119 @@
# US-MAI007-004: Validar POD antes de cierre
**ID:** US-MAI007-004
**Modulo:** MAI-007 (POD y Cierre)
**Prioridad:** Alta
**Story Points:** 8
---
## Historia de Usuario
**Como** despachador
**Quiero** que el sistema valide automaticamente que el POD este completo antes de cerrar
**Para** asegurar que tenemos toda la documentacion necesaria para facturar
---
## Criterios de Aceptacion
### CA-001: Validacion de firma
**Dado** que intento cerrar un viaje
**Cuando** el POD no tiene firma capturada
**Entonces** el sistema bloquea el cierre y muestra "POD sin firma"
### CA-002: Validacion de receptor
**Dado** que intento cerrar un viaje
**Cuando** el POD no tiene nombre de receptor
**Entonces** el sistema bloquea el cierre y muestra "Receptor no identificado"
### CA-003: Validacion de tiempos
**Dado** que intento cerrar un viaje
**Cuando** no se han registrado todos los tiempos requeridos
**Entonces** el sistema muestra advertencia pero permite continuar
### CA-004: Cierre exitoso
**Dado** que el POD cumple todas las validaciones
**Cuando** confirmo el cierre
**Entonces** el sistema:
- Cambia estado del viaje a CERRADO
- Congela costos del viaje
- Calcula rentabilidad preliminar
- Notifica a facturacion
### CA-005: Resumen de cierre
**Dado** que cierro un viaje exitosamente
**Cuando** se completa el proceso
**Entonces** veo un resumen con: costos, ingresos estimados, margen
---
## Mockup / UI
```
┌─────────────────────────────────────────┐
│ Cerrar Viaje #12345
├─────────────────────────────────────────┤
│ │
│ Validaciones: │
│ ✓ POD con firma │
│ ✓ Receptor identificado │
│ ✓ Tiempos registrados │
│ ⚠ Sin fotos adjuntas (opcional) │
│ │
│ ───────────────────────────────────── │
│ │
│ Resumen financiero: │
│ Ingresos: $15,000.00 │
│ Costos: $11,200.00 │
│ - Combustible $5,500.00 │
│ - Peajes $1,200.00 │
│ - Viaticos $800.00 │
│ - Otros $3,700.00 │
│ ───────────────────────────────────── │
│ Margen: $3,800.00 (25.3%) │
│ │
│ [Cancelar] [Confirmar Cierre ✓] │
│ │
└─────────────────────────────────────────┘
```
---
## Reglas de Validacion
| Validacion | Tipo | Bloquea cierre |
|------------|------|----------------|
| Firma presente | Requerido | Si |
| Nombre receptor | Requerido | Si |
| Tiempos completos | Recomendado | No |
| Fotos adjuntas | Opcional | No |
| GPS en geocerca | Recomendado | No |
---
## Estados del Viaje
```
EN_TRANSITO → EN_DESTINO → ENTREGADO → CERRADO → FACTURADO
```
---
## Notas Tecnicas
- Al cerrar se crea snapshot de costos en `cierres_viaje`
- Calculo de margen: (tarifa_cliente - sum(costos)) / tarifa_cliente
- Notificacion a facturacion via evento/webhook
- El cierre es irreversible sin rol de admin
---
## Definicion de Done
- [ ] Validaciones automaticas implementadas
- [ ] Calculo de rentabilidad correcto
- [ ] Notificacion a facturacion
- [ ] Snapshot de costos inmutable
- [ ] UI de confirmacion clara
- [ ] Tests de integracion

View File

@ -0,0 +1,138 @@
# US-MAI007-005: Cerrar viaje con excepcion justificada
**ID:** US-MAI007-005
**Modulo:** MAI-007 (POD y Cierre)
**Prioridad:** Media
**Story Points:** 5
---
## Historia de Usuario
**Como** despachador
**Quiero** poder cerrar un viaje sin POD completo con una justificacion
**Para** no bloquear el proceso cuando hay situaciones excepcionales
---
## Criterios de Aceptacion
### CA-001: Opcion de excepcion
**Dado** que el POD no cumple validaciones
**Cuando** intento cerrar el viaje
**Entonces** el sistema ofrece la opcion "Cerrar con excepcion"
### CA-002: Motivo obligatorio
**Dado** que selecciono cerrar con excepcion
**Cuando** no selecciono un motivo del catalogo
**Entonces** el sistema no permite continuar
### CA-003: Justificacion detallada
**Dado** que selecciono un motivo de excepcion
**Cuando** escribo la justificacion detallada (min 20 caracteres)
**Entonces** puedo proceder con la solicitud de excepcion
### CA-004: Aprobacion pendiente
**Dado** que solicito cierre con excepcion
**Cuando** completo el formulario
**Entonces** el viaje queda en estado "EXCEPCION_PENDIENTE" hasta aprobacion
### CA-005: Notificacion a supervisor
**Dado** que hay una excepcion pendiente
**Cuando** se crea la solicitud
**Entonces** el supervisor recibe notificacion para aprobar/rechazar
---
## Catalogo de Motivos
| Codigo | Motivo | Descripcion |
|--------|--------|-------------|
| EXC-001 | Rechazo en destino | Cliente rechazo la mercancia |
| EXC-002 | Entrega parcial | Solo se entrego parte de la carga |
| EXC-003 | Falla dispositivo | No se pudo capturar firma/fotos |
| EXC-004 | Emergencia | Accidente, robo, desastre natural |
| EXC-005 | Cambio destino | Cliente solicito entregar en otro lugar |
| EXC-006 | Otro | Especificar en justificacion |
---
## Mockup / UI
```
┌─────────────────────────────────────────┐
│ Cierre con Excepcion - Viaje #12345
├─────────────────────────────────────────┤
│ │
│ ⚠ El POD no cumple validaciones: │
│ ✗ Sin firma capturada │
│ │
│ ───────────────────────────────────── │
│ │
│ Motivo de excepcion: * │
│ ┌─────────────────────────────────┐ │
│ │ Rechazo en destino ▼ │ │
│ └─────────────────────────────────┘ │
│ │
│ Justificacion detallada: * │
│ ┌─────────────────────────────────┐ │
│ │ El cliente rechazo la carga │ │
│ │ por dano visible en 3 cajas. │ │
│ │ Se levanto acta con fotos. │ │
│ │ Contacto: Juan Perez, almacen │ │
│ └─────────────────────────────────┘ │
│ │
│ Evidencia adicional: │
│ [+ Adjuntar foto/documento] │
│ │
│ ───────────────────────────────────── │
Esta solicitud sera enviada a │
│ supervisor para aprobacion. │
│ │
│ [Cancelar] [Enviar Solicitud] │
│ │
└─────────────────────────────────────────┘
```
---
## Flujo de Aprobacion
```
SOLICITUD CREADA
┌────────────────┐
│ SUPERVISOR │
│ revisa │
└───────┬────────┘
┌────┴────┐
│ │
▼ ▼
APROBADA RECHAZADA
│ │
▼ ▼
CERRADO PENDIENTE
(regresar a operador)
```
---
## Notas Tecnicas
- Excepciones se registran en tabla `excepciones_pod`
- Notificacion via push notification y email
- Timeout de aprobacion: 24 horas (escalamiento automatico)
- Auditoria completa de quien aprobo/rechazo y cuando
---
## Definicion de Done
- [ ] Formulario de excepcion implementado
- [ ] Catalogo de motivos configurable
- [ ] Flujo de aprobacion funcional
- [ ] Notificaciones a supervisor
- [ ] Auditoria completa
- [ ] Tests de flujo completo