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 { OptionType } from '@/components/input/SelectInput';
export const InventoryAdjustmentFormSchema = Yup.object({
product_category: Yup.mixed<OptionType>()
.nullable()
.test(
'is-valid-option',
'Kategori Produk wajib diisi!',
(value) => value !== null && value !== undefined
),
export type InventoryAdjustmentFormSchemaType = {
location: {
value: number;
label: string;
} | null;
location_id: number;
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(),
product: Yup.mixed<OptionType>()
.nullable()
.test(
'is-valid-option',
'Produk wajib diisi!',
(value) => value !== null && value !== undefined
),
product_id: Yup.number()
.nullable()
.required('Produk wajib diisi!')
.min(1, 'Produk wajib diisi!'),
warehouse: Yup.mixed<OptionType>()
.nullable()
.test(
'is-valid-option',
'Warehouse wajib diisi!',
(value) => value !== null && value !== undefined
),
warehouse_id: Yup.number()
.nullable()
.required('Warehouse wajib diisi!')
.min(1, 'Warehouse wajib diisi!'),
transaction_type: Yup.string()
.oneOf(['increase', 'decrease'], 'Tipe transaksi tidak valid')
.nullable()
.required('Tipe transaksi wajib diisi'),
quantity: Yup.number()
.typeError('Kuantitas harus berupa angka')
.min(1, 'Minimal kuantitas adalah 1')
.required('Kuantitas wajib diisi'),
note: Yup.string().required('Catatan wajib diisi!'),
});
export const InventoryAdjustmentFormSchema: Yup.ObjectSchema<InventoryAdjustmentFormSchemaType> =
Yup.object({
location: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
location_id: Yup.number()
.min(1, 'Lokasi wajib diisi!')
.required('Lokasi wajib diisi!')
.typeError('Lokasi wajib diisi!'),
project_flock: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
project_flock_id: Yup.number()
.min(1, 'Project flock wajib diisi!')
.required('Project flock wajib diisi!')
.typeError('Project flock wajib diisi!'),
kandang: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
kandang_id: Yup.number()
.min(1, 'Kandang wajib diisi!')
.required('Kandang wajib diisi!')
.typeError('Kandang wajib diisi!'),
project_flock_kandang: Yup.object({
value: Yup.number().min(1).required(),
label: Yup.string().required(),
}).nullable(),
project_flock_kandang_id: Yup.number()
.default(0)
.typeError('Project Flock Kandang wajib diisi!')
.test(
'is-valid-project-flock-kandang',
'Project Flock Kandang wajib diisi!',
(value) => value !== undefined && value !== null && value > 0
)
.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<
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 = [
{ label: 'Pembelian', value: 'PEMBELIAN' },
{ label: 'Penjualan', value: 'PENJUALAN' },
{ label: 'Biaya', value: 'BIAYA' },
{ label: 'Recording', value: 'RECORDING' },
];
export const TRANSACTION_SUBTYPE_OPTIONS = {
PEMBELIAN: [{ label: 'Pembelian', value: 'PURCHASE_IN' }],
PENJUALAN: [{ label: 'Penjualan', value: 'MARKETING_OUT' }],
PEMBELIAN: { label: 'Pembelian', value: 'PURCHASE_IN' },
PENJUALAN: { label: 'Penjualan', value: 'MARKETING_OUT' },
RECORDING: [
{ label: 'Recording Stock Out', value: 'RECORDING_STOCK_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 { Location } from '@/types/api/master-data/location';
import { ProjectFlock } from '@/types/api/project-flock';
export type BaseInventoryAdjustment = {
id: number;
adj_number: string;
transaction_type: string;
transaction_subtype: string;
function_code: string;
qty: number;
price: number;
grand_total: number;
increase: number;
decrease: number;
note: string;
notes: string;
location: Location;
project_flock: ProjectFlock;
product_warehouse_id: number;
product_warehouse: {
id: number;
quantity: number;
product_id: number;
warehouse_id: number;
product: Product;
warehouse: Warehouse;
};
product_warehouse: ProductWarehouse;
project_flock_kandang_id?: number;
};
export type InventoryAdjustment = BaseMetadata & BaseInventoryAdjustment;
export type CreateInventoryAdjustmentPayload = {
project_flock_kandang_id: number;
product_id: number;
warehouse_id: number;
transaction_type: string;
quantity: number;
note: string;
transaction_subtype: string;
qty: number;
price: number;
notes: string;
};
export type UpdateInventoryAdjustmentPayload =