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