Booking — Kiến trúc & dữ liệu
Trang này phác họa các "vật thể" dữ liệu của normal booking và quan hệ giữa chúng — góc nhìn khái niệm, không phải schema chính xác.
Sơ đồ quan hệ (mức khái niệm)
Hai mức record: Order → Booking
Confirm copy OrderLine → BookingLine, OrderExtra → BookingExtra, OrderDiscount → BookingDiscount; rồi tạo
TermAttendancecho từng session và trigger billing.
Ranh giới sở hữu (ownership)
| Khối | Ai được sửa |
|---|---|
| Lựa chọn session Step 1/Step 2 (client-side) | UI (chỉ state, không mutate DB) |
| TermBookingOrder / TermBooking / Billing / Invoice / CreditNote / TermAttendance (runtime) | Chỉ các service booking/confirmation hiện có |
UI không tự tạo
TermBookingOrderlúc load Step 1/Step 2, không gọi API billing/invoice mức thấp để giả lập submit/confirm. Mọi mutation đi qua service backend.
Các API chính (đường đọc/ghi)
| Mục đích | API |
|---|---|
| Lấy session khả dụng | GET /api/ConsumerBooking/GetAvailableSessionsAsync |
| Lấy capacity | GET /api/ConsumerBooking/GetCapacitiesAsync |
| Tạo order (giỏ) | POST /api/ConsumerBooking/CreateBookingOrder |
| Submit | POST /api/ConsumerBooking/SubmitBookingOrders |
| Confirm | POST /api/ConsumerBooking/ConfirmBookingOrders |
| Quote / Accept | POST .../GenerateQuotesAsync, .../AcceptQuoteAsync |
| Hủy | POST /api/ConsumerBooking/DeleteBookingOrdersAsync |
| Discount config | GET/POST /api/discount |
Quy ước dữ liệu đáng nhớ
| Field | Quy ước |
|---|---|
TermBookingOrder.TypeId | Booking(0) = normal; Subscription(4)/WaitingList(1) loại trừ khỏi conflict normal. |
| Discount slot trên line | Tối đa 3: DiscountId, Discount2Id, Discount3Id. |
ProgramCategory.CombinedBookingOptionId | 0 = theo course; 1 = gộp theo program category. |
ActionLogId | Khóa nhóm các booking đặt cùng một thao tác (cho combined edit). |
| Booking number | Hiển thị dạng BK-xxxx cho người dùng. |
Tiếp theo: Luồng xử lý trong code.