Rate plans — seasonal pricing and length-of-stay discounts

Rate plans replace the "one base rate forever" model with priority-ordered seasonal pricing and length-of-stay discounts. Whenever a reservation is created, the system finds the highest-priority rate plan that matches the dates and applies it per night.

Defining a rate plan:
• Open Lodging → Rate Plans → New Plan.
• Pick a property (or leave property-wide for all rooms at the property).
• Select the room type, or leave it blank to apply to every room type.
• Set the date range (start / end), the per-night rate (or % adjustment from the base rate), and the priority — higher numbers win when ranges overlap.
• Optional: add length-of-stay tiers — e.g. "7+ nights = 10% off", "30+ nights = 25% off". The longest matching tier wins.

How rates resolve at booking time:
The reservation system calls resolveRate({ roomTypeId, propertyId, checkIn, checkOut, baseRate }) which returns a per-night breakdown. For each night:
1. Find the highest-priority active plan that covers that date and matches the room type.
2. Apply LOS tier (if the total stay length crosses a tier threshold).
3. Fall back to the room type's base rate if no plan matches.

The reservation summary shows the breakdown so the guest sees exactly which nights are being charged at which rate.

Common patterns:
• Holiday surcharge — high-priority plan around Thanksgiving / Christmas / July 4 with a +50% adjustment
• Shoulder season discount — mid-priority plan covering March–May at -15%
• Long stay — LOS tier inside the base plan giving 7+ nights at -10%

Best practice: keep the number of plans small. Three or four plans (peak, shoulder, off, long-stay) cover most properties. Endless overlapping plans are hard to reason about when a reservation looks wrong.