Staff — Case thường gặp
"Một người hiện 2 dòng trong Weekly Planner"
Không được phép — planner dedupe một người = một dòng. Nếu thấy 2 dòng, kiểm tra:
- Người đó có
enterpriseUserIdkhông? Nếu có → phải dedupe theoenterpriseUserId. - Thiếu
enterpriseUserId→ dedupe theoemployeeId. - Có giữ đúng
employeeIdcủa BU đang chọn làm canonical resource id không?
Người thiếu cả hai identity thì được là dòng riêng (đúng theo
INV-ROSTER-WP-001 v3).
Ví dụ thực tế: Nhân viên làm ở 2 BU, planner hiện 2 dòng. → Mỗi người một dòng để xếp ca không nhầm. → Dedupe theo
enterpriseUserId(hoặcemployeeIdcủa BU đang chọn) → gộp về một dòng.
"Xếp ca nhằm lúc nhân viên đang nghỉ"
Popup Create/Edit Shift hiện trường Leave read-only khi có leave giao khoảng ca. Nếu không thấy cảnh báo dù biết có nghỉ:
- Kiểm tra đánh giá có theo interval thời gian không (không phải so trùng ngày). Leave
09:00–11:00và ca10:30–12:00giao nhau → phải hiện. - Trường này cũng áp dụng ở Timesheet rows và Timesheet exports.
Ví dụ thực tế: Quản lý xếp ca
10:30–12:00cho người đang nghỉ09:00–11:00. → Hai khoảng giao nhau. → Hiện trườngLeaveread-only trong popup.
"Form admin leave hiện cả tracking code loại Shift"
Sai — form admin create/edit/approve chỉ hiện code TypeId = Leave; form staff không có Tracking Code hoặc Notes. Selector có code Shift → lọc sai.
Ví dụ thực tế: Duyệt đơn nghỉ, selector lại hiện code loại Shift. → Chỉ cho chọn code hợp lệ. → Lọc
TypeId = Leave, loại code Shift khỏi form create/edit/approve.
"Time slot hiển thị lộn xộn theo giờ"
- Availability slots sort theo start time tăng dần trong từng cột thứ, bất kể thứ tự API trả.
5:00 AM–9:30 AMđứng trước2:30 PM–6:30 PM; không dời slot sang thứ khác.- Edit Time Slot popup templates cũng sort theo start time.
"Timetable có 2 bộ nút điều hướng ngày"
Trang /staff/timetable chỉ có một bộ điều khiển ngày/view; header Syncfusion ScheduleComponent là source of truth cho prev/next/today + đổi view. Bộ thứ hai (custom date-range selector) → thừa, bỏ; nhãn range phải khớp lưới đang render.
"Roster hiện absence chưa duyệt"
Weekly Planner chỉ hiển thị absence đã approved (approved-only). Absence chưa duyệt không lên planner.
Ví dụ thực tế: Nhân viên vừa nộp đơn, quản lý đã thấy "nghỉ" trên planner. → Chỉ phản ánh nghỉ đã duyệt để xếp ca tin cậy. → Absence pending không lên planner; duyệt xong mới hiển thị.
"Shift chưa gán staff có phải Open Shift?"
Chỉ đúng khi shift đã publish. Shift chưa gán staff nhưng chưa publish vẫn là draft của admin, không hiện cho staff claim.
Ví dụ thực tế: Admin tạo ca Thứ 3
15:00–17:00chưa chọn staff. → Chưa publish là draft. → Không hiện ở staff portal; publish xong mới vào Open Shifts.
"Hai staff cùng nhận một Open Shift"
Claim phải là single-winner: chỉ staff đầu tiên gán thành công; người còn lại nhận conflict.
Ví dụ thực tế: An và Bình cùng bấm claim ca Thứ 5
07:00–09:00. → Tránh gán trùng một ca. → Một người được gánEmployeeId; người còn lại thấy ca hết claimable sau refresh.
"+New Leave hay Add Leave?"
Đúng wording là +New Leave. Nếu thấy Add Leave → cũ, cần đổi. Nút mở đúng drawer tạo leave hiện có.
"Leave drawer chật/khó dùng trên màn nhỏ"
Drawer dùng một Date; Start/End Time bắt buộc nằm cùng hàng khi đủ rộng. Viewport hẹp → các control paired thu gọn không chồng text, label, input, summary hoặc action.
Ví dụ thực tế: Admin tạo leave trên laptop hẹp. → Vẫn thấy đủ thời gian và nút Save. → Time control xuống hàng; không có date range hoặc
All Day.
"Open Leave có phải Open Shift?"
Không. Open Shift là ca đã publish nhưng chưa gán staff; Open Leave là leave không có ShiftId.
Ví dụ thực tế: Lan chưa có ca Thứ 4, xin nghỉ
13:00–15:00. → Không có shift để chọn. → Dùng Open Leave; không tạo hoặc claim Open Shift.
"Open Leave giao published shift"
Open Leave không được giao active published shift cùng ngày, bất kể BU dùng restriction nào. Nếu đã có ca, tạo leave bằng Shifts.
Ví dụ thực tế: Ca của Nam
09:00–17:00, Open Leave13:00–15:00. → Khoảng nghỉ thuộc ca đã xếp. → API chặn Open; người dùng chọn ca trong Shifts.
"Không có Availability thì tạo Open Leave được không?"
Published Shifts Only: không có Open.Shifts & Availability: staff bị chặn; admin nhận warning và có thể confirm.No Restrictions: staff không bị Availability chặn; admin ngoài Availability vẫn nhận warning.
Ví dụ thực tế: Mai chưa khai Availability, cần Open Leave Thứ 2. → Kết quả phụ thuộc BU restriction. → Chặn dưới
Shifts & Availability, được phép dướiNo Restrictions.
"Chọn nhiều shifts nhưng một candidate không hợp lệ"
Review và Save dùng một atomic batch. Một candidate lỗi làm toàn bộ batch không được ghi.
Ví dụ thực tế: Admin chọn ba ca, ca thứ hai bị unpublish trước Save. → Tránh tạo hai leave rời rạc. → Server từ chối cả batch; admin review lại.
"Bấm Save hai lần tạo hai Leave giống nhau"
Không. Một active leave trùng employee, Date, TimeStart và TimeEnd bị chặn bằng SLOT_DUPLICATE. Soft-deleted leave không chặn tạo lại slot.
Ví dụ thực tế: Staff double-click Save cho Leave
09:00–12:00ngày 18/07. → Tránh hai đơn giống nhau. → Request sau nhậnSLOT_DUPLICATE; chỉ một active leave được lưu.
"Archive nhân viên có tự tắt login không?"
Có — archive tắt login trong cùng thao tác; restore không tự bật lại.
- Archive đặt
StatusId = ArchivedvàLoginStatusId = Initialisedcùng lúc (áp dụng cho cảEmployeecủa Admin Portal lẫnEnterpriseUsercủa Enterprise Portal). - Dòng archived hiển thị tag "Login Disabled", không bao giờ "Login Enabled".
- Restore giữ nguyên
LoginStatusIdlúc archived; login chỉ được bật lại bằng hành động tường minh.
Ví dụ thực tế: Admin archive staff Quân đang có login
Approved. → Không để staff nghỉ còn quyền đăng nhập. → Cùng thao tác login đặtInitialised; sau restore vẫn giữ cho đến khi admin bật lại thủ công.