Perché una cassa in banchina deve funzionare senza rete?
La vendita in banchina si concentra negli ultimi minuti prima della partenza, con la coda davanti e una copertura spesso instabile. Se la cassa dipende dalla connessione, ogni rallentamento diventa un biglietto non venduto o un passeggero che rischia di perdere la corsa.
Abbiamo affrontato questo problema sviluppando un'app di cassa per le biglietterie dei traghetti, per Android e iOS, che trasforma uno smartphone o un tablet collegato a una stampante termica in una biglietteria completa. Questa guida raccoglie cosa conta davvero in un progetto del genere, e i problemi che si incontrano quando l'app esce dall'ufficio e arriva sul molo.
Come funziona una vendita senza connessione?
Il principio si chiama offline first: l'app lavora sempre sui dati presenti sul dispositivo, e la rete serve solo a tenerli allineati con la piattaforma centrale. Una vendita segue questi passaggi:
- L'operatore sceglie il biglietto dal catalogo già salvato sul dispositivo e registra il pagamento.
- La vendita si salva in locale, nel nostro caso in un database SQLite.
- Il biglietto viene stampato, via Bluetooth, con orario di partenza e QR code.
- La vendita viene sincronizzata con il back-office appena la rete torna, senza che l'operatore debba fare nulla.
Per questo la coda non si ferma quando cade la copertura: l'operatore continua a lavorare allo stesso modo, e l'ufficio ritrova le vendite non appena il dispositivo si ricollega. In questo modo vendite in banchina, vendite online e prenotazioni B2B finiscono nello stesso posto.
La sincronizzazione deve anche sopportare gli invii ripetuti. Se la rete cade proprio mentre una vendita viene inviata, l'app non può sapere se è arrivata e la rimanderà: il sistema deve riconoscerla, per esempio con un codice univoco creato sul dispositivo, senza contarla due volte negli incassi.
Il pagamento con carta è un discorso a parte. L'app può registrare il metodo di pagamento anche offline, ma il terminale POS ha bisogno della propria connessione: se in banchina la rete manca del tutto, va previsto cosa fare in quel caso.
Cosa succede ai posti se le casse sono offline?
È la prima domanda da farsi, perché la risposta cambia il progetto. Dipende da una cosa sola: i biglietti che vendete hanno un numero di posti dichiarato?
Senza un numero di posti, il problema non esiste. È il caso dell'app che abbiamo sviluppato: i biglietti venduti in banchina non hanno una quantità dichiarata, quindi più casse possono vendere offline nello stesso momento senza conflitti da risolvere. Quando la rete torna, ogni vendita viene semplicemente aggiunta alle altre.
Con una capienza da rispettare, le cose cambiano. Una cassa offline non può sapere cosa stanno vendendo le altre, né cosa è stato venduto online, e nessuna tecnologia può colmare questo vuoto. Va presa una decisione di gestione prima di sviluppare, e le strade principali sono tre:
- Assegnare a ogni cassa una quota di posti, che può vendere anche offline senza chiedere conferma
- Bloccare la vendita offline oltre una certa soglia di riempimento della corsa, quando il rischio diventa troppo alto
- Accettare l'eccezione e gestire a posteriori gli eventuali esuberi, con una regola chiara per il personale
La scelta dipende da quanto spesso le corse si riempiono davvero e da quanto pesa un esubero. Se sbarcare un passeggero è impensabile, la quota è la strada più sicura.
Quale stampante termica scegliere?
Le stampanti termiche stampano senza inchiostro, su carta sensibile al calore: non ci sono cartucce da cambiare e la stampa è rapida, due vantaggi concreti quando c'è la coda. Nel nostro progetto usiamo stampanti del produttore italiano Custom, con l'app configurata sia per i modelli da 58 mm sia per quelli da 80 mm.
Cos'è ESC/POS e perché conta?
ESC/POS è il linguaggio di comandi nato con le stampanti Epson e oggi supportato da molti produttori. L'app gli invia testo, grassetti, immagini, QR code e il comando di taglio della carta. Scegliere stampanti ESC/POS significa non legare il software a un singolo modello. Non è però una garanzia assoluta: l'implementazione varia da un modello all'altro, per esempio nella gestione delle immagini o dei QR code, quindi ogni nuova stampante va provata con il biglietto reale.
58 o 80 mm?
| 58 mm | 80 mm | |
|---|---|---|
| Caratteri per riga (font standard) | Di solito 32 | Di solito 48 |
| Ingombro | Più compatta, comoda da portare | Più grande, adatta a un banco fisso |
| Biglietto | Più stretto e più lungo | Più spazio per testo e QR code |
L'impaginazione va definita per ciascuna larghezza. Un biglietto disegnato per 80 mm non si adatta da solo ai 58: le righe vanno a capo nel punto sbagliato e il QR code può risultare troppo grande o troppo piccolo. Rendere la larghezza un'impostazione dell'app permette di usare entrambi i formati con lo stesso software. Il QR code in particolare va provato con lo scanner che si userà davvero all'imbarco, perché il biglietto stampato deve leggersi al primo colpo.
Una nota che vale prima di iniziare: una stampante termica stampa biglietti, ma non è di per sé un registratore telematico. Se la vostra attività ha obblighi di memorizzazione e invio dei corrispettivi, chiarite con il commercialista quale documento deve emettere la cassa, perché la risposta può cambiare il progetto.
Quali problemi si incontrano sul campo?
Sul molo il software viene messo alla prova da cose che in ufficio non succedono. I tre punti che hanno richiesto più attenzione nel nostro progetto sono questi.
Il Bluetooth che cade
La connessione con la stampante prima o poi si interrompe: la stampante si spegne o va in standby, si scarica, il dispositivo si allontana, il sistema operativo chiude la connessione. Va considerato un evento normale, non un errore raro.
L'app deve quindi riconnettersi da sola, come fa la nostra, e mostrare in ogni momento lo stato della stampante. Un operatore con la coda davanti non può aprire le impostazioni Bluetooth del telefono ogni volta che la connessione cade.
Il salvataggio del biglietto
Cosa succede se la stampante si disconnette proprio mentre sta stampando un biglietto già pagato? L'ordine delle operazioni decide tutto: la vendita va salvata prima di mandare in stampa. Così un problema della stampante non fa perdere né l'incasso né il biglietto, e l'operatore può riprovare appena la stampante torna disponibile.
Salvare prima di stampare evita anche l'errore opposto, cioè rifare la vendita da capo e ritrovarsi con un incasso registrato due volte.
La ristampa
La ristampa serve più di quanto si pensi: una stampa fallita a metà, la carta finita, un passeggero che ha perso il biglietto. Deve essere veloce da trovare e, soprattutto, non deve creare una nuova vendita: è una nuova copia dello stesso biglietto, con lo stesso QR code, e non cambia gli incassi della giornata.
Conviene anche tenere traccia delle stampe. Nella nostra app c'è un log dedicato: se a fine giornata i conti non tornano, si può ricostruire cosa è stato stampato e quando.
Android o iOS: cambia qualcosa?
Sviluppando in Flutter il codice dell'app è uno solo, e la nostra cassa funziona su entrambi i sistemi. Il Bluetooth però è uno dei punti in cui le piattaforme si comportano in modo diverso.
Android permette di dialogare con le stampanti Bluetooth tradizionali con pochi vincoli. Su iPhone e iPad le app comunicano liberamente con i dispositivi Bluetooth Low Energy, mentre il Bluetooth classico richiede in genere accessori certificati da Apple (programma MFi). In pratica una stampante che funziona perfettamente con un tablet Android può non essere utilizzabile da un iPad.
Se le casse useranno dispositivi iOS, anche solo in parte, la scelta della stampante va fatta insieme allo sviluppo: procuratevi un esemplare del modello esatto e provatelo su entrambi i sistemi prima di ordinarne dieci.
Cosa chiedere a chi sviluppa l'app di cassa
- Se spengo il Wi-Fi e i dati, posso vendere e stampare come sempre? Fatevelo mostrare dal vivo.
- Cosa succede se la stampante si spegne mentre stampa un biglietto già pagato?
- La ristampa crea una nuova vendita, o una copia dello stesso biglietto?
- Se la stessa vendita viene inviata due volte, come si evita di contarla doppia?
- Come si gestiscono i posti quando le casse sono offline?
- Con quali stampanti avete provato l'app, e su quali sistemi?
- L'app gestisce più larghezze di carta, o solo una?
- Come si registra ogni dispositivo come cassa, e cosa vede l'ufficio a fine giornata?
Da dove partire
Il momento giusto è la bassa stagione: c'è tempo per provare stampanti e flussi in banchina, con il personale che userà l'app ogni giorno, prima che arrivino le code. Una cassa di questo tipo può nascere da sola o collegata alla biglietteria online e al back-office, come nell'ecosistema che abbiamo realizzato per una compagnia di traghetti.
Noi partiamo da una call gratuita di 30 minuti e definiamo una prima milestone a prezzo fisso, di solito vendita, stampa e sincronizzazione, per poi aggiungere gruppi, B2B e report. Trovate come lavoriamo nella pagina sullo sviluppo di app su misura.