Hotel Booking System
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;
}- 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
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 allowCancellation 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.