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[];