Booking — Case thường gặp
Các tình huống thực tế và cách hệ thống phản ứng.
Double-booking (trùng lịch)
- Cùng attendee không được book cùng TermProduct trùng ngày/giờ.
- Check ở create, submit và confirm.
- Admin có thể bỏ qua bằng
IgnoreDoubleBooking = true. - Record type
Subscription/WaitingListkhông tính là conflict normal booking.
Ví dụ thực tế: Phụ huynh đặt 2 con vào cùng buổi sáng Thứ 2. → Tránh ghi nhầm cùng một trẻ hai lần. → Hệ thống chặn con thứ 2 ở bước submit, trừ khi admin bật
IgnoreDoubleBooking.
Chiều cao / cân nặng (measurement)
- Course có thể cấu hình ngưỡng height/weight. Attendee ngoài ngưỡng → selection invalid, chặn submit.
- Thiếu giá trị bắt buộc (vd weight) → submit fail cho selection đó.
- Admin override từng rule: tắt Height vẫn để Weight chặn, và ngược lại.
Ví dụ thực tế: Lớp bơi đặt ngưỡng cân nặng tối thiểu; trẻ chưa khai weight. → Đảm bảo trẻ đủ điều kiện an toàn trước khi vào lớp. → Submit fail cho selection đó tới khi nhập weight, hoặc admin tắt riêng rule Weight.
Booking Cut-off (chọn session quá khứ)
- Mặc định không chọn được session đã qua mốc cut-off.
- Admin tắt Booking Cut-off trong Booking Rule Options → chọn được session quá khứ (mọi category: Term Care, Holiday, Class).
Ví dụ thực tế: Trẻ đã đi học buổi Thứ 3 nhưng quên đăng ký, cần book bù. → Cho ops ghi nhận buổi đã diễn ra để tính phí/điểm danh. → Admin tắt Booking Cut-off, chọn lại session quá khứ đó rồi confirm.
Pay Later & timeout auto-cancel
- PayNow / Deposit / Direct Debit có thể arm timeout: quá hạn chưa thanh toán → tự hủy.
- PayLater không timeout nhưng phải qua validate eligibility lúc submit.
Ví dụ thực tế: Phụ huynh chọn Deposit rồi rời đi không thanh toán. → Tránh giữ chỗ vô thời hạn làm nghẽn capacity. → Hết hạn timeout, booking tự hủy, slot mở lại cho người khác.
Capacity
- Giới hạn theo
TermProduct.CapacityvàTermProgramSetCapacity(tuần giới hạn). ValidateCapacityForConfirmBookingchạy trước confirm.
Ví dụ thực tế: Lớp còn 1 chỗ, hai phụ huynh cùng bấm confirm gần như đồng thời. → Không cho vượt sĩ số lớp. →
ValidateCapacityForConfirmBookingchặn người confirm sau, báo hết chỗ.
Quote → Accept
- Thay vì confirm ngay, có thể
GenerateQuotes(statusQuote) → kháchAcceptQuote(Accept) → confirm (Approved).
Ví dụ thực tế: Admin chốt chương trình holiday cho gia đình nhưng để họ tự duyệt giá. → Cho khách xem và đồng ý báo giá trước khi cam kết thanh toán. →
GenerateQuotesgửi báo giá, kháchAcceptQuote, sau đó mới confirm.
Cancel → credit note
- Cancel booking đã confirm: status →
Canceled, đảo invoice bằng credit note, deactivateTermAttendance— kể cả khi một số line trước đó đã rờiApproved.
Ví dụ thực tế: Gia đình hủy khóa đã đóng tiền và điểm danh. → Hoàn tiền đúng sổ sách và bỏ các buổi không còn hiệu lực. → Booking về
Canceled, hệ thống phát credit note đảo invoice và deactivateTermAttendance.
Stale attendance (điểm danh "mồ côi")
- Có quy trình dry-run phát hiện
TermAttendancecòn active nhưngTermBookingcha đãCanceled(trả về count + sample, không sửa dữ liệu) để ops sửa an toàn.
Ví dụ thực tế: Một lỗi cũ để lại điểm danh của booking đã hủy, gây sai báo cáo có mặt. → Phát hiện dữ liệu rác trước khi tự ý xóa. → Dry-run liệt kê count + vài bản ghi mẫu để ops kiểm tra rồi xử lý tay.
Combined edit (gộp booking)
- Category có
CombinedBookingOptionId = 1: edit một booking sẽ nạp các booking cùngActionLogIdxuyên course trong category. Bỏ một booking khỏi nhóm khi reconfirm → cancel + deactivate attendance của nó. Chi tiết: Combine booking rule.
Ví dụ thực tế: Phụ huynh đổi lịch một con vốn book chung nhóm gộp nhiều khóa. → Sửa cả nhóm đồng bộ thay vì lệch từng booking. → Edit một booking nạp các booking cùng
ActionLogId; bỏ một booking khỏi nhóm sẽ cancel + deactivate attendance của nó.
Edit booking đã confirm (Billing Difference)
Submit & Confirmtách 2 bước: submit (mute) → xem Billing Difference → bấm Confirm.- Submit trả về đủ
TermBookingOrderIdsđể preview & confirm chung (invariantINV-BOOK-21).
Ví dụ thực tế: Admin thêm 1 buổi vào booking đã confirm, khách cần biết phải trả thêm bao nhiêu. → Cho xem chênh lệch phí trước khi cam kết. → Submit (mute) hiện Billing Difference; admin xem rồi mới bấm Confirm để chốt.