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

notify — Nhắc hạn & thông báo MVP NEW

Hạ tầng nhắc hạn + gửi thông báo dùng chung: quét hạn giấy tờ (GV/xe/học viên), nhận cảnh báo từ module khác (dat, tuition) và gửi qua Zalo OA / SMS / app / email. Tách riêng vì mọi module đều cần, kênh gửi cấu hình một chỗ.

⚠️ Chưa có trong code — scaffold mới. Kênh Zalo OA phụ thuộc việc #1 (anh Hưng đăng ký OA).
1

Feature / BO / Action

FeatureBO chínhAction
ruleQuy tắc nhắc hạnviewconfigure
messageThông báo đã gửi (log)viewsendexport
channelKênh gửi (Zalo OA/SMS/app/email)viewconfigure
2

Luồng hoạt động

teacher/vehicle/student (trường hạn) ──job quét hằng ngày──▶ rule (ngưỡng 30/15/7 ngày) dat.alert · tuition (hạn đóng) ──────yêu cầu gửi────────────▶ notify ▼ chọn kênh + template → gửimessage log (append-only) lỗi → retry theo config · Zalo hết token → cảnh báo QTHT
3

Dữ liệu chính

BOTrường chính
Quy tắcĐối tượng (chứng chỉ GV / giấy tờ xe / khám SK / hạn học phí / thiếu km-giờ) · nguồn trường hạn · ngưỡng nhắc (30/15/7…, lặp lại đến khi xử lý) · kênh + người nhận theo vai trò · trạng thái
Thông báoNguồn (rule/module yêu cầu) · người nhận (SĐT/Zalo id) · kênh (zalo_oa/sms/app/email) · nội dung theo template · trạng thái (chờ/đã gửi/lỗi + retry) · thời gian — append-only
KênhCấu hình Zalo OA (app id, token) · SMS brandname · template tin theo kênh
4

Quy tắc & liên kết

Quy tắc nghiệp vụ

  • Mỗi (đối tượng × ngưỡng) chỉ gửi 1 lần — không spam
  • Module khác không tự gửi tin — đẩy qua notify, log tập trung
  • Log gửi = bằng chứng đã thông báo (tranh chấp học phí/hạn giấy tờ)
  • Học viên nhận Zalo OA/app · nhân viên nhận theo vai trò trong rule

Liên kết chéo

  • teacher/vehicle/student — nguồn trường hạn
  • dat — cảnh báo thiếu km/giờ, lệch GV/xe
  • tuition — nhắc hạn đóng đợt
  • portal (v1.5) — đẩy vào app học viên

⚠ Câu hỏi mở

  • Zalo OA đăng ký xong chưa (việc #1)? ZNS hay tin OA thường?
  • Có dùng SMS brandname không (chi phí)?
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 đủ: notify.main.<feature>.<action>.

▸ permissions[] — manifest.json

[ { "group": "main", "feature": "rule", "label": "Quy tắc nhắc hạn", "actions": [ "view", "configure" ] }, { "group": "main", "feature": "message", "label": "Thông báo đã gửi", "actions": [ "view", "send", "export" ] }, { "group": "main", "feature": "channel", "label": "Kênh gửi", "actions": [ "view", "configure" ] } ]

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

▸ Ma trận vai trò × feature

FeatureQTHTGIAM_DOCQL_DAO_TAO
ruleWRW
messageWRR
channelW

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ù: message +send (QTHT, QL_DAO_TAO)