Module gộp student + course thành một bounded context "ghi danh → đào tạo" — quản lý học viên, vòng đời hồ sơ, khóa học, ghi danh + phân công GV–xe, kế hoạch trình Sở. Quyết định 20/7, trước go-live.
| Căn cứ | Chi tiết |
|---|---|
| Rớt cả 4 điều kiện tách của Sơ đồ §0 | ① không ai mua course rời student · ② cùng nhịp nâng cấp · ③ cùng người dùng (giáo vụ) · ④ gỡ một cái là cái kia vô nghĩa. Ranh giới cũ tồn tại chỉ vì bám bảng legacy QLHS V2 (migrate 1:1) |
| Ranh giới nóng nhất hệ | hoso ↔ enrollment ↔ course transition là callback P3 hai chiều — loại ranh giới đắt nhất trong OpenGate (service API + outbox + job đối soát) |
| Lợi ích sau gộp | Transition thành gọi hàm trong module — bỏ hẳn outbox/đối soát giữa hai bên; bỏ 2 contract view nội bộ (course_v_khoa_hoc, course_v_enrollment chỉ còn cần cho consumer ngoài như report/hrm.timesheet-dat) |
| Vì sao phải làm NGAY | Quy tắc prefix bảng theo key module ⇒ đổi student_*/course_* → training_* phải xong trước lần migrate dữ liệu Vĩnh An đầu tiên — sau go-live thì đắt gấp nhiều lần |
| Feature | BO chính (+ BO phụ) | Action |
|---|---|---|
| student | Học viên (danh bạ người) | viewcreateeditdeleteexport |
| hoso | Hồ sơ ghi danh theo khóa (state machine) BO phụ: Giấy tờ (scan, hạn) · Lịch sử trạng thái (append-only) | viewcreateeditapprovetransferverifyexport |
| course | Khóa học | viewcreateeditcloseexport |
| enrollment | Ghi danh + phân công GV–xe | viewcreateeditassign |
| plan | Kế hoạch đào tạo (trình Sở) | viewcreateapprovereport |
| Transition / ràng buộc | Trước (2 module) | Sau (training) |
|---|---|---|
| hoso xep_khoa ↔ tạo enrollment | P3 callback + outbox | Gọi hàm nội bộ, cùng transaction |
| Khai giảng khóa cần plan da_bao_so | JOIN view chéo | Query nội bộ |
| Đóng khóa khi mọi hồ sơ ra trạng thái cuối | course đọc student_v_hoso | Query nội bộ |
| da_thu_dot1 ← tuition · da_bao_so ← report · convert ← crm | P3 | P3 giữ nguyên — ranh giới ngoài chính đáng (người dùng khác) |
Nội dung trường giữ nguyên như bản tách (xem chi tiết trong student/course cũ) — thay đổi duy nhất là prefix theo key module mới:
| Bảng cũ (scaffold) | Bảng mới | Ghi chú |
|---|---|---|
| student_nguoi_lx | training_nguoi_lx | UNIQUE (ma_dk, ma_kh, ma_csdt) — 1 dòng = 1 lượt đăng ký theo khóa |
| student_ho_so_giayto | training_ho_so_giayto | BO phụ của hoso — loại giấy tờ ref catalog |
| student_ho_so_lichsu | training_ho_so_lichsu | append-only, thay audit chung ở MVP |
| course_khoa_hoc | training_khoa_hoc | mã khóa ma_kh theo quy tắc catalog |
| (mới — chưa scaffold) | training_ghi_danh | enrollment: ma_dk · ma_gv · ma_xe — khớp đăng ký Sở |
| (mới — chưa scaffold) | training_ke_hoach | plan: nội dung mẫu Sở (jsonb/file) · reported_at |
| View cũ | View mới | Consumer ngoài |
|---|---|---|
| student_v_hoso | training_v_hoso | tuition (công nợ) · report (DS báo Sở) · portal |
| course_v_khoa_hoc | training_v_khoa_hoc | report · dat (đối soát theo khóa) · portal |
| course_v_enrollment | training_v_enrollment | dat (đối soát phân công GV–xe) · hrm.timesheet-dat |
Tuân quy tắc cứng Quan hệ module §4: view chỉ chứa cột định danh + nhãn hiển thị; học phí thỏa thuận, file scan giấy tờ không vào view — đọc qua service API check quyền.
Permission key đầy đủ: training.main.<feature>.<action> — thay cả student.main.* lẫn course.main.*.
⚠️ Action đặc thù (transfer, verify, close) cần bổ sung vào validator manifest — như plan data-scope P1.
| Feature | QTHT | GIAM_DOC | QL_DAO_TAO | TUYEN_SINH | GIAO_VU | GIAO_VIEN | KE_TOAN | HOC_VIEN |
|---|---|---|---|---|---|---|---|---|
| student | R | R | W | W | W | R¹ | R³ | R² |
| hoso | R | R | WA | W³A | WA | R¹ | R³ | R² |
| course | R | R | W | R | W | R¹ | — | R² |
| enrollment | R | R | W | — | W | R¹ | — | — |
| plan | R | R | WA | — | W | — | — | — |
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) · A ở hoso = verify giấy tờ (thay ma trận giayto cũ) · course +close, enrollment +assign (QL_DAO_TAO) · hủy hồ sơ = bước workflow, không phải action quyền.
Port nguyên từ 2 bản cũ (student §Quyền · course §Quyền), chỉ đổi "module": "training" và gộp fields/scopeVars. Điều kiện record theo vai trò sau gộp:
| Vai trò | Feature (action) | Điều kiện record |
|---|---|---|
| TUYEN_SINH | hoso (view, edit) | trạng thái ∈ {tu_van, tiep_nhan, cho_bo_sung, hop_le} |
| KE_TOAN | student, hoso (view) | trạng thái ∈ {hop_le, da_thu_dot1, xep_khoa, da_bao_so, dang_hoc} |
| GIAO_VIEN | student, hoso (view) | trang_thai_ho_so = 'dang_hoc' và giao_vien_id = ctx.current_giao_vien_id |
| GIAO_VIEN | enrollment (view) | ma_gv = ctx.current_ma_gv |
| GIAO_VIEN | course (view) | khoa_hoc_id ∈ ctx.current_assigned_khoa_ids |
| HOC_VIEN | student, hoso (view) | nguoi_lxid = ctx.current_nguoi_lxid |
| HOC_VIEN | course (view) | khoa_hoc_id ∈ ctx.current_khoa_ids |
Biến ngữ cảnh không đổi: current_giao_vien_id/current_ma_gv (teacher tra) · current_nguoi_lxid/current_ma_dk_list/current_khoa_ids (nay do training tra thay vì student) · current_assigned_*.