The German language pack leaves the Webkul hotel modules (Hotel
Reservation System, Book Now, refunds, rooms, settings), reports,
dashboard widgets, cron manager, channel manager, reviews and 31 menu
names in English.
- docker/find-missing-admin-translations.php: scans module admin
controllers/classes/templates and core admin pages for keys without
a German text
- docker/translations-de-admin.php: 1361 translations (formal "Sie",
shared glossary, placeholders/markup verified automatically)
- docker/translations-de-tabs.php: menu names (Hotelverwaltung, Zimmer
buchen, Zimmerstatus, Erstattungsanträge, Zeitgesteuerte Aufgaben ...)
- apply-translations.php now also writes back-office module texts,
core admin texts and menu names; module texts the core admin pack
already translates are reused from it (modules do not fall back to
the admin pack at runtime). Result locally: 0 untranslated strings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>