Skip to content

Shared Rules — Projects Task Lifecycle And Tour Income

1. Thuật ngữ chuẩn

Thuật ngữTên kỹ thuậtÝ nghĩa
Board dự ánprojectShell tổ chức task, workflow, members
Công việc chaproject_task với parent_id IS NULLTask cấp board
Công việc con / subtaskproject_task với parent_id IS NOT NULLTask con của service/task cha
Người thực hiện chínhmain_assigneeChủ thể chính để KPI workload và overdue gắn vào
Người giao việcassignerNgười phân công
Người giám sátsupervisorChủ thể theo dõi/supervise
Người hỗ trợsupporter, trong code hay ghi supportorAssignee không phải main/supervisor/assigner
Tour fee / tour moneytour_moneyGiá trị tour gắn theo assignee, dùng cho report/salary/customer note
Commission bác sĩrequest_doctor_commissionsQuan hệ từ task sang request_working_schedule qua reference_id = project_task.id

2. Status matrix

Automate board

StatusSourceGhi chú
new_branchtypes.ts:79Default create cho automate board
waiting_branchproject_task_insert.go:193Có thể phát sinh khi tạo request doctor commission
accepted_branchtypes.ts:81Status trung gian theo workflow
inprogress_branchtypes.ts:82Task đang chạy
done_branchtypes.ts:83Trigger nhiều side effect hậu kỳ
canceled_branchtypes.ts:84Status hủy

Personal / my-task

StatusSourceGhi chú
newMyTaskItem.tsx:118Mapped từ new_%
reopenMyTaskItem.tsx:172Mapped từ reopen_%
inprogressMyTaskItem.tsx:158Dựa is_inprogress
reviewingMyTaskItem.tsx:128Mapped từ pending_%
completedMyTaskItem.tsx:138Mapped từ done_%
cancelledtypes.ts:102Chỉ có ở enum FE
missedtypes.ts:102Pseudo-status dựa field computed missed

3. Role matrix của assignee

RoleDấu hiệuSide effect chính
Main assigneemain_assignee = trueKPI workload, overdue KPI, quick-view status guard, salary/tour runtime
Assignerassigner = trueHiện diện trong UI phân công, nhưng helper ids hiện đang bug
Supervisorsupervisor = trueĐược loại khỏi overdue notification user list (notification_task_expired.go:88)
Supporterkhông phải 3 role trênBị naming drift supportor/supporter ở FE

4. Invariants đang ngầm được hệ thống dùng

  1. Task automate mới tạo sẽ rơi vào new_branch, không dựa status đầu của workflow (TaskCreate.tsx:243).
  2. Quick view không cho đổi trạng thái nếu chưa có main assignee (QuickViewTaskDetail.tsx:44).
  3. project_task_assignee là runtime entrypoint quan trọng. Insert/update/delete đều có event triggers (public_project_task_assignee.yaml:143).
  4. request_doctor_commissions được map từ project_task.id -> request_working_schedule.reference_id (public_project_task.yaml:237).
  5. tour_money là data contract liên module, không được xem như UI-only field.

5. Scheduler matrix

RuntimeInputOutputRủi ro
reset_taskautomate task due hôm qua, status inprogress_branch/new_branchreset status về new_branch và delete assigneesmất assignment, đổi workload expectation đột ngột
task_expiredtask overdue chưa done, chưa disabledgửi notification + ghi KPI overduecó thể chồng semantics với reset_task vì cùng chạy 18:00

6. Rules cho tour income

  1. Tour limit report chỉ đếm task done có project_task_assignee.tour_money > 0 ở một số phép đếm (get_list_tour_limit_task_info.go:199).
  2. Nếu main assignee được thêm vào task không phải reopen, hệ thống ghi KPI MetricTotalWorkload (project_task_assignee_insert.go:118).
  3. Nếu xóa main assignee, hệ thống ghi KPI workload âm (project_task_assignee_delete.go:62).
  4. Nếu đổi tour_money, hệ thống cố sync ecommerce_task_log, salary và customer note metadata (project_task_assignee_update.go:164).

7. Findings ưu tiên cao

IDMức độMô tả
SR-F01CaofilterTaskAssignerIds() map nhầm qua filterTaskManagers(), khiến mọi flow dựa vào danh sách assigner ids có nguy cơ sai (useTaskHelper.ts:115).
SR-F02CaoTaskForm dùng e?.assinger thay vì e?.assigner khi xác định supporter, có thể làm lệch phân loại role ở edit form (TaskForm/index.tsx:577).
SR-F03CaoNaming drift POSITION_SUPORTOR, supportor, MY_TASK_STATUES cho thấy FE constants đã nợ kỹ thuật lâu ngày và len vào query/UI (types.ts:67, types.ts:102).
SR-F04Rất caoDoctor commission cancel path có khả năng không cancel đúng request đang mở (project_task_insert.go:229).
SR-F05Rất caoCustomer visit insert sau done_branch dùng time.Now() thay vì DoneAt, có thể làm sai data visit/report theo ngày (project_task_update_1.go:242).

8. QA checklist tối thiểu cho batch này

  • Tạo task automate mới, thêm main assignee, xác nhận parent task auto-advance và KPI workload tăng.
  • Đổi tour_money trên task đã có customer_note, xác nhận ecommerce_task_log, salary và metadata customer note cùng đổi.
  • Chuyển task service sang done_branch với done_at backdate, kiểm tra all_customer_visits.visit_date có bám done_at hay bám ngày hiện tại.
  • Tạo doctor task làm tổng surgery_money nhỏ hơn và lớn hơn order.paid_amount, kiểm tra request doctor commission insert/update/cancel có trúng record.
  • Chạy mô phỏng 18:00 cho reset_tasktask_expired, kiểm tra thứ tự tác động tới assignee, KPI overdue và notification.