Appearance
Time and Attendance — Technical Map
Route / page map
| Surface | Route family | Main page / components |
|---|---|---|
| Work shift | ROUTE_SETTING_WORK_SHIFT* | ShiftSetting.tsx, WorkShiftTable.tsx, WorkShiftForm.tsx |
| Shift group | ROUTE_SETTING_SHIFT_GROUP* | ShiftSetting.tsx, ShiftGroupTable.tsx, ShiftGroupForm.tsx |
| Holiday | ROUTE_SETTING_HOLIDAY* | HolidaySetting.tsx, HolidayTable.tsx, HolidayForm.tsx |
| Annual leave | ROUTE_ANNUAL_LEAVE | AnnualLeave.tsx |
| Shift page | ROUTE_SETTING_SHIFT_PAGE | ShiftPage.tsx |
| Approver | ROUTE_SETTING_APPROVER_* | ApproverPage.tsx, SettingApprover* wrappers |
Data model map
| Surface | Model chính |
|---|---|
| Work shift | time_slot_template |
| Shift group | time_slot_group, time_slot_group_shift, time_slot_group_user |
| Holiday | holiday, holiday_view |
| Approver | request_approver |
| Annual leave | app_setting.app_settings.request_leave |
| Shift page | app_setting.app_settings.working_page_money |
Boundary với module khác
| Module | Boundary kỹ thuật |
|---|---|
timekeeping | consume holiday/shift config và approver outcome |
hrm | owner thật của normalized time config tables |
settings global singleton | owner của annual leave và shift page |
Rủi ro / Findings kỹ thuật
| Mức | Finding |
|---|---|
| Cao | Route-level permission chủ yếu khóa ITLeader/ITStaff, nhưng component runtime ở work shift / holiday vẫn allow thêm HRLeader. |
| Cao | AnnualLeave.tsx đang format “tháng reset” bằng setDate, nên semantics month/date bị lệch. |
| Cao | ShiftPage.tsx dùng loading và isEditing không nhất quán; handleCancel() set loading nhưng không reset rõ. |
| Trung bình | holiday update path là delete+insert, không phải update canonical. |
| Trung bình | HolidayTable có dấu hiệu dùng field id không ổn định so với shape query holiday_view. |