Module · WS đào tạo · 07/7/2026 · cập nhật 15/7/2026

teacher — Hồ sơ nghiệp vụ & tuân thủ giáo viên MVP

Chứng chỉ + hạn giấy tờ, đăng ký danh sách GV với Sở XD, phân công dạy. Nhân thân đọc từ HRM qua employee_id — màn hình tạo GV = "chọn nhân viên (phòng đào tạo) → bổ sung hồ sơ nghiệp vụ", KHÔNG nhập lại thông tin người (join pattern P2).

🔀 Định vị lại 15/7/2026 (đối chiếu thực tế Vĩnh An: GV chính là nhân viên phòng KH–ĐT): teacher KHÔNG phải "bảng người" thứ hai — nhân thân thuộc nhân viên trong HRM (built-in, 26 người đã seed); teacher là hồ sơ nghiệp vụ gắn thêm qua employee_id. Vẫn tách module vì: (1) hai vòng đời — quan hệ lao động (HRM) ≠ vai trò được cơ quan quản lý cấp phép (nghỉ dạy vẫn là NV; GV thỉnh giảng có thể không phải NV); (2) ma_gv/ma_csdt là khóa compliance chảy vào DAT/BC1/kế hoạch gửi Sở; (3) HRM là core dùng chung mọi tenant — không nhét nghiệp vụ ngành lái xe vào core.
✅ Trạng thái code: đã scaffold bảng giáo viên (port legacy) — cần thêm employee_id, cert, assignment.
1

Feature / BO / Action

FeatureBO chínhAction
teacherGiáo viên (hồ sơ nghiệp vụ)viewcreateeditdeleteexport
certChứng chỉ GV + hạnviewcreateeditconfigure
assignmentPhân công dạyviewassignreport
2

Dữ liệu chính

BOTrường chính
Giáo viên
đã có · sửa 15/7
employee_id (FK mềm → hrm.employees, nullable cho GV thỉnh giảng) — nguồn nhân thân duy nhất, họ tên/CCCD/SĐT/ảnh đọc từ HRM không nhập lại (cột legacy trùng chỉ là mirror import FPT, UI không cho sửa) · mã GV ma_gv/ma_csdt (khóa đăng ký Sở, UNIQUE) · hạng GPLX được dạy · trình độ (ref catalog) · thẻ RFID/vân tay · trạng thái đăng ký Sở.
Import FPT (go-live): port bảng giao_vien → khớp employee bằng CCCD; không khớp → thỉnh giảng (NULL) hoặc báo thiếu hồ sơ HRM.
Chứng chỉ
mới
Loại (GPLX / sư phạm / tập huấn / khám SK) · số hiệu · nơi cấp · ngày cấp / ngày hết hạn (nguồn nhắc hạn notify) · file scan
Phân công
mới
GV × khóa × xe · loại dạy (LT/TH) · trạng thái khớp đăng ký Sở — dùng chung dữ liệu enrollment của course
3

Quy tắc & liên kết

Quy tắc nghiệp vụ

  • Một con người – một nguồn nhân thân: nhân thân sống ở HRM, teacher không sửa; kiêm nhiệm = 1 employee + 1 teacher profile (khớp thực tế Vĩnh An)
  • GV thực hành phải có GPLX đúng hạng + chứng chỉ còn hạn — hết hạn → chặn phân công mới + nhắc hạn
  • Phân công khớp danh sách GV đã đăng ký Sở — lệch → cảnh báo, phiên DAT bị đánh xem xét
  • Lương tính từ giờ DAT ở payroll (v1.5) — teacher chỉ giữ hồ sơ
  • Data scope phan_cong: GV chỉ thấy của mình — resolve qua chuỗi có sẵn user → users.employee_id → teacher.employee_id

Liên kết chéo

  • hrm (built-in)employee_id: nguồn nhân thân; teacher = profile nghiệp vụ gắn thêm
  • coursema_gv (phân công theo khóa)
  • student — học viên phụ trách (data scope)
  • dat — phiên học gắn GV, đối chiếu lệch
  • notify — nhắc hạn chứng chỉ · rfcard — thẻ RFID

⚠ Câu hỏi mở

  • Danh mục chứng chỉ GV theo TT 17/2026-BXD
  • Mapping GV ↔ tài khoảnđã giải bằng chuỗi users.employee_id → teacher.employee_id (15/7)
  • GV thỉnh giảng: bắt buộc hồ sơ HRM "cộng tác viên" hay cho teacher đứng một mình (employee_id NULL)? — tạm chọn cho phép NULL, xác nhận với 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 đủ: teacher.main.<feature>.<action>.

▸ permissions[] — manifest.json

[ { "group": "main", "feature": "teacher", "label": "Giáo viên", "actions": [ "view", "create", "edit", "delete", "export" ] }, { "group": "main", "feature": "cert", "label": "Chứng chỉ GV", "actions": [ "view", "create", "edit", "configure" ] }, { "group": "main", "feature": "assignment", "label": "Phân công dạy", "actions": [ "view", "assign", "report" ] } ]

▸ Ma trận vai trò × feature

FeatureQTHTGIAM_DOCNHAN_SUQL_DAO_TAOGIAO_VUGIAO_VIEN
teacherRRRWRR²
certRRRWR²
assignmentRRWR

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ù: assignment +assign,report (QL_DAO_TAO). Đổi 15/7: W của teacher/cert chuyển NHAN_SU → QL_DAO_TAO — hồ sơ nghiệp vụ GV thuộc phòng đào tạo (nhân thân đã ở HRM do nhân sự quản); role NHAN_SU ở Vĩnh An hiện không gán ai (WS0 §8.2).

▸ 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": "teacher", "fields": [ "giao_vien_id", "ma_gv" ], "scopeVars": [ "current_giao_vien_id" ] }, { "group": "main", "feature": "cert", "fields": [ "giao_vien_id" ], "scopeVars": [ "current_giao_vien_id" ] } ]

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

Vai tròFeature (action)Điều kiện record
GIAO_VIENteacher, cert (view)giao_vien_id = ctx.current_giao_vien_id (hồ sơ của mình)

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

[ { "kind": "rule", "module": "teacher", "feature": "teacher", "actions": [ "view" ], "predicate": { "op": "cmp", "field": "giao_vien_id", "cmp": "=", "value": { "ctx": "current_giao_vien_id" } } }, { "kind": "rule", "module": "teacher", "feature": "cert", "actions": [ "view" ], "predicate": { "op": "cmp", "field": "giao_vien_id", "cmp": "=", "value": { "ctx": "current_giao_vien_id" } } } ]

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.