LaborPOS
LaborPOS Release status: stable [box doku] | |
---|---|
Description | Das Kassensystem, welches seit 2017 bei größeren Veranstaltungen, z.B. den Labortagen genutzt wird. |
Author(s) | Endres |
Last Version | 1.0 () |
Download | https://github.com/das-labor/laborpos |
Einleitung
Seit Jahren probieren wir im Labor ein System aufzusetzen, welches unseren Anforderungen für die Dokumentation von Buchungen während Veranstaltungen wie den Labortagen dienen kann. 2017 hat Endres am ersten Tag der Labortage daher ein quick'n'dirty PHP-Skript geschrieben, welches auf einem Raspberry Pi via Webserver laufen konnte. Das Skript wurde seither stets weiterentwickelt und zu den Labortagen 2019 auf Python übersetzt. Es stellt ein Touch-freundliches HTML5- und Javascript-basiertes Frontend zur Verfügung welches somit in einem Webbrowser auf einem an den genannten Raspberry Pi angeschlossenen Touch-Monitor dargestellt und genutzt werden kann. Da das gesamte System möglichst simpel gehalten werden sollte, wird es als CGI-Skript angeboten und benötigt intern kein bestimmtes Datenbankinterface, sondern läuft komplett auf No-SQL.
Installation
Zur Installation selbst wird nur ein beliebiger Webserver mit CGI Funktionalität sowie Python 3 (ohne besondere zu installierenden Module) benötigt.
- Das Git (https://github.com/das-labor/laborpos) sollte als Webroot konfiguriert sein.
- Zumindest
db/boughts
muss Zugriffsrechte-mäßig durch den Webserver beschreibbar sein. - Als Dokumentenindex kann
app.py
genutzt werden, ansonsten muss später spezifisch dieapp.py
addressiert werden. - Python-Dateien in dem Webverzeichnis sollen durch bspw. FastCGI ausgeführt werden, dies wird bei nginx durch untenstehende Konfiguration erreicht.
- In einem Webbrowser muss nur der konfigurierte Webserver addressiert werden um das Kassensystem zu öffnen.
- Idealerweise wird das Kassensystem dann im Vollbildmodus angezeigt.
Nginx FastCGI Konfiguration
location ~ \.py$ { if (!-f $document_root$fastcgi_script_name) { return 404; } gzip off; fastcgi_pass unix:/var/run/fcgiwrap.sock; fastcgi_index app.py; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
Nutzung des Systems
Genau so simplistisch wie das System selbst programmiert wurde ist es eigentlich auch in seiner Benutzung. Wird das Kassensystem aufgerufen, so ist links im Feld die Bestellung des aktuellen Kunden sichtbar. Im rechten Feld können Produkte aus der Produkt-Datenbank hinzugefügt werden. Durch einen Druck auf Cash, Scratch oder Card (EMV) unten rechts in der Leiste wird der Kauf abgeschlossen und ein Registrierkassengeräusch ertönt. Wurde ein Fehler gemacht, können zu viel gekaufte Produkte wieder abgezogen werden, indem statt auf die grünen "Kauf"-Schaltflächen stattdessen auf einen der gelben Storno-Schaltflächen gedrückt wird. Die rote Clear Schaltfläche löscht den aktuellen Kunden bevor der Kauf abgeschlossen wurde ("Doch kein Interesse") und die blaue Add Schaltfläche fügt Produkte hinzu, welche nicht in der Liste der Produkte stehen.
Produkt-Datenbank
Im Datenbankverzeichnis des Kassensystems db
befindet sich eine Datei products
, welche eine Auflistung sämtlicher angebotenen Produkte zusammen mit Metadaten wie Produktkategorie (nur zur farblichen Unterscheidung der einzelnen Produkte), Preis und EAN-Code (optional) hinterlegt. Zeilen, die mit einem Hash (#) anfangen, werden ignoriert. Die einzelnen aktiven Produkte werden einfach der Reihe nach im Frontend angezeigt und können somit im System gekauft werden.
Falls in der Produktdatenbank einzelne Produkte fehlen, ist dies nicht weiter schlimm, durch ein Freitextfeld im System können auch beliebige andere Produkte angeboten werden.
Das Format der Produktdatenbank ist durch Tabulatoren getrennt wie folgt:
Kategorie | Preis | Produkt | EAN-Code (optional) |
Die Kategorie ist mit einer Ganzzahl zwischen 0 und 7 anzugeben. Der Preis ist eine Fließkommazahl die durch einen Dezimalpunkt angegeben wird und den Preis in Euro angibt. Das Produkt sollte alle nötigen Informationen, bei Getränken also zum Beispiel auch die Flaschengröße, beinhalten. Wird ein EAN-Code angegeben, kann das Produkt im Kassensystem durch einen angeschlossenen Barcode-Scanner eingescannt werden. Dieser Scanner muss nur als Tastatur agieren und die EAN, gefolgt von einem Zeilenumbruch (Enter) ausgeben, sobald gescannt wurde.
Registrierkassenfunktion
Wird ein Produkt gekauft, so wird die Datenbankdatei db/boughts
um Zeile(n) mit den gekauften Produkten erweitert. Die einzelnen Spalten dieser ebenfalls durch Tabulatoren getrennten Spalten schlüsselt sich wie folgt auf:
Datum, Uhrzeit | IP-Adresse | Preis | Bezahlweise | Produkt |
Datum, Uhrzeit ist im date +%c
Format angegeben. Für die Bezahlweisen stehen B für Bargeld, C für Kartenzahlung und S für Scratchcard (Verzehrkarte) zur Verfügung. Preis und Produkt entsprechen den Elementen aus der Produktdatenbank (siehe oben).
Durch dieses Backlog, welches unter Umständen auch auf einen Papierbon ausgedruckt werden könnte, sind weitere Auswertungen und Statistiken denkbar. Beispiele dazu finden sich in dem Ordner tools
.