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

student — Học viên & hồ sơ MVP

Module trung tâm của MVP — quản lý học viênvòng đời hồ sơ theo khóa (tiếp nhận → báo Sở → đang học). Đây là màn hình đầu tiên được dựng. Chi tiết quy trình: WS1 quy trình hồ sơ.

✅ Trạng thái code: đã scaffold bảng học viên (port legacy, migrate 1:1) — cần thêm feature hoso, giayto, lichsu.
1

Feature / BO / Action

FeatureBO chínhAction
studentHọc viên (danh bạ người)viewcreateeditdeleteexport
hosoHồ sơ ghi danh theo khóa (state machine)viewcreateeditapprovetransfer
giaytoGiấy tờ hồ sơ (scan, hạn)viewcreateverifydelete
lichsuLịch sử trạng thái (audit)viewexport
2

Vòng đời hồ sơ

tu_van → tiep_nhancho_bo_sunghop_leda_thu_dot1 (tuition xác nhận) → xep_khoa → da_bao_so (report xác nhận) → dang_hoc Nhánh dừng bất kỳ lúc nào: huy · chuyen_khoa — mỗi bước ghi lịch sử (ai · khi nào · lý do)
3

Dữ liệu chính

▸ Học viên — 1 dòng = 1 lượt đăng ký theo khóa · định danh người qua CCCD

Mã đăng ký ma_dk, họ tên, ngày sinh, giới tính, CCCD + ngày cấp, SĐT, thường trú/cư trú, hạng đào tạo, hạng GPLX, khóa ma_kh, GV, xe tập, thẻ RFID, ảnh, cờ đào tạo/kết quả lý thuyết. UNIQUE (ma_dk, ma_kh, ma_csdt).

▸ Hồ sơ — cột bổ sung

TrườngKiểuGhi chú
Trạng thái hồ sơenumtheo vòng đời mục 2
Loại hồ sơenummới / nâng hạng — quyết định checklist
Phòng phụ tráchrefkhi dùng bàn giao liên phòng
Học phí thỏa thuậnmoneynền cho công nợ đợt (tuition)

▸ Giấy tờ · Lịch sử

Giấy tờ: loại (ref catalog) · file scan · trạng thái (đã nộp/duyệt/thiếu) · hạn · người duyệt. Lịch sử: trạng thái cũ→mới, phòng từ→đến, người thao tác, lý do, thời gian — append-only, thay audit chung ở MVP.

4

Quy tắc & liên kết

Quy tắc nghiệp vụ

  • Chống trùng CCCD trong khóa · đủ tuổi theo hạng (catalog)
  • Thiếu giấy tờ theo checklist → tự chuyển cho_bo_sung
  • Đổi trạng thái bắt buộc ghi lịch sử — không sửa/xóa
  • da_thu_dot1 do tuition xác nhận · da_bao_so do report xác nhận
  • Data scope: tuyển sinh → khâu tiếp nhận · kế toán → từ hợp lệ · GV → phụ trách · HV → chính mình

Liên kết chéo (khóa nghiệp vụ)

  • coursema_kh (hồ sơ thuộc khóa)
  • teacher/vehiclema_gv/ma_xe
  • catalog — mã hạng, mã giấy tờ (validate + checklist)
  • tuition(ma_dk, ma_kh, ma_csdt)
  • datma_dk (đối soát km/giờ)
  • reportma_kh (DS báo Sở) · rfcardrfid

⚠ Câu hỏi mở

  • Ánh xạ trạng thái từ cờ legacy khi migrate (chờ DB V2)
  • Có dùng bàn giao liên phòng? (chờ DS phòng ban Vĩnh An)
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 đủ: student.main.<feature>.<action>.

▸ permissions[] — manifest.json

[ { "group": "main", "feature": "student", "label": "Học viên", "actions": [ "view", "create", "edit", "delete", "export" ] }, { "group": "main", "feature": "hoso", "label": "Hồ sơ ghi danh", "actions": [ "view", "create", "edit", "approve", "transfer" ] }, { "group": "main", "feature": "giayto", "label": "Giấy tờ hồ sơ", "actions": [ "view", "create", "verify", "delete" ] }, { "group": "main", "feature": "lichsu", "label": "Lịch sử trạng thái", "actions": [ "view", "export" ] } ]

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

▸ Ma trận vai trò × feature

FeatureQTHTGIAM_DOCQL_DAO_TAOTUYEN_SINHGIAO_VUGIAO_VIENKE_TOANHOC_VIEN
studentRRWWWR¹R³R²
hosoRRWAW³WR¹R³R²
giaytoRAWAWAR²
lichsuRRRR

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ù: hoso +transfer (QL_DAO_TAO, TUYEN_SINH, GIAO_VU) · hủy hồ sơ = bước workflow (không phải action quyền) · A ở giayto = verify (duyệt giấy tờ)

▸ 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": "student", "fields": [ "giao_vien_id", "nguoi_lxid", "trang_thai_ho_so", "ma_csdt" ], "scopeVars": [ "current_giao_vien_id", "current_nguoi_lxid" ] }, { "group": "main", "feature": "hoso", "fields": [ "trang_thai_ho_so", "giao_vien_id", "nguoi_lxid", "khoa_hoc_id", "ma_csdt" ], "scopeVars": [ "current_giao_vien_id", "current_nguoi_lxid" ] }, { "group": "main", "feature": "giayto", "fields": [ "nguoi_lxid" ], "scopeVars": [ "current_nguoi_lxid" ] } ]

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

Vai tròFeature (action)Điều kiện record
TUYEN_SINHhoso (view, edit)trạng thái ∈ {tu_van, tiep_nhan, cho_bo_sung, hop_le}
KE_TOANstudent, hoso (view)trạng thái ∈ {hop_le, da_thu_dot1, xep_khoa, da_bao_so, dang_hoc}
GIAO_VIENstudent, hoso (view)trang_thai_ho_so = 'dang_hoc' giao_vien_id = ctx.current_giao_vien_id
HOC_VIENstudent, hoso, giayto (view)nguoi_lxid = ctx.current_nguoi_lxid

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

[ { "kind": "rule", "module": "student", "feature": "hoso", "actions": [ "view", "edit" ], "predicate": { "op": "in", "field": "trang_thai_ho_so", "values": [ { "lit": "tu_van" }, { "lit": "tiep_nhan" }, { "lit": "cho_bo_sung" }, { "lit": "hop_le" } ] } }, { "kind": "rule", "module": "student", "feature": "hoso", "actions": [ "view" ], "predicate": { "op": "in", "field": "trang_thai_ho_so", "values": [ { "lit": "hop_le" }, { "lit": "da_thu_dot1" }, { "lit": "xep_khoa" }, { "lit": "da_bao_so" }, { "lit": "dang_hoc" } ] } }, { "kind": "rule", "module": "student", "feature": "hoso", "actions": [ "view" ], "predicate": { "op": "and", "of": [ { "op": "cmp", "field": "trang_thai_ho_so", "cmp": "=", "value": { "lit": "dang_hoc" } }, { "op": "cmp", "field": "giao_vien_id", "cmp": "=", "value": { "ctx": "current_giao_vien_id" } } ] } }, { "kind": "rule", "module": "student", "feature": "hoso", "actions": [ "view" ], "predicate": { "op": "cmp", "field": "nguoi_lxid", "cmp": "=", "value": { "ctx": "current_nguoi_lxid" } } } ]

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.

Rule trên viết cho feature hoso — lặp tương tự cho student/giayto. QL_DAO_TAO/GIAO_VU/GIAM_DOC/QTHT không rule = thấy toàn bộ.