Skip to content

Shared Rules — Timekeeping Request Working Schedule

1. Thuật ngữ chuẩn

Thuật ngữNghĩa trong hệ thống
Request working scheduleRecord ở request_working_schedule; generic request object cho nhiều loại đơn
Direct scheduleBản ghi time_slot_user được tạo/sửa trực tiếp từ page lịch làm việc hoặc import
TimesheetProjection time_slot_time_keeping cộng với overlay của approved requests
Request logAudit trail ở request_log cho approve/reject/cancel/step transitions
Original slottime_slot_user gốc mà request như change_shift đang tham chiếu qua original_slot_id

2. State Matrix

2.1 request_working_schedule

StateDấu hiệu DBÝ nghĩa
Pendingstatus_id = pendingChờ duyệt bước hiện tại
Approved step onestatus_id = approved_step_oneĐã qua một bước duyệt nhưng chưa final
Approvedstatus_id = approvedFinal approved, được đưa vào side effects/projection
Rejectedstatus_id = rejectedBị từ chối
Canceled / recalledstatus_id = canceled hoặc recalledBị hủy/thu hồi theo semantics riêng

2.2 time_slot_user

StateDấu hiệu DBÝ nghĩa
Active slotdisabled = falseCa làm việc tuần đang có hiệu lực
Deleted/overwrittenBị delete trong mutation import/upsert rangeKhông còn trong lịch tuần hiện hành

3. Invariants

  1. Chỉ request ở trạng thái pending mới được updateDataRequestWorkingSchedule.
  2. Không phải ai cũng được approve/reject; changeStatusRequestWorkingSchedule kiểm tra reviewer chain và owner rules.
  3. WorkingTimeSheet chỉ overlay approved requests.
  4. Import lịch làm việc là destructive update theo tuần/user, không giữ lại slot cũ trong range.
  5. time_slot_user.requests chỉ nối sang các request qua original_slot_id, tức request overlay là sidecar của slot gốc chứ không thay trực tiếp slot record.

4. Boundary Rules

BoundaryRule
timekeeping -> settingsShift template/group là source để build slot từ form/import
timekeeping -> userDepartment/branch/account filters quyết định tập user được nhìn/sửa
timekeeping -> salaryApprove/cancel một số request sẽ recalc salary và ngày công
timekeeping -> ecommerce/projectsCùng request engine còn chạm negative payment, device handover, doctor commission, task status

5. Những điều dễ hiểu nhầm

5.1 "Lịch làm việc" không đồng nghĩa "đơn lịch làm việc"

Page WorkingSchedule hiện đang thao tác time_slot_user trực tiếp. Nó không phải UI của createRequestWorkingSchedule.

5.2 Approved request không đồng nghĩa slot gốc đã bị rewrite

Timesheet UI overlay approved request từ store và request metadata. Một phần semantics được render ở component, không phải luôn phản ánh bằng mutation trực tiếp vào slot record.

5.3 Request engine là generic, không phải domain-pure

Cùng request_working_schedule engine đang xử lý leave, remote, clock in/out, device, negative payment, doctor commission. Vì vậy mọi rule change ở engine này có blast radius vượt timekeeping.

6. Checklist QA ngắn

  1. Tách test direct schedule create/import khỏi test request approval.
  2. Test import overwrite theo tuần với nhiều user, không chỉ test insert thành công.
  3. Test multi-step approval và trạng thái approved_step_one.
  4. Test timesheet popup hiển thị approved requests đúng ngày và đúng behavior.
  5. Test side effects approval/reject lên annual leave balance, timekeeping flags và salary where applicable.