diff --git a/src/components/pages/flock/recording/form/RecordingForm.schema.ts b/src/components/pages/flock/recording/form/RecordingForm.schema.ts new file mode 100644 index 00000000..f78e65e1 --- /dev/null +++ b/src/components/pages/flock/recording/form/RecordingForm.schema.ts @@ -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() + .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; + +export const getRecordingFormInitialValues = ( + initialValues?: Partial +): 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, + }, + ], +}); diff --git a/src/config/constant.ts b/src/config/constant.ts index 8f712726..87dcd927 100644 --- a/src/config/constant.ts +++ b/src/config/constant.ts @@ -12,6 +12,29 @@ export const MAIN_DRAWER_LINKS: MAIN_DRAWER_MENU[] = [ icon: 'gg:chart', }, + { + title: 'Flock', + link: '/flock', + icon: 'mdi:chicken', + submenu: [ + { + title: 'List Flock', + link: '/flock/list', + icon: 'mdi:chicken', + }, + { + title: 'Chick In', + link: '/flock/chick-in', + icon: 'mdi:home-import-outline', + }, + { + title: 'Recording', + link: '/flock/recording', + icon: 'mdi:clipboard-text', + }, + ], + }, + { title: 'Persediaan', link: '/inventory', @@ -175,3 +198,10 @@ export const PRODUCT_FLAG_OPTIONS = [ export const SUPPLIER_FLAG_OPTIONS = [ { label: 'EKSPEDISI', value: 'EKSPEDISI' }, ]; + +export const RECORDING_FLAG_OPTIONS = [ + { label: 'Ayam Afkir', value: 'Ayam Afkir' }, + { label: 'Ayam Culling', value: 'Ayam Culling' }, + { label: 'Ayam Mati', value: 'Ayam Mati' }, + { label: 'DOC', value: 'DOC' }, +]; diff --git a/src/services/api/flock.ts b/src/services/api/flock.ts new file mode 100644 index 00000000..83fbb0d8 --- /dev/null +++ b/src/services/api/flock.ts @@ -0,0 +1,22 @@ +import { + CreateFlockPayload, + Flock, + UpdateFlockPayload, +} from '@/types/api/flock/flock'; +import { + CreateRecordingPayload, + Recording, + UpdateRecordingPayload, +} from '@/types/api/flock/recording'; +import { BaseApiService } from '@/services/api/base'; + +export const FlockApi = new BaseApiService< + Flock, + CreateFlockPayload, + UpdateFlockPayload +>('/flock/flocks'); +export const RecordingApi = new BaseApiService< + Recording, + CreateRecordingPayload, + UpdateRecordingPayload +>('/flock/recordings'); diff --git a/src/types/api/flock/flock.d.ts b/src/types/api/flock/flock.d.ts new file mode 100644 index 00000000..e0dcfda4 --- /dev/null +++ b/src/types/api/flock/flock.d.ts @@ -0,0 +1,14 @@ +import { BaseMetadata } from '@/types/api/api-general'; + +export type BaseFlock = { + id: number; + name: string; +}; + +export type Flock = BaseMetadata & BaseFlock; + +export type CreateFlockPayload = { + name: string; +}; + +export type UpdateFlockPayload = CreateFlockPayload; diff --git a/src/types/api/flock/recording.d.ts b/src/types/api/flock/recording.d.ts new file mode 100644 index 00000000..66818f0c --- /dev/null +++ b/src/types/api/flock/recording.d.ts @@ -0,0 +1,54 @@ +import { BaseMetadata } from '@/types/api/api-general'; +import { Flock } from '@/types/api/flock/flock'; + +export type BaseRecording = { + id: number; + flock: Flock; + data_pakan: { + nama_pakan: string; + qty_pakan: number; + stock_pakan; + }[]; + bobot_badan: { + berat_ayam: number; + jumlah_ayam: number; + rata_rata_berat_ayam: number; + }[]; + vaksinasi: { + nama_vaksin: string; + total_stock: number; + jumlah_stock: number; + }[]; + mortalitas: { + kondisi: string; + jumlah: number; + }[]; +}; + +export type Recording = BaseMetadata & BaseRecording; + +export type CreateRecordingPayload = { + flock_id: number; + tanggal: string; + data_pakan: { + nama_pakan: string; + qty_pakan: number; + stock_pakan: number; + }[]; + bobot_badan: { + berat_ayam: number; + jumlah_ayam: number; + rata_rata_berat_ayam: number; + }[]; + vaksinasi: { + nama_vaksin: string; + total_stock: number; + jumlah_stock: number; + }[]; + mortalitas: { + kondisi: string; + jumlah: number; + }[]; +}; + +export type UpdateRecordingPayload = CreateRecordingPayload;