← Volver a casos de uso Caso de uso editorial

.02 · Sincronización offline-first

Operación móvil sin depender de la señal

Diseño de sincronización y resiliencia de datos.

Cómo resolver ventas de campo, cumplimiento fiscal y validación GPS en una app móvil que debía funcionar offline de verdad.

Mockup editorial de una app de ventas de campo con sincronización offline-first.
  • Flutter
  • SQLite local
  • Sincronización por lotes
  • Validación GPS
  • OTA updates
61 Pantallas
23 Endpoints API
52+ Pull requests

Situación

Un equipo de ventas de campo operaba visitando clientes y facturando directamente en el punto de venta.

El problema NO era menor:

  • el proceso original era manual
  • muchas rutas atravesaban zonas sin cobertura celular
  • la emisión debía respetar reglas fiscales locales
  • cada transacción necesitaba trazabilidad desde su creación hasta su sincronización posterior

En ese contexto, depender de conexión estable no era una opción seria.

Tarea

Había que construir una aplicación móvil que resolviera varios problemas acoplados al mismo tiempo:

  • operación offline-first real
  • validación de ubicación del vendedor
  • emisión e impresión de comprobantes
  • integración con un ERP legacy expuesto por stored procedures
  • sincronización segura sin pérdida ni duplicados
  • actualizaciones rápidas para equipos distribuidos en campo

La complejidad no estaba en cada requisito por separado, sino en hacer que todos convivieran sin romper la operación.

Acción técnica

Arquitectura

La app se estructuró con una base de Clean Architecture, combinada con MVVM, Repository Pattern y una capa de sincronización tratada como preocupación de primer nivel.

Se separaron responsabilidades en cuatro áreas:

  • domain para entidades, contratos y casos de uso
  • data para implementaciones concretas y sincronización
  • presentation para screens y viewmodels
  • core para infraestructura, base local, red y manejo de errores

La decisión importante fue esta: la sincronización no vive como un detalle escondido. Tiene estados, reintentos, conflictos y reglas propias.

Estrategia offline-first

Se diseñó un flujo dual:

  • descarga de datos operativos hacia SQLite local
  • upload de transacciones pendientes al reconectar

Cada factura se identificó con UUID para sostener idempotencia, evitando duplicados cuando el dispositivo recuperaba señal o reintentaba envíos.

Validación GPS multi-capa

La validación de ubicación no se resolvía con una simple lectura del dispositivo.
Se construyó una estrategia por capas:

  1. cálculo local de distancia
  2. verificación backend
  3. auditoría de incidentes
  4. manejo resiliente de respuestas inconsistentes desde el sistema legacy

Esto fue especialmente crítico porque la integración devolvía formatos variables según el caso. En lugar de asumir consistencia ideal, se diseñó el cliente para tolerar esa realidad.

Interacción con sistemas legacy

La integración no ocurría contra una API moderna bien diseñada, sino contra lógica corporativa expuesta mediante stored procedures.

Eso obligó a diseñar:

  • parsing defensivo
  • manejo explícito de errores
  • sincronización desacoplada
  • una arquitectura testeable para validar branches críticos sin tocar infraestructura real

Actualizaciones y operación en campo

También se incorporó una estrategia de actualización de versión que permitiera forzar upgrades y reducir el tiempo de entrega de fixes críticos para equipos que ya estaban operando en ruta.

Resultado

  • Operación móvil continua incluso en zonas sin cobertura
  • Sincronización posterior sin duplicados
  • Trazabilidad más confiable de transacciones de campo
  • Validación GPS para reducir riesgos operativos
  • Base técnica preparada para mantener presión de negocio sin colapsar

Decisiones técnicas relevantes

TemaDecisión
Persistencia localSQLite como fuente operativa offline
Sincronizaciónupload/download desacoplados con idempotencia
Integración legacyadaptación resiliente a stored procedures
Ubicaciónvalidación GPS multi-capa
Evoluciónmecanismo de actualización rápida para fixes críticos

Aprendizajes

Offline-first de verdad no significa “guardar algo local y después vemos”.

Significa diseñar estados, conflictos, idempotencia, auditoría y tolerancia a datos inconsistentes desde el inicio. Si no hacés eso, la app funciona solo en la demo.