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

crm — Tuyển sinh v1.5

Quản lý lead tuyển sinh từ Zalo/Facebook/website, phân bổ tư vấn viên, theo dõi chuyển đổi lead → ghi danh, và hoa hồng cộng tác viên.

⚠️ Chưa có trong code — scaffold ở v1.5.
ĐÃ THAY THẾ (08/7): không scaffold module này — dùng crm built-in (+ feature convert, commission). Trang giữ lại làm spec nghiệp vụ tham chiếu. Xem quan hệ module.
1

Feature / BO / Action

FeatureBO chínhAction
leadLead (Zalo/FB/web)viewcreateeditassignconvert
campaignNguồn / chiến dịchviewcreateeditreport
commissionHoa hồng CTVviewexportapprove
2

Dữ liệu chính

BOTrường chính
LeadHọ tên · SĐT/Zalo · nguồn · hạng quan tâm · tư vấn viên phụ trách · trạng thái (mới → đang tư vấn → hẹn nộp hồ sơ → đã ghi danh / mất)
Chiến dịchKênh · thời gian · chi phí · số lead · tỷ lệ chuyển đổi
Hoa hồngCTV (ref hr) · hồ sơ ghi danh thành công · mức/công thức · kỳ chi trả · trạng thái duyệt
3

Quy tắc & liên kết

Quy tắc nghiệp vụ

  • convert tạo hồ sơ bên student và giữ liên kết lead → hồ sơ (đo nguồn hiệu quả)
  • Hoa hồng chỉ ghi nhận khi hồ sơ đạt mốc cấu hình (vd da_thu_dot1) — chống ảo
  • Chống trùng lead theo SĐT; lead trùng học viên cũ → gợi ý nâng hạng
  • Data scope: tư vấn viên chỉ thấy lead mình phụ trách

Liên kết chéo

  • student — convert lead → hồ sơ
  • tuition — mốc thu tiền tính hoa hồng
  • hr — danh sách CTV
  • notify — nhắn Zalo cho lead

⚠ Câu hỏi mở

  • Vĩnh An có đội CTV không, công thức hoa hồng?
  • Kênh lead chính hiện tại (đo trước khi làm)?
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 đủ: crm.main.<feature>.<action>.

▸ permissions[] — manifest.json

[ { "group": "main", "feature": "lead", "label": "Lead tuyển sinh", "actions": [ "view", "create", "edit", "assign", "convert" ] }, { "group": "main", "feature": "campaign", "label": "Chiến dịch", "actions": [ "view", "create", "edit", "report" ] }, { "group": "main", "feature": "commission", "label": "Hoa hồng CTV", "actions": [ "view", "export", "approve" ] } ]

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

▸ Ma trận vai trò × feature

FeatureQTHTGIAM_DOCQL_DAO_TAOTUYEN_SINHKE_TOAN
leadRRRW¹
campaignRRRR
commissionRRAR

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ù: lead +assign,convert (TUYEN_SINH) · campaign +report (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": "lead", "fields": [ "tu_van_vien_id" ], "scopeVars": [ "current_user_id" ] } ]

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

Vai tròFeature (action)Điều kiện record
TUYEN_SINHlead (view, create, edit)tu_van_vien_id = ctx.current_user_id (lead mình phụ trách)

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

[ { "kind": "rule", "module": "crm", "feature": "lead", "actions": [ "view", "create", "edit" ], "predicate": { "op": "cmp", "field": "tu_van_vien_id", "cmp": "=", "value": { "ctx": "current_user_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.

current_user_id engine cung cấp sẵn — không cần ctxVars của module.