Skip to content

Complaint - Technical Map

Auto-generated bởi codebase-doc-generator ngày 2026-03-23 (verified từ code thực). Không chỉnh sửa thủ công.

Routes

RoutePathMục đích
ROUTE_COMPLAINT/complaintRoot list và shell của module
ROUTE_COMPLAINT_DETAIL/complaint/:idMở detail complaint dưới dạng dialog route
ROUTE_COMPLAINT_CREATE/complaint/createMở dialog tạo complaint
ItemGiá trị
Sidebar titleroute./complaint-left-menu
moduleIdcomplaint_management
PermissionsITLeader, ITStaff, BranchPOS
PlatformsAdmin, CRM, POS

FE Pages (3)

PageFileVai trò
Overviewpages/overview/Overview.tsxCấp ComplaintRefetchContext, render table và router dialog
Createpages/create/Create.tsxTạo complaint mới qua insert_complaint_schedule
Detailpages/detail/Detail.tsxMở ComplaintDetailDialog, xử lý đóng dialog và refresh list

FE Components (11)

Core workflow

ComponentVai trò
ComplaintTableBảng danh sách, search, filter, pagination
ComplaintDetailDialogDetail chính, hiển thị status/step/timeline và action footer
CreateComplaintDialogForm tạo complaint
ComplaintTimelineTimeline từ complaint_schedule_history
ComplaintStepBarStep UI 3 bước: tiếp nhận, bổ sung, kết quả

Action dialogs

ComponentVai trò
ComplaintResolveDialogResolver nhập giải trình + phương án xử lý + file
ComplaintResolveConfirmDialogXác nhận trước khi gửi giải trình
ComplaintReasonDialogApprover nhập lý do cho request supplement / approve / reject
ComplaintSupplementDialogResolver gửi nội dung bổ sung

Detail sections

ComponentVai trò
ComplaintInfoSectionThông tin hồ sơ khiếu nại
ComplaintExplanationSectionKhu vực explanation / solution / files

GraphQL Operations

File: diva-admin/src/modules/complaint/graphql/complaint.graphql

Permission settings

OperationMục đích
GetComplaintPermissionBranchLấy branch complaint permissions
UpdateComplaintPermissionBranchDisabledDisable/enable branch permission
CreateComplaintPermissionsTạo mới rule branch + approver + resolver
DeleteComplaintRulesXóa rule branch
BulkUpsertComplaintPermissionsUpsert hàng loạt rule complaint
EditComplaintPermissionsSửa approver/resolver của branch

Complaint runtime

OperationMục đích
GetComplaintTableDataList complaint qua Hasura action complaintScheduleList
ComplaintScheduleDetailDetail complaint qua action complaintScheduleDetail
ComplaintDetailRaw query complaint_schedule cho customer context
CreateNewComplaintTicketInsert complaint_schedule trực tiếp
ComplaintResolveAction complaintScheduleResolve
complaintRequestSupplementAction complaintScheduleRequestSupplement
complaintSupplementAction complaintScheduleSupplement
complaintRejectAction complaintScheduleReject
complaintApproveAction complaintScheduleApprove
GetComplainLevelData, GetComplainKindData, GetComplainStatusDataMaster data
GetRecentTicketTìm ticket completed gần nhất để gắn complaint

FE Runtime logic

Overview/list

LogicGhi chú
ComplaintRefetchContextOverview provide một refreshToken để create/detail trigger refetch list
Search debouncekeywords debounce 800ms trước khi gọi list action
List inputlimit, offset, search, branch_ids, complaint_level, status
Branch filterQuery branch đang disabled = false

Create flow

LogicGhi chú
Customer selectDùng UserSelect với role CUSTOMER
Contact selectAuto-fill từ address của customer; field bị disable={true} nhưng có thể add contact mới
Created timeKhông cho chọn thời gian trong tương lai
ServicesDùng search_product_nearby để chọn dịch vụ
TicketChỉ lấy ticket completed trong 10 ngày gần nhất, source ticket_source_6
SubmitConvert thời gian sang ISO timezone offset rồi insert_complaint_schedule

Detail flow

LogicGhi chú
Default sourceDùng action complaintScheduleDetail(data)
Customer sourceDùng raw query ComplaintDetail(where) và ép complaint_action_role = view
Step mappingnew -> step 0, pending_inspection/pending_supplement -> step 1, approved/rejected -> step 2
Footer actionsPhụ thuộc complaint_action_role backend trả về

Backend Actions

