From 7daca04cc122a85f46ef3e81fc751825a77b0e4e Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 17:54:03 +0700 Subject: [PATCH 01/11] refactor(FE-435): Add required asterisks to table headers --- .../form/ExpenseRequestKandangDetailExpense.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx b/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx index 11f54585..2c4edc7e 100644 --- a/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx +++ b/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx @@ -145,9 +145,15 @@ const ExpenseRequestKandangDetailExpense: React.FC< - - - + + + {type !== 'detail' && } From 8f4f3d93b893a279c9abedf968e5aa31e2e28f69 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 18:38:59 +0700 Subject: [PATCH 02/11] refactor(FE-435,436): Add location_id to expense form and payload --- .../pages/expense/form/ExpenseRequestForm.schema.ts | 4 ++++ .../pages/expense/form/ExpenseRequestForm.tsx | 7 +++++++ .../form/ExpenseRequestKandangDetailExpense.tsx | 11 +++++++++-- src/services/api/expense.ts | 2 ++ src/types/api/expense.d.ts | 2 ++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts index 7758df83..134da3be 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts +++ b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts @@ -11,6 +11,7 @@ type ExpenseFormSchemaType = { value: number; label: string; }; + location_id: number; transaction_date?: string; kandangs?: { id: number; name: string }[]; supplier?: { @@ -46,6 +47,8 @@ export const ExpenseRequestFormSchema: Yup.ObjectSchema = label: Yup.string().required(), }).required('Lokasi wajib diisi!'), + location_id: Yup.number().min(1).required('Lokasi wajib diisi!'), + transaction_date: Yup.string().required('Tanggal transaksi wajib diisi!'), kandangs: Yup.array() .of( @@ -128,6 +131,7 @@ export const getExpenseFormInitialValues = ( label: initialValues.location.name, } : undefined, + location_id: Number(initialValues?.location.id || 0), transaction_date: initialValues?.transaction_date ? formatDate(initialValues.transaction_date, 'YYYY-MM-DD') : undefined, diff --git a/src/components/pages/expense/form/ExpenseRequestForm.tsx b/src/components/pages/expense/form/ExpenseRequestForm.tsx index 71160785..10c222eb 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.tsx +++ b/src/components/pages/expense/form/ExpenseRequestForm.tsx @@ -108,6 +108,7 @@ const ExpenseRequestForm = ({ const expensePayload: CreateExpensePayload = { category: formik.values.category?.value as 'BOP' | 'NON-BOP', + location_id: values.location_id as number, transaction_date: values?.transaction_date as string, supplier_id: values.supplier?.value as number, documents: values.documents as File[], @@ -130,6 +131,7 @@ const ExpenseRequestForm = ({ case 'edit': const expenseUpdatePayload: UpdateExpensePayload = { category: formik.values.category?.value as 'BOP' | 'NON-BOP', + location_id: values.location_id as number, transaction_date: values?.transaction_date as string, supplier_id: values.supplier?.value as number, documents: values.documents as File[], @@ -179,6 +181,9 @@ const ExpenseRequestForm = ({ formik.setFieldTouched('location', true); formik.setFieldValue('location', val); + const locationId = Array.isArray(val) ? val[0]?.value : val?.value; + formik.setFieldValue('location_id', locationId); + formik.setFieldValue('kandangs', []); formik.setFieldValue('expense_nonstocks', []); }; @@ -454,7 +459,9 @@ const ExpenseRequestForm = ({ )} ; + supplierId?: number; className?: { wrapper?: string; }; @@ -28,12 +29,18 @@ interface ExpenseRequestKandangDetailExpenseProps { const ExpenseRequestKandangDetailExpense: React.FC< ExpenseRequestKandangDetailExpenseProps -> = ({ type, formik, className }) => { +> = ({ type, formik, supplierId, className }) => { const { setInputValue: setNonstockInputValue, options: nonstockOptions, isLoadingOptions: isLoadingNonstockOptions, - } = useSelect(NonstockApi.basePath, 'id', 'name'); + } = useSelect( + NonstockApi.basePath, + 'id', + 'name', + 'search', + supplierId ? { supplier_id: String(supplierId) } : undefined + ); const nonstockChangeHandler = ( kandangExpenseIdx: number, diff --git a/src/services/api/expense.ts b/src/services/api/expense.ts index 44a855f4..70e0e339 100644 --- a/src/services/api/expense.ts +++ b/src/services/api/expense.ts @@ -483,6 +483,7 @@ export class ExpenseApiService extends BaseApiService< const formData = new FormData(); formData.append('category', payload.category); + formData.append('location_id', String(payload.location_id)); formData.append('transaction_date', payload.transaction_date); formData.append('supplier_id', String(payload.supplier_id)); @@ -505,6 +506,7 @@ export class ExpenseApiService extends BaseApiService< const formData = new FormData(); formData.append('category', payload.category); + formData.append('location_id', String(payload.location_id)); formData.append('transaction_date', payload.transaction_date); formData.append('supplier_id', String(payload.supplier_id)); diff --git a/src/types/api/expense.d.ts b/src/types/api/expense.d.ts index a62066ba..ff7ead09 100644 --- a/src/types/api/expense.d.ts +++ b/src/types/api/expense.d.ts @@ -57,6 +57,7 @@ export type Expense = BaseMetadata & BaseExpense; export type CreateExpensePayload = { category: 'BOP' | 'NON-BOP'; + location_id: number; transaction_date: string; supplier_id: number; documents: File[]; @@ -72,6 +73,7 @@ export type CreateExpensePayload = { }; export type UpdateExpensePayload = { + location_id: number; category: 'BOP' | 'NON-BOP'; transaction_date: string; supplier_id: number; From d2e88c20613bbf81445c0d2db9c6f560c053c438 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 18:53:46 +0700 Subject: [PATCH 03/11] refactor(FE-435,436): Allow optional kandang and location expenses --- .../expense/form/ExpenseKandangsTable.tsx | 12 ++- .../expense/form/ExpenseRealizationForm.tsx | 12 ++- .../expense/form/ExpenseRequestForm.schema.ts | 16 ++-- .../pages/expense/form/ExpenseRequestForm.tsx | 92 +++++++++++-------- .../ExpenseRequestKandangDetailExpense.tsx | 32 +++++-- src/types/api/expense.d.ts | 4 +- 6 files changed, 107 insertions(+), 61 deletions(-) diff --git a/src/components/pages/expense/form/ExpenseKandangsTable.tsx b/src/components/pages/expense/form/ExpenseKandangsTable.tsx index b3c9f46d..7d7f76ca 100644 --- a/src/components/pages/expense/form/ExpenseKandangsTable.tsx +++ b/src/components/pages/expense/form/ExpenseKandangsTable.tsx @@ -20,10 +20,10 @@ interface ExpenseKandangsTableProps { locationId?: number; type: 'add' | 'edit' | 'detail'; selectedKandangs: { - id: number; - name: string; + id?: number; + name?: string; }[]; - onChange: (kandangs: { id: number; name: string }[]) => void; + onChange: (kandangs: { id?: number; name?: string }[]) => void; className?: { wrapper?: string; }; @@ -67,7 +67,11 @@ const ExpenseKandangsTable = ({ ); const [sorting, setSorting] = useState([]); const [rowSelection, setRowSelection] = useState>( - convertRowSelectionArrToObj(selectedKandangs.map((item) => item.id)) + convertRowSelectionArrToObj( + selectedKandangs + .map((item) => item.id) + .filter((id): id is number => id !== undefined) + ) ); const kandangsColumns: ColumnDef[] = [ diff --git a/src/components/pages/expense/form/ExpenseRealizationForm.tsx b/src/components/pages/expense/form/ExpenseRealizationForm.tsx index d1c7c5f2..d1c6353e 100644 --- a/src/components/pages/expense/form/ExpenseRealizationForm.tsx +++ b/src/components/pages/expense/form/ExpenseRealizationForm.tsx @@ -153,7 +153,9 @@ const ExpenseRealizationForm = ({ formik.setFieldValue('realizations', []); }; - const kandangsChangeHandler = (kandangs: { id: number; name: string }[]) => { + const kandangsChangeHandler = ( + kandangs: { id?: number; name?: string }[] + ) => { formik.setFieldTouched('kandangs', true); formik.setFieldValue('kandangs', kandangs); @@ -161,6 +163,8 @@ const ExpenseRealizationForm = ({ // add new realizations kandangs.forEach((kandangItem) => { + if (!kandangItem.id) return; + const isKandangExistInRealization = newRealizations.find( (realizationItem) => realizationItem.kandang_id === kandangItem.id ); @@ -181,7 +185,11 @@ const ExpenseRealizationForm = ({ }); // prune realizations - const kandangIds = new Set(kandangs.map((kandang) => kandang.id)); + const kandangIds = new Set( + kandangs + .map((kandang) => kandang.id) + .filter((id): id is number => id !== undefined) + ); const deletedRealizationsIdx: number[] = []; newRealizations.forEach((realization, idx) => { diff --git a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts index 134da3be..4a4c921b 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts +++ b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts @@ -13,7 +13,7 @@ type ExpenseFormSchemaType = { }; location_id: number; transaction_date?: string; - kandangs?: { id: number; name: string }[]; + kandangs?: { id?: number; name?: string }[]; supplier?: { value: number; label: string; @@ -22,7 +22,7 @@ type ExpenseFormSchemaType = { deleted_documents?: number[]; documents?: File[]; expense_nonstocks: { - kandang_id: number; + kandang_id?: number | null; cost_items: { nonstock?: { value: number; @@ -53,12 +53,11 @@ export const ExpenseRequestFormSchema: Yup.ObjectSchema = kandangs: Yup.array() .of( Yup.object({ - id: Yup.number().required('Kandang wajib dipilih!'), - name: Yup.string().required('Kandang wajib dipilih!'), + id: Yup.number().optional(), + name: Yup.string().optional(), }) ) - .min(1, 'Kandang wajib dipilih!') - .required('Kandang wajib dipilih!'), + .optional(), supplier: Yup.object({ value: Yup.number().min(1).required(), @@ -80,7 +79,10 @@ export const ExpenseRequestFormSchema: Yup.ObjectSchema = expense_nonstocks: Yup.array() .of( Yup.object({ - kandang_id: Yup.number().min(1, 'Wajib memilih kandang!').required(), + kandang_id: Yup.number() + .min(1, 'Wajib memilih kandang!') + .nullable() + .optional(), cost_items: Yup.array() .of( Yup.object({ diff --git a/src/components/pages/expense/form/ExpenseRequestForm.tsx b/src/components/pages/expense/form/ExpenseRequestForm.tsx index 10c222eb..e8ad0843 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.tsx +++ b/src/components/pages/expense/form/ExpenseRequestForm.tsx @@ -113,7 +113,7 @@ const ExpenseRequestForm = ({ supplier_id: values.supplier?.value as number, documents: values.documents as File[], expense_nonstocks: values.expense_nonstocks.map((expenseNonstock) => ({ - kandang_id: expenseNonstock.kandang_id, + kandang_id: expenseNonstock.kandang_id ?? null, cost_items: expenseNonstock.cost_items.map((costItem) => ({ nonstock_id: costItem.nonstock?.value as number, quantity: parseFloat(String(costItem.quantity)) as number, @@ -137,7 +137,7 @@ const ExpenseRequestForm = ({ documents: values.documents as File[], expense_nonstocks: values.expense_nonstocks.map( (expenseNonstock) => ({ - kandang_id: expenseNonstock.kandang_id, + kandang_id: expenseNonstock.kandang_id ?? null, cost_items: expenseNonstock.cost_items.map((costItem) => ({ nonstock_id: costItem.nonstock?.value as number, quantity: parseFloat(String(costItem.quantity)) as number, @@ -185,26 +185,11 @@ const ExpenseRequestForm = ({ formik.setFieldValue('location_id', locationId); formik.setFieldValue('kandangs', []); - formik.setFieldValue('expense_nonstocks', []); - }; - const kandangsChangeHandler = (kandangs: { id: number; name: string }[]) => { - formik.setFieldTouched('kandangs', true); - formik.setFieldValue('kandangs', kandangs); - - const newExpenseNonstocks = [...(formik.values.expense_nonstocks ?? [])]; - - // add new expense_nonstocks - kandangs.forEach((kandangItem) => { - const isKandangExistInExpenseNonstocks = newExpenseNonstocks.find( - (expenseNonstockItem) => - expenseNonstockItem.kandang_id === kandangItem.id - ); - - if (isKandangExistInExpenseNonstocks) return; - - newExpenseNonstocks.push({ - kandang_id: kandangItem.id, + // Auto-create expense item for location (without kandang) + formik.setFieldValue('expense_nonstocks', [ + { + kandang_id: null, cost_items: [ { nonstock: undefined, @@ -213,25 +198,57 @@ const ExpenseRequestForm = ({ notes: '', }, ], + }, + ]); + }; + + const kandangsChangeHandler = ( + kandangs: { id?: number; name?: string }[] + ) => { + formik.setFieldTouched('kandangs', true); + formik.setFieldValue('kandangs', kandangs); + + // If no kandangs selected, create expense item for location + if (kandangs.length === 0) { + formik.setFieldValue('expense_nonstocks', [ + { + kandang_id: null, + cost_items: [ + { + nonstock: undefined, + quantity: undefined, + price: undefined, + notes: '', + }, + ], + }, + ]); + return; + } + + const newExpenseNonstocks: typeof formik.values.expense_nonstocks = []; + + kandangs.forEach((kandangItem) => { + if (!kandangItem.id) return; + + const existingExpenseNonstock = formik.values.expense_nonstocks?.find( + (expenseNonstockItem) => + expenseNonstockItem.kandang_id === kandangItem.id + ); + + newExpenseNonstocks.push({ + kandang_id: kandangItem.id, + cost_items: existingExpenseNonstock?.cost_items || [ + { + nonstock: undefined, + quantity: undefined, + price: undefined, + notes: '', + }, + ], }); }); - // prune expense_nonstocks - const kandangIds = new Set(kandangs.map((kandang) => kandang.id)); - const deletedExpenseNonstocksIdx: number[] = []; - - newExpenseNonstocks.forEach((expenseNonstock, idx) => { - const isExpenseNonstockValid = kandangIds.has(expenseNonstock.kandang_id); - - if (!isExpenseNonstockValid) { - deletedExpenseNonstocksIdx.push(idx); - } - }); - - deletedExpenseNonstocksIdx.forEach((deletedExpenseNonstockIdx) => { - newExpenseNonstocks.splice(deletedExpenseNonstockIdx, 1); - }); - formik.setFieldValue('expense_nonstocks', newExpenseNonstocks); }; @@ -462,6 +479,7 @@ const ExpenseRequestForm = ({ type={type} formik={formik} supplierId={formik.values.supplier?.value as number} + location={formik.values.location} className={{ wrapper: 'col-span-12', }} diff --git a/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx b/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx index abe7bc24..e219870e 100644 --- a/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx +++ b/src/components/pages/expense/form/ExpenseRequestKandangDetailExpense.tsx @@ -22,6 +22,10 @@ interface ExpenseRequestKandangDetailExpenseProps { type?: 'add' | 'edit' | 'detail'; formik: FormikContextType; supplierId?: number; + location?: { + value: number; + label: string; + }; className?: { wrapper?: string; }; @@ -29,7 +33,7 @@ interface ExpenseRequestKandangDetailExpenseProps { const ExpenseRequestKandangDetailExpense: React.FC< ExpenseRequestKandangDetailExpenseProps -> = ({ type, formik, supplierId, className }) => { +> = ({ type, formik, supplierId, location, className }) => { const { setInputValue: setNonstockInputValue, options: nonstockOptions, @@ -120,32 +124,42 @@ const ExpenseRequestKandangDetailExpense: React.FC<
- {(formik.values.expense_nonstocks.length === 0 || - !formik.values.supplier?.value) && ( + {!formik.values.supplier?.value && (

- Pilih kandang terlebih dahulu! + Pilih supplier terlebih dahulu!

)} + {formik.values.expense_nonstocks.length === 0 && + formik.values.supplier?.value && ( +
+

+ Belum ada item biaya. Silakan pilih lokasi terlebih dahulu. +

+
+ )} + {formik.values.expense_nonstocks.length > 0 && formik.values.supplier?.value && formik.values.expense_nonstocks.map( (kandangExpense, kandangExpenseIdx) => { - const kandangName = formik.values.kandangs?.find( - (kandang) => kandang.id === kandangExpense.kandang_id - ); + const kandangName = kandangExpense.kandang_id + ? formik.values.kandangs?.find( + (kandang) => kandang.id === kandangExpense.kandang_id + ) + : null; return ( - kandangName?.name && ( + (kandangName?.name || !kandangExpense.kandang_id) && (
- Biaya {kandangName?.name} + Biaya {kandangName?.name || location?.label || 'Umum'}
diff --git a/src/types/api/expense.d.ts b/src/types/api/expense.d.ts index ff7ead09..36657d90 100644 --- a/src/types/api/expense.d.ts +++ b/src/types/api/expense.d.ts @@ -62,7 +62,7 @@ export type CreateExpensePayload = { supplier_id: number; documents: File[]; expense_nonstocks: { - kandang_id: number; + kandang_id: number | null; cost_items: { nonstock_id: number; quantity: number; @@ -79,7 +79,7 @@ export type UpdateExpensePayload = { supplier_id: number; documents: File[]; expense_nonstocks: { - kandang_id: number; + kandang_id: number | null; cost_items: { nonstock_id: number; quantity: number; From a81a61135ff97c14a592b9c16ed74f9d6f2fa913 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 19:03:26 +0700 Subject: [PATCH 04/11] refactor(FE-435,436): Exclude null kandang_id from expense payload --- .../pages/expense/form/ExpenseRequestForm.tsx | 46 +++++++++++-------- src/types/api/expense.d.ts | 4 +- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/components/pages/expense/form/ExpenseRequestForm.tsx b/src/components/pages/expense/form/ExpenseRequestForm.tsx index e8ad0843..78646e37 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.tsx +++ b/src/components/pages/expense/form/ExpenseRequestForm.tsx @@ -112,15 +112,20 @@ const ExpenseRequestForm = ({ transaction_date: values?.transaction_date as string, supplier_id: values.supplier?.value as number, documents: values.documents as File[], - expense_nonstocks: values.expense_nonstocks.map((expenseNonstock) => ({ - kandang_id: expenseNonstock.kandang_id ?? null, - cost_items: expenseNonstock.cost_items.map((costItem) => ({ - nonstock_id: costItem.nonstock?.value as number, - quantity: parseFloat(String(costItem.quantity)) as number, - price: parseFloat(String(costItem.price)) as number, - notes: costItem.notes ?? '', - })), - })), + expense_nonstocks: values.expense_nonstocks.map((expenseNonstock) => { + const basePayload = { + cost_items: expenseNonstock.cost_items.map((costItem) => ({ + nonstock_id: costItem.nonstock?.value as number, + quantity: parseFloat(String(costItem.quantity)) as number, + price: parseFloat(String(costItem.price)) as number, + notes: costItem.notes ?? '', + })), + }; + + return expenseNonstock.kandang_id !== null + ? { ...basePayload, kandang_id: expenseNonstock.kandang_id } + : basePayload; + }), }; switch (type) { @@ -136,15 +141,20 @@ const ExpenseRequestForm = ({ supplier_id: values.supplier?.value as number, documents: values.documents as File[], expense_nonstocks: values.expense_nonstocks.map( - (expenseNonstock) => ({ - kandang_id: expenseNonstock.kandang_id ?? null, - cost_items: expenseNonstock.cost_items.map((costItem) => ({ - nonstock_id: costItem.nonstock?.value as number, - quantity: parseFloat(String(costItem.quantity)) as number, - price: parseFloat(String(costItem.price)) as number, - notes: costItem.notes ?? '', - })), - }) + (expenseNonstock) => { + const basePayload = { + cost_items: expenseNonstock.cost_items.map((costItem) => ({ + nonstock_id: costItem.nonstock?.value as number, + quantity: parseFloat(String(costItem.quantity)) as number, + price: parseFloat(String(costItem.price)) as number, + notes: costItem.notes ?? '', + })), + }; + + return expenseNonstock.kandang_id !== null + ? { ...basePayload, kandang_id: expenseNonstock.kandang_id } + : basePayload; + } ), }; diff --git a/src/types/api/expense.d.ts b/src/types/api/expense.d.ts index 36657d90..12455cc8 100644 --- a/src/types/api/expense.d.ts +++ b/src/types/api/expense.d.ts @@ -62,7 +62,7 @@ export type CreateExpensePayload = { supplier_id: number; documents: File[]; expense_nonstocks: { - kandang_id: number | null; + kandang_id?: number; cost_items: { nonstock_id: number; quantity: number; @@ -79,7 +79,7 @@ export type UpdateExpensePayload = { supplier_id: number; documents: File[]; expense_nonstocks: { - kandang_id: number | null; + kandang_id?: number; cost_items: { nonstock_id: number; quantity: number; From 2bf0f2874ee7994dc65901090e3445fdd7a959bb Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 19:28:38 +0700 Subject: [PATCH 05/11] refactor(FE-435): Allow realizations without kandang --- .../form/ExpenseRealizationForm.schema.ts | 21 +- .../expense/form/ExpenseRealizationForm.tsx | 96 +++--- ...ExpenseRealizationKandangDetailExpense.tsx | 276 ++++++++++-------- .../expense/form/ExpenseRequestForm.schema.ts | 7 +- .../pages/expense/form/ExpenseRequestForm.tsx | 6 +- 5 files changed, 219 insertions(+), 187 deletions(-) diff --git a/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts b/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts index 77db761c..f22e72ed 100644 --- a/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts +++ b/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts @@ -12,7 +12,7 @@ type ExpenseRealizationFormSchemaType = { label: string; }; realization_date?: string; - kandangs?: { id: number; name: string }[]; + kandangs?: { id?: number; name?: string }[]; supplier?: { value: number; label: string; @@ -20,7 +20,7 @@ type ExpenseRealizationFormSchemaType = { existing_documents?: { name: string; url: string }[]; documents?: File[]; realizations: { - kandang_id: number; + kandang_id?: number; cost_items: { nonstock?: { value: number; @@ -49,12 +49,11 @@ export const ExpenseRealizationFormSchema: Yup.ObjectSchema { - formik.setFieldTouched('kandangs', true); - formik.setFieldValue('kandangs', kandangs); - - const newRealizations = [...(formik.values.realizations ?? [])]; - - // add new realizations - kandangs.forEach((kandangItem) => { - if (!kandangItem.id) return; - - const isKandangExistInRealization = newRealizations.find( - (realizationItem) => realizationItem.kandang_id === kandangItem.id - ); - - if (isKandangExistInRealization) return; - - newRealizations.push({ - kandang_id: kandangItem.id, + // Auto-create realization item for location (without kandang) + formik.setFieldValue('realizations', [ + { cost_items: [ { nonstock: undefined, @@ -181,29 +162,57 @@ const ExpenseRealizationForm = ({ notes: '', }, ], + }, + ]); + }; + + const kandangsChangeHandler = ( + kandangs: { id?: number; name?: string }[] + ) => { + formik.setFieldTouched('kandangs', true); + formik.setFieldValue('kandangs', kandangs); + + // If no kandangs selected, create realization item for location + if (kandangs.length === 0) { + formik.setFieldValue('realizations', [ + { + cost_items: [ + { + nonstock: undefined, + quantity: undefined, + price: undefined, + notes: '', + }, + ], + }, + ]); + return; + } + + // Start with empty array when kandangs are selected + const newRealizations: typeof formik.values.realizations = []; + + // add new realizations for each kandang + kandangs.forEach((kandangItem) => { + if (!kandangItem.id) return; + + const existingRealization = formik.values.realizations?.find( + (realizationItem) => realizationItem.kandang_id === kandangItem.id + ); + + newRealizations.push({ + kandang_id: kandangItem.id, + cost_items: existingRealization?.cost_items || [ + { + nonstock: undefined, + quantity: undefined, + price: undefined, + notes: '', + }, + ], }); }); - // prune realizations - const kandangIds = new Set( - kandangs - .map((kandang) => kandang.id) - .filter((id): id is number => id !== undefined) - ); - const deletedRealizationsIdx: number[] = []; - - newRealizations.forEach((realization, idx) => { - const isRealizationValid = kandangIds.has(realization.kandang_id); - - if (!isRealizationValid) { - deletedRealizationsIdx.push(idx); - } - }); - - deletedRealizationsIdx.forEach((deletedRealizationIdx) => { - newRealizations.splice(deletedRealizationIdx, 1); - }); - formik.setFieldValue('realizations', newRealizations); }; @@ -346,7 +355,10 @@ const ExpenseRealizationForm = ({ )} ; + supplierId?: number; + location?: { + value: number; + label: string; + }; className?: { wrapper?: string; }; @@ -25,12 +30,18 @@ interface ExpenseRealizationKandangDetailExpenseProps { const ExpenseRealizationKandangDetailExpense: React.FC< ExpenseRealizationKandangDetailExpenseProps -> = ({ type, formik, className }) => { +> = ({ type, formik, supplierId, location, className }) => { const { setInputValue: setNonstockInputValue, options: nonstockOptions, isLoadingOptions: isLoadingNonstockOptions, - } = useSelect(NonstockApi.basePath, 'id', 'name'); + } = useSelect( + NonstockApi.basePath, + 'id', + 'name', + 'search', + supplierId ? { supplier_id: String(supplierId) } : undefined + ); const nonstockChangeHandler = ( kandangExpenseIdx: number, @@ -82,140 +93,155 @@ const ExpenseRealizationKandangDetailExpense: React.FC<
- {formik.values.realizations.length === 0 && ( + {!formik.values.supplier?.value && (

- Pilih kandang terlebih dahulu! + Pilih supplier terlebih dahulu!

)} - {formik.values.realizations.map((kandangExpense, kandangExpenseIdx) => { - const kandangName = formik.values.kandangs?.find( - (kandang) => kandang.id === kandangExpense.kandang_id - ); + {formik.values.realizations.length === 0 && + formik.values.supplier?.value && ( +
+

+ Belum ada item biaya. Silakan pilih lokasi terlebih dahulu. +

+
+ )} - return ( - kandangName?.name && ( -
-
-
- Biaya {kandangName?.name} -
+ {formik.values.realizations.length > 0 && + formik.values.supplier?.value && + formik.values.realizations.map( + (kandangExpense, kandangExpenseIdx) => { + const kandangName = kandangExpense.kandang_id + ? formik.values.kandangs?.find( + (kandang) => kandang.id === kandangExpense.kandang_id + ) + : null; -
-
NonstockTotal KuantitasHarga Satuan + Nonstock + + Total Kuantitas + + Harga Satuan + CatatanAksi
- - - - - - - - + return ( + (kandangName?.name || !kandangExpense.kandang_id) && ( +
+
+
+ Biaya {kandangName?.name || location?.label || 'Umum'} +
-
- {kandangExpense.cost_items.map( - (expenseItem, expenseIdx) => ( - - - - - - - - +
+
NonstockTotal KuantitasHarga SatuanCatatan
- { - nonstockChangeHandler( - kandangExpenseIdx, - expenseIdx, - val - ); - }} - options={nonstockOptions} - isLoading={isLoadingNonstockOptions} - onInputChange={setNonstockInputValue} - className={{ wrapper: 'min-w-48' }} - isDisabled - /> - - - - - Rp - - } - className={{ wrapper: 'min-w-24' }} - /> - - -
+ + + + + + - ) - )} - -
NonstockTotal KuantitasHarga SatuanCatatan
+ + + + {kandangExpense.cost_items.map( + (expenseItem, expenseIdx) => ( + + + { + nonstockChangeHandler( + kandangExpenseIdx, + expenseIdx, + val + ); + }} + options={nonstockOptions} + isLoading={isLoadingNonstockOptions} + onInputChange={setNonstockInputValue} + className={{ wrapper: 'min-w-48' }} + isDisabled + /> + + + + + + + + + Rp + + } + className={{ wrapper: 'min-w-24' }} + /> + + + + + + + ) + )} + + + + - - - ) - ); - })} + ) + ); + } + )} ); diff --git a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts index 4a4c921b..f0dfecd7 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts +++ b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts @@ -22,7 +22,7 @@ type ExpenseFormSchemaType = { deleted_documents?: number[]; documents?: File[]; expense_nonstocks: { - kandang_id?: number | null; + kandang_id?: number; cost_items: { nonstock?: { value: number; @@ -79,10 +79,7 @@ export const ExpenseRequestFormSchema: Yup.ObjectSchema = expense_nonstocks: Yup.array() .of( Yup.object({ - kandang_id: Yup.number() - .min(1, 'Wajib memilih kandang!') - .nullable() - .optional(), + kandang_id: Yup.number().min(1, 'Wajib memilih kandang!').optional(), cost_items: Yup.array() .of( Yup.object({ diff --git a/src/components/pages/expense/form/ExpenseRequestForm.tsx b/src/components/pages/expense/form/ExpenseRequestForm.tsx index 78646e37..60e55397 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.tsx +++ b/src/components/pages/expense/form/ExpenseRequestForm.tsx @@ -122,7 +122,7 @@ const ExpenseRequestForm = ({ })), }; - return expenseNonstock.kandang_id !== null + return expenseNonstock.kandang_id ? { ...basePayload, kandang_id: expenseNonstock.kandang_id } : basePayload; }), @@ -151,7 +151,7 @@ const ExpenseRequestForm = ({ })), }; - return expenseNonstock.kandang_id !== null + return expenseNonstock.kandang_id ? { ...basePayload, kandang_id: expenseNonstock.kandang_id } : basePayload; } @@ -199,7 +199,6 @@ const ExpenseRequestForm = ({ // Auto-create expense item for location (without kandang) formik.setFieldValue('expense_nonstocks', [ { - kandang_id: null, cost_items: [ { nonstock: undefined, @@ -222,7 +221,6 @@ const ExpenseRequestForm = ({ if (kandangs.length === 0) { formik.setFieldValue('expense_nonstocks', [ { - kandang_id: null, cost_items: [ { nonstock: undefined, From 6185fafb57ac018a6923a8995a16f3ef71ea210f Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 19:56:31 +0700 Subject: [PATCH 06/11] refactor(FE-435): Multiply qty by price when summing expenses --- src/components/pages/expense/ExpenseRealizationContent.tsx | 4 ++-- src/components/pages/expense/ExpenseRequestContent.tsx | 2 +- src/components/pages/expense/pdf/ExpensePDF.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/pages/expense/ExpenseRealizationContent.tsx b/src/components/pages/expense/ExpenseRealizationContent.tsx index c69f089f..57dc74c4 100644 --- a/src/components/pages/expense/ExpenseRealizationContent.tsx +++ b/src/components/pages/expense/ExpenseRealizationContent.tsx @@ -211,7 +211,7 @@ const ExpenseRealizationContent = ({ let expenseGrandTotal = 0; kandangExpense.pengajuans?.forEach( - (item) => (expenseGrandTotal += item.price) + (item) => (expenseGrandTotal += item.qty * item.price) ); return ( @@ -273,7 +273,7 @@ const ExpenseRealizationContent = ({ let expenseGrandTotal = 0; kandangExpense.realisasi?.forEach( - (item) => (expenseGrandTotal += item.price) + (item) => (expenseGrandTotal += item.qty * item.price) ); return ( diff --git a/src/components/pages/expense/ExpenseRequestContent.tsx b/src/components/pages/expense/ExpenseRequestContent.tsx index b937c5bc..329daeab 100644 --- a/src/components/pages/expense/ExpenseRequestContent.tsx +++ b/src/components/pages/expense/ExpenseRequestContent.tsx @@ -558,7 +558,7 @@ const ExpenseRequestContent = ({ let expenseGrandTotal = 0; kandangExpense.pengajuans?.forEach( - (item) => (expenseGrandTotal += item.price) + (item) => (expenseGrandTotal += item.qty * item.price) ); return ( diff --git a/src/components/pages/expense/pdf/ExpensePDF.tsx b/src/components/pages/expense/pdf/ExpensePDF.tsx index 5b107127..54304015 100644 --- a/src/components/pages/expense/pdf/ExpensePDF.tsx +++ b/src/components/pages/expense/pdf/ExpensePDF.tsx @@ -326,7 +326,7 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { let expenseRequestTotal = 0; kandangExpense.pengajuans?.forEach( - (item) => (expenseRequestTotal += item.price) + (item) => (expenseRequestTotal += item.qty * item.price) ); return ( @@ -484,7 +484,7 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { let expenseRealizationTotal = 0; kandangExpense.realisasi?.forEach( - (item) => (expenseRealizationTotal += item.price) + (item) => (expenseRealizationTotal += item.qty * item.price) ); return ( From 13c1a82142aef43fd82292c917e8fd04a88ad3d6 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 20:19:05 +0700 Subject: [PATCH 07/11] refactor(FE-435,436): Select Nominal Biaya by approval step --- src/components/pages/expense/ExpenseRequestContent.tsx | 9 ++++++++- src/components/pages/expense/pdf/ExpensePDF.tsx | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/pages/expense/ExpenseRequestContent.tsx b/src/components/pages/expense/ExpenseRequestContent.tsx index 329daeab..b561ff29 100644 --- a/src/components/pages/expense/ExpenseRequestContent.tsx +++ b/src/components/pages/expense/ExpenseRequestContent.tsx @@ -448,7 +448,14 @@ const ExpenseRequestContent = ({ Nominal Biaya : - {formatCurrency(initialValues?.grand_total ?? 0)} + + {formatCurrency( + initialValues?.latest_approval.step_number === 4 || + initialValues?.latest_approval.step_number === 5 + ? (initialValues?.total_realisasi ?? 0) + : (initialValues?.total_pengajuan ?? 0) + )} + Status Pencairan diff --git a/src/components/pages/expense/pdf/ExpensePDF.tsx b/src/components/pages/expense/pdf/ExpensePDF.tsx index 54304015..c9c63203 100644 --- a/src/components/pages/expense/pdf/ExpensePDF.tsx +++ b/src/components/pages/expense/pdf/ExpensePDF.tsx @@ -235,7 +235,12 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { { label: 'Nama Pengaju', value: expense?.created_user.name }, { label: 'Nominal Biaya', - value: formatCurrency(expense?.grand_total ?? 0), + value: formatCurrency( + expense?.latest_approval.step_number === 4 || + expense?.latest_approval.step_number === 5 + ? (expense?.total_realisasi ?? 0) + : (expense?.total_pengajuan ?? 0) + ), }, { label: 'Nominal Pengajuan', From c291ba3246758fab9c8db291aa75d40fde704bf1 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 20:52:12 +0700 Subject: [PATCH 08/11] refactor(FE-435,436): Use S3 public base URL for document links --- .../expense/ExpenseRealizationContent.tsx | 46 +++++++++++-------- .../pages/expense/ExpenseRequestContent.tsx | 46 +++++++++++-------- .../form/ExpenseRealizationForm.schema.ts | 12 +++-- .../expense/form/ExpenseRequestForm.schema.ts | 14 ++++-- src/config/constant.ts | 3 ++ 5 files changed, 74 insertions(+), 47 deletions(-) diff --git a/src/components/pages/expense/ExpenseRealizationContent.tsx b/src/components/pages/expense/ExpenseRealizationContent.tsx index 57dc74c4..ccd57ec3 100644 --- a/src/components/pages/expense/ExpenseRealizationContent.tsx +++ b/src/components/pages/expense/ExpenseRealizationContent.tsx @@ -16,7 +16,7 @@ import { } from '@/components/pages/expense/form/ExpenseRequestForm.schema'; import { ExpenseApi } from '@/services/api/expense'; import { isResponseSuccess } from '@/lib/api-helper'; -import { ACCEPTED_FILE_TYPE } from '@/config/constant'; +import { ACCEPTED_FILE_TYPE, S3_PUBLIC_BASE_URL } from '@/config/constant'; interface ExpenseRealizationContentProps { initialValues?: Expense; @@ -103,24 +103,32 @@ const ExpenseRealizationContent = ({ initialValues?.realization_docs.length > 0 && (
    {initialValues?.realization_docs.map( - (realizationDocument, realizationDocumentIdx) => ( -
  • - - {realizationDocument.path}{' '} - - -
  • - ) + (realizationDocument, realizationDocumentIdx) => { + const path = realizationDocument.path.startsWith( + '/' + ) + ? realizationDocument.path.slice(1) + : realizationDocument.path; + const documentUrl = `${S3_PUBLIC_BASE_URL}/${path}`; + return ( +
  • + + {realizationDocument.path}{' '} + + +
  • + ); + } )}
)} diff --git a/src/components/pages/expense/ExpenseRequestContent.tsx b/src/components/pages/expense/ExpenseRequestContent.tsx index b561ff29..bff371df 100644 --- a/src/components/pages/expense/ExpenseRequestContent.tsx +++ b/src/components/pages/expense/ExpenseRequestContent.tsx @@ -27,7 +27,7 @@ import { UploadRequestDocumentsFormSchema, UploadRequestDocumentsFormValues, } from '@/components/pages/expense/form/ExpenseRequestForm.schema'; -import { ACCEPTED_FILE_TYPE } from '@/config/constant'; +import { ACCEPTED_FILE_TYPE, S3_PUBLIC_BASE_URL } from '@/config/constant'; import { ExpenseApi } from '@/services/api/expense'; import { isResponseSuccess } from '@/lib/api-helper'; import { EXPENSE_REQUEST_APPROVAL_LINE } from '@/config/approval-line'; @@ -489,24 +489,32 @@ const ExpenseRequestContent = ({ initialValues?.documents.length > 0 && (
    {initialValues?.documents.map( - (requestDocument, requestDocumentIdx) => ( -
  • - - {requestDocument.path}{' '} - - -
  • - ) + (requestDocument, requestDocumentIdx) => { + const path = requestDocument.path.startsWith( + '/' + ) + ? requestDocument.path.slice(1) + : requestDocument.path; + const documentUrl = `${S3_PUBLIC_BASE_URL}/${path}`; + return ( +
  • + + {requestDocument.path}{' '} + + +
  • + ); + } )}
)} diff --git a/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts b/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts index f22e72ed..1f3682ea 100644 --- a/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts +++ b/src/components/pages/expense/form/ExpenseRealizationForm.schema.ts @@ -1,6 +1,7 @@ import * as Yup from 'yup'; import { Expense } from '@/types/api/expense'; import { formatDate } from '@/lib/helper'; +import { S3_PUBLIC_BASE_URL } from '@/config/constant'; type ExpenseRealizationFormSchemaType = { category?: { @@ -138,10 +139,13 @@ export const getExpenseRealizationFormInitialValues = ( label: initialValues.supplier.name, } : undefined, - existing_documents: initialValues?.realization_docs?.map((doc) => ({ - name: doc.path, - url: doc.path, - })), + existing_documents: initialValues?.realization_docs?.map((doc) => { + const path = doc.path.startsWith('/') ? doc.path.slice(1) : doc.path; + return { + name: doc.path, + url: `${S3_PUBLIC_BASE_URL}/${path}`, + }; + }), documents: [], realizations: initialValues?.kandangs ? initialValues.kandangs.map((kandangExpense) => { diff --git a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts index f0dfecd7..71357361 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts +++ b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts @@ -1,6 +1,7 @@ import * as Yup from 'yup'; import { Expense } from '@/types/api/expense'; import { formatDate } from '@/lib/helper'; +import { S3_PUBLIC_BASE_URL } from '@/config/constant'; type ExpenseFormSchemaType = { category?: { @@ -144,11 +145,14 @@ export const getExpenseFormInitialValues = ( label: initialValues.supplier.name, } : undefined, - existing_documents: initialValues?.documents?.map((doc) => ({ - id: doc.id, - name: doc.path, - url: doc.path, - })), + existing_documents: initialValues?.documents?.map((doc) => { + const path = doc.path.startsWith('/') ? doc.path.slice(1) : doc.path; + return { + id: doc.id, + name: doc.path, + url: `${S3_PUBLIC_BASE_URL}/${path}`, + }; + }), deleted_documents: [], documents: [], expense_nonstocks: initialValues?.kandangs diff --git a/src/config/constant.ts b/src/config/constant.ts index 047ed279..508bf14f 100644 --- a/src/config/constant.ts +++ b/src/config/constant.ts @@ -349,6 +349,9 @@ export const ACCEPTED_FILE_TYPE = { }, }; +export const S3_PUBLIC_BASE_URL = process.env + .NEXT_PUBLIC_S3_PUBLIC_BASE_URL as string; + export const FILTER_TYPE_OPTIONS = [ { label: 'Tanggal Realisasi', From 5e6b03ef08e5a86c86e94fee0bf7b7793f8844e8 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 21:17:37 +0700 Subject: [PATCH 09/11] refactor(FE-435,436): Use location name as fallback for expense titles --- src/components/pages/expense/ExpenseRequestContent.tsx | 4 +++- .../expense/form/ExpenseRealizationKandangDetailExpense.tsx | 6 +++++- src/components/pages/expense/pdf/ExpensePDF.tsx | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/pages/expense/ExpenseRequestContent.tsx b/src/components/pages/expense/ExpenseRequestContent.tsx index bff371df..006c95d1 100644 --- a/src/components/pages/expense/ExpenseRequestContent.tsx +++ b/src/components/pages/expense/ExpenseRequestContent.tsx @@ -588,7 +588,9 @@ const ExpenseRequestContent = ({ colSpan={5} className='font-bold text-center text-base-content text-lg' > - Biaya {kandangExpense.name} + {kandangExpense.name + ? `Biaya ${kandangExpense.name}` + : `Biaya ${initialValues?.location.name || 'Umum'}`} diff --git a/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx b/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx index 3482389f..3f6f2220 100644 --- a/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx +++ b/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx @@ -128,7 +128,11 @@ const ExpenseRealizationKandangDetailExpense: React.FC< >
- Biaya {kandangName?.name || location?.label || 'Umum'} + {kandangName?.name + ? `Biaya ${kandangName.name}` + : location?.label + ? `Biaya ${location.label}` + : 'Biaya Umum'}
diff --git a/src/components/pages/expense/pdf/ExpensePDF.tsx b/src/components/pages/expense/pdf/ExpensePDF.tsx index c9c63203..5d057740 100644 --- a/src/components/pages/expense/pdf/ExpensePDF.tsx +++ b/src/components/pages/expense/pdf/ExpensePDF.tsx @@ -340,7 +340,9 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { style={ExpensePDFStyle.kandangExpenseContainer} > - {kandangExpense.name} + {kandangExpense.name + ? `Biaya ${kandangExpense.name}` + : `Biaya ${expense?.location.name || 'Umum'}`} From d39b71e759f7eef2071fbefc03cd22101c430cdf Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 21:21:35 +0700 Subject: [PATCH 10/11] refactor(FE-436): Use fallback when kandang name missing --- .../pages/expense/ExpenseRequestContent.tsx | 10 +++++++--- src/components/pages/expense/pdf/ExpensePDF.tsx | 12 ++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/components/pages/expense/ExpenseRequestContent.tsx b/src/components/pages/expense/ExpenseRequestContent.tsx index 006c95d1..6146e110 100644 --- a/src/components/pages/expense/ExpenseRequestContent.tsx +++ b/src/components/pages/expense/ExpenseRequestContent.tsx @@ -408,9 +408,13 @@ const ExpenseRequestContent = ({ Kandang : - {initialValues?.kandangs - .map((item) => item.name) - .join(', ')} + {initialValues?.kandangs && + initialValues?.kandangs.some((k) => k.name) + ? initialValues?.kandangs + .filter((item) => item.name) + .map((item) => item.name) + .join(', ') + : '-'} diff --git a/src/components/pages/expense/pdf/ExpensePDF.tsx b/src/components/pages/expense/pdf/ExpensePDF.tsx index 5d057740..ce4a77f5 100644 --- a/src/components/pages/expense/pdf/ExpensePDF.tsx +++ b/src/components/pages/expense/pdf/ExpensePDF.tsx @@ -219,7 +219,13 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { { label: 'Lokasi', value: expense?.location.name }, { label: 'Kandang', - value: expense?.kandangs.map((item) => item.name).join(', '), + value: + expense?.kandangs && expense?.kandangs.some((k) => k.name) + ? expense?.kandangs + .filter((item) => item.name) + .map((item) => item.name) + .join(', ') + : '-', }, { label: 'Vendor', value: expense?.supplier.name }, { @@ -500,7 +506,9 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { style={ExpensePDFStyle.kandangExpenseContainer} > - {kandangExpense.name} + {kandangExpense.name + ? `Biaya ${kandangExpense.name}` + : `Biaya ${expense?.location.name || 'Umum'}`} From 865438e3fb5cb428d4b86b479483026f11c11b00 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 30 Dec 2025 21:26:40 +0700 Subject: [PATCH 11/11] refactor(FE-436): Check kandang_id before showing kandang name --- src/components/pages/expense/ExpenseRequestContent.tsx | 2 +- src/components/pages/expense/pdf/ExpensePDF.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/pages/expense/ExpenseRequestContent.tsx b/src/components/pages/expense/ExpenseRequestContent.tsx index 6146e110..2b9086e0 100644 --- a/src/components/pages/expense/ExpenseRequestContent.tsx +++ b/src/components/pages/expense/ExpenseRequestContent.tsx @@ -592,7 +592,7 @@ const ExpenseRequestContent = ({ colSpan={5} className='font-bold text-center text-base-content text-lg' > - {kandangExpense.name + {kandangExpense.kandang_id && kandangExpense.name ? `Biaya ${kandangExpense.name}` : `Biaya ${initialValues?.location.name || 'Umum'}`} diff --git a/src/components/pages/expense/pdf/ExpensePDF.tsx b/src/components/pages/expense/pdf/ExpensePDF.tsx index ce4a77f5..ef1c7d8b 100644 --- a/src/components/pages/expense/pdf/ExpensePDF.tsx +++ b/src/components/pages/expense/pdf/ExpensePDF.tsx @@ -346,7 +346,7 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { style={ExpensePDFStyle.kandangExpenseContainer} > - {kandangExpense.name + {kandangExpense.kandang_id && kandangExpense.name ? `Biaya ${kandangExpense.name}` : `Biaya ${expense?.location.name || 'Umum'}`} @@ -506,7 +506,7 @@ const ExpensePDF = ({ expense }: ExpensePDFProps) => { style={ExpensePDFStyle.kandangExpenseContainer} > - {kandangExpense.name + {kandangExpense.kandang_id && kandangExpense.name ? `Biaya ${kandangExpense.name}` : `Biaya ${expense?.location.name || 'Umum'}`}