From c12a58cb6d696e1d563cd9dc50d74d86d7f52270 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Sat, 22 Nov 2025 11:07:23 +0700 Subject: [PATCH] refactor(FE-208): add validation to ensure destination warehouse is different from source warehouse in MovementForm --- .../movement/form/MovementForm.schema.ts | 10 ++- .../inventory/movement/form/MovementForm.tsx | 75 ++++++++++++++++++- 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/components/pages/inventory/movement/form/MovementForm.schema.ts b/src/components/pages/inventory/movement/form/MovementForm.schema.ts index 39f7c669..0d9b3277 100644 --- a/src/components/pages/inventory/movement/form/MovementForm.schema.ts +++ b/src/components/pages/inventory/movement/form/MovementForm.schema.ts @@ -171,7 +171,15 @@ export const MovementFormSchema: Yup.ObjectSchema = }).nullable(), destination_warehouse_id: Yup.number() .required('Gudang tujuan wajib diisi!') - .typeError('Gudang tujuan wajib diisi!'), + .typeError('Gudang tujuan wajib diisi!') + .test( + 'different-warehouse', + 'Gudang tujuan tidak boleh sama dengan gudang asal!', + function (value) { + const { source_warehouse_id } = this.parent; + return !value || !source_warehouse_id || value !== source_warehouse_id; + } + ), products: Yup.array() .of(ProductObjectSchema) .min(1, 'Minimal harus ada 1 produk!') diff --git a/src/components/pages/inventory/movement/form/MovementForm.tsx b/src/components/pages/inventory/movement/form/MovementForm.tsx index 438c09c6..29f44503 100644 --- a/src/components/pages/inventory/movement/form/MovementForm.tsx +++ b/src/components/pages/inventory/movement/form/MovementForm.tsx @@ -745,6 +745,31 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { } }, [formik.values.source_warehouse_id]); + useEffect(() => { + if ( + formik.values.source_warehouse_id && + formik.values.destination_warehouse_id && + formik.values.source_warehouse_id === + formik.values.destination_warehouse_id + ) { + formik.setFieldError( + 'destination_warehouse_id', + 'Gudang tujuan tidak boleh sama dengan gudang asal!' + ); + } else { + if ( + formik.errors.destination_warehouse_id === + 'Gudang tujuan tidak boleh sama dengan gudang asal!' + ) { + formik.setFieldError('destination_warehouse_id', undefined); + } + } + }, [ + formik.values.source_warehouse_id, + formik.values.destination_warehouse_id, + formik.errors.destination_warehouse_id, + ]); + return ( <>
@@ -828,10 +853,33 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { formik.setFieldTouched('source_warehouse', true); formik.setFieldValue('source_warehouse', val); formik.setFieldTouched('source_warehouse_id', true); + const newSourceWarehouseId = (val as WarehouseOptionType) + ?.value; formik.setFieldValue( 'source_warehouse_id', - (val as WarehouseOptionType)?.value + newSourceWarehouseId ); + if ( + newSourceWarehouseId && + formik.values.destination_warehouse_id && + newSourceWarehouseId === + formik.values.destination_warehouse_id + ) { + formik.setFieldError( + 'destination_warehouse_id', + 'Gudang tujuan tidak boleh sama dengan gudang asal!' + ); + } else { + if ( + formik.errors.destination_warehouse_id === + 'Gudang tujuan tidak boleh sama dengan gudang asal!' + ) { + formik.setFieldError( + 'destination_warehouse_id', + undefined + ); + } + } }} options={warehouseOptions} onInputChange={setWarehouseSelectInputValue} @@ -899,10 +947,33 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { formik.setFieldTouched('destination_warehouse', true); formik.setFieldValue('destination_warehouse', val); formik.setFieldTouched('destination_warehouse_id', true); + const newDestinationWarehouseId = (val as WarehouseOptionType) + ?.value; formik.setFieldValue( 'destination_warehouse_id', - (val as WarehouseOptionType)?.value + newDestinationWarehouseId ); + if ( + newDestinationWarehouseId && + formik.values.source_warehouse_id && + newDestinationWarehouseId === + formik.values.source_warehouse_id + ) { + formik.setFieldError( + 'destination_warehouse_id', + 'Gudang tujuan tidak boleh sama dengan gudang asal!' + ); + } else { + if ( + formik.errors.destination_warehouse_id === + 'Gudang tujuan tidak boleh sama dengan gudang asal!' + ) { + formik.setFieldError( + 'destination_warehouse_id', + undefined + ); + } + } }} options={warehouseOptions} onInputChange={setWarehouseSelectInputValue}