[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
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:
@ -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
|
// [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).
|
// cuối chọn 1 giá chốt (Ncc / ProMin / ProMax / Ccm).
|
||||||
const [finalizeByCcm, setFinalizeByCcm] = useState(false)
|
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
|
// [S97 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC (AllowApproverFinalize) = ô-tick OPT-IN:
|
||||||
// BỎ được: default checked (giữ hành vi finalize), bỏ tick → trình tiếp CEO thay vì kết thúc.
|
// 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(true)
|
const [applyLevelFinalize, setApplyLevelFinalize] = useState(false)
|
||||||
const [approvedPriceSource, setApprovedPriceSource] = useState<string | null>(null)
|
const [approvedPriceSource, setApprovedPriceSource] = useState<string | null>(null)
|
||||||
const qc = useQueryClient()
|
const qc = useQueryClient()
|
||||||
const { user: currentUser } = useAuth()
|
const { user: currentUser } = useAuth()
|
||||||
@ -218,7 +218,7 @@ export function PeWorkflowPanel({
|
|||||||
setReturnTargetUserId(null)
|
setReturnTargetUserId(null)
|
||||||
setSkipToFinalApprover(false)
|
setSkipToFinalApprover(false)
|
||||||
setFinalizeByCcm(false)
|
setFinalizeByCcm(false)
|
||||||
setApplyLevelFinalize(true)
|
setApplyLevelFinalize(false)
|
||||||
setApprovedPriceSource(null)
|
setApprovedPriceSource(null)
|
||||||
setApproveFiles([])
|
setApproveFiles([])
|
||||||
if (!wasReject) onApproved?.()
|
if (!wasReject) onApproved?.()
|
||||||
@ -326,9 +326,9 @@ export function PeWorkflowPanel({
|
|||||||
{isStepAfterFinalize(step.order) && (
|
{isStepAfterFinalize(step.order) && (
|
||||||
<span
|
<span
|
||||||
className="rounded bg-slate-100 px-1.5 py-0.5 text-[10px] font-medium text-slate-400"
|
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>
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</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="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">
|
<span className="mt-0.5 block text-[11px] text-emerald-700/80">
|
||||||
{applyLevelFinalize
|
{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.'
|
? 'Đã 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.'
|
||||||
: 'Đã 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).'}
|
: '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>
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
@ -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
|
// [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).
|
// cuối chọn 1 giá chốt (Ncc / ProMin / ProMax / Ccm).
|
||||||
const [finalizeByCcm, setFinalizeByCcm] = useState(false)
|
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
|
// [S97 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC (AllowApproverFinalize) = ô-tick OPT-IN:
|
||||||
// BỎ được: default checked (giữ hành vi finalize), bỏ tick → trình tiếp CEO thay vì kết thúc.
|
// 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(true)
|
const [applyLevelFinalize, setApplyLevelFinalize] = useState(false)
|
||||||
const [approvedPriceSource, setApprovedPriceSource] = useState<string | null>(null)
|
const [approvedPriceSource, setApprovedPriceSource] = useState<string | null>(null)
|
||||||
const qc = useQueryClient()
|
const qc = useQueryClient()
|
||||||
const { user: currentUser } = useAuth()
|
const { user: currentUser } = useAuth()
|
||||||
@ -218,7 +218,7 @@ export function PeWorkflowPanel({
|
|||||||
setReturnTargetUserId(null)
|
setReturnTargetUserId(null)
|
||||||
setSkipToFinalApprover(false)
|
setSkipToFinalApprover(false)
|
||||||
setFinalizeByCcm(false)
|
setFinalizeByCcm(false)
|
||||||
setApplyLevelFinalize(true)
|
setApplyLevelFinalize(false)
|
||||||
setApprovedPriceSource(null)
|
setApprovedPriceSource(null)
|
||||||
setApproveFiles([])
|
setApproveFiles([])
|
||||||
if (!wasReject) onApproved?.()
|
if (!wasReject) onApproved?.()
|
||||||
@ -326,9 +326,9 @@ export function PeWorkflowPanel({
|
|||||||
{isStepAfterFinalize(step.order) && (
|
{isStepAfterFinalize(step.order) && (
|
||||||
<span
|
<span
|
||||||
className="rounded bg-slate-100 px-1.5 py-0.5 text-[10px] font-medium text-slate-400"
|
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>
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</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="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">
|
<span className="mt-0.5 block text-[11px] text-emerald-700/80">
|
||||||
{applyLevelFinalize
|
{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.'
|
? 'Đã 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.'
|
||||||
: 'Đã 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).'}
|
: '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>
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
Reference in New Issue
Block a user