From 64a32fd214f41179e133055386794f3595a3265c Mon Sep 17 00:00:00 2001 From: rstubryan Date: Wed, 15 Oct 2025 17:39:27 +0700 Subject: [PATCH] refactor(FE-114,136): update RecordingForm schema and types to include location and coop fields --- .../recording/form/RecordingForm.schema.ts | 86 ++- .../flock/recording/form/RecordingForm.tsx | 610 ++++++++++-------- src/types/api/flock/recording.d.ts | 66 +- 3 files changed, 443 insertions(+), 319 deletions(-) diff --git a/src/components/pages/flock/recording/form/RecordingForm.schema.ts b/src/components/pages/flock/recording/form/RecordingForm.schema.ts index 90d91c4f..394b08b0 100644 --- a/src/components/pages/flock/recording/form/RecordingForm.schema.ts +++ b/src/components/pages/flock/recording/form/RecordingForm.schema.ts @@ -8,63 +8,73 @@ export const RecordingFormSchema = Yup.object({ label: Yup.string().required(), }).nullable(), flock_id: Yup.number().required('Flock wajib diisi!'), - tanggal_recording: Yup.date() + location: Yup.object({ + value: Yup.number().min(1).required(), + label: Yup.string().required(), + }).nullable(), + location_id: Yup.number().required('Lokasi wajib diisi!'), + coop: Yup.object({ + value: Yup.number().min(1).required(), + label: Yup.string().required(), + }).nullable(), + coop_id: Yup.number().required('Kandang wajib diisi!'), + recording_date: Yup.date() .required('Tanggal recording wajib diisi') .typeError('Format tanggal tidak valid'), - data_pakan: Yup.array() + feed_data: Yup.array() .of( Yup.object({ - nama_pakan: Yup.string().required('Nama pakan wajib diisi!'), - qty_pakan: Yup.number() + feed_name: Yup.string().required('Nama pakan wajib diisi!'), + feed_qty: Yup.number() .required('Qty pakan wajib diisi!') .min(1, 'Qty minimal 1!'), - stock_pakan: Yup.number() + feed_stock: Yup.number() .required('Stock pakan wajib diisi!') .min(0, 'Stock minimal 0!'), }) ) .min(1, 'Minimal harus ada 1 data pakan!') .required('Data pakan wajib diisi!'), - bobot_badan: Yup.array() + body_weight: Yup.array() .of( Yup.object({ - berat_ayam: Yup.number() + chicken_weight: Yup.number() .required('Berat ayam wajib diisi!') .min(1, 'Berat minimal 1!'), - jumlah_ayam: Yup.number() + chicken_count: Yup.number() .required('Jumlah ayam wajib diisi!') .min(1, 'Jumlah minimal 1!'), - rata_rata_berat_ayam: Yup.number() + average_chicken_weight: Yup.number() .required('Rata-rata berat ayam wajib diisi!') .min(1, 'Rata-rata minimal 1!'), }) ) .min(1, 'Minimal harus ada 1 data bobot badan!') .required('Data bobot badan wajib diisi!'), - vaksinasi: Yup.array() + vaccination: Yup.array() .of( Yup.object({ - nama_vaksin: Yup.string().required('Nama vaksin wajib diisi!'), + vaccine_name: Yup.string().required('Nama vaksin wajib diisi!'), total_stock: Yup.number() .required('Total stock wajib diisi!') .min(0, 'Total stock minimal 0!'), - jumlah_stock: Yup.number() + used_stock: Yup.number() .required('Jumlah stock wajib diisi!') .min(0, 'Jumlah stock minimal 0!'), }) ) .min(1, 'Minimal harus ada 1 data vaksinasi!') .required('Data vaksinasi wajib diisi!'), - mortalitas: Yup.array() + mortality: Yup.array() .of( Yup.object({ - kondisi: Yup.mixed() + condition: Yup.mixed() .oneOf( RECORDING_FLAG_OPTIONS.map((opt) => opt.value), 'Kondisi tidak valid!' ) .required('Kondisi wajib diisi!'), - jumlah: Yup.number() + count: Yup.number() .required('Jumlah wajib diisi!') .min(1, 'Jumlah minimal 1!'), }) @@ -87,34 +97,48 @@ export const getRecordingFormInitialValues = ( } : null, flock_id: initialValues?.flock?.id ?? 0, - tanggal_recording: initialValues?.tanggal_recording - ? new Date(initialValues.tanggal_recording) + location: initialValues?.location + ? { + value: initialValues.location.id, + label: initialValues.location.name, + } + : null, + location_id: initialValues?.location?.id ?? 0, + coop: initialValues?.coop + ? { + value: initialValues.coop.id, + label: initialValues.coop.name, + } + : null, + coop_id: initialValues?.coop?.id ?? 0, + recording_date: initialValues?.recording_date + ? new Date(initialValues.recording_date) : new Date(), - data_pakan: initialValues?.data_pakan ?? [ + feed_data: initialValues?.feed_data ?? [ { - nama_pakan: '', - qty_pakan: 0, - stock_pakan: 0, + feed_name: '', + feed_qty: 0, + feed_stock: 0, }, ], - bobot_badan: initialValues?.bobot_badan ?? [ + body_weight: initialValues?.body_weight ?? [ { - berat_ayam: 0, - jumlah_ayam: 0, - rata_rata_berat_ayam: 0, + chicken_weight: 0, + chicken_count: 0, + average_chicken_weight: 0, }, ], - vaksinasi: initialValues?.vaksinasi ?? [ + vaccination: initialValues?.vaccination ?? [ { - nama_vaksin: '', + vaccine_name: '', total_stock: 0, - jumlah_stock: 0, + used_stock: 0, }, ], - mortalitas: initialValues?.mortalitas ?? [ + mortality: initialValues?.mortality ?? [ { - kondisi: '', - jumlah: 0, + condition: '', + count: 0, }, ], }); diff --git a/src/components/pages/flock/recording/form/RecordingForm.tsx b/src/components/pages/flock/recording/form/RecordingForm.tsx index f53123f1..afc9cd84 100644 --- a/src/components/pages/flock/recording/form/RecordingForm.tsx +++ b/src/components/pages/flock/recording/form/RecordingForm.tsx @@ -22,6 +22,7 @@ import { FlockApi } from '@/services/api/flock'; import { isResponseSuccess } from '@/lib/api-helper'; import { RECORDING_FLAG_OPTIONS } from '@/config/constant'; import useSWR from 'swr'; +import { KandangApi, LocationApi } from '@/services/api/master-data'; interface RecordingFormProps { type?: 'add' | 'edit' | 'detail'; @@ -37,10 +38,11 @@ const DUMMY_FLOCKS = [ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { const [flockSelectInputValue, setFlockSelectInputValue] = useState(''); - const [selectedPakan, setSelectedPakan] = useState([]); - const [selectedBobot, setSelectedBobot] = useState([]); - const [selectedVaksin, setSelectedVaksin] = useState([]); - const [selectedMortal, setSelectedMortal] = useState([]); + const [selectedFeed, setSelectedFeed] = useState([]); + const [selectedWeight, setSelectedWeight] = useState([]); + const [selectedVaccine, setSelectedVaccine] = useState([]); + const [selectedMortality, setSelectedMortality] = useState([]); + const [, setRecordingFormErrorMessage] = useState(''); const { deleteModal, @@ -67,28 +69,30 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { setRecordingFormErrorMessage(''); const payload: CreateRecordingPayload = { flock_id: values.flock_id, - tanggal_recording: - values.tanggal_recording instanceof Date - ? values.tanggal_recording.toISOString() + location_id: values.location_id, + coop_id: values.coop_id, + recording_date: + values.recording_date instanceof Date + ? values.recording_date.toISOString() : new Date().toISOString(), - data_pakan: (values.data_pakan ?? []).map((p) => ({ - nama_pakan: p.nama_pakan, - qty_pakan: p.qty_pakan, - stock_pakan: p.stock_pakan, + feed_data: (values.feed_data ?? []).map((p) => ({ + feed_name: p.feed_name, + feed_qty: p.feed_qty, + feed_stock: p.feed_stock, })), - bobot_badan: (values.bobot_badan ?? []).map((b) => ({ - berat_ayam: b.berat_ayam, - jumlah_ayam: b.jumlah_ayam, - rata_rata_berat_ayam: b.rata_rata_berat_ayam, + body_weight: (values.body_weight ?? []).map((b) => ({ + chicken_weight: b.chicken_weight, + chicken_count: b.chicken_count, + average_chicken_weight: b.average_chicken_weight, })), - vaksinasi: (values.vaksinasi ?? []).map((v) => ({ - nama_vaksin: v.nama_vaksin, + vaccination: (values.vaccination ?? []).map((v) => ({ + vaccine_name: v.vaccine_name, total_stock: v.total_stock, - jumlah_stock: v.jumlah_stock, + used_stock: v.used_stock, })), - mortalitas: (values.mortalitas ?? []).map((m) => ({ - kondisi: m.kondisi, - jumlah: m.jumlah, + mortality: (values.mortality ?? []).map((m) => ({ + condition: m.condition, + count: m.count, })), }; @@ -115,16 +119,64 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { const flockOptions = DUMMY_FLOCKS; + // Location and Coop state/handlers + const [locationSelectInputValue, setLocationSelectInputValue] = useState(''); + const [coopSelectInputValue, setCoopSelectInputValue] = useState(''); + + // Location fetch + const locationsUrl = `${LocationApi.basePath}?${new URLSearchParams({ search: locationSelectInputValue ?? '' }).toString()}`; + const { data: locations, isLoading: isLoadingLocations } = useSWR( + locationsUrl, + LocationApi.getAllFetcher + ); + const locationOptions = isResponseSuccess(locations) + ? locations?.data.map((loc) => ({ value: loc.id, label: loc.name })) + : []; + + // Coop fetch + const coopsUrl = `${KandangApi.basePath}?${new URLSearchParams({ search: coopSelectInputValue ?? '' }).toString()}`; + const { data: coops, isLoading: isLoadingCoops } = useSWR( + coopsUrl, + KandangApi.getAllFetcher + ); + + // Filter coop options based on selected location + const coopOptions = useMemo(() => { + if (!isResponseSuccess(coops) || !formik.values.location_id) return []; + return coops.data + .filter((coop) => coop.location.id === formik.values.location_id) + .map((coop) => ({ value: coop.id, label: coop.name })); + }, [coops, formik.values.location_id]); + + // Handlers + const locationChangeHandler = (val: OptionType | OptionType[] | null) => { + formik.setFieldTouched('location', true); + formik.setFieldValue('location', val); + formik.setFieldTouched('location_id', true); + formik.setFieldValue('location_id', (val as OptionType)?.value); + // Reset coop selection when location changes + formik.setFieldValue('coop', null); + formik.setFieldValue('coop_id', 0); + setCoopSelectInputValue(''); + }; + + const coopChangeHandler = (val: OptionType | OptionType[] | null) => { + formik.setFieldTouched('coop', true); + formik.setFieldValue('coop', val); + formik.setFieldTouched('coop_id', true); + formik.setFieldValue('coop_id', (val as OptionType)?.value); + }; + const isRepeaterInputError = ( arrayName: T, - field: T extends 'data_pakan' - ? keyof CreateRecordingPayload['data_pakan'][0] - : T extends 'bobot_badan' - ? keyof CreateRecordingPayload['bobot_badan'][0] - : T extends 'vaksinasi' - ? keyof CreateRecordingPayload['vaksinasi'][0] - : T extends 'mortalitas' - ? keyof CreateRecordingPayload['mortalitas'][0] + field: T extends 'feed_data' + ? keyof CreateRecordingPayload['feed_data'][0] + : T extends 'body_weight' + ? keyof CreateRecordingPayload['body_weight'][0] + : T extends 'vaccination' + ? keyof CreateRecordingPayload['vaccination'][0] + : T extends 'mortality' + ? keyof CreateRecordingPayload['mortality'][0] : never, idx: number ) => { @@ -156,111 +208,111 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { }; }; - const addDataPakan = () => { - const newDataPakan = [ - ...(formik.values.data_pakan || []), + const addFeedData = () => { + const newFeedData = [ + ...(formik.values.feed_data || []), { - nama_pakan: '', - qty_pakan: 0, - stock_pakan: 0, + feed_name: '', + feed_qty: 0, + feed_stock: 0, }, ]; - formik.setFieldValue('data_pakan', newDataPakan); + formik.setFieldValue('feed_data', newFeedData); }; - const removeDataPakan = (idx: number) => { - const updatedDataPakan = formik.values.data_pakan?.filter( + const removeFeedData = (idx: number) => { + const updatedFeedData = formik.values.feed_data?.filter( (_, i) => i !== idx ); - formik.setFieldValue('data_pakan', updatedDataPakan); + formik.setFieldValue('feed_data', updatedFeedData); }; - const removeSelectedDataPakan = () => { - const updatedDataPakan = formik.values.data_pakan?.filter( - (_, idx) => !selectedPakan.includes(idx) + const removeSelectedFeedData = () => { + const updatedFeedData = formik.values.feed_data?.filter( + (_, idx) => !selectedFeed.includes(idx) ); - formik.setFieldValue('data_pakan', updatedDataPakan); - setSelectedPakan([]); + formik.setFieldValue('feed_data', updatedFeedData); + setSelectedFeed([]); }; - const addBobotBadan = () => { - const newBobotBadan = [ - ...(formik.values.bobot_badan || []), + const addBodyWeight = () => { + const newBodyWeight = [ + ...(formik.values.body_weight || []), { - berat_ayam: 0, - jumlah_ayam: 0, - rata_rata_berat_ayam: 0, + chicken_weight: 0, + chicken_count: 0, + average_chicken_weight: 0, }, ]; - formik.setFieldValue('bobot_badan', newBobotBadan); + formik.setFieldValue('body_weight', newBodyWeight); }; - const removeBobotBadan = (idx: number) => { - const updatedBobotBadan = formik.values.bobot_badan?.filter( + const removeBodyWeight = (idx: number) => { + const updatedBodyWeight = formik.values.body_weight?.filter( (_, i) => i !== idx ); - formik.setFieldValue('bobot_badan', updatedBobotBadan); + formik.setFieldValue('body_weight', updatedBodyWeight); }; - const removeSelectedBobotBadan = () => { - const updatedBobotBadan = formik.values.bobot_badan?.filter( - (_, idx) => !selectedBobot.includes(idx) + const removeSelectedBodyWeight = () => { + const updatedBodyWeight = formik.values.body_weight?.filter( + (_, idx) => !selectedWeight.includes(idx) ); - formik.setFieldValue('bobot_badan', updatedBobotBadan); - setSelectedBobot([]); + formik.setFieldValue('body_weight', updatedBodyWeight); + setSelectedWeight([]); }; - const addVaksinasi = () => { - const newVaksinasi = [ - ...(formik.values.vaksinasi || []), + const addVaccination = () => { + const newVaccination = [ + ...(formik.values.vaccination || []), { - nama_vaksin: '', + vaccine_name: '', total_stock: 0, - jumlah_stock: 0, + used_stock: 0, }, ]; - formik.setFieldValue('vaksinasi', newVaksinasi); + formik.setFieldValue('vaccination', newVaccination); }; - const removeVaksinasi = (idx: number) => { - const updatedVaksinasi = formik.values.vaksinasi?.filter( + const removeVaccination = (idx: number) => { + const updatedVaccination = formik.values.vaccination?.filter( (_, i) => i !== idx ); - formik.setFieldValue('vaksinasi', updatedVaksinasi); + formik.setFieldValue('vaccination', updatedVaccination); }; - const removeSelectedVaksinasi = () => { - const updatedVaksinasi = formik.values.vaksinasi?.filter( - (_, idx) => !selectedVaksin.includes(idx) + const removeSelectedVaccination = () => { + const updatedVaccination = formik.values.vaccination?.filter( + (_, idx) => !selectedVaccine.includes(idx) ); - formik.setFieldValue('vaksinasi', updatedVaksinasi); - setSelectedVaksin([]); + formik.setFieldValue('vaccination', updatedVaccination); + setSelectedVaccine([]); }; - const addMortalitas = () => { - const newMortalitas = [ - ...(formik.values.mortalitas || []), + const addMortality = () => { + const newMortality = [ + ...(formik.values.mortality || []), { - kondisi: RECORDING_FLAG_OPTIONS[0].value, - jumlah: 0, + condition: RECORDING_FLAG_OPTIONS[0].value, + count: 0, }, ]; - formik.setFieldValue('mortalitas', newMortalitas); + formik.setFieldValue('mortality', newMortality); }; - const removeMortalitas = (idx: number) => { - const updatedMortalitas = formik.values.mortalitas?.filter( + const removeMortality = (idx: number) => { + const updatedMortality = formik.values.mortality?.filter( (_, i) => i !== idx ); - formik.setFieldValue('mortalitas', updatedMortalitas); + formik.setFieldValue('mortality', updatedMortality); }; - const removeSelectedMortalitas = () => { - const updatedMortalitas = formik.values.mortalitas?.filter( - (_, idx) => !selectedMortal.includes(idx) + const removeSelectedMortality = () => { + const updatedMortality = formik.values.mortality?.filter( + (_, idx) => !selectedMortality.includes(idx) ); - formik.setFieldValue('mortalitas', updatedMortalitas); - setSelectedMortal([]); + formik.setFieldValue('mortality', updatedMortality); + setSelectedMortality([]); }; return ( @@ -331,8 +383,8 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { type='date' name='tanggal_recording' value={ - formik.values.tanggal_recording instanceof Date - ? formik.values.tanggal_recording + formik.values.recording_date instanceof Date + ? formik.values.recording_date .toISOString() .substring(0, 10) : '' @@ -345,20 +397,59 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { }} onBlur={formik.handleBlur} isError={ - formik.touched.tanggal_recording && - Boolean(formik.errors.tanggal_recording) + formik.touched.recording_date && + Boolean(formik.errors.recording_date) } - errorMessage={formik.errors.tanggal_recording as string} + errorMessage={formik.errors.recording_date as string} readOnly={type === 'detail'} /> +
+ + + +
{' '} - {/* Data Pakan Table */} + {/* Feed Data Table */}
-

Data Pakan

+

Feed Data

@@ -369,45 +460,45 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { type='checkbox' className='checkbox' checked={ - formik.values.data_pakan?.length === - selectedPakan.length && - formik.values.data_pakan?.length > 0 + formik.values.feed_data?.length === + selectedFeed.length && + formik.values.feed_data?.length > 0 } onChange={(e) => { if (e.target.checked) { - setSelectedPakan( - formik.values.data_pakan?.map( + setSelectedFeed( + formik.values.feed_data?.map( (_, idx) => idx ) ?? [] ); } else { - setSelectedPakan([]); + setSelectedFeed([]); } }} /> )} - - - - {type !== 'detail' && } + + + + {type !== 'detail' && } - {formik.values.data_pakan?.map((pakan, idx) => ( - + {formik.values.feed_data?.map((feed, idx) => ( + {type !== 'detail' && (
Nama PakanQty PakanStock PakanAksiFeed NameFeed QtyFeed StockAction
{ if (e.target.checked) { - setSelectedPakan([...selectedPakan, idx]); + setSelectedFeed([...selectedFeed, idx]); } else { - setSelectedPakan( - selectedPakan.filter((i) => i !== idx) + setSelectedFeed( + selectedFeed.filter((i) => i !== idx) ); } }} @@ -417,21 +508,21 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { { { { )} )} - {/* Bobot Badan Table */} + {/* Body Weight Table */}
-

Bobot Badan

+

Body Weight

@@ -563,45 +648,45 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { type='checkbox' className='checkbox' checked={ - formik.values.bobot_badan?.length === - selectedBobot.length && - formik.values.bobot_badan?.length > 0 + formik.values.body_weight?.length === + selectedWeight.length && + formik.values.body_weight?.length > 0 } onChange={(e) => { if (e.target.checked) { - setSelectedBobot( - formik.values.bobot_badan?.map( + setSelectedWeight( + formik.values.body_weight?.map( (_, idx) => idx ) ?? [] ); } else { - setSelectedBobot([]); + setSelectedWeight([]); } }} /> )} - - - - {type !== 'detail' && } + + + + {type !== 'detail' && } - {formik.values.bobot_badan?.map((bobot, idx) => ( - + {formik.values.body_weight?.map((weight, idx) => ( + {type !== 'detail' && (
Berat AyamJumlah AyamRata-rata Berat AyamAksiChicken WeightChicken CountAverage WeightAction
{ if (e.target.checked) { - setSelectedBobot([...selectedBobot, idx]); + setSelectedWeight([...selectedWeight, idx]); } else { - setSelectedBobot( - selectedBobot.filter((i) => i !== idx) + setSelectedWeight( + selectedWeight.filter((i) => i !== idx) ); } }} @@ -612,21 +697,21 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { { { { )} )} - {/* Vaksinasi Table */} + {/* Vaccination Table */}
-

Vaksinasi

+

Vaccination

@@ -749,45 +834,45 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { type='checkbox' className='checkbox' checked={ - formik.values.vaksinasi?.length === - selectedVaksin.length && - formik.values.vaksinasi?.length > 0 + formik.values.vaccination?.length === + selectedVaccine.length && + formik.values.vaccination?.length > 0 } onChange={(e) => { if (e.target.checked) { - setSelectedVaksin( - formik.values.vaksinasi?.map( + setSelectedVaccine( + formik.values.vaccination?.map( (_, idx) => idx ) ?? [] ); } else { - setSelectedVaksin([]); + setSelectedVaccine([]); } }} /> )} - + - - {type !== 'detail' && } + + {type !== 'detail' && } - {formik.values.vaksinasi?.map((vaksin, idx) => ( - + {formik.values.vaccination?.map((vaccine, idx) => ( + {type !== 'detail' && (
Nama VaksinVaccine Name Total StockJumlah StockAksiUsed StockAction
{ if (e.target.checked) { - setSelectedVaksin([...selectedVaksin, idx]); + setSelectedVaccine([...selectedVaccine, idx]); } else { - setSelectedVaksin( - selectedVaksin.filter((i) => i !== idx) + setSelectedVaccine( + selectedVaccine.filter((i) => i !== idx) ); } }} @@ -797,21 +882,21 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { { { { )} )} - {/* Mortalitas Table */} + {/* Mortality Table */}
-

Mortalitas

+

Mortality

@@ -943,44 +1028,47 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { type='checkbox' className='checkbox' checked={ - formik.values.mortalitas?.length === - selectedMortal.length && - formik.values.mortalitas?.length > 0 + formik.values.mortality?.length === + selectedMortality.length && + formik.values.mortality?.length > 0 } onChange={(e) => { if (e.target.checked) { - setSelectedMortal( - formik.values.mortalitas?.map( + setSelectedMortality( + formik.values.mortality?.map( (_, idx) => idx ) ?? [] ); } else { - setSelectedMortal([]); + setSelectedMortality([]); } }} /> )} - - - {type !== 'detail' && } + + + {type !== 'detail' && } - {formik.values.mortalitas?.map((mortal, idx) => ( - + {formik.values.mortality?.map((mortality, idx) => ( + {type !== 'detail' && (
KondisiJumlahAksiConditionCountAction
{ if (e.target.checked) { - setSelectedMortal([...selectedMortal, idx]); + setSelectedMortality([ + ...selectedMortality, + idx, + ]); } else { - setSelectedMortal( - selectedMortal.filter((i) => i !== idx) + setSelectedMortality( + selectedMortality.filter((i) => i !== idx) ); } }} @@ -991,21 +1079,27 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { opt.value === mortal.kondisi + (opt) => opt.value === mortality.condition )} onChange={(val) => { formik.setFieldValue( - `mortalitas.${idx}.kondisi`, + `mortality.${idx}.condition`, (val as OptionType)?.value ); }} isError={ - isRepeaterInputError('mortalitas', 'kondisi', idx) - .isError + isRepeaterInputError( + 'mortality', + 'condition', + idx + ).isError } errorMessage={ - isRepeaterInputError('mortalitas', 'kondisi', idx) - .errorMessage + isRepeaterInputError( + 'mortality', + 'condition', + idx + ).errorMessage } options={RECORDING_FLAG_OPTIONS} isDisabled={type === 'detail'} @@ -1015,16 +1109,16 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { { )} )} diff --git a/src/types/api/flock/recording.d.ts b/src/types/api/flock/recording.d.ts index 69c2b0b5..a39588b5 100644 --- a/src/types/api/flock/recording.d.ts +++ b/src/types/api/flock/recording.d.ts @@ -1,28 +1,32 @@ import { BaseMetadata } from '@/types/api/api-general'; import { Flock } from '@/types/api/flock/flock'; +import { Location } from '@/types/api/master-data/location'; +import { Kandang } from '@/types/api/master-data/kandang'; export type BaseRecording = { id: number; flock: Flock; - tanggal_recording: string; - data_pakan: { - nama_pakan: string; - qty_pakan: number; - stock_pakan: number; + recording_date: string; + location: Location; + coop: Kandang; + feed_data: { + feed_name: string; + feed_qty: number; + feed_stock: number; }[]; - bobot_badan: { - berat_ayam: number; - jumlah_ayam: number; - rata_rata_berat_ayam: number; + body_weight: { + chicken_weight: number; + chicken_count: number; + average_chicken_weight: number; }[]; - vaksinasi: { - nama_vaksin: string; + vaccination: { + vaccine_name: string; total_stock: number; - jumlah_stock: number; + used_stock: number; }[]; - mortalitas: { - kondisi: string; - jumlah: number; + mortality: { + condition: string; + count: number; }[]; }; @@ -30,25 +34,27 @@ export type Recording = BaseMetadata & BaseRecording; export type CreateRecordingPayload = { flock_id: number; - tanggal_recording: string; - data_pakan: { - nama_pakan: string; - qty_pakan: number; - stock_pakan: number; + recording_date: string; + location_id: number; + coop_id: number; + feed_data: { + feed_name: string; + feed_qty: number; + feed_stock: number; }[]; - bobot_badan: { - berat_ayam: number; - jumlah_ayam: number; - rata_rata_berat_ayam: number; + body_weight: { + chicken_weight: number; + chicken_count: number; + average_chicken_weight: number; }[]; - vaksinasi: { - nama_vaksin: string; + vaccination: { + vaccine_name: string; total_stock: number; - jumlah_stock: number; + used_stock: number; }[]; - mortalitas: { - kondisi: string; - jumlah: number; + mortality: { + condition: string; + count: number; }[]; };