Skip to main content

Sync e Architettura Offline-First

Panoramica

La piattaforma Impronto Enterprise adotta un'architettura offline-first: le applicazioni Flutter (cassa, cameriere, kiosk) funzionano interamente in locale, anche in assenza di connessione internet. I dati vengono memorizzati sul dispositivo tramite il database Isar e sincronizzati con il backend MongoDB quando la rete e disponibile.

Database Locale Isar

Ogni applicazione Flutter utilizza Isar come database locale embedded. Isar offre:

  • Prestazioni native: query sotto il millisecondo anche con migliaia di record
  • Schema tipizzato: i modelli Dart definiscono le collection con indici e relazioni
  • Zero configurazione: nessun server locale, il database risiede nel filesystem dell'app
  • Multi-piattaforma: funziona su Android, iOS, Windows, macOS e Linux

Le entita principali memorizzate localmente includono: prodotti, categorie, ordini, clienti, configurazioni cassa e turni.

Meccanismo di Sync Delta

La sincronizzazione tra client e server avviene tramite il servizio sync.service.js con un approccio delta sync:

  1. Il client invia una richiesta con il timestamp dell'ultima sincronizzazione (lastSyncAt)
  2. Il server interroga il database tenant per trovare documenti modificati dopo quel timestamp
  3. Il server restituisce solo i documenti cambiati (creati, aggiornati o eliminati)
  4. Il client applica le modifiche al database Isar locale
  5. Il client aggiorna il proprio lastSyncAt

Questo approccio minimizza il traffico di rete: dopo la sincronizzazione iniziale completa, le successive trasferiscono solo le differenze.

SyncMixin e Eventi

Lato backend, il SyncMixin viene aggiunto ai servizi che devono supportare la sincronizzazione. Il mixin emette automaticamente eventi Moleculer quando un documento viene creato, aggiornato o eliminato:

  • sync.created -- nuovo documento
  • sync.updated -- documento modificato
  • sync.deleted -- documento rimosso

Questi eventi vengono utilizzati dal servizio sync.service.js per notificare i client connessi in tempo reale tramite il trasporto real-time (NATS o LAN WebSocket).

Sincronizzazione Bidirezionale

La sincronizzazione opera in entrambe le direzioni:

Server verso Client (pull)

Il client scarica periodicamente le modifiche dal server. Questo copre: aggiornamenti al catalogo prodotti, nuove configurazioni, modifiche ai tavoli e alle sale. La frequenza di pull e configurabile (default: ogni 30 secondi quando online).

Client verso Server (push)

Il client invia al server i dati creati localmente: ordini effettuati, movimenti di cassa, dati clienti. Il push avviene immediatamente quando la rete e disponibile, oppure viene accodato e inviato alla riconnessione.

Gestione Conflitti

In caso di modifiche concorrenti sullo stesso documento, il sistema applica la strategia last-write-wins basata sul timestamp updatedAt. Se un documento e stato modificato sia sul client che sul server:

  • Vince la versione con il timestamp piu recente
  • La versione perdente viene scartata (non mantenuta come versione alternativa)
  • Per gli ordini, la strategia e piu conservativa: gli ordini creati offline vengono sempre preservati

Rilevamento Stato Rete

Le applicazioni Flutter monitorano continuamente lo stato della connessione di rete:

  • Online: sincronizzazione attiva, push immediato, pull periodico
  • Offline: operativita locale completa, modifiche accodate per il push successivo
  • Degradato: connessione instabile, retry con backoff esponenziale

L'indicatore di stato rete e visibile nella barra superiore dell'applicazione cassa.

FAQ

D: Cosa succede se creo ordini offline e la sincronizzazione fallisce? R: Gli ordini creati offline vengono salvati nel database Isar con uno stato di "pending sync". Al ripristino della connessione, il sistema li invia automaticamente al server. Nessun ordine viene perso.

D: Quanto spazio occupa il database locale? R: Per un ristorante medio (500 prodotti, 100 ordini/giorno), il database Isar occupa circa 50-100 MB. I dati piu vecchi possono essere archiviati automaticamente per liberare spazio.

D: Posso forzare una sincronizzazione completa? R: Si, dalle Impostazioni dell'app e disponibile l'opzione "Reset sincronizzazione" che cancella il database locale e ri-scarica tutti i dati dal server.

Vedi Anche

Questa pagina ti è stata utile?