One large-type page for the front desk (Hotel Reservation System >
Rezeption, first menu entry):
- today's arrivals, departures, guests in house and overdue arrivals,
each guest as a card with big room number, name, people, nights,
room type and booking source
- one obvious button per guest: Einchecken / Auschecken (and "Früher
abreisen"); after each action a big confirmation with "Rückgängig"
instead of confirm dialogs; Post/Redirect/Get so reload never repeats
- uses HotelBookingDetail::changeStatus(), so status history and hooks
(casposbridge posts the nights) run as in the order page; check-out
does not require payment in QloApps because guests pay at the POS
- shows the CASPOS state per guest; other days are read-only
- tiles to Belegungsplan and Neue Reservierung (Book Now)
- employee profile "Rezeption" that only sees Rezeption, Belegungsplan,
Book Now, orders, customers, carts and guest registration cards
- docker/test-frontdesk.php: 21 checks with throw-away guests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Numbers all rooms consecutively from a start number (dry run by
default, --apply to write) and carries the new number into existing
bookings (htl_booking_detail, htl_cart_booking_data) and queued
casposbridge jobs. Used locally: demo rooms GR/DR/ER/LR-101..105 ->
tables 101-120 of the test POS's "Hotel" area.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New back-office page "Hotel Reservation System > Belegungsplan":
- rooms grouped by room type as rows, 14-62 days as columns, weekends
and today highlighted, sticky room column, daily occupancy footer
- bookings as bars (booked / checked in / checked out / no-show) with
guest name, guests, tooltip with dates, order reference and price;
click opens the order; stays outside the view are cut
- booking source badge from orders.id_source (W website, T phone,
B Booking.com, E Expedia ...; portals highlighted), so channel-manager
bookings show up with their source
- blocked periods (htl_room_disable_dates) hatched with reason
- CASPOS badge: nights already posted by casposbridge, "!" on failures
- reserve: click a free cell (first night) and a later one (last night)
in the same row -> action bar -> "Book Now" opens with dates, hotel
and room type prefilled; keyboard: Enter/Space, Escape
- docker/test-occupancyplan.php: 15 checks with throw-away bookings,
optional HTML preview
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
On check-in (actionBookingStatusAfter -> checked in) and hourly via the
QloApps Cron Task Manager or modules/casposbridge/cron.php, every night of
a checked-in stay is posted to the CASPOS table named after the room
number: registerClient -> waiter login -> tables/openByName ->
orderLines/add -> tables/finalizeOrder (API derived from the CASPOS
OrderApp client, lib/api/api.dart).
- one job per booking and night; pending -> added -> done, so a retry
only commits and never books lines twice; half-added lines are
cancelled; POS offline keeps jobs queued (max 10 attempts)
- mapping per room type: ARTICLE[*qty|erwachsene|kinder|gaeste][@preis]
- optional HTTPS with pinned SHA1 certificate fingerprint, checked
before credentials are sent
- undoing a check-in drops unsent nights and logs posted ones for a void
- config page with connection test (lists service areas and articles)
and the last 50 jobs with retry
- docker/caspos-mock: stand-in POS for the used endpoints and error
codes; docker/test-casposbridge.php: 23 end-to-end checks
Not yet verified against a real CASPOS: enteredPrice unit, auto-creation
of tables, client activation, finalizeOrder/TSE behaviour.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With Docker Desktop on Windows the bind-mounted C:\hotel made every page
take ~5-7 s; with the code on the Linux filesystem it takes ~0.1 s.
- docker/Dockerfile.server bakes the repo into the image (.dockerignore
keeps .env, settings.inc.php and caches out)
- docker/server-entrypoint.sh copies the code into the app_code volume on
start: pass 1 updates code but skips runtime folders (uploads, generated
images, caches, downloaded translations, settings.inc.php), pass 2 adds
missing files without overwriting
- docker/php-server.ini: OPcache without timestamp checks, larger
realpath cache
- setup script waits for the container and checks the install marker
inside the volume; .gitattributes keeps *.sh LF on Windows checkouts
- TESTSERVER.md: speed section and one-time switch from the first version
Tested with a fresh stack: full install + demo + hardening, re-run keeps
DB/uploads, rebuilt image delivers code changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
QloApps redirects every request to the domain stored in the DB, so a
wrong domain or HTTPS without TLS in front ends in ERR_SSL_PROTOCOL_ERROR.
docker/set-domain.php updates PS_SHOP_DOMAIN(_SSL), shop_url, SSL flags
and .htaccess; the setup script now calls it with the .env values, so
editing .env and re-running fixes the domain. Troubleshooting table in
docker/TESTSERVER.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- docker-compose.server.yml: app on APP_BIND for an existing nginx proxy,
QLO_SSL passed to the container
- docker/setup-testserver.ps1: one-shot setup for Docker Desktop/WSL
(random .env secrets, CLI install that never reinstalls over an
existing shop, German texts, optional demo content, hardening)
- docker/harden-test-server.php: delete demo customer pub@qloapps.com,
disable webservice API keys, set SSL mode, deny module log folders
- docker/nginx-qloapps.conf: HTTPS + basic auth + X-Forwarded-Proto
- apache: deny /modules/*/logs/ (qlocmconnector logs API secrets)
- docker/TESTSERVER.md: Windows Server guide (German)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seed script renames menu links and "Room/Rooms" unit labels to German,
hides the Properties/Testimonials links, removes demo room features
(King, 600 sq ft) and copies gallery photos unpadded. Skin gets the wine
header on inner pages and object-fit gallery thumbnails.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The German language pack leaves ~180 shop strings in English (search
bar, cart, room cards, footer, account menu). docker/apply-translations.php
fills only missing keys from docker/translations-de-front.php and fixes
English values in the theme language file; docker/find-missing-translations.php
lists remaining gaps. Module/theme de.php files are git-ignored upstream
(downloaded on install), so the script is re-run after each install.
Also includes the language-pack updates the installer wrote to the
tracked module de.php files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the "Hotel Prime" demo data: hotel texts and address, room
types with 2026 prices (gross incl. 7 % VAT), logo, header slides, room
photos and interior gallery; disables auto-added demo service fees and
hides the invented demo testimonials.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wine red / terracotta / sand palette, Lora + Open Sans self-hosted
(Google Fonts link removed for GDPR), water-wheel ornament, restyled
hero, booking bar, room cards, gallery and footer.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PHP 8.3/Apache + MariaDB 11.4 with the repo bind-mounted as web root.
Apache denies dotfiles (.env, .git), the docker files and /install-dev
(installation runs via CLI as www-data, see docker-compose.yml).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add _QLO_DISABLE_PHONE_HOME_ (default true) and honour it in
Tools::addonsRequest(), Tools::refresh(), the installer notification and
the theme catalog fetch. This stops sending admin name/email, shop domain
and country on install, the daily upgrade check, the admin
"recommendation" HTML and module/theme catalog requests.
Language and localization pack downloads stay available.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>