Zum Hauptinhalt springen

Tagesabschluss + Z-Bon

Live seit 13.06.2026 (Commit 7421abaa8) unter https://profipos.de/backoffice/tagesabschluesse.

Workflow

Architektur-Decision

  • Keine eigene tagesabschluesse-Tabelle — Mapping direkt auf z_bons (existiert seit V6).
  • Status-Marker:
    • kassenbestand_ende_ist IS NULL → Entwurf
    • kassenbestand_ende_ist IS NOT NULL → Abgeschlossen
  • z_typ-Konstanten: tagesabschluss_kasse, tagesabschluss_standort.

Routes (CodeIgniter 4)

$r->get  ('tagesabschluesse',                         'TagesabschluesseController::liste');
$r->get ('tagesabschluesse/neu', 'TagesabschluesseController::erstellen');
$r->post ('tagesabschluesse', 'TagesabschluesseController::speichern');
$r->get ('tagesabschluesse/(:segment)/druck', 'TagesabschluesseController::druck/$1');
$r->post ('tagesabschluesse/(:segment)/abschliessen', 'TagesabschluesseController::abschliessen/$1');
$r->get ('tagesabschluesse/(:segment)', 'TagesabschluesseController::detail/$1');
Reihenfolge der Routes

Spezifische Routes (/druck, /abschliessen) MÜSSEN vor der generischen (:segment)-Detail-Route stehen, sonst matched die generische Route zuerst.

Aggregation (privater Helper aggregateBestellungen())

4 Sub-Queries gegen bestellungen, bestellpositionen, zahlungen → liefern in einem Rutsch:

  • Brutto + Netto + Storno + Trinkgeld + Rabatte
  • Steuer-Aufschlüsselung als JSON nach z_bons.steuer_aufschluesselung
  • Zahlart-Aufschlüsselung als JSON nach z_bons.zahlart_aufschluesselung

Audit-Log

Jeder Abschluss-Schritt wird in audit_log protokolliert:

AktionSeverityInhalt
tagesabschluss.erstelltinfo{z_bon_uuid, z_typ, zeitraum_von, zeitraum_bis}
tagesabschluss.abgeschlosseninfo{z_bon_uuid, kassenbestand_ende_ist, differenz_bar}

Audit-UUID: bin2hex(random_bytes(16)), JSON JSON_UNESCAPED_UNICODE.

Druck-View

druck.php ist eine standalone View (ohne Layout-Include) mit eigenem @media print { @page A4 }-CSS:

  • Print-Button class="no-print" (im Druck unsichtbar)
  • window.print() direkt nach DOM-Ready
  • Druckdatum-Footer

DB-Schema (z_bons-relevante Felder)

FeldTypBedeutung
z_bon_uuidCHAR(36)PK
mandant_uuid, standort_uuid, geraet_uuidCHAR(36)letzteres NULLABLE
z_typVARCHARtagesabschluss_kasse / tagesabschluss_standort
z_nummerBIGINTpro Mandant+Standort vergeben via MAX(z_nummer)+1 (KEIN AUTO_INCREMENT)
bon_zeitraum_von / bisDATETIME
anzahl_bons, anzahl_storno_bonsINT
umsatz_brutto / nettoDECIMAL
summe_trinkgeld / rabatte / stornoDECIMAL
kassenbestand_anfang / ende_soll / ende_istDECIMAL NULL
differenz_barDECIMAL
steuer_aufschluesselung / zahlart_aufschluesselungLONGTEXT JSON
abgeschlossen_am, abgeschlossen_von_benutzer_uuid
dsfinvk_exportiert, tse_export_pfad, tse_export_hash_sha256
bon_text, bon_pdf_pfad

Verwandte Themen