ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

Aufsetzen eines Gastro-Kassensystems mit OrderSprinter

Achtung!

Die Verwendung dieses Howto geschieht auf eigene Gefahr. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos.

Hinweis:

Diese Howto-Anleitung wurde zuletzt von CaptainPOS am 28.03.2019 unter Ubuntu Bionic Beaver erfolgreich getestet.

Dieses Howto beschreibt die Installation und Ersteinrichtung der Software OrderSprinter zum Aufbau eines Gastro-POS auf einem aktuellen Ubuntu.

Zu Beginn wird eine Einordnung in den Kontext vorgenommen: Warum sollte man ein Kassensystem unter Linux aufsetzen, welche Anforderungen gelten an Kassensysteme und welche Programme sind dem Autor bekannt, die diese Anforderungen für Deutschland umsetzen?

Anforderungen an Kassensysteme

Ein Kassensystem (auch als POS abgekürzt: Point-of-Sales bzw. Point-of-Service) unterstützt im Handel und der Gastronomie den Verkäufer bei der Abwicklung eines Verkaufsvorgangs.

In der Gastronomie muss ein Kassensystem besondere Anforderungen erfüllen, die weit über die Funktionalität einer reinen elektronischen Registrierkasse hinausgehen:

  • Bestellungen müssen auf Tische buchbar sein, die Zuweisung muss jederzeit veränderbar sein (Tischwechsel)

  • Bestellungen müssen gegebenenfalls zusätzlich auf konkrete Kunden oder Zimmer buchbar sein (Hotelbetrieb)

  • Teilabrechnungen von Bestellvorgängen (Gäste eines Tisches zahlen einzeln)

  • Produktvariationen (Pommes mit Ketchup und/oder Majo) mit Preisen je nach gewählten Optionen

  • Ausgabe von Bewirtungsbelegen

  • Arbeitsbons oder digitale Workflowanzeigen (Produkte müssen schließlich zubereitet werden)

  • Verteilung von Bons (Arbeitsbons, Kassenbons) auf Bondrucker an unterschiedlichen Locations

Gastronomische Betriebe in Europa unterliegen vielen rechtlichen Auflagen, die von Land zu Land stark variieren. Neben Hygienevorschriften und baulichen Vorgaben (Fluchtwege, Toiletten usw.) sind es vor allem die steuerrechtlichen Regelungen, deren Umsetzung mitnichten trivial ist. In Deutschland gilt die GoBD (Grundsätze zur ordnungsmäßigen Führung und Aufbewahrung von Büchern, Aufzeichnungen und Unterlagen in elektronischer Form sowie zum Datenzugriff), die aus der GdPdU (Grundsätze zum Datenzugriff und zur Prüfbarkeit digitaler Unterlagen) hervorgegangen ist.

Neben den harten Anforderungen gibt es verschiedene weiche Kriterien, die ein gutes Kassensystem ausmachen:

  • Skalierbarkeit: Je nach Wochentag und Uhrzeit wechselt das Gästeaufkommen. Insbesondere während der Spitzenzeiten muss ein System performant arbeiten.

  • mobile Bestellaufnahme: Kann eine Bestellung direkt beim Gast aufgenommen werden, bei der anschließend ein Arbeitsbon in der Küche gedruckt wird, spart das Zeit und Personalkosten.

  • Exportmöglichkeiten: Ein Gastronom ist verpflichtet, alle umsatzrelevanten Daten über einen Zeitraum von zehn Jahren aufzubewahren.

  • intuitive Benutzeroberfläche: In der Gastronomie wechseln die Bediener sehr häufig. Zeit für eine ausführliche Einarbeitung von Teilzeitkräften ist oft nicht vorhanden.

  • abgestuftes Rechtemanagement: GoBD und BMF-Schreiben fordern z.B. eine Dokumentation, welche Bediener Stornierungsvorgänge wann durchführen konnten.

Linux als Betriebssystem für ein Kassensystem

Ein Linux-System als Grundlage für ein Kassensystem bietet sich aus den oben genannten Gründen an:

  • Updates sind besser planbar: Kellner wollen nicht warten, wenn ein Windows 10 Kassensystem entschieden hat, nun erst einmal Updates zu installieren und vielleicht sogar neu gestartet werden möchte.

  • Ein Linux-System kann so aufgesetzt werden, dass nur die relevanten Komponenten installiert sind: Das macht das Gesamtsystem schneller und sicherer.

  • Im Gegensatz zu vielen Cloud-Diensten bleiben die sensiblen Umsatzdaten lokal beim Gastronomen.

  • Kosten: Da keine Lizenzkosten für ein kommerzielles Betriebssystem anfallen und auch ältere Hardware noch benutzt werden kann, fallen die TCO (Total Cost of Ownership) geringer aus.

Verfügbare Software

In Deutschland (nicht in Österreich, hier gilt die RKSV!) hat der Gastronom die Auswahl aus drei nicht-kommerziellen Kassensystemen, die die oben aufgeführten Anforderungen erfüllen:

  • OpenBravo POS: OpenBravo POS ist eine Rich-Client-Software und benötigt eine Java VM und eine Oracle-, PostgreSQL-, MySQL- oder HSQLDB-Datenbank. Die Integration mit OpenBravo ERP ist bei Betrieben von Vorteil, die alle Ressourcen (Personal, Lager, Betriebsmittel, Kapital) per Software verwalten wollen. Allerdings ist das System nicht für die Anbindung von mobilen Endgeräten konzipiert.

  • POSPer: POSper ist ebenso eine Rich-Client-Software und verwendet Java und Hibernate als Zwischenschicht zur Datenbank (MySql, PostGreSQL, Oracle, HSQLDB und andere). Die Oberfläche ist in viele Sprachen übersetzt worden, so dass sich der Einsatz des Programms besonders für Betriebe eignet, die ausländisches Bedienpersonal beschäftigen. POSper ist gut auf stationären großen Touchpanels bedienbar.

  • OrderSprinter: Die Kernkomponente ist eine Webapplikation mit PHP und einer Datenbank MySQL/MariaDB. Es werden bis zu 6 Kassenbon- und 4 Arbeitsbondrucker unterstützt, die auf Linux-Systemen mit den in der Software enthaltenen Java-Druckserver angebunden werden können. Die Bestelloberfläche ist sowohl in einer PC-geeigneten als auch mobilen Ansicht programmiert. Da es sich im Grunde um eine Webapplikation handelt, ist eine Bedienung mit handelsüblichen Smartphones möglich. Zusätzlich enthält OrderSprinter eine Gastbestell- und Filial-Applikation, die nach gleichem Prinzip aufgebaut sind.

Installation

Dieser Artikel bezieht sich auf die Installation von OrderSprinter auf einem Ubuntu-System. OrderSprinter besteht aus diesen Komponenten:

  • Kernsystem: das eigentliche Kassensystem als Webapplikation

  • Gastbestellsystem: optionale Webapplikation, über die Gäste Bestellungen aufgeben können, die in das Gastsystem eingespeist werden

  • Filialapplikation Spider: optionale Webapplikation, um aus der Ferne auf verschiedene Instanzen des Kernsystems zugreifen zu können

  • Printserver für Windows und als Java-Version für Linux: Druckserver für die Nutzung von Bondruckern

Am Ende dieses HowTos steht ein System bestehend aus einem OrderSprinter-Kernsystems und einem Druckerserver für einen lokal angeschlossenen Bondrucker sowie ein funktionierendes Gastbestellsystem. Ebenso wird in Grundzügen beschrieben, wie man das Filialsystem Spider aufsetzen kann.

Vorbereitung

Benötigte Hardware:

  • Computer mit frisch installiertem Ubuntu. Unter Ubuntu 18.04 reicht die Installationsvariante "Minimale Installation" (wurden bereits Änderungen am System vorgenommen, ist die Installation möglicherweise anzupassen)

  • WLAN-Router

  • mobiles Endgerät (Smartphone, Tablet etc.)

  • USB-Bondrucker (muss das ESC/POS-Protokoll beherrschen, aber das ist i.d.R. immer der Fall bei Bondruckern)

Installation

Die Installation besteht aus folgenden Schritte:

  1. Installation der richtigen Umgebung (Webserver, Datenbank, PHP mit den richtigen Extensions)

  2. Installation der Webapplikation

  3. Installation des Druckservers (Einbau als Service)

Installation der Umgebung

Beim hier vorgestellten Installationsweg soll ein LAMP-System (Linux-Apache-MariaDB-PHP) aufgesetzt werden. Alternativ zu Apache könnte man auch Nginx oder lighttpd verwenden. Als PHP-Version soll die Version 7 verwendet werden. Der OrderSprinter-Autor testet seine Software zwar mit PHP 5.6, aber PHP 7 ist neuer und schneller in der Abarbeitung. Als Datenbank kann man MariaDb den Vorzug vor MySql geben, weil der OrderSprinter-Entwickler MariaDb für seine Tests verwendet und beide Datenbanken funktionell gleichwertig sind. Je näher man die Umgebung nachbildet, in der eine Software programmiert wird, desto besser ist vermutlich die Kompatibilität gewährleistet. Zusätzlich sind einige php-Erweiterungen zu installieren, die von OrderSprinter später benötigt werden. Die Installation von Java wird für den Druckerserver benötigt:

  • apache2 (Webserver)

  • libapache2-mod-php (PHP-Unterstützung für den Webserver)

  • php (Webserver)

  • mariadb-server (Datenbank)

  • php-mysql (MySQL-Erweiterung für PHP)

  • php-gd (GD-Erweiterung für PHP)

  • php-curl (Curl-Erweiterung für PHP)

  • php-zip (Zip-Erweiterung für PHP)

  • php-xml (XML-Erweiterung für PHP)

  • openjdk-8-jre (Jave wird für den Printserver benötigt)

Befehl zum Installieren der Pakete:

sudo apt-get install apache2 libapache2-mod-php php mariadb-server php-mysql php-gd php-curl php-zip php-xml openjdk-8-jre 

Oder mit apturl installieren, Link: apt://apache2,libapache2-mod-php,php,mariadb-server,php-mysql,php-gd,php-curl,php-zip,php-xml,openjdk-8-jre

Aufgrund der gesetzlichen Vorgaben müssen Kassensysteme in den meisten Ländern alle Umsatzdaten in unverkürzter Form inklusive aller Stornierungen über einen Zeitraum von vielen Jahren speichern. Das führt dazu, dass die Datenmenge über den Zeitraum der Nutzung immer weiter zunimmt. Um diese Datenmengen auch nach einigen Jahren noch managen zu können, muss die Laufzeitumgebung entsprechend eingestellt werden. In der Datei php.ini, die sich im Verzeichnis /etc/php/7.2/apache2 befindet, sollten daher folgende Werte eingestellt werden:

  • memory_limit: Dies ist der Arbeitsspeicher, den der PHP-Prozess zur Verfügung haben soll. Der Wert sollte möglichst groß, aber natürlich kleiner als der physikalisch verfügbare RAM-Speicher sein! Insbesondere bei Backup- und Restore-Aktionen benötigt OrderSprinter eine Menge Speicher). Ein guter Wert ist meist 3000M.

  • max_execution_time: Dieser Wert bestimmt, wie lange PHP-Skripte ausgeführt werden dürfen. Bei großen Datenmengen können bestimmte Aktionen tatsächlich mehrere Minuten dauern (z.B. Restore-Operationen, bei der Installation und bei Datenbanktabellen-Optimierungen). Bei einem handelsüblichen Rechner sollten aber ein Wert von 600 (600 Sekunden = 10 Minuten) mehr als ausreichend sein.

  • post_max_size und upload_max_filesize: Diese Angaben beziehen sich auf die maximale Menge an Daten, die zum Server hochgeladen werden darf bzw. auf die Filegröße der hochzuladenden Daten. Wenn OrderSprinter über die Import-Funktion eine Sicherungskopie laden soll, müssen diese Werte mindestens so groß wie die Dateigröße sein. Wer diese Werte auf 10000M setzt, sollte auf der sicheren Seite sein.

Damit die Änderungen wirksam werden, muss der Webserver neu gestartet werden:

sudo service apache2 restart 

Die Installation des Datenbank-Servers installiert den Client automatisch mit. Das Datenbankadmin-Konto hat nun noch kein Passwort und es ist einfach möglich, als root in der Datenbank zu arbeiten. Daher sollte nun ein Passwort für den Root-Benutzer gesetzt werden:

sudo mysqladmin -u root password 123 

Anschließend meldet man sich als root mit dem Passwort "123" an:

sudo mysql -u root --password=123 

Wie man sieht, kann man nun als Administrator in der DB arbeiten, d.h. grundlegende Operationen in ihr durchführen.

OrderSprinter benötigt eine Datenbank, also soll sie nun vorbereitet werden:

CREATE DATABASE ordersprinter DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 

Anschließend wird ein Benutzer definiert, der alle Rechte in der Datenbank besitzt:

GRANT ALL ON ordersprinter.* TO os@localhost IDENTIFIED BY "secret"; 

Auch hier kann man sich überlegen, ob nicht alle Rechte vergeben werden sollen.

Installation der Webapplikation

OrderSprinter lässt sich von der OrderSprinter-Homepage 🇩🇪 auf der Unterseite "Download" herunterladen. Die gesamte OrderSprinter-Toolsuite ist als zip-File verpackt. Zum Entpacken kann man das Kommando unzip verwenden. Ist dies nicht installiert (z.B. bei der Ubuntu-Servervariante), so kann man es so nachinstallieren:

  • unzip (Tool zum Entpacken eines zip-Archivs)

Befehl zum Installieren der Pakete:

sudo apt-get install unzip 

Oder mit apturl installieren, Link: apt://unzip

Wenn man das Downloadpaket von OrderSprinter entpackt (unzip), so sieht man mehrere Unterverzeichnisse:

  • webapp: die Kernkomponente

  • printserver: der Windows-Printserver (für eine Installation auf Ubuntu nicht interessant)

  • javaprinter: der Java-Printserver, der später auf dem Ubuntu-System den Bondrucker bedienen soll

  • scripts: Beispiel-Skripte für eine Datensicherung auf einem Memory-Stick

  • gastsystem: eine eigenständige Webapplikation, über die Gäste Bestellungen von ihrem Platz aus vornehmen können.

  • spider: eine eigenständige Webapplikation, mit der sich die verschiedenen Instanzen (oben als Kernkomponenten bezeichnet) aus der Ferne überwachen und Nachrichten an Kellner verschicken lassen

In diesem Tutorial sind nur die Unterverzeichnisse webapp und javaprinter relevant, da das Ziel dieser Anleitung die Beschreibung eines möglichst unkomplizierten Aufbau eines sehr einfachen Kassensystems ist.

Hat man Apache wie oben beschrieben installiert, so liefert er standardmäßig die Dateien unter /var/www/html an anfragende Webclients aus. Da die Kernkomponente eine Webapplikation ist, muss diese nun nach html verschoben werden. Dazu wechselt man in das Verzeichnis des entpackten OrderSprinter-Downloads und kopiert die Dateien des webapp-Verzeichnisses in den Webspace:

sudo mv webapp/* /var/www/html/ 

Damit die Installation funktioniert, müssen während der Installation das Unterverzeichnis php und die darin enthaltene Datei config.php vom Webserver beschreibbar sein. Der Account und die Gruppe, unter der Apache standardmäßig läuft, ist www-data. Daher sollte zunächst der Eigentümer der Dateien (rekursiv im Verzeichnis über das R-Flag) geschrieben werden:

sudo chown -R www-data:www-data /var/www/html 

Anschließend gibt man der Gruppe und dem Benutzer der Dateien Schreibrechte auf das Verzeichnis php und die darin enthaltene Datei config.php. Das Verzeichnis php muss dazu auch Execute-Rechte besitzen, damit das Installationsskript auf den Inhalt zugreifen kann:

sudo chmod 774 /var/www/html/php
sudo chmod 664 /var/www/html/php/config.php 

OrderSprinter beherrscht das vom Softwareautor sogenannte "Auto-Update". Dabei aktualisiert sich die Webapplikation auf Anforderung durch einen Button-Klick in der Verwaltungsansicht selbstständig, indem die veränderten Dateien von der Homepage des Anbieters heruntergeladen und im Webverzeichnis gespeichert werden. Damit dies funktionieren kann, muss der Account des Webservers (www-data) Schreibrechte auf alle Dateien im html- und seinen Unterverzeichnissen besitzen. Es ist eine Abwägungssache, ob man diese Möglichkeit nutzen möchte, oder die Schreibrechte einschränkt lässt und in der Konsequenz zükünftige Versionsupdates über den manuellen Weg vornehmen möchte.

Die Systemumgebung ist nun eingerichtet, so dass im nächsten Schritt die Installation von OrderSprinter vorgenommen werden kann.

Ersteinrichtung

Die Ersteinrichtung besteht aus folgenden Schritten:

  1. Aufruf der Installationsseite von OrderSprinter und Wahl geeigneter Startparameter

  2. Grundlegende Konfiguration, so dass der Druckerservice die Jobs beim OrderSprinter abholen kann.

  3. Beispielspeisekarte, Raumplan, Benutzer

Installation der Webapplikation

Öffnet man den Webbrowser (z.B. Firefox, denn damit testet auch der OrderSprinter-Autor) und ruft die URL http://localhost auf, sollte man die Installationsseite sehen. Erscheint stattdessen die Ubuntu-Informationsseite, wird Inhalt aus dem Cache dargestellt. In diesem Fall hilft ein Reload der Webseite.

Im ersten Schritt muss man sich für die Sprache entscheiden. Zur Auswahl stehen Deutsch, Englisch und Spanisch. Die gewählte Sprache wird nicht nur für die Installation verwendet, sondern auch den Beispielbenutzern automatisch zugewiesen (kann aber später geändert werden).

Anschließend wird die Zeitzone abgefragt. Die Zeitzone ist wichtig, damit die Zeitangaben auf den Kassenbons später korrekt sind. Auf dieser Seite befinden sich auch wichtige Hinweise zum Datenschutz: Hat der Server eine Verbindung zum Internet, so erlaubt dies bestimmte Zusatzfunktionen (Email-Bestätigungen, Verwaltungs aus der Ferne per Spider-Komponente, semi-automatische Softwareupdates, Debugdatenversand usw.).

Wenn man mit den Datenschutzbedingungen einverstanden ist und die Zeitzonenauswahl vorgenommen hat, erscheint eine Eingabemaske für die Vorgabe wichtiger Parameter, die im Rahmen der Installation eingetragen werden.

Eingabemaske für wichtige Voreinstellungen

Die Möglichkeit, diese grundsätzlichen Voreinstellungen bereits während der Installation vorgeben zu können, sollen die Ersteinrichtung erleichtern. Die Werte lassen sich aber jederzeit später im laufenden Betrieb ändern.

Danach erreicht man die wichtigste Einstellungsseite:

installationsseite.png

Im Bereich Datenbank sind die Einstellungen für Datenbank-Name, -Benutzer und -Passwort vorzunehmen, die im vorangegangenen Abschnitt beim Anlegen der Datenbank festgelegt wurden (ordersprinter, os, secret). Ein Tabellenpräfix kann frei gewählt werden. Das Präfix ist nur dann interessant, wenn mehrere Applikationen die gleiche Datenbank verwenden sollen. Das ist für die Installation in kommerziellen Webpaketen interessant. In einem selbst verwalteten Ubuntu-System kann man sich beliebig viele Datenbanken anlegen, so dass die Einstellung hier irrelevant ist. Drückt man nun den Button Teste DB-Zugriff, sollte eine mögliche Fehlermeldung durch ein OK ersetzt werden.

Wurden die Schreibrechte richtig gesetzt, so wird auch dies angezeigt.

Fehlen php-Erweiterungen, so würden die fehlenden Erweiterungen hier angezeigt.

Bevor die Installation startet, muss man ein Administrator-Passwort festlegen.

Die Installation startet, wenn man den Button Starte Installation anklickt. Dabei werden die Tabellen in der Datenbank angelegt, gewisse Voreinstellungen vorgenommen und die Konfigurationsdatei config.php, die die Zugangsparameter für die Datenbank enthält, beschrieben. Dieser Vorgang kann einige Sekunden in Anspruch nehmen.

Anschließend muss man sich für einen Arbeitsablauf entscheiden:

  • Digital: Verzicht auf Arbeitsbons. Bestellungen werden in einer Küchen- und Baransicht aufgeführt.

  • Arbeitsbons: Bestellungen werden auf Arbeitsbons ausgedruckt (klassischer Ablauf in Gastronomiebetrieben)

  • Arbeitsbons und Digital: Der Kellner kann sich bei der Bestellaufnahme entscheiden, welchen Arbeitsablauf er für die jeweilige Bestellung wünscht.

Hat man noch keine Erfahrung mit der Software gemacht, bietet sich die letzte Einstellung an, da man alle Optionen austesten kann.

In einem abschließenden Schritt kann man auswählen, ob neben einem obligatorisch angelegten Admin-Benutzer weitere Benutzer, eine Beispielspeisekarte und ein Musterraumplan angelegt werden sollen. Auch hier sollte man zum Einstieg die letzte Option wählen, denn Löschen und Überschreiben von Einstellungen sind jederzeit möglich.

beispieldaten.png

Hat man sich entschieden, neben dem Admin weitere Benutzer anzulegen, bekommen diese Benutzer ebenso das im vorangegangenen Schritt eingegebene Passwort zugewiesen.

Wurde zu Beginn des Installationsswizards der Restaurantmodus abgewählt, so werden zwar intern weiterhin Beispielräume und -tische angelegt, das hat aber keine Auswirkung, da in diesem Fall die Tischauswahl bei Bestellungen übersprungen wird.

Die Installation ist abgeschlossen, wenn folgende Meldung erscheint:

installationfertig.png

Bestätigt man diese Meldung, so wird man zur Anmelde-Seite weitergeleitet.

In einem produktiven System sollte man das Unterverzeichnis install löschen. Macht man das nicht, so können alle Leute, die Zugriff auf den Webserver besitzen, die Zugangsdaten zur Datenbank auslesen (mit allen Konsequenzen) oder gleich durch eine Neuinstallation alle Daten löschen!

Grundlegende Konfiguration

In der Grundkonfiguration müssen Basisdaten festgelegt werden, damit der Druckserver z.B. später die Druckjobs abrufen darf. Dazu wählt man den admin als Benutzer aus, gibt das während der Installation gewählte Passwort ein und drückt beherzt auf den Anmelden-Button:

einloggenadmin.png

Die erste Seite zeigt beim Erstmaligen Anmelden eines Benutzers stets die persönlichen Einstellungen an, so dass man hier die Möglichkeit hat, die Sprache gegebenenfalls zu ändern. Als Admin wählt man über das Hauptmenü nun die Ansicht Verwaltung aus.

Dort befinden sich viele aufklappbare Bereiche. Wenn nicht bereits während der Installation geschehen, muss im Panel Konfiguration muss ein Printcode zugewiesen werden. Dieser dient später dazu, dass sich der Druckservice mit der Webapplikation über eine REST-Schnittstelle die Printjobs abholen darf. Als Beispiel sei hier der Printcode 123 eingegeben (dieser ist auch in der Konfigurationsdatei des Java-Printservers voreingestellt). Am Ende des Panels befindet sich ein Ändern-Button, nach dessen Anklicken die Einstellung übernommen wird.

printcode.png

Im Konfigurationsbereich können noch viele andere Einstellungen vorgenommen werden, die wichtigsten Einstellungen wurden bereits zu Beginn der Installation abgefragt.

Neben den während der Installation angelegten Beispielbenutzern können im aufklappbaren Bereich Benutzer weitere Benutzer angelegt werden. Beim Anlegen kann man festlegen, welche Rechte der Benutzer haben soll. In den benutzerspezifischen Einstellungen kann jeder Benutzer das ihm zugewiesene Passwort ändern sowie weitere Präferenzen einstellen.

Im Bereich Datenbank kann man den Beispielraumplan überschreiben und ein oder mehrere Räume mit Tischen anlegen. Wird nur ein Raum angelegt, so wird später bei der Bestellaufnahme und in der Kassenansicht die Raumauswahl übersprungen.

Druckerserver

Der Javaprintserver ist speziell für den Einsatz auf einem Linux-System programmiert worden. Wenn man den OrderSprinter-Download entpackt, befindet er sich im Unterverzeichnis javaprinter. Der Programmautor empfiehlt, den javaprinter in ein Systemverzeichnis zu kopieren und entweder unter Root-Rechten zu starten oder mit einem Account, dem man Berechtigungen für einen Schreibzugriff auf den USB-Port gegeben hat:

sudo cp -Ra javaprinter/* /usr/local/bin 

Im nächsten Schritt sollte die VendorID und ProductID des Bondruckers ermittelt werden. Da möglicherweise viele weitere Geräte am USB-Port hängen, kann man sich die Arbeit erleichtern, wenn man das lsusb-Kommando vor und nach dem Anstecken des Druckers ausführt und die Differenz der Ausgaben betrachtet:

sudo lsusb -v > /tmp/ohne-drucker.txt
# nun schließt man den Drucker an und schaltet ihn ein
sudo lsusb -v > /tmp/mit-drucker.txt
diff /tmp/ohne-drucker.txt /tmp/mit-drucker.txt
rm /tmp/*-drucker.txt 

Die Werte für VendorID und ProductID sollte man sich notieren.

Damit der Druckserver eine Verbindung zum Drucker aufnehmen kann, muss die Konfigurationsdatei in /usr/local/bin/config.json bearbeitet werden.

  • printersize: Für einen 58mm-Drucker ist ein Wert von 32, für einen 80mm-Drucker von 40 optimal. Der Wert stellt die Anzahl der Zeichen pro Zeile dar und kann von Drucker zu Drucker leicht variieren.

  • printcode: Hier ist der Printcode einzugeben, der zuvor in der Konfiguration festgelegt wurde (im angegebenen Beispiel war es 123).

Die restlichen Eingaben sollen zunächst ignoriert werden. Damit sieht die Datei für einen 58mm-Drucker beispielsweise so aus:

{
   "instance" : 1,
   "vendorid" : "4348",
   "productid" : "5584",
   "printersize" : 32,
   "printcode" : "123",
   "baseurl":"http://localhost",
   "baseusername" : "",
   "basepass" : "",
   "escinits" : [ 27, 64, 27, 116, 0 ],
   "escposts" : [ 29, 86, 66, 10, 27, 64],
   "useeveryprintdevice" : 1,
   "verbose_closing_summary" : 1,
   "smallformat" : 0,
   "logoscale" : 1.0
}

Ein erster Test lässt sich so durchführen:

sudo java -jar /usr/local/bin/javaprinter.jar /usr/local/bin/config.json 

Wenn der Druckerserver sich mit der OrderSprinter-Webapplikation verbinden kann, sieht man folgende Ausgabe:

fee@feeserver:~$ sudo java -jar /usr/local/bin/javaprinter.jar /usr/local/bin/config.json 
Read: /usr/local/bin/config.json
Instance: 1
Config: Config [printersize=32, vendorid=4348, productid=5584, currency=Euro, decpoint=,, companyinfo=Musterrestaurant
Beispielstrasse 123
12345 Musterort, escinits=[27, 64, 27, 116, 0], escposts=[29, 86, 66, 10, 27, 64], printcode=123, baseurl=http://localhost, baseusername=, basepass=, verbose_closing_summary=1]
Scaled from 640 to width: 384 by scale 0.6 

Nun ist es an der Zeit, den ersten Druckjob zu generieren. In der Weboberfläche kann man sich als normaler Benutzer einloggen (ein Admin hat in der Standardeinstellung keinen Zugriff auf die Bestellansicht), ein Produkt in der Bestellansicht auswählen und auf den Button Arbeitsbon klicken.

Möglicherweise sieht man in der Ausgabe des Druckerservers nun eine Fehlermeldung, die sich über einen nicht gefundenen Drucker beschwert:

Print Work Job: 1
Cannot find a receipt printer - cannot print 

In diesem Fall hat sich der Drucker am USB-Port nicht als Drucker angemeldet. Zu diesem Zweck wurde die VendorId und ProductID vorher ermittelt. Die Werte müssen dann in die config.json eingetragen werden und zusätzlich der Parameter useeveryprintdevice auf 0 gesetzt werden.

Startet man den Druckerserver erneut, sollte die Fehlermeldung verschwinden und ein Arbeitsbon gedruckt werden.

Nun soll der Druckerserver jedoch bei jedem Systemstart automatisch starten. Ubuntu nutzt in 18.04 systemd. Dazu muss der javaprinter als Service konfiguriert werden.

Im ersten Schritt legt man eine Datei /usr/local/bin/javaprinter.bat mit folgendem Inhalt an:

#!/bin/sh 
/usr/bin/java -jar /usr/local/bin/javaprinter.jar /usr/local/bin/config.json &

Die Datei muss ausführbar sein:

chmod +x javaprinter 

Nun muss man eine Service-Beschreibung erstellen. Dazu wird eine Datei /etc/systemd/system/javaprinter.service mit folgendem Inhalt angelegt:

[Unit]
Description=OrderSprinter-Javaprinter

[Service]
Type=forking
ExecStart=/usr/local/bin/javaprinter.bat

[Install]
WantedBy=multi-user.target

Nachdem der Service beschrieben wurde, muss er aktiviert und gestartet werden:

sudo systemctl enable javaprinter.service
sudo systemctl start javaprinter 

Hiermit ist die Installation eines Grundsystems abgeschlossen. Wer mehr aus der Software herausholen möchte, sei auf die Dokumentation auf der Homepage des Programms verwiesen.

Test

Die Installation ist abgeschlossen. Meldet man sich mit der Option Desktop auf dem PC an, so sollte die Kellneransicht wie folgt aussehen:

kellneransicht.png

Ein wichtiger Test ist auch der Zugriff über ein Smartphone auf die Weboberfläche. Meldet man sich als Kellner an, wählt aber die Option Mobil, so sieht man eine für Mobilgeräte optimierte Webseite. Im Fall einer Installation mit Musterdaten sieht die Seite so aus:

mobilebestellansicht.png

Gastbestellsystem

Bisher hat sich die Anleitung auf das Kernsystem und den Printserver fokussiert. OrderSprinter enthält aber auch eine Gastbestellkomponente, mit der Gäste mit ihren persönlichen Smartphones Bestellungen aufgeben können. Dies kann Vorteile sowohl für den Gast als auch für das Restaurant bieten:

  • der Gast muss für die Bestellung nicht auf den Kellner warten

  • weniger Kellner bedeuten eine Personalkosteneinsparung, insbesondere für die kurzen Peakzeiten müssen weniger Kellner bereitstehen. Stattdessen kann die Arbeitskraft in der Küche eingesetzt werden.

Sicherheitsbewusste Anwender werden sich die Frage stellen, ob ein solches Gastbestellsystem nicht missbraucht werden kann (Fake-Bestellungen aus dem fernen Ausland) oder gar zu einem Angriff auf das Kassensystems verleitet, schließlich sind unter den Gästen vielleicht auch mal Hacker. Um das Risiko möglichst gering zu halten, hat der Entwickler das folgendes Konzept umgesetzt:

  • das Gastbestellsystem ist eine eigenständige Webapplikation, die in einem Netzsegment aufgesetzt werden soll, von dem aus kein ausgehender Zugriff auf das Kernsystem möglich ist. Nur das Kernsystem darf Verbindungen zum Webserver des Gastbestellsystems aufbauen.

  • das Gastbestellsystem kann im Internet aufgesetzt werden, z.B. auch als IFrame in die offizielle Webseite des Restaurant eingebettet werden. Für diesen Fall kann das Gastsystem so eingestellt werden, dass eine Tageslosung und/oder ein Tischcode vor einer Bestellung eingegeben werden muss.

  • das Gastbestellsystem kann ebenso lokal aufgesetzt werden. In dem Fall muss der Gast sich in das vom Gastwirt angebotene WLAN-Netz einbuchen, um die Bestellungen aufzugeben. In diesem Fall kann die Abfrage von Tageslosung und Tischcode entfallen, da eine Bestellaufgabe nur von Gästen vorgenommen werden kann, deren Endgerät physikalisch vor Ort eingebucht ist.

  • das Gastbestellsystem fragt nach einem einstellbaren Timeout erneut nach Tageslosung/Tischcode. Damit soll verhindert werden, dass Gäste die noch geöffnete Webseite des Gastbestellsystems später zuhause erneut zum Versenden einer Bestellung benutzen.

  • Gäste können nur von Tischen aus bestellen, die für eine Gastbestellung freigegeben wurden.

  • es können nur Produkte über die Gastbestellkomponente bestellt werden, die dafür freigegeben wurden

Physikalisches Setup

Wenn man das Gastbestellsystem im Internet aufsetzen möchte, sollte man die Möglichkeit nutzen, über eine Tischlosung und dem Tisch-spezifischen Code zu prüfen, ob der Gast tatsächlich am Platz sitzt:

  • Tischlosung: dabei handelt es sich um ein Passwort, welches für alle Bestellungen eingegeben werden muss. Diese Tischlosung kann man beispielsweise der Speisekarte beilegen oder auf einer gut sichtbaren Wandtafel veröffentlichen. Sollten Gäste die Tischcodes kopiert haben, um aus Spaß von zuhause aus zu bestellen, so lässt sich das schnell durch Ändern der Tischlosung unterbinden. Die Tischlosung lässt sich in die Kellneransicht einblenden.

  • Tischcodes: Jeden Tisch sollte man gut sichtbar mit der Tischnummer und einem Code versehen. Bei entsprechender Konfiguration müssen Gäste vor einer Bestellung den Tisch und dessen Tischcode angeben.

Soll das Gastbestellsystem stattdessen als lokale Webapplikation installiert werden, so kann man möglicherweise auf die Tageslosung oder die Tischcodes verzichten. Trotzdem muss die Tischnummer für den Gast klar erkennbar sein, denn den Tisch muss er selbst auswählen.

Bei einem lokalen Aufsetzen ist es ratsam, die Netze für das Kern- und das Gastbestellsystem weitestgehend zu trennen, indem man das Gastbestellsystem in einer sogenannten DMZ (Demilitarisierte Zone) einrichtet. Ein mögliches Setup ist das Folgende:

  • ein Router bedient das Gastbestellsystem und bietet ein WLAN für die Gäste und erlaubt auch den Zugriff auf das Internet. Der Server des Gastbestellsystems verbindet sich mit diesem Router (oder kann bei entsprechenden Geräten, z.B. mit OpenWrt, direkt auf dem Router untergebracht werden).

  • ein weiterer Router für das Kernsystem ist dem nachgeschaltet, d.h. man legt eine Leitung vom Gastbestellrouter zur WAN-Buchse dieses Routers. Zur besseren Trennung sollte man die IP-Adressräume der beiden Netze unterschiedlich machen. Bei einer FritzBox muss man angeben, dass man unter Internetanbieter eintragen vorhandener Zugang über LAN.

Wenn keine weiteren Einstellungen vorgenommen werden, können bei diesem Setup die Geräte, die über den Kernsystemrouter angebunden sind, auf die Geräte im Gastsystem zugreifen, aber andersherum ist keine Verbindung möglich - zumindest in der Standardkonfiguration der meisten Router.

Installation

Das Gastbestellsystem ist eine Webapplikation, d.h. sie benötigt ebenso wie das Kernsystem einen Webserver mit PHP sowie eine MySQL-kompatible Datenbank. Anpassungen an der php.ini sind nicht erforderlich, da die Ansprüche an die Webumgebung nicht so groß sind. Nach dem Entpacken des OrderSprinter-Downloads befindet sich die Gastbestellkomponente im Unterverzeichnis gastsystem. Diese muss in das Dokumentenverzeichnis des Webservers kopiert werden.

Wenn das Gastbestellsystem lokal aufgesetzt werden soll, muss im nächsten Schritt muss eine Datenbank angelegt werden. Das lässt sich analog zum Vorgehen für das Kernsystem so erledigen (es sollte aber ein anderes Passwort als "secret" benutzt werden):

CREATE DATABASE gastdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON gastdb.* TO gast@localhost IDENTIFIED BY "secret"; 

Im Unterverzeichnis php befindet sich eine Datei config.php. Darin sind ein Installationscode (CODE) sowie die Verbindungsparameter zur Datenbank eingetragen. Die Verbindungsparameter muss man entsprechend der soeben angelegten Datenbank anpassen:

defined('MYSQL_HOST') || define ( 'MYSQL_HOST','localhost' );
defined('MYSQL_USER') || define ( 'MYSQL_USER',  'gast' );
defined('MYSQL_PASSWORD') || define ( 'MYSQL_PASSWORD',  'secret' );
defined('MYSQL_DB') || define ( 'MYSQL_DB', 'gastdb' ); 

Der voreingestellte CODE sollte auf jeden Fall abgeändert werden, da er zwei Funktionen erfüllt:

  • Berechtigung zum Installieren der Gastbestellapplikation

  • Zugriff des Kernsystems auf den Gastbestellserver

Zur Ersteinrichtung ist nun die Installationsseite des Gastbestellsystems im Webbrowser aufzurufen: http:\\{URL des Gastbestellsystems}\install.php. Im daraufhin erscheinenden Formular muss der CODE im Feld "Installationscode" eingetragen werden. Mit einem Klick auf "Installation starten" werden die Datenbanktabellen für das Gastbestellsystem vorbereitet.

gastbestellinstallation.png

Noch ist jedoch keine Kommunikation zwischen Kern- und Gastbestellsystem eingerichtet, so dass eine große Warnung eingeblendet wird:

kommunikationswarnung-gastbestellsystem.png

Dieser Warnhinweis wird auch eingeblendet, wenn im Kernsystem kein Benutzer angemeldet ist. In diesem Fall ist wohl davon auszugehen, dass das Restaurant derzeit geschlossen ist oder aus anderen Gründen niemand Bestellungen bearbeiten würde. Eine Gastbestellung würde zu einem solchen Zeitpunkt keinen Sinn ergeben.

In der Konfiguration des Kernsystems muss im Abschnitt "Einstellungen für das Gastbestellsystem" die Verbindung zum Gastbestellsystem eingetragen werden:

gastbestellverbindung.png

  • Webserver-Gastsystem: die Webadresse des Gastbestellsystems

  • Zugriffscode: der CODE aus der config.php des Gastbestellsystems

  • Tageslosung: das Passwort für alle Bestellungen

  • Gastbestelljob drucken: steht dies auf "Ja", so werden die Bestellungen als Arbeitsbons gedruckt, anderenfalls landen die Bestellungen je nach Artikeltyp in der Küchen- und Baransicht

  • Abfrage Tageslosung: soll der Gast die Tageslosung vor einer Bestellung eintragen müssen

  • Abfrage Tischcode: soll der Gast den Tischcode vor einer Bestellung eintragen müssen

  • Tageslosung in Bestellansicht anzeigen: die Tageslosung kann in der Bestellansicht des Kellners angezeigt werden

  • Timeout: nach diesem Timeout wird in der Gastbestellansicht wieder auf die Startseite gewechselt

In der Verwaltungsansicht muss man nun einstellen, für welche Tische Gastbestellungen möglich sein sollen (Spalte "Gastbestellung") und wie deren Tischcode (Feld "Code") heißen soll. Zudem kann man Tischen in der Gastbestellkomponente einen anderen Namen als in der Bestellansicht für die Kellner zuweisen ("Tischname extern"). Nach den Änderungen darf nicht der Klick auf den "Anwenden"-Button vergessen werden! raumplan-gastbestellung.png

In der Angebotsansicht lässt sich für jedes Produkt explizit einstellen, ob es ausschließlich von den Kellnern, von den Gästen, oder von allen Parteien bestellbar sein darf:

produktdeklaration-fuer-gastbestellung.png

Wenn Produkten Bilder zugeordnet wurden, so werden diese bei einer Bestellung durch den Gast angezeigt. Wenn Gäste die Webseite der Gastbestellkomponente aufrufen, können sie die Produkte nun auswählen und als Bestellauftrag abgeben. In regelmäßigen Abständen schickt das Kernsystem die aktuelle Speisekarte und den Raumplan an das Gastbestellsystem und holt die von den Gästen abgegebenen Bestellungen ab. Extras können noch nicht von Gästen hinzugebucht werden.

gastbestellsystem-produktauswahl.png

Wenn das Gastbestellsystem erfogreich funktioniert, sollte man die Datei install.php löschen, damit Unbefugte die Applikation nicht durch Neuaufsetzen kaputtmachen können.

Filialsystem Spider

Anforderungen an ein Filialsystem

Gastronomische Betriebe ab einer gewissen Größe haben in der Regel lange Öffnungszeiten und laufen mit gutem Personal auch weiter, wenn man als Chef mal nicht vor Ort ist. Ebenso gibt es auch Gastronomen, die mehrere räumlich auseinanderliegende Restaurants betreiben. Es gibt jedenfalls viele Gründe, dass man als Eigentümer auch aus der Ferne einen Blick auf den laufenden Betrieb haben möchte und gegebenenfalls mit dem Personal vor Ort kommunizieren will, ohne den aktuellen Ablauf durch Telefonate zu einem ungünstigen Zeitpunkt zu unterbrechen.

Ein gutes Filialsystem sollte folgende Eigenschaften besitzen:

  • es stellt in übersichtlicher Form die relevanten Informationen einer Kassenserverinstanz (z.B. die aktuellen Umsätze) dar, ist aber nicht mit unnützen Angaben überfrachtet (die aktuelle Tischbelegung interessiert aus der Ferne wohl kaum).

  • es erlaubt die Übersendung von Nachrichten an das Personal vor Ort

  • die Auswahl der Anzeige der verschiedenen zu überwachenden Kassenserverinstanzen muss über das Filialsystem so schnell und einfach möglich sein, dass der Anwender unterwegs einen Zugriff bekommt, ohne große Passwortlisten stets mitführen zu müssen. Die Zugriffseinstellungen sollten im Filialsystem hinterlegt werden können, so dass mit dem Anmelden im Filialsystem die Zugriffe auf die registrierten Instanzen möglich ist.

  • es sollte so sicher aufgesetzt werden, dass Unbefugte keinen Zugriff auf die sensiblen Umsatzdaten bekommen

OrderSprinter Spider installieren

OrderSprinter enthält die Komponente Spider, die die oben aufgeführten Anforderungen erfüllt. Spider ist wie das Kernsystem und die Gastbestellkomponente als Webapplikation konzipiert. Wie bei der Gastbestellkomponente lässt sich Spider sowohl lokal als auch bei einem Internetprovider aufsetzen. In dieser Anleitung wird wieder davon ausgegangen, dass Spider auf einem dedizierten lokalen mit Ubuntu betriebenen Filialserver aufgesetzt werden soll.

Ähnlich wie bei der Kerninstanz und der Gastbestellsystemkomponente muss auf diesem Rechner also ein Apache mit PHP und eine Datenbank aufgesetzt werden. Die Anforderungen an die PHP-Konfiguration sind bei Spider nicht so groß, so dass die Standardkonfiguration in der php.ini beibehalten bleiben kann.

Gehen wir davon aus, dass die Datenbank mit folgenden Kommandos aufgesetzt wurde:

CREATE DATABASE spider DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON spider.* TO spideruser@localhost IDENTIFIED BY "verysecret"; 

Im nächsten Schritt sollte nun der Inhalt des Unterverzeichnis spider des entpackten OrderSprinter-Downloads in das Dokumentenverzeichnis des Webservers kopiert werden:

sudo mv spider/* /var/www/html/ 

Im Unterverzeichnis php der Spider-Komponente befindet sich eine Datei config.php. Diese muss vom Webserver beschreibbar sein:

sudo chown -R www-data:www-data /var/www/html
sudo chmod 774 /var/www/html/php
sudo chmod 664 /var/www/html/php/config.php 

Im nächsten Schritt ruft man mit dem Webbrowser die Spider-Applikation auf (http://{URL_des_Webservers}). In der erscheinenden Eingabemaske müssen nun die Zugangsparameter für die Datenbank eingetragen werden:

spiderinstall.png

Im letzten Feld der Maske (Zugangspasswort) sollte ein möglichst sicheres Passwort eingetragen werden. Nach einem Klick auf den Button Installation starten werden die Datenbanktabellen angelegt. War die Installation erfolgreich, so erscheint nun das Anmeldefenster:

spiderlogin.png

Jetzt sollte man das Verzeichnis install löschen! Nach Eingabe des Zugangspassworts, welches bei der Installation angegeben werden musste, in die Anmeldemaske kann man sich einloggen. Da noch keine Instanzen eingetragen wurde, ist die Übersicht ziemlich leer:

spiderinstanzenubersicht.png

Die Instanzen, die über Spider gemanaged werden sollen, sollten aus Sicherheitsgründen niemals direkt im Internet ansprechbar sein, sondern Spider sollte die Verbindung über ein VPN herstellen. Wurde Spider bei einem typischen Webprovider aufgesetzt, besteht diese Möglichkeit selten, so dass man sich alternativ damit behelfen kann, dass auch die Kerninstanzen zwar über das Internet angebunden werden, aber per Basic Authentication und https gesichert sind. Zu beiden Themen VPN und Basic Authentication gibt es bei Ubunutusers eigene Artikel, auf die an dieser Stelle verwiesen wird.

Um eine Kerninstanz einzutragen, muss bei dieser ein Fernzugangscode eingetragen worden sein.

remoteaccess.png

Dieser Fernzugangscode muss bei der Registrierung einer Kerninstanz in Spider angegeben werden:

betriebeintragen.png

Hat man mehrere Betriebe registriert, so erscheinen diese in der Übersicht:

spideroverview.png

Verhält sich Spider sehr träge oder scheint die Webapplikation öfters über mehrere Sekunden eingefroren zu sein, so ist wahrscheinlich die Netzwerkverbindung zwischen dem Spider-Server und mindestens einer der registrierten Kerninstanzen gestört.

In der Detailansicht kann man sich die Einnahmen einer ausgewählten Kerninstanz über den Tag verteit anzeigen lassen und Mitteilungen an das Personal der Instanz versenden. Eine Login-Nachricht erhalten die Anwender beim Einloggen in ihr Kassensystem. Eine Kellner-Nachricht wird in die Bestell- oder Kellneransicht der Instanz eingeblendet. Die Nachrichten lassen sich nur über die Spider-Applikation wieder löschen.

spidermessages.png

Problembehebung

Dieses Howto sollte die Installation von OrderSprinter auf einem frischen Standard 18.04-Ubuntu beschreiben. Ist das System jedoch nicht frisch aufgesetzt worden, oder soll OrderSprinter auf einer anderen Ubuntu-Version installiert werden, mögen die Annahmen über die Umgebung nicht zutreffen. In diesem Fall sollen hier einige Hilfestellungen gegeben werden.

Bei Änderungen, die den Webserver oder die PHP-Konfiguration betreffen, muss im Anschluss der Webserver neu gestartet werden, damit die Änderungen wirksam werden (sudo service apache restart).

Nicht vorhandenene PHP-Erweiterungen

Um alle Funktionen der Software nutzen zu können, muss PHP mit folgenden Extensions installiert sein:

  • gd

  • mysqli

  • pdo_mysql

  • PDO

  • session

  • zlib

  • curl

  • zip

  • ftp

  • xml

Eine Installation kann auch ohne alle diese Erweiterungen durchgeführt werden, jedoch können viele Funktionen dann zu Fehlern führen. Über den Aufruf http://localhost/install/phpinfo.php kann man sich die PHP-Konfiguration ausgeben lassen, wenn man das Install-Verzeichnis noch nicht gelöscht hat.

Überschreitung des Zeitlimits auf langsamen Servern

In der Datei php.ini (deren Speicherort man ebenso über einen Aufruf von http://localhost/install/phpinfo.php ermitteln kann, sind gewisse Vorgaben für die maximal erlaubte Ausführungszeit eines PHP-Skripts enthalten, die für die meisten Systemen passen. Ist der Rechner jedoch sehr langsam, ist eine Erhöhung der max_execution_time ratsam.

Zuweisung des Memory-Limits

Wenn nach ausgiebigem Test bestimmte Funktionen nicht mehr funktionieren (Backup, Restore, PDF-Reports), kann es sein, dass die Datenmenge so groß geworden ist, dass der für PHP zugewiesene Speicher nicht ausreicht. In diesem Fall sollte der Wert memory_limit in der php.ini vergrößert werden.

Upload von Dateien funktioniert nicht

In der php.ini lässt sich einstellen, wie groß die maximale Größe einer hochladbaren Datei sein darf. Die zu ändernde Variable lautet max_post_size.

Diese Revision wurde am 19. September 2019 19:15 von mubuntuHH erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Howto