diff --git a/src/components/purchase/ManagePurchase.jsx b/src/components/purchase/ManagePurchase.jsx index fb757b54..591c5984 100644 --- a/src/components/purchase/ManagePurchase.jsx +++ b/src/components/purchase/ManagePurchase.jsx @@ -136,6 +136,8 @@ const ManagePurchase = ({ onClose, purchaseId }) => { }, [purchaseId, generatePatchOps, updatePurchase, CreateInvoice] ); + console.log(formState.errors) + console.log(formState.formData) return (
{/* --- Steps Header --- */} diff --git a/src/components/purchase/PurchasePartyDetails.jsx b/src/components/purchase/PurchasePartyDetails.jsx index 221c33e9..6c275dce 100644 --- a/src/components/purchase/PurchasePartyDetails.jsx +++ b/src/components/purchase/PurchasePartyDetails.jsx @@ -202,7 +202,7 @@ const PurchasePartyDetails = () => { {...register("proformaInvoiceAmount")} /> - {errors?.proformaInvoiceAmountt && ( + {errors?.proformaInvoiceAmount && (
{errors.proformaInvoiceAmount.message}
diff --git a/src/components/purchase/PurchaseSchema.jsx b/src/components/purchase/PurchaseSchema.jsx index adb9258a..0265fb8e 100644 --- a/src/components/purchase/PurchaseSchema.jsx +++ b/src/components/purchase/PurchaseSchema.jsx @@ -24,52 +24,124 @@ export const AttachmentSchema = z.object({ documentId: z.string().nullable().default(null), }); -export const PurchaseSchema = z.object({ - title: z.string().min(1, { message: "Title is required" }), - projectId: z.string().min(1, { message: "Project is required" }), - organizationId: z.string().min(1, { message: "Organization is required" }), - billingAddress: z.string().min(1, { message: "Address is required" }), - shippingAddress: z.string().min(1, { message: "Address is required" }), +export const PurchaseSchema = z + .object({ + title: z.string().min(1, { message: "Title is required" }), + projectId: z.string().min(1, { message: "Project is required" }), + organizationId: z.string().min(1, { message: "Organization is required" }), + billingAddress: z.string().min(1, { message: "Address is required" }), + shippingAddress: z.string().min(1, { message: "Address is required" }), - purchaseOrderNumber: z.string().nullable(), - purchaseOrderDate: z.coerce.date().nullable(), + purchaseOrderNumber: z.string().nullable(), + purchaseOrderDate: z.coerce.date().nullable(), - supplierId: z.string().min(1, { message: "Supplier is required" }), + supplierId: z.string().min(1, { message: "Supplier is required" }), - proformaInvoiceNumber: z.string().nullable(), - proformaInvoiceDate: z.coerce.date().nullable(), - proformaInvoiceAmount: z.coerce.number().optional(), + proformaInvoiceNumber: z.string().nullable(), + proformaInvoiceDate: z.coerce.date().nullable(), + proformaInvoiceAmount: z.coerce.number().optional(), - invoiceNumber: z.string().nullable(), - invoiceDate: z.coerce.date().nullable(), - eWayBillNumber: z.string().nullable(), - eWayBillDate: z.coerce.date().nullable(), - invoiceReferenceNumber: z.string().nullable(), - acknowledgmentDate: z.coerce.date().nullable(), - acknowledgmentNumber: z.string().nullable(), + invoiceNumber: z.string().nullable(), + invoiceDate: z.coerce.date().nullable(), + eWayBillNumber: z.string().nullable(), + eWayBillDate: z.coerce.date().nullable(), + invoiceReferenceNumber: z.string().nullable(), + acknowledgmentDate: z.coerce.date().nullable(), + acknowledgmentNumber: z.string().nullable(), + baseAmount: z + .number() + .or(z.nan()) // allow NaN + .transform((val) => (Number.isNaN(val) ? null : val)), - baseAmount: z - .number() - .or(z.nan()) // allow NaN - .transform((val) => (Number.isNaN(val) ? null : val)), + taxAmount: z + .number() + .or(z.nan()) // allow NaN + .transform((val) => (Number.isNaN(val) ? null : val)), + totalAmount: z + .number() + .or(z.nan()) // allow NaN + .transform((val) => (Number.isNaN(val) ? null : val)), + paymentDueDate: z.coerce.date().nullable(), + transportCharges: z + .number() + .or(z.nan()) // allow NaN + .transform((val) => (Number.isNaN(val) ? null : val)), + description: z.string(), + invoiceAttachmentTypeId: z.string().nullable(), + attachments: z.array(AttachmentSchema), + }) + .superRefine((data, ctx) => { + const hasNumber = !!data.proformaInvoiceNumber; + const hasAmount = + data.proformaInvoiceAmount !== null && data.proformaInvoiceAmount > 0; + const hasDate = !!data.proformaInvoiceDate; - taxAmount: z - .number() - .or(z.nan()) // allow NaN - .transform((val) => (Number.isNaN(val) ? null : val)), - totalAmount: z - .number() - .or(z.nan()) // allow NaN - .transform((val) => (Number.isNaN(val) ? null : val)), - paymentDueDate: z.coerce.date().nullable(), - transportCharges: z - .number() - .or(z.nan()) // allow NaN - .transform((val) => (Number.isNaN(val) ? null : val)), - description: z.string(), - invoiceAttachmentTypeId: z.string().nullable(), - attachments: z.array(AttachmentSchema), -}); + // If any one field is filled → all must be valid + const anyField = hasNumber || hasAmount || hasDate; + + if (anyField) { + // Number required + if (!hasNumber) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Proforma Invoice Number is required.", + path: ["proformaInvoiceNumber"], + }); + } + + // Amount required + if (!hasAmount) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Proforma Amount must be greater than 0.", + path: ["proformaInvoiceAmount"], + }); + } + + // Date required + if (!hasDate) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Proforma Invoice Date is required.", + path: ["proformaInvoiceDate"], + }); + } + return; + } + + if (!anyField) { + if (data.baseAmount === null || data.baseAmount === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Base amount is required.", + path: ["baseAmount"], + }); + } + if (data.taxAmount === null || data.taxAmount === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Tax amount is required.", + path: ["taxAmount"], + }); + } + + if (data.totalAmount === null || data.totalAmount === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Total amount is required.", + path: ["totalAmount"], + }); + } + + if (data.transportCharges === null || data.transportCharges === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "Transport charges are required.", + path: ["transportCharges"], + }); + } + } + }); export const defaultPurchaseValue = { title: "",