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 (
+
+
+
+
+ );
+};
+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 (
+ <>
+
+
+
+ >
+ );
+};
+
+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}
/>
|