Zum Inhalt
v26.3

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:

<Menge>;"<Bezeichnung>";<Brutto-Einzelpreis>
Beispiel:
2;"Cola";3.50
1;"Pizza Salami";11.50

SonstigerVorgang — Vorgangskürzel und Daten, durch ^ getrennt:

<Vorgang>^<Daten>
Beispiel: AVKassenschnitt^Tagesabschluss^1523.90

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:

  1. Swissbit-TSE einstecken
  2. Lokalen Pfad (Mount-Punkt) der TSE in der Server-Konfiguration hinterlegen
  3. 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.

  1. Admin → Einstellungen → Finanzen → TSE
  2. Im Feld „TSE-Server" die Adresse der Kasse eintragen, die als TSE-Host dient (z. B. https://kasse1.local)
  3. „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:

  1. Admin → Einstellungen → Export → DSFinV-K
  2. Zeitraum wählen
  3. „Export erstellen"
  4. ZIP-Datei mit allen vorgeschriebenen CSV-Dateien

GDPdU Export

Für die digitale Betriebsprüfung:

  1. Admin → Einstellungen → Export → GDPdU
  2. Zeitraum wählen
  3. „Export erstellen"
  4. GDPdU-konforme Exportdatei

TSE-Ausfall

Wenn die TSE ausfällt (Defekt, Netzwerkproblem):

  1. DiKAS protokolliert den Ausfall automatisch (TseOutageLog mit StartTime, Reason, AffectedTransactions)
  2. Das Kassieren wird nicht blockiert — der Betrieb geht weiter
  3. Das TseError-Feld auf dem betroffenen Dokument wird gesetzt
  4. Bei Wiederverfügbarkeit werden offene Ausfall-Einträge geschlossen (EndTime gesetzt)
  5. 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