Saltar a contenido

MedTime - Modulo de Modo Offline

Identificador: MTS-OFF-001 Version: 1.5.0 Fecha: 2025-12-02 Ultima Revision: Iteracion 10 - ACL9-001 Migracion automatica Free a Pro Autor: SpecQueen Prioridad: CRITICA (Esencial para v1.0)


1. Descripción General

El Modo Offline garantiza que MedTime funcione completamente sin conexión a Internet. Esta es una funcionalidad ESENCIAL para v1.0, especialmente crítica para usuarios del tier Free que operan 100% en local.

Referencia Canónica (Iteración 11): Las reglas de negocio centrales para modo offline se encuentran en 06-reglas-de-negocio.md. Ver RN-OFF-001 a RN-OFF-006, RN-BCK-001 a RN-BCK-015, y RN-PER-001 a RN-PER-005 en el documento central.

2. Objetivos

ID Objetivo Métrica
OFF-OBJ-001 Operación completa sin Internet 100% funcionalidades core disponibles offline
OFF-OBJ-002 Alertas confiables sin conexión 0% de alertas perdidas por falta de conexión
OFF-OBJ-003 Sincronización transparente < 5 segundos para sincronizar cambios al reconectar
OFF-OBJ-004 Integridad de datos 0% de pérdida de datos por conflictos

3. Arquitectura Offline

graph TB
    subgraph DISPOSITIVO_LOCAL["DISPOSITIVO LOCAL"]
        UI["UI/UX Layer"]
        LOGIC["Lógica Negocio"]
        SCHEDULER["Scheduler Local"]

        UI --> BD_LOCAL
        LOGIC --> BD_LOCAL
        SCHEDULER --> BD_LOCAL

        BD_LOCAL["BASE DE DATOS LOCAL<br/>(SQLite / Realm)"]
        BD_LOCAL --> COLA_SYNC

        COLA_SYNC["COLA DE SINCRONIZACIÓN<br/>(Operaciones pendientes)"]
    end

    COLA_SYNC -->|Cuando hay conexión<br/>Pro/Perfect| SERVIDOR_CLOUD

    SERVIDOR_CLOUD["SERVIDOR CLOUD<br/>(Solo para Pro/Perfect)"]

4. Funcionalidades Offline

4.1. Funcionalidades Disponibles Sin Conexión

Funcionalidad Disponibilidad Offline Notas
Ver calendario de tomas ✅ Completa Datos locales
Confirmar toma de medicamento ✅ Completa Se registra localmente
Posponer toma ✅ Completa Reprograma localmente
Ver lista de medicamentos ✅ Completa Datos locales
Agregar medicamento (manual) ✅ Completa Sin validación de catálogo
Editar medicamento ✅ Completa Cambios locales
Recibir alertas/recordatorios ✅ Completa Scheduler local
Ver estadísticas de adherencia ✅ Completa Cálculo local
Ver historial de tomas ✅ Completa Datos locales
Gamificación (puntos, rachas) ✅ Completa Cálculo local
Gestionar citas Completa Datos locales
Ver recetas guardadas Completa Almacenamiento local
Registrar mediciones Completa Sin importacion Health Connect
Registrar tratamientos Completa Datos locales
Ver historial de eventos Completa Datos locales
Recibir alertas de mediciones Completa Scheduler local

4.2. Funcionalidades Degradadas Sin Conexión

Funcionalidad Comportamiento Offline Comportamiento Online
OCR de recetas No disponible Procesamiento cloud (Pro/Perfect)
Verificación de interacciones Última versión cacheada Verificación en tiempo real
Busqueda en catalogo de medicamentos Catalogo local (limitado) Catalogo completo
Sincronizacion con cuidadores Ver seccion 7.5 Tiempo real
Notificaciones push Alertas locales Push + locales
Importacion Health Connect/HealthKit No disponible Automatica si configurada
Graficas avanzadas de mediciones Datos locales ultimos 30 dias Historial completo
Alertas de valores criticos a cuidadores Solo local Push inmediato

