Skip to content

Module Overview — Timekeeping Request Working Schedule

1. Scope

Flow này không nằm gọn trong 1 page WorkingSchedule. Nó cắt qua:

  • frontend timekeeping routes cho WorkingScheduleWorkingTimeSheet,
  • backend actions createRequestWorkingSchedule, updateDataRequestWorkingSchedule, changeStatusRequestWorkingSchedule,
  • event triggers request_working_schedule_insert, request_log_insert, request_working_schedule_update,
  • direct CRUD của time_slot_user qua Hasura mutation upsertTimeSlotUser,
  • timesheet read model time_slot_time_keeping,
  • salary/timekeeping side effects ở request_working_schedule_update.

Mental model nên giữ từ đầu:

  • request_working_schedule là approval/request engine generic,
  • time_slot_user là schedule source cho lịch làm việc tuần,
  • time_slot_time_keeping là actual attendance log/projection,
  • WorkingTimeSheet là UI merge layer của attendance + approved requests.

2. Bức tranh kiến trúc

text
Request engine path
  -> createRequestWorkingSchedule / updateDataRequestWorkingSchedule
  -> request_working_schedule + request_log + approver chain
  -> changeStatusRequestWorkingSchedule
  -> request_working_schedule_update event
  -> mutate salary / timekeeping / other domains + notification

Direct schedule path
  -> WorkingSchedule / import Excel
  -> delete_time_slot_user in range
  -> insert_time_slot_user
  -> no approval step

Timesheet read path
  -> ListTimeKeeping(time_slot_time_keeping)
  -> ListRequestWorkingSchedule(approved only)
  -> store merge by employee
  -> WorkingTimeSheetItem render request overlays and clocking flags

3. Frontend Surface

3.1 Route families

FamilyRoute groupBoundary
Working schedule/timekeeping/working-scheduleTuần làm việc, create/edit/import/export
Working timesheet/timekeeping/working-sheetBảng công tháng, merged projection

3.2 Permission/runtime map

BoundaryGhi chú
Route config working_scheduleCho ITLeader, ITStaff, BranchPOS và call-center tree
Route config working_sheetCho cả BranchPOS
Navigation submenu working_sheetChỉ cho ITLeader, ITStaff
Write pathWorkingScheduleCreate và import Excel đều dùng upsertTimeSlotUser, không gọi request actions

4. Backend Boundary Map

LớpFile chínhVai trò
Actioncreate_request_working_schedule.goTạo request, validate quota/annual leave, insert request
Actionupdate_data_request_working_schedule.goChỉnh sửa request pending, reinsert files/items/clock_in_out_items
Actionchange_status_request_working_schedule.goApprove/reject/cancel/recall, validate approver chain, ghi request log
Eventrequest_working_schedule_insert.goTính capture leave balance, gửi notification pending
Eventrequest_log_insert.goGửi notification approved/rejected/canceled/next-step pending
Eventrequest_working_schedule_update.goApply side effects vào timekeeping, salary, negative payment, task status

5. Data Layer Map

LayerObject chínhVai trò
Request corerequest_working_scheduleGeneric request record cho leave, remote, overtime, clock in/out, device, negative payment, doctor commission
Request auditrequest_log, request_approverApproval chain và action history
Request nested datarequest_clock_in_out_item, request_working_schedule_item, hrm_reference_fileChi tiết item/file theo loại request
Schedule sourcetime_slot_user, time_slot_template, time_slot_group_userLịch làm việc tuần và shift template
Attendance projectiontime_slot_time_keepingLog chấm công, late/early/off, auto update reason

6. Semantic Rules Cần Nhớ

  1. request_working_schedule không phải table riêng cho "lịch làm việc"; nó là request bus cho nhiều request families trong HRM và ecommerce side effects.
  2. Page WorkingSchedule đang không dùng request bus; nó mutate time_slot_user trực tiếp bằng delete + insert trong khoảng tuần.
  3. Page WorkingTimeSheet chỉ load request_working_schedulestatus_id = approved, nên rejected/pending requests không đi vào projection.
  4. Approve request có thể đi qua nhiều bước: nếu chưa tới bước cuối, action ghi approved_step_one thay vì approved hoàn toàn.
  5. request_working_schedule_update event mới là nơi apply timekeeping/salary side effects khi status đổi.

7. Rủi ro / Findings

IDMứcFinding
F-01P0Write model đang tách đôi: schedule page/import ghi thẳng time_slot_user, còn approval engine nằm ở request_working_schedule; hai nhánh này không bị buộc đi cùng nhau.
F-02P0request_working_schedule là engine generic, nhưng tên module/timekeeping dễ làm người đọc hiểu sai là chỉ phục vụ lịch làm việc.
F-03P1WorkingTimeSheet là merged projection từ time_slot_time_keeping + approved requests trong store, nên nếu chỉ test query attendance sẽ bỏ sót request overlay logic.
F-04P1Permission drift có thật: route working_sheet cho BranchPOS, nhưng navigation submenu lại không hiện cho role này.
F-05P1Import lịch làm việc xóa toàn bộ time_slot_user trong range tuần cho tập user trước khi insert lại, nên đây là overwrite batch chứ không phải merge an toàn.
F-06P1Event update request có side effects vượt xa timekeeping, gồm salary, negative payment, project task; QA nếu chỉ nhìn module timekeeping sẽ thiếu phạm vi thật.