Integrazione Stampante Fiscale Epson FP
Panoramica
La piattaforma supporta le stampanti fiscali Epson FP-81II RT tramite connessione socket TCP diretta. Il driver EpsonFpDriver (modulo Flutter pos_mod_fiscal) implementa il protocollo proprietario Epson a comandi PDU per emettere scontrini fiscali, report X/Z e documenti gestionali.
Flusso di Emissione Scontrino
La sequenza di comandi per uno scontrino fiscale completo e:
- Status Check (1074) -- Verifica che la stampante sia pronta
- Apertura scontrino (1085) -- Begin fiscal receipt
- Righe articolo (1080) -- Un comando per ogni articolo
- Sconti articolo (1083) -- Sconti applicati al singolo articolo (TYPE=0)
- Subtotale (1086) -- Se presente sconto globale
- Sconto globale (1083) -- Sconto sul totale carrello (TYPE=2)
- Pagamenti (1084) -- Uno o piu pagamenti
- Chiusura scontrino (1087) -- End fiscal receipt
Formato Comandi Principali
Articolo (1080)
Struttura dati: OP(2) + DESC(20) + QTY(7) + PRICE(9) + DEP(2) + ALIGN(1)
- DESC: Descrizione articolo, massimo 20 caratteri. Deve essere padded a destra con spazi. Caratteri non-ASCII vengono rimossi.
- QTY: Quantita in millesimi (es.
2.5→0002500), 7 cifre con zero-padding - PRICE: Prezzo unitario in centesimi (es.
8.50→000000850), 9 cifre - DEP: Reparto fiscale (01-99), mappato da
vat_mapodepartment_map
Sconto/Maggiorazione (1083)
Struttura dati: OP(2) + DESC(20) + AMN(9) + TYPE(1) + DEP(2) + ALIGN(1)
- AMN: Importo in centesimi (es.
2.00→000000200), 9 cifre - TYPE:
0= sconto su articolo,2= sconto su subtotale,1= maggiorazione
Pagamento (1084)
Struttura dati: OP(2) + DESC(20) + AMN(9) + CODE(3) + ALIGN(1)
- AMN: Importo pagamento in centesimi
- CODE:
000= contanti,001= elettronico,002= buono pasto
Limite Critico: DESC a 20 Caratteri
La Epson FP-81II usa un campo DESC di esattamente 20 caratteri per tutti i comandi (1080, 1083, 1084). Un errore comune e usare una lunghezza maggiore (es. 42 caratteri), che causa l'errore ERR01.16 ("NON PREVISTO").
Il driver gestisce questo troncando e paddando:
String desc = item.description.replaceAll(RegExp(r'[^\x20-\x7E]'), '');
if (desc.length > 20) desc = desc.substring(0, 20);
desc = desc.padRight(20);
Formato PDU e Checksum
Ogni comando viene inviato come PDU con struttura:
STX(1) + CNT(2) + IDEN(1) + CMD(4) + DATA(n) + CKS(2) + ETX(1)
- CNT: Contatore sequenziale da 01 a 99
- IDEN: Identificatore fisso
E - CKS: Somma dei byte del payload modulo 100, convertita in due caratteri ASCII
Rilevamento Errori
Le risposte di errore hanno la struttura STX + CNT(2) + IDEN(1) + "ERR" + TYPE(2) + CODE(2) + CKS(2) + ETX. Il driver rimuove i primi 3 caratteri (CNT+IDEN) e verifica se il body inizia con ERR.
Errori comuni:
| Codice | Significato | Causa Tipica |
|---|---|---|
| ERR01.16 | "NON PREVISTO" | Lunghezza dati errata (DESC non 20 char) |
| ERR01.06 | "COMANDO NON AMMESSO" | Comando inviato fuori sequenza |
| NAK | Errore generico | Stampante non pronta o coperchio aperto |
Mappatura Reparti Fiscali
Il driver supporta due modalita di mappatura degli articoli ai reparti della stampante:
department_map: MappafiscalDepartmentIddell'articolo al numero di reparto (priorita alta)vat_map: Mappa l'aliquota IVA al numero di reparto ("22": 1, "10": 2, "4": 3, "0": 4)
Se un articolo ha fiscalDepartmentId presente nella department_map, viene usato quello. Altrimenti, il fallback e la vat_map.
Nota Importante per il Print Routing
Nel sistema di routing stampa della piattaforma, il controllo layoutId == null non deve mai essere usato per escludere le stampanti fiscali. Le stampanti fiscali non usano layout ESC/POS (il formato e diverso), quindi layoutId e sempre null per loro.
FAQ
D: Quale porta TCP usa la Epson FP-81II? R: La porta predefinita e 9100. E configurabile nelle impostazioni stampante dell'app.
D: Posso emettere uno scontrino di cortesia (non fiscale)?
R: Si, usando i comandi gestionale (1063/1064/1065) invece dei comandi fiscali. Il driver espone il metodo printManagementDocument() per questo scopo.
D: Come gestisco i timeout di comunicazione? R: Il driver attende fino a 10 secondi per ogni risposta. Se la stampante non risponde, la transazione viene chiusa e il socket disconnesso. L'utente puo ritentare.
Vedi Anche
- API Ordini -- Flusso ordini e pagamento
- Mixin Database -- Pattern per accesso dati multi-tenant
- Panoramica Architettura -- Visione d'insieme della piattaforma