====== kassensichv.types ======
→ [[lyx_-_programmiersprache:units:kassensichv|Zurück zur KassenSichV-Übersicht]]
Zentrale Typdefinitionen der KassenSichV-Bibliothek. Diese Unit enthält ausschließlich Structs, Konstanten und Hilfsfunktionen für Speicherverwaltung — keine TSE-Kommunikationslogik.
===== Import =====
import kassensichv.types;
===== Typen =====
==== BelegDaten ====
Eingangsdaten eines Kassenbons für die TSE-Signierung.
pub type BelegDaten = struct {
transId: int64; // pchar — wird von TseOpenBeleg/TseProcessBeleg gesetzt
prozessTyp: int64; // pchar — z.B. PROZESSTYP_KASSENBELEG
prozessDaten: int64; // pchar — DSFinV-K-konformer Payload
kassenNr: int64; // pchar — Geräte-ID laut DSFinV-K
umsatz: int64; // Eurocent (Ganzzahl, keine Fließkomma-Rundungsfehler)
startZeit: int64; // Unix-Zeitstempel (UTC) — von TSE gesetzt
endZeit: int64; // Unix-Zeitstempel (UTC) — von TSE gesetzt
}
^ Feld ^ Typ ^ Beschreibung ^
| ''transId'' | ''int64'' (pchar) | Interne Vorgangs-ID — wird von ''TseOpenBeleg'' / ''TseProcessBeleg'' befüllt |
| ''prozessTyp'' | ''int64'' (pchar) | BSI-Prozesstyp — Konstante aus dieser Unit verwenden |
| ''prozessDaten'' | ''int64'' (pchar) | Strukturierter Payload im DSFinV-K-Format |
| ''kassenNr'' | ''int64'' (pchar) | Geräteseriennummer der Kasse laut DSFinV-K |
| ''umsatz'' | ''int64'' | Kumulierter Bruttoumsatz in **Eurocent** (kein Double — Rundungsfehler!) |
| ''startZeit'' | ''int64'' | Unix-Zeitstempel UTC — wird von der TSE gesetzt |
| ''endZeit'' | ''int64'' | Unix-Zeitstempel UTC — wird von der TSE gesetzt |
**Hinweis zu ''umsatz'':** Der Betrag ''2,50 EUR'' wird als ''250'' gespeichert (Eurocent). Das entspricht dem Verhalten von DSFinV-K, das BCD-Arithmetik ohne Fließkomma vorschreibt.
==== SigErgebnis ====
Steuerliche Pflichtangaben für den Bondruck nach KassenSichV / BSI TR-03153. Alle 7 Pflichtfelder laut TR-03153 Anhang A.
pub type SigErgebnis = struct {
tseSerial: int64; // pchar — Seriennummer der zertifizierten TSE (Pflichtfeld)
sigZaehler: int64; // fortlaufender TSE-Vorgangszähler (Pflichtfeld)
anzahlTrans: int64; // Gesamtzähler aller Transaktionen dieser TSE
sigWert: int64; // pchar — ECDSA/SHA-256, Base64-kodiert (Pflichtfeld)
qrCode: int64; // pchar — BSI TR-03153 Anhang A QR-Code-String (Pflichtfeld)
startZeit: int64; // Unix-Zeitstempel UTC laut TSE (Pflichtfeld)
endZeit: int64; // Unix-Zeitstempel UTC laut TSE (Pflichtfeld)
success: int64; // 1 = signiert, 0 = Fehler
errorMsg: int64; // pchar — Fehlermeldung (leer bei success=1)
}
^ Feld ^ Typ ^ Pflichtfeld auf Bon ^
| ''tseSerial'' | ''int64'' (pchar) | ja |
| ''sigZaehler'' | ''int64'' | ja |
| ''sigWert'' | ''int64'' (pchar) | ja — Base64-ECDSA/SHA-256 |
| ''qrCode'' | ''int64'' (pchar) | ja — vorformatiert, BSI TR-03153 Anhang A |
| ''startZeit'' | ''int64'' | ja — UTC |
| ''endZeit'' | ''int64'' | ja — UTC |
| ''anzahlTrans'' | ''int64'' | im QR-Code enthalten |
| ''success'' | ''int64'' | nein — intern für Fehlerprüfung |
| ''errorMsg'' | ''int64'' (pchar) | nein — nur bei ''success=0'' relevant |
Alle ''pchar''-Felder in ''SigErgebnis'' sind allokiert. Nach der Verwendung ''SigErgebnisFree()'' aufrufen.
===== Konstanten =====
==== Prozesstypen (BSI TR-03153) ====
pub const PROZESSTYP_KASSENBELEG: pchar = "Kassenbeleg-V1";
pub const PROZESSTYP_STORNO: pchar = "Kassenbeleg-V1-Storno";
pub const PROZESSTYP_TRAINING: pchar = "Training";
pub const PROZESSTYP_BESTELLUNG: pchar = "Bestellung-V1";
^ Konstante ^ Bedeutung ^
| ''PROZESSTYP_KASSENBELEG'' | Normaler Kassenbon (Verkauf, Einnahme) |
| ''PROZESSTYP_STORNO'' | Stornierter Vorgang — eigener Bon mit negativem Betrag |
| ''PROZESSTYP_TRAINING'' | Trainingsbetrieb — kein Steuerbezug, kein Finanzamt-Export |
| ''PROZESSTYP_BESTELLUNG'' | Bestellvorgang ohne sofortige Zahlung (z.B. Restaurant) |
==== Sonstige Konstanten ====
pub const TSE_QR_PREFIX: pchar = "V0";
pub const DSFINVK_VERSION: pchar = "2.3";
pub const TSE_DEFAULT_TIMEOUT: int64 = 5000; // ms
pub const KASSENSICHV_VERSION: pchar = "1.0.0";
===== Speicherverwaltung =====
// Gibt alle allokierten Strings in SigErgebnis frei
pub fn SigErgebnisFree(sig: int64): void;
// Gibt alle allokierten Strings in BelegDaten frei (nur wenn selbst allokiert)
pub fn BelegDatenFree(beleg: int64): void;
**Faustregel:** ''BelegDaten''-Felder zeigen in der Regel auf String-Literale im Programmcode und müssen nicht freigegeben werden. ''SigErgebnis'' kommt von der TSE — immer ''SigErgebnisFree()'' aufrufen.
===== DSFinV-K-Datenformat =====
Das Feld ''prozessDaten'' folgt dem DSFinV-K 2.3-Schema. Für einfache Kassenbons ist das Format:
{Artikel};{Betrag_normal}_{Betrag_ermäßigt}_{Betrag_Null}_{Betrag_besonders}_{Sonstiges}
Beispiele:
// Kaffee 2,50 EUR (normaler Steuersatz 19%)
beleg.prozessDaten := "Kaffee;2.50_0.00_0.00_0.00_0.00"c;
// Buch 15,00 EUR (ermäßigter Steuersatz 7%)
beleg.prozessDaten := "Buch;0.00_15.00_0.00_0.00_0.00"c;
// Mehrere Artikel
beleg.prozessDaten := "Kaffee+Wasser;2.50_0.00_0.00_0.00_0.00;Leitungswasser;0.00_0.00_0.50_0.00_0.00"c;
Für komplexe DSFinV-K-Anforderungen (Mehrwertsteuerausweise, Bonpflicht-Details) gilt die offizielle DSFinV-K 2.3-Spezifikation des BMF.
-----
Letzte Aktualisierung: 2026-06-12