Search Documentation

Search for pages and headings in the documentation

Kasse (POS)

Das Kassenmodul macht aus CrispyCMS ein vollwertiges Kassensystem für Veranstaltungen — Festivals, Vereinsfeste, Märkte. Es ist bewusst für den Einsatz auf einem Gelände ohne verlässliche Internetverbindung ausgelegt: Die Kassen sprechen mit einem Server im lokalen Netz, nicht mit der Cloud.


In fünf Schritten zur ersten Kasse

  1. Veranstaltung anlegen und aktivieren (Kasse → Veranstaltungen). Ohne aktive Veranstaltung kann keine Kasse verkaufen. Das Standort-Kürzel wird jeder Belegnummer vorangestellt und lässt sich nach dem ersten Beleg nicht mehr ändern.
  2. Steuersätze und Produkte pflegen (Kasse → Steuersätze, → Produkte). Preise werden immer brutto eingegeben.
  3. Stände anlegen (Kasse → Stände) — je Theke, Grill oder Merch-Zelt einen.
  4. Kassierer anlegen (Kasse → Kassierer). Jede Person bekommt automatisch eine vierstellige PIN. Diese Liste können Sie ausdrucken und beim Aufbau verteilen.
  5. Terminal öffnen (Kasse → Kasse öffnen) — auf jedem Tablet einmalig Veranstaltung und Stand auswählen, danach mit PIN anmelden und die Schicht mit dem vorhandenen Wechselgeld öffnen.

Zum Ausprobieren: Beispieldaten

Für eine Demo, eine Schulung oder eine frische Entwicklungsumgebung füllt ein Befehl die Kasse mit einem vollständigen, plausiblen Festival-Setup — Steuersätze, Zahlungsarten, Kategorien, rund zwanzig Produkte, eine aktive Veranstaltung, vier Stände mit passendem Sortiment und fünf Kassierer:

crisp crispy:pos:seed
crisp crispy:pos:seed --event="Sommerfest 2026" --site-code=SOF --wristbands="Armband-[1-500]"

Die PINs der angelegten Kassierer werden einmalig am Ende ausgegeben — an dieser Stelle kopieren, sie erscheinen später nirgends wieder.

Die Stände bekommen jeweils ein passendes Sortiment: Der Bierstand führt Getränke und Pfand, der Essensstand Speisen, Heißgetränke und Pfand, Merchandise nur Merchandise. Der Infopoint bleibt bewusst ohne Einschränkung — leeres Sortiment bedeutet gesamtes Sortiment — und ist der einzige Stand, an dem Armbänder aufgeladen werden dürfen.

Der Befehl ist wiederholbar: Vorhandenes wird erkannt und übersprungen, nichts wird überschrieben oder gelöscht. Einzige Ausnahme ist ein bereits vorhandener Stand ohne Sortiment — dort wird das Beispielsortiment nachgetragen. Ein Stand, dessen Sortiment jemand konfiguriert hat, bleibt unangetastet.

Zum Aufräumen gibt es die Gegenrichtung:

crisp crispy:pos:purge                   # löscht alle Kassendaten
crisp crispy:pos:purge --keep-catalogue  # behält Produkte, Kategorien, Steuersätze, Zahlungsarten

Der Befehl zeigt vorher an, wie viele Zeilen je Tabelle betroffen sind, und fragt nach (--yes überspringt die Rückfrage).


Mehrere Veranstaltungen gleichzeitig

Es können mehrere Veranstaltungen gleichzeitig aktiv sein. Jede Kasse wird beim ersten Start einer Veranstaltung und einem Stand zugeordnet und bucht danach ausschließlich dorthin. Läuft nur eine Veranstaltung, entfällt die Auswahl.

Entscheidend ist das Standort-Kürzel:

KürzelErgebnis
Gleiches Kürzel für beide VeranstaltungenEine gemeinsame, lückenlose Belegnummernfolge — passend für zwei Veranstaltungen am selben Ort.
Unterschiedliche KürzelGetrennte Belegnummernfolgen, je Standort eine.

Bei der Standauswahl führt Andere Veranstaltung wählen zurück zur Veranstaltungsliste — nötig, wenn versehentlich die falsche gewählt wurde oder für die gewählte noch keine Stände angelegt sind. Läuft nur eine Veranstaltung, wird auch diese eine angezeigt und als aktuell markiert; die Liste beantwortet damit die Frage, auf welche Veranstaltung die Kasse gebucht ist. Abbrechen führt zurück, ohne etwas zu ändern.

Ist die gespeicherte Veranstaltung inzwischen abgeschlossen oder gelöscht, verwirft die Kasse sie beim nächsten Start von selbst und fragt neu. Über Standzuordnung zurücksetzen auf dem Anmeldebildschirm lässt sich ein Tablet vollständig neu zuordnen.

In der Verwaltung zeigen alle veranstaltungsbezogenen Seiten — Stände, Kassierer, Schichten, Transaktionen, Berichte, Armbänder, Aufladungen, Drucker und Kassensicherheit — oben eine Auswahl der Veranstaltung, sobald mehr als eine existiert. Sie bestimmt, worauf sich Listen, Filter und Exporte dieser Seite beziehen. Bei nur einer Veranstaltung entfällt die Auswahl.


Kassierer auf Stände beschränken

Unter Kasse → Kassierer lässt sich pro Person festlegen, an welchen Ständen sie sich anmelden darf. Ohne Auswahl gilt: alle Stände.

Meldet sich eine nicht freigegebene Person an, wird die Anmeldung mit einem entsprechenden Hinweis abgelehnt. Ein solcher Versuch zählt nicht als Fehlversuch für die PIN-Sperre.

Kassierer deaktivieren und wieder aktivieren

In der Liste unter Kasse → Kassierer schaltet dieselbe Schaltfläche in beide Richtungen: Deaktivieren stoppt die Anmeldung sofort, Aktivieren stellt sie wieder her. Wer am Freitag nach Hause geht, steht am Samstag wieder hinter der Theke.

Kassierer werden nie gelöscht, sondern nur deaktiviert — bereits gebuchte Verkäufe bleiben dieser Person zugeordnet, und ein gelöschter Datensatz würde diese Zuordnung zerreißen.

Die PIN bleibt beim Deaktivieren erhalten und gilt nach dem Aktivieren unverändert weiter. Eine Kollision ist dabei ausgeschlossen: PINs sind innerhalb einer Veranstaltung über aktive und deaktivierte Kassierer hinweg eindeutig, sodass die freigewordene PIN zwischenzeitlich an niemanden vergeben werden konnte. Wenn die PIN inzwischen jemand gesehen haben könnte, erzeugt Neue PIN eine frische.

Wann die PIN erneut verlangt wird

Ein Tablet steht selten still und wird selten von einer einzigen Person bedient. Die Anmeldung endet deshalb in zwei Fällen von selbst:

  • Beim Neuladen der Seite. Immer und ohne Ausnahme. Wer die Kasse neu lädt — oder ein Gerät in die Hand nimmt, das jemand anders offen gelassen hat — muss sich anmelden, bevor der nächste Verkauf auf einen Namen gebucht wird.
  • Nach Inaktivität. Voreingestellt sind 15 Minuten, einstellbar unter Einstellungen → Kasse (Automatische Abmeldung nach). Ein Zähler in der Kopfzeile zeigt die verbleibende Zeit und färbt sich in der letzten Minute rot. Jede Bedienung — Tippen, Scannen, Tastatur — setzt ihn zurück. Der Wert 0 schaltet die automatische Abmeldung ab.

Der Warenkorb bleibt in beiden Fällen erhalten und steht nach der nächsten Anmeldung wieder bereit. Ein halb erfasster Vorgang geht also nicht verloren, nur weil jemand ein Fass wechseln musste.


Der Verkaufsvorgang

Das Terminal ist eine Vollbildansicht ohne die übrige Verwaltungsoberfläche. Links das farbige Produktraster, rechts der Warenkorb.

  • Produkt antippen legt es in den Warenkorb; nochmaliges Antippen erhöht die Menge.
  • Scannen funktioniert ohne vorherigen Klick in ein Feld — der Scanner wird an seiner Tippgeschwindigkeit erkannt. Ein Mensch kann so schnell nicht tippen, deshalb löst normales Tippen niemals versehentlich einen Scan aus. Ein Scan wird gegen Produkte, Coupons und Armbänder zugleich geprüft; passt er auf genau einen Eintrag, wird dieser sofort angewendet.
  • Suchen (F3) findet Produkte über Name, Artikelnummer oder Barcode.
  • Parken (F4) legt einen Warenkorb beiseite, wenn jemand sein Portemonnaie holen geht. Geparkte Vorgänge sind an allen Kassen desselben Standes abrufbar.
  • Coupon (F6) löst einen Rabattcode ein — siehe Rabatte & Coupons.
  • Guthaben (F7) fragt ein Armband oder einen Coupon rein lesend ab — siehe Guthaben abfragen.
  • Bar öffnet den Ziffernblock mit Schnellwahltasten; das Rückgeld erscheint groß.
  • Armband öffnet ein Eingabefeld. Leser und Tastatur sind dort gleichzeitig aktiv: Ein funktionierender Leser füllt das Feld selbst, andernfalls tragen Sie die Nummer von Hand ein und bestätigen mit Enter.

Änderungen während des Betriebs

Preise, neue Produkte, Zahlungsarten, das Sortiment eines Standes oder eine Einstellung lassen sich mitten in der Veranstaltung ändern. Laufende Kassen holen sich die Änderung von selbst, ohne dass jemand ein Tablet neu laden muss — was ohnehin eine erneute PIN-Eingabe bedeuten würde.

Die Kasse fragt dazu etwa alle 45 Sekunden eine einzige Versionsnummer ab und lädt den Katalog nur dann neu, wenn sich diese geändert hat. Nach jedem abgeschlossenen Verkauf wird zusätzlich geprüft. Das hält die Last auch bei zwanzig Tablets in einem Gelände-WLAN vernachlässigbar.

Automatisch übernommen werden:

  • Produkte: Preise, Namen, Farben, neue und entfernte Artikel
  • Kategorien und Zahlungsarten
  • Das Sortiment des jeweiligen Standes
  • Währung, Rasterspalten, Ton, Armband- und Freipreis-Schalter

Nicht automatisch übernommen wird die Zeit bis zur automatischen Abmeldung — sie würde sonst den laufenden Zähler unter der Kassiererin neu starten. Sie greift ab der nächsten Anmeldung.

Bestandsänderungen aus Verkäufen lösen bewusst keine Aktualisierung aus: Bestand ändert sich bei jedem einzelnen Verkauf, und zwanzig Tablets nach jedem Bier neu laden zu lassen wäre genau die Last, die dieses Verfahren vermeidet. Der eigene Bestand wird nach jedem eigenen Verkauf ohnehin frisch geholt.


Rabatte & Coupons

Die Kasse kennt bewusst keinen frei eingebbaren Rabatt. Rabatt entsteht ausschließlich durch einen Coupon, den die Kundschaft vorlegt — das ist die übliche Kontrolle gegen Schwund, weil ein Rabattfeld an der Theke von niemandem geprüft werden kann.

Aktion und Codes

Zwei Ebenen, unter Kasse → Coupons:

  • Eine Aktion trägt die Regeln: wie viel Rabatt, worauf, wie oft, bis wann.
  • Ein Code gehört zu einer Aktion. Eine gedruckte Charge sind tausende Codes zu einer Regel.

Die Trennung erlaubt es, eine Regel nach dem Druck noch zu korrigieren, ohne die Bons neu zu drucken.

Codes werden als Serie erzeugt — dieselbe Klammer-Schreibweise wie bei den Armbändern, etwa SOMMER-[0001-2000]. Ein einzelner Code ohne Klammern (HELFER20) ist ebenso möglich. Codes sind aktionsübergreifend eindeutig, weil ein Scan nur den Code liefert und dieser genau einen Coupon treffen muss. Die Groß-/Kleinschreibung spielt beim Einlösen keine Rolle.

Was eine Aktion festlegt

EinstellungBedeutung
RabattartProzentual oder Festbetrag.
Gilt fürKategorien und/oder einzelne Produkte. Beides leer = gesamtes Sortiment. Kategorien und Produkte werden addiert, nicht geschnitten.
EinlösungEinzelcode (jeder Code einmal — gedruckte Bons) oder Sammelcode (ein Code mehrfach, wahlweise mit Obergrenze).
ÜberhangNur bei Festbetrag: deckeln und verfallen lassen, Restwert auf dem Coupon behalten, oder die Einlösung ablehnen.
MindestumsatzGemessen an den passenden Artikeln, nicht am ganzen Warenkorb — „10 € Mindestumsatz auf Merchandise” lässt sich nicht durch Bier erfüllen.
KombinierbarOb mehrere Coupons auf einen Bon dürfen.
GültigkeitszeitraumOptional, sonst unbegrenzt.
VeranstaltungLeer = gilt überall. Sonst nur bei der gewählten Veranstaltung.

An der Kasse

Ein Coupon wird einfach gescannt — passt der Code zu keinem Produkt, sucht die Kasse ihn als Coupon. Für einen unleserlichen Bon oder einen Code wie HELFER20 gibt es die Schaltfläche Coupon (F6).

Jeder Coupon steht als eigene Zeile im Warenkorb und lässt sich einzeln wieder entfernen. Ändert sich der Warenkorb, wird jeder Coupon neu bewertet: fällt der letzte passende Artikel weg, verschwindet der Coupon mit einem Hinweis.

Werden mehrere Coupons kombiniert, wirken sie nacheinander: zwei Mal 50 % auf denselben Artikel ergeben 75 % Nachlass, nicht 100 %. Der Rabatt kann den Warenkorb nie unter null drücken.

Wenn der Rabatt alles abdeckt

Ein Coupon über 100 % — etwa ein Mitarbeiterrabatt — bringt die Summe auf 0,00 €. Statt der Zahlungsarten erscheint dann eine einzelne Schaltfläche Ohne Zahlung abschließen.

Der Vorgang wird ganz normal gebucht: Ware hat den Stand verlassen, der Bestand wird abgebucht, der Beleg wird erstellt und signiert. Er trägt keine Zahlungszeile, denn es hat kein Geld den Besitzer gewechselt — eine Zeile über 0,00 € würde im Z-Bericht eine Zahlung vortäuschen, die es nie gab. Auf dem Bon steht stattdessen „Keine Zahlung — vollständig durch Rabatt gedeckt”.

Auf dem Beleg und bei Erstattungen

Jeder Coupon steht mit Name, Code und Betrag einzeln auf dem Bon und in der Belegansicht — bei einer Reklamation geht es immer um einen bestimmten Coupon. Die Angaben sind auf dem Beleg fest gespeichert und bleiben auch dann lesbar, wenn die Aktion später gelöscht wird.

Bei einer vollständigen Erstattung wird der Coupon wieder freigegeben und ist erneut einlösbar. Bei einer Teilerstattung nicht: die Kundschaft behält Ware, die der Rabatt mit bezahlt hat.


Erstattungen

Erstattungen werden nicht am Terminal, sondern unter Kasse → Transaktionen auf dem betreffenden Beleg ausgelöst und brauchen die Berechtigung pos.refund — bewusst getrennt von „darf verkaufen”.

Dabei gilt:

  • Es entsteht immer ein neuer Beleg mit eigener Nummer. Der Originalbeleg bleibt unverändert.
  • Es kann positionsweise und teilweise erstattet werden.
  • Die Erstattung geht auf die ursprünglichen Zahlungsarten zurück. Zahlungen per Armband werden immer dem Armband gutgeschrieben — sonst wäre das Armband ein Weg, Guthaben in Bargeld zu tauschen.
  • Ein Grund ist Pflicht.

Einlagen, Entnahmen und Manager-Freigaben

Bargeld bewegt sich auch außerhalb von Verkäufen: Wechselgeld wird geholt, Überschüsse werden zwischendurch abgeschöpft. Solche Bewegungen erfasst die Kasse als Einlage (Geld rein) oder Entnahme (Geld raus). Beide fließen in den erwarteten Kassenbestand ein — genau deshalb müssen sie erfasst werden, sonst taucht die Differenz beim Kassensturz auf und niemand weiß mehr warum.

An der Kasse führt die Schaltfläche Manager dorthin. Betrag und Grund sind Pflicht: eine Bewegung ohne Begründung ist beim späteren Lesen des Z-Berichts nicht von einem Fehlbetrag zu unterscheiden.

Manager

Ein Kassierer kann unter Kasse → Kassierer zum Manager gemacht werden. Manager geben mit ihrer ganz normalen Kassierer-PIN Aktionen frei, die ein Kassierer nicht allein durchführen darf:

AktionWarum freigabepflichtig
EntnahmeDer klassische Weg, auf dem Bargeld ohne Gegenbuchung verschwindet.
EinlageSpiegelbildlich: eine erfundene Einlage kaschiert einen Fehlbetrag, bevor der Kassensturz ihn findet.
ErstattungGeld geht über die Theke zurück.
Schublade öffnenDie Hardware protokolliert davon nichts — die Freigabe ist der Nachweis.

Jeder Manager der Veranstaltung kann an jeder Kasse freigeben, auch an Ständen, für die er selbst nicht freigeschaltet ist. Das ist Absicht: Eine Schichtleitung läuft über das Gelände, und eine Freigabe, die den richtigen Stand voraussetzt, findet um 1 Uhr nachts nicht statt — die Entnahme bleibt dann unerfasst, also genau das, was verhindert werden soll.

Das Manager-Panel

Ein Tippen auf Manager öffnet dasselbe Zahlenfeld wie die Kassierer-Anmeldung. Nach korrekter PIN erscheint ein Panel mit den freigabepflichtigen Funktionen:

EintragWirkung
EinlageGeld in die Schublade, mit Betrag und Grund.
EntnahmeGeld heraus, mit Betrag und Grund.
Schublade öffnenÖffnet die Lade ohne Verkauf.
X-BerichtZwischenstand der laufenden Schicht — Umsatz nach Zahlart und Soll-Bargeld. Ändert nichts.

Oben im Panel stehen der Name der freigebenden Person und ein Countdown. Läuft er ab, schließt sich das Panel von selbst und die nächste Aktion verlangt die PIN erneut. Die Standardzeit beträgt drei Minuten und lässt sich über Pos_Manager_Unlock_Seconds ändern.

Die Freigabe ist an diese eine Kasse gebunden und endet außerdem, sobald das Panel geschlossen, die Kassiererin abgemeldet oder das Tablet in den Hintergrund gelegt wird.

Ist für eine Veranstaltung niemand als Manager hinterlegt, bleibt die Schaltfläche Manager an der Kasse ausgeblendet; Erstattungen und das Öffnen der Schublade funktionieren dann wie bisher über die CMS-Berechtigung. Eine bestehende Installation ändert ihr Verhalten also erst, wenn der erste Manager benannt wird.

Fehlversuche bei der Manager-PIN werden getrennt von der Kassierer-PIN gezählt — sonst könnte eine Kassiererin, die sich bei der eigenen Anmeldung vertippt, jede Freigabe an diesem Tablet blockieren.


Pfand

Becherpfand ist auf deutschen Festivals nahezu Standard und war bis zuletzt die größte offene Stelle in der Abrechnung: Der Pfandbetrag ist echtes Geld, das die Kasse verlässt und wieder betritt, ohne dass das System davon wusste. Jeder Stand, der Pfand nahm, rechnete es am Ende von Hand nach.

Einschalten unter Einstellungen → Kasse → Pfand, verwalten unter Kasse → Verwalten → Pfand.

Pfandartikel

Ein Pfandartikel ist der Gegenstand, auf den Pfand erhoben wird — Becher, Schüssel, Glas, Kiste. Er ist bewusst kein Produkt:

Ein Produkt …Ein Pfandartikel …
kann rabattiert und couponiert werdennie — es wird zum vollen Wert zurückgenommen
hat einen Bestandhat keinen
ist Umsatzist verwahrtes Geld des Gastes
lässt sich einzeln verkaufenhängt immer an etwas anderem

Dass Pfand nicht rabattierbar ist, steckt damit in der Datenstruktur und nicht in einer Regel, die sich sechs Stellen im Code merken müssten.

Zuordnung zu Produkten

Unter Produkte → Bearbeiten → Pfand wird ein Pfandartikel zugeordnet, zusammen mit der Zahl der Pfandeinheiten je verkaufter Einheit. Fast immer 1 — beim Kasten Bier aber 21: zwanzig Flaschen und der Kasten. Wer das auf 1 stehen lässt, zahlt am Ende einen Bruchteil dessen zurück, was kassiert wurde.

Beim Verkauf entsteht die Pfandposition automatisch, direkt unter dem auslösenden Artikel:

Bier 0,5 l          4,00
Pfand Becher        2,00
─────────────────────────
Summe               6,00

Direkt darunter, nicht am Bonende gesammelt: Wer „Bier 4,00 / Pfand 2,00” liest, versteht die 6,00 € — dieselben zwei Zeilen acht Positionen auseinander beginnen eine Diskussion.

Rückgabe an der Kasse

Schaltfläche Pfand an der Kasse. Menge pro Artikel hoch- oder runterzählen, Auszahlen — fertig. Kein Beleg nötig.

Das ist eine bewusste Entscheidung. Die Rückgabe an den Originalbon zu knüpfen wäre wasserdicht und in der Praxis unbenutzbar: Der Bon liegt im Müll oder wurde nach §148 AO nie gedruckt. Eine Regel, die niemand befolgen kann, ist keine Kontrolle.

Begrenzt wird die Rückgabe stattdessen durch ihren Rahmen:

  • Nur hinterlegte Pfandartikel, nur zum hinterlegten Wert. Es gibt keine Möglichkeit, „gib dem Gast 50 €” auszudrücken — nur „sechs Becher”.
  • Der Betrag wird immer serverseitig gerechnet, nie vom Tablet übernommen.
  • Oberhalb von Pos_Deposit_Return_Max_Cents (Standard 50 €, rund hundert Becher) muss ein Manager freigeben.
  • Jede Rückgabe erzeugt einen eigenen Beleg mit eigener Belegnummer und erscheint im Transaktionsjournal als Pfandrückgabe.

Die Auszahlung geht immer bar aus der Schublade. Auf Karte ginge eine Buchung, die sich gegen keinen Verkauf abstimmen lässt; auf ein Armband würde aus Bechern ein Weg, Guthaben aufzuladen.

Pfand im Umlauf

Unter Kasse → Berichte und auf der Pfandseite steht, wie viel Pfand ausgegeben, wie viel zurückgenommen wurde und wie viel noch unterwegs ist. Der Wert der Rückstellung ist der Betrag, der in den Kassen bleiben muss, um alles zurücknehmen zu können — dieselbe Art Verbindlichkeit wie offenes Armband-Guthaben.

Ein negativer Wert ist kein Fehler: Becher aus einer früheren Veranstaltung kommen hier zurück.


Kassiererwechsel (Übergabe)

Schaltfläche Übergabe an der Kasse. Die neue Person tippt ihre eigene PIN — nicht die alte Person, die die Kasse jemandem zuweist. Das ist der ganze Grund, warum die Übergabe vertrauenswürdig ist: Niemand kann den Namen einer anderen Person über die nächsten drei Stunden Umsatz schreiben.

Die Schublade wird dabei nicht gezählt. Die Schicht gehört der Kasse, nicht der Person — deshalb auch der eindeutige Index pro Terminal. Eine Festivalbar wechselt alle paar Stunden das Personal; ein Kassensturz bei jedem Wechsel hieße vier Zählungen pro Nacht und Kasse, mit Schlange durch jede einzelne — oder, weit wahrscheinlicher, dass alle unter dem Namen weiterarbeiten, der um 18 Uhr angemeldet hat.

Der Warenkorb bleibt erhalten: Eine Übergabe mitten in einer Bestellung ist an einer vollen Bar der Normalfall.

Jedes Ende einer Kassiererzeit wird mit Grund festgehalten, weil die vier Fälle nicht dasselbe sind:

GrundBedeutung
ÜbergabeEine namentlich bekannte Person hat übernommen. Das Geld war nie unbeaufsichtigt.
AbmeldungJemand hat sich bewusst abgemeldet.
ZeitüberschreitungDas Tablet hat sich selbst gesperrt. Niemand hat etwas entschieden, die Schublade stand da.
KassensturzDie Schicht wurde geschlossen, das Geld ist gezählt.

Der Unterschied zwischen Abmeldung und Zeitüberschreitung ist die erste Frage, die bei einem Fehlbetrag gestellt wird — deshalb werden sie getrennt festgehalten statt beide als „nicht mehr angemeldet”.


Inventur

Der Bestand wird bei jedem Verkauf heruntergezählt, aber nichts hat ihn je mit dem Regal verglichen. Bruch, Personalgetränke, ein nie eingebuchtes Fass, eine Kiste, die verschwunden ist — nichts davon läuft über die Kasse, und jedes davon entfernt die Zahl weiter von der Wirklichkeit. Ein Bestand, den nie jemand geprüft hat, ist einer, dem stillschweigend niemand mehr traut.

Kasse → Inventur, Berechtigung pos.manage_stocktakes.

Ablauf

  1. Starten. Bereich wählen (ein Stand oder die ganze Veranstaltung) und entscheiden, ob der Bestand am Ende korrigiert werden soll.
  2. Zählen. Jede Zeile wird sofort gespeichert, sobald das Feld verlassen wird. Die Liste kann jederzeit unterbrochen und später fortgesetzt werden. Enter springt zur nächsten Zeile.
  3. Abschließen. Erst danach erscheinen Soll, Differenz und Wert.

Gezählt werden nur Produkte mit aktivierter Bestandsführung. Deaktivierte Produkte sind bewusst dabei — im Regal stehen sie trotzdem, und sie wegzulassen ist genau der Weg, auf dem Bestand aus den Büchern verschwindet, ohne aufzuhören zu existieren.

Ergebnis

Fehlmenge und Überbestand werden getrennt ausgewiesen, nicht nur saldiert. 200 € zu wenig beim Schnaps und 200 € zu viel beim Bier ergeben netto null und sind trotzdem keine saubere Inventur: Das eine ist Schwund, das andere ein Buchungsfehler.

Bewertet wird zum Verkaufspreis, nicht zum Einkaufspreis — einen solchen kennt dieses System nicht, und einen zu erfinden machte die Zahl auf eine Weise falsch, die niemand sehen könnte. So beantwortet sie „welcher Umsatz ist uns entgangen” und überzeichnet den reinen Warenverlust.

Wurde beim Start Bestand korrigieren gewählt, wird der Bestand beim Abschluss auf die gezählten Mengen gesetzt — nicht um die Differenz verschoben. Nicht gezählte Zeilen bleiben unberührt.

Die Zählliste lässt sich als CSV oder XLSX herunterladen — auch leer, zum Ausdrucken und Abhaken auf Papier.


Auswertung

Unter Kasse → Berichte, unterhalb der X-/Z-Berichte. Alle Zahlen stammen direkt aus dem Transaktionsjournal; es gibt keine zwischengespeicherten Summen, die davon abweichen könnten. Optional auf einen Stand einschränkbar.

AuswertungBeantwortet
Umsatz nach UhrzeitWann muss die Bar dreifach besetzt sein und wann kann jemand nach Hause?
Renner & PennerWas bestellen wir nächstes Jahr mehr, was weniger?
Stände im VergleichUmsatz, Bonzahl, Ø Bon und Anteil je Stand.
KassiererUmsatz, Ø Bon, Erstattungen, Kassendifferenz je Person.

Die Stundenkurve zeigt alle 24 Stunden, auch die leeren. Eine Kurve, die nur aus Stunden mit Umsatz besteht, schließt ihre eigenen Lücken — und die toten Stunden sind das, was bei der Schichtplanung interessiert.

Renner werden nach Umsatz und nach Menge getrennt ausgewiesen. Die beiden widersprechen sich fast immer: Der billigste Artikel führt fast immer die Menge an und fast nie den Umsatz. Für eine Bestellliste braucht man das eine, für die Karte das andere.

Produkte, die sich überhaupt nicht verkauft haben, erscheinen nicht unter den Pennern: Zu ihnen existieren keine Positionen. Diese Frage beantwortet die Produktliste.


Kassensturz

Der Abschluss lässt sich an der Kasse selbst durchführen (Schaltfläche Kassensturz, sofern die Berechtigung pos.manage_shifts vorliegt) oder in der Verwaltung unter Kasse → Schichten. Der Weg über die Kasse ist der übliche: Dort steht die Person, die die Schublade in der Hand hat.

Unter Kasse → Schichten schließen Sie eine Schicht ab. Das System zeigt den erwarteten Kassenbestand:

Wechselgeld + Bareinnahmen + Einlagen − Entnahmen

Sie tragen den tatsächlich gezählten Betrag ein; die Differenz wird vorzeichenrichtig gespeichert und nicht korrigiert. Eine Fehldifferenz ist eine Tatsache über den Abend und soll auch als solche sichtbar bleiben.

Entnehmen Sie Geld für Wechselzwecke, erfassen Sie das als Entnahme — sonst stimmt die Abrechnung am Ende nicht und die Differenz landet zu Unrecht beim Kassierer.


Armbänder (RFID)

Optional, standardmäßig deaktiviert. Ein Armband trägt ein Guthaben, das an allen Ständen ausgegeben werden kann.

Aufladen an der Kasse

Aufladen ist pro Stand freizugeben: In Kasse → Stände aktivieren Sie beim jeweiligen Stand Armband-Aufladung erlaubt. Nur dann erscheint an dessen Kassen die Schaltfläche Armband aufladen; ein Stand ohne Freigabe kann kein Guthaben laden, auch wenn die Kassiererin dort angemeldet ist.

An der Kasse wird das Armband gescannt oder die Nummer von Hand eingetragen, danach werden Betrag und Zahlungsart erfasst. Die Zahlungsart ist Pflicht — ohne sie stimmt die Kassenabrechnung nicht:

  • Barzahlung wird zusätzlich als Einlage auf die laufende Schicht gebucht. Das Geld liegt tatsächlich in der Schublade, es gibt dazu aber keinen Verkauf. Ohne diese Buchung wäre jede Schublade beim Kassensturz genau um den aufgeladenen Betrag im Plus.
  • Kartenzahlung erzeugt keine Kassenbewegung, da nichts in die Schublade gelangt.

Eine offene Schicht ist Voraussetzung. Aufladungen aus der Verwaltung (Kasse → Armbänder) gehören zu keiner Schublade und erzeugen deshalb keine Kassenbewegung.

Wo Aufladungen erscheinen

Nicht unter Kasse → Transaktionen. Diese Liste enthält ausschließlich signierte Belege — jeder Eintrag hat Belegnummer, Umsatzsteuer und TSE-Signatur. Eine Aufladung hat nichts davon, weil beim Aufladen eines Mehrzweckgutscheins keine Umsatzsteuer entsteht. Aufgeladenes Guthaben ist eine Verbindlichkeit; zum Umsatz wird es erst beim Verkauf, der dann ganz normal in den Transaktionen steht.

Aufladungen stehen stattdessen unter Kasse → Aufladungen: gefiltert nach Zeitraum, Stand, Zahlungsart und Armband, mit Summen je Zahlungsart und Export (Berechtigung pos.export_transactions).

Bei der Abstimmung hilft die Unterscheidung:

Zahlungsart der AufladungWo sie auftaucht
BarKasse → Aufladungen und als Einlage im Z-Bericht der Schicht — das Geld liegt in der Schublade.
KarteNur unter Kasse → Aufladungen. Es gelangt nichts in die Schublade, deshalb gibt es keine Kassenbewegung.
Aus der VerwaltungNur unter Kasse → Aufladungen, gekennzeichnet als „Verwaltung”. Gehört zu keiner Schublade.

Serie anlegen

Armbänder kommen aus der Druckerei als durchnummerierte Charge. Statt sie einzeln zu erfassen, legt Serie anlegen auf der Armbänder-Seite eine ganze Charge aus einem Muster an. Die Schreibweise ist die von NetBox:

MusterErgebnis
Armband-[1-1000]Armband-1 bis Armband-1000
Armband-[0001-1000]Führende Nullen bleiben erhalten: Armband-0001
VIP-[1,4,9]Nur VIP-1, VIP-4, VIP-9
Tor-[a-d]Tor-a bis Tor-d
[A-C]-[1-50]Alle Kombinationen — hier 150 Stück
Armband-[1-3,7,10-11]Bereiche und Einzelwerte gemischt

Ob führende Nullen erhalten bleiben, entscheidet der Anfangswert: [001-100] ergibt dreistellige Nummern, [1-100] einstellige. Das ist wichtig, weil Armband-007 und Armband-7 für einen Menschen dasselbe Armband sind, für die Datenbank aber zwei verschiedene.

Bereits vorhandene Kennungen werden übersprungen, nicht überschrieben — eine zweite Kiste derselben Charge lässt sich also mit demselben Muster nachtragen. Pro Vorgang sind höchstens 100.000 Armbänder erlaubt.

Auf der Kommandozeile geht dasselbe, was sich für große Chargen am Vorabend anbietet:

crisp crispy:pos:wristbands --pattern="Armband-[0001-2000]" --dry-run
crisp crispy:pos:wristbands --pattern="Armband-[0001-2000]" --balance=1000

--dry-run zeigt nur Anzahl und Bereich an. Ohne --event wird die aktive Veranstaltung verwendet.

Guthaben abfragen

„Wie viel ist da noch drauf?” ist die häufigste Frage an einem Stand mit Armbändern. Die Schaltfläche Guthaben an der Kasse (oder F7) beantwortet sie: Armband an den Leser halten oder Nummer eintippen — das Guthaben erscheint groß, darunter Status und die letzten Bewegungen.

Die Abfrage ist rein lesend. Kein Warenkorb, keine Buchung, nichts, was sich versehentlich auslösen ließe — deshalb kann das Fenster offen bleiben, während mehrere Gäste nacheinander fragen. Nach jeder Antwort ist der Leser sofort wieder bereit.

Im selben Feld lässt sich auch ein Coupon-Code prüfen. Statt eines Guthabens erscheinen dann Wert, Aktion, Geltungsbereich, Ablaufdatum und die Anzahl der verbleibenden Einlösungen.

Anders als beim Bezahlen wird ein gesperrtes Armband hier angezeigt statt abgewiesen — die Sperre ist ja gerade die Antwort auf „warum funktioniert mein Armband nicht?”.

Armbänder verwalten

Die Übersicht unter Kasse → Armbänder lädt seitenweise und zeigt nie alle Armbänder auf einmal — bei mehreren tausend Bändern wäre die Seite sonst genau dann unbenutzbar, wenn sie gebraucht wird.

Das Suchfeld ist beim Öffnen bereits aktiv: Ein Armband an den Leser zu halten trägt die Kennung ein und startet die Suche. Von Hand lässt sich ebenso nach einem Teil der Kennung oder der Bezeichnung suchen. Zusätzlich filtert die Statusauswahl auf aktive, gesperrte oder ausgezahlte Bänder.

Das offene Guthaben oben links bezieht sich immer auf die gesamte Veranstaltung, nicht auf die gerade gefilterte Auswahl — es ist die Verbindlichkeit zum Veranstaltungsende.


Belegdruck

Drucker werden unter Kasse → Drucker eingerichtet und einem Stand oder einer einzelnen Kasse zugeordnet.

ProtokollWann
ESC/POS (Port 9100)Funktioniert mit fast jedem Thermodrucker. Meldet keinen Papierstatus zurück.
Epson ePOS-PrintBevorzugen, wenn die Hardware es kann — meldet Papier, Deckel und Offline-Zustand.
Star CloudPRNTDer Drucker holt seine Aufträge selbst ab.

Ein Druckfehler bricht nie einen Verkauf ab. Der Beleg wandert in die Warteschlange, der Kassierer bekommt einen Hinweis und bedient weiter; ein Hintergrundauftrag druckt nach, sobald der Drucker wieder erreichbar ist.

Die Geldschublade hängt am Bondrucker und wird über einen Impuls geöffnet — ohne erreichbaren Drucker öffnet sich also auch die Schublade nicht.


Berechtigungen

BerechtigungErlaubt
pos.useKasse bedienen und verkaufen
pos.refundStornieren und erstatten
pos.discountReserviert für frei eingebbare Rabatte — die Kasse bietet bewusst keine an, siehe Rabatte & Coupons
pos.open_drawerSchublade außerhalb eines Verkaufs öffnen
pos.read_transactionsTransaktionen einsehen
pos.export_transactionsTransaktionen exportieren
pos.manage_shiftsSchichten schließen, Kassensturz
pos.view_reportsX-/Z-Berichte
pos.manage_productsProdukte, Kategorien, Steuersätze
pos.manage_payment_methodsZahlungsarten
pos.manage_eventsVeranstaltungen
pos.manage_standsStände und Kassen
pos.manage_cashiersKassierer und PINs
pos.manage_wristbandsArmbänder, Aufladungen
pos.manage_couponsRabattaktionen & Coupons
pos.manage_depositsPfandartikel verwalten
pos.manage_stocktakesInventuren durchführen
pos.manage_printersDrucker

Verkaufen, Geld zurückgeben und die Schublade öffnen sind bewusst drei verschiedene Berechtigungen — diese Trennung ist die verbreitetste Maßnahme gegen Schwund im Einzelhandel.

pos.manage_stocktakes ist aus demselben Grund von pos.manage_products getrennt, obwohl es bei einer Inventur „um Produkte geht”: Zählen ist eine Aufgabe für die Person, die den Stand abschließt — die Preise des ganzen Katalogs ändern zu dürfen ist etwas, das man dabei nicht nebenbei erwerben sollte.


Kommandozeile

# X-/Z-Bericht einer Schicht anzeigen
crisp crispy:pos:report --shift=12

# Druckwarteschlange ansehen, verarbeiten, Drucker prüfen
crisp crispy:pos:print-queue
crisp crispy:pos:print-queue --drain
crisp crispy:pos:print-queue --status
crisp crispy:pos:print-queue --test=3

# Armbänder aus einem Muster anlegen (--dry-run zeigt nur die Vorschau)
crisp crispy:pos:wristbands --pattern="Armband-[0001-2000]" --dry-run
crisp crispy:pos:wristbands --pattern="Armband-[0001-2000]" --balance=1000

# Beispieldaten für Demo und Entwicklung (nur Entwicklungsumgebung)
crisp crispy:pos:seed
crisp crispy:pos:seed --event="Sommerfest 2026" --site-code=SOF --wristbands="Armband-[1-500]"

# Alle Kassendaten löschen (nur Entwicklungsumgebung)
crisp crispy:pos:purge
crisp crispy:pos:purge --keep-catalogue

Vor der Veranstaltung

Die Seite Kasse → Kassensicherheit prüft automatisch: aktive Veranstaltung, TSE konfiguriert und erreichbar, TSE-Zeit gültig, Drucker eingerichtet, Kassen registriert.

Nach der Veranstaltung

  1. Alle Schichten mit Kassensturz abschließen
  2. Offenes Armband-Guthaben auszahlen oder verfallen lassen
  3. DSFinV-K- und TSE-Export aus der TSE-Middleware ziehen — die Hardware verlässt danach den Standort
  4. Veranstaltung abschließen

Der Transaktionsexport unter Transaktionen ist eine betriebswirtschaftliche Auswertung für die Buchhaltung. Er ersetzt den DSFinV-K-Export für die Betriebsprüfung nicht.