fix(chatelet): don't offer a check-in that can't fit a minimum stay #157

Merged
padreug merged 1 commit from fix/chatelet-stay-picker-checkin-validity into dev 2026-09-21 09:57:43 +00:00
Showing only changes of commit d8141b4485 - Show all commits

fix(chatelet): don't offer a check-in that can't fit a minimum stay

The stay picker disabled only occupied nights when choosing a check-in, so
a free day with an occupied night closer than min_nights was still
selectable — e.g. min 2 nights with the night after next booked. Picking it
left every later day disabled (no legal check-out), so reka's only move was
an earlier day, which it silently swapped into the range: the guest picks a
date and the calendar 'jumps backwards'. Disable such a day up front: a
check-in is valid only if the minimum stay fits before the next occupied
night and within the loaded window.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Padreug 2026-09-21 11:55:51 +02:00

View file

@ -106,8 +106,19 @@ function isDateDisabled(d: DateValue): boolean {
if (y < todayYmd) return true if (y < todayYmd) return true
const start = activeStart.value const start = activeStart.value
if (!start) { if (!start) {
// Picking a check-in: occupied nights are out; everything else is fair. // Picking a check-in. An occupied night is out — except a committed
return props.nightSet.has(y) && !(bothSet.value && y === props.checkOut) // check-out that landed on one, which must stay rendered as selected.
if (props.nightSet.has(y)) return !(bothSet.value && y === props.checkOut)
// A free day is only a valid check-in if a minimum stay fits before the
// next occupied night AND within the loaded window. Otherwise reka would
// offer it, then strand the guest with no reachable check-out (every
// later day disabled), so the only click left is an earlier day, which
// reka silently swaps into the range. Disable it up front instead.
const minCheckOut = addDays(y, props.minNights)
const nextOccupied = nextUnavailableOnOrAfter(props.nights, y)
if (nextOccupied && nextOccupied < minCheckOut) return true
if (props.maxDate && minCheckOut > props.maxDate) return true
return false
} }
if (y === start) return false if (y === start) return false
if (y > start) { if (y > start) {