+
e. Link hồ sơ
+
+ setForm({ ...form, hoSoLink: e.target.value })}
+ placeholder="Dán link thư mục hồ sơ trên NAS..."
+ className="max-w-2xl text-sm"
+ />
+
+
diff --git a/fe-admin/src/types/purchaseEvaluation.ts b/fe-admin/src/types/purchaseEvaluation.ts
index 5e9edb0..d6f2f9c 100644
--- a/fe-admin/src/types/purchaseEvaluation.ts
+++ b/fe-admin/src/types/purchaseEvaluation.ts
@@ -422,6 +422,9 @@ export type PeDetailBundle = {
selectedSupplierName: string | null
contractId: string | null
paymentTerms: string | null
+ // anh Kiệt FDC — 1 hyperlink tới thư mục hồ sơ trên NAS công ty (string? nullable,
+ // BE HasMaxLength 1000). JSON camelCase "hoSoLink". KHÔNG entity con, dùng 1 cột.
+ hoSoLink: string | null
slaDeadline: string | null
createdAt: string
updatedAt: string | null
diff --git a/fe-user/src/components/pe/PeDetailTabs.tsx b/fe-user/src/components/pe/PeDetailTabs.tsx
index 3aaf94b..8164e52 100644
--- a/fe-user/src/components/pe/PeDetailTabs.tsx
+++ b/fe-user/src/components/pe/PeDetailTabs.tsx
@@ -993,7 +993,7 @@ function PeBudgetSummaryTable({ ev, readOnly }: { ev: PeDetailBundle; readOnly:
const proMut = useMutation({
mutationFn: async (body: { proEstimateAmount: number | null; proNote: string | null }) =>
api.put(`/purchase-evaluations/${ev.id}/budget/pro`, body),
- onSuccess: () => { toast.success('Đã lưu dự trù PRO'); invalidate() },
+ onSuccess: () => { toast.success('Đã lưu ngân sách PRO'); invalidate() },
onError: e => toast.error(getErrorMessage(e)),
})
// PUT /budget/ccm — chỉ khi canEditCcm. initialAmount + adjustmentAmount.
@@ -1075,7 +1075,7 @@ function PeBudgetSummaryTable({ ev, readOnly }: { ev: PeDetailBundle; readOnly: