Module · WS đào tạo · 07/7/2026

booking — Thuê xe chip & sân v2

Vận hành nguồn thu thuê xe chip ôn sa hình: lịch sân/xe, đặt phiên qua app, tính giờ tự động theo phiên chip, thu phí và đối soát doanh thu từng xe/khung giờ.

⚠️ v2 — scaffold cùng chip.
1

Feature / BO / Action

FeatureBO chínhAction
calendarLịch sân / xe theo khung giờviewconfigure
rentPhiên thuê + bảng giáviewcreatereportbookcollect
2

Dữ liệu chính

BOTrường chính
LịchXe chip × khung giờ × sân · trạng thái (trống/đã đặt/bảo trì)
Phiên thuêHọc viên · xe · khung giờ đặt ↔ thời gian thực tế từ phiên chip · đơn giá · thành tiền · trạng thái thu
Bảng giáTheo khung giờ (cao điểm/thấp điểm) · theo gói (5/10 phiên) · hiệu lực
3

Quy tắc & liên kết

Quy tắc nghiệp vụ

  • Giờ tính tiền = giờ phiên chip thực tế, không phải giờ đặt — đối soát tự động
  • Đặt qua app (portal) hoặc tại quầy; hủy trước X giờ theo chính sách
  • Doanh thu đối soát từng xe/khung giờ → finance
  • Gói nhiều phiên trừ dần, hết hạn theo cấu hình

Liên kết chéo

  • chip — phiên thực tế để tính giờ
  • portal — đặt qua app
  • tuition/finance — thu phí, hóa đơn
  • bi — hiệu suất khai thác sân

⚠ Câu hỏi mở

  • Chính sách giá thuê hiện tại của Vĩnh An?
  • Cho học viên trung tâm khác thuê không (khách vãng lai)?
Quyền

Ma trận phân quyền — ốp vào manifest & seed role

Khối permissions[] dán vào manifest.json; bảng dưới là gán quyền theo vai trò (seed rt_role). Permission key đầy đủ: booking.main.<feature>.<action>.

▸ permissions[] — manifest.json

[ { "group": "main", "feature": "calendar", "label": "Lịch sân/xe", "actions": [ "view", "configure" ] }, { "group": "main", "feature": "rent", "label": "Phiên thuê & bảng giá", "actions": [ "view", "create", "report", "book", "collect" ] } ]

⚠️ Action đặc thù (book, collect) cần bổ sung vào validator manifest — xem plan data-scope P1.

▸ Ma trận vai trò × feature

FeatureQTHTGIAM_DOCGIAO_VUKE_TOANHOC_VIEN
calendarRRWR
rentRRWRW²

R xem · W tạo/sửa · A duyệt · không có quyền · ¹ dữ liệu phân công · ² của chính mình · ³ theo trạng thái hồ sơ. Vai trò không liệt kê = không có quyền.

Đặc thù: rent +collect (KE_TOAN) · +book (GIAO_VU, HOC_VIEN)

▸ Quyền mức record (row-level)

(a) Manifest bổ sung fields + scopeVars cho feature bị scope (mở rộng schema — plan data-scope P1; manifest chỉ khai "cái gì scope được", không chứa rule):

[ { "group": "main", "feature": "rent", "fields": [ "ma_dk" ], "scopeVars": [ "current_ma_dk_list" ] } ]

(b) Điều kiện record theo vai trò:

Vai tròFeature (action)Điều kiện record
HOC_VIENrent (view, book)ma_dk ∈ ctx.current_ma_dk_list (phiên thuê của mình)

(c) Seed rt_role.grants (kind rule — nhiều rule cùng resource+action = OR):

[ { "kind": "rule", "module": "booking", "feature": "rent", "actions": [ "view", "book" ], "predicate": { "op": "in", "field": "ma_dk", "values": [ { "ctx": "current_ma_dk_list" } ] } } ]

Biến ngữ cảnh: current_user_id — engine có sẵn · current_giao_vien_id/current_ma_gv — module teacher tra từ user đăng nhập (ctxVars, plan P3) · current_nguoi_lxid/current_ma_dk_list — module student tra (1 người nhiều lượt đăng ký) · current_assigned_* — danh sách phụ trách/được phân công.