Zur Startseite Live-Demo

Schichten, Kassenbuch und Z-Bericht

Wozu dient das?#

Die Schichtverwaltung organisiert den täglichen Kassen- und Finanzbetrieb Ihres Standorts. Eine geöffnete Schicht ist die unabdingbare Voraussetzung für jegliche Bonierung und Zahlungsabwicklung. Sie bildet den steuerlichen und buchhalterischen Rahmen für den gesamten Servicezeitraum. Mit dem Schichtabschluss erzeugt das Kassensystem automatisch einen rechtskonformen Z-Bericht (Z-Bon). Dieser friert alle Tagesumsätze, Kassenbewegungen, Bar- und Unbar-Zahlungsarten sowie die angewendeten Mehrwertsteuersätze unveränderbar ein und übermittelt sie an den Fiskalspeicher.

Voraussetzungen#

  • Ein angemeldeter Bediener mit der erforderlichen Systemrolle (admin, manager oder waiter).
  • Eine aktive Standort-Zuordnung (location_id).
  • Es darf für den gewählten Standort noch keine Schicht geöffnet sein (eine Standort-Schicht gilt übergreifend für das gesamte lokale Terminal-Cluster).

Der vollständige Bargeld- und Schichtzyklus (Deep Dive)#

1. Das Prinzip des Schichtbuchs#

Jede Schicht stellt ein in sich geschlossenes Kassenbuch dar. Während der Schicht zeichnet das System sämtliche Geschäftsvorfälle auf:

  • Verkäufe (Bar- und Kartenzahlungen)
  • Manuelle Kassenbewegungen (Wechselgeld, Einlagen, Entnahmen)
  • Stornierungen und Ausgleichsbuchungen

2. Formel zur Ermittlung des Erwarteten Barbestands#

Am Schichtende errechnet das Kassensystem den theoretischen Soll-Barbestand der Kassenlade (expected_cash_cents) nach folgender mathematischer Formel:

$$\text{Erwarteter Barbestand} = \text{Anfangsbestand} + \text{Privateinlagen} + \text{Barzahlungen} - (\text{Privatentnahmen} + \text{Geldtransit} + \text{Lohnzahlungen})$$

3. Zählung und Kassendifferenz (variance_cents)#

Beim Schließen der Schicht zählt das Servicepersonal den tatsächlich in der Kassenlade vorhandenen Barbestand (counted_cash_cents). Das Kassensystem vergleicht den gezählten Betrag mit dem berechneten Soll-Barbestand und ermittelt die Kassendifferenz (variance_cents):

$$\text{Kassendifferenz} = \text{Gezählter Barbestand} - \text{Erwarteter Barbestand}$$

  • variance_cents = 0: Der Kassenbestand stimmt exakt mit den verbuchten Vorfällen überein.
  • variance_cents < 0 (Kassenfehlbetrag / Manko): Es ist weniger Bargeld vorhanden als erwartet (z. B. durch falsche Wechselgeld-Herausgabe oder nicht erfasste Entnahmen).
  • variance_cents > 0 (Kassenüberschuss): Es befindet sich mehr Bargeld in der Lade als verbucht (z. B. durch nicht getippte Barverkäufe).

Weicht der gezählte Betrag vom Sollbestand ab (variance_cents != 0), verbucht das Backend automatisch eine Ausgleichs-Kassenbewegung vom Typ DifferenzSollist im Fiskalspeicher, um die Vollständigkeit des Kassenbuchs zu gewährleisten.

4. Unveränderbarkeit des Z-Berichts (Abänderungsverbot nach § 146a AO)#

Ein Z-Bericht ist ein rechtlich bindendes Dokument für die Finanzbehörde (Kassenmeldepflicht / GoBD). Sobald eine Schicht geschlossen wurde, sind alle Zahlen, Umsätze, Steuerbeträge und Kassenstände unwiderruflich gesperrt. Sie können nachträglich weder bearbeitet, überschrieben noch gelöscht werden.

Was ist zu tun, wenn nach dem Schichtabschluss ein Fehler festgestellt wird?

  1. Niemals versuchen, die geschlossene Schicht zu manipulieren (das System lässt dies technisch nicht zu).
  2. Dokumentation im Kassenbuch: Vermerken Sie den Grund des Fehlers (z. B. "Fehleingabe Zählbetrag um 20 €") schriftlich im Kassenbericht.
  3. Korrekturbuchung in der Folgeschicht: Führen Sie zu Beginn der nächsten Schicht eine entsprechende Eigenbeleg-Kassenbewegung (z. B. Privateinlage oder Privatentnahme mit erklärender Notiz) durch.
  4. Information an den Steuerberater: Reichen Sie den Z-Bericht zusammen mit der schriftlichen Korrektur-Notiz bei Ihrer Buchhaltung ein.

Bildschirm für Bildschirm#

1. Kopfzeile: Schicht-Menü#

In der oberen Leiste des Kassenterminals sitzt die Schicht-Schaltfläche. Tippen Sie darauf, klappt das Schicht-Menü auf.

Schicht-Menü in der Kopfzeile Die Kopfzeile mit der Schicht-Schaltfläche. Darunter das aufgeklappte Menü mit Schichtstatus, vergangener Zeit und den Schaltflächen Lade öffnen, Einlage / Entnahme und Schicht schließen. BESTELLUNGEN Suchen... 1:25 SCHICHTSTATUS Schicht geöffnet VERGANGENE ZEIT 1:25 Lade öffnen Einlage / Entnahme Schicht schließen 1 2 3 4 5 6
Kopfzeile mit aufgeklapptem Schicht-Menü
  • 1 Die Schicht-Schaltfläche in der Kopfzeile. Bei geschlossener Schicht steht dort Geschlossen auf grauem Grund, bei offener Schicht die Laufzeit (zum Beispiel 1:25, eine Stunde und 25 Minuten) mit grünem Punkt.
  • 2 SCHICHTSTATUS: Der Punkt und der Text Schicht geöffnet oder Keine aktive Schicht.
  • 3 VERGANGENE ZEIT: Seit wann die Schicht läuft. Die Zeile erscheint nur bei offener Schicht.
  • 4 Lade öffnen: Öffnet die Kassenlade ohne Verkauf. Der Dialog verlangt einen Grund und das Öffnen wird protokolliert. Die Schaltfläche sehen nur Rollen, die das dürfen.
  • 5 Einlage / Entnahme: Bucht Bargeld in die Lade oder aus ihr heraus (siehe unten). Nur bei offener Schicht.
  • 6 Schicht schließen (rot) bei offener Schicht. Bei geschlossener Schicht steht an dieser Stelle Schicht öffnen.

2. Dialog Schicht schließen#

Beim Tippen auf Schicht schließen öffnet sich der Zähldialog. Die Kasse zeigt Ihnen dabei bewusst nicht, wie viel Bargeld sie erwartet: Sie zählen zuerst und geben den Betrag ein (Blindzählung).

Schicht schließen: Zählung und Differenz Zwei Schritte des Dialogs Schicht schließen. Links die Eingabe des gezählten Bargelds mit Gesamtsumme oder Stückelung und der Schaltfläche Zählung bestätigen. Rechts die Bestätigung mit Grund für Differenz, Zurück und Schicht schließen. Schicht schließen Bitte gezählten Kassenbestand eingeben Gesamtsumme eingeben Stückelung zählen Gezähltes Bargeld (€) € 0.00 Gezähltes Bargeld: 120,00 € ZÄHLUNG BESTÄTIGEN Schicht schließen Bitte gezählten Kassenbestand eingeben Gezähltes Bargeld: 120,00 € Grund für Differenz z. B. Wechselgeldfehler / Quittung fehlt ZURÜCK SCHICHT SCHLIESSEN 1 2 3 4 5 6
Dialog Schicht schließen in zwei Schritten
  • 1 Die Umschaltung Gesamtsumme eingeben oder Stückelung zählen. Bei der Stückelung tragen Sie je Schein und Münze die Stückzahl ein, die Kasse rechnet die Summe aus.
  • 2 Gezähltes Bargeld (€): die Gesamtsumme, wenn Sie nicht nach Stückelung zählen.
  • 3 Unter Gezähltes Bargeld: steht die Summe, die die Kasse übernimmt.
  • 4 ZÄHLUNG BESTÄTIGEN führt zum zweiten Schritt.
  • 5 Grund für Differenz: Freitext, zum Beispiel „Wechselgeldfehler“. Er gehört in den Schichtabschluss.
  • 6 SCHICHT SCHLIESSEN schließt die Schicht und erzeugt den Z-Bericht. ZURÜCK führt zur Zählung.

Einlage / Entnahme#

Über Einlage / Entnahme im Schicht-Menü buchen Sie Bargeld, das nicht aus einem Verkauf stammt.

Einlage / Entnahme buchen Der Dialog Einlage / Entnahme mit der Bewegungsart Privateinlage oder Privatentnahme, dem Betrag, dem Grund und den Schaltflächen Abbrechen und Buchung speichern. Einlage / Entnahme Bargebuchen für die Kassenlade Bewegungsart Privateinlage Privatentnahme Betrag 50.00 Grund / Verwendungszweck z. B. Lieferantenrechnung / Wechselgeld ABBRECHEN BUCHUNG SPEICHERN 1 2 3 4 5
Dialog Einlage / Entnahme
  • 1 Bewegungsart: Privateinlage (Geld kommt in die Lade) oder Privatentnahme (Geld verlässt sie).
  • 2 Betrag in Euro.
  • 3 Grund / Verwendungszweck, zum Beispiel „Lieferantenrechnung“.
  • 4 ABBRECHEN verwirft die Eingabe.
  • 5 BUCHUNG SPEICHERN bucht die Bewegung mit Zeitstempel und Bediener in das Kassenbuch der Schicht. Die Kasse meldet Privateinlage gebucht beziehungsweise Privatentnahme gebucht.

3. Schichtbericht im Backoffice (ShiftReportView.tsx)#

Unter **Backoffice** → **Schichtverwaltung** (ShiftReportView) werden alle Kennzahlen der aktiven oder zuletzt geschlossenen Schicht visualisiert:

  • Header: Titel **Schichtbericht** (t("shift_report")), Statuszeile Geöffnet: 07. Aug, 10:00 | Status: OPEN (t("shift_opened_status")), Haupt-Button **Bericht exportieren** (t("export_report")).
  • Kennzahlen-Karten (StatCards):
    • **Bruttoumsatz** (t("gross_sales")): Gesamter erzielter Umsatz.
    • **Gedecke gesamt** (t("total_covers")): Gesamtzahl der bedienten Gäste.
    • **Durchschn. Bon** (t("avg_ticket")): Erzielter Durchschnittsbon.
    • **Personalkosten** (t("labor_cost")): Erfassung von Arbeitszeitwerten.
  • Bargeld- & Stornokarten:
    • **Bargeld in Lade** (t("cash_in_drawer")): Soll- und Ist-Kassenbestand (Erwartet: — / t("expected_value")).
    • **Stornierter Umsatz** (t("voided_revenue")): Summe stornierter Artikel mit Anzahl-Badge (z. B. 3 Artikel / t("items_count_short")).
  • Stunden-Diagramm: Überschrift **Stündlicher Umsatz** (t("hourly_revenue")), Untertitel Verteilung nach Stunde (t("distribution_by_hour")), Badge Live-Performance (t("live_performance")).
  • Kategorien-Leiste: Überschrift **Top-Kategorien** (t("top_categories")) mit prozentualen Umsatzbalken pro Warengruppe.
  • Fortschrittskarte: Titel **Schichtfortschritt** (t("shift_progress")), Anzeige Geschätzte Zielerreichung (t("estimated_target_achievement")).

4. Betriebs-Dashboard (OperationsMonitor.tsx)#

Das Dashboard bietet der Geschäftsführung eine Live-Übersicht:

  • Header: Titel **Betriebs-Dashboard** (t("operations_dashboard")), Untertitel Echtzeit-Leistungskennzahlen... (t("operations_dashboard_description")).
  • Zeitbereichs-Filter: Buttons **Täglich** (t("daily")), **Wöchentlich** (t("weekly")), **Monatlich** (t("monthly")).
  • Kennzahlen: **Tagesumsatz** (t("daily_revenue")), **Gäste gesamt** (t("total_guests")), **Durchschn. Bon** (t("avg_ticket")).
  • Tisch-Gesundheits-Raster: Bereich **Tischplan-Übersicht** (t("floor_overview")) mit Live-Statusanzeige aller Kacheln.

Schritt für Schritt (mit Verzweigungen & Spezialfällen)#

1. Eine neue Schicht öffnen#

  1. Tippen Sie in der Kopfzeile auf die Schicht-Schaltfläche (bei geschlossener Schicht beschriftet mit Geschlossen).
  2. Tippen Sie im aufklappenden Menü auf die Schaltfläche **Schicht öffnen**.
  3. Das Kassensystem registriert die Schicht im Backend. In der Kopfzeile wechselt der Button auf die grüne Zeitanzeige (0:00).
  4. Verzweigung — Bereits offene Schicht: Sollte an diesem Standort bereits eine Schicht aktiv sein, wird die Aktion verweigert und das Backend gibt den Fehler A shift is already open for this location zurück.
  5. Verzweigung — Bonieren ohne Schicht: Versucht ein Kellner bei geschlossener Schicht eine Bestellung aufzunehmen oder zu kassieren, bricht der Vorgang ab und die Fehlermeldung No open shift for this location wird angezeigt.

2. Kassenbewegungen erfassen (Anfangsbestand, Einlagen, Entnahmen)#

  1. Anfangsbestand einlegen: Tragen Sie beim Schichtstart das in die Kassenlade eingelegte Wechselgeld als Kassenbewegung vom Typ Anfangsbestand ein.
  2. Privateinlage buchen: Wenn während des Betriebs zusätzliches Bargeld (z. B. neues Wechselgeld aus dem Safe) in die Kasse gelegt wird, erfassen Sie eine Kassenbewegung vom Typ Privateinlage mit Betrag und Notiz.
  3. Barentnahmen buchen: Wenn Geld aus der Kasse entnommen wird (z. B. für Zwischenabschöpfungen, Lohnvorschüsse oder Bareinkäufe), wählen Sie die passende Vorgangsart:
    • Privatentnahme: Entnahme durch den Inhaber.
    • Geldtransit: Transfer in den Haupttresor oder zur Bank.
    • Lohnzahlung: Bar ausbezahlte Gehaltsvorschüsse.
  4. Das System speichert jede Bewegung mit Zeitstempel, Betrag in Cent und Bediener-ID.

3. Schicht schließen und Kassensturz durchführen#

  1. Tippen Sie am Ende des Servicetags in der Kopfzeile auf die Schicht-Schaltfläche mit der Laufzeit.
  2. Wählen Sie im Menü die rote Schaltfläche Schicht schließen.
  3. Zählen Sie das Bargeld in der Lade und geben Sie es als Gesamtsumme oder nach Stückelung ein. Tippen Sie auf ZÄHLUNG BESTÄTIGEN.
  4. Tragen Sie bei Bedarf einen Grund für Differenz ein und tippen Sie auf SCHICHT SCHLIESSEN.
  5. Verzweigung — Kassendifferenz: Ist der gezählte Betrag kleiner oder größer als der erwartete Barbestand, berechnet das Backend die Differenz (variance_cents) und bucht automatisch einen Ausgleich vom Typ DifferenzSollist.
  6. Verzweigung — Bereits geschlossene Schicht: Wird versucht, eine bereits beendete Schicht erneut zu schließen, bricht der Server mit dem Fehler Shift already closed ab.
  7. Das System erstellt den Z-Bericht und schließt die Schicht. Die Schaltfläche in der Kopfzeile zeigt wieder Geschlossen.

Was passiert im Hintergrund#

  • Beim Aufruf von POST /api/v1/shifts vergibt die Datenbank die nächste fortlaufende Schicht-Sequenznummer (sequence_number) für den Standort.
  • Bei jedem Schichtabschluss (POST /api/v1/shifts/{shift_id}/close) führt das System folgende Operationen durch:
    1. Aufsummierung aller Bar- und Kartenzahlungen der Schicht.
    2. Berechnung der VAT-Verteilung und Erstellung eines Snapshots aller aktiven Steuersätze (vat_rates_json).
    3. Ermittlung von expected_cash_cents und Verbuchung der Sollist-Differenz (DifferenzSollist).
    4. Wechsel des Schichtstatus auf CLOSED und Vergabe des Zeitstempels closed_at.
    5. Auslösung des System-Events shift.closed zur Benachrichtigung des Z-Bon-Druckers und des Audit-Subscribers.
    6. Durchführung einer Fiskal-Reconciliationsprüfung (_check_fiscal_reconciliation), um sicherzustellen, dass alle während der Schicht bezahlten Bestellungen eine abgeschlossene TSE-Signatur besitzen.

Häufige Probleme#

1. A shift is already open for this location#

  • Ursache: Für den gewählten Standort existiert bereits eine offene Schicht im System (HTTP 409 Conflict).
  • Lösung: Es kann pro Standort immer nur eine Schicht gleichzeitig aktiv sein. Schließen Sie die bestehende Schicht über den Header-Button, bevor Sie eine neue Schicht beginnen.

2. No open shift for this location#

  • Ursache: Ein Kellner versucht eine Bestellung aufzunehmen oder eine Zahlung abzuwickeln, ohne dass zuvor eine Schicht geöffnet wurde (HTTP 404 Not Found).
  • Lösung: Tippen Sie oben in der Kopfzeile auf die graue Schaltfläche Geschlossen und wählen Sie Schicht öffnen.

3. Shift not found#

  • Ursache: Die übermittelte Schicht-ID existiert nicht oder gehört zu einem anderen Mandanten (HTTP 404 Not Found).
  • Lösung: Aktualisieren Sie die Anwendung im Browser. Das Kassensystem lädt die aktuelle Schicht-ID neu vom Server.

4. Shift already closed#

  • Ursache: Es wurde versucht, eine Schicht zu schließen, die bereits den Status CLOSED besitzt (HTTP 409 Conflict).
  • Lösung: Keine Aktion erforderlich. Die Schicht wurde bereits ordnungsgemäß beendet und der Z-Bericht erstellt.

5. Start date must be before or equal to end date#

  • Ursache: Bei der Auswertung von Schichtanalysen oder Berichten im Backoffice wurde ein Startdatum gewählt, das zeitlich nach dem Enddatum liegt (HTTP 400 Bad Request).
  • Lösung: Korrigieren Sie die Datumsangaben im Datumsfilter des Backoffice, sodass das Startdatum vor oder auf demselben Tag wie das Enddatum liegt.

6. Compare start date must be before or equal to compare end date#

  • Ursache: Im BI-Dashboard wurde ein Vergleichszeitraum gewählt, dessen Startdatum nach dem Vergleichs-Enddatum liegt.
  • Lösung: Überprüfen Sie die Einstellungen des Vergleichszeitraums im Dashboard und wählen Sie ein valides Startdatum.

7. Comparison period must have the same duration as the target period#

  • Ursache: Der gewählte Vergleichszeitraum umfasst mehr oder weniger Tage als der Haupt-Auswertungszeitraum.
  • Lösung: Passen Sie die Dauer des Vergleichszeitraums exakt an die Anzahl der Tage des Auswertungszeitraums an.

8. Unsupported format#

  • Ursache: Beim Export von Schichtberichten oder Analysen wurde ein vom Server nicht unterstütztes Dateiformat angefordert (HTTP 400 Bad Request).
  • Lösung: Wählen Sie als Exportformat ausschließlich das standardmäßige CSV-Format aus.

Rollen & Berechtigungen#

  • admin & manager: Vollständige Berechtigung zum Öffnen und Schließen von Schichten, Erfassen von Kassenbewegungen, Eingeben von Zählbeständen, Generieren von Z-Berichten sowie zum Einsehen und Exportieren aller Schichtanalysen und BI-Dashboards.
  • waiter: Berechtigung zum Öffnen einer Schicht. Kein Zugriff auf den Schichtabschluss, die Bargeldeingabe oder die detaillierten Umsatzberichte im Backoffice.
  • auditor / inspector: Lesezugriff auf historische Schichtberichte, Kassenbucheinträge, Z-Bons und Fiskal-Exportfunktionen für Betriebsprüfungen.

Grenzen#

  • Geschlossene Schichten können unter keinen Umständen wiedergeöffnet, gelöscht oder nachträglich verändert werden.
  • Fehlerhafte Zähleingaben beim Schichtabschluss müssen durch Gegenbuchungen in der darauffolgenden Schicht ausgeglichen und im Kassenbuch handschriftlich begründet werden.
  • Das Generieren von Z-Berichten setzt eine funktionierende Anbindung an die Fiskaleinheit (TSE) voraus; bei Offline-Ausfällen wird der Z-Bericht nach Wiederherstellung der Verbindung nachsigniert.

Dieses Kapitel gehört zum Merkuron-Handbuch für Inhaber und Servicepersonal.