feat(FE-136): add flock and recording management with validation in forms

This commit is contained in:
rstubryan
2025-10-14 22:03:09 +07:00
parent 4b4b74d07c
commit 1869fa8dc5
5 changed files with 241 additions and 0 deletions
@@ -0,0 +1,121 @@
import * as Yup from 'yup';
import { RECORDING_FLAG_OPTIONS } from '@/config/constant';
export const RecordingFormSchema = Yup.object({
flock_id: Yup.number().required('Flock wajib diisi!'),
tanggal: Yup.string().required('Tanggal wajib diisi!'),
data_pakan: Yup.array()
.of(
Yup.object({
nama_pakan: Yup.string().required('Nama pakan wajib diisi!'),
qty_pakan: Yup.number()
.required('Qty pakan wajib diisi!')
.min(1, 'Qty minimal 1!'),
stock_pakan: 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()
.of(
Yup.object({
berat_ayam: Yup.number()
.required('Berat ayam wajib diisi!')
.min(1, 'Berat minimal 1!'),
jumlah_ayam: Yup.number()
.required('Jumlah ayam wajib diisi!')
.min(1, 'Jumlah minimal 1!'),
rata_rata_berat_ayam: 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()
.of(
Yup.object({
nama_vaksin: 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()
.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()
.of(
Yup.object({
kondisi: Yup.mixed<string>()
.oneOf(
RECORDING_FLAG_OPTIONS.map((opt) => opt.value),
'Kondisi tidak valid!'
)
.required('Kondisi wajib diisi!'),
jumlah: Yup.number()
.required('Jumlah wajib diisi!')
.min(1, 'Jumlah minimal 1!'),
})
)
.min(1, 'Minimal harus ada 1 data mortalitas!')
.required('Data mortalitas wajib diisi!'),
});
export const UpdateRecordingFormSchema = RecordingFormSchema;
export type RecordingFormValues = Yup.InferType<typeof RecordingFormSchema>;
export const getRecordingFormInitialValues = (
initialValues?: Partial<RecordingFormValues>
): RecordingFormValues => ({
flock_id: initialValues?.flock_id ?? 0,
tanggal: initialValues?.tanggal ?? '',
data_pakan:
Array.isArray(initialValues?.data_pakan) &&
initialValues.data_pakan.length > 0
? initialValues.data_pakan
: [
{
nama_pakan: '',
qty_pakan: 0,
stock_pakan: 0,
},
],
bobot_badan:
Array.isArray(initialValues?.bobot_badan) &&
initialValues.bobot_badan.length > 0
? initialValues.bobot_badan
: [
{
berat_ayam: 0,
jumlah_ayam: 0,
rata_rata_berat_ayam: 0,
},
],
vaksinasi:
Array.isArray(initialValues?.vaksinasi) &&
initialValues.vaksinasi.length > 0
? initialValues.vaksinasi
: [
{
nama_vaksin: '',
total_stock: 0,
jumlah_stock: 0,
},
],
mortalitas:
Array.isArray(initialValues?.mortalitas) &&
initialValues.mortalitas.length > 0
? initialValues.mortalitas
: [
{
kondisi: '',
jumlah: 0,
},
],
});