Booking — Góc nhìn end-user
Trang này mô tả ai bấm gì trong luồng booking, từ phía khách và phía admin/staff.
Khách hàng (Customer Portal / AimyMe)
Step 1 — Chọn suất học
- Mở Booking Flow → Course List, chọn course → xem session khả dụng.
- Chọn các session cho attendee. Ở bước này hệ thống chưa tạo state booking nào — chỉ giữ lựa chọn phía client.
- Nếu chưa đăng nhập: bấm Next → mở popup login; lựa chọn được giữ lại sau khi đăng nhập.
Course List — URL context & bộ lọc site
- Customer Portal (
/programs): giữ_evàorg_id(các site được phép), bỏ_b; site access không bị giới hạn theo_b. AimyMe và Embedded Booking Page cũng không bao giờ mang_b. - Admin Mode (Admin Portal / Onsite App): luôn có
_b; danh sách site chỉ gồm site theo BusinessUnit + quyền user. GlobalBookingView = False→SiteIdđược preselect, ẩn Site Filter — áp dụng dù tới từ Landing Page, Course Details, make-another-booking hay URL trực tiếp.- Landing Page Book Now → mở Course List với site đó preselected; make another booking → giữ nguyên site preselected nếu site vẫn accessible.
- User clear bộ lọc → xem program của toàn bộ site accessible, không thêm lại
_bcho customer surface. - Site param ngoài tập cho phép → bỏ qua, không mở rộng access; back từ Course Details → khôi phục trạng thái filter nếu site còn trong access set.
Ví dụ thực tế: Phụ huynh mở
/programstừ link marketing có kèm_b=siteAkhông thuộc quyền. → Không để tham số client quyết định phạm vi site của khách. → Course List bỏ_b, chỉ hiện program thuộc site được phép từorg_id.
Course List — thẻ course theo category
| Category | Tag trên card |
|---|---|
| Class | Có tag ngày trong tuần (weekday) |
| Subscription | Có tag ngày trong tuần |
| Holiday | Không hiện tag weekday |
| Term Care | Không hiện tag weekday |
- Card hiện giá trị
Term Planner Requirements/Priceđã bị ghi đè tay (manual), không thay bằng giá trị tự sinh lại trừ khi Term Planner chủ động ghi đè. - Chiều cao card theo nội dung; các card cùng hàng cao bằng card cao nhất trong hàng đó (per-row, không đồng nhất toàn grid).
Ví dụ thực tế: Admin ghi đè price cho course Holiday rồi mở Course List cho khách xem. → Hiển thị đúng giá đã chỉnh tay, không tự tính lại. → Card Holiday không có tag weekday và hiện price manual đã lưu.
Step 2 — Xác nhận & thanh toán
- Account holder của khách được preload và khóa (không đổi được).
- Xem lại session, add-on, discount đã áp.
- Chọn cách thanh toán → Submit:
- Pay Now (trả hết / đặt cọc), Direct Debit, hoặc Pay Later (nếu đủ điều kiện).
- Sau submit, tùy cấu hình: confirm ngay, hoặc nhận Quote để xem rồi Accept.
My Bookings
- Xem các booking đã đặt, Edit (nếu còn editable), hoặc hủy theo chính sách.
- Khi edit một booking có liên quan attendee/course khác (cùng
ActionLogId), hệ thống có thể hiện popup gộp — xem Combine booking rule.
Bookings → View Calendar
- Time range của mỗi event dùng time display format chung:
timeFormatđã lưu của user nếu có, ngược lạitimeDisplayFormatcủa business unit. - Format 12 giờ → hiện
AM/PMchuẩn, không hiện tokentt; format 24 giờ → không kèmAM/PM/tt. - Popup session/calendar hiện giờ theo enterprise timezone mode (INV-ENTTZMODE-003):
- Enterprise
Local→ hiện giờ local của enterprise (wall-clock gốc), không shift theo timezone user/browser. - Enterprise
MultiZone→ convert sangtimezoneIdentifierđã lưu của user; không có → fallback browser timezone (chuỗi: user saved timezone → browser timezone). - Khái niệm mode: xem Timezone & DateTime.
- Enterprise
Ví dụ thực tế: User ở Việt Nam mở popup session của enterprise
Localđặt ở Sydney. → Tránh hiện sai giờ do tự đổi sang múi giờ user. → Popup hiện đúng giờ Sydney gốc; với enterpriseMultiZone, popup đổi sangtimezoneIdentifiercủa user.
Admin / Staff (Admin Portal / Onsite App)
Tạo booking mới
- Mở Normal Booking Step 2 cho booking mới: Account Holder Info bắt đầu rỗng — hệ thống không tự lấy account từ login/route/profile, cũng không lấy account mà Subscription Booking vừa chọn.
- Phải chọn account (hoặc chọn attendee để suy ra account) thì nút submit mới bật.
- Đổi account → xóa attendee & các lựa chọn gắn account cũ.
Hành động & xác nhận
- Admin Mode gom submit thành một control
Submit→ mở menu 3 lựa chọn: Submit, Submit & Confirm, Submit & Confirm Attendance (không còn là các nút tách rời). - Selection chưa đủ điều kiện submit → control
Submitbị disable, cả 3 lựa chọn không chạy. Khách ngoài Admin Mode giữ nút cũ và không thấySubmit & Confirm/Submit & Confirm Attendance. - Các hành động khác: Confirm Booking, Cancel Booking.
- Mỗi hành động hiện popup xác nhận liệt kê booking dạng
BK-xxxx(kèm tên attendee nếu có). - Với booking đã confirm bị edit lại: hiện Billing Difference preview trước popup xác nhận — trừ
Submit & Confirm Attendance(không bao giờ cần preview). - Popup có tùy chọn Mute Notifications (mặc định off) — áp cho submit/confirm/submit-confirm/ submit-confirm-attendance/cancel.
Edit booking đã confirm
Submit & Confirmở edit mode tách 2 bước: submit (im lặng, mute) → xem Billing Difference → bấm Confirm mới thực sự confirm.Submit & Confirm Attendancethì không mở Billing Difference: submit xong → confirm attendance ngay (statusAttendance_Approved, chưa phải confirmed đầy đủ).- Có thể chọn Edit lại, hoặc View Submitted Booking in Booking Manager mà không confirm.
Booking Rule Options (admin override)
Admin có thể tắt từng rule trong panel Booking Rule Options, ví dụ:
- Booking Cut-off OFF → chọn được session quá khứ (mọi program category).
- Height / Weight Restriction OFF từng cái → bỏ qua đúng rule đó, rule còn lại vẫn chặn.
Closure Day Booking Adjustment
Admin Portal → trang Closure Day Booking Adjustment: quản lý các booking bị ảnh hưởng bởi closure day.
- Layout:
PageHeader→ card nội dung → bộ filter → thông tin programme → action → bảng booking. Viewport hẹp → filter wrap, bảng giữ scroll ngang. - Filter: Site, Closure Days, Programmes, Sessions (multi-select); dùng từ
Programme, không dùngProgram. - Trạng thái: chưa chọn Site → nhắc; chưa chọn Closure Days → nhắc chọn 1+; không có booking → empty state (không hàm ý lỗi finance/worker); filter không khớp → nhắc điều chỉnh.
- Chưa chọn booking →
cancel-and-creditdisabled; đã chọn → hiện số chọn / tổng eligible. - Xác nhận cancel: danger, phân biệt số ít/nhiều, nêu rõ hủy booking + sinh credit note tương ứng.
- UI-only: không đổi API payload, persistence, finance hay worker.
Ví dụ thực tế: Admin chọn site + 1 closure day để xem ai bị ảnh hưởng trước khi hủy đồng loạt. → Tránh thao tác mù trên dữ liệu trống và hiểu rõ hành động destructive. → Trang liệt kê booking bị ảnh hưởng; admin chọn rồi bấm cancel-and-credit, dialog danger xác nhận và sinh credit note theo từng booking.
Notification template — Checkout Instruction
- Template booking có field
CheckoutInstruction(plain text) và placeholderchèn cả block; template không chứa token → không chèn. - Render theo
Billing.PaymentOptionIdcủa booking:PayNow/PayNowDeposit→ render;PayLater/DirectDebit/null → thay bằng chuỗi rỗng.→ URL checkout, giữ xuống dòng. - Template Booking Confirmation - Parent thêm biến
,,,,,. - Generator
ConfirmBooking_Accountthay mọi placeholder trước khi gửi (không token nào lọt nguyên dạng):→ logo enterprise;→ attendee/program/price/khoảng ngày;→TermProgramSet.Instruction;/→ rich-text HTML (PDF: link xem/tải). Chưa cấu hình → rỗng.
Ví dụ thực tế: Admin soạn "Booking Confirmation - Parent" kèm lời dặn thanh toán trước khi vào lớp. → Khách
PayNownhận hướng dẫn checkout đúng lúc, kháchPayLaterkhông bị nhầm. → Template chèn; bookingPayNowrenderCheckoutInstructionkèm link, bookingPayLaterthay block bằng chuỗi rỗng.
Tiếp theo: Khái niệm cốt lõi.