← Quay lại mục lục

Bài 10 — Đặt phòng khách sạn

Form booking với date range, room type, guests, conflict detection và price calculation. Tổng hợp Date Validation + Interval Overlap + Decision Table + Boundary.

Khó #form #booking #date-range #conflict-detection #boundary #decision-table #calculation

🏨 Bài 10: Đặt phòng khách sạn (Booking Calendar)

Form đặt phòng khách sạn với date range picker, chọn loại phòng và số lượng khách. Bài này tổng hợp date validation + conflict detection + price calculation.

📅 Today's date: 2026-04-27 — dùng làm mốc cho check-in (không cho phép check-in trong quá khứ).

📌 Test data

Loại phòng (room types):

LoạiGiá / đêmSố khách tối đa
Standard800,000 VND2
Deluxe1,500,000 VND3
Suite2,800,000 VND4

Phòng đã được đặt (cannot conflict) — ngày được tính động theo today (today + N ngày):

  • Booking #1: (3 đêm) — today + 13 đến today + 16
  • Booking #2: (3 đêm) — today + 23 đến today + 26
  • Booking #3: (3 đêm) — today + 35 đến today + 38

Ngày check-out của booking cũ có thể trùng với check-in của booking mới (back-to-back booking OK).

📋 Bảng đặc tả (Specification)

# Tên Loại Control Bắt Buộc Mô Tả
1 Check-in date Date picker Yes
  • Phải ≥ ngày hôm nay (không cho check-in trong quá khứ).
  • Phải nhỏ hơn check-out (ít nhất 1 đêm).
2 Check-out date Date picker Yes
  • Phải > check-in date (booking ít nhất 1 đêm).
  • Khoảng thời gian tối đa: 30 đêm.
3 Room type Radio Yes 3 lựa chọn: Standard / Deluxe / Suite. Mỗi loại có giá và max guests khác nhau.
4 Guests Number input Yes
  • Tối thiểu: 1.
  • Tối đa: tùy theo loại phòng đã chọn (2 / 3 / 4).
5 Conflict check Auto
  • Date range không được overlap với booking đã có.
  • Logic: 2 range overlap nếu new_checkin < booked_checkoutnew_checkout > booked_checkin.
  • Back-to-back OK: new check-in = booked check-out là hợp lệ.
6 Total calculation Auto
  • Số đêm = (check-out - check-in) tính theo ngày.
  • Total = nights × price/night.
  • Format VND có dấu phẩy phân cách: 1,500,000 VND.
7 Book button Button Validate tất cả và xác nhận đặt phòng nếu thỏa mãn.

📝 Message expected

Trường hợpMessage
Check-in rỗngPlease select check-in date
Check-out rỗngPlease select check-out date
Check-in trong quá khứCheck-in date cannot be in the past
Check-out ≤ check-inCheck-out date must be after check-in date
Quá 30 đêmMaximum stay is 30 nights
Guests vượt quá max của roomMaximum N guests for this room type (N theo room)
Conflict với booking khácSelected dates conflict with an existing booking
Chưa chọn room typePlease select a room type
Thành côngBooking confirmed: N nights, total X VND

🎯 Yêu cầu công việc

  1. Đọc kỹ bảng Specification + Message expected.
  2. Thiết kế test case bao trùm:
    • Check-in date:
      • Hôm nay (boundary), hôm qua (fail), ngày mai (pass).
      • Rỗng, ngày tương lai bình thường.
    • Check-out vs Check-in:
      • Check-out = check-in (boundary, phải fail).
      • Check-out = check-in + 1 (1 đêm, pass).
      • Check-out trước check-in (fail).
    • Conflict detection — 4 loại overlap quan trọng (test data dưới đây dựa trên Booking #1):
      1. Bao trọn (engulf): new range completely contains booked. VD new bao trọn Booking #1.
      2. Bị bao trọn: new range nằm trong booked. VD new nằm trong Booking #1.
      3. Overlap đầu: new check-in nằm trong booked. VD new .
      4. Overlap cuối: new check-out nằm trong booked. VD new .
    • Back-to-back (boundary): new check-in = booked check-out → OK (không phải conflict).
    • Max stay 30 đêm: test 29/30/31 đêm.
    • Guests: chọn Standard với 3 khách (vượt max), Suite với 5 khách (vượt max), 0 khách, -1 khách.
    • Tính số đêm: check-in 05-01 → check-out 05-04 = bao nhiêu đêm? (3 đêm — đếm số ngày diff).
    • Format giá: đảm bảo có dấu phẩy phân cách, đơn vị VND.
  3. Sang tab "🧪 Form thực hành" để thực hiện test.
  4. Ghi nhận các bug phát hiện được.
💡 Gợi ý kỹ thuật test:
  • Boundary Value Analysis cho:
    • Check-in vs today (hôm qua / hôm nay / ngày mai).
    • Check-out vs check-in (cùng ngày / 1 đêm / 30 đêm / 31 đêm).
    • Guests theo từng room type (max - 1, max, max + 1).
  • Equivalence Partitioning cho conflict detection: 4 loại overlap khác nhau.
  • Decision Table cho tổ hợp room type × guests.
  • Boundary date conflict: new check-in = booked check-out → phải OK; new check-out = booked check-in → phải OK.
  • Format checking: total price có dấu phẩy phân cách không?
⚠️ Lưu ý: Đây là bài tổng hợp với nhiều logic phức tạp về date manipulation, conflict detection và price calculation. Bug được cài cắm tập trung vào: date validation, overlap algorithm, max guests, price formatting. Hãy đọc kỹ spec và test từng case một cách có hệ thống.
🔐

Vui lòng đăng nhập để nộp bài.

Đăng nhập
🔐

Tab dành cho giảng viên

Tab này chứa danh sách các lỗi đã cài cắm trong form. Vui lòng nhập mã giảng viên để mở khóa. Mã sẽ ghi nhớ trong phiên làm việc — chỉ cần nhập 1 lần cho cả 3 bài.