Skip to content

Feature/pms platform - #1

Merged
Almondsf merged 8 commits into
masterfrom
feature/pms-platform
Oct 14, 2026
Merged

Almondsf merged 8 commits into
masterfrom
feature/pms-platform

Conversation

@Almondsf

Copy link
Copy Markdown
Owner

No description provided.

Turns the booking API into a full property management system for a single
flagship hotel:

- Auth: roles and capabilities, JWT with refresh cookie, throttling, MFA,
  password reset, immutable audit log
- Reservations and front desk: staff bookings, groups, check-in with ID
  capture (encrypted at rest), check-out, room moves, cancellations and
  no-shows under a configurable policy, walk-ins, room board
- Billing: folios, charges with tax snapshots (VAT, service charge,
  consumption tax), payments and refunds, multi-currency, city ledger,
  gapless invoices with PDF
- Payments: Paystack and Flutterwave behind one gateway interface, with
  webhook verification
- Rates: rate plans (derived/fixed), restrictions, promo and corporate rates
- Operations: housekeeping tasks, maintenance tickets with out-of-order
  rooms, POS outlets with stock, night audit with a business date
- Background jobs, guest notifications (email/SMS/WhatsApp), channel
  manager and door-lock integrations, NDPA privacy tooling
- Docker, CI and deployment docs
seed_demo configures a demo hotel (rooms, staff, rate plans, corporate
accounts, outlet menus, room photos) and replays 14 days of operations
through the real services, closing each day with the night audit, so
reports, folios and the audit trail are consistent. --reset wipes
operational data and re-seeds. Runs only with DEBUG=True.
- Staff portal (React + TanStack Query): dashboard, room board,
  reservations, guests, folios, housekeeping, maintenance, POS, reports,
  night audit, channels, staff and audit log, gated by capability
- Guest booking engine: search, checkout with online payment, payment
  confirmation and manage-my-booking
- Public website at /: hero slider with booking bar, rooms and suites,
  offers, dining, facilities, events, testimonials (sample), gallery and
  contact; room details pages at /rooms/:slug
- Staff dashboard moves from / to /dashboard
- Session refresh gets its own throttle scope: it shared the 10/min login
  budget, so a few page reloads (or several desk PCs behind one IP) locked
  staff out with 429s
- Dashboard: Walk-in and New reservation actions; check in / check out
  straight from the arrival and departure lists; stat tiles link to the
  matching filtered lists
- Room board: per-room actions (check in, check out, walk-in, reserve with
  the room pre-selected, mark clean)
- Check-out takes the outstanding payment (or bills a company) in the same
  dialog, after posting tonight's room charge
- Reservations: change dates, room type, party and requests; new
  reservations can pick a rate plan, company account, specific room and a
  manager rate override, and accept prefilled values
- POS: tapping an item with no open order starts one; order errors are
  shown instead of failing silently
- Shared front-desk dialogs live in components/frontDesk.tsx
- Folio: refund a guest in credit, bill the balance to a company,
  create an online payment link, void a payment, move a charge to another
  bill, and print
- Folios list: search, and "New bill" for customers who aren't staying
- Companies: city-ledger accounts with balance and credit use, a
  printable statement, account payments, and add/edit
- Online payment is only offered for gateways that have credentials:
  without keys the payment link button is hidden and the guest checkout
  explains how to book instead of showing a dead button (tests get
  placeholder keys)
- Settings (managers; each tab by capability): room types and rooms,
  rate plans with conditions and fixed prices, selling restrictions,
  outlet menus with stock, tax rates and exchange rates
- API: managers can edit room types and rooms (audited); a room can be
  taken out of service and back, while occupancy and maintenance status
  stay owned by check-in/out and maintenance tickets
- Staff: edit name, phone and role; resend invites; reset two-factor
- My account: change password (signs out everywhere, then explains why
  on the sign-in page) and turn off two-factor where the role allows
- Fix: the exchange-rate input rejected whole numbers (step counted from
  min=0.0001), so "Set rate" silently did nothing
- Sidebar entries and route guards accept "any of" several capabilities
SYSTEM_OVERVIEW.md explains what the PMS does and how it is built: hotel glossary, features, architecture, apps, data model, key flows, roles, API, background jobs, integrations, configuration and known gaps. USER_STORIES.md lists what each kind of user needs, with acceptance criteria. README points to both and shows the current URLs.
- frontend/src/lib was never committed: the Python .gitignore template's
  "lib/" rule matched it, so the typecheck failed on a clean checkout
- Locking a maintenance ticket joined its nullable room and out-of-order
  links, which PostgreSQL refuses for SELECT ... FOR UPDATE (starting or
  resolving a ticket would crash in production). Lock only the target row
  there, and in the housekeeping and POS equivalents, which also needlessly
  locked the related room/outlet
- Without a .env, tests ran with DEBUG off and SECURE_SSL_REDIRECT turned
  every test request into a 301; keep the other hardening, skip the
  redirect under test
- The deploy audit needs a secret long enough to pass its strength check
@Almondsf
Almondsf merged commit 528ab26 into master Oct 14, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant