diff --git a/src/components/pages/closing/ClosingFinanceTable.tsx b/src/components/pages/closing/ClosingFinanceTable.tsx index 0cc5bf37..1a3c0130 100644 --- a/src/components/pages/closing/ClosingFinanceTable.tsx +++ b/src/components/pages/closing/ClosingFinanceTable.tsx @@ -136,381 +136,370 @@ const ClosingFinanceTable = ({ return (
- {isResponseSuccess(finance) && ( - <> - -
-
-
- {formatTitleCase( - finance.data.profit_loss.data.summary.gross_profit.label || - '-' - )} -
-
- {formatCurrency( - finance.data.profit_loss.data.summary.gross_profit.amount - )} -
+ <> + +
+
+
+ {isResponseSuccess(finance) + ? formatTitleCase( + finance.data.profit_loss.data.summary.gross_profit + .label || '-' + ) + : 'Laba Rugi Brutto'}
-
-
- {formatTitleCase( - finance.data.profit_loss.data.summary.net_profit.label || - '-' - )} -
-
- {formatCurrency( - finance.data.profit_loss.data.summary.net_profit.amount - )} -
+
+ {isResponseSuccess(finance) + ? formatCurrency( + finance.data.profit_loss.data.summary.gross_profit.amount + ) + : '-'}
- - -
- - data={hppTableData} - columns={[ - { - header: 'No.', - enableSorting: false, - accessorFn: (item, index) => { - if (item.isGroupHeader) return '-'; - // Calculate row number excluding group headers - const dataRowsBefore = hppTableData - .slice(0, index) - .filter((row) => !row.isGroupHeader).length; - return dataRowsBefore + 1; +
+
+ {isResponseSuccess(finance) + ? formatTitleCase( + finance.data.profit_loss.data.summary.net_profit.label || + '-' + ) + : 'Laba Rugi Netto'} +
+
+ {isResponseSuccess(finance) + ? formatCurrency( + finance.data.profit_loss.data.summary.net_profit.amount + ) + : '-'} +
+
+
+
+ +
+ + data={hppTableData} + columns={[ + { + header: 'No.', + enableSorting: false, + accessorFn: (item, index) => { + if (item.isGroupHeader) return '-'; + const dataRowsBefore = hppTableData + .slice(0, index) + .filter((row) => !row.isGroupHeader).length; + return dataRowsBefore + 1; + }, + footer: (props) => { + return 'HPP'; + }, + }, + { + header: 'Type', + enableSorting: false, + accessorFn: (item) => formatTitleCase(item.type || '-'), + }, + { + header: 'Budgeting', + enableSorting: false, + columns: [ + { + header: 'Rp/Ekor', + id: 'budgeting_rp_per_bird', + enableSorting: false, + accessorFn: (item) => + formatCurrency(item.budgeting?.rp_per_bird || 0), + footer: (props) => { + return props.column.id === 'budgeting_rp_per_bird' && + isResponseSuccess(finance) + ? formatCurrency( + finance.data.hpp_purchases.summary_hpp.budgeting + .rp_per_bird || 0 + ) + : '-'; + }, }, - footer: (props) => { - return 'HPP'; + { + header: 'Rp/Kg', + id: 'budgeting_rp_per_kg', + enableSorting: false, + accessorFn: (item) => + formatCurrency(item.budgeting?.rp_per_kg || 0), + footer: (props) => { + return props.column.id === 'budgeting_rp_per_kg' && + isResponseSuccess(finance) + ? formatCurrency( + finance.data.hpp_purchases.summary_hpp.budgeting + .rp_per_kg || 0 + ) + : '-'; + }, }, - }, - { - header: 'Type', - enableSorting: false, - accessorFn: (item) => formatTitleCase(item.type || '-'), - }, - { - header: 'Budgeting', - enableSorting: false, - columns: [ - { - header: 'Rp/Ekor', - id: 'budgeting_rp_per_bird', - enableSorting: false, - accessorFn: (item) => - formatCurrency(item.budgeting?.rp_per_bird || 0), - footer: (props) => { - return props.column.id === 'budgeting_rp_per_bird' - ? formatCurrency( - finance.data.hpp_purchases.hpp.reduce( - (total, hpp) => - total + - (finance.data.hpp_purchases.summary_hpp - .budgeting.rp_per_bird || 0), - 0 - ) - ) - : '-'; - }, + { + header: 'Jumlah (Rp)', + id: 'budgeting_amount', + enableSorting: false, + accessorFn: (item) => + formatCurrency(item.budgeting?.amount || 0), + footer: (props) => { + return props.column.id === 'budgeting_amount' && + isResponseSuccess(finance) + ? formatCurrency( + finance.data.hpp_purchases.summary_hpp.budgeting + .amount || 0 + ) + : '-'; }, - { - header: 'Rp/Kg', - id: 'budgeting_rp_per_kg', - enableSorting: false, - accessorFn: (item) => - formatCurrency(item.budgeting?.rp_per_kg || 0), - footer: (props) => { - return props.column.id === 'budgeting_rp_per_kg' - ? formatCurrency( - finance.data.hpp_purchases.hpp.reduce( - (total, hpp) => - total + - (finance.data.hpp_purchases.summary_hpp - .budgeting.rp_per_kg || 0), - 0 - ) - ) - : '-'; - }, + }, + ], + }, + { + header: 'Realization', + enableSorting: false, + columns: [ + { + header: 'Rp/Ekor', + id: 'realization_rp_per_bird', + enableSorting: false, + accessorFn: (item) => + formatCurrency(item.realization?.rp_per_bird || 0), + footer: (props) => { + return props.column.id === 'realization_rp_per_bird' && + isResponseSuccess(finance) + ? formatCurrency( + finance.data.hpp_purchases.summary_hpp.realization + .rp_per_bird || 0 + ) + : '-'; }, - { - header: 'Jumlah (Rp)', - id: 'budgeting_amount', - enableSorting: false, - accessorFn: (item) => - formatCurrency(item.budgeting?.amount || 0), - footer: (props) => { - return props.column.id === 'budgeting_amount' - ? formatCurrency( - finance.data.hpp_purchases.hpp.reduce( - (total, hpp) => - total + - (finance.data.hpp_purchases.summary_hpp - .budgeting.amount || 0), - 0 - ) - ) - : '-'; - }, + }, + { + header: 'Rp/Kg', + id: 'realization_rp_per_kg', + enableSorting: false, + accessorFn: (item) => + formatCurrency(item.realization?.rp_per_kg || 0), + footer: (props) => { + return props.column.id === 'realization_rp_per_kg' && + isResponseSuccess(finance) + ? formatCurrency( + finance.data.hpp_purchases.summary_hpp.realization + .rp_per_kg || 0 + ) + : '-'; }, - ], - }, - { - header: 'Realization', - enableSorting: false, - columns: [ - { - header: 'Rp/Ekor', - id: 'realization_rp_per_bird', - enableSorting: false, - accessorFn: (item) => - formatCurrency(item.realization?.rp_per_bird || 0), - footer: (props) => { - return props.column.id === 'realization_rp_per_bird' - ? formatCurrency( - finance.data.hpp_purchases.hpp.reduce( - (total, hpp) => - total + - (finance.data.hpp_purchases.summary_hpp - .realization.rp_per_bird || 0), - 0 - ) - ) - : '-'; - }, + }, + { + header: 'Jumlah (Rp)', + id: 'realization_amount', + enableSorting: false, + accessorFn: (item) => + formatCurrency(item.realization?.amount || 0), + footer: (props) => { + return props.column.id === 'realization_amount' && + isResponseSuccess(finance) + ? formatCurrency( + finance.data.hpp_purchases.summary_hpp.realization + .amount || 0 + ) + : '-'; }, - { - header: 'Rp/Kg', - id: 'realization_rp_per_kg', - enableSorting: false, - accessorFn: (item) => - formatCurrency(item.realization?.rp_per_kg || 0), - footer: (props) => { - return props.column.id === 'realization_rp_per_kg' - ? formatCurrency( - finance.data.hpp_purchases.hpp.reduce( - (total, hpp) => - total + - (finance.data.hpp_purchases.summary_hpp - .realization.rp_per_kg || 0), - 0 - ) - ) - : '-'; - }, - }, - { - header: 'Jumlah (Rp)', - id: 'realization_amount', - enableSorting: false, - accessorFn: (item) => - formatCurrency(item.realization?.amount || 0), - footer: (props) => { - return props.column.id === 'realization_amount' - ? formatCurrency( - finance.data.hpp_purchases.hpp.reduce( - (total, hpp) => - total + - (finance.data.hpp_purchases.summary_hpp - .realization.amount || 0), - 0 - ) - ) - : '-'; - }, - }, - ], - }, - ]} - renderCustomRow={(row) => { - const rowData = row.original; - if (rowData.isGroupHeader) { + }, + ], + }, + ]} + renderCustomRow={(row) => { + const rowData = row.original; + if (rowData.isGroupHeader) { + return ( + + + +
+ {formatTitleCase(rowData.group_name ?? '-')} +
+ + + ); + } + return null; + }} + renderFooter={isResponseSuccess(finance)} + /> +
+
+ +
+ + data={profitLossTableData} + columns={[ + { + header: 'Type', + enableSorting: false, + accessorFn: (item) => item.type, + cell: (item) => ( +
+ {formatTitleCase(item.row.original.type || '-')} +
+ ), + footer: (item) => ( +
+ {isResponseSuccess(finance) + ? formatTitleCase( + finance.data.profit_loss.data.summary.net_profit + .label || '-' + ) + : '-'} +
+ ), + }, + { + header: 'Rp/Ekor', + enableSorting: false, + accessorFn: (item) => formatCurrency(item.rp_per_bird || 0), + footer: (item) => ( +
+ {isResponseSuccess(finance) + ? formatCurrency( + finance.data.profit_loss.data.summary.net_profit + .rp_per_bird || 0 + ) + : formatCurrency(0)} +
+ ), + }, + { + header: 'Rp/Kg', + enableSorting: false, + accessorFn: (item) => formatCurrency(item.rp_per_kg || 0), + footer: (item) => ( +
+ {isResponseSuccess(finance) + ? formatCurrency( + finance.data.profit_loss.data.summary.net_profit + .rp_per_kg || 0 + ) + : formatCurrency(0)} +
+ ), + }, + { + header: 'Jumlah (Rp)', + enableSorting: false, + accessorFn: (item) => formatCurrency(item.amount || 0), + footer: (item) => ( +
+ {isResponseSuccess(finance) + ? formatCurrency( + finance.data.profit_loss.data.summary.net_profit + .amount || 0 + ) + : formatCurrency(0)} +
+ ), + }, + ]} + renderCustomRow={(row) => { + const rowData = row.original; + if (rowData.isGroupHeader) { + if (rowData.amount) { return ( + > +
+ {formatTitleCase(rowData.label ?? '-')} +
+
- {formatTitleCase(rowData.group_name ?? '-')} + {formatCurrency(rowData.rp_per_bird ?? 0)} +
+ + +
+ {formatCurrency(rowData.rp_per_kg ?? 0)} +
+ + +
+ {formatCurrency(rowData.amount ?? 0)}
); } - return null; - }} - renderFooter - /> -
-
- -
- - data={profitLossTableData} - columns={[ - { - header: 'Type', - enableSorting: false, - accessorFn: (item) => item.type, - cell: (item) => ( -
- {formatTitleCase(item.row.original.type || '-')} -
- ), - footer: (item) => ( -
- {formatTitleCase( - finance.data.profit_loss.data.summary.net_profit - .label || '-' - )} -
- ), - }, - { - header: 'Rp/Ekor', - enableSorting: false, - accessorFn: (item) => formatCurrency(item.rp_per_bird || 0), - footer: (item) => ( -
- {formatCurrency( - finance.data.profit_loss.data.summary.net_profit - .rp_per_bird || 0 - )} -
- ), - }, - { - header: 'Rp/Kg', - enableSorting: false, - accessorFn: (item) => formatCurrency(item.rp_per_kg || 0), - footer: (item) => ( -
- {formatCurrency( - finance.data.profit_loss.data.summary.net_profit - .rp_per_kg || 0 - )} -
- ), - }, - { - header: 'Jumlah (Rp)', - enableSorting: false, - accessorFn: (item) => formatCurrency(item.amount || 0), - footer: (item) => ( -
- {formatCurrency( - finance.data.profit_loss.data.summary.net_profit - .amount || 0 - )} -
- ), - }, - ]} - renderCustomRow={(row) => { - const rowData = row.original; - if (rowData.isGroupHeader) { - if (rowData.amount) { - return ( - - -
- {formatTitleCase(rowData.label ?? '-')} -
- - -
- {formatCurrency(rowData.rp_per_bird ?? 0)} -
- - -
- {formatCurrency(rowData.rp_per_kg ?? 0)} -
- - -
- {formatCurrency(rowData.amount ?? 0)} -
- - - ); - } - return ( - + - -
- {formatTitleCase(rowData.group_name ?? '-')} -
- - - ); - } - return null; - }} - className={{ - paginationClassName: 'hidden', - }} - renderFooter - /> -
-
- - )} +
+ {formatTitleCase(rowData.group_name ?? '-')} +
+ + + ); + } + return null; + }} + className={{ + paginationClassName: 'hidden', + }} + renderFooter={isResponseSuccess(finance)} + /> +
+ +
); }; diff --git a/src/components/pages/closing/ClosingSapronakCalculationTable.tsx b/src/components/pages/closing/ClosingSapronakCalculationTable.tsx index 445b7d8c..ea27fd80 100644 --- a/src/components/pages/closing/ClosingSapronakCalculationTable.tsx +++ b/src/components/pages/closing/ClosingSapronakCalculationTable.tsx @@ -154,66 +154,74 @@ const ClosingSapronakCalculationTable = ({ return (
- {isResponseSuccess(sapronakCalculation) && ( - <> - - - data={sapronakCalculation.data?.doc_broiler.rows ?? []} - columns={docBroilerColumns} - className={{ - containerClassName: 'my-4', - }} - renderFooter - /> - + + + data={ + isResponseSuccess(sapronakCalculation) + ? (sapronakCalculation.data?.doc_broiler.rows ?? []) + : [] + } + columns={docBroilerColumns} + className={{ + containerClassName: 'my-4', + }} + renderFooter={isResponseSuccess(sapronakCalculation)} + /> + - - - data={sapronakCalculation.data?.ovk.rows ?? []} - columns={ovkColumns} - className={{ - containerClassName: 'my-4', - }} - renderFooter - /> - + + + data={ + isResponseSuccess(sapronakCalculation) + ? (sapronakCalculation.data?.ovk.rows ?? []) + : [] + } + columns={ovkColumns} + className={{ + containerClassName: 'my-4', + }} + renderFooter={isResponseSuccess(sapronakCalculation)} + /> + - - - data={sapronakCalculation.data?.pakan.rows ?? []} - columns={pakanColumns} - className={{ - containerClassName: 'my-4', - }} - renderFooter - /> - - - )} + + + data={ + isResponseSuccess(sapronakCalculation) + ? (sapronakCalculation.data?.pakan.rows ?? []) + : [] + } + columns={pakanColumns} + className={{ + containerClassName: 'my-4', + }} + renderFooter={isResponseSuccess(sapronakCalculation)} + /> +
); }; diff --git a/src/dummy/closing.dummy.ts b/src/dummy/closing.dummy.ts deleted file mode 100644 index 3a20cdaf..00000000 --- a/src/dummy/closing.dummy.ts +++ /dev/null @@ -1,1136 +0,0 @@ -/** - * Dummy Data untuk Closing API - * - * File ini berisi dummy data untuk testing API Closing sebelum backend siap. - * - * Struktur data mengikuti tipe yang didefinisikan di @/types/api/closing.d.ts - * - * @example - * // 1. Menggunakan getAllFetcher dengan SWR: - * import useSWR from 'swr'; - * import { ClosingApi } from '@/services/api/closing'; - * - * const { data, error, isLoading } = useSWR( - * '/closings', - * ClosingApi.getAllFetcher.bind(ClosingApi) - * ); - * - * if (data?.status === 'success') { - * console.log(data.data); // Array of Closing objects - * } - * - * @example - * // 2. Menggunakan getSingle: - * import { ClosingApi } from '@/services/api/closing'; - * - * const response = await ClosingApi.getSingle(1); - * if (response?.status === 'success') { - * console.log(response.data); // Single Closing object - * } else if (response?.status === 'error') { - * console.error(response.message); // Error message - * } - * - * @example - * // 3. Menggunakan getGeneralInfo dengan SWR: - * import useSWR from 'swr'; - * import { ClosingApi } from '@/services/api/closing'; - * - * const closingId = 1; - * const { data, error, isLoading } = useSWR( - * closingId, - * (id: number) => ClosingApi.getGeneralInfo(id) - * ); - * - * if (data?.status === 'success') { - * console.log(data.data); // ClosingGeneralInformation object - * } - * - * @example - * // 4. Menggunakan getAllIncomingSapronakFetcher dengan SWR: - * import useSWR from 'swr'; - * import { ClosingApi } from '@/services/api/closing'; - * - * const { data, error, isLoading } = useSWR( - * `${ClosingApi.basePath}/1/sapronak/incoming`, - * ClosingApi.getAllIncomingSapronakFetcher.bind(ClosingApi) - * ); - * - * if (data?.status === 'success') { - * console.log(data.data); // Array of ClosingIncomingSapronak - * } - * - * @example - * // 5. Menggunakan getAllOutgoingSapronakFetcher dengan SWR: - * import useSWR from 'swr'; - * import { ClosingApi } from '@/services/api/closing'; - * - * const { data, error, isLoading } = useSWR( - * `${ClosingApi.basePath}/1/sapronak/outgoing`, - * ClosingApi.getAllOutgoingSapronakFetcher.bind(ClosingApi) - * ); - * - * if (data?.status === 'success') { - * console.log(data.data); // Array of ClosingOutgoingSapronak - * } - * - * @see {@link /home/sweetpotet/Documents/projects/lti-web-client/src/types/api/closing.d.ts} - */ - -import { format } from 'date-fns'; -import { - Closing, - ClosingGeneralInformation, - ClosingIncomingSapronak, - ClosingOutgoingSapronak, - ClosingOverhead, - ClosingSapronakCalculation, -} from '@/types/api/closing'; -import { CreatedUser, BaseApiResponse } from '@/types/api/api-general'; - -// Waktu saat ini untuk created_at/updated_at -const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); -const today = format(new Date(), 'yyyy-MM-dd'); -const yesterday = format( - new Date().setDate(new Date().getDate() - 1), - 'yyyy-MM-dd' -); -const lastWeek = format( - new Date().setDate(new Date().getDate() - 7), - 'yyyy-MM-dd' -); -const lastMonth = format( - new Date().setMonth(new Date().getMonth() - 1), - 'yyyy-MM-dd' -); - -// ====================== -// 👤 Created User -// ====================== -export const createdUser: CreatedUser = { - id: 1, - id_user: 1, - email: 'admin@example.com', - name: 'Admin Utama', -}; - -// ====================== -// 📊 Closing Dummy Data -// ====================== -export const dummyClosings: Closing[] = [ - // 1. Closing dengan status Pengajuan - GROWING - { - id: 1, - location_id: 1, - location_name: 'Farm Sukajadi', - project_category: 'GROWING', - period: 1, - closing_date: today, - shed_label: 'Kandang A1, A2, A3', - shed_count: 3, - sales_paid_amount: 150000000, - sales_remaining_amount: 50000000, - sales_payment_status: 'Sebagian Lunas', - project_status: 'Pengajuan', - created_user: createdUser, - created_at: now, - updated_at: now, - }, - - // 2. Closing dengan status Aktif - LAYING - { - id: 2, - location_id: 2, - location_name: 'Farm Cihampelas', - project_category: 'LAYING', - period: 2, - closing_date: yesterday, - shed_label: 'Kandang B1, B2', - shed_count: 2, - sales_paid_amount: 200000000, - sales_remaining_amount: 0, - sales_payment_status: 'Lunas', - project_status: 'Aktif', - created_user: createdUser, - created_at: lastWeek, - updated_at: yesterday, - }, - - // 3. Closing dengan status Selesai - GROWING - { - id: 3, - location_id: 3, - location_name: 'Farm Pasteur', - project_category: 'GROWING', - period: 3, - closing_date: lastWeek, - shed_label: 'Kandang C1, C2, C3, C4', - shed_count: 4, - sales_paid_amount: 300000000, - sales_remaining_amount: 25000000, - sales_payment_status: 'Sebagian Lunas', - project_status: 'Selesai', - created_user: createdUser, - created_at: lastMonth, - updated_at: lastWeek, - }, - - // 4. Closing dengan status Aktif - LAYING - { - id: 4, - location_id: 4, - location_name: 'Farm Setiabudi', - project_category: 'LAYING', - period: 1, - closing_date: today, - shed_label: 'Kandang D1', - shed_count: 1, - sales_paid_amount: 75000000, - sales_remaining_amount: 75000000, - sales_payment_status: 'Belum Lunas', - project_status: 'Aktif', - created_user: createdUser, - created_at: yesterday, - updated_at: now, - }, - - // 5. Closing dengan status Selesai - GROWING - { - id: 5, - location_id: 5, - location_name: 'Farm Dago', - project_category: 'GROWING', - period: 4, - closing_date: lastMonth, - shed_label: 'Kandang E1, E2, E3, E4, E5', - shed_count: 5, - sales_paid_amount: 500000000, - sales_remaining_amount: 0, - sales_payment_status: 'Lunas', - project_status: 'Selesai', - created_user: createdUser, - created_at: lastMonth, - updated_at: lastMonth, - }, - - // 6. Closing dengan status Pengajuan - LAYING - { - id: 6, - location_id: 6, - location_name: 'Farm Lembang', - project_category: 'LAYING', - period: 2, - closing_date: undefined, // Belum ada tanggal closing - shed_label: 'Kandang F1, F2', - shed_count: 2, - sales_paid_amount: 0, - sales_remaining_amount: 180000000, - sales_payment_status: 'Belum Lunas', - project_status: 'Pengajuan', - created_user: createdUser, - created_at: now, - updated_at: now, - }, - - // 7. Closing dengan status Aktif - GROWING - { - id: 7, - location_id: 7, - location_name: 'Farm Ciwidey', - project_category: 'GROWING', - period: 1, - closing_date: yesterday, - shed_label: 'Kandang G1, G2, G3', - shed_count: 3, - sales_paid_amount: 120000000, - sales_remaining_amount: 30000000, - sales_payment_status: 'Sebagian Lunas', - project_status: 'Aktif', - created_user: createdUser, - created_at: lastWeek, - updated_at: yesterday, - }, - - // 8. Closing dengan status Selesai - LAYING - { - id: 8, - location_id: 8, - location_name: 'Farm Bandung Timur', - project_category: 'LAYING', - period: 3, - closing_date: lastMonth, - shed_label: 'Kandang H1, H2, H3, H4, H5, H6', - shed_count: 6, - sales_paid_amount: 600000000, - sales_remaining_amount: 0, - sales_payment_status: 'Lunas', - project_status: 'Selesai', - created_user: createdUser, - created_at: lastMonth, - updated_at: lastMonth, - }, -]; - -// ====================== -// 📊 Closing General Information Dummy Data -// ====================== -export const dummyClosingGeneralInformations: ClosingGeneralInformation[] = [ - // 1. General Info - GROWING - Pengajuan - { - id: 1, - location_id: 1, - location_name: 'Farm Sukajadi', - project_category: 'GROWING', - period: 1, - closing_date: today, - shed_label: 'Kandang A1, A2, A3', - shed_count: 3, - sales_paid_amount: 150000000, - sales_remaining_amount: 50000000, - sales_payment_status: 'Sebagian Lunas', - project_status: 'Pengajuan', - flock_id: 101, - project_type: 'GROWING', - population: 15000, - active_house_count: 3, - closing_status: 'Draft', - created_user: createdUser, - created_at: now, - updated_at: now, - }, - - // 2. General Info - LAYING - Aktif - { - id: 2, - location_id: 2, - location_name: 'Farm Cihampelas', - project_category: 'LAYING', - period: 2, - closing_date: yesterday, - shed_label: 'Kandang B1, B2', - shed_count: 2, - sales_paid_amount: 200000000, - sales_remaining_amount: 0, - sales_payment_status: 'Lunas', - project_status: 'Aktif', - flock_id: 102, - project_type: 'LAYING', - population: 10000, - active_house_count: 2, - closing_status: 'In Progress', - created_user: createdUser, - created_at: lastWeek, - updated_at: yesterday, - }, - - // 3. General Info - GROWING - Selesai - { - id: 3, - location_id: 3, - location_name: 'Farm Pasteur', - project_category: 'GROWING', - period: 3, - closing_date: lastWeek, - shed_label: 'Kandang C1, C2, C3, C4', - shed_count: 4, - sales_paid_amount: 300000000, - sales_remaining_amount: 25000000, - sales_payment_status: 'Sebagian Lunas', - project_status: 'Selesai', - flock_id: 103, - project_type: 'GROWING', - population: 20000, - active_house_count: 4, - closing_status: 'Completed', - created_user: createdUser, - created_at: lastMonth, - updated_at: lastWeek, - }, - - // 4. General Info - LAYING - Aktif - { - id: 4, - location_id: 4, - location_name: 'Farm Setiabudi', - project_category: 'LAYING', - period: 1, - closing_date: today, - shed_label: 'Kandang D1', - shed_count: 1, - sales_paid_amount: 75000000, - sales_remaining_amount: 75000000, - sales_payment_status: 'Belum Lunas', - project_status: 'Aktif', - flock_id: 104, - project_type: 'LAYING', - population: 5000, - active_house_count: 1, - closing_status: 'In Progress', - created_user: createdUser, - created_at: yesterday, - updated_at: now, - }, - - // 5. General Info - GROWING - Selesai - { - id: 5, - location_id: 5, - location_name: 'Farm Dago', - project_category: 'GROWING', - period: 4, - closing_date: lastMonth, - shed_label: 'Kandang E1, E2, E3, E4, E5', - shed_count: 5, - sales_paid_amount: 500000000, - sales_remaining_amount: 0, - sales_payment_status: 'Lunas', - project_status: 'Selesai', - flock_id: 105, - project_type: 'GROWING', - population: 25000, - active_house_count: 5, - closing_status: 'Completed', - created_user: createdUser, - created_at: lastMonth, - updated_at: lastMonth, - }, - - // 6. General Info - LAYING - Pengajuan - { - id: 6, - location_id: 6, - location_name: 'Farm Lembang', - project_category: 'LAYING', - period: 2, - closing_date: undefined, - shed_label: 'Kandang F1, F2', - shed_count: 2, - sales_paid_amount: 0, - sales_remaining_amount: 180000000, - sales_payment_status: 'Belum Lunas', - project_status: 'Pengajuan', - flock_id: 106, - project_type: 'LAYING', - population: 12000, - active_house_count: 2, - closing_status: 'Draft', - created_user: createdUser, - created_at: now, - updated_at: now, - }, - - // 7. General Info - GROWING - Aktif - { - id: 7, - location_id: 7, - location_name: 'Farm Ciwidey', - project_category: 'GROWING', - period: 1, - closing_date: yesterday, - shed_label: 'Kandang G1, G2, G3', - shed_count: 3, - sales_paid_amount: 120000000, - sales_remaining_amount: 30000000, - sales_payment_status: 'Sebagian Lunas', - project_status: 'Aktif', - flock_id: 107, - project_type: 'GROWING', - population: 18000, - active_house_count: 3, - closing_status: 'In Progress', - created_user: createdUser, - created_at: lastWeek, - updated_at: yesterday, - }, - - // 8. General Info - LAYING - Selesai - { - id: 8, - location_id: 8, - location_name: 'Farm Bandung Timur', - project_category: 'LAYING', - period: 3, - closing_date: lastMonth, - shed_label: 'Kandang H1, H2, H3, H4, H5, H6', - shed_count: 6, - sales_paid_amount: 600000000, - sales_remaining_amount: 0, - sales_payment_status: 'Lunas', - project_status: 'Selesai', - flock_id: 108, - project_type: 'LAYING', - population: 30000, - active_house_count: 6, - closing_status: 'Completed', - created_user: createdUser, - created_at: lastMonth, - updated_at: lastMonth, - }, -]; - -// ====================== -// 📦 Incoming Sapronak Dummy Data -// ====================== -export const dummyIncomingSapronaks: ClosingIncomingSapronak[] = [ - { - id: 1, - date: today, - reference_number: 'IN-2025-001', - transaction_type: 'Pembelian', - product_name: 'DOC Broiler Cobb 500', - product_category: 'DOC', - product_sub_category: 'DOC Broiler', - source_warehouse: 'Gudang Pusat', - destination_warehouse: 'Kandang A1', - quantity: 5000, - unit: 'Ekor', - formatted_quantity: '5,000 Ekor', - notes: 'DOC berkualitas tinggi dari supplier terpercaya', - }, - { - id: 2, - date: yesterday, - reference_number: 'IN-2025-002', - transaction_type: 'Transfer Masuk', - product_name: 'Pakan Starter BR-1', - product_category: 'Pakan', - product_sub_category: 'Starter', - source_warehouse: 'Gudang Area Bandung', - destination_warehouse: 'Kandang B1', - quantity: 100, - unit: 'Sak', - formatted_quantity: '100 Sak (5,000 Kg)', - notes: 'Pakan starter untuk periode awal', - }, - { - id: 3, - date: lastWeek, - reference_number: 'IN-2025-003', - transaction_type: 'Pembelian', - product_name: 'Vitamin B Complex', - product_category: 'OVK', - product_sub_category: 'Vitamin', - source_warehouse: 'Supplier Medion', - destination_warehouse: 'Gudang Farmasi', - quantity: 50, - unit: 'Botol', - formatted_quantity: '50 Botol', - notes: 'Vitamin untuk meningkatkan daya tahan tubuh', - }, - { - id: 4, - date: today, - reference_number: 'IN-2025-004', - transaction_type: 'Pembelian', - product_name: 'Pakan Finisher BR-2', - product_category: 'Pakan', - product_sub_category: 'Finisher', - source_warehouse: 'Gudang Pusat', - destination_warehouse: 'Kandang C1', - quantity: 200, - unit: 'Sak', - formatted_quantity: '200 Sak (10,000 Kg)', - notes: 'Pakan finisher untuk periode akhir', - }, - { - id: 5, - date: yesterday, - reference_number: 'IN-2025-005', - transaction_type: 'Transfer Masuk', - product_name: 'Antibiotik Enrofloxacin', - product_category: 'OVK', - product_sub_category: 'Obat', - source_warehouse: 'Gudang Area Jakarta', - destination_warehouse: 'Gudang Farmasi', - quantity: 30, - unit: 'Box', - formatted_quantity: '30 Box', - notes: 'Antibiotik untuk pencegahan penyakit', - }, -]; - -// ====================== -// 📤 Outgoing Sapronak Dummy Data -// ====================== -export const dummyOutgoingSapronaks: ClosingOutgoingSapronak[] = [ - { - id: 1, - date: today, - reference_number: 'OUT-2025-001', - transaction_type: 'Pemakaian', - product_name: 'Pakan Starter BR-1', - product_category: 'Pakan', - product_sub_category: 'Starter', - source_warehouse: 'Kandang A1', - destination_warehouse: 'Konsumsi Kandang A1', - quantity: 50, - unit: 'Sak', - formatted_quantity: '50 Sak (2,500 Kg)', - notes: 'Pemakaian pakan harian periode starter', - }, - { - id: 2, - date: yesterday, - reference_number: 'OUT-2025-002', - transaction_type: 'Transfer Keluar', - product_name: 'DOC Broiler Cobb 500', - product_category: 'DOC', - product_sub_category: 'DOC Broiler', - source_warehouse: 'Kandang B1', - destination_warehouse: 'Kandang B2', - quantity: 1000, - unit: 'Ekor', - formatted_quantity: '1,000 Ekor', - notes: 'Transfer DOC ke kandang baru', - }, - { - id: 3, - date: lastWeek, - reference_number: 'OUT-2025-003', - transaction_type: 'Pemakaian', - product_name: 'Vitamin B Complex', - product_category: 'OVK', - product_sub_category: 'Vitamin', - source_warehouse: 'Gudang Farmasi', - destination_warehouse: 'Konsumsi Kandang C1', - quantity: 10, - unit: 'Botol', - formatted_quantity: '10 Botol', - notes: 'Pemberian vitamin untuk meningkatkan kesehatan', - }, - { - id: 4, - date: today, - reference_number: 'OUT-2025-004', - transaction_type: 'Pemakaian', - product_name: 'Pakan Finisher BR-2', - product_category: 'Pakan', - product_sub_category: 'Finisher', - source_warehouse: 'Kandang C1', - destination_warehouse: 'Konsumsi Kandang C1', - quantity: 80, - unit: 'Sak', - formatted_quantity: '80 Sak (4,000 Kg)', - notes: 'Pemakaian pakan harian periode finisher', - }, - { - id: 5, - date: yesterday, - reference_number: 'OUT-2025-005', - transaction_type: 'Pemakaian', - product_name: 'Antibiotik Enrofloxacin', - product_category: 'OVK', - product_sub_category: 'Obat', - source_warehouse: 'Gudang Farmasi', - destination_warehouse: 'Konsumsi Kandang D1', - quantity: 5, - unit: 'Box', - formatted_quantity: '5 Box', - notes: 'Pengobatan untuk ayam yang sakit', - }, - { - id: 6, - date: lastWeek, - reference_number: 'OUT-2025-006', - transaction_type: 'Transfer Keluar', - product_name: 'Pakan Starter BR-1', - product_category: 'Pakan', - product_sub_category: 'Starter', - source_warehouse: 'Kandang E1', - destination_warehouse: 'Kandang E2', - quantity: 30, - unit: 'Sak', - formatted_quantity: '30 Sak (1,500 Kg)', - notes: 'Transfer pakan antar kandang', - }, -]; - -// ====================== -// 📊 Perhitungan Sapronak Dummy Data -// ====================== -export const dummySapronakCalculation: ClosingSapronakCalculation = { - // DOC Broiler Calculation - doc_broiler: { - rows: [ - { - id: 1, - tanggal: today, - no_referensi: 'IN-2025-001', - qty_masuk: 5000, - qty_keluar: 0, - qty_pakai: 0, - uraian: 'DOC Broiler Cobb 500', - kategori_produk: 'DOC Broiler', - harga_beli_per_qty: 8000, - total_harga: 40000000, - keterangan: 'Pembelian DOC dari supplier', - }, - { - id: 2, - tanggal: yesterday, - no_referensi: 'OUT-2025-002', - qty_masuk: 0, - qty_keluar: 1000, - qty_pakai: 0, - uraian: 'DOC Broiler Cobb 500', - kategori_produk: 'DOC Broiler', - harga_beli_per_qty: 8000, - total_harga: 8000000, - keterangan: 'Transfer DOC ke kandang lain', - }, - { - id: 3, - tanggal: lastWeek, - no_referensi: 'USE-2025-001', - qty_masuk: 0, - qty_keluar: 0, - qty_pakai: 50, - uraian: 'DOC Broiler Cobb 500', - kategori_produk: 'DOC Broiler', - harga_beli_per_qty: 8000, - total_harga: 400000, - keterangan: 'Mortalitas DOC', - }, - ], - total: { - label: 'Total DOC Broiler', - qty_masuk: 5000, - qty_keluar: 1000, - qty_pakai: 50, - harga_beli_per_qty: 8000, - total_harga: 48400000, - }, - }, - - // OVK Calculation - ovk: { - rows: [ - { - id: 1, - tanggal: today, - no_referensi: 'IN-2025-003', - qty_masuk: 50, - qty_keluar: 0, - qty_pakai: 0, - uraian: 'Vitamin B Complex', - kategori_produk: 'Vitamin', - harga_beli_per_qty: 150000, - total_harga: 7500000, - keterangan: 'Pembelian vitamin', - }, - { - id: 2, - tanggal: yesterday, - no_referensi: 'IN-2025-005', - qty_masuk: 30, - qty_keluar: 0, - qty_pakai: 0, - uraian: 'Antibiotik Enrofloxacin', - kategori_produk: 'Obat', - harga_beli_per_qty: 250000, - total_harga: 7500000, - keterangan: 'Pembelian antibiotik', - }, - { - id: 3, - tanggal: lastWeek, - no_referensi: 'OUT-2025-003', - qty_masuk: 0, - qty_keluar: 0, - qty_pakai: 10, - uraian: 'Vitamin B Complex', - kategori_produk: 'Vitamin', - harga_beli_per_qty: 150000, - total_harga: 1500000, - keterangan: 'Pemakaian vitamin', - }, - { - id: 4, - tanggal: yesterday, - no_referensi: 'OUT-2025-005', - qty_masuk: 0, - qty_keluar: 0, - qty_pakai: 5, - uraian: 'Antibiotik Enrofloxacin', - kategori_produk: 'Obat', - harga_beli_per_qty: 250000, - total_harga: 1250000, - keterangan: 'Pemakaian antibiotik', - }, - ], - total: { - label: 'Total OVK', - qty_masuk: 80, - qty_keluar: 0, - qty_pakai: 15, - harga_beli_per_qty: 200000, - total_harga: 17750000, - }, - }, - - // Pakan Calculation - pakan: { - rows: [ - { - id: 1, - tanggal: yesterday, - no_referensi: 'IN-2025-002', - qty_masuk: 100, - qty_keluar: 0, - qty_pakai: 0, - uraian: 'Pakan Starter BR-1', - kategori_produk: 'Starter', - harga_beli_per_qty: 450000, - total_harga: 45000000, - keterangan: 'Pembelian pakan starter', - }, - { - id: 2, - tanggal: today, - no_referensi: 'IN-2025-004', - qty_masuk: 200, - qty_keluar: 0, - qty_pakai: 0, - uraian: 'Pakan Finisher BR-2', - kategori_produk: 'Finisher', - harga_beli_per_qty: 480000, - total_harga: 96000000, - keterangan: 'Pembelian pakan finisher', - }, - { - id: 3, - tanggal: today, - no_referensi: 'OUT-2025-001', - qty_masuk: 0, - qty_keluar: 0, - qty_pakai: 50, - uraian: 'Pakan Starter BR-1', - kategori_produk: 'Starter', - harga_beli_per_qty: 450000, - total_harga: 22500000, - keterangan: 'Pemakaian pakan starter', - }, - { - id: 4, - tanggal: today, - no_referensi: 'OUT-2025-004', - qty_masuk: 0, - qty_keluar: 0, - qty_pakai: 80, - uraian: 'Pakan Finisher BR-2', - kategori_produk: 'Finisher', - harga_beli_per_qty: 480000, - total_harga: 38400000, - keterangan: 'Pemakaian pakan finisher', - }, - { - id: 5, - tanggal: lastWeek, - no_referensi: 'OUT-2025-006', - qty_masuk: 0, - qty_keluar: 30, - qty_pakai: 0, - uraian: 'Pakan Starter BR-1', - kategori_produk: 'Starter', - harga_beli_per_qty: 450000, - total_harga: 13500000, - keterangan: 'Transfer pakan ke kandang lain', - }, - ], - total: { - label: 'Total Pakan', - qty_masuk: 300, - qty_keluar: 30, - qty_pakai: 130, - harga_beli_per_qty: 465000, - total_harga: 215400000, - }, - }, -}; - -// ====================== -// 💰 Overhead Dummy Data -// ====================== -export const dummyOverhead: ClosingOverhead = { - overheads: [ - { - item_name: 'Expedisi DOC', - uom_name: 'Ekor', - budget_quantity: 500, - budget_unit_price: 8000, - budget_total_amount: 4000000, - actual_date: '', - actual_quantity: 0, - actual_unit_price: 0, - actual_total_amount: 0, - cost_per_bird: 0, - }, - { - item_name: 'Solar', - uom_name: 'Liter', - budget_quantity: 0, - budget_unit_price: 0, - budget_total_amount: 0, - actual_date: today, - actual_quantity: 20, - actual_unit_price: 10000, - actual_total_amount: 200000, - cost_per_bird: 200, - }, - { - item_name: 'Gaji Karyawan Kandang', - uom_name: 'Orang', - budget_quantity: 3, - budget_unit_price: 3000000, - budget_total_amount: 9000000, - actual_date: today, - actual_quantity: 3, - actual_unit_price: 3200000, - actual_total_amount: 9600000, - cost_per_bird: 640, - }, - { - item_name: 'Listrik Kandang', - uom_name: 'Bulan', - budget_quantity: 1, - budget_unit_price: 2500000, - budget_total_amount: 2500000, - actual_date: today, - actual_quantity: 1, - actual_unit_price: 2800000, - actual_total_amount: 2800000, - cost_per_bird: 187, - }, - { - item_name: 'Air Bersih', - uom_name: 'Bulan', - budget_quantity: 1, - budget_unit_price: 500000, - budget_total_amount: 500000, - actual_date: today, - actual_quantity: 1, - actual_unit_price: 450000, - actual_total_amount: 450000, - cost_per_bird: 30, - }, - { - item_name: 'Perbaikan Kandang', - uom_name: 'Paket', - budget_quantity: 1, - budget_unit_price: 3000000, - budget_total_amount: 3000000, - actual_date: yesterday, - actual_quantity: 1, - actual_unit_price: 3500000, - actual_total_amount: 3500000, - cost_per_bird: 233, - }, - { - item_name: 'Service Peralatan', - uom_name: 'Kali', - budget_quantity: 2, - budget_unit_price: 500000, - budget_total_amount: 1000000, - actual_date: lastWeek, - actual_quantity: 2, - actual_unit_price: 550000, - actual_total_amount: 1100000, - cost_per_bird: 73, - }, - { - item_name: 'ATK & Supplies', - uom_name: 'Paket', - budget_quantity: 1, - budget_unit_price: 500000, - budget_total_amount: 500000, - actual_date: today, - actual_quantity: 1, - actual_unit_price: 450000, - actual_total_amount: 450000, - cost_per_bird: 30, - }, - { - item_name: 'Biaya Komunikasi', - uom_name: 'Bulan', - budget_quantity: 1, - budget_unit_price: 300000, - budget_total_amount: 300000, - actual_date: today, - actual_quantity: 1, - actual_unit_price: 320000, - actual_total_amount: 320000, - cost_per_bird: 21, - }, - { - item_name: 'BBM Kendaraan Operasional', - uom_name: 'Liter', - budget_quantity: 200, - budget_unit_price: 10000, - budget_total_amount: 2000000, - actual_date: today, - actual_quantity: 220, - actual_unit_price: 10500, - actual_total_amount: 2310000, - cost_per_bird: 154, - }, - ], - total: { - budget_quantity: 710, - budget_total_amount: 23300000, - actual_quantity: 250, - actual_total_amount: 24530000, - cost_per_bird: 1568, - }, -}; - -// ====================== -// 🔧 Dummy API Response Functions -// ====================== - -/** - * Dummy implementation for getAllFetcher - * Returns all closing records - */ -export const dummyGetAllFetcher = async (): Promise<{ - code: number; - status: 'success'; - message: string; - data: Closing[]; -}> => { - await new Promise((resolve) => setTimeout(resolve, 500)); - return { - code: 200, - status: 'success', - message: 'Data closing berhasil diambil', - data: dummyClosings, - }; -}; - -/** - * Dummy implementation for getSingle - * Returns a single closing by ID - */ -export const dummyGetSingle = async ( - id: number -): Promise | undefined> => { - await new Promise((resolve) => setTimeout(resolve, 300)); - const closing = dummyClosings.find((c) => c.id === id); - - if (!closing) { - return { - code: 404, - status: 'error', - message: `Closing dengan ID ${id} tidak ditemukan`, - }; - } - - return { - code: 200, - status: 'success', - message: 'Data closing berhasil diambil', - data: closing, - }; -}; - -/** - * Dummy implementation for getAllIncomingSapronakFetcher - * Returns all incoming sapronak records - */ -export const dummyGetAllIncomingSapronakFetcher = async (): Promise<{ - code: number; - status: 'success'; - message: string; - data: ClosingIncomingSapronak[]; -}> => { - await new Promise((resolve) => setTimeout(resolve, 400)); - return { - code: 200, - status: 'success', - message: 'Data sapronak masuk berhasil diambil', - data: dummyIncomingSapronaks, - }; -}; - -/** - * Dummy implementation for getAllOutgoingSapronakFetcher - * Returns all outgoing sapronak records - */ -export const dummyGetAllOutgoingSapronakFetcher = async (): Promise<{ - code: number; - status: 'success'; - message: string; - data: ClosingOutgoingSapronak[]; -}> => { - await new Promise((resolve) => setTimeout(resolve, 400)); - return { - code: 200, - status: 'success', - message: 'Data sapronak keluar berhasil diambil', - data: dummyOutgoingSapronaks, - }; -}; - -/** - * Dummy implementation for getGeneralInfo - * Returns closing general information by ID - */ -export const dummyGetGeneralInfo = async ( - id: number -): Promise | undefined> => { - await new Promise((resolve) => setTimeout(resolve, 300)); - const closingInfo = dummyClosingGeneralInformations.find((c) => c.id == id); - - if (!closingInfo) { - return { - code: 404, - status: 'error', - message: `Closing general information dengan ID ${id} tidak ditemukan`, - }; - } - - return { - code: 200, - status: 'success', - message: 'Data closing general information berhasil diambil', - data: closingInfo, - }; -}; - -/** - * Dummy implementation for getPerhitunganSapronak - * Returns sapronak calculation data - */ -export const dummyGetPerhitunganSapronak = async ( - id: number -): Promise< - | { - code: number; - status: 'success'; - message: string; - data: ClosingSapronakCalculation; - } - | undefined -> => { - await new Promise((resolve) => setTimeout(resolve, 400)); - return { - code: 200, - status: 'success', - message: 'Data perhitungan sapronak berhasil diambil', - data: dummySapronakCalculation, - }; -}; - -/** - * Dummy implementation for getOverhead - * Returns overhead data - */ -export const dummyGetOverhead = async ( - id: number -): Promise | undefined> => { - await new Promise((resolve) => setTimeout(resolve, 400)); - return { - code: 200, - status: 'success', - message: 'Data overhead berhasil diambil', - data: dummyOverhead, - }; -}; diff --git a/src/dummy/json/closing-finance.dummy.ts b/src/dummy/json/closing-finance.dummy.ts deleted file mode 100644 index 82a22a26..00000000 --- a/src/dummy/json/closing-finance.dummy.ts +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Dummy data for ClosingFinance - * Generated from: closing_keuangan.json - * - * This file is auto-generated. Do not edit manually. - */ - -import { ClosingFinance } from '../../types/api/closing'; -import { BaseApiResponse } from '@/types/api/api-general'; - -const DUMMY_DATA: ClosingFinance = { - project_flock_id: 1, - period: 1, - project_type: 'LAYING', - volume_base: { - total_birds: 254435, - total_weight_kg: 499961, - }, - hpp_purchases: { - title: 'Pembelian HPP Budgeting dan HPP Realisasi', - hpp: [ - { - group_name: 'hpp dan pengeluaran', - data: [ - { - type: 'Pembelian PULLET LAYER', - budgeting: { - rp_per_bird: 7458.82, - rp_per_kg: 3795.866, - amount: 1897784868, - }, - realization: { - rp_per_bird: 7292.414, - rp_per_kg: 3711.18, - amount: 1855445430, - }, - }, - { - type: 'Pembelian OVK', - budgeting: { - rp_per_bird: 385.681, - rp_per_kg: 196.277, - amount: 98130789, - }, - realization: { - rp_per_bird: 424.097, - rp_per_kg: 215.827, - amount: 107905006, - }, - }, - { - type: 'Pembelian Pakan', - budgeting: { - rp_per_bird: 23002.545, - rp_per_kg: 11706.218, - amount: 5852652652, - }, - realization: { - rp_per_bird: 25193.973, - rp_per_kg: 12821.457, - amount: 6410228456, - }, - }, - ], - }, - { - group_name: 'hpp dan bahan baku', - data: [ - { - type: 'Pengeluaran Overhead', - budgeting: { - rp_per_bird: 6165.894, - rp_per_kg: 3137.883, - amount: 1568819297, - }, - realization: { - rp_per_bird: 5975.831, - rp_per_kg: 3041.158, - amount: 1520460611, - }, - }, - { - type: 'Beban Ekspedisi', - budgeting: { - rp_per_bird: 304.218, - rp_per_kg: 154.819, - amount: 77403605, - }, - realization: { - rp_per_bird: 237.466, - rp_per_kg: 120.849, - amount: 60419779, - }, - }, - ], - }, - ], - summary_hpp: { - label: 'HPP', - budgeting: { - rp_per_bird: 37317.158, - rp_per_kg: 18991.064, - amount: 9494791211, - }, - realization: { - rp_per_bird: 39123.781, - rp_per_kg: 19910.472, - amount: 9954459282, - }, - }, - }, - profit_loss: { - title: 'Laba Rugi Perusahaan', - data: { - penjualan: [ - { - type: 'Penjualan Telur dan Ayam Afkir', - rp_per_bird: 37551.535, - rp_per_kg: 19110.34, - amount: 9554424729, - }, - ], - pembelian: [ - { - type: 'Pembelian Sapronak Supplier', - rp_per_bird: 27629.158, - rp_per_kg: 14060.746, - amount: 7029824870, - }, - { - type: 'Pengeluaran Overhead', - rp_per_bird: 5975.831, - rp_per_kg: 3041.158, - amount: 1520460611, - }, - { - type: 'Beban Ekspedisi', - rp_per_bird: 237.466, - rp_per_kg: 120.849, - amount: 60419779, - }, - ], - summary: { - gross_profit: { - label: 'LABA RUGI BRUTTO', - rp_per_bird: 9922.376, - rp_per_kg: 5049.594, - amount: 2524599859, - }, - sub_total: { - label: 'SUB TOTAL', - rp_per_bird: 3709.079, - rp_per_kg: 1887.586, - amount: 943719469, - }, - net_profit: { - label: 'LABA RUGI NETTO', - rp_per_bird: 3709.079, - rp_per_kg: 1887.586, - amount: 943719469, - }, - }, - }, - }, -}; - -/** - * Get dummy ClosingFinance data - * @param id - Optional ID parameter - * @returns Promise with BaseApiResponse containing ClosingFinance - */ -export async function dummyGetOneClosingFinance( - id?: number -): Promise> { - return new Promise((resolve) => { - setTimeout(() => { - resolve({ - code: 200, - status: 'success', - message: 'Data retrieved successfully', - data: DUMMY_DATA, - }); - }, 500); - }); -} diff --git a/src/dummy/marketing.dummy.ts b/src/dummy/marketing.dummy.ts deleted file mode 100644 index 35e65e8c..00000000 --- a/src/dummy/marketing.dummy.ts +++ /dev/null @@ -1,388 +0,0 @@ -import { format } from 'date-fns'; -import { Area } from '@/types/api/master-data/area'; -import { Location } from '@/types/api/master-data/location'; -import { Kandang } from '@/types/api/master-data/kandang'; -import { Warehouse } from '@/types/api/master-data/warehouse'; -import { ProductWarehouse } from '@/types/api/inventory/product-warehouse'; -import { - BaseMarketing, - Marketing, - BaseSalesOrder, - BaseDeliveryOrder, - BaseDelivery, -} from '@/types/api/marketing/marketing'; -import { - CreatedUser, - BaseApproval, - BaseMetadata, -} from '@/types/api/api-general'; -import { Product } from '@/types/api/master-data/product'; -import { Customer } from '@/types/api/master-data/customer'; -import { Uom } from '@/types/api/master-data/uom'; -import { ProductCategory } from '@/types/api/master-data/product-category'; -import { Supplier } from '@/types/api/master-data/supplier'; - -// Waktu saat ini untuk created_at/updated_at -const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); -const today = format(new Date(), 'yyyy-MM-dd'); -const tomorrow = format( - new Date().setDate(new Date().getDate() + 1), - 'yyyy-MM-dd' -); - -// ====================== -// 👤 Created User & Helper Data -// ====================== -export const createdUser: CreatedUser = { - id: 1, - id_user: 1, - email: 'admin@example.com', - name: 'Admin Utama', -}; - -const dummyProductBase: Product = { - id: 101, - name: 'Pakan Ayam Premium', - brand: 'Brand Hebat', - sku: 'PAK-001', - product_price: 15000, - selling_price: 18000, - tax: 0.1, - expiry_period: 365, - uom: { id: 1, name: 'Sak' } as Uom, - product_category: { id: 1, name: 'Pakan' } as ProductCategory, - suppliers: [{ id: 1, name: 'Supplier A' } as Supplier], - flags: ['PAKAN'], - created_user: createdUser, - created_at: now, - updated_at: now, -}; - -// ====================== -// 📍 Area Dummy -// ====================== -export const dummyAreas: Area[] = [ - { - id: 1, - name: 'Bandung Barat', - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - name: 'Cimahi Utara', - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 🏢 Location Dummy -// ====================== -export const dummyLocations: Location[] = [ - { - id: 1, - name: 'Gudang A', - address: 'Jl. Sukajadi No. 12', - area: dummyAreas[0], - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - name: 'Gudang B', - address: 'Jl. Setiabudi No. 45', - area: dummyAreas[1], - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 🐔 Kandang Dummy -// ====================== -export const dummyKandangs: Kandang[] = [ - { - id: 1, - name: 'Kandang Ayam Layer 1', - status: 'AKTIF', - capacity: 500, - location: dummyLocations[0], - pic: createdUser, - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - name: 'Kandang Ayam Broiler 2', - status: 'NONAKTIF', - capacity: 300, - location: dummyLocations[1], - pic: createdUser, - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 🏭 Warehouse Dummy -// ====================== -export const dummyWarehouses: Warehouse[] = [ - { - id: 1, - type: 'AREA', - name: 'Gudang Wilayah Bandung Barat', - area: dummyAreas[0], - created_user: createdUser, - created_at: now, - updated_at: now, - } as Warehouse, - { - id: 2, - type: 'LOKASI', - name: 'Gudang Produksi Sukajadi', - area: dummyAreas[0], - location: { ...dummyLocations[0], area: dummyAreas[0] }, - created_user: createdUser, - created_at: now, - updated_at: now, - } as Warehouse, - { - id: 3, - type: 'KANDANG', - name: 'Gudang Kandang Layer 1', - area: dummyAreas[0], - location: { ...dummyLocations[0], area: dummyAreas[0] }, - kandang: { - ...dummyKandangs[0], - location: dummyLocations[0], - pic: createdUser, - }, - created_user: createdUser, - created_at: now, - updated_at: now, - } as Warehouse, -]; - -// ====================== -// 📦 Product Warehouse Dummy -// ====================== -export const dummyProductWarehouses: ProductWarehouse[] = [ - { - id: 1, - product_id: 101, - warehouse_id: 1, - quantity: 1000, - product: dummyProductBase, - warehouse: dummyWarehouses[0], - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - product_id: 102, - warehouse_id: 2, - quantity: 500, - product: { - ...dummyProductBase, - id: 102, - name: 'Vitamin Ayam Super', - sku: 'VIT-002', - flags: ['VITAMIN'], - selling_price: 25000, - }, - warehouse: dummyWarehouses[1], - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 💼 Marketing Dummy -// ====================== - -// Helper untuk Sales Order (SO) Item -const soItem1: BaseSalesOrder = { - vehicle_number: 'B 1234 ABC', - id: 101, - marketing_id: 1, - product_warehouse_id: 1, - qty: 100, - unit_price: 18000, // Harga jual - avg_weight: 1.0, - total_weight: 100 * 1.0, - total_price: 100 * 18000, - product_warehouse: dummyProductWarehouses[0] as ProductWarehouse, -}; -const soItem2: BaseSalesOrder = { - vehicle_number: 'D 5678 EFG', - id: 102, - marketing_id: 2, - product_warehouse_id: 2, - qty: 50, - unit_price: 25000, - avg_weight: 0.5, - total_weight: 50 * 0.5, - total_price: 50 * 25000, - product_warehouse: dummyProductWarehouses[1] as ProductWarehouse, -}; - -// Helper untuk Delivery Item (DO) Detail -const doDelivery1: BaseDelivery[] = [ - { - product_warehouse: dummyProductWarehouses[0] as ProductWarehouse, - qty: soItem1.qty, - unit_price: soItem1.unit_price, - total_weight: soItem1.total_weight, - avg_weight: soItem1.avg_weight, - total_price: soItem1.total_price, - vehicle_number: 'B 1234 ABC', - }, -]; - -const doDelivery2: BaseDelivery[] = [ - { - product_warehouse: dummyProductWarehouses[1] as ProductWarehouse, - qty: soItem2.qty, - unit_price: soItem2.unit_price, - total_weight: soItem2.total_weight, - avg_weight: soItem2.avg_weight, - total_price: soItem2.total_price, - vehicle_number: 'D 5678 EFG', - }, -]; - -// Helper untuk Delivery Order (DO) Header -const deliveryOrder1: BaseDeliveryOrder[] = [ - { - id: 1, - marketing_id: 3, - do_number: 'DO-003-2025', - delivery_date: tomorrow, - warehouse: dummyWarehouses[0], - deliveries: doDelivery1, - }, -]; - -export const dummyMarketings: Marketing[] = [ - // 1. Pengajuan Order (Langkah Pertama/Awal) - { - id: 1, - status: 'DRAFT', - // name: 'SO-001-2025', // `name` is not part of BaseMarketing - so_number: 'SO-001-2025', - so_date: today, - customer: { - id: 1, - name: 'PT Maju Jaya', - pic_id: 1, - pic: createdUser, - type: 'Distributor', - address: 'Jl. Merdeka No. 1', - phone: '081212121212', - email: 'contact@majujaya.com', - account_number: '1234567890', - created_user: createdUser, - created_at: now, - updated_at: now, - } as Customer, - sales_person: createdUser, - notes: 'Pengajuan Order Awal, menunggu persetujuan harga.', - latest_approval: { - step_number: 1, - step_name: 'Pengajuan Order', - action: 'CREATED', - action_by: createdUser, - action_at: now, - } as BaseApproval, - sales_order: [soItem1], - delivery_order: [], - created_user: createdUser, - created_at: now, - updated_at: now, - } as Marketing, - - // 2. Sales Order (Disetujui dan Siap DO) - { - id: 2, - status: 'APPROVED', - // name: 'SO-002-2025', // `name` is not part of BaseMarketing - so_number: 'SO-002-2025', - so_date: today, - customer: { - id: 2, - name: 'CV Sumber Sehat', - pic_id: 2, - pic: createdUser, - type: 'Retail', - address: 'Jl. Cihampelas No. 5', - phone: '082222222222', - email: 'info@sumbersehat.com', - account_number: '9876543210', - created_user: createdUser, - created_at: now, - updated_at: now, - } as Customer, - sales_person: createdUser, - notes: 'Sales Order telah disetujui oleh Supervisor.', - latest_approval: { - id: 2, - step_number: 2, - step_name: 'Sales Order', - action: 'APPROVED', - action_by: createdUser, - action_at: now, - } as BaseApproval, - sales_order: [soItem2], - delivery_order: [], // Belum ada pengiriman (DO) yang dibuat - created_user: createdUser, - created_at: now, - updated_at: now, - } as Marketing, - - // 3. Delivery Order (Proses Pengiriman telah dibuat) - { - id: 3, - status: 'DELIVERED', // Asumsi status DELIVERED berarti DO sudah selesai/terbuat - // name: 'SO-003-2025', // `name` is not part of BaseMarketing - so_number: 'SO-003-2025', - so_date: today, - customer: { - id: 3, - name: 'UD Ternak Sejahtera', - pic_id: 3, - pic: createdUser, - type: 'Reseller', - address: 'Jl. Pasteur No. 88', - phone: '083333333333', - email: 'halo@ternaksejahtera.com', - account_number: '1122334455', - created_user: createdUser, - created_at: now, - updated_at: now, - } as Customer, - sales_person: createdUser, - notes: 'Pengiriman barang telah berhasil dilakukan.', - latest_approval: { - id: 3, - step_number: 3, - step_name: 'Delivery Order', - action: 'COMPLETED', - action_by: createdUser, - action_at: now, - } as BaseApproval, - sales_order: [soItem1, soItem2], - delivery_order: deliveryOrder1, // DO sudah terbuat - created_user: createdUser, - created_at: now, - updated_at: now, - } as Marketing, -]; diff --git a/src/dummy/report/expense.dummy.ts b/src/dummy/report/expense.dummy.ts deleted file mode 100644 index dd1fa18b..00000000 --- a/src/dummy/report/expense.dummy.ts +++ /dev/null @@ -1,621 +0,0 @@ -/** - * Dummy Data untuk Report Expense API - * - * File ini berisi dummy data untuk testing Report Expense API sebelum backend siap. - * - * Struktur data mengikuti tipe yang didefinisikan di @/types/api/report/report-expense.d.ts - * - * @example - * // Menggunakan getAllFetcher dengan SWR: - * import useSWR from 'swr'; - * import { ReportExpenseApi } from '@/services/api/report'; - * - * const { data, error, isLoading } = useSWR( - * ReportExpenseApi.basePath, - * ReportExpenseApi.getAllFetcher - * ); - * - * if (data?.status === 'success') { - * console.log(data.data); // Array of ReportExpense objects - * } - * - * @see {@link /home/sweetpotet/Documents/projects/lti-web-client/src/types/api/report/report-expense.d.ts} - */ - -import { format } from 'date-fns'; -import { - Pengajuan, - Realisasi, - ReportExpense, -} from '@/types/api/report/report-expense'; -import { BaseApiResponse, CreatedUser } from '@/types/api/api-general'; -import { Supplier } from '@/types/api/master-data/supplier'; -import { Location } from '@/types/api/master-data/location'; -import { Nonstock } from '@/types/api/master-data/nonstock'; -import { Kandang } from '@/types/api/master-data/kandang'; - -// Waktu saat ini untuk created_at/updated_at -const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); -const today = format(new Date(), 'yyyy-MM-dd'); -const yesterday = format( - new Date(new Date().setDate(new Date().getDate() - 1)), - 'yyyy-MM-dd' -); -const lastWeek = format( - new Date(new Date().setDate(new Date().getDate() - 7)), - 'yyyy-MM-dd' -); -const lastMonth = format( - new Date(new Date().setMonth(new Date().getMonth() - 1)), - 'yyyy-MM-dd' -); - -// ====================== -// 👤 Created User -// ====================== -const createdUser: CreatedUser = { - id: 1, - id_user: 1, - email: 'admin@example.com', - name: 'Admin Utama', -}; - -// ====================== -// 🏢 Supplier Dummy Data -// ====================== -const dummySuppliers: Supplier[] = [ - { - id: 1, - name: 'PT. Mitra Pakan Sejahtera', - alias: 'MPS', - pic: 'Budi Santoso', - type: 'Pakan', - category: 'Supplier Utama', - hatchery: '-', - phone: '022-1234567', - email: 'info@mitrapakan.com', - address: 'Jl. Raya Industri No. 123, Bandung', - npwp: '01.234.567.8-901.000', - account_number: '1234567890', - due_date: 30, - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - name: 'CV. Sumber Ternak Jaya', - alias: 'STJ', - pic: 'Siti Rahayu', - type: 'DOC', - category: 'Supplier Utama', - hatchery: 'Hatchery Jaya', - phone: '021-9876543', - email: 'contact@sumberternak.com', - address: 'Jl. Peternakan No. 45, Jakarta', - npwp: '02.345.678.9-012.000', - account_number: '0987654321', - due_date: 45, - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 3, - name: 'PT. Agro Veteriner Indonesia', - alias: 'AVI', - pic: 'Dr. Ahmad Fauzi', - type: 'OVK', - category: 'Supplier Utama', - hatchery: '-', - phone: '031-5555666', - email: 'sales@agroveteriner.co.id', - address: 'Jl. Kesehatan Hewan No. 78, Surabaya', - npwp: '03.456.789.0-123.000', - account_number: '5678901234', - due_date: 60, - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 📍 Location Dummy Data -// ====================== -const dummyLocations: Location[] = [ - { - id: 1, - name: 'Farm Sukajadi', - address: 'Jl. Sukajadi No. 100, Bandung', - area: { - id: 1, - name: 'Bandung Barat', - }, - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - name: 'Farm Cihampelas', - address: 'Jl. Cihampelas No. 200, Bandung', - area: { - id: 1, - name: 'Bandung Barat', - }, - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 3, - name: 'Farm Pasteur', - address: 'Jl. Pasteur No. 300, Bandung', - area: { - id: 2, - name: 'Bandung Timur', - }, - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 📦 Nonstock Dummy Data -// ====================== -const dummyNonstocks: Nonstock[] = [ - { - id: 1, - name: 'Listrik', - uom_id: 1, - uom: { id: 1, name: 'kWh' }, - suppliers: [], - flags: [], - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - name: 'Air', - uom_id: 2, - uom: { id: 2, name: 'm³' }, - suppliers: [], - flags: [], - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 3, - name: 'Bahan Bakar', - uom_id: 3, - uom: { id: 3, name: 'Liter' }, - suppliers: [], - flags: [], - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 4, - name: 'Pemeliharaan Kandang', - uom_id: 4, - uom: { id: 4, name: 'Unit' }, - suppliers: [], - flags: [], - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 5, - name: 'Transportasi', - uom_id: 5, - uom: { id: 5, name: 'Trip' }, - suppliers: [], - flags: [], - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 🏠 Kandang Dummy Data -// ====================== -const dummyKandangs: Kandang[] = [ - { - id: 1, - name: 'Kandang A1', - status: 'Aktif', - location: dummyLocations[0], - capacity: 5000, - pic: { - id_user: 1, - id: 1, - name: 'Budi Kandang', - email: 'budi@example.com', - }, - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 2, - name: 'Kandang B1', - status: 'Aktif', - location: dummyLocations[1], - capacity: 4000, - pic: { - id_user: 2, - id: 2, - name: 'Siti Kandang', - email: 'siti@example.com', - }, - created_user: createdUser, - created_at: now, - updated_at: now, - }, - { - id: 3, - name: 'Kandang C1', - status: 'Aktif', - location: dummyLocations[2], - capacity: 6000, - pic: { - id_user: 3, - id: 3, - name: 'Ahmad Kandang', - email: 'ahmad@example.com', - }, - created_user: createdUser, - created_at: now, - updated_at: now, - }, -]; - -// ====================== -// 📋 Pengajuan Dummy Data -// ====================== -const dummyPengajuans: Pengajuan[] = [ - { - id: 1, - expense_id: 1, - project_flock_kandang_id: 1, - kandang_id: 1, - nonstock_id: 1, - qty: 1000, - price: 1500, - notes: 'Pengajuan biaya listrik bulan ini', - nonstock: dummyNonstocks[0], - created_at: now, - }, - { - id: 2, - expense_id: 2, - project_flock_kandang_id: 2, - kandang_id: 2, - nonstock_id: 2, - qty: 500, - price: 5000, - notes: 'Pengajuan biaya air bulan ini', - nonstock: dummyNonstocks[1], - created_at: now, - }, - { - id: 3, - expense_id: 3, - project_flock_kandang_id: 3, - kandang_id: 3, - nonstock_id: 3, - qty: 200, - price: 15000, - notes: 'Pengajuan biaya bahan bakar', - nonstock: dummyNonstocks[2], - created_at: now, - }, - { - id: 4, - expense_id: 4, - project_flock_kandang_id: 1, - kandang_id: 1, - nonstock_id: 4, - qty: 1, - price: 5000000, - notes: 'Pengajuan biaya pemeliharaan kandang', - nonstock: dummyNonstocks[3], - created_at: now, - }, - { - id: 5, - expense_id: 5, - project_flock_kandang_id: 2, - kandang_id: 2, - nonstock_id: 5, - qty: 10, - price: 500000, - notes: 'Pengajuan biaya transportasi', - nonstock: dummyNonstocks[4], - created_at: now, - }, -]; - -// ====================== -// 💰 Realisasi Dummy Data -// ====================== -const dummyRealisasis: Realisasi[] = [ - { - id: 1, - expense_nonstock_id: 1, - qty: 950, - price: 1500, - notes: 'Realisasi biaya listrik aktual', - nonstock: dummyNonstocks[0], - created_at: now, - }, - { - id: 2, - expense_nonstock_id: 2, - qty: 480, - price: 5000, - notes: 'Realisasi biaya air aktual', - nonstock: dummyNonstocks[1], - created_at: now, - }, - { - id: 3, - expense_nonstock_id: 3, - qty: 195, - price: 15000, - notes: 'Realisasi biaya bahan bakar aktual', - nonstock: dummyNonstocks[2], - created_at: now, - }, - { - id: 4, - expense_nonstock_id: 4, - qty: 1, - price: 4800000, - notes: 'Realisasi biaya pemeliharaan kandang', - nonstock: dummyNonstocks[3], - created_at: now, - }, - { - id: 5, - expense_nonstock_id: 5, - qty: 9, - price: 500000, - notes: 'Realisasi biaya transportasi', - nonstock: dummyNonstocks[4], - created_at: now, - }, -]; - -// ====================== -// 📊 Report Expense Dummy Data -// ====================== -export const dummyReportExpenses: ReportExpense[] = [ - { - id: 1, - reference_number: 'EXP-2025-001', - po_number: 'PO-2025-001', - category: 'Utilitas', - supplier: dummySuppliers[0], - realization_date: today, - transaction_date: yesterday, - pengajuan: dummyPengajuans[0], - realisasi: dummyRealisasis[0], - kandang: dummyKandangs[0], - created_at: now, - updated_at: now, - created_user: createdUser, - latest_approval: { - id: 1, - step_number: 1, - step_name: 'Manager Approval', - action: 'PENDING', - notes: '', - action_by: createdUser, - action_at: now, - }, - }, - { - id: 2, - reference_number: 'EXP-2025-002', - po_number: 'PO-2025-002', - category: 'Utilitas', - supplier: dummySuppliers[0], - realization_date: today, - transaction_date: yesterday, - pengajuan: dummyPengajuans[1], - realisasi: dummyRealisasis[1], - kandang: dummyKandangs[1], - created_at: now, - updated_at: now, - created_user: createdUser, - latest_approval: { - id: 2, - step_number: 2, - step_name: 'Finance Approval', - action: 'APPROVED', - notes: 'Disetujui oleh finance', - action_by: createdUser, - action_at: now, - }, - }, - { - id: 3, - reference_number: 'EXP-2025-003', - po_number: 'PO-2025-003', - category: 'Operasional', - supplier: dummySuppliers[1], - realization_date: lastWeek, - transaction_date: lastWeek, - pengajuan: dummyPengajuans[2], - realisasi: dummyRealisasis[2], - kandang: dummyKandangs[2], - created_at: lastWeek, - updated_at: lastWeek, - created_user: createdUser, - latest_approval: { - id: 3, - step_number: 3, - step_name: 'Director Approval', - action: 'APPROVED', - notes: 'Disetujui oleh direktur', - action_by: createdUser, - action_at: lastWeek, - }, - }, - { - id: 4, - reference_number: 'EXP-2025-004', - po_number: 'PO-2025-004', - category: 'Maintenance', - supplier: dummySuppliers[2], - realization_date: today, - transaction_date: yesterday, - pengajuan: dummyPengajuans[3], - realisasi: dummyRealisasis[3], - kandang: dummyKandangs[0], - created_at: now, - updated_at: now, - created_user: createdUser, - latest_approval: { - id: 4, - step_number: 1, - step_name: 'Manager Approval', - action: 'REJECTED', - notes: 'Biaya terlalu tinggi, perlu revisi', - action_by: createdUser, - action_at: now, - }, - }, - { - id: 5, - reference_number: 'EXP-2025-005', - po_number: 'PO-2025-005', - category: 'Operasional', - supplier: dummySuppliers[1], - realization_date: yesterday, - transaction_date: lastWeek, - pengajuan: dummyPengajuans[4], - realisasi: dummyRealisasis[4], - kandang: dummyKandangs[1], - created_at: lastWeek, - updated_at: yesterday, - created_user: createdUser, - latest_approval: { - id: 5, - step_number: 2, - step_name: 'Finance Approval', - action: 'PENDING', - notes: '', - action_by: createdUser, - action_at: yesterday, - }, - }, - { - id: 6, - reference_number: 'EXP-2025-006', - po_number: 'PO-2025-006', - category: 'Utilitas', - supplier: dummySuppliers[0], - realization_date: lastMonth, - transaction_date: lastMonth, - pengajuan: { - id: 6, - expense_id: 6, - project_flock_kandang_id: 3, - kandang_id: 3, - nonstock_id: 1, - qty: 1200, - price: 1500, - notes: 'Pengajuan biaya listrik bulan lalu', - nonstock: dummyNonstocks[0], - created_at: lastMonth, - }, - realisasi: { - id: 6, - expense_nonstock_id: 6, - qty: 1150, - price: 1500, - notes: 'Realisasi biaya listrik bulan lalu', - nonstock: dummyNonstocks[0], - created_at: lastMonth, - }, - kandang: dummyKandangs[2], - created_at: lastMonth, - updated_at: lastMonth, - created_user: createdUser, - latest_approval: { - id: 6, - step_number: 3, - step_name: 'Director Approval', - action: 'APPROVED', - notes: 'Selesai diproses', - action_by: createdUser, - action_at: lastMonth, - }, - }, -]; - -// ====================== -// 🔧 Fetcher Functions -// ====================== - -/** - * Dummy fetcher untuk mendapatkan semua data report expense - * @returns Promise dengan BaseApiResponse berisi array ReportExpense - */ -export async function dummyGetAllFetcher(): Promise< - BaseApiResponse -> { - // Simulasi delay network - await new Promise((resolve) => setTimeout(resolve, 500)); - - return { - code: 200, - status: 'success', - message: 'Data report expense berhasil diambil', - data: dummyReportExpenses, - meta: { - page: 1, - limit: 10, - total_results: dummyReportExpenses.length, - total_pages: 1, - }, - }; -} - -/** - * Dummy fetcher untuk mendapatkan single data report expense berdasarkan ID - * @param id - ID dari report expense yang ingin diambil - * @returns Promise dengan BaseApiResponse berisi single ReportExpense - */ -export async function dummyGetSingle( - id: number -): Promise> { - // Simulasi delay network - await new Promise((resolve) => setTimeout(resolve, 300)); - - const reportExpense = dummyReportExpenses.find((item) => item.id === id); - - if (!reportExpense) { - return { - code: 404, - status: 'error', - message: `Report expense dengan ID ${id} tidak ditemukan`, - }; - } - - return { - code: 200, - status: 'success', - message: 'Data report expense berhasil diambil', - data: reportExpense, - }; -} diff --git a/src/services/api/closing.ts b/src/services/api/closing.ts index a9104ea9..16cf24cf 100644 --- a/src/services/api/closing.ts +++ b/src/services/api/closing.ts @@ -11,56 +11,13 @@ import { ClosingSapronakCalculation, } from '@/types/api/closing'; import { BaseApiResponse } from '@/types/api/api-general'; -import { - dummyGetAllFetcher, - dummyGetSingle, - dummyGetAllIncomingSapronakFetcher, - dummyGetAllOutgoingSapronakFetcher, - dummyGetGeneralInfo, - dummyGetPerhitunganSapronak, - dummyGetOverhead, -} from '@/dummy/closing.dummy'; import { httpClient, httpClientFetcher } from '@/services/http/client'; import { ClosingSales } from '@/types/api/closing'; -import { dummyGetOneClosingFinance } from '@/dummy/json/closing-finance.dummy'; - export class ClosingApiService extends BaseApiService { constructor(basePath: string) { super(basePath); } - async getAllFetcher(endpoint: string): Promise> { - // TODO: Remove this block when backend is ready - // return await dummyGetAllFetcher(); - - // Uncomment this when backend is ready - return await httpClientFetcher>(endpoint); - } - - async getSingle(id: number): Promise | undefined> { - // TODO: Remove this block when backend is ready - // try { - // return await dummyGetSingle(id); - // } catch (error) { - // if (axios.isAxiosError>(error)) { - // return error.response?.data; - // } - // return undefined; - // } - - // Uncomment this when backend is ready - try { - const getSinglePath = `${this.basePath}/${id}`; - const getSingleRes = - await httpClient>(getSinglePath); - return getSingleRes; - } catch (error) { - if (axios.isAxiosError>(error)) { - } - return undefined; - } - } - async getPenjualan( id: number ): Promise | undefined> { @@ -81,10 +38,6 @@ export class ClosingApiService extends BaseApiService { async getAllIncomingSapronakFetcher( endpoint: string ): Promise> { - // TODO: Remove this block when backend is ready - // return await dummyGetAllIncomingSapronakFetcher(); - - // Uncomment this when backend is ready return await httpClientFetcher>( endpoint ); @@ -93,31 +46,14 @@ export class ClosingApiService extends BaseApiService { async getAllOutgoingSapronakFetcher( endpoint: string ): Promise> { - // TODO: Remove this block when backend is ready - return await dummyGetAllOutgoingSapronakFetcher(); - - // Uncomment this when backend is ready - // return await httpClientFetcher>( - // endpoint - // ); + return await httpClientFetcher>( + endpoint + ); } async getGeneralInfo( id: number ): Promise | undefined> { - // TODO: Remove this block when backend is ready - // try { - // return await dummyGetGeneralInfo(id); - // } catch (error) { - // if ( - // axios.isAxiosError>(error) - // ) { - // return error.response?.data; - // } - // return undefined; - // } - - // Uncomment this when backend is ready try { const getGeneralInfoPath = `${this.basePath}/${id}`; const getGeneralInfoRes = @@ -138,19 +74,6 @@ export class ClosingApiService extends BaseApiService { async getPerhitunganSapronak( id: number ): Promise | undefined> { - // TODO: Remove this block when backend is ready - // try { - // return await dummyGetPerhitunganSapronak(id); - // } catch (error) { - // if ( - // axios.isAxiosError>(error) - // ) { - // return error.response?.data; - // } - // return undefined; - // } - - // Uncomment this when backend is ready try { const path = `${this.basePath}/${id}/perhitungan_sapronak`; return await httpClient>( @@ -172,17 +95,6 @@ export class ClosingApiService extends BaseApiService { async getOverhead( id: number ): Promise | undefined> { - // TODO: Remove this block when backend is ready - // try { - // return await dummyGetOverhead(id); - // } catch (error) { - // if (axios.isAxiosError>(error)) { - // return error.response?.data; - // } - // return undefined; - // } - - // Uncomment this when backend is ready try { const path = `${this.basePath}/${id}/overhead`; return await httpClient>(path, { @@ -199,12 +111,8 @@ export class ClosingApiService extends BaseApiService { async getFinance( id: number ): Promise | undefined> { - // TODO: Remove this block when backend is ready - // return dummyGetOneClosingFinance(id); - - // Uncomment this when backend is ready try { - const path = `${this.basePath}/${id}/finance`; + const path = `${this.basePath}/${id}/keuangan`; return await httpClient>(path, { method: 'GET', }); diff --git a/src/services/api/marketing/marketing.ts b/src/services/api/marketing/marketing.ts index c2b5d018..59b9b4c8 100644 --- a/src/services/api/marketing/marketing.ts +++ b/src/services/api/marketing/marketing.ts @@ -1,5 +1,3 @@ -import { dummyMarketings } from '@/dummy/marketing.dummy'; -import { sleep } from '@/lib/helper'; import { BaseApiService } from '@/services/api/base'; import { httpClient } from '@/services/http/client'; import { BaseApiResponse } from '@/types/api/api-general'; @@ -31,41 +29,6 @@ export class SalesOrderService extends BaseApiService< super(basePath); } - // /** - // * Override: Mengambil semua data Marketing dari dummyMarketings - // */ - // async getAllFetcher(endpoint: string): Promise> { - // // Simulasi delay jaringan - // await sleep(500); - - // // Filter data marketing yang valid (jika menggunakan BaseMarketing[]) - // const data = dummyMarketings as Marketing[]; - - // return createDummyResponse(data); - // } - - // /** - // * Override: Mengambil satu data Marketing berdasarkan ID dari dummyMarketings - // */ - // async getSingle(id: number): Promise | undefined> { - // // Simulasi delay jaringan - // await sleep(300); - - // const foundData = dummyMarketings.find((m) => m.id == id); - - // if (foundData) { - // // Data ditemukan, kembalikan respons sukses - // return createDummyResponse(foundData as Marketing); - // } else { - // // Data tidak ditemukan, simulasi respons error - // return { - // code: 404, - // status: 'error', - // message: 'Marketing data not found (MOCK)', - // }; - // } - // } - /** * Approve single marketing data */