import { z } from "zod" const relationFieldSchema = z .object({ value: z.string(), label: z.string() }) .nullable() const invoicePartItemSchema = z.object({ part_id: z.number(), title: z.string(), quantity: z.number().min(1), rate: z.number().min(0), description: z.string().optional(), }) const invoiceServiceItemSchema = z.object({ service_id: z.number(), title: z.string(), quantity: z.number().min(1), rate: z.number().min(0), description: z.string().optional(), }) const invoiceExpenseItemSchema = z.object({ expense_id: z.number(), title: z.string(), quantity: z.number().min(1), rate: z.number().min(0), description: z.string().optional(), }) const invoiceFormSchema = z.object({ // ── Required fields ── subject: z.string().min(1, "Subject is required"), // ── Relations ── customer: relationFieldSchema, vehicle: relationFieldSchema, department: relationFieldSchema, estimate: relationFieldSchema, payment_terms: relationFieldSchema, invoice_sequence: relationFieldSchema, payment_mode: relationFieldSchema, insurer: relationFieldSchema, invoice_to: relationFieldSchema, // ── Optional fields ── invoice_number: z.string().optional(), invoice_title: z.string().optional(), invoice_date: z.string().optional(), due_date: z.string().optional(), status: z.string().optional(), kms_in: z.coerce.number().optional(), has_insurance: z.boolean().default(false), discount: z.string().optional(), deposit_to: z.string().optional(), notes: z.string().optional(), terms_and_conditions: z.string().optional(), // ── Line items ── parts: z.array(invoicePartItemSchema).optional(), services: z.array(invoiceServiceItemSchema).optional(), expense_items: z.array(invoiceExpenseItemSchema).optional(), }) type InvoiceFormValues = z.infer type InvoicePartItem = z.infer type InvoiceServiceItem = z.infer type InvoiceExpenseItem = z.infer export { invoiceFormSchema, relationFieldSchema, invoicePartItemSchema, invoiceServiceItemSchema, invoiceExpenseItemSchema } export type { InvoiceFormValues, InvoicePartItem, InvoiceServiceItem, InvoiceExpenseItem }