From fcb0df018c7c03146d04b093f0aadeee1c93da8d Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:16:52 +0530 Subject: [PATCH 01/12] in this component i have change total amt --- .../BSBillingTables/BSBillingTable7/BSBilling7Payment.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable7/BSBilling7Payment.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable7/BSBilling7Payment.jsx index 83380f9..f8400af 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable7/BSBilling7Payment.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable7/BSBilling7Payment.jsx @@ -570,7 +570,8 @@ const BSBilling7Payment = () => { useEffect(() => { if (!preOrder) { const totalSum = OrderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -2086,7 +2087,8 @@ const BSBilling7Payment = () => { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From 56634645371abc636f681ad1b8d0f6d37daa4ab6 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:17:57 +0530 Subject: [PATCH 02/12] in this component i have change total amt --- .../BSBillingTables/BSBillingTable6/BST6Payment.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable6/BST6Payment.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable6/BST6Payment.jsx index 7d29254..9a02c94 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable6/BST6Payment.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable6/BST6Payment.jsx @@ -551,7 +551,8 @@ const BST6Payment = () => { useEffect(() => { if (!preOrder) { const totalSum = OrderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -2118,7 +2119,8 @@ const BST6Payment = () => { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From 1eaebabb04cdd242d75db049a88667d54209ac73 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:18:17 +0530 Subject: [PATCH 03/12] in this component i have change total amt --- .../BSBillingTables/BSBillingTable5/BSBillingTable5.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable5/BSBillingTable5.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable5/BSBillingTable5.jsx index a126a4f..c4ee9cb 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable5/BSBillingTable5.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable5/BSBillingTable5.jsx @@ -579,7 +579,8 @@ const BSBillingTable5 = () => { useEffect(() => { if (!preOrder) { const totalSum = OrderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -2077,7 +2078,8 @@ const BSBillingTable5 = () => { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From d8b9b15b57eb2119b6eef2458587373ef07c6bac Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:18:39 +0530 Subject: [PATCH 04/12] in this component i have change total amt --- .../BSBillingTables/BSBillingTable4/BSBilling4Payment.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable4/BSBilling4Payment.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable4/BSBilling4Payment.jsx index cf0e76f..9cee205 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable4/BSBilling4Payment.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable4/BSBilling4Payment.jsx @@ -591,7 +591,8 @@ const BSBilling4Payment = () => { useEffect(() => { if (!preOrder) { const totalSum = OrderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -2062,7 +2063,8 @@ const BSBilling4Payment = () => { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From 4db2916809b16e837b164d2cb5218147e88ad986 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:19:00 +0530 Subject: [PATCH 05/12] in this component i have change total amt --- .../BSBillingTables/BSBillingTable3/BSBillingTable3pay.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable3/BSBillingTable3pay.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable3/BSBillingTable3pay.jsx index 75d52dc..116745e 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable3/BSBillingTable3pay.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable3/BSBillingTable3pay.jsx @@ -534,7 +534,8 @@ const BSBillingTable3Pay = () => { useEffect(() => { if (!preOrder) { const totalSum = OrderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), //sree + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -2180,7 +2181,8 @@ const BSBillingTable3Pay = () => { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, //sri + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From 9dd65d23be0d6cd0cdeb5b11a92a3afbdc7ffa36 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:19:29 +0530 Subject: [PATCH 06/12] in this component i have change total amt --- .../BSBillingTables/BSBillingTable2/BSBillingTable2.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable2/BSBillingTable2.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable2/BSBillingTable2.jsx index 6ab8ec1..f6d92d8 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable2/BSBillingTable2.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable2/BSBillingTable2.jsx @@ -539,7 +539,8 @@ const BSBillingTable2 = () => { useEffect(() => { if (!preOrder) { const totalSum = OrderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -2034,7 +2035,8 @@ const BSBillingTable2 = () => { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From f5f2655b3b022bf5bfde67fe38fdea4e25a4a12f Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:19:48 +0530 Subject: [PATCH 07/12] in this component i have change total amt --- .../BSBillingTables/BSBillingTable1/BST1Payment.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable1/BST1Payment.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable1/BST1Payment.jsx index 21270cd..d7fba48 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable1/BST1Payment.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingTable1/BST1Payment.jsx @@ -505,7 +505,8 @@ export default function BST1Payment() { useEffect(() => { if (!preOrder) { const totalSum = OrderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -1994,7 +1995,8 @@ export default function BST1Payment() { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From 006c6dd1e16c0b3a56cf9158fb81bc652be6cba1 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:20:06 +0530 Subject: [PATCH 08/12] in this component i have change total amt --- .../BSBillingTables/StandardTable/StandardTablePayment.jsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/StandardTable/StandardTablePayment.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/StandardTable/StandardTablePayment.jsx index 8af94a4..3878da4 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/StandardTable/StandardTablePayment.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/StandardTable/StandardTablePayment.jsx @@ -841,7 +841,8 @@ const StandardTablePayment = () => { if (!preOrder) { const totalSum = orderCardDetail?.reduce( - (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + // (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), + (acc, card) => acc + parseFloat(card.TotalAmt || 0), 0 ); @@ -1417,7 +1418,8 @@ const StandardTablePayment = () => { Type: a.Type, OrderQty: a.OrderQty, OrderRate: a.OrderRate, - TotalAmt: a.OrderQty * a.OrderRate, + // TotalAmt: a.OrderQty * a.OrderRate, + TotalAmt: a.TotalAmt, TaxAmt: a.TaxAmt, RefundQty: 0, InwardDtlId: a.InwardDtlId, From da669b3f44079bd786d898f9b17e675b77bcbc01 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:20:22 +0530 Subject: [PATCH 09/12] in this component i have change total amt --- .../BSBillingEditQuantity.jsx | 346 +++--------------- 1 file changed, 57 insertions(+), 289 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx index ddefcd5..073cbf6 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx @@ -40,6 +40,7 @@ import { } from '../../../../../Features/Offer/Offernew/BookingOffernew.js'; import { validateOffers } from '../../BSItemCards/ValidateOffer.jsx'; import { v4 as uuidv4 } from 'uuid'; +import WeightCalculatePrice from './WeightCalculatePrice.jsx'; const BSBillingEditQuantity = (props) => { const dispatch = useDispatch(); @@ -678,12 +679,12 @@ const BSBillingEditQuantity = (props) => { const handleEditQuantity = async ( editedProduct, editedProductIndex, - newPrice + newPrice, + overrideQty = null ) => { - // check itself is a offer product - - const editedQty = - props?.Productdata?.ScaleType !== 'weight' + const editedQty = overrideQty !== null + ? overrideQty + : props?.Productdata?.ScaleType !== 'weight' ? parseInt(Quantity) : props.Productdata.OrderQty; const addFirst = BillOrderPre === 'Y'; @@ -3096,9 +3097,10 @@ const BSBillingEditQuantity = (props) => { newPrice = 0, offerApply = false ) => { + const fixedQty = Number(qty.toFixed(3)); const updatedProduct = { ...editedProduct, - OrderQty: qty, + OrderQty: fixedQty, OrderRate: newPrice > 0 ? newPrice : editedProduct?.OrderRate, ...calculateTaxAmounts({ qty: qty, @@ -3236,289 +3238,6 @@ const BSBillingEditQuantity = (props) => { OfferValue: offerValue, }; }; - - // const AddProductQuantity = async () => { - // let NewPrice = NewPrice1 > 0 ? NewPrice1 : props.Productdata.OrderRate; - // await dispatch(changeHoldOrderDtl(false)); - // await dispatch(changePreviousOrderLength(CartOrderDetails?.length)); - // const OtherOrderDatas = CartOrderDetails?.filter( - // (cartItem) => - // !( - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem.InwardDtlId === props?.Productdata?.InwardDtlId && - // cartItem?.OrderRate === props?.Productdata?.OrderRate && - // cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName - // ) && !cartItem?.SalesId - // ); - - // const OtherOrderDatawithsales = CartOrderDetails?.filter( - // (cartItem) => cartItem?.SalesId - // ); - // const OtherorderDataforNormal = CartOrderDetails?.filter( - // (cartItem) => - // !( - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId && - // cartItem?.OrderRate === props?.Productdata?.OrderRate && - // cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName && - // !cartItem?.SalesId - // ) - // ); - - // const isItemInCart = CartOrderDetails?.find( - // (cartItem) => - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId && - // cartItem?.OrderRate === props?.Productdata?.OrderRate && - // cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName && - // !cartItem?.SalesId - // ); // check if the item is already in the cart - // // changing for one piece stock checking - // const isItemInCartfilter = CartOrderDetails?.filter( - // (cartItem) => - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId && - // !( - // cartItem?.OrderRate === props?.Productdata?.OrderRate && - // cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName - // ) && - // !cartItem?.SalesId - // ); // check if the item is already in the cart - // let OverallQuantity = CalculateOverallQty(isItemInCart, isItemInCartfilter); - // const BookingTypeProd = props?.Productdata?.BookingTypeName; - // const isItemInCartHold = CartOrderDetails?.find( - // (cartItem) => - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId && - // cartItem?.OrderRate === props?.Productdata?.OrderRate && - // cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName - // ); // check if the item is already in the cart - // const isItemInCartHoldfilter = CartOrderDetails?.filter( - // (cartItem) => - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId && - // !( - // cartItem?.OrderRate === props?.Productdata?.OrderRate && - // cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName - // ) - // ); // check if the item is already in the cart - // const holddataproduct = ReorderProductData?.filter( - // (cartItem) => - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId - // ); - // let totalSelectedProductQty = holddataproduct?.reduce( - // (accumulator, card) => { - // return ( - // accumulator + - // parseInt( - // card?.StockAvailable === 'Y' - // ? props?.Productdata?.SinglePc === 'Y' - // ? card.SinglePc !== 'Y' - // ? card.OrderQty * card.NoOfPcs - // : card.OrderQty - // : card.SinglePc !== 'Y' - // ? card.OrderQty - // : card.OverAllPcs % card.NoOfPcs >= card.OrderQty - // ? 0 - // : card.OrderQty % card.NoOfPcs === 0 - // ? Math.floor(card.OrderQty / card.NoOfPcs) - // : Math.floor(card.OrderQty / card.NoOfPcs) + 1 - // : 0 - // ) - // ); - // }, - // 0 - // ); - - // let OverallQuantityhold = - // CalculateOverallQty(isItemInCartHold, isItemInCartHoldfilter) + - // totalSelectedProductQty; - // const OtherorderDataforNormalWithoutSalesId = CartOrderDetails?.filter( - // (cartItem) => - // !( - // cartItem?.ProdId === props?.Productdata?.ProdId && - // cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId && - // cartItem?.OrderRate === props?.Productdata?.OrderRate && - // cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName - // ) - // ); - - // if (parseInt(Quantity) === 0 || Quantity === '') { - // setMessageType('error'); - // setMessageData('Please enter valid quantity'); - // setQuantity(''); - // } - // else { - // if (isItemInCart && BookingTypeProd != 'Dine In' && OrderType != 'Hold') { - // if (isItemInCart?.StockAvailable === 'Y') { - // let Condition = OverallQuantity >= Quantity; - // if (Condition) { - // const UpdatedCartItem = await createUpdatedCartItem( - // isItemInCart, - // Quantity, - // NewPrice - // ); - // const Cartdata = MergecardItem( - // UpdatedCartItem, - // BillOrderPre, - // OtherorderDataforNormal - // ); - // await dispatch(changeOrderCardDetails(Cartdata)); - // if (OfferCheckedInSetup && preferenceOffer) { - // await applyOffer(Cartdata); - // } else { - // dispatch(changeOrderCardDetails(Cartdata)); - // } - - // props.handleEditQuantityCancel(); - // setClearQuantity(false); - // } else { - // setMessageType('error'); - // setMessageData('Stock Not Available'); - // setQuantity(''); - // } - // } else { - // if ( - // isItemInCart && - // BookingTypeProd != 'Dine In' && - // OrderType != 'Hold' - // ) { - // const UpdatedCartItem = createUpdatedCartItem( - // isItemInCart, - // Quantity, - // NewPrice - // ); - // const Cartdata = MergecardItem( - // UpdatedCartItem, - // BillOrderPre, - // OtherorderDataforNormal - // ); - // await dispatch(changeOrderCardDetails(Cartdata)); - // if (OfferCheckedInSetup && preferenceOffer) { - // await applyOffer(Cartdata); - // } else { - // dispatch(changeOrderCardDetails(Cartdata)); - // } - // } - // props.handleEditQuantityCancel(); - // setClearQuantity(false); - // } - // } - // else if (isItemInCartHold && OrderType === 'Hold') { - // if (isItemInCartHold?.StockAvailable === 'Y') { - // let Condition = OverallQuantityhold >= Quantity; - // if (Condition) { - // const UpdatedCartItem = createUpdatedCartItem( - // isItemInCartHold, - // Quantity, - // NewPrice - // ); - // const Cartdata = MergecardItem( - // UpdatedCartItem, - // BillOrderPre, - // OtherorderDataforNormalWithoutSalesId - // ); - // if (OfferCheckedInSetup && preferenceOffer) { - // await applyOffer(Cartdata); - // } else { - // dispatch(changeOrderCardDetails(Cartdata)); - // } - // await dispatch(changeOrderCardDetails(Cartdata)); - - // props.handleEditQuantityCancel(); - // setClearQuantity(false); - // } else { - // setMessageType('error'); - // setMessageData('Stock Not Available'); - // setQuantity(''); - // } - // } else { - // if (isItemInCartHold && OrderType === 'Hold') { - // const UpdatedCartItem = createUpdatedCartItem( - // isItemInCartHold, - // Quantity, - // NewPrice - // ); - // const Cartdata = MergecardItem( - // UpdatedCartItem, - // BillOrderPre, - // OtherorderDataforNormalWithoutSalesId - // ); - // await dispatch(changeOrderCardDetails(Cartdata)); - // if (OfferCheckedInSetup && preferenceOffer) { - // await applyOffer(Cartdata); - // } else { - // dispatch(changeOrderCardDetails(Cartdata)); - // } - // } - // props.handleEditQuantityCancel(); - // setClearQuantity(false); - // } - // } - // else if ( - // isItemInCart && - // BookingTypeProd === 'Dine In' && - // OrderType != 'Hold' - // ) { - // if (isItemInCart?.StockAvailable === 'Y') { - // let Condition = OverallQuantity >= Quantity; - // if (Condition) { - // const UpdatedCartItem = createUpdatedCartItem( - // isItemInCart, - // Quantity, - // NewPrice - // ); - // const Cartdata = MergecardItem( - // UpdatedCartItem, - // BillOrderPre, - // OtherOrderDatas - // ); - // await dispatch( - // changeOrderCardDetails([...OtherOrderDatawithsales, ...Cartdata]) - // ); - // if (OfferCheckedInSetup && preferenceOffer) { - // await applyOffer(Cartdata); - // } else { - // dispatch(changeOrderCardDetails(Cartdata)); - // } - // props.handleEditQuantityCancel(); - // setClearQuantity(false); - // } else { - // setMessageType('error'); - // setMessageData('Stock Not Available'); - // setQuantity(''); - // } - // } - // else { - // if ( - // isItemInCart && - // BookingTypeProd === 'Dine In' && - // OrderType != 'Hold' - // ) { - // const UpdatedCartItem = createUpdatedCartItem( - // isItemInCart, - // Quantity, - // NewPrice - // ); - // const Cartdata = MergecardItem( - // UpdatedCartItem, - // BillOrderPre, - // OtherorderDataforNormal - // ); - // await dispatch(changeOrderCardDetails(Cartdata)); - // if (OfferCheckedInSetup && preferenceOffer) { - // await applyOffer(Cartdata); - // } else { - // dispatch(changeOrderCardDetails(Cartdata)); - // } - // } - // props.handleEditQuantityCancel(); - // setClearQuantity(false); - // } - // } - // } - // }; const CloseModal = () => { props.handleEditQuantityCancel(); setClearQuantity(false); @@ -3706,6 +3425,33 @@ const BSBillingEditQuantity = (props) => { setPackageDtl(data || []); }; + const handleWeightCalculation = async (data) => { + const { price, quantity } = data; + setQuantity(quantity); + setEditedPrice(price); + await handleWeightSubmit(quantity, price); + }; + + const handleWeightSubmit = async (qty, price) => { + await dispatch(changeHoldOrderDtl(false)); + await dispatch(changePreviousOrderLength(CartOrderDetails?.length)); + let localId = props.Index; + let editedProductIndex = CartOrderDetails?.findIndex( + (e) => e?.localId == localId + ); + const editedProduct = { + ...CartOrderDetails[editedProductIndex], + OrderQty: qty + }; + + await handleEditQuantity(editedProduct, editedProductIndex, editedProduct.OrderRate, qty); + props.handleEditQuantityCancel(); + setClearQuantity(false); + }; + const isKg = + props?.Productdata?.Size == 1 && + ["KG", "KGS"].includes(props?.Productdata?.UomName?.toUpperCase()); + return (
{ > Packing + + {isKg && ()} +
{RadioBtnSelection == 'Quantity' && ( @@ -4007,6 +3766,15 @@ const BSBillingEditQuantity = (props) => { /> )} + {RadioBtnSelection == 'AddWeight' && ( + <> + + + )}
{((RadioBtnSelection == 'Price' && disableSubmitButton) || RadioBtnSelection == 'Quantity') && ( From 971affbf924d167f348881bf3337b14ffec6bf35 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:21:53 +0530 Subject: [PATCH 10/12] create new component amt and qnt calculation --- .../WeightCalculatePrice.jsx | 3801 +++++++++++++++++ 1 file changed, 3801 insertions(+) create mode 100644 src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx new file mode 100644 index 0000000..f4b35e8 --- /dev/null +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx @@ -0,0 +1,3801 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import { shallowEqual, useDispatch, useSelector } from 'react-redux'; +import { DefaultModal } from '../../../../../Components/Modal/DefaultModal'; +import FormHeader from '../../../../PageComponents/FormHeader.jsx'; +import { Form } from 'antd'; +import { + GlobalOrderCardDetails, + changeOrderCardDetails, + changeHoldOrderDtl, + changePreviousOrderLength, + GlobalOrderType, + GlobalReorderProductDetails, + PreferenceData, + getConfigType, +} from '../../../../../Features/BookingScreen/BookingData/BookingData'; +import { ArrowRightOutlined } from '@ant-design/icons'; +import { Messages } from '../../../../../Components/Notifications/Messages'; +import '../../../../../Styles/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.scss'; +import { settingDataSelector } from '../../../../../Features/PreferenceMaster/PreferenceMaster.js'; +import { RadioGrpButton } from '../../../../../Components/Forms/RadioGroup.jsx'; +import Buttons from '../../../../../Components/Forms/Buttons.jsx'; +import { InputField } from '../../../../../Components/Forms/InputField.jsx'; +import { useApplyOfferto_CardDetail } from '../../UtillComponents/BSNavBarOffer/BSNavBarOffer_CustomHooks.jsx'; +import { + getTemplateData, + StoredSessionData, +} from '../../../../../Features/ThemeChange/ThemeChange.js'; +import { validateSafeInput } from '../../../../../Services/Others.js'; +import { GlobalEmpAccessDetail } from '../../../../../Features/AppPage/CenterPage.js'; +import Packing from './BSPacking.jsx'; +// import { ApplicationPreferences } from '../../../../../Features/BrachLogin/BranchLogin.js'; +import { + ChangeFullFreeProductList, + changeFullOfferAppliedProducts, + ChangeOfferAppliedProducts, + changeOfferAppliedProductsForLoyalty, + GlobalFreeProdList, + GlobalOfferAppliedProducts, + RemoveOfferAppliedProduct, +} from '../../../../../Features/Offer/Offernew/BookingOffernew.js'; +import { validateOffers } from '../../BSItemCards/ValidateOffer.jsx'; +import { v4 as uuidv4 } from 'uuid'; +import WeightCalculatePrice from './WeightCalculatePrice.jsx'; + +const BSBillingEditQuantity = (props) => { + console.log(props?.Productdata.UomName, 'hfghfvbufvbfdviv', props?.Productdata.Size); + + const dispatch = useDispatch(); + const formRef = useRef(null); + const quantityInputRef = useRef(null); + const priceChangeInputRef = useRef(null); + const reductionInputRef = useRef(null); + + const { setIndex = () => { } } = props; + + + const [disableSubmitButton, setDisableSubmitButton] = useState(false); + const SessionData = useSelector(StoredSessionData); + // const AppId = SessionData?.AppId; + // const CompId = SessionData?.CompId; + // const BranchId = SessionData?.BranchId; + const UserType = SessionData?.UserType; + const applyOffer = useApplyOfferto_CardDetail(); + const preferenceDatas = useSelector(PreferenceData); + const EmpAccessDetail = useSelector(GlobalEmpAccessDetail); + const OverAllproductBasedOfferDatas = useSelector( + (state) => state?.BookingOFferNew?.OverAllProductBasedProducts, + shallowEqual + ); + const preferenceOffer = + preferenceDatas?.[0]?.['SettingDtlDetails']?.find( + (item) => item.SettingIdName === 'Offer' + )?.SettingValue === 'Y'; + const preferenceshortcutkey = preferenceDatas?.[0]?.[ + 'SettingDtlDetails' + ]?.some( + (item) => + item.SettingIdName.toLowerCase() === 'shortcutkeys' && + item.SettingValue === 'Y' + ); + console.log(preferenceshortcutkey, 'preferenceshortcutkey'); + const [PriceChangeaccess, setPriceChangeaccess] = useState(true); + + const [ConfigDataList, setConfigDataList] = useState([]); + const [messageType, setMessageType] = useState(null); + const [messageData, setMessageData] = useState(null); + const [EditOpen, setEditOpen] = useState(props?.BSBillingEditQuantity); + const [ItemData, setItemData] = useState(props?.Productdata); + const [Quantity, setQuantity] = useState( + props?.Productdata?.ScaleType !== 'weight' + ? parseInt(props.Productdata.OrderQty) + : props.Productdata.OrderQty + ); + const ReorderProductData = useSelector(GlobalReorderProductDetails); + const templateData = useSelector(getTemplateData); + const OfferCheckedInSetup = + templateData?.BookingNavbar?.[1].some( + (item) => item?.OptionName == 'Offer' + ) || + templateData?.BookingCombo1?.[1]?.some( + (item) => item?.OptionName == 'Offer' + ); + const [ClearQuantity, setClearQuantity] = useState(false); + const CartOrderDetails = useSelector(GlobalOrderCardDetails); + const SettingDataSelector = useSelector(PreferenceData); + const OrderType = useSelector(GlobalOrderType); + const [BillOrderPre, setBillOrderPre] = useState(null); + const [RadioBtnSelection, setRadioBtnSelection] = useState( + props?.shortKeyMethod == 'price' + ? 'Price' + : ItemData?.ScaleType !== 'weight' + ? 'Quantity' + : PriceChangeaccess + ? 'Price' + : 'Parcel' + ); + const [PercentageSelection, setPercentageSelection] = useState('Fixed'); + const [RadioDetails, setRadioDetails] = useState(false); + const [editedPrice, setEditedPrice] = useState(0); + const allowDecimal = preferenceDatas?.[0]?.SettingDtlDetails?.find( + (setting) => + setting?.SettingIdName?.toLowerCase() === 'decimal' && + setting?.SettingValue === 'Y' + ); + const [PackageDtl, setPackageDtl] = useState([]); + // const appPreferences = useSelector(ApplicationPreferences); + // const bookingTypePreference = appPreferences?.find((preference) => preference?.PreferredCatName === 'Booking Type')?.PreferenceCatDetails + // const dinePreference = bookingTypePreference?.find((type) => type?.PreferredSubCatName?.toLowerCase() === "dine in" && type?.PreferredStatus === 'Y') + // const takeAwayPreference = bookingTypePreference?.find((type) => type?.PreferredSubCatName?.toLowerCase() === "take away" && type?.PreferredStatus === 'Y') + const OfferAppliedProducts = useSelector( + GlobalOfferAppliedProducts, + shallowEqual + ); + const FreeProdList = useSelector(GlobalFreeProdList); + console.log(CartOrderDetails, 'CartOrderDetails'); + + const TakAwayId = ConfigDataList?.find( + (a) => a?.ConfigName === 'TakeAway' + )?.ConfigId; + + const DineinId = ConfigDataList?.find( + (a) => a?.ConfigName === 'Dine In' + )?.ConfigId; + + const hasOffer = preferenceOffer && OfferCheckedInSetup; + + useEffect(() => { + if (ConfigDataList?.length === 0) { + getBookingTypeId(); + } + }, []); + + useEffect( + () => { + setEditOpen(props.BSBillingEditQuantity); + setItemData(props.Productdata); + setQuantity( + props?.Productdata?.ScaleType !== 'weight' + ? parseInt(props.Productdata.OrderQty) + : props.Productdata.OrderQty + ); + }, + [props.BSBillingEditQuantity], + [props.Productdata] + ); + + useEffect(() => { + if (preferenceshortcutkey) { + if (props.BSBillingEditQuantity && RadioBtnSelection === 'Quantity') { + setTimeout(() => { + quantityInputRef.current?.focus(); + }, 100); + } + + if (props.BSBillingEditQuantity && RadioBtnSelection === 'Price') { + setTimeout(() => { + if (RadioDetails) { + const inputElement = + reductionInputRef.current?.querySelector('input'); + inputElement?.focus(); + } else { + const inputElement = + priceChangeInputRef.current?.querySelector('input'); + inputElement?.focus(); + } + }, 100); + } + } + }, [ + RadioBtnSelection, + props.BSBillingEditQuantity, + RadioDetails, + preferenceshortcutkey, + ]); + + useEffect(() => { + const handleKeyDown = (event) => { + if (preferenceshortcutkey && event.shiftKey && event.key === 'E') { + event.preventDefault(); + if (PriceChangeaccess && props.Productdata?.Offer <= 0) { + onRadioBtnChange('Price'); + } + } + }; + + if (EditOpen) { + document.addEventListener('keydown', handleKeyDown); + } + + return () => { + document.removeEventListener('keydown', handleKeyDown); + }; + }, [ + EditOpen, + preferenceshortcutkey, + PriceChangeaccess, + props.Productdata?.Offer, + ]); + + useEffect(() => { + const BillOrder = SettingDataSelector?.[0]?.SettingDtlDetails?.find( + (item) => item.SettingIdName === 'BillItemsOrder' + ); + setBillOrderPre(BillOrder?.SettingValue); + }, []); + + useEffect(() => { + if (UserType == 'Employee') { + const Pricechange = EmpAccessDetail?.filter( + (item) => item.ConfigName === 'Sales Discount' + ); + + setPriceChangeaccess(Pricechange?.[0]?.AddAccess != 'Y' ? false : true); + } + }, [EmpAccessDetail]); + + useEffect(() => { + if (PackageDtl.length > 0) { + AddProductQuantity(); + } + }, [PackageDtl]); + + const getBookingTypeId = async () => { + let tempconfigdata = await dispatch( + getConfigType({ TypeName: 'Booking Type' }) + ).unwrap(); + + if (tempconfigdata?.data?.statusCode == 1) { + setConfigDataList(tempconfigdata?.data?.data); + } + }; + + function safeRound(amountStr) { + if (amountStr == null) return allowDecimal ? '0.00' : '0'; + + const cleaned = String(amountStr).replace(/[^0-9.-]+/g, ''); + const num = Number(cleaned); + + if (isNaN(num)) return allowDecimal ? '0.00' : '0'; + + return allowDecimal ? num.toFixed(2) : Math.round(num).toString(); + } + const AddQuantity = (value) => { + if (ClearQuantity === false) { + setQuantity(value); + setClearQuantity(true); + } else { + setQuantity(Quantity.toString() + value.toString()); + if (Quantity?.length > 10) { + setMessageType('error'); + setMessageData('Quantity is to long'); + setQuantity(''); + } + } + }; + const Removevalue = () => { + let tempremovedata = Quantity.toString().substring(0, Quantity?.length - 1); + setQuantity(tempremovedata); + }; + const openRadioDetails = () => { + setDisableSubmitButton(false); + setRadioDetails(!RadioDetails); + setEditedPrice(0); + }; + + // const AddQuantityonly = () => { + // setMessageType('success'); + // setMessageData('Quantity Added'); + // }; + + const createUpdatedCartItem = (cartItem, quantity, newPrice) => { + const qty = parseInt(quantity); + const rate = parseFloat(newPrice); + const offerType = cartItem?.OfferType; + const offerPrice = cartItem?.OfferPrice || 0; + const taxPercent = cartItem?.TaxPercentage || 0; + + const baseAmount = qty * rate; + + const offerValue = + offerType === 'F' ? qty * offerPrice : (baseAmount * offerPrice) / 100; + + const totalAmt = + cartItem?.OfferPrice > 0 ? baseAmount - offerValue : baseAmount; + + const taxAmt = (baseAmount * taxPercent) / (100 + taxPercent); + const withoutTax = baseAmount - taxAmt; + + return { + ...cartItem, + OrderQty: qty, + OrderRate: rate, + TotalAmt: totalAmt, + OfferValue: offerValue, + TaxAmt: taxAmt.toFixed(2), + WithoutTaxRate: withoutTax.toFixed(2), + PackageDtl: PackageDtl, + }; + }; + + const calculateOverAllQty = (item, filterItems) => { + if (!item) return 0; + + const totalUsedQty = + filterItems?.reduce((acc, card) => { + if (card?.StockAvailable !== 'Y') return acc; + + const isSinglePcItem = item?.SinglePc === 'Y'; + const isSinglePcCard = card?.SinglePc === 'Y'; + + let qty = 0; + if (isSinglePcItem) { + qty = isSinglePcCard ? card.OrderQty : card.OrderQty * card.NoOfPcs; + } else { + if (isSinglePcCard) { + const remainder = card?.OverAllPcs % card?.NoOfPcs; + qty = + remainder >= card?.OrderQty + ? 0 + : Math.ceil(card?.OrderQty / card?.NoOfPcs); + } else { + qty = card.OrderQty; + } + } + return acc + qty; + }, 0) || 0; + + const availableQty = + item?.SinglePc === 'Y' ? item?.OverAllPcs : item?.BalanceQty; + return availableQty - totalUsedQty; + }; + + const MergecardItem = (cartItem, BillOrderPre, OtherorderDataforNormal) => { + const updatedCart = {}; + let updatedItemKey = null; + + // Add existing items to the map + OtherorderDataforNormal?.forEach((item) => { + const key = `${item?.ProdId}-${item?.InwardDtlId}-${item?.BookingTypeName}-${item?.OrderRate}`; + if (!updatedCart[key]) { + updatedCart[key] = { ...item }; + } + }); + + // Merge or add new item + const key = `${cartItem?.ProdId}-${cartItem?.InwardDtlId}-${cartItem?.BookingTypeName}-${cartItem?.OrderRate}`; + if (updatedCart[key]) { + updatedCart[key].OrderQty += cartItem?.OrderQty; + } else { + updatedCart[key] = { ...cartItem }; + } + updatedItemKey = key; + + // Recalculate total amounts + Object.values(updatedCart).forEach((item) => { + const orderQty = item.OrderQty; + const orderRate = item.OrderRate; + const taxPercentage = item?.TaxPercentage || 0; + item.TotalAmt = orderQty * orderRate; + item.TaxAmt = ( + (orderQty * orderRate * taxPercentage) / + (100 + taxPercentage) + ).toFixed(2); + item.WithoutTaxRate = orderQty * orderRate - parseFloat(item.TaxAmt); + }); + + let updatedArray = Object.values(updatedCart); + + // Ensure updated item appears first + if (BillOrderPre === 'Y' && updatedItemKey) { + const updatedItem = updatedCart[updatedItemKey]; + updatedArray = [ + updatedItem, + ...updatedArray?.filter((item) => item !== updatedItem), + ]; + } + + return updatedArray; + }; + + const AddProductQuantity = async () => { + let newPrice = editedPrice > 0 ? editedPrice : props.Productdata.OrderRate; + await dispatch(changeHoldOrderDtl(false)); + await dispatch(changePreviousOrderLength(CartOrderDetails?.length)); + + if ( + (parseInt(Quantity) === 0 || Quantity === '') && + props?.Productdata?.ScaleType !== 'weight' + ) { + setMessageType('error'); + setMessageData('Please enter valid quantity'); + setQuantity(''); + } else { + let localId = props.Index; + const editedQty = + props?.Productdata?.ScaleType !== 'weight' + ? parseInt(Quantity) + : props.Productdata.OrderQty; + let editedProductIndex = CartOrderDetails?.findIndex( + (e) => e?.localId == localId + ); + const editedProduct = CartOrderDetails[editedProductIndex]; + const productBookingType = editedProduct?.BookingTypeName; + const isItemInCart = CartOrderDetails?.find( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + !cartItem?.SalesId + ); + // changing for one piece stock checking + const isItemInCartfilter = CartOrderDetails?.filter( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate !== editedProduct?.OrderRate && + !cartItem?.SalesId + ); + + const isItemInCartHold = CartOrderDetails?.find( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName + ); // check if the item is already in the cart + const isItemInCartHoldfilter = CartOrderDetails?.filter( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + !( + (cartItem?.OrderRate === editedProduct?.OrderRate) + // && cartItem?.BookingTypeName === editedProduct?.BookingTypeName + ) + ); + + if ( + (isItemInCart && + productBookingType !== 'Dine In' && + OrderType != 'Hold') || + (isItemInCart && + productBookingType === 'Dine In' && + OrderType != 'Hold') + ) { + // let onePcsQtyOther = 0; + // if (editedProduct?.SinglePc === 'Y') { + // // check if there is same rate product in other booking type + // const sameRateProductInOtherBookingType = CartOrderDetails?.find( + // (cartItem) => + // cartItem?.ProdId === editedProduct?.ProdId && + // cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + // cartItem?.OrderRate === editedProduct?.OrderRate && + // cartItem?.BookingTypeName !== editedProduct?.BookingTypeName && + // !cartItem?.SalesId + // ) + // if (sameRateProductInOtherBookingType?.StockAvailable === 'Y') { + // onePcsQtyOther = sameRateProductInOtherBookingType?.OrderQty; + // } + // } + const overAllQuantity = calculateOverAllQty( + isItemInCart, + isItemInCartfilter + ); + let totalUsedQty = 0; + const sameProductInOtherBookingType = CartOrderDetails?.filter( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName && + !cartItem?.SalesId + ); + if (editedProduct?.Offer > 0) { + // check same product available in paid product + const sameProductAsPaidInSameBookingType = CartOrderDetails?.filter( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + !cartItem?.SalesId && + !cartItem?.OfferMode && + cartItem?.Offer === 0 + ); + + if (sameProductAsPaidInSameBookingType?.length > 0) { + const stockAvailable = sameProductAsPaidInSameBookingType?.some( + (item) => item?.StockAvailable === 'Y' + ); + if (stockAvailable) { + totalUsedQty = sameProductAsPaidInSameBookingType?.reduce( + (acc, item) => { + if (item?.StockAvailable === 'Y') { + return acc + parseInt(item?.OrderQty); + } + return acc; + }, + 0 + ); + } + } + } else if (!editedProduct?.Offer) { + const sameProductAsFree = CartOrderDetails?.filter( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + !cartItem?.SalesId && + cartItem?.Offer > 0 && + cartItem?.OfferMode + ); + + if (sameProductAsFree?.length > 0) { + const stockAvailable = sameProductAsFree?.some( + (item) => item?.StockAvailable === 'Y' + ); + if (stockAvailable) { + totalUsedQty = sameProductAsFree?.reduce((acc, item) => { + if (item?.StockAvailable === 'Y') { + return acc + parseInt(item?.OrderQty); + } + return acc; + }, 0); + } + } + } + + if (sameProductInOtherBookingType?.length > 0) { + const stockAvailable = sameProductInOtherBookingType?.some( + (item) => item?.StockAvailable === 'Y' + ); + if (stockAvailable) { + totalUsedQty += sameProductInOtherBookingType?.reduce( + (acc, item) => { + if (item?.StockAvailable === 'Y') { + return acc + parseInt(item?.OrderQty); + } + return acc; + }, + 0 + ); + } + } + + if ( + overAllQuantity < editedQty + (totalUsedQty || 0) && + isItemInCart?.StockAvailable === 'Y' + ) { + setMessageType('error'); + setMessageData('Stock Not Available'); + return; + } + } else if (isItemInCartHold && OrderType === 'Hold') { + const holddataproduct = ReorderProductData?.filter( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId + ); + + let totalSelectedProductQty = holddataproduct?.reduce( + (accumulator, card) => { + return ( + accumulator + + parseInt( + card?.StockAvailable === 'Y' + ? editedProduct?.SinglePc === 'Y' + ? card.SinglePc !== 'Y' + ? card.OrderQty * card.NoOfPcs + : card.OrderQty + : card.SinglePc !== 'Y' + ? card.OrderQty + : card.OverAllPcs % card.NoOfPcs >= card.OrderQty + ? 0 + : card.OrderQty % card.NoOfPcs === 0 + ? Math.floor(card.OrderQty / card.NoOfPcs) + : Math.floor(card.OrderQty / card.NoOfPcs) + 1 + : 0 + ) + ); + }, + 0 + ); + + let totalUsedQty = 0; + + const sameProductInOtherBookingType = CartOrderDetails?.filter( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName + ); + + if (editedProduct?.Offer > 0) { + // check same product available in paid product + const sameProductAsPaid = CartOrderDetails?.find( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + !cartItem?.OfferMode && + cartItem?.Offer === 0 + ); + + if (sameProductAsPaid?.StockAvailable === 'Y') { + totalUsedQty = sameProductAsPaid?.OrderQty; + } + } else if (!editedProduct?.Offer) { + const sameProductAsFree = CartOrderDetails?.find( + (cartItem) => + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + cartItem?.Offer > 0 && + cartItem?.OfferMode + ); + if (sameProductAsFree?.StockAvailable === 'Y') { + totalUsedQty = sameProductAsFree?.OrderQty; + } + } + + if (sameProductInOtherBookingType?.length > 0) { + const stockAvailable = sameProductInOtherBookingType?.some( + (item) => item?.StockAvailable === 'Y' + ); + if (stockAvailable) { + totalUsedQty += sameProductInOtherBookingType?.reduce( + (acc, item) => { + if (item?.StockAvailable === 'Y') { + return acc + parseInt(item?.OrderQty); + } + return acc; + }, + 0 + ); + } + } + + let overAllQuantityHold = + calculateOverAllQty(isItemInCartHold, isItemInCartHoldfilter) + + totalSelectedProductQty; + if ( + isItemInCartHold?.StockAvailable === 'Y' && + overAllQuantityHold < editedQty + (totalUsedQty || 0) + ) { + setMessageType('error'); + setMessageData('Stock Not Available'); + return; + } + } + await handleEditQuantity(editedProduct, editedProductIndex, newPrice); + props.handleEditQuantityCancel(); + setClearQuantity(false); + } + setIndex(null); + }; + + const handleEditQuantity = async ( + editedProduct, + editedProductIndex, + newPrice, + overrideQty = null + ) => { + const editedQty = overrideQty !== null + ? overrideQty + : props?.Productdata?.ScaleType !== 'weight' + ? parseInt(Quantity) + : props.Productdata.OrderQty; + const addFirst = BillOrderPre === 'Y'; + const isExistsInFreeProdList = FreeProdList?.find( + (product) => + product?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) && + editedProduct?.OfferMessage?.[0]?.OfferId === product?.OfferId && + editedProduct?.OfferMode === product?.OfferMode + ); + console.log(FreeProdList, 'FreeProdList'); + + if ( + isExistsInFreeProdList && + editedProduct?.Offer > 0 && + hasOffer && + editedProduct?.SinglePc !== 'Y' + ) { + const freeProductInOtherBooking = CartOrderDetails?.find((cartItem) => { + return ( + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OfferMessage?.[0]?.OfferId === + editedProduct?.OfferMessage?.[0]?.OfferId && + cartItem?.OfferMode === editedProduct?.OfferMode && + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName + ); + }); + + const finalOrderQty = + (freeProductInOtherBooking?.OrderQty || 0) + editedQty; + + if (isExistsInFreeProdList?.RemainingQty === 0) { + // need to split the free product and paid product + + if (finalOrderQty > isExistsInFreeProdList?.OverAllFreeQty) { + const paidQty = + finalOrderQty - isExistsInFreeProdList?.OverAllFreeQty; + const isAlreadyExistsInCart = CartOrderDetails?.findIndex( + (cartItem) => { + return ( + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + !cartItem?.OfferMode && + cartItem?.Offer === 0 && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + cartItem?.OrderRate === editedProduct?.OrderRate + ); + } + ); + + let updatedCart = [...CartOrderDetails]; + + if (isAlreadyExistsInCart !== -1) { + // update the existing paid product in cart + const existingItem = updatedCart[isAlreadyExistsInCart]; + const updatedItem = { + ...existingItem, + OrderQty: existingItem?.OrderQty + paidQty, + ...calculateTaxAmounts({ + qty: existingItem?.OrderQty + paidQty, + rate: existingItem?.OrderRate, + taxPercentage: existingItem?.TaxPercentage, + }), + }; + updatedCart?.splice(isAlreadyExistsInCart, 1); + updatedCart = addFirst + ? [updatedItem, ...updatedCart] + : [...updatedCart, updatedItem]; + } else { + // add new paid product in cart + const paidProduct = { + localId: uuidv4(), + ...editedProduct, + OrderQty: paidQty, + Offer: 0, + OfferMode: null, + OfferMessage: null, + OfferType: null, + ...calculateTaxAmounts({ + qty: paidQty, + rate: editedProduct.OrderRate, + taxPercentage: editedProduct.TaxPercentage, + }), + }; + updatedCart = addFirst + ? [paidProduct, ...updatedCart] + : [...updatedCart, paidProduct]; + } + dispatch(changeOrderCardDetails(updatedCart)); + } else { + // Check if there is any same product but No offer applied in OrderCardDtls in same BookingType + // In Same BookingType Have Enough Free Qty Just only Update Qty in Same Booking Type OtherWise need to update in Other Booking Type Qty also if exists in Other Booking Type + const isAlreadyExistsInCart = CartOrderDetails?.find((cartItem) => { + return ( + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + !cartItem?.OfferMode && + cartItem?.Offer === 0 + ); + }); + + const freeQtyNeeded = + isExistsInFreeProdList?.OverAllFreeQty - finalOrderQty; + const paidQtySame = isAlreadyExistsInCart?.OrderQty || 0; + + if (paidQtySame >= freeQtyNeeded) { + const remainingPaidQty = (paidQtySame || 0) - freeQtyNeeded; + if (remainingPaidQty === 0) { + // Just need to update the Free Qty and Remove the Paid Product from Cart + const updatedCart = CartOrderDetails?.filter( + (cartItem) => cartItem !== isAlreadyExistsInCart + ); + dispatch( + changeOrderCardDetails( + updatedCart?.map((cartItem) => { + if (cartItem === editedProduct) { + return { + ...cartItem, + PackageDtl: PackageDtl, + }; + } + return cartItem; + }) + ) + ); + } else { + // need to update the Paid Qty to Remaining Qty + const updatedCart = CartOrderDetails?.map((cartItem) => { + if (cartItem === isAlreadyExistsInCart) { + return { + ...cartItem, + OrderQty: remainingPaidQty, + ...calculateTaxAmounts({ + qty: remainingPaidQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + }; + } + return cartItem; + }); + dispatch(changeOrderCardDetails(updatedCart)); + } + } else { + // check if the same product exists in other booking type as paid product + // need to calculate how much qty going to be updated in other booking type and same booking type + + const diffBookingTypeProduct = CartOrderDetails?.find( + (cartItem) => { + return ( + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName !== + editedProduct?.BookingTypeName && + !cartItem?.OfferMode && + cartItem?.Offer === 0 + ); + } + ); + + const diffBookingTypeFreeProduct = CartOrderDetails?.find( + (cartItem) => { + return ( + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.OrderRate === editedProduct?.OrderRate && + cartItem?.BookingTypeName !== + editedProduct?.BookingTypeName && + cartItem?.OfferMode === editedProduct?.OfferMode && + cartItem?.Offer > 0 + ); + } + ); + + const paidQtyOther = diffBookingTypeProduct?.OrderQty || 0; + const sameBookTypeUpdateQty = freeQtyNeeded - paidQtySame; + const otherBookTypePaidUpdateQty = + paidQtyOther - sameBookTypeUpdateQty; + const totalPaidQty = paidQtySame + paidQtyOther; + + if (paidQtySame || paidQtyOther) { + let updatedCart = [...CartOrderDetails]; + + // Remove paid product in same booking type if needed + if (paidQtySame) { + updatedCart = updatedCart.filter( + (cartItem) => cartItem !== isAlreadyExistsInCart + ); + updatedCart = updatedCart.map((cartItem) => { + if (cartItem === editedProduct) { + return { + ...cartItem, + OrderQty: editedQty + paidQtySame, + ...calculateTaxAmounts({ + qty: editedQty + paidQtySame, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + ...(cartItem?.Offer > 0 && { + Offer: (editedQty + paidQtySame) * cartItem.OrderRate, + }), + }; + } + return cartItem; + }); + } + + // Remove/update paid product in other booking type if needed + if (paidQtyOther) { + if (otherBookTypePaidUpdateQty <= 0) { + // Remove paid product from other booking type + updatedCart = updatedCart.filter( + (cartItem) => cartItem !== diffBookingTypeProduct + ); + updatedCart = updatedCart.map((cartItem) => { + if (cartItem === diffBookingTypeFreeProduct) { + return { + ...cartItem, + OrderQty: paidQtyOther + cartItem?.OrderQty, + ...calculateTaxAmounts({ + qty: paidQtyOther + cartItem?.OrderQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + Offer: + (paidQtyOther + cartItem?.OrderQty) * + cartItem?.OrderRate, + }; + } else if (cartItem === editedProduct) { + return { + ...cartItem, + OrderQty: editedQty, + ...calculateTaxAmounts({ + qty: editedQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + Offer: editedQty * cartItem?.OrderRate, + }; + } + return cartItem; + }); + } else if (otherBookTypePaidUpdateQty > 0) { + updatedCart = updatedCart.map((cartItem) => { + if (cartItem === diffBookingTypeFreeProduct) { + return { + ...cartItem, + OrderQty: cartItem?.OrderQty + sameBookTypeUpdateQty, + ...calculateTaxAmounts({ + qty: cartItem?.OrderQty + sameBookTypeUpdateQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + Offer: + (cartItem?.OrderQty + sameBookTypeUpdateQty) * + cartItem?.OrderRate, + }; + } else if (cartItem === editedProduct) { + return { + ...cartItem, + OrderQty: editedQty, + ...calculateTaxAmounts({ + qty: editedQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + Offer: editedQty * cartItem?.OrderRate, + }; + } else if (cartItem === diffBookingTypeProduct) { + return { + ...cartItem, + OrderQty: otherBookTypePaidUpdateQty, + ...calculateTaxAmounts({ + qty: otherBookTypePaidUpdateQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + }; + } + return cartItem; + }); + } + } + + // Only one dispatch after all updates + dispatch(changeOrderCardDetails(updatedCart)); + + if (totalPaidQty < freeQtyNeeded) { + const additionalFreeQtyNeeded = freeQtyNeeded - totalPaidQty; + + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.FreeProdId === editedProduct?.ProdId && + product?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) && + product?.OfferId === + editedProduct?.OfferMessage?.[0]?.OfferId && + product?.OfferMode === editedProduct?.OfferMode + ) { + const freeQty = + product?.OverAllFreeQty - additionalFreeQtyNeeded; + return { + ...product, + FreeQty: freeQty, + RemainingQty: additionalFreeQtyNeeded, + discount: freeQty * editedProduct?.OrderRate, + }; + } + return product; + }); + + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + editedProduct?.OfferMessage?.[0]?.OfferId && + offerProduct?.OfferMode === editedProduct?.OfferMode; + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + const freeQty = + matchingFreeProduct?.FreeQty - additionalFreeQtyNeeded; + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: freeQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: freeQty, + ActualOfferAmount: freeQty * editedProduct?.OrderRate, + OfferAmount: freeQty * editedProduct?.OrderRate, + OfferValue: freeQty * editedProduct?.OrderRate, + FreeProductsList: updatedFreeProductsList, + UsedCount: freeQty * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch( + changeFullOfferAppliedProducts(updatedOfferAppliedProducts) + ); + } + } else { + // no paid product exists in other booking type and same booking type + // Just need to update the Free Qty in FreeProductList + // Need to update the Qty in Edited Product + // Need to update the FreeQty in OfferAppliedProducts + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice, + true + ); + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.FreeProdId === editedProduct?.ProdId && + product?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) && + product?.OfferId === + editedProduct?.OfferMessage?.[0]?.OfferId && + product?.OfferMode === editedProduct?.OfferMode + ) { + return { + ...product, + FreeQty: finalOrderQty, + RemainingQty: product?.OverAllFreeQty - finalOrderQty, + discount: finalOrderQty * editedProduct?.OrderRate, + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + editedProduct?.OfferMessage?.[0]?.OfferId && + offerProduct?.OfferMode === editedProduct?.OfferMode; + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: finalOrderQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: finalOrderQty, + ActualOfferAmount: + finalOrderQty * editedProduct?.OrderRate, + OfferAmount: finalOrderQty * editedProduct?.OrderRate, + OfferValue: finalOrderQty * editedProduct?.OrderRate, + FreeProductsList: updatedFreeProductsList, + UsedCount: finalOrderQty * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch( + changeFullOfferAppliedProducts(updatedOfferAppliedProducts) + ); + } + } + } + } else if (isExistsInFreeProdList?.RemainingQty > 0) { + // perform normal edit qty operation + // console.log(editedProduct?.OrderQty, "editedProduct") + // await handleNormalEditQuantity(editedProduct, editedProductIndex); + + if (finalOrderQty > isExistsInFreeProdList?.OverAllFreeQty) { + // split paid and free product + const paidProdQty = + finalOrderQty - isExistsInFreeProdList?.OverAllFreeQty; + const freeProdQty = editedQty - paidProdQty; + const isAlreadyExistsInCart = CartOrderDetails?.findIndex( + (cartItem) => { + return ( + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + !cartItem?.OfferMode && + cartItem?.Offer === 0 && + cartItem?.BookingTypeName === editedProduct?.BookingTypeName && + cartItem?.OrderRate === editedProduct?.OrderRate + ); + } + ); + + let updatedCart = [...CartOrderDetails]; + + if (isAlreadyExistsInCart !== -1) { + // update the existing paid product in cart + updatedCart[isAlreadyExistsInCart] = { + ...updatedCart[isAlreadyExistsInCart], + OrderQty: + updatedCart[isAlreadyExistsInCart]?.OrderQty + paidProdQty, + ...calculateTaxAmounts({ + qty: updatedCart[isAlreadyExistsInCart]?.OrderQty + paidProdQty, + rate: updatedCart[isAlreadyExistsInCart]?.OrderRate, + taxPercentage: + updatedCart[isAlreadyExistsInCart]?.TaxPercentage, + }), + }; + } else { + // add new paid product in cart + const paidProduct = { + localId: uuidv4(), + ...editedProduct, + OrderQty: paidProdQty, + Offer: 0, + OfferMode: null, + OfferMessage: null, + OfferType: null, + ...calculateTaxAmounts({ + qty: paidProdQty, + rate: editedProduct?.OrderRate, + taxPercentage: editedProduct?.TaxPercentage, + }), + }; + updatedCart = [...updatedCart, paidProduct]; + } + + dispatch( + changeOrderCardDetails( + updatedCart?.map((prod) => { + if (prod === editedProduct) { + return { + ...prod, + OrderQty: freeProdQty, + ...calculateTaxAmounts({ + qty: freeProdQty, + rate: prod.OrderRate, + taxPercentage: prod.TaxPercentage, + }), + ...(prod?.Offer > 0 && { + Offer: freeProdQty * prod.OrderRate, + }), + }; + } + return prod; + }) + ) + ); + } else if (finalOrderQty === isExistsInFreeProdList?.OverAllFreeQty) { + // Just need to update the Qty in Edited Product and FreeProductList and OfferAppliedProducts + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice, + true + ); + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.FreeProdId === editedProduct?.ProdId && + product?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) && + product?.OfferId === editedProduct?.OfferMessage?.[0]?.OfferId && + product?.OfferMode === editedProduct?.OfferMode + ) { + return { + ...product, + FreeQty: finalOrderQty, + RemainingQty: 0, + discount: finalOrderQty * editedProduct?.OrderRate, + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + editedProduct?.OfferMessage?.[0]?.OfferId && + offerProduct?.OfferMode === editedProduct?.OfferMode; + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: finalOrderQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: finalOrderQty, + ActualOfferAmount: finalOrderQty * editedProduct?.OrderRate, + OfferAmount: finalOrderQty * editedProduct?.OrderRate, + OfferValue: finalOrderQty * editedProduct?.OrderRate, + FreeProductsList: updatedFreeProductsList, + UsedCount: finalOrderQty * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch(changeFullOfferAppliedProducts(updatedOfferAppliedProducts)); + } else if (finalOrderQty < isExistsInFreeProdList?.OverAllFreeQty) { + // Just need to update the Qty in Edited Product and FreeProductList and OfferAppliedProducts + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice, + true + ); + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.FreeProdId === editedProduct?.ProdId && + product?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) && + product?.OfferId === editedProduct?.OfferMessage?.[0]?.OfferId && + product?.OfferMode === editedProduct?.OfferMode + ) { + return { + ...product, + FreeQty: finalOrderQty, + RemainingQty: product?.OverAllFreeQty - finalOrderQty, + discount: finalOrderQty * editedProduct?.OrderRate, + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + editedProduct?.OfferMessage?.[0]?.OfferId && + offerProduct?.OfferMode === editedProduct?.OfferMode; + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === editedProduct?.InwardDtlId + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + editedProduct?.InwardDtlId + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: finalOrderQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: finalOrderQty, + ActualOfferAmount: finalOrderQty * editedProduct?.OrderRate, + OfferAmount: finalOrderQty * editedProduct?.OrderRate, + OfferValue: finalOrderQty * editedProduct?.OrderRate, + FreeProductsList: updatedFreeProductsList, + UsedCount: finalOrderQty * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch(changeFullOfferAppliedProducts(updatedOfferAppliedProducts)); + } + } + } else { + // check is there any free product applicable for the edited product + const isFreeProductApplicable = FreeProdList?.find((product) => { + return ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId + ); + }); + + const sameProductInOtherBooking = CartOrderDetails?.find((cartItem) => { + return ( + cartItem?.ProdId === editedProduct?.ProdId && + cartItem?.InwardDtlId === editedProduct?.InwardDtlId && + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName + ); + }); + + const finalOrderQty = + (sameProductInOtherBooking?.OrderQty || 0) + editedQty; + + if (isFreeProductApplicable && hasOffer) { + const applicableFreeProducts = + isFreeProductApplicable?.ProdVariantDetails; + + const freeProductVariants = applicableFreeProducts?.map((variant) => { + return { + ...variant, + FreeProdId: isFreeProductApplicable?.FreeProdId, + OfferId: isFreeProductApplicable?.OfferId, + OfferMode: isFreeProductApplicable?.OfferMode, + }; + }); + + if (isFreeProductApplicable?.OverAllFreeQty > finalOrderQty) { + if (isFreeProductApplicable?.FreeQty === 0) { + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice + ); + // update free product list (Set OverAllFreeQty = OrderQty and Remaining = OrderQty) + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId + ) { + return { + ...product, + FreeQty: 0, + OverAllFreeQty: finalOrderQty, + RemainingQty: finalOrderQty, + discount: finalOrderQty * editedProduct?.OrderRate, + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + } else if (isFreeProductApplicable?.FreeQty <= finalOrderQty) { + // check if there is any applicable free product in cart + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice + ); + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId + ) { + return { + ...product, + OverAllFreeQty: finalOrderQty, + RemainingQty: finalOrderQty - product?.FreeQty, + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + } else if (isFreeProductApplicable?.FreeQty > finalOrderQty) { + // need to split free product and paid product + let remainingPaidQty = + isFreeProductApplicable?.FreeQty - finalOrderQty; + const applicableFreeInCart = CartOrderDetails?.filter( + (cartItem) => { + return ( + freeProductVariants?.some( + (variant) => + variant.FreeProdId === cartItem.ProdId && + variant?.StockDetails?.some( + (stock) => + stock.FreeInwardDtlId === cartItem.InwardDtlId + ) + ) && + cartItem?.Offer && + isFreeProductApplicable?.OfferId === + cartItem?.OfferMessage?.[0]?.OfferId + ); + } + ); + const applicableFreeInCartAsPaid = CartOrderDetails?.filter( + (cartItem) => { + return ( + freeProductVariants?.some( + (variant) => + variant.FreeProdId === cartItem.ProdId && + variant?.StockDetails?.some( + (stock) => + stock.FreeInwardDtlId === cartItem.InwardDtlId + ) + ) && !cartItem?.Offer + ); + } + ); + const sameBookingTypeProduct = applicableFreeInCart?.find( + (cartItem) => { + return ( + cartItem?.BookingTypeName === editedProduct?.BookingTypeName + ); + } + ); + const otherBookingTypeProduct = applicableFreeInCart?.find( + (cartItem) => { + return ( + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName + ); + } + ); + const sameBookingTypeProductAsPaid = + applicableFreeInCartAsPaid?.find((cartItem) => { + return ( + cartItem?.BookingTypeName === editedProduct?.BookingTypeName + ); + }); + const otherBookingTypeProductAsPaid = + applicableFreeInCartAsPaid?.find((cartItem) => { + return ( + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName + ); + }); + let updatedCart = [...CartOrderDetails]; + if (sameBookingTypeProduct) { + if (sameBookingTypeProductAsPaid) { + if (sameBookingTypeProduct?.OrderQty <= remainingPaidQty) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== sameBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProductAsPaid) { + const newItem = { + ...cartItem, + OrderQty: + cartItem.OrderQty + sameBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: 0, + }; + + delete newItem.OfferMode; + delete newItem.OfferMessage; + delete newItem.OfferType; + + return newItem; + } + return cartItem; + }); + } else if ( + sameBookingTypeProduct?.OrderQty > remainingPaidQty + ) { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProduct) { + return { + ...cartItem, + OrderQty: cartItem.OrderQty - remainingPaidQty, + ...calculateTaxAmounts({ + qty: cartItem.OrderQty - remainingPaidQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem?.OrderQty - remainingPaidQty) * + cartItem?.OrderRate, + }; + } else if (cartItem === sameBookingTypeProductAsPaid) { + return { + ...cartItem, + OrderQty: cartItem?.OrderQty + remainingPaidQty, + ...calculateTaxAmounts({ + qty: cartItem?.OrderQty + remainingPaidQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + }; + } + return cartItem; + }); + } + } else { + if (sameBookingTypeProduct?.OrderQty <= remainingPaidQty) { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProduct) { + const newPaidProd = { + ...cartItem, + Offer: 0, + }; + + delete newPaidProd.OfferMode; + delete newPaidProd.OfferMessage; + delete newPaidProd.OfferType; + return newPaidProd; + } + return cartItem; + }); + } else if ( + sameBookingTypeProduct?.OrderQty > remainingPaidQty + ) { + const newPaidProduct = { + ...sameBookingTypeProduct, + OrderQty: remainingPaidQty, + Offer: 0, + }; + delete newPaidProduct.OfferMode; + delete newPaidProduct.OfferMessage; + delete newPaidProduct.OfferType; + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProduct) { + return { + ...cartItem, + OrderQty: cartItem.OrderQty - remainingPaidQty, + ...calculateTaxAmounts({ + qty: cartItem?.OrderQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + Offer: + (cartItem?.OrderQty - remainingPaidQty) * + cartItem?.OrderRate, + }; + } + return cartItem; + }); + updatedCart = [...updatedCart, newPaidProduct]; + } + } + remainingPaidQty = + remainingPaidQty - sameBookingTypeProduct?.OrderQty; + } + + if (otherBookingTypeProduct && remainingPaidQty > 0) { + if (otherBookingTypeProductAsPaid) { + if (otherBookingTypeProduct?.OrderQty <= remainingPaidQty) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== otherBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === otherBookingTypeProductAsPaid) { + const newItem = { + ...cartItem, + OrderQty: + cartItem.OrderQty + otherBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: 0, + }; + + delete newItem.OfferMode; + delete newItem.OfferMessage; + delete newItem.OfferType; + + return newItem; + } + return cartItem; + }); + } else if ( + otherBookingTypeProduct?.OrderQty > remainingPaidQty + ) { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === otherBookingTypeProduct) { + return { + ...cartItem, + OrderQty: cartItem.OrderQty - remainingPaidQty, + ...calculateTaxAmounts({ + qty: cartItem.OrderQty - remainingPaidQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem?.OrderQty - remainingPaidQty) * + cartItem?.OrderRate, + }; + } else if (cartItem === otherBookingTypeProductAsPaid) { + return { + ...cartItem, + OrderQty: cartItem?.OrderQty + remainingPaidQty, + ...calculateTaxAmounts({ + qty: cartItem?.OrderQty + remainingPaidQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + }; + } + return cartItem; + }); + } + } else { + if (otherBookingTypeProduct?.OrderQty <= remainingPaidQty) { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === otherBookingTypeProduct) { + const newPaidProd = { + ...cartItem, + Offer: 0, + }; + delete newPaidProd.OfferMode; + delete newPaidProd.OfferMessage; + delete newPaidProd.OfferType; + return newPaidProd; + } + return cartItem; + }); + } else if ( + otherBookingTypeProduct?.OrderQty > remainingPaidQty + ) { + const newPaidProduct = { + ...otherBookingTypeProduct, + OrderQty: + otherBookingTypeProduct?.OrderQty - remainingPaidQty, + Offer: 0, + }; + delete newPaidProduct.OfferMode; + delete newPaidProduct.OfferMessage; + delete newPaidProduct.OfferType; + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === otherBookingTypeProduct) { + return { + ...cartItem, + OrderQty: cartItem.OrderQty - remainingPaidQty, + ...calculateTaxAmounts({ + qty: cartItem?.OrderQty, + rate: cartItem?.OrderRate, + taxPercentage: cartItem?.TaxPercentage, + }), + Offer: + (cartItem?.OrderQty - remainingPaidQty) * + cartItem?.OrderRate, + }; + } + return cartItem; + }); + updatedCart = [...updatedCart, newPaidProduct]; + } + } + } + + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === editedProduct) { + return { + ...cartItem, + OrderQty: editedQty, + ...calculateTaxAmounts({ + qty: editedQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + }; + } + return cartItem; + }); + + dispatch(changeOrderCardDetails(updatedCart)); + + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId && + product?.OfferId === + (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || + otherBookingTypeProduct?.OfferMessage?.[0]?.OfferId) && + product?.OfferMode === + (sameBookingTypeProduct?.OfferMode || + otherBookingTypeProduct?.OfferMode) + ) { + return { + ...product, + FreeQty: finalOrderQty, + OverAllFreeQty: finalOrderQty, + RemainingQty: 0, + discount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || + otherBookingTypeProduct?.OfferMessage?.[0]?.OfferId) && + offerProduct?.OfferMode === + (sameBookingTypeProduct?.OfferMode || + otherBookingTypeProduct?.OfferMode); + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: finalOrderQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: finalOrderQty, + ActualOfferAmount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferAmount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferValue: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + FreeProductsList: updatedFreeProductsList, + UsedCount: finalOrderQty * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch( + changeFullOfferAppliedProducts(updatedOfferAppliedProducts) + ); + } + } else { + if (isFreeProductApplicable?.FreeQty === 0) { + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice + ); + // update free product list (Set OverAllFreeQty = OrderQty and Remaining = OrderQty) + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId + ) { + return { + ...product, + FreeQty: 0, + OverAllFreeQty: finalOrderQty, + RemainingQty: finalOrderQty, + discount: finalOrderQty * editedProduct?.OrderRate, + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + } else if (isFreeProductApplicable?.FreeQty === finalOrderQty) { + dispatch( + changeOrderCardDetails( + updatedCart?.map((cartItem) => { + if (cartItem === editedProduct) { + return { + ...cartItem, + PackageDtl: PackageDtl, + }; + } + return cartItem; + }) + ) + ); + return; + } else if (isFreeProductApplicable?.FreeQty < finalOrderQty) { + // check if there is any applicable free product in cart + console.log(freeProductVariants, 'freeProductVariants'); + const applicableFreeInCart = CartOrderDetails?.filter( + (cartItem) => { + return ( + freeProductVariants?.some( + (variant) => + variant.FreeProdId === cartItem.ProdId && + variant?.StockDetails?.some( + (stock) => + stock.FreeInwardDtlId === cartItem.InwardDtlId + ) + ) && !cartItem?.Offer + ); + } + ); + + const applicableOfferAppliedFreeInCart = CartOrderDetails?.filter( + (cartItem) => { + return ( + freeProductVariants?.some( + (variant) => + variant.FreeProdId === cartItem.ProdId && + variant?.StockDetails?.some( + (stock) => + stock.FreeInwardDtlId === cartItem.InwardDtlId + ) + ) && + cartItem?.Offer > 0 && + isFreeProductApplicable?.OfferMode === cartItem?.OfferMode && + isFreeProductApplicable?.OfferId === + cartItem?.OfferMessage?.[0]?.OfferId + ); + } + ); + + if (applicableFreeInCart?.length > 0) { + console.log(applicableFreeInCart, 'applicableFreeInCart'); + const sameBookingTypeProduct = applicableFreeInCart?.find( + (cartItem) => { + return ( + cartItem?.BookingTypeName === editedProduct?.BookingTypeName + ); + } + ); + const otherBookingTypeProduct = applicableFreeInCart?.find( + (cartItem) => { + return ( + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName + ); + } + ); + const sameBookingTypeFreeProduct = + applicableOfferAppliedFreeInCart?.find((cartItem) => { + return ( + cartItem?.BookingTypeName === editedProduct?.BookingTypeName + ); + }); + const otherBookingTypeFreeProduct = + applicableOfferAppliedFreeInCart?.find((cartItem) => { + return ( + cartItem?.BookingTypeName !== editedProduct?.BookingTypeName + ); + }); + // find how many qty need to be updated as free product + const totalFreeQtyInCart = applicableFreeInCart?.reduce( + (acc, item) => acc + item.OrderQty, + 0 + ); + const freeQtyNeeded = + finalOrderQty - isFreeProductApplicable?.OverAllFreeQty; + if (totalFreeQtyInCart === freeQtyNeeded) { + let updatedCart = [...CartOrderDetails]; + if (sameBookingTypeProduct) { + if (sameBookingTypeFreeProduct) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== sameBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeFreeProduct) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty) * + cartItem.OrderRate, + }; + } + return cartItem; + }); + } else { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProduct) { + return { + ...cartItem, + Offer: + sameBookingTypeProduct?.OrderQty * + cartItem.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + }; + } + return cartItem; + }); + } + } + + if (otherBookingTypeProduct) { + if (otherBookingTypeFreeProduct) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== otherBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === otherBookingTypeProduct.ProdId && + cartItem.InwardDtlId === + otherBookingTypeProduct.InwardDtlId && + cartItem.BookingTypeName === + otherBookingTypeProduct.BookingTypeName && + cartItem.OrderRate === + otherBookingTypeProduct.OrderRate && + cartItem.OfferMode && + cartItem.Offer > 0 + ) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty) * + cartItem.OrderRate, + }; + } + return cartItem; + }); + } else { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === otherBookingTypeProduct) { + return { + ...cartItem, + Offer: + otherBookingTypeProduct?.OrderQty * + cartItem.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + }; + } + return cartItem; + }); + } + } + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === editedProduct) { + return { + ...cartItem, + OrderQty: editedQty, + ...calculateTaxAmounts({ + qty: editedQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + ...(cartItem?.Offer > 0 && { + Offer: editedQty * cartItem.OrderRate, + }), + }; + } + return cartItem; + }); + dispatch(changeOrderCardDetails(updatedCart)); + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId && + product?.OfferId === + (sameBookingTypeFreeProduct?.OfferMessage?.[0]?.OfferId || + otherBookingTypeFreeProduct?.OfferMessage?.[0] + ?.OfferId) && + product?.OfferMode === + (sameBookingTypeFreeProduct?.OfferMode || + otherBookingTypeFreeProduct?.OfferMode) + ) { + return { + ...product, + FreeQty: finalOrderQty, + OverAllFreeQty: finalOrderQty, + RemainingQty: 0, + discount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeFreeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + (sameBookingTypeFreeProduct?.OfferMessage?.[0] + ?.OfferId || + otherBookingTypeFreeProduct?.OfferMessage?.[0] + ?.OfferId) && + offerProduct?.OfferMode === + (sameBookingTypeFreeProduct?.OfferMode || + otherBookingTypeFreeProduct?.OfferMode); + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: finalOrderQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: finalOrderQty, + ActualOfferAmount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferAmount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferValue: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + FreeProductsList: updatedFreeProductsList, + UsedCount: finalOrderQty * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch( + changeFullOfferAppliedProducts(updatedOfferAppliedProducts) + ); + } else if (totalFreeQtyInCart > freeQtyNeeded) { + let updatedCart = [...CartOrderDetails]; + if (sameBookingTypeProduct) { + // if available same booking type product qty is more than or equal to freeQtyNeeded. + // if more than then we need to update both free and paid product= + if (sameBookingTypeProduct?.OrderQty === freeQtyNeeded) { + if (sameBookingTypeFreeProduct) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== sameBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === sameBookingTypeProduct.ProdId && + cartItem.InwardDtlId === + sameBookingTypeProduct.InwardDtlId && + cartItem.BookingTypeName === + sameBookingTypeProduct.BookingTypeName && + cartItem.OrderRate === + sameBookingTypeProduct.OrderRate && + cartItem.OfferMode && + cartItem.Offer > 0 + ) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty) * + cartItem.OrderRate, + }; + } + return cartItem; + }); + } else { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProduct) { + return { + ...cartItem, + Offer: + sameBookingTypeProduct?.OrderQty * + cartItem.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + }; + } + return cartItem; + }); + } + } else if (sameBookingTypeProduct?.OrderQty > freeQtyNeeded) { + if (sameBookingTypeFreeProduct) { + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === sameBookingTypeProduct.ProdId && + cartItem.InwardDtlId === + sameBookingTypeProduct.InwardDtlId && + cartItem.BookingTypeName === + sameBookingTypeProduct.BookingTypeName && + cartItem.OrderRate === + sameBookingTypeProduct.OrderRate && + cartItem.OfferMode && + cartItem.Offer > 0 + ) { + return { + ...cartItem, + OrderQty: cartItem.OrderQty + freeQtyNeeded, + ...calculateTaxAmounts({ + qty: cartItem.OrderQty + freeQtyNeeded, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + freeQtyNeeded) * + cartItem.OrderRate, + }; + } else if (cartItem === sameBookingTypeProduct) { + return { + ...cartItem, + OrderQty: cartItem.OrderQty - freeQtyNeeded, + ...calculateTaxAmounts({ + qty: cartItem.OrderQty - freeQtyNeeded, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + }; + } + return cartItem; + }); + } else { + const remainingPaidQty = + sameBookingTypeProduct?.OrderQty - freeQtyNeeded; + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProduct) { + return { + ...cartItem, + OrderQty: remainingPaidQty, + ...calculateTaxAmounts({ + qty: remainingPaidQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + }; + } + return cartItem; + }); + const freeProduct = { + ...sameBookingTypeProduct, + OrderQty: freeQtyNeeded, + ...calculateTaxAmounts({ + qty: freeQtyNeeded, + rate: sameBookingTypeProduct.OrderRate, + taxPercentage: sameBookingTypeProduct.TaxPercentage, + }), + Offer: freeQtyNeeded * sameBookingTypeProduct.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + localId: uuidv4(), + }; + updatedCart = [...updatedCart, freeProduct]; + } + } + } + + if ( + otherBookingTypeProduct && + freeQtyNeeded > (sameBookingTypeProduct?.OrderQty || 0) + ) { + const remainingFreeQtyNeeded = + freeQtyNeeded - (sameBookingTypeProduct?.OrderQty || 0); + if ( + remainingFreeQtyNeeded === otherBookingTypeProduct?.OrderQty + ) { + if (otherBookingTypeFreeProduct) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== otherBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === otherBookingTypeProduct.ProdId && + cartItem?.InwardDtlId === + otherBookingTypeProduct.InwardDtlId && + cartItem?.BookingTypeName === + otherBookingTypeProduct.BookingTypeName && + cartItem?.OrderRate === + otherBookingTypeProduct.OrderRate && + cartItem?.OfferMode && + cartItem?.Offer > 0 + ) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty) * + cartItem.OrderRate, + }; + } + return cartItem; + }); + } else { + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === otherBookingTypeProduct.ProdId && + cartItem.InwardDtlId === + otherBookingTypeProduct.InwardDtlId && + cartItem.BookingTypeName === + otherBookingTypeProduct.BookingTypeName && + cartItem.OrderRate === + otherBookingTypeProduct.OrderRate && + cartItem.OfferMode && + cartItem.Offer > 0 + ) { + return { + ...cartItem, + Offer: cartItem.OrderQty * cartItem.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + }; + } + return cartItem; + }); + } + } else if ( + otherBookingTypeProduct?.OrderQty > remainingFreeQtyNeeded + ) { + if (otherBookingTypeFreeProduct) { + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === otherBookingTypeProduct.ProdId && + cartItem.InwardDtlId === + otherBookingTypeProduct.InwardDtlId && + cartItem.BookingTypeName === + otherBookingTypeProduct.BookingTypeName && + cartItem.OrderRate === + otherBookingTypeProduct.OrderRate && + cartItem.OfferMode && + cartItem.Offer > 0 + ) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty + remainingFreeQtyNeeded, + ...calculateTaxAmounts({ + qty: cartItem.OrderQty + remainingFreeQtyNeeded, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + remainingFreeQtyNeeded) * + cartItem.OrderRate, + }; + } else if (cartItem === otherBookingTypeProduct) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty - remainingFreeQtyNeeded, + ...calculateTaxAmounts({ + qty: cartItem.OrderQty - remainingFreeQtyNeeded, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + }; + } + return cartItem; + }); + } else { + const remainingPaidQty = + otherBookingTypeProduct?.OrderQty - + remainingFreeQtyNeeded; + const newFreeProduct = { + ...otherBookingTypeProduct, + OrderQty: remainingFreeQtyNeeded, + ...calculateTaxAmounts({ + qty: remainingFreeQtyNeeded, + rate: otherBookingTypeProduct.OrderRate, + taxPercentage: otherBookingTypeProduct.TaxPercentage, + }), + Offer: + remainingFreeQtyNeeded * + otherBookingTypeProduct.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + localId: uuidv4(), + }; + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === otherBookingTypeProduct) { + return { + ...cartItem, + OrderQty: remainingPaidQty, + ...calculateTaxAmounts({ + qty: remainingPaidQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + }; + } + return cartItem; + }); + updatedCart = [...updatedCart, newFreeProduct]; + } + } + } + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === editedProduct) { + return { + ...cartItem, + OrderQty: editedQty, + ...calculateTaxAmounts({ + qty: editedQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + ...(cartItem?.Offer > 0 && { + Offer: editedQty * cartItem.OrderRate, + }), + }; + } + return cartItem; + }); + dispatch(changeOrderCardDetails(updatedCart)); + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId && + product?.OfferId === + (sameBookingTypeFreeProduct?.OfferMessage?.[0]?.OfferId || + otherBookingTypeFreeProduct?.OfferMessage?.[0] + ?.OfferId) && + product?.OfferMode === + (sameBookingTypeFreeProduct?.OfferMode || + otherBookingTypeFreeProduct?.OfferMode) + ) { + return { + ...product, + FreeQty: finalOrderQty, + OverAllFreeQty: finalOrderQty, + RemainingQty: 0, + discount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || + otherBookingTypeProduct?.OfferMessage?.[0] + ?.OfferId) && + offerProduct?.OfferMode === + (sameBookingTypeProduct?.OfferMode || + otherBookingTypeProduct?.OfferMode); + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: finalOrderQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: finalOrderQty, + ActualOfferAmount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferAmount: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferValue: + finalOrderQty * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + FreeProductsList: updatedFreeProductsList, + UsedCount: finalOrderQty * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch( + changeFullOfferAppliedProducts(updatedOfferAppliedProducts) + ); + } else if (totalFreeQtyInCart < freeQtyNeeded) { + let updatedCart = [...CartOrderDetails]; + if (sameBookingTypeProduct) { + if (sameBookingTypeFreeProduct) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== sameBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === sameBookingTypeProduct.ProdId && + cartItem.InwardDtlId === + sameBookingTypeProduct.InwardDtlId && + cartItem.BookingTypeName === + sameBookingTypeProduct.BookingTypeName && + cartItem.OrderRate === + sameBookingTypeProduct.OrderRate && + cartItem.OfferMode && + cartItem.Offer > 0 + ) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty) * + cartItem.OrderRate, + }; + } + return cartItem; + }); + } else { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === sameBookingTypeProduct) { + return { + ...cartItem, + Offer: + (cartItem.OrderQty + + sameBookingTypeProduct?.OrderQty) * + cartItem.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + }; + } + return cartItem; + }); + } + } + + if (otherBookingTypeProduct) { + if (otherBookingTypeFreeProduct) { + updatedCart = updatedCart?.filter( + (cartItem) => cartItem !== otherBookingTypeProduct + ); + updatedCart = updatedCart?.map((cartItem) => { + if ( + cartItem.ProdId === otherBookingTypeProduct.ProdId && + cartItem.InwardDtlId === + otherBookingTypeProduct.InwardDtlId && + cartItem.BookingTypeName === + otherBookingTypeProduct.BookingTypeName && + cartItem.OrderRate === + otherBookingTypeProduct.OrderRate && + cartItem.OfferMode && + cartItem.Offer > 0 + ) { + return { + ...cartItem, + OrderQty: + cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty, + ...calculateTaxAmounts({ + qty: + cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + Offer: + (cartItem.OrderQty + + otherBookingTypeProduct?.OrderQty) * + cartItem.OrderRate, + }; + } + return cartItem; + }); + } else { + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === otherBookingTypeProduct) { + return { + ...cartItem, + Offer: + otherBookingTypeProduct?.OrderQty * + cartItem.OrderRate, + OfferMode: isFreeProductApplicable?.OfferMode, + OfferType: isFreeProductApplicable?.OfferType, + OfferMessage: [ + { + OfferId: isFreeProductApplicable?.OfferId, + OfferName: isFreeProductApplicable?.OfferName, + OfferDescription: + isFreeProductApplicable?.OfferDescription, + }, + ], + }; + } + return cartItem; + }); + } + } + updatedCart = updatedCart?.map((cartItem) => { + if (cartItem === editedProduct) { + return { + ...cartItem, + OrderQty: editedQty, + ...calculateTaxAmounts({ + qty: editedQty, + rate: cartItem.OrderRate, + taxPercentage: cartItem.TaxPercentage, + }), + ...(cartItem?.Offer > 0 && { + Offer: editedQty * cartItem.OrderRate, + }), + }; + } + return cartItem; + }); + dispatch(changeOrderCardDetails(updatedCart)); + const remainingQty = freeQtyNeeded - totalFreeQtyInCart; + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId && + product?.OfferId === + (sameBookingTypeFreeProduct?.OfferMessage?.[0]?.OfferId || + otherBookingTypeFreeProduct?.OfferMessage?.[0] + ?.OfferId) && + product?.OfferMode === + (sameBookingTypeFreeProduct?.OfferMode || + otherBookingTypeFreeProduct?.OfferMode) + ) { + return { + ...product, + FreeQty: finalOrderQty - remainingQty, + OverAllFreeQty: finalOrderQty, + RemainingQty: remainingQty, + discount: + (finalOrderQty - remainingQty) * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + const updatedOfferAppliedProducts = OfferAppliedProducts?.map( + (offerProduct) => { + // Check if this offer product contains the edited product in its free products list + const hasMatchingFreeProduct = + offerProduct?.FreeProductsList?.some((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + // Also check main offer conditions + const isMatchingOffer = + offerProduct?.OfferId === + (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || + otherBookingTypeProduct?.OfferMessage?.[0] + ?.OfferId) && + offerProduct?.OfferMode === + (sameBookingTypeProduct?.OfferMode || + otherBookingTypeProduct?.OfferMode); + + if (hasMatchingFreeProduct && isMatchingOffer) { + // Get loyalty points from the matching free product + const matchingFreeProduct = + offerProduct?.FreeProductsList?.find((freeProduct) => + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ) + ); + + const prodLoyaltyPoint = + matchingFreeProduct?.ProdVariantDetails?.[0] + ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; + + // Update the specific free product in the list + const updatedFreeProductsList = + offerProduct?.FreeProductsList?.map((freeProduct) => { + const isTargetFreeProduct = + freeProduct?.ProdVariantDetails?.some((variant) => + variant?.StockDetails?.some( + (stock) => + stock?.FreeInwardDtlId === + (sameBookingTypeProduct?.InwardDtlId || + otherBookingTypeProduct?.InwardDtlId) + ) + ); + + if (isTargetFreeProduct) { + return { + ...freeProduct, + FreeQty: finalOrderQty - remainingQty, + }; + } + return freeProduct; + }); + + return { + ...offerProduct, + ActualFreeQty: finalOrderQty - remainingQty, + ActualOfferAmount: + (finalOrderQty - remainingQty) * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferAmount: + (finalOrderQty - remainingQty) * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + OfferValue: + (finalOrderQty - remainingQty) * + (sameBookingTypeProduct?.OrderRate || + otherBookingTypeProduct?.OrderRate), + FreeProductsList: updatedFreeProductsList, + UsedCount: + (finalOrderQty - remainingQty) * prodLoyaltyPoint, + }; + } + + return offerProduct; + } + ); + dispatch( + changeFullOfferAppliedProducts(updatedOfferAppliedProducts) + ); + } + } else { + // just update the free product list + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice + ); + const updatedFreeProdList = FreeProdList?.map((product) => { + if ( + product?.ProdId === editedProduct?.ProdId && + product?.InwardDtlId === editedProduct?.InwardDtlId + ) { + return { + ...product, + OverAllFreeQty: finalOrderQty, + RemainingQty: finalOrderQty - product?.FreeQty, + discount: finalOrderQty * editedProduct?.OrderRate, + }; + } + return product; + }); + dispatch(ChangeFullFreeProductList(updatedFreeProdList)); + } + } + } + } else { + await handleNormalEditQuantity( + editedProduct, + editedProductIndex, + editedQty, + newPrice + ); + } + } + }; + + const handleNormalEditQuantity = async ( + editedProduct, + index, + qty, + newPrice = 0, + offerApply = false + ) => { + const fixedQty = Number(qty.toFixed(3)); + const updatedProduct = { + ...editedProduct, + OrderQty: fixedQty, + OrderRate: newPrice > 0 ? newPrice : editedProduct?.OrderRate, + ...calculateTaxAmounts({ + qty: qty, + rate: newPrice > 0 ? newPrice : editedProduct?.OrderRate, + taxPercentage: editedProduct?.TaxPercentage, + type: editedProduct?.Type, + product: editedProduct, + }), + PackageDtl: PackageDtl, + // ✅ FIXED: Proper conditional property assignment + ...(offerApply && { + Offer: qty * (newPrice > 0 ? newPrice : editedProduct?.OrderRate), + }), + }; + + if (hasOffer) { + const offers = validateOffers( + updatedProduct, + OverAllproductBasedOfferDatas, + CartOrderDetails, + TakAwayId, + DineinId + ); + if (!offers?.length) { + if (updatedProduct?.OfferType && updatedProduct?.Offer > 0) { + dispatch( + RemoveOfferAppliedProduct({ + ProdId: updatedProduct?.ProdId, + InwardDtlId: updatedProduct?.InwardDtlId, + OfferType: updatedProduct?.OfferType, + }) + ); + } + dispatch( + changeOrderCardDetails( + CartOrderDetails?.map((i) => + i?.InwardDtlId == updatedProduct?.InwardDtlId && + i?.BookingTypeName == updatedProduct?.BookingTypeName && + i?.localId === updatedProduct?.localId + ? { + ...updatedProduct, + Offer: 0, + OfferType: + updatedProduct?.Type === 'C' + ? updatedProduct?.OfferType + : null, + OfferMessage: null, + } + : i + ) + ) + ); + return; + } + + let bestOffer = null; + for (const offer of offers) { + if (!bestOffer || offer.OfferAmount > bestOffer.OfferAmount) { + bestOffer = offer; + } + } + + const UpdatedCartItemWithOffer = { + ...updatedProduct, + Offer: + bestOffer?.OfferMode === 'I' || bestOffer?.OfferMode === 'Q' + ? bestOffer?.OfferAmount || updatedProduct.Offer + : updatedProduct.Offer || bestOffer?.OfferAmount, + OfferType: updatedProduct?.OfferType || bestOffer?.OfferType, + OfferMessage: updatedProduct?.OfferMessage || bestOffer?.OfferMessage, + }; + + console.log(updatedProduct, 'updatedProduct'); + + const shouldRemove = (c) => + c.ProdId === updatedProduct.ProdId && + c.InwardDtlId === updatedProduct.InwardDtlId && + c.OrderRate === updatedProduct.OrderRate && + c.BookingTypeName === updatedProduct.BookingTypeName && + !c.SalesId && + ((c?.OfferModeType && c?.OfferMode === 'B' + ? true + : c?.OfferMode !== 'B') && + c?.OfferMode !== 'P' && + c?.OfferMode !== 'C' && + c?.OfferMode !== 'O' && + c?.OfferMode !== 'L' + ? true + : c?.Offer === 0); + + const filteredCart = CartOrderDetails?.filter((c) => !shouldRemove(c)); + const updatedCartData = [UpdatedCartItemWithOffer, ...filteredCart]; + + if (bestOffer) { + dispatch(ChangeOfferAppliedProducts(bestOffer)); + } + + dispatch(changeOrderCardDetails(updatedCartData)); + } else { + const updatedData = [...CartOrderDetails]; + updatedData[index] = updatedProduct; + dispatch(changeOrderCardDetails(updatedData)); + } + }; + + const calculateTaxAmounts = ({ + qty, + rate, + taxPercentage, + type = null, + product = {}, + isOfferApply = false, + }) => { + const { OfferType = null, OfferPrice = 0 } = product; + const totalAmount = qty * rate; + const taxAmount = ( + (totalAmount * taxPercentage) / + (100 + taxPercentage) + ).toFixed(2); + const withoutTaxRate = (totalAmount - taxAmount).toFixed(2); + const offerValue = + type === 'C' + ? OfferType === 'F' + ? qty * OfferPrice + : (qty * rate * OfferPrice) / 100 + : null; + + return { + TotalAmt: + type === 'C' && OfferPrice > 0 + ? totalAmount - (offerValue || 0) + : totalAmount, + TaxAmt: parseFloat(taxAmount), + WithoutTaxRate: parseFloat(withoutTaxRate), + OfferValue: offerValue, + }; + }; + const CloseModal = () => { + props.handleEditQuantityCancel(); + setClearQuantity(false); + }; + const onComplete = useCallback(() => { + setMessageData(null); + setMessageType(null); + }, []); + const onRadioBtnChange = (data) => { + setRadioBtnSelection(data); + }; + const onPercentageSelectionChange = (data) => { + setPercentageSelection(data); + setEditedPrice(0); + formRef.current?.resetFields(); + setDisableSubmitButton(false); + }; + const PriceChangefun = (data) => { + const enteredDiscount = parseFloat(data?.target.value); + if (enteredDiscount) { + const sellingPrice = parseFloat(props.Productdata?.SellingPrice || 0); + const limit = parseFloat(props.Productdata?.DiscountLimit || 0); + const limitType = props.Productdata?.DiscountLimitType; + + if (limit === null || limit === undefined || limit === 0) { + if (PercentageSelection == 'Fixed') { + if (parseFloat(enteredDiscount) < parseFloat(sellingPrice)) { + // setEditedPrice(enteredDiscount); + setEditedPrice( + parseFloat(sellingPrice) - parseFloat(enteredDiscount) + ); + setDisableSubmitButton(true); + } else { + setMessageType('error'); + setMessageData('Please Give less than value for sell price'); + setDisableSubmitButton(false); + setEditedPrice(0); + formRef.current?.resetFields(); + } + } else { + if (parseFloat(enteredDiscount) < 100) { + let temperc = + (parseFloat(enteredDiscount) * parseFloat(sellingPrice)) / 100; + setEditedPrice(parseFloat(sellingPrice) - parseFloat(temperc)); + setDisableSubmitButton(true); + } else { + setMessageType('error'); + setMessageData('Please Give less than 100% '); + setEditedPrice(0); + setDisableSubmitButton(false); + formRef.current?.resetFields(); + } + } + return; + } + + let maxDiscount = 0; + if (limitType === 'F') { + maxDiscount = sellingPrice - limit; + } else if (limitType === 'P') { + const afterdiscountfullamount = (sellingPrice * limit) / 100; + maxDiscount = sellingPrice - afterdiscountfullamount; + } + + if (PercentageSelection == 'Fixed') { + if (parseFloat(enteredDiscount) < parseFloat(sellingPrice)) { + if (sellingPrice - enteredDiscount === maxDiscount) { + setEditedPrice( + parseFloat(sellingPrice) - parseFloat(enteredDiscount) + ); + setDisableSubmitButton(true); + return; + } + + if (sellingPrice - enteredDiscount < sellingPrice - maxDiscount) { + setMessageType('error'); + setMessageData( + `Discount amount should not exeed ₹ ${(sellingPrice - maxDiscount).toFixed(2)}` + ); + setEditedPrice(0); + setDisableSubmitButton(true); + formRef.current?.resetFields(); + setDisableSubmitButton(false); + return; + } + + setEditedPrice( + parseFloat(sellingPrice) - parseFloat(enteredDiscount) + ); + setDisableSubmitButton(true); + } else { + setMessageType('error'); + setMessageData('Please Give less than value for sell price'); + setDisableSubmitButton(false); + setEditedPrice(0); + formRef.current?.resetFields(); + } + } else { + if (parseFloat(enteredDiscount) < 100) { + const discountAmount = (sellingPrice * enteredDiscount) / 100; + if (discountAmount > maxDiscount) { + setMessageType('error'); + setMessageData( + `Discount % should not exeed above ${(maxDiscount / sellingPrice) * 100} %` + ); + setEditedPrice(0); + setDisableSubmitButton(false); + formRef.current?.resetFields(); + return; + } + + let temperc = + (parseFloat(enteredDiscount) * parseFloat(sellingPrice)) / 100; + setEditedPrice(parseFloat(sellingPrice) - parseFloat(temperc)); + setDisableSubmitButton(true); + } else { + setMessageType('error'); + setMessageData('Please Give less than 100 '); + setEditedPrice(0); + setDisableSubmitButton(false); + formRef.current?.resetFields(); + } + } + } else { + setDisableSubmitButton(false); + setEditedPrice(0); + formRef.current?.resetFields(); + } + }; + const SellingPriceChange = (data) => { + if (data?.target.value) { + const sellingPrice = parseFloat(props.Productdata?.SellingPrice || 0); + const limit = parseFloat(props.Productdata?.DiscountLimit || 0); + const limitType = props.Productdata?.DiscountLimitType; + const enteredDiscount = parseFloat(data?.target.value); + + if (limit === null || limit === undefined || limit === 0) { + if ( + parseFloat(enteredDiscount) < parseFloat(sellingPrice) || + parseFloat(enteredDiscount) === parseFloat(sellingPrice) + ) { + setEditedPrice(enteredDiscount); + setDisableSubmitButton(true); + } else { + setMessageType('error'); + setMessageData('Please Give less than value for sell price'); + setDisableSubmitButton(false); + setEditedPrice(0); + formRef.current?.resetFields(); + } + return; + } + + let maxDiscount = 0; + if (limitType === 'F') { + maxDiscount = limit; + } else if (limitType === 'P') { + const afterdiscountfullamount = (sellingPrice * limit) / 100; + maxDiscount = afterdiscountfullamount; + } + + if (enteredDiscount === maxDiscount) { + setEditedPrice(data?.target.value); + setDisableSubmitButton(true); + return; + } + + if (enteredDiscount < maxDiscount) { + setMessageType('error'); + setMessageData(`You cannot sell below ₹${maxDiscount.toFixed(2)}`); + setEditedPrice(0); + setDisableSubmitButton(false); + return; + } + setDisableSubmitButton(true); + setEditedPrice(data?.target.value); + } else { + setDisableSubmitButton(false); + setEditedPrice(0); + } + }; + + const AddPacking = async (data) => { + console.log(data, 'Cartdata'); + setPackageDtl(data || []); + }; + + const handleWeightCalculation = async (data) => { + const { price, quantity } = data; + setQuantity(quantity); + setEditedPrice(price); + await handleWeightSubmit(quantity, price); + }; + + const handleWeightSubmit = async (qty, price) => { + await dispatch(changeHoldOrderDtl(false)); + await dispatch(changePreviousOrderLength(CartOrderDetails?.length)); + let localId = props.Index; + let editedProductIndex = CartOrderDetails?.findIndex( + (e) => e?.localId == localId + ); + const editedProduct = { + ...CartOrderDetails[editedProductIndex], + OrderQty: qty + }; + + await handleEditQuantity(editedProduct, editedProductIndex, editedProduct.OrderRate, qty); + props.handleEditQuantityCancel(); + setClearQuantity(false); + }; + const isKg = + props?.Productdata?.Size == 1 && + ["KG", "KGS"].includes(props?.Productdata?.UomName?.toUpperCase()); + + return ( +
+ + + // + //
+ } + open={EditOpen} + width={600} + footer={null} + children={ +
+
+
{ + if (RadioBtnSelection === 'Price' && !disableSubmitButton) { + return; + } + AddProductQuantity(values); + }} + > +
+
+

Item Name:

+
+
+

+ {' '} + {ItemData?.ProdName} +

+
+
+
+ {/* onRadioBtnChange(e)} + /> */} + {ItemData?.ScaleType !== 'weight' && ( + + )} + {PriceChangeaccess && ( + + )} + + + + {isKg && ()} + +
+ + {RadioBtnSelection == 'Quantity' && ( + <> +
+ + setQuantity(e.target.value)} + className="EditQuantity-Quantitybox" + /> + +
+
+
AddQuantity(1)}> + 1 +
+
AddQuantity(2)}> + 2 +
+
AddQuantity(3)}> + 3 +
+ +
AddQuantity(4)}> + 4 +
+
AddQuantity(5)}> + 5 +
+
AddQuantity(6)}> + 6 +
+ +
AddQuantity(7)}> + 7 +
+
AddQuantity(8)}> + 8 +
+
AddQuantity(9)}> + 9 +
+
+
AddQuantity(0)}> + 0 +
+
+
+ + )} + {RadioBtnSelection == 'Price' && ( +
+ + + {!RadioDetails && ( + { + await validateSafeInput(value); + + if (value && value.length > 10) { + return Promise.reject( + 'Selling Price should not exceed 10 characters' + ); + } + + return Promise.resolve(); + }, + }, + ]} + > + { + const cleanedValue = e.target.value.replace( + /[^0-9.]/g, + '' + ); + const parts = cleanedValue.split('.'); + e.target.value = + parts.length > 2 + ? `${parts[0]}.${parts.slice(1).join('')}` + : cleanedValue; + }} + // isOnChange={formType == "edit" || formRef.current?.getFieldsValue()?.CustName ? true : false} + /> + + )} + +
+ More +
+ {RadioDetails && ( + <> +
+ { + onPercentageSelectionChange(e); + }} + /> +
+
+ + { + await validateSafeInput(value); // To block HTML tags & SQL keywords + return Promise.resolve(); + }, + }, + ]} + > + PriceChangefun(e)} + inputMode="decimal" + onInput={(e) => { + const cleanedValue = e.target.value.replace( + /[^0-9.]/g, + '' + ); + const parts = cleanedValue.split('.'); + e.target.value = + parts.length > 2 + ? `${parts[0]}.${parts.slice(1).join('')}` + : cleanedValue; + }} + // isOnChange={formType == "edit" || formRef.current?.getFieldsValue()?.CustName ? true : false} + /> + + {/* PriceChangefun(e)} + className="EditQuantity-Pricebox" + /> */} + +
+
+
+ {' '} + Price: {safeRound(editedPrice ? editedPrice : 0)} +
+
+ + )} +
+ )} + {RadioBtnSelection == 'Parcel' && ( + <> + AddPacking(data)} + PackageDtl={PackageDtl} + CurrentData={ItemData?.PackageDtl} + localId={ItemData?.localId} + /> + + )} + {RadioBtnSelection == 'AddWeight' && ( + <> + + + )} +
+ {((RadioBtnSelection == 'Price' && disableSubmitButton) || + RadioBtnSelection == 'Quantity') && ( + } + > + )} +
+ +
+ } + handleCancel={CloseModal} + /> +
+ ); +}; +export default BSBillingEditQuantity; From 990c60975bee20a2ab5e5cc4b24b86b7aae92b07 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:23:50 +0530 Subject: [PATCH 11/12] create new component amt and qnt calculation --- .../WeightCalculatePrice.jsx | 3883 +---------------- 1 file changed, 108 insertions(+), 3775 deletions(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx index f4b35e8..f9e0d20 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx @@ -1,3801 +1,134 @@ -import { useCallback, useEffect, useRef, useState } from 'react'; -import { shallowEqual, useDispatch, useSelector } from 'react-redux'; -import { DefaultModal } from '../../../../../Components/Modal/DefaultModal'; -import FormHeader from '../../../../PageComponents/FormHeader.jsx'; -import { Form } from 'antd'; -import { - GlobalOrderCardDetails, - changeOrderCardDetails, - changeHoldOrderDtl, - changePreviousOrderLength, - GlobalOrderType, - GlobalReorderProductDetails, - PreferenceData, - getConfigType, -} from '../../../../../Features/BookingScreen/BookingData/BookingData'; -import { ArrowRightOutlined } from '@ant-design/icons'; -import { Messages } from '../../../../../Components/Notifications/Messages'; -import '../../../../../Styles/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.scss'; -import { settingDataSelector } from '../../../../../Features/PreferenceMaster/PreferenceMaster.js'; -import { RadioGrpButton } from '../../../../../Components/Forms/RadioGroup.jsx'; -import Buttons from '../../../../../Components/Forms/Buttons.jsx'; +import { useState, useEffect, useRef } from 'react'; import { InputField } from '../../../../../Components/Forms/InputField.jsx'; -import { useApplyOfferto_CardDetail } from '../../UtillComponents/BSNavBarOffer/BSNavBarOffer_CustomHooks.jsx'; -import { - getTemplateData, - StoredSessionData, -} from '../../../../../Features/ThemeChange/ThemeChange.js'; -import { validateSafeInput } from '../../../../../Services/Others.js'; -import { GlobalEmpAccessDetail } from '../../../../../Features/AppPage/CenterPage.js'; -import Packing from './BSPacking.jsx'; -// import { ApplicationPreferences } from '../../../../../Features/BrachLogin/BranchLogin.js'; -import { - ChangeFullFreeProductList, - changeFullOfferAppliedProducts, - ChangeOfferAppliedProducts, - changeOfferAppliedProductsForLoyalty, - GlobalFreeProdList, - GlobalOfferAppliedProducts, - RemoveOfferAppliedProduct, -} from '../../../../../Features/Offer/Offernew/BookingOffernew.js'; -import { validateOffers } from '../../BSItemCards/ValidateOffer.jsx'; -import { v4 as uuidv4 } from 'uuid'; -import WeightCalculatePrice from './WeightCalculatePrice.jsx'; +import { Form } from 'antd'; +import Buttons from '../../../../../Components/Forms/Buttons.jsx'; +import { ArrowRightOutlined } from '@ant-design/icons'; -const BSBillingEditQuantity = (props) => { - console.log(props?.Productdata.UomName, 'hfghfvbufvbfdviv', props?.Productdata.Size); +const WeightCalculatePrice = ({ itemData, CartOrderDetails, onSubmit }) => { + const [enteredPrice, setEnteredPrice] = useState(''); + const [calculatedQty, setCalculatedQty] = useState(0); + const priceInputRef = useRef(null); + const [form] = Form.useForm(); - const dispatch = useDispatch(); - const formRef = useRef(null); - const quantityInputRef = useRef(null); - const priceChangeInputRef = useRef(null); - const reductionInputRef = useRef(null); - - const { setIndex = () => { } } = props; - - - const [disableSubmitButton, setDisableSubmitButton] = useState(false); - const SessionData = useSelector(StoredSessionData); - // const AppId = SessionData?.AppId; - // const CompId = SessionData?.CompId; - // const BranchId = SessionData?.BranchId; - const UserType = SessionData?.UserType; - const applyOffer = useApplyOfferto_CardDetail(); - const preferenceDatas = useSelector(PreferenceData); - const EmpAccessDetail = useSelector(GlobalEmpAccessDetail); - const OverAllproductBasedOfferDatas = useSelector( - (state) => state?.BookingOFferNew?.OverAllProductBasedProducts, - shallowEqual - ); - const preferenceOffer = - preferenceDatas?.[0]?.['SettingDtlDetails']?.find( - (item) => item.SettingIdName === 'Offer' - )?.SettingValue === 'Y'; - const preferenceshortcutkey = preferenceDatas?.[0]?.[ - 'SettingDtlDetails' - ]?.some( - (item) => - item.SettingIdName.toLowerCase() === 'shortcutkeys' && - item.SettingValue === 'Y' - ); - console.log(preferenceshortcutkey, 'preferenceshortcutkey'); - const [PriceChangeaccess, setPriceChangeaccess] = useState(true); - - const [ConfigDataList, setConfigDataList] = useState([]); - const [messageType, setMessageType] = useState(null); - const [messageData, setMessageData] = useState(null); - const [EditOpen, setEditOpen] = useState(props?.BSBillingEditQuantity); - const [ItemData, setItemData] = useState(props?.Productdata); - const [Quantity, setQuantity] = useState( - props?.Productdata?.ScaleType !== 'weight' - ? parseInt(props.Productdata.OrderQty) - : props.Productdata.OrderQty - ); - const ReorderProductData = useSelector(GlobalReorderProductDetails); - const templateData = useSelector(getTemplateData); - const OfferCheckedInSetup = - templateData?.BookingNavbar?.[1].some( - (item) => item?.OptionName == 'Offer' - ) || - templateData?.BookingCombo1?.[1]?.some( - (item) => item?.OptionName == 'Offer' - ); - const [ClearQuantity, setClearQuantity] = useState(false); - const CartOrderDetails = useSelector(GlobalOrderCardDetails); - const SettingDataSelector = useSelector(PreferenceData); - const OrderType = useSelector(GlobalOrderType); - const [BillOrderPre, setBillOrderPre] = useState(null); - const [RadioBtnSelection, setRadioBtnSelection] = useState( - props?.shortKeyMethod == 'price' - ? 'Price' - : ItemData?.ScaleType !== 'weight' - ? 'Quantity' - : PriceChangeaccess - ? 'Price' - : 'Parcel' - ); - const [PercentageSelection, setPercentageSelection] = useState('Fixed'); - const [RadioDetails, setRadioDetails] = useState(false); - const [editedPrice, setEditedPrice] = useState(0); - const allowDecimal = preferenceDatas?.[0]?.SettingDtlDetails?.find( - (setting) => - setting?.SettingIdName?.toLowerCase() === 'decimal' && - setting?.SettingValue === 'Y' - ); - const [PackageDtl, setPackageDtl] = useState([]); - // const appPreferences = useSelector(ApplicationPreferences); - // const bookingTypePreference = appPreferences?.find((preference) => preference?.PreferredCatName === 'Booking Type')?.PreferenceCatDetails - // const dinePreference = bookingTypePreference?.find((type) => type?.PreferredSubCatName?.toLowerCase() === "dine in" && type?.PreferredStatus === 'Y') - // const takeAwayPreference = bookingTypePreference?.find((type) => type?.PreferredSubCatName?.toLowerCase() === "take away" && type?.PreferredStatus === 'Y') - const OfferAppliedProducts = useSelector( - GlobalOfferAppliedProducts, - shallowEqual - ); - const FreeProdList = useSelector(GlobalFreeProdList); - console.log(CartOrderDetails, 'CartOrderDetails'); - - const TakAwayId = ConfigDataList?.find( - (a) => a?.ConfigName === 'TakeAway' - )?.ConfigId; - - const DineinId = ConfigDataList?.find( - (a) => a?.ConfigName === 'Dine In' - )?.ConfigId; - - const hasOffer = preferenceOffer && OfferCheckedInSetup; + const basePrice = parseFloat(itemData?.OrderRate || itemData?.SellingPrice || 0); useEffect(() => { - if (ConfigDataList?.length === 0) { - getBookingTypeId(); - } + setTimeout(() => { + const inputElement = priceInputRef.current?.querySelector('input'); + if (inputElement) { + inputElement.focus(); + } + }, 100); }, []); - useEffect( - () => { - setEditOpen(props.BSBillingEditQuantity); - setItemData(props.Productdata); - setQuantity( - props?.Productdata?.ScaleType !== 'weight' - ? parseInt(props.Productdata.OrderQty) - : props.Productdata.OrderQty - ); - }, - [props.BSBillingEditQuantity], - [props.Productdata] - ); + // Calculate quantity based on entered price + const handlePriceChange = (e) => { + const value = e.target.value; + setEnteredPrice(value); - useEffect(() => { - if (preferenceshortcutkey) { - if (props.BSBillingEditQuantity && RadioBtnSelection === 'Quantity') { - setTimeout(() => { - quantityInputRef.current?.focus(); - }, 100); - } - - if (props.BSBillingEditQuantity && RadioBtnSelection === 'Price') { - setTimeout(() => { - if (RadioDetails) { - const inputElement = - reductionInputRef.current?.querySelector('input'); - inputElement?.focus(); - } else { - const inputElement = - priceChangeInputRef.current?.querySelector('input'); - inputElement?.focus(); - } - }, 100); - } - } - }, [ - RadioBtnSelection, - props.BSBillingEditQuantity, - RadioDetails, - preferenceshortcutkey, - ]); - - useEffect(() => { - const handleKeyDown = (event) => { - if (preferenceshortcutkey && event.shiftKey && event.key === 'E') { - event.preventDefault(); - if (PriceChangeaccess && props.Productdata?.Offer <= 0) { - onRadioBtnChange('Price'); - } - } - }; - - if (EditOpen) { - document.addEventListener('keydown', handleKeyDown); - } - - return () => { - document.removeEventListener('keydown', handleKeyDown); - }; - }, [ - EditOpen, - preferenceshortcutkey, - PriceChangeaccess, - props.Productdata?.Offer, - ]); - - useEffect(() => { - const BillOrder = SettingDataSelector?.[0]?.SettingDtlDetails?.find( - (item) => item.SettingIdName === 'BillItemsOrder' - ); - setBillOrderPre(BillOrder?.SettingValue); - }, []); - - useEffect(() => { - if (UserType == 'Employee') { - const Pricechange = EmpAccessDetail?.filter( - (item) => item.ConfigName === 'Sales Discount' - ); - - setPriceChangeaccess(Pricechange?.[0]?.AddAccess != 'Y' ? false : true); - } - }, [EmpAccessDetail]); - - useEffect(() => { - if (PackageDtl.length > 0) { - AddProductQuantity(); - } - }, [PackageDtl]); - - const getBookingTypeId = async () => { - let tempconfigdata = await dispatch( - getConfigType({ TypeName: 'Booking Type' }) - ).unwrap(); - - if (tempconfigdata?.data?.statusCode == 1) { - setConfigDataList(tempconfigdata?.data?.data); - } - }; - - function safeRound(amountStr) { - if (amountStr == null) return allowDecimal ? '0.00' : '0'; - - const cleaned = String(amountStr).replace(/[^0-9.-]+/g, ''); - const num = Number(cleaned); - - if (isNaN(num)) return allowDecimal ? '0.00' : '0'; - - return allowDecimal ? num.toFixed(2) : Math.round(num).toString(); - } - const AddQuantity = (value) => { - if (ClearQuantity === false) { - setQuantity(value); - setClearQuantity(true); + if (value && basePrice > 0) { + const price = parseFloat(value); + const qty = price / basePrice; + setCalculatedQty(qty); } else { - setQuantity(Quantity.toString() + value.toString()); - if (Quantity?.length > 10) { - setMessageType('error'); - setMessageData('Quantity is to long'); - setQuantity(''); - } + setCalculatedQty(0); } }; - const Removevalue = () => { - let tempremovedata = Quantity.toString().substring(0, Quantity?.length - 1); - setQuantity(tempremovedata); - }; - const openRadioDetails = () => { - setDisableSubmitButton(false); - setRadioDetails(!RadioDetails); - setEditedPrice(0); - }; - // const AddQuantityonly = () => { - // setMessageType('success'); - // setMessageData('Quantity Added'); - // }; - - const createUpdatedCartItem = (cartItem, quantity, newPrice) => { - const qty = parseInt(quantity); - const rate = parseFloat(newPrice); - const offerType = cartItem?.OfferType; - const offerPrice = cartItem?.OfferPrice || 0; - const taxPercent = cartItem?.TaxPercentage || 0; - - const baseAmount = qty * rate; - - const offerValue = - offerType === 'F' ? qty * offerPrice : (baseAmount * offerPrice) / 100; - - const totalAmt = - cartItem?.OfferPrice > 0 ? baseAmount - offerValue : baseAmount; - - const taxAmt = (baseAmount * taxPercent) / (100 + taxPercent); - const withoutTax = baseAmount - taxAmt; - - return { - ...cartItem, - OrderQty: qty, - OrderRate: rate, - TotalAmt: totalAmt, - OfferValue: offerValue, - TaxAmt: taxAmt.toFixed(2), - WithoutTaxRate: withoutTax.toFixed(2), - PackageDtl: PackageDtl, - }; - }; - - const calculateOverAllQty = (item, filterItems) => { - if (!item) return 0; - - const totalUsedQty = - filterItems?.reduce((acc, card) => { - if (card?.StockAvailable !== 'Y') return acc; - - const isSinglePcItem = item?.SinglePc === 'Y'; - const isSinglePcCard = card?.SinglePc === 'Y'; - - let qty = 0; - if (isSinglePcItem) { - qty = isSinglePcCard ? card.OrderQty : card.OrderQty * card.NoOfPcs; - } else { - if (isSinglePcCard) { - const remainder = card?.OverAllPcs % card?.NoOfPcs; - qty = - remainder >= card?.OrderQty - ? 0 - : Math.ceil(card?.OrderQty / card?.NoOfPcs); - } else { - qty = card.OrderQty; - } - } - return acc + qty; - }, 0) || 0; - - const availableQty = - item?.SinglePc === 'Y' ? item?.OverAllPcs : item?.BalanceQty; - return availableQty - totalUsedQty; - }; - - const MergecardItem = (cartItem, BillOrderPre, OtherorderDataforNormal) => { - const updatedCart = {}; - let updatedItemKey = null; - - // Add existing items to the map - OtherorderDataforNormal?.forEach((item) => { - const key = `${item?.ProdId}-${item?.InwardDtlId}-${item?.BookingTypeName}-${item?.OrderRate}`; - if (!updatedCart[key]) { - updatedCart[key] = { ...item }; - } - }); - - // Merge or add new item - const key = `${cartItem?.ProdId}-${cartItem?.InwardDtlId}-${cartItem?.BookingTypeName}-${cartItem?.OrderRate}`; - if (updatedCart[key]) { - updatedCart[key].OrderQty += cartItem?.OrderQty; - } else { - updatedCart[key] = { ...cartItem }; - } - updatedItemKey = key; - - // Recalculate total amounts - Object.values(updatedCart).forEach((item) => { - const orderQty = item.OrderQty; - const orderRate = item.OrderRate; - const taxPercentage = item?.TaxPercentage || 0; - item.TotalAmt = orderQty * orderRate; - item.TaxAmt = ( - (orderQty * orderRate * taxPercentage) / - (100 + taxPercentage) - ).toFixed(2); - item.WithoutTaxRate = orderQty * orderRate - parseFloat(item.TaxAmt); - }); - - let updatedArray = Object.values(updatedCart); - - // Ensure updated item appears first - if (BillOrderPre === 'Y' && updatedItemKey) { - const updatedItem = updatedCart[updatedItemKey]; - updatedArray = [ - updatedItem, - ...updatedArray?.filter((item) => item !== updatedItem), - ]; + const handleSubmit = (e) => { + if (e && e.preventDefault) { + e.preventDefault(); } - return updatedArray; - }; - - const AddProductQuantity = async () => { - let newPrice = editedPrice > 0 ? editedPrice : props.Productdata.OrderRate; - await dispatch(changeHoldOrderDtl(false)); - await dispatch(changePreviousOrderLength(CartOrderDetails?.length)); - - if ( - (parseInt(Quantity) === 0 || Quantity === '') && - props?.Productdata?.ScaleType !== 'weight' - ) { - setMessageType('error'); - setMessageData('Please enter valid quantity'); - setQuantity(''); - } else { - let localId = props.Index; - const editedQty = - props?.Productdata?.ScaleType !== 'weight' - ? parseInt(Quantity) - : props.Productdata.OrderQty; - let editedProductIndex = CartOrderDetails?.findIndex( - (e) => e?.localId == localId - ); - const editedProduct = CartOrderDetails[editedProductIndex]; - const productBookingType = editedProduct?.BookingTypeName; - const isItemInCart = CartOrderDetails?.find( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - !cartItem?.SalesId - ); - // changing for one piece stock checking - const isItemInCartfilter = CartOrderDetails?.filter( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate !== editedProduct?.OrderRate && - !cartItem?.SalesId - ); - - const isItemInCartHold = CartOrderDetails?.find( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName - ); // check if the item is already in the cart - const isItemInCartHoldfilter = CartOrderDetails?.filter( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - !( - (cartItem?.OrderRate === editedProduct?.OrderRate) - // && cartItem?.BookingTypeName === editedProduct?.BookingTypeName - ) - ); - - if ( - (isItemInCart && - productBookingType !== 'Dine In' && - OrderType != 'Hold') || - (isItemInCart && - productBookingType === 'Dine In' && - OrderType != 'Hold') - ) { - // let onePcsQtyOther = 0; - // if (editedProduct?.SinglePc === 'Y') { - // // check if there is same rate product in other booking type - // const sameRateProductInOtherBookingType = CartOrderDetails?.find( - // (cartItem) => - // cartItem?.ProdId === editedProduct?.ProdId && - // cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - // cartItem?.OrderRate === editedProduct?.OrderRate && - // cartItem?.BookingTypeName !== editedProduct?.BookingTypeName && - // !cartItem?.SalesId - // ) - // if (sameRateProductInOtherBookingType?.StockAvailable === 'Y') { - // onePcsQtyOther = sameRateProductInOtherBookingType?.OrderQty; - // } - // } - const overAllQuantity = calculateOverAllQty( - isItemInCart, - isItemInCartfilter - ); - let totalUsedQty = 0; - const sameProductInOtherBookingType = CartOrderDetails?.filter( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName && - !cartItem?.SalesId - ); - if (editedProduct?.Offer > 0) { - // check same product available in paid product - const sameProductAsPaidInSameBookingType = CartOrderDetails?.filter( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - !cartItem?.SalesId && - !cartItem?.OfferMode && - cartItem?.Offer === 0 - ); - - if (sameProductAsPaidInSameBookingType?.length > 0) { - const stockAvailable = sameProductAsPaidInSameBookingType?.some( - (item) => item?.StockAvailable === 'Y' - ); - if (stockAvailable) { - totalUsedQty = sameProductAsPaidInSameBookingType?.reduce( - (acc, item) => { - if (item?.StockAvailable === 'Y') { - return acc + parseInt(item?.OrderQty); - } - return acc; - }, - 0 - ); - } - } - } else if (!editedProduct?.Offer) { - const sameProductAsFree = CartOrderDetails?.filter( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - !cartItem?.SalesId && - cartItem?.Offer > 0 && - cartItem?.OfferMode - ); - - if (sameProductAsFree?.length > 0) { - const stockAvailable = sameProductAsFree?.some( - (item) => item?.StockAvailable === 'Y' - ); - if (stockAvailable) { - totalUsedQty = sameProductAsFree?.reduce((acc, item) => { - if (item?.StockAvailable === 'Y') { - return acc + parseInt(item?.OrderQty); - } - return acc; - }, 0); - } - } - } - - if (sameProductInOtherBookingType?.length > 0) { - const stockAvailable = sameProductInOtherBookingType?.some( - (item) => item?.StockAvailable === 'Y' - ); - if (stockAvailable) { - totalUsedQty += sameProductInOtherBookingType?.reduce( - (acc, item) => { - if (item?.StockAvailable === 'Y') { - return acc + parseInt(item?.OrderQty); - } - return acc; - }, - 0 - ); - } - } - - if ( - overAllQuantity < editedQty + (totalUsedQty || 0) && - isItemInCart?.StockAvailable === 'Y' - ) { - setMessageType('error'); - setMessageData('Stock Not Available'); - return; - } - } else if (isItemInCartHold && OrderType === 'Hold') { - const holddataproduct = ReorderProductData?.filter( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId - ); - - let totalSelectedProductQty = holddataproduct?.reduce( - (accumulator, card) => { - return ( - accumulator + - parseInt( - card?.StockAvailable === 'Y' - ? editedProduct?.SinglePc === 'Y' - ? card.SinglePc !== 'Y' - ? card.OrderQty * card.NoOfPcs - : card.OrderQty - : card.SinglePc !== 'Y' - ? card.OrderQty - : card.OverAllPcs % card.NoOfPcs >= card.OrderQty - ? 0 - : card.OrderQty % card.NoOfPcs === 0 - ? Math.floor(card.OrderQty / card.NoOfPcs) - : Math.floor(card.OrderQty / card.NoOfPcs) + 1 - : 0 - ) - ); - }, - 0 - ); - - let totalUsedQty = 0; - - const sameProductInOtherBookingType = CartOrderDetails?.filter( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName - ); - - if (editedProduct?.Offer > 0) { - // check same product available in paid product - const sameProductAsPaid = CartOrderDetails?.find( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - !cartItem?.OfferMode && - cartItem?.Offer === 0 - ); - - if (sameProductAsPaid?.StockAvailable === 'Y') { - totalUsedQty = sameProductAsPaid?.OrderQty; - } - } else if (!editedProduct?.Offer) { - const sameProductAsFree = CartOrderDetails?.find( - (cartItem) => - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - cartItem?.Offer > 0 && - cartItem?.OfferMode - ); - if (sameProductAsFree?.StockAvailable === 'Y') { - totalUsedQty = sameProductAsFree?.OrderQty; - } - } - - if (sameProductInOtherBookingType?.length > 0) { - const stockAvailable = sameProductInOtherBookingType?.some( - (item) => item?.StockAvailable === 'Y' - ); - if (stockAvailable) { - totalUsedQty += sameProductInOtherBookingType?.reduce( - (acc, item) => { - if (item?.StockAvailable === 'Y') { - return acc + parseInt(item?.OrderQty); - } - return acc; - }, - 0 - ); - } - } - - let overAllQuantityHold = - calculateOverAllQty(isItemInCartHold, isItemInCartHoldfilter) + - totalSelectedProductQty; - if ( - isItemInCartHold?.StockAvailable === 'Y' && - overAllQuantityHold < editedQty + (totalUsedQty || 0) - ) { - setMessageType('error'); - setMessageData('Stock Not Available'); - return; - } - } - await handleEditQuantity(editedProduct, editedProductIndex, newPrice); - props.handleEditQuantityCancel(); - setClearQuantity(false); - } - setIndex(null); - }; - - const handleEditQuantity = async ( - editedProduct, - editedProductIndex, - newPrice, - overrideQty = null - ) => { - const editedQty = overrideQty !== null - ? overrideQty - : props?.Productdata?.ScaleType !== 'weight' - ? parseInt(Quantity) - : props.Productdata.OrderQty; - const addFirst = BillOrderPre === 'Y'; - const isExistsInFreeProdList = FreeProdList?.find( - (product) => - product?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) && - editedProduct?.OfferMessage?.[0]?.OfferId === product?.OfferId && - editedProduct?.OfferMode === product?.OfferMode - ); - console.log(FreeProdList, 'FreeProdList'); - - if ( - isExistsInFreeProdList && - editedProduct?.Offer > 0 && - hasOffer && - editedProduct?.SinglePc !== 'Y' - ) { - const freeProductInOtherBooking = CartOrderDetails?.find((cartItem) => { - return ( - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OfferMessage?.[0]?.OfferId === - editedProduct?.OfferMessage?.[0]?.OfferId && - cartItem?.OfferMode === editedProduct?.OfferMode && - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName - ); + if (enteredPrice && calculatedQty > 0) { + console.log('Submitting weight calculation:', { + price: parseFloat(enteredPrice), + quantity: calculatedQty, }); - const finalOrderQty = - (freeProductInOtherBooking?.OrderQty || 0) + editedQty; - - if (isExistsInFreeProdList?.RemainingQty === 0) { - // need to split the free product and paid product - - if (finalOrderQty > isExistsInFreeProdList?.OverAllFreeQty) { - const paidQty = - finalOrderQty - isExistsInFreeProdList?.OverAllFreeQty; - const isAlreadyExistsInCart = CartOrderDetails?.findIndex( - (cartItem) => { - return ( - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - !cartItem?.OfferMode && - cartItem?.Offer === 0 && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - cartItem?.OrderRate === editedProduct?.OrderRate - ); - } - ); - - let updatedCart = [...CartOrderDetails]; - - if (isAlreadyExistsInCart !== -1) { - // update the existing paid product in cart - const existingItem = updatedCart[isAlreadyExistsInCart]; - const updatedItem = { - ...existingItem, - OrderQty: existingItem?.OrderQty + paidQty, - ...calculateTaxAmounts({ - qty: existingItem?.OrderQty + paidQty, - rate: existingItem?.OrderRate, - taxPercentage: existingItem?.TaxPercentage, - }), - }; - updatedCart?.splice(isAlreadyExistsInCart, 1); - updatedCart = addFirst - ? [updatedItem, ...updatedCart] - : [...updatedCart, updatedItem]; - } else { - // add new paid product in cart - const paidProduct = { - localId: uuidv4(), - ...editedProduct, - OrderQty: paidQty, - Offer: 0, - OfferMode: null, - OfferMessage: null, - OfferType: null, - ...calculateTaxAmounts({ - qty: paidQty, - rate: editedProduct.OrderRate, - taxPercentage: editedProduct.TaxPercentage, - }), - }; - updatedCart = addFirst - ? [paidProduct, ...updatedCart] - : [...updatedCart, paidProduct]; - } - dispatch(changeOrderCardDetails(updatedCart)); - } else { - // Check if there is any same product but No offer applied in OrderCardDtls in same BookingType - // In Same BookingType Have Enough Free Qty Just only Update Qty in Same Booking Type OtherWise need to update in Other Booking Type Qty also if exists in Other Booking Type - const isAlreadyExistsInCart = CartOrderDetails?.find((cartItem) => { - return ( - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - !cartItem?.OfferMode && - cartItem?.Offer === 0 - ); - }); - - const freeQtyNeeded = - isExistsInFreeProdList?.OverAllFreeQty - finalOrderQty; - const paidQtySame = isAlreadyExistsInCart?.OrderQty || 0; - - if (paidQtySame >= freeQtyNeeded) { - const remainingPaidQty = (paidQtySame || 0) - freeQtyNeeded; - if (remainingPaidQty === 0) { - // Just need to update the Free Qty and Remove the Paid Product from Cart - const updatedCart = CartOrderDetails?.filter( - (cartItem) => cartItem !== isAlreadyExistsInCart - ); - dispatch( - changeOrderCardDetails( - updatedCart?.map((cartItem) => { - if (cartItem === editedProduct) { - return { - ...cartItem, - PackageDtl: PackageDtl, - }; - } - return cartItem; - }) - ) - ); - } else { - // need to update the Paid Qty to Remaining Qty - const updatedCart = CartOrderDetails?.map((cartItem) => { - if (cartItem === isAlreadyExistsInCart) { - return { - ...cartItem, - OrderQty: remainingPaidQty, - ...calculateTaxAmounts({ - qty: remainingPaidQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - }; - } - return cartItem; - }); - dispatch(changeOrderCardDetails(updatedCart)); - } - } else { - // check if the same product exists in other booking type as paid product - // need to calculate how much qty going to be updated in other booking type and same booking type - - const diffBookingTypeProduct = CartOrderDetails?.find( - (cartItem) => { - return ( - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName !== - editedProduct?.BookingTypeName && - !cartItem?.OfferMode && - cartItem?.Offer === 0 - ); - } - ); - - const diffBookingTypeFreeProduct = CartOrderDetails?.find( - (cartItem) => { - return ( - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.OrderRate === editedProduct?.OrderRate && - cartItem?.BookingTypeName !== - editedProduct?.BookingTypeName && - cartItem?.OfferMode === editedProduct?.OfferMode && - cartItem?.Offer > 0 - ); - } - ); - - const paidQtyOther = diffBookingTypeProduct?.OrderQty || 0; - const sameBookTypeUpdateQty = freeQtyNeeded - paidQtySame; - const otherBookTypePaidUpdateQty = - paidQtyOther - sameBookTypeUpdateQty; - const totalPaidQty = paidQtySame + paidQtyOther; - - if (paidQtySame || paidQtyOther) { - let updatedCart = [...CartOrderDetails]; - - // Remove paid product in same booking type if needed - if (paidQtySame) { - updatedCart = updatedCart.filter( - (cartItem) => cartItem !== isAlreadyExistsInCart - ); - updatedCart = updatedCart.map((cartItem) => { - if (cartItem === editedProduct) { - return { - ...cartItem, - OrderQty: editedQty + paidQtySame, - ...calculateTaxAmounts({ - qty: editedQty + paidQtySame, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - ...(cartItem?.Offer > 0 && { - Offer: (editedQty + paidQtySame) * cartItem.OrderRate, - }), - }; - } - return cartItem; - }); - } - - // Remove/update paid product in other booking type if needed - if (paidQtyOther) { - if (otherBookTypePaidUpdateQty <= 0) { - // Remove paid product from other booking type - updatedCart = updatedCart.filter( - (cartItem) => cartItem !== diffBookingTypeProduct - ); - updatedCart = updatedCart.map((cartItem) => { - if (cartItem === diffBookingTypeFreeProduct) { - return { - ...cartItem, - OrderQty: paidQtyOther + cartItem?.OrderQty, - ...calculateTaxAmounts({ - qty: paidQtyOther + cartItem?.OrderQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - Offer: - (paidQtyOther + cartItem?.OrderQty) * - cartItem?.OrderRate, - }; - } else if (cartItem === editedProduct) { - return { - ...cartItem, - OrderQty: editedQty, - ...calculateTaxAmounts({ - qty: editedQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - Offer: editedQty * cartItem?.OrderRate, - }; - } - return cartItem; - }); - } else if (otherBookTypePaidUpdateQty > 0) { - updatedCart = updatedCart.map((cartItem) => { - if (cartItem === diffBookingTypeFreeProduct) { - return { - ...cartItem, - OrderQty: cartItem?.OrderQty + sameBookTypeUpdateQty, - ...calculateTaxAmounts({ - qty: cartItem?.OrderQty + sameBookTypeUpdateQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - Offer: - (cartItem?.OrderQty + sameBookTypeUpdateQty) * - cartItem?.OrderRate, - }; - } else if (cartItem === editedProduct) { - return { - ...cartItem, - OrderQty: editedQty, - ...calculateTaxAmounts({ - qty: editedQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - Offer: editedQty * cartItem?.OrderRate, - }; - } else if (cartItem === diffBookingTypeProduct) { - return { - ...cartItem, - OrderQty: otherBookTypePaidUpdateQty, - ...calculateTaxAmounts({ - qty: otherBookTypePaidUpdateQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - }; - } - return cartItem; - }); - } - } - - // Only one dispatch after all updates - dispatch(changeOrderCardDetails(updatedCart)); - - if (totalPaidQty < freeQtyNeeded) { - const additionalFreeQtyNeeded = freeQtyNeeded - totalPaidQty; - - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.FreeProdId === editedProduct?.ProdId && - product?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) && - product?.OfferId === - editedProduct?.OfferMessage?.[0]?.OfferId && - product?.OfferMode === editedProduct?.OfferMode - ) { - const freeQty = - product?.OverAllFreeQty - additionalFreeQtyNeeded; - return { - ...product, - FreeQty: freeQty, - RemainingQty: additionalFreeQtyNeeded, - discount: freeQty * editedProduct?.OrderRate, - }; - } - return product; - }); - - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - editedProduct?.OfferMessage?.[0]?.OfferId && - offerProduct?.OfferMode === editedProduct?.OfferMode; - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - const freeQty = - matchingFreeProduct?.FreeQty - additionalFreeQtyNeeded; - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: freeQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: freeQty, - ActualOfferAmount: freeQty * editedProduct?.OrderRate, - OfferAmount: freeQty * editedProduct?.OrderRate, - OfferValue: freeQty * editedProduct?.OrderRate, - FreeProductsList: updatedFreeProductsList, - UsedCount: freeQty * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch( - changeFullOfferAppliedProducts(updatedOfferAppliedProducts) - ); - } - } else { - // no paid product exists in other booking type and same booking type - // Just need to update the Free Qty in FreeProductList - // Need to update the Qty in Edited Product - // Need to update the FreeQty in OfferAppliedProducts - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice, - true - ); - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.FreeProdId === editedProduct?.ProdId && - product?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) && - product?.OfferId === - editedProduct?.OfferMessage?.[0]?.OfferId && - product?.OfferMode === editedProduct?.OfferMode - ) { - return { - ...product, - FreeQty: finalOrderQty, - RemainingQty: product?.OverAllFreeQty - finalOrderQty, - discount: finalOrderQty * editedProduct?.OrderRate, - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - editedProduct?.OfferMessage?.[0]?.OfferId && - offerProduct?.OfferMode === editedProduct?.OfferMode; - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: finalOrderQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: finalOrderQty, - ActualOfferAmount: - finalOrderQty * editedProduct?.OrderRate, - OfferAmount: finalOrderQty * editedProduct?.OrderRate, - OfferValue: finalOrderQty * editedProduct?.OrderRate, - FreeProductsList: updatedFreeProductsList, - UsedCount: finalOrderQty * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch( - changeFullOfferAppliedProducts(updatedOfferAppliedProducts) - ); - } - } - } - } else if (isExistsInFreeProdList?.RemainingQty > 0) { - // perform normal edit qty operation - // console.log(editedProduct?.OrderQty, "editedProduct") - // await handleNormalEditQuantity(editedProduct, editedProductIndex); - - if (finalOrderQty > isExistsInFreeProdList?.OverAllFreeQty) { - // split paid and free product - const paidProdQty = - finalOrderQty - isExistsInFreeProdList?.OverAllFreeQty; - const freeProdQty = editedQty - paidProdQty; - const isAlreadyExistsInCart = CartOrderDetails?.findIndex( - (cartItem) => { - return ( - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - !cartItem?.OfferMode && - cartItem?.Offer === 0 && - cartItem?.BookingTypeName === editedProduct?.BookingTypeName && - cartItem?.OrderRate === editedProduct?.OrderRate - ); - } - ); - - let updatedCart = [...CartOrderDetails]; - - if (isAlreadyExistsInCart !== -1) { - // update the existing paid product in cart - updatedCart[isAlreadyExistsInCart] = { - ...updatedCart[isAlreadyExistsInCart], - OrderQty: - updatedCart[isAlreadyExistsInCart]?.OrderQty + paidProdQty, - ...calculateTaxAmounts({ - qty: updatedCart[isAlreadyExistsInCart]?.OrderQty + paidProdQty, - rate: updatedCart[isAlreadyExistsInCart]?.OrderRate, - taxPercentage: - updatedCart[isAlreadyExistsInCart]?.TaxPercentage, - }), - }; - } else { - // add new paid product in cart - const paidProduct = { - localId: uuidv4(), - ...editedProduct, - OrderQty: paidProdQty, - Offer: 0, - OfferMode: null, - OfferMessage: null, - OfferType: null, - ...calculateTaxAmounts({ - qty: paidProdQty, - rate: editedProduct?.OrderRate, - taxPercentage: editedProduct?.TaxPercentage, - }), - }; - updatedCart = [...updatedCart, paidProduct]; - } - - dispatch( - changeOrderCardDetails( - updatedCart?.map((prod) => { - if (prod === editedProduct) { - return { - ...prod, - OrderQty: freeProdQty, - ...calculateTaxAmounts({ - qty: freeProdQty, - rate: prod.OrderRate, - taxPercentage: prod.TaxPercentage, - }), - ...(prod?.Offer > 0 && { - Offer: freeProdQty * prod.OrderRate, - }), - }; - } - return prod; - }) - ) - ); - } else if (finalOrderQty === isExistsInFreeProdList?.OverAllFreeQty) { - // Just need to update the Qty in Edited Product and FreeProductList and OfferAppliedProducts - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice, - true - ); - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.FreeProdId === editedProduct?.ProdId && - product?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) && - product?.OfferId === editedProduct?.OfferMessage?.[0]?.OfferId && - product?.OfferMode === editedProduct?.OfferMode - ) { - return { - ...product, - FreeQty: finalOrderQty, - RemainingQty: 0, - discount: finalOrderQty * editedProduct?.OrderRate, - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - editedProduct?.OfferMessage?.[0]?.OfferId && - offerProduct?.OfferMode === editedProduct?.OfferMode; - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: finalOrderQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: finalOrderQty, - ActualOfferAmount: finalOrderQty * editedProduct?.OrderRate, - OfferAmount: finalOrderQty * editedProduct?.OrderRate, - OfferValue: finalOrderQty * editedProduct?.OrderRate, - FreeProductsList: updatedFreeProductsList, - UsedCount: finalOrderQty * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch(changeFullOfferAppliedProducts(updatedOfferAppliedProducts)); - } else if (finalOrderQty < isExistsInFreeProdList?.OverAllFreeQty) { - // Just need to update the Qty in Edited Product and FreeProductList and OfferAppliedProducts - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice, - true - ); - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.FreeProdId === editedProduct?.ProdId && - product?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) && - product?.OfferId === editedProduct?.OfferMessage?.[0]?.OfferId && - product?.OfferMode === editedProduct?.OfferMode - ) { - return { - ...product, - FreeQty: finalOrderQty, - RemainingQty: product?.OverAllFreeQty - finalOrderQty, - discount: finalOrderQty * editedProduct?.OrderRate, - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - editedProduct?.OfferMessage?.[0]?.OfferId && - offerProduct?.OfferMode === editedProduct?.OfferMode; - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === editedProduct?.InwardDtlId - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - editedProduct?.InwardDtlId - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: finalOrderQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: finalOrderQty, - ActualOfferAmount: finalOrderQty * editedProduct?.OrderRate, - OfferAmount: finalOrderQty * editedProduct?.OrderRate, - OfferValue: finalOrderQty * editedProduct?.OrderRate, - FreeProductsList: updatedFreeProductsList, - UsedCount: finalOrderQty * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch(changeFullOfferAppliedProducts(updatedOfferAppliedProducts)); - } - } - } else { - // check is there any free product applicable for the edited product - const isFreeProductApplicable = FreeProdList?.find((product) => { - return ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId - ); - }); - - const sameProductInOtherBooking = CartOrderDetails?.find((cartItem) => { - return ( - cartItem?.ProdId === editedProduct?.ProdId && - cartItem?.InwardDtlId === editedProduct?.InwardDtlId && - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName - ); - }); - - const finalOrderQty = - (sameProductInOtherBooking?.OrderQty || 0) + editedQty; - - if (isFreeProductApplicable && hasOffer) { - const applicableFreeProducts = - isFreeProductApplicable?.ProdVariantDetails; - - const freeProductVariants = applicableFreeProducts?.map((variant) => { - return { - ...variant, - FreeProdId: isFreeProductApplicable?.FreeProdId, - OfferId: isFreeProductApplicable?.OfferId, - OfferMode: isFreeProductApplicable?.OfferMode, - }; + // Pass the calculated values back to parent component + if (onSubmit) { + onSubmit({ + price: parseFloat(enteredPrice), + quantity: calculatedQty, }); - - if (isFreeProductApplicable?.OverAllFreeQty > finalOrderQty) { - if (isFreeProductApplicable?.FreeQty === 0) { - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice - ); - // update free product list (Set OverAllFreeQty = OrderQty and Remaining = OrderQty) - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId - ) { - return { - ...product, - FreeQty: 0, - OverAllFreeQty: finalOrderQty, - RemainingQty: finalOrderQty, - discount: finalOrderQty * editedProduct?.OrderRate, - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - } else if (isFreeProductApplicable?.FreeQty <= finalOrderQty) { - // check if there is any applicable free product in cart - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice - ); - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId - ) { - return { - ...product, - OverAllFreeQty: finalOrderQty, - RemainingQty: finalOrderQty - product?.FreeQty, - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - } else if (isFreeProductApplicable?.FreeQty > finalOrderQty) { - // need to split free product and paid product - let remainingPaidQty = - isFreeProductApplicable?.FreeQty - finalOrderQty; - const applicableFreeInCart = CartOrderDetails?.filter( - (cartItem) => { - return ( - freeProductVariants?.some( - (variant) => - variant.FreeProdId === cartItem.ProdId && - variant?.StockDetails?.some( - (stock) => - stock.FreeInwardDtlId === cartItem.InwardDtlId - ) - ) && - cartItem?.Offer && - isFreeProductApplicable?.OfferId === - cartItem?.OfferMessage?.[0]?.OfferId - ); - } - ); - const applicableFreeInCartAsPaid = CartOrderDetails?.filter( - (cartItem) => { - return ( - freeProductVariants?.some( - (variant) => - variant.FreeProdId === cartItem.ProdId && - variant?.StockDetails?.some( - (stock) => - stock.FreeInwardDtlId === cartItem.InwardDtlId - ) - ) && !cartItem?.Offer - ); - } - ); - const sameBookingTypeProduct = applicableFreeInCart?.find( - (cartItem) => { - return ( - cartItem?.BookingTypeName === editedProduct?.BookingTypeName - ); - } - ); - const otherBookingTypeProduct = applicableFreeInCart?.find( - (cartItem) => { - return ( - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName - ); - } - ); - const sameBookingTypeProductAsPaid = - applicableFreeInCartAsPaid?.find((cartItem) => { - return ( - cartItem?.BookingTypeName === editedProduct?.BookingTypeName - ); - }); - const otherBookingTypeProductAsPaid = - applicableFreeInCartAsPaid?.find((cartItem) => { - return ( - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName - ); - }); - let updatedCart = [...CartOrderDetails]; - if (sameBookingTypeProduct) { - if (sameBookingTypeProductAsPaid) { - if (sameBookingTypeProduct?.OrderQty <= remainingPaidQty) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== sameBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProductAsPaid) { - const newItem = { - ...cartItem, - OrderQty: - cartItem.OrderQty + sameBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: 0, - }; - - delete newItem.OfferMode; - delete newItem.OfferMessage; - delete newItem.OfferType; - - return newItem; - } - return cartItem; - }); - } else if ( - sameBookingTypeProduct?.OrderQty > remainingPaidQty - ) { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProduct) { - return { - ...cartItem, - OrderQty: cartItem.OrderQty - remainingPaidQty, - ...calculateTaxAmounts({ - qty: cartItem.OrderQty - remainingPaidQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem?.OrderQty - remainingPaidQty) * - cartItem?.OrderRate, - }; - } else if (cartItem === sameBookingTypeProductAsPaid) { - return { - ...cartItem, - OrderQty: cartItem?.OrderQty + remainingPaidQty, - ...calculateTaxAmounts({ - qty: cartItem?.OrderQty + remainingPaidQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - }; - } - return cartItem; - }); - } - } else { - if (sameBookingTypeProduct?.OrderQty <= remainingPaidQty) { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProduct) { - const newPaidProd = { - ...cartItem, - Offer: 0, - }; - - delete newPaidProd.OfferMode; - delete newPaidProd.OfferMessage; - delete newPaidProd.OfferType; - return newPaidProd; - } - return cartItem; - }); - } else if ( - sameBookingTypeProduct?.OrderQty > remainingPaidQty - ) { - const newPaidProduct = { - ...sameBookingTypeProduct, - OrderQty: remainingPaidQty, - Offer: 0, - }; - delete newPaidProduct.OfferMode; - delete newPaidProduct.OfferMessage; - delete newPaidProduct.OfferType; - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProduct) { - return { - ...cartItem, - OrderQty: cartItem.OrderQty - remainingPaidQty, - ...calculateTaxAmounts({ - qty: cartItem?.OrderQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - Offer: - (cartItem?.OrderQty - remainingPaidQty) * - cartItem?.OrderRate, - }; - } - return cartItem; - }); - updatedCart = [...updatedCart, newPaidProduct]; - } - } - remainingPaidQty = - remainingPaidQty - sameBookingTypeProduct?.OrderQty; - } - - if (otherBookingTypeProduct && remainingPaidQty > 0) { - if (otherBookingTypeProductAsPaid) { - if (otherBookingTypeProduct?.OrderQty <= remainingPaidQty) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== otherBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === otherBookingTypeProductAsPaid) { - const newItem = { - ...cartItem, - OrderQty: - cartItem.OrderQty + otherBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: 0, - }; - - delete newItem.OfferMode; - delete newItem.OfferMessage; - delete newItem.OfferType; - - return newItem; - } - return cartItem; - }); - } else if ( - otherBookingTypeProduct?.OrderQty > remainingPaidQty - ) { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === otherBookingTypeProduct) { - return { - ...cartItem, - OrderQty: cartItem.OrderQty - remainingPaidQty, - ...calculateTaxAmounts({ - qty: cartItem.OrderQty - remainingPaidQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem?.OrderQty - remainingPaidQty) * - cartItem?.OrderRate, - }; - } else if (cartItem === otherBookingTypeProductAsPaid) { - return { - ...cartItem, - OrderQty: cartItem?.OrderQty + remainingPaidQty, - ...calculateTaxAmounts({ - qty: cartItem?.OrderQty + remainingPaidQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - }; - } - return cartItem; - }); - } - } else { - if (otherBookingTypeProduct?.OrderQty <= remainingPaidQty) { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === otherBookingTypeProduct) { - const newPaidProd = { - ...cartItem, - Offer: 0, - }; - delete newPaidProd.OfferMode; - delete newPaidProd.OfferMessage; - delete newPaidProd.OfferType; - return newPaidProd; - } - return cartItem; - }); - } else if ( - otherBookingTypeProduct?.OrderQty > remainingPaidQty - ) { - const newPaidProduct = { - ...otherBookingTypeProduct, - OrderQty: - otherBookingTypeProduct?.OrderQty - remainingPaidQty, - Offer: 0, - }; - delete newPaidProduct.OfferMode; - delete newPaidProduct.OfferMessage; - delete newPaidProduct.OfferType; - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === otherBookingTypeProduct) { - return { - ...cartItem, - OrderQty: cartItem.OrderQty - remainingPaidQty, - ...calculateTaxAmounts({ - qty: cartItem?.OrderQty, - rate: cartItem?.OrderRate, - taxPercentage: cartItem?.TaxPercentage, - }), - Offer: - (cartItem?.OrderQty - remainingPaidQty) * - cartItem?.OrderRate, - }; - } - return cartItem; - }); - updatedCart = [...updatedCart, newPaidProduct]; - } - } - } - - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === editedProduct) { - return { - ...cartItem, - OrderQty: editedQty, - ...calculateTaxAmounts({ - qty: editedQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - }; - } - return cartItem; - }); - - dispatch(changeOrderCardDetails(updatedCart)); - - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId && - product?.OfferId === - (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || - otherBookingTypeProduct?.OfferMessage?.[0]?.OfferId) && - product?.OfferMode === - (sameBookingTypeProduct?.OfferMode || - otherBookingTypeProduct?.OfferMode) - ) { - return { - ...product, - FreeQty: finalOrderQty, - OverAllFreeQty: finalOrderQty, - RemainingQty: 0, - discount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || - otherBookingTypeProduct?.OfferMessage?.[0]?.OfferId) && - offerProduct?.OfferMode === - (sameBookingTypeProduct?.OfferMode || - otherBookingTypeProduct?.OfferMode); - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: finalOrderQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: finalOrderQty, - ActualOfferAmount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferAmount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferValue: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - FreeProductsList: updatedFreeProductsList, - UsedCount: finalOrderQty * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch( - changeFullOfferAppliedProducts(updatedOfferAppliedProducts) - ); - } - } else { - if (isFreeProductApplicable?.FreeQty === 0) { - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice - ); - // update free product list (Set OverAllFreeQty = OrderQty and Remaining = OrderQty) - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId - ) { - return { - ...product, - FreeQty: 0, - OverAllFreeQty: finalOrderQty, - RemainingQty: finalOrderQty, - discount: finalOrderQty * editedProduct?.OrderRate, - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - } else if (isFreeProductApplicable?.FreeQty === finalOrderQty) { - dispatch( - changeOrderCardDetails( - updatedCart?.map((cartItem) => { - if (cartItem === editedProduct) { - return { - ...cartItem, - PackageDtl: PackageDtl, - }; - } - return cartItem; - }) - ) - ); - return; - } else if (isFreeProductApplicable?.FreeQty < finalOrderQty) { - // check if there is any applicable free product in cart - console.log(freeProductVariants, 'freeProductVariants'); - const applicableFreeInCart = CartOrderDetails?.filter( - (cartItem) => { - return ( - freeProductVariants?.some( - (variant) => - variant.FreeProdId === cartItem.ProdId && - variant?.StockDetails?.some( - (stock) => - stock.FreeInwardDtlId === cartItem.InwardDtlId - ) - ) && !cartItem?.Offer - ); - } - ); - - const applicableOfferAppliedFreeInCart = CartOrderDetails?.filter( - (cartItem) => { - return ( - freeProductVariants?.some( - (variant) => - variant.FreeProdId === cartItem.ProdId && - variant?.StockDetails?.some( - (stock) => - stock.FreeInwardDtlId === cartItem.InwardDtlId - ) - ) && - cartItem?.Offer > 0 && - isFreeProductApplicable?.OfferMode === cartItem?.OfferMode && - isFreeProductApplicable?.OfferId === - cartItem?.OfferMessage?.[0]?.OfferId - ); - } - ); - - if (applicableFreeInCart?.length > 0) { - console.log(applicableFreeInCart, 'applicableFreeInCart'); - const sameBookingTypeProduct = applicableFreeInCart?.find( - (cartItem) => { - return ( - cartItem?.BookingTypeName === editedProduct?.BookingTypeName - ); - } - ); - const otherBookingTypeProduct = applicableFreeInCart?.find( - (cartItem) => { - return ( - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName - ); - } - ); - const sameBookingTypeFreeProduct = - applicableOfferAppliedFreeInCart?.find((cartItem) => { - return ( - cartItem?.BookingTypeName === editedProduct?.BookingTypeName - ); - }); - const otherBookingTypeFreeProduct = - applicableOfferAppliedFreeInCart?.find((cartItem) => { - return ( - cartItem?.BookingTypeName !== editedProduct?.BookingTypeName - ); - }); - // find how many qty need to be updated as free product - const totalFreeQtyInCart = applicableFreeInCart?.reduce( - (acc, item) => acc + item.OrderQty, - 0 - ); - const freeQtyNeeded = - finalOrderQty - isFreeProductApplicable?.OverAllFreeQty; - if (totalFreeQtyInCart === freeQtyNeeded) { - let updatedCart = [...CartOrderDetails]; - if (sameBookingTypeProduct) { - if (sameBookingTypeFreeProduct) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== sameBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeFreeProduct) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty) * - cartItem.OrderRate, - }; - } - return cartItem; - }); - } else { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProduct) { - return { - ...cartItem, - Offer: - sameBookingTypeProduct?.OrderQty * - cartItem.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - }; - } - return cartItem; - }); - } - } - - if (otherBookingTypeProduct) { - if (otherBookingTypeFreeProduct) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== otherBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === otherBookingTypeProduct.ProdId && - cartItem.InwardDtlId === - otherBookingTypeProduct.InwardDtlId && - cartItem.BookingTypeName === - otherBookingTypeProduct.BookingTypeName && - cartItem.OrderRate === - otherBookingTypeProduct.OrderRate && - cartItem.OfferMode && - cartItem.Offer > 0 - ) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty) * - cartItem.OrderRate, - }; - } - return cartItem; - }); - } else { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === otherBookingTypeProduct) { - return { - ...cartItem, - Offer: - otherBookingTypeProduct?.OrderQty * - cartItem.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - }; - } - return cartItem; - }); - } - } - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === editedProduct) { - return { - ...cartItem, - OrderQty: editedQty, - ...calculateTaxAmounts({ - qty: editedQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - ...(cartItem?.Offer > 0 && { - Offer: editedQty * cartItem.OrderRate, - }), - }; - } - return cartItem; - }); - dispatch(changeOrderCardDetails(updatedCart)); - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId && - product?.OfferId === - (sameBookingTypeFreeProduct?.OfferMessage?.[0]?.OfferId || - otherBookingTypeFreeProduct?.OfferMessage?.[0] - ?.OfferId) && - product?.OfferMode === - (sameBookingTypeFreeProduct?.OfferMode || - otherBookingTypeFreeProduct?.OfferMode) - ) { - return { - ...product, - FreeQty: finalOrderQty, - OverAllFreeQty: finalOrderQty, - RemainingQty: 0, - discount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeFreeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - (sameBookingTypeFreeProduct?.OfferMessage?.[0] - ?.OfferId || - otherBookingTypeFreeProduct?.OfferMessage?.[0] - ?.OfferId) && - offerProduct?.OfferMode === - (sameBookingTypeFreeProduct?.OfferMode || - otherBookingTypeFreeProduct?.OfferMode); - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: finalOrderQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: finalOrderQty, - ActualOfferAmount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferAmount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferValue: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - FreeProductsList: updatedFreeProductsList, - UsedCount: finalOrderQty * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch( - changeFullOfferAppliedProducts(updatedOfferAppliedProducts) - ); - } else if (totalFreeQtyInCart > freeQtyNeeded) { - let updatedCart = [...CartOrderDetails]; - if (sameBookingTypeProduct) { - // if available same booking type product qty is more than or equal to freeQtyNeeded. - // if more than then we need to update both free and paid product= - if (sameBookingTypeProduct?.OrderQty === freeQtyNeeded) { - if (sameBookingTypeFreeProduct) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== sameBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === sameBookingTypeProduct.ProdId && - cartItem.InwardDtlId === - sameBookingTypeProduct.InwardDtlId && - cartItem.BookingTypeName === - sameBookingTypeProduct.BookingTypeName && - cartItem.OrderRate === - sameBookingTypeProduct.OrderRate && - cartItem.OfferMode && - cartItem.Offer > 0 - ) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty) * - cartItem.OrderRate, - }; - } - return cartItem; - }); - } else { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProduct) { - return { - ...cartItem, - Offer: - sameBookingTypeProduct?.OrderQty * - cartItem.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - }; - } - return cartItem; - }); - } - } else if (sameBookingTypeProduct?.OrderQty > freeQtyNeeded) { - if (sameBookingTypeFreeProduct) { - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === sameBookingTypeProduct.ProdId && - cartItem.InwardDtlId === - sameBookingTypeProduct.InwardDtlId && - cartItem.BookingTypeName === - sameBookingTypeProduct.BookingTypeName && - cartItem.OrderRate === - sameBookingTypeProduct.OrderRate && - cartItem.OfferMode && - cartItem.Offer > 0 - ) { - return { - ...cartItem, - OrderQty: cartItem.OrderQty + freeQtyNeeded, - ...calculateTaxAmounts({ - qty: cartItem.OrderQty + freeQtyNeeded, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + freeQtyNeeded) * - cartItem.OrderRate, - }; - } else if (cartItem === sameBookingTypeProduct) { - return { - ...cartItem, - OrderQty: cartItem.OrderQty - freeQtyNeeded, - ...calculateTaxAmounts({ - qty: cartItem.OrderQty - freeQtyNeeded, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - }; - } - return cartItem; - }); - } else { - const remainingPaidQty = - sameBookingTypeProduct?.OrderQty - freeQtyNeeded; - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProduct) { - return { - ...cartItem, - OrderQty: remainingPaidQty, - ...calculateTaxAmounts({ - qty: remainingPaidQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - }; - } - return cartItem; - }); - const freeProduct = { - ...sameBookingTypeProduct, - OrderQty: freeQtyNeeded, - ...calculateTaxAmounts({ - qty: freeQtyNeeded, - rate: sameBookingTypeProduct.OrderRate, - taxPercentage: sameBookingTypeProduct.TaxPercentage, - }), - Offer: freeQtyNeeded * sameBookingTypeProduct.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - localId: uuidv4(), - }; - updatedCart = [...updatedCart, freeProduct]; - } - } - } - - if ( - otherBookingTypeProduct && - freeQtyNeeded > (sameBookingTypeProduct?.OrderQty || 0) - ) { - const remainingFreeQtyNeeded = - freeQtyNeeded - (sameBookingTypeProduct?.OrderQty || 0); - if ( - remainingFreeQtyNeeded === otherBookingTypeProduct?.OrderQty - ) { - if (otherBookingTypeFreeProduct) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== otherBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === otherBookingTypeProduct.ProdId && - cartItem?.InwardDtlId === - otherBookingTypeProduct.InwardDtlId && - cartItem?.BookingTypeName === - otherBookingTypeProduct.BookingTypeName && - cartItem?.OrderRate === - otherBookingTypeProduct.OrderRate && - cartItem?.OfferMode && - cartItem?.Offer > 0 - ) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty) * - cartItem.OrderRate, - }; - } - return cartItem; - }); - } else { - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === otherBookingTypeProduct.ProdId && - cartItem.InwardDtlId === - otherBookingTypeProduct.InwardDtlId && - cartItem.BookingTypeName === - otherBookingTypeProduct.BookingTypeName && - cartItem.OrderRate === - otherBookingTypeProduct.OrderRate && - cartItem.OfferMode && - cartItem.Offer > 0 - ) { - return { - ...cartItem, - Offer: cartItem.OrderQty * cartItem.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - }; - } - return cartItem; - }); - } - } else if ( - otherBookingTypeProduct?.OrderQty > remainingFreeQtyNeeded - ) { - if (otherBookingTypeFreeProduct) { - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === otherBookingTypeProduct.ProdId && - cartItem.InwardDtlId === - otherBookingTypeProduct.InwardDtlId && - cartItem.BookingTypeName === - otherBookingTypeProduct.BookingTypeName && - cartItem.OrderRate === - otherBookingTypeProduct.OrderRate && - cartItem.OfferMode && - cartItem.Offer > 0 - ) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty + remainingFreeQtyNeeded, - ...calculateTaxAmounts({ - qty: cartItem.OrderQty + remainingFreeQtyNeeded, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + remainingFreeQtyNeeded) * - cartItem.OrderRate, - }; - } else if (cartItem === otherBookingTypeProduct) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty - remainingFreeQtyNeeded, - ...calculateTaxAmounts({ - qty: cartItem.OrderQty - remainingFreeQtyNeeded, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - }; - } - return cartItem; - }); - } else { - const remainingPaidQty = - otherBookingTypeProduct?.OrderQty - - remainingFreeQtyNeeded; - const newFreeProduct = { - ...otherBookingTypeProduct, - OrderQty: remainingFreeQtyNeeded, - ...calculateTaxAmounts({ - qty: remainingFreeQtyNeeded, - rate: otherBookingTypeProduct.OrderRate, - taxPercentage: otherBookingTypeProduct.TaxPercentage, - }), - Offer: - remainingFreeQtyNeeded * - otherBookingTypeProduct.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - localId: uuidv4(), - }; - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === otherBookingTypeProduct) { - return { - ...cartItem, - OrderQty: remainingPaidQty, - ...calculateTaxAmounts({ - qty: remainingPaidQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - }; - } - return cartItem; - }); - updatedCart = [...updatedCart, newFreeProduct]; - } - } - } - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === editedProduct) { - return { - ...cartItem, - OrderQty: editedQty, - ...calculateTaxAmounts({ - qty: editedQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - ...(cartItem?.Offer > 0 && { - Offer: editedQty * cartItem.OrderRate, - }), - }; - } - return cartItem; - }); - dispatch(changeOrderCardDetails(updatedCart)); - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId && - product?.OfferId === - (sameBookingTypeFreeProduct?.OfferMessage?.[0]?.OfferId || - otherBookingTypeFreeProduct?.OfferMessage?.[0] - ?.OfferId) && - product?.OfferMode === - (sameBookingTypeFreeProduct?.OfferMode || - otherBookingTypeFreeProduct?.OfferMode) - ) { - return { - ...product, - FreeQty: finalOrderQty, - OverAllFreeQty: finalOrderQty, - RemainingQty: 0, - discount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || - otherBookingTypeProduct?.OfferMessage?.[0] - ?.OfferId) && - offerProduct?.OfferMode === - (sameBookingTypeProduct?.OfferMode || - otherBookingTypeProduct?.OfferMode); - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: finalOrderQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: finalOrderQty, - ActualOfferAmount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferAmount: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferValue: - finalOrderQty * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - FreeProductsList: updatedFreeProductsList, - UsedCount: finalOrderQty * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch( - changeFullOfferAppliedProducts(updatedOfferAppliedProducts) - ); - } else if (totalFreeQtyInCart < freeQtyNeeded) { - let updatedCart = [...CartOrderDetails]; - if (sameBookingTypeProduct) { - if (sameBookingTypeFreeProduct) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== sameBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === sameBookingTypeProduct.ProdId && - cartItem.InwardDtlId === - sameBookingTypeProduct.InwardDtlId && - cartItem.BookingTypeName === - sameBookingTypeProduct.BookingTypeName && - cartItem.OrderRate === - sameBookingTypeProduct.OrderRate && - cartItem.OfferMode && - cartItem.Offer > 0 - ) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty) * - cartItem.OrderRate, - }; - } - return cartItem; - }); - } else { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === sameBookingTypeProduct) { - return { - ...cartItem, - Offer: - (cartItem.OrderQty + - sameBookingTypeProduct?.OrderQty) * - cartItem.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - }; - } - return cartItem; - }); - } - } - - if (otherBookingTypeProduct) { - if (otherBookingTypeFreeProduct) { - updatedCart = updatedCart?.filter( - (cartItem) => cartItem !== otherBookingTypeProduct - ); - updatedCart = updatedCart?.map((cartItem) => { - if ( - cartItem.ProdId === otherBookingTypeProduct.ProdId && - cartItem.InwardDtlId === - otherBookingTypeProduct.InwardDtlId && - cartItem.BookingTypeName === - otherBookingTypeProduct.BookingTypeName && - cartItem.OrderRate === - otherBookingTypeProduct.OrderRate && - cartItem.OfferMode && - cartItem.Offer > 0 - ) { - return { - ...cartItem, - OrderQty: - cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty, - ...calculateTaxAmounts({ - qty: - cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - Offer: - (cartItem.OrderQty + - otherBookingTypeProduct?.OrderQty) * - cartItem.OrderRate, - }; - } - return cartItem; - }); - } else { - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === otherBookingTypeProduct) { - return { - ...cartItem, - Offer: - otherBookingTypeProduct?.OrderQty * - cartItem.OrderRate, - OfferMode: isFreeProductApplicable?.OfferMode, - OfferType: isFreeProductApplicable?.OfferType, - OfferMessage: [ - { - OfferId: isFreeProductApplicable?.OfferId, - OfferName: isFreeProductApplicable?.OfferName, - OfferDescription: - isFreeProductApplicable?.OfferDescription, - }, - ], - }; - } - return cartItem; - }); - } - } - updatedCart = updatedCart?.map((cartItem) => { - if (cartItem === editedProduct) { - return { - ...cartItem, - OrderQty: editedQty, - ...calculateTaxAmounts({ - qty: editedQty, - rate: cartItem.OrderRate, - taxPercentage: cartItem.TaxPercentage, - }), - ...(cartItem?.Offer > 0 && { - Offer: editedQty * cartItem.OrderRate, - }), - }; - } - return cartItem; - }); - dispatch(changeOrderCardDetails(updatedCart)); - const remainingQty = freeQtyNeeded - totalFreeQtyInCart; - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId && - product?.OfferId === - (sameBookingTypeFreeProduct?.OfferMessage?.[0]?.OfferId || - otherBookingTypeFreeProduct?.OfferMessage?.[0] - ?.OfferId) && - product?.OfferMode === - (sameBookingTypeFreeProduct?.OfferMode || - otherBookingTypeFreeProduct?.OfferMode) - ) { - return { - ...product, - FreeQty: finalOrderQty - remainingQty, - OverAllFreeQty: finalOrderQty, - RemainingQty: remainingQty, - discount: - (finalOrderQty - remainingQty) * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - const updatedOfferAppliedProducts = OfferAppliedProducts?.map( - (offerProduct) => { - // Check if this offer product contains the edited product in its free products list - const hasMatchingFreeProduct = - offerProduct?.FreeProductsList?.some((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - // Also check main offer conditions - const isMatchingOffer = - offerProduct?.OfferId === - (sameBookingTypeProduct?.OfferMessage?.[0]?.OfferId || - otherBookingTypeProduct?.OfferMessage?.[0] - ?.OfferId) && - offerProduct?.OfferMode === - (sameBookingTypeProduct?.OfferMode || - otherBookingTypeProduct?.OfferMode); - - if (hasMatchingFreeProduct && isMatchingOffer) { - // Get loyalty points from the matching free product - const matchingFreeProduct = - offerProduct?.FreeProductsList?.find((freeProduct) => - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ) - ); - - const prodLoyaltyPoint = - matchingFreeProduct?.ProdVariantDetails?.[0] - ?.StockDetails?.[0]?.ProdLoyaltyPoint || 0; - - // Update the specific free product in the list - const updatedFreeProductsList = - offerProduct?.FreeProductsList?.map((freeProduct) => { - const isTargetFreeProduct = - freeProduct?.ProdVariantDetails?.some((variant) => - variant?.StockDetails?.some( - (stock) => - stock?.FreeInwardDtlId === - (sameBookingTypeProduct?.InwardDtlId || - otherBookingTypeProduct?.InwardDtlId) - ) - ); - - if (isTargetFreeProduct) { - return { - ...freeProduct, - FreeQty: finalOrderQty - remainingQty, - }; - } - return freeProduct; - }); - - return { - ...offerProduct, - ActualFreeQty: finalOrderQty - remainingQty, - ActualOfferAmount: - (finalOrderQty - remainingQty) * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferAmount: - (finalOrderQty - remainingQty) * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - OfferValue: - (finalOrderQty - remainingQty) * - (sameBookingTypeProduct?.OrderRate || - otherBookingTypeProduct?.OrderRate), - FreeProductsList: updatedFreeProductsList, - UsedCount: - (finalOrderQty - remainingQty) * prodLoyaltyPoint, - }; - } - - return offerProduct; - } - ); - dispatch( - changeFullOfferAppliedProducts(updatedOfferAppliedProducts) - ); - } - } else { - // just update the free product list - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice - ); - const updatedFreeProdList = FreeProdList?.map((product) => { - if ( - product?.ProdId === editedProduct?.ProdId && - product?.InwardDtlId === editedProduct?.InwardDtlId - ) { - return { - ...product, - OverAllFreeQty: finalOrderQty, - RemainingQty: finalOrderQty - product?.FreeQty, - discount: finalOrderQty * editedProduct?.OrderRate, - }; - } - return product; - }); - dispatch(ChangeFullFreeProductList(updatedFreeProdList)); - } - } - } - } else { - await handleNormalEditQuantity( - editedProduct, - editedProductIndex, - editedQty, - newPrice - ); } } }; - const handleNormalEditQuantity = async ( - editedProduct, - index, - qty, - newPrice = 0, - offerApply = false - ) => { - const fixedQty = Number(qty.toFixed(3)); - const updatedProduct = { - ...editedProduct, - OrderQty: fixedQty, - OrderRate: newPrice > 0 ? newPrice : editedProduct?.OrderRate, - ...calculateTaxAmounts({ - qty: qty, - rate: newPrice > 0 ? newPrice : editedProduct?.OrderRate, - taxPercentage: editedProduct?.TaxPercentage, - type: editedProduct?.Type, - product: editedProduct, - }), - PackageDtl: PackageDtl, - // ✅ FIXED: Proper conditional property assignment - ...(offerApply && { - Offer: qty * (newPrice > 0 ? newPrice : editedProduct?.OrderRate), - }), - }; - - if (hasOffer) { - const offers = validateOffers( - updatedProduct, - OverAllproductBasedOfferDatas, - CartOrderDetails, - TakAwayId, - DineinId - ); - if (!offers?.length) { - if (updatedProduct?.OfferType && updatedProduct?.Offer > 0) { - dispatch( - RemoveOfferAppliedProduct({ - ProdId: updatedProduct?.ProdId, - InwardDtlId: updatedProduct?.InwardDtlId, - OfferType: updatedProduct?.OfferType, - }) - ); - } - dispatch( - changeOrderCardDetails( - CartOrderDetails?.map((i) => - i?.InwardDtlId == updatedProduct?.InwardDtlId && - i?.BookingTypeName == updatedProduct?.BookingTypeName && - i?.localId === updatedProduct?.localId - ? { - ...updatedProduct, - Offer: 0, - OfferType: - updatedProduct?.Type === 'C' - ? updatedProduct?.OfferType - : null, - OfferMessage: null, - } - : i - ) - ) - ); - return; - } - - let bestOffer = null; - for (const offer of offers) { - if (!bestOffer || offer.OfferAmount > bestOffer.OfferAmount) { - bestOffer = offer; - } - } - - const UpdatedCartItemWithOffer = { - ...updatedProduct, - Offer: - bestOffer?.OfferMode === 'I' || bestOffer?.OfferMode === 'Q' - ? bestOffer?.OfferAmount || updatedProduct.Offer - : updatedProduct.Offer || bestOffer?.OfferAmount, - OfferType: updatedProduct?.OfferType || bestOffer?.OfferType, - OfferMessage: updatedProduct?.OfferMessage || bestOffer?.OfferMessage, - }; - - console.log(updatedProduct, 'updatedProduct'); - - const shouldRemove = (c) => - c.ProdId === updatedProduct.ProdId && - c.InwardDtlId === updatedProduct.InwardDtlId && - c.OrderRate === updatedProduct.OrderRate && - c.BookingTypeName === updatedProduct.BookingTypeName && - !c.SalesId && - ((c?.OfferModeType && c?.OfferMode === 'B' - ? true - : c?.OfferMode !== 'B') && - c?.OfferMode !== 'P' && - c?.OfferMode !== 'C' && - c?.OfferMode !== 'O' && - c?.OfferMode !== 'L' - ? true - : c?.Offer === 0); - - const filteredCart = CartOrderDetails?.filter((c) => !shouldRemove(c)); - const updatedCartData = [UpdatedCartItemWithOffer, ...filteredCart]; - - if (bestOffer) { - dispatch(ChangeOfferAppliedProducts(bestOffer)); - } - - dispatch(changeOrderCardDetails(updatedCartData)); - } else { - const updatedData = [...CartOrderDetails]; - updatedData[index] = updatedProduct; - dispatch(changeOrderCardDetails(updatedData)); - } - }; - - const calculateTaxAmounts = ({ - qty, - rate, - taxPercentage, - type = null, - product = {}, - isOfferApply = false, - }) => { - const { OfferType = null, OfferPrice = 0 } = product; - const totalAmount = qty * rate; - const taxAmount = ( - (totalAmount * taxPercentage) / - (100 + taxPercentage) - ).toFixed(2); - const withoutTaxRate = (totalAmount - taxAmount).toFixed(2); - const offerValue = - type === 'C' - ? OfferType === 'F' - ? qty * OfferPrice - : (qty * rate * OfferPrice) / 100 - : null; - - return { - TotalAmt: - type === 'C' && OfferPrice > 0 - ? totalAmount - (offerValue || 0) - : totalAmount, - TaxAmt: parseFloat(taxAmount), - WithoutTaxRate: parseFloat(withoutTaxRate), - OfferValue: offerValue, - }; - }; - const CloseModal = () => { - props.handleEditQuantityCancel(); - setClearQuantity(false); - }; - const onComplete = useCallback(() => { - setMessageData(null); - setMessageType(null); - }, []); - const onRadioBtnChange = (data) => { - setRadioBtnSelection(data); - }; - const onPercentageSelectionChange = (data) => { - setPercentageSelection(data); - setEditedPrice(0); - formRef.current?.resetFields(); - setDisableSubmitButton(false); - }; - const PriceChangefun = (data) => { - const enteredDiscount = parseFloat(data?.target.value); - if (enteredDiscount) { - const sellingPrice = parseFloat(props.Productdata?.SellingPrice || 0); - const limit = parseFloat(props.Productdata?.DiscountLimit || 0); - const limitType = props.Productdata?.DiscountLimitType; - - if (limit === null || limit === undefined || limit === 0) { - if (PercentageSelection == 'Fixed') { - if (parseFloat(enteredDiscount) < parseFloat(sellingPrice)) { - // setEditedPrice(enteredDiscount); - setEditedPrice( - parseFloat(sellingPrice) - parseFloat(enteredDiscount) - ); - setDisableSubmitButton(true); - } else { - setMessageType('error'); - setMessageData('Please Give less than value for sell price'); - setDisableSubmitButton(false); - setEditedPrice(0); - formRef.current?.resetFields(); - } - } else { - if (parseFloat(enteredDiscount) < 100) { - let temperc = - (parseFloat(enteredDiscount) * parseFloat(sellingPrice)) / 100; - setEditedPrice(parseFloat(sellingPrice) - parseFloat(temperc)); - setDisableSubmitButton(true); - } else { - setMessageType('error'); - setMessageData('Please Give less than 100% '); - setEditedPrice(0); - setDisableSubmitButton(false); - formRef.current?.resetFields(); - } - } - return; - } - - let maxDiscount = 0; - if (limitType === 'F') { - maxDiscount = sellingPrice - limit; - } else if (limitType === 'P') { - const afterdiscountfullamount = (sellingPrice * limit) / 100; - maxDiscount = sellingPrice - afterdiscountfullamount; - } - - if (PercentageSelection == 'Fixed') { - if (parseFloat(enteredDiscount) < parseFloat(sellingPrice)) { - if (sellingPrice - enteredDiscount === maxDiscount) { - setEditedPrice( - parseFloat(sellingPrice) - parseFloat(enteredDiscount) - ); - setDisableSubmitButton(true); - return; - } - - if (sellingPrice - enteredDiscount < sellingPrice - maxDiscount) { - setMessageType('error'); - setMessageData( - `Discount amount should not exeed ₹ ${(sellingPrice - maxDiscount).toFixed(2)}` - ); - setEditedPrice(0); - setDisableSubmitButton(true); - formRef.current?.resetFields(); - setDisableSubmitButton(false); - return; - } - - setEditedPrice( - parseFloat(sellingPrice) - parseFloat(enteredDiscount) - ); - setDisableSubmitButton(true); - } else { - setMessageType('error'); - setMessageData('Please Give less than value for sell price'); - setDisableSubmitButton(false); - setEditedPrice(0); - formRef.current?.resetFields(); - } - } else { - if (parseFloat(enteredDiscount) < 100) { - const discountAmount = (sellingPrice * enteredDiscount) / 100; - if (discountAmount > maxDiscount) { - setMessageType('error'); - setMessageData( - `Discount % should not exeed above ${(maxDiscount / sellingPrice) * 100} %` - ); - setEditedPrice(0); - setDisableSubmitButton(false); - formRef.current?.resetFields(); - return; - } - - let temperc = - (parseFloat(enteredDiscount) * parseFloat(sellingPrice)) / 100; - setEditedPrice(parseFloat(sellingPrice) - parseFloat(temperc)); - setDisableSubmitButton(true); - } else { - setMessageType('error'); - setMessageData('Please Give less than 100 '); - setEditedPrice(0); - setDisableSubmitButton(false); - formRef.current?.resetFields(); - } - } - } else { - setDisableSubmitButton(false); - setEditedPrice(0); - formRef.current?.resetFields(); - } - }; - const SellingPriceChange = (data) => { - if (data?.target.value) { - const sellingPrice = parseFloat(props.Productdata?.SellingPrice || 0); - const limit = parseFloat(props.Productdata?.DiscountLimit || 0); - const limitType = props.Productdata?.DiscountLimitType; - const enteredDiscount = parseFloat(data?.target.value); - - if (limit === null || limit === undefined || limit === 0) { - if ( - parseFloat(enteredDiscount) < parseFloat(sellingPrice) || - parseFloat(enteredDiscount) === parseFloat(sellingPrice) - ) { - setEditedPrice(enteredDiscount); - setDisableSubmitButton(true); - } else { - setMessageType('error'); - setMessageData('Please Give less than value for sell price'); - setDisableSubmitButton(false); - setEditedPrice(0); - formRef.current?.resetFields(); - } - return; - } - - let maxDiscount = 0; - if (limitType === 'F') { - maxDiscount = limit; - } else if (limitType === 'P') { - const afterdiscountfullamount = (sellingPrice * limit) / 100; - maxDiscount = afterdiscountfullamount; - } - - if (enteredDiscount === maxDiscount) { - setEditedPrice(data?.target.value); - setDisableSubmitButton(true); - return; - } - - if (enteredDiscount < maxDiscount) { - setMessageType('error'); - setMessageData(`You cannot sell below ₹${maxDiscount.toFixed(2)}`); - setEditedPrice(0); - setDisableSubmitButton(false); - return; - } - setDisableSubmitButton(true); - setEditedPrice(data?.target.value); - } else { - setDisableSubmitButton(false); - setEditedPrice(0); - } - }; - - const AddPacking = async (data) => { - console.log(data, 'Cartdata'); - setPackageDtl(data || []); - }; - - const handleWeightCalculation = async (data) => { - const { price, quantity } = data; - setQuantity(quantity); - setEditedPrice(price); - await handleWeightSubmit(quantity, price); - }; - - const handleWeightSubmit = async (qty, price) => { - await dispatch(changeHoldOrderDtl(false)); - await dispatch(changePreviousOrderLength(CartOrderDetails?.length)); - let localId = props.Index; - let editedProductIndex = CartOrderDetails?.findIndex( - (e) => e?.localId == localId - ); - const editedProduct = { - ...CartOrderDetails[editedProductIndex], - OrderQty: qty - }; - - await handleEditQuantity(editedProduct, editedProductIndex, editedProduct.OrderRate, qty); - props.handleEditQuantityCancel(); - setClearQuantity(false); - }; - const isKg = - props?.Productdata?.Size == 1 && - ["KG", "KGS"].includes(props?.Productdata?.UomName?.toUpperCase()); - return ( -
- - - // - //
- } - open={EditOpen} - width={600} - footer={null} - children={ -
-
-
{ - if (RadioBtnSelection === 'Price' && !disableSubmitButton) { - return; - } - AddProductQuantity(values); - }} - > -
-
-

Item Name:

-
-
-

- {' '} - {ItemData?.ProdName} -

-
-
-
- {/* onRadioBtnChange(e)} - /> */} - {ItemData?.ScaleType !== 'weight' && ( - - )} - {PriceChangeaccess && ( - - )} - - - - {isKg && ()} - -
- - {RadioBtnSelection == 'Quantity' && ( - <> -
- - setQuantity(e.target.value)} - className="EditQuantity-Quantitybox" - /> - -
-
-
AddQuantity(1)}> - 1 -
-
AddQuantity(2)}> - 2 -
-
AddQuantity(3)}> - 3 -
- -
AddQuantity(4)}> - 4 -
-
AddQuantity(5)}> - 5 -
-
AddQuantity(6)}> - 6 -
- -
AddQuantity(7)}> - 7 -
-
AddQuantity(8)}> - 8 -
-
AddQuantity(9)}> - 9 -
-
-
AddQuantity(0)}> - 0 -
-
-
- - )} - {RadioBtnSelection == 'Price' && ( -
- - - {!RadioDetails && ( - { - await validateSafeInput(value); - - if (value && value.length > 10) { - return Promise.reject( - 'Selling Price should not exceed 10 characters' - ); - } - - return Promise.resolve(); - }, - }, - ]} - > - { - const cleanedValue = e.target.value.replace( - /[^0-9.]/g, - '' - ); - const parts = cleanedValue.split('.'); - e.target.value = - parts.length > 2 - ? `${parts[0]}.${parts.slice(1).join('')}` - : cleanedValue; - }} - // isOnChange={formType == "edit" || formRef.current?.getFieldsValue()?.CustName ? true : false} - /> - - )} - -
- More -
- {RadioDetails && ( - <> -
- { - onPercentageSelectionChange(e); - }} - /> -
-
- - { - await validateSafeInput(value); // To block HTML tags & SQL keywords - return Promise.resolve(); - }, - }, - ]} - > - PriceChangefun(e)} - inputMode="decimal" - onInput={(e) => { - const cleanedValue = e.target.value.replace( - /[^0-9.]/g, - '' - ); - const parts = cleanedValue.split('.'); - e.target.value = - parts.length > 2 - ? `${parts[0]}.${parts.slice(1).join('')}` - : cleanedValue; - }} - // isOnChange={formType == "edit" || formRef.current?.getFieldsValue()?.CustName ? true : false} - /> - - {/* PriceChangefun(e)} - className="EditQuantity-Pricebox" - /> */} - -
-
-
- {' '} - Price: {safeRound(editedPrice ? editedPrice : 0)} -
-
- - )} -
- )} - {RadioBtnSelection == 'Parcel' && ( - <> - AddPacking(data)} - PackageDtl={PackageDtl} - CurrentData={ItemData?.PackageDtl} - localId={ItemData?.localId} - /> - - )} - {RadioBtnSelection == 'AddWeight' && ( - <> - - - )} -
- {((RadioBtnSelection == 'Price' && disableSubmitButton) || - RadioBtnSelection == 'Quantity') && ( - } - > - )} -
- +
+
e.preventDefault()} + > +
+
+

Product: {itemData?.ProdName}

+

Variant: {itemData?.ProdVariantName}

+

Base Price: ₹{basePrice.toFixed(2)} per {itemData?.UomName || 'unit'}

- } - handleCancel={CloseModal} - /> +
+ + + { + const cleanedValue = e.target.value.replace(/[^0-9.]/g, ''); + const parts = cleanedValue.split('.'); + e.target.value = + parts.length > 2 + ? `${parts[0]}.${parts.slice(1).join('')}` + : cleanedValue; + }} + /> + + +
+
+ + + {calculatedQty > 0 ? calculatedQty.toFixed(3) : '0.000'} {itemData?.UomName || 'units'} + +
+ {calculatedQty > 0 && ( +
+ + ₹{parseFloat(enteredPrice || 0).toFixed(2)} +
+ )} +
+
+ } + /> +
+
); }; -export default BSBillingEditQuantity; + +export default WeightCalculatePrice; \ No newline at end of file From 585872eb8fbef6e4443910294880c00079b64f00 Mon Sep 17 00:00:00 2001 From: Srinath Date: Fri, 6 Feb 2026 17:25:26 +0530 Subject: [PATCH 12/12] create new component amt and qnt calculation --- .../BSBillingEditQuantity/WeightCalculatePrice.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx index f9e0d20..7b80bf0 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/WeightCalculatePrice.jsx @@ -131,4 +131,4 @@ const WeightCalculatePrice = ({ itemData, CartOrderDetails, onSubmit }) => { ); }; -export default WeightCalculatePrice; \ No newline at end of file +export default WeightCalculatePrice; \ No newline at end of file