3312 lines
134 KiB
JavaScript
3312 lines
134 KiB
JavaScript
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
|
|
import { Form } from 'antd';
|
|
import {
|
|
GlobalOrderCardDetails,
|
|
changeOrderCardDetails,
|
|
changeHoldOrderDtl,
|
|
changePreviousOrderLength,
|
|
GlobalOrderType,
|
|
GlobalReorderProductDetails,
|
|
PreferenceData,
|
|
getConfigType,
|
|
} from '../../../../../Features/BookingScreen/BookingData/BookingData';
|
|
import { Messages } from '../../../../../Components/Notifications/Messages';
|
|
import '../../../../../Styles/BookingScreen/Components/BSBillingTables/BSBillingEditQuantity/BSBillingEditQuantity.scss';
|
|
import { useApplyOfferto_CardDetail } from '../../UtillComponents/BSNavBarOffer/BSNavBarOffer_CustomHooks.jsx';
|
|
import {
|
|
getTemplateData,
|
|
StoredSessionData,
|
|
} from '../../../../../Features/ThemeChange/ThemeChange.js';
|
|
import { GlobalEmpAccessDetail } from '../../../../../Features/AppPage/CenterPage.js';
|
|
import {
|
|
ChangeFullFreeProductList,
|
|
changeFullOfferAppliedProducts,
|
|
ChangeOfferAppliedProducts,
|
|
GlobalFreeProdList,
|
|
GlobalOfferAppliedProducts,
|
|
RemoveOfferAppliedProduct,
|
|
} from '../../../../../Features/Offer/Offernew/BookingOffernew.js';
|
|
import { validateOffers } from '../../BSItemCards/ValidateOffer.jsx';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
import './ComboBillTableEdit.scss';
|
|
import { calculateOverAllQtyLimit } from '../../../../../utils/calculations.js';
|
|
|
|
const ComboEditQtyAndRate = (props) => {
|
|
const dispatch = useDispatch();
|
|
const formRef = useRef(null);
|
|
const quantityInputRef = useRef(null);
|
|
const priceChangeInputRef = useRef(null);
|
|
const {
|
|
setIndex = () => { },
|
|
setEditQtyCombo = () => { },
|
|
setEditRateCombo = () => { },
|
|
} = 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 overAllLimitPreferenece =
|
|
preferenceDatas?.[0]?.['SettingDtlDetails']?.find(
|
|
(item) => (item.SettingIdName?.toLowerCase() === 'overalllimit') && item?.SettingValue === 'Y');
|
|
const itemWiseLimitPreferenece =
|
|
preferenceDatas?.[0]?.['SettingDtlDetails']?.find(
|
|
(item) => item.SettingIdName?.toLowerCase() === 'itemwiselimit' && item?.SettingValue === 'Y');
|
|
const maxQtyLimit = itemWiseLimitPreferenece?.SettingCount || overAllLimitPreferenece?.SettingCount || null;
|
|
|
|
const OverAllproductBasedOfferDatas = useSelector(
|
|
(state) => state?.BookingOFferNew?.OverAllProductBasedProducts,
|
|
shallowEqual
|
|
);
|
|
console.log(overAllLimitPreferenece, "itemWiseLimitPreferenece")
|
|
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 || props?.BSBillingEditRate
|
|
);
|
|
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();
|
|
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 || props.BSBillingEditRate);
|
|
setItemData(props.Productdata);
|
|
setQuantity('');
|
|
setEditedPrice('');
|
|
},
|
|
[props.BSBillingEditQuantity],
|
|
[props.Productdata],
|
|
[props.BSBillingEditRate]
|
|
);
|
|
|
|
useEffect(() => {
|
|
if (props.BSBillingEditQuantity || props.BSBillingEditRate) {
|
|
if (RadioBtnSelection === 'Quantity') {
|
|
setTimeout(() => quantityInputRef.current?.focus(), 100);
|
|
} else if (RadioBtnSelection === 'Rate') {
|
|
setTimeout(() => priceChangeInputRef.current?.focus(), 100);
|
|
}
|
|
}
|
|
}, [RadioBtnSelection, props.BSBillingEditQuantity, props.BSBillingEditRate]);
|
|
|
|
useEffect(() => {
|
|
const handleKeyDown = (event) => {
|
|
const navigationKeys = [
|
|
'ArrowLeft',
|
|
'ArrowRight',
|
|
'ArrowUp',
|
|
'ArrowDown',
|
|
];
|
|
if (event.key === 'Escape' || navigationKeys.includes(event.key)) {
|
|
event.preventDefault();
|
|
if (props.BSBillingEditQuantity) {
|
|
props.handleEditQuantityCancel?.();
|
|
setEditQtyCombo(false);
|
|
}
|
|
if (props.BSBillingEditRate) {
|
|
props.handleEditRateComboCancel?.();
|
|
setEditRateCombo(false);
|
|
}
|
|
return;
|
|
}
|
|
};
|
|
|
|
if (EditOpen) {
|
|
document.addEventListener('keydown', handleKeyDown);
|
|
}
|
|
|
|
return () => {
|
|
document.removeEventListener('keydown', handleKeyDown);
|
|
};
|
|
}, [
|
|
EditOpen,
|
|
preferenceshortcutkey,
|
|
PriceChangeaccess,
|
|
props.Productdata?.Offer,
|
|
props.BSBillingEditQuantity,
|
|
props.BSBillingEditRate,
|
|
]);
|
|
|
|
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 (props?.BSBillingEditRate) {
|
|
setRadioBtnSelection('Rate');
|
|
setEditedPrice(props.Productdata?.OrderRate || 0);
|
|
} else if (props?.BSBillingEditQuantity) {
|
|
setRadioBtnSelection('Quantity');
|
|
}
|
|
}, [
|
|
props?.BSBillingEditRate,
|
|
props?.BSBillingEditQuantity,
|
|
props.Productdata?.OrderRate,
|
|
]);
|
|
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 quantityValidation = async (val) => {
|
|
|
|
setQuantity(val)
|
|
|
|
}
|
|
const AddProductQuantity = async () => {
|
|
// debugger
|
|
|
|
|
|
let newPrice = editedPrice > 0 ? editedPrice : props.Productdata.OrderRate;
|
|
await dispatch(changeHoldOrderDtl(false));
|
|
await dispatch(changePreviousOrderLength(CartOrderDetails?.length));
|
|
|
|
if (RadioBtnSelection === 'Rate') {
|
|
let localId = props.Index;
|
|
let editedProductIndex = CartOrderDetails?.findIndex(
|
|
(e) => e?.localId == localId
|
|
);
|
|
if (editedProductIndex === -1) {
|
|
setMessageType('error');
|
|
setMessageData('Product not found in cart');
|
|
return;
|
|
}
|
|
|
|
const editedProduct = CartOrderDetails[editedProductIndex];
|
|
const existingQty = editedProduct.OrderQty;
|
|
|
|
// Validate rate value
|
|
if (!newPrice || newPrice <= 0) {
|
|
setMessageType('error');
|
|
setMessageData('Please enter a valid rate');
|
|
return;
|
|
}
|
|
|
|
// Update ONLY the rate, use existing quantity
|
|
await handleNormalEditQuantity(
|
|
editedProduct,
|
|
editedProductIndex,
|
|
existingQty,
|
|
newPrice
|
|
);
|
|
|
|
// Reset and close
|
|
setClearQuantity(false);
|
|
setIndex(null);
|
|
setEditQtyCombo(false);
|
|
setEditRateCombo(false);
|
|
setMessageType('success');
|
|
setMessageData('Rate updated successfully');
|
|
return;
|
|
}
|
|
|
|
// When editing quantity, validate quantity input
|
|
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
|
|
);
|
|
if ((overAllLimitPreferenece || itemWiseLimitPreferenece) && maxQtyLimit) {
|
|
if (overAllLimitPreferenece) {
|
|
let removeProds1 = CartOrderDetails?.find((_, index) => index == editedProductIndex)
|
|
let removeProds = CartOrderDetails?.filter((_, index) => index !== editedProductIndex)
|
|
|
|
const calculatedOverAllQty = calculateOverAllQtyLimit(removeProds);
|
|
if ((calculatedOverAllQty + editedQty) > maxQtyLimit) {
|
|
setMessageData(`Overall Quantity Limit Exceeds than ${maxQtyLimit}`);
|
|
setMessageType('warning');
|
|
setQuantity(removeProds1?.OrderQty || 1)
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
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);
|
|
setEditRateCombo(false);
|
|
};
|
|
|
|
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 {
|
|
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 SellingPriceChange = (data) => {
|
|
if (props.Productdata?.Offer > 0) {
|
|
setMessageData(
|
|
'You cant Change Price Because You Applied Offer This Product'
|
|
);
|
|
setMessageType('error');
|
|
setDisableSubmitButton(true);
|
|
return;
|
|
}
|
|
if (data?.target.value) {
|
|
const sellingPrice = parseFloat(props.Productdata?.SellingPrice || 0);
|
|
const limit = parseFloat(props.Productdata?.DiscountLimit || 0);
|
|
const limitType = props.Productdata?.DiscountLimitType;
|
|
const enteredDiscount = parseFloat(data?.target.value);
|
|
|
|
if (limit === null || limit === undefined || limit === 0) {
|
|
if (
|
|
parseFloat(enteredDiscount) < parseFloat(sellingPrice) ||
|
|
parseFloat(enteredDiscount) === parseFloat(sellingPrice)
|
|
) {
|
|
setEditedPrice(enteredDiscount);
|
|
setDisableSubmitButton(true);
|
|
} else {
|
|
setMessageType('error');
|
|
setMessageData('Please Give less than value for sell price');
|
|
setDisableSubmitButton(false);
|
|
setEditedPrice(0);
|
|
formRef.current?.resetFields();
|
|
}
|
|
return;
|
|
}
|
|
|
|
let maxDiscount = 0;
|
|
if (limitType === 'F') {
|
|
maxDiscount = limit;
|
|
} else if (limitType === 'P') {
|
|
const afterdiscountfullamount = (sellingPrice * limit) / 100;
|
|
maxDiscount = afterdiscountfullamount;
|
|
}
|
|
|
|
if (enteredDiscount === maxDiscount) {
|
|
setEditedPrice(data?.target.value);
|
|
setDisableSubmitButton(true);
|
|
return;
|
|
}
|
|
|
|
if (enteredDiscount < maxDiscount) {
|
|
setMessageType('error');
|
|
setMessageData(`You cannot sell below ₹${maxDiscount.toFixed(2)}`);
|
|
setEditedPrice(0);
|
|
setDisableSubmitButton(false);
|
|
return;
|
|
}
|
|
setDisableSubmitButton(true);
|
|
setEditedPrice(data?.target.value);
|
|
} else {
|
|
setDisableSubmitButton(false);
|
|
setEditedPrice(0);
|
|
}
|
|
};
|
|
|
|
const onRadioBtnChange = (data) => {
|
|
setRadioBtnSelection(data);
|
|
};
|
|
|
|
useEffect(() => {
|
|
const handleOutsideClick = (e) => {
|
|
if (
|
|
quantityInputRef.current &&
|
|
!quantityInputRef.current.contains(e.target) &&
|
|
priceChangeInputRef.current &&
|
|
!priceChangeInputRef.current.contains(e.target)
|
|
) {
|
|
setIndex(null);
|
|
setEditQtyCombo(false);
|
|
setEditRateCombo(false);
|
|
}
|
|
};
|
|
|
|
document.addEventListener('mousedown', handleOutsideClick);
|
|
return () => {
|
|
document.removeEventListener('mousedown', handleOutsideClick);
|
|
};
|
|
}, []);
|
|
|
|
return (
|
|
<div className="BSBilling-EditQuantity-Modal">
|
|
<Messages
|
|
messageType={messageType}
|
|
messageData={messageData}
|
|
onComplete={onComplete}
|
|
/>
|
|
<Form
|
|
onFinish={(values) => {
|
|
if (RadioBtnSelection === 'Rate' && !disableSubmitButton) {
|
|
return;
|
|
}
|
|
AddProductQuantity(values);
|
|
}}
|
|
>
|
|
{RadioBtnSelection == 'Quantity' && (
|
|
<>
|
|
<input
|
|
ref={quantityInputRef}
|
|
type="number"
|
|
value={Quantity}
|
|
min="0"
|
|
onChange={(e) => quantityValidation(e.target.value)}
|
|
onBlur={() => {
|
|
if (Quantity && String(Quantity || '').trim() !== '') {
|
|
AddProductQuantity();
|
|
}
|
|
}}
|
|
className="EditQTYcomboInput"
|
|
placeholder="Enter Qty"
|
|
/>
|
|
</>
|
|
)}
|
|
{RadioBtnSelection == 'Rate' && (
|
|
<>
|
|
<div className="EditQuantity-PriceChange">
|
|
<input
|
|
autoFocus
|
|
ref={priceChangeInputRef}
|
|
value={editedPrice}
|
|
autoComplete="off"
|
|
onChange={SellingPriceChange}
|
|
onBlur={() => {
|
|
if (
|
|
editedPrice &&
|
|
editedPrice !== '' &&
|
|
disableSubmitButton
|
|
) {
|
|
AddProductQuantity();
|
|
}
|
|
}}
|
|
inputMode="decimal"
|
|
className="EditQTYcomboInputRate"
|
|
placeholder="Enter Rate"
|
|
onInput={(e) => {
|
|
const cleanedValue = e.target.value.replace(/[^0-9.]/g, '');
|
|
const parts = cleanedValue.split('.');
|
|
e.target.value =
|
|
parts.length > 2
|
|
? `${parts[0]}.${parts.slice(1).join('')}`
|
|
: cleanedValue;
|
|
}}
|
|
/>
|
|
</div>
|
|
</>
|
|
)}
|
|
</Form>
|
|
</div>
|
|
);
|
|
};
|
|
export default ComboEditQtyAndRate;
|