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 (CashPointSerial → 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: Proxy bevorzugt, Fallback auf Hardware |
SwissbitTseService |
Lokale Swissbit-USB-TSE |
TseProxyService |
Netzwerk-TSE über HTTP-Proxy |
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¶
Kassenbeleg-V1:
Beleg^{BruttoGesamt}_{MwStSatz1}:{MwStBetrag1}_{MwStSatz2}:{MwStBetrag2}
Beispiel: Beleg^50.00_19.00:5.00_7.00:2.00
Bestellung-V1:
{Menge}^{Artikeltext}^{BruttoBetrag};{Menge}^{Artikeltext}^{BruttoBetrag}
Beispiel: 2.00^Cola^7.00;1.00^Pizza^11.50
SonstigerVorgang:
QR-Code-Format (DSFinV-K Anhang I)¶
V0;{KassenSerial};{ProcessType};{ProcessData};{TransNr};{SignZähler};{Start};{Ende};{SigAlg};{LogFormat};{Signatur};{PublicKey}
Einrichtung¶
Hardware-TSE (Swissbit)¶
USB-Stick am Server:
- Swissbit-TSE einstecken
- Admin → Einstellungen → TSE
- TSE-Typ: Hardware
- Lokalen Pfad zur TSE angeben
- Kassen-Seriennummer eingeben
- „Initialisieren" — setzt PINs und registriert Client
TSE-Proxy (Netzwerk)¶
Für verteilte Systeme mit mehreren Kassen:
- TSE-Proxy-Server einrichten
- Admin → Einstellungen → TSE
- TSE-Typ: Proxy
- URL des Proxy-Servers eingeben
- „Aktivieren"
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.
Tests¶
17 dedizierte TSE-Tests in TseSigningTests.cs:
- ProcessData-Format für Kassenbeleg-V1 (ein/mehrere Steuersätze, Nullbeleg)
- ProcessData-Format für Bestellung-V1 (einzeln, mehrere Positionen)
- QR-Code-Generierung (V0-Format, Null-Fälle)
- Signierungsfluss (TSE aktiv, deaktiviert, nicht verfügbar)
- ClientId-Fallback-Kette (CashRegisterId → BonIdServer → "1")
- Betragsformatierung (InvariantCulture)
- ProcessType-Konstanten
Häufige Fragen zur TSE¶
Muss ich eine TSE haben? Ja, seit 01.01.2020 in Deutschland Pflicht.
Welche TSE unterstützt DiKAS? Hardware-TSE (Swissbit USB) und netzwerkbasierte TSE-Proxies.
Was kostet eine TSE? Hardware-TSE: ca. 250–300 EUR einmalig.
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