complaint_schedule_list.go

Hành viGhi chú
Tính branch permissionsGom branch từ cả approver và resolver, loại trùng
View scopeCho xem complaint do chính user tạo hoặc complaint thuộc branch có quyền
Full-view rolesit_*, audit_*, accountant_*, customer_service_*, bod
FiltersSearch theo code/customer, filter branch/status/level

complaint_schedule_detail.go

Hành viGhi chú
Load complaint detailQuery complaint_schedule theo id
Permission guardChặn nếu user không phải creator, không có branch permission và không có full-view role
TimelineQuery complaint_schedule_history order by created_at desc
Action roleTrả resolve, approve, supplement hoặc view tùy status và permission

complaint_schedule_resolve.go

Hành viGhi chú
PreconditionsComplaint phải ở new_complaint
UpdateGhi explanation, solution, files, đổi status sang pending_inspection_complaint
HistoryInsert receive_history_complaint

complaint_schedule_approve.go

Hành viGhi chú
PreconditionsComplaint phải ở pending_inspection_complaint
UpdateĐổi status sang approved_complaint
HistoryInsert approved_history_complaint với content Kết luận thanh tra

complaint_schedule_reject.go

Hành viGhi chú
PreconditionsComplaint phải ở pending_inspection_complaint
UpdateĐổi status sang rejected_complaint
HistoryInsert rejected_history_complaint với content Lý do

complaint_schedule_request_supplement.go

Hành viGhi chú
PreconditionsComplaint phải ở pending_inspection_complaint
UpdateĐổi status sang pending_supplement_complaint
HistoryInsert request_supplement_history_complaint với content Lý do

complaint_schedule_supplement.go

Hành viGhi chú
PreconditionsComplaint phải ở pending_supplement_complaint
UpdateĐổi status về pending_inspection_complaint
HistoryInsert process_supplement_history_complaint với 2 content item + files

Store / Data model

complaint_schedule

FieldÝ nghĩa
idUUID của complaint
codeMã complaint sinh tự động theo format #KN000001
numberSequence number nền để sinh code
branch_idChi nhánh phát sinh complaint
customer_idKhách hàng khiếu nại
account_address_idLiên hệ/địa chỉ gắn complaint
complaint_kindLoại complaint
complaint_levelCấp độ complaint
statusTrạng thái workflow
ticket_codeTicket liên quan
complaint_contentNội dung complaint ban đầu
product_skuJSONB SKU dịch vụ/sản phẩm liên quan
product_nameSnapshot tên dịch vụ/sản phẩm
explanationNội dung giải trình
solutionPhương án xử lý
filesDanh sách file đính kèm
session_created_by / session_updated_byNgười thao tác thực tế trong phiên

complaint_schedule_history

FieldÝ nghĩa
complaint_schedule_idLiên kết complaint cha
user_idNgười thực hiện activity
statusLoại hoạt động
contentsJSONB mô tả lý do/kết luận/nội dung bổ sung
filesFile đính kèm của activity

Permission tables

TableVai trò
complaint_permission_branchBật/tắt permission theo branch
complaint_permission_resolverDanh sách resolver theo branch
complaint_permission_approverDanh sách approver theo branch

DB Triggers / Functions

ObjectVai trò
complaint_schedule_number_seqSequence sinh số complaint
generate_code_complaint_schedule()Tạo code theo #KN + number và normalize session fields khi insert
generate_session_updated_by_complaint_schedule()Đồng bộ session_updated_by khi update
dashboard_complaint_report(_branch_ids, _from, _to)Aggregate report complaint theo level/status

Report function

dashboard_complaint_report

OutputÝ nghĩa
totalTổng số complaint trong khoảng thời gian lọc
complaint_levelJSON aggregate số lượng và tỷ lệ theo level
complaint_statusJSON aggregate số lượng và tỷ lệ theo status

Công thức tỷ lệ

percent = ROUND(count * 100.0 / NULLIF(total, 0), 2)

Rủi ro / Findings kỹ thuật

#Note
1FE tạo complaint bằng Hasura insert trực tiếp, còn các bước xử lý sau mới đi qua ecommerce-api actions.
2ComplaintDetailDialog có 2 chế độ data source: default action mode và customer read-only mode.
3Các action backend xử lý quyền bằng biểu thức `len(permission) == 0
4complaint_schedule_history trong store có field struct cũ là File string, nhưng insert/runtime hiện dùng mảng files []string; cần cẩn trọng khi mở rộng typed queries cho history.