refactor(FE): Refactor inventory adjustment form

This commit is contained in:
rstubryan
2026-02-26 10:10:59 +07:00
parent 5a67901722
commit 88b9c890e5
4 changed files with 823 additions and 258 deletions
@@ -1,55 +1,102 @@
import * as Yup from 'yup'; import * as Yup from 'yup';
import { OptionType } from '@/components/input/SelectInput';
export const InventoryAdjustmentFormSchema = Yup.object({ export type InventoryAdjustmentFormSchemaType = {
product_category: Yup.mixed<OptionType>() location: {
.nullable() value: number;
.test( label: string;
'is-valid-option', } | null;
'Kategori Produk wajib diisi!', location_id: number;
(value) => value !== null && value !== undefined project_flock: {
), value: number;
label: string;
} | null;
project_flock_id: number;
kandang: {
value: number;
label: string;
} | null;
kandang_id: number;
project_flock_kandang: {
value: number;
label: string;
} | null;
project_flock_kandang_id: number;
product: {
value: number;
label: string;
} | null;
product_id: number;
transaction_type: string;
transaction_subtype: string;
qty: number | string;
price: number | string;
notes: string;
};
product_category_id: Yup.number().nullable(), export const InventoryAdjustmentFormSchema: Yup.ObjectSchema<InventoryAdjustmentFormSchemaType> =
Yup.object({
product: Yup.mixed<OptionType>() location: Yup.object({
.nullable() value: Yup.number().min(1).required(),
.test( label: Yup.string().required(),
'is-valid-option', }).nullable(),
'Produk wajib diisi!', location_id: Yup.number()
(value) => value !== null && value !== undefined .min(1, 'Lokasi wajib diisi!')
), .required('Lokasi wajib diisi!')
.typeError('Lokasi wajib diisi!'),
product_id: Yup.number() project_flock: Yup.object({
.nullable() value: Yup.number().min(1).required(),
.required('Produk wajib diisi!') label: Yup.string().required(),
.min(1, 'Produk wajib diisi!'), }).nullable(),
project_flock_id: Yup.number()
warehouse: Yup.mixed<OptionType>() .min(1, 'Project flock wajib diisi!')
.nullable() .required('Project flock wajib diisi!')
.test( .typeError('Project flock wajib diisi!'),
'is-valid-option', kandang: Yup.object({
'Warehouse wajib diisi!', value: Yup.number().min(1).required(),
(value) => value !== null && value !== undefined label: Yup.string().required(),
), }).nullable(),
kandang_id: Yup.number()
warehouse_id: Yup.number() .min(1, 'Kandang wajib diisi!')
.nullable() .required('Kandang wajib diisi!')
.required('Warehouse wajib diisi!') .typeError('Kandang wajib diisi!'),
.min(1, 'Warehouse wajib diisi!'), project_flock_kandang: Yup.object({
value: Yup.number().min(1).required(),
transaction_type: Yup.string() label: Yup.string().required(),
.oneOf(['increase', 'decrease'], 'Tipe transaksi tidak valid') }).nullable(),
.nullable() project_flock_kandang_id: Yup.number()
.required('Tipe transaksi wajib diisi'), .default(0)
.typeError('Project Flock Kandang wajib diisi!')
quantity: Yup.number() .test(
.typeError('Kuantitas harus berupa angka') 'is-valid-project-flock-kandang',
.min(1, 'Minimal kuantitas adalah 1') 'Project Flock Kandang wajib diisi!',
.required('Kuantitas wajib diisi'), (value) => value !== undefined && value !== null && value > 0
)
note: Yup.string().required('Catatan wajib diisi!'), .required('Project Flock Kandang wajib diisi!'),
}); product: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
product_id: Yup.number()
.min(1, 'Produk wajib diisi!')
.required('Produk wajib diisi!')
.typeError('Produk wajib diisi!'),
transaction_type: Yup.string()
.oneOf(
['PEMBELIAN', 'PENJUALAN', 'BIAYA', 'RECORDING'],
'Tipe transaksi tidak valid'
)
.required('Tipe transaksi wajib diisi'),
transaction_subtype: Yup.string().required('Sub tipe transaksi wajib diisi'),
qty: Yup.number()
.typeError('Kuantitas harus berupa angka')
.min(1, 'Minimal kuantitas adalah 1')
.required('Kuantitas wajib diisi'),
price: Yup.number()
.typeError('Harga harus berupa angka')
.min(0, 'Minimal harga adalah 0')
.required('Harga wajib diisi'),
notes: Yup.string().required('Catatan wajib diisi!'),
});
export type InventoryAdjustmentFormValues = Yup.InferType< export type InventoryAdjustmentFormValues = Yup.InferType<
typeof InventoryAdjustmentFormSchema typeof InventoryAdjustmentFormSchema
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -549,12 +549,12 @@ export const MARKETING_DATE_FILTER_TYPE_OPTIONS = [
export const TRANSACTION_TYPE_OPTIONS = [ export const TRANSACTION_TYPE_OPTIONS = [
{ label: 'Pembelian', value: 'PEMBELIAN' }, { label: 'Pembelian', value: 'PEMBELIAN' },
{ label: 'Penjualan', value: 'PENJUALAN' }, { label: 'Penjualan', value: 'PENJUALAN' },
{ label: 'Biaya', value: 'BIAYA' }, { label: 'Recording', value: 'RECORDING' },
]; ];
export const TRANSACTION_SUBTYPE_OPTIONS = { export const TRANSACTION_SUBTYPE_OPTIONS = {
PEMBELIAN: [{ label: 'Pembelian', value: 'PURCHASE_IN' }], PEMBELIAN: { label: 'Pembelian', value: 'PURCHASE_IN' },
PENJUALAN: [{ label: 'Penjualan', value: 'MARKETING_OUT' }], PENJUALAN: { label: 'Penjualan', value: 'MARKETING_OUT' },
RECORDING: [ RECORDING: [
{ label: 'Recording Stock Out', value: 'RECORDING_STOCK_OUT' }, { label: 'Recording Stock Out', value: 'RECORDING_STOCK_OUT' },
{ label: 'Recording Depletion Out', value: 'RECORDING_DEPLETION_OUT' }, { label: 'Recording Depletion Out', value: 'RECORDING_DEPLETION_OUT' },
+19 -15
View File
@@ -1,31 +1,35 @@
import { Product } from '@/types/api/master-data/product';
import { Warehouse } from '@/types/api/master-data/warehouse';
import { BaseMetadata } from '@/types/api/api-general'; import { BaseMetadata } from '@/types/api/api-general';
import { Location } from '@/types/api/master-data/location';
import { ProjectFlock } from '@/types/api/project-flock';
export type BaseInventoryAdjustment = { export type BaseInventoryAdjustment = {
id: number; id: number;
adj_number: string;
transaction_type: string;
transaction_subtype: string;
function_code: string;
qty: number;
price: number;
grand_total: number;
increase: number; increase: number;
decrease: number; decrease: number;
note: string; notes: string;
location: Location;
project_flock: ProjectFlock;
product_warehouse_id: number; product_warehouse_id: number;
product_warehouse: { product_warehouse: ProductWarehouse;
id: number; project_flock_kandang_id?: number;
quantity: number;
product_id: number;
warehouse_id: number;
product: Product;
warehouse: Warehouse;
};
}; };
export type InventoryAdjustment = BaseMetadata & BaseInventoryAdjustment; export type InventoryAdjustment = BaseMetadata & BaseInventoryAdjustment;
export type CreateInventoryAdjustmentPayload = { export type CreateInventoryAdjustmentPayload = {
project_flock_kandang_id: number;
product_id: number; product_id: number;
warehouse_id: number; transaction_subtype: string;
transaction_type: string; qty: number;
quantity: number; price: number;
note: string; notes: string;
}; };
export type UpdateInventoryAdjustmentPayload = export type UpdateInventoryAdjustmentPayload =