Skip to content

Type — Supplement, Approval And Resolution

1. Resolver path: tiếp nhận và giải trình

Action complaintScheduleResolve chỉ hợp lệ khi complaint đang ở new_complaint.

Update semantics

FieldHành vi
explanationGhi nội dung giải trình
solutionGhi phương án xử lý
filesFile đính kèm của phần giải trình
statusĐổi sang pending_inspection_complaint
session_updated_byGhi user thao tác

History insert

History statusNội dung
receive_history_complaintSnapshot giải trình + phương án xử lý + file

2. Approver path từ pending_inspection_complaint

Approver có 3 nhánh:

A. Approve

Thuộc tínhGiá trị
Preconditionscomplaint đang pending_inspection_complaint
New statusapproved_complaint
History statusapproved_history_complaint
Content chínhKết luận thanh tra

B. Reject

Thuộc tínhGiá trị
Preconditionscomplaint đang pending_inspection_complaint
New statusrejected_complaint
History statusrejected_history_complaint
Content chínhLý do

C. Request supplement

Thuộc tínhGiá trị
Preconditionscomplaint đang pending_inspection_complaint
New statuspending_supplement_complaint
History statusrequest_supplement_history_complaint
Content chínhLý do

3. Resolver path từ pending_supplement_complaint

complaintScheduleSupplement cho phép resolver trả lời yêu cầu bổ sung.

Thuộc tínhGiá trị
Preconditionscomplaint đang pending_supplement_complaint
New statuspending_inspection_complaint
History statusprocess_supplement_history_complaint
Content chínhNội dung bổ sung + Phương án bổ sung
FilesCó thể đính kèm

Điều này cho thấy supplement không phải terminal step; nó đưa complaint quay lại cùng approver queue như sau lần resolve đầu tiên.

4. Permission guard drift giữa các action

Đây là finding quan trọng nhất của complaint workflow hiện tại.

Logic hợp lý theo detail action role

Từ complaintScheduleDetail, một user nên được thao tác nếu:

  1. là resolver/approver của branch phù hợp,
  2. hoặc có full-permission role.

Nói cách khác, guard đúng phải tương đương:

text
allow if hasBranchPermission OR isFullPermission

Logic hiện thấy trong nhiều mutate actions

resolve, requestSupplement, supplement, reject, code đang có dạng:

text
deny if len(branchPermission) == 0 OR !isFullPermission

Tương đương business effect:

text
allow only if hasBranchPermission AND isFullPermission

Hệ quả:

  • user đã được gán resolver/approver theo branch nhưng không thuộc full-permission role có thể bị chặn,
  • UI detail vẫn có thể hiện nút vì complaintScheduleDetail dùng semantics khác,
  • bug sẽ xuất hiện dưới dạng "thấy nút nhưng submit bị permission denied".

File có dấu hiệu lỗi

ActionDấu hiệu guard
complaintScheduleResolveDùng `len(resolvers)==0
complaintScheduleRequestSupplementDùng `len(approvers)==0
complaintScheduleSupplementDùng `len(resolvers)==0
complaintScheduleRejectDùng `len(approvers)==0

File khác semantics

ActionDấu hiệu guard
complaintScheduleApproveDùng len(approvers)==0 && !isFullPermission

approve vì vậy đang cho phép:

  • approver branch bình thường,
  • hoặc full-permission role,

trong khi các action sibling lại yêu cầu chặt hơn. Đây là inconsistency rõ ràng.

5. QA matrix nên test theo guard thật

CaseKỳ vọng nghiệp vụRisk hiện tại
Resolver có branch permission nhưng không có full-permission roleResolve được complaint mớiCó thể fail
Approver có branch permission nhưng không có full-permission roleRequest supplement / reject đượcCó thể fail
Full-permission role không có branch permissionTùy semantics mong muốnCode hiện tại không đồng nhất giữa actions
bod thấy complaint ở detailCó thể viewChưa đủ bằng chứng là mutate được tương ứng

6. Rủi ro / Findings

IDFinding
SAR-F01Guard ở resolve/requestSupplement/supplement/reject có dấu hiệu bug logic thật, không chỉ naming mơ hồ.
SAR-F02approve dùng semantics khác các action sibling, nên complaint mutate paths hiện không nhất quán.
SAR-F03QA nếu chỉ test happy path bằng tài khoản admin/full-role sẽ bỏ sót lỗi permission theo branch.