From e77a43300a5a42663b32d1852c7956a1a9103739 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 13 Jan 2026 16:01:30 +0700 Subject: [PATCH] refactor(FE): Nest project_flock in Recording and update UI --- .../production/recording/RecordingTable.tsx | 8 +- .../recording/form/RecordingForm.tsx | 92 ++++++++++++------- src/types/api/production/recording.d.ts | 44 ++++++--- 3 files changed, 98 insertions(+), 46 deletions(-) diff --git a/src/components/pages/production/recording/RecordingTable.tsx b/src/components/pages/production/recording/RecordingTable.tsx index 39b17ef7..6b10b26e 100644 --- a/src/components/pages/production/recording/RecordingTable.tsx +++ b/src/components/pages/production/recording/RecordingTable.tsx @@ -678,12 +678,13 @@ const RecordingTable = () => { { header: 'Nama Project', cell: (props) => - `Project ${props.row.original.project_flock_kandang_id}`, + props.row.original.project_flock?.flock_name || '-', }, { header: 'Kategori', cell: (props) => { - const category = props.row.original.project_flock_category; + const category = + props.row.original.project_flock?.project_flock_category; if (!category) return '-'; const color = category === 'LAYING' ? 'info' : 'warning'; return ( @@ -706,7 +707,8 @@ const RecordingTable = () => { { header: 'Populasi Awal', cell: (props) => - props.row.original.total_chick_qty?.toLocaleString() || '-', + props.row.original.project_flock?.total_chick_qty?.toLocaleString() || + '-', }, { header: 'Status Approval', diff --git a/src/components/pages/production/recording/form/RecordingForm.tsx b/src/components/pages/production/recording/form/RecordingForm.tsx index 4966172c..5097fe27 100644 --- a/src/components/pages/production/recording/form/RecordingForm.tsx +++ b/src/components/pages/production/recording/form/RecordingForm.tsx @@ -252,9 +252,13 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { : undefined; const projectFlockKandangDetailUrl = useMemo(() => { - if (type === 'add' || !initialValues?.project_flock_kandang_id) return null; - return `${ProjectFlockKandangApi.basePath}/${initialValues.project_flock_kandang_id}`; - }, [type, initialValues?.project_flock_kandang_id]); + if ( + type === 'add' || + !initialValues?.project_flock?.project_flock_kandang_id + ) + return null; + return `${ProjectFlockKandangApi.basePath}/${initialValues.project_flock.project_flock_kandang_id}`; + }, [type, initialValues?.project_flock?.project_flock_kandang_id]); const { data: projectFlockKandangDetailData } = useSWR( projectFlockKandangDetailUrl, @@ -404,12 +408,12 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { }, [approvedProjectFlockKandangsData]); const isLayingCategory = - initialValues?.project_flock_category === 'LAYING' || + initialValues?.project_flock?.project_flock_category === 'LAYING' || projectFlockKandangLookup?.project_flock?.category === 'LAYING' || projectFlockKandangDetail?.project_flock?.category === 'LAYING'; const isGrowingCategory = - initialValues?.project_flock_category === 'GROWING' || + initialValues?.project_flock?.project_flock_category === 'GROWING' || projectFlockKandangLookup?.project_flock?.category === 'GROWING' || projectFlockKandangDetail?.project_flock?.category === 'GROWING'; @@ -555,7 +559,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { todayRecordings.forEach((recording) => { const recordingDate = recording.record_datetime?.split('T')[0]; if (recordingDate === today) { - recordedIds.add(recording.project_flock_kandang_id); + recordedIds.add(recording.project_flock.project_flock_kandang_id); } }); @@ -1005,7 +1009,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { const hasSameDayRecording = isResponseSuccess(existingRecordings) ? existingRecordings.data?.some( (recording: Recording) => - recording.project_flock_kandang_id === + recording.project_flock.project_flock_kandang_id === projectFlockKandangId && recording.day === nextDayRecording.next_day ) @@ -1543,13 +1547,14 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { - {initialValues.project_flock_category} + {initialValues.project_flock?.project_flock_category}

@@ -1579,7 +1584,7 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { {type === 'detail' && initialValues && (
{ - {initialValues.fcr_std && initialValues.fcr_std > 0 - ? formatNumber(initialValues.fcr_std) + {initialValues.project_flock?.fcr?.fcr_std && + initialValues.project_flock?.fcr?.fcr_std > 0 + ? formatNumber( + initialValues.project_flock?.fcr?.fcr_std + ) : '-'} @@ -1630,9 +1638,14 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { - {initialValues.feed_intake_std && - initialValues.feed_intake_std > 0 - ? formatNumber(initialValues.feed_intake_std) + {initialValues.project_flock?.production_standart + ?.feed_intake_std && + initialValues.project_flock?.production_standart + ?.feed_intake_std > 0 + ? formatNumber( + initialValues.project_flock?.production_standart + ?.feed_intake_std + ) : '-'} @@ -1698,9 +1711,11 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { colSpan={2} className='text-center py-3 font-semibold' > - {initialValues.total_chick_qty && - initialValues.total_chick_qty > 0 - ? formatNumber(initialValues.total_chick_qty) + {initialValues.project_flock?.total_chick_qty && + initialValues.project_flock?.total_chick_qty > 0 + ? formatNumber( + initialValues.project_flock?.total_chick_qty + ) : '-'} @@ -1712,7 +1727,8 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { {/* Egg Production Section - Only for LAYING category */} {type === 'detail' && initialValues && - initialValues.project_flock_category === 'LAYING' && ( + initialValues.project_flock?.project_flock_category === + 'LAYING' && (
@@ -1744,9 +1760,14 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { - {initialValues.egg_mass_std && - initialValues.egg_mass_std > 0 - ? formatNumber(initialValues.egg_mass_std) + {initialValues.project_flock?.production_standart + ?.egg_mass_std && + initialValues.project_flock?.production_standart + ?.egg_mass_std > 0 + ? formatNumber( + initialValues.project_flock + ?.production_standart?.egg_mass_std + ) : '-'} @@ -1763,9 +1784,14 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { - {initialValues.egg_weight_std && - initialValues.egg_weight_std > 0 - ? formatNumber(initialValues.egg_weight_std) + {initialValues.project_flock?.production_standart + ?.egg_weight_std && + initialValues.project_flock?.production_standart + ?.egg_weight_std > 0 + ? formatNumber( + initialValues.project_flock + ?.production_standart?.egg_weight_std + ) : '-'} @@ -1780,9 +1806,11 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { - {initialValues.hen_day_std !== undefined && - initialValues.hen_day_std > 0 - ? `${initialValues.hen_day_std}%` + {initialValues.project_flock?.production_standart + ?.hen_day_std !== undefined && + initialValues.project_flock?.production_standart + ?.hen_day_std > 0 + ? `${initialValues.project_flock?.production_standart?.hen_day_std}%` : '-'} @@ -1797,9 +1825,11 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { - {initialValues.hen_house_std !== undefined && - initialValues.hen_house_std > 0 - ? `${initialValues.hen_house_std}%` + {initialValues.project_flock?.production_standart + ?.hen_house_std !== undefined && + initialValues.project_flock?.production_standart + ?.hen_house_std > 0 + ? `${initialValues.project_flock?.production_standart?.hen_house_std}%` : '-'} diff --git a/src/types/api/production/recording.d.ts b/src/types/api/production/recording.d.ts index 1728516a..079bf045 100644 --- a/src/types/api/production/recording.d.ts +++ b/src/types/api/production/recording.d.ts @@ -1,34 +1,52 @@ import { BaseApproval, BaseMetadata, User } from '@/types/api/api-general'; import { ProductWarehouse } from '@/types/api/inventory/product-warehouse'; +import { Warehouse } from '@/types/api/master-data/warehouse'; + +export type ProductionStandard = { + id: number; + week: number; + name: string; + hen_day_std: number; + hen_house_std: number; + feed_intake_std: number; + max_depletion_std: number; + egg_mass_std: number; + egg_weight_std: number; +}; + +export type FCR = { + id: number; + name: string; + fcr_std: number; +}; + +export type ProjectFlock = { + project_flock_kandang_id: number; + flock_name: string; + project_flock_category: 'GROWING' | 'LAYING'; + period: number; + production_standart: ProductionStandard; + fcr: FCR; + total_chick_qty: number; +}; export type ProductionMetrics = { total_depletion_qty: number; cum_depletion_rate: number; cum_intake: number; fcr_value: number; - fcr_std?: number; - total_chick_qty: number; hen_day?: number; hen_house?: number; feed_intake?: number; - feed_intake_std?: number; egg_mass?: number; egg_weight?: number; - hen_day_std?: number; - hen_house_std?: number; - egg_mass_std?: number; - egg_weight_std?: number; - daily_gain?: number; - avg_daily_gain?: number; - cum_depletion?: number; }; export type BaseRecording = { id: number; - project_flock_kandang_id: number; + project_flock: ProjectFlock; record_datetime: string; day: number; - project_flock_category?: 'GROWING' | 'LAYING'; } & ProductionMetrics; export type RecordingDepletion = { @@ -68,6 +86,8 @@ export type Recording = BaseMetadata & BaseRecording & { approval?: BaseApproval; created_user: User; + warehouse?: Warehouse; + product_category?: 'GROWING' | 'LAYING'; depletions?: RecordingDepletion[]; stocks?: RecordingStock[]; eggs?: RecordingEgg[];