Files
solution-erp/.claude/workflows/runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-implementer-frontend-1.md
2026-08-08 01:47:30 +07:00

7.7 KiB
Raw Blame History

sub-implementer-frontend-1 — S182 W2 (a-h) lane FE

⚠️ TÊN FILE: TASK text ghi sub-implementer-frontend-0.md, RUN-TRACE block + structured-output ghi sub-implementer-frontend-1.md. Chọn -1 (bản RUN-TRACE = bản em main đọc qua subMdPath). Khai ở đây để lead biết.

§0 — Trạng thái lượt (append liên tục, chống-#53)

  • Đọc SPEC FINAL MỤC 2 W2 (a-h) + MỤC 1 R-1..R-6
  • Đọc file đích + đo tiền-đề từ ĐĨA (line-number trong spec có thể lệch)
  • W2a parse kind
  • W2b synthetic slice
  • W2c lockedCode
  • W2d D3=C 6 ô + #4
  • W2e menuKeys ×2 app
  • W2f ngưỡng CEO
  • W2g auto-pin isActive ×2 app
  • W2h comment + subtitle
  • build fe-admin
  • build fe-user

§1 — Đo tiền-đề từ đĩa (TRƯỚC khi gõ)

# Tiền-đề spec Đo trên đĩa Verdict
P1 :164-172 TYPE_CODE_TO_INT ApprovalWorkflowsV2Page.tsx:164-172 ĐÚNG (TYPE_INT_CONTRACT_SIGNING_PLAN=10 :149) HELD
P2 :299-301 currentType :299-301 overview.data?.types.find(...) ĐÚNG HELD
P3 :357/:620/:650-651/:798/:920-933 TypePanel :357 · Designer :620 · defaultCode :650-651 · POST code :798 · ô Mã :920-933 — ĐÚNG cả 5 HELD
P4 6 ô D3 :1235-1266, :1268-1276, :1277-1285, :1320-1328 #1 :1232-1240 · #2 :1241-1249 · #3 :1250-1258 · #4 :1259-1267 · #5 :1268-1276 · #6 :1277-1285 · #7 :1292-1302 · #8 :1307-1315 · #9 :1320-1328 HELD (số ô #1-#4 lệch ±3 dòng so spec, khớp nội dung)
P5 :944-961 ngưỡng CEO :943-961 ĐÚNG HELD
P6 menuKeys.ts:31-32 = 2 const AwV2_* fe-admin :31-32 + fe-user :31-32 ĐÚNG, 0 key KhkkN HELD
P7 BE const để mirror MenuKeys.cs:127-134 AwV2_KhkkN1..8 (VÀO All) HELD
P8 4-place Layout staticMap fe-admin/Layout.tsx:188 /^KhkkN[1-8]$/ ĐÃ CÓ (K3 S164/S165) ⇒ chỗ-4 KHÔNG cần chạm HELD
P9 khkkGroupWorkflowCode / khkkGroupMenuLabel types/khkk.ts:159-168, 2 app SHA identical b26bf674… HELD
P10 🔴 spec W2g "2 file KhkkCreatePage vốn khác nhau — không cần byte-equal" SAI: sha256sum 2 file = 332986ae6bf1904a4db434c796164caa2768beaaebdc7843dd2b1cdd729d17da BẰNG NHAU + diff 0 dòng LỆCH → sửa mirror BYTE-EQUAL, giữ SHA-pair
P11 WorkflowDto (local) có isActive? KhkkCreatePage.tsx:57-62 = {id, code, name, isUserSelectable}THIẾU isActive phải thêm field (BE có: DefinitionDto.isActive :79)
P12 🔴 spec W2h "thêm ~1 prop subtitle" components/PageHeader.tsx:3-11 chỉ có title/description/actions (bài S37 lặp lần 3) LỆCH → xem §4 FLAG-1
P13 build = phép thử TS thật package.json build = tsc -b && vite build, noUnusedLocals+noUnusedParameters+erasableSyntaxOnly ON HELD

§2 — Thay đổi từng task (đã gõ xong, chờ build)

File chạm (4):

  1. fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx (a,b,c,d,f,h)
  2. fe-admin/src/lib/menuKeys.ts (e)
  3. fe-user/src/lib/menuKeys.ts (e)
  4. fe-admin/src/pages/khkk/KhkkCreatePage.tsx + fe-user/… (g, cp → SHA-pair)

W2a — parse kind

  • khkkGroupMatch = typeCode?.match(/^KhkkN([1-8])$/) ?? nullkhkkGroup: number|null
  • selectedTypeInt = khkkGroup !== null ? TYPE_INT_CONTRACT_SIGNING_PLAN : typeCode ? TYPE_CODE_TO_INT[typeCode] : null
  • queryKey GIỮ NGUYÊN (['approval-workflow-v2-overview', selectedTypeInt]) ⇒ 8 panel nhóm + panel type-10 dùng chung 1 ô cache, invalidate làm tươi cả 9. Khai trong comment.
  • Regex CHUỖI (không Number()) — KhkkN03 không lọt (bài học L1 #11).
  • +import { khkkGroupMenuLabel, khkkGroupWorkflowCode } from '@/types/khkk' (không chép chuỗi KHKK-N).

W2b — synthetic slice

  • Tách typeBucket (raw BE) ⟂ currentType (lát cắt). useMemo([khkkGroup, typeBucket]).
  • versions = typeBucket.history.filter(d => d.code === khkkGroupWorkflowCode(g)) · active = versions.find(v=>v.isActive) ?? null · KHÔNG đọc typeBucket.active (1-trong-8).
  • Giữ shape TypeSummaryDto ⇒ TypePanel/Designer không biết mình đang xem nhóm hay loại.

W2c — lockedCode xuyên suốt

  • Page: lockedCode = khkkGroup !== null ? khkkGroupWorkflowCode(khkkGroup) : null
  • TypePanel({type, lockedCode, onSaved})<Designer lockedCode={lockedCode} …>
  • defaultCode = lockedCode ?? DEFAULT_CODE_BY_TYPE[applicableType] ?? 'QT-V2-001' — ô hiện ĐÚNG mã sẽ gửi (không hiện QT-KHKK-V2-001 rồi gửi KHKK-N3).
  • Ô Mã disabled={isEdit || lockedCode !== null} + hint "Mã khoá theo nhóm — version tự tăng."
  • POST code: lockedCode ?? code (bất-biến theo CẤU TRÚC, không dựa vào input disabled).
  • +key={typeCode ?? 'all'} trên <TypePanel> — NGOÀI spec, lý do: chuyển N1→N3 khi Designer đang mở thì cloneFrom/editTarget (state trong TypePanel) còn trỏ bản N1 trong khi lockedCode đã là N3 ⇒ POST đẻ KHKK-N3 mang ruột N1. Remount xoá state. Khai ở đây.

W2d — D3=C danh-sách-chốt

Cờ chung const isKhkk = applicableType === TYPE_INT_CONTRACT_SIGNING_PLAN (1 nguồn, 8 chỗ dùng).

Ô Cờ Xử lý
#1 allowReturnOneLevel disabled={isKhkk} + title chung + checked={entry.…} GIỮ + mờ text
#2 allowReturnOneStep
#3 allowReturnToAssignee
#4 allowReturnToDrafter disabled + checked THẬT + title RIÊNG "KHKK hiện luôn trả về người soạn khi Trả lại — cờ chưa phân nhánh" + KHÔNG mờ (giữ text-slate-700)
#5 allowApproverEditDetails như #1
#6 allowApproverEditBudget như #1
#7 allowApproverSkipToFinal GIỮ hành vi (kể cả checked ép-false của K3 S165); chỉ thay 3 biểu thức trùng → isKhkk, giá trị y hệt
#8 allowApproverFinalize SỐNG — 0 chạm
#9 allowApproverDelete như #1 (rose→slate khi mờ)
  • levelFlagsPayload 0 dòng đổi (echo state thật).
  • +1 dòng giải thích trong hộp tím (chỉ khi isKhkk) — nói rõ ô mờ vẫn hiện đúng giá trị DB, và 2 ô còn tác dụng.

W2e — menuKeys ×2 app

+8 const AwV2_KhkkN1..8 mirror MenuKeys.cs:127-134, sau :32 cả 2 app. Comment viết theo app (fe-admin trỏ Layout.tsx:188; fe-user khai "cố ý không có Designer") — cố ý lệch chữ, không lệch const.

W2f — Ngưỡng CEO

disabled={isEdit || isKhkk} + helper-text "KHKK không dùng ngưỡng máy — NĐUQ quyết…" + POST ceoApprovalThreshold: isKhkk ? null : (…).

W2g — auto-pin lọc isActive ×2 app

  • WorkflowDto (local, :57-62) +isActive: boolean — BE có (AwAdminOverviewDto, đối chiếu DefinitionDto.isActive).
  • find(w => w.isActive && code-match); filter isUserSelectable ở query GIỮ.
  • Sửa 2 câu thông báo cho khớp điều-kiện MỚI (3 vế: đúng mã ∧ đang áp dụng ∧ đã ghim) — nếu không sẽ nói "chưa có quy trình" trong khi nó đang nằm đó ở bản archived (sai-thầm-lặng).
  • cp fe-admin → fe-user, SHA-pair 89dfa607… BẰNG NHAU.

W2h — comment + tiêu đề

  • Vá comment :641-644: câu cũ "2 ô duyệt sớm sống cho MỌI loại" SAI — #7 vẫn khoá cho type-10 từ K3 S165. Viết lại + trỏ tại-chỗ.
  • PageHeader: title = Quy trình duyệt (Mới): {khkkGroupMenuLabel(g)} · description = phụ đề nghiệp vụ (loại + nhóm N{n} + mã khoá + "7 nhóm còn lại không đổi"). Xem FLAG-1.

§3 — Verify (build ×2 + proof)

(chưa chạy)

§4 — Nợ / FLAG cho lead

(chưa có)