Subscription — Kiến trúc & dữ liệu
Trang này phác họa các "vật thể" dữ liệu chính 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 BillingSchedule
Quy tắc xương sống: Manage Add-ons/Discounts chỉ dùng
EnrollmentBillingSchedule(đã book). Đây là invariantINV-SUB-ADDON-SCHEDULE-001vàINV-SUB-DISCOUNT-SCHEDULE-001.
Ranh giới sở hữu (ownership)
Quan trọng để không phá vỡ nhất quán:
| Khối | Ai được sửa |
|---|---|
| Subscription (template, price, product, content) | UI Setup |
| Enrollment / TermBookingOrder / TermBooking / Billing / Invoice / CreditNote (runtime) | Chỉ các service booking/enrollment/confirmation hiện có |
UI Setup / popup add-on KHÔNG trực tiếp approve/skip/schedule/regenerate invoice. Mọi recalculation billing đi qua service backend sở hữu hành vi đó.
Các API chính (đường đọc/ghi)
| Mục đích | API |
|---|---|
| Lịch thanh toán cho booking | GET /api/ConsumerEnrollment/Subscriptions/{id}/BillingSchedules |
| Metadata subscription (giá, product, linked term) | GET /api/ConsumerEnrollment/Subscriptions/{id} |
| Submit enrollment | POST .../ConsumerEnrollment/Submit |
| Options cho Subscription Manager filter | GET /api/Subscription (admin, gồm cả unpublished) |
| Options booking (khách) | GET /api/ConsumerEnrollment/Subscriptions |
Manager filter dùng
GET /api/Subscription(admin, thấy cả gói chưa publish); booking khách vẫn dùngConsumerEnrollment(chỉ gói bookable). Hai đường không lẫn nhau.
Đơn vị & quy ước dữ liệu đáng nhớ
| Field | Quy ước |
|---|---|
Subscription.CutOffMinute | Lưu phút; UI hiển thị ngày nguyên (1 ngày = 1440). Decimal bị từ chối. |
Subscription.TypeId | null/0 = BookingAndBilling; 1 = BillingOnly. |
| Booking Start/End Selection | 0 = Staff Only (mặc định); khác = Staff & Customer. |
| Billing Type | Khóa cứng Flat Rate (Dynamic chưa sẵn sàng). |
Term & booking liên quan
- Term = kỳ học. Subscription link tới term qua
SubscriptionTerm(fieldLinked). - Booking "normal" (
TermBookingOrder/TermBooking) là luồng khác subscription nhưng giao thoa khi validate trùng lịch — xem domain Booking và Case thường gặp.
Public-safe vs private
Các API hiển thị cho khách (Course List, Step 1) chỉ lộ public-safe: title, price info, weekday availability, mô tả, site map metadata, closure-day. Không lộ booking/enrollment/ account/attendee/invoice/payment private. Mọi đường hiển thị là read-only (không mutate state).
Tiếp theo: Luồng xử lý trong code.