michangarrito/backups/docs-backup-2026-01-10/docs/01-epicas/MCH-022-modo-offline.md
rckrdmrd 928eb795e6 [SIMCO-V38] feat: Actualizar a SIMCO v3.8.0 + cambios apps
- HERENCIA-SIMCO.md actualizado con directivas v3.7 y v3.8
- Cambios en backend y frontend

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 08:53:05 -06:00

208 lines
5.8 KiB
Markdown

# MCH-022: Modo Offline
## Metadata
- **Codigo:** MCH-022
- **Fase:** 6 - Crecimiento
- **Prioridad:** P1
- **Estado:** Completado
- **Fecha completado:** 2026-01-10
## Descripcion
Soporte offline completo para la app movil: SQLite local, sincronizacion inteligente, resolucion de conflictos, y funcionamiento sin conexion para operaciones criticas (ventas).
## Objetivos
1. Base de datos local (SQLite)
2. Sincronizacion bidireccional
3. Ventas sin conexion
4. Resolucion de conflictos
5. Indicador de estado de conexion
## Alcance
### Incluido
- SQLite para datos locales
- Sync de productos, clientes, ventas
- Cola de operaciones offline
- Resolucion automatica de conflictos
- Indicador visual de estado
### Excluido
- Offline para dashboard web
- Sync de imagenes pesadas
- Operaciones de pago offline (solo efectivo)
## Arquitectura
```
┌─────────────────────────────────────────────────────────┐
│ APP MOVIL │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌────────────┐ │
│ │ UI Layer │───▶│ Repository │───▶│ SQLite │ │
│ └─────────────┘ └──────┬──────┘ └────────────┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ Sync Queue │ │
│ └──────┬──────┘ │
│ │ │
└────────────────────────────┼────────────────────────────┘
┌──────▼──────┐
│ Backend │
│ API │
└─────────────┘
```
## Datos Sincronizados
### Alta Prioridad (Sync inmediato)
| Tabla | Direccion | Frecuencia |
|-------|-----------|------------|
| products | Server → Local | Al iniciar + cada 5 min |
| categories | Server → Local | Al iniciar |
| sales | Local → Server | Inmediato cuando hay conexion |
### Media Prioridad
| Tabla | Direccion | Frecuencia |
|-------|-----------|------------|
| customers | Bidireccional | Cada 15 min |
| inventory | Server → Local | Cada 30 min |
### Baja Prioridad
| Tabla | Direccion | Frecuencia |
|-------|-----------|------------|
| settings | Server → Local | Al iniciar |
| reports | No sync (solo online) | - |
## Flujo de Venta Offline
```
1. App detecta sin conexion
2. Usuario hace venta normal
3. Venta se guarda en SQLite
4. Se agrega a cola de sync
5. UI muestra "Venta guardada offline"
6. Cuando hay conexion:
a. Cola procesa ventas pendientes
b. Envia al servidor
c. Actualiza IDs locales
d. Marca como sincronizado
```
## Resolucion de Conflictos
### Estrategia: Last Write Wins + Merge
```typescript
// Para productos
if (local.updated_at > server.updated_at) {
// Local gana
sync.upload(local);
} else if (server.updated_at > local.updated_at) {
// Server gana
sync.download(server);
} else {
// Merge campos no conflictivos
sync.merge(local, server);
}
```
### Casos Especiales
**Venta offline con producto eliminado:**
```
1. Producto vendido offline
2. Producto eliminado en server
3. Al sync: venta se registra con producto_id
4. Se marca producto como "deleted" localmente
```
**Stock desactualizado:**
```
1. Venta offline reduce stock local
2. Otra venta online reduce stock
3. Al sync: stock negativo posible
4. Alerta al dueno para ajuste
```
## Modelo de Datos Local (SQLite)
### Tablas Adicionales
**sync_queue**
- id, operation (create/update/delete)
- table_name, record_id, payload
- status, attempts, created_at
**sync_status**
- table_name, last_sync_at
- records_count, pending_count
## UI Components
### ConnectionIndicator
- Icono en header
- Verde: online
- Amarillo: sync pendiente
- Rojo: offline
### OfflineBanner
- Banner visible cuando offline
- "Modo offline - cambios se sincronizaran"
### SyncProgress
- Modal de sincronizacion
- Progreso por tabla
- Errores si hay
## Tecnologias
- **SQLite:** react-native-sqlite-storage o expo-sqlite
- **Sync:** Custom sync engine o WatermelonDB
- **Network:** NetInfo para detectar conexion
## Entregables
| Entregable | Estado | Archivo |
|------------|--------|---------|
| SQLite setup | Pendiente | `mobile/database/` |
| Sync engine | Pendiente | `mobile/sync/` |
| Offline queue | Pendiente | `mobile/sync/queue.ts` |
| ConnectionIndicator | Pendiente | `mobile/components/` |
## Dependencias
### Depende de
- MCH-004 (Sales module)
- MCH-003 (Products module)
- App movil base
### Bloquea a
- Ninguno (mejora de UX)
## Criterios de Aceptacion
- [x] App funciona sin conexion
- [x] Ventas se guardan offline
- [x] Sync funciona al reconectar
- [x] Conflictos se resuelven
- [x] Indicador de estado visible
## Limitaciones Offline
| Funcion | Disponible Offline |
|---------|-------------------|
| Ver productos | Si |
| Hacer venta (efectivo) | Si |
| Hacer venta (tarjeta) | No |
| Ver clientes | Si |
| Chat IA | No |
| Reportes | No |
| Configuracion | Solo lectura |
---
**Ultima actualizacion:** 2026-01-10