- send User-Agent "OrderApp/1.4.0 (linux) QloApps-CasposBridge/1.0" and version 1.4.0: CASPOS classifies non-OrderApp clients as "Orderman", which cannot be activated in the Order-App device manager - fixed prices for open-price articles: ARTICLE@12.50 / @12,50 (cents) - live test (docker/test-casposbridge-live.php) booked one night on table 101: 1 x 301 @ 145.00 + 2 x 101 @ 12.50, bookedAmount 17000, lines committed -> enteredPrice is in cents - README: device activation, waiter key, per-area table number ranges ("Ungültige Tischnummer"), results - docker/reset-admin-password.php: set a back-office password from the CLI (asked interactively, not echoed) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.6 KiB
CASPOS Kassenanbindung (casposbridge)
Bucht die Übernachtungen eingecheckter Gäste auf den CASPOS-Tisch mit der Zimmernummer (Zimmer 1001 → Tisch 1001). Abrechnung, Beleg und TSE bleiben in CASPOS; QloApps erstellt dafür keine eigenen Rechnungen.
Check-in in QloApps ──> Auftrag je Nacht ──> OrderApp-API der Kasse
registerClient → Kellner-Login
→ tables/openByName/1001
→ orderLines/add (Übernachtung, Frühstück …)
→ tables/finalizeOrder
Check-out ──> Gast zahlt an der Kasse wie gewohnt
Ablauf
- Check-in (Buchungsstatus → „eingecheckt“): Aufträge für alle Nächte von der Anreise bis heute werden angelegt und sofort gesendet. Ein Fehler an der Kasse blockiert den Check-in nie.
- Jede Stunde (Cron): für alle eingecheckten Gäste wird die jeweils neue Nacht gebucht; offene oder fehlgeschlagene Sendungen werden wiederholt (max. 10 Versuche).
- Keine Doppelbuchung: pro Zimmer-Buchung und Nacht gibt es genau einen Auftrag. Stehen die
Positionen schon auf dem Tisch und nur der Abschluss fehlt, wird beim nächsten Versuch nur abgeschlossen.
Schlägt das Hinzufügen mittendrin fehl, werden die halben Positionen per
cancelOrderverworfen. - Check-in zurückgenommen: noch nicht gesendete Nächte werden gelöscht; bereits gebuchte müssen an der Kasse storniert werden (Hinweis im QloApps-Log).
Einrichtung
-
In CASPOS: Zimmer als Tische im eigenen Tischbereich anlegen (Name = Zimmernummer), Artikel für Übernachtung/Frühstück/Kurtaxe anlegen, einen Kellner „Hotel“ mit Passwort anlegen, OrderApp-API aktivieren.
-
In QloApps: Zimmernummern (Hotel Reservation System → Zimmertypen → Zimmer) auf die Tischnamen setzen.
-
Module → CASPOS Kassenanbindung → Konfigurieren: IP und API-Port der Kasse (wie in der OrderApp), bei HTTPS den SHA1-Fingerabdruck, Kellner-Nummer und Passwort.
-
Verbindung testen – zeigt Tischbereiche und Artikel mit IDs. Meldet die Kasse „Gerät nicht freigeschaltet“, das Gerät (Name/ID wie im Formular) in der OrderApp-Verwaltung der Kasse freigeben.
-
Tischbereich-ID eintragen und je Zimmertyp die Artikel pro Nacht:
Eingabe Bedeutung A-UEB-DZ1 × Artikel pro Nacht A-FRUEH*erwachseneMenge = Erwachsene (auch kinder,gaesteoder eine Zahl)A-LOGIS@preisArtikel mit Preiseingabe, Preis = Zimmerpreis pro Nacht (brutto) 101*erwachsene@12.50Artikel mit Preiseingabe, fester Preis 12,50 € je Stück A-UEB-DZ, A-FRUEH*erwachsenemehrere Artikel mit Komma Für die Mehrwertsteuer (Übernachtung 7 %, Frühstück 19 %) getrennte CASPOS-Artikel verwenden.
-
Anbindung aktiv einschalten.
Zeitsteuerung
-
Mit dem Modul QloApps Cron Task Manager läuft die Aufgabe
casposbridge_post_nightsstündlich. -
Ohne Cron (z. B. Windows Server, Docker): Windows-Aufgabenplanung stündlich ausführen lassen (im Repo-Ordner):
docker compose -f docker-compose.yml -f docker-compose.server.yml exec -T -u www-data app php modules/casposbridge/cron.phpRückgabewert 0 = alles gebucht, 2 = etwas wartet noch oder ist fehlgeschlagen.
Die Seite Konfigurieren zeigt die letzten 50 Aufträge mit Status, Positionen und Fehlermeldung der Kasse; fehlgeschlagene lassen sich dort erneut senden. Mit Jetzt buchen läuft der Abgleich sofort.
Entwickeln und testen ohne Kasse
docker/caspos-mock/server.php bildet die benötigten OrderApp-API-Aufrufe nach (inkl. Fehlercodes 403,
401/1001, 401/1002). docker/test-casposbridge.php legt eine Testbuchung an, checkt ein und prüft
Buchung, Wiederholung, Ausfall der Kasse, unbekannte Artikel und das Zurücknehmen des Check-ins:
docker compose -f docker-compose.yml -f docker-compose.server.yml exec -d -u www-data app php -S 127.0.0.1:8088 docker/caspos-mock/server.php
docker compose -f docker-compose.yml -f docker-compose.server.yml exec -u www-data app php docker/test-casposbridge.php
Gegen eine echte Kasse noch zu prüfen
Die API ist aus dem Quellcode der CASPOS OrderApp (lib/api/api.dart) abgeleitet, nicht aus einer Doku:
- Einheit von
enteredPrice(Annahme: Cent) – nur relevant für@preis. - Legt
openByNameunbekannte Tische an oder müssen sie existieren? - Muss der Client einmalig in der Kasse freigeschaltet werden?
- Verhalten von
finalizeOrdergegenüber TSE und Bonausgabe (Bestellbon für Zimmer-Tische ggf. abschalten).