handle proforma to base , Tax, amount condition

This commit is contained in:
pramod.mahajan 2025-12-03 13:55:39 +05:30
parent 8dfc8e4336
commit 258bd82b54
3 changed files with 115 additions and 41 deletions

View File

@ -136,6 +136,8 @@ const ManagePurchase = ({ onClose, purchaseId }) => {
}, },
[purchaseId, generatePatchOps, updatePurchase, CreateInvoice] [purchaseId, generatePatchOps, updatePurchase, CreateInvoice]
); );
console.log(formState.errors)
console.log(formState.formData)
return ( return (
<div className="bs-stepper horizontically mt-2 b-secondry shadow-none border-0"> <div className="bs-stepper horizontically mt-2 b-secondry shadow-none border-0">
{/* --- Steps Header --- */} {/* --- Steps Header --- */}

View File

@ -202,7 +202,7 @@ const PurchasePartyDetails = () => {
{...register("proformaInvoiceAmount")} {...register("proformaInvoiceAmount")}
/> />
{errors?.proformaInvoiceAmountt && ( {errors?.proformaInvoiceAmount && (
<div className="danger-text"> <div className="danger-text">
{errors.proformaInvoiceAmount.message} {errors.proformaInvoiceAmount.message}
</div> </div>

View File

@ -24,52 +24,124 @@ export const AttachmentSchema = z.object({
documentId: z.string().nullable().default(null), documentId: z.string().nullable().default(null),
}); });
export const PurchaseSchema = z.object({ export const PurchaseSchema = z
title: z.string().min(1, { message: "Title is required" }), .object({
projectId: z.string().min(1, { message: "Project is required" }), title: z.string().min(1, { message: "Title is required" }),
organizationId: z.string().min(1, { message: "Organization is required" }), projectId: z.string().min(1, { message: "Project is required" }),
billingAddress: z.string().min(1, { message: "Address is required" }), organizationId: z.string().min(1, { message: "Organization is required" }),
shippingAddress: z.string().min(1, { message: "Address is required" }), billingAddress: z.string().min(1, { message: "Address is required" }),
shippingAddress: z.string().min(1, { message: "Address is required" }),
purchaseOrderNumber: z.string().nullable(), purchaseOrderNumber: z.string().nullable(),
purchaseOrderDate: z.coerce.date().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(), proformaInvoiceNumber: z.string().nullable(),
proformaInvoiceDate: z.coerce.date().nullable(), proformaInvoiceDate: z.coerce.date().nullable(),
proformaInvoiceAmount: z.coerce.number().optional(), proformaInvoiceAmount: z.coerce.number().optional(),
invoiceNumber: z.string().nullable(), invoiceNumber: z.string().nullable(),
invoiceDate: z.coerce.date().nullable(), invoiceDate: z.coerce.date().nullable(),
eWayBillNumber: z.string().nullable(), eWayBillNumber: z.string().nullable(),
eWayBillDate: z.coerce.date().nullable(), eWayBillDate: z.coerce.date().nullable(),
invoiceReferenceNumber: z.string().nullable(), invoiceReferenceNumber: z.string().nullable(),
acknowledgmentDate: z.coerce.date().nullable(), acknowledgmentDate: z.coerce.date().nullable(),
acknowledgmentNumber: z.string().nullable(), acknowledgmentNumber: z.string().nullable(),
baseAmount: z
.number()
.or(z.nan()) // allow NaN
.transform((val) => (Number.isNaN(val) ? null : val)),
baseAmount: z taxAmount: z
.number() .number()
.or(z.nan()) // allow NaN .or(z.nan()) // allow NaN
.transform((val) => (Number.isNaN(val) ? null : val)), .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 // If any one field is filled all must be valid
.number() const anyField = hasNumber || hasAmount || hasDate;
.or(z.nan()) // allow NaN
.transform((val) => (Number.isNaN(val) ? null : val)), if (anyField) {
totalAmount: z // Number required
.number() if (!hasNumber) {
.or(z.nan()) // allow NaN ctx.addIssue({
.transform((val) => (Number.isNaN(val) ? null : val)), code: z.ZodIssueCode.custom,
paymentDueDate: z.coerce.date().nullable(), message: "Proforma Invoice Number is required.",
transportCharges: z path: ["proformaInvoiceNumber"],
.number() });
.or(z.nan()) // allow NaN }
.transform((val) => (Number.isNaN(val) ? null : val)),
description: z.string(), // Amount required
invoiceAttachmentTypeId: z.string().nullable(), if (!hasAmount) {
attachments: z.array(AttachmentSchema), 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 = { export const defaultPurchaseValue = {
title: "", title: "",