=== Homestay Room Booking for WooCommerce ===
Contributors: srijani
Tags: booking, homestay, reservation, rental, woocommerce
Requires at least: 6.6
Tested up to: 7.0
Stable tag: 5.28.0
Requires PHP: 7.4
Requires Plugins: woocommerce
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Multi-vendor homestay booking for WooCommerce: Room-wise and Guest-wise packages, a Manager Portal, and self-service guest requests.

== Description ==

Homestay Room Booking turns WooCommerce into a full multi-vendor homestay/room booking system, without needing any other booking plugin installed alongside it.

**Two booking modes, per homestay**

* **Room-wise** (the default): guests choose adults/children/infants, and the plugin automatically works out how many rooms are needed and books them.
* **Guest-wise** (Premium): each homestay can offer fixed packages instead -- Solo Traveler, Family, Couple, or any custom package you define -- each its own WooCommerce product with its own occupancy limits and its own pricing, including an optional offer price. Booking one unit of a package reserves exactly one room.

Both modes draw from the exact same shared room pool for a homestay, so a Room-wise booking and a Guest-wise booking can never double-book the same room.

**Multi-vendor by design**

Add any number of homestays, each with its own WooCommerce product, its own room pool, and its own pricing and occupancy rules. Three portal roles keep vendors isolated from each other:

* **Homestay Manager** -- bookings, calendar, and guest check-in/check-out for the homestays they're assigned to.
* **Homestay Admin** -- everything a Manager can do, plus editing that homestay's own settings.
* **Group Admin** -- unscoped access to every homestay, plus license management and creating/assigning other portal users.

**Manager Portal**

A clean, dedicated frontend dashboard (not wp-admin) where staff can manage bookings, view a colour-coded availability calendar, check guests in and out, create manager-entered bookings for walk-ins or phone bookings, print invoices, and manage each homestay's settings -- all without ever needing a WordPress login to wp-admin.

**Guest self-service**

A "My Bookings" tab in WooCommerce My Account lets customers view their booking details, print invoices, and request a date change, extension, or cancellation. Every request goes to the Manager Portal for review and approval before anything actually changes.

**Flexible cancellation policy**

Configure a tiered cancellation charge policy per homestay (for example: free 7+ days out, 50% charge 3-6 days out, 100% charge inside 3 days), shown to both the customer and the manager.

**Free vs Premium**

The Free version supports 1 homestay, Room-wise booking, the full Manager Portal, and full-property date closing. Premium unlocks unlimited homestays, Guest-wise packages, partial room closing, and the customer self-service/cancellation-policy workflow. [Upgrade to Premium](https://sitss.in/product/homestay-room-booking-premium/).

= Requirements =

* WooCommerce must be installed and active.

== Installation ==

1. Upload the plugin files to `/wp-content/plugins/homestay-room-booking`, or install the plugin through the WordPress Plugins screen directly.
2. Activate the plugin through the 'Plugins' screen in WordPress.
3. Make sure WooCommerce is installed and active.
4. Go to **WordPress Admin > Homestay Booking** to add your first homestay -- this automatically creates its WooCommerce product.
5. Visit the Manager Portal at `/hb-dashboard/` on your site to manage bookings day-to-day.

== Frequently Asked Questions ==

= Does this require WooCommerce Bookings or another booking plugin? =

No. This plugin is fully self-contained -- it creates and manages its own WooCommerce products, pricing, and availability.

= What's the difference between Room-wise and Guest-wise booking? =

Room-wise is occupancy-based: guests pick how many adults/children/infants, and the plugin works out room allocation automatically. Guest-wise is package-based: guests pick a fixed package (like "Family" or "Couple"), and one unit of that package always reserves exactly one room. A homestay can offer either mode, or both at once.

= Can I run more than one homestay? =

Yes, on Premium. Free is limited to 1 homestay; Premium supports an unlimited number, each independently configured.

= Where do guests manage their bookings? =

In WooCommerce My Account, under the "My Bookings" tab -- they can view details, print invoices, and submit date-change/extension/cancellation requests for manager approval.

= Where do I manage bookings day-to-day? =

The Manager Portal, a dedicated frontend dashboard at `/hb-dashboard/` on your site -- separate from wp-admin, so portal staff never need a WordPress login.

== Screenshots ==

1. Manager Portal booking calendar
2. Homestay settings screen
3. Guest-wise package booking form
4. Customer "My Bookings" tab

== Changelog ==

= 5.28.0 =
* Added a site-wide Portal 2FA policy page in wp-admin (Homestay Booking -> Portal 2FA, manage_options/Administrator only) -- a toggle to require Two-Factor Authentication for every account that can log into the Homestay Manager Portal, including Administrators and Shop Managers, who never appear on the portal's own Team screen and so couldn't previously be covered by its per-account 2FA toggle at all. Includes a customizable grace period (days, default 7) so turning this on doesn't instantly lock out anyone who hasn't set up an Authenticator app yet, and a default method (Email OTP or Authenticator App) for accounts this policy covers that don't already have their own method chosen on the Team screen. An account's own explicit Team-screen requirement always takes effect immediately regardless of this policy or its grace period.
* Fixed deleted/trashed WooCommerce orders leaving their rooms (and car/activity slots) permanently blocked, and lingering in the Bookings list with a stale status. Trashing, restoring, or permanently deleting an order now keeps hb_bookings/hb_car_bookings/hb_activity_bookings/hb_tour_package_bookings in sync with the order's real state -- freeing the dates immediately and, for a permanent delete, removing the rows entirely. Also fixed the same staleness for a NORMAL order cancellation: previously only the room pool was freed on cancellation, while a cancelled order's car/activity components stayed blocked (this plugin's status sync only ever touched the room-bookings table). Added a "Clean Up Deleted/Cancelled Orders" button on Bookings -> Room-Wise Bookings (Group Admin only) to repair orders affected by this before the fix -- it removes rows for orders that no longer exist at all and resyncs every other row to its order's real current status, in one click.

= 5.27.0 =
* Added native Two-Factor Authentication for the Homestay Manager Portal (/hb-dashboard/) login -- its own custom login form, separate from wp-admin, so a third-party 2FA plugin's wp-login.php-based prompt never had anywhere to appear on it. A Group Admin can now require 2FA per team member from Team -> Edit, choosing either Email OTP (a 6-digit code emailed at login) or an Authenticator app (TOTP -- Google Authenticator, Microsoft Authenticator, Authy, etc., set up via a manual entry key, no QR scan required). The portal's own existing brute-force protection (honeypot + per-username/per-IP lockout) and any site-wide plugin's lockout still apply to every attempt exactly as before -- this adds a second, independent step after the password, not a replacement for it. Includes a "Reset Authenticator App" recovery action for a lost or replaced device. 2FA is off by default for every account until a Group Admin turns it on.

= 5.26.0 =
* Added a "Day-by-Day Narrative" editor on each Tour Package (Itinerary section, below the existing steps) -- write a Title and a few highlight lines (one per line) for each day of the package once, and every order booked against it shows that same narrative on its Day-Wise Itinerary, above the day's existing Car/Activity/Night Stay lines (e.g. "Day 1: Chandigarh to Shimla" with bullets for the drive, scenic stops and check-in, matching the detailed day-by-day write-up style of a proper trip itinerary). A day left blank keeps showing just its structured lines, exactly as before -- this is purely additional, presentation-only text and has no effect on booking, pricing, or room-count logic.

= 5.25.0 =
* Added a "Repair Missing Itinerary Dates" button on Bookings -> Tour Package Bookings (Group Admin only) that finds any already-placed order whose manually/externally-typed homestay or hotel step is stuck with blank start/end dates -- the exact issue fixed for new bookings in 5.23.0, which could not fix bookings placed before that update -- and recomputes its dates using the same logic, so it now shows up correctly in that order's Day-Wise Itinerary. Only rows matching that specific broken signature are touched; a step that's genuinely still awaiting finalization is left alone. One click repairs every historically-affected order at once.

= 5.24.0 =
* Redesigned the Day-Wise Itinerary's Schedule column into a proper daily plan instead of a flat type/name list: a bold "Day Plan: <slot label>" headline for the day (taken from that day's Car step, or an Activity step when there's no car), followed by fixed, clearly-labelled lines in a natural reading order -- Car, then Activity, then Night Stay. A homestay/hotel step (listed or externally typed) now reads "Night Stay: Hotel - <name> - Room count - <n>" instead of a plain "Stay:" line. This replaces the "Type (Slot Label): Item" format from 5.22.0.

= 5.23.0 =
* Fixed a bug that made a manually/externally-typed homestay or hotel step (e.g. "Skyloft by Lotus Hotel" entered as "Other -- homestay not listed here") never appear in the Day-Wise Itinerary, on any day of its stay -- its start/end dates were being left blank at booking time purely because it has no listed homestay/room category to reference, even though its Day # and Duration were set correctly on the step. The step was silently falling back to "still to be confirmed" instead of showing on its actual days. A listed homestay/room-category step was never affected by this. Existing orders placed before this fix keep their blank dates -- remove and re-add the affected step on the order (or re-finalize it) to correct an already-placed booking.

= 5.22.0 =
* The Day-Wise Itinerary on invoices now shows each step's Slot Label next to its type, e.g. "Car (Sightseeing): SUV" instead of a plain "Car: SUV" -- makes it possible to tell apart two steps of the same type on the same day (a morning pickup car vs. an afternoon sightseeing car, say), using the same Slot Label already set when the step was built. A step with no label set still renders exactly as before.

= 5.21.0 =
* Fixed a Tour Package itinerary's homestay-stay step always blocking exactly 1 room, regardless of how many guests were booked -- a 5-adult booking at a property that fits 3 adults/room now correctly blocks 2 rooms (previously blocked 1, at both booking time and admin finalization time), and the invoice's Rooms column now shows this real count instead of always showing 1.
* Added a "Number of Rooms" field for a manually/externally-typed homestay or hotel entry in a Tour Package itinerary (available when adding or editing a step, and when an admin finalizes a still-pending step to an external property) -- there's no occupancy data to compute a room count for a property this plugin doesn't track, so it's entered directly and now shown on the invoice the same way as any other step's room count.
* Added group-size-based car allocation for a Tour Package's car steps -- e.g. a Hatchback for 2-3 guests, a Sedan for 3-4, an SUV for 5+ -- instead of the step always using one single fixed car regardless of group size. Configure the bands on the car step's own Edit screen ("Car Allocation by Group Size"); each band can also optionally override that step's price. A guest count matching no band (or a car step with no bands at all) keeps using the step's own default car and price, unchanged.

= 5.20.0 =
* Added a live rate preview for Per-Head Tour Packages: as Adults/Children is changed on the customer product page, or on the admin "+ New Booking" Tour Package form, the applicable per-adult/per-child rate is now shown immediately (resolved against the package's guest-count pricing tiers, or its flat rate when no tier matches or none are configured) -- previously only the final total was shown, with no way to see which rate produced it.
* Added a Unit Price column to the invoice's items table, shown alongside the existing Amount column: "Per Room/Night" for ordinary Room-wise/Category bookings, "Per Adult" for Per-Head Tour Packages and guest-wise Packages, "Per Package" for flat Tour Packages -- for clearer per-unit pricing without having to do the division by hand. While adding this column, also corrected two pre-existing colspan mistakes in the same table (on the "Includes" and additional-fee sub-rows) that had made those rows render one column narrower than the rest of the table.
* Added an Edit option for existing Cars and Activities (Tour Package resources) -- previously you could only Add or Remove one; correcting a car or activity's price (or its name, capacity, or status) no longer means removing it and adding a new one, which would have broken any itinerary steps or bookings already referencing it.

= 5.19.0 =
* The Room-Wise Bookings list is now sortable on every column (Homestay, Type, Order, Customer, Check-in, Nights, Rooms, Adults, Children, Infants, Status) -- click a column header to sort by it, click again to reverse. Defaults to Order (booking ID), newest at the top.
* The same list no longer shows a booking whose order has been permanently deleted (previously showed as a row with "—" for Customer that never went away) -- it's dropped the same way the Tour Package Bookings list already handled this.

= 5.18.0 =
* Redesigned Tour Package pricing: for a Per-Head package, guest-count pricing tiers (e.g. min 2 guests, 3-4 guests, 5-6 guests, 6+ guests) now live directly on the package's own edit page next to the Price Per Adult / Price Per Child fields -- not on any itinerary step. A customer's Adults/Children selection on the product page is matched to the band that covers their total guest count, and the total is calculated automatically from that band's per-adult/per-child rate; a guest count outside every band falls back to the package's own flat rate.
* Removed the previous per-itinerary-step pricing tiers feature entirely (the one added in 5.15.0 and relocated to the package page in 5.17.0) -- itinerary steps only ever describe the itinerary and never drive price; tying pricing tiers to a step was the wrong model. Any tiers configured under that older feature are no longer used for pricing.

= 5.17.0 =
* Moved Pricing Tiers off each individual itinerary step's Edit screen and onto the Tour Package's own main page -- they were too easy to miss buried inside a specific step. The main package page now has one consolidated Pricing Tiers section listing every guest-count band (e.g. 2/4/6 guests) across every step, with a Step dropdown when adding a new one.
* Added an Edit option for an existing pricing tier -- previously you could only add a new tier or remove one entirely; correcting a band's price or guest range no longer means deleting and re-adding it.

= 5.16.1 =
* Hardened the Homestay Manager portal against page-caching plugins: it now sends explicit no-cache headers (and sets DONOTCACHEPAGE) on every request, so a caching plugin can never serve a stale copy of the Bookings/Orders/Calendar screens -- e.g. a booking you just created appearing to be missing until a cache expires.
* Investigated "3-night Tour Package invoice showing 4 nights": confirmed the specific booking reported was placed before the package's homestay-stay step was edited down to 3 nights -- an order correctly keeps the itinerary that was actually booked at the time, so this is expected, not a bug. A booking placed after the edit will use the updated 3-night duration.

= 5.16.0 =
* Fixed the invoice's day-wise itinerary page showing extra trailing days that don't belong to the package (e.g. a 3-night package showing a 5-day itinerary with the extra days marked "Free day") -- an off-by-one in how a component's end date was measured against the itinerary's calendar span.
* Added the Celeste logo to the top-right corner of the invoice's day-wise itinerary page (previously only the main invoice page showed it).
* The invoice's line-items table now shows Guests (adults/children) and Rooms booked for every booking line, not just the room number when that's enabled.

= 5.15.1 =
* Fixed pricing type (Flat vs Per-Head) not saving on a Tour Package -- it always reverted to Flat on save, including for brand-new packages.
* Added a Delete option for Tour Packages -- previously only individual itinerary steps could be removed, with no way to remove a package entirely. Deleting a package also removes its itinerary steps and pricing tiers; past orders and bookings are not affected.

= 5.15.0 =
* Itinerary steps can now be edited in place instead of deleted and recreated.
* Added headcount pricing bands per step (e.g. a different car and price for 1-2 / 3-4 / 5-6 guests), with a new portal screen to manage them.

= 5.14.0 =
* Fixed the homestay dropdown showing blank when a homestay has no Room Categories -- added the homestay's own base room pool as a selectable option, plus an "Other" free-text option for a homestay not listed on the site at all.
* Fixed the real remaining cause of Tour Package orders missing from the Orders page -- a deeper issue than the previous fix, found by testing live against the actual site.

= 5.13.2 =
* Fixed Tour Package bookings not appearing on the portal's Orders page (and their Invoice link along with it) -- a shared homestay/product resolution helper was never extended to include Tour Packages.

= 5.13.1 =
* Fixed a significant permissions bug: Tour Package orders were incorrectly denied access for View Itinerary, invoices, check-in/out, order status changes, and more, because the shared access check never learned about Tour Packages.
* Headcount (Adults/Children) can now be recorded on any Tour Package booking, not just per-head-priced ones.

= 5.13.0 =
* Added the dedicated Tour Package Bookings management list, with a per-booking itinerary view and a finalization screen for assigning the real homestay/car/activity and date to any still-pending finalize_later step.

= 5.12.0 =
* Added per-head pricing for Tour Packages (price per adult / per child, as an alternative to a flat total), wired through the portal, frontend, and cart.
* Admin/manager can now book an existing Tour Package on a guest's behalf from "+ New Booking", the same way room-wise walk-in bookings already work.

= 5.11.0 =
* Tour Packages (and Cars & Activities) are now managed by Group Admin only, moved out of individual Homestay Settings.
* Added package duplication -- clone a package's full itinerary as a new, inactive package to use as a starting point.
* Fixed the invoice logo not appearing when saved/printed as a PDF, even though it showed correctly on-screen.

= 5.10.1 =
* Fixed the actual root cause of "Could not create the package": a logic bug that inserted NULL into a required column whenever a new package's status was left unset (always the case for new packages). Found and fixed the same bug in Car and Activity resource creation too.

= 5.10.0 =
* Strengthened Tour Package creation reliability with a more robust table self-heal and clearer error messages.
* Package invoices now show what's included (car/activity names) and a full day-wise itinerary as a second printed page.
* Invoice logo now falls back through Site Icon and a client-specific logo if no Customizer logo is set, with a dark background so light-colored logos stay visible.

= 5.9.0 =
* Tour Packages are now bookable end to end: frontend booking form, live availability/price check, cart integration, and automatic blocking of rooms, cars, and activities on purchase.

= 5.8.0 =
* Tour Packages: added the portal itinerary builder -- create a package, add homestay/car/activity steps, and (for homestay steps) pull in another homestay's room category via a simple dropdown. Still no customer-facing booking flow yet.

= 5.7.0 =
* Started work on Tour Packages (bundling homestay stays, car hire, and activities into one bookable product). This release is the data foundation and the master admin's per-homestay access toggle only -- package creation and booking are not yet available in the UI.

= 5.6.0 =
* Rebuilt the invoice as a professional, Tally-style layout: homestay letterhead with address/phone/GSTIN, itemized table, Advance Paid / Balance Due, Amount in Words, and a signature block.
* Consolidated three separate, slowly-diverging invoice implementations (My Account, portal, email) into one shared template, fixing a bug where emailed invoices didn't recognize package/category bookings.

= 5.5.0 =
* Admin bookings can now be backdated, with an optional advance-payment record shown as Advance Paid / Balance Due (admin-only, never available at customer checkout).
* Added an Edit/Delete option for existing bookings in the portal.

= 5.4.0 =
* Added automatic update delivery via the sitss.in License Manager Server -- normal "Update available" notice and one-click update, no manual zip upload needed.

= 5.3.0 =
* Security: fixed a broken access control issue where several portal handlers (Room Categories, Rooms, Packages, package-category pricing) didn't verify a submitted resource ID actually belonged to the homestay the user had access to.
* Verified WooCommerce 10.9 compatibility remains accurate; deliberately not bumped to 11.0 given its very recent release and early stability reports.

= 5.2.2 =
* Fixed: printing an invoice for a room-wise Room Category booking showed "Invoice not found, or you do not have permission to view it" even with valid access.

= 5.2.1 =
* Fixed a significant bug: a homestay whose bookings go entirely through Room Categories had none of its orders showing in the portal's Orders page or filtered Bookings list, even though the orders existed correctly in WooCommerce.

= 5.2.0 =
* Fixed: category and package bookings were missing from the "My Bookings" tab.
* Calendar closing now supports selecting a room category and/or a specific numbered room.
* Fixed: "Return to Shop" now reads "Return to Select"; category products now show "Book Now".
* Added a per-homestay Terms & Conditions field, synced automatically into the product description.
* Split the Homestay Settings page into collapsible sections for easier management.

= 5.1.0 =
* Guest-wise packages now show an inline Room Type dropdown with live, category-specific pricing, instead of separate links.
* Package pricing (base, offer, extra adult, extra child) can now be set per room category from the management console.
* Invoices now show the package name together with the selected room type.

= 5.0.0 =
* Added Room Categories: a homestay can define multiple room types (e.g. Mountain View, Valley View), each with its own room count, pricing, occupancy rule, and product. Fully backward-compatible -- opt-in per homestay.
* Added individually numbered rooms within a category, with a bulk "copy occupancy to all rooms" action and per-room overrides.
* Guest-wise packages now show which room categories fit their occupancy, with live pricing, before booking.
* Optional room-number-on-invoice toggle, with automatic non-conflicting room assignment at checkout.
* Fixed: package bookings were being silently excluded from invoices entirely.
* Fixed: fixed-occupancy packages (Solo Traveler, Couple) didn't run their live availability check until Book Now was clicked.

= 4.9.0 =
* Added frontend photo management (featured + up to 5 gallery photos) for homestay and package products, with role-based permissions matching the portal's existing access rules.

= 4.8.0 =
* Added brute-force protection to the portal login: a honeypot field, rate limiting by username and IP (5 attempts / 15-minute lockout), and an admin email alert when a lockout triggers.

= 4.7.3 =
* Fixed: the wp-admin License page was Administrator-only, so a genuine portal Group Admin account couldn't reach it -- now matches the portal's own access rule.

= 4.7.2 =
* Fixed: portal invoice viewing (and other portal actions) incorrectly denied access for orders made up of Guest-wise package bookings.

= 4.7.1 =
* Added a notice on the WooCommerce product edit screen for homestay/package products, warning that pricing is managed by the plugin and pointing to the correct settings page.

= 4.7.0 =
* Added a Dashboard as the top-level admin menu landing page.
* Fixed the Premium upgrade link, which fell back to a dead link when unconfigured.
* Declared compatibility with WooCommerce High-Performance Order Storage (HPOS).
* Verified compatibility with WordPress 7.0 and WooCommerce 10.9.

= 4.6.0 =
* Guest-wise packages now support an optional Offer Price shown alongside the regular price.
* Added a Min Adults setting so a package can offer a fixed guest count.
* Add to Cart now reads "Book Now" on homestay/package products.
* Group Admin can delete a homestay directly from the Manager Portal.

= 4.5.1 =
* Fixed: a newly created homestay could never end up with Guest-wise packages, because booking mode wasn't being saved at creation time.
* Added a Booking Mode selector directly to the Add New Homestay form.

= 4.5.0 =
* Added Guest-wise (package) booking as a second booking mode alongside Room-wise, sharing the same room pool.

= 4.4.0 =
* Added a per-homestay Premium override, so Group Admin can force Premium features on or off for one specific homestay independent of the site-wide license.

= 4.3.0 - 4.3.2 =
* Added "Add New Homestay" and site-wide license activation to the Manager Portal.
* Consolidated licensing to a single site-wide license (removed per-homestay license keys).

= 4.2.0 - 4.2.1 =
* Opened the Manager Portal to the Free version.
* Added a redundant Licensing Server Settings screen to the portal.

= 4.1.0 - 4.1.1 =
* Integrated with the live License Manager Server (sitss.in) for Premium activation.
* Fixed a capability-related access issue on the plugin's own wp-admin pages.

= 4.0.0 - 4.0.1 =
* Introduced the Free/Premium licensing split.

= 3.5.0 - 3.5.1 =
* Portal login fix for passwords containing an apostrophe or quote.

= Earlier versions =
* See the plugin's internal changelog for the full history of the pre-4.0 single-tier releases.

== Upgrade Notice ==

= 5.21.0 =
Fixes Tour Package room-count blocking/invoicing for groups needing more than 1 room, adds a room-count field for manually-typed external homestay entries, and adds group-size-based car allocation for car steps. Update recommended for all Tour Package users, especially anyone booking groups larger than one room's capacity.

= 5.20.0 =
Adds a live per-adult/per-child rate preview for Per-Head Tour Packages (customer and admin forms), an invoice Unit Price column for all booking types, and an Edit option for existing Cars and Activities. Update recommended for all users, especially Tour Package users.

= 5.19.0 =
Room-Wise Bookings list is now sortable on every column (defaults to newest booking ID first) and no longer shows bookings whose order was permanently deleted. Update recommended for all users.

= 5.18.0 =
Per-Head Tour Package pricing tiers now live on the package's own page (min 2 / 3-4 / 5-6 / 6+ guest bands with their own per-adult rate) instead of on itinerary steps; the old per-step pricing tiers feature is removed. Update recommended if you use Per-Head Tour Packages.

= 5.17.0 =
Moves Pricing Tiers to the Tour Package's main page (was hidden inside each step's Edit screen) and adds an Edit option for existing tiers. Update recommended if you use per-headcount pricing bands.

= 5.16.1 =
Hardens the Homestay Manager portal against stale/cached pages (e.g. a just-created booking not showing up until a cache clears). Recommended if you run any caching plugin.

= 5.16.0 =
Fixes the itinerary page showing extra trailing "Free day" entries beyond the package's actual length, adds the logo to the itinerary page, and shows Guests/Rooms on every invoice line. Update recommended for all Tour Package users.

= 5.15.1 =
Fixes Tour Package pricing type not saving (Flat vs Per-Head) and adds a Delete option for Tour Packages. Update recommended if you use Tour Packages.

= 5.15.0 =
Adds itinerary step editing and headcount-based pricing bands (different car/price for different group sizes). No breaking changes.

= 5.14.0 =
Fixes the homestay dropdown showing blank (adds base-pool and "Other" options) and the actual remaining cause of Tour Package orders missing from the Orders page. Update recommended if you use Tour Packages.

= 5.13.2 =
Fixes Tour Package orders not appearing on the Orders page. Update recommended alongside 5.13.1 if you use Tour Packages.

= 5.13.1 =
IMPORTANT: fixes a significant access bug affecting every Tour Package order since the feature was introduced (invoices, check-in/out, itinerary view, and more were all incorrectly blocked). Update strongly recommended if you use Tour Packages.

= 5.13.0 =
Adds the Tour Package Bookings management list and finalization screen -- this closes the last major gap in Tour Packages. No breaking changes.

= 5.12.0 =
Adds per-head Tour Package pricing and lets any portal role book an existing package for a walk-in guest. No breaking changes.

= 5.11.0 =
Tour Packages moves to Group-Admin-only management, adds package duplication, and fixes the invoice logo not appearing in saved PDFs. Note: if any Homestay Admin (not Group Admin) was managing packages/cars/activities, that access is now removed by design.

= 5.10.1 =
Fixes the actual cause of the Tour Package creation error (and the same bug in Car/Activity creation). Update strongly recommended if you use Tour Packages.

= 5.10.0 =
Fixes Tour Package creation reliability and adds a richer package invoice with a day-wise itinerary. No breaking changes -- safe to update.

= 5.9.0 =
Tour Packages are now fully bookable with automatic room/car/activity blocking. No breaking changes -- safe to update.
