Booking — Dữ liệu & bảng đọc/ghi
Góc nhìn database và các khái niệm bên ngoài mà Booking tham chiếu. Quy ước: 📖 READ, ✏️ WRITE (insert/update).
Khái niệm liên quan bên ngoài
Booking không tự sở hữu các thứ dưới đây — nó liên kết tới chúng.
| Khái niệm | Là gì | Vai trò trong Booking | Domain sở hữu |
|---|---|---|---|
| Term / TermProduct | Kỳ học & sản phẩm/suất trong kỳ. | Nguồn session khả dụng, capacity, giá. | Master Data |
| Subscription / Enrollment | Gói dài hạn và runtime ghi danh. | Subscription Booking cung cấp pattern/schedule; Enrichment charge vẫn thuộc Booking. | Subscription |
| TermProgramSet | Nhóm sản phẩm/course. | Đơn vị áp discount & gom line. | Master Data |
| ProgramCategory | Nhóm chương trình. | Giữ CombinedBookingOptionId, DiscountRuleType. | Master Data |
| ActionLog | Bản ghi một thao tác. | ActionLogId nhóm booking cho combined edit. | Platform |
| Account / Attendee | Phụ huynh / trẻ. | Target account & attendee của booking. | Master Data |
| Billing | "Sổ" tài chính của booking. | Submit tạo Billing; gắn invoice. | Finance |
| Invoice / CreditNote | Hóa đơn & ghi có. | Confirm sinh invoice; cancel → credit note. | Finance |
| TermAttendance | Điểm danh suất học. | Confirm tạo; cancel/remove → deactivate. | Attendance |
| Discount | Quy tắc giảm giá. | Áp tự động khi pricing (xem Discount rule). | Discount |
📌 Các domain liên quan đã có trang riêng: Finance, Payment và Master Data.
Bảng dữ liệu — nhóm theo aggregate
| Aggregate | Bảng chính | Tác dụng |
|---|---|---|
| TermBookingOrder (request) | TermBookingOrder | Yêu cầu booking: account, type, status, ActionLogId. |
TermBookingOrderLine | Dòng session (date/time/product/price, slot discount). | |
TermBookingOrderExtra | Add-on mức order. | |
TermBookingOrderDiscount | Discount đã áp mức order. | |
| TermBooking (confirmed) | TermBooking | Booking chính thức: status, ProgramCategoryId, LockTypeId. |
TermBookingLine / TermBookingExtra / TermBookingDiscount | Dòng session / add-on / discount đã confirm. | |
| Discount | Discount, TermProgramSetDiscount, ProfileDiscount | Định nghĩa & cấu hình áp. |
DiscountApplication, DiscountApplicationAllocation | Ghi nhận & phân bổ discount. |
Bảng dữ liệu trong từng luồng
Luồng 1 — Create order
| Hành động | Bảng | Tác dụng |
|---|---|---|
| Lấy session/capacity | TermProduct, TermProgramSetCapacity 📖 READ | Session khả dụng + capacity. |
| Tạo order | TermBookingOrder, TermBookingOrderLine ✏️ WRITE | Giỏ hàng (status Created). |
Luồng 2 — Submit
| Hành động | Bảng | Tác dụng |
|---|---|---|
| Áp discount | TermProgramSetDiscount, Discount 📖 READ; TermBookingOrderDiscount ✏️ WRITE | Discount tự động. |
| Overlap guard | TermBookingOrder, TermBooking 📖 READ | Chống trùng (loại trừ Subscription/WaitingList). |
| Tạo tài chính | Billing ✏️ WRITE | Sổ tài chính của order. |
Luồng 3 — Billing Difference preview
| Hành động | Bảng / dữ liệu | Tác dụng |
|---|---|---|
| Dựng projection | TermBookingOrder, TermBooking, Billing, Invoice, CreditNote, Discount, settings 📖 READ | Tính trạng thái tài chính dự kiến từ dữ liệu hiện tại. |
| Trả kết quả preview | BillingDifferencePreviewModel 📖 READ | Trả transaction collections, Summary, AttendeeBreakdowns, DebugInfo và PreviewSnapshotToken; không ghi bảng nào. |
Summary.Difference do backend tính theo công thức: invoice mới − credit note mới − invoice scheduled-delete. Preview còn trả các tổng hiện hữu ở cấp billing record: Summary.TotalOriginalAmountPaid (tổng Invoice.AmountPaid) và Summary.TotalOriginalAmountDue (tổng Invoice.AmountDue). Hai field này chỉ phản ánh trạng thái hiện tại, không phải số paid/due dự kiến sau edit và không được tự chia cho attendee. Projected transaction number là mã opaque dạng INV-PRV-2642, không phải invoice thật và không dùng để kiểm tra freshness.
Decision summary trên UI dùng cùng một nguồn:
| Hiển thị | Công thức / nguồn |
|---|---|
Current net billed | Summary.TotalOriginalAmount |
Paid to date | Summary.TotalOriginalAmountPaid |
Open invoice balance | Summary.TotalOriginalAmountDue (before credits) |
Projected net billed | Current net billed + Summary.Difference |
Net billing change | Summary.Difference |
Đây là tổng của toàn billing record; transaction list và attendee breakdown là detail phụ, mặc định ẩn và chỉ mở bằng control dạng text.
AttendeeBreakdowns là allocation từ cùng billing calculation với Summary, không phải phép tính billing độc lập theo từng attendee. Mỗi attendee thuộc order đã submit có một row; activity của booking group khác cùng BillingId nằm trong Other booking groups (IsOutsideSelectedScope = true), còn attribution không chắc chắn nằm trong Shared / Unallocated (IsShared = true). Các row phải cộng lại đúng các total tương ứng trong Summary; Other booking groups không được tính vào selected-attendee count.
Các field chính của mỗi breakdown row:
| Field | Ý nghĩa |
|---|---|
AttendeeId, AttendeeName | Identity của attendee; grouped row có thể không có AttendeeId. |
IsShared | true khi row là Shared / Unallocated. |
IsOutsideSelectedScope | true khi row là Other booking groups. |
TotalOriginalAmount | Net amount hiện hữu đã persist. |
TotalNewAmount | Tổng invoice mới được projection. |
TotalCreditNoteAmount | Credit note mới được projection, lưu dưới dạng positive magnitude. |
TotalScheduledToDeleteAmount | Invoice Generated sẽ bị deactivate, lưu dưới dạng positive magnitude. |
Difference | TotalNewAmount − TotalCreditNoteAmount − TotalScheduledToDeleteAmount. |
ScheduledToDeleteCount, NewInvoiceCount, NewCreditNoteCount | Số work item tương ứng trong row. |
Luồng 3b — Bulk Confirm trong Booking Manager
| Hành động | Bảng / dữ liệu | Tác dụng |
|---|---|---|
| Queue booking mới | TermBookingOrder, BookingScheduler ✏️ WRITE | Queue bulk Confirm_Booking như flow hiện có. |
| Guard edit/mixed | TermBookingOrder 📖 READ | Từ chối toàn bộ batch trước lock/scheduler với PREVIEW_BILLING_DIFF_BATCH_EDIT_NOT_SUPPORTED. |
| Queue attendance | TermBookingOrder, BookingScheduler ✏️ WRITE | Giữ bulk Confirm_Attendance, không đi qua Billing Difference. |
Luồng 4 — Confirm / Quote
| Hành động | Bảng | Tác dụng |
|---|---|---|
| Tạo booking | TermBooking, TermBookingLine/Extra/Discount ✏️ WRITE | Copy từ order. |
| Điểm danh | TermAttendance ✏️ WRITE | Mỗi session một bản ghi. |
| Giữ điểm danh khi edit | TermAttendance, RollCallHistory ✏️ WRITE | Thay attendance vẫn copy roll call cũ (invariant INV-BOOK-27). |
| Hóa đơn | Invoice, InvoiceLine ✏️ WRITE (qua Finance) | Sinh theo confirm. |
| Phân bổ discount | DiscountApplication, DiscountApplicationAllocation ✏️ WRITE | Audit billing. |
Luồng 4b — Subscription Enrichment generation
| Hành động | Bảng | Tác dụng |
|---|---|---|
| Resolve occurrence | Subscription, EnrollmentPattern, TermProduct, schedule 📖 READ | Xác định ngày, scope, rate và accounting item authoritative. |
| Tạo charge | TermBooking, TermBookingLine, TermAttendance ✏️ WRITE | Một active line + attendance cho mỗi TermBookingId + TermProductId + Date. |
| Booking reconciliation | Billing, Invoice, InvoiceLine, TermBookingInvoiceLog ✏️ WRITE | Invoicing Booking line đúng owner; retry không nhân đôi. |
| Subscription Billing exclusion | EnrollmentBillingSchedule, SubscriptionTermBillingSchedule, EnrollmentInvoiceLog 📖 READ | Không lấy amount từ Enrichment Booking line. |
Luồng 5 — Cancel
| Hành động | Bảng | Tác dụng |
|---|---|---|
| Hủy booking | TermBooking ✏️ UPDATE (→ Canceled) | Trạng thái hủy. |
| Đảo hóa đơn | CreditNote ✏️ WRITE | Credit note cho invoice đã phát hành. |
| Gỡ điểm danh | TermAttendance ✏️ UPDATE (IsActive=false) | Deactivate (kể cả line đã rời Approved). |
Luồng 6 — Booking Reconciliation
| Hành động | Bảng | Tác dụng |
|---|---|---|
| Đọc candidate | TermAttendance, BookingReconciliationRule 📖 READ | Attendance Unreconciled đã sign out + rule phí/hoàn. |
| Ignore | TermAttendance ✏️ UPDATE (ReconciliationStatusId=Ignored) | Bỏ qua không sinh chứng từ. |
| Sinh phí/hoàn | Invoice/CreditNote, InvoiceLine/CreditNoteLine ✏️ WRITE | TypeId BookingReconciliation (3), theo split rule. |
| Cập nhật attendance | TermAttendance ✏️ UPDATE (ReconciliationStatusId=Invoiced/Credited, ReconciliationAmount) | Chốt đã xử lý. |
| Liên kết booking | TermBookingInvoiceLog / TermBookingCreditNoteLog ✏️ WRITE | Resolve Booking ID trên FinanceTransaction. |
| Scheduler | InvoiceScheduler / CreditNoteScheduler, EntityEventScheduler ✏️ WRITE | Gửi mail/sync, refresh booking numbers. |
Luồng 7 — Manage Enrichments
| Hành động | Bảng | Tác dụng |
|---|---|---|
| Load state | TermBookingLine, TermProduct, invoice/credit/attendance/lock 📖 READ | Hiện selected, amount, editable và lock reason. |
| Save selection | TermBookingLine, TermAttendance ✏️ WRITE | Add/deactivate future unlocked occurrence atomically. |
| Refresh totals | TermBooking ✏️ UPDATE; Booking Billing service | Tính lại Booking total; không popup ghi trực tiếp Invoice/CreditNote. |
Liên quan
- Kiến trúc & dữ liệu — quan hệ các "vật thể".
- Discount rule — quy tắc giảm giá & cách áp.
- Booking Reconciliation — đối soát điểm danh & chứng từ phạt/hoàn.