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, } : {