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ỗ.
| Feature | BO chính | Action |
|---|---|---|
| rule | Quy tắc nhắc hạn | viewconfigure |
| message | Thông báo đã gửi (log) | viewsendexport |
| channel | Kênh gửi (Zalo OA/SMS/app/email) | viewconfigure |
| BO | Trườ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áo | Nguồ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ênh | Cấu hình Zalo OA (app id, token) · SMS brandname · template tin theo kênh |
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>.
⚠️ Action đặc thù (send) cần bổ sung vào validator manifest — xem plan data-scope P1.
| Feature | QTHT | GIAM_DOC | QL_DAO_TAO |
|---|---|---|---|
| rule | W | R | W |
| message | W | R | R |
| channel | 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ù: message +send (QTHT, QL_DAO_TAO)