From 4c10e3684067e8c8c7b3f671d8935003b7259012 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 6 Feb 2026 13:54:33 +0530 Subject: [PATCH] combo screen edit qty and rate added --- .../BSBillingEditQuantity.jsx | 3 + .../ComboBillTableEdit.scss | 56 + .../ComboBillTableEdit/ComboEditQty.jsx | 3269 +++++++++++++++++ .../ComboBillTableEdit/ComboEditRate.jsx | 3175 ++++++++++++++++ .../ComboSalesBillTable.jsx | 239 +- .../ComboSalesBillTable.scss | 38 +- .../Components/BSCombo/BSC1Payment.jsx | 666 ++-- 7 files changed, 7092 insertions(+), 354 deletions(-) create mode 100644 src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboBillTableEdit.scss create mode 100644 src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditQty.jsx create mode 100644 src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditRate.jsx diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx index 74f5029..ddefcd5 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.jsx @@ -48,6 +48,8 @@ const BSBillingEditQuantity = (props) => { const priceChangeInputRef = useRef(null); const reductionInputRef = useRef(null); + const { setIndex = () => {} } = props; + const [disableSubmitButton, setDisableSubmitButton] = useState(false); const SessionData = useSelector(StoredSessionData); // const AppId = SessionData?.AppId; @@ -670,6 +672,7 @@ const BSBillingEditQuantity = (props) => { props.handleEditQuantityCancel(); setClearQuantity(false); } + setIndex(null); }; const handleEditQuantity = async ( diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboBillTableEdit.scss b/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboBillTableEdit.scss new file mode 100644 index 0000000..6ba8f47 --- /dev/null +++ b/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboBillTableEdit.scss @@ -0,0 +1,56 @@ +.EditQTYcomboInput { + width: 80px; + height: 25px; + border: none; + outline: none !important; + padding: 2px; + text-align: center; + font-family: "Poppins", sans-serif; + font-weight: 500; + vertical-align: middle; + background-color: #1292ee; + color: #fff; + border-radius: 4px; + + &::placeholder { + color: #bdd4ff; + } +} + +.EditQTYcomboInputRate { + width: 80px; + height: 25px; + border: none; + outline: none !important; + padding: 2px !important; + text-align: center; + font-family: "Poppins", sans-serif; + font-weight: 500; + vertical-align: middle; + background-color: #1292ee; + color: #fff; + border-radius: 4px; + font-size: 14px; + margin-top: 0 !important; + padding-top: unset !important; + + &::placeholder { + color: #bdd4ff; + } + + &:hover { + background-color: #1292ee !important; + padding: 2px !important; + } +} +// .EditQuantity-Content .ant-form-item + +.rateTdEditRate { + .ant-form-item { + padding-bottom: 0 !important; + margin-bottom: 0 !important; + } + .ant-form-item-control-input { + min-height: unset; + } +} diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditQty.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditQty.jsx new file mode 100644 index 0000000..64af609 --- /dev/null +++ b/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditQty.jsx @@ -0,0 +1,3269 @@ +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 { + 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 "./ComboBillTableEdit.scss" + +const ComboEditQty = (props) => { + const dispatch = useDispatch(); + const formRef = useRef(null); + const quantityInputRef = useRef(null); + const priceChangeInputRef = useRef(null); + const reductionInputRef = useRef(null); + const { setIndex = () => {}, setEditQtyCombo = () => {} } = 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(''); + 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 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.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') + ) { + 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); + setEditQtyCombo(false); + }; + + const handleEditQuantity = async ( + editedProduct, + editedProductIndex, + newPrice + ) => { + // check itself is a offer product + + const editedQty = + 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 { + 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 updatedProduct = { + ...editedProduct, + OrderQty: qty, + 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 onComplete = useCallback(() => { + setMessageData(null); + setMessageType(null); + }, []); + const onRadioBtnChange = (data) => { + setRadioBtnSelection(data); + }; + + useEffect(() => { + const handleOutsideClick = (e) => { + if ( + quantityInputRef.current && + !quantityInputRef.current.contains(e.target) + ) { + setIndex(null); // 👈 outside click → clear index + setEditQtyCombo(false); + } + }; + + document.addEventListener('mousedown', handleOutsideClick); + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, []); + + return ( +
+ +
{ + if (RadioBtnSelection === 'Price' && !disableSubmitButton) { + return; + } + AddProductQuantity(values); + }} + > + {RadioBtnSelection == 'Quantity' && ( + <> + setQuantity(e.target.value)} + onBlur={() => { + if (Quantity && Quantity.trim() !== '') { + AddProductQuantity(); + } + }} + className="EditQTYcomboInput" + placeholder="Enter Qty" + /> + + )} +
+
+ ); +}; +export default ComboEditQty; diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditRate.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditRate.jsx new file mode 100644 index 0000000..f9d27d2 --- /dev/null +++ b/src/Pages/BookingScreen/Components/BSBillingTables/ComboBillTableEdit/ComboEditRate.jsx @@ -0,0 +1,3175 @@ +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, Input } 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 { + 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 './ComboBillTableEdit.scss'; + +const ComboEditRate = (props) => { + const dispatch = useDispatch(); + const formRef = useRef(null); + const priceChangeInputRef = useRef(null); + + const { setIndex = () => {}, setEditRateCombo = () => {} } = props; + + const [disableSubmitButton, setDisableSubmitButton] = useState(false); + const SessionData = useSelector(StoredSessionData); + 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 [editedPrice, setEditedPrice] = useState(0); + const allowDecimal = preferenceDatas?.[0]?.SettingDtlDetails?.find( + (setting) => + setting?.SettingIdName?.toLowerCase() === 'decimal' && + setting?.SettingValue === 'Y' + ); + const [PackageDtl, setPackageDtl] = useState([]); + 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(() => { + 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); + } + }; + + 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 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 + ) => { + const editedQty = + 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 updatedProduct = { + ...editedProduct, + OrderQty: qty, + 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 onComplete = useCallback(() => { + setMessageData(null); + setMessageType(null); + }, []); + const onRadioBtnChange = (data) => { + setRadioBtnSelection(data); + }; + + 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); + } + }; + + useEffect(() => { + const handleOutsideClick = (e) => { + if ( + priceChangeInputRef.current && + !priceChangeInputRef.current.contains(e.target) + ) { + setIndex(null); // 👈 outside click → clear index + setEditRateCombo(false); + } + }; + + document.addEventListener('mousedown', handleOutsideClick); + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, []); + + return ( + <> + + +
{ + e.preventDefault(); + if (RadioBtnSelection === 'Price' && !disableSubmitButton) { + return; + } + AddProductQuantity({ SellPrice: editedPrice }); + }} + > +
+ { + 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; + }} + /> +
+
+ + ); +}; + +export default ComboEditRate; diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.jsx b/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.jsx index 3bc0ac4..91e2bff 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.jsx +++ b/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import './ComboSalesBillTable.scss'; import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import { Popconfirm, Tooltip } from 'antd'; @@ -73,6 +73,8 @@ import { } from '../../../../../Features/Offer/Offernew/BookingOffernew.js'; import { useRemoveProducts } from '../BSBillingTable3/RemoveCartWithOffer.jsx'; import { useUtilsComponent } from '../../../../../Services/utils.js'; +import ComboEditQty from '../ComboBillTableEdit/ComboEditQty.jsx'; +import ComboEditRate from '../ComboBillTableEdit/ComboEditRate.jsx'; import CustomerPriceHistory from '../../UtillComponents/CustomerPriceHistory.jsx'; const ComboSalesBillTable = () => { @@ -131,7 +133,8 @@ const ComboSalesBillTable = () => { const GetCustId = useSelector(GlobalCustId); const selectedCustomer = useSelector(GlobalSelOption); - const [customerPriceHistoryOpen, setCustomerPriceHistoryOpen] = useState(false); + const [customerPriceHistoryOpen, setCustomerPriceHistoryOpen] = + useState(false); const [customerProduct, setCustomerProduct] = useState(null); const tableDataDinein = tableData?.filter( @@ -145,16 +148,18 @@ const ComboSalesBillTable = () => { OrderType === 'Hold' ? tableData?.filter((a, b) => a.BookingTypeName === 'TakeAway') : tableData?.filter( - (a, b) => a.BookingTypeName === 'TakeAway' && !a?.SalesId - ); + (a, b) => a.BookingTypeName === 'TakeAway' && !a?.SalesId + ); const OldtableDataTakeAway = OrderType != 'Hold' ? tableData?.filter( - (a, b) => a.BookingTypeName === 'TakeAway' && a?.SalesId - ) + (a, b) => a.BookingTypeName === 'TakeAway' && a?.SalesId + ) : []; const [EditQuantity, setEditQuantity] = useState(false); + const [EditQtyCombo, setEditQtyCombo] = useState(false); + const [EditRateCombo, setEditRateCombo] = useState(false); const [Modaldata, setModaldata] = useState([]); const [triggerAnimation, setTriggerAnimation] = useState(true); // const editField = @@ -169,6 +174,32 @@ const ComboSalesBillTable = () => { // const [BillOrderPre, setBillOrderPre] = useState(); // console.log(BillOrderPre,'BillOrderPre'); + const [qtyEdit, setQtyEdit] = useState(false); + const qtyTdRef = useRef(null); + const qtyInputRef = useRef(null); + + const handleEditQTYcombo = () => { + if (!qtyEdit) { + setQtyEdit(true); + } + }; + + // Outside click handler for quantity edit + + useEffect(() => { + const handleOutsideClick = (e) => { + if (qtyEdit && qtyTdRef.current && !qtyTdRef.current.contains(e.target)) { + setQtyEdit(false); // 👈 outside click → close edit + } + }; + + document.addEventListener('mousedown', handleOutsideClick); + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, [qtyEdit]); + // Outside click handler for quantity edit End + useEffect(() => { if (tableOptions?.length > 0) { let editFieldValue = tableOptions?.filter( @@ -255,7 +286,7 @@ const ComboSalesBillTable = () => { const handleCustomerProductPriceHistory = (item) => { setCustomerPriceHistoryOpen(true); setCustomerProduct(item?.ProdId); - } + }; const handleEditQuantity = (value) => { if (OtherServicesglobal && value.Type == 'OS' && value.ServiceType == 'I') { @@ -270,10 +301,43 @@ const ComboSalesBillTable = () => { } } }; + const handleEditQuantityCombo = (value) => { + if (OtherServicesglobal && value.Type == 'OS' && value.ServiceType == 'I') { + setEditQtyCombo(false); + } else { + if (value?.SalesId) { + setEditQtyCombo(false); + } else { + setEditQtyCombo(true); + setEditRateCombo(false); + setModaldata(value); + setIndex(value?.localId); + } + } + }; + const handleEditRateCombo = (value) => { + if (OtherServicesglobal && value.Type == 'OS' && value.ServiceType == 'I') { + setEditRateCombo(false); + } else { + if (value?.SalesId) { + setEditRateCombo(false); + } else { + setEditRateCombo(true); + setModaldata(value); + setIndex(value?.localId); + } + } + }; const handleEditQuantityCancel = () => { setEditQuantity(false); }; + const handleEditQuantityComboCancel = () => { + setEditQtyCombo(false); + }; + const handleEditRateComboCancel = () => { + setEditRateCombo(false); + }; const OpenEditTotalAmount = () => { setOpenEditTotalAmt(true); @@ -1058,9 +1122,9 @@ const ComboSalesBillTable = () => { )?.map((item, idx) => idx === 0 ? { - ...item, - FreeQty, - } + ...item, + FreeQty, + } : item ), }; @@ -2115,9 +2179,11 @@ const ComboSalesBillTable = () => { {/* Delete */} {item.OptionName === 'Delete' && ( - + key={item.OptionId} + > {tableData?.length > 0 ? ( { tableDataDinein?.length >= PreviousdataLength ? 'wheat' : BookingType !== 'Dine In' && - triggerAnimation && - OldtableDataTakeAway?.length + index === 0 && - tableDataDinein?.length >= PreviousdataLength && - !HoldOrderDtl && - !UnpaidData + triggerAnimation && + OldtableDataTakeAway?.length + index === 0 && + tableDataDinein?.length >= PreviousdataLength && + !HoldOrderDtl && + !UnpaidData ? 'wheat' : 'inherit' : 'none', background: row?.SalesId ? 'rgb(243, 248, 213)' : GlobEstBooking === 'ParEst' && - GlobProdwisedata?.includes( - row?.InwardDtlId + ' ' + row?.BookingTypeName - ) + GlobProdwisedata?.includes( + row?.InwardDtlId + ' ' + row?.BookingTypeName + ) ? '#b2d1f7' : (OldtableDataTakeAway?.length + index) % 2 === 0 ? 'white' @@ -2228,39 +2294,37 @@ const ComboSalesBillTable = () => { {/* Product Name / Item */} {(item.OptionName === 'Item' || item.OptionName === 'Product Name') && ( - - row.FullProductIdentifierDtls?.length > 0 || - row.ProductIdentifierDtls?.length > 0 - ? handleImeiDetails(row) - : editField && handleEditQuantity(row) - } - > - {row?.Type !== 'OS' ? row.ProdName : row.ServiceName} - {row?.BrandName ? ` ${row.BrandName}` : ''} - {row?.Type !== 'C' && ( -

- {/* {row?.ProdVariantName} {row?.Size} {row?.UomName} */} - ( - {!row?.ProdVariantName?.toLowerCase()?.includes( - 'variant' - ) && {row?.ProdVariantName} } - {row?.Size} - {row?.SinglePc == 'Y' ? 'PCS' : row?.UomName} - - ) + + row.FullProductIdentifierDtls?.length > 0 || + row.ProductIdentifierDtls?.length > 0 + ? handleImeiDetails(row) + : editField && handleEditQuantity(row) + } + > + {row?.Type !== 'OS' ? row.ProdName : row.ServiceName} + {row?.BrandName ? ` ${row.BrandName}` : ''} + {row?.Type !== 'C' && ( +

+ {/* {row?.ProdVariantName} {row?.Size} {row?.UomName} */} + ( + {!row?.ProdVariantName?.toLowerCase()?.includes( + 'variant' + ) && {row?.ProdVariantName} } + {row?.Size} + {row?.SinglePc == 'Y' ? 'PCS' : row?.UomName}) +

+ )} + {row?.Type === 'C' && + row.ProdDetail?.map((prod, idx) => ( +

+ {prod.ProdName} - {prod.Size} {prod.UomName}

- )} - {row?.Type === 'C' && - row.ProdDetail?.map((prod, idx) => ( -

- {prod.ProdName} - {prod.Size} {prod.UomName} -

- ))} - - )} + ))} + + )} {/* Barcode */} {item.OptionName === 'Barcode' && ( @@ -2276,11 +2340,36 @@ const ComboSalesBillTable = () => { {/* Quantity */} {item.OptionName === 'Quantity' && ( editField && handleEditQuantity(row)} + // className="qtyTd" + className={ + EditQtyCombo && row?.localId === Index + ? 'EditQTYcomboTD' + : 'qtyTd' + } + onClick={() => + editField && handleEditQuantityCombo(row) + } + // onClick={() => handleEditQTYcombo()} > - {row.OrderQty} + {(!EditQtyCombo || row?.localId !== Index) && ( + <>{row.OrderQty} + )} + {EditQtyCombo && row?.localId === Index && ( + + )} )} @@ -2288,12 +2377,31 @@ const ComboSalesBillTable = () => { {item.OptionName === 'Rate' && ( editField && handleEditQuantity(row)} + // className="rateTd" + className={EditRateCombo ? 'rateTdEditRate' : 'rateTd'} + // onClick={() => editField && handleEditQuantity(row)} + onClick={() => editField && handleEditRateCombo(row)} > - {allowDecimal - ? Number(row?.OrderRate).toFixed(2) - : Number(row?.OrderRate)} + {!EditRateCombo || row?.localId !== Index ? ( + <> + {allowDecimal + ? Number(row?.OrderRate).toFixed(2) + : Number(row?.OrderRate)} + + ) : null} + {EditRateCombo && row?.localId === Index && ( + + )} )} @@ -2306,9 +2414,9 @@ const ComboSalesBillTable = () => { > {row?.Offer > 0 ? `${( - (row.Offer / (row?.OrderQty * row?.OrderRate)) * - 100 - ).toFixed(2)}%` + (row.Offer / (row?.OrderQty * row?.OrderRate)) * + 100 + ).toFixed(2)}%` : '-'} )} @@ -2411,9 +2519,10 @@ const ComboSalesBillTable = () => { BSBillingEditQuantity={EditQuantity} Productdata={Modaldata} Index={Index} + setIndex={setIndex} /> )} - {(customerPriceHistoryOpen && GetCustId) && + {customerPriceHistoryOpen && GetCustId && ( { setCustomerProduct={setCustomerProduct} selectedCustomer={selectedCustomer} /> - } + )} ); }; diff --git a/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.scss b/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.scss index eae06b9..ece0711 100644 --- a/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.scss +++ b/src/Pages/BookingScreen/Components/BSBillingTables/ComboSalesBillTable/ComboSalesBillTable.scss @@ -1,8 +1,8 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"); .combo-sales-bill-table { width: 100%; - font-family: 'Inter', sans-serif; + font-family: "Inter", sans-serif; .bill-table { width: 100%; @@ -22,7 +22,7 @@ border: 1px solid #9c9c9c; font-size: 13px; white-space: nowrap; - font-family: 'Poppins', sans-serif !important; + font-family: "Poppins", sans-serif !important; } } } @@ -102,7 +102,7 @@ } .rateTd { width: 90px; - text-align: right; + text-align: center; } .discPerTh { text-align: center; @@ -119,7 +119,7 @@ text-align: right; } .totalTh { - text-align: center; + text-align: right; width: 170px; } .totalTd { @@ -161,3 +161,31 @@ text-align: right; } } + +.EditQTYcomboInput { + width: 80px; + height: 25px; + border: none; + outline: none !important; + padding: 2px; + text-align: center; + font-family: "Poppins", sans-serif; + font-weight: 500; + vertical-align: middle; + background-color: #1292ee; + color: #fff; + border-radius: 4px; + + &::placeholder { + color: #bdd4ff; + } +} + +.EditQTYcomboTD { + padding: 1px !important; + text-align: center; +} +.rateTdEditRate { + padding: 1px !important; + text-align: center; +} diff --git a/src/Pages/BookingScreen/Components/BSCombo/BSC1Payment.jsx b/src/Pages/BookingScreen/Components/BSCombo/BSC1Payment.jsx index 0e78cd1..246f9c7 100644 --- a/src/Pages/BookingScreen/Components/BSCombo/BSC1Payment.jsx +++ b/src/Pages/BookingScreen/Components/BSCombo/BSC1Payment.jsx @@ -243,7 +243,11 @@ import CardPopover from '../BSBillingTables/StandardTable/Utils/CardPopover.jsx' import UpiPopover from '../BSBillingTables/StandardTable/Utils/UpiPopOver.jsx'; import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js'; import { getPaymentOptionsData } from '../../../../Features/BookingScreen/BookingData/KioskBookingData.js'; -import { GlobalFreeProdList, GlobalOfferAppliedProducts, GlobalOverAllOfferAmt } from '../../../../Features/Offer/Offernew/BookingOffernew.js'; +import { + GlobalFreeProdList, + GlobalOfferAppliedProducts, + GlobalOverAllOfferAmt, +} from '../../../../Features/Offer/Offernew/BookingOffernew.js'; import BSNavBarTable from '../UtillComponents/BSNavBarTable.jsx'; import pozologoimg from '../../../../Images/pozologoimg.png'; import PaymentGatewayEmbedded from '../UtillComponents/PaymentGatewayEmbedded.jsx'; @@ -266,7 +270,9 @@ const BSC1Payment = (props) => { const navigate = useNavigate(); const salesBillEdit = useSelector(GlobalSalesBillEdit); const previousOrderPayment = useSelector(GlobalPreviousOrderPayment); - const previousOrderOfferDetails = useSelector(GlobalPreviousOrderOfferDetails); + const previousOrderOfferDetails = useSelector( + GlobalPreviousOrderOfferDetails + ); const AllPaymentOptions = useSelector(GlobalpaymentOptionData); const SessionData = useSelector(StoredSessionData); const BranchFinancialStatus = useSelector(GlobalBranchFinancialStatus); @@ -349,11 +355,15 @@ const BSC1Payment = (props) => { (preference) => preference?.PreferredCatName === 'Common Module' )?.PreferenceCatDetails; const sportsAppPreference = commonModulePreference?.find( - (preference) => preference?.PreferredSubCatName === 'SportsApp' - && + (preference) => + preference?.PreferredSubCatName === 'SportsApp' && preference?.PreferredStatus == 'Y' ); - console.log(sportsAppPreference,commonModulePreference,"sportsAppPreference") + console.log( + sportsAppPreference, + commonModulePreference, + 'sportsAppPreference' + ); const bookingTypePreference = appPreferences?.find( (preference) => preference?.PreferredCatName === 'Booking Type' )?.PreferenceCatDetails; @@ -683,7 +693,6 @@ const BSC1Payment = (props) => { }, [salesBillEdit]); useEffect(() => { - if (salesBillEdit) { if (SelCustId) { setRefundPayBtns(AllPaymentOptions); @@ -698,8 +707,7 @@ const BSC1Payment = (props) => { setRefundPayBtns(withoutCustomer); } } - - }, [AllPaymentOptions, SelCustId, salesBillEdit]) + }, [AllPaymentOptions, SelCustId, salesBillEdit]); useEffect(() => { if (!preOrder) { @@ -760,14 +768,21 @@ const BSC1Payment = (props) => { const filteredPayments = previousOrderPayment?.filter( - p => p?.LastOrderTran === 'Y' && p?.AfterAdjustment != null && p?.AfterAdjustment !== '' && p?.AfterAdjustment + (p) => + p?.LastOrderTran === 'Y' && + p?.AfterAdjustment != null && + p?.AfterAdjustment !== '' && + p?.AfterAdjustment ) || []; const paymentsToUse = - filteredPayments.length > 0 ? filteredPayments : previousOrderPayment || []; + filteredPayments.length > 0 + ? filteredPayments + : previousOrderPayment || []; const totalPreviouspayment = paymentsToUse?.reduce( - (acc, payment) => acc + parseFloat(payment.AfterAdjustment || payment.Amount || 0), + (acc, payment) => + acc + parseFloat(payment.AfterAdjustment || payment.Amount || 0), 0 ); @@ -776,23 +791,38 @@ const BSC1Payment = (props) => { 0 ); - const previousNetAmount = - (totalPreviouspayment) || 0; + const previousNetAmount = totalPreviouspayment || 0; let withdiscTotal = - Total - ((OverAllSales || 0) + (OverAllEstimate || 0) + + Total - + ((OverAllSales || 0) + + (OverAllEstimate || 0) + (Discount > 0 ? Discount : 0)); const currentOrderNetAmount = formatAmount( withdiscTotal >= 0 ? (Number(withdiscTotal) + Number(globalTipAmount)).toFixed(2) : (Number(Total) + Number(globalTipAmount)).toFixed(2) - ) + ); - setTotalAmount(salesBillEdit ? (currentOrderNetAmount > previousNetAmount) ? (currentOrderNetAmount - previousNetAmount) : 0 : currentOrderNetAmount); + setTotalAmount( + salesBillEdit + ? currentOrderNetAmount > previousNetAmount + ? currentOrderNetAmount - previousNetAmount + : 0 + : currentOrderNetAmount + ); setCurrentOrderNetAmount(currentOrderNetAmount); setPreviousNetAmount(previousNetAmount); - dispatch(changeSummeryTotalAmount(salesBillEdit ? (currentOrderNetAmount > previousNetAmount) ? (currentOrderNetAmount - previousNetAmount) : 0 : currentOrderNetAmount)); + dispatch( + changeSummeryTotalAmount( + salesBillEdit + ? currentOrderNetAmount > previousNetAmount + ? currentOrderNetAmount - previousNetAmount + : 0 + : currentOrderNetAmount + ) + ); dispatch(changeSummeryComboOfferAmount(withComboSum)); @@ -812,7 +842,7 @@ const BSC1Payment = (props) => { OverAllEstimate, globalTipAmount, OtherServiceTicketClaim, - Discount + Discount, ]); useEffect(() => { let data = { @@ -1233,7 +1263,11 @@ const BSC1Payment = (props) => { const handleButtonClick = () => { if (qrCode && SelectedUPIPayOption === 'Default') { UpiPayment(); - } else if (salesBillEdit && currentOrderNetAmount < previousNetAmount && !refundPaySelected) { + } else if ( + salesBillEdit && + currentOrderNetAmount < previousNetAmount && + !refundPaySelected + ) { setMessageType('warning'); setMessageData('Please Select Refund Payment Method'); return; @@ -1425,7 +1459,7 @@ const BSC1Payment = (props) => { const handleRefundPaymentMode = (id, name) => { setRefundPaySelected(id); setRefundPaySelectedName(name); - } + }; const AddCardOption = (data) => { setSelectedCardOption(data); @@ -1774,7 +1808,7 @@ const BSC1Payment = (props) => { const selectedStyle = stylesMap[ - printerTemplateStyle == undefined ? 'Style 13' : printerTemplateStyle + printerTemplateStyle == undefined ? 'Style 13' : printerTemplateStyle ]; if (selectedStyle) { @@ -2171,15 +2205,15 @@ const BSC1Payment = (props) => { OrderStatus: 'O', OrderType: BookingType === 'Dine In' || - BookingTypeBoth || - Estimation?.SettingValue == 'N' + BookingTypeBoth || + Estimation?.SettingValue == 'N' ? 'S' : GlobEstBooking === 'OvrAllEst' ? 'E' : GlobEstBooking === 'ParEst' ? GlobProdwisedata?.includes( - a.InwardDtlId + ' ' + a?.BookingTypeName - ) + a.InwardDtlId + ' ' + a?.BookingTypeName + ) ? 'E' : 'S' : 'S', @@ -2263,7 +2297,7 @@ const BSC1Payment = (props) => { : Paybtnnameselected?.toLowerCase() === 'credit' ? 'S' : Paybtnnameselected?.toLowerCase() === 'upi' && - SelectedUPIPayOption?.toLowerCase() === 'default' + SelectedUPIPayOption?.toLowerCase() === 'default' ? 'S' : 'P', OrderDtlDetails: @@ -2280,87 +2314,115 @@ const BSC1Payment = (props) => { ? globalTipAmount === 0 ? SelectedTableDetails : SelectedTableDetails?.map((item) => ({ - ...item, - TipsAmount: globalTipAmount, - })) + ...item, + TipsAmount: globalTipAmount, + })) : null, // "Credit": TotalAmount, // "Debit": 0, SalesPaymentType: 'normal', PaymentDetail: [ { - PaymentType: (salesBillEdit && currentOrderNetAmount < previousNetAmount) ? refundPaySelected : - Paybtnnameselected?.toLowerCase() === 'upi' - ? SelectedUPIPayOption?.toLowerCase() === 'pd' - ? PaymentDeviceUPI?.[0]?.ModeId - : SelectedUPIPayOption?.toLowerCase() === 'pg' - ? PaymentgatewayUPI?.[0]?.ModeId - : SelectedUPIPayOption?.toLowerCase() === 'business' - ? BusinessPayOption?.find( - (busupi) => busupi?.ModeId === UpiId - )?.ModeId - : paybtnselected - : paybtnselected - ? paybtnselected - : null, - Amount: (salesBillEdit && currentOrderNetAmount < previousNetAmount) ? previousNetAmount - currentOrderNetAmount : Math.round(TotalAmount), - MerchantId: (salesBillEdit && currentOrderNetAmount < previousNetAmount) ? null : - Paybtnnameselected?.toLowerCase() === 'upi' && - SelectedUPIPayOption?.toLowerCase() === 'business' - ? BusinessPayOption?.find((busupi) => busupi?.ModeId === UpiId) - ?.MerchantId - : null, - PaymentOptionType: (salesBillEdit && currentOrderNetAmount < previousNetAmount) && (refundPaySelectedName?.toLowerCase() === 'cash' || refundPaySelectedName?.toLowerCase() === 'credit') ? 'PC' : - Paybtnnameselected?.toLowerCase() === 'cash' - ? 'PC' - : Paybtnnameselected?.toLowerCase() === 'credit' - ? 'PC' - : Paybtnnameselected?.toLowerCase() === 'card' - ? SelectedCardOption - : Paybtnnameselected?.toLowerCase() === 'upi' - ? SelectedUPIPayOption?.toLowerCase() === 'default' - ? 'PC' - : SelectedUPIPayOption?.toLowerCase() === 'business' - ? 'BU' - : SelectedUPIPayOption - : null, - ModeOfPayment: (salesBillEdit && currentOrderNetAmount < previousNetAmount) ? null : - SelectedUPIPayOption?.toLowerCase() === 'default' - ? PaymentUpiOptions?.find((upipay) => upipay?.UPIId === UpiId) - ?.UPIDetailId - : SelectedUPIPayOption?.toLowerCase() === 'business' + PaymentType: + salesBillEdit && currentOrderNetAmount < previousNetAmount + ? refundPaySelected + : Paybtnnameselected?.toLowerCase() === 'upi' + ? SelectedUPIPayOption?.toLowerCase() === 'pd' + ? PaymentDeviceUPI?.[0]?.ModeId + : SelectedUPIPayOption?.toLowerCase() === 'pg' + ? PaymentgatewayUPI?.[0]?.ModeId + : SelectedUPIPayOption?.toLowerCase() === 'business' + ? BusinessPayOption?.find( + (busupi) => busupi?.ModeId === UpiId + )?.ModeId + : paybtnselected + : paybtnselected + ? paybtnselected + : null, + Amount: + salesBillEdit && currentOrderNetAmount < previousNetAmount + ? previousNetAmount - currentOrderNetAmount + : Math.round(TotalAmount), + MerchantId: + salesBillEdit && currentOrderNetAmount < previousNetAmount + ? null + : Paybtnnameselected?.toLowerCase() === 'upi' && + SelectedUPIPayOption?.toLowerCase() === 'business' ? BusinessPayOption?.find((busupi) => busupi?.ModeId === UpiId) - ?.MerchantUPIId + ?.MerchantId : null, - AccountDtl: (salesBillEdit && currentOrderNetAmount < previousNetAmount) ? [] : - Paybtnnameselected?.toLowerCase() === 'upi' && - SelectedUPIPayOption?.toLowerCase() === 'default' - ? useOptions?.[0]?.PaymentDetails?.Payatthecounter?.find( - (upipay) => upipay?.UPIId === UpiId - ) - : (Paybtnnameselected?.toLowerCase() === 'upi' && - SelectedUPIPayOption?.toLowerCase() === 'pd') || - (Paybtnnameselected?.toLowerCase() === 'card' && - SelectedCardOption?.toLowerCase() === 'pd') - ? useOptions?.[0]?.PaymentDetails?.PaymentDevice - : (Paybtnnameselected?.toLowerCase() === 'upi' && - SelectedUPIPayOption?.toLowerCase() === 'pg') || - (Paybtnnameselected?.toLowerCase() === 'card' && - SelectedCardOption?.toLowerCase() === 'pg') - ? useOptions?.[0]?.PaymentDetails?.PaymentGateway - : [], - PaymentStatus: (salesBillEdit && currentOrderNetAmount < previousNetAmount) ? 'S' : - Paybtnnameselected?.toLowerCase() === 'cash' - ? 'S' - : Paybtnnameselected?.toLowerCase() === 'credit' - ? 'S' - : Paybtnnameselected?.toLowerCase() === 'upi' && + PaymentOptionType: + salesBillEdit && + currentOrderNetAmount < previousNetAmount && + (refundPaySelectedName?.toLowerCase() === 'cash' || + refundPaySelectedName?.toLowerCase() === 'credit') + ? 'PC' + : Paybtnnameselected?.toLowerCase() === 'cash' + ? 'PC' + : Paybtnnameselected?.toLowerCase() === 'credit' + ? 'PC' + : Paybtnnameselected?.toLowerCase() === 'card' + ? SelectedCardOption + : Paybtnnameselected?.toLowerCase() === 'upi' + ? SelectedUPIPayOption?.toLowerCase() === 'default' + ? 'PC' + : SelectedUPIPayOption?.toLowerCase() === 'business' + ? 'BU' + : SelectedUPIPayOption + : null, + ModeOfPayment: + salesBillEdit && currentOrderNetAmount < previousNetAmount + ? null + : SelectedUPIPayOption?.toLowerCase() === 'default' + ? PaymentUpiOptions?.find((upipay) => upipay?.UPIId === UpiId) + ?.UPIDetailId + : SelectedUPIPayOption?.toLowerCase() === 'business' + ? BusinessPayOption?.find( + (busupi) => busupi?.ModeId === UpiId + )?.MerchantUPIId + : null, + AccountDtl: + salesBillEdit && currentOrderNetAmount < previousNetAmount + ? [] + : Paybtnnameselected?.toLowerCase() === 'upi' && SelectedUPIPayOption?.toLowerCase() === 'default' + ? useOptions?.[0]?.PaymentDetails?.Payatthecounter?.find( + (upipay) => upipay?.UPIId === UpiId + ) + : (Paybtnnameselected?.toLowerCase() === 'upi' && + SelectedUPIPayOption?.toLowerCase() === 'pd') || + (Paybtnnameselected?.toLowerCase() === 'card' && + SelectedCardOption?.toLowerCase() === 'pd') + ? useOptions?.[0]?.PaymentDetails?.PaymentDevice + : (Paybtnnameselected?.toLowerCase() === 'upi' && + SelectedUPIPayOption?.toLowerCase() === 'pg') || + (Paybtnnameselected?.toLowerCase() === 'card' && + SelectedCardOption?.toLowerCase() === 'pg') + ? useOptions?.[0]?.PaymentDetails?.PaymentGateway + : [], + PaymentStatus: + salesBillEdit && currentOrderNetAmount < previousNetAmount + ? 'S' + : Paybtnnameselected?.toLowerCase() === 'cash' + ? 'S' + : Paybtnnameselected?.toLowerCase() === 'credit' ? 'S' - : 'P', - Debit: (salesBillEdit && currentOrderNetAmount < previousNetAmount && refundPaySelectedName?.toLowerCase() === 'credit') ? Math.round(previousNetAmount - currentOrderNetAmount) : 0, - Credit: salesBillEdit ? (currentOrderNetAmount > previousNetAmount && refundPaySelectedName?.toLowerCase() === 'credit') ? Math.round(TotalAmount) : 0 : - Paybtnnameselected?.toLowerCase() === 'credit' + : Paybtnnameselected?.toLowerCase() === 'upi' && + SelectedUPIPayOption?.toLowerCase() === 'default' + ? 'S' + : 'P', + Debit: + salesBillEdit && + currentOrderNetAmount < previousNetAmount && + refundPaySelectedName?.toLowerCase() === 'credit' + ? Math.round(previousNetAmount - currentOrderNetAmount) + : 0, + Credit: salesBillEdit + ? currentOrderNetAmount > previousNetAmount && + refundPaySelectedName?.toLowerCase() === 'credit' + ? Math.round(TotalAmount) + : 0 + : Paybtnnameselected?.toLowerCase() === 'credit' ? Math.round(TotalAmount) : 0, }, @@ -2425,14 +2487,14 @@ const BSC1Payment = (props) => { setMessageType('success'); setMessageData( response?.data?.response + - ' ' + - (response?.data?.OrderDetails?.length > 0 - ? response?.data?.OrderId && - extractLastNumberOrderId( - response?.data?.OrderId, - response?.data?.OrderDetails?.[0]?.FYStatus - ) - : '') + ' ' + + (response?.data?.OrderDetails?.length > 0 + ? response?.data?.OrderId && + extractLastNumberOrderId( + response?.data?.OrderId, + response?.data?.OrderDetails?.[0]?.FYStatus + ) + : '') ); response?.data?.OrderDetails?.length > 0 && setPrintOrderDetails([response?.data]); @@ -2583,20 +2645,21 @@ const BSC1Payment = (props) => { item?.PaymentStatus === 'P' ); - if (PayatCounterfilter?.length === 1 || + if ( + PayatCounterfilter?.length === 1 || response?.data?.PaymentOrderDtl?.length === 0 ) { setMessageType('success'); setMessageData( response?.data?.response + - ' ' + - (response?.data?.OrderDetails?.length > 0 - ? response?.data?.OrderId && - extractLastNumberOrderId( - response?.data?.OrderId, - response?.data?.OrderDetails?.[0]?.FYStatus - ) - : '') + ' ' + + (response?.data?.OrderDetails?.length > 0 + ? response?.data?.OrderId && + extractLastNumberOrderId( + response?.data?.OrderId, + response?.data?.OrderDetails?.[0]?.FYStatus + ) + : '') ); response?.data?.OrderDetails?.length > 0 && setPrintOrderDetails([response?.data]); @@ -2700,14 +2763,14 @@ const BSC1Payment = (props) => { } setMessageData( response?.data?.response + - ' ' + - (response?.data?.OrderDetails?.length > 0 - ? response?.data?.OrderId && - extractLastNumberOrderId( - response?.data?.OrderId, - response?.data?.OrderDetails?.[0]?.FYStatus - ) - : '') + ' ' + + (response?.data?.OrderDetails?.length > 0 + ? response?.data?.OrderId && + extractLastNumberOrderId( + response?.data?.OrderId, + response?.data?.OrderDetails?.[0]?.FYStatus + ) + : '') ); if (response?.data?.OrderDetails?.length > 0) { setPrintOrderDetails([response?.data]); @@ -2804,14 +2867,14 @@ const BSC1Payment = (props) => { setMessageType('success'); setMessageData( bookingpaymentupdate?.data?.response + - ' ' + - (bookingpaymentupdate?.data?.OrderDetails?.length > 0 - ? bookingpaymentupdate?.data?.OrderId && - extractLastNumberOrderId( - bookingpaymentupdate?.data?.OrderId, - bookingpaymentupdate?.data?.OrderDetail?.[0]?.FYStatus - ) - : '') + ' ' + + (bookingpaymentupdate?.data?.OrderDetails?.length > 0 + ? bookingpaymentupdate?.data?.OrderId && + extractLastNumberOrderId( + bookingpaymentupdate?.data?.OrderId, + bookingpaymentupdate?.data?.OrderDetail?.[0]?.FYStatus + ) + : '') ); bookingpaymentupdate?.data?.OrderDetails?.length > 0 && setPrintOrderDetails([bookingpaymentupdate?.data]); @@ -2829,7 +2892,7 @@ const BSC1Payment = (props) => { if ( Date.now() - startTime > useOptions?.[0]?.PDConfigDetails?.[0]?.AutoCancelDurationInMinutes * - 60000 + 60000 ) { // 60,000 ms = 1 minute @@ -3848,30 +3911,31 @@ const BSC1Payment = (props) => { (BookingType === 'Dine In' || BookingTypeBoth || CheckOrderType?.length > 0) && - !unpaidFlow && - OrderStatus + !unpaidFlow && + OrderStatus ? 'none' : 'auto', opacity: (BookingType === 'Dine In' || BookingTypeBoth || CheckOrderType?.length > 0) && - !unpaidFlow && - OrderStatus + !unpaidFlow && + OrderStatus ? 0.5 : 1, }} > - {paybtns?.length > 0 && (currentOrderNetAmount >= previousNetAmount) ? ( + {paybtns?.length > 0 && + currentOrderNetAmount >= previousNetAmount ? ( paybtns?.map((payment) => (
)) - ) : (currentOrderNetAmount < previousNetAmount && salesBillEdit && refundPayBtns.length > 0) ? ( + ) : currentOrderNetAmount < previousNetAmount && + salesBillEdit && + refundPayBtns.length > 0 ? ( refundPayBtns.map((payment) => (
+
+
Dis
+
:
+
+ {' '} + {Discount}{' '} +
+
@@ -4120,61 +4202,19 @@ const BSC1Payment = (props) => { {/* {item?.OptionName=="Hold" && */} {unpaidFlow == false ? item?.OptionName == 'Hold' && - BookingType !== 'Dine In' && - !BookingTypeBoth && - OrderCardDetail?.length != 0 && - CheckOrderType?.length === 0 && - OrderType != 'Failed' && - CheckBookingStatus != 'Close' && - !addnewAccess && ( - - {' '} -
- AddBookingDetails('Hold')} - style={{ - cursor: 'pointer', - // color: '' ? '#52c41a' : '#1292EE', - }} - />{' '} - {/*

Hold

*/} -
-
- ) - : ''} - - {unpaidFlow == false - ? item?.OptionName == 'Hold' && - BookingType !== 'Dine In' && - !BookingTypeBoth && - Holddata?.length > 0 && - OrderCardDetail?.length == 0 && - CheckBookingStatus != 'Close' && - !addnewAccess && ( - - {' '} - + BookingType !== 'Dine In' && + !BookingTypeBoth && + OrderCardDetail?.length != 0 && + CheckOrderType?.length === 0 && + OrderType != 'Failed' && + CheckBookingStatus != 'Close' && + !addnewAccess && ( + + {' '}
{ > HandleholdModelOpen()} + onClick={() => AddBookingDetails('Hold')} style={{ cursor: 'pointer', - // color: Holddata ? '#52c41a' : 'default', - pointerEvents: - OrderType === 'Failed' ? 'none' : 'auto', + // color: '' ? '#52c41a' : '#1292EE', }} - /> + />{' '} + {/*

Hold

*/}
-
-
- ) + + ) + : ''} + + {unpaidFlow == false + ? item?.OptionName == 'Hold' && + BookingType !== 'Dine In' && + !BookingTypeBoth && + Holddata?.length > 0 && + OrderCardDetail?.length == 0 && + CheckBookingStatus != 'Close' && + !addnewAccess && ( + + {' '} + +
+ HandleholdModelOpen()} + style={{ + cursor: 'pointer', + // color: Holddata ? '#52c41a' : 'default', + pointerEvents: + OrderType === 'Failed' ? 'none' : 'auto', + }} + /> +
+
+
+ ) : ''} {tabledata?.length > 0 && dinePreference && ( <> @@ -4266,9 +4348,9 @@ const BSC1Payment = (props) => { style={{ backgroundColor: OrderCardDetail?.length > 0 || - (selOption?.value === undefined && - GlobalAddCustomerDetails1?.length === 0 && - GetCustId?.CustMobile === undefined) + (selOption?.value === undefined && + GlobalAddCustomerDetails1?.length === 0 && + GetCustId?.CustMobile === undefined) ? 'gray' : '#1292eeff', color: '#fff', @@ -4311,36 +4393,36 @@ const BSC1Payment = (props) => { {FeatureAddonData?.FeatureDtls?.find( (item) => item?.FeatureAddonName?.toLowerCase() === 'preorder' ) && ( - <> - { -
0 || OrderType === 'Failed' - ? 'none' - : 'auto', - opacity: OrderCardDetail?.length > 0 ? 0.5 : 1, - }} - > - - - { - openPreOrder(); - }} - /> - - -
- } - - )} + <> + { +
0 || OrderType === 'Failed' + ? 'none' + : 'auto', + opacity: OrderCardDetail?.length > 0 ? 0.5 : 1, + }} + > + + + { + openPreOrder(); + }} + /> + + +
+ } + + )} {preOrderOpen && } {sportsAppPreference && } {dinePreference && @@ -4498,12 +4580,14 @@ const BSC1Payment = (props) => { addnewAccess ? 'BSC1Payment-div4-button-disable' : FirstPaymentclick === false && - OrderCardDetail?.length > 0 && - paybtnselected && - CheckBookingStatus != 'Close' - ? !OrderStatus ? salesBillEdit && (currentOrderNetAmount < previousNetAmount) ? - 'BSC1Payment-div4-button' - : 'BSC1Payment-div4-button' + OrderCardDetail?.length > 0 && + paybtnselected && + CheckBookingStatus != 'Close' + ? !OrderStatus + ? salesBillEdit && + currentOrderNetAmount < previousNetAmount + ? 'BSC1Payment-div4-button' + : 'BSC1Payment-div4-button' : 'BSC1Payment-div4-button Order' : 'BSC1Payment-div4-button-disable' } @@ -4513,34 +4597,41 @@ const BSC1Payment = (props) => { onClick={handleButtonClick} style={{ borderRadius: '6px 0 0 6px' }} > - {!OrderStatus ? salesBillEdit && (currentOrderNetAmount < previousNetAmount) ?
Refund: ₹{(previousNetAmount || 0) - (currentOrderNetAmount || 0)}
: ( - <> - {isMobile ? ( - `₹ ${safeRound( - OrderType === 'Failed' - ? FailedTotalAmt - : credit && overAllBal >= 0 - ? Math.max(0, TotalAmount - overAllBal) - : TotalAmount - )}` - ) : ( -
- ₹ - = 0 - ? Math.max(0, TotalAmount - overAllBal) - : TotalAmount - )} - /> -
- )} - - + {!OrderStatus ? ( + salesBillEdit && currentOrderNetAmount < previousNetAmount ? ( +
+ Refund: ₹ + {(previousNetAmount || 0) - (currentOrderNetAmount || 0)} +
+ ) : ( + <> + {isMobile ? ( + `₹ ${safeRound( + OrderType === 'Failed' + ? FailedTotalAmt + : credit && overAllBal >= 0 + ? Math.max(0, TotalAmount - overAllBal) + : TotalAmount + )}` + ) : ( +
+ ₹ + = 0 + ? Math.max(0, TotalAmount - overAllBal) + : TotalAmount + )} + /> +
+ )} + + + ) ) : (
ORDER
)} @@ -4730,8 +4821,8 @@ const BSC1Payment = (props) => { columns={columns} data={TableData} dataSource={TableData} - // pagination={handlePageChange} - // onChange={handleChange} + // pagination={handlePageChange} + // onChange={handleChange} /> } @@ -4762,10 +4853,17 @@ const BSC1Payment = (props) => { SplitPaymentModal={Splitpayment} handlesplitpaymentclose={handlesplitpaymentclose} TotalNetAmount={ - OrderType === 'Failed' ? FailedTotalAmt : Math.round(OrderCardDetail?.reduce((acc, data) => data?.TotalAmt + acc, 0) - - ((OverAllSales > 0 ? OverAllSales : 0) + - (OverAllEstimate > 0 ? OverAllEstimate : 0) + - (Discount > 0 ? Discount : 0))) + OrderType === 'Failed' + ? FailedTotalAmt + : Math.round( + OrderCardDetail?.reduce( + (acc, data) => data?.TotalAmt + acc, + 0 + ) - + ((OverAllSales > 0 ? OverAllSales : 0) + + (OverAllEstimate > 0 ? OverAllEstimate : 0) + + (Discount > 0 ? Discount : 0)) + ) } failedOrderData={failedOrderData} />