Importante: Los calendarios de tomas se sincronizan con los dispositivos de los cuidadores. Si el paciente no registra la toma o no hay conexión, la alerta se generará localmente en los dispositivos de los cuidadores (ver sección 7.5).

4.3. Funcionalidades No Disponibles Offline

Funcionalidad Razón Alternativa Offline
Crear cuenta nueva Requiere verificación N/A - Debe estar online
Login inicial Requiere autenticación N/A - Debe estar online primero
Compartir con médico Requiere envío de datos Exportar PDF local
Pago de suscripción Requiere procesamiento N/A

5. Almacenamiento Local

5.1. Base de Datos Local

Plataforma Tecnología Capacidad
iOS SQLite + Core Data / Realm Ilimitado (espacio dispositivo)
Android SQLite + Room / Realm Ilimitado (espacio dispositivo)

5.2. Datos Almacenados Localmente

Entidad Datos Cifrado
Usuario Perfil completo ✅ AES-256
Medicamentos Todos los activos e históricos ✅ AES-256
Calendario Próximos 30 días + histórico ✅ AES-256
Tomas Registro completo ✅ AES-256
Recetas Imágenes y datos estructurados ✅ AES-256
Citas Todas las programadas ✅ AES-256
Analisis Resultados guardados AES-256
Configuracion Preferencias del usuario AES-256
Catalogo medicamentos Version offline (ultima sync) No (datos publicos)
Mediciones de salud Historial completo AES-256
Tratamientos Historial completo AES-256
Fotos de tratamientos Almacenamiento local AES-256
Recordatorios de eventos Proximos 7 dias AES-256

5.3. Seguridad del Almacenamiento Local

Aspecto Implementación
Cifrado en reposo AES-256 con clave derivada de biometría/PIN
Acceso a datos Requiere autenticación biométrica/PIN
Borrado seguro Sobreescritura al eliminar cuenta
Backup local Opcional, cifrado con contraseña adicional

6. Sistema de Alertas Offline

6.1. Arquitectura de Alertas Locales

graph TB
    subgraph SCHEDULER_LOCAL["SCHEDULER LOCAL"]
        CALENDARIO["Calendario de Tomas"]
        GENERADOR["Generador de Alertas<br/>(Calcula próximas)"]
        COLA["Cola de Alertas<br/>(Próximos 7 días)"]
        DISPARADOR["Disparador de Alerta<br/>- Notificación local<br/>- Sonido<br/>- Vibración"]

        CALENDARIO --> GENERADOR
        GENERADOR --> COLA
        COLA --> DISPARADOR

        DISPARADOR --> IOS_NOT["iOS: Local Notifications"]
        DISPARADOR --> ANDROID_ALARM["Android: AlarmManager"]
    end

6.2. Programación de Alertas

Plataforma Tecnología Límite de Alertas Persistencia
iOS UNUserNotificationCenter 64 pendientes Sobrevive reinicio
Android AlarmManager + WorkManager Sin límite práctico Sobrevive reinicio

6.3. Regeneración de Alertas

Evento Acción
Apertura de app Recalcular y reprogramar próximas 7 días
Cambio de medicamento Actualizar alertas afectadas
Reinicio de dispositivo Android: BroadcastReceiver regenera alertas
Cambio de zona horaria Recalcular todos los horarios

7. Sincronización (Pro/Perfect)

7.1. Estrategia de Sincronización

flowchart TD
    A[Acción del usuario] --> B[Guardar en BD local]
    B --> C[Agregar a cola de sync]

    D[Detectar conexión] --> E[Procesar cola]
    C -.->|Cuando hay conexión| E

    E --> F[Enviar al servidor]
    F --> G[Confirmar sync]
    G --> H[Marcar como sincronizado]

7.2. Cola de Sincronización

