Conformità TSE — Documentazione per i verificatori fiscali¶
Questo documento è rivolto a verificatori fiscali, autorità tributarie e consulenti fiscali e descrive l'implementazione tecnica del collegamento TSE nel sistema di cassa DiKAS, conformemente ai requisiti di legge vigenti.
1. Basi legali¶
DiKAS soddisfa i requisiti delle seguenti normative:
| Normativa | Contenuto |
|---|---|
| § 146a AO | Tenuta regolare della cassa, obbligo di utilizzo di una TSE |
| KassenSichV | Regolamento sulla sicurezza delle casse — requisiti tecnici per la TSE |
| AEAO relativo al § 146a AO | Disposizione applicativa con specifiche di dettaglio su ProcessTypes, ProcessData, codice QR |
| DSFinV-K | Interfaccia digitale dell'amministrazione finanziaria per i sistemi di cassa |
| GDPdU / GoBD | Principi per la tenuta e la conservazione regolari dei libri contabili (verifica fiscale digitale) |
2. Tipi di processo firmati (ProcessTypes)¶
DiKAS firma tutti i processi rilevanti ai fini di cassa secondo l'AEAO relativo al § 146a AO — non solo gli scontrini di cassa. Vengono utilizzati tre ProcessTypes secondo DSFinV-K:
2.1 Kassenbeleg-V1¶
| Proprietà | Valore |
|---|---|
| ProcessType | Kassenbeleg-V1 |
| Processi attivanti | Ogni pagamento concluso (vendita diretta, pagamento al tavolo, storno) |
| Entities | Receipt (DocumentType: Receipt2) |
Formato ProcessData:
Esempi:
Beleg^119.00_19.00:19.00 # Ein Steuersatz (19%)
Beleg^50.00_19.00:5.00_7.00:2.00 # Zwei Steuersätze (19% + 7%)
Beleg^0.00_0.00:0.00 # Nullbeleg
Tutti gli importi vengono formattati con due cifre decimali e il punto come separatore decimale (Invariant Culture), in conformità con la specifica DSFinV-K.
2.2 Bestellung-V1¶
| Proprietà | Valore |
|---|---|
| ProcessType | Bestellung-V1 |
| Processi attivanti | Ogni ordine effettuato nel servizio al tavolo |
| Entities | OpenBon (DocumentType: OpenBon) |
Formato ProcessData:
Esempio:
In caso di ordini cumulativi (batch), la firma TSE viene memorizzata sul primo scontrino del lotto. I ProcessData contengono tutte le posizioni dell'intero ordine.
2.3 SonstigerVorgang¶
| Proprietà | Valore |
|---|---|
| ProcessType | SonstigerVorgang |
| Processi attivanti | Apertura turno, chiusura turno, chiusura giornaliera, spese |
| Entities | Exchange, DayClose, Spending |
Formato ProcessData:
Tipi di processo concreti:
| Tipo di processo | Descrizione | Esempio ProcessData |
|---|---|---|
AVSichOpen |
Apertura turno | AVSichOpen^Schichteroeffnung^200.00 |
AVSichClose |
Chiusura turno | AVSichClose^Schichtschliessung^350.00 |
AVKassenschnitt |
Chiusura giornaliera (report Z) | AVKassenschnitt^Tagesabschluss^1500.00 |
AVBelegabbruch |
Processo di storno | AVBelegabbruch^Storno |
AVSons662 |
Spesa/prelievo di contanti | AVSonstige^Ausgabe^50.00 |
3. Campi dati TSE sui documenti¶
Ogni documento firmato memorizza i seguenti 9 campi TSE (implementati tramite l'interfaccia ITseDataHolder):
| Campo | Tipo | Descrizione |
|---|---|---|
TseTransactionNumber |
String | Numero di transazione univoco della TSE |
TseSignature |
String | Firma digitale (codificata in Base64) |
TseStartTime |
DateTime | Inizio della firma (UTC) |
TseEndTime |
DateTime | Fine della firma (UTC) |
TseSignatureCounter |
UInt64 | Contatore di firma monotòno crescente |
TseProcessData |
String | Dati di processo firmati (vedere sezione 2) |
TseProcessType |
String | Identificatore ProcessType |
TseSerialNumber |
String | Numero di serie della TSE utilizzata |
TseError |
String | Messaggio di errore in caso di errore di firma (null in caso di successo) |
Questi campi vengono memorizzati sulle seguenti entità:
- Receipt — Scontrini di cassa (vendita, storno, reso)
- OpenBon — Posizioni d'ordine (scontrino capofila negli ordini cumulativi)
- Exchange — Aperture e chiusure di turno
- DayClose — Chiusure giornaliere (report Z)
- Spending — Spese e prelievi di contanti
4. Formato del codice QR (DSFinV-K Allegato I)¶
Ogni scontrino di cassa contiene un codice QR con i dati TSE nel formato standardizzato secondo DSFinV-K Allegato I:
V0;{KassenSeriennummer};{ProcessType};{ProcessData};{TransaktionsNr};{SignaturZähler};{StartZeit};{EndZeit};{SigAlgorithmus};{LogZeitformat};{Signatur};{PublicKey}
Concretamente:
V0;KASSE-001;Kassenbeleg-V1;Beleg^29.30_19.00:4.68;12345;67890;2026-03-13T18:30:00.000Z;2026-03-13T18:30:01.000Z;ecdsa-plain-SHA256;unixTime;a8f3c2d1e5b7...;PK123...
| Posizione | Campo | Origine |
|---|---|---|
| 1 | Versione | Sempre V0 |
| 2 | Numero di serie della cassa | CashPointSerialNumber da BackendConfig |
| 3 | ProcessType | TseProcessType dal giustificativo |
| 4 | ProcessData | TseProcessData dal giustificativo |
| 5 | Numero di transazione | TseTransactionNumber dal giustificativo |
| 6 | Contatore di firma | TseSignatureCounter dal giustificativo |
| 7 | Ora di inizio | TseStartTime (ISO 8601, UTC) |
| 8 | Ora di fine | TseEndTime (ISO 8601, UTC) |
| 9 | Algoritmo di firma | SigAlg da TseConfig (predefinito: ecdsa-plain-SHA256) |
| 10 | Formato dell'ora di log | LogTimeFormat da TseConfig (predefinito: unixTime) |
| 11 | Firma | TseSignature dal giustificativo |
| 12 | Chiave pubblica | PublicKey da TseConfig |
5. Identificazione della cassa (ClientId)¶
L'identificazione della cassa segue una catena di fallback a tre livelli:
| Priorità | Origine | Descrizione |
|---|---|---|
| 1 | CashPointSerialNumber |
Numero di serie della cassa configurato esplicitamente (licenza) |
| 2 | BonIdServer |
Identificativo del server scontrini da BackendConfig |
| 3 | "1" |
Valore predefinito di fallback |
Questa ClientId viene trasmessa come identificatore della cassa a ogni firma TSE e appare nel codice QR come numero di serie della cassa.
6. Configurazione TSE¶
La configurazione TSE viene memorizzata nel documento configTSE (TseConfig):
| Campo | Descrizione |
|---|---|
PublicKey |
Chiave pubblica della TSE |
Serial |
Numero di serie della TSE |
SigAlg |
Algoritmo di firma (predefinito: ecdsa-plain-SHA256) |
LogTimeFormat |
Formato dell'ora dei log TSE (predefinito: unixTime) |
LocalPath |
Percorso locale della TSE hardware |
SetupDate |
Data di messa in servizio della TSE |
DecomissionDate |
Data di messa fuori servizio della TSE |
TSESerialId |
ID serial interno |
Collegamenti TSE supportati¶
| Tipo | Implementazione | Descrizione |
|---|---|---|
| Hardware (Swissbit) | SwissbitTseService |
Accesso USB diretto alla TSE Swissbit |
| Proxy (rete) | TseProxyService |
TSE tramite proxy HTTP (ad es. Fiskaltrust) |
| Router | TseServiceRouter |
Inoltro automatico: proxy preferito, fallback su hardware |
7. Resilienza ai guasti e protocollazione¶
Registro delle interruzioni TSE (TseOutageLog)¶
Conformemente all'AEAO relativo al § 146a AO, DiKAS documenta automaticamente ogni interruzione della TSE:
| Campo | Descrizione |
|---|---|
StartTime |
Inizio dell'interruzione (UTC) |
EndTime |
Fine dell'interruzione (UTC, null se ancora in corso) |
Reason |
Causa (ad es. „TSE not available", „TSE timeout") |
AffectedTransactions |
Numero di transazioni interessate |
Svolgimento in caso di interruzione della TSE:
- La firma TSE fallisce → il campo
TseErrorsul documento viene impostato - Viene creata una nuova voce
TseOutageLog(con StartTime e Reason) - Il processo di cassa non viene bloccato — la transazione viene memorizzata senza firma
- Alla successiva firma riuscita, tutte le voci di interruzione aperte vengono chiuse (EndTime impostato)
Timeout: Ogni firma TSE ha un timeout di 5 secondi. In caso di superamento viene impostato TseError = "TSE timeout".
Verifica in fase di controllo¶
Per ogni documento con TseError != null è presente un errore di firma documentato. La voce TseOutageLog corrispondente attesta il periodo e la causa dell'interruzione.
8. Esportazione dei dati per la verifica fiscale¶
8.1 Esportazione DSFinV-K¶
DiKAS esporta tutti i dati di cassa nel formato DSFinV-K (interfaccia digitale dell'amministrazione finanziaria per i sistemi di cassa):
- Tutti i file CSV prescritti secondo la specifica DSFinV-K
- Esportazione per periodo possibile
- Contiene: registrazioni singole, dati anagrafici, dati TSE, chiusure di cassa
8.2 Esportazione TSE-TAR¶
Esportazione diretta dei dati di log TSE come archivio TAR:
- Esportazione completa: tutte le transazioni memorizzate della TSE
- Esportazione filtrata: per periodo (startDate/endDate)
- Endpoint API:
GET /api/v1/tse/export/tar
8.3 Esportazione GDPdU¶
Per la verifica fiscale digitale secondo GDPdU/GoBD:
- File di esportazione strutturato con tutti i dati fiscalmente rilevanti
- Leggibile dalle macchine per software di controllo (IDEA, AIS, ecc.)
8.4 Esportazione DATEV¶
Per la contabilità corrente presso il consulente fiscale:
- 7 modalità di esportazione (chiusura giornaliera, ProBon, ProÖffnungstag, WGR, WGR2, NachRechnung, spese)
- Formato EXTF v13 con chiavi BU corrette (USt 3/2/40, VSt 9/8/40)
- Opzionalmente crittografato (AES-256 ZIP) e inviabile via e-mail
9. Processo di firma nel dettaglio¶
9.1 Svolgimento di una firma¶
Kassenvorgang → TseSigningHelper → ITseService → TSE (Hardware/Proxy)
│ │
│ 1. BackendConfig laden │
│ 2. Prüfen: TSE verfügbar? │
│ 3. ProcessData aufbauen │
│ 4. ClientId auflösen │
│ 5. SignReceiptAsync aufrufen ───────→│
│ 6. Ergebnis auf Entity speichern ←──│
│ 7. OutageLog aktualisieren │
└──────────────────────────────────────┘
9.2 Quali handler firmano?¶
| Handler | Processo | ProcessType |
|---|---|---|
ProcessDirectSaleCommand |
Vendita diretta | Kassenbeleg-V1 |
ProcessTablePaymentCommand |
Pagamento al tavolo | Kassenbeleg-V1 |
VoidReceiptCommand |
Storno | Kassenbeleg-V1 |
CreateOpenBonCommand |
Ordine singolo | Bestellung-V1 |
CreateOpenBonsBatchCommand |
Ordine cumulativo | Bestellung-V1 |
OpenExchangeCommand |
Apertura turno | SonstigerVorgang |
CloseExchangeCommand |
Chiusura turno | SonstigerVorgang |
PerformDayCloseCommand |
Chiusura giornaliera | SonstigerVorgang |
CreateSpendingCommand |
Spesa/prelievo di contanti | SonstigerVorgang |
9.3 Gestione degli errori¶
La firma TSE è implementata in modo non bloccante:
- Gli errori TSE vengono documentati nel campo
TseError, il processo viene comunque memorizzato - Un
try/catchattorno all'intero processo di firma impedisce che i problemi della TSE compromettano l'attività di cassa - Il metodo
HandleOutageLogAsyncaggiorna il registro delle interruzioni dopo ogni firma (successo o errore)
10. Completezza delle registrazioni¶
Firma senza lacune¶
DiKAS garantisce la firma senza lacune di tutti i processi rilevanti ai fini di cassa mediante:
- Logica di firma centralizzata: tutte le firme passano attraverso
TseSigningHelper— non esiste alcun modo per concludere un processo rilevante ai fini di cassa senza una chiamata alla TSE - Contatore di firma monotòno: il
TseSignatureCounterè gestito dalla TSE e cresce in modo monotòno. Le lacune nel contatore indicano interruzioni, documentate nelTseOutageLog - Numeri di transazione: ogni transazione TSE riceve un
TseTransactionNumberunivoco - Timestamp: l'ora di inizio e di fine di ogni firma vengono memorizzate
Protezione contro le manipolazioni¶
- Algoritmo di firma: ECDSA con SHA-256 (ecdsa-plain-SHA256)
- L'hardware TSE è certificato BSI (Common Criteria)
- La chiave pubblica della TSE è memorizzata nella TseConfig e può essere utilizzata per la verifica della firma
- Le modifiche a posteriori ai documenti firmati sono rilevabili tramite la firma crittografica
11. Indicazioni per i verificatori fiscali¶
Dove trovare i dati TSE?¶
| Fonte dei dati | Accesso |
|---|---|
| Campi TSE sui giustificativi | In ogni documento Receipt/OpenBon/Exchange/DayClose/Spending |
| Codici QR | Sugli scontrini di cassa stampati |
| Registro delle interruzioni TSE | Documenti TseOutageLog nel database |
| Configurazione TSE | Documento configTSE |
| Esportazione DSFinV-K | Admin → Impostazioni → Esportazione → DSFinV-K |
| Esportazione TSE-TAR | Admin → Impostazioni → TSE → Esportazione |
| Esportazione GDPdU | Admin → Impostazioni → Esportazione → GDPdU |
Come verificare le firme?¶
- Scansionare il codice QR: ogni scontrino contiene un codice QR nel formato V0 (DSFinV-K Allegato I)
- Esportare il TSE-TAR: il file TAR contiene tutti i dati di log TSE e può essere validato con strumenti di controllo
- Verificare il contatore di firma: il contatore monotòno crescente non deve presentare lacune inspiegabili
- Registro delle interruzioni: le lacune nel contatore di firma devono essere spiegate da voci TseOutageLog
- Chiave pubblica: si trova nella TseConfig e può essere utilizzata per la verifica matematica delle singole firme
Lista di controllo per la verifica della cassa¶
- Il numero di serie della TSE corrisponde a quello comunicato all'Agenzia delle Entrate
- Il contatore di firma è privo di lacune (lacune spiegabili tramite i registri delle interruzioni)
- I ProcessTypes corrispondono alle disposizioni AEAO (Kassenbeleg-V1, Bestellung-V1, SonstigerVorgang)
- I formati ProcessData sono conformi a DSFinV-K
- Il formato del codice QR corrisponde a DSFinV-K Allegato I (formato V0)
- I timestamp sono plausibili (inizio < fine, crescenti cronologicamente)
- I tempi di interruzione della TSE sono documentati e tracciabili
- Tutti i tipi di processo rilevanti ai fini di cassa vengono firmati (non solo gli scontrini di cassa)
- L'esportazione DSFinV-K è completa e leggibile dalle macchine
- Il certificato TSE era valido nel periodo di verifica
12. Dati tecnici essenziali¶
| Proprietà | Valore |
|---|---|
| Algoritmo di firma | ECDSA con SHA-256 (ecdsa-plain-SHA256) |
| Formato del codice QR | DSFinV-K Allegato I, versione V0 |
| Formato dell'ora | ISO 8601, UTC (yyyy-MM-ddTHH |
| Formato degli importi | Invariant Culture, 2 cifre decimali (ad es. 119.00) |
| Timeout TSE | 5 secondi per firma |
| TSE supportate | Swissbit (USB), proxy di rete |
| Comportamento in caso di guasto | Non bloccante, protocollazione automatica |
| Database | CouchDB oppure SQLite/SQL Server (configurabile) |
| Base API | .NET 10, Clean Architecture, CQRS con MediatR |
| Copertura dei test | 17 test TSE dedicati (firma, ProcessData, codice QR, fallback) |
Appendice: Associazione tipo di processo → documento → database¶
| Processo di cassa | ProcessType | Entity | DocumentType | Collezione del database |
|---|---|---|---|---|
| Vendita diretta (contanti/carta) | Kassenbeleg-V1 | Receipt | Receipt2 | receipt2 |
| Pagamento al tavolo | Kassenbeleg-V1 | Receipt | Receipt2 | receipt2 |
| Storno | Kassenbeleg-V1 | Receipt | Receipt2 | receipt2 |
| Ordine (tavolo) | Bestellung-V1 | OpenBon | OpenBon | openbon |
| Ordine cumulativo | Bestellung-V1 | OpenBon | OpenBon | openbon |
| Apertura turno | SonstigerVorgang | Exchange | Exchange2 | exchange2 |
| Chiusura turno | SonstigerVorgang | Exchange | Exchange2 | exchange2 |
| Chiusura giornaliera (report Z) | SonstigerVorgang | DayClose | DayClose2 | dayclose2 |
| Spesa/prelievo di contanti | SonstigerVorgang | Spending | CashPointSpending | cashpointspending |