diff --git a/fe-admin/src/components/pe/PeWorkflowPanel.tsx b/fe-admin/src/components/pe/PeWorkflowPanel.tsx index 763e56e..b88b948 100644 --- a/fe-admin/src/components/pe/PeWorkflowPanel.tsx +++ b/fe-admin/src/components/pe/PeWorkflowPanel.tsx @@ -114,6 +114,16 @@ export function PeWorkflowPanel({ // (admin bật per-slot ở Designer). Duyệt tới cấp này = TỰ kết thúc (BE auto theo cờ cấp, // KHÔNG cần ô-tích). FE dùng cờ này để: (1) hiện banner cảnh báo + (2) bắt chọn giá chốt. const approverFinalizeEligible = levelOptions?.allowApproverFinalize === true + // [S89 anh Kiệt FDC] Cấp "Duyệt thay CEO" (finalize) ĐẦU-TIÊN theo thứ tự duyệt trong flow → + // badge cấp đó + làm mờ Bước/Cấp SAU ("không trình tới") để người xem phiếu biết quy trình + // DỪNG ở cấp này (duyệt thay CEO), không lên Ban Giám đốc. + const finalizeFlowStep = evaluation.approvalFlow?.steps.find(s => s.levels.some(l => l.allowApproverFinalize)) ?? null + const finalizeFlowLevelOrder = finalizeFlowStep?.levels.find(l => l.allowApproverFinalize)?.order ?? null + const isStepAfterFinalize = (stepOrder: number) => finalizeFlowStep != null && stepOrder > finalizeFlowStep.order + const isLevelAfterFinalize = (stepOrder: number, levelOrder: number) => + isStepAfterFinalize(stepOrder) + || (finalizeFlowStep != null && stepOrder === finalizeFlowStep.order + && finalizeFlowLevelOrder != null && levelOrder > finalizeFlowLevelOrder) // Ứng viên giá chốt — chỉ giá nào đã có giá trị (≠ null). const priceCandidates = ([ { source: 'Ncc', label: 'Giá NCC (giá chào thầu)', amount: evaluation.winnerQuoteTotal }, @@ -288,6 +298,7 @@ export function PeWorkflowPanel({ step.status === 'Current' && 'border-brand-300 bg-brand-50/50', step.status === 'Done' && 'border-emerald-200 bg-emerald-50/40', step.status === 'Pending' && 'border-slate-200 bg-white', + isStepAfterFinalize(step.order) && 'opacity-50', )} >