[CLAUDE] PurchaseEvaluation: ô "Cấp này KẾT THÚC quy trình" → opt-out bỏ-tick-được (anh Kiệt FDC)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m12s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m12s
anh Kiệt UAT "cái này option thôi chứ e" — cấp cấu hình AllowApproverFinalize (Mig 58, S89 auto-finalize im lặng) NAY là ô-tích BỎ được: - Default checked = giữ hành vi cũ (duyệt xong KẾT THÚC, không lên CEO) — backward-compat. - BỎ tick (applyLevelFinalize=false) → KHÔNG finalize, trình tiếp CEO/cấp sau; giá chốt ẩn (CEO chọn sau). BE: +param applyLevelFinalize (default true) xuyên interface → service (finalize guard `&& applyLevelFinalize`) → command → handler → controller body. FE: ô xanh static → checkbox 2 app (fe-admin+fe-user SHA-mirror) + hint động + sendPrice/shouldPickPrice gate theo cờ. Test: +test #6 opt-out→advance-to-CEO (spec change; #1-5 backward-compat giữ). Build slnx + 2 FE PASS 0-err; test 434→435. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -52,6 +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)
|
||||
const [approvedPriceSource, setApprovedPriceSource] = useState<string | null>(null)
|
||||
const qc = useQueryClient()
|
||||
const { user: currentUser } = useAuth()
|
||||
@ -165,7 +168,7 @@ export function PeWorkflowPanel({
|
||||
&& evaluation.phase !== PurchaseEvaluationPhase.TraLai
|
||||
// [Mig 54] ① gửi giá chốt khi đây là duyệt cuối (CEO/NV cuối) HOẶC CCM tích done
|
||||
// HOẶC [Mig 58] cấp được cấu hình KẾT THÚC (đều là điểm CHỐT giá).
|
||||
const sendPrice = !isReject && (currentIsFinalApprover || finalizeByCcm || approverFinalizeEligible)
|
||||
const sendPrice = !isReject && (currentIsFinalApprover || finalizeByCcm || (approverFinalizeEligible && applyLevelFinalize))
|
||||
// [S78] Người duyệt đính kèm file khi DUYỆT (forward approve). Upload TRƯỚC khi
|
||||
// chuyển phase: file lỗi (sai định dạng / >20MB) → throw, KHÔNG duyệt (toast lỗi BE).
|
||||
// File hợp lệ giữ lại (gắn phiếu, purpose=ApprovalAttachment, uploader=actor server-side).
|
||||
@ -192,6 +195,9 @@ export function PeWorkflowPanel({
|
||||
skipToFinal: !isReject && skipToFinalApprover,
|
||||
// [Mig 54 2026-06-18] ③ CCM duyệt done miễn CEO + ① giá chốt người duyệt chọn.
|
||||
finalizeByCcmDelegation: !isReject && finalizeByCcm,
|
||||
// [S96 — anh Kiệt FDC] cờ finalize opt-out: chỉ có ý nghĩa khi cấp cấu hình KẾT THÚC.
|
||||
// Bỏ tick (false) → BE không finalize, trình tiếp CEO; cấp thường gửi true (no-op).
|
||||
applyLevelFinalize: !isReject && (approverFinalizeEligible ? applyLevelFinalize : true),
|
||||
approvedPriceAmount: sendPrice ? selectedPriceAmount : null,
|
||||
approvedPriceSource: sendPrice ? approvedPriceSource : null,
|
||||
})
|
||||
@ -212,6 +218,7 @@ export function PeWorkflowPanel({
|
||||
setReturnTargetUserId(null)
|
||||
setSkipToFinalApprover(false)
|
||||
setFinalizeByCcm(false)
|
||||
setApplyLevelFinalize(true)
|
||||
setApprovedPriceSource(null)
|
||||
setApproveFiles([])
|
||||
if (!wasReject) onApproved?.()
|
||||
@ -486,7 +493,7 @@ export function PeWorkflowPanel({
|
||||
: `✓ Duyệt → ${PurchaseEvaluationPhaseLabel[target]}`
|
||||
// [Mig 54] ① bộ chọn giá chốt khi duyệt CUỐI hoặc CCM tích done — bắt buộc chọn.
|
||||
const isApproveAction = !isCancel && !isSendBack
|
||||
const shouldPickPrice = isApproveAction && (currentIsFinalApprover || finalizeByCcm || approverFinalizeEligible)
|
||||
const shouldPickPrice = isApproveAction && (currentIsFinalApprover || finalizeByCcm || (approverFinalizeEligible && applyLevelFinalize))
|
||||
// [Mig 54 fix] Khoá "Xác nhận" khi PHẢI chọn giá mà: chưa có giá nào (candidates
|
||||
// rỗng — buộc nhập PRO/CCM hoặc chọn NCC thắng thầu trước) HOẶC chưa chọn giá. Tránh
|
||||
// người duyệt bấm rồi nhận lỗi BE "Chọn 1 giá chốt" khó hiểu (empty-candidates edge).
|
||||
@ -644,14 +651,27 @@ export function PeWorkflowPanel({
|
||||
</label>
|
||||
</div>
|
||||
)}
|
||||
{/* [Mig 58 item 4 — anh Kiệt FDC] Cấp được cấu hình KẾT THÚC trong Quy trình duyệt:
|
||||
BE TỰ finalize khi duyệt tới đây (auto, không ô-tích). Banner báo + bắt chọn giá chốt. */}
|
||||
{/* [S96 2026-07-01 — anh Kiệt FDC] Cấp cấu hình KẾT THÚC trong Quy trình duyệt NAY là
|
||||
ô-tích BỎ được (opt-out): default tick = duyệt xong KẾT THÚC (không lên CEO); bỏ tick
|
||||
= vẫn trình tiếp CEO. Đảo S89 (auto-finalize im lặng → "cái này option thôi"). */}
|
||||
{isApproveAction && approverFinalizeEligible && (
|
||||
<div className="mb-3 rounded border border-emerald-300 bg-emerald-50 px-3 py-2 text-[12px] text-emerald-800">
|
||||
<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">
|
||||
Được cấu hình sẵn trong Quy trình duyệt — bạn 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 trước khi duyệt.
|
||||
</span>
|
||||
<label className="flex cursor-pointer items-start gap-2">
|
||||
<input
|
||||
type="checkbox"
|
||||
className="mt-0.5"
|
||||
checked={applyLevelFinalize}
|
||||
onChange={e => setApplyLevelFinalize(e.target.checked)}
|
||||
/>
|
||||
<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">
|
||||
{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).'}
|
||||
</span>
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
)}
|
||||
{/* [Mig 54] ① Bộ chọn giá chốt — hiện khi duyệt CUỐI hoặc CCM tích done.
|
||||
|
||||
Reference in New Issue
Block a user