2026-01-27 18:27:29 +05:30
|
|
|
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
|
|
|
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
|
|
|
|
|
|
import moment from 'moment';
|
2026-02-09 17:28:22 +05:30
|
|
|
|
import { Badge, Tooltip } from 'antd';
|
2026-01-27 18:27:29 +05:30
|
|
|
|
import defaultimage from '../../../../Images/defaultItemImg.png';
|
|
|
|
|
|
import FormHeader from '../../../PageComponents/FormHeader';
|
|
|
|
|
|
import {
|
|
|
|
|
|
SelectedGlobalCardColorDetail,
|
|
|
|
|
|
SelectedGlobalCardFont,
|
|
|
|
|
|
StoredSessionData,
|
|
|
|
|
|
getTemplateData,
|
|
|
|
|
|
} from '../../../../Features/ThemeChange/ThemeChange';
|
|
|
|
|
|
import { Tables } from '../../../../Components/Tables/Table';
|
|
|
|
|
|
import {
|
|
|
|
|
|
GlobalProductSubCategorie,
|
|
|
|
|
|
GlobalItemCard,
|
|
|
|
|
|
getLayoutproductCard,
|
|
|
|
|
|
GlobalOrderCardDetails,
|
|
|
|
|
|
changeOrderCardDetails,
|
|
|
|
|
|
changeSearchedData,
|
|
|
|
|
|
ChangeAllItemData,
|
|
|
|
|
|
GlobalAllItemData,
|
|
|
|
|
|
GlobalCardAccess,
|
|
|
|
|
|
getSelectedFavItems,
|
|
|
|
|
|
GlobalSelectedDatas,
|
|
|
|
|
|
GlobalEditfavItems,
|
|
|
|
|
|
getEditFavItems,
|
|
|
|
|
|
GlobalAccessForOthers,
|
|
|
|
|
|
GlobalAlldat,
|
|
|
|
|
|
Globalothersdata,
|
|
|
|
|
|
GlobalProductCategorie,
|
|
|
|
|
|
getCardDataWithoutSub,
|
|
|
|
|
|
changeothersdata,
|
|
|
|
|
|
ChangeNewQrProduct,
|
|
|
|
|
|
GlobalWSProduct,
|
|
|
|
|
|
GlobalNewQrProduct,
|
|
|
|
|
|
GlobalBookingType,
|
|
|
|
|
|
GlobalSearchData,
|
|
|
|
|
|
getCardDataWithoutSubmodule,
|
|
|
|
|
|
changePreviousOrderLength,
|
|
|
|
|
|
changeHoldOrderDtl,
|
|
|
|
|
|
GlobalReorderHoldDetails,
|
|
|
|
|
|
GlobalWeightScalePort,
|
|
|
|
|
|
GlobalWeightScaleWeight,
|
|
|
|
|
|
GlobalExpDateforHeight,
|
|
|
|
|
|
GlobalOrderType,
|
|
|
|
|
|
GlobalReorderProductDetails,
|
|
|
|
|
|
getConfigType,
|
|
|
|
|
|
GlobalPayementloader,
|
|
|
|
|
|
GlobalPaymentTransactionNumber,
|
|
|
|
|
|
PreferenceData,
|
|
|
|
|
|
changeCardData,
|
|
|
|
|
|
GlobaldraggingComponent,
|
|
|
|
|
|
GlobalisAlphabeticFormat,
|
|
|
|
|
|
GlobalBtoBQuickProductTransfer,
|
|
|
|
|
|
changeBtoBQuickProductTransfer,
|
|
|
|
|
|
GlobalRetailWSSalesType,
|
|
|
|
|
|
GlobalisFavClicked,
|
|
|
|
|
|
GlobalCategorieData,
|
|
|
|
|
|
GlobalSubcategorieData,
|
|
|
|
|
|
GlobalProductCardTrigger,
|
2026-02-09 15:43:03 +05:30
|
|
|
|
GlobalGetmultipleSearchDatas,
|
|
|
|
|
|
getmultipleSearch,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
} from '../../../../Features/BookingScreen/BookingData/BookingData';
|
|
|
|
|
|
import {
|
|
|
|
|
|
GlobalPreOrderAdditem,
|
|
|
|
|
|
GlobalPreOrderList,
|
|
|
|
|
|
GlobalpreOrderOpen,
|
|
|
|
|
|
changepreOrderList,
|
|
|
|
|
|
} from '../../../../Features/BookingScreen/PreOrder/PreOrder';
|
|
|
|
|
|
import { DefaultModal } from '../../../../Components/Modal/DefaultModal';
|
|
|
|
|
|
import { Messages } from '../../../../Components/Notifications/Messages';
|
|
|
|
|
|
import '../../../../Styles/BookingScreen/Components/BSItemCards/BSItemCard.scss';
|
|
|
|
|
|
import WebFont from 'webfontloader';
|
|
|
|
|
|
import FeaturesFunctionalities from '../BookingFunctionality/FeaturesFunctionalities';
|
|
|
|
|
|
import { isMobile } from 'react-device-detect';
|
|
|
|
|
|
import {
|
|
|
|
|
|
Global_OrderOfferDetail,
|
|
|
|
|
|
Global_PromoCodeOffers,
|
|
|
|
|
|
} from '../../../../Features/Offer/Offer';
|
|
|
|
|
|
import {
|
|
|
|
|
|
DndContext,
|
|
|
|
|
|
useSensor,
|
|
|
|
|
|
useSensors,
|
|
|
|
|
|
PointerSensor,
|
|
|
|
|
|
TouchSensor,
|
|
|
|
|
|
closestCenter,
|
|
|
|
|
|
} from '@dnd-kit/core';
|
|
|
|
|
|
import {
|
|
|
|
|
|
SortableContext,
|
|
|
|
|
|
arrayMove,
|
|
|
|
|
|
rectSortingStrategy,
|
|
|
|
|
|
} from '@dnd-kit/sortable';
|
|
|
|
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
|
|
// import './styles.css'; // Your styles if any
|
|
|
|
|
|
|
|
|
|
|
|
// Dummy SortableCard component
|
|
|
|
|
|
import { useSortable } from '@dnd-kit/sortable';
|
|
|
|
|
|
import { CSS } from '@dnd-kit/utilities';
|
|
|
|
|
|
// import HuggingFaceVoiceForm from '../../../VoiceToText/VoiceToText.jsx';
|
|
|
|
|
|
import VoiceToTextItemCard from '../../../VoiceToText/VoiceToTextItemCard.jsx';
|
|
|
|
|
|
import { ExtractDateFormate } from '../../../../Services/Others.js';
|
|
|
|
|
|
import {
|
|
|
|
|
|
changeFreeProductForLoyalty,
|
|
|
|
|
|
ChangeFreeProductList,
|
|
|
|
|
|
ChangeFullFreeProductList,
|
|
|
|
|
|
changeFullOfferAppliedProducts,
|
|
|
|
|
|
ChangeOfferAppliedProducts,
|
|
|
|
|
|
changeOfferAppliedProductsForLoyalty,
|
|
|
|
|
|
changeTriggerOfferFree,
|
|
|
|
|
|
getOfferinBooking,
|
|
|
|
|
|
GlobalFreeProdList,
|
|
|
|
|
|
GlobalOfferAppliedProducts,
|
|
|
|
|
|
GlobalTriggerOfferFree,
|
|
|
|
|
|
RemoveOfferAppliedProduct,
|
|
|
|
|
|
} from '../../../../Features/Offer/Offernew/BookingOffernew.js';
|
|
|
|
|
|
import { validateOffers } from './ValidateOffer.jsx';
|
|
|
|
|
|
import { useSaleswiseOfferWatcher } from './SalesWiseOffer.jsx';
|
|
|
|
|
|
import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLogin.js';
|
|
|
|
|
|
import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js';
|
|
|
|
|
|
import AddProduct from '../../../../Components/AddProduct/AddProduct.jsx';
|
|
|
|
|
|
import { MdOutlineAddShoppingCart } from 'react-icons/md';
|
|
|
|
|
|
import { bulkpostdata } from '../../../../Features/ProductPage/ProductPage.js';
|
|
|
|
|
|
import ProductPriceChange from '../UtillComponents/ProductPriceChange.jsx';
|
2026-02-09 17:28:22 +05:30
|
|
|
|
import ExpireConfirmModal from '../BookingFunctionality/ExpireConfirmModal.jsx';
|
2026-02-24 14:40:44 +05:30
|
|
|
|
import { calculateOverAllQtyLimit } from '../../../../utils/calculations.js';
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
|
|
|
|
|
export function SortableCard({ id, children, item }) {
|
|
|
|
|
|
const {
|
|
|
|
|
|
attributes,
|
|
|
|
|
|
listeners,
|
|
|
|
|
|
setNodeRef,
|
|
|
|
|
|
transform,
|
|
|
|
|
|
transition,
|
|
|
|
|
|
isDragging,
|
|
|
|
|
|
} = useSortable({ id });
|
|
|
|
|
|
const style = {
|
|
|
|
|
|
transform: CSS.Transform.toString(transform),
|
|
|
|
|
|
transition,
|
|
|
|
|
|
opacity: isDragging ? 0.5 : 1,
|
|
|
|
|
|
// Add mobile-specific styling for better touch interaction
|
|
|
|
|
|
// touchAction: 'none', // Prevents default touch behaviors
|
|
|
|
|
|
userSelect: 'none', // Prevents text selection during drag
|
|
|
|
|
|
// Add mobile-specific cursor and visual feedback
|
|
|
|
|
|
cursor: isMobile ? 'grab' : 'default',
|
|
|
|
|
|
// Add a subtle shadow for mobile to indicate draggability
|
|
|
|
|
|
boxShadow: isMobile && !isDragging ? '0 2px 4px rgba(0,0,0,0.1)' : 'none',
|
|
|
|
|
|
};
|
|
|
|
|
|
const draggingComponent = useSelector(GlobaldraggingComponent);
|
|
|
|
|
|
const allowDrag = draggingComponent === 'card';
|
|
|
|
|
|
return (
|
|
|
|
|
|
<div
|
|
|
|
|
|
ref={setNodeRef}
|
|
|
|
|
|
style={style}
|
|
|
|
|
|
{...(allowDrag ? attributes : {})}
|
|
|
|
|
|
{...(allowDrag ? listeners : {})}
|
|
|
|
|
|
>
|
|
|
|
|
|
{children}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const BSItemCard = (props) => {
|
|
|
|
|
|
const cardFunction = props?.cardFunctionality;
|
|
|
|
|
|
// const applyOffer = useApplyOfferto_CardDetail();
|
|
|
|
|
|
const preferenceDatas = useSelector(PreferenceData, shallowEqual);
|
|
|
|
|
|
const { selectedDate } = useDateStore();
|
2026-02-25 16:24:29 +05:30
|
|
|
|
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;
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const preferenceOffer =
|
|
|
|
|
|
preferenceDatas?.[0]?.['SettingDtlDetails']?.find(
|
|
|
|
|
|
(item) => item.SettingIdName === 'Offer'
|
|
|
|
|
|
)?.SettingValue === 'Y';
|
|
|
|
|
|
const preferenceSingleSales =
|
|
|
|
|
|
preferenceDatas?.[0]?.['SettingDtlDetails']?.find(
|
|
|
|
|
|
(item) => item.SettingIdName === 'Single Booking Only'
|
|
|
|
|
|
)?.SettingValue === 'Y';
|
|
|
|
|
|
const AddProductCard =
|
|
|
|
|
|
preferenceDatas?.[0]?.['SettingDtlDetails']?.find(
|
|
|
|
|
|
(item) => item.SettingIdName === 'AddProductCard'
|
|
|
|
|
|
)?.SettingValue === 'N';
|
|
|
|
|
|
// const AddCustomerDetails = useSelector(
|
|
|
|
|
|
// GlobalAddCustomerDetails,
|
|
|
|
|
|
// shallowEqual
|
|
|
|
|
|
// );
|
|
|
|
|
|
const offerAppliedProducts = useSelector(
|
|
|
|
|
|
GlobalOfferAppliedProducts,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
|
|
|
|
|
// const SelectedCust = useSelector(GlobalSelOption, shallowEqual);
|
|
|
|
|
|
const AllCategoryDatas = useSelector(GlobalCategorieData, shallowEqual);
|
|
|
|
|
|
const AllsubcatgoryDatas = useSelector(GlobalSubcategorieData, shallowEqual);
|
|
|
|
|
|
const RetailWSSalesType = useSelector(GlobalRetailWSSalesType, shallowEqual);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const GPreOrderList = useSelector(GlobalPreOrderList, shallowEqual);
|
|
|
|
|
|
const [modelQty, setModelQty] = useState(false);
|
|
|
|
|
|
const [modelstock, setModelstock] = useState(false);
|
|
|
|
|
|
const [ModalVarient, setModalVarient] = useState(false);
|
|
|
|
|
|
const [QtyIndex, setQtyIndex] = useState(0);
|
|
|
|
|
|
const [VarientIndex, setVarientIndex] = useState(0);
|
|
|
|
|
|
const [prodexpir, setProdexpir] = useState(false);
|
|
|
|
|
|
const [initialRun, setInitialRun] = useState(false);
|
|
|
|
|
|
const [Item, setItem] = useState();
|
|
|
|
|
|
const [VarItem, setVarItem] = useState(0);
|
|
|
|
|
|
const [StockItem, setStockItem] = useState();
|
|
|
|
|
|
const [noSubcatCardData, setNoSubcatCardData] = useState();
|
|
|
|
|
|
const [qtydata, setQtydata] = useState();
|
|
|
|
|
|
const [products, setProducts] = useState([
|
|
|
|
|
|
{ id: 1, name: '', price: '', code: '', size: '1', category: '' },
|
|
|
|
|
|
]);
|
|
|
|
|
|
const PreOrderAdditem = useSelector(GlobalPreOrderAdditem, shallowEqual);
|
|
|
|
|
|
const OrderType = useSelector(GlobalOrderType, shallowEqual);
|
|
|
|
|
|
const ProdSubCat = useSelector(GlobalProductSubCategorie);
|
|
|
|
|
|
const ItemCard = useSelector(GlobalItemCard, shallowEqual);
|
|
|
|
|
|
const globaldata = useSelector(GlobalAlldat, shallowEqual);
|
|
|
|
|
|
const { action: quickBranchtoBranchTransfer, selectedProducts } = useSelector(
|
|
|
|
|
|
GlobalBtoBQuickProductTransfer
|
|
|
|
|
|
);
|
|
|
|
|
|
const preOrder = useSelector(GlobalpreOrderOpen, shallowEqual);
|
|
|
|
|
|
const templateData = useSelector(getTemplateData, shallowEqual);
|
|
|
|
|
|
const temp5 = templateData?.BookingLayout?.[0] === 'Layout5';
|
|
|
|
|
|
const OfferCheckedInSetup = templateData?.BookingNavbar?.[1].some(
|
|
|
|
|
|
(item) => item?.OptionName == 'Offer'
|
|
|
|
|
|
);
|
|
|
|
|
|
const globalAllItemdata = useSelector(GlobalAllItemData);
|
|
|
|
|
|
const EditfavItems = useSelector(GlobalEditfavItems);
|
|
|
|
|
|
const BookingType = useSelector(GlobalBookingType);
|
|
|
|
|
|
const ProductSearch = useSelector(GlobalSearchData);
|
|
|
|
|
|
const [SelectedProdNames, setSelectedProdNames] = useState(EditfavItems);
|
|
|
|
|
|
const [PreOrderSelectedProdNames, setPreOrderSelectedProdNames] = useState(
|
|
|
|
|
|
[]
|
|
|
|
|
|
);
|
|
|
|
|
|
const [newMoreProductModel, setNewMoreProductModel] = useState(false);
|
|
|
|
|
|
const CardAccess = useSelector(GlobalCardAccess, shallowEqual);
|
|
|
|
|
|
const globalAccessForOthers = useSelector(
|
|
|
|
|
|
GlobalAccessForOthers,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
|
|
|
|
|
const SelectedCardColor = useSelector(
|
|
|
|
|
|
SelectedGlobalCardColorDetail,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
2026-02-09 18:55:09 +05:30
|
|
|
|
const GetmultipleSearchDatas = useSelector(
|
|
|
|
|
|
GlobalGetmultipleSearchDatas,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const SelectedCardFont = useSelector(SelectedGlobalCardFont, shallowEqual);
|
|
|
|
|
|
const CartOrderDetails = useSelector(GlobalOrderCardDetails, shallowEqual);
|
|
|
|
|
|
const SelectedDatas = useSelector(GlobalSelectedDatas, shallowEqual);
|
|
|
|
|
|
const otherscarddata = useSelector(Globalothersdata, shallowEqual);
|
|
|
|
|
|
const WSProductdata = useSelector(GlobalWSProduct, shallowEqual);
|
|
|
|
|
|
const NewQrProductData = useSelector(GlobalNewQrProduct, shallowEqual);
|
|
|
|
|
|
const ReportholdData = useSelector(GlobalReorderHoldDetails, shallowEqual);
|
2026-02-09 18:55:09 +05:30
|
|
|
|
console.log(GetmultipleSearchDatas, 'GetmultipleSearchDatas');
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const ReorderProductData = useSelector(
|
|
|
|
|
|
GlobalReorderProductDetails,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
|
|
|
|
|
const WeightScalePort = useSelector(GlobalWeightScalePort, shallowEqual);
|
|
|
|
|
|
const WeightScaleWeight = useSelector(GlobalWeightScaleWeight, shallowEqual);
|
|
|
|
|
|
const PaymentTransactionNumber = useSelector(
|
|
|
|
|
|
GlobalPaymentTransactionNumber,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
|
|
|
|
|
const OverAllproductBasedOfferDatas = useSelector(
|
|
|
|
|
|
(state) => state?.BookingOFferNew?.OverAllProductBasedProducts,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
|
|
|
|
|
const PromoCodeOffersDatas = useSelector(
|
|
|
|
|
|
Global_PromoCodeOffers,
|
|
|
|
|
|
shallowEqual
|
|
|
|
|
|
);
|
|
|
|
|
|
const allowDecimal = preferenceDatas?.[0]?.SettingDtlDetails?.find(
|
|
|
|
|
|
(setting) =>
|
|
|
|
|
|
setting?.SettingIdName?.toLowerCase() === 'decimal' &&
|
|
|
|
|
|
setting?.SettingValue === 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
const [messageType, setMessageType] = useState(null);
|
|
|
|
|
|
const [messageData, setMessageData] = useState(null);
|
|
|
|
|
|
const [repeatedModel, setRepeatedModel] = useState(false);
|
|
|
|
|
|
const [StockPreferenceDetail, setStockPreferenceDetail] = useState();
|
|
|
|
|
|
const [QuickAdd, setQuickAdd] = useState(true);
|
|
|
|
|
|
const [onePeiceFlow, setOnePeiceFlow] = useState(false);
|
|
|
|
|
|
const [BillOrderPre, setBillOrderPre] = useState();
|
|
|
|
|
|
const [qtyExpData, setQtyExpData] = useState();
|
|
|
|
|
|
const OrderOfferDetail = useSelector(Global_OrderOfferDetail);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
// const [freeProductsOffers, setfreeProductsOffers] = useState([]);
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const [screenWidth, setScreenWidth] = useState(window.innerWidth);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
// const [screenHeight, setScreenHeight] = useState(window.innerHeight);
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const ProdCat = useSelector(GlobalProductCategorie, shallowEqual);
|
|
|
|
|
|
const paymentloader = useSelector(GlobalPayementloader, shallowEqual);
|
|
|
|
|
|
const SessionData = useSelector(StoredSessionData, shallowEqual);
|
|
|
|
|
|
const AppId = SessionData?.AppId;
|
|
|
|
|
|
const CompId = SessionData?.CompId;
|
|
|
|
|
|
const BranchId = SessionData?.BranchId;
|
|
|
|
|
|
const UserId = SessionData?.UserId;
|
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
|
|
|
|
|
|
|
const voiceTriggerRef = useRef(null);
|
|
|
|
|
|
const scrollContainerRef = useRef(null);
|
|
|
|
|
|
const isDragging = useRef(false);
|
|
|
|
|
|
const startX = useRef(0);
|
|
|
|
|
|
const scrollLeft = useRef(0);
|
|
|
|
|
|
const itemListScrollRef = useRef(null);
|
|
|
|
|
|
const [selectedBrand, setSelectedBrand] = useState('Others');
|
|
|
|
|
|
const [showLeftButton, setShowLeftButton] = useState(false);
|
|
|
|
|
|
const [showRightButton, setShowRightButton] = useState(false);
|
|
|
|
|
|
const [ExpiredProduct, setExpiredProduct] = useState();
|
|
|
|
|
|
const [ConfigDataList, setConfigDataList] = useState([]);
|
|
|
|
|
|
const alphabeticFormat = useSelector(GlobalisAlphabeticFormat);
|
|
|
|
|
|
// const PricingAppPricingName = useSelector(GlobalPricingAppPricingName);
|
|
|
|
|
|
const favouriteCat = useSelector(GlobalisFavClicked, shallowEqual);
|
|
|
|
|
|
const FreeProdList = useSelector(GlobalFreeProdList);
|
|
|
|
|
|
const triggerOfferFree = useSelector(GlobalTriggerOfferFree);
|
|
|
|
|
|
const productCardTrigger = useSelector(GlobalProductCardTrigger);
|
|
|
|
|
|
const appPreferences = useSelector(ApplicationPreferences);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
const [expireModal, setExpireModal] = useState({
|
|
|
|
|
|
open: false,
|
|
|
|
|
|
title: '',
|
|
|
|
|
|
onOk: null,
|
|
|
|
|
|
onCancel: null,
|
|
|
|
|
|
});
|
2026-02-09 18:55:09 +05:30
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const salespagefields = appPreferences?.find(
|
|
|
|
|
|
(pref) => pref?.PreferredCatName === 'Sales Page Fields'
|
|
|
|
|
|
)?.PreferenceCatDetails;
|
|
|
|
|
|
const AvailableDate = salespagefields?.find(
|
|
|
|
|
|
(type) =>
|
|
|
|
|
|
type?.PreferredSubCatName?.toLowerCase() === 'available date' &&
|
|
|
|
|
|
type?.PreferredStatus === 'Y'
|
|
|
|
|
|
);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const SingleMember = salespagefields?.find(
|
|
|
|
|
|
(type) =>
|
|
|
|
|
|
type?.PreferredSubCatName?.toLowerCase() === 'single member' &&
|
|
|
|
|
|
type?.PreferredStatus === 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
useSaleswiseOfferWatcher();
|
|
|
|
|
|
|
|
|
|
|
|
const TakAwayId = ConfigDataList?.find(
|
|
|
|
|
|
(a) => a?.ConfigName === 'TakeAway'
|
|
|
|
|
|
)?.ConfigId;
|
|
|
|
|
|
|
|
|
|
|
|
const DineinId = ConfigDataList?.find(
|
|
|
|
|
|
(a) => a?.ConfigName === 'Dine In'
|
|
|
|
|
|
)?.ConfigId;
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
itemListScrollRef.current?.scrollTo(0, 0);
|
|
|
|
|
|
}, [ProdCat, ProdSubCat, favouriteCat]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (ConfigDataList?.length === 0) {
|
|
|
|
|
|
getBookingTypeId();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
triggerOfferFree &&
|
|
|
|
|
|
CartOrderDetails?.length > 0 &&
|
|
|
|
|
|
FreeProdList?.length > 0
|
|
|
|
|
|
) {
|
|
|
|
|
|
console.log('Before call');
|
|
|
|
|
|
let { ModifiedData, UpdatedFreeProdList, AppliedOffers } =
|
|
|
|
|
|
handleLoyaltyFreeProducts(CartOrderDetails, FreeProdList);
|
|
|
|
|
|
console.log(
|
|
|
|
|
|
'After call',
|
|
|
|
|
|
ModifiedData,
|
|
|
|
|
|
UpdatedFreeProdList,
|
|
|
|
|
|
AppliedOffers
|
|
|
|
|
|
);
|
|
|
|
|
|
console.log(AppliedOffers, 'AppliedOffers');
|
|
|
|
|
|
dispatch(changeOrderCardDetails(ModifiedData));
|
|
|
|
|
|
dispatch(ChangeFullFreeProductList(UpdatedFreeProdList));
|
|
|
|
|
|
dispatch(changeFullOfferAppliedProducts(AppliedOffers));
|
|
|
|
|
|
dispatch(changeTriggerOfferFree(false));
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [triggerOfferFree]);
|
|
|
|
|
|
|
|
|
|
|
|
function handleLoyaltyFreeProducts(orderCardDtls, freeProdDtls) {
|
|
|
|
|
|
if (!freeProdDtls || freeProdDtls.length === 0) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
ModifiedData: orderCardDtls,
|
|
|
|
|
|
UpdatedFreeProdList: freeProdDtls,
|
|
|
|
|
|
AppliedOffers: [],
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const updatedFreeProdList = JSON.parse(JSON.stringify(freeProdDtls)); // deep copy
|
|
|
|
|
|
const AppliedOffers = [];
|
|
|
|
|
|
let ModifiedData = [];
|
|
|
|
|
|
let processedItems = new Set(); // Track processed items
|
|
|
|
|
|
|
|
|
|
|
|
// Helper function to create applied offer object
|
|
|
|
|
|
function createAppliedOffer(
|
|
|
|
|
|
freeProduct,
|
|
|
|
|
|
usedQty,
|
|
|
|
|
|
inwardDtlId,
|
|
|
|
|
|
orderRate,
|
|
|
|
|
|
bookingType
|
|
|
|
|
|
) {
|
|
|
|
|
|
const stockDetail =
|
|
|
|
|
|
freeProduct.ProdVariantDetails?.[0]?.StockDetails?.[0];
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
OfferId: freeProduct.OfferId,
|
|
|
|
|
|
OfferAmount: usedQty * orderRate,
|
|
|
|
|
|
OfferMode: freeProduct.OfferMode,
|
|
|
|
|
|
ActualOfferAmount: usedQty * orderRate,
|
|
|
|
|
|
OfferValue: usedQty * orderRate,
|
|
|
|
|
|
TableName: freeProduct.TableName || 'LoyaltyPointsNew',
|
|
|
|
|
|
TableUniqueName: freeProduct.TableUniqueName || 'FreeProduct',
|
|
|
|
|
|
TableUniqueId: '',
|
|
|
|
|
|
ActualFreeQty: usedQty,
|
|
|
|
|
|
Detail: [],
|
|
|
|
|
|
OfferCode: '',
|
|
|
|
|
|
CustId: freeProduct.CustId || '',
|
|
|
|
|
|
UsedCount: (stockDetail?.ProdLoyaltyPoint || 0) * usedQty,
|
|
|
|
|
|
AppliesTo: '',
|
|
|
|
|
|
BookingType: bookingType === 'Dine In' ? 'DineinId' : 'TakAwayId',
|
|
|
|
|
|
FreeProductsList: {
|
|
|
|
|
|
FreeProdId: freeProduct.FreeProdId,
|
|
|
|
|
|
FreeQty: usedQty,
|
|
|
|
|
|
FreeProdName: freeProduct.FreeProdName,
|
|
|
|
|
|
ProdVariantDetails: [
|
|
|
|
|
|
{
|
|
|
|
|
|
FreeProdVariantName: freeProduct.FreeProdVariantName,
|
|
|
|
|
|
StockDetails: [
|
|
|
|
|
|
{
|
|
|
|
|
|
ProdOfferId: stockDetail?.ProdOfferId || '',
|
|
|
|
|
|
FreeInwardDtlId: inwardDtlId,
|
|
|
|
|
|
ActiveStatus: 'A',
|
|
|
|
|
|
ProdLoyaltyPoint: stockDetail?.ProdLoyaltyPoint || '',
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
},
|
|
|
|
|
|
ProdId: '',
|
|
|
|
|
|
SinglePc: 'N',
|
|
|
|
|
|
StockAvailable: 'N',
|
|
|
|
|
|
ProdVariantName: '',
|
|
|
|
|
|
Type: '',
|
|
|
|
|
|
InwardDtlId: '',
|
|
|
|
|
|
ProdCat: '',
|
|
|
|
|
|
HalfPrice: 'N',
|
|
|
|
|
|
MinQty: '',
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// First, handle existing paid products that can be converted to free
|
|
|
|
|
|
updatedFreeProdList.forEach((freeProduct) => {
|
|
|
|
|
|
if (freeProduct.RemainingQty > 0) {
|
|
|
|
|
|
// Find matching paid products by InwardDtlId
|
|
|
|
|
|
const matchingPaidItems = orderCardDtls.filter(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
freeProduct.ProdVariantDetails?.some((variant) =>
|
|
|
|
|
|
variant.StockDetails?.some(
|
|
|
|
|
|
(stock) => stock.FreeInwardDtlId === item.InwardDtlId
|
|
|
|
|
|
)
|
|
|
|
|
|
) &&
|
|
|
|
|
|
(!item.Offer || item.Offer === 0) &&
|
|
|
|
|
|
!item.OfferType &&
|
|
|
|
|
|
!item.OfferMode &&
|
|
|
|
|
|
!processedItems.has(item.localId) &&
|
|
|
|
|
|
item?.SinglePc !== 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
matchingPaidItems.forEach((paidItem) => {
|
|
|
|
|
|
const remainingFreeQty = freeProduct.RemainingQty;
|
|
|
|
|
|
|
|
|
|
|
|
if (remainingFreeQty <= 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (paidItem.OrderQty === remainingFreeQty) {
|
|
|
|
|
|
// Remove paid item and convert entire quantity to free
|
|
|
|
|
|
const freeItem = {
|
|
|
|
|
|
...paidItem,
|
|
|
|
|
|
Offer: paidItem.OrderQty * paidItem.OrderRate,
|
|
|
|
|
|
OfferType: freeProduct.OfferMode,
|
|
|
|
|
|
OfferMode: freeProduct.OfferMode,
|
|
|
|
|
|
OfferMessage: [
|
|
|
|
|
|
{
|
|
|
|
|
|
OfferId: freeProduct.OfferId,
|
|
|
|
|
|
FreeQty: paidItem.OrderQty,
|
|
|
|
|
|
FreeProdId: freeProduct.FreeProdId,
|
|
|
|
|
|
FreeProdName: freeProduct.FreeProdName,
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
localId: paidItem.localId + '_converted_free',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(freeItem);
|
|
|
|
|
|
|
|
|
|
|
|
// Update free product usage
|
|
|
|
|
|
freeProduct.FreeQty =
|
|
|
|
|
|
(freeProduct.FreeQty || 0) + paidItem.OrderQty;
|
|
|
|
|
|
freeProduct.RemainingQty -= paidItem.OrderQty;
|
|
|
|
|
|
|
|
|
|
|
|
// Create applied offer
|
|
|
|
|
|
AppliedOffers.push(
|
|
|
|
|
|
createAppliedOffer(
|
|
|
|
|
|
freeProduct,
|
|
|
|
|
|
paidItem.OrderQty,
|
|
|
|
|
|
paidItem.InwardDtlId,
|
|
|
|
|
|
paidItem.OrderRate,
|
|
|
|
|
|
paidItem.BookingTypeName
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
processedItems.add(paidItem.localId);
|
|
|
|
|
|
} else if (paidItem.OrderQty > remainingFreeQty) {
|
|
|
|
|
|
// Split: convert available free qty to free, keep excess as paid
|
|
|
|
|
|
const freeQty = remainingFreeQty;
|
|
|
|
|
|
const paidQty = paidItem.OrderQty - remainingFreeQty;
|
|
|
|
|
|
|
|
|
|
|
|
// Create free item
|
|
|
|
|
|
const freeItem = {
|
|
|
|
|
|
...paidItem,
|
|
|
|
|
|
OrderQty: freeQty,
|
|
|
|
|
|
TotalAmt: freeQty * paidItem.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(freeQty * paidItem.OrderRate * paidItem.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
freeQty * paidItem.OrderRate -
|
|
|
|
|
|
(freeQty * paidItem.OrderRate * paidItem.TaxPercentage) / 100,
|
|
|
|
|
|
Offer: freeQty * paidItem.OrderRate,
|
|
|
|
|
|
OfferType: freeProduct.OfferMode,
|
|
|
|
|
|
OfferMode: freeProduct.OfferMode,
|
|
|
|
|
|
OfferMessage: [
|
|
|
|
|
|
{
|
|
|
|
|
|
OfferId: freeProduct.OfferId,
|
|
|
|
|
|
FreeQty: freeQty,
|
|
|
|
|
|
FreeProdId: freeProduct.FreeProdId,
|
|
|
|
|
|
FreeProdName: freeProduct.FreeProdName,
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
localId: paidItem.localId + '_free_part',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Create updated paid item with reduced quantity
|
|
|
|
|
|
const updatedPaidItem = {
|
|
|
|
|
|
...paidItem,
|
|
|
|
|
|
OrderQty: paidQty,
|
|
|
|
|
|
TotalAmt: paidQty * paidItem.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(paidQty * paidItem.OrderRate * paidItem.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
paidQty * paidItem.OrderRate -
|
|
|
|
|
|
(paidQty * paidItem.OrderRate * paidItem.TaxPercentage) / 100,
|
|
|
|
|
|
localId: paidItem.localId + '_paid_part',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(freeItem);
|
|
|
|
|
|
ModifiedData.push(updatedPaidItem);
|
|
|
|
|
|
|
|
|
|
|
|
// Update free product usage
|
|
|
|
|
|
freeProduct.FreeQty = (freeProduct.FreeQty || 0) + freeQty;
|
|
|
|
|
|
freeProduct.RemainingQty -= freeQty;
|
|
|
|
|
|
|
|
|
|
|
|
// Create applied offer
|
|
|
|
|
|
AppliedOffers.push(
|
|
|
|
|
|
createAppliedOffer(
|
|
|
|
|
|
freeProduct,
|
|
|
|
|
|
freeQty,
|
|
|
|
|
|
paidItem.InwardDtlId,
|
|
|
|
|
|
paidItem.OrderRate,
|
|
|
|
|
|
paidItem.BookingTypeName
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
processedItems.add(paidItem.localId);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Process remaining cart items
|
|
|
|
|
|
orderCardDtls.forEach((item) => {
|
|
|
|
|
|
// Skip if already processed
|
|
|
|
|
|
if (processedItems.has(item.localId)) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Check if item is currently marked as free (has OfferType/OfferMode and Offer > 0)
|
|
|
|
|
|
const isCurrentlyFree =
|
|
|
|
|
|
item.Offer > 0 && (item.OfferType || item.OfferMode);
|
|
|
|
|
|
|
|
|
|
|
|
if (isCurrentlyFree) {
|
|
|
|
|
|
// Find matching free product by InwardDtlId
|
|
|
|
|
|
const matchingFreeProduct = updatedFreeProdList.find((freeProd) =>
|
|
|
|
|
|
freeProd.ProdVariantDetails?.some((variant) =>
|
|
|
|
|
|
variant.StockDetails?.some(
|
|
|
|
|
|
(stock) => stock.FreeInwardDtlId === item.InwardDtlId
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (matchingFreeProduct) {
|
|
|
|
|
|
const availableFreeQty = matchingFreeProduct.OverAllFreeQty || 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (item.OrderQty > availableFreeQty) {
|
|
|
|
|
|
// Split: Keep available free qty as free, convert excess to paid
|
|
|
|
|
|
const excessQty = item.OrderQty - availableFreeQty;
|
|
|
|
|
|
|
|
|
|
|
|
// Create free portion (if any free qty available)
|
|
|
|
|
|
if (availableFreeQty > 0) {
|
|
|
|
|
|
const freeItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: availableFreeQty,
|
|
|
|
|
|
TotalAmt: availableFreeQty * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(availableFreeQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
availableFreeQty * item.OrderRate -
|
|
|
|
|
|
(availableFreeQty * item.OrderRate * item.TaxPercentage) /
|
2026-03-03 19:39:44 +05:30
|
|
|
|
100,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
Offer: availableFreeQty * item.OrderRate,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(freeItem);
|
|
|
|
|
|
|
|
|
|
|
|
// Create applied offer
|
|
|
|
|
|
AppliedOffers.push(
|
|
|
|
|
|
createAppliedOffer(
|
|
|
|
|
|
matchingFreeProduct,
|
|
|
|
|
|
availableFreeQty,
|
|
|
|
|
|
item.InwardDtlId,
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
item.BookingTypeName
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Handle excess quantity - look for existing paid item in original cart
|
|
|
|
|
|
const existingPaidItem = orderCardDtls.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem.InwardDtlId === item.InwardDtlId &&
|
|
|
|
|
|
cartItem.localId !== item.localId &&
|
|
|
|
|
|
(!cartItem.Offer || cartItem.Offer === 0) &&
|
|
|
|
|
|
!cartItem.OfferType &&
|
|
|
|
|
|
!cartItem.OfferMode
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
existingPaidItem &&
|
|
|
|
|
|
!processedItems.has(existingPaidItem.localId)
|
|
|
|
|
|
) {
|
|
|
|
|
|
// Merge excess with existing paid item
|
|
|
|
|
|
const mergedPaidItem = {
|
|
|
|
|
|
...existingPaidItem,
|
|
|
|
|
|
OrderQty: existingPaidItem.OrderQty + excessQty,
|
|
|
|
|
|
TotalAmt:
|
|
|
|
|
|
(existingPaidItem.OrderQty + excessQty) * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
((existingPaidItem.OrderQty + excessQty) *
|
|
|
|
|
|
item.OrderRate *
|
|
|
|
|
|
item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
(existingPaidItem.OrderQty + excessQty) * item.OrderRate -
|
|
|
|
|
|
((existingPaidItem.OrderQty + excessQty) *
|
|
|
|
|
|
item.OrderRate *
|
|
|
|
|
|
item.TaxPercentage) /
|
2026-03-03 19:39:44 +05:30
|
|
|
|
100,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(mergedPaidItem);
|
|
|
|
|
|
processedItems.add(existingPaidItem.localId); // Mark as processed
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Create new paid item for excess quantity
|
|
|
|
|
|
const paidItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: excessQty,
|
|
|
|
|
|
TotalAmt: excessQty * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(excessQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
excessQty * item.OrderRate -
|
|
|
|
|
|
(excessQty * item.OrderRate * item.TaxPercentage) / 100,
|
|
|
|
|
|
Offer: 0,
|
|
|
|
|
|
OfferType: undefined,
|
|
|
|
|
|
OfferMode: undefined,
|
|
|
|
|
|
OfferMessage: undefined,
|
|
|
|
|
|
localId: item.localId + '_paid',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(paidItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (availableFreeQty > 0) {
|
|
|
|
|
|
// All quantity can remain free
|
|
|
|
|
|
const isAlreadyExists = ModifiedData?.findIndex(
|
|
|
|
|
|
(data) =>
|
|
|
|
|
|
data?.OfferMode === item?.OfferMode &&
|
|
|
|
|
|
data?.InwardDtlId === item?.InwardDtlId &&
|
|
|
|
|
|
data?.ProdId === item?.ProdId &&
|
|
|
|
|
|
data?.OfferMessage?.[0]?.OfferId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.OfferMessage?.[0]?.OfferId
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (isAlreadyExists !== -1) {
|
|
|
|
|
|
// Merge with existing free item
|
|
|
|
|
|
ModifiedData[isAlreadyExists] = {
|
|
|
|
|
|
...ModifiedData[isAlreadyExists],
|
|
|
|
|
|
OrderQty:
|
|
|
|
|
|
ModifiedData[isAlreadyExists].OrderQty + item.OrderQty,
|
|
|
|
|
|
TotalAmt:
|
|
|
|
|
|
(ModifiedData[isAlreadyExists].OrderQty + item.OrderQty) *
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
((ModifiedData[isAlreadyExists].OrderQty + item.OrderQty) *
|
|
|
|
|
|
item.OrderRate *
|
|
|
|
|
|
item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
(ModifiedData[isAlreadyExists].OrderQty + item.OrderQty) *
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item.OrderRate -
|
2026-01-27 18:27:29 +05:30
|
|
|
|
((ModifiedData[isAlreadyExists].OrderQty + item.OrderQty) *
|
|
|
|
|
|
item.OrderRate *
|
|
|
|
|
|
item.TaxPercentage) /
|
2026-03-03 19:39:44 +05:30
|
|
|
|
100,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
Offer:
|
|
|
|
|
|
(ModifiedData[isAlreadyExists].OrderQty + item.OrderQty) *
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Create new free item
|
|
|
|
|
|
const newFreeItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
TotalAmt: item.OrderQty * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(item.OrderQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
item.OrderQty * item.OrderRate -
|
|
|
|
|
|
(item.OrderQty * item.OrderRate * item.TaxPercentage) / 100,
|
|
|
|
|
|
Offer: item.OrderQty * item.OrderRate,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(newFreeItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const appliedOfferAlreadyExists = AppliedOffers.findIndex(
|
|
|
|
|
|
(offer) =>
|
|
|
|
|
|
offer?.FreeProductsList?.FreeProdId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
matchingFreeProduct?.FreeProdId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
offer?.TableName === matchingFreeProduct?.TableName &&
|
|
|
|
|
|
offer?.TableUniqueName ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
matchingFreeProduct?.TableUniqueName &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
offer?.OfferId === matchingFreeProduct?.OfferId &&
|
|
|
|
|
|
offer?.OfferMode === matchingFreeProduct?.OfferMode &&
|
|
|
|
|
|
offer?.FreeProductsList?.ProdVariantDetails?.[0]
|
|
|
|
|
|
?.StockDetails?.[0]?.FreeInwardDtlId === item?.InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (appliedOfferAlreadyExists !== -1) {
|
|
|
|
|
|
AppliedOffers[appliedOfferAlreadyExists] = {
|
|
|
|
|
|
...AppliedOffers[appliedOfferAlreadyExists],
|
|
|
|
|
|
ActualOfferAmount:
|
|
|
|
|
|
AppliedOffers[appliedOfferAlreadyExists].ActualOfferAmount +
|
|
|
|
|
|
item.OrderQty * item.OrderRate,
|
|
|
|
|
|
ActualFreeQty:
|
|
|
|
|
|
AppliedOffers[appliedOfferAlreadyExists].ActualFreeQty +
|
|
|
|
|
|
item.OrderQty,
|
|
|
|
|
|
OfferAmount:
|
|
|
|
|
|
(AppliedOffers[appliedOfferAlreadyExists].ActualFreeQty +
|
|
|
|
|
|
item.OrderQty) *
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
OfferValue:
|
|
|
|
|
|
(AppliedOffers[appliedOfferAlreadyExists].ActualFreeQty +
|
|
|
|
|
|
item.OrderQty) *
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
UsedCount:
|
|
|
|
|
|
(matchingFreeProduct?.ProdVariantDetails?.[0]
|
|
|
|
|
|
?.StockDetails?.[0]?.ProdLoyaltyPoint || 0) *
|
|
|
|
|
|
(AppliedOffers[appliedOfferAlreadyExists].ActualFreeQty +
|
|
|
|
|
|
item.OrderQty),
|
|
|
|
|
|
FreeProductsList: {
|
|
|
|
|
|
...AppliedOffers[appliedOfferAlreadyExists].FreeProductsList,
|
|
|
|
|
|
FreeQty:
|
|
|
|
|
|
AppliedOffers[appliedOfferAlreadyExists].FreeProductsList
|
|
|
|
|
|
.FreeQty + item.OrderQty,
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Create applied offer
|
|
|
|
|
|
AppliedOffers.push(
|
|
|
|
|
|
createAppliedOffer(
|
|
|
|
|
|
matchingFreeProduct,
|
|
|
|
|
|
item.OrderQty,
|
|
|
|
|
|
item.InwardDtlId,
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
item.BookingTypeName
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// No free quantity available, convert to paid
|
|
|
|
|
|
const paidItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
Offer: 0,
|
|
|
|
|
|
OfferType: undefined,
|
|
|
|
|
|
OfferMode: undefined,
|
|
|
|
|
|
OfferMessage: undefined,
|
|
|
|
|
|
TotalAmt: item.OrderQty * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(item.OrderQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
item.OrderQty * item.OrderRate -
|
|
|
|
|
|
(item.OrderQty * item.OrderRate * item.TaxPercentage) / 100,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(paidItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// No matching free product found, convert to paid
|
|
|
|
|
|
const paidItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
Offer: 0,
|
|
|
|
|
|
OfferType: undefined,
|
|
|
|
|
|
OfferMode: undefined,
|
|
|
|
|
|
OfferMessage: undefined,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(paidItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Item is not currently free, check if it can become free
|
|
|
|
|
|
const matchingFreeProduct = updatedFreeProdList.find(
|
|
|
|
|
|
(freeProd) =>
|
|
|
|
|
|
freeProd.ProdVariantDetails?.some((variant) =>
|
|
|
|
|
|
variant.StockDetails?.some(
|
|
|
|
|
|
(stock) => stock.FreeInwardDtlId === item.InwardDtlId
|
|
|
|
|
|
)
|
|
|
|
|
|
) && freeProd.RemainingQty > 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (matchingFreeProduct) {
|
|
|
|
|
|
const availableFreeQty = Math.min(
|
|
|
|
|
|
item.OrderQty,
|
|
|
|
|
|
matchingFreeProduct.RemainingQty
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (availableFreeQty > 0) {
|
|
|
|
|
|
// Create free item for available free quantity
|
|
|
|
|
|
const freeItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: availableFreeQty,
|
|
|
|
|
|
TotalAmt: availableFreeQty * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(availableFreeQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
availableFreeQty * item.OrderRate -
|
|
|
|
|
|
(availableFreeQty * item.OrderRate * item.TaxPercentage) / 100,
|
|
|
|
|
|
Offer: availableFreeQty * item.OrderRate,
|
|
|
|
|
|
OfferType: matchingFreeProduct.OfferMode,
|
|
|
|
|
|
OfferMode: matchingFreeProduct.OfferMode,
|
|
|
|
|
|
OfferMessage: [
|
|
|
|
|
|
{
|
|
|
|
|
|
OfferId: matchingFreeProduct.OfferId,
|
|
|
|
|
|
FreeQty: availableFreeQty,
|
|
|
|
|
|
FreeProdId: matchingFreeProduct.FreeProdId,
|
|
|
|
|
|
FreeProdName: matchingFreeProduct.FreeProdName,
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
localId: item.localId + '_free',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(freeItem);
|
|
|
|
|
|
|
|
|
|
|
|
// Update free product usage
|
|
|
|
|
|
matchingFreeProduct.FreeQty =
|
|
|
|
|
|
(matchingFreeProduct.FreeQty || 0) + availableFreeQty;
|
|
|
|
|
|
matchingFreeProduct.RemainingQty -= availableFreeQty;
|
|
|
|
|
|
|
|
|
|
|
|
// Create applied offer
|
|
|
|
|
|
AppliedOffers.push(
|
|
|
|
|
|
createAppliedOffer(
|
|
|
|
|
|
matchingFreeProduct,
|
|
|
|
|
|
availableFreeQty,
|
|
|
|
|
|
item.InwardDtlId,
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
item.BookingTypeName
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// If there's remaining paid quantity
|
|
|
|
|
|
if (item.OrderQty > availableFreeQty) {
|
|
|
|
|
|
const paidQty = item.OrderQty - availableFreeQty;
|
|
|
|
|
|
const paidItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: paidQty,
|
|
|
|
|
|
TotalAmt: paidQty * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(paidQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
paidQty * item.OrderRate -
|
|
|
|
|
|
(paidQty * item.OrderRate * item.TaxPercentage) / 100,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ModifiedData.push(paidItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// No free quantity available, keep as paid
|
|
|
|
|
|
ModifiedData.push(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// No matching free product or no remaining free quantity
|
|
|
|
|
|
ModifiedData.push(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
processedItems.add(item.localId);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
ModifiedData,
|
|
|
|
|
|
UpdatedFreeProdList: updatedFreeProdList,
|
|
|
|
|
|
AppliedOffers,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-09 17:28:22 +05:30
|
|
|
|
const openExpireModal = ({ title, onOk, onCancel }) => {
|
|
|
|
|
|
setExpireModal({
|
|
|
|
|
|
open: true,
|
|
|
|
|
|
title,
|
|
|
|
|
|
onOk,
|
|
|
|
|
|
onCancel,
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const closeExpireModal = () => {
|
|
|
|
|
|
setExpireModal((prev) => ({ ...prev, open: false }));
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// Usage example:
|
|
|
|
|
|
// const result = handleLoyaltyFreeProducts(orderCardDtls, freeProdDtls);
|
|
|
|
|
|
// console.log(result.ModifiedData);
|
|
|
|
|
|
// console.log(result.UpdatedFreeProdList);
|
|
|
|
|
|
// console.log(result.AppliedOffers);
|
|
|
|
|
|
|
|
|
|
|
|
async function getOffers() {
|
2026-02-09 17:28:22 +05:30
|
|
|
|
await dispatch(
|
2026-01-27 18:27:29 +05:30
|
|
|
|
getOfferinBooking({ AppId: AppId, CompId: CompId, BranchId: BranchId })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
const filteredOffers = OrderOfferDetail?.filter(
|
|
|
|
|
|
({ TableName, TableUniqueName, OfferCode, Type, FreeProductsList }) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
(TableName === 'LoyaltyPoints' &&
|
|
|
|
|
|
TableUniqueName === 'UniqueId' &&
|
|
|
|
|
|
Type === 'A') ||
|
|
|
|
|
|
((TableName === 'CustomerPromo' ||
|
|
|
|
|
|
TableName === 'CustomerCoupon' ||
|
|
|
|
|
|
TableName === 'OfferCode') &&
|
|
|
|
|
|
OfferCode != null &&
|
|
|
|
|
|
TableUniqueName === 'UniqueId')
|
|
|
|
|
|
) {
|
|
|
|
|
|
return FreeProductsList?.ExistingList?.length > 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (TableName === 'BuyXGetXOffers') return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
// setfreeProductsOffers(filteredOffers);
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
|
|
|
|
|
getOffers();
|
|
|
|
|
|
}, [OrderOfferDetail]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (SelectedCardFont) {
|
|
|
|
|
|
WebFont.load({
|
|
|
|
|
|
google: {
|
|
|
|
|
|
families: [SelectedCardFont], // Load the selected font
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [SelectedCardFont]);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const cardData = !globalAccessForOthers
|
|
|
|
|
|
? CardAccess
|
|
|
|
|
|
? SelectedDatas?.length > 1
|
|
|
|
|
|
? SelectedDatas
|
|
|
|
|
|
: SelectedDatas?.[0]?.AppId === 0 && SelectedDatas?.[0]?.CompId === 0
|
|
|
|
|
|
? []
|
|
|
|
|
|
: SelectedDatas
|
|
|
|
|
|
: ItemCard?.length == 0 ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
(ItemCard?.[0]?.AppId === 0 && ItemCard?.[0]?.CompId === 0)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? noSubcatCardData
|
|
|
|
|
|
: ItemCard
|
|
|
|
|
|
: '';
|
|
|
|
|
|
|
|
|
|
|
|
const cardDataForNewPrd = !globalAccessForOthers
|
|
|
|
|
|
? CardAccess
|
|
|
|
|
|
? SelectedDatas
|
|
|
|
|
|
: ItemCard?.length == 0
|
|
|
|
|
|
? noSubcatCardData
|
|
|
|
|
|
: ItemCard
|
|
|
|
|
|
: '';
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
function safeRound(amountStr) {
|
|
|
|
|
|
if (amountStr == null) return allowDecimal ? '0.00' : '0';
|
|
|
|
|
|
|
|
|
|
|
|
const cleaned = String(amountStr).replace(/[^0-9.-]+/g, '');
|
|
|
|
|
|
const num = Number(cleaned);
|
|
|
|
|
|
|
|
|
|
|
|
if (isNaN(num)) return allowDecimal ? '0.00' : '0';
|
|
|
|
|
|
|
|
|
|
|
|
return allowDecimal ? num.toFixed(2) : Math.round(num).toString();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
// fetchedit();
|
|
|
|
|
|
getPreferenceStock();
|
|
|
|
|
|
// dispatch(changepreOrder(false)); Commented to Add Normal Produts After Adding the Combo Pack !!!!!! Dont Touch Without Shifayath Permission
|
|
|
|
|
|
}, [preferenceDatas]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (AppId && CompId && BranchId) {
|
|
|
|
|
|
fetchedit();
|
2026-02-09 18:55:09 +05:30
|
|
|
|
GetmultipleSearchData();
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// dispatch(changepreOrder(false)); Commented to Add Normal Produts After Adding the Combo Pack !!!!!! Dont Touch Without Shifayath Permission
|
|
|
|
|
|
}, [AppId, CompId, BranchId]);
|
2026-02-09 15:43:03 +05:30
|
|
|
|
|
|
|
|
|
|
const GetmultipleSearchData = async () => {
|
|
|
|
|
|
const data = {
|
|
|
|
|
|
AppId,
|
|
|
|
|
|
CompId,
|
|
|
|
|
|
BranchId,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
2026-02-09 18:55:09 +05:30
|
|
|
|
const response = await dispatch(getmultipleSearch(data));
|
2026-02-09 15:43:03 +05:30
|
|
|
|
} catch (error) {
|
2026-02-09 18:55:09 +05:30
|
|
|
|
console.error('Get Search Terms Error:', error);
|
2026-02-09 15:43:03 +05:30
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setPreOrderSelectedProdNames([]);
|
|
|
|
|
|
// dispatch(changePreOrderAdditem(null));
|
|
|
|
|
|
}, [preOrder]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (ProdCat && ProdSubCat !== NaN) {
|
|
|
|
|
|
// if (ProdCat && !isNaN(ProdSubCat)) {
|
|
|
|
|
|
productCardList();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [ProdSubCat, productCardTrigger]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (noSubcatCardData) {
|
|
|
|
|
|
setNoSubcatCardData();
|
|
|
|
|
|
}
|
2026-02-09 15:43:03 +05:30
|
|
|
|
|
2026-02-09 18:55:09 +05:30
|
|
|
|
if (
|
|
|
|
|
|
ProductSearch?.length > 5 &&
|
|
|
|
|
|
GetmultipleSearchDatas.some((e) => e.toLowerCase() === 'qrcode')
|
|
|
|
|
|
) {
|
2026-01-27 18:27:29 +05:30
|
|
|
|
setQuickAdd(true);
|
|
|
|
|
|
}
|
2026-02-09 15:43:03 +05:30
|
|
|
|
}, [ProductSearch, GetmultipleSearchDatas]);
|
|
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
!initialRun &&
|
|
|
|
|
|
(!ProdSubCat || ProdSubCat != NaN || ProdSubCat === 'NaN') &&
|
|
|
|
|
|
ProdCat
|
|
|
|
|
|
) {
|
|
|
|
|
|
// if (!initialRun && (!ProdSubCat || !isNaN(ProdSubCat)) && ProdCat) {
|
|
|
|
|
|
setInitialRun(true);
|
|
|
|
|
|
productCardList();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [ProdCat, initialRun]);
|
|
|
|
|
|
|
|
|
|
|
|
const productCardList = async () => {
|
|
|
|
|
|
//condition
|
|
|
|
|
|
if (
|
|
|
|
|
|
(templateData?.BookingLayout?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'SubCategory'
|
|
|
|
|
|
) ||
|
|
|
|
|
|
templateData?.BookingCategory?.[0] == 'Category5') &&
|
|
|
|
|
|
ProdSubCat &&
|
|
|
|
|
|
ProdCat
|
|
|
|
|
|
) {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
ProdSubCat: ProdSubCat,
|
|
|
|
|
|
...(AvailableDate && selectedDate
|
|
|
|
|
|
? {
|
2026-03-03 19:39:44 +05:30
|
|
|
|
date: Array.isArray(selectedDate)
|
|
|
|
|
|
? selectedDate
|
|
|
|
|
|
.map((d) => (d?.format ? d.format('YYYY-MM-DD') : d))
|
|
|
|
|
|
.join(',')
|
|
|
|
|
|
: selectedDate?.format
|
|
|
|
|
|
? selectedDate.format('YYYY-MM-DD')
|
|
|
|
|
|
: selectedDate,
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: {}),
|
|
|
|
|
|
};
|
|
|
|
|
|
//mohan
|
|
|
|
|
|
let response = await dispatch(getLayoutproductCard(data)).unwrap();
|
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
|
setNoSubcatCardData(response?.data?.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
!templateData?.BookingLayout?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'SubCategory'
|
|
|
|
|
|
) &&
|
|
|
|
|
|
templateData?.BookingCategory?.[0] != 'Category5' &&
|
|
|
|
|
|
ProdCat
|
|
|
|
|
|
) {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
compId: CompId,
|
|
|
|
|
|
branchId: BranchId,
|
|
|
|
|
|
appId: AppId,
|
|
|
|
|
|
prodCat: ProdCat,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 👇 only add date if AvailableDate is true
|
|
|
|
|
|
if (AvailableDate && selectedDate) {
|
|
|
|
|
|
data.date = selectedDate;
|
|
|
|
|
|
}
|
|
|
|
|
|
let response = await dispatch(getCardDataWithoutSubmodule(data)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
|
setNoSubcatCardData(response?.data?.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
(templateData?.BookingLayout?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'SubCategory'
|
|
|
|
|
|
) ||
|
|
|
|
|
|
templateData?.BookingCategory?.[0] == 'Category5') &&
|
|
|
|
|
|
!ProdSubCat &&
|
|
|
|
|
|
ProdCat &&
|
|
|
|
|
|
ProdSubCat != 'NaN'
|
|
|
|
|
|
) {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
compId: CompId,
|
|
|
|
|
|
branchId: BranchId,
|
|
|
|
|
|
appId: AppId,
|
|
|
|
|
|
prodCat: ProdCat,
|
|
|
|
|
|
...(AvailableDate && selectedDate
|
|
|
|
|
|
? {
|
2026-03-03 19:39:44 +05:30
|
|
|
|
date: Array.isArray(selectedDate)
|
|
|
|
|
|
? selectedDate
|
|
|
|
|
|
.map((d) => (d?.format ? d.format('YYYY-MM-DD') : d))
|
|
|
|
|
|
.join(',')
|
|
|
|
|
|
: selectedDate?.format
|
|
|
|
|
|
? selectedDate.format('YYYY-MM-DD')
|
|
|
|
|
|
: selectedDate,
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: {}),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let response = await dispatch(getCardDataWithoutSub(data)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
|
setNoSubcatCardData(response?.data?.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const getBookingTypeId = async () => {
|
|
|
|
|
|
let tempconfigdata = await dispatch(
|
|
|
|
|
|
getConfigType({ TypeName: 'Booking Type' })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if (tempconfigdata?.data?.statusCode == 1) {
|
|
|
|
|
|
setConfigDataList(tempconfigdata?.data?.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const fetchedit = async () => {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
};
|
|
|
|
|
|
let res = await dispatch(getEditFavItems(data)).unwrap();
|
|
|
|
|
|
if (res?.data?.statusCode == 1) {
|
|
|
|
|
|
setSelectedProdNames(res?.data?.data);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setSelectedProdNames([]);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
DispatchData();
|
|
|
|
|
|
}, [SelectedProdNames]);
|
|
|
|
|
|
const DispatchData = async () => {
|
|
|
|
|
|
await dispatch(ChangeAllItemData(SelectedProdNames));
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (Object.keys(WSProductdata)?.length > 0) {
|
|
|
|
|
|
AddOrderDetails(WSProductdata);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [WSProductdata]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (ItemCard?.[0]?.QrBasedSearch === 'Y') {
|
|
|
|
|
|
if (ItemCard?.[0]?.OverAllExpStatus == 'Y' && ExpiredProduct) {
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Product Expires',
|
|
|
|
|
|
onOk: () => expFun(Item),
|
|
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
setItem(ItemCard?.[0]);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setQtydata(ItemCard?.[0]);
|
|
|
|
|
|
SingleQuantity(ItemCard?.[0], false);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (ItemCard?.[0]?.OnePcQRBased === 'Y') {
|
|
|
|
|
|
if (ItemCard?.[0]?.OverAllExpStatus == 'Y' && ExpiredProduct) {
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Product Expires',
|
|
|
|
|
|
onOk: () => expFun(Item),
|
|
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
setItem(ItemCard?.[0]);
|
|
|
|
|
|
setOnePeiceFlow(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setQtydata(ItemCard?.[0]);
|
|
|
|
|
|
SingleQuantity(ItemCard?.[0], true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [ItemCard]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
// let data = otherscarddata
|
|
|
|
|
|
if (Object.keys(otherscarddata)?.length > 0) {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
Type: otherscarddata?.Type ? otherscarddata?.Type : 'P',
|
|
|
|
|
|
OverallQuantity: otherscarddata?.OverAllQty,
|
|
|
|
|
|
ActiveStatus: otherscarddata?.ActiveStatus,
|
|
|
|
|
|
AvailableFrom: otherscarddata?.AvailableFrom,
|
|
|
|
|
|
AvailableTo: otherscarddata?.AvailableTo,
|
|
|
|
|
|
Cess: otherscarddata?.Cess,
|
|
|
|
|
|
ExpDate: otherscarddata?.ExpDate,
|
|
|
|
|
|
HSNCode: otherscarddata?.HSNCode,
|
|
|
|
|
|
ManufDate: otherscarddata?.ManufDate,
|
|
|
|
|
|
OpeningQty: otherscarddata?.OpeningQty,
|
|
|
|
|
|
ProdType: otherscarddata?.ProdType,
|
|
|
|
|
|
PartNumber: otherscarddata?.PartNumber,
|
|
|
|
|
|
ProdId: otherscarddata?.ProdId,
|
|
|
|
|
|
ProdLogo: otherscarddata?.ProdLogo,
|
|
|
|
|
|
ProdName: otherscarddata?.ProdName,
|
|
|
|
|
|
QRCode: otherscarddata?.QRCode,
|
|
|
|
|
|
QtyBasedPrice: otherscarddata?.QtyBasedPrice,
|
|
|
|
|
|
Rack: otherscarddata?.Rack,
|
|
|
|
|
|
Size: otherscarddata?.Size,
|
|
|
|
|
|
StockAvailable: otherscarddata?.StockAvailable,
|
|
|
|
|
|
TaxId: otherscarddata?.TaxId,
|
|
|
|
|
|
TaxPercentage: otherscarddata?.TaxPercentage,
|
|
|
|
|
|
TaxName: otherscarddata?.TaxIdName,
|
|
|
|
|
|
UniqueId: otherscarddata?.UniqueId,
|
|
|
|
|
|
UomName: otherscarddata?.UomName,
|
|
|
|
|
|
ProdVariantName: otherscarddata?.ProdVariantName, //sri
|
|
|
|
|
|
BalanceQty: otherscarddata?.BalanceQty,
|
|
|
|
|
|
BatchRef: otherscarddata?.BatchRef,
|
|
|
|
|
|
ModelNumber: otherscarddata?.ModelNumber, //sri
|
|
|
|
|
|
FullProductIdentifierDtls: otherscarddata?.FullProductIdentifierDtls, //sri
|
|
|
|
|
|
InwardDate: otherscarddata?.InwardDate,
|
|
|
|
|
|
InwardDtlId: otherscarddata?.InwardDtlId,
|
|
|
|
|
|
InwardId: otherscarddata?.InwardId,
|
|
|
|
|
|
MRP: otherscarddata?.MRP,
|
|
|
|
|
|
Offer: otherscarddata?.OfferPrice,
|
|
|
|
|
|
OrderRate: otherscarddata?.SellPrice,
|
|
|
|
|
|
SellingPrice: otherscarddata?.SellPrice, // edit srii
|
|
|
|
|
|
SuppId: otherscarddata?.SuppId,
|
|
|
|
|
|
SuppName: otherscarddata?.SuppName,
|
|
|
|
|
|
OrderQty: otherscarddata?.Quantity,
|
|
|
|
|
|
OtherProduct: otherscarddata?.OtherProduct,
|
|
|
|
|
|
// 'ProdVariantName': otherscarddata?.ProdVariantName,
|
|
|
|
|
|
BookingTypeName: BookingType,
|
2026-02-24 17:18:55 +05:30
|
|
|
|
SinglePc: otherscarddata?.SinglePc,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
CounterName: '', //sri
|
|
|
|
|
|
};
|
2026-02-25 16:24:29 +05:30
|
|
|
|
AddOrderDetails(data, otherscarddata?.Quantity);
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
// data["OrderRate"] = otherscarddata?.SellPrice
|
|
|
|
|
|
}, [otherscarddata]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (Object.keys(NewQrProductData)?.length > 0) {
|
|
|
|
|
|
let addQrProductData = { ...NewQrProductData };
|
|
|
|
|
|
addQrProductData['OrderRate'] = addQrProductData['SellPrice'];
|
|
|
|
|
|
addQrProductData['OrderQty'] = addQrProductData['Quantity'];
|
|
|
|
|
|
addQrProductData['SellingPrice'] = addQrProductData['SellPrice'];
|
|
|
|
|
|
addQrProductData['BookingTypeName'] = BookingType;
|
|
|
|
|
|
AddOrderDetails(addQrProductData);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [NewQrProductData]);
|
|
|
|
|
|
|
|
|
|
|
|
const getPreferenceStock = async () => {
|
|
|
|
|
|
const PreferenceStckDtl = preferenceDatas?.[0]?.SettingDtlDetails;
|
|
|
|
|
|
const StockPreference = PreferenceStckDtl?.find(
|
|
|
|
|
|
(item) => item.SettingIdName === 'StockSelection'
|
|
|
|
|
|
);
|
|
|
|
|
|
setStockPreferenceDetail(StockPreference);
|
|
|
|
|
|
const BillOrder = PreferenceStckDtl?.find(
|
|
|
|
|
|
(item) => item.SettingIdName === 'BillItemsOrder'
|
|
|
|
|
|
);
|
|
|
|
|
|
setBillOrderPre(BillOrder?.SettingValue);
|
|
|
|
|
|
|
|
|
|
|
|
const expiredDate =
|
|
|
|
|
|
PreferenceStckDtl?.find(
|
|
|
|
|
|
(item) => item.SettingIdName === 'ExpiredSelection'
|
|
|
|
|
|
)?.SettingValue === 'Y';
|
|
|
|
|
|
setExpiredProduct(expiredDate);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const CloseModal = () => {
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
setOnePeiceFlow(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
};
|
|
|
|
|
|
const CloseModal1 = () => {
|
|
|
|
|
|
setModelstock(false);
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
setOnePeiceFlow(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
const CloseVarientModal = () => {
|
|
|
|
|
|
setModalVarient(false);
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
setOnePeiceFlow(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const Quantity = () => {
|
|
|
|
|
|
setModelQty(true);
|
|
|
|
|
|
};
|
|
|
|
|
|
const SingleQuantity = (item, onePcs) => {
|
|
|
|
|
|
let count = item?.ProductDetail?.[0]?.ProdVariantDetails?.length;
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
setModalVarient(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setVarientIndex(0);
|
|
|
|
|
|
SingleStockfun(item, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const SingleStockfun = (item, onePcs) => {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]
|
|
|
|
|
|
?.StockDetails?.length;
|
|
|
|
|
|
if (
|
|
|
|
|
|
StockPreferenceDetail?.SettingValue === 'Y' &&
|
|
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.StockAvailable == 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
setModelstock(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let Isincart = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId === item?.ProductDetail?.[QtyIndex]?.ProdId &&
|
|
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.OrderRate ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.SellPrice &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (onePcs) {
|
|
|
|
|
|
let Isincartonepc = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId === item?.ProductDetail?.[QtyIndex]?.ProdId &&
|
|
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// (cartItem?.OrderRate === item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.StockDetails?.[0]?.SellPrice)
|
|
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = Isincartonepc?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
if (Isincartonepc && Isincartonepc?.[0]?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincartonepc?.[0]?.OverAllPcs > totalOrderQty) {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 1, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (Isincart && Isincart?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincart?.BalanceQty > Isincart?.OrderQty) {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 1, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let Isincart = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId === item?.ProductDetail?.[QtyIndex]?.ProdId &&
|
|
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]
|
|
|
|
|
|
?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.OrderRate ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]
|
|
|
|
|
|
?.StockDetails?.[0]?.SellPrice &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (onePcs) {
|
|
|
|
|
|
let Isincartonepc = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId === item?.ProductDetail?.[QtyIndex]?.ProdId &&
|
|
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// (cartItem?.OrderRate === item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.StockDetails?.[0]?.SellPrice)
|
|
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = Isincartonepc?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * (card.NoOfPcs ? card.NoOfPcs : 1)
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
if (Isincartonepc && Isincartonepc?.[0]?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincartonepc?.[0]?.OverAllPcs > totalOrderQty) {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 1, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (Isincart && Isincart?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincart?.BalanceQty > Isincart?.OrderQty) {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 1, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(item, 0, 0, 0, onePcs);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const Stockfun = (index) => {
|
|
|
|
|
|
setVarientIndex(index.key);
|
|
|
|
|
|
const variantDetails =
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[index.key] || {};
|
|
|
|
|
|
const overallExpStatus = variantDetails.OverAllExpStatus;
|
|
|
|
|
|
const count = variantDetails.StockDetails?.length || 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
StockPreferenceDetail?.SettingValue === 'Y' &&
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.StockAvailable == 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
if (
|
|
|
|
|
|
overallExpStatus === 'N' ||
|
|
|
|
|
|
(overallExpStatus === 'Y' && prodexpir)
|
|
|
|
|
|
) {
|
|
|
|
|
|
setModalVarient(false);
|
|
|
|
|
|
setModelstock(true);
|
|
|
|
|
|
setVarItem(index.key);
|
|
|
|
|
|
if (overallExpStatus === 'Y' && prodexpir) {
|
|
|
|
|
|
setRepeatedModel(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (overallExpStatus === 'Y' && ExpiredProduct) {
|
|
|
|
|
|
setVarItem(index.key);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Variant Expires',
|
|
|
|
|
|
onOk: () => expVerFun(VarItem),
|
|
|
|
|
|
onCancel: () => {
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (
|
|
|
|
|
|
overallExpStatus === 'N' ||
|
|
|
|
|
|
(overallExpStatus === 'Y' && prodexpir)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let Isincart = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId === qtydata?.ProductDetail?.[QtyIndex]?.ProdId &&
|
|
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
index.key
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.OrderRate ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
index.key
|
|
|
|
|
|
]?.StockDetails?.[0]?.SellPrice &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (onePeiceFlow) {
|
|
|
|
|
|
let Isincartonepc = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
index.key
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// (cartItem?.OrderRate === item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.StockDetails?.[0]?.SellPrice)
|
|
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = Isincartonepc?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * (card.NoOfPcs ? card.NoOfPcs : 1)
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
if (Isincartonepc && Isincartonepc?.[0]?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincartonepc?.[0]?.OverAllPcs > totalOrderQty) {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 1, onePeiceFlow);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (Isincart && Isincart?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincart?.BalanceQty > Isincart?.OrderQty) {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 1, onePeiceFlow);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
setVarItem(index.key);
|
|
|
|
|
|
if (overallExpStatus === 'Y' && prodexpir) {
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
setRepeatedModel(true);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (overallExpStatus === 'Y' && ExpiredProduct) {
|
|
|
|
|
|
setVarItem(index.key);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Variant Expires',
|
|
|
|
|
|
onOk: () => expVerFun(VarItem),
|
|
|
|
|
|
onCancel: () => {
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (overallExpStatus === 'N' || (overallExpStatus === 'Y' && prodexpir)) {
|
|
|
|
|
|
const stockDetails =
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[index.key]
|
|
|
|
|
|
?.StockDetails;
|
|
|
|
|
|
console.log(stockDetails, CartOrderDetails, 'currIndex');
|
|
|
|
|
|
let Isincart = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId === qtydata?.ProductDetail?.[QtyIndex]?.ProdId &&
|
|
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
index.key
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.OrderRate ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
index.key
|
|
|
|
|
|
]?.StockDetails?.[0]?.SellPrice &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (onePeiceFlow) {
|
|
|
|
|
|
let Isincartonepc = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId === qtydata?.ProductDetail?.[QtyIndex]?.ProdId &&
|
|
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
index.key
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// (cartItem?.OrderRate === item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.StockDetails?.[0]?.SellPrice)
|
|
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = Isincartonepc?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * (card.NoOfPcs ? card.NoOfPcs : 1)
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
if (Isincartonepc && Isincartonepc?.[0]?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincartonepc?.[0]?.OverAllPcs > totalOrderQty) {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 1, onePeiceFlow);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const findNextAvailableStockIndex = (
|
|
|
|
|
|
stockDetails,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
prodId
|
|
|
|
|
|
) => {
|
|
|
|
|
|
if (!stockDetails || stockDetails.length === 0) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < stockDetails.length; i++) {
|
|
|
|
|
|
const stock = stockDetails[i];
|
|
|
|
|
|
|
|
|
|
|
|
// Find if this specific stock is already in cart
|
|
|
|
|
|
const cartItem = CartOrderDetails?.find(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.ProdId === prodId &&
|
|
|
|
|
|
item?.InwardDtlId === stock?.InwardDtlId &&
|
|
|
|
|
|
item?.OrderRate === stock?.SellPrice &&
|
|
|
|
|
|
!item?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// If not in cart, this stock has full balance available - use this
|
|
|
|
|
|
if (!cartItem) {
|
|
|
|
|
|
return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// If in cart and NOT fully utilized, continue using this stock
|
|
|
|
|
|
if (cartItem && cartItem?.OrderQty < cartItem?.BalanceQty) {
|
|
|
|
|
|
return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// If OrderQty === BalanceQty (fully utilized), move to next stock
|
|
|
|
|
|
// Continue the loop...
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// If all stocks are exhausted, return the last index
|
|
|
|
|
|
return stockDetails.length - 1;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const currentProdId = qtydata?.ProductDetail?.[QtyIndex]?.ProdId;
|
|
|
|
|
|
|
|
|
|
|
|
// Find the next available stock index dynamically
|
|
|
|
|
|
const nextAvailableIndex = findNextAvailableStockIndex(
|
|
|
|
|
|
stockDetails,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
currentProdId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
QtyIndex,
|
|
|
|
|
|
index.key,
|
|
|
|
|
|
nextAvailableIndex,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
setVarItem(index.key);
|
|
|
|
|
|
if (overallExpStatus === 'Y' && prodexpir) {
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
setRepeatedModel(true);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (overallExpStatus === 'Y' && ExpiredProduct) {
|
|
|
|
|
|
setVarItem(index.key);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Variant Expires',
|
|
|
|
|
|
onOk: () => expVerFun(VarItem),
|
|
|
|
|
|
onCancel: () => {
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const VarientFun = (index) => {
|
|
|
|
|
|
const QtyExpire = index?.ProdVariantDetails.every(
|
|
|
|
|
|
(item) => item.OverAllExpStatus === 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (QtyExpire && ExpiredProduct) {
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Quantity Expires',
|
|
|
|
|
|
onOk: () => expQtyFun(qtyExpData),
|
|
|
|
|
|
onCancel: () => {
|
|
|
|
|
|
setRepeatedModel(false);
|
2026-02-09 18:55:09 +05:30
|
|
|
|
(setProdexpir(false), closeExpireModal());
|
2026-02-09 17:28:22 +05:30
|
|
|
|
},
|
|
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
setQtyExpData(index);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const selectedProIndex = qtydata?.ProductDetail?.findIndex(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.ProdId === index?.ProdId &&
|
|
|
|
|
|
item?.Size === index?.Size &&
|
|
|
|
|
|
item?.UomName === index?.UomName &&
|
|
|
|
|
|
item?.Brand === index?.Brand
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (selectedProIndex !== -1) {
|
|
|
|
|
|
const count =
|
|
|
|
|
|
qtydata?.ProductDetail[selectedProIndex]?.ProdVariantDetails
|
|
|
|
|
|
?.length || 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
setModalVarient(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const item = { QtyIndex: selectedProIndex, VarientIndex: 0 };
|
|
|
|
|
|
singleVarient(item);
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setQtyIndex(selectedProIndex);
|
|
|
|
|
|
setVarientIndex(0);
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const singleVarient = (item) => {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
item?.VarientIndex
|
|
|
|
|
|
]?.StockDetails?.length;
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
StockPreferenceDetail?.SettingValue === 'Y' &&
|
|
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.StockAvailable == 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
setModalVarient(false);
|
|
|
|
|
|
setModelstock(true);
|
|
|
|
|
|
// setVarientIndex(index.key)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let Isincart = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
item?.VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.OrderRate ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
item?.VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.SellPrice &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (onePeiceFlow) {
|
|
|
|
|
|
let Isincartonepc = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
item?.VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// (cartItem?.OrderRate === item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.StockDetails?.[0]?.SellPrice)
|
|
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = Isincartonepc?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
if (Isincartonepc && Isincartonepc?.[0]?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincartonepc?.[0]?.OverAllPcs > totalOrderQty) {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
1,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (Isincart && Isincart?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincart?.BalanceQty > Isincart?.OrderQty) {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
1,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let Isincart = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
item?.VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.OrderRate ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
item?.VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.SellPrice &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (onePeiceFlow) {
|
|
|
|
|
|
let Isincartonepc = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
cartItem?.ProdId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cartItem?.InwardDtlId ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[item?.QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
item?.VarientIndex
|
|
|
|
|
|
]?.StockDetails?.[0]?.InwardDtlId &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// (cartItem?.OrderRate === item?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.StockDetails?.[0]?.SellPrice)
|
|
|
|
|
|
!cartItem?.SalesId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = Isincartonepc?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
if (Isincartonepc && Isincartonepc?.[0]?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincartonepc?.[0]?.OverAllPcs > totalOrderQty) {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
1,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (Isincart && Isincart?.StockAvailable === 'Y') {
|
|
|
|
|
|
if (Isincart?.BalanceQty > Isincart?.OrderQty) {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
1,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataTransfer(
|
|
|
|
|
|
qtydata,
|
|
|
|
|
|
item?.QtyIndex,
|
|
|
|
|
|
item?.VarientIndex,
|
|
|
|
|
|
0,
|
|
|
|
|
|
onePeiceFlow
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const StockSelected = (item) => {
|
|
|
|
|
|
const stockDetails =
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]
|
|
|
|
|
|
?.StockDetails?.[item.key] || {};
|
|
|
|
|
|
const overallExpStatus = stockDetails?.OverAllExpStatus;
|
|
|
|
|
|
|
|
|
|
|
|
if (overallExpStatus === 'N' || overallExpStatus === 'Y') {
|
|
|
|
|
|
const firstStockDetails =
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[0]
|
|
|
|
|
|
?.StockDetails?.[item.key] || {};
|
|
|
|
|
|
const firstOverallExpStatus = firstStockDetails.OverAllExpStatus;
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
overallExpStatus === 'N' ||
|
|
|
|
|
|
(firstOverallExpStatus === 'Y' && prodexpir)
|
|
|
|
|
|
) {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, VarientIndex, item.key, onePeiceFlow);
|
|
|
|
|
|
} else if (overallExpStatus === 'Y' && repeatedModel) {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, VarientIndex, item.key, onePeiceFlow);
|
|
|
|
|
|
} else {
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Stock Expires',
|
|
|
|
|
|
onOk: () => expStockFun(StockItem),
|
|
|
|
|
|
onCancel: () => {
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
setStockItem(item.key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const [priceChangeProduct, setPriceChangeProduct] = useState([]);
|
|
|
|
|
|
const [productPriceChange, setProductPriceChange] = useState(false);
|
|
|
|
|
|
|
|
|
|
|
|
const CardOnclick = async (item, Parameter) => {
|
|
|
|
|
|
setOnePeiceFlow(Parameter === 'OnePeiceProduct');
|
|
|
|
|
|
|
|
|
|
|
|
const transformedItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
ProductDetail: item.ProductDetail
|
|
|
|
|
|
// .filter((detail) => detail.OnePcsAvailable === "Y")
|
|
|
|
|
|
.map(({ ProdId, ProdName, ProdVariantDetails, ...rest }) => ({
|
|
|
|
|
|
ProdId,
|
|
|
|
|
|
ProdName,
|
|
|
|
|
|
ProdVariantDetails,
|
|
|
|
|
|
...rest,
|
|
|
|
|
|
})),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const modiffiedData =
|
|
|
|
|
|
Parameter === 'OnePeiceProduct' ? transformedItem : item;
|
|
|
|
|
|
setQtydata(modiffiedData);
|
|
|
|
|
|
if (modiffiedData.OverAllExpStatus === 'Y' && ExpiredProduct) {
|
2026-02-09 17:28:22 +05:30
|
|
|
|
openExpireModal({
|
|
|
|
|
|
title: 'Product Expires',
|
2026-02-09 18:55:09 +05:30
|
|
|
|
onOk: () => expFun(modiffiedData),
|
2026-02-09 17:28:22 +05:30
|
|
|
|
});
|
2026-01-27 18:27:29 +05:30
|
|
|
|
setItem(modiffiedData);
|
|
|
|
|
|
} else if (modiffiedData) {
|
|
|
|
|
|
setQtydata(modiffiedData);
|
|
|
|
|
|
let count = modiffiedData?.ProductDetail?.length;
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
Quantity(modiffiedData);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setQtyIndex(0);
|
|
|
|
|
|
SingleQuantity(modiffiedData, Parameter === 'OnePeiceProduct');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const StockDate = (date) => {
|
|
|
|
|
|
let dateVal = moment(date, ['YYYY-MM-DDTHH:mm:ss']).format('DD-MM-YYYY');
|
|
|
|
|
|
return dateVal;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-02-25 16:24:29 +05:30
|
|
|
|
const AddOrderDetails = async (item, Qty = 1) => {
|
2026-02-24 14:40:44 +05:30
|
|
|
|
if ((overAllLimitPreferenece || itemWiseLimitPreferenece) && maxQtyLimit) {
|
|
|
|
|
|
if (overAllLimitPreferenece) {
|
|
|
|
|
|
const calculatedOverAllQty = calculateOverAllQtyLimit(CartOrderDetails);
|
2026-02-25 16:24:29 +05:30
|
|
|
|
if (calculatedOverAllQty + Qty > maxQtyLimit) {
|
2026-02-24 14:40:44 +05:30
|
|
|
|
setMessageData(`Overall Quantity Limit Exceeds than ${maxQtyLimit}`);
|
|
|
|
|
|
setMessageType('warning');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
|
if (preOrder) {
|
|
|
|
|
|
await handlePreOrder(item);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
await handleRegularOrder(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handlePreOrder = async (item) => {
|
|
|
|
|
|
let Response = await dispatch(
|
|
|
|
|
|
getConfigType({ TypeName: 'Booking Type' })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
let BookingTypeID;
|
|
|
|
|
|
if (Response?.data?.statusCode == 1) {
|
|
|
|
|
|
BookingTypeID = Response?.data?.data?.find(
|
|
|
|
|
|
(item) => item?.ConfigName === 'Dine In'
|
|
|
|
|
|
)?.ConfigId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let Condition = PreOrderSelectedProdNames?.some(
|
|
|
|
|
|
(obj) =>
|
|
|
|
|
|
obj?.InwardDtlId === item?.InwardDtlId &&
|
|
|
|
|
|
obj?.SinglePc === item?.SinglePc
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (PreOrderAdditem !== 'AddItems') {
|
|
|
|
|
|
setMessageData('Have To choose Add Item Before select Any Item ');
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Condition) {
|
|
|
|
|
|
setMessageData('Duplicate Data');
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const calculateWithoutTaxRate = (qty, rate, taxPercentage) => {
|
|
|
|
|
|
const totalAmount = qty * rate;
|
|
|
|
|
|
const taxAmount = (
|
|
|
|
|
|
(totalAmount * taxPercentage) /
|
|
|
|
|
|
(100 + taxPercentage)
|
|
|
|
|
|
).toFixed(2);
|
|
|
|
|
|
const withoutTaxRate = (totalAmount - taxAmount).toFixed(2);
|
|
|
|
|
|
|
|
|
|
|
|
return parseFloat(withoutTaxRate);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const SelectedProduct = {
|
|
|
|
|
|
ProdId: item?.ProdId,
|
|
|
|
|
|
InwardDtlId: item?.InwardDtlId,
|
|
|
|
|
|
ProdNameQty: item?.ProdName + ' ' + item?.Size + ' ' + item?.UomName,
|
|
|
|
|
|
ProdName: item?.ProdName,
|
|
|
|
|
|
Size: item?.Size,
|
|
|
|
|
|
UomName: item?.UomName,
|
|
|
|
|
|
OrderQty: 1,
|
|
|
|
|
|
OrderRate: item?.OrderRate,
|
|
|
|
|
|
TotalAmt: item?.OrderRate,
|
|
|
|
|
|
Image: null,
|
|
|
|
|
|
Description: null,
|
|
|
|
|
|
Type: item?.Type,
|
|
|
|
|
|
TaxAmt: 0,
|
|
|
|
|
|
RefundQty: 0,
|
|
|
|
|
|
TaxId: item?.TaxId,
|
|
|
|
|
|
OrderStatus: 'O',
|
|
|
|
|
|
OrderType: 'PRE',
|
|
|
|
|
|
SinglePc: item?.SinglePc,
|
|
|
|
|
|
BookingType: BookingTypeID,
|
|
|
|
|
|
WithoutTaxRate: calculateWithoutTaxRate(
|
|
|
|
|
|
1,
|
|
|
|
|
|
item?.OrderRate,
|
|
|
|
|
|
item?.TaxPercentage
|
|
|
|
|
|
),
|
|
|
|
|
|
StockAvailable: item?.StockAvailable,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const Data =
|
|
|
|
|
|
PreOrderSelectedProdNames?.length > 0
|
|
|
|
|
|
? [SelectedProduct, ...PreOrderSelectedProdNames]
|
|
|
|
|
|
: [SelectedProduct];
|
|
|
|
|
|
|
|
|
|
|
|
await setPreOrderSelectedProdNames(Data);
|
|
|
|
|
|
await dispatch(changepreOrderList(Data));
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleRegularOrder = async (item) => {
|
|
|
|
|
|
const isHoldOrder = OrderType === 'Hold';
|
|
|
|
|
|
const addFirst = BillOrderPre === 'Y';
|
|
|
|
|
|
const hasOffer = OfferCheckedInSetup && preferenceOffer;
|
|
|
|
|
|
|
|
|
|
|
|
const isExistsInFreeProdList = hasOffer
|
|
|
|
|
|
? FreeProdList?.filter(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
(f) =>
|
|
|
|
|
|
f?.FreeProdId === item?.ProdId &&
|
|
|
|
|
|
f?.ProdVariantDetails?.some((variant) =>
|
|
|
|
|
|
variant?.StockDetails?.some(
|
|
|
|
|
|
(stock) => stock?.FreeInwardDtlId === item?.InwardDtlId
|
|
|
|
|
|
)
|
|
|
|
|
|
) &&
|
|
|
|
|
|
f?.RemainingQty > 0
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
|
|
const calculateTaxAmounts = (qty, rate, taxPercentage) => {
|
|
|
|
|
|
const totalAmount = qty * rate;
|
|
|
|
|
|
const taxAmount = (
|
|
|
|
|
|
(totalAmount * taxPercentage) /
|
|
|
|
|
|
(100 + taxPercentage)
|
|
|
|
|
|
).toFixed(2);
|
|
|
|
|
|
const withoutTaxRate = (totalAmount - taxAmount).toFixed(2);
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
TotalAmt: totalAmount,
|
|
|
|
|
|
TaxAmt: parseFloat(taxAmount),
|
|
|
|
|
|
WithoutTaxRate: parseFloat(withoutTaxRate),
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Helper function to create updated cart item
|
|
|
|
|
|
const createUpdatedCartItem = (cartItem, newQty = null) => {
|
|
|
|
|
|
const quantity = newQty || cartItem.OrderQty + 1;
|
|
|
|
|
|
const taxAmounts = calculateTaxAmounts(
|
|
|
|
|
|
quantity,
|
|
|
|
|
|
cartItem.OrderRate,
|
|
|
|
|
|
cartItem.TaxPercentage
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
...cartItem,
|
|
|
|
|
|
OrderQty: quantity,
|
|
|
|
|
|
...taxAmounts,
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Helper function to create new item for cart
|
|
|
|
|
|
const createNewCartItem = (item, quantity = 1) => {
|
|
|
|
|
|
const taxAmounts = calculateTaxAmounts(
|
|
|
|
|
|
quantity,
|
|
|
|
|
|
item.OrderRate,
|
|
|
|
|
|
item.TaxPercentage
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
localId: uuidv4(),
|
|
|
|
|
|
OrderQty: quantity,
|
|
|
|
|
|
...taxAmounts,
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
dispatch(changeHoldOrderDtl(false));
|
|
|
|
|
|
dispatch(changePreviousOrderLength(CartOrderDetails?.length));
|
|
|
|
|
|
|
|
|
|
|
|
const itemMatchCondition = (cartItem) =>
|
|
|
|
|
|
cartItem.ProdId === item.ProdId &&
|
|
|
|
|
|
cartItem.InwardDtlId === item.InwardDtlId &&
|
|
|
|
|
|
cartItem.OrderRate === item.OrderRate &&
|
|
|
|
|
|
cartItem.BookingTypeName === item.BookingTypeName &&
|
|
|
|
|
|
cartItem.ScaleType === item.ScaleType;
|
|
|
|
|
|
// item.WeightscaleProd !== 'Y';
|
|
|
|
|
|
const isItemInCart = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
itemMatchCondition(cartItem) &&
|
|
|
|
|
|
!cartItem.SalesId &&
|
|
|
|
|
|
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
|
|
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.OfferMode !== 'B') &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
cartItem?.OfferMode !== 'P' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'C' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'O' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'L'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.Offer === 0)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const isItemInCartHold = CartOrderDetails?.find(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
itemMatchCondition(cartItem) &&
|
2026-02-04 18:10:12 +05:30
|
|
|
|
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
|
|
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.OfferMode !== 'B') &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
cartItem?.OfferMode !== 'P' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'C' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'O' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'L'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.Offer === 0)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Filter cart items
|
|
|
|
|
|
const otherOrderDataForNormal = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
!(
|
|
|
|
|
|
itemMatchCondition(cartItem) &&
|
|
|
|
|
|
!cartItem.SalesId &&
|
|
|
|
|
|
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
|
|
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.OfferMode !== 'B') &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
cartItem?.OfferMode !== 'P' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'C' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'O' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'L'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.Offer === 0)
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const otherOrderDataForNormalWithoutSalesId = CartOrderDetails?.filter(
|
|
|
|
|
|
(cartItem) =>
|
|
|
|
|
|
!(
|
|
|
|
|
|
itemMatchCondition(cartItem) &&
|
2026-02-04 18:10:12 +05:30
|
|
|
|
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
|
|
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.OfferMode !== 'B') &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
cartItem?.OfferMode !== 'P' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'C' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'O' &&
|
|
|
|
|
|
cartItem?.OfferMode !== 'L'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: cartItem?.Offer === 0)
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
// CASE 1: Item exists in cart, not Dine In, not Hold order
|
|
|
|
|
|
|
|
|
|
|
|
if (isItemInCart && !isHoldOrder) {
|
|
|
|
|
|
if (
|
|
|
|
|
|
isExistsInFreeProdList?.length > 0 &&
|
|
|
|
|
|
hasOffer &&
|
|
|
|
|
|
item?.SinglePc !== 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
handleFreeProduct(item, isExistsInFreeProdList, addFirst);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const updatedCartItem = createUpdatedCartItem(
|
|
|
|
|
|
isItemInCart,
|
|
|
|
|
|
item?.OtherProduct === 'Others' || item?.ScaleType === 'weight'
|
|
|
|
|
|
? (
|
2026-03-03 19:39:44 +05:30
|
|
|
|
(item?.OrderQty || 0) + parseFloat(isItemInCart?.OrderQty)
|
|
|
|
|
|
)?.toFixed(3)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: null
|
|
|
|
|
|
);
|
|
|
|
|
|
const updatedData = addFirst
|
|
|
|
|
|
? [updatedCartItem, ...otherOrderDataForNormal]
|
|
|
|
|
|
: [...otherOrderDataForNormal, updatedCartItem];
|
|
|
|
|
|
if (OverAllproductBasedOfferDatas?.ProdDtl?.length > 0 && hasOffer) {
|
|
|
|
|
|
handleFreeProductAvailable(updatedCartItem, updatedData, addFirst);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(changeOrderCardDetails(updatedData));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// CASE 2: Item exists in cart (hold), is Hold order
|
|
|
|
|
|
else if (isItemInCartHold && isHoldOrder) {
|
|
|
|
|
|
if (
|
|
|
|
|
|
isExistsInFreeProdList?.length > 0 &&
|
|
|
|
|
|
hasOffer &&
|
|
|
|
|
|
item?.SinglePc !== 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
handleFreeProduct(item, isExistsInFreeProdList, addFirst);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const updatedCartItem = createUpdatedCartItem(
|
|
|
|
|
|
isItemInCartHold,
|
|
|
|
|
|
item?.OtherProduct === 'Others' || item?.ScaleType === 'weight'
|
|
|
|
|
|
? (
|
2026-03-03 19:39:44 +05:30
|
|
|
|
(item?.OrderQty || 0) + parseFloat(isItemInCartHold?.OrderQty)
|
|
|
|
|
|
)?.toFixed(3)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: null
|
|
|
|
|
|
);
|
|
|
|
|
|
const updatedData = addFirst
|
|
|
|
|
|
? [updatedCartItem, ...otherOrderDataForNormalWithoutSalesId]
|
|
|
|
|
|
: [...otherOrderDataForNormalWithoutSalesId, updatedCartItem];
|
|
|
|
|
|
if (OverAllproductBasedOfferDatas?.ProdDtl?.length > 0 && hasOffer) {
|
|
|
|
|
|
handleFreeProductAvailable(updatedCartItem, updatedData, addFirst);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(changeOrderCardDetails(updatedData));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// CASE 3: New item - not in cart
|
|
|
|
|
|
else {
|
|
|
|
|
|
if (item.OtherProduct === 'Others' || item.ScaleType == 'weight') {
|
|
|
|
|
|
const newCartItem = createNewCartItem(item, item.OrderQty);
|
|
|
|
|
|
const updatedData = addFirst
|
|
|
|
|
|
? [newCartItem, ...CartOrderDetails]
|
|
|
|
|
|
: [...CartOrderDetails, newCartItem];
|
|
|
|
|
|
|
|
|
|
|
|
dispatch(changeOrderCardDetails(updatedData));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (
|
|
|
|
|
|
isExistsInFreeProdList?.length > 0 &&
|
|
|
|
|
|
hasOffer &&
|
|
|
|
|
|
item?.SinglePc !== 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
handleFreeProduct(item, isExistsInFreeProdList, addFirst);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const newCartItem = createNewCartItem(item, 1);
|
|
|
|
|
|
const updatedData = addFirst
|
|
|
|
|
|
? [newCartItem, ...CartOrderDetails]
|
|
|
|
|
|
: [...CartOrderDetails, newCartItem];
|
|
|
|
|
|
if (
|
|
|
|
|
|
OverAllproductBasedOfferDatas?.ProdDtl?.length > 0 &&
|
|
|
|
|
|
hasOffer
|
|
|
|
|
|
) {
|
|
|
|
|
|
handleFreeProductAvailable(newCartItem, updatedData, addFirst);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(changeOrderCardDetails(updatedData));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('Error updating order details:', error);
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
// Clean up dispatch calls
|
|
|
|
|
|
dispatch(changeothersdata({}));
|
|
|
|
|
|
dispatch(ChangeNewQrProduct({}));
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleFreeProduct = (item, filteredFreeProdList, addFirst) => {
|
|
|
|
|
|
if (!filteredFreeProdList?.length) return;
|
|
|
|
|
|
|
|
|
|
|
|
const offerMode = filteredFreeProdList[0]?.OfferMode;
|
|
|
|
|
|
|
|
|
|
|
|
// --- helper functions ---
|
|
|
|
|
|
const calcTax = (qty, rate, taxPerc) =>
|
|
|
|
|
|
((qty * rate * taxPerc) / 100).toFixed(2);
|
|
|
|
|
|
|
|
|
|
|
|
const calcWithoutTax = (qty, rate, taxPerc) =>
|
|
|
|
|
|
qty * rate - ((qty * rate * taxPerc) / 100).toFixed(2);
|
|
|
|
|
|
|
|
|
|
|
|
const updateFreeProductMeta = (base, qty, rate) => ({
|
|
|
|
|
|
...base,
|
|
|
|
|
|
FreeQty: qty,
|
|
|
|
|
|
discount: qty * rate,
|
|
|
|
|
|
RemainingQty: base.OverAllFreeQty - qty,
|
|
|
|
|
|
ProdVariantDetails: base.ProdVariantDetails.map((variant) => ({
|
|
|
|
|
|
...variant,
|
|
|
|
|
|
StockDetails: variant.StockDetails.map((stock) => ({
|
|
|
|
|
|
...stock,
|
|
|
|
|
|
UsedFree: qty,
|
|
|
|
|
|
RemainingFree: stock.RemainingFree - qty,
|
|
|
|
|
|
})),
|
|
|
|
|
|
})),
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const applyOffer = (offerList, updatedItem) => {
|
|
|
|
|
|
if (offerMode === 'L') {
|
|
|
|
|
|
const updated = loyaltyOfferApply(
|
|
|
|
|
|
offerList,
|
|
|
|
|
|
updatedItem,
|
|
|
|
|
|
DineinId,
|
|
|
|
|
|
TakAwayId
|
|
|
|
|
|
);
|
|
|
|
|
|
dispatch(changeOfferAppliedProductsForLoyalty(updated));
|
|
|
|
|
|
dispatch(changeFreeProductForLoyalty(offerList[0]));
|
2026-01-30 10:05:20 +05:30
|
|
|
|
} else if (offerMode === 'P' || offerMode === 'C' || offerMode === 'O') {
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const updated = buildOfferFromChangesForPromoCodes(
|
|
|
|
|
|
PromoCodeOffersDatas?.[0],
|
|
|
|
|
|
offerList,
|
|
|
|
|
|
updatedItem,
|
|
|
|
|
|
DineinId,
|
|
|
|
|
|
TakAwayId
|
|
|
|
|
|
);
|
|
|
|
|
|
dispatch(changeOfferAppliedProductsForLoyalty(updated));
|
|
|
|
|
|
dispatch(changeFreeProductForLoyalty(offerList[0]));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const updated = buildOfferFromChanges(
|
|
|
|
|
|
OverAllproductBasedOfferDatas,
|
|
|
|
|
|
offerList,
|
|
|
|
|
|
updatedItem,
|
|
|
|
|
|
DineinId,
|
|
|
|
|
|
TakAwayId
|
|
|
|
|
|
);
|
|
|
|
|
|
dispatch(ChangeOfferAppliedProducts(updated));
|
|
|
|
|
|
dispatch(ChangeFreeProductList(offerList[0]));
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// --- main logic ---
|
|
|
|
|
|
let UpdatedData = [];
|
|
|
|
|
|
const existing = CartOrderDetails?.find(
|
|
|
|
|
|
(c) =>
|
|
|
|
|
|
c.ProdId === item.ProdId &&
|
|
|
|
|
|
c.InwardDtlId === item.InwardDtlId &&
|
|
|
|
|
|
c.OrderRate === item.OrderRate &&
|
|
|
|
|
|
c.BookingTypeName === item.BookingTypeName &&
|
|
|
|
|
|
c.OfferMode === offerMode &&
|
|
|
|
|
|
c.Offer > 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const existsInOther = CartOrderDetails?.find(
|
|
|
|
|
|
(c) =>
|
|
|
|
|
|
c.ProdId === item.ProdId &&
|
|
|
|
|
|
c.InwardDtlId === item.InwardDtlId &&
|
|
|
|
|
|
c.OrderRate === item.OrderRate &&
|
|
|
|
|
|
c.BookingTypeName !== item.BookingTypeName &&
|
|
|
|
|
|
c.OfferMode === offerMode &&
|
|
|
|
|
|
c.Offer > 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (existing) {
|
|
|
|
|
|
let newQty = existing.OrderQty + 1;
|
|
|
|
|
|
const UpdatedCartItem = {
|
|
|
|
|
|
...existing,
|
|
|
|
|
|
OrderQty: newQty,
|
|
|
|
|
|
TotalAmt: existing.TotalAmt + existing.OrderRate,
|
|
|
|
|
|
Offer: existing.Offer + existing.OrderRate,
|
|
|
|
|
|
TaxAmt: calcTax(newQty, existing.OrderRate, existing.TaxPercentage),
|
|
|
|
|
|
WithoutTaxRate: calcWithoutTax(
|
|
|
|
|
|
newQty,
|
|
|
|
|
|
existing.OrderRate,
|
|
|
|
|
|
existing.TaxPercentage
|
|
|
|
|
|
),
|
|
|
|
|
|
OfferMessage: [
|
|
|
|
|
|
{
|
|
|
|
|
|
OfferId: filteredFreeProdList[0].OfferId,
|
|
|
|
|
|
FreeQty: newQty,
|
|
|
|
|
|
FreeProdId: filteredFreeProdList[0].FreeProdId,
|
|
|
|
|
|
FreeProdName: filteredFreeProdList[0].FreeProdName,
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
};
|
|
|
|
|
|
if (existsInOther) {
|
|
|
|
|
|
newQty = newQty + existsInOther?.OrderQty;
|
|
|
|
|
|
}
|
|
|
|
|
|
const updatedOfferList = [
|
|
|
|
|
|
updateFreeProductMeta(filteredFreeProdList[0], newQty, item.OrderRate),
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
UpdatedData = CartOrderDetails.map((c) =>
|
|
|
|
|
|
c === existing ? UpdatedCartItem : c
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
applyOffer(updatedOfferList, UpdatedCartItem);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let newQty = 1;
|
|
|
|
|
|
const UpdatedCartItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
localId: uuidv4(),
|
|
|
|
|
|
OrderQty: newQty,
|
|
|
|
|
|
TotalAmt: item.OrderRate,
|
|
|
|
|
|
Offer: item.OrderRate,
|
|
|
|
|
|
OfferType: offerMode,
|
|
|
|
|
|
OfferMode: offerMode,
|
|
|
|
|
|
TaxAmt: calcTax(1, item.OrderRate, item.TaxPercentage),
|
|
|
|
|
|
WithoutTaxRate: calcWithoutTax(1, item.OrderRate, item.TaxPercentage),
|
|
|
|
|
|
OfferMessage: [
|
|
|
|
|
|
{
|
|
|
|
|
|
OfferId: filteredFreeProdList[0].OfferId,
|
|
|
|
|
|
FreeQty: 1,
|
|
|
|
|
|
FreeProdId: filteredFreeProdList[0].FreeProdId,
|
|
|
|
|
|
FreeProdName: filteredFreeProdList[0].FreeProdName,
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (existsInOther) {
|
|
|
|
|
|
newQty = newQty + existsInOther?.OrderQty;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const updatedOfferList = [
|
|
|
|
|
|
updateFreeProductMeta(filteredFreeProdList[0], newQty, item.OrderRate),
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
UpdatedData = addFirst
|
|
|
|
|
|
? [UpdatedCartItem, ...CartOrderDetails]
|
|
|
|
|
|
: [...CartOrderDetails, UpdatedCartItem];
|
|
|
|
|
|
applyOffer(updatedOfferList, UpdatedCartItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
dispatch(changeOrderCardDetails(UpdatedData));
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleFreeProductAvailable = async (item, cartData, addFirst) => {
|
|
|
|
|
|
const offers = chooseOfferFun(item, cartData);
|
|
|
|
|
|
|
|
|
|
|
|
if (!offers?.length) {
|
2026-01-30 10:05:20 +05:30
|
|
|
|
const indexToCheck = addFirst ? 0 : cartData.length - 1;
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const productToCheck = cartData?.[addFirst ? 0 : cartData?.length - 1];
|
2026-01-30 10:05:20 +05:30
|
|
|
|
let updatedCartData = cartData;
|
2026-01-27 18:27:29 +05:30
|
|
|
|
if (productToCheck?.OfferMode && productToCheck?.Offer > 0) {
|
|
|
|
|
|
dispatch(
|
|
|
|
|
|
RemoveOfferAppliedProduct({
|
|
|
|
|
|
ProdId: productToCheck?.ProdId,
|
|
|
|
|
|
InwardDtlId: productToCheck?.InwardDtlId,
|
|
|
|
|
|
OfferType: productToCheck?.OfferMode,
|
|
|
|
|
|
})
|
|
|
|
|
|
);
|
2026-01-30 10:05:20 +05:30
|
|
|
|
updatedCartData = cartData.map((item, idx) =>
|
|
|
|
|
|
idx === indexToCheck
|
|
|
|
|
|
? {
|
2026-03-03 19:39:44 +05:30
|
|
|
|
...item,
|
|
|
|
|
|
Offer: null,
|
|
|
|
|
|
OfferMessage: undefined,
|
|
|
|
|
|
OfferMode: undefined,
|
|
|
|
|
|
OfferModeType: false,
|
|
|
|
|
|
OfferType: undefined,
|
|
|
|
|
|
OfferValue: null,
|
|
|
|
|
|
}
|
2026-01-30 10:05:20 +05:30
|
|
|
|
: item
|
|
|
|
|
|
);
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
|
updatedOrderCardDetails,
|
|
|
|
|
|
updatedFreeProdList,
|
|
|
|
|
|
updatedOfferAppliedProducts,
|
|
|
|
|
|
hasChanges,
|
2026-01-30 10:05:20 +05:30
|
|
|
|
} = processFreeProducts(updatedCartData, FreeProdList);
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
|
|
|
|
|
if (hasChanges) {
|
|
|
|
|
|
dispatch(changeOrderCardDetails(updatedOrderCardDetails));
|
|
|
|
|
|
dispatch(ChangeFreeProductList(updatedFreeProdList));
|
|
|
|
|
|
dispatch(ChangeOfferAppliedProducts(updatedOfferAppliedProducts));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(changeOrderCardDetails(updatedOrderCardDetails));
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let bestOffer = null;
|
|
|
|
|
|
let OfferNeedToApply = true;
|
|
|
|
|
|
let updatedFreeProductList = [];
|
|
|
|
|
|
let sameProduct = false;
|
|
|
|
|
|
for (const offer of offers) {
|
|
|
|
|
|
if (offer.OfferMode === 'B') {
|
|
|
|
|
|
const {
|
|
|
|
|
|
OfferAmount,
|
|
|
|
|
|
OfferMessage,
|
|
|
|
|
|
OfferApply,
|
|
|
|
|
|
updatedFreeProdList,
|
|
|
|
|
|
ProductOfferType,
|
|
|
|
|
|
} = applyBuyNGetFreeOffer(cartData, offer, item);
|
|
|
|
|
|
|
|
|
|
|
|
offer.OfferAmount = OfferAmount;
|
|
|
|
|
|
offer.OfferMessage = OfferMessage;
|
|
|
|
|
|
OfferNeedToApply = OfferApply;
|
|
|
|
|
|
updatedFreeProductList = updatedFreeProdList;
|
|
|
|
|
|
sameProduct = ProductOfferType;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!bestOffer || offer.OfferAmount > bestOffer.OfferAmount) {
|
|
|
|
|
|
bestOffer = offer;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const UpdatedCartItemWithOffer = {
|
|
|
|
|
|
...item,
|
2026-02-09 17:28:22 +05:30
|
|
|
|
Offer:
|
|
|
|
|
|
sameProduct ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
bestOffer?.OfferMode === 'I' ||
|
|
|
|
|
|
bestOffer?.OfferMode === 'Q'
|
2026-02-09 17:28:22 +05:30
|
|
|
|
? bestOffer?.OfferAmount || item.Offer
|
|
|
|
|
|
: item.Offer || bestOffer?.OfferAmount,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
OfferType: item?.OfferType || bestOffer?.OfferType,
|
|
|
|
|
|
OfferMessage: item?.OfferMessage || bestOffer?.OfferMessage,
|
|
|
|
|
|
OfferMode: item?.OfferMode || bestOffer?.OfferMode,
|
|
|
|
|
|
OfferModeType: sameProduct,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const shouldRemove = (c) =>
|
|
|
|
|
|
c.ProdId === item.ProdId &&
|
|
|
|
|
|
c.InwardDtlId === item.InwardDtlId &&
|
|
|
|
|
|
c.OrderRate === item.OrderRate &&
|
|
|
|
|
|
c.BookingTypeName === item.BookingTypeName &&
|
|
|
|
|
|
((c?.OfferModeType && c?.OfferMode === 'B'
|
|
|
|
|
|
? true
|
|
|
|
|
|
: c?.OfferMode !== 'B') &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
c?.OfferMode !== 'P' &&
|
|
|
|
|
|
c?.OfferMode !== 'C' &&
|
|
|
|
|
|
c?.OfferMode !== 'O' &&
|
|
|
|
|
|
c?.OfferMode !== 'L'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: c?.Offer === 0);
|
|
|
|
|
|
|
|
|
|
|
|
const filteredCart = CartOrderDetails.filter((c) => !shouldRemove(c));
|
|
|
|
|
|
|
|
|
|
|
|
const UpdatedDataAfterOffer = addFirst
|
|
|
|
|
|
? [UpdatedCartItemWithOffer, ...filteredCart]
|
|
|
|
|
|
: [...filteredCart, UpdatedCartItemWithOffer];
|
|
|
|
|
|
|
|
|
|
|
|
if (bestOffer && OfferNeedToApply) {
|
|
|
|
|
|
dispatch(ChangeOfferAppliedProducts(bestOffer));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
|
updatedOrderCardDetails,
|
|
|
|
|
|
updatedFreeProdList,
|
|
|
|
|
|
updatedOfferAppliedProducts,
|
|
|
|
|
|
hasChanges,
|
|
|
|
|
|
} = processFreeProducts(UpdatedDataAfterOffer, updatedFreeProductList);
|
|
|
|
|
|
|
|
|
|
|
|
// Update the states
|
|
|
|
|
|
dispatch(changeOrderCardDetails(updatedOrderCardDetails));
|
|
|
|
|
|
|
|
|
|
|
|
if (hasChanges) {
|
|
|
|
|
|
dispatch(ChangeFullFreeProductList(updatedFreeProdList));
|
|
|
|
|
|
dispatch(ChangeOfferAppliedProducts(updatedOfferAppliedProducts));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(ChangeFullFreeProductList(updatedFreeProductList));
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
function buildOfferFromChangesForPromoCodes(
|
|
|
|
|
|
PromoCodeOffersDatas,
|
|
|
|
|
|
ChangesHappenList,
|
|
|
|
|
|
item,
|
|
|
|
|
|
DineinId,
|
|
|
|
|
|
TakAwayId
|
|
|
|
|
|
) {
|
|
|
|
|
|
const results = [];
|
|
|
|
|
|
ChangesHappenList.forEach((change) => {
|
|
|
|
|
|
const offer = PromoCodeOffersDatas.ProdOfferDetails.find(
|
|
|
|
|
|
(o) => o.OfferId === change.OfferId
|
|
|
|
|
|
);
|
|
|
|
|
|
if (offer) {
|
|
|
|
|
|
// 🛠️ Build normalized object
|
|
|
|
|
|
const formatted = {
|
|
|
|
|
|
OfferId: offer?.OfferId || '',
|
|
|
|
|
|
OfferAmount: change?.discount || 0,
|
|
|
|
|
|
OfferType: offer?.OfferType || '', // I / Q / B
|
|
|
|
|
|
ActualOfferAmount: offer?.OfferAmt || 0,
|
|
|
|
|
|
OfferValue: offer?.OfferAmt || 0,
|
|
|
|
|
|
TableName: change?.TableName || '',
|
|
|
|
|
|
TableUniqueName: change?.TableUniqueName || '',
|
|
|
|
|
|
TableUniqueId: change?.TableUniqueId || '',
|
|
|
|
|
|
// OfferType: offer?.ValueType || "", // F / P
|
|
|
|
|
|
Detail: offer?.Detail || [],
|
2026-02-04 18:10:12 +05:30
|
|
|
|
OfferCode: offer?.OfferCode || PromoCodeOffersDatas?.OfferCode || '',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
CustId: offer?.CustId || '',
|
|
|
|
|
|
UsedCount: offer?.UsedCount || 0,
|
|
|
|
|
|
AppliesTo: offer?.AppliesTo || '',
|
|
|
|
|
|
BookingType:
|
|
|
|
|
|
item?.BookingTypeName === 'Dine In' ? DineinId : TakAwayId,
|
|
|
|
|
|
ActualFreeQty: change?.FreeQty,
|
|
|
|
|
|
|
|
|
|
|
|
// ✅ Merge FreeProducts from offer + update with ChangesHappenList
|
|
|
|
|
|
FreeProductsList: {
|
|
|
|
|
|
FreeProdId: change?.FreeProdId,
|
|
|
|
|
|
FreeQty: change?.FreeQty,
|
|
|
|
|
|
FreeProdName: change?.FreeProdName,
|
|
|
|
|
|
OfferId: offer?.OfferId,
|
|
|
|
|
|
OverAllFreeQty: change?.OverAllFreeQty,
|
|
|
|
|
|
ProdVariantDetails: change?.ProdVariantDetails?.map((e) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
FreeProdVariantName: e?.FreeProdVariantName,
|
|
|
|
|
|
StockDetails: e?.StockDetails?.map((exp) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
ProdOfferId: exp?.ProdOfferId,
|
|
|
|
|
|
FreeInwardDtlId: exp?.FreeInwardDtlId,
|
|
|
|
|
|
ActiveStatus: exp?.ActiveStatus,
|
|
|
|
|
|
};
|
|
|
|
|
|
}),
|
|
|
|
|
|
};
|
|
|
|
|
|
}),
|
|
|
|
|
|
},
|
|
|
|
|
|
// ✅ Always include product-level fields
|
|
|
|
|
|
ProdId: '',
|
|
|
|
|
|
SinglePc: '',
|
|
|
|
|
|
StockAvailable: '',
|
|
|
|
|
|
ProdVariantName: '',
|
|
|
|
|
|
Type: '',
|
|
|
|
|
|
InwardDtlId: '',
|
|
|
|
|
|
ProdCat: '',
|
|
|
|
|
|
HalfPrice: 'N',
|
|
|
|
|
|
MinQty: 0,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
results.push(formatted);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return results;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function buildOfferFromChanges(
|
|
|
|
|
|
OverAllproductBasedOfferDatas,
|
|
|
|
|
|
ChangesHappenList,
|
|
|
|
|
|
item,
|
|
|
|
|
|
DineinId,
|
|
|
|
|
|
TakeAwayId
|
|
|
|
|
|
) {
|
|
|
|
|
|
const offersById = new Map(
|
|
|
|
|
|
OverAllproductBasedOfferDatas.ProdDtl.map((o) => [o.OfferId, o])
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return ChangesHappenList.flatMap((change) => {
|
|
|
|
|
|
const offer = offersById.get(change.OfferId);
|
|
|
|
|
|
if (!offer) return [];
|
|
|
|
|
|
|
|
|
|
|
|
const getFreeProductsList = () => {
|
|
|
|
|
|
const freeProducts = offer.FreeProducts || offer.FreeProductsList || [];
|
|
|
|
|
|
const normalizedList = Array.isArray(freeProducts)
|
|
|
|
|
|
? freeProducts
|
|
|
|
|
|
: [freeProducts];
|
|
|
|
|
|
|
|
|
|
|
|
return normalizedList.map((fp) => {
|
|
|
|
|
|
if (!change?.ProdVariantDetails) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
FreeProdId: fp?.FreeProdId || '',
|
|
|
|
|
|
FreeQty: fp?.FreeQty || 0,
|
|
|
|
|
|
FreeProdName: fp?.FreeProdName || '',
|
|
|
|
|
|
ProdVariantDetails: fp?.ProdVariantDetails || [],
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Merge variant + stock details with change
|
|
|
|
|
|
const updatedVariants = fp.ProdVariantDetails?.map((variant) => {
|
|
|
|
|
|
const changedVariant = change.ProdVariantDetails.find(
|
|
|
|
|
|
(v) => v.FreeProdVariantName === variant.ProdVariantName
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (!changedVariant) return variant;
|
|
|
|
|
|
|
|
|
|
|
|
const updatedStock = variant.StockDetails.map((stock) => {
|
|
|
|
|
|
const changedStock = changedVariant.StockDetails.find(
|
|
|
|
|
|
(s) => s.InwardDtlId === stock.InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (changedStock) {
|
|
|
|
|
|
const { InwardDtlId, ...rest } = { ...stock, ...changedStock };
|
|
|
|
|
|
return { ...rest, FreeInwardDtlId: stock.InwardDtlId };
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const { InwardDtlId, ...rest } = stock;
|
|
|
|
|
|
return { ...rest, FreeInwardDtlId: stock.InwardDtlId };
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return { ...variant, StockDetails: updatedStock };
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
FreeProdId: fp?.FreeProdId || '',
|
|
|
|
|
|
FreeQty: change?.FreeQty ?? (fp?.FreeQty || 0),
|
|
|
|
|
|
FreeProdName: fp?.FreeProdName || '',
|
|
|
|
|
|
ProdVariantDetails: updatedVariants || [],
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
OfferId: offer.OfferId || '',
|
|
|
|
|
|
OfferAmount: change?.discount || 0,
|
|
|
|
|
|
OfferMode: offer.OfferType || '', // I / Q / B
|
|
|
|
|
|
ActualOfferAmount: offer.OfferAmt || 0,
|
|
|
|
|
|
OfferValue: offer.OfferAmt || 0,
|
|
|
|
|
|
TableName: offer.TableName || '',
|
|
|
|
|
|
TableUniqueName: offer.TableUniqueName || '',
|
|
|
|
|
|
TableUniqueId: offer.TableUniqueId || '',
|
|
|
|
|
|
ActualFreeQty: change?.FreeQty || 0,
|
|
|
|
|
|
Detail: offer.Detail || [],
|
|
|
|
|
|
OfferCode: offer.OfferCode || '',
|
|
|
|
|
|
CustId: offer.CustId || '',
|
|
|
|
|
|
UsedCount: offer.UsedCount || 0,
|
|
|
|
|
|
AppliesTo: offer.AppliesTo || '',
|
|
|
|
|
|
BookingType:
|
|
|
|
|
|
item?.BookingTypeName === 'Dine In' ? DineinId : TakeAwayId,
|
|
|
|
|
|
FreeProductsList: getFreeProductsList(),
|
|
|
|
|
|
|
|
|
|
|
|
// Product-level fields
|
|
|
|
|
|
ProdId: change?.ProdId || '',
|
|
|
|
|
|
SinglePc: change?.SinglePc || '',
|
|
|
|
|
|
StockAvailable: change?.StockAvailable || '',
|
|
|
|
|
|
ProdVariantName: change?.ProdVariantName || '',
|
|
|
|
|
|
Type: item?.Type || '',
|
|
|
|
|
|
InwardDtlId: change?.InwardDtlId || '',
|
|
|
|
|
|
ProdCat: change?.ProdCat || '',
|
|
|
|
|
|
HalfPrice: offer.HalfPrice || 'N',
|
|
|
|
|
|
MinQty: offer.MinQty || 0,
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const loyaltyOfferApply = (ChangesHappenList, item, DineinId, TakAwayId) => {
|
|
|
|
|
|
const result = [];
|
|
|
|
|
|
const change = ChangesHappenList?.[0];
|
|
|
|
|
|
const formatted = {
|
|
|
|
|
|
OfferId: change?.OfferId,
|
|
|
|
|
|
OfferAmount: change?.discount || 0,
|
|
|
|
|
|
OfferValue: change?.OfferAmt || 0,
|
|
|
|
|
|
TableName: change?.TableName || '',
|
|
|
|
|
|
TableUniqueName: change?.TableUniqueName || '',
|
|
|
|
|
|
TableUniqueId: change?.TableUniqueId || '',
|
|
|
|
|
|
ProdId: change?.ProdId || '',
|
|
|
|
|
|
SinglePc: change?.SinglePc || '',
|
|
|
|
|
|
StockAvailable: change?.StockAvailable || '',
|
|
|
|
|
|
ProdVariantName: change?.ProdVariantName || '',
|
|
|
|
|
|
ActualFreeQty: change?.FreeQty || 0,
|
|
|
|
|
|
Type: '',
|
|
|
|
|
|
BookingType: item?.BookingTypeName === 'Dine In' ? DineinId : TakAwayId,
|
|
|
|
|
|
InwardDtlId: change?.InwardDtlId || '',
|
|
|
|
|
|
OfferType: change?.OfferMode || '',
|
|
|
|
|
|
Detail: [{}],
|
|
|
|
|
|
ProdCat: change?.ProdCat || '',
|
|
|
|
|
|
CustId: change?.CustId || '',
|
|
|
|
|
|
UsedCount:
|
|
|
|
|
|
change?.ProdVariantDetails?.reduce(
|
|
|
|
|
|
(sum, variant) =>
|
|
|
|
|
|
sum +
|
|
|
|
|
|
(variant?.StockDetails?.reduce(
|
|
|
|
|
|
(variantSum, stock) =>
|
|
|
|
|
|
variantSum + (stock?.ProdLoyaltyPoint * stock?.UsedFree || 0),
|
|
|
|
|
|
0
|
|
|
|
|
|
) || 0),
|
|
|
|
|
|
0
|
|
|
|
|
|
) || 0,
|
|
|
|
|
|
FreeProductsList: change,
|
|
|
|
|
|
};
|
|
|
|
|
|
result?.push(formatted);
|
|
|
|
|
|
return result;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
function chooseOfferFun(item, CartData) {
|
|
|
|
|
|
return validateOffers(
|
|
|
|
|
|
item,
|
|
|
|
|
|
OverAllproductBasedOfferDatas,
|
|
|
|
|
|
CartData,
|
|
|
|
|
|
TakAwayId,
|
|
|
|
|
|
DineinId
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleBulkUpload = async () => {
|
|
|
|
|
|
console.log(
|
|
|
|
|
|
AllCategoryDatas,
|
|
|
|
|
|
AllsubcatgoryDatas,
|
|
|
|
|
|
'AllsubcatgoryDatas',
|
|
|
|
|
|
ProdSubCat
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let ProdcatName =
|
|
|
|
|
|
AllCategoryDatas?.find((cat) => cat?.ProdCat == ProdCat)?.ProdCatName ||
|
|
|
|
|
|
'General';
|
|
|
|
|
|
let ProdsubcatName =
|
|
|
|
|
|
AllsubcatgoryDatas?.find((subcat) => subcat?.ProdSubCat == ProdSubCat)
|
|
|
|
|
|
?.ProdSubCatName || 'General';
|
|
|
|
|
|
const Postdata = products?.map((e, index) => {
|
|
|
|
|
|
if (e?.name == null || e?.name === '') {
|
|
|
|
|
|
setMessageData(`Product Name is missing at Row ${index + 1} `);
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
throw new Error(`Product Name is missing at Row ${index + 1} `);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (e?.price == null || e?.price === '') {
|
|
|
|
|
|
setMessageData(
|
|
|
|
|
|
`Price is missing for product at Row ${index + 1} (${e?.name || 'Unknown'})`
|
|
|
|
|
|
);
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
throw new Error(
|
|
|
|
|
|
`Price is missing for product at index ${index} (${e?.name || 'Unknown'})`
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
AppId,
|
|
|
|
|
|
CompId,
|
|
|
|
|
|
BranchId,
|
|
|
|
|
|
CreatedBy: UserId,
|
|
|
|
|
|
ProdName: e?.name,
|
|
|
|
|
|
ProdVariantName: '',
|
|
|
|
|
|
ProdCat: ProdcatName,
|
|
|
|
|
|
ProdSubCat: ProdsubcatName,
|
|
|
|
|
|
Brand: '',
|
|
|
|
|
|
PartNumber: '',
|
|
|
|
|
|
HSNCode: '',
|
|
|
|
|
|
ProdNameCode: e?.code,
|
|
|
|
|
|
UOM: e?.UOMName,
|
|
|
|
|
|
Size: e?.size || 1,
|
|
|
|
|
|
MRP: e.price,
|
|
|
|
|
|
SellPrice: e.price,
|
|
|
|
|
|
WhSalePrice: '',
|
|
|
|
|
|
TaxId: 'NIL - 0%',
|
|
|
|
|
|
StockAvailable: 'No',
|
|
|
|
|
|
OnePcsAvailable: 'No',
|
|
|
|
|
|
TokenAvailable: 'No',
|
|
|
|
|
|
AutoGenerateQr: 'No',
|
|
|
|
|
|
AutoGenerateSingleQr: 'No',
|
|
|
|
|
|
OnePcQR: '',
|
|
|
|
|
|
QRCode: '',
|
|
|
|
|
|
Rack: '',
|
|
|
|
|
|
AvailableFrom: null,
|
|
|
|
|
|
AvailableTo: null,
|
|
|
|
|
|
ManufDate: null,
|
|
|
|
|
|
ExpDate: null,
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const response = await dispatch(
|
|
|
|
|
|
bulkpostdata({ ProdDetails: Postdata })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
if (response?.data?.statusCode === 1) {
|
|
|
|
|
|
productCardList();
|
|
|
|
|
|
setMessageData(response?.data?.message);
|
|
|
|
|
|
setMessageType('success');
|
|
|
|
|
|
setNewMoreProductModel(false);
|
|
|
|
|
|
setProducts([
|
|
|
|
|
|
{ id: 1, name: '', price: '', code: '', size: '1', category: '' },
|
|
|
|
|
|
]);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setMessageData(response?.data?.message);
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
function changeFreeProductList(FreeProdList, newFreeProd) {
|
|
|
|
|
|
if (!newFreeProd || !newFreeProd.ProdId || !newFreeProd.InwardDtlId) {
|
|
|
|
|
|
return FreeProdList; // 🚫 Skip invalid payload
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const index = FreeProdList.findIndex(
|
|
|
|
|
|
(f) =>
|
|
|
|
|
|
f.ProdId === newFreeProd.ProdId &&
|
|
|
|
|
|
f.InwardDtlId === newFreeProd.InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (index !== -1) {
|
|
|
|
|
|
let existing = JSON.parse(JSON.stringify(FreeProdList[index])); // deep clone
|
|
|
|
|
|
|
|
|
|
|
|
if (newFreeProd.ProdVariantDetails) {
|
|
|
|
|
|
newFreeProd.ProdVariantDetails.forEach((newVariant) => {
|
|
|
|
|
|
const existingVariant = existing.ProdVariantDetails?.find(
|
|
|
|
|
|
(v) => v.VariantName === newVariant.VariantName
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (existingVariant) {
|
|
|
|
|
|
newVariant.StockDetails.forEach((newStock) => {
|
|
|
|
|
|
const existingStock = existingVariant.StockDetails?.find(
|
|
|
|
|
|
(s) => s.InwardDtlId === newStock.InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (existingStock) {
|
|
|
|
|
|
// ✅ Create a new object instead of mutating
|
|
|
|
|
|
existingStock.EligibleFree =
|
|
|
|
|
|
(existingStock.EligibleFree || 0) +
|
|
|
|
|
|
(newStock.EligibleFree || 0);
|
|
|
|
|
|
existingStock.UsedFree =
|
|
|
|
|
|
(existingStock.UsedFree || 0) + (newStock.UsedFree || 0);
|
|
|
|
|
|
existingStock.RemainingFree =
|
|
|
|
|
|
(existingStock.RemainingFree || 0) +
|
|
|
|
|
|
(newStock.RemainingFree || 0);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
existingVariant.StockDetails = [
|
|
|
|
|
|
...existingVariant.StockDetails,
|
|
|
|
|
|
{ ...newStock },
|
|
|
|
|
|
];
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (!existing.ProdVariantDetails) existing.ProdVariantDetails = [];
|
|
|
|
|
|
existing.ProdVariantDetails = [
|
|
|
|
|
|
...existing.ProdVariantDetails,
|
|
|
|
|
|
{ ...newVariant },
|
|
|
|
|
|
];
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return FreeProdList.map((f, i) =>
|
|
|
|
|
|
i === index
|
|
|
|
|
|
? {
|
2026-03-03 19:39:44 +05:30
|
|
|
|
...existing,
|
|
|
|
|
|
...newFreeProd,
|
|
|
|
|
|
ProdVariantDetails: existing.ProdVariantDetails,
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: f
|
|
|
|
|
|
);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return [...FreeProdList, { ...newFreeProd }];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function applyBuyNGetFreeOffer(cartItem, offer, item) {
|
|
|
|
|
|
const freeList = offer.FreeProductsList || [];
|
|
|
|
|
|
let totalDiscount = 0;
|
|
|
|
|
|
let offerMessage = '';
|
|
|
|
|
|
let OfferApply = true;
|
|
|
|
|
|
let sameProductOffer = false;
|
|
|
|
|
|
let updatedFreeProdList = [...FreeProdList];
|
|
|
|
|
|
freeList.forEach((freeProd) => {
|
|
|
|
|
|
let data = updatedFreeProdList?.find(
|
|
|
|
|
|
(e) =>
|
|
|
|
|
|
e.FreeProdId === freeProd.FreeProdId &&
|
|
|
|
|
|
e.InwardDtlId === item?.InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
// find matching item in cart
|
|
|
|
|
|
const freeCartItem = cartItem.filter(
|
|
|
|
|
|
(c) =>
|
|
|
|
|
|
c.ProdId === freeProd.FreeProdId &&
|
|
|
|
|
|
freeProd?.ProdVariantDetails?.some((pv) =>
|
|
|
|
|
|
pv?.StockDetails?.some((s) => s.InwardDtlId === c.InwardDtlId)
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
// check if it's same product + inward
|
|
|
|
|
|
const isSameProduct =
|
|
|
|
|
|
offer.ProdId === freeProd.FreeProdId &&
|
|
|
|
|
|
freeProd?.ProdVariantDetails?.some((fpv) =>
|
|
|
|
|
|
fpv?.StockDetails?.some(
|
|
|
|
|
|
(fs) => fs.InwardDtlId === freeCartItem?.[0]?.InwardDtlId
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (!isSameProduct) {
|
|
|
|
|
|
const buyQty = offer.BuyQty || 1;
|
|
|
|
|
|
const getQty = freeProd.FreeQty || 0;
|
|
|
|
|
|
|
|
|
|
|
|
// 🔥 Find how many buy-product are in cart
|
|
|
|
|
|
const buyCartItem = cartItem.find((c) => c.ProdId === offer.ProdId);
|
|
|
|
|
|
|
|
|
|
|
|
if (buyCartItem) {
|
|
|
|
|
|
const eligibleCycles = Math.floor(buyCartItem.OrderQty / buyQty);
|
|
|
|
|
|
const totalFreeEligible = eligibleCycles * getQty;
|
|
|
|
|
|
|
|
|
|
|
|
if (totalFreeEligible > 0) {
|
|
|
|
|
|
offerMessage = `Add ${totalFreeEligible} ${freeProd.FreeProdName} free`;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (offer.HalfPrice === 'Y' && isSameProduct) {
|
|
|
|
|
|
// 🔥 Half price for same product
|
|
|
|
|
|
totalDiscount +=
|
|
|
|
|
|
freeCartItem?.reduce((acc, fc) => acc + (fc?.OrderQty || 0), 0) *
|
|
|
|
|
|
freeCartItem?.[0]?.OrderRate *
|
|
|
|
|
|
0.5;
|
|
|
|
|
|
sameProductOffer = true;
|
|
|
|
|
|
} else if (isSameProduct) {
|
|
|
|
|
|
// 🔥 Buy N Get M (same product)
|
|
|
|
|
|
const buyQty = offer.BuyQty || 1;
|
|
|
|
|
|
const getQty = freeProd.FreeQty || 0;
|
|
|
|
|
|
|
|
|
|
|
|
const cycleSize = buyQty + getQty;
|
|
|
|
|
|
const fullCycles = Math.floor(
|
|
|
|
|
|
freeCartItem?.reduce((acc, fc) => acc + (fc?.OrderQty || 0), 0) /
|
2026-03-03 19:39:44 +05:30
|
|
|
|
cycleSize
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
const totalFreeQty = fullCycles * getQty;
|
|
|
|
|
|
|
|
|
|
|
|
totalDiscount += totalFreeQty * freeCartItem?.[0].OrderRate;
|
|
|
|
|
|
sameProductOffer = true;
|
|
|
|
|
|
// offerMessage = `${freeProd.FreeProdName} -> ${Math.ceil(totalFreeQty / 2)} qty Free Eligible`;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 🔥 Different product free
|
|
|
|
|
|
const buyQty = offer.BuyQty || 1;
|
|
|
|
|
|
const getQty = freeProd.FreeQty;
|
|
|
|
|
|
|
|
|
|
|
|
// find buy product qty in cart
|
|
|
|
|
|
const buyCartItem = cartItem.filter(
|
|
|
|
|
|
(c) =>
|
|
|
|
|
|
c?.ProdId === offer?.ProdId &&
|
|
|
|
|
|
(offer?.InwardDtlId ? c?.InwardDtlId === offer?.InwardDtlId : true)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const buyOrderQty = buyCartItem?.reduce(
|
|
|
|
|
|
(acc, fc) => acc + (fc?.OrderQty || 0),
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// ✅ total eligible free qty (cycles of Buy X Get Y)
|
|
|
|
|
|
const eligibleCycles = Math.floor(buyOrderQty / buyQty);
|
|
|
|
|
|
const totalFreeQty = eligibleCycles * getQty;
|
|
|
|
|
|
|
|
|
|
|
|
totalDiscount += 0;
|
|
|
|
|
|
|
|
|
|
|
|
// 🟢 Offer message handling
|
|
|
|
|
|
if (buyOrderQty === 0) {
|
|
|
|
|
|
offerMessage = `No free eligible right now`;
|
|
|
|
|
|
} else if (buyOrderQty % buyQty !== 0) {
|
|
|
|
|
|
const remainingToNext = buyQty - (buyOrderQty % buyQty);
|
|
|
|
|
|
offerMessage = `Buy ${remainingToNext} more ${offer.ProdName} to get ${getQty} ${freeProd.FreeProdName} free`;
|
|
|
|
|
|
} else if (totalFreeQty > 0) {
|
|
|
|
|
|
offerMessage = `${freeProd.FreeProdName} -> ${totalFreeQty} qty Free Eligible`;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
offerMessage = `No free eligible right now`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const usedFree = data?.FreeQty || 0;
|
|
|
|
|
|
const remainingFree = Math.max(totalFreeQty - usedFree, 0);
|
|
|
|
|
|
|
|
|
|
|
|
const FreeProdList = {
|
|
|
|
|
|
OfferId: offer.OfferId,
|
|
|
|
|
|
ProdId: item?.ProdId,
|
|
|
|
|
|
ProdVariantName: item?.ProdVariantName,
|
|
|
|
|
|
StockAvailable: item?.StockAvailable,
|
|
|
|
|
|
OfferMode: offer.OfferMode,
|
|
|
|
|
|
TableName: offer.TableName,
|
|
|
|
|
|
TableUniqueName: offer.TableUniqueName,
|
|
|
|
|
|
InwardDtlId: item?.InwardDtlId || null,
|
|
|
|
|
|
FreeProdId: freeProd.FreeProdId,
|
|
|
|
|
|
FreeProdName: freeProd.FreeProdName,
|
|
|
|
|
|
ProdCat: item?.ProdCat,
|
|
|
|
|
|
SinglePc: item?.SinglePc,
|
|
|
|
|
|
BatchRef: item?.BatchRef,
|
|
|
|
|
|
OverAllFreeQty: totalFreeQty,
|
|
|
|
|
|
FreeQty: usedFree,
|
|
|
|
|
|
RemainingQty: remainingFree,
|
|
|
|
|
|
|
|
|
|
|
|
ProdVariantDetails: freeProd.ProdVariantDetails.map((variant) => ({
|
|
|
|
|
|
FreeProdVariantName: variant.ProdVariantName,
|
|
|
|
|
|
StockDetails: variant.StockDetails.map((stock) => {
|
|
|
|
|
|
// 🔎 inward-based usage
|
|
|
|
|
|
const matchedCartItem = cartItem.find(
|
|
|
|
|
|
(c) =>
|
|
|
|
|
|
c.ProdId === freeProd.FreeProdId &&
|
|
|
|
|
|
c.InwardDtlId === stock.InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const usedFreeForStock = matchedCartItem?.OrderQty || 0;
|
|
|
|
|
|
const remainingFreeForStock = Math.max(
|
|
|
|
|
|
totalFreeQty - usedFreeForStock,
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
FreeInwardDtlId: stock.InwardDtlId,
|
|
|
|
|
|
ProdOfferId: stock.ProdOfferId,
|
|
|
|
|
|
ActiveStatus: stock.ActiveStatus,
|
|
|
|
|
|
EligibleFree: totalFreeQty, // still overall, can later split if needed
|
|
|
|
|
|
UsedFree: usedFreeForStock,
|
|
|
|
|
|
RemainingFree: remainingFreeForStock,
|
|
|
|
|
|
};
|
|
|
|
|
|
}),
|
|
|
|
|
|
})),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
updatedFreeProdList = changeFreeProductList(
|
|
|
|
|
|
updatedFreeProdList,
|
|
|
|
|
|
FreeProdList
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
OfferApply = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
OfferAmount: totalDiscount,
|
|
|
|
|
|
OfferMessage: offerMessage,
|
|
|
|
|
|
OfferApply: OfferApply,
|
|
|
|
|
|
updatedFreeProdList: updatedFreeProdList,
|
|
|
|
|
|
ProductOfferType: sameProductOffer ? true : false,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const processFreeProducts = (updatedData, freeProdList) => {
|
|
|
|
|
|
if (!freeProdList || freeProdList.length === 0) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
updatedOrderCardDetails: updatedData,
|
|
|
|
|
|
updatedFreeProdList: freeProdList,
|
|
|
|
|
|
updatedOfferAppliedProducts: [],
|
|
|
|
|
|
hasChanges: false,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
// Filter only free products with remaining quantity
|
|
|
|
|
|
const availableFreeProdList = freeProdList?.filter(
|
|
|
|
|
|
(prod) => prod?.RemainingQty > 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let updatedOrderCardDetails = [];
|
|
|
|
|
|
let updatedFreeProdList = [...freeProdList]; // Create a copy to avoid mutations
|
|
|
|
|
|
let updatedOfferAppliedProducts = []; // Track offer applied products
|
|
|
|
|
|
let hasChanges = false;
|
|
|
|
|
|
|
|
|
|
|
|
updatedData?.forEach((item) => {
|
|
|
|
|
|
// STEP 1: Check if item is already a free product (with offer applied)
|
|
|
|
|
|
const foundInFreeProdList = freeProdList?.filter(
|
|
|
|
|
|
(prod) =>
|
|
|
|
|
|
prod?.OfferId === item?.OfferMessage?.[0]?.OfferId &&
|
|
|
|
|
|
prod?.FreeProdId === item?.ProdId &&
|
|
|
|
|
|
prod?.OfferMode === item?.OfferMode &&
|
|
|
|
|
|
prod?.ProdVariantDetails?.some((variant) =>
|
|
|
|
|
|
variant?.StockDetails?.some(
|
|
|
|
|
|
(stock) => stock?.FreeInwardDtlId === item?.InwardDtlId
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// STEP 2: Check if item is a paid product that can be converted to free
|
2026-01-30 10:05:20 +05:30
|
|
|
|
const availableFreeProduct = updatedFreeProdList?.find(
|
2026-01-27 18:27:29 +05:30
|
|
|
|
(prod) =>
|
|
|
|
|
|
prod?.FreeProdId === item?.ProdId &&
|
|
|
|
|
|
prod?.RemainingQty > 0 &&
|
|
|
|
|
|
prod?.ProdVariantDetails?.some((variant) =>
|
|
|
|
|
|
variant?.StockDetails?.some(
|
|
|
|
|
|
(stock) => stock?.FreeInwardDtlId === item?.InwardDtlId
|
|
|
|
|
|
)
|
|
|
|
|
|
) &&
|
|
|
|
|
|
item?.SinglePc !== 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const isPaidProductThatCanBeFree =
|
|
|
|
|
|
availableFreeProduct &&
|
|
|
|
|
|
(!item.OfferMode || item.OfferMode?.trim() === '') &&
|
|
|
|
|
|
(item.Offer === 0 || !item.Offer);
|
|
|
|
|
|
|
|
|
|
|
|
// STEP 3: Handle paid product conversion to free
|
|
|
|
|
|
if (isPaidProductThatCanBeFree) {
|
|
|
|
|
|
hasChanges = true; // Mark that changes occurred
|
|
|
|
|
|
|
|
|
|
|
|
const maxFreeQty = Math.min(
|
|
|
|
|
|
item.OrderQty,
|
|
|
|
|
|
availableFreeProduct.RemainingQty
|
|
|
|
|
|
);
|
|
|
|
|
|
const remainingPaidQty = Math.max(
|
|
|
|
|
|
item.OrderQty - availableFreeProduct.RemainingQty,
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Create free item
|
|
|
|
|
|
if (maxFreeQty > 0) {
|
|
|
|
|
|
const freeItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: maxFreeQty,
|
|
|
|
|
|
TotalAmt: maxFreeQty * item.OrderRate,
|
|
|
|
|
|
Offer: maxFreeQty * item.OrderRate, // Full discount
|
|
|
|
|
|
OfferType: availableFreeProduct.OfferMode,
|
|
|
|
|
|
OfferMode: availableFreeProduct.OfferMode,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(maxFreeQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate: (
|
|
|
|
|
|
maxFreeQty * item.OrderRate -
|
|
|
|
|
|
(maxFreeQty * item.OrderRate * item.TaxPercentage) / 100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
OfferMessage: [
|
|
|
|
|
|
{
|
|
|
|
|
|
OfferId: availableFreeProduct.OfferId,
|
|
|
|
|
|
FreeQty: maxFreeQty,
|
|
|
|
|
|
FreeProdId: availableFreeProduct.FreeProdId,
|
|
|
|
|
|
FreeProdName: availableFreeProduct.FreeProdName,
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Check if free version already exists in updatedOrderCardDetails
|
|
|
|
|
|
const existingFreeIndex = updatedOrderCardDetails.findIndex(
|
|
|
|
|
|
(od) =>
|
|
|
|
|
|
od.ProdId === freeItem.ProdId &&
|
|
|
|
|
|
od.InwardDtlId === freeItem.InwardDtlId &&
|
|
|
|
|
|
od.OrderRate === freeItem.OrderRate &&
|
|
|
|
|
|
od.BookingTypeName === freeItem.BookingTypeName &&
|
|
|
|
|
|
od.OfferMode === freeItem.OfferMode &&
|
|
|
|
|
|
od.Offer > 0 &&
|
|
|
|
|
|
od.MRP === freeItem.MRP
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (existingFreeIndex !== -1) {
|
|
|
|
|
|
// Merge with existing free item
|
|
|
|
|
|
const existing = updatedOrderCardDetails[existingFreeIndex];
|
|
|
|
|
|
updatedOrderCardDetails[existingFreeIndex] = {
|
|
|
|
|
|
...existing,
|
|
|
|
|
|
OrderQty: existing.OrderQty + freeItem.OrderQty,
|
|
|
|
|
|
TotalAmt: existing.TotalAmt + freeItem.TotalAmt,
|
|
|
|
|
|
Offer: existing.Offer + freeItem.Offer,
|
|
|
|
|
|
WithoutTaxRate: (
|
|
|
|
|
|
parseFloat(existing.WithoutTaxRate) +
|
|
|
|
|
|
parseFloat(freeItem.WithoutTaxRate)
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
parseFloat(existing.TaxAmt) + parseFloat(freeItem.TaxAmt)
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
freeItem.localId = uuidv4();
|
|
|
|
|
|
updatedOrderCardDetails.push(freeItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Update the free product list (create new object to avoid mutation)
|
|
|
|
|
|
const freeProductIndex = updatedFreeProdList.findIndex(
|
|
|
|
|
|
(f) =>
|
|
|
|
|
|
f.OfferId === availableFreeProduct.OfferId &&
|
|
|
|
|
|
f.FreeProdId === availableFreeProduct.FreeProdId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (freeProductIndex !== -1) {
|
|
|
|
|
|
updatedFreeProdList[freeProductIndex] = {
|
|
|
|
|
|
...updatedFreeProdList[freeProductIndex],
|
|
|
|
|
|
FreeQty:
|
|
|
|
|
|
(updatedFreeProdList[freeProductIndex].FreeQty || 0) +
|
|
|
|
|
|
maxFreeQty,
|
|
|
|
|
|
RemainingQty:
|
|
|
|
|
|
updatedFreeProdList[freeProductIndex].RemainingQty - maxFreeQty,
|
|
|
|
|
|
ProdVariantDetails: updatedFreeProdList[
|
|
|
|
|
|
freeProductIndex
|
|
|
|
|
|
].ProdVariantDetails.map((variant) => ({
|
|
|
|
|
|
...variant,
|
|
|
|
|
|
StockDetails: variant.StockDetails.map((stock) => {
|
|
|
|
|
|
if (stock.FreeInwardDtlId === item.InwardDtlId) {
|
|
|
|
|
|
return {
|
|
|
|
|
|
...stock,
|
|
|
|
|
|
UsedFree: (stock.UsedFree || 0) + maxFreeQty,
|
|
|
|
|
|
RemainingFree: Math.max(
|
|
|
|
|
|
(stock.RemainingFree || 0) - maxFreeQty,
|
|
|
|
|
|
0
|
|
|
|
|
|
),
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
return stock;
|
|
|
|
|
|
}),
|
|
|
|
|
|
})),
|
|
|
|
|
|
discount:
|
|
|
|
|
|
(updatedFreeProdList[freeProductIndex].discount || 0) +
|
|
|
|
|
|
maxFreeQty * item.OrderRate,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const filteredOfferAppliedProduct = offerAppliedProducts?.find(
|
|
|
|
|
|
(op) =>
|
|
|
|
|
|
op.OfferId === availableFreeProduct.OfferId &&
|
|
|
|
|
|
op.ProdId === availableFreeProduct.ProdId &&
|
|
|
|
|
|
op.InwardDtlId === availableFreeProduct.InwardDtlId &&
|
|
|
|
|
|
op.OfferMode === availableFreeProduct.OfferMode
|
|
|
|
|
|
);
|
|
|
|
|
|
// Create offer applied product entry
|
|
|
|
|
|
const offerAppliedProduct = {
|
|
|
|
|
|
OfferId: availableFreeProduct.OfferId,
|
|
|
|
|
|
ProdId: availableFreeProduct.ProdId,
|
|
|
|
|
|
InwardDtlId: availableFreeProduct.InwardDtlId,
|
|
|
|
|
|
OfferAmount:
|
|
|
|
|
|
(filteredOfferAppliedProduct?.OfferAmount || 0) +
|
|
|
|
|
|
maxFreeQty * item.OrderRate, // Total discount amount
|
|
|
|
|
|
OfferMode: availableFreeProduct.OfferMode,
|
|
|
|
|
|
OfferType: availableFreeProduct.OfferType,
|
|
|
|
|
|
TableName: availableFreeProduct.TableName,
|
|
|
|
|
|
TableUniqueName: availableFreeProduct.TableUniqueName,
|
|
|
|
|
|
ActualOfferAmount:
|
|
|
|
|
|
(filteredOfferAppliedProduct?.OfferAmount || 0) +
|
|
|
|
|
|
maxFreeQty * item.OrderRate,
|
|
|
|
|
|
OfferValue:
|
|
|
|
|
|
(filteredOfferAppliedProduct?.OfferValue || 0) +
|
|
|
|
|
|
maxFreeQty * item.OrderRate,
|
|
|
|
|
|
ActualFreeQty:
|
|
|
|
|
|
(filteredOfferAppliedProduct?.ActualFreeQty || 0) + maxFreeQty,
|
|
|
|
|
|
AppliesTo: item.ProdId,
|
|
|
|
|
|
BookingType:
|
|
|
|
|
|
item.BookingType ||
|
|
|
|
|
|
(item.BookingTypeName === 'Dine In' ? DineinId : TakAwayId),
|
|
|
|
|
|
FreeProductsList: [
|
|
|
|
|
|
{
|
|
|
|
|
|
FreeProdId: availableFreeProduct.FreeProdId,
|
|
|
|
|
|
FreeQty:
|
|
|
|
|
|
(filteredOfferAppliedProduct?.FreeProductsList?.[0]
|
|
|
|
|
|
?.FreeQty || 0) + maxFreeQty,
|
|
|
|
|
|
FreeProdName: availableFreeProduct.FreeProdName,
|
|
|
|
|
|
ProdVariantDetails:
|
|
|
|
|
|
availableFreeProduct.ProdVariantDetails || [],
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
// Product-level fields
|
|
|
|
|
|
SinglePc: item.SinglePc,
|
|
|
|
|
|
StockAvailable: item.StockAvailable,
|
|
|
|
|
|
ProdVariantName: item.ProdVariantName,
|
|
|
|
|
|
Type: item.Type,
|
|
|
|
|
|
ProdCat: item.ProdCat,
|
|
|
|
|
|
HalfPrice: availableFreeProduct.HalfPrice,
|
|
|
|
|
|
MinQty: availableFreeProduct.MinQty,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
updatedOfferAppliedProducts.push(offerAppliedProduct);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Create paid item for remaining quantity
|
|
|
|
|
|
if (remainingPaidQty > 0) {
|
|
|
|
|
|
const paidItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: remainingPaidQty,
|
|
|
|
|
|
TotalAmt: remainingPaidQty * item.OrderRate,
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
(remainingPaidQty * item.OrderRate * item.TaxPercentage) /
|
|
|
|
|
|
100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
WithoutTaxRate: (
|
|
|
|
|
|
remainingPaidQty * item.OrderRate -
|
|
|
|
|
|
(remainingPaidQty * item.OrderRate * item.TaxPercentage) / 100
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
Offer: 0,
|
|
|
|
|
|
OfferType: '',
|
|
|
|
|
|
OfferMessage: [],
|
|
|
|
|
|
OfferMode: '',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Remove offer-related properties
|
|
|
|
|
|
delete paidItem.OfferType;
|
|
|
|
|
|
delete paidItem.OfferMessage;
|
|
|
|
|
|
delete paidItem.OfferMode;
|
|
|
|
|
|
|
|
|
|
|
|
// Check if paid version already exists
|
|
|
|
|
|
const existingPaidIndex = updatedOrderCardDetails.findIndex(
|
|
|
|
|
|
(od) =>
|
|
|
|
|
|
od.ProdId === paidItem.ProdId &&
|
|
|
|
|
|
od.InwardDtlId === paidItem.InwardDtlId &&
|
|
|
|
|
|
od.OrderRate === paidItem.OrderRate &&
|
|
|
|
|
|
!od.SalesId &&
|
|
|
|
|
|
(od.Offer === 0 || !od.Offer) &&
|
|
|
|
|
|
od.MRP === paidItem.MRP
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (existingPaidIndex !== -1) {
|
|
|
|
|
|
// Merge with existing paid item
|
|
|
|
|
|
const existing = updatedOrderCardDetails[existingPaidIndex];
|
|
|
|
|
|
updatedOrderCardDetails[existingPaidIndex] = {
|
|
|
|
|
|
...existing,
|
|
|
|
|
|
OrderQty: existing.OrderQty + paidItem.OrderQty,
|
|
|
|
|
|
TotalAmt: existing.TotalAmt + paidItem.TotalAmt,
|
|
|
|
|
|
WithoutTaxRate: (
|
|
|
|
|
|
parseFloat(existing.WithoutTaxRate) +
|
|
|
|
|
|
parseFloat(paidItem.WithoutTaxRate)
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
TaxAmt: (
|
|
|
|
|
|
parseFloat(existing.TaxAmt) + parseFloat(paidItem.TaxAmt)
|
|
|
|
|
|
).toFixed(2),
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
paidItem.localId = uuidv4();
|
|
|
|
|
|
updatedOrderCardDetails.push(paidItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return; // Skip the rest of processing for this item
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// STEP 4: Handle existing free products (original logic)
|
|
|
|
|
|
if (foundInFreeProdList?.length > 0) {
|
|
|
|
|
|
const freeProduct = foundInFreeProdList[0];
|
|
|
|
|
|
|
|
|
|
|
|
if (freeProduct?.RemainingQty !== 0) {
|
|
|
|
|
|
// If there are remaining free quantities, push the original item
|
|
|
|
|
|
const isAlreadyExists = updatedOrderCardDetails.findIndex(
|
|
|
|
|
|
(od) =>
|
|
|
|
|
|
od.ProdId === item.ProdId &&
|
|
|
|
|
|
od.InwardDtlId === item.InwardDtlId &&
|
|
|
|
|
|
od.OrderRate === item.OrderRate &&
|
|
|
|
|
|
od.BookingTypeName === item.BookingTypeName &&
|
|
|
|
|
|
!od.SalesId &&
|
|
|
|
|
|
od.OfferMode === item.OfferMode &&
|
|
|
|
|
|
od.Offer > 0 &&
|
|
|
|
|
|
od.MRP === item.MRP
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (isAlreadyExists !== -1) {
|
|
|
|
|
|
updatedOrderCardDetails[isAlreadyExists] = {
|
|
|
|
|
|
...updatedOrderCardDetails[isAlreadyExists],
|
|
|
|
|
|
OrderQty:
|
|
|
|
|
|
updatedOrderCardDetails[isAlreadyExists].OrderQty +
|
|
|
|
|
|
item.OrderQty,
|
|
|
|
|
|
TotalAmt:
|
|
|
|
|
|
updatedOrderCardDetails[isAlreadyExists].TotalAmt +
|
|
|
|
|
|
item.TotalAmt,
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
updatedOrderCardDetails[isAlreadyExists].WithoutTaxRate +
|
|
|
|
|
|
item.WithoutTaxRate,
|
|
|
|
|
|
Offer:
|
|
|
|
|
|
updatedOrderCardDetails[isAlreadyExists].Offer + item.Offer,
|
|
|
|
|
|
OfferMessage:
|
|
|
|
|
|
updatedOrderCardDetails[isAlreadyExists]?.OfferMessage?.[0]
|
|
|
|
|
|
?.FreeQty > item?.OfferMessage?.[0]?.FreeQty
|
|
|
|
|
|
? updatedOrderCardDetails[isAlreadyExists]?.OfferMessage
|
|
|
|
|
|
: item?.OfferMessage,
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
updatedOrderCardDetails.push(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
freeProduct?.RemainingQty === 0 &&
|
|
|
|
|
|
item?.OrderQty > freeProduct?.FreeQty
|
|
|
|
|
|
) {
|
|
|
|
|
|
// Split the item into free and paid portions
|
|
|
|
|
|
const freeQty = freeProduct.FreeQty;
|
|
|
|
|
|
const paidQty = item.OrderQty - freeProduct.FreeQty;
|
|
|
|
|
|
|
|
|
|
|
|
// Create free item (with original offer details)
|
|
|
|
|
|
const freeItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: freeQty,
|
|
|
|
|
|
WithoutTaxRate: freeQty * item.OrderRate,
|
|
|
|
|
|
TotalAmt: freeQty * item.OrderRate,
|
|
|
|
|
|
Offer: freeQty * item.OrderRate,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Create paid item (without offer details)
|
|
|
|
|
|
const paidItem = {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
OrderQty: paidQty,
|
|
|
|
|
|
TotalAmt: paidQty * (item.SellingPrice || item.OrderRate),
|
|
|
|
|
|
WithoutTaxRate: paidQty * item.OrderRate,
|
|
|
|
|
|
Offer: 0,
|
|
|
|
|
|
OfferType: '',
|
|
|
|
|
|
OfferMessage: [],
|
|
|
|
|
|
OfferMode: '',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
delete paidItem.OfferType;
|
|
|
|
|
|
delete paidItem.OfferMessage;
|
|
|
|
|
|
delete paidItem.OfferMode;
|
|
|
|
|
|
|
|
|
|
|
|
updatedOrderCardDetails.push(freeItem);
|
|
|
|
|
|
|
|
|
|
|
|
const isAlreadyExists = updatedOrderCardDetails.findIndex(
|
|
|
|
|
|
(od) =>
|
|
|
|
|
|
od.ProdId === paidItem.ProdId &&
|
|
|
|
|
|
od.InwardDtlId === paidItem.InwardDtlId &&
|
|
|
|
|
|
od.OrderRate === paidItem.OrderRate &&
|
|
|
|
|
|
!od.SalesId &&
|
|
|
|
|
|
(od.Offer === 0 || !od.Offer)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (isAlreadyExists !== -1) {
|
|
|
|
|
|
const existingItem = updatedOrderCardDetails[isAlreadyExists];
|
|
|
|
|
|
updatedOrderCardDetails[isAlreadyExists] = {
|
|
|
|
|
|
...existingItem,
|
|
|
|
|
|
OrderQty: existingItem.OrderQty + paidItem.OrderQty,
|
|
|
|
|
|
TotalAmt: existingItem.TotalAmt + paidItem.TotalAmt,
|
|
|
|
|
|
WithoutTaxRate:
|
|
|
|
|
|
existingItem.WithoutTaxRate + paidItem.WithoutTaxRate,
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
paidItem.localId = uuidv4();
|
|
|
|
|
|
updatedOrderCardDetails.push(paidItem);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
updatedOrderCardDetails.push(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// STEP 5: No matching free product found, push original item
|
|
|
|
|
|
updatedOrderCardDetails.push(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
updatedOrderCardDetails,
|
|
|
|
|
|
updatedFreeProdList,
|
|
|
|
|
|
updatedOfferAppliedProducts,
|
|
|
|
|
|
hasChanges,
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const returnCount = (ProdName, currentQty, orderDetails, overallpcs) => {
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdName === ProdName
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Include combo consumption from ReorderProductData (SetCount == 0)
|
|
|
|
|
|
try {
|
|
|
|
|
|
const reorderComboLines = (ReorderProductData || []).filter(
|
|
|
|
|
|
(a) => a?.Type === 'C'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (reorderComboLines?.length > 0) {
|
|
|
|
|
|
const reorderComboConsumed = reorderComboLines.reduce(
|
|
|
|
|
|
(sum, comboLine) => {
|
|
|
|
|
|
const setZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!setZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumed = details.reduce((inner, d) => {
|
|
|
|
|
|
const nameMatches =
|
|
|
|
|
|
d?.ProdName === ProdName || d?.ProductName === ProdName;
|
|
|
|
|
|
if (nameMatches && d?.StockAvailable === 'Y') {
|
|
|
|
|
|
const compQty = parseInt(d?.ProductQty ?? 1);
|
|
|
|
|
|
return inner + orderQty * (isNaN(compQty) ? 1 : compQty);
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumed;
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
totalSelectedProductQty =
|
|
|
|
|
|
parseInt(totalSelectedProductQty || 0) +
|
|
|
|
|
|
parseInt(reorderComboConsumed || 0);
|
|
|
|
|
|
}
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let getCurrentProdDtl = orderDetails?.filter(
|
|
|
|
|
|
(a) => a?.ProdName === ProdName
|
|
|
|
|
|
);
|
|
|
|
|
|
let ComboProdDtl = orderDetails?.filter((a) => a?.Type === 'C');
|
|
|
|
|
|
if (overallpcs === 'Y' && ComboProdDtl?.length > 0) {
|
|
|
|
|
|
getCurrentProdDtl = getCurrentProdDtl?.filter((a) => a?.Type !== 'C');
|
|
|
|
|
|
}
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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);
|
|
|
|
|
|
|
|
|
|
|
|
// Combo adjustment:
|
|
|
|
|
|
// If combos (Type === 'C') include this product and that component has SetCount == 0
|
|
|
|
|
|
// and StockAvailable === 'Y', treat each occurrence as consuming one unit.
|
|
|
|
|
|
if (Array.isArray(ComboProdDtl) && ComboProdDtl.length > 0) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const comboExtraQty = ComboProdDtl.reduce((sum, comboLine) => {
|
|
|
|
|
|
// Use combo-level SetCount when detail-level SetCount is absent
|
|
|
|
|
|
const comboSetCountZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!comboSetCountZero) return sum;
|
|
|
|
|
|
const details = comboLine?.ProdDetail;
|
|
|
|
|
|
if (!Array.isArray(details)) return sum;
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumed = details.reduce((innerSum, d) => {
|
|
|
|
|
|
const nameMatches =
|
|
|
|
|
|
d?.ProdName === ProdName || d?.ProductName === ProdName;
|
|
|
|
|
|
const stockYes = d?.StockAvailable === 'Y';
|
|
|
|
|
|
if (nameMatches && stockYes) {
|
|
|
|
|
|
const compQty = parseInt(d?.ProductQty ?? 1);
|
|
|
|
|
|
return innerSum + orderQty * (isNaN(compQty) ? 1 : compQty);
|
|
|
|
|
|
}
|
|
|
|
|
|
return innerSum;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumed;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
totalOrderQty =
|
|
|
|
|
|
parseInt(totalOrderQty || 0) + parseInt(comboExtraQty || 0);
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
// ignore structure mismatches
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
let OverallProdQty = totalOrderQty - totalSelectedProductQty;
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(currentQty) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object?.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(currentQty) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object?.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const returnOnepcCount = (ProdName, currentQty, orderDetails, overallpcs) => {
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdName === ProdName
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
let getCurrentProdDtl = orderDetails?.filter(
|
|
|
|
|
|
(a) => a?.ProdName === ProdName
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
let OverallProdQty = totalOrderQty - totalSelectedProductQty;
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(currentQty) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(currentQty) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const returnQtyCount = (ProdId, item, orderDetails) => {
|
|
|
|
|
|
if (onePeiceFlow) {
|
|
|
|
|
|
let ItemQuantity = item?.ProdVariantDetails?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return accumulator + parseInt(card.OverAllPcs || 0);
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Include combo consumption from ReorderProductData (pieces flow)
|
|
|
|
|
|
try {
|
|
|
|
|
|
const reorderComboLines = (ReorderProductData || []).filter(
|
|
|
|
|
|
(a) => a?.Type === 'C'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (reorderComboLines?.length > 0) {
|
|
|
|
|
|
const reorderComboConsumed = reorderComboLines.reduce(
|
|
|
|
|
|
(sum, comboLine) => {
|
|
|
|
|
|
const setZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!setZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumed = details.reduce((inner, d) => {
|
|
|
|
|
|
if (d?.ProdId === ProdId && d?.StockAvailable === 'Y') {
|
|
|
|
|
|
const compQty = parseInt(d?.ProductQty ?? 1);
|
|
|
|
|
|
return inner + orderQty * (isNaN(compQty) ? 1 : compQty);
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumed;
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
totalSelectedProductQty =
|
|
|
|
|
|
parseInt(totalSelectedProductQty || 0) +
|
|
|
|
|
|
parseInt(reorderComboConsumed || 0);
|
|
|
|
|
|
}
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let getCurrentProdDtl = orderDetails?.filter((a) => a?.ProdId === ProdId);
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
// Include combo consumption for pieces flow
|
|
|
|
|
|
try {
|
|
|
|
|
|
const comboLines = orderDetails?.filter((a) => a?.Type === 'C') || [];
|
|
|
|
|
|
const comboConsumed = comboLines.reduce((sum, comboLine) => {
|
|
|
|
|
|
const comboSetZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!comboSetZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumedForThisCombo = details.reduce((inner, d) => {
|
|
|
|
|
|
if (d?.ProdId === ProdId && d?.StockAvailable === 'Y') {
|
|
|
|
|
|
const compQty = parseInt(d?.ProductQty ?? 1);
|
|
|
|
|
|
return inner + orderQty * (isNaN(compQty) ? 1 : compQty);
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumedForThisCombo;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
totalOrderQty =
|
|
|
|
|
|
parseInt(totalOrderQty || 0) + parseInt(comboConsumed || 0);
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let OverallProdQty = totalOrderQty - totalSelectedProductQty;
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(ItemQuantity) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(ItemQuantity) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let ItemQuantity = item?.ProdVariantDetails?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return accumulator + parseInt(card.OverAllQty || 0);
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Include combo consumption from ReorderProductData (quantity flow)
|
|
|
|
|
|
try {
|
|
|
|
|
|
const reorderComboLines = (ReorderProductData || []).filter(
|
|
|
|
|
|
(a) => a?.Type === 'C'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (reorderComboLines?.length > 0) {
|
|
|
|
|
|
const reorderComboConsumed = reorderComboLines.reduce(
|
|
|
|
|
|
(sum, comboLine) => {
|
|
|
|
|
|
const setZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!setZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumed = details.reduce((inner, d) => {
|
|
|
|
|
|
if (d?.ProdId === ProdId && d?.StockAvailable === 'Y') {
|
|
|
|
|
|
return inner + orderQty;
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumed;
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
totalSelectedProductQty =
|
|
|
|
|
|
parseInt(totalSelectedProductQty || 0) +
|
|
|
|
|
|
parseInt(reorderComboConsumed || 0);
|
|
|
|
|
|
}
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let getCurrentProdDtl = orderDetails?.filter((a) => a?.ProdId === ProdId);
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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);
|
|
|
|
|
|
// Include combo consumption for quantity flow
|
|
|
|
|
|
try {
|
|
|
|
|
|
const comboLines = orderDetails?.filter((a) => a?.Type === 'C') || [];
|
|
|
|
|
|
const comboConsumed = comboLines.reduce((sum, comboLine) => {
|
|
|
|
|
|
const comboSetZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!comboSetZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumedForThisCombo = details.reduce((inner, d) => {
|
|
|
|
|
|
if (d?.ProdId === ProdId && d?.StockAvailable === 'Y') {
|
|
|
|
|
|
return inner + orderQty;
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumedForThisCombo;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
totalOrderQty =
|
|
|
|
|
|
parseInt(totalOrderQty || 0) + parseInt(comboConsumed || 0);
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let OverallProdQty = totalOrderQty - totalSelectedProductQty;
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(ItemQuantity) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(ItemQuantity) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const returnCountStock = (
|
|
|
|
|
|
ProdId,
|
|
|
|
|
|
currentQty,
|
|
|
|
|
|
orderDetails,
|
|
|
|
|
|
InwardDtlId,
|
|
|
|
|
|
onepcavailable,
|
|
|
|
|
|
overallpcs
|
|
|
|
|
|
) => {
|
|
|
|
|
|
if (onepcavailable === 'Y') {
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.InwardDtlId === InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Include combo consumption from ReorderProductData (pieces + batch)
|
|
|
|
|
|
try {
|
|
|
|
|
|
const reorderComboLines = (ReorderProductData || []).filter(
|
|
|
|
|
|
(a) => a?.Type === 'C'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (reorderComboLines?.length > 0) {
|
|
|
|
|
|
const reorderComboConsumed = reorderComboLines.reduce(
|
|
|
|
|
|
(sum, comboLine) => {
|
|
|
|
|
|
const setZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!setZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumed = details.reduce((inner, d) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
d?.ProdId === ProdId &&
|
|
|
|
|
|
d?.InwardDtlId === InwardDtlId &&
|
|
|
|
|
|
d?.StockAvailable === 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
const compQty = parseInt(d?.ProductQty ?? 1);
|
|
|
|
|
|
return inner + orderQty * (isNaN(compQty) ? 1 : compQty);
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumed;
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
totalSelectedProductQty =
|
|
|
|
|
|
parseInt(totalSelectedProductQty || 0) +
|
|
|
|
|
|
parseInt(reorderComboConsumed || 0);
|
|
|
|
|
|
}
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let getCurrentProdDtl = orderDetails?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.InwardDtlId === InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
|
|
|
|
|
|
// Include combo consumption (no one-piece logic for combos)
|
|
|
|
|
|
try {
|
|
|
|
|
|
const comboLines = orderDetails?.filter((a) => a?.Type === 'C') || [];
|
|
|
|
|
|
const comboConsumed = comboLines.reduce((sum, comboLine) => {
|
|
|
|
|
|
const comboSetZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!comboSetZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumedForThisCombo = details.reduce((inner, d) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
d?.ProdId === ProdId &&
|
|
|
|
|
|
d?.InwardDtlId === InwardDtlId &&
|
|
|
|
|
|
d?.StockAvailable === 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
const compQty = parseInt(d?.ProductQty ?? 1);
|
|
|
|
|
|
return inner + orderQty * (isNaN(compQty) ? 1 : compQty);
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumedForThisCombo;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
totalOrderQty =
|
|
|
|
|
|
parseInt(totalOrderQty || 0) + parseInt(comboConsumed || 0);
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
|
|
|
|
|
let OverallProdQty = totalOrderQty - totalSelectedProductQty;
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(currentQty) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(currentQty) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.InwardDtlId === InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// Include combo consumption from ReorderProductData (quantity + batch)
|
|
|
|
|
|
try {
|
|
|
|
|
|
const reorderComboLines = (ReorderProductData || []).filter(
|
|
|
|
|
|
(a) => a?.Type === 'C'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (reorderComboLines?.length > 0) {
|
|
|
|
|
|
const reorderComboConsumed = reorderComboLines.reduce(
|
|
|
|
|
|
(sum, comboLine) => {
|
|
|
|
|
|
const setZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!setZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumed = details.reduce((inner, d) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
d?.ProdId === ProdId &&
|
|
|
|
|
|
d?.InwardDtlId === InwardDtlId &&
|
|
|
|
|
|
d?.StockAvailable === 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
return inner + orderQty;
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumed;
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
totalSelectedProductQty =
|
|
|
|
|
|
parseInt(totalSelectedProductQty || 0) +
|
|
|
|
|
|
parseInt(reorderComboConsumed || 0);
|
|
|
|
|
|
}
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let getCurrentProdDtl = orderDetails?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.InwardDtlId === InwardDtlId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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);
|
|
|
|
|
|
|
|
|
|
|
|
// Include combo consumption for quantity flow
|
|
|
|
|
|
try {
|
|
|
|
|
|
const comboLines = orderDetails?.filter((a) => a?.Type === 'C') || [];
|
|
|
|
|
|
const comboConsumed = comboLines.reduce((sum, comboLine) => {
|
|
|
|
|
|
const comboSetZero =
|
|
|
|
|
|
comboLine?.SetCount === 0 || comboLine?.SetCount === '0';
|
|
|
|
|
|
if (!comboSetZero) return sum;
|
|
|
|
|
|
const details = Array.isArray(comboLine?.ProdDetail)
|
|
|
|
|
|
? comboLine?.ProdDetail
|
|
|
|
|
|
: [];
|
|
|
|
|
|
const orderQty = parseInt(comboLine?.OrderQty || 1);
|
|
|
|
|
|
const consumedForThisCombo = details.reduce((inner, d) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
d?.ProdId === ProdId &&
|
|
|
|
|
|
d?.InwardDtlId === InwardDtlId &&
|
|
|
|
|
|
d?.StockAvailable === 'Y'
|
|
|
|
|
|
) {
|
|
|
|
|
|
return inner + orderQty;
|
|
|
|
|
|
}
|
|
|
|
|
|
return inner;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return sum + consumedForThisCombo;
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
totalOrderQty =
|
|
|
|
|
|
parseInt(totalOrderQty || 0) + parseInt(comboConsumed || 0);
|
2026-03-03 19:39:44 +05:30
|
|
|
|
} catch (_) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
|
|
|
|
|
let OverallProdQty = totalOrderQty - totalSelectedProductQty;
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(currentQty) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(currentQty) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? OverallProdQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const returnVariantStock = (
|
|
|
|
|
|
ProdId,
|
|
|
|
|
|
currentQty,
|
|
|
|
|
|
orderDetails,
|
|
|
|
|
|
ProdVariantName
|
|
|
|
|
|
) => {
|
|
|
|
|
|
// let ReorderProdetails = BookingType === "Dine In" && !UnpaidData ? ReportholdData?.OrderDtlDetails
|
|
|
|
|
|
// : BookingType === "Dine In" && UnpaidData ? ReportholdData?.productDetails
|
|
|
|
|
|
// : ReportholdData?.productDetails
|
|
|
|
|
|
if (onePeiceFlow) {
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.ProdVariantName === ProdVariantName
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
},
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
let getCurrentProdDtl = orderDetails?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.ProdVariantName === ProdVariantName
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? card.SinglePc !== 'Y'
|
|
|
|
|
|
? card.OrderQty * card.NoOfPcs
|
|
|
|
|
|
: card.OrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(currentQty) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? totalOrderQty - totalSelectedProductQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(currentQty) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? totalOrderQty - totalSelectedProductQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let SelectedProduct = ReorderProductData?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.ProdVariantName === ProdVariantName
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalSelectedProductQty = SelectedProduct?.reduce(
|
|
|
|
|
|
(accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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 getCurrentProdDtl = orderDetails?.filter(
|
|
|
|
|
|
(a) => a?.ProdId === ProdId && a?.ProdVariantName === ProdVariantName
|
|
|
|
|
|
);
|
|
|
|
|
|
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
accumulator +
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
card?.StockAvailable === 'Y'
|
|
|
|
|
|
? 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);
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
parseInt(currentQty) >
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? totalOrderQty - totalSelectedProductQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
parseInt(currentQty) -
|
|
|
|
|
|
parseInt(
|
|
|
|
|
|
Object.keys(ReportholdData)?.length > 0 && totalOrderQty
|
|
|
|
|
|
? totalOrderQty - totalSelectedProductQty
|
|
|
|
|
|
: getCurrentProdDtl
|
|
|
|
|
|
? totalOrderQty
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
return parseInt(count);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
return count;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const varientcolumns = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Variant Name',
|
|
|
|
|
|
dataIndex: 'VarientName',
|
|
|
|
|
|
key: 'VarientName',
|
|
|
|
|
|
align: 'left',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0 ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
record.StockCount === 'Stock Not Maintained'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record.VarientName}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
record.StockCount > 0 ||
|
|
|
|
|
|
record.StockCount === 'Stock Not Maintained'
|
|
|
|
|
|
) {
|
|
|
|
|
|
Stockfun(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Stock Count',
|
|
|
|
|
|
dataIndex: 'StockCount',
|
|
|
|
|
|
key: 'StockCount',
|
|
|
|
|
|
align: 'Right',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0 ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
record.StockCount === 'Stock Not Maintained'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record.StockCount}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
record.StockCount > 0 ||
|
|
|
|
|
|
record.StockCount === 'Stock Not Maintained'
|
|
|
|
|
|
) {
|
|
|
|
|
|
Stockfun(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Amount',
|
|
|
|
|
|
dataIndex: 'Amount',
|
|
|
|
|
|
key: 'Amount',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0 ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
record.StockCount === 'Stock Not Maintained'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record.Amount}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
record.StockCount > 0 ||
|
|
|
|
|
|
record.StockCount === 'Stock Not Maintained'
|
|
|
|
|
|
) {
|
|
|
|
|
|
Stockfun(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
const stockcolumns = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Batch No',
|
|
|
|
|
|
dataIndex: 'Batch No',
|
|
|
|
|
|
key: 'Batch No',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
render: (text, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0
|
|
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record?.['Batch No']}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (record.StockCount > 0) {
|
|
|
|
|
|
StockSelected(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Stock Count',
|
|
|
|
|
|
dataIndex: 'StockCount',
|
|
|
|
|
|
key: 'StockCount',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0
|
|
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record.StockCount}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (record.StockCount > 0) {
|
|
|
|
|
|
StockSelected(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Stock Date',
|
|
|
|
|
|
dataIndex: 'Stock Date',
|
|
|
|
|
|
key: 'Stock Date',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0
|
|
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record?.['Stock Date']}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (record.StockCount > 0) {
|
|
|
|
|
|
StockSelected(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Exp Date',
|
|
|
|
|
|
dataIndex: 'ExpDate',
|
|
|
|
|
|
key: 'ExpDate',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0
|
|
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record.ExpDate}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (record.StockCount > 0) {
|
|
|
|
|
|
StockSelected(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Price',
|
|
|
|
|
|
dataIndex: 'Price',
|
|
|
|
|
|
key: 'Price',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<span
|
|
|
|
|
|
style={
|
|
|
|
|
|
record.StockCount > 0
|
|
|
|
|
|
? { color: '#000', cursor: 'pointer' }
|
|
|
|
|
|
: { color: '#f49898', cursor: 'not-allowed' }
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{safeRound(record.Price)}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
),
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
if (record.StockCount > 0) {
|
|
|
|
|
|
StockSelected(record);
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
const qtydataSource = [];
|
|
|
|
|
|
|
|
|
|
|
|
qtydata?.ProductDetail?.map((item, index) => {
|
|
|
|
|
|
qtydataSource.push({
|
|
|
|
|
|
key: index,
|
|
|
|
|
|
Quantity: item?.Size + ' ' + item?.UomName,
|
|
|
|
|
|
Amount: item?.ProdVariantDetails?.[0]?.StockDetails?.[0]?.SellPrice,
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
const varientdataSource = [];
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.map((item, index) => {
|
|
|
|
|
|
varientdataSource.push({
|
|
|
|
|
|
key: index,
|
|
|
|
|
|
VarientName: item?.ProdVariantName,
|
|
|
|
|
|
Amount: onePeiceFlow
|
|
|
|
|
|
? item?.StockDetails?.[0]?.OnePcsPrice
|
|
|
|
|
|
: item?.StockDetails?.[0]?.SellPrice,
|
|
|
|
|
|
StockCount:
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.StockAvailable === 'Y'
|
|
|
|
|
|
? onePeiceFlow
|
|
|
|
|
|
? returnVariantStock(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdId,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item?.ProdVariantName
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnVariantStock(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdId,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item?.ProdVariantName
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: 'Stock Not Maintained',
|
|
|
|
|
|
VariantAvailableFrom: item?.AvailableFrom,
|
|
|
|
|
|
VariantAvailableTo: item?.AvailableTo,
|
|
|
|
|
|
SlotStatus: item?.StockDetails?.[0]?.SlotStatus,
|
|
|
|
|
|
InwardDtlId: item?.StockDetails?.[0]?.InwardDtlId,
|
|
|
|
|
|
BookedDate: selectedDate,
|
|
|
|
|
|
BookedQty: item?.StockDetails?.[0]?.BookedQty,
|
|
|
|
|
|
TotalSlotQty: item?.StockDetails?.[0]?.TotalSlotQty,
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const stockdataSource = [];
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[
|
|
|
|
|
|
VarientIndex
|
|
|
|
|
|
]?.StockDetails?.map((item, index) => {
|
|
|
|
|
|
const expDate = new Date(item?.ExpDate);
|
|
|
|
|
|
stockdataSource.push({
|
|
|
|
|
|
key: index,
|
|
|
|
|
|
'Batch No': item?.BatchRef,
|
|
|
|
|
|
StockCount: onePeiceFlow
|
|
|
|
|
|
? returnCountStock(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProdId,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item?.InwardDtlId,
|
|
|
|
|
|
'Y'
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnCountStock(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProdId,
|
|
|
|
|
|
item?.BalanceQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item?.InwardDtlId,
|
|
|
|
|
|
'N',
|
|
|
|
|
|
item?.OverAllPcs
|
|
|
|
|
|
),
|
2026-01-27 18:27:29 +05:30
|
|
|
|
'Stock Date': ExtractDateFormate(item?.InwardDate),
|
|
|
|
|
|
Price: onePeiceFlow ? item?.OnePcsPrice : item?.SellPrice,
|
|
|
|
|
|
ExpDate:
|
|
|
|
|
|
expDate != 'Invalid Date' || null || undefined || ''
|
|
|
|
|
|
? ExtractDateFormate(item?.ExpDate)
|
|
|
|
|
|
: '-',
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const extractProductDetails = (a, QtyIndex, VarientIndex, stockIndex) => {
|
|
|
|
|
|
const detail = a?.ProductDetail?.[QtyIndex];
|
|
|
|
|
|
const variant = detail?.ProdVariantDetails?.[VarientIndex];
|
|
|
|
|
|
const stock = variant?.StockDetails?.[stockIndex];
|
|
|
|
|
|
|
|
|
|
|
|
return { detail, variant, stock };
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const buildOrderData = (
|
|
|
|
|
|
a,
|
|
|
|
|
|
detail,
|
|
|
|
|
|
variant,
|
|
|
|
|
|
stock,
|
|
|
|
|
|
size,
|
|
|
|
|
|
orderRate,
|
|
|
|
|
|
onePcs,
|
|
|
|
|
|
weightscale
|
|
|
|
|
|
) => {
|
|
|
|
|
|
const { ProdCat, Type, OverAllQty: OverallQuantity, CounterName } = a || {};
|
|
|
|
|
|
const {
|
|
|
|
|
|
ActiveStatus,
|
|
|
|
|
|
AvailableFrom,
|
|
|
|
|
|
AvailableTo,
|
|
|
|
|
|
Cess,
|
|
|
|
|
|
HSNCode,
|
|
|
|
|
|
BrandName,
|
|
|
|
|
|
OpeningQty,
|
|
|
|
|
|
PartNumber,
|
|
|
|
|
|
ProdId,
|
|
|
|
|
|
ProdLogo,
|
|
|
|
|
|
ProdName,
|
|
|
|
|
|
QRCode,
|
|
|
|
|
|
QtyBasedPrice,
|
|
|
|
|
|
Rack,
|
|
|
|
|
|
StockAvailable,
|
|
|
|
|
|
TokenAvailable,
|
|
|
|
|
|
TaxId,
|
|
|
|
|
|
TaxPercentage,
|
|
|
|
|
|
TaxIdName: TaxName,
|
|
|
|
|
|
UniqueId,
|
|
|
|
|
|
UomName,
|
|
|
|
|
|
DiscountLimitType,
|
|
|
|
|
|
DiscountLimit,
|
|
|
|
|
|
} = detail || {};
|
|
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
|
NoOfPcs,
|
|
|
|
|
|
BalanceQty,
|
|
|
|
|
|
BatchRef,
|
|
|
|
|
|
ModelNumber,
|
|
|
|
|
|
ProductIdentifierDtls: FullProductIdentifierDtls,
|
|
|
|
|
|
InwardDate,
|
|
|
|
|
|
InwardDtlId,
|
|
|
|
|
|
ExpDate,
|
|
|
|
|
|
InwardId,
|
|
|
|
|
|
MRP,
|
|
|
|
|
|
OnePcsPrice,
|
|
|
|
|
|
SellPrice,
|
|
|
|
|
|
SuppId,
|
|
|
|
|
|
SuppName,
|
|
|
|
|
|
OverAllPcs,
|
|
|
|
|
|
OfferPrice: Offer,
|
|
|
|
|
|
TotalSlotQty,
|
|
|
|
|
|
BookedQty,
|
|
|
|
|
|
} = stock || {};
|
|
|
|
|
|
const BalanceBookedQty = TotalSlotQty || 0 - BookedQty || 0;
|
|
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
|
ProdVariantName,
|
|
|
|
|
|
AvailableFrom: VariantAvailableFrom,
|
|
|
|
|
|
AvailableTo: VariantAvailableTo,
|
|
|
|
|
|
} = variant || {};
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
ProdCat,
|
|
|
|
|
|
Type,
|
|
|
|
|
|
OverallQuantity,
|
|
|
|
|
|
ActiveStatus,
|
|
|
|
|
|
AvailableFrom,
|
|
|
|
|
|
AvailableTo,
|
|
|
|
|
|
Cess,
|
|
|
|
|
|
HSNCode,
|
|
|
|
|
|
BrandName,
|
|
|
|
|
|
OpeningQty,
|
|
|
|
|
|
PartNumber,
|
|
|
|
|
|
ProdId,
|
|
|
|
|
|
ProdLogo,
|
|
|
|
|
|
ProdName,
|
|
|
|
|
|
QRCode,
|
|
|
|
|
|
QtyBasedPrice,
|
|
|
|
|
|
Rack,
|
|
|
|
|
|
Size: size,
|
|
|
|
|
|
StockAvailable,
|
|
|
|
|
|
TokenAvailable,
|
|
|
|
|
|
TaxId,
|
|
|
|
|
|
TaxPercentage,
|
|
|
|
|
|
TaxName,
|
|
|
|
|
|
UniqueId,
|
|
|
|
|
|
UomName: onePcs ? 'PCS' : UomName,
|
|
|
|
|
|
SinglePc: onePcs ? 'Y' : 'N',
|
|
|
|
|
|
NoOfPcs,
|
|
|
|
|
|
ProdVariantName,
|
|
|
|
|
|
VariantAvailableFrom,
|
|
|
|
|
|
VariantAvailableTo,
|
|
|
|
|
|
BalanceQty,
|
|
|
|
|
|
BatchRef,
|
|
|
|
|
|
ModelNumber,
|
|
|
|
|
|
FullProductIdentifierDtls,
|
|
|
|
|
|
InwardDate,
|
|
|
|
|
|
InwardDtlId,
|
|
|
|
|
|
ExpDate,
|
|
|
|
|
|
InwardId,
|
|
|
|
|
|
MRP: onePcs ? OnePcsPrice : MRP,
|
|
|
|
|
|
OrderRate: orderRate,
|
|
|
|
|
|
SellingPrice: orderRate,
|
|
|
|
|
|
SuppId,
|
|
|
|
|
|
SuppName,
|
|
|
|
|
|
OverAllPcs,
|
|
|
|
|
|
Offer,
|
|
|
|
|
|
BookingTypeName: BookingType,
|
|
|
|
|
|
CounterName,
|
|
|
|
|
|
DiscountLimitType,
|
|
|
|
|
|
DiscountLimit,
|
|
|
|
|
|
BookedDate: selectedDate,
|
|
|
|
|
|
BalanceBookedQty,
|
|
|
|
|
|
ScaleType: weightscale ? weightscale : '',
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const resetProductModal = () => {
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
setModalVarient(false);
|
|
|
|
|
|
setModelstock(false);
|
|
|
|
|
|
setQtyIndex(0);
|
|
|
|
|
|
setVarientIndex(0);
|
|
|
|
|
|
setVarItem(0);
|
|
|
|
|
|
setItem();
|
|
|
|
|
|
setStockItem();
|
|
|
|
|
|
dispatch(changeSearchedData(''));
|
|
|
|
|
|
setOnePeiceFlow(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const dataTransfer = async (
|
|
|
|
|
|
a,
|
|
|
|
|
|
QtyIndex,
|
|
|
|
|
|
VarientIndex,
|
|
|
|
|
|
stockIndex,
|
|
|
|
|
|
onePcs
|
|
|
|
|
|
) => {
|
|
|
|
|
|
const { detail, variant, stock } = extractProductDetails(
|
|
|
|
|
|
a,
|
|
|
|
|
|
QtyIndex,
|
|
|
|
|
|
VarientIndex,
|
|
|
|
|
|
stockIndex
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
console.log(stock, 'stock in dataTransfer');
|
|
|
|
|
|
// mohan 05-08-2025
|
|
|
|
|
|
const price = onePcs
|
|
|
|
|
|
? stock?.OnePcsPrice
|
|
|
|
|
|
: RetailWSSalesType === 'W'
|
|
|
|
|
|
? stock?.WhSalePrice || stock?.SellPrice
|
|
|
|
|
|
: stock?.SellPrice;
|
|
|
|
|
|
const size = onePcs ? '1' : detail?.Size;
|
|
|
|
|
|
if (quickBranchtoBranchTransfer) {
|
|
|
|
|
|
const data = buildOrderData(
|
|
|
|
|
|
a,
|
|
|
|
|
|
detail,
|
|
|
|
|
|
variant,
|
|
|
|
|
|
stock,
|
|
|
|
|
|
size,
|
|
|
|
|
|
price,
|
|
|
|
|
|
onePcs
|
|
|
|
|
|
);
|
|
|
|
|
|
if (!selectedProducts?.some((s) => s.ProdId === detail?.ProdId)) {
|
|
|
|
|
|
dispatch(
|
|
|
|
|
|
changeBtoBQuickProductTransfer({
|
|
|
|
|
|
action: quickBranchtoBranchTransfer,
|
|
|
|
|
|
selectedProducts: [
|
|
|
|
|
|
...selectedProducts,
|
|
|
|
|
|
{
|
|
|
|
|
|
...data,
|
|
|
|
|
|
OrderQty: 1,
|
|
|
|
|
|
TotalAmt: parseFloat(detail?.OrderRate).toFixed(2),
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
})
|
|
|
|
|
|
);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
setMessageData('Product already added');
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const isKgsProduct =
|
|
|
|
|
|
(detail?.UomName?.toLowerCase() === 'kgs' ||
|
|
|
|
|
|
detail?.UomName?.toLowerCase() === 'kg') &&
|
|
|
|
|
|
detail?.Size === '1';
|
|
|
|
|
|
console.log(
|
|
|
|
|
|
isKgsProduct,
|
|
|
|
|
|
WeightScalePort,
|
|
|
|
|
|
WeightScaleWeight,
|
|
|
|
|
|
'isKgsProduct'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (
|
|
|
|
|
|
WeightScalePort === true &&
|
|
|
|
|
|
isKgsProduct &&
|
|
|
|
|
|
WeightScaleWeight > 0.005 &&
|
|
|
|
|
|
WeightScaleWeight !== null
|
|
|
|
|
|
) {
|
|
|
|
|
|
let weightscale = 'weight';
|
|
|
|
|
|
// if (isKgsProduct) {
|
|
|
|
|
|
// if (WeightScaleWeight > 0 && WeightScaleWeight !== null) {
|
|
|
|
|
|
const basePrice = onePcs ? stock?.OnePcsPrice : stock?.SellPrice;
|
|
|
|
|
|
const totalRate = (
|
|
|
|
|
|
(basePrice / 1000) *
|
|
|
|
|
|
(parseFloat(WeightScaleWeight) * 1000)
|
|
|
|
|
|
).toFixed(2);
|
|
|
|
|
|
let orderqty = parseFloat(WeightScaleWeight);
|
|
|
|
|
|
const data = buildOrderData(
|
|
|
|
|
|
a,
|
|
|
|
|
|
detail,
|
|
|
|
|
|
variant,
|
|
|
|
|
|
stock,
|
|
|
|
|
|
detail?.Size,
|
|
|
|
|
|
basePrice,
|
|
|
|
|
|
onePcs,
|
|
|
|
|
|
weightscale
|
|
|
|
|
|
);
|
|
|
|
|
|
let fulldata = {
|
|
|
|
|
|
...data,
|
|
|
|
|
|
OrderQty: orderqty,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
await AddOrderDetails(fulldata);
|
|
|
|
|
|
// dispatch(changeWeightScaleWeight(null));
|
|
|
|
|
|
setRepeatedModel(false);
|
|
|
|
|
|
setProdexpir(false);
|
|
|
|
|
|
resetProductModal();
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// setMessageType('error');
|
|
|
|
|
|
// setMessageData('Please Connect WeightScale');
|
|
|
|
|
|
// }
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// setMessageType('error');
|
|
|
|
|
|
// setMessageData('Please Select 1Kg Product');
|
|
|
|
|
|
// }
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const isValidPcs =
|
|
|
|
|
|
onePcs && stock?.NoOfPcs > 0 && stock?.OnePcsPrice > 0;
|
|
|
|
|
|
const allowNonPcs =
|
|
|
|
|
|
!onePcs ||
|
|
|
|
|
|
(detail?.StockAvailable !== 'Y' && onePcs && stock?.OnePcsPrice > 0);
|
|
|
|
|
|
|
|
|
|
|
|
if (isValidPcs || allowNonPcs) {
|
|
|
|
|
|
const data = buildOrderData(
|
|
|
|
|
|
a,
|
|
|
|
|
|
detail,
|
|
|
|
|
|
variant,
|
|
|
|
|
|
stock,
|
|
|
|
|
|
size,
|
|
|
|
|
|
price,
|
|
|
|
|
|
onePcs
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
resetProductModal();
|
|
|
|
|
|
AddOrderDetails(data);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
setMessageData(
|
|
|
|
|
|
'Please add No.of pieces Inside the box in Product master'
|
|
|
|
|
|
);
|
|
|
|
|
|
resetProductModal();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setPreOrderSelectedProdNames(GPreOrderList);
|
|
|
|
|
|
}, [GPreOrderList]);
|
|
|
|
|
|
|
|
|
|
|
|
const pickData = (e, item) => {
|
|
|
|
|
|
if (e.target.checked === true) {
|
|
|
|
|
|
setSelectedProdNames([
|
|
|
|
|
|
...globalAllItemdata,
|
|
|
|
|
|
{
|
|
|
|
|
|
ProdName: item.ProdName,
|
|
|
|
|
|
ProdId: item.ProductDetail?.[0]?.ProdId,
|
|
|
|
|
|
ProdCat: item.ProdCat,
|
|
|
|
|
|
ProdCatName: item.ProdCatName,
|
|
|
|
|
|
},
|
|
|
|
|
|
]);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
console.log('SelectedProdNames', SelectedProdNames);
|
|
|
|
|
|
setSelectedProdNames(
|
|
|
|
|
|
SelectedProdNames?.filter(
|
|
|
|
|
|
(data) =>
|
|
|
|
|
|
!(data?.ProdName == item.ProdName && data?.ProdCat == item.ProdCat)
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleQuickCancel = async () => {
|
|
|
|
|
|
setQuickAdd(false);
|
|
|
|
|
|
dispatch(changeSearchedData(''));
|
|
|
|
|
|
|
|
|
|
|
|
// Base data for all calls
|
|
|
|
|
|
let baseData = {
|
|
|
|
|
|
CompId,
|
|
|
|
|
|
BranchId,
|
|
|
|
|
|
AppId,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 👇 Only add date if AvailableDate and selectedDate exist
|
|
|
|
|
|
if (AvailableDate && selectedDate) {
|
|
|
|
|
|
baseData.Date = selectedDate;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 1️⃣ Favourite items
|
|
|
|
|
|
await dispatch(getSelectedFavItems(baseData)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
// 2️⃣ For layout with SubCategory
|
|
|
|
|
|
let data1 = {
|
|
|
|
|
|
...baseData,
|
|
|
|
|
|
ProdSubCat,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 3️⃣ For layout without SubCategory
|
|
|
|
|
|
let data2 = {
|
|
|
|
|
|
compId: CompId,
|
|
|
|
|
|
branchId: BranchId,
|
|
|
|
|
|
appId: AppId,
|
|
|
|
|
|
prodCat: ProdCat,
|
|
|
|
|
|
...(AvailableDate && selectedDate ? { date: selectedDate } : {}), // conditionally add
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
templateData?.BookingLayout?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'SubCategory'
|
|
|
|
|
|
) &&
|
|
|
|
|
|
ProdSubCat
|
|
|
|
|
|
) {
|
|
|
|
|
|
await dispatch(getLayoutproductCard(data1)).unwrap();
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
!templateData?.BookingLayout?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'SubCategory'
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
await dispatch(getCardDataWithoutSubmodule(data2)).unwrap();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
await dispatch(getCardDataWithoutSub(data2)).unwrap();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onComplete = useCallback(() => {
|
|
|
|
|
|
setMessageData(null);
|
|
|
|
|
|
setMessageType(null);
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
const expFun = (item) => {
|
2026-02-09 18:55:09 +05:30
|
|
|
|
console.log(item, 'itemitemitemitemitemitemitemitem');
|
2026-01-27 18:27:29 +05:30
|
|
|
|
let count = item?.ProductDetail?.length;
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
Quantity();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setVarItem(0);
|
|
|
|
|
|
SingleQuantity(item, onePeiceFlow);
|
|
|
|
|
|
}
|
2026-02-09 17:28:22 +05:30
|
|
|
|
|
|
|
|
|
|
closeExpireModal();
|
2026-01-27 18:27:29 +05:30
|
|
|
|
setProdexpir(true);
|
|
|
|
|
|
setQtydata(item);
|
|
|
|
|
|
};
|
|
|
|
|
|
let brandMapping = {};
|
|
|
|
|
|
// Group product details by Brand ID
|
|
|
|
|
|
qtydata?.ProductDetail?.forEach((item) => {
|
|
|
|
|
|
const brandId = item?.BrandName;
|
|
|
|
|
|
if (!brandMapping[brandId]) {
|
|
|
|
|
|
brandMapping[brandId] = [];
|
|
|
|
|
|
}
|
|
|
|
|
|
brandMapping[brandId].push(item);
|
|
|
|
|
|
});
|
|
|
|
|
|
const BrandCheckresult = qtydata?.ProductDetail?.every((product) => {
|
|
|
|
|
|
return product.BrandName === null || product.BrandName === undefined;
|
|
|
|
|
|
});
|
|
|
|
|
|
const ItemSellingPrice = (item) => {
|
|
|
|
|
|
// const variantWithDetails = item?.ProductDetail?.find((variant) => variant?.ProdVariantDetails?.length > 0);
|
|
|
|
|
|
|
|
|
|
|
|
if (preferenceSingleSales && item.OnePcsAvailable === 'Y') {
|
|
|
|
|
|
return (
|
|
|
|
|
|
item?.ProductDetail?.[0]?.ProdVariantDetails?.[0]?.StockDetails?.[0]
|
2026-02-26 12:29:34 +05:30
|
|
|
|
?.OnePcsPrice || 0
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
// OnePcsPrice
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const variantWithDetails = item?.ProductDetail?.find(
|
|
|
|
|
|
(variant) =>
|
|
|
|
|
|
variant?.ProdVariantDetails?.length > 0 &&
|
|
|
|
|
|
variant?.ProdVariantDetails?.[0]?.StockDetails?.[0]?.SellPrice
|
|
|
|
|
|
);
|
|
|
|
|
|
if (variantWithDetails) {
|
|
|
|
|
|
// Access the details of the first variant with ProdVariantDetails
|
|
|
|
|
|
const firstVariantDetails =
|
|
|
|
|
|
variantWithDetails?.ProdVariantDetails?.[0]?.StockDetails?.[0]
|
|
|
|
|
|
?.SellPrice;
|
|
|
|
|
|
return firstVariantDetails;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Handle the case where no variant satisfies the condition
|
2026-02-26 12:29:34 +05:30
|
|
|
|
return 0; // or any other value you want to return
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
};
|
2026-02-25 17:55:44 +05:30
|
|
|
|
const ItemMRP = (item) => {
|
|
|
|
|
|
// const variantWithDetails = item?.ProductDetail?.find((variant) => variant?.ProdVariantDetails?.length > 0);
|
|
|
|
|
|
|
|
|
|
|
|
if (preferenceSingleSales && item.OnePcsAvailable === 'Y') {
|
|
|
|
|
|
return (
|
|
|
|
|
|
item?.ProductDetail?.[0]?.ProdVariantDetails?.[0]?.StockDetails?.[0]
|
2026-02-26 12:29:34 +05:30
|
|
|
|
?.OnePcsPrice || 0
|
2026-02-25 17:55:44 +05:30
|
|
|
|
);
|
|
|
|
|
|
// OnePcsPrice
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-02-25 17:55:44 +05:30
|
|
|
|
const variantWithDetails = item?.ProductDetail?.find(
|
|
|
|
|
|
(variant) =>
|
|
|
|
|
|
variant?.ProdVariantDetails?.length > 0 &&
|
|
|
|
|
|
variant?.ProdVariantDetails?.[0]?.StockDetails?.[0]?.MRP
|
|
|
|
|
|
);
|
|
|
|
|
|
if (variantWithDetails) {
|
|
|
|
|
|
// Access the details of the first variant with ProdVariantDetails
|
|
|
|
|
|
const firstVariantDetails =
|
2026-03-02 16:45:23 +05:30
|
|
|
|
variantWithDetails?.ProdVariantDetails?.[0]?.StockDetails?.[0]?.MRP;
|
2026-02-25 17:55:44 +05:30
|
|
|
|
return firstVariantDetails;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Handle the case where no variant satisfies the condition
|
2026-02-26 12:29:34 +05:30
|
|
|
|
return 0; // or any other value you want to return
|
2026-02-25 17:55:44 +05:30
|
|
|
|
}
|
|
|
|
|
|
};
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const ItemSize = (item) => {
|
|
|
|
|
|
if (preferenceSingleSales && item?.OnePcsAvailable === 'Y') {
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
const variantWithDetails = item?.ProductDetail?.find(
|
|
|
|
|
|
(variant) => variant?.ProdVariantDetails?.length > 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (variantWithDetails) {
|
|
|
|
|
|
// Access the details of the first variant with ProdVariantDetails
|
|
|
|
|
|
const firstVariantDetails = variantWithDetails?.Size;
|
|
|
|
|
|
return firstVariantDetails;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Handle the case where no variant satisfies the condition
|
|
|
|
|
|
return null; // or any other value you want to return
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const ItemUomName = (item) => {
|
|
|
|
|
|
if (preferenceSingleSales && item?.OnePcsAvailable === 'Y') {
|
|
|
|
|
|
return 'PCS';
|
|
|
|
|
|
}
|
|
|
|
|
|
const variantWithDetails = item?.ProductDetail?.find(
|
|
|
|
|
|
(variant) => variant?.ProdVariantDetails?.length > 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (variantWithDetails) {
|
|
|
|
|
|
// Access the details of the first variant with ProdVariantDetails
|
|
|
|
|
|
const firstVariantDetails = variantWithDetails?.UomName;
|
|
|
|
|
|
return firstVariantDetails;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Handle the case where no variant satisfies the condition
|
|
|
|
|
|
return null; // or any other value you want to return
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const expQtyFun = (index) => {
|
|
|
|
|
|
const selectedProIndex = qtydata?.ProductDetail?.findIndex(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.ProdId === index?.ProdId &&
|
|
|
|
|
|
item?.Size === index?.Size &&
|
|
|
|
|
|
item?.UomName === index?.UomName &&
|
|
|
|
|
|
item?.Brand === index?.Brand
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (selectedProIndex !== -1) {
|
|
|
|
|
|
const count =
|
|
|
|
|
|
qtydata?.ProductDetail[selectedProIndex]?.ProdVariantDetails?.length ||
|
|
|
|
|
|
0;
|
|
|
|
|
|
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
setModalVarient(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const item = { QtyIndex: selectedProIndex, VarientIndex: 0 };
|
|
|
|
|
|
singleVarient(item);
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setQtyIndex(selectedProIndex);
|
|
|
|
|
|
setRepeatedModel(true);
|
2026-02-09 18:55:09 +05:30
|
|
|
|
closeExpireModal();
|
2026-01-27 18:27:29 +05:30
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const expVerFun = (item) => {
|
|
|
|
|
|
let count =
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[item]
|
|
|
|
|
|
?.StockDetails?.length;
|
|
|
|
|
|
if (count > 1) {
|
|
|
|
|
|
setRepeatedModel(true);
|
|
|
|
|
|
setModalVarient(false);
|
|
|
|
|
|
setModelstock(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setRepeatedModel(true);
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, item, 0, onePeiceFlow);
|
|
|
|
|
|
setModelQty(false);
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
}
|
2026-02-09 17:28:22 +05:30
|
|
|
|
closeExpireModal();
|
2026-01-27 18:27:29 +05:30
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const expStockFun = (item) => {
|
|
|
|
|
|
dataTransfer(qtydata, QtyIndex, VarientIndex, item, onePeiceFlow);
|
2026-02-09 17:28:22 +05:30
|
|
|
|
closeExpireModal();
|
2026-01-27 18:27:29 +05:30
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const getMaxBrandWidth = () => {
|
|
|
|
|
|
let maxBrandDataLength = 0;
|
|
|
|
|
|
|
|
|
|
|
|
// Iterate through each brand and find the maximum length of the specified key
|
|
|
|
|
|
Object.values(brandMapping).forEach((brand) => {
|
|
|
|
|
|
const keyDataLength = brand.length;
|
|
|
|
|
|
if (keyDataLength > maxBrandDataLength) {
|
|
|
|
|
|
maxBrandDataLength = keyDataLength;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// Set your width logic here based on the maxBrandDataLength
|
|
|
|
|
|
const maxWidth = maxBrandDataLength >= 5 ? 750 : 'max-content';
|
|
|
|
|
|
|
|
|
|
|
|
return maxWidth;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
function handleResize() {
|
|
|
|
|
|
setScreenWidth(window.innerWidth);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
window.addEventListener('resize', handleResize);
|
|
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
|
window.removeEventListener('resize', handleResize);
|
|
|
|
|
|
};
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
// Example usage for checking the length of 'ProdVariantDetails'
|
|
|
|
|
|
const widthBasedOnProdVariantDetails = getMaxBrandWidth();
|
|
|
|
|
|
const ExpDate = useSelector(GlobalExpDateforHeight);
|
|
|
|
|
|
let containerHeight = '';
|
|
|
|
|
|
|
|
|
|
|
|
if (templateData?.BookingLayout?.[0] === 'Layout1') {
|
|
|
|
|
|
if (templateData?.BookingBilling?.[0] == 'Billing1') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing2') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 300}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing3') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 340}px`
|
|
|
|
|
|
: '63vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 350}px`
|
|
|
|
|
|
: '62vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing4') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 300}px`
|
|
|
|
|
|
: '63vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '62vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing5') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 300}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '59vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing6') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 300}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '59vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing7') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 300}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '59vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (templateData?.BookingLayout?.[0] === 'Layout2') {
|
|
|
|
|
|
if (templateData?.BookingBilling?.[0] == 'Billing1') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '74vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing2') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '74vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing3') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '63vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '62vh'
|
|
|
|
|
|
: '74vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing4') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '63vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '62vh'
|
|
|
|
|
|
: '74vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing5') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: '74vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing6') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '59vh'
|
|
|
|
|
|
: '74vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing7') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 310}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '75vh';
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (templateData?.BookingLayout?.[0] === 'Layout3') {
|
|
|
|
|
|
if (templateData?.BookingBilling?.[0] == 'Billing1') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 390}px`
|
|
|
|
|
|
: '58vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 400}px`
|
|
|
|
|
|
: '57vh'
|
|
|
|
|
|
: '73vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing2') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 390}px`
|
|
|
|
|
|
: '57vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 400}px`
|
|
|
|
|
|
: '56vh'
|
|
|
|
|
|
: '73vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing3') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 395}px`
|
|
|
|
|
|
: '57vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 400}px`
|
|
|
|
|
|
: '56vh'
|
|
|
|
|
|
: '73vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing4') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 390}px`
|
|
|
|
|
|
: '57vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 400}px`
|
|
|
|
|
|
: '56vh'
|
|
|
|
|
|
: '75vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing5') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 385}px`
|
|
|
|
|
|
: '57vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 395}px`
|
|
|
|
|
|
: '56vh'
|
|
|
|
|
|
: '72vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing6') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 385}px`
|
|
|
|
|
|
: '57vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 395}px`
|
|
|
|
|
|
: '56vh'
|
|
|
|
|
|
: '72vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing7') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 390}px`
|
|
|
|
|
|
: '57vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 400}px`
|
|
|
|
|
|
: '56vh'
|
|
|
|
|
|
: '72vh';
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (templateData?.BookingLayout?.[0] === 'Layout4') {
|
|
|
|
|
|
if (templateData?.BookingBilling?.[0] == 'Billing1') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '73vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing2') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 220}px`
|
|
|
|
|
|
: '73vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 230}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing3') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '73vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing4') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 230}px`
|
|
|
|
|
|
: '73vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 240}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing5') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 230}px`
|
|
|
|
|
|
: '73vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 240}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing6') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '73vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing7') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '73vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (templateData?.BookingLayout?.[0] === 'Layout5') {
|
|
|
|
|
|
if (templateData?.BookingBilling?.[0] == 'Billing1') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 280}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 290}px`
|
|
|
|
|
|
: '70vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing2') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '70vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing3') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 280}px`
|
|
|
|
|
|
: '70vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing4') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 280}px`
|
|
|
|
|
|
: '70vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing5') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '70vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing6') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '70vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing7') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 270}px`
|
|
|
|
|
|
: '72vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 280}px`
|
|
|
|
|
|
: '70vh'
|
|
|
|
|
|
: '88vh';
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (templateData?.BookingLayout?.[0] === 'Layout6') {
|
|
|
|
|
|
if (templateData?.BookingBilling?.[0] == 'Billing1') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 340}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing2') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 260}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 370}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing3') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing4') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing5') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 290}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 300}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing6') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 320}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 330}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
} else if (templateData?.BookingBilling?.[0] == 'Billing7') {
|
|
|
|
|
|
containerHeight = isMobile
|
|
|
|
|
|
? ExpDate >= 7
|
|
|
|
|
|
? screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 280}px`
|
|
|
|
|
|
: '61vh'
|
|
|
|
|
|
: screenWidth < 600
|
|
|
|
|
|
? `${props?.screenHeight - 290}px`
|
|
|
|
|
|
: '60vh'
|
|
|
|
|
|
: '76vh';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//new
|
|
|
|
|
|
const [draggableCardData, setDraggableCardData] = useState([]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (Array.isArray(cardData)) {
|
|
|
|
|
|
const withIds = cardData.map((item, idx) => ({
|
|
|
|
|
|
...item,
|
|
|
|
|
|
id: item?.ProductDetail?.[0]?.ProdName + '-' + idx,
|
|
|
|
|
|
}));
|
|
|
|
|
|
// const newData = alphabeticFormat
|
|
|
|
|
|
// ? [...withIds].sort((a, b) => {
|
|
|
|
|
|
// const nameA = a?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// const nameB = b?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// return nameA.localeCompare(nameB);
|
|
|
|
|
|
// })
|
|
|
|
|
|
// : [...withIds].sort((a, b) => {
|
|
|
|
|
|
// const nameA = a?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// const nameB = b?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// return nameB.localeCompare(nameA);
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
setDraggableCardData(withIds);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [cardData, alphabeticFormat]);
|
|
|
|
|
|
|
|
|
|
|
|
const sensors = useSensors(
|
|
|
|
|
|
useSensor(PointerSensor, {
|
|
|
|
|
|
activationConstraint: {
|
|
|
|
|
|
distance: isMobile ? 5 : 8, // <- reduced distance for mobile
|
|
|
|
|
|
},
|
|
|
|
|
|
}),
|
|
|
|
|
|
useSensor(TouchSensor, {
|
|
|
|
|
|
activationConstraint: {
|
|
|
|
|
|
delay: isMobile ? 50 : 100, // <- even faster response for mobile
|
|
|
|
|
|
tolerance: isMobile ? 10 : 8, // <- more tolerance for mobile touch
|
|
|
|
|
|
},
|
|
|
|
|
|
})
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const handleDragEnd = (event) => {
|
|
|
|
|
|
const { active, over } = event;
|
|
|
|
|
|
|
|
|
|
|
|
// Ensure `over` is not null
|
|
|
|
|
|
if (!over) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (active.id !== over.id) {
|
|
|
|
|
|
const oldIndex = draggableCardData.findIndex((i) => i.id === active.id);
|
|
|
|
|
|
const newIndex = draggableCardData.findIndex((i) => i.id === over.id);
|
|
|
|
|
|
|
|
|
|
|
|
const updatedData = arrayMove(draggableCardData, oldIndex, newIndex);
|
|
|
|
|
|
|
|
|
|
|
|
// const newData = alphabeticFormat
|
|
|
|
|
|
// ? [...updatedData].sort((a, b) => {
|
|
|
|
|
|
// const nameA = a?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// const nameB = b?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// return nameA.localeCompare(nameB);
|
|
|
|
|
|
// })
|
|
|
|
|
|
// : [...updatedData].sort((a, b) => {
|
|
|
|
|
|
// const nameA = a?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// const nameB = b?.ProductDetail?.[0]?.ProdName || "";
|
|
|
|
|
|
// return nameB.localeCompare(nameA);
|
|
|
|
|
|
// });
|
|
|
|
|
|
setDraggableCardData(updatedData);
|
|
|
|
|
|
|
|
|
|
|
|
dispatch(changeCardData(updatedData));
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const updateScrollButtons = () => {
|
|
|
|
|
|
const container = scrollContainerRef.current;
|
|
|
|
|
|
if (!container) return;
|
|
|
|
|
|
|
|
|
|
|
|
const { scrollLeft, scrollWidth, clientWidth } = container;
|
|
|
|
|
|
|
|
|
|
|
|
console.log(
|
|
|
|
|
|
container,
|
|
|
|
|
|
'sl:',
|
|
|
|
|
|
scrollLeft,
|
|
|
|
|
|
'w:',
|
|
|
|
|
|
scrollWidth,
|
|
|
|
|
|
'cw:',
|
|
|
|
|
|
clientWidth
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
setShowLeftButton(scrollLeft > 5);
|
|
|
|
|
|
setShowRightButton(scrollLeft + clientWidth < scrollWidth - 5);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
const container = scrollContainerRef.current;
|
|
|
|
|
|
if (!container) return;
|
|
|
|
|
|
|
|
|
|
|
|
// ✅ Call once after layout
|
|
|
|
|
|
requestAnimationFrame(() => {
|
|
|
|
|
|
updateScrollButtons();
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
container.addEventListener('scroll', updateScrollButtons);
|
|
|
|
|
|
window.addEventListener('resize', updateScrollButtons);
|
|
|
|
|
|
|
|
|
|
|
|
const resizeObserver = new ResizeObserver(updateScrollButtons);
|
|
|
|
|
|
resizeObserver.observe(container);
|
|
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
|
container.removeEventListener('scroll', updateScrollButtons);
|
|
|
|
|
|
window.removeEventListener('resize', updateScrollButtons);
|
|
|
|
|
|
resizeObserver.disconnect();
|
|
|
|
|
|
};
|
|
|
|
|
|
}, [modelstock, ModalVarient, modelQty]);
|
|
|
|
|
|
|
|
|
|
|
|
const handleScrollClickLeft = (scrollOffset) => {
|
|
|
|
|
|
scrollContainerRef.current.scrollBy({
|
|
|
|
|
|
left: -scrollOffset,
|
|
|
|
|
|
behavior: 'smooth',
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleScrollClickRight = (scrollOffset) => {
|
|
|
|
|
|
scrollContainerRef.current.scrollBy({
|
|
|
|
|
|
left: scrollOffset,
|
|
|
|
|
|
behavior: 'smooth',
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
// const isDragging = useRef(false);
|
|
|
|
|
|
|
|
|
|
|
|
// MOUSE EVENTS
|
|
|
|
|
|
const handleMouseDown = (e) => {
|
|
|
|
|
|
isDragging.current = true;
|
|
|
|
|
|
startX.current = e.pageX - scrollContainerRef.current.offsetLeft;
|
|
|
|
|
|
scrollLeft.current = scrollContainerRef.current.scrollLeft;
|
|
|
|
|
|
scrollContainerRef.current.style.cursor = 'grabbing';
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleMouseMove = (e) => {
|
|
|
|
|
|
if (!isDragging.current) return;
|
|
|
|
|
|
e.preventDefault(); // Important: prevents text selection and smooth scroll interference
|
|
|
|
|
|
const x = e.pageX - scrollContainerRef.current.offsetLeft;
|
|
|
|
|
|
const walk = (x - startX.current) * 0.8; // Adjust multiplier for speed
|
|
|
|
|
|
scrollContainerRef.current.scrollLeft = scrollLeft.current - walk;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleMouseUp = () => {
|
|
|
|
|
|
isDragging.current = false;
|
|
|
|
|
|
scrollContainerRef.current.style.cursor = 'grab';
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// TOUCH EVENTS
|
|
|
|
|
|
const handleTouchStart = (e) => {
|
|
|
|
|
|
isDragging.current = true;
|
|
|
|
|
|
startX.current = e.touches[0].pageX - scrollContainerRef.current.offsetLeft;
|
|
|
|
|
|
scrollLeft.current = scrollContainerRef.current.scrollLeft;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleTouchMove = (e) => {
|
|
|
|
|
|
if (!isDragging.current) return;
|
|
|
|
|
|
e.preventDefault(); // Prevents native scrolling
|
|
|
|
|
|
const x = e.touches[0].pageX - scrollContainerRef.current.offsetLeft;
|
|
|
|
|
|
const walk = (x - startX.current) * 0.8; // Adjust multiplier as needed
|
|
|
|
|
|
scrollContainerRef.current.scrollLeft = scrollLeft.current - walk;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleTouchEnd = () => {
|
|
|
|
|
|
isDragging.current = false;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const allProducts = Object.values(brandMapping).flat();
|
|
|
|
|
|
|
|
|
|
|
|
const brandGroups = {};
|
|
|
|
|
|
allProducts.forEach((product) => {
|
|
|
|
|
|
const brandName =
|
|
|
|
|
|
product.BrandName &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
product.BrandName !== 'null' &&
|
|
|
|
|
|
product.BrandName !== 'undefined' &&
|
|
|
|
|
|
product.BrandName.trim() !== ''
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? product.BrandName
|
|
|
|
|
|
: 'Others';
|
|
|
|
|
|
|
|
|
|
|
|
if (!brandGroups[brandName]) {
|
|
|
|
|
|
brandGroups[brandName] = [];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
brandGroups[brandName].push(product);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
const brandKeys = Object.keys(brandGroups || {});
|
|
|
|
|
|
if (brandKeys.length === 0) return;
|
|
|
|
|
|
// Only set if selectedBrand is not present in the new brandGroups
|
|
|
|
|
|
if (!brandKeys.includes(selectedBrand)) {
|
|
|
|
|
|
if (brandKeys.includes('Others')) {
|
|
|
|
|
|
setSelectedBrand('Others');
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setSelectedBrand(brandKeys[0]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [brandGroups]);
|
|
|
|
|
|
|
|
|
|
|
|
const sortedBrandNames = Object.keys(brandGroups).sort((a, b) =>
|
|
|
|
|
|
a === 'Others' ? -1 : b === 'Others' ? 1 : 0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const [prodname, setprodname] = useState('');
|
|
|
|
|
|
const [prodQty, setprodQty] = useState(0);
|
|
|
|
|
|
const normalize = (str) => str?.toLowerCase()?.replace(/\s+/g, ' ')?.trim();
|
|
|
|
|
|
|
|
|
|
|
|
const result = prodname
|
|
|
|
|
|
? (cardData || [])?.filter(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
(item) =>
|
|
|
|
|
|
normalize(item.ProdName).includes(normalize(prodname)) ||
|
|
|
|
|
|
normalize(item.ProdCatName).includes(normalize(prodname)) ||
|
|
|
|
|
|
item.ProductDetail?.some((detail) =>
|
|
|
|
|
|
normalize(detail.ProdName).includes(normalize(prodname))
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardData;
|
|
|
|
|
|
|
|
|
|
|
|
console.log(prodQty, 'cardDatacardData', result, prodname);
|
|
|
|
|
|
const AddnewProduct = () => {
|
|
|
|
|
|
setNewMoreProductModel(true);
|
|
|
|
|
|
};
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
const item = result?.[0];
|
|
|
|
|
|
const detail = item?.ProductDetail?.[0];
|
|
|
|
|
|
|
|
|
|
|
|
const isInStock =
|
|
|
|
|
|
detail?.StockAvailable === 'Y' && item?.OverAllQty > prodQty;
|
|
|
|
|
|
const isStockNotTracked = detail?.StockAvailable === 'N';
|
|
|
|
|
|
|
|
|
|
|
|
if (result?.length > 0 && prodname && (isInStock || isStockNotTracked)) {
|
|
|
|
|
|
// CardOnclick(item,(item?.OnePcsAvailable && preferenceSingleSales) && 'OnePeiceProduct' );
|
|
|
|
|
|
CardOnclick(
|
|
|
|
|
|
result?.[0],
|
|
|
|
|
|
result?.[0]?.OnePcsAvailable === 'Y' &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
preferenceSingleSales &&
|
|
|
|
|
|
'OnePeiceProduct'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
// AddOrderDetails2(result?.[0])
|
|
|
|
|
|
} else if (item?.OverAllQty < prodQty) {
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
setMessageData('NoStack');
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [prodname]);
|
|
|
|
|
|
function getClassNameBasedOnCard(type) {
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
|
case 'Card1':
|
|
|
|
|
|
return 'AddNewProductSalesBTNCard1';
|
|
|
|
|
|
case 'Card2':
|
|
|
|
|
|
return 'AddNewProductSalesBTNCard2';
|
|
|
|
|
|
case 'Card3':
|
|
|
|
|
|
return 'AddNewProductSalesBTNCard3';
|
|
|
|
|
|
case 'Card4':
|
|
|
|
|
|
return 'AddNewProductSalesBTNCard4';
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
return 'AddNewProductSalesBTNCard1';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function encrypt(code, key) {
|
|
|
|
|
|
// Implement encryption logic using a secure algorithm
|
|
|
|
|
|
// For demonstration purposes, this is a simple XOR encryption
|
|
|
|
|
|
let encrypted = (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="bs-item-card-masterdiv"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
flexDirection: 'column',
|
|
|
|
|
|
overflowY: 'scroll',
|
|
|
|
|
|
height: '80vh',
|
|
|
|
|
|
paddingBottom: '6rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
ref={itemListScrollRef}
|
|
|
|
|
|
>
|
|
|
|
|
|
{messageType && messageData && (
|
|
|
|
|
|
<Messages
|
|
|
|
|
|
messageType={messageType}
|
|
|
|
|
|
messageData={messageData}
|
|
|
|
|
|
onComplete={onComplete}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="voiceToTextIcon"
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
// trigger child function
|
|
|
|
|
|
voiceTriggerRef?.current?.listening();
|
|
|
|
|
|
}}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
zIndex: '12',
|
|
|
|
|
|
top:
|
2026-03-02 16:45:23 +05:30
|
|
|
|
templateData?.BookingNavbar?.[0] === 'Navbar3' &&
|
2026-03-03 19:32:53 +05:30
|
|
|
|
templateData?.BookingLayout?.[0] === 'Layout3'
|
|
|
|
|
|
? '1rem'
|
|
|
|
|
|
: templateData?.BookingNavbar?.[0] === 'Navbar3' &&
|
|
|
|
|
|
['Layout1', 'Layout2'].includes(
|
|
|
|
|
|
templateData?.BookingLayout?.[0]
|
|
|
|
|
|
)
|
|
|
|
|
|
? '13px'
|
|
|
|
|
|
: templateData?.BookingNavbar?.[0] === 'Navbar3' &&
|
|
|
|
|
|
['Layout4', 'Layout5', 'Layout6'].includes(
|
|
|
|
|
|
templateData?.BookingLayout?.[0]
|
|
|
|
|
|
)
|
|
|
|
|
|
? '4.4rem'
|
|
|
|
|
|
: ['Layout4', 'Layout5', 'Layout6'].includes(
|
|
|
|
|
|
templateData?.BookingLayout?.[0]
|
|
|
|
|
|
)
|
|
|
|
|
|
? '2.8rem'
|
|
|
|
|
|
: templateData?.BookingNavbar?.[0] === 'Navbar3'
|
|
|
|
|
|
? '3rem'
|
|
|
|
|
|
: '',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<VoiceToTextItemCard
|
|
|
|
|
|
ref={voiceTriggerRef}
|
|
|
|
|
|
setVoiceData={(data) => {
|
|
|
|
|
|
setprodname(data.product);
|
|
|
|
|
|
setprodQty(data.qty);
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{/* <p>{prodname}</p> */}
|
|
|
|
|
|
<div style={{ display: 'flex', justifyContent: 'flex-start' }}>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="BSItemCard-master-container"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
rowGap: cardFunction?.BigImage ? '15px' : '15px',
|
|
|
|
|
|
pointerEvents: OrderType === 'Failed' ? 'none' : 'auto',
|
|
|
|
|
|
overflow: 'auto',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{/* <div className="BSItemCard-master-container" > */}
|
|
|
|
|
|
{cardData?.length > 0 ? (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<DndContext
|
|
|
|
|
|
sensors={sensors}
|
|
|
|
|
|
collisionDetection={closestCenter}
|
|
|
|
|
|
onDragEnd={handleDragEnd}
|
|
|
|
|
|
>
|
|
|
|
|
|
<SortableContext
|
|
|
|
|
|
items={draggableCardData.map((item) => item.id)}
|
|
|
|
|
|
strategy={rectSortingStrategy}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
gap: '5px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
templateData?.BookingCard?.[0] != 'Card4'
|
|
|
|
|
|
? ''
|
|
|
|
|
|
: 'CategoryHorizontalNewcontainer'
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{AddProductCard && !favouriteCat && ProdCat && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className={getClassNameBasedOnCard(
|
|
|
|
|
|
templateData?.BookingCard?.[0]
|
|
|
|
|
|
)}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
cardFunction?.Background &&
|
|
|
|
|
|
(SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.['BackgroundColor']
|
|
|
|
|
|
: ''),
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={AddnewProduct}
|
|
|
|
|
|
>
|
|
|
|
|
|
<MdOutlineAddShoppingCart size={25} />
|
|
|
|
|
|
Add Product
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{draggableCardData.map((item) => (
|
|
|
|
|
|
<SortableCard
|
|
|
|
|
|
key={item.id || index}
|
|
|
|
|
|
id={item.id || index}
|
|
|
|
|
|
item={item}
|
|
|
|
|
|
>
|
|
|
|
|
|
{templateData?.BookingCard?.[0] != 'Card4' ? (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'relative',
|
2026-02-12 18:15:06 +05:30
|
|
|
|
overflow: 'hidden',
|
2026-02-23 09:39:46 +05:30
|
|
|
|
scrollbarWidth: 'none',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item?.OverAllPcs
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) => item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? 'BkPrdCardActive'
|
|
|
|
|
|
: 'BkPrdCardDeActive'
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{!isMobile ? (
|
|
|
|
|
|
<Tooltip title={item.ProdName}>
|
|
|
|
|
|
{globaldata && (
|
|
|
|
|
|
<input
|
|
|
|
|
|
type="checkbox"
|
|
|
|
|
|
value={item.ProductDetail?.[0]?.ProdId}
|
|
|
|
|
|
name={item.ProdName}
|
|
|
|
|
|
onChange={(e) => pickData(e, item)}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
zIndex: 1,
|
|
|
|
|
|
transform: 'scale(1.5)',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
}}
|
|
|
|
|
|
checked={(
|
|
|
|
|
|
globalAllItemdata || EditfavItems
|
|
|
|
|
|
)?.some(
|
|
|
|
|
|
// (a) => a?.ProdName === item?.ProdName
|
|
|
|
|
|
(a) =>
|
|
|
|
|
|
a?.ProdName === item?.ProdName &&
|
|
|
|
|
|
a?.ProdCat === item?.ProdCat
|
|
|
|
|
|
)}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
cardFunction?.SmallImage &&
|
|
|
|
|
|
cardFunction?.Background &&
|
|
|
|
|
|
(SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'BackgroundColor'
|
|
|
|
|
|
]
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: ''),
|
|
|
|
|
|
padding:
|
|
|
|
|
|
!cardFunction?.ImageUp &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!cardFunction?.ImageDown
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.SmallImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'5px 9px'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '8px 2px',
|
|
|
|
|
|
flexDirection:
|
|
|
|
|
|
cardFunction?.ImageRight &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'row-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.ImageRight &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'row-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.ImageUp && 'column'
|
|
|
|
|
|
? cardFunction?.ImageUp &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'column'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.ImageDown &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'column-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.ImageDown &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'column-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.ImageLeft &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'row',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
borderRadius:
|
|
|
|
|
|
cardFunction?.EdgeCurve && '6px',
|
|
|
|
|
|
width:
|
|
|
|
|
|
!cardFunction?.ImageUp &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!cardFunction?.ImageDown &&
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.ImageRight &&
|
|
|
|
|
|
cardFunction?.SmallImage &&
|
|
|
|
|
|
(cardFunction?.ImageUp ||
|
|
|
|
|
|
cardFunction?.ImageDown)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? '6rem'
|
|
|
|
|
|
: cardFunction?.BigImage && '9rem',
|
|
|
|
|
|
height:
|
|
|
|
|
|
!cardFunction?.ImageUp &&
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
'',
|
|
|
|
|
|
pointerEvents: globaldata && 'none',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.SmallImage
|
|
|
|
|
|
? 'BSItemCard-container-smallimage'
|
|
|
|
|
|
: 'BSItemCard-container'
|
|
|
|
|
|
}
|
|
|
|
|
|
// onMouseDown={(e) =>
|
|
|
|
|
|
// handleMouseDownItemCard(e, item)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onMouseUp={(e) =>
|
|
|
|
|
|
// handleMouseUpItemCard(e, item)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onMouseLeave={handleMouseLeave}
|
|
|
|
|
|
// onTouchStart={(e) =>
|
|
|
|
|
|
// handleTouchStartItemCard(e, item)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onTouchEnd={(e) =>
|
|
|
|
|
|
// handleTouchEndItemCard(e, item)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onTouchCancel={handleTouchCancelItemCard}
|
|
|
|
|
|
// onContextMenu={(e) => e.preventDefault()}
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
!(
|
|
|
|
|
|
(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
2026-01-27 18:27:29 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
CardOnclick(
|
|
|
|
|
|
item,
|
|
|
|
|
|
item?.OnePcsAvailable === 'Y' &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
preferenceSingleSales &&
|
|
|
|
|
|
'OnePeiceProduct'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
data-aos="zoom-in"
|
|
|
|
|
|
data-aos-duration="600"
|
|
|
|
|
|
>
|
|
|
|
|
|
{(cardFunction?.BigImage ||
|
|
|
|
|
|
cardFunction?.SmallImage) && (
|
2026-03-03 19:39:44 +05:30
|
|
|
|
<img
|
|
|
|
|
|
style={{
|
|
|
|
|
|
objectFit:
|
|
|
|
|
|
cardFunction?.BigImage && '',
|
|
|
|
|
|
height: !cardFunction?.BigImage
|
|
|
|
|
|
? (!cardFunction?.BigImage &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cardFunction?.SmallImage) ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
cardFunction?.ImageLeft ||
|
|
|
|
|
|
cardFunction?.ImageUp ||
|
|
|
|
|
|
cardFunction?.ImageDown
|
|
|
|
|
|
? '3rem'
|
|
|
|
|
|
: cardFunction?.BigImage &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
'7rem'
|
2026-03-03 19:39:44 +05:30
|
|
|
|
: '5rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.SmallImage
|
|
|
|
|
|
? 'BSItemCard-image-smallimage'
|
|
|
|
|
|
: 'BSItemCard-image'
|
|
|
|
|
|
}
|
|
|
|
|
|
src={
|
|
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdLogo === ''
|
|
|
|
|
|
? defaultimage
|
|
|
|
|
|
: item?.ProductDetail?.[0]
|
2026-03-03 19:32:53 +05:30
|
|
|
|
?.ProdLogo
|
2026-03-03 19:39:44 +05:30
|
|
|
|
? item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdLogo
|
|
|
|
|
|
: defaultimage
|
|
|
|
|
|
}
|
|
|
|
|
|
alt=""
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
<div
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.SmallImage
|
|
|
|
|
|
? 'BSItemCard-content-smallimage'
|
|
|
|
|
|
: 'BSItemCard-content'
|
|
|
|
|
|
}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
cardFunction?.Background &&
|
|
|
|
|
|
(SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'BackgroundColor'
|
|
|
|
|
|
]
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: ''),
|
|
|
|
|
|
|
|
|
|
|
|
position: !cardFunction?.BigImage
|
|
|
|
|
|
? 'relative'
|
|
|
|
|
|
: 'absolute',
|
|
|
|
|
|
flexDirection:
|
|
|
|
|
|
!cardFunction?.BigImage && 'column',
|
|
|
|
|
|
borderRadius:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
cardFunction?.EdgeCurve &&
|
|
|
|
|
|
'6px',
|
|
|
|
|
|
bottom: cardFunction?.BigImage && '',
|
|
|
|
|
|
cardFunction,
|
|
|
|
|
|
width:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'',
|
|
|
|
|
|
height: cardFunction?.SmallImage
|
|
|
|
|
|
? '5.5rem'
|
|
|
|
|
|
: !cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'5.5rem',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
alignItems:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'center',
|
|
|
|
|
|
textAlign:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'center',
|
|
|
|
|
|
flexWrap:
|
|
|
|
|
|
cardFunction?.BigImage && 'wrap',
|
|
|
|
|
|
// flexDirection:
|
|
|
|
|
|
// cardFunction?.SmallImage ||
|
|
|
|
|
|
// (cardFunction?.BigImage && "column"),
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<p
|
|
|
|
|
|
style={{
|
|
|
|
|
|
textTransform:
|
|
|
|
|
|
cardFunction?.TextCapitalize &&
|
|
|
|
|
|
'uppercase',
|
|
|
|
|
|
width: !cardFunction?.SmallImage
|
|
|
|
|
|
? cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'120px'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.SmallImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!cardFunction?.ImageUp &&
|
|
|
|
|
|
!cardFunction?.ImageDown &&
|
|
|
|
|
|
'85px',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// Width: cardFunction?.BigImage && "70px",
|
|
|
|
|
|
fontSize:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'12px', //naresh27
|
|
|
|
|
|
whiteSpace:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
'pre-wrap',
|
|
|
|
|
|
margin: 'auto',
|
|
|
|
|
|
fontFamily: SelectedCardFont
|
|
|
|
|
|
? SelectedCardFont
|
|
|
|
|
|
: '',
|
|
|
|
|
|
color: SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.['FontColor']
|
|
|
|
|
|
: '',
|
|
|
|
|
|
textOverflow: 'ellipsis',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className="BSItemCard-itemName"
|
|
|
|
|
|
>
|
|
|
|
|
|
{item?.ProdName}{' '}
|
|
|
|
|
|
{(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
) ? (
|
2026-01-27 18:27:29 +05:30
|
|
|
|
''
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<p
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: 'red',
|
|
|
|
|
|
marginTop: '5px',
|
|
|
|
|
|
fontSize: '15px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
No Stock
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</p>
|
2026-02-25 17:55:44 +05:30
|
|
|
|
{cardFunction?.MRP &&
|
|
|
|
|
|
((item?.OverAllQty !== undefined &&
|
|
|
|
|
|
(!preferenceSingleSales
|
|
|
|
|
|
? item?.OverAllQty !== 0
|
|
|
|
|
|
: item?.OverAllPcs !== 0) &&
|
|
|
|
|
|
item?.OverAllQty !== null) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)) && (
|
|
|
|
|
|
<p
|
2026-02-26 15:06:15 +05:30
|
|
|
|
className="BSItemCard-itemMRP"
|
2026-02-25 17:55:44 +05:30
|
|
|
|
style={{
|
|
|
|
|
|
fontSize:
|
|
|
|
|
|
!cardFunction?.SmallImage
|
|
|
|
|
|
? cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'12px'
|
2026-02-25 17:55:44 +05:30
|
|
|
|
: '12px',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
lineHeight: '2',
|
|
|
|
|
|
fontFamily: SelectedCardFont
|
|
|
|
|
|
? SelectedCardFont
|
|
|
|
|
|
: '',
|
|
|
|
|
|
color: SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'FontColor'
|
|
|
|
|
|
]
|
2026-02-25 17:55:44 +05:30
|
|
|
|
: '',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
2026-03-02 16:45:23 +05:30
|
|
|
|
{ItemMRP(item) > 0
|
|
|
|
|
|
? `MRP: ₹ ${ItemMRP(item)}`
|
|
|
|
|
|
: ''}
|
2026-02-25 17:55:44 +05:30
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
{cardFunction?.Price &&
|
|
|
|
|
|
((item?.OverAllQty !== undefined &&
|
|
|
|
|
|
(!preferenceSingleSales
|
|
|
|
|
|
? item?.OverAllQty !== 0
|
|
|
|
|
|
: item?.OverAllPcs !== 0) &&
|
|
|
|
|
|
item?.OverAllQty !== null) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)) && (
|
|
|
|
|
|
<p
|
|
|
|
|
|
className="BSItemCard-itemPrice"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize:
|
|
|
|
|
|
!cardFunction?.SmallImage
|
|
|
|
|
|
? cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'12px'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '12px',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
lineHeight: '2',
|
|
|
|
|
|
fontFamily: SelectedCardFont
|
|
|
|
|
|
? SelectedCardFont
|
|
|
|
|
|
: '',
|
|
|
|
|
|
color: SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'FontColor'
|
|
|
|
|
|
]
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
₹ {ItemSellingPrice(item)}
|
|
|
|
|
|
<span
|
|
|
|
|
|
className="BSItemCard-itemCount"
|
|
|
|
|
|
style={{ fontSize: '10px' }}
|
|
|
|
|
|
>
|
|
|
|
|
|
<>
|
|
|
|
|
|
({ItemSize(item)}{' '}
|
|
|
|
|
|
{ItemUomName(item)})
|
|
|
|
|
|
</>
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{cardFunction?.StockCount &&
|
|
|
|
|
|
item?.OverAllQty !== undefined &&
|
|
|
|
|
|
(!preferenceSingleSales
|
|
|
|
|
|
? item?.OverAllQty !== 0
|
|
|
|
|
|
: item?.OverAllPcs !== 0) && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
top:
|
|
|
|
|
|
!cardFunction?.BigImage && '0',
|
|
|
|
|
|
right:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'0px',
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.BigImage
|
|
|
|
|
|
? 'BSItemCard-badge'
|
|
|
|
|
|
: 'BSItemCard-badge-withoutimage'
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable === 'Y'
|
|
|
|
|
|
) &&
|
|
|
|
|
|
item?.OverAllQty !== null && (
|
|
|
|
|
|
<Badge
|
|
|
|
|
|
count={
|
|
|
|
|
|
!preferenceSingleSales
|
|
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item
|
|
|
|
|
|
?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item
|
|
|
|
|
|
?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
overflowCount={10000}
|
|
|
|
|
|
></Badge>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{item?.ProductDetail?.filter(
|
|
|
|
|
|
(item) => item.OnePcsAvailable == 'Y'
|
|
|
|
|
|
).length !== 0 &&
|
|
|
|
|
|
!preferenceSingleSales && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="onepieceMain"
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
!(
|
|
|
|
|
|
(item?.OverAllQty !==
|
|
|
|
|
|
undefined &&
|
|
|
|
|
|
returnOnepcCount(
|
|
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
CardOnclick(
|
|
|
|
|
|
item,
|
|
|
|
|
|
'OnePeiceProduct'
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontFamily: SelectedCardFont || '',
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
SelectedCardColor?.FontColor ||
|
|
|
|
|
|
'#ffffff',
|
|
|
|
|
|
color:
|
|
|
|
|
|
returnOnepcCount(
|
|
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0 ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(product) =>
|
|
|
|
|
|
product?.StockAvailable !==
|
|
|
|
|
|
'Y'
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.Background
|
|
|
|
|
|
? SelectedCardColor?.BackgroundColor ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'#000000'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '#fff'
|
|
|
|
|
|
: '#ff4d4f',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{SingleMember ? 'Single' : '1 PCS'}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<>
|
|
|
|
|
|
{globaldata && (
|
|
|
|
|
|
<input
|
|
|
|
|
|
type="checkbox"
|
|
|
|
|
|
value={item.ProductDetail?.[0]?.ProdId}
|
|
|
|
|
|
name={item.ProdName}
|
|
|
|
|
|
onChange={(e) => pickData(e, item)}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
zIndex: 1,
|
|
|
|
|
|
transform: 'scale(1.5)',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
}}
|
|
|
|
|
|
checked={(
|
|
|
|
|
|
globalAllItemdata || EditfavItems
|
|
|
|
|
|
)?.some(
|
|
|
|
|
|
// (a) => a?.ProdName === item?.ProdName
|
|
|
|
|
|
(a) =>
|
|
|
|
|
|
a?.ProdName === item?.ProdName &&
|
|
|
|
|
|
a?.ProdCat === item?.ProdCat
|
|
|
|
|
|
)}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
cardFunction?.SmallImage &&
|
|
|
|
|
|
cardFunction?.Background &&
|
|
|
|
|
|
(SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'BackgroundColor'
|
|
|
|
|
|
]
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: ''),
|
|
|
|
|
|
padding:
|
|
|
|
|
|
!cardFunction?.ImageUp &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!cardFunction?.ImageDown
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.SmallImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'5px 9px'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '8px 2px',
|
|
|
|
|
|
flexDirection:
|
|
|
|
|
|
cardFunction?.ImageRight &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'row-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.ImageRight &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'row-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.ImageUp && 'column'
|
|
|
|
|
|
? cardFunction?.ImageUp &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'column'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.ImageDown &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'column-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.ImageDown &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'column-reverse'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.ImageLeft &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'row',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
borderRadius:
|
|
|
|
|
|
cardFunction?.EdgeCurve && '6px',
|
|
|
|
|
|
width:
|
|
|
|
|
|
!cardFunction?.ImageUp &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!cardFunction?.ImageDown &&
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.ImageRight &&
|
|
|
|
|
|
cardFunction?.SmallImage &&
|
|
|
|
|
|
(cardFunction?.ImageUp ||
|
|
|
|
|
|
cardFunction?.ImageDown)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? '6rem'
|
|
|
|
|
|
: cardFunction?.BigImage && '9rem',
|
|
|
|
|
|
height:
|
|
|
|
|
|
!cardFunction?.ImageUp &&
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
'',
|
|
|
|
|
|
pointerEvents: globaldata && 'none',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.SmallImage
|
|
|
|
|
|
? 'BSItemCard-containers-smallimage-mobile'
|
|
|
|
|
|
: 'BSItemCard-containers-mobile'
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
!(
|
|
|
|
|
|
(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
2026-01-27 18:27:29 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
CardOnclick(
|
|
|
|
|
|
item,
|
|
|
|
|
|
item?.OnePcsAvailable === 'Y' &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
preferenceSingleSales &&
|
|
|
|
|
|
'OnePeiceProduct'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
2026-03-03 19:39:44 +05:30
|
|
|
|
// data-aos="zoom-in" data-aos-duration="600"
|
2026-01-27 18:27:29 +05:30
|
|
|
|
>
|
|
|
|
|
|
{(cardFunction?.BigImage ||
|
|
|
|
|
|
cardFunction?.SmallImage) && (
|
2026-03-03 19:39:44 +05:30
|
|
|
|
<img
|
|
|
|
|
|
style={{
|
|
|
|
|
|
objectFit:
|
|
|
|
|
|
cardFunction?.BigImage && '',
|
|
|
|
|
|
height: !cardFunction?.BigImage
|
|
|
|
|
|
? (!cardFunction?.BigImage &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
cardFunction?.SmallImage) ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
cardFunction?.ImageLeft ||
|
|
|
|
|
|
cardFunction?.ImageUp ||
|
|
|
|
|
|
cardFunction?.ImageDown
|
|
|
|
|
|
? '3rem'
|
|
|
|
|
|
: cardFunction?.BigImage &&
|
2026-01-27 18:27:29 +05:30
|
|
|
|
'7rem'
|
2026-03-03 19:39:44 +05:30
|
|
|
|
: '4rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.SmallImage
|
|
|
|
|
|
? 'BSItemCard-image-smallimage'
|
|
|
|
|
|
: 'BSItemCard-image'
|
|
|
|
|
|
}
|
|
|
|
|
|
src={
|
|
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdLogo === ''
|
|
|
|
|
|
? defaultimage
|
|
|
|
|
|
: item?.ProductDetail?.[0]
|
2026-03-03 19:32:53 +05:30
|
|
|
|
?.ProdLogo
|
2026-03-03 19:39:44 +05:30
|
|
|
|
? item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdLogo
|
|
|
|
|
|
: defaultimage
|
|
|
|
|
|
}
|
|
|
|
|
|
alt=""
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
<div
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.SmallImage
|
|
|
|
|
|
? 'BSItemCard-content-smallimage'
|
|
|
|
|
|
: 'BSItemCard-content'
|
|
|
|
|
|
}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
cardFunction?.Background &&
|
|
|
|
|
|
(SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'BackgroundColor'
|
|
|
|
|
|
]
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: ''),
|
|
|
|
|
|
|
|
|
|
|
|
position: !cardFunction?.BigImage
|
|
|
|
|
|
? 'relative'
|
|
|
|
|
|
: 'absolute',
|
|
|
|
|
|
flexDirection:
|
|
|
|
|
|
!cardFunction?.BigImage && 'column',
|
|
|
|
|
|
borderRadius:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
cardFunction?.EdgeCurve &&
|
|
|
|
|
|
'6px',
|
|
|
|
|
|
bottom: cardFunction?.BigImage && '',
|
|
|
|
|
|
cardFunction,
|
|
|
|
|
|
width:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'',
|
|
|
|
|
|
height: cardFunction?.SmallImage
|
|
|
|
|
|
? '5.5rem'
|
|
|
|
|
|
: !cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'4.5rem',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
alignItems:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'center',
|
|
|
|
|
|
textAlign:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'center',
|
|
|
|
|
|
flexWrap:
|
|
|
|
|
|
cardFunction?.BigImage && 'wrap',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<p
|
|
|
|
|
|
style={{
|
|
|
|
|
|
textTransform:
|
|
|
|
|
|
cardFunction?.TextCapitalize &&
|
|
|
|
|
|
'uppercase',
|
|
|
|
|
|
width: !cardFunction?.SmallImage
|
|
|
|
|
|
? cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'120px'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: cardFunction?.SmallImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!cardFunction?.ImageUp &&
|
|
|
|
|
|
!cardFunction?.ImageDown &&
|
|
|
|
|
|
'85px',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
// Width: cardFunction?.BigImage && "70px",
|
|
|
|
|
|
fontSize:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'12px', //naresh27
|
|
|
|
|
|
whiteSpace:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
'pre-wrap',
|
|
|
|
|
|
margin: 'auto',
|
|
|
|
|
|
fontFamily: SelectedCardFont
|
|
|
|
|
|
? SelectedCardFont
|
|
|
|
|
|
: '',
|
|
|
|
|
|
color: SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.['FontColor']
|
|
|
|
|
|
: '',
|
|
|
|
|
|
textOverflow: 'ellipsis',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className="BSItemCard-itemName"
|
|
|
|
|
|
>
|
|
|
|
|
|
{item?.ProdName}{' '}
|
|
|
|
|
|
{(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
) ? (
|
2026-01-27 18:27:29 +05:30
|
|
|
|
''
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<p
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: 'red',
|
|
|
|
|
|
marginTop: '5px',
|
|
|
|
|
|
fontSize: '11px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
No Stock
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</p>
|
2026-02-25 17:55:44 +05:30
|
|
|
|
{cardFunction?.MRP &&
|
|
|
|
|
|
((item?.OverAllQty !== undefined &&
|
|
|
|
|
|
(!preferenceSingleSales
|
|
|
|
|
|
? item?.OverAllQty !== 0
|
|
|
|
|
|
: item?.OverAllPcs !== 0) &&
|
|
|
|
|
|
item?.OverAllQty !== null) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)) && (
|
|
|
|
|
|
<p
|
2026-02-26 15:06:15 +05:30
|
|
|
|
className="BSItemCard-itemMRP"
|
2026-02-25 17:55:44 +05:30
|
|
|
|
style={{
|
|
|
|
|
|
fontSize:
|
|
|
|
|
|
!cardFunction?.SmallImage
|
|
|
|
|
|
? cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'12px'
|
2026-02-25 17:55:44 +05:30
|
|
|
|
: '12px',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
lineHeight: '2',
|
|
|
|
|
|
fontFamily: SelectedCardFont
|
|
|
|
|
|
? SelectedCardFont
|
|
|
|
|
|
: '',
|
|
|
|
|
|
color: SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'FontColor'
|
|
|
|
|
|
]
|
2026-02-25 17:55:44 +05:30
|
|
|
|
: '',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
2026-03-02 16:45:23 +05:30
|
|
|
|
{ItemMRP(item) > 0
|
|
|
|
|
|
? `MRP: ₹ ${ItemMRP(item)}`
|
|
|
|
|
|
: ''}
|
2026-02-25 17:55:44 +05:30
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
{cardFunction?.Price &&
|
|
|
|
|
|
((item?.OverAllQty !== undefined &&
|
|
|
|
|
|
(!preferenceSingleSales
|
|
|
|
|
|
? item?.OverAllQty !== 0
|
|
|
|
|
|
: item?.OverAllPcs !== 0) &&
|
|
|
|
|
|
item?.OverAllQty !== null) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)) && (
|
|
|
|
|
|
<p
|
|
|
|
|
|
className="BSItemCard-itemPrice"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize:
|
|
|
|
|
|
!cardFunction?.SmallImage
|
|
|
|
|
|
? cardFunction?.BigImage &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'12px'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '12px',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
lineHeight: '2',
|
|
|
|
|
|
fontFamily: SelectedCardFont
|
|
|
|
|
|
? SelectedCardFont
|
|
|
|
|
|
: '',
|
|
|
|
|
|
color: SelectedCardColor
|
|
|
|
|
|
? SelectedCardColor?.[
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'FontColor'
|
|
|
|
|
|
]
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
₹ {ItemSellingPrice(item)}
|
|
|
|
|
|
{/* {item?.ProductDetail?.[0]?.ProdVariantDetails?.[0]?.StockDetails?.[0]?.SellPrice} */}
|
|
|
|
|
|
{/* {ItemSellingPrice(item)} */}
|
|
|
|
|
|
<span className="BSItemCard-itemCount">
|
|
|
|
|
|
({ItemSize(item)}{' '}
|
|
|
|
|
|
{ItemUomName(item)})
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{cardFunction?.StockCount &&
|
|
|
|
|
|
item?.OverAllQty !== undefined &&
|
|
|
|
|
|
(!preferenceSingleSales
|
|
|
|
|
|
? item?.OverAllQty !== 0
|
|
|
|
|
|
: item?.OverAllPcs !== 0) && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
top:
|
|
|
|
|
|
!cardFunction?.BigImage && '0',
|
|
|
|
|
|
right:
|
|
|
|
|
|
!cardFunction?.BigImage &&
|
|
|
|
|
|
!cardFunction?.SmallImage &&
|
|
|
|
|
|
'0px',
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.BigImage
|
|
|
|
|
|
? 'BSItemCard-badge'
|
|
|
|
|
|
: 'BSItemCard-badge-withoutimage'
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable === 'Y'
|
|
|
|
|
|
) &&
|
|
|
|
|
|
item?.OverAllQty !== null && (
|
|
|
|
|
|
<Badge
|
|
|
|
|
|
count={
|
|
|
|
|
|
!preferenceSingleSales
|
|
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item
|
|
|
|
|
|
?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item
|
|
|
|
|
|
?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
overflowCount={10000}
|
|
|
|
|
|
></Badge>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{item?.ProductDetail?.filter(
|
|
|
|
|
|
(item) => item.OnePcsAvailable == 'Y'
|
|
|
|
|
|
).length !== 0 &&
|
|
|
|
|
|
!preferenceSingleSales && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="onepieceMain"
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
!(
|
|
|
|
|
|
(item?.OverAllQty !==
|
|
|
|
|
|
undefined &&
|
|
|
|
|
|
returnOnepcCount(
|
|
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
CardOnclick(
|
|
|
|
|
|
item,
|
|
|
|
|
|
'OnePeiceProduct'
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontFamily: SelectedCardFont || '',
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
SelectedCardColor?.FontColor ||
|
|
|
|
|
|
'#ffffff',
|
|
|
|
|
|
color:
|
|
|
|
|
|
returnOnepcCount(
|
|
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0 ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(product) =>
|
|
|
|
|
|
product?.StockAvailable !==
|
|
|
|
|
|
'Y'
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.Background
|
|
|
|
|
|
? SelectedCardColor?.BackgroundColor ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'#000000'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '#fff'
|
|
|
|
|
|
: '#ff4d4f',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{SingleMember ? 'Single' : '1 PCS'}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className={
|
|
|
|
|
|
(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item?.OverAllPcs
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) => item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? 'card4Main card4Main-active'
|
|
|
|
|
|
: 'card4Main card4Main-deactive'
|
|
|
|
|
|
}
|
|
|
|
|
|
// onMouseDown={(e) =>
|
|
|
|
|
|
// handleMouseDownItemCard(e, item)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onMouseUp={(e) =>
|
|
|
|
|
|
// handleMouseUpItemCard(e, item, true)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onMouseLeave={handleMouseLeave}
|
|
|
|
|
|
// onTouchStart={(e) =>
|
|
|
|
|
|
// handleTouchStartItemCard(e, item)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onTouchEnd={(e) =>
|
|
|
|
|
|
// handleTouchEndItemCard(e, item, true)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// onTouchCancel={handleTouchCancelItemCard}
|
|
|
|
|
|
// onContextMenu={(e) => e.preventDefault()}
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
if (
|
|
|
|
|
|
!(
|
|
|
|
|
|
(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
2026-01-27 18:27:29 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) => item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.stopPropagation(); // Prevent event bubbling if no stock or condition isn't met
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Ensure this only runs if the "One Piece" condition isn't triggered
|
|
|
|
|
|
if (
|
|
|
|
|
|
!e.target.closest('.card4Main-onepiece')
|
|
|
|
|
|
) {
|
|
|
|
|
|
CardOnclick(
|
|
|
|
|
|
item,
|
|
|
|
|
|
item?.OnePcsAvailable === 'Y' &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
preferenceSingleSales &&
|
|
|
|
|
|
'OnePeiceProduct'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
// This will trigger if you're clicking outside the "One Piece" button
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{/* Global Data Checkbox */}
|
|
|
|
|
|
{globaldata && (
|
|
|
|
|
|
<input
|
|
|
|
|
|
type="checkbox"
|
|
|
|
|
|
value={item.ProductDetail?.[0]?.ProdId}
|
|
|
|
|
|
name={item.ProdName}
|
|
|
|
|
|
onClick={(e) => e.stopPropagation()}
|
|
|
|
|
|
onChange={(e) => {
|
|
|
|
|
|
e.stopPropagation();
|
|
|
|
|
|
pickData(e, item);
|
|
|
|
|
|
}}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
zIndex: 1,
|
|
|
|
|
|
transform: 'scale(1.5)',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
}}
|
|
|
|
|
|
checked={(
|
|
|
|
|
|
globalAllItemdata || EditfavItems
|
|
|
|
|
|
)?.some(
|
|
|
|
|
|
(a) =>
|
|
|
|
|
|
a?.ProdName === item?.ProdName &&
|
|
|
|
|
|
a?.ProdCat === item?.ProdCat
|
|
|
|
|
|
)}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{/* Tooltip for Product Name */}
|
|
|
|
|
|
<Tooltip title={item.ProdName}>
|
|
|
|
|
|
<div className="card4Img">
|
|
|
|
|
|
<img
|
|
|
|
|
|
width={50}
|
|
|
|
|
|
height={60}
|
|
|
|
|
|
src={
|
|
|
|
|
|
item?.ProductDetail?.[0]?.ProdLogo ===
|
2026-03-03 19:39:44 +05:30
|
|
|
|
''
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? defaultimage
|
|
|
|
|
|
: item?.ProductDetail?.[0]?.ProdLogo
|
|
|
|
|
|
? item?.ProductDetail?.[0]?.ProdLogo
|
|
|
|
|
|
: defaultimage
|
|
|
|
|
|
}
|
|
|
|
|
|
alt=""
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</Tooltip>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="Card4datas">
|
|
|
|
|
|
<div className="card4ProductName">
|
|
|
|
|
|
{item?.ProdName}
|
|
|
|
|
|
{(item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) => item?.StockAvailable !== 'Y'
|
|
|
|
|
|
) ? (
|
2026-01-27 18:27:29 +05:30
|
|
|
|
''
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<p
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: 'red',
|
|
|
|
|
|
marginTop: '5px',
|
|
|
|
|
|
fontSize: '15px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
No Stock
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
2026-03-02 16:45:23 +05:30
|
|
|
|
{cardFunction?.MRP &&
|
|
|
|
|
|
((item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-03-02 16:45:23 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item
|
|
|
|
|
|
)
|
2026-03-02 16:45:23 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
2026-03-02 16:45:23 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) => item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)) && (
|
2026-02-25 17:55:44 +05:30
|
|
|
|
<div className="card4PriceUom">
|
|
|
|
|
|
<div className="card4MRP">
|
2026-03-02 16:45:23 +05:30
|
|
|
|
{ItemMRP(item) > 0
|
|
|
|
|
|
? `MRP: ₹ ${ItemMRP(item)}`
|
|
|
|
|
|
: ''}
|
2026-02-25 17:55:44 +05:30
|
|
|
|
</div>
|
2026-02-25 16:24:29 +05:30
|
|
|
|
</div>
|
2026-02-25 17:55:44 +05:30
|
|
|
|
)}
|
2026-03-02 16:45:23 +05:30
|
|
|
|
{((item?.OverAllQty !== undefined &&
|
2026-03-03 19:39:44 +05:30
|
|
|
|
!preferenceSingleSales
|
2026-02-25 17:55:44 +05:30
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails,
|
|
|
|
|
|
item
|
|
|
|
|
|
)
|
2026-02-25 17:55:44 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
2026-02-25 17:55:44 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) => item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)) && (
|
2026-03-03 19:39:44 +05:30
|
|
|
|
<div className="card4PriceUom">
|
|
|
|
|
|
<div className="card4Price">
|
|
|
|
|
|
₹ {ItemSellingPrice(item)}
|
|
|
|
|
|
</div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-03-03 19:39:44 +05:30
|
|
|
|
<div className="card4Uom">
|
|
|
|
|
|
<>
|
|
|
|
|
|
({ItemSize(item)} {ItemUomName(item)})
|
|
|
|
|
|
</>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-03-03 19:39:44 +05:30
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{/* Stock Count Badge */}
|
|
|
|
|
|
{cardFunction?.StockCount &&
|
|
|
|
|
|
item?.OverAllQty !== undefined &&
|
|
|
|
|
|
(!preferenceSingleSales
|
|
|
|
|
|
? item?.OverAllQty !== 0
|
|
|
|
|
|
: item?.OverAllPcs !== 0) && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
top: '0',
|
|
|
|
|
|
right: '0px',
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
}}
|
|
|
|
|
|
className="card4Main-badge"
|
|
|
|
|
|
>
|
|
|
|
|
|
{item?.ProductDetail?.some(
|
|
|
|
|
|
(item) => item?.StockAvailable === 'Y'
|
|
|
|
|
|
) &&
|
|
|
|
|
|
item?.OverAllQty !== null && (
|
|
|
|
|
|
<Badge
|
|
|
|
|
|
count={
|
|
|
|
|
|
!preferenceSingleSales
|
|
|
|
|
|
? returnCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllQty,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: returnOnepcCount(
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}
|
|
|
|
|
|
overflowCount={10000}
|
|
|
|
|
|
></Badge>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{/* One Piece Button */}
|
|
|
|
|
|
{item?.ProductDetail?.filter(
|
|
|
|
|
|
(item) => item.OnePcsAvailable == 'Y'
|
|
|
|
|
|
).length !== 0 &&
|
|
|
|
|
|
!preferenceSingleSales && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="card4Main-onepiece"
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
e.stopPropagation(); // Stop event propagation to the parent div
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
!(
|
|
|
|
|
|
(item?.OverAllQty !== undefined &&
|
|
|
|
|
|
returnOnepcCount(
|
|
|
|
|
|
item?.ProductDetail?.[0]
|
|
|
|
|
|
?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0) ||
|
|
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
return; // Don't proceed if the condition isn't met
|
|
|
|
|
|
} else {
|
|
|
|
|
|
CardOnclick(item, 'OnePeiceProduct'); // This only runs when you click the "One Piece" button
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontFamily: SelectedCardFont || '',
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
SelectedCardColor?.FontColor ||
|
|
|
|
|
|
'#ffffff',
|
|
|
|
|
|
color:
|
|
|
|
|
|
returnOnepcCount(
|
|
|
|
|
|
item?.ProductDetail?.[0]?.ProdName,
|
|
|
|
|
|
item?.OverAllPcs,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
) > 0 ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
item?.ProductDetail?.some(
|
|
|
|
|
|
(product) =>
|
|
|
|
|
|
product?.StockAvailable !== 'Y'
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? cardFunction?.Background
|
|
|
|
|
|
? SelectedCardColor?.BackgroundColor ||
|
2026-03-03 19:39:44 +05:30
|
|
|
|
'#000000'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: '#fff'
|
|
|
|
|
|
: '#ff4d4f',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{SingleMember ? 'Single' : '1 PCS'}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</SortableCard>
|
|
|
|
|
|
))}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</SortableContext>
|
|
|
|
|
|
</DndContext>
|
|
|
|
|
|
</>
|
2026-02-09 18:55:09 +05:30
|
|
|
|
) : ProductSearch?.length > 5 &&
|
|
|
|
|
|
GetmultipleSearchDatas.some(
|
|
|
|
|
|
(e) => e.toLowerCase() === 'qrcode'
|
2026-02-09 15:43:03 +05:30
|
|
|
|
) &&
|
2026-02-09 18:55:09 +05:30
|
|
|
|
(cardData?.length == 0 || cardData == undefined) ? (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
{/* cardData mohan 18-04-2025 */}
|
|
|
|
|
|
<FeaturesFunctionalities
|
|
|
|
|
|
handleQuickAddCancel={handleQuickCancel}
|
|
|
|
|
|
QuickAdd={QuickAdd}
|
|
|
|
|
|
ProductSearch={true}
|
|
|
|
|
|
ProductSearchType={'I'}
|
|
|
|
|
|
cardData={cardDataForNewPrd}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className={!temp5 ? 'NodataFound' : 'NodataFound5'}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: globalAccessForOthers && 'none',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div align="center" className="fond">
|
|
|
|
|
|
<div className="contener_general">
|
|
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_1"> </div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_2"> </div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_3"> </div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_4"> </div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-02-09 18:55:09 +05:30
|
|
|
|
</div>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
{paymentloader === true && (
|
2026-02-09 18:55:09 +05:30
|
|
|
|
<div className="Payment-loader1">
|
|
|
|
|
|
<div className="Payment-loader">
|
|
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_1"> </div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-09 18:55:09 +05:30
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_2"> </div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-09 18:55:09 +05:30
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_3"> </div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-09 18:55:09 +05:30
|
|
|
|
<div className="contener_mixte">
|
|
|
|
|
|
<div className="ballcolor ball_4"> </div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
|
|
|
|
|
<p style={{ marginTop: '2rem' }}>
|
|
|
|
|
|
{' '}
|
|
|
|
|
|
Please wait while we process your payment
|
|
|
|
|
|
</p>
|
|
|
|
|
|
{PaymentTransactionNumber != null && (
|
|
|
|
|
|
<p style={{ fontSize: '16px', fontWeight: '600' }}>
|
|
|
|
|
|
Transaction Number : {PaymentTransactionNumber}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-02-09 17:28:22 +05:30
|
|
|
|
{expireModal?.open && (
|
|
|
|
|
|
<ExpireConfirmModal
|
|
|
|
|
|
open={expireModal?.open}
|
|
|
|
|
|
title={expireModal?.title}
|
|
|
|
|
|
onOk={() => {
|
|
|
|
|
|
expireModal.onOk?.();
|
|
|
|
|
|
closeExpireModal();
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}}
|
|
|
|
|
|
onCancel={() => {
|
2026-02-09 17:28:22 +05:30
|
|
|
|
expireModal.onCancel?.();
|
|
|
|
|
|
closeExpireModal();
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}}
|
2026-02-09 17:28:22 +05:30
|
|
|
|
/>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{modelQty && (
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
title={
|
|
|
|
|
|
<div className="EditQuantity-title">
|
|
|
|
|
|
<FormHeader title={'SubItem'} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
open={modelQty}
|
|
|
|
|
|
width={800}
|
|
|
|
|
|
handleCancel={CloseModal}
|
|
|
|
|
|
footer={null}
|
|
|
|
|
|
maskTransitionName=""
|
|
|
|
|
|
transitionName=""
|
|
|
|
|
|
children={
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<div className="EditQuantity-heading">
|
|
|
|
|
|
<div className="EditQuantity-headingname">
|
|
|
|
|
|
<p className="EditQuantity-itemname">Item Name:</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="EditQuantity-headingproductname"
|
|
|
|
|
|
style={{ marginLeft: '1rem' }}
|
|
|
|
|
|
>
|
|
|
|
|
|
<p className="EditQuantity-productname">
|
|
|
|
|
|
{qtydata?.ProdName}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{ height: 'auto' }}
|
|
|
|
|
|
className={
|
|
|
|
|
|
BrandCheckresult
|
|
|
|
|
|
? 'Card-modal-table'
|
|
|
|
|
|
: 'Brand-Card-modal-table'
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
{/* Horizontal scroll container */}
|
|
|
|
|
|
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'relative',
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{/* Left Scroll Button */}
|
|
|
|
|
|
{showLeftButton && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="CategoryHorizontal-icon"
|
|
|
|
|
|
onClick={() => handleScrollClickLeft(200)}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
left: 0,
|
|
|
|
|
|
top: '35%',
|
|
|
|
|
|
transform: 'translateY(-50%)',
|
|
|
|
|
|
zIndex: 10,
|
|
|
|
|
|
background: '#fff',
|
|
|
|
|
|
padding: '0.5rem',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
boxShadow: '0 0 5px rgba(0,0,0,0.2)',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
◄
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{/* Scroll Container */}
|
|
|
|
|
|
<div
|
|
|
|
|
|
id="mainDiv"
|
|
|
|
|
|
className="CategoryHorizontal-scroll-container"
|
|
|
|
|
|
ref={scrollContainerRef}
|
|
|
|
|
|
onMouseDown={handleMouseDown}
|
|
|
|
|
|
onMouseMove={handleMouseMove}
|
|
|
|
|
|
onMouseUp={handleMouseUp}
|
|
|
|
|
|
onMouseLeave={handleMouseUp}
|
|
|
|
|
|
onTouchStart={handleTouchStart}
|
|
|
|
|
|
onTouchMove={handleTouchMove}
|
|
|
|
|
|
onTouchEnd={handleTouchEnd}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
cursor: 'grab',
|
|
|
|
|
|
overflowX: 'auto',
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
gap: '1rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{Object.keys(brandGroups)
|
|
|
|
|
|
.sort((a, b) =>
|
|
|
|
|
|
a === 'Others' ? -1 : b === 'Others' ? 1 : 0
|
|
|
|
|
|
)
|
|
|
|
|
|
.map((brand) => (
|
|
|
|
|
|
<div
|
|
|
|
|
|
key={brand}
|
|
|
|
|
|
onClick={() => setSelectedBrand(brand)}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
minWidth: '150px',
|
|
|
|
|
|
background:
|
|
|
|
|
|
selectedBrand === brand ? '#cce5ff' : '#f4f4f4',
|
|
|
|
|
|
borderRadius: '8px',
|
|
|
|
|
|
padding: '0.8rem',
|
|
|
|
|
|
flexShrink: 0,
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
userSelect: 'none',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
fontWeight:
|
2026-02-25 16:24:29 +05:30
|
|
|
|
selectedBrand === brand ? '600' : 'normal',
|
|
|
|
|
|
fontFamily: 'Poppins',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{brand === 'Others' ? 'Others' : brand}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
))}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{/* Right Scroll Button */}
|
|
|
|
|
|
{showRightButton && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="CategoryHorizontal-icon"
|
|
|
|
|
|
onClick={() => handleScrollClickRight(200)}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
|
right: 0,
|
|
|
|
|
|
top: '35%',
|
|
|
|
|
|
transform: 'translateY(-50%)',
|
|
|
|
|
|
zIndex: 10,
|
|
|
|
|
|
background: '#fff',
|
|
|
|
|
|
padding: '0.5rem',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
boxShadow: '0 0 5px rgba(0,0,0,0.2)',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
►
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{/* Selected brand products */}
|
|
|
|
|
|
<div style={{ marginTop: '1rem', overflow: 'auto' }}>
|
|
|
|
|
|
<h3 style={{ margin: '0 0 20px 0' }}>
|
|
|
|
|
|
{selectedBrand === 'Others' ? 'Others' : selectedBrand}{' '}
|
|
|
|
|
|
Products
|
|
|
|
|
|
</h3>
|
|
|
|
|
|
<ul
|
|
|
|
|
|
className="webkit-ul"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
listStyle: 'none',
|
|
|
|
|
|
padding: 0,
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
gap: '1rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{(brandGroups[selectedBrand] || []).map(
|
|
|
|
|
|
(product, index) => {
|
|
|
|
|
|
const qtyCount = returnQtyCount(
|
|
|
|
|
|
product?.ProdId,
|
|
|
|
|
|
product,
|
|
|
|
|
|
CartOrderDetails
|
|
|
|
|
|
);
|
|
|
|
|
|
const isAvailable = product?.StockAvailable !== 'Y';
|
|
|
|
|
|
const isDisabled = qtyCount > 0 || isAvailable;
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<div key={`${product?.brandId}-${index}`}>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{ position: 'relative' }}
|
|
|
|
|
|
className={
|
|
|
|
|
|
isDisabled
|
|
|
|
|
|
? 'ItemQtyCard'
|
|
|
|
|
|
: 'ItemQtyCard-disabled'
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => VarientFun(product)}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div className="ItemQtyImgCard">
|
|
|
|
|
|
<img
|
|
|
|
|
|
src={product?.ProdLogo || defaultimage}
|
|
|
|
|
|
width={'80px'}
|
|
|
|
|
|
height={'70px'}
|
|
|
|
|
|
alt={`Product ${index}`}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className={
|
|
|
|
|
|
cardFunction?.BigImage
|
|
|
|
|
|
? 'BSItemCard-badge'
|
|
|
|
|
|
: 'BSItemCard-badge-withoutimage'
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Badge
|
|
|
|
|
|
count={qtyCount}
|
|
|
|
|
|
overflowCount={10000}
|
|
|
|
|
|
></Badge>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="qtyDetail">
|
|
|
|
|
|
<p className="qtyUomName-itemCard">
|
|
|
|
|
|
{product?.Size + ' ' + product?.UomName}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
{!isDisabled && (
|
|
|
|
|
|
<p
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: 'red',
|
|
|
|
|
|
fontSize: '12',
|
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
|
fontWeight: '600',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
No Stock
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{isDisabled && (
|
|
|
|
|
|
<p className="qtyprice">
|
|
|
|
|
|
<sup style={{ fontFamily: 'Gilroy' }}>
|
|
|
|
|
|
₹
|
|
|
|
|
|
</sup>
|
|
|
|
|
|
|
|
|
|
|
|
{safeRound(
|
|
|
|
|
|
product?.ProdVariantDetails?.[0]
|
|
|
|
|
|
?.StockDetails?.[0]?.SellPrice
|
|
|
|
|
|
)}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
)}
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{Object.keys(brandMapping).length === 0 && (
|
|
|
|
|
|
<p>No product details available</p>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{modelstock && (
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
title={
|
|
|
|
|
|
<div className="EditQuantity-title">
|
|
|
|
|
|
<FormHeader title={'Item Stock'} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
open={modelstock}
|
|
|
|
|
|
// width={500}
|
|
|
|
|
|
footer={null}
|
|
|
|
|
|
top={0}
|
|
|
|
|
|
handleCancel={CloseModal1}
|
|
|
|
|
|
maskTransitionName=""
|
|
|
|
|
|
transitionName=""
|
|
|
|
|
|
children={
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="EditQuantity-heading"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
flexDirection: 'column',
|
|
|
|
|
|
marginBottom: '3rem',
|
|
|
|
|
|
alignItems: 'start',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div style={{ display: 'flex' }}>
|
|
|
|
|
|
<div className="EditQuantity-headingname">
|
|
|
|
|
|
<p className="EditQuantity-itemname">Item Name:</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="EditQuantity-headingproductname"
|
|
|
|
|
|
style={{ marginLeft: '1rem' }}
|
|
|
|
|
|
>
|
|
|
|
|
|
<p className="EditQuantity-productname">
|
|
|
|
|
|
{qtydata?.ProdName}{' '}
|
|
|
|
|
|
{!qtydata?.ProductDetail?.[
|
|
|
|
|
|
QtyIndex
|
|
|
|
|
|
]?.ProdVariantDetails?.[
|
|
|
|
|
|
VarientIndex
|
|
|
|
|
|
]?.ProdVariantName?.toLowerCase()?.includes(
|
|
|
|
|
|
'variant'
|
|
|
|
|
|
) && (
|
2026-03-03 19:39:44 +05:30
|
|
|
|
<span>
|
|
|
|
|
|
(
|
|
|
|
|
|
{
|
|
|
|
|
|
qtydata?.ProductDetail?.[QtyIndex]
|
|
|
|
|
|
?.ProdVariantDetails?.[VarientIndex]
|
|
|
|
|
|
?.ProdVariantName
|
|
|
|
|
|
}
|
|
|
|
|
|
){' '}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div style={{ display: 'flex' }}>
|
|
|
|
|
|
<div className="EditQuantity-headingname">
|
|
|
|
|
|
<p className="EditQuantity-itemname">Item Unit:</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="EditQuantity-headingproductname"
|
|
|
|
|
|
style={{ marginLeft: '1rem' }}
|
|
|
|
|
|
>
|
|
|
|
|
|
<p className="EditQuantity-productname">
|
|
|
|
|
|
{qtydata?.ProductDetail?.[QtyIndex]?.Size}{' '}
|
|
|
|
|
|
{onePeiceFlow
|
|
|
|
|
|
? 'PCS'
|
|
|
|
|
|
: qtydata?.ProductDetail?.[QtyIndex]?.UomName}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div className="Re-Print-table">
|
|
|
|
|
|
<Tables columns={stockcolumns} data={stockdataSource} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{ModalVarient && (
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
title={
|
|
|
|
|
|
<div className="EditQuantity-title">
|
|
|
|
|
|
<FormHeader title={AvailableDate ? 'Slots' : 'Item Variant'} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
open={ModalVarient}
|
|
|
|
|
|
width={500}
|
|
|
|
|
|
top={0}
|
|
|
|
|
|
footer={null}
|
|
|
|
|
|
handleCancel={CloseVarientModal}
|
|
|
|
|
|
maskTransitionName=""
|
|
|
|
|
|
transitionName=""
|
|
|
|
|
|
children={
|
|
|
|
|
|
<div className="EditQuantity-Master">
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="EditQuantity-heading"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
flexDirection: 'column',
|
|
|
|
|
|
marginBottom: '3rem',
|
|
|
|
|
|
alignItems: 'start',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div style={{ display: 'flex' }}>
|
|
|
|
|
|
<div className="EditQuantity-headingname">
|
|
|
|
|
|
<p className="EditQuantity-itemname">Item Name:</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="EditQuantity-headingproductname"
|
|
|
|
|
|
style={{ marginLeft: '1rem' }}
|
|
|
|
|
|
>
|
|
|
|
|
|
<p className="EditQuantity-productname">
|
|
|
|
|
|
{qtydata?.ProdName}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div style={{ display: 'flex' }}>
|
|
|
|
|
|
<div className="EditQuantity-headingname">
|
|
|
|
|
|
<p className="EditQuantity-itemname">Item Unit:</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="EditQuantity-headingproductname"
|
|
|
|
|
|
style={{ marginLeft: '1rem' }}
|
|
|
|
|
|
>
|
|
|
|
|
|
<p className="EditQuantity-productname">
|
|
|
|
|
|
{qtydata?.ProductDetail?.[QtyIndex]?.Size}{' '}
|
|
|
|
|
|
{onePeiceFlow
|
|
|
|
|
|
? 'PCS'
|
|
|
|
|
|
: qtydata?.ProductDetail?.[QtyIndex]?.UomName}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="Re-Print-table">
|
|
|
|
|
|
<Tables columns={varientcolumns} data={varientdataSource} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{productPriceChange && priceChangeProduct?.length > 0 && (
|
|
|
|
|
|
<ProductPriceChange
|
|
|
|
|
|
showButton={false}
|
|
|
|
|
|
priceChangeProduct={priceChangeProduct}
|
|
|
|
|
|
productPriceChange={productPriceChange}
|
|
|
|
|
|
setProductPriceChange={setProductPriceChange}
|
|
|
|
|
|
setPriceChangeProduct={setPriceChangeProduct}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{newMoreProductModel && (
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
title="Add Product"
|
|
|
|
|
|
destroyOnClose
|
|
|
|
|
|
open={newMoreProductModel}
|
|
|
|
|
|
width={900}
|
|
|
|
|
|
top={0}
|
|
|
|
|
|
footer={true}
|
|
|
|
|
|
handleSubmit={handleBulkUpload}
|
|
|
|
|
|
handleCancel={() => setNewMoreProductModel(false)}
|
|
|
|
|
|
children={
|
|
|
|
|
|
<>
|
|
|
|
|
|
<AddProduct products={products} setProducts={setProducts} />
|
|
|
|
|
|
</>
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</>
|
|
|
|
|
|
);
|
|
|
|
|
|
for (let i = 0; i < code?.length; i++) {
|
|
|
|
|
|
encrypted += String.fromCharCode(
|
|
|
|
|
|
code.charCodeAt(i) ^ key.charCodeAt(i % key.length)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
return encrypted;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function decrypt(encrypted, key) {
|
|
|
|
|
|
// Implement decryption logic
|
|
|
|
|
|
let decrypted = encrypt();
|
|
|
|
|
|
for (let i = 0; i < encrypted?.length; i++) {
|
|
|
|
|
|
decrypted += String.fromCharCode(
|
|
|
|
|
|
encrypted.charCodeAt(i) ^ key.charCodeAt(i % key.length)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
return decrypted;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const encryptedCode = encrypt(); // Encrypted React component code
|
|
|
|
|
|
const decryptionKey = decrypt(); // Decryption key (keep it secure)
|
|
|
|
|
|
const decryptedCode = decrypt(encryptedCode, decryptionKey);
|
|
|
|
|
|
|
|
|
|
|
|
return <>{encrypt()}</>;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export default React.memo(BSItemCard);
|