[CLAUDE] FE-User: YC-029 W1 — danh-tính menu 7 loại HĐ (accordion ct + view=approved + WfView slice HD-*)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-08-12 19:07:38 +07:00
parent 3addd373e2
commit 09ebd20eda
2 changed files with 84 additions and 9 deletions

View File

@ -49,14 +49,34 @@ const LEVEL_PALETTE = [
'bg-rose-100 text-rose-800 ring-rose-300',
] as const
// [YC-029 W1 S190] ContractType (1..7) → MÃ quy trình duyệt HĐ của loại đó.
// 🔴 NGUỒN CHÉP: `src/Backend/SolutionErp.Domain/Contracts/ContractApprovalWorkflowFamily.cs:33-42`
// (nhà DUY NHẤT của họ mã ở production). Đây là BẢN SAO THỨ 3 của họ này ở FE
// (bản 2 = `fe-admin/src/lib/contractWorkflowFamily.ts`, tự khai fe-admin-ONLY nên KHÔNG
// import chéo app được) ⇒ chép TỪNG KÝ TỰ, chú ý token gạch-nối `HD-NT-NCC` / `HD-NT-DV`.
// Drift-check = ô C-9 (đếm 7 mã distinct trong chính file này).
const INT_TO_HD_CODE: Record<number, string> = {
1: 'HD-TP', // HopDongThauPhu
2: 'HD-GK', // HopDongGiaoKhoan
3: 'HD-NCC', // HopDongNhaCungCap
4: 'HD-DV', // HopDongDichVu
5: 'HD-MB', // HopDongMuaBan
6: 'HD-NT-NCC', // HopDongNguyenTacNCC
7: 'HD-NT-DV', // HopDongNguyenTacDichVu
}
export function WorkflowMatrixViewPage() {
const [searchParams] = useSearchParams()
// Trang này gắn ở 3 route (/purchase-evaluations|/contracts|/khkk + /workflow-matrix)
// ⇒ link "xem tất cả" phải bám đường dẫn ĐANG đứng, không hardcode một cái.
const { pathname } = useLocation()
const rawType = Number(searchParams.get('type'))
// [S159-đợt5] +3 = Contract (ApplicableType.Contract — HĐ dùng CHUNG 1 bộ workflow V2
// cho mọi ContractType ⇒ 7 leaf 'Luồng duyệt' của 7 nhóm HĐ đều trỏ về matrix này).
// [S159-đợt5] +3 = Contract (ApplicableType.Contract)7 leaf 'Luồng duyệt' của 7 nhóm HĐ
// đều trỏ về matrix này vì `ApplicableType` là HẰNG của cả họ, chỉ có MỘT giá trị cho HĐ.
// 🔴 [YC-029 W1 S190 — vá comment stale] Từ S188 mỗi loại HĐ có QUY TRÌNH RIÊNG: 7 bộ
// per-loại `HD-TP`/`HD-GK`/`HD-NCC`/`HD-DV`/`HD-MB`/`HD-NT-NCC`/`HD-NT-DV`
// (`ContractApprovalWorkflowFamily.cs:33-42`) ⇒ 7 leaf KHÔNG còn hiện y hệt nhau: leaf nào
// cũng mang thêm `&ct=N` (ContractType) và trang slice đúng bộ của loại đó (nhánh `ct` bên dưới).
// [W2 KHKK S161] +10 (ContractSigningPlan) — leaf Khkk_WfView đi alias /khkk/workflow-matrix?type=10.
const typeInt = rawType === 1 || rawType === 2 || rawType === 3 || rawType === 10 ? rawType : 1
@ -93,10 +113,27 @@ export function WorkflowMatrixViewPage() {
// `KHKK-N{n}` (`DbInitializer.cs:609`) và cũng chính `code` này là thứ BE dùng để
// gác phiếu-pin-đúng-nhóm (`ContractSigningPlanFeatures.cs:420` regex `^KHKK-N([1-8])$`).
// Một quy trình có thể có nhiều VERSION cùng `code` ⇒ lọc giữ đủ các version.
// ── [YC-029 W1 S190] Lọc theo LOẠI HĐ (7 bộ quy trình per-loại từ S188) ────────────
// Cùng bài với `group` ở trên: 7 leaf "Luồng duyệt" của 7 nhóm HĐ đều trỏ về CÙNG trang
// này (`type=3` là ApplicableType — hằng của cả họ), chỉ khác `&ct=N`. Không lọc thì 7 leaf
// hiện y hệt nhau — mục menu nói dối tên nó.
// 🔴 Gate ĐỦ 3 VẾ: chỉ áp khi `typeInt === 3` (HĐ). Thiếu vế này thì `?type=1&ct=5` sẽ đem
// mã `HD-MB` đi lọc bộ Duyệt-NCC ⇒ TRANG TRẮNG. `ct` rác/thiếu ⇒ BỎ QUA, giữ hành vi cũ.
// Clamp bằng REGEX CHUỖI chứ không `Number()`: `Number('03')===3` lọt lưới.
const rawCt = searchParams.get('ct')
const hdCode =
typeInt === 3 && rawCt !== null && /^[1-7]$/.test(rawCt) ? INT_TO_HD_CODE[Number(rawCt)] : null
// 🔴 LỌC CLIENT-SIDE y khuôn `group`: query đã tải TRỌN bộ quy trình của `applicableType=3`,
// `ct` chỉ là lát cắt của đúng payload đó ⇒ KHÔNG thêm `ct` vào `queryKey` (thêm = 7 lần gọi
// mạng cho cùng một payload + 7 ô cache trùng nội dung). Khớp bằng `code` (BE seed
// `ContractApprovalWorkflowFamily.CodeFor`), giữ đủ mọi VERSION cùng `code`.
const workflows =
khkkGroup !== null
? allWorkflows.filter(wf => wf.code === khkkGroupWorkflowCode(khkkGroup))
: allWorkflows
: hdCode !== null
? allWorkflows.filter(wf => wf.code === hdCode)
: allWorkflows
return (
// [Plan AA hotfix S24 t1] Bro UAT request: dịch hết content sang trái.