====== 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