[CLAUDE] PurchaseEvaluation: badge "không trình tới"→"Kết thúc tại {cấp}" + đảo default ô-tick finalize sang opt-in (anh Kiệt FDC UAT)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m10s

- Fix 1: badge cấp-sau-finalize "không trình tới" → "Kết thúc tại {finalizeLevelName}" (động, hiện "Kết thúc tại CCM") + tooltip template-literal
- Fix 2: đảo default checkbox "Cấp này KẾT THÚC quy trình" opt-out→opt-in (useState true→false + reset onSuccess) — mặc định TRÌNH TIẾP CEO, tick mới KẾT THÚC; helper text reword
- FE-only, mirror 2 app SHA-identical, no BE/mig/test; workflow implement+review PASS 0 issue

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-01 18:05:49 +07:00
parent 791ec5544d
commit 1c8fb6ab94
2 changed files with 16 additions and 16 deletions

View File

@ -52,9 +52,9 @@ export function PeWorkflowPanel({
// [Mig 54 2026-06-18 — anh Kiệt FDC] ③ CCM tích "Duyệt done miễn CEO" + ① người duyệt
// cuối chọn 1 giá chốt (Ncc / ProMin / ProMax / Ccm).
const [finalizeByCcm, setFinalizeByCcm] = useState(false)
// [S96 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC (AllowApproverFinalize) NAY là ô-tick
// BỎ được: default checked (giữ hành vi finalize), bỏ tick → trình tiếp CEO thay vì kết thúc.
const [applyLevelFinalize, setApplyLevelFinalize] = useState(true)
// [S97 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC (AllowApproverFinalize) = ô-tick OPT-IN:
// default UNCHECKED → trình tiếp CEO/cấp sau; TÍCH mới KẾT THÚC tại cấp này. Đảo opt-out S96.
const [applyLevelFinalize, setApplyLevelFinalize] = useState(false)
const [approvedPriceSource, setApprovedPriceSource] = useState<string | null>(null)
const qc = useQueryClient()
const { user: currentUser } = useAuth()
@ -218,7 +218,7 @@ export function PeWorkflowPanel({
setReturnTargetUserId(null)
setSkipToFinalApprover(false)
setFinalizeByCcm(false)
setApplyLevelFinalize(true)
setApplyLevelFinalize(false)
setApprovedPriceSource(null)
setApproveFiles([])
if (!wasReject) onApproved?.()
@ -326,9 +326,9 @@ export function PeWorkflowPanel({
{isStepAfterFinalize(step.order) && (
<span
className="rounded bg-slate-100 px-1.5 py-0.5 text-[10px] font-medium text-slate-400"
title="Quy trình đã kết thúc cấp 'Duyệt thay CEO' phía trên — bước này không được trình tới"
title={`Quy trình kết thúc tại ${evaluation.finalizeLevelName ?? evaluation.finalizeStepName ?? 'cấp duyệt thay CEO'} phía trên — bước này không cần trình tới`}
>
không trình tới
Kết thúc tại {evaluation.finalizeLevelName ?? evaluation.finalizeStepName ?? 'cấp trên'}
</span>
)}
</div>
@ -667,8 +667,8 @@ export function PeWorkflowPanel({
<span className="font-medium">Cấp này KẾT THÚC quy trình</span>
<span className="mt-0.5 block text-[11px] text-emerald-700/80">
{applyLevelFinalize
? ược cấu hình sẵn trong Quy trình duyệt — duyệt xong là phiếu "Đã duyệt", KHÔNG trình tiếp CEO. Nhớ chọn 1 giá chốt bên dưới. BỎ tick nếu muốn vẫn trình CEO.'
: 'Đã BỎ tick — phiếu sẽ TRÌNH TIẾP lên CEO/cấp sau thay vì kết thúc tại đây (không cần chọn giá chốt).'}
? ã tích — duyệt xong là phiếu "Đã duyệt", KẾT THÚC tại cấp này, KHÔNG trình tiếp CEO. Nhớ chọn 1 giá chốt bên dưới.'
: 'Mặc định: duyệt xong phiếu TRÌNH TIẾP lên CEO/cấp sau. TÍCH vào nếu muốn KẾT THÚC ngay tại cấp này (không lên CEO — không cần chọn giá chốt).'}
</span>
</span>
</label>

View File

@ -52,9 +52,9 @@ export function PeWorkflowPanel({
// [Mig 54 2026-06-18 — anh Kiệt FDC] ③ CCM tích "Duyệt done miễn CEO" + ① người duyệt
// cuối chọn 1 giá chốt (Ncc / ProMin / ProMax / Ccm).
const [finalizeByCcm, setFinalizeByCcm] = useState(false)
// [S96 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC (AllowApproverFinalize) NAY là ô-tick
// BỎ được: default checked (giữ hành vi finalize), bỏ tick → trình tiếp CEO thay vì kết thúc.
const [applyLevelFinalize, setApplyLevelFinalize] = useState(true)
// [S97 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC (AllowApproverFinalize) = ô-tick OPT-IN:
// default UNCHECKED → trình tiếp CEO/cấp sau; TÍCH mới KẾT THÚC tại cấp này. Đảo opt-out S96.
const [applyLevelFinalize, setApplyLevelFinalize] = useState(false)
const [approvedPriceSource, setApprovedPriceSource] = useState<string | null>(null)
const qc = useQueryClient()
const { user: currentUser } = useAuth()
@ -218,7 +218,7 @@ export function PeWorkflowPanel({
setReturnTargetUserId(null)
setSkipToFinalApprover(false)
setFinalizeByCcm(false)
setApplyLevelFinalize(true)
setApplyLevelFinalize(false)
setApprovedPriceSource(null)
setApproveFiles([])
if (!wasReject) onApproved?.()
@ -326,9 +326,9 @@ export function PeWorkflowPanel({
{isStepAfterFinalize(step.order) && (
<span
className="rounded bg-slate-100 px-1.5 py-0.5 text-[10px] font-medium text-slate-400"
title="Quy trình đã kết thúc cấp 'Duyệt thay CEO' phía trên — bước này không được trình tới"
title={`Quy trình kết thúc tại ${evaluation.finalizeLevelName ?? evaluation.finalizeStepName ?? 'cấp duyệt thay CEO'} phía trên — bước này không cần trình tới`}
>
không trình tới
Kết thúc tại {evaluation.finalizeLevelName ?? evaluation.finalizeStepName ?? 'cấp trên'}
</span>
)}
</div>
@ -667,8 +667,8 @@ export function PeWorkflowPanel({
<span className="font-medium">Cấp này KẾT THÚC quy trình</span>
<span className="mt-0.5 block text-[11px] text-emerald-700/80">
{applyLevelFinalize
? ược cấu hình sẵn trong Quy trình duyệt — duyệt xong là phiếu "Đã duyệt", KHÔNG trình tiếp CEO. Nhớ chọn 1 giá chốt bên dưới. BỎ tick nếu muốn vẫn trình CEO.'
: 'Đã BỎ tick — phiếu sẽ TRÌNH TIẾP lên CEO/cấp sau thay vì kết thúc tại đây (không cần chọn giá chốt).'}
? ã tích — duyệt xong là phiếu "Đã duyệt", KẾT THÚC tại cấp này, KHÔNG trình tiếp CEO. Nhớ chọn 1 giá chốt bên dưới.'
: 'Mặc định: duyệt xong phiếu TRÌNH TIẾP lên CEO/cấp sau. TÍCH vào nếu muốn KẾT THÚC ngay tại cấp này (không lên CEO — không cần chọn giá chốt).'}
</span>
</span>
</label>