TSE & Finanzamt¶
Seit dem 01.01.2020 ist in Deutschland eine Technische Sicherheitseinrichtung (TSE) für Kassensysteme Pflicht (KassenSichV, §146a AO). DiKAS ist vollständig TSE-konform und signiert alle kassenrelevanten Vorgänge gemäß AEAO zu §146a AO.
Für Steuerprüfer: → TSE-Compliance — Dokumentation für Steuerprüfer (detaillierte technische Beschreibung)
Für Anwender: → TSE-Anleitung im Benutzerhandbuch (Einrichtung und Bedienung)
Was ist eine TSE?¶
Eine TSE ist ein zertifiziertes Sicherheitsmodul, das jeden Kassenvorgang digital signiert. Das Finanzamt kann damit prüfen, ob Kassendaten nachträglich manipuliert wurden.
TSE in DiKAS¶
DiKAS signiert alle kassenrelevanten Vorgänge — nicht nur Rechnungen:
| Vorgang | ProcessType | Entity | Beschreibung |
|---|---|---|---|
| Kassenbons | Kassenbeleg-V1 |
Receipt | Jede Zahlung (Direktverkauf, Tischzahlung) |
| Stornos | Kassenbeleg-V1 |
Receipt | Jede Bonstornierung |
| Bestellungen | Bestellung-V1 |
OpenBon | Jede Bestellung im Tischbetrieb |
| Sammelbestellungen | Bestellung-V1 |
OpenBon | Batch-Bestellungen (Signatur auf Lead-Bon) |
| Schichteröffnung | SonstigerVorgang |
Exchange | Jede Schichteröffnung |
| Schichtschließung | SonstigerVorgang |
Exchange | Jede Schichtschließung |
| Tagesabschlüsse | SonstigerVorgang |
DayClose | Jeder Z-Bericht |
| Ausgaben | SonstigerVorgang |
Spending | Jede Barentnahme |
Architektur¶
Signierungsfluss¶
Handler (z.B. ProcessDirectSaleCommand)
→ TseSigningHelper.SignReceiptAsync()
→ BackendConfig laden (TSE-fähig?)
→ ITseService.IsAvailable prüfen
→ ProcessData aufbauen
→ ClientId auflösen (CashRegisterId → BonIdServer → "1")
→ ITseService.SignReceiptAsync() [5s Timeout]
→ TSE-Felder auf Entity speichern
→ HandleOutageLogAsync() (Ausfallprotokoll)
Ausgaben (Spendings): Werden als SonstigerVorgang signiert; der Vorgangstext richtet sich nach dem AccountMode:
| AccountMode | TSE-Vorgangstyp |
|---|---|
| 1 (Ausgabe) | AVSonstAusgabe |
| 2 (Kasse→Bank) | AVTransfer |
| 3 (Bank→Kasse) | AVSonstEinlage |
| 4 (Überweisung) | AVSonstAusgabe |
Komponenten¶
| Komponente | Beschreibung |
|---|---|
TseSigningHelper |
Zentrale statische Klasse für alle TSE-Signierungen |
ITseService |
Interface für TSE-Zugriff (IsAvailable, Sign, Export) |
TseServiceRouter |
Routing zur aktiven TSE: fiskaly-Cloud bevorzugt, dann Netzwerk-TSE, dann lokale Swissbit-Hardware |
FiskalyTseService |
fiskaly Cloud-TSE (SIGN DE) — signiert über das Internet, kein USB-Gerät nötig |
SwissbitTseService |
Lokale Swissbit-USB-TSE |
TseProxyService |
Netzwerk-TSE: signiert über eine andere DiKAS-Kasse, die als TSE-Host dient (BonIdServer) |
TseInitializationService |
TSE-Erstinitialisierung |
ITseDataHolder |
Interface mit 9 TSE-Feldern auf allen signierten Entities |
TseOutageLog |
Ausfallprotokoll-Entity |
TseConfig |
TSE-Konfiguration (PublicKey, Serial, SigAlg, PINs) |
ProcessData-Formate¶
Die folgenden Zeichenketten werden an die TSE übergeben und mitsigniert. Die ausführliche, prüferorientierte Beschreibung steht in der Steuerprüfungs-Doku, Abschnitt 4.
Kassenbeleg-V1 — fester Steuerteil aus fünf Brutto-Slots (19 % / 7 % / 10,7 % / 5,5 % / 0 %), danach der Zahlungsteil <Betrag>:<Bar|Unbar> (Barzahlungen zuerst):
Beleg^<19%>_<7%>_<10,7%>_<5,5%>_<0%>^<Zahlungen>
Beispiel: Beleg^47.60_12.40_0.00_0.00_0.00^60.00:Bar
Bestellung-V1 — je Bestellposition eine Zeile; die Bezeichnung steht in Anführungszeichen, der Preis ist der Brutto-Einzelpreis:
SonstigerVorgang — Vorgangskürzel und Daten, durch ^ getrennt:
DiKAS verwendet dafür sechs Vorgangskürzel: AVSichOpen (Schichteröffnung), AVSichClose (Schichtschließung), AVKassenschnitt (Tagesabschluss), AVSonstAusgabe (Ausgabe/Barauszahlung), AVSonstEinlage (Bareinlage) und AVTransfer (Geldtransit). Ein Storno ist kein SonstigerVorgang, sondern ein Kassenbeleg-V1 mit negativen Beträgen.
QR-Code-Format (DSFinV-K Anhang I)¶
V0;{KassenSerial};{ProcessType};{ProcessData};{TransNr};{SignZähler};{Start};{Ende};{SigAlg};{LogFormat};{Signatur};{PublicKey}
Einrichtung¶
Die Maske Admin → Einstellungen → Finanzen → TSE zeigt den TSE-Status und die Exporte (TSE-TAR, DSFinV-K, GDPdU). Dort gibt es genau zwei Einstellungen: den Schalter „TSE aktiv" und das optionale Feld „TSE-Server". Ein „TSE-Typ"-Dropdown gibt es nicht — welche TSE verwendet wird, ergibt sich aus der Server-Konfiguration. DiKAS prüft beim Start in dieser Reihenfolge: Cloud-TSE (fiskaly) → TSE-Server (Verbund) → lokale Swissbit-TSE.
Cloud-TSE (fiskaly)¶
Ohne USB-Gerät — die Signierung läuft über die zertifizierte fiskaly-Cloud (SIGN DE) im Internet. Die Zugangsdaten (API-Key, API-Secret, TSS-ID, Client-ID) liegen in der Server-Konfiguration (Tse:* in appsettings bzw. Umgebungsvariablen), wählbar Test- oder Live-Umgebung. Bei DiKAS-Cloud-Paketen mit gebuchter Cloud-TSE ist das bereits vorkonfiguriert — es ist nichts weiter zu tun.
Sobald eine Cloud-TSE konfiguriert ist, hat sie automatisch Vorrang.
Hardware-TSE (Swissbit)¶
USB-Stick am Kassenrechner bzw. an der Appliance:
- Swissbit-TSE einstecken
- Lokalen Pfad (Mount-Punkt) der TSE in der Server-Konfiguration hinterlegen
- Admin → Einstellungen → Finanzen → TSE → „TSE aktiv" einschalten
Bei der Initialisierung setzt DiKAS die PINs/PUKs selbst (pro Gerät zufällig) und registriert die Kasse als Client. Die Kassen-Kennung stammt aus der Lizenz — ein manuelles Seriennummern-Feld gibt es nicht.
TSE-Verbund (mehrere Kassen, eine TSE)¶
Für Betriebe mit mehreren Kassen, die sich eine TSE teilen: Eine Kasse ist der TSE-Host, die übrigen signieren über diese im lokalen Netz.
- Admin → Einstellungen → Finanzen → TSE
- Im Feld „TSE-Server" die Adresse der Kasse eintragen, die als TSE-Host dient (z. B.
https://kasse1.local) - „TSE aktiv" einschalten
Automatische Abschaltung bei Störung
Schlägt die TSE-Initialisierung beim Start mehrfach fehl, deaktiviert sich die TSE automatisch und im Kassen-Header erscheint „TSE deaktiviert". Details für Anwender: TSE im Kassenalltag.
API-Endpoints¶
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /api/v1/tse/info |
TSE-Statusinformationen (Kapazität, Zertifikat, Signaturen) |
| GET | /api/v1/tse/config |
TSE-Konfiguration lesen |
| PUT | /api/v1/tse/config |
TSE-Konfiguration aktualisieren |
| POST | /api/v1/tse/initialize |
TSE initialisieren |
| GET | /api/v1/tse/export/tar |
TSE-Logdaten als TAR exportieren (optional ?startDate=&endDate=) |
TSE-Daten auf dem Bon¶
Jeder Kassenbon enthält die TSE-Daten:
══════════════════════════════════
BON Nr. 20260313-0042
──────────────────────────────────
...Artikel...
──────────────────────────────────
TSE-Information:
Signatur: a8f3c2d1e5...
Trans.-Nr: 12345
Sign.-Zäh: 67890
Start: 2026-03-13T18:30:00
Ende: 2026-03-13T18:30:01
Seriennr: ABCDEF1234567890
[QR-Code]
══════════════════════════════════
Der QR-Code enthält alle TSE-Daten im DSFinV-K-Format (Anhang I) und kann vom Finanzamt gescannt werden.
DSFinV-K Export¶
Für die Kassenprüfung exportiert DiKAS Daten im DSFinV-K-Format:
- Admin → Einstellungen → Export → DSFinV-K
- Zeitraum wählen
- „Export erstellen"
- ZIP-Datei mit allen vorgeschriebenen CSV-Dateien
GDPdU Export¶
Für die digitale Betriebsprüfung:
- Admin → Einstellungen → Export → GDPdU
- Zeitraum wählen
- „Export erstellen"
- GDPdU-konforme Exportdatei
TSE-Ausfall¶
Wenn die TSE ausfällt (Defekt, Netzwerkproblem):
- DiKAS protokolliert den Ausfall automatisch (
TseOutageLogmit StartTime, Reason, AffectedTransactions) - Das Kassieren wird nicht blockiert — der Betrieb geht weiter
- Das
TseError-Feld auf dem betroffenen Dokument wird gesetzt - Bei Wiederverfügbarkeit werden offene Ausfall-Einträge geschlossen (EndTime gesetzt)
- Die Ausfall-Protokolle werden für das Finanzamt aufbewahrt
Wichtig: Bei TSE-Ausfall sind Sie verpflichtet, den Ausfall zu dokumentieren und zeitnah zu beheben. DiKAS erledigt die Dokumentation automatisch.
Qualitätssicherung¶
Die TSE-Signierung ist durch automatisierte Tests abgesichert. Geprüft werden u. a.:
- die ProcessData-Formate für Kassenbeleg-V1 (ein/mehrere Steuersätze, Nullbeleg) und Bestellung-V1
- die QR-Code-Erzeugung (V0-Format)
- der Signierungsfluss (TSE aktiv, deaktiviert, nicht verfügbar)
- die Betragsformatierung und das Verhalten bei einem TSE-Ausfall
Häufige Fragen zur TSE¶
Muss ich eine TSE haben? Ja, seit 01.01.2020 in Deutschland Pflicht.
Welche TSE unterstützt DiKAS? Die Swissbit-Hardware-TSE (USB, vor Ort), die fiskaly-Cloud-TSE (SIGN DE, über das Internet) und den TSE-Verbund im Netzwerk (mehrere Kassen teilen sich eine TSE).
Was kostet eine TSE? Das hängt von der gewählten Variante ab: Eine Hardware-TSE ist eine einmalige Anschaffung, eine Cloud-TSE wird laufend abgerechnet. Die aktuellen Konditionen erfahren Sie bei DiKAS.
Kann das Finanzamt meine Daten prüfen? Ja, über DSFinV-K-, GDPdU- und TSE-TAR-Export. DiKAS ist darauf vorbereitet.
Blockiert ein TSE-Ausfall die Kasse? Nein. DiKAS protokolliert den Ausfall und arbeitet weiter. Der Ausfall muss zeitnah behoben werden.
Weiterführende Dokumente¶
→ TSE-Compliance für Steuerprüfer — Detaillierte technische Dokumentation für die Betriebsprüfung → TSE-Anleitung für Anwender — Einrichtung und Bedienung → Kassenmeldung ans Finanzamt — Kasse über Mein ELSTER melden (§ 146a Abs. 4 AO) → Plugin-Entwicklung — Eigene Module erstellen