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: "",