Files
hotel/modules/casposbridge/README.md
DanielS b3b79960e7 casposbridge: verified against a real CASPOS 4.12.3
- 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>
2026-11-11 23:53:20 +01:00

4.6 KiB
Raw Blame History

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 cancelOrder verworfen.
  • 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

  1. 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.

  2. In QloApps: Zimmernummern (Hotel Reservation System → Zimmertypen → Zimmer) auf die Tischnamen setzen.

  3. Module → CASPOS Kassenanbindung → Konfigurieren: IP und API-Port der Kasse (wie in der OrderApp), bei HTTPS den SHA1-Fingerabdruck, Kellner-Nummer und Passwort.

  4. 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.

  5. Tischbereich-ID eintragen und je Zimmertyp die Artikel pro Nacht:

    Eingabe Bedeutung
    A-UEB-DZ 1 × Artikel pro Nacht
    A-FRUEH*erwachsene Menge = Erwachsene (auch kinder, gaeste oder eine Zahl)
    A-LOGIS@preis Artikel mit Preiseingabe, Preis = Zimmerpreis pro Nacht (brutto)
    101*erwachsene@12.50 Artikel mit Preiseingabe, fester Preis 12,50 € je Stück
    A-UEB-DZ, A-FRUEH*erwachsene mehrere Artikel mit Komma

    Für die Mehrwertsteuer (Übernachtung 7 %, Frühstück 19 %) getrennte CASPOS-Artikel verwenden.

  6. Anbindung aktiv einschalten.

Zeitsteuerung

  • Mit dem Modul QloApps Cron Task Manager läuft die Aufgabe casposbridge_post_nights stü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.php
    

    Rü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 openByName unbekannte Tische an oder müssen sie existieren?
  • Muss der Client einmalig in der Kasse freigeschaltet werden?
  • Verhalten von finalizeOrder gegenüber TSE und Bonausgabe (Bestellbon für Zimmer-Tische ggf. abschalten).