import Card from '@/components/Card'; import Table, { TABLE_DEFAULT_STYLING } from '@/components/Table'; import { isResponseSuccess } from '@/lib/api-helper'; import { cn, formatCurrency, formatDate, formatNumber } from '@/lib/helper'; import { ClosingApi } from '@/services/api/closing'; import { ClosingGeneralInformation, Overhead, OverheadTotal, } from '@/types/api/closing'; import { ProjectFlockKandang } from '@/types/api/production/project-flock-kandang'; import { Icon } from '@iconify/react'; import { ColumnDef } from '@tanstack/react-table'; import { useSearchParams } from 'next/navigation'; import { useMemo } from 'react'; import useSWR from 'swr'; import OverheadClosingSkeleton from '@/components/pages/closing/skeleton/OverheadClosingSkeleton'; interface OverheadClosingTableProps { projectFlockId: number; generalInformation?: ClosingGeneralInformation; kandangData?: ProjectFlockKandang; } const OverheadClosingTable = ({ projectFlockId, generalInformation, kandangData, }: OverheadClosingTableProps) => { const searchParams = useSearchParams(); const kandangId = searchParams.get('kandangId'); const { data: overhead, isLoading: isLoadingOverhead } = useSWR( `${ClosingApi.basePath}/${projectFlockId}/overhead`, () => ClosingApi.getOverhead(projectFlockId), { keepPreviousData: true, } ); const { data: overheadKandang, isLoading: isLoadingOverheadKandang } = useSWR( kandangId ? `${ClosingApi.basePath}/${projectFlockId}/${kandangId}/overhead` : undefined, () => ClosingApi.getOverhead( projectFlockId, kandangId ? Number(kandangId) : undefined ), { keepPreviousData: true, } ); const chickinPopulation = useMemo(() => { if (kandangData) { return kandangData?.chickins?.reduce( (acc, chickin) => acc + chickin.usage_qty, 0 ); } return 0; }, [kandangData]); const kandangTotal = useMemo(() => { if (!isResponseSuccess(overhead)) { return 0; } const total = ((chickinPopulation ?? 0) * overhead.data.total.actual_total_amount) / (generalInformation?.population ?? 0); return total; }, [overhead, chickinPopulation, generalInformation]); // Helper function to create columns with footer support const createColumns = ( total?: OverheadTotal, kandangId?: number ): ColumnDef[] => { const flockColumn: ColumnDef[] = [ { header: 'Budget Pengajuan', footer: '', columns: [ { id: 'budget_quantity', header: 'Jumlah', accessorFn: (props) => formatNumber(props.budget_quantity), footer: total ? () => formatNumber(total.budget_quantity) : '', }, { id: 'budget_unit_price', header: 'Harga Satuan', accessorFn: (props) => formatCurrency(props.budget_unit_price), footer: '', }, { id: 'budget_total_amount', header: 'Total', accessorFn: (props) => formatCurrency(props.budget_total_amount), footer: total ? () => formatCurrency(total.budget_total_amount) : '0', }, ], }, { header: 'Realisasi', footer: '', columns: [ { id: 'actual_date', header: 'Tanggal', accessorFn: (props) => formatDate(props.actual_date, 'DD MMM, YYYY'), footer: '', }, { id: 'actual_quantity', header: 'Jumlah', accessorFn: (props) => formatNumber(props.actual_quantity), footer: total ? () => formatNumber(total.actual_quantity) : '0', }, { id: 'actual_unit_price', header: 'Harga Satuan', accessorFn: (props) => formatCurrency(props.actual_unit_price), footer: '', }, { id: 'actual_total_amount', header: 'Total', accessorFn: (props) => formatCurrency(props.actual_total_amount), footer: total ? () => formatCurrency(total.actual_total_amount) : '0', }, ], }, ]; const kandangColumn: ColumnDef[] = [ { id: 'actual_date', header: 'Tanggal', accessorFn: (props) => formatDate(props.actual_date, 'DD MMM, YYYY'), footer: '', }, { id: 'actual_quantity', header: 'Jumlah', accessorFn: (props) => formatNumber(props.actual_quantity), footer: total ? () => formatNumber(total.actual_quantity) : '', }, { id: 'actual_unit_price', header: 'Harga Satuan', accessorFn: (props) => formatCurrency(props.actual_unit_price), footer: '', }, { id: 'actual_total_amount', header: 'Total', accessorFn: (props) => formatCurrency(props.actual_total_amount), footer: total ? () => formatCurrency(total.actual_total_amount) : '', }, ]; const finalColumns: ColumnDef[] = [ // Group untuk kolom tanpa footer { header: 'No', accessorFn: (_, index) => index, cell: (props) => props.row.index + 1, }, { header: 'Nama Item', accessorFn: (props) => props.item_name, footer: 'Total Pengeluaran Overhead', }, { header: 'Satuan', accessorFn: (props) => props.uom_name, }, ...(kandangId ? kandangColumn : flockColumn), { id: 'cost_per_bird', header: 'Rp/Ekor', accessorFn: (props) => formatCurrency(props.cost_per_bird), footer: total ? () => formatCurrency(total.cost_per_bird) : '', }, ]; return finalColumns; }; const columns = useMemo( () => isResponseSuccess(overhead) ? createColumns( kandangId ? isResponseSuccess(overheadKandang) ? overheadKandang.data?.total : undefined : overhead.data?.total, kandangId ? Number(kandangId) : undefined ) : createColumns(), [overhead, kandangId, overheadKandang] ); return ( <> {isLoadingOverhead ? ( ) : !isResponseSuccess(overhead) || (!kandangId && overhead.data?.overheads.length === 0) || (kandangId && !isResponseSuccess(overheadKandang)) ? ( ) : ( data={ kandangId ? isResponseSuccess(overheadKandang) ? (overheadKandang.data?.overheads ?? []) : [] : isResponseSuccess(overhead) ? (overhead.data?.overheads ?? []) : [] } columns={columns} className={{ containerClassName: 'my-4', headerColumnClassName: cn( TABLE_DEFAULT_STYLING.headerColumnClassName, 'whitespace-nowrap' ), }} isLoading={isLoadingOverhead} renderFooter={ isResponseSuccess(overhead) ? overhead.data?.overheads.length > 0 : false } /> )} {kandangId && !isLoadingOverhead && isResponseSuccess(overhead) && (

Pembelian Kandang

Populasi Akhir KANDANG{' '} Pemakaian Di FARM

Populasi Akhir Proyek
{formatNumber(chickinPopulation ?? 0)} {formatCurrency( isResponseSuccess(overhead) ? overhead.data?.total.actual_total_amount : 0 )}

{formatNumber(generalInformation?.population ?? 0)}

{formatNumber(kandangTotal || 0)}

)}
); }; export default OverheadClosingTable;