Android_Retail/src/Pages/BookingScreen/Components/UtillComponents/BSNavBarComboSearch.jsx

1426 lines
50 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import '../../../../Styles/BookingScreen/Components/UtillComponents/BSNavBarComponents.scss';
import { useRef, useState, useEffect, useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { IoSearchOutline } from 'react-icons/io5';
import { Form, AutoComplete, Modal } from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import {
changeHoldOrderDtl,
ChangeNewQrProduct,
changeOrderCardDetails,
changeothersdata,
changePreviousOrderLength,
Comboget,
getConfigType,
GlobalBookingType,
GlobalOrderCardDetails,
GlobalOrderType,
GlobalReorderHoldDetails,
GlobalReorderProductDetails,
} from '../../../../Features/BookingScreen/BookingData/BookingData.js';
import {
changepreOrderList,
GlobalPreOrderList,
GlobalpreOrderOpen,
} from '../../../../Features/BookingScreen/PreOrder/PreOrder.js';
import { Messages } from '../../../../Components/Notifications/Messages.jsx';
import { DefaultModal } from '../../../../Components/Modal/DefaultModal';
import FormHeader from '../../../PageComponents/FormHeader';
import { Tables } from '../../../../Components/Tables/Table';
import { ExclamationCircleOutlined } from '@ant-design/icons';
import BarcodeScanner from './BarcodeScanner';
import { isMobile } from 'react-device-detect';
import { BiBarcodeReader } from 'react-icons/bi';
import TooltipWrapper from '../../../../Components/Tooltip/Tooltip';
import BarCodeScan from '../../../../Services/BarCodeScan.jsx';
const BSNavBarComboSearch = (props) => {
const dispatch = useDispatch();
const propsData = props?.SessionData;
const [form] = Form.useForm();
const searchInputRef = useRef(null);
const BookingType = useSelector(GlobalBookingType);
const CartOrderDetails = useSelector(GlobalOrderCardDetails);
const ReorderProductData = useSelector(GlobalReorderProductDetails);
const ReportholdData = useSelector(GlobalReorderHoldDetails);
const OrderType = useSelector(GlobalOrderType);
const GPreOrderList = useSelector(GlobalPreOrderList);
const preOrder = useSelector(GlobalpreOrderOpen);
const [DropDown, setDropDown] = useState();
const [selectedprod, setselectedprod] = useState('');
const [BillOrderPre, setBillOrderPre] = useState();
const [messageType, setMessageType] = useState(null);
const [messageData, setMessageData] = useState(null);
const [modelstock, setModelstock] = useState(false);
const [qtydata, setQtydata] = useState();
const [expModel, setexpModel] = useState(false);
const [prodexpir, setProdexpir] = useState(false);
const [ExpProd, setExpProd] = useState();
const [Expdata, setExpdata] = useState();
const [PreOrderSelectedProdNames, setPreOrderSelectedProdNames] = useState(
[]
);
const [screenWidth, setScreenWidth] = useState(window.innerWidth);
const [openScanner, setOpenScanner] = useState(false);
const scannerRef = useRef();
const onComplete = useCallback(() => {
setMessageData(null);
setMessageType(null);
}, []);
const updateScreenSize = () => {
setScreenWidth(window.innerWidth);
};
useEffect(() => {
// Set initial screen size
updateScreenSize();
// Add event listener to track changes in screen size
window.addEventListener('resize', updateScreenSize);
// Clean up the event listener on component unmount
return () => {
window.removeEventListener('resize', updateScreenSize);
};
}, []);
//dhana
useEffect(() => {
const handleKeyPress = (event) => {
if (event.shiftKey && event.code === 'KeyS') {
if (
document.activeElement.tagName !== 'INPUT' &&
document.activeElement.tagName !== 'TEXTAREA'
) {
event.preventDefault(); // Stops "S" from being typed
searchInputRef?.current?.focus();
}
}
};
const handleClickOutside = (event) => {
searchInputRef?.current?.blur();
};
window.addEventListener('keydown', handleKeyPress);
window.addEventListener('mousedown', handleClickOutside);
return () => {
window.removeEventListener('keydown', handleKeyPress);
window.removeEventListener('mousedown', handleClickOutside);
};
}, []);
//dhana
const stockcolumns = [
{
title: 'Batch No',
dataIndex: 'ComboInwardDtlId',
key: 'ComboInwardDtlId',
align: 'center',
render: (text, record, index) => (
<span
style={
record.StockCount > 0
? { color: '#000', cursor: 'pointer' }
: { color: '#f49898', cursor: 'not-allowed' }
}
>
{record?.['ComboInwardDtlId']}
</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: 'Price',
dataIndex: 'Price',
key: 'Price',
align: 'center',
render: (_, record, index) => (
<span
style={
record.StockCount > 0
? { color: '#000', cursor: 'pointer' }
: { color: '#f49898', cursor: 'not-allowed' }
}
>
{record.Price}
</span>
),
onCell: (record) => {
return {
onClick: () => {
if (record.StockCount > 0) {
StockSelected(record);
}
},
};
},
},
];
const Prodcolumns = [
{
title: 'Product Name',
dataIndex: 'ProdName',
key: 'ProdName',
align: 'center',
render: (text) => <a style={{ color: 'black' }}>{text}</a>,
},
{
title: 'Size',
dataIndex: 'Size',
key: 'Size',
align: 'center',
render: (text) => <a style={{ color: 'black' }}>{text}</a>,
},
{
title: 'UomName',
dataIndex: 'UomName',
key: 'UomName',
align: 'center',
render: (text) => <a style={{ color: 'black' }}>{text}</a>,
},
{
title: 'ExpDate',
dataIndex: 'ExpDate',
key: 'ExpDate',
align: 'center',
render: (text) => <a style={{ color: 'black' }}>{text}</a>,
},
];
const onChangeprodFunction = async (e) => {
setselectedprod(e);
let data = {
AppId: propsData?.AppId,
CompId: propsData?.CompId,
BranchId: propsData?.BranchId,
comboName: e,
ActiveStatus: 'A',
};
let Response = await dispatch(Comboget(data)).unwrap();
if (Response?.data?.statusCode == 1) {
setDropDown(Response?.data?.data);
} else {
setDropDown();
}
const comboData = Response?.data?.data?.[0];
const inwardDetails = comboData?.ComboInwardDetails?.[0]?.QRCode === e;
if (inwardDetails) {
// Set the ComboId or perform any other actions needed when theres a match
const selectedOption = Response?.data?.data;
onSelectCombo(selectedOption);
}
};
useEffect(() => {
setPreOrderSelectedProdNames(GPreOrderList);
}, [GPreOrderList]);
useEffect(() => {
setPreOrderSelectedProdNames([]);
// dispatch(changePreOrderAdditem(null));
}, [preOrder]);
const onSelectCombo = async (selectedOption) => {
let count = selectedOption?.[0]?.ComboInwardDetails?.length;
setQtydata(selectedOption);
let alreadyOrdercount = await returnCount(
selectedOption?.[0]?.ComboName,
selectedOption?.[0]?.OverallQuantity,
CartOrderDetails
);
if (alreadyOrdercount <= 0) {
setMessageType('error');
setMessageData('Stock Not Available');
} else if (count > 1) {
setModelstock(true);
form.resetFields(['ProdName']);
setselectedprod('');
} else {
onAutocompleteChange(selectedOption);
form.resetFields(['ProdName']);
setselectedprod('');
}
};
const returnCount = (ProdName, currentQty, orderDetails) => {
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
);
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.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 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 onAutocompleteChange = async (selectedOption) => {
let OrderRate =
selectedOption?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice;
let data = {
Type: 'C',
OverallQuantity: selectedOption?.[0]?.OverallQuantity,
ActiveStatus: selectedOption?.[0]?.ActiveStatus,
AvailableFrom: selectedOption?.[0]?.ValidFrom,
AvailableTo: selectedOption?.[0]?.ValidTo,
ProdId: selectedOption?.[0]?.ComboId,
ProdDetail: selectedOption?.[0]?.ComboInwardDetails?.[0]?.ComboDetails,
ProdName: selectedOption?.[0]?.ComboName,
QRCode: selectedOption?.[0]?.ComboInwardDetails?.[0]?.QRCode,
StockAvailable: 'Y',
BalanceQty: selectedOption?.[0]?.ComboInwardDetails?.[0]?.BalanceQty,
InwardDtlId:
selectedOption?.[0]?.ComboInwardDetails?.[0]?.ComboInwardDtlId,
MRP: selectedOption?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice,
OrderRate: selectedOption?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice,
SellingPrice:
selectedOption?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice,
BookingTypeName: BookingType,
TaxPercentage: 0,
Size: 1,
UomName: 'PCS',
OfferType: selectedOption?.[0]?.ComboInwardDetails?.[0]?.OfferType,
OfferPrice: selectedOption?.[0]?.ComboInwardDetails?.[0]?.OfferPrice,
OfferValue:
selectedOption?.[0]?.ComboInwardDetails?.[0]?.OfferType === 'F'
? selectedOption?.[0]?.ComboInwardDetails?.[0]?.OfferPrice
: (OrderRate *
selectedOption?.[0]?.ComboInwardDetails?.[0]?.OfferPrice) /
100,
SinglePc: 'N',
};
await AddOrderDetails(data);
};
const AddOrderDetails = async (item) => {
if (preOrder) {
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 (Condition !== undefined && Condition === true) {
setMessageData('Dublicate Data');
setMessageType('error');
} else {
let OfferPri =
item?.OfferType === 'F'
? item?.OfferPrice
: (item?.OrderRate * item?.OfferPrice) / 100;
const SelectedProduct = {
ProdId: item?.ProdId,
InwardDtlId: item?.InwardDtlId,
ProdNameQty:
item?.Type != 'C'
? item?.ProdName + ' ' + item?.Size + ' ' + item?.UomName
: `${item?.ProdName} (1 Combo)`,
ProdName: item?.ProdName,
ProdDetail: item.ProdDetail,
OrderQty: 1,
OrderRate: item?.OrderRate,
SellingPrice: item?.SellingPrice,
TotalAmt: item?.OrderRate - OfferPri,
Image: null,
Description: null,
Type: item?.Type,
TaxAmt: 0,
RefundQty: 0,
TaxId: item?.TaxId,
OrderStatus: 'O',
OrderType: 'PRE',
SinglePc: item?.SinglePc,
BookingType: BookingTypeID,
TaxPercentage: 0,
Size: 1,
UomName: 'Combo',
OfferType: item?.OfferType,
OfferValue: item?.OfferPrice,
OfferAmt: OfferPri,
WithoutTaxRate:
1 * item?.OrderRate -
(
(1 * item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
};
let Data = [SelectedProduct];
if (PreOrderSelectedProdNames?.length > 0) {
for (let i = 0; i < PreOrderSelectedProdNames?.length; i++) {
Data.push(PreOrderSelectedProdNames[i]);
}
}
if (GPreOrderList) {
let updatedGPreOrderList = [...GPreOrderList];
Data?.forEach((product) => {
const exists = updatedGPreOrderList.some(
(gProduct) => gProduct.InwardDtlId === product.InwardDtlId
); // && gProduct.SinglePc === product.SinglePc
if (!exists) {
updatedGPreOrderList.push(product);
}
});
setPreOrderSelectedProdNames(Data);
dispatch(changepreOrderList(updatedGPreOrderList));
} else {
setPreOrderSelectedProdNames(Data);
dispatch(changepreOrderList(Data));
}
}
} else {
dispatch(changeHoldOrderDtl(false));
dispatch(changePreviousOrderLength(CartOrderDetails?.length));
const OtherOrderDatas = CartOrderDetails?.filter(
(cartItem) =>
!(
cartItem?.ProdId === item?.ProdId &&
cartItem?.InwardDtlId === item?.InwardDtlId &&
cartItem?.OrderRate === item?.OrderRate &&
cartItem?.BookingTypeName === item?.BookingTypeName
) && !cartItem?.SalesId
);
const OtherOrderDatawithsales = CartOrderDetails?.filter(
(cartItem) => cartItem?.SalesId
);
const OtherorderDataforNormal = CartOrderDetails?.filter(
(cartItem) =>
!(
cartItem?.ProdId === item?.ProdId &&
cartItem?.InwardDtlId === item?.InwardDtlId &&
cartItem?.OrderRate === item?.OrderRate &&
cartItem?.BookingTypeName === item?.BookingTypeName &&
!cartItem?.SalesId
)
);
const isItemInCart = CartOrderDetails?.find(
(cartItem) =>
cartItem?.ProdId === item?.ProdId &&
cartItem?.InwardDtlId === item?.InwardDtlId &&
cartItem?.OrderRate === item?.OrderRate &&
cartItem?.BookingTypeName === item?.BookingTypeName &&
!cartItem?.SalesId
); // check if the item is already in the cart
const isItemNotInDine = CartOrderDetails?.find(
(cartItem) =>
cartItem?.ProdId === item?.ProdId &&
cartItem?.InwardDtlId === item?.InwardDtlId &&
cartItem?.OrderRate === item?.OrderRate &&
cartItem?.BookingTypeName === item?.BookingTypeName &&
!cartItem?.SalesId
); // check if the item is already in the cart
const isItemInCartSalesId = CartOrderDetails?.find(
(cartItem) =>
cartItem?.ProdId === item?.ProdId &&
cartItem?.InwardDtlId === item?.InwardDtlId &&
cartItem?.OrderRate === item?.OrderRate &&
cartItem?.BookingTypeName === item?.BookingTypeName &&
cartItem?.SalesId
); // check if the item is already in the cart
const isItemInCartHold = CartOrderDetails?.find(
(cartItem) =>
cartItem?.ProdId === item?.ProdId &&
cartItem?.InwardDtlId === item?.InwardDtlId &&
cartItem?.OrderRate === item?.OrderRate &&
cartItem?.BookingTypeName === item?.BookingTypeName
); // check if the item is already in the cart
const OtherorderDataforNormalWithoutSalesId = CartOrderDetails?.filter(
(cartItem) =>
!(
cartItem?.ProdId === item?.ProdId &&
cartItem?.InwardDtlId === item?.InwardDtlId &&
cartItem?.OrderRate === item?.OrderRate &&
cartItem?.BookingTypeName === item?.BookingTypeName
)
);
const BookingTypeProd = item?.BookingTypeName;
if (isItemInCart && BookingTypeProd != 'Dine In' && OrderType != 'Hold') {
if (BillOrderPre === 'Y') {
const UpdatedCartItem =
// if the item is already in the cart, increase the quantity of the item
{
...isItemInCart,
OrderQty: isItemInCart?.OrderQty + 1,
TotalAmt:
isItemInCart?.OfferPrice > 0
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(isItemInCart?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.OfferPrice) /
100)
: (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate,
// TotalAmt: ((isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate),
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: isItemInCart?.OfferPrice,
TaxAmt: (
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
};
dispatch(
changeOrderCardDetails([
UpdatedCartItem,
...OtherorderDataforNormal,
])
);
} else {
const UpdatedCartItem =
// if the item is already in the cart, increase the quantity of the item
{
...isItemInCart,
OrderQty: isItemInCart?.OrderQty + 1,
TotalAmt:
isItemInCart?.OfferPrice > 0
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(isItemInCart?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.OfferPrice) /
100)
: (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate,
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.OfferPrice) /
100,
// TotalAmt: ((isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate),
TaxAmt: (
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
};
dispatch(
changeOrderCardDetails([
...OtherorderDataforNormal,
UpdatedCartItem,
])
);
}
}
//mohan for both
else if (
isItemInCart &&
BookingTypeProd === 'Dine In' &&
OrderType != 'Hold'
) {
if (BillOrderPre === 'Y') {
const UpdatedCartItem =
// if the item is already in the cart, increase the quantity of the item
{
...isItemInCart,
OrderQty: isItemInCart?.OrderQty + 1,
TotalAmt:
isItemInCart?.OfferPrice > 0
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(isItemInCart?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.OfferPrice) /
100)
: (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate,
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: isItemInCart?.OfferPrice,
// TotalAmt: ((isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate),
TaxAmt: (
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
};
dispatch(
changeOrderCardDetails([
UpdatedCartItem,
...OtherorderDataforNormal,
])
);
} else {
const UpdatedCartItem =
// if the item is already in the cart, increase the quantity of the item
{
...isItemInCart,
OrderQty: isItemInCart?.OrderQty + 1,
TotalAmt:
isItemInCart?.OfferPrice > 0
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(isItemInCart?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.OfferPrice) /
100)
: (isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate,
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: isItemInCart?.OfferPrice,
// TotalAmt: ((isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate),
TaxAmt: (
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemInCart?.OrderQty + 1) * isItemInCart?.OrderRate -
(
((isItemInCart?.OrderQty + 1) *
isItemInCart?.OrderRate *
isItemInCart?.TaxPercentage) /
(100 + isItemInCart?.TaxPercentage)
).toFixed(2),
};
dispatch(
changeOrderCardDetails([
...OtherorderDataforNormal,
UpdatedCartItem,
])
);
}
} else if (isItemInCartHold && OrderType === 'Hold') {
if (BillOrderPre === 'Y') {
const UpdatedCartItem =
// if the item is already in the cart, increase the quantity of the item
{
...isItemInCartHold,
OrderQty: isItemInCartHold?.OrderQty + 1,
TotalAmt:
isItemInCartHold?.OfferPrice > 0
? (isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate -
(isItemInCartHold?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate *
isItemInCartHold?.OfferPrice) /
100)
: (isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate,
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: isItemInCart?.OfferPrice,
// TotalAmt: ((isItemInCartHold?.OrderQty + 1) * isItemInCartHold?.OrderRate),
TaxAmt: (
((isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate *
isItemInCartHold?.TaxPercentage) /
(100 + isItemInCartHold?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemInCartHold?.OrderQty + 1) * isItemInCartHold?.OrderRate -
(
((isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate *
isItemInCartHold?.TaxPercentage) /
(100 + isItemInCartHold?.TaxPercentage)
).toFixed(2),
};
dispatch(
changeOrderCardDetails([
UpdatedCartItem,
...OtherorderDataforNormalWithoutSalesId,
])
);
} else {
const UpdatedCartItem =
// if the item is already in the cart, increase the quantity of the item
{
...isItemInCartHold,
OrderQty: isItemInCartHold?.OrderQty + 1,
TotalAmt:
isItemInCartHold?.OfferPrice > 0
? (isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate -
(isItemInCartHold?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate *
isItemInCartHold?.OfferPrice) /
100)
: (isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate,
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: isItemInCart?.OfferPrice,
// TotalAmt: ((isItemInCartHold?.OrderQty + 1) * isItemInCartHold?.OrderRate),
TaxAmt: (
((isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate *
isItemInCartHold?.TaxPercentage) /
(100 + isItemInCartHold?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemInCartHold?.OrderQty + 1) * isItemInCartHold?.OrderRate -
(
((isItemInCartHold?.OrderQty + 1) *
isItemInCartHold?.OrderRate *
isItemInCartHold?.TaxPercentage) /
(100 + isItemInCartHold?.TaxPercentage)
).toFixed(2),
};
dispatch(
changeOrderCardDetails([
...OtherorderDataforNormalWithoutSalesId,
UpdatedCartItem,
])
);
}
} else if (
isItemNotInDine &&
BookingTypeProd == 'Dine In' &&
OrderType != 'Hold'
) {
if (BillOrderPre === 'Y') {
const UpdatedCartItem = {
...isItemNotInDine,
OrderQty: isItemNotInDine?.OrderQty + 1,
TotalAmt:
isItemNotInDine?.OfferPrice > 0
? (isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate -
(isItemNotInDine?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemNotInDine?.OrderQty + 1) *
isItemNotInDine?.OrderRate *
isItemNotInDine?.OfferPrice) /
100)
: (isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate,
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: isItemInCart?.OfferPrice,
// TotalAmt: ((isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate),
TaxAmt: (
((isItemNotInDine?.OrderQty + 1) *
isItemNotInDine?.OrderRate *
isItemNotInDine?.TaxPercentage) /
(100 + isItemNotInDine?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate -
(
((isItemNotInDine?.OrderQty + 1) *
isItemNotInDine?.OrderRate *
isItemNotInDine?.TaxPercentage) /
(100 + isItemNotInDine?.TaxPercentage)
).toFixed(2),
};
// otherwise, return the cart item
dispatch(
changeOrderCardDetails([
UpdatedCartItem,
...OtherOrderDatas,
...OtherOrderDatawithsales,
])
);
} else {
const UpdatedCartItem = {
...isItemNotInDine,
OrderQty: isItemNotInDine?.OrderQty + 1,
TotalAmt:
isItemNotInDine?.OfferPrice > 0
? (isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate -
(isItemNotInDine?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: ((isItemNotInDine?.OrderQty + 1) *
isItemNotInDine?.OrderRate *
isItemNotInDine?.OfferPrice) /
100)
: (isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate,
OfferValue:
item?.OfferType === 'F'
? (isItemInCart?.OrderQty + 1) * isItemInCart?.OfferPrice
: isItemInCart?.OfferPrice,
// TotalAmt: ((isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate),
TaxAmt: (
((isItemNotInDine?.OrderQty + 1) *
isItemNotInDine?.OrderRate *
isItemNotInDine?.TaxPercentage) /
(100 + isItemNotInDine?.TaxPercentage)
).toFixed(2),
WithoutTaxRate:
(isItemNotInDine?.OrderQty + 1) * isItemNotInDine?.OrderRate -
(
((isItemNotInDine?.OrderQty + 1) *
isItemNotInDine?.OrderRate *
isItemNotInDine?.TaxPercentage) /
(100 + isItemNotInDine?.TaxPercentage)
).toFixed(2),
};
// otherwise, return the cart item
dispatch(
changeOrderCardDetails([
...OtherOrderDatawithsales,
...OtherOrderDatas,
UpdatedCartItem,
])
);
}
} else {
if (item?.OtherProduct === 'Others') {
BillOrderPre === 'Y'
? dispatch(
changeOrderCardDetails([
{
...item,
// TotalAmt: (((item?.OrderQty + 1) * item?.OrderRate)- (item?.OfferType === "F" ?item?.OfferPrice :(((item?.OrderQty + 1) * item?.OrderRate) * item?.OfferPrice)/100)),
TotalAmt: item?.OrderQty * item?.OrderRate,
TaxAmt: (
(item?.OrderQty * item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
WithoutTaxRate: (
item?.OrderQty * item?.OrderRate -
(item?.OrderQty * item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
},
...CartOrderDetails,
])
) // if the item is not in the cart, add the item to the cart
: dispatch(
changeOrderCardDetails([
...CartOrderDetails,
{
...item,
TotalAmt: item?.OrderQty * item?.OrderRate,
// TotalAmt: (((item?.OrderQty + 1) * item?.OrderRate)- (item?.OfferType === "F" ?item?.OfferPrice :(((item?.OrderQty + 1) * item?.OrderRate) * item?.OfferPrice)/100)),
TaxAmt: (
(item?.OrderQty * item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
WithoutTaxRate: (
item?.OrderQty * item?.OrderRate -
(item?.OrderQty * item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
},
])
);
} else {
BillOrderPre === 'Y'
? dispatch(
changeOrderCardDetails([
{
...item,
OrderQty: 1,
// TotalAmt: (((item?.OrderQty + 1) * item?.OrderRate)- (item?.OfferType === "F" ?item?.OfferPrice :(((item?.OrderQty + 1) * item?.OrderRate) * item?.OfferPrice)/100)),
OfferPrice: item?.OfferPrice,
TotalAmt:
item?.OfferPrice > 0
? item?.OrderRate -
(item?.OfferType === 'F'
? item?.OfferPrice
: (item?.OrderRate * item?.OfferPrice) / 100)
: item?.OrderRate,
TaxAmt: (
(item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
WithoutTaxRate: (
item?.OrderRate -
(item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
},
...CartOrderDetails,
])
) // if the item is not in the cart, add the item to the cart
: dispatch(
changeOrderCardDetails([
...CartOrderDetails,
{
...item,
OrderQty: 1,
// TotalAmt: (((item?.OrderQty + 1) * item?.OrderRate)- (item?.OfferType === "F" ?item?.OfferPrice :(((item?.OrderQty + 1) * item?.OrderRate) * item?.OfferPrice)/100)),
OfferPrice: item?.OfferPrice,
TotalAmt:
item?.OfferPrice > 0
? item?.OrderRate -
(item?.OfferType === 'F'
? item?.OfferPrice
: (item?.OrderRate * item?.OfferPrice) / 100)
: item?.OrderRate,
TaxAmt: (
(item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
WithoutTaxRate: (
item?.OrderRate -
(item?.OrderRate * item?.TaxPercentage) /
(100 + item?.TaxPercentage)
).toFixed(2),
},
])
);
}
}
dispatch(changeothersdata({}));
dispatch(ChangeNewQrProduct({}));
}
};
const CloseModal1 = () => {
setModelstock(false);
};
const returnCountStock = (ProdId, currentQty, orderDetails, InwardDtlId) => {
let SelectedProduct = ReorderProductData?.filter(
(a) => a?.ProdId === ProdId && a?.InwardDtlId === InwardDtlId
);
let totalSelectedProductQty = SelectedProduct?.reduce(
(accumulator, card) => {
return accumulator + parseInt(card.OrderQty || 0);
},
0
);
let getCurrentProdDtl = orderDetails?.filter(
(a) => a?.ProdId === ProdId && a?.InwardDtlId === InwardDtlId
);
let totalOrderQty = getCurrentProdDtl?.reduce((accumulator, card) => {
return accumulator + parseInt(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 stockdataSource = [];
let ProdId = qtydata?.[0]?.ComboId;
qtydata?.[0]?.ComboInwardDetails?.map((item, index) => {
stockdataSource.push({
key: index,
ComboInwardDtlId: item.ComboInwardDtlId,
StockCount: returnCountStock(
ProdId,
item.BalanceQty,
CartOrderDetails,
item?.ComboInwardDtlId
),
Price: item.TotalSellPrice,
});
});
const StockSelected = (item) => {
let Expdates = qtydata?.[0]?.ComboInwardDetails?.filter(
(a) => a.ComboInwardDtlId === item.ComboInwardDtlId
)?.[0]?.ComboDetails.map((detail) => detail.ExpDate);
let Combodata = qtydata?.[0]?.ComboInwardDetails?.filter(
(a) => a.ComboInwardDtlId === item.ComboInwardDtlId
)?.[0]?.ComboDetails;
let Cartdata = qtydata?.[0]?.ComboInwardDetails?.filter(
(a) => a.ComboInwardDtlId === item.ComboInwardDtlId
);
const today = new Date();
const matchingProducts = Combodata?.filter((detail) => {
if (detail.ExpDate != null) {
const expDate = new Date(detail.ExpDate);
return Expdates.includes(detail.ExpDate) && expDate < today;
} else {
return false;
}
})?.map((detail) => ({
ProdName: detail?.ProdName,
Size: detail?.Size,
UomName: detail?.UomName,
ExpDate: detail?.ExpDate,
}));
let data = {
Type: 'C',
OverallQuantity: qtydata?.[0]?.OverallQuantity,
ActiveStatus: qtydata?.[0]?.ActiveStatus,
AvailableFrom: qtydata?.[0]?.ValidFrom,
AvailableTo: qtydata?.[0]?.ValidTo,
ProdId: qtydata?.[0]?.ComboId,
ProdDetail: Combodata,
ProdName: qtydata?.[0]?.ComboName,
QRCode: qtydata?.[0]?.ComboInwardDetails?.[0]?.QRCode,
StockAvailable: 'Y',
BalanceQty: qtydata?.[0]?.ComboInwardDetails?.[0]?.BalanceQty,
InwardDtlId: Cartdata?.[0]?.ComboInwardDtlId,
MRP: qtydata?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice,
OrderRate: qtydata?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice,
SellingPrice: qtydata?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice,
BookingTypeName: BookingType,
TaxPercentage: 0,
Size: 1,
UomName: 'Combo',
OfferType: Cartdata?.[0]?.OfferType,
OfferValue:
Cartdata?.[0]?.OfferType === 'F'
? Cartdata?.[0]?.OfferPrice
: (qtydata?.[0]?.ComboInwardDetails?.[0]?.TotalSellPrice *
Cartdata?.[0]?.OfferPrice) /
100,
OfferPrice: Cartdata?.[0]?.OfferPrice,
SinglePc: 'N',
};
setExpdata(data);
setExpProd(matchingProducts);
if (matchingProducts?.length > 0) {
setexpModel(true);
} else if (expModel === false) {
AddOrderDetails(data);
} else {
onAutocompleteChange(Combodata);
}
setModelstock(false);
};
const expFun = (item) => {
AddOrderDetails(Expdata);
setexpModel(false);
setModelstock(false);
};
const handleSearch = async (value) => {
if (value === '') {
setDropDown();
}
// Call onChangeprodFunction if the value is not empty and doesn't include '@'
if (value && !value.includes('@')) {
await onChangeprodFunction(value);
}
// setOptions(() => {
// if (!value || value.includes('@')) {
// return [];
// }
return DropDown && Array.isArray(DropDown)
? DropDown.map((item) => ({
label: `${item.ComboName}`, // Display the combo name
value: `${item.ComboId}`, // Use combo ID as the value
}))
: [];
// });
};
// const stopScannerFromParent = () => {
// if (scannerRef.current) {
// scannerRef.current.stopScanner(); // Call stopScanner from the child component
// }
// };
// const handleQrcode = () => {
// setOpenScanner((prev) => !prev);
// if (!openScanner && scannerRef.current) {
// scannerRef.current.reinitializeCamera(); // Call the function to reinitialize the camera
// }
// };
// const handleQrData = (decodedText, err) => {
// onChangeprodFunction(decodedText);
// setOpenScanner(false); // Close the modal after scanning
// stopScannerFromParent();
// if (err && err?.error) {
// setMessageData(err?.error);
// setMessageType('error');
// }
// };
return (
<div className="L">
<Messages
messageType={messageType}
messageData={messageData}
onComplete={onComplete}
/>
<div>
<Form form={form}>
<div
className={props.nosearch == true ? 'search-input' : 'search-input'}
style={
props.nosearch == true
? {
border:
background == 'white' &&
'#fff' &&
'#ffff' &&
'rgb(1, 1, 1)'
? '1px solid #000'
: '1px solid #fff',
}
: {}
}
>
<Form.Item
name="ProdName"
// style={{ margin: '-17px 8px 0px -7px' }}
// rules={
// [{ required: true, message: 'Please enter Item Name' }]
// }
className="custom-search"
>
<div className="Combosearch" style={{ height: '3rem' }}>
<AutoComplete
className={
props.nosearch == true ? 'custom-input' : 'custom-input'
}
ref={searchInputRef}
onSearch={handleSearch}
placeholder="Search Combo Product (SHIFT + S)"
// filterOption={(inputValue, option) =>
// option.label.toLowerCase().includes(inputValue.toLowerCase()) ||
// option.value.toString().toLowerCase().includes(inputValue.toLowerCase())
// }
options={DropDown?.map((option) => ({
value: option.ComboName,
label: option.ComboName,
data: option.ComboId,
}))}
value={selectedprod}
onSelect={(value, option) =>
onSelectCombo(
DropDown?.filter((a, b) => a.ComboId == option.data)
)
}
onPressEnter={(e) => onChangeprodFunction(e?.target?.value)}
onChange={(value) => setselectedprod(value)}
suffix={
<TooltipWrapper
title="Search Combo Name"
isMobile={isMobile}
>
<SearchOutlined style={{ color: 'rgba(0,0,0,.45)' }} />
</TooltipWrapper>
}
/>
</div>
{isMobile && screenWidth <= 768 ? (
// <BiBarcodeReader
// className="search-icon"
// onClick={() => handleQrcode()}
// />
<BarCodeScan
onScan={(value) => {
onChangeprodFunction(value);
}} />
) : (
<IoSearchOutline className="search-icon" />
)}
</Form.Item>
</div>
</Form>
</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?.[0]?.ComboName}
{/* {!qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.ProdVariantName?.toLowerCase()?.includes('variant') && <span>({qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[VarientIndex]?.ProdVariantName}) </span>} */}
</p>
</div>
</div>
<div style={{ display: 'flex' }}>
<div className="EditQuantity-headingname">
<p className="EditQuantity-itemname">Item Quantity:</p>
</div>
<div
className="EditQuantity-headingproductname"
style={{ marginLeft: '1rem' }}
>
<p className="EditQuantity-productname">
{qtydata?.[0]?.ComboInwardDetails?.[0]?.ComboDetails?.map(
(item, index) => (
<div key={index} style={{}}>
<p>
{' '}
{index + 1}. {item.ProdName} ({item.Size}{' '}
{item.UomName}){' '}
</p>
</div>
)
)}
</p>
</div>
</div>
</div>
<div className="Re-Print-table">
<Tables columns={stockcolumns} data={stockdataSource} />
</div>
</div>
}
/>
)}
{expModel && (
<Modal
title={
<div style={{ display: 'flex', flexDirection: 'row', gap: '1rem' }}>
<ExclamationCircleOutlined
style={{ color: 'rgb(231 176 12)', fontSize: '30px' }}
/>
<h4>Product Expires</h4>
</div>
}
open={expModel}
onOk={(Item) => expFun(Item)}
onCancel={() => setexpModel(false)}
okText="Submit"
cancelText="Don't Submit"
maskTransitionName="" // Remove animation for the mask
transitionName=""
>
<div className="Re-Print-table">
<Tables columns={Prodcolumns} data={ExpProd} />
</div>
</Modal>
)}
{/* {isMobile && screenWidth <= 768 && (
<DefaultModal
title="Barcode Reader"
width={800}
open={openScanner}
footer={false}
handleCancel={handleQrData} // Close modal on cancel
>
{openScanner && (
<BarcodeScanner
ref={scannerRef}
openScanner={openScanner}
setOpenScanner={setOpenScanner}
handleQrData={handleQrData}
type="ComboSearch"
/>
)}
</DefaultModal>
)} */}
</div>
);
};
export default BSNavBarComboSearch;