From 69997da74f7b5ff78a0022362994d33d986b01b4 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Thu, 11 Jun 2026 18:22:26 +0700 Subject: [PATCH] [CLAUDE] PurchaseEvaluation: bo o "Ten ngan sach" o manual budget (UAT vong 4 - anh chot "cho ten ngan sach bo di nhe") - PeDetailTabs Section 5 Dieu chinh ngan sach: bo input "Ten (khong bat buoc)" (user khong hieu "y nghia du phong la gi") - manual budget chi con So tien (VND). State manualName drop, payload budgetManualName: null. Ten cu phieu truoc van hien read-only, ve null khi Luu dieu chinh lan toi. - PeHeaderForm: payload budgetManualName null + hasManual detect theo CA amount (phieu moi name=null sau khi bo o Ten -> van nhan dung manual mode). - PeWorkspaceCreateView: khong doi (chua tung co o Ten, payload '' || null = null san). - SHA256 mirror x2 app IDENTICAL, build tsc+vite x2 PASS. --- fe-admin/src/components/pe/PeDetailTabs.tsx | 38 ++++++++------------- fe-admin/src/components/pe/PeHeaderForm.tsx | 5 +-- fe-user/src/components/pe/PeDetailTabs.tsx | 38 ++++++++------------- fe-user/src/components/pe/PeHeaderForm.tsx | 5 +-- 4 files changed, 34 insertions(+), 52 deletions(-) diff --git a/fe-admin/src/components/pe/PeDetailTabs.tsx b/fe-admin/src/components/pe/PeDetailTabs.tsx index 3025d55..b0725ac 100644 --- a/fe-admin/src/components/pe/PeDetailTabs.tsx +++ b/fe-admin/src/components/pe/PeDetailTabs.tsx @@ -995,7 +995,9 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b const [manualMode, setManualMode] = useState(initialManual) const [budgetId, setBudgetId] = useState(ev.budgetId ?? '') const [manualAmount, setManualAmount] = useState(ev.budgetManualAmount ?? 0) - const [manualName, setManualName] = useState(ev.budgetManualName ?? '') + // S59 UAT vòng 4 (anh chốt "chỗ tên ngân sách bỏ đi"): bỏ ô "Tên (không bắt buộc)" + // — user không hiểu ý nghĩa; manual budget chỉ còn Số tiền. Tên cũ (phiếu trước) + // vẫn hiển thị read-only, sẽ về null khi Lưu điều chỉnh lần tới. const eligibleBudgets = useQuery({ queryKey: ['eligible-budgets-adjust', ev.projectId], @@ -1008,7 +1010,7 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b const adjustMut = useMutation({ mutationFn: async () => { const payload = manualMode - ? { budgetId: null, budgetManualName: manualName || null, budgetManualAmount: manualAmount > 0 ? manualAmount : null } + ? { budgetId: null, budgetManualName: null, budgetManualAmount: manualAmount > 0 ? manualAmount : null } : { budgetId: budgetId || null, budgetManualName: null, budgetManualAmount: null } await api.patch(`/purchase-evaluations/${ev.id}/budget-adjust`, payload) }, @@ -1057,7 +1059,6 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b setManualMode(initialManual) setBudgetId(ev.budgetId ?? '') setManualAmount(ev.budgetManualAmount ?? 0) - setManualName(ev.budgetManualName ?? '') setEditing(true) }} variant="ghost" @@ -1099,29 +1100,18 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b ) : ( -
-
- +
+ +
setManualName(e.target.value)} - placeholder="vd Ngân sách dự phòng Q2/2026" - className="text-sm" + type="text" + inputMode="numeric" + value={formatVndInput(manualAmount)} + onChange={e => setManualAmount(parseVnd(e.target.value))} + placeholder="0" + className="pr-10 font-mono text-right text-sm" /> -
-
- -
- setManualAmount(parseVnd(e.target.value))} - placeholder="0" - className="pr-10 font-mono text-right text-sm" - /> - đ -
+ đ
)} diff --git a/fe-admin/src/components/pe/PeHeaderForm.tsx b/fe-admin/src/components/pe/PeHeaderForm.tsx index 03bc7a8..bb0f0a3 100644 --- a/fe-admin/src/components/pe/PeHeaderForm.tsx +++ b/fe-admin/src/components/pe/PeHeaderForm.tsx @@ -101,7 +101,8 @@ export function PeHeaderForm({ useEffect(() => { if (existing.data) { - const hasManual = existing.data.budgetManualName !== null + // S59: manual-mode detect theo CẢ amount (phiếu mới name=null sau khi bỏ ô Tên). + const hasManual = existing.data.budgetManualAmount !== null || existing.data.budgetManualName !== null || existing.data.budgetManualAmount !== null setForm({ type: existing.data.type, @@ -124,7 +125,7 @@ export function PeHeaderForm({ const payloadBudgetFields = form.budgetManual ? { budgetId: null, - budgetManualName: form.budgetManualName || null, + budgetManualName: null, // S59 anh chốt bỏ "Tên ngân sách" — manual chỉ còn Số tiền budgetManualAmount: form.budgetManualAmount > 0 ? form.budgetManualAmount : null, } : { diff --git a/fe-user/src/components/pe/PeDetailTabs.tsx b/fe-user/src/components/pe/PeDetailTabs.tsx index 3025d55..b0725ac 100644 --- a/fe-user/src/components/pe/PeDetailTabs.tsx +++ b/fe-user/src/components/pe/PeDetailTabs.tsx @@ -995,7 +995,9 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b const [manualMode, setManualMode] = useState(initialManual) const [budgetId, setBudgetId] = useState(ev.budgetId ?? '') const [manualAmount, setManualAmount] = useState(ev.budgetManualAmount ?? 0) - const [manualName, setManualName] = useState(ev.budgetManualName ?? '') + // S59 UAT vòng 4 (anh chốt "chỗ tên ngân sách bỏ đi"): bỏ ô "Tên (không bắt buộc)" + // — user không hiểu ý nghĩa; manual budget chỉ còn Số tiền. Tên cũ (phiếu trước) + // vẫn hiển thị read-only, sẽ về null khi Lưu điều chỉnh lần tới. const eligibleBudgets = useQuery({ queryKey: ['eligible-budgets-adjust', ev.projectId], @@ -1008,7 +1010,7 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b const adjustMut = useMutation({ mutationFn: async () => { const payload = manualMode - ? { budgetId: null, budgetManualName: manualName || null, budgetManualAmount: manualAmount > 0 ? manualAmount : null } + ? { budgetId: null, budgetManualName: null, budgetManualAmount: manualAmount > 0 ? manualAmount : null } : { budgetId: budgetId || null, budgetManualName: null, budgetManualAmount: null } await api.patch(`/purchase-evaluations/${ev.id}/budget-adjust`, payload) }, @@ -1057,7 +1059,6 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b setManualMode(initialManual) setBudgetId(ev.budgetId ?? '') setManualAmount(ev.budgetManualAmount ?? 0) - setManualName(ev.budgetManualName ?? '') setEditing(true) }} variant="ghost" @@ -1099,29 +1100,18 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b
) : ( -
-
- +
+ +
setManualName(e.target.value)} - placeholder="vd Ngân sách dự phòng Q2/2026" - className="text-sm" + type="text" + inputMode="numeric" + value={formatVndInput(manualAmount)} + onChange={e => setManualAmount(parseVnd(e.target.value))} + placeholder="0" + className="pr-10 font-mono text-right text-sm" /> -
-
- -
- setManualAmount(parseVnd(e.target.value))} - placeholder="0" - className="pr-10 font-mono text-right text-sm" - /> - đ -
+ đ
)} diff --git a/fe-user/src/components/pe/PeHeaderForm.tsx b/fe-user/src/components/pe/PeHeaderForm.tsx index 03bc7a8..bb0f0a3 100644 --- a/fe-user/src/components/pe/PeHeaderForm.tsx +++ b/fe-user/src/components/pe/PeHeaderForm.tsx @@ -101,7 +101,8 @@ export function PeHeaderForm({ useEffect(() => { if (existing.data) { - const hasManual = existing.data.budgetManualName !== null + // S59: manual-mode detect theo CẢ amount (phiếu mới name=null sau khi bỏ ô Tên). + const hasManual = existing.data.budgetManualAmount !== null || existing.data.budgetManualName !== null || existing.data.budgetManualAmount !== null setForm({ type: existing.data.type, @@ -124,7 +125,7 @@ export function PeHeaderForm({ const payloadBudgetFields = form.budgetManual ? { budgetId: null, - budgetManualName: form.budgetManualName || null, + budgetManualName: null, // S59 anh chốt bỏ "Tên ngân sách" — manual chỉ còn Số tiền budgetManualAmount: form.budgetManualAmount > 0 ? form.budgetManualAmount : null, } : {