🏨
Booking Systems

Hotel Booking System

Date Range Overlap Ka Khel
💡 Hotel booking movie booking se ALAG hai — cinema mein seat 3 ghante ke liye jaati hai, hotel mein kamra TAAREEKH KI RANGE ke liye. Isi ek farak se poora availability logic badal jaata hai.

Asli challenge DATE RANGE OVERLAP hai. Room available hai ya nahi, ye ek single boolean nahi ho sakta — check karna padta hai ki maangi gayi range kisi existing booking se overlap to nahi karti. Overlap condition yaad rakho: (start1 < end2) AND (start2 < end1).

RoomType (Deluxe, Suite) aur Room (individual kamra) ko ALAG rakho. Users RoomType book karte hain, actual room number check-in par assign hota hai — ye real hotels aise hi kaam karte hain aur ye batana domain understanding dikhata hai. Pricing seasonal hoti hai, isliye PricingStrategy interface rakho.

class Booking {
  LocalDate checkIn, checkOut;   // checkOut EXCLUSIVE hai
  boolean overlaps(LocalDate from, LocalDate to) {
    return checkIn.isBefore(to) && from.isBefore(checkOut);
  }
}

// Availability = us type ke total rooms - overlapping bookings
long available(RoomType type, LocalDate from, LocalDate to) {
  long booked = bookings.stream()
      .filter(b -> b.getType() == type && b.overlaps(from, to))
      .count();
  return type.getTotalRooms() - booked;
}
🏨
Hotel booking movie booking se ALAG hai — cinema mein seat 3 ghante ke liye jaati hai, hotel mein kamra TAAREEKH KI RANGE ke liye. Isi ek farak se poora availability logic badal jaata hai.
1 / 2
⚡ Quick Recap
  • Availability = date range overlap ka sawaal, simple boolean nahi
  • Overlap: (start1 < end2) && (start2 < end1)
  • RoomType book hota hai, actual Room check-in par assign hota hai
Is page mein (2 subtopics)

Har booking ko loop karke overlap check karna chhote data par theek hai, par lakhon bookings par slow hai. Production approach hai per-day INVENTORY TABLE — (roomTypeId, date, bookedCount). Availability nikaalna ek range query ban jaati hai.

Booking karte waqt us range ke HAR DIN ka count atomically badhao, aur koi bhi din capacity cross kare to poori booking reject. Ye approach date-range logic ko simple counter arithmetic mein badal deti hai.

-- Har din ka alag row — range query fast
SELECT MIN(total - booked) AS available
  FROM room_inventory
 WHERE room_type_id = :type
   AND date >= :checkIn AND date < :checkOut;
-- available >= 1 hone par hi booking allow

Cancellation policy ek Strategy hai: 48 ghante pehle full refund, 24 ghante pehle 50%, uske baad kuch nahi. Ise hardcode karna galat hai kyunki har hotel/rate-plan ki apni policy hoti hai.

Cancel hone par inventory turant release honi chahiye — us range ke har din ka bookedCount ghatana. Ye bhoolna real systems ka common bug hai jisse rooms "phantom booked" reh jaate hain.

💡Tip: Overbooking ka concept mention karna bonus hai — hotels jaanbujhkar capacity se thoda zyada bech dete hain kyunki kuch log aate hi nahi. Ye business reality dikhata hai.