Booking — Khái niệm cốt lõi
Các đối tượng cần biết trước khi booking
Normal booking không tự tạo course hay lịch học từ đầu. Nó đọc cấu hình từ product hierarchy, cho người dùng chọn session, rồi ghi lựa chọn đó vào order/booking runtime.
ProgramCategory -> Program -> TermProgramSet -> TermProduct / Session
^
|
Term| Đối tượng | Là gì | Vai trò trong booking |
|---|---|---|
| Term | Kỳ hoạt động/học kỳ, có StartDate, EndDate, trạng thái và thường thuộc một site/org. | Đặt biên thời gian cho course và session; một Term chứa nhiều TermProgramSet. |
| ProgramCategory / Category | Loại chương trình, ví dụ TermCare, Holiday, Class. | Giữ nhiều rule nền như booking/payment/discount, invoice, cut-off và combine booking. |
| Program | Chương trình cụ thể dưới một category, thường gắn với site/org. | Là template/course source để tạo offering theo từng term. |
| TermProgramSet / TPS | Offering/course cụ thể trong một Term. | Nơi cấu hình lịch, giá, capacity, ngày trong tuần, discount và metadata hiển thị booking. |
| TermProduct / Session | Buổi/slot cụ thể được sinh từ TPS, có ngày, giờ, capacity, giá và ProductType. | Đây là đơn vị nhỏ nhất mà booking line ghi nhận. Khi nói "Section" trong bối cảnh booking, hiểu là Session/TermProduct, không phải entity riêng. |
| Holiday | Một ProgramType/category đặc biệt (Holiday = 12). | Dùng booking modes Casual/Standard, FullTime/Full Term, PartTime/Full Week; có thêm activity theo ngày. |
| Activity | ProductType.Activity, chỉ dùng cho Holiday. | Là theme/hoạt động của ngày Holiday, không có giá và không phải time slot chính như Session. |
Các đối tượng runtime nối người dùng với cấu hình trên:
| Đối tượng | Là gì | Khi nào xuất hiện |
|---|---|---|
| Account | Gia đình/người chịu trách nhiệm tài chính. | Được chọn khi admin book hoặc lấy từ user đăng nhập ở customer flow. |
| Attendee | Trẻ/người tham gia được book vào session. | Mỗi booking/order gắn với một attendee; validation dùng profile như tuổi, school year, height/weight. |
| TermBookingOrder | Yêu cầu booking đang xử lý, giống giỏ hàng/request. | Tạo khi chọn session và submit trước confirm. |
| TermBooking | Booking đã confirm, là runtime chính thức. | Tạo khi confirm từ TermBookingOrder. |
| TermAttendance | Bản ghi điểm danh cho từng session đã confirm. | Sinh khi confirm booking. |
| Billing / Invoice | Sổ tài chính và hóa đơn của booking. | Billing được tạo khi submit; invoice được trigger khi confirm theo payment/finance rule. |
Order vs Booking: request vs confirmed
Phân biệt quan trọng nhất:
| TermBookingOrder | TermBooking | |
|---|---|---|
| Là gì | Yêu cầu booking đang xử lý (request/giỏ hàng) | Booking đã confirm (runtime chính thức) |
| Khi nào | Từ lúc tạo tới lúc confirm | Sau khi confirm |
| Dòng con | TermBookingOrderLine/Extra/Discount | TermBookingLine/Extra/Discount |
| Tài chính | Submit → tạo Billing | Confirm → trigger Invoice + TermAttendance |
Hệ thống mô hình hoá flow bằng
TermBookingOrdercho request in-flight vàTermBookingcho booking đã confirm.
Vòng trạng thái (status lifecycle)
TermBookingStatus (Tux/src/Tux.Core/Enums/TermBookingStatus.cs):
| Status | Mã | Ý nghĩa |
|---|---|---|
Removed | 0 | Đã xóa request / change request. |
Draft | 100 | Nháp. |
Created | 200 | Đã lưu vào "giỏ" (sau CreateBookingOrder). |
Submitted | 300 | Đã submit request mới / lưu change request. |
Submitted_Change | 350 | Bị ảnh hưởng bởi submit khác — không hiển thị. |
Attendance_Approved | 450 | Chỉ confirm điểm danh. |
Quote | 475 | Đã sinh quote. |
Accept | 485 | Đã accept quote. |
Approved | 500 | Đã confirm (chính thức). |
Archived/Suspended/Closed | 600/700/800 | Trạng thái lưu trữ/treo/đóng. |
Canceled | 900 | Đã hủy. |
Processing(400) NOT IN USE.
Order type — phân biệt loại booking
TermBookingOrderType (Tux/src/Tux.Core/Enums/TermBookingOrderType.cs):
| Loại | Mã | Ghi chú |
|---|---|---|
| Booking | 0 | Normal booking (phạm vi trang này). |
| WaitingList | 1 | Danh sách chờ. |
| TrialSession | 2 | Buổi học thử (submit/confirm dùng chung đường với Booking). |
| Subscription | 4 | Booking từ subscription (đường Enrollment). |
| EoI | 5 | Expression of Interest. |
⚠️ Khi chống trùng lịch normal booking, record
TypeId = SubscriptionhoặcWaitingListkhông bị tính là conflict.MakeupSession/ClosureDaychỉ dùng ở Line/Extra, không phải TypeId.
Confirmation type — cách confirm gắn với thanh toán
TermBookingConfirmationType (...Enums/TermBookingConfirmationType.cs):
| Type | Mã | Khi nào |
|---|---|---|
Confirm_Without_Payment | 101 | Confirm không cần thanh toán. |
Pay_Now_Pay_All | 201 | Trả hết ngay. |
Pay_Now_Pay_Deposit | 202 | Đặt cọc ngay. |
Direct_Debit | 301 | Thiết lập ghi nợ tự động. |
Admin_Confirm | 401 | Admin confirm (dùng cho subscription direct-confirm). |
PayNow / Deposit / Direct Debit có thể arm timeout auto-cancel; PayLater không timeout nhưng phải qua validate eligibility.
Account resolution: admin vs customer
| Bối cảnh | Account target |
|---|---|
| Admin — booking mới | Rỗng, phải chọn account/attendee thủ công (không lấy từ login/profile/subscription). |
| Admin — edit booking/order | Lấy account của booking/order đang edit, khóa. |
| Customer — mới/edit | Account đã đăng nhập, khóa. |
Billing Difference review
Khi edit booking đã confirm (status gốc Approved/Attendance_Approved/Quote), confirm bị gate bằng modal Billing Difference: phải xem chênh lệch tài chính trước khi confirm thật. Submit ở edit mode được gửi mute notifications; lựa chọn mute cuối cùng lấy ở popup confirm.
Tiếp theo: Kiến trúc & dữ liệu.