erp-transportistas-v2/docs/02-definicion-modulos/MAI-006-tracking/historias-usuario/US-MAI006-017-sincronizar-al-reconectar.md
Adrian Flores Cortes 6ed7f9e2ec [BACKUP] Pre-restructure workspace backup 2026-01-29
- Updated docs and inventory files
- Added new architecture docs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 17:35:54 -06:00

244 lines
7.0 KiB
Markdown

# US-MAI006-017: Sincronizar al Reconectar
**Modulo:** MAI-006-tracking
**Version:** 1.0.0
**Fecha:** 2026-01-27
**Story Points:** 5
**Prioridad:** ALTA
---
## Descripcion
**Como** sistema de la app de conductores,
**Quiero** enviar automaticamente todos los datos pendientes cuando se recupera la conexion,
**Para** garantizar que la informacion operativa llegue al servidor sin intervencion del conductor y sin perdida de datos.
---
## Actor Principal
**Sistema (App Movil)**
Actor Secundario: Operador / Conductor (observador)
---
## Precondiciones
1. Existen eventos/datos pendientes de sincronizar en el dispositivo
2. La conexion a internet se ha restablecido
3. El token de autenticacion es valido (no expirado)
4. El servidor backend esta disponible
---
## Criterios de Aceptacion
### CA-1: Deteccion automatica de conexion
**Given** el dispositivo estaba sin conexion
**When** la conexion a internet se restablece
**Then** el sistema detecta el cambio en menos de 5 segundos
**And** cambia el indicador de "Offline" a "Sincronizando"
**And** inicia el proceso de sincronizacion automaticamente
### CA-2: Priorizacion de datos a enviar
**Given** hay multiples tipos de datos pendientes
**When** inicia la sincronizacion
**Then** el sistema envia los datos en el siguiente orden de prioridad:
1. Firmas POD (prioridad critica)
2. Eventos de viaje (prioridad alta)
3. Respuestas de checklist (prioridad alta)
4. Posiciones GPS (prioridad media)
5. Fotos de evidencia (prioridad baja)
### CA-3: Procesamiento por lotes (batching)
**Given** hay 50 eventos pendientes de sincronizar
**When** el sistema envia los eventos
**Then** los agrupa en lotes de maximo 50 eventos por request
**And** envia un lote a la vez
**And** espera confirmacion antes de enviar el siguiente
**And** marca los eventos enviados como "SENT"
### CA-4: Manejo de errores con retry automatico
**Given** un lote de datos falla al enviarse (error de red o servidor)
**When** el sistema detecta el error
**Then** espera un tiempo con exponential backoff antes de reintentar
- Intento 1: Inmediato
- Intento 2: 1 segundo
- Intento 3: 2 segundos
- Intento 4: 4 segundos
- Hasta maximo 60 segundos
**And** muestra contador de reintentos al usuario si >3 intentos
### CA-5: Notificacion de sincronizacion completada
**Given** todos los datos pendientes fueron enviados exitosamente
**When** el servidor confirma la recepcion
**Then** el sistema muestra toast "Sincronizacion completada"
**And** actualiza el contador de pendientes a 0
**And** cambia indicador a "Online" (verde)
**And** registra timestamp de ultima sincronizacion
### CA-6: Sincronizacion en background
**Given** la app esta en segundo plano (background)
**And** hay datos pendientes
**When** el dispositivo tiene conexion
**Then** el sistema intenta sincronizar usando Background Sync API
**And** muestra notificacion push al completar "X eventos sincronizados"
### CA-7: Pull de cambios del servidor
**Given** el push de datos locales se completo exitosamente
**When** el sistema inicia el pull de cambios
**Then** solicita al servidor cambios desde el ultimo sync_timestamp
**And** aplica cambios a los datos locales (viaje, instrucciones, paradas)
**And** notifica al usuario si hay cambios relevantes
**And** actualiza la UI reactivamente
---
## Flujo Principal
1. Sistema detecta conexion restablecida
2. Sistema verifica token de autenticacion
3. Sistema obtiene items pendientes de la cola
4. Sistema ordena items por prioridad
5. Sistema envia primer batch al servidor
6. Servidor responde con confirmacion
7. Sistema marca items como enviados
8. Sistema repite hasta vaciar cola
9. Sistema solicita pull de cambios del servidor
10. Sistema aplica cambios locales
11. Sistema notifica al usuario
12. Sistema actualiza UI (indicadores, contadores)
---
## Flujo Alternativo: Error de Autenticacion (401)
1. Sistema intenta enviar batch
2. Servidor responde 401 Unauthorized
3. Sistema intenta refresh token
4. Si refresh exitoso: continua sync
5. Si refresh falla: notifica usuario "Sesion expirada"
6. Pausar sync hasta re-autenticacion
---
## Flujo Alternativo: Error de Servidor (5xx)
1. Sistema intenta enviar batch
2. Servidor responde error 5xx
3. Sistema registra error en log
4. Sistema espera con exponential backoff
5. Sistema reintenta automaticamente
6. Si >8 intentos: mover a dead letter queue
7. Notificar usuario si items criticos en dead letter
---
## Notas Tecnicas
### Tecnologias Involucradas
| Componente | Tecnologia | Proposito |
|------------|------------|-----------|
| Sync Manager | Custom Service | Orquestar sincronizacion |
| Queue | WatermelonDB | Cola de items pendientes |
| Background Sync | Workbox | Sync en background |
| Network | NetInfo API | Detectar conexion |
| Retry | Custom | Exponential backoff |
### Endpoints de Backend
| Metodo | Endpoint | Descripcion |
|--------|----------|-------------|
| POST | /api/sync/events | Batch de eventos |
| POST | /api/sync/positions | Batch de posiciones GPS |
| POST | /api/sync/photos | Upload de fotos |
| POST | /api/sync/signatures | Upload de firmas |
| GET | /api/sync/pull | Delta sync desde timestamp |
### Formato de Request
```typescript
// POST /api/sync/events
interface SyncEventsRequest {
items: Array<{
localId: string;
tipo: string;
timestamp: string;
lat: number | null;
lng: number | null;
viajeId: string;
data: Record<string, unknown>;
}>;
}
// Response
interface SyncEventsResponse {
accepted: string[]; // IDs aceptados
rejected: Array<{
localId: string;
reason: string;
}>;
serverTimestamp: string;
}
```
### Metricas a Capturar
| Metrica | Descripcion |
|---------|-------------|
| sync_duration_ms | Tiempo total de sincronizacion |
| sync_items_count | Cantidad de items sincronizados |
| sync_retry_count | Numero de reintentos |
| sync_error_rate | Porcentaje de errores |
---
## Dependencias
| Dependencia | Tipo | Descripcion |
|-------------|------|-------------|
| US-MAI006-016 | Funcional | Operar sin conexion |
| US-MAI006-018 | Funcional | Ver estado de sincronizacion |
| SINCRONIZACION-OFFLINE.md | Documento | Detalles de implementacion |
---
## Riesgos y Mitigaciones
| Riesgo | Probabilidad | Impacto | Mitigacion |
|--------|--------------|---------|------------|
| Conexion inestable durante sync | Alta | Medio | Transacciones atomicas, retry |
| Servidor no disponible | Media | Alto | Dead letter queue, alertas |
| Conflictos de datos | Baja | Medio | Estrategias de conflict resolution |
| Bateria baja durante sync | Baja | Medio | Pausar si bateria <15% |
---
## Definition of Done
- [ ] Sync automatico al recuperar conexion
- [ ] Priorizacion de datos implementada
- [ ] Batching configurado correctamente
- [ ] Exponential backoff funcionando
- [ ] Dead letter queue implementada
- [ ] Background sync funcionando
- [ ] Pull de cambios implementado
- [ ] Notificaciones de estado correctas
- [ ] Metricas capturadas
- [ ] Pruebas de integracion completadas
- [ ] Pruebas de stress (1000+ items) pasadas
---
*US-MAI006-017 v1.0.0 - erp-transportistas - Sistema SIMCO v4.0.0*