ubuntuusers.de

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 26.08.2020 unter Ubuntu 20.04 LTS 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.

Seit dem 1. Januar 2020 gilt zudem die sogenannte Kassensicherungsverordnung ("Kassensichv"), die unter anderem die Anbindung einer zertifizierten technischen Sicherheitseinrichtung (TSE) und der Verfügbarkeit einer digitalen Exportschnittstelle (DSFinv-k Export) vorschreibt. Aufgrund der Nichtverfügbarkeit zertifizierter TSE bis Anfang 2020 gilt noch eine Nichtbeanstandungsregelung bis zum 30.9.2020, unter gewissen Voraussetzungen sogar bis Ende März 2021.

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

Dieser Absatz bezieht sich auf die Situation in Deutschland (in Österreich gilt die RKSV!).

Viele kleine Anbieter von Kassensystemen haben sich angesichts des Aufwands für die Umsetzung der Vorgaben der Kassichv vom Markt zurückgezogen, insbesondere Nischenprodukte (z.B. spezielle Kassensysteme für Friseure) werden vom Markt verschwinden.

Dadurch hat eine Konzentration auf die wenigen großen Anbieter stattgefunden, die die personellen Kapazitäten zur Umrüstung ihrer Produkte hatten.

Die nicht-kommerzielle OrderSprinter-Suite wurde mit Version 2.0.0 um die digitale Exportschnittstelle DSFinv-k und eine Komponente names TSEConnector zur Anbindung einer TSE erweitert, um die Vorgaben der Kassensichv zu erfüllen, damit ein legaler Einsatz auch nach Ablauf der Nichtbeanstandungsregelung möglich ist. Der Programmierer ist allerdings kein gewerblicher Anbieter und weist explizit darauf hin, dass der Einsatz der Software auf eigene Gefahr passiert!

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

  • TSEConnector: Java-Wrapper für die Anbindung von lokalen Swissbit-TSEs

Am Ende dieses HowTos steht ein System bestehend aus einem OrderSprinter-Kernsystem inklusive TSE-Anbindung 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.

In diesem Beitrag wird im Folgenden an verschiedenen Stellen das Passwort 123 verwendet. An allen Stellen, an denen dieses Passwort verwendet wird, ist es sinnvoll, es durch ein komplexeres Passwort auszutauschen.

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)

  • lokale TSE (zur Zeit werden nur TSE der Firma Swissbit unterstützt)

Installationswege

Seit Version 2.0.4 gibt es verschiedene Wege, OrderSprinter auf einem Ubuntu-System aufzusetzen:

  1. Verwendung eines Installationsskripts

  2. Manuelle Installation

Mit Version 2.0.4 ist im entpackten OrderSprinter-Download ein Installationsskript im Unterverzeichnis /scripts enthalten, mit dem auf einem Ubuntu oder einem Linux Mint (jeweils mit Version 20 getestet) die Kernapplikation und wahlweise zusätzlich ein Javaprinter und der TSEConnector installiert werden können. Außerdem bietet das Skript die Möglichkeit, die Instanz mit Beispieldaten (Raumplan, Benutzer, Speisekarte) zu füllen sowie einen Cron-Job zu installieren, der jede Nacht um 4 Uhr ein Backup auf einen angeschlossenen USB-Stick vornimmt.

Da das Installationsskript viele Änderungen am System vornimmt, bietet sich die Nutzung vor allem auf einem frisch aufgesetzten System an, bei dem noch keine vorher existierende Konfiguration durch das Skript beschädigt werden kann. Hat man jedoch bereits schützenswerte Konfigurationen (Apache-, PHP-, Datenbankkonfiguration) sowie Daten (Datenbank, Webservercontent), so sollte man stattdessen den manuelle Installationsweg wählen und gegebenenfalls Schritte auslassen oder abändern, damit sie zur bereits eingerichteten Systemumgebung passen. Außerdem geht das Installationsskript davon aus, dass das Ubuntu-System gemäß Standard ohne Umkonfigurationen (z.B. Pfaden zum html-Content und zur php.ini) vorliegt. Ist das nicht der Fall, muss entweder das Skript angepasst werden oder eben der manuelle Installationsweg beschritten werden. Der manuelle Installationsweg bietet auf jeden viele Freiheitsgrade.

In diesem Beitrag werden aus diesem Grund beide Wege gezeigt.

Installationsskript

Das Installationsskript ubuntuinstaller.sh befindet sich im scripts-Unterverzeichnis. Es geht von einem frisch installierten Ubuntu-System in der Installationsvariante Minimal aus und muss mit root-Rechten gestartet werden:

cd {scripts-Verzeichnis}
sudo ./ubuntuinstaller.sh 

Das Skript fragt den Nutzer nun nach dem Umfang der Installation:

  1. Soll in die Kernapplikation auch ein Set von Beispieldaten eingespielt werden?

  2. Installation des Javaprinters? Wird dies mit j bestätigt, so wird ein Service javaprinter aufgesetzt, der den ersten am USB-Port erkannten Bondrucker zum Ausdruck aller Bontypen benutzt. Da viele Bondrucker intern über ein USB-Interface angeschlossen sind, werden sie oft nicht als Drucker erkannt. In solchen Fällen muss dann später in der Datei /usr/local/bin/javaprinter/config.json die VendorID und ProductID des angeschlossenen Druckers manuell eingesetzt werden (die Parameter findet man über das Kommando lsusb).

  3. Installation des TSEConnectors? Bestätigt der Anwender dies, so wird der TSEConnector als Service eingerichtet. Allerdings arbeitet der TSEConnector zunächst im Simulationsmodus, der jedoch in der Datei /usr/local/bin/tseconnector.bat auf den Modus normal umgestellt werden kann. Wird der TSEConnector installiert, so wird die Kernkomponente so konfiguriert, dass alle Bestellungen und Belege über den TSEConnector/TSE signiert werden.

  4. Konfiguration eines Cronjobs zur nächtlichen Sicherung der Datenbank: Ein Cronjob kann jede Nacht testen, ob ein USB-Stick angeschlossen ist. In diesem Fall wird dieser eingebunden (mount), ein Backup der Datenbank darauf gespeichert (jeweils die letzten drei werden auf dem Speichermedium vorgehalten) und der Stick wieder ausgehängt (unmount).

Der Ubuntuinstaller kann auch direkt von der OrderSprinter-Webseite geladen werden. Der Benutzer wird beim Start des Skripts gefragt, ob es die aktuelle Version der OrderSprinter-Suite downloaden soll, oder ob das Skript bereits aus einem Download der Gesamtsuite gestartet wurde.

Es gibt ein Youtube-Video, welches die Verwendung des Installationsskriptes zeigt: https://www.youtube.com/watch?v=mHDiaCaxeDs

Wurde das Skript unverändert ausgeführt, so haben alle eingerichteten OrderSprinter-Benutzer anschließend das Passwort 123, ebenso wird der Printcode (Zugang des Druckservers) und der Fernzugriffscode (Zugriff über REST) auf 123 gesetzt. Diese und weitere Zugangsdaten (z.B. Datenbankzugang) können durch Anpassungen der entsprechend ausgezeichneten Zeilen am Anfang des Skript angepasst werden.

Die Installation durch das Skript umfasst die Schritte der manuellen Installation inklusive der Schritte der Ersteinrichtung, der Druckerserverinstallation und der TSEConnectorinstallation.

Manuelle Installation

In den folgenden Abschnitten wird die manuelle Installation beschrieben. Zusätzlich wird auf die Installation der Filialkomponente Spider sowie der Gastbestellkomponente eingegangen, die nicht im Rahmen des Installationsskriptes installiert werden, weil sie nicht auf dem Webserver der Kernapplikation laufen sollten.

Schritte bei der manuellen 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)

  4. Einrichtung der TSE

Installation der Umgebung

Bevor die Umgebung installiert wird, empfiehlt es sich, die Pakete auf den neuesten Stand zu bringen:

apt-get update
apt-get upgrade 

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, obwohl die Software ab PHP 5.6 läuft, doch 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)

  • default-jre (Java wird für den Printserver und den TSEConnector 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 default-jre 

Oder mit apturl installieren, Link: apt://apache2,libapache2-mod-php,php,mariadb-server,php-mysql,php-gd,php-curl,php-zip,php-xml,default-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 (123 ist nur ein Beispiel, ein sicher aufgesetztes System sichert man über ein komplexeres Passwort ab):

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 Kernapplikation

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: die Printserver in einer Windows- und einer Java-Variante (relevant für die Installation auf dem Ubuntu-System)

  • 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

  • tseconnector: das Interface zur TSE

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 mindestens die 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. OrderSprinter beherrscht das vom Softwareautor sogenannte "Auto-Update". Dabei aktualisiert sich die Webapplikation auf Anforderung durch einen Button-Klick in der Administrationsansicht 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.

sudo chmod -R u+w /var/www/html 

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

Ersteinrichtung

Die Ersteinrichtung der Kernkomponente 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 können.

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. Werden die im Rahmen des DSFinv-k Exports als Stammdaten betrachteten Felder nicht ausgefüllt, wird der Benutzer später beim Betreten der Administrationsansicht an deren Nachtragung erinnert.

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 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). Für die Nutzung in Deutschland ist es seit 1.1.2020 vorgeschrieben, dass Kassenbons gedruckt werden, so dass man dies durch eine Konfigurationsänderung erzwingen kann. 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 

Der Javaprinter kann entweder auf lokal über USB angeschlossene Drucker direkt zugreifen (benötigt keinen Druckertreiber) oder das CUPS-System nutzen (in diesem Fall wird ein Druckertreiber des bestimmten Druckers benötigt). Der Vorteil des Druckens über CUPS besteht vor allem darin, dass man auch Netzwerkdrucker über den Javaprinter ansteuern kann.

Wenn man einen am USB-Port angeschlossenen Drucker nutzen möchze, sollte man nun die VendorID und ProductID des Bondruckers ermitteln. 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 -configfile=/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.

Wenn man jedoch über CUPS drucken möchte, ist der Drucker zunächst über den üblichen Weg zu installieren. Anschließend ist der Javaprinter mit diesen Aufrufparametern zu starten:

sudo java -jar /usr/local/bin/javaprinter.jar -mode=cups -cupsprinter=Printername -configfile=/usr/local/bin/config.json 

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 (bzw. je nach Druckverfahren mit anderen Aufrufparametern):

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

Die Datei muss ausführbar sein:

chmod +x javaprinter.bat 

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

TSEConnector

Der TSEConnector ist ein Javaprogramm, welches selbst wieder als Webapplikation aufgebaut ist. Die Kernkomponente kommuniziert mit dem TSE-Connector über eine REST-API. Der TSEConnector nutzt das herstellerspezifische SDK für die Anbindung der TSE.

Alle umsatzrelevanten Vorgänge der Kernkomponente müssen durch die TSE abgesichert, d.h. signiert, werden. Das bedeutet, dass die Informationen über den Vorgang zur TSE geschickt werden, und das Ergebnis (Signatur, Transaktionszähler usw.) wird wieder zurück an die Kernkomponente übermitelt. Dort wird diese Information gespeichert und weiterverarbeitet (QRCode auf dem Kassenbon, DSFInv-k Export).

OrderSprinter kann auch ohne TSE genutzt werden, d.h. einem Einsatz in Ländern, die nicht von der deutschen Kassensicherungsverordnung beeinträchtigt sind, steht nichts im Wege.

Nach dem Einstecken der TSE wird diese im Dateisystem gemounted. Der TSEConnector kann so gestartet werden:

sudo java -Djava.library.path=/usr/local/bin/tseconnector/swissbit/nativelibs/linux64 -jar /usr/local/bin/tseconnector/swissbit/tseconnector.jar pass=123 port=8000 supplier=swissbit mountpount=/mnt/SWISSBIT mode=normal 

In diesem Fall horcht der TSEConnector auf dem Port 8000 auf Anfragen, die von der Kernkomponente kommen und mit dem Passwort 123 authentifiziert sind. Standardmäßig ist in Ubuntu jedoch die Firewall UFW installiert und wurde die aktiviert, so verhindert sie eine Kommunikation über diesen Port. Wenn der Server in einem abgesicherten Netzwerk läuft, auf dem nur die Betreiber und Mitarbeiter Zugriff haben, kann man die Firewall mit diesem Befehl abschalten:

sudo ufw disable 

Besser ist es jedoch, nur den betreffenden Port freizuschalten. In diesem Beispiel-Setup ist dies der Port 8000:

sudo ufw allow 8000/tcp 

Hat man noch keine TSE erworben, so kann man den TSEConnector in einem Simulationsmodus starten (mode=simulate). Der Simulationsmodus bietet sich auch an, wenn man erst mal testen möchte, ob Kernkomponente und TSEConnector miteinander kommunizieren oder Firewalleinstellungen dies noch verhindern.

In der Kernkomponente findet man in der Administrationsansicht unter Konfiguration/TSE alle Einstellungen zur TSE.

Um die Kommunikation zwischen Kernkomponente und TSEConnector abzusichern, muss ein Passwort vergeben werden. Dieses ist einerseits in der Konfiguration innerhalb der Administrationsansicht als auch beim Aufruf des TSEConnectors anzugeben. In diesem Beispiel wurde das Passwort 123 benutzt.

Eine neue TSE muss einmalig initialisiert werden (Button "TSE-Setup").

tse.png

Der erste Vorgang benötigt etwa eine Minute, weil der TSEConnector beim Start einen Selbsttest vor der ersten Transaktion durchführt. Auf der Console, in der der TSEConnector gestartet wurde, wird eine Menge an Informationen pro Transaktion ausgegeben, so dass im Fehlerfall hier die Suche nach der Ursache beginnen sollte.

Wenn die Ersteinrichtung richtig funktioniert hat, sollte man überlegen, den TSEConnector dauerhaft als Service einzurichten, der beim Systemstart automatisch gestartet wird. Für die Schritte dazu sei auf den Abschnitt zum Einrichten des Druckdienstes als Service verwiesen.

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 (z.B. 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 folgende 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 (falls so konfiguriert). 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 den 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 (wenn so so konfiguriert wurde). 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: Jedem Tisch kann man einen Code in der Administrationsansicht zuweisen, der bei einer Gastbestellung (optional) angegeben werden muss. Entweder beschriftet man dazu jeden Tisch gut sichtbar mit der Tischnummer und dem Code oder nutzt die Möglichkeit, QRCodes oder NFC-Tags auf die Tische aufzukleben, die sowohl Tischnummer als auch Tischcode enthalten und den Gast nach dem Scannen direkt zur Bestellseite des richtigen Tisches weiterleiten. OrderSprinter erlaubt es, allen Tischen mit einem Klick zufällig generierte Tischcodes zuzuweisen und einen Ausdruck mit allen QRCode zu erstellen.

Soll das Gastbestellsystem stattdessen als lokale Webapplikation installiert werden, so kann man möglicherweise auf die Tageslosung oder die Tischcodes verzichten.

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. Wenn der Webserver auf Dateien um htdocs/db-Verzeichnis schreibend zugreifen darf, kann man sich die Schritte zum Einrichten einer Datenbank für das Gastbestellsystem schenken. Ansonsten wird eine MySQL-kompatible Datenbank benötigt. 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 eine Datenbank angelegt werden, wenn ein Schreibzugriff auf das Unterverzeichnis db nicht möglich oder nicht erwünscht ist. 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. Hat man sich entschieden, die Datenbank zu verwenden, muss man die Verbindungsparameter 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 (wenn die Gastbestellkomponente die Datenbank nutzen soll)

  • Zugriff des Kernsystems auf den Gastbestellserver

Nutzt man die Datenbank, so muss zur Ersteinrichtung nun die Installationsseite des Gastbestellsystems im Webbrowser aufgerufen werden: 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 Administrationsansicht 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 Administrationsansicht gibt es das aufklappbare Panel Anbindung Gastbestellsystem, in dem man Funktionen findet, um allen Tischen einen zufällig generierten Tischcode zuzuweisen, und eine Funktion, um alle QRCodes für die Tische anzuzeigen (diese kann man ausdrucken, ausschneiden und damit die Tische bekleben).

gastbestellung-qrcodes.png

In der Artikelansicht 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 erfolgreich 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 7. September 2020 14:54 von mubuntuHH erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Howto