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

course — Khóa học & xếp lớp MVP

Quản lý khóa học theo hạng, ghi danh + phân công GV–xe, và kế hoạch đào tạo trình Sở — mắt xích giữa hồ sơ (student) và báo cáo tuân thủ (report).

✅ Trạng thái code: đã scaffold bảng khóa học (port legacy) — cần thêm enrollment, plan.
1

Feature / BO / Action

FeatureBO chínhAction
courseKhóa họcviewcreateeditcloseexport
enrollmentGhi danh + phân công GV–xeviewcreateeditassign
planKế hoạch đào tạo (trình Sở)viewcreateapprovereport
2

Dữ liệu chính

BOTrường chính
Khóa học
đã có
Mã khóa ma_kh (theo quy tắc mã catalog) · tên · hạng đào tạo · ngày khai giảng/bế giảng · ngày đào tạo · ngày sát hạch dự kiến · đào tạo nội bộ · trạng thái (mở / đã báo Sở / đang học / đã đóng)
Ghi danh
mới
Hồ sơ ma_dk (1 hồ sơ 1 khóa) · giáo viên ma_gv · xe tập ma_xephải khớp đăng ký với Sở
Kế hoạch
mới
Khóa · nội dung theo mẫu Sở (jsonb/file) · trạng thái: nháp → trình duyệt → đã báo Sở (reported_at)
3

Quy tắc & liên kết

Quy tắc nghiệp vụ

  • Khóa chỉ khai giảng sau khi kế hoạch đã báo Sở — hồ sơ da_bao_so phụ thuộc mốc này
  • Phân công GV–xe khớp đăng ký Sở XD (NĐ 94/2026) — lệch → cảnh báo + phiên DAT bị đánh không hợp lệ
  • Đóng khóa chỉ khi mọi hồ sơ ra trạng thái cuối
  • Sĩ số theo hạng/xe theo giới hạn quy định (config catalog)

Liên kết chéo

  • studentma_kh (hồ sơ gắn khóa)
  • teacher/vehiclema_gv/ma_xe (đối chiếu đăng ký)
  • datma_kh (đối soát theo khóa)
  • report — kế hoạch + DS học viên vào báo cáo
  • catalog — hạng đào tạo, quy tắc mã

⚠ Câu hỏi mở

  • Quy tắc ma_kh Vĩnh An đang dùng (13 ký tự theo legacy?) — giữ khi migrate
  • Giới hạn học viên/GV/xe theo quy định mới → config catalog
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 đủ: course.main.<feature>.<action>.

▸ permissions[] — manifest.json

[ { "group": "main", "feature": "course", "label": "Khóa học", "actions": [ "view", "create", "edit", "close", "export" ] }, { "group": "main", "feature": "enrollment", "label": "Ghi danh & phân công", "actions": [ "view", "create", "edit", "assign" ] }, { "group": "main", "feature": "plan", "label": "Kế hoạch đào tạo", "actions": [ "view", "create", "approve", "report" ] } ]

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

▸ Ma trận vai trò × feature

FeatureQTHTGIAM_DOCQL_DAO_TAOGIAO_VUTUYEN_SINHGIAO_VIENHOC_VIEN
courseRRWWRR¹R²
enrollmentRRWWR¹
planRRWAW

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ù: course +close · enrollment +assign (QL_DAO_TAO)

▸ 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": "course", "fields": [ "khoa_hoc_id", "hang_dao_tao", "ma_csdt" ], "scopeVars": [ "current_assigned_khoa_ids", "current_khoa_ids" ] }, { "group": "main", "feature": "enrollment", "fields": [ "ma_gv", "ma_dk" ], "scopeVars": [ "current_ma_gv" ] } ]

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

Vai tròFeature (action)Điều kiện record
GIAO_VIENenrollment (view)ma_gv = ctx.current_ma_gv
GIAO_VIENcourse (view)khoa_hoc_id ∈ ctx.current_assigned_khoa_ids (khóa mình dạy)
HOC_VIENcourse (view)khoa_hoc_id ∈ ctx.current_khoa_ids (khóa của mình)

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

[ { "kind": "rule", "module": "course", "feature": "enrollment", "actions": [ "view" ], "predicate": { "op": "cmp", "field": "ma_gv", "cmp": "=", "value": { "ctx": "current_ma_gv" } } }, { "kind": "rule", "module": "course", "feature": "course", "actions": [ "view" ], "predicate": { "op": "in", "field": "khoa_hoc_id", "values": [ { "ctx": "current_assigned_khoa_ids" } ] } }, { "kind": "rule", "module": "course", "feature": "course", "actions": [ "view" ], "predicate": { "op": "in", "field": "khoa_hoc_id", "values": [ { "ctx": "current_khoa_ids" } ] } } ]

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.