Staff — Khái niệm & kiến trúc
Domain Staff chủ yếu là frontend hiển thị (Tuke/Topi) trên dữ liệu nhân sự, lịch ca, nghỉ phép. Dưới đây là các khái niệm và quy tắc dữ liệu cốt lõi.
Các khái niệm
| Khái niệm | Nghĩa |
|---|---|
| Employee | Bản ghi nhân viên trong một BU. Một người có thể có nhiều Employee (cross-BU). |
| enterpriseUserId | Danh tính người xuyên BU — dùng để gộp (dedupe) các Employee của cùng một người. |
| Roster / Shift | Lịch ca làm; mỗi ca là một Shift có khoảng thời gian. |
| Leave | Nghỉ phép: có khoảng ngày/giờ, tracking code, vòng trạng thái (request→approve). |
| TrackingCode | Mã phân loại; TypeId = Leave hoặc Shift. Form leave chỉ hiện loại Leave. |
| Availability | Lịch rảnh khai báo theo thứ trong tuần (các time slot). |
| Timetable | Thời khóa biểu hiển thị (Syncfusion ScheduleComponent). |
Quy tắc dedupe trong Weekly Planner
Một người chỉ được một dòng trong planner, kể cả khi có nhiều bản ghi:
- Người có cả bản ghi BU-đang-chọn lẫn cross-BU → giữ
employeeIdcủa BU đang chọn làm canonical resource id. - Người không có cả hai identity → vẫn là dòng riêng.
- Sort áp dụng sau role-filter + merge. Không gồm staff archived (đã loại theo employee-link contract).
Invariant:
INV-ROSTER-WP-001 v3.
Quy tắc hiển thị Leave trùng ca
Khi xếp/sửa ca, popup hiện trường Leave (read-only) nếu có leave giao với khoảng ca:
- Đánh giá bằng giao khoảng thời gian (date-time interval intersection), không phải so trùng ngày.
- Trường gồm ngày/giờ leave + tracking code; ẩn khi không giao.
Invariant:
INV-ROSTER-LEAVE-DISPLAY-001 v1. Áp dụng cho Weekly Planner shift popup, Timesheet rows, và Timesheet exports.
Quy tắc Tracking Code
- Form leave (create/edit/approve) chỉ hiển thị code có
TrackingCode.TypeId = Leave. - Code loại Shift bị loại khỏi selector của leave.
Quy tắc sort & UI thuần hiển thị
Nhiều spec Staff là display-only (không đổi persistence/API):
| Nơi | Quy tắc |
|---|---|
| Availability time slots | Sort theo start time tăng dần, theo từng thứ. |
| Edit Time Slot popup templates | Sort theo start time tăng dần (trong tập đã load). |
| Timetable controls | Một bộ điều khiển duy nhất; header ScheduleComponent là source of truth cho range/view. |
| Staff Home header | Title trái; action area phải theo thứ tự cố định. |
| Leave drawer | Layout gọn, paired date/time; thu gọn khi viewport hẹp. |
Kiến trúc (mức cao)
Phần lớn quy tắc nằm ở frontend (sort, dedupe hiển thị, layout). API/persistence ở Tux giữ nguyên với nhiều thay đổi display-only. Khi cần đổi hành vi dữ liệu (vd dedupe canonical id), kiểm tra cả hai phía.
Tiếp theo: Case thường gặp.