Chấm công GV theo giờ dạy thực tế từ dữ liệu DAT / phiên chip — không khai tay; tính lương theo giờ hoặc khoán khóa.
| Feature | BO chính | Action |
|---|---|---|
| timesheet | Bảng công từ giờ dạy DAT/chip | vieweditgenerate |
| salary | Bảng lương (giờ / khoán) | viewexportgenerateapprove |
| BO | Trường chính |
|---|---|
| Bảng công | Kỳ × GV · Σ giờ dạy thực hành (phiên DAT hợp lệ theo ma_gv) · giờ lý thuyết (lms) · điều chỉnh tay (có lý do + người duyệt) |
| Bảng lương | Kỳ × GV · đơn giá giờ / khoán khóa · phụ cấp · khấu trừ · thực lãnh · trạng thái (nháp → duyệt → đã khóa) |
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 đủ: payroll.main.<feature>.<action>.
⚠️ Action đặc thù (generate) cần bổ sung vào validator manifest — xem plan data-scope P1.
| Feature | QTHT | GIAM_DOC | KE_TOAN | NHAN_SU | GIAO_VIEN |
|---|---|---|---|---|---|
| timesheet | R | R | W | R | R² |
| salary | R | RA | W | R | R² |
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ù: +generate bảng công/lương (KE_TOAN)
(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):
(b) Điều kiện record theo vai trò:
| Vai trò | Feature (action) | Điều kiện record |
|---|---|---|
| GIAO_VIEN | timesheet, salary (view) | giao_vien_id = ctx.current_giao_vien_id (bảng công/lương của mình) |
(c) Seed rt_role.grants (kind rule — nhiều rule cùng resource+action = OR):
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.