2026-04-23 14:38:41 +03:00

69 lines
2.2 KiB
TypeScript

import { z } from "zod"
const relationFieldSchema = z
.object({ value: z.string(), label: z.string() })
.nullable()
const billPartItemSchema = z.object({
part_id: z.number(),
title: z.string(),
quantity: z.number().min(1),
rate: z.number().min(0),
discount_amount: z.number().min(0).optional(),
description: z.string().optional(),
})
const billServiceItemSchema = z.object({
service_id: z.number(),
title: z.string(),
quantity: z.number().min(1),
rate: z.number().min(0),
discount_amount: z.number().min(0).optional(),
description: z.string().optional(),
})
const billExpenseItemSchema = z.object({
expense_id: z.number(),
title: z.string(),
quantity: z.number().min(1),
rate: z.number().min(0),
discount_amount: z.number().min(0).optional(),
description: z.string().optional(),
})
const billFormSchema = z.object({
// ── Required ──
title: z.string().min(1, "Title is required"),
// ── Relations ──
vendor: relationFieldSchema,
vendor_address: relationFieldSchema,
purchase_order: relationFieldSchema,
job_card: relationFieldSchema,
payment_term: relationFieldSchema,
department: relationFieldSchema,
tax: relationFieldSchema,
// ── Optional fields ──
bill_number: z.string().optional(),
bill_date: z.string().optional(),
bill_due_date: z.string().optional(),
status: z.string().optional(),
discount: z.string().optional(),
discount_amount: z.coerce.number().min(0).optional(),
notes: z.string().optional(),
// ── Line items ──
part_items: z.array(billPartItemSchema).optional(),
service_items: z.array(billServiceItemSchema).optional(),
expense_items: z.array(billExpenseItemSchema).optional(),
})
type BillFormValues = z.infer<typeof billFormSchema>
type BillPartItem = z.infer<typeof billPartItemSchema>
type BillServiceItem = z.infer<typeof billServiceItemSchema>
type BillExpenseItem = z.infer<typeof billExpenseItemSchema>
export { billFormSchema, relationFieldSchema, billPartItemSchema, billServiceItemSchema, billExpenseItemSchema }
export type { BillFormValues, BillPartItem, BillServiceItem, BillExpenseItem }