Campo Descripción
id Identificador único de operación
tipo CREATE, UPDATE, DELETE
entidad medicamento, toma, cita, etc.
datos JSON con los datos de la operación
timestamp_local Momento de la acción (reloj local)
intentos Número de intentos de sincronización
estado pendiente, en_proceso, completado, error

7.3. Resolución de Conflictos

Escenario Estrategia Resultado
Mismo registro modificado Última escritura gana (timestamp) Se mantiene el más reciente
Registro eliminado remotamente Se elimina localmente Notificar al usuario
Registro creado offline duplicado Merge por campos únicos Combinar sin duplicar
Conflicto no resoluble Log de discrepancia Usuario decide

7.4. Límites de Operación Offline

Tier Máximo Offline Acción al Exceder
Free Ilimitado N/A (100% local)
Pro 30 días Advertencia, degradar a lectura
Perfect 30 días Advertencia, degradar a lectura

7.5. Sincronización de Calendarios con Cuidadores (Pro/Perfect)

7.5.1. Descripción

Los calendarios de tomas del paciente se sincronizan con los dispositivos de los cuidadores que tienen permiso de "recibir alertas". Esto permite que las alertas se generen localmente en el dispositivo del cuidador incluso si:

  • El paciente no registra la toma
  • No hay conexión entre el servidor y el dispositivo del paciente
  • El paciente está offline

7.5.2. Arquitectura

graph TB
    subgraph PACIENTE["Dispositivo del Paciente"]
        CAL_PAC["Calendario de Tomas"]
        ALERT_PAC["Alertas locales para paciente"]
    end

    subgraph CUIDADOR["Dispositivo del Cuidador"]
        CAL_CUID["Calendario de Tomas (copia)"]
        ALERT_CUID["Alertas locales para cuidador"]
    end

    CAL_PAC <-->|sync| CAL_CUID

    PACIENTE -->|si hay conexión| SERVIDOR
    CUIDADOR -->|si hay conexión| SERVIDOR

    SERVIDOR["SERVIDOR<br/>(Coordina sincronización)"]

7.5.3. Flujo de Sincronización

  1. Paciente configura medicamento con horarios
  2. Sistema sincroniza calendario al servidor
  3. Servidor envía calendario a dispositivos de cuidadores con permiso
  4. Cuidadores programan alertas locales en sus dispositivos
  5. Si paciente confirma toma → servidor notifica → cuidadores cancelan alerta
  6. Si paciente NO confirma (o está offline) → alerta local del cuidador se dispara

7.5.4. Configuración de Tiempos

Parámetro Tier Pro Tier Perfect
Frecuencia de sync de calendario Cada cambio + cada 24h Cada cambio + cada 12h
Ventana de espera antes de alerta a cuidador Configurable (15-90 min) Configurable (15-90 min)
Máximo de cuidadores con sync de calendario 1 5
Máximo de cuidadores totales 10 10

Nota para Tier Free: No hay sincronización con cuidadores ya que el tier Free opera 100% local sin conexión a servidor.

7.5.5. Manejo de Background Killers (Android)

Algunos fabricantes (Xiaomi, Huawei, Samsung, OPPO) tienen sistemas agresivos de ahorro de batería que pueden afectar las alertas.

Paso Acción
1 Detección de fabricante al instalar la app
2 Mostrar guía específica por fabricante para configurar permisos
3 Alerta si app no puede ejecutar en background
4 Canal especial de notificaciones con alta prioridad
5 Documentación detallada en FAQ y onboarding

7.5.6. Fabricantes con guías específicas

  • Xiaomi/Redmi: Permisos de autostart, sin restricción de batería
  • Huawei/Honor: Gestión de aplicaciones, arranque automático
  • Samsung: Optimización de batería, aplicaciones sin monitorear
  • OPPO/OnePlus: Gestión de batería, aplicaciones protegidas

7.5.7. Comportamiento Offline del Cuidador

Escenario Comportamiento
Cuidador online, paciente offline Cuidador recibe alerta local tras tiempo de espera
Cuidador offline, paciente offline Ambos tienen alertas locales programadas
Cuidador online, paciente confirma Cuidador recibe notificación de confirmación
Calendario actualizado mientras cuidador offline Se sincroniza cuando cuidador reconecta

8. Tier Free: Operación 100% Local

8.1. Características Específicas

Aspecto Comportamiento
Almacenamiento 100% en dispositivo
Sincronización cloud No disponible
Backup Solo local (exportar archivo)
Cuidadores No disponibles (requiere sync)
OCR/IA No disponible
Múltiples dispositivos No (datos en un solo dispositivo)

8.2. Migracion a Pro/Perfect (ACL9-001)

Decision del Director Round 9 (PREG-R9-001): Migracion automatica desde app Free con verificacion de identidad.

8.2.1. Flujo de Migracion Automatica (Upgrade desde App)

Paso Descripcion
1 Usuario Free selecciona "Upgrade a Pro/Perfect"
2 Sistema solicita verificacion PIN/Biometria
3 Usuario crea cuenta con email y telefono
4 Sistema verifica email y telefono
5 Sistema sube datos locales cifrados al cloud
6 Se activa suscripcion y sincronizacion
7 Funciones Pro/Perfect disponibles inmediatamente

8.2.2. Flujo Alternativo (Cuenta creada en otro dispositivo)

Paso Descripcion
1 Usuario ya tiene cuenta Pro (creada en web/otro dispositivo)
2 En app Free, selecciona "Ya tengo cuenta Pro"
3 Sistema solicita verificacion PIN/Biometria para exportar
4 Usuario exporta archivo .medtime con contrasena
5 Usuario hace login con cuenta Pro
6 Usuario importa archivo .medtime
7 Datos migrados a cuenta Pro

8.2.3. Reglas de Migracion

ID Regla
RN-MIG-001 Verificacion PIN/Biometria obligatoria antes de migracion
RN-MIG-002 Datos locales se mantienen hasta confirmar exito de subida
RN-MIG-003 Si falla subida, se ofrece exportar archivo como alternativa
RN-MIG-004 Migracion preserva fechas originales de todos los registros

8.3. Portabilidad de Datos (Free)

Funcionalidad Descripcion
Exportar datos Archivo cifrado con contrasena del usuario
Importar datos Restaurar en mismo u otro dispositivo
Formato JSON cifrado o PDF (solo lectura)

8.4. Sistema de Backup Offline para Free (ACL6-003)

Decision ACL6-003: Backup hibrido simple por tier (Free manual, Pro/Perfect automatico).

8.4.1. Descripcion

Los usuarios Free tienen un sistema de backup completamente local que les permite proteger sus datos sin conexion a internet.

8.4.2. Funcionalidades de Backup Free

Funcionalidad Disponible Notas
Backup manual Si Usuario inicia el proceso
Backup automatico No Solo para Pro/Perfect
Exportar archivo .medtime Si Archivo cifrado portable
Importar backup Si Restaurar en cualquier dispositivo
Almacenamiento cloud No Solo local

8.4.3. Flujo de Backup Manual (Free)

flowchart TD
    A[Usuario accede a Configuracion > Backup] --> B[Selecciona Crear Backup]
    B --> C[Sistema muestra contenido a respaldar]
    C --> D[Usuario define contrasena de cifrado]
    D --> E[Confirmar contrasena]
    E --> F[Sistema genera archivo .medtime]
    F --> G[Sistema comprime y cifra datos]
    G --> H{Destino del backup?}

    H -->|Almacenamiento local| I[Guardar en Descargas]
    H -->|Compartir| J[Abrir selector de destino]
    H -->|Cloud personal| K[Guardar en iCloud/Google Drive]

    I --> L[Mostrar confirmacion con ubicacion]
    J --> L
    K --> L

    L --> M[Registrar fecha de ultimo backup]

8.4.4. Recordatorios de Backup (Free)

Evento Recordatorio
30 dias sin backup Notificacion suave
60 dias sin backup Notificacion prominente
90 dias sin backup Alerta en pantalla principal
Cambio de dispositivo detectado Sugerir backup inmediato

8.5. Persistencia de Datos en Desinstalacion (ACL9-005)

Decision del Director Round 9 (PREG-R9-005): Opcion C - Backup manual antes de desinstalar. Si no exporta, datos se pierden.

8.5.1. Descripcion

Cuando un usuario Free desinstala la app, los datos almacenados localmente se pierden a menos que haya exportado un backup previamente. El sistema ofrece un flujo de advertencia y exportacion antes de la desinstalacion.

8.5.2. Comportamiento por Plataforma

Plataforma Comportamiento Deteccion de Desinstalacion
iOS Datos se eliminan con la app No detectable (limitacion OS)
Android Datos se eliminan con la app Parcialmente detectable

8.5.3. Estrategias de Proteccion

Estrategia Descripcion Implementacion
Recordatorios periodicos Sugerir backup cada 30 dias Notificacion local
Alerta al desinstalar (Android) Mostrar advertencia si es posible BroadcastReceiver
Persistencia externa (opcional) Guardar en almacenamiento externo Usuario decide

8.5.4. Flujo de Proteccion Pre-Desinstalacion (Android)

flowchart TD
    A[Usuario inicia desinstalacion] --> B{Android puede interceptar?}

    B -->|Si - algunas versiones| C[Mostrar alerta]
    B -->|No| D[App se desinstala sin aviso]

    C --> E[Has exportado tus datos?]
    E --> F{Usuario responde}

    F -->|Si, continuar| G[Desinstalar app]
    F -->|No, exportar primero| H[Abrir app en pantalla de backup]
    F -->|Ignorar| G

    H --> I[Usuario exporta backup]
    I --> J[Usuario puede desinstalar manualmente]

8.5.5. Pantalla de Recordatorio de Backup

+--------------------------------------------------+
| PROTEGE TUS DATOS                                 |
+--------------------------------------------------+

Han pasado [X] dias desde tu ultimo backup.

Si desinstalar la app sin exportar tus datos,
los perderas permanentemente.

Datos en riesgo:
- 5 medicamentos activos
- 127 registros de tomas
- 3 recetas guardadas

[Exportar backup ahora]       [Recordar manana]

+--------------------------------------------------+

8.5.6. Opciones de Almacenamiento Externo (Opcional)

Opcion Descripcion Pros Contras
iCloud (iOS) Almacenar en carpeta de usuario Sobrevive reinstalacion Ocupa espacio iCloud
Google Drive Almacenar en carpeta de app Sobrevive reinstalacion Requiere conexion
Descargas locales Archivo en carpeta Descargas Persiste en dispositivo Usuario puede borrarlo

8.6. Mitigación de Limitaciones iOS (UF-BCK-001)

Decisión Director Iteración 11: Opción B - Recordatorios frecuentes + backup automático a iCloud personal.

8.6.1. Problema

iOS no permite interceptar la desinstalación de apps, lo que significa que los usuarios Free que no exportan backup pierden todos sus datos permanentemente.

8.6.2. Solución Implementada

Componente Descripción
Recordatorios frecuentes Notificaciones periódicas para hacer backup
Backup a iCloud personal Guardar en carpeta Documents de iCloud del usuario
Guía en onboarding Explicar importancia del backup desde el inicio

8.6.3. Flujo de Backup Automático a iCloud Personal (Free - iOS)

flowchart TD
    A[Usuario Free iOS] --> B{Primera configuración?}
    B -->|Sí| C[Mostrar guía de backup en onboarding]

    C --> D{Usuario activa backup a iCloud?}
    D -->|Sí| E[Configurar backup automático semanal]
    D -->|No| F[Recordar cada 30 días]

    E --> G[Guardar en iCloud/MedTime/backups/]
    G --> H[Archivo cifrado con PIN del usuario]

    F --> I[Notificación: Protege tus datos]
    I --> J{Usuario activa?}
    J -->|Sí| E
    J -->|No| K[Repetir en 30 días]

8.6.4. Recordatorios de Backup (iOS Free)

Evento Frecuencia Mensaje
Sin backup configurado Cada 7 días "Protege tus datos médicos"
Backup antiguo (>14 días) Cada 3 días "Tu backup tiene X días"
Cambios significativos Inmediato "Nuevos medicamentos sin respaldar"
Post-onboarding Día 1, 3, 7 "¿Ya configuraste tu backup?"

8.6.5. Pantalla de Configuración iCloud (iOS Free)

+--------------------------------------------------+
| BACKUP A ICLOUD PERSONAL                          |
+--------------------------------------------------+

Tu iPhone puede guardar automáticamente una copia
de seguridad de MedTime en tu iCloud personal.

[ ] Activar backup automático a iCloud
    └─ Frecuencia: [Semanal v]
    └─ Cifrado: Con tu PIN de MedTime
    └─ Ubicación: iCloud Drive/MedTime/

Espacio usado: 2.3 MB de tu iCloud personal

[!] IMPORTANTE:
Si desinstalar la app sin backup, tus datos
se perderán permanentemente.

[Activar backup a iCloud]    [Ahora no]

+--------------------------------------------------+

8.6.6. Ubicación del Backup en iCloud

iCloud Drive/
└── MedTime/
    └── backups/
        ├── medtime_backup_2025-12-01.medtime (cifrado)
        └── medtime_backup_2025-11-24.medtime (cifrado)

8.6.7. Reglas de Negocio Mitigación iOS

ID Regla
RN-IOS-001 Backup a iCloud personal es opcional pero altamente recomendado
RN-IOS-002 Frecuencia mínima de backup: semanal
RN-IOS-003 Archivos cifrados con PIN del usuario (AES-256)
RN-IOS-004 Máximo 4 versiones de backup en iCloud (auto-limpieza)
RN-IOS-005 Recordatorio persistente si backup > 14 días
RN-IOS-006 Onboarding iOS Free debe enfatizar importancia del backup

8.6.8. Reglas de Negocio Persistencia

ID Regla
RN-PER-001 Datos Free se eliminan al desinstalar si no hay backup
RN-PER-002 Sistema recomienda backup cada 30 dias
RN-PER-003 Alerta de desinstalacion solo disponible en Android (si OS lo permite)
RN-PER-004 Usuario puede optar por almacenamiento externo para mayor seguridad
RN-PER-005 Pro/Perfect: datos persisten en cloud independiente de la app

8.6.9. Restauracion de Backup (Free)

  1. Usuario instala MedTime en nuevo dispositivo
  2. Selecciona "Tengo un backup"
  3. Selecciona archivo .medtime
  4. Ingresa contrasena de cifrado
  5. Sistema verifica integridad
  6. Sistema restaura todos los datos
  7. Usuario configura alertas locales

8.6.10. Reglas de Backup Offline

ID Regla
RN-BCK-011 Backup Free siempre es manual (nunca automatico)
RN-BCK-012 Archivo .medtime incluye cifrado AES-256
RN-BCK-013 Contrasena de backup es definida por usuario
RN-BCK-014 Recordatorio de backup a los 30/60/90 dias
RN-BCK-015 Restauracion verifica integridad antes de aplicar

9. Indicadores de Estado

9.1. Indicador de Conexión

Estado Indicador Visual Comportamiento
Online ✓ Verde (sutil) Sincronización activa
Offline ○ Gris Modo offline activo
Sincronizando ↻ Azul Procesando cola
Error de sync ⚠ Amarillo Reintentos pendientes

9.2. Indicador de Datos Pendientes

Elementos Indicador
0 pendientes Sin indicador
1-10 pendientes Badge pequeño
11+ pendientes Badge con número
Error de sync Badge rojo

10. Casos de Uso

10.1. Usuario Sin Internet Todo el Día

1. Usuario despierta, abre app (offline)
2. Ve calendario del día normalmente
3. Recibe alerta de medicamento (notificación local)
4. Confirma toma desde notificación
5. Registro se guarda localmente
6. Estadísticas se actualizan localmente
7. Al llegar a casa (WiFi), datos se sincronizan (Pro/Perfect)

10.2. Viaje Sin Conexión (1 Semana)

1. Antes del viaje: app sincroniza y programa 7 días de alertas
2. Durante viaje: todas las funciones operan normalmente
3. Registros de toma se acumulan localmente
4. Al volver: sincronización automática de todos los registros
5. Cuidadores ven historial actualizado

10.3. Usuario Free (100% Local)

1. Usuario descarga app y crea cuenta local
2. Agrega medicamentos manualmente
3. Configura horarios
4. Usa app indefinidamente sin conexión
5. Datos nunca salen del dispositivo
6. Si cambia de teléfono: exporta/importa archivo cifrado

11. Requisitos Técnicos

11.1. Espacio de Almacenamiento

Uso Espacio Estimado
App base ~50 MB
Catálogo offline ~20 MB
1 año de datos de usuario típico ~10 MB
10 recetas con imágenes ~50 MB
Total típico ~130 MB

11.2. Consumo de Batería

Componente Impacto Optimización
Alertas programadas Mínimo Usar APIs nativas del sistema
Base de datos local Bajo Transacciones batch
Sincronización Moderado Solo con WiFi (configurable)

12. Testing Offline

12.1. Escenarios de Prueba

ID Escenario Resultado Esperado
OFF-T-001 Activar modo avión, confirmar tomas Registro exitoso local
OFF-T-002 7 días offline, reconectar Sincronización completa
OFF-T-003 Modificar mismo registro offline/online Resolución correcta de conflicto
OFF-T-004 Reiniciar dispositivo Alertas se mantienen programadas
OFF-T-005 Cambiar zona horaria Alertas se recalculan

13. Casos de Error

13.1. ERR-OFF-001: Conflicto de Sincronización

Campo Valor
Código ERR-OFF-001
Descripción Datos modificados offline entran en conflicto con datos del servidor
Causa Usuario edita mismo registro en dos dispositivos, o offline y un cuidador online
Detección version_local != version_servidor al intentar sync
Acción Usuario Mostrar: "Hay cambios en conflicto. ¿Cuál versión conservar?" con vista de diferencias
Acción Sistema Pausar sync del registro conflictivo, mostrar ambas versiones, registrar resolución
Severidad Media
Recuperación Usuario elige versión ganadora o hace merge manual

13.2. ERR-OFF-002: Espacio Insuficiente para Sync

Campo Valor
Código ERR-OFF-002
Descripción No hay espacio suficiente en dispositivo para descargar datos pendientes
Causa Dispositivo lleno, demasiados datos acumulados en servidor
Detección Error de escritura a disco durante sync
Acción Usuario Mostrar: "No hay espacio para sincronizar [X] MB. Libera espacio o descarga parcialmente."
Acción Sistema Pausar sync, ofrecer sync parcial (solo críticos), no perder datos locales
Severidad Media
Recuperación Usuario libera espacio o sincroniza parcialmente

13.3. ERR-OFF-003: Base de Datos Local Corrupta

Campo Valor
Código ERR-OFF-003
Descripción La base de datos SQLite local está corrupta o inaccesible
Causa App crashea durante escritura, reinicio forzado, error de disco
Detección Error de integridad al abrir base de datos
Acción Usuario Mostrar: "Hay un problema con tus datos locales. Intentando reparar..."
Acción Sistema Intentar VACUUM y reparación, si falla restaurar desde backup local, último recurso: re-sync desde cloud
Severidad Alta
Recuperación Reparación automática -> backup local -> re-sync cloud

13.4. ERR-OFF-004: Alertas No Programadas

Campo Valor
Código ERR-OFF-004
Descripción Sistema operativo no permite programar alertas (permisos denegados)
Causa Usuario denegó permisos, límite de alarmas del OS, ahorro de batería agresivo
Detección API de notificaciones retorna error
Acción Usuario Mostrar: "No podemos enviarte recordatorios. Revisa permisos en Configuración." con link directo
Acción Sistema Guardar tomas programadas, reintentar al siguiente inicio, badge en app de recordatorios pendientes
Severidad Alta
Recuperación Usuario habilita permisos, sistema reprograma alertas pendientes

13.5. ERR-OFF-005: Backup a iCloud Falla

Campo Valor
Código ERR-OFF-005
Descripción No se puede guardar backup en iCloud personal (iOS Free)
Causa iCloud lleno, usuario no logueado en iCloud, sin conexión
Detección Error de escritura a iCloud Drive
Acción Usuario Mostrar: "No pudimos guardar tu backup en iCloud: [razón]. Alternativas: exportar archivo."
Acción Sistema Ofrecer exportar archivo local como alternativa, programar reintento, no mostrar como exitoso
Severidad Media
Recuperación Usuario corrige problema de iCloud o usa backup alternativo

13.6. Reglas de Manejo de Errores Offline

ID Regla
RN-ERR-OFF-001 Conflictos de sync NUNCA borran datos automáticamente
RN-ERR-OFF-002 Datos locales tienen prioridad sobre cloud si no hay conexión
RN-ERR-OFF-003 Corrupción de DB intenta 3 niveles de recuperación antes de pedir re-sync
RN-ERR-OFF-004 App funciona sin permisos de notificación, pero con UX degradada
RN-ERR-OFF-005 Backup fallido no se reporta como exitoso al usuario

13.7. Diagrama de Resolución de Conflictos

flowchart TD
    A[Sync detecta conflicto] --> B{Tipo de conflicto?}

    B -->|Mismo campo| C[Mostrar ambos valores]
    B -->|Campos diferentes| D[Auto-merge]

    C --> E{Usuario elige}
    E -->|Versión local| F[Aplicar local, descartar servidor]
    E -->|Versión servidor| G[Aplicar servidor, descartar local]
    E -->|Merge manual| H[Abrir editor con ambas versiones]

    D --> I[Combinar cambios automáticamente]
    I --> J[Notificar usuario del merge]

    F --> K[Marcar conflicto resuelto]
    G --> K
    H --> K
    J --> K

    K --> L[Continuar sync]

14. API Endpoints de Sincronizacion (Iteracion 13)

Referencia: Ver 11-estandares-api.md para especificaciones completas.

14.1. Endpoints de Sincronizacion

Metodo Endpoint Descripcion Auth
GET /v1/sync/status Estado de sincronizacion Bearer
POST /v1/sync/push Enviar cambios locales Bearer
GET /v1/sync/pull Obtener cambios remotos Bearer
POST /v1/sync/resolve Resolver conflictos Bearer

14.2. Request/Response Push

14.2.1. Request

{
  "device_id": "uuid",
  "last_sync": "2025-12-03T08:00:00Z",
  "changes": [
    {
      "entity": "medication_event",
      "id": "uuid",
      "action": "update",
      "data": { ... },
      "timestamp": "2025-12-03T08:15:00Z"
    }
  ]
}

14.2.2. Response (200)

{
  "data": {
    "accepted": 5,
    "conflicts": [
      {
        "id": "uuid",
        "local_version": { ... },
        "remote_version": { ... },
        "resolution_required": true
      }
    ],
    "server_time": "2025-12-03T08:20:00Z"
  }
}

14.3. Request/Response Resolver Conflicto

14.3.1. Request

{
  "conflict_id": "uuid",
  "resolution": "keep_local",
  "merged_data": null
}

14.3.2. Response (200)

{
  "data": {
    "resolved": true,
    "final_version": { ... }
  }
}

15. Referencias


Documento generado por SpecQueen - La especificación funcional ES el sistema.