Howto/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.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Starten von Programmen

  3. Ein Terminal öffnen

  4. Root-Rechte

Inhaltsverzeichnis
  1. Anforderungen an Kassensysteme
  2. Linux als Betriebssystem für ein Kassensys...
  3. Verfügbare Software
  4. Installation
  5. Ersteinrichtung
  6. Druckerserver
  7. Test
  8. Gastbestellsystem
  9. Filialsystem Spider
  10. Problembehebung
  11. Links

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:

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:

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:

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:

Installation

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

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:

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)

Paketliste zum Kopieren:

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)

Paketliste zum Kopieren:

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:

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.

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:

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:

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:

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:

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:

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

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:

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:

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.