A high-level, step-by-step walkthrough of how guests book a staycation, the logic that drives each step, and what to expect when combining specific packages with add-ons — including the special swimming-pool access and breakfast-inclusive room packages.
The guest opens the resort's public page. All packages, add-ons, discounts and payment methods shown are scoped to that location, so the guest only ever sees what that property actually offers.
Logic: Every entity query is filtered by location_id. Bookings, availability and totals are all evaluated per-location so two properties never block each other.
Choosing a date resets the form to Step 1 and re-evaluates availability for that day. Blocked dates are shown as unavailable with a clear message.
Logic: The date determines the day type — weekday, weekend, or holiday. Fridays and days-before-holidays can be treated as weekend/holiday rates when the matching admin setting is enabled. Day type drives both pricing and which packages appear.
Watch out: A date inside a blocked range cannot be booked at all — the form shows a "Date Not Available" panel instead of the steps.
The guest selects a staycation room (e.g. Room 301, 302, 303) or the Main Resort. Each room card shows live availability and a photo gallery.
Logic: Rooms sharing an availability_group_id block each other. Selecting a room that is already confirmed for that slot is prevented; the system auto-selects a valid available room when possible.
Three types: Day Tour (daycation), Night Tour (nightcation), and 22 Hours Stay. Each shows its check-in / check-out window.
Logic: A booking type is only enabled when both the date/time slot is open andat least one package exists for the selected room + day type. Otherwise it shows "Not Available" or "No packages available" and is disabled.
What to expect: For a 22-hour stay, an "Available Time Slots" list appears so the guest picks the exact check-in/check-out pair. Room-specific custom slots override the default rate-derived slots.
Packages are shown as flip cards with price, included guests, and inclusions (e.g. "Includes Breakfast for 2"). Selecting a package is mandatory to continue.
Logic: The package's base_price overrides the raw rate price. The package also defines max_guests_included, the extra-guest fee, the combined hard cap (max_guests_allowed), and its own downpayment_amount.
Name, FB name, email, phone, and region/province/city. The guest sets adults and children.
Logic: Adults default to the package's included guests. The combined adults + children total is clamped to max_guests_allowed. Adults beyond max_guests_includedincur the extra-guest fee.
Only add-ons whose applicable_package_ids include the selected package are shown. Some add-ons require a minimum guest count; inventory-managed add-ons show remaining stock for the date.
Logic: Add-on pricing supports simple, per-person (tiered beyond included units), and hourly types. A booking-type override price can apply (e.g. LPG costs more on a 22-hour stay).
Guests can enter a code, or an auto_apply discount attaches automatically when valid.
Logic: Discounts apply only to the base package price, never to add-ons or extra-guest fees. Validity checks: active, not expired, matches booking type, within the booking-date window.
The guest reviews the full breakdown, agrees to Terms, selects a payment method, and (when required) uploads a proof-of-payment screenshot with a reference number.
Logic: Before saving, the backend re-checks the slot against confirmed bookings for that resource to prevent double-booking. The deposit recorded equals the package's downpayment amount once proof is attached.
What to expect: On success the guest sees a confirmation screen (with a package-specific success image when configured) and the request is saved as pending until an admin confirms it.
An admin reviews the pending request, verifies payment, and confirms it. Confirmation, reminder, and completion emails are sent per the configured templates.
Logic: Confirming a booking finalizes the slot and consumes any inventory-managed add-on stock for that date.
Total = (Package base price) + (Extra adults × extra-guest fee) + (Add-ons total) − (Discount on base price)
The deposit shown separately is the package's downpayment amount and is not subtracted from the total — it is the amount the guest pays now to secure the slot.