mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-17 21:30:31 +00:00
111 lines
2.7 KiB
TypeScript
111 lines
2.7 KiB
TypeScript
import { DATATYPES_LENGTH } from '@/constants/data-types';
|
|
import z from 'zod';
|
|
|
|
export const createItemSchema = z
|
|
.object({
|
|
name: z.string().max(DATATYPES_LENGTH.STRING),
|
|
type: z.enum(['service', 'non-inventory', 'inventory']),
|
|
code: z.string().max(DATATYPES_LENGTH.STRING).nullable().optional(),
|
|
purchasable: z.boolean().optional(),
|
|
cost_price: z
|
|
.number()
|
|
.min(0)
|
|
.max(DATATYPES_LENGTH.DECIMAL_13_3)
|
|
.nullable()
|
|
.optional(),
|
|
cost_account_id: z
|
|
.number()
|
|
.int()
|
|
.min(0)
|
|
.max(DATATYPES_LENGTH.INT_10)
|
|
.nullable()
|
|
.optional(),
|
|
sellable: z.boolean().optional(),
|
|
sell_price: z
|
|
.number()
|
|
.min(0)
|
|
.max(DATATYPES_LENGTH.DECIMAL_13_3)
|
|
.nullable()
|
|
.optional(),
|
|
sell_account_id: z
|
|
.number()
|
|
.int()
|
|
.min(0)
|
|
.max(DATATYPES_LENGTH.INT_10)
|
|
.nullable()
|
|
.optional(),
|
|
inventory_account_id: z
|
|
.number()
|
|
.int()
|
|
.min(0)
|
|
.max(DATATYPES_LENGTH.INT_10)
|
|
.nullable()
|
|
.optional(),
|
|
sell_description: z
|
|
.string()
|
|
.max(DATATYPES_LENGTH.TEXT)
|
|
.nullable()
|
|
.optional(),
|
|
purchase_description: z
|
|
.string()
|
|
.max(DATATYPES_LENGTH.TEXT)
|
|
.nullable()
|
|
.optional(),
|
|
sell_tax_rate_id: z.number().int().nullable().optional(),
|
|
purchase_tax_rate_id: z.number().int().nullable().optional(),
|
|
category_id: z
|
|
.number()
|
|
.int()
|
|
.min(0)
|
|
.max(DATATYPES_LENGTH.INT_10)
|
|
.nullable()
|
|
.optional(),
|
|
note: z.string().max(DATATYPES_LENGTH.TEXT).optional(),
|
|
active: z.boolean().optional(),
|
|
media_ids: z.array(z.number().int()).optional(),
|
|
})
|
|
.refine(
|
|
(data) => {
|
|
if (data.purchasable) {
|
|
return (
|
|
data.cost_price !== undefined && data.cost_account_id !== undefined
|
|
);
|
|
}
|
|
return true;
|
|
},
|
|
{
|
|
message:
|
|
'Cost price and cost account ID are required when item is purchasable',
|
|
path: ['cost_price', 'cost_account_id'],
|
|
},
|
|
)
|
|
.refine(
|
|
(data) => {
|
|
if (data.sellable) {
|
|
return (
|
|
data.sell_price !== undefined && data.sell_account_id !== undefined
|
|
);
|
|
}
|
|
return true;
|
|
},
|
|
{
|
|
message:
|
|
'Sell price and sell account ID are required when item is sellable',
|
|
path: ['sell_price', 'sell_account_id'],
|
|
},
|
|
)
|
|
.refine(
|
|
(data) => {
|
|
if (data.type === 'inventory') {
|
|
return data.inventory_account_id !== undefined;
|
|
}
|
|
return true;
|
|
},
|
|
{
|
|
message: 'Inventory account ID is required for inventory items',
|
|
path: ['inventory_account_id'],
|
|
},
|
|
);
|
|
|
|
|
|
export type createItemDTO = z.infer<typeof createItemSchema>; |