Toàn lộ trình · CP – WS – Module – Feature · 06/7/2026

Sơ đồ phân rã WS · Module · Business Object · Action

Đề xuất tổng thể dựa trên nghiệp vụ trường lái xe phổ biến — không bám theo code hiện có. Bản chi tiết: markdown.

0

Nguyên tắc chia

TầngRanh giớiQuy tắc quyết định
WorkspacePháp nhân + cơ sở dữ liệuMỗi WS = 1 chủ thể chịu trách nhiệm pháp lý, 1 DB riêng. Chi nhánh (ma_csdt) là thuộc tính trong WS — không tách WS
ModuleĐơn vị đóng gói – cài – bán/licenseTách khi: bán riêng theo gói · vòng đời nâng cấp riêng · người dùng chính khác · cài/gỡ độc lập
FeatureNhóm quyền + mục menuMỗi feature ôm 1 nghiệp vụ con — là đơn vị gán quyền
Business ObjectChứng từ / đối tượng dữ liệuMỗi feature có 1 BO chính (+ BO phụ theo vòng đời)
ActionThao tác trên BOBộ chuẩn view create edit delete import export approve assign configure report + action đặc thù khai qua customActions (chip vàng bên dưới)
Trọng số 4 điều kiện tách module (bổ sung 20/7): điều kiện ③ "người dùng chính khác nhau" là yếu nhất — gần như không bao giờ đủ để tách module, vì tầng feature đã lo tách quyền theo người dùng rồi (dat.device cho kỹ thuật và dat.reconcile cho giáo vụ là hai permission key khác nhau, cùng một module). Chỉ ① bán riêng · ② vòng đời riêng · ④ cài–gỡ độc lập mới là lý do tách thật. Xem ví dụ áp dụng: Kiến trúc quản lý thiết bị §3.
⚠️ Cấm khai custom action trùng nghĩa core (print → dùng download; in phát hành/in lại = reprint có log) và verb workflow (submit·cancel·reject…) → mô hình hóa bằng trạng thái workflow (hồ sơ huy, báo cáo da_gui), quyền gate bằng action core trên feature.

▸ Phân biệt Feature vs BO (bổ sung 20/7)

Ví dụ xuyên suốt — nghiệp vụ "thu học phí đợt 1": Module tuition ── gói cài đặt/bán: "Học phí & công nợ" Feature receipt ── mục menu "Phiếu thu" + nhóm quyền BO Phiếu thu ── bản ghi dữ liệu (bảng tuition_phieu_thu), có vòng đời Action collect ── thao tác trên BO đó → quyền tuition.receipt.collect
FeatureBusiness Object
Trả lời câu hỏi"Ai được làm gì, ở mục menu nào?""Dữ liệu là cái gì, bản ghi gì?"
Là đơn vị củaquyền + menu (đơn vị gán quyền)dữ liệu (bảng, form, vòng đời, trạng thái)
Xuất hiện ởpermission key module.feature.action · sidebartên bảng, grid, màn hình chi tiết
Bản chất / đặt tênnghiệp vụ con — gọi bằng việc ("thu học phí", "đối soát")chứng từ/đối tượng — gọi bằng tờ/bản ghi ("Phiếu thu", "Kết quả đối soát")
Tương đương thế giớiTab/App + permission set (Salesforce) · menu+group (Odoo)DocType (ERPNext) · Object (Salesforce) · Model (Odoo) · Table (Dataverse)
Vì sao chèn tầng feature giữa quyền và bảng (khác ERPNext/Salesforce gán quyền thẳng trên từng DocType/Object): để quyền không vỡ vụn theo bảng — cấp student.hoso.view là thấy trọn BO chính + BO phụ của feature đó. Chuỗi quyền module.feature.action cố tình bỏ qua BO: mở cửa nào thì thấy trọn bộ BO sau cửa đó. Lưu ý: một BO hiện ở nhiều màn hình vẫn chỉ có 1 feature chủ (nơi khác chỉ tham chiếu/đọc); feature dạng cấu hình vẫn có BO (BO của notify.rule = Quy tắc nhắc hạn); feature quy trình lấy BO kết quả làm BO chính (dat.reconcileKết quả đối soát).

▸ 3 chỗ vá định nghĩa (review 20/7)

Lỗ hổngQuy tắc vá
① Tiêu chí "BO phụ" mơ hồ
chính sơ đồ đã "vi phạm": giayto/lichsu đi kèm vòng đời hồ sơ nhưng tách feature
BO phụ được thăng cấp thành feature khi và chỉ khi nó cần bộ quyền khác BO chính (giấy tờ cần verify riêng, lịch sử cần view-only audit riêng). "Đi kèm vòng đời" chỉ là điều kiện cần — phép thử quyết định là nhu cầu quyền riêng.
② Enrich chéo đi vòng qua quyền
xem list học viên kèm tên khóa không cần course.course.view
Chấp nhận cho cột nhãn, nhưng chặn rò rỉ bằng quy tắc: contract view chỉ chứa cột định danh + nhãn hiển thị (mã, tên, trạng thái); dữ liệu nhạy cảm (tiền, lương, scan giấy tờ) không bao giờ vào contract view — đọc phải qua service API check quyền feature nguồn. → đã ghi thành quy tắc cứng trong Quan hệ module §4.
③ Quyền theo transition chưa có chỗ
ai được duyệt ≠ ai được hủy ≠ ai được bàn giao — gate chung bằng edit/approve không phân biệt được
Khi một BO có >2 transition cần quyền khác nhau → khai transition đó như custom action của feature (hoso.huy, hoso.transfertransfer đã đi đúng hướng này), không đẻ feature mới, không nhét chung vào edit. Tham khảo: ERPNext workflow gán role theo từng transition.
⚠️ Tuyên bố ngoài phạm vi — field-level security (ẩn cột lương với vai X): mô hình không hỗ trợ, xử lý bằng cách tách feature (①); chiều record-level đã có data-scope (ma_csdt, current_dept_id). Ghi rõ để sau này không ai vá chui bằng if-else trong UI.
1

Control Plane & số lượng Workspace

CONTROL PLANE (1) users · workspaces · RBAC · SSO · store/license │ ├── WS admin-console (1) vận hành nền tảng ├── WS demo/sandbox (1) trình diễn bán hàng │ ├── WS ĐÀO TẠO × N MỖI TRUNG TÂM ĐÀO TẠO = 1 WS │ GĐ1: Vĩnh An là WS đầu tiên · nhiều cơ sở → vẫn 1 WS (ma_csdt) │ └── WS SÁT HẠCH × M (v3) MỖI TRUNG TÂM SÁT HẠCH = 1 WS RIÊNG tách khỏi WS đào tạo dù cùng chủ đầu tư: chu kỳ kiểm chuẩn BCA riêng · dữ liệu kỳ thi thuộc hội đồng · phần mềm niêm phong theo phiên bản
Có nên tách WS đào tạo / WS sát hạch? — Nên. Ranh giới đúng là tách theo "hệ được thẩm định": ôn luyện xe chip & vận hành cho-mượn-sân vẫn nằm trong WS đào tạo (tự do công nghệ, nguồn thu của trung tâm); chỉ hệ sát hạch chính thức (chấm thi, giám sát, truyền CSGT — phải thẩm định BCA) mới sang WS sát hạch.
2

WS đào tạo — module theo giai đoạn

MVP · 9 module v1.5 · +7 v2 · +5 v3 · +1 (bi) · chip vàng = action đặc thù · NEW = chưa có trong code · bấm tên module để xem chi tiết

▸ MVP — Lõi tuân thủ

catalogDanh mục dùng chung
licenseHạng GPLX (km/giờ, tuổi, hạn)
viewcreateeditimport
doc-typeLoại giấy tờ + checklist theo hạng
vieweditconfigure
khácHạng đào tạo · Trình độ · Môn học · Quy tắc sinh mã
vieweditconfigure
studentHọc viên & hồ sơ
studentHọc viên (danh bạ người)
viewcreateeditexport
hosoHồ sơ ghi danh theo khóa (state machine)
viewcreateeditapprovetransfer
giaytoGiấy tờ hồ sơ (scan, hạn)
viewcreateverify
lichsuLịch sử trạng thái (audit)
viewexport
courseKhóa học & xếp lớp
courseKhóa học
viewcreateeditclose
enrollmentGhi danh + phân công GV–xe
viewcreateassign
planKế hoạch đào tạo (trình Sở)
viewcreateapprovereport
teacherGiáo viên
teacherGiáo viên (hồ sơ nghiệp vụ)
viewcreateeditexport
certChứng chỉ GV + hạn
vieweditconfigure
assignmentPhân công dạy (khớp đăng ký Sở)
viewassignreport
vehicleXe tập lái
vehicleXe tập lái
viewcreateeditexport
license-docGiấy phép xe, đăng kiểm, bảo hiểm (hạn)
vieweditconfigure
device-bind→ chuyển sang dat.binding (20/7); vehicle chỉ đọc dat_v_thiet_bi_theo_xe
datThiết bị & dữ liệu DATPainkiller
deviceThiết bị DAT (seri, sim, hạn)
viewcreateedit
bindingGắn/tháo thiết bị vào xe (lịch sử theo thời điểm) — từ vehicle
viewassignexport
sessionPhiên học DAT (km/giờ)
viewimportexcludeexport
reconcileKết quả đối soát theo học viên/hạng
viewreconcilereport
alertCảnh báo thiếu km/giờ, lệch GV/xe
viewconfiguresend
logNhật ký truyền
view
tuitionHọc phí & công nợNEW
pricelistBảng học phí theo hạng/khóa
vieweditapprove
installmentCông nợ theo đợt
viewcreateeditexport
receiptPhiếu thu
viewcollectrefundreprint
discountMiễn giảm
viewcreateapprove
reportBáo cáo Sở XDPainkillerNEW
templateMẫu báo cáo (version theo thông tư)
viewconfigure
so-xdBáo cáo đã lập (KH đào tạo, DS học viên, tốt nghiệp)
viewgenerateapprovedownload
registrySổ đã nộp (immutable)
viewexport
notifyNhắc hạn & thông báoNEW
ruleQuy tắc nhắc hạn (giấy tờ GV/xe/HV)
viewconfigure
messageThông báo đã gửi (Zalo OA/SMS/app)
viewsendexport

▸ v1.5 — LMS · App · Back-office

lmsLý thuyết chuẩn giám sát
classLớp/buổi lý thuyết viewcreateedit
attendanceĐiểm danh khuôn mặt viewcheckinexport
question-bankNgân hàng 600 câu (config) viewimportconfigure
mock-examThi thử + kết quả viewscore
resultKết quả lý thuyết (xét điều kiện) viewapprovereport
crmTuyển sinh
leadLead (Zalo/FB/web) viewcreateassignconvert
campaignNguồn/chiến dịch vieweditreport
commissionHoa hồng CTV viewapproveexport
financeKế toán & HĐĐT
invoiceHóa đơn điện tử viewissuevoidexport
ledgerSổ thu–chi, doanh thu viewreport
reconcileĐối soát doanh thu viewreconcile
payrollLương giáo viên
timesheetBảng công từ giờ DAT/chip viewgenerateedit
salaryBảng lương viewgenerateapproveexport
hrNhân sự
employeeNhân viên (phòng, chức danh) viewcreateedit
orgPhòng ban · chức danh (cây) viewconfigure
contractHợp đồng, chứng chỉ tập huấn vieweditconfigure
fleetĐội xe & tài sản
fuel / maintenanceNhiên liệu theo km DAT · Bảo dưỡng viewcreateapprove
cost / assetChi phí đầu xe · Tài sản, khấu hao, kho viewreportexport
portalBackend app học viên
accountTài khoản app viewcreatereset
progressTra cứu tiến độ km/giờ view
bookingĐặt lịch bổ túc viewbookapprove
practiceÔn 600 câu, thi thử view

▸ v2 — Sân bãi & bán thêm · v3 — BI

chipXe chip ôn luyện
device / lessonThiết bị chip · 12 bài sa hình (config) viewconfigure
sessionPhiên ôn + kết quả/lỗi từng bài viewimportscoreexport
bookingThuê xe chip & sân
calendar / rentLịch sân/xe · Phiên thuê · Bảng giá viewbookcollectreport
examopsVận hành kỳ sát hạch (mượn sân)
exam / rosterKỳ thi · DS thí sinh · Điều phối xe/sân · Doanh thu thuê viewcreateassignreport
paymentThanh toán online
transactionGiao dịch cổng · Đối soát cổng viewrefundreconcile
certChứng chỉ nghề
program / issueChương trình nghề (config) · Chứng chỉ cấp (tái dùng student+lms) viewcreateapprovedownload
biDashboard đa module (v3)
dashboardTỷ lệ đậu theo GV/xe/khóa · hiệu suất sân · chi phí/học viên viewreportexport
3

WS sát hạch (v3) — 8 module

WS riêng cho mỗi trung tâm sát hạch — phần mềm thẩm định BCA, release theo phiên bản kiểm chuẩn (không cập nhật kiểu SaaS).

ModuleFeature / BO chínhAction đặc thù
scheduleKỳ sát hạch · hội đồng · ca thi · DS thí sinhviewcreateassignlock
kioskCheck-in thí sinh · đối chiếu khuôn mặt · số báo danhviewcheckinverify
theoryPhòng máy · đề thi (trộn 600 câu, điểm liệt) · bài thi · biên bảngeneratescoredownload
yardXe sát hạch · bài sa hình · kết quả chấm tự động · log niêm phongscoresealexport
roadLộ trình đường trường · kết quả chấm · bảng nút SH viênscoreexport
motoSát hạch A1/A2 (sân mô tô)scoreexport
monitorCamera xe/sân/phòng thi · màn hình công khai điểm · lưu vếtviewbroadcastexport
gatewayGói tin truyền Cục CSGT · nhật ký truyền/bùtransmitretryreport
4

Tổng hợp số lượng

1
Control Plane
2 + N + M
Workspace (hệ thống + đào tạo + sát hạch)
9 → 16 → 21
Module / WS đào tạo (MVP → v1.5 → v2)
8
Module / WS sát hạch (v3)
2–5
Feature / module
4–8
Action / BO (10 chuẩn + ~17 đặc thù)
⚠️ Đây là sơ đồ mục tiêu để định hướng đóng gói & bán theo gói. Khi implement từng giai đoạn có thể gộp/tách feature theo thực tế — miễn giữ nguyên tắc mục 0. Đối chiếu hiện trạng code: 6 module đã scaffold (catalog, student, course, teacher, vehicle, dat — cần thêm feature), GĐ1 cần scaffold mới tuition · report · notify.

▸ Đối chiếu với module đã có trong code (tham khảo)

Đề xuấtHiện có trong ws_sunsGhi chú
catalog, student, course, teacher, vehicle, dat✅ đã scaffold (.ogapp)student cần thêm feature hoso/giayto; dat cần thêm session/reconcile/alert
tuition, report, notify❌ chưa cóGĐ1 phải scaffold (tuition/report đã có schema đề xuất)
hr, payroll, crm (v1.5)built-in hrm, crm phủ sẵn (18 model HRM)Không scaffold mới — built-in + phần đặc thù mỏng (GV↔Employee, timesheet-DAT, convert lead→hồ sơ, hoa hồng CTV)
phòng ban / chức danhbuilt-in org (OrganizationalUnit + Position)Seed danh sách Vĩnh An vào org từ MVP — không tạo danh mục riêng
lms, finance, fleet, portal❌ chưa cóv1.5 — còn 4 module mới (thay vì 7)
chip, booking, examops, payment, cert, bi❌ chưa cóv2–v3
rfcard (hiện có)giữ như module hạ tầng nhỏ, phục vụ điểm danh/DAT
workflow, workplace, system, iam (built-in)✅ có sẵn lúc bootworkflow để dành (duyệt/connector); workplace disable ở Vĩnh An; system = quyền hạ tầng; iam chờ RT-16
account, base (hiện có)demo, không cài