Repository navigation
Feature/pms platform - #1
Merged
Merged
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.