- Updated docs and inventory files - Added new architecture docs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
206 lines
6.8 KiB
Markdown
206 lines
6.8 KiB
Markdown
# US-MAI006-016: Operar Sin Conexion
|
|
|
|
**Modulo:** MAI-006-tracking
|
|
**Version:** 1.0.0
|
|
**Fecha:** 2026-01-27
|
|
**Story Points:** 8
|
|
**Prioridad:** ALTA
|
|
|
|
---
|
|
|
|
## Descripcion
|
|
|
|
**Como** conductor de la flota transportista,
|
|
**Quiero** poder registrar todos los eventos de mi viaje sin necesidad de conexion a internet,
|
|
**Para** mantener la operacion continua y el registro completo de mi actividad incluso en zonas sin cobertura de red.
|
|
|
|
---
|
|
|
|
## Actor Principal
|
|
|
|
**Operador / Conductor**
|
|
|
|
---
|
|
|
|
## Precondiciones
|
|
|
|
1. El conductor tiene un viaje asignado y activo
|
|
2. La app movil tiene los datos del viaje descargados localmente
|
|
3. El dispositivo tiene suficiente almacenamiento disponible (>50 MB)
|
|
4. El conductor ha iniciado sesion mientras tenia conexion (JWT valido)
|
|
|
|
---
|
|
|
|
## Criterios de Aceptacion
|
|
|
|
### CA-1: Deteccion automatica de modo offline
|
|
|
|
**Given** el conductor esta usando la app en un viaje activo
|
|
**When** la conexion a internet se pierde
|
|
**Then** la app detecta el cambio de estado en menos de 5 segundos
|
|
**And** muestra un indicador visual de "Modo Offline" en el header
|
|
**And** continua funcionando sin interrumpir al usuario
|
|
|
|
### CA-2: Registro de eventos sin conexion
|
|
|
|
**Given** el conductor esta en modo offline
|
|
**When** registra un evento de viaje (arribo, salida, carga, descarga)
|
|
**Then** el evento se guarda localmente con un UUID unico
|
|
**And** se captura automaticamente el timestamp del dispositivo
|
|
**And** se captura la posicion GPS actual (si disponible)
|
|
**And** el evento aparece en la lista de "pendientes de sincronizar"
|
|
**And** se muestra confirmacion visual "Evento guardado localmente"
|
|
|
|
### CA-3: Captura de checklist pre-viaje offline
|
|
|
|
**Given** el conductor debe completar el checklist de salida
|
|
**And** no tiene conexion a internet
|
|
**When** responde cada pregunta del checklist
|
|
**Then** cada respuesta se almacena localmente
|
|
**And** puede agregar fotos de evidencia que se guardan en el dispositivo
|
|
**And** al completar el checklist se desbloquea el boton "Iniciar Viaje"
|
|
|
|
### CA-4: Visualizacion de informacion del viaje offline
|
|
|
|
**Given** el conductor esta sin conexion
|
|
**When** consulta los detalles de su viaje asignado
|
|
**Then** puede ver toda la informacion descargada previamente:
|
|
- Numero de viaje y estado
|
|
- Origen y destino con direcciones
|
|
- Lista de paradas con secuencia
|
|
- Instrucciones especiales
|
|
- Datos de contacto
|
|
- Documentos adjuntos (si fueron descargados)
|
|
|
|
### CA-5: Limite de almacenamiento local
|
|
|
|
**Given** el conductor ha registrado multiples eventos offline
|
|
**When** el almacenamiento local alcanza el 80% del limite
|
|
**Then** la app muestra una alerta "Almacenamiento casi lleno"
|
|
**And** sugiere sincronizar cuando tenga conexion
|
|
**And** muestra cuantos eventos estan pendientes
|
|
|
|
### CA-6: Persistencia ante cierre de app
|
|
|
|
**Given** el conductor ha registrado eventos sin conexion
|
|
**When** cierra la app completamente (kill app)
|
|
**And** la vuelve a abrir
|
|
**Then** todos los eventos pendientes siguen almacenados
|
|
**And** el contador de pendientes se mantiene correcto
|
|
**And** los datos del viaje siguen disponibles
|
|
|
|
### CA-7: Tiempo maximo de operacion offline
|
|
|
|
**Given** el conductor ha operado offline por mas de 7 dias
|
|
**When** intenta registrar un nuevo evento
|
|
**Then** la app muestra alerta "Sesion expirada, necesita reconectar"
|
|
**And** permite ver eventos pendientes pero no agregar nuevos
|
|
**And** solicita conectarse para re-autenticar
|
|
|
|
---
|
|
|
|
## Flujo Principal
|
|
|
|
1. Conductor inicia la app con viaje activo
|
|
2. Sistema detecta estado de conexion
|
|
3. Si offline: muestra indicador y continua
|
|
4. Conductor navega a pantalla de eventos
|
|
5. Conductor selecciona tipo de evento
|
|
6. Sistema captura datos automaticos (GPS, timestamp)
|
|
7. Conductor confirma el evento
|
|
8. Sistema guarda localmente y actualiza contador
|
|
9. Sistema intenta sync en background si hay conexion
|
|
|
|
---
|
|
|
|
## Flujo Alternativo: Perdida de Conexion Durante Uso
|
|
|
|
1. Conductor esta registrando evento con conexion
|
|
2. Conexion se pierde durante el proceso
|
|
3. Sistema detecta perdida de conexion
|
|
4. Sistema guarda evento localmente
|
|
5. Sistema muestra "Guardado offline, se sincronizara automaticamente"
|
|
6. Contador de pendientes se incrementa
|
|
|
|
---
|
|
|
|
## Notas Tecnicas
|
|
|
|
### Tecnologias Involucradas
|
|
|
|
| Componente | Tecnologia | Proposito |
|
|
|------------|------------|-----------|
|
|
| Storage | WatermelonDB | Base de datos offline-first |
|
|
| Blobs | IndexedDB | Fotos y archivos |
|
|
| Network | NetInfo API | Deteccion de conectividad |
|
|
| Auth | JWT | Token con expiracion 7 dias |
|
|
|
|
### Consideraciones de Implementacion
|
|
|
|
1. **Generacion de IDs**: Usar UUID v4 para garantizar unicidad
|
|
2. **Timestamps**: Usar hora del dispositivo, registrar timezone
|
|
3. **GPS**: Si no hay GPS, permitir evento pero marcar como "sin ubicacion"
|
|
4. **Validaciones**: Ejecutar localmente las mismas reglas que el servidor
|
|
5. **Cifrado**: Datos locales deben estar cifrados en reposo
|
|
|
|
### Estructura de Evento Local
|
|
|
|
```typescript
|
|
interface EventoLocal {
|
|
id: string; // UUID generado localmente
|
|
tipo: TipoEvento; // ARRIBO, SALIDA, CARGA, DESCARGA, etc.
|
|
timestamp: Date; // Momento de captura
|
|
timezone: string; // Timezone del dispositivo
|
|
lat: number | null; // Latitud GPS
|
|
lng: number | null; // Longitud GPS
|
|
accuracy: number | null; // Precision GPS en metros
|
|
viajeId: string; // ID del viaje activo
|
|
operadorId: string; // ID del conductor
|
|
notas: string | null; // Notas opcionales
|
|
evidencias: string[]; // IDs de fotos adjuntas
|
|
syncStatus: 'PENDING' | 'SENT' | 'FAILED';
|
|
createdAt: Date; // Momento de creacion
|
|
updatedAt: Date; // Ultima modificacion
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Dependencias
|
|
|
|
| Dependencia | Tipo | Descripcion |
|
|
|-------------|------|-------------|
|
|
| US-MAI006-011 | Tecnica | Configuracion de dispositivo GPS |
|
|
| US-MAI005-001 | Funcional | Checklist de salida |
|
|
| ARQUITECTURA-OFFLINE.md | Documento | Arquitectura de referencia |
|
|
|
|
---
|
|
|
|
## Riesgos y Mitigaciones
|
|
|
|
| Riesgo | Probabilidad | Impacto | Mitigacion |
|
|
|--------|--------------|---------|------------|
|
|
| Perdida de datos por bateria | Media | Alto | Guardar inmediatamente, notificar bateria baja |
|
|
| Almacenamiento lleno | Baja | Alto | Alertas proactivas, compresion de fotos |
|
|
| Dispositivo perdido | Baja | Medio | Cifrado de datos, wipe remoto |
|
|
| Reloj del dispositivo incorrecto | Baja | Medio | Validar al reconectar, advertir desfase |
|
|
|
|
---
|
|
|
|
## Definition of Done
|
|
|
|
- [ ] Eventos se guardan correctamente sin conexion
|
|
- [ ] Indicador de modo offline visible en UI
|
|
- [ ] Contador de pendientes funciona correctamente
|
|
- [ ] Datos persisten al cerrar y reabrir la app
|
|
- [ ] Limite de almacenamiento implementado
|
|
- [ ] Checklist funciona offline
|
|
- [ ] Informacion del viaje visible offline
|
|
- [ ] Pruebas unitarias escritas (>80% coverage)
|
|
- [ ] Pruebas E2E del flujo offline completadas
|
|
- [ ] Documentacion tecnica actualizada
|
|
|
|
---
|
|
|
|
*US-MAI006-016 v1.0.0 - erp-transportistas - Sistema SIMCO v4.0.0*
|