Booking — Tổng quan
Booking (ở đây là normal booking — booking suất học thông thường) là luồng cho khách hàng / admin đặt các suất học rời trong một term: chọn session → submit yêu cầu → confirm thành booking chính thức, kèm tính tiền, discount và quy tắc gộp booking.
Đây là luồng khác với Subscription (đăng ký dài hạn, thanh toán định kỳ). Hai luồng dùng chung nhiều bảng (Billing, Invoice, TermAttendance) và giao thoa khi chống trùng lịch, nhưng vòng đời và điểm vào hoàn toàn riêng.
Subscription Booking có một boundary bổ sung: Enrichment được tạo thành TermBookingLine và xử lý bởi Booking Billing/Reconciliation, nhưng không biến Subscription thành normal booking và không đi vào Subscription Billing schedule.
Hình dung nhanh
Nghĩ về một trung tâm cho đặt từng buổi học / từng tuần care:
- Khách (hoặc admin) mở Booking Flow, chọn các session cho một hay nhiều attendee.
- Hệ thống tạo TermBookingOrder (yêu cầu đang xử lý) — như "giỏ hàng".
- Submit → sinh
Billing, validate (trùng lịch, capacity, chiều cao/cân nặng, pay-later). - Confirm (hoặc Quote → Accept) → tạo TermBooking chính thức +
TermAttendance(điểm danh), trigger hóa đơn. - Trong lúc đó: áp discount rule tự động, có thể gộp booking theo program category.
Normal booking vs Subscription booking
| Normal booking | Subscription booking | |
|---|---|---|
| Điểm vào | ConsumerBooking (Booking Flow) | ConsumerEnrollment (Enrollment) |
| Record | TermBookingOrder → TermBooking | Enrollment (+ booking nội bộ) |
TypeId | Booking (0) | Subscription (4) |
| Thanh toán | Khách chọn lúc checkout (PayNow/PayLater/Direct Debit) | Định kỳ theo billing schedule |
| Vòng đời | Submit → Confirm (2 bước) | Theo lịch enrollment |
| Quy tắc giá | Discount rule + combine booking rule | Discount theo từng kỳ |
⚠️ Booking type
SubscriptionvàWaitingListkhông bị tính là "normal booking conflict" khi chống trùng lịch — subscription đi theo đường validate riêng của Enrollment.
Các "vật thể" chính
| Tên | Một câu |
|---|---|
| Term / ProgramCategory / Program | Cấu hình nền định nghĩa kỳ, loại chương trình và chương trình cụ thể trước khi book. |
| TermProgramSet (TPS) | Offering/course trong một term; giữ lịch, giá, capacity và discount khả dụng. |
| TermProduct / Session | Buổi/slot cụ thể mà user chọn; booking line ghi nhận ở mức này. |
| Holiday / Activity | Holiday là category/program type đặc biệt; Activity là theme ngày Holiday, không phải session tính giá chính. |
| TermBookingOrder | Yêu cầu booking đang xử lý (request), có vòng trạng thái. |
| TermBooking | Booking đã confirm (runtime chính thức). |
| TermBookingLine / Extra / Discount | Dòng session / add-on / discount của một booking. |
| Subscription Enrichment line | TermBookingLine có TermProductId + Date, giá/item authoritative; mỗi occurrence một line. |
| Discount (rule) | Quy tắc giảm giá tự động (sibling, early bird, attendee, profile…). |
| CombinedBookingOption | Cấu hình gộp booking cùng ActionLogId xuyên course trong một category. |
| TermAttendance | Bản ghi điểm danh sinh khi confirm booking. |
| BookingReconciliationRule | Quy định phạt/hoàn khi attendance lệch lịch book (xem Booking Reconciliation). |
Implementation hiện tại
- Course List của Customized Bookings và Subscriptions có 4 card mỗi hàng ở breakpoint
xxl; nội dung và các breakpoint nhỏ hơn không đổi. - Booking Calendar khi click event mở popup read-only gồm TPS, session, thời gian và toàn bộ attendee; popup mặc định của calendar library bị tắt. Transportation/Makeup calendar giữ behavior riêng.
- Special-day programme không bookable; việc group/match session dựa trên
sessionGroupKeyvà bucket chung, không làm thay đổi booking thường.
Xem chi tiết hierarchy và thuật ngữ ở Khái niệm cốt lõi.
Bạn nên đọc theo thứ tự
- Góc nhìn end-user — khách và admin thao tác gì.
- Khái niệm cốt lõi — Order vs Booking, status, confirmation type.
- Kiến trúc & dữ liệu — các bảng và quan hệ.
- Luồng xử lý trong code — controller, service, validation.
- Billing impact khi edit booking đã confirm — điều kiện và cách review chênh lệch.
- Discount rule — quy tắc giảm giá & cách áp.
- Combine booking rule — gộp booking khi edit.
- Booking Reconciliation — đối soát điểm danh: phạt/hoàn khi lệch lịch.
- Dữ liệu & bảng đọc/ghi — bảng đọc/ghi, khái niệm liên quan.
- Case thường gặp — double-booking, cancel, quote…
Ví dụ thực tế: Màn hình
xxlcó 5 course card. → Bốn card nằm cùng hàng, card thứ năm xuống hàng mới; Booking Calendar vẫn giữ popup read-only và route cũ.