Android_Retail/src/Pages/BookingScreen/Components/BSBillingTables/StandardTable/StandardTablePaymentBackup.jsx

2631 lines
113 KiB
JavaScript

import { FaMoneyBillWave, FaPrint, FaWhatsapp } from "react-icons/fa";
import { FaMobileScreenButton } from "react-icons/fa6";
import moment from 'moment';
import { FaCreditCard } from "react-icons/fa6";
import {
changeBookingType,
ChangeComboCarddata, changeCustomerID, ChangeNavHoldData, changeOrderCardDetails,
changeOrderType, changeOtherServiceTicketClaim, ChangeOverAllDiscEstimate,
ChangeOverAllDiscSales, changePaymentloader, changePaymentTransactionNumber,
changeReorderHoldDetails, changeReorderProductDetails, changeSelectChair,
changeSelectedCustId, changeSelectedOption, changeSelectedTableDetails, changeSelectTable,
changeSelProdWiseEst, changeSummeryComboOfferAmount, changeSummeryTotalAmount, changeTipAmount, changeUpiIDName, changeUpiIDoptionId, changeUpiIDprint,
getCardDataWithoutSub, getCardDataWithoutSubmodule, getConfigType, getLayoutproductCard,
GetPaymentdeviceResponse, getSalesDetailData, getSelectedFavItems, getUnpaidData,
GlobalBookingType, GlobalBookingTypeBoth, GlobalComboOfferAmount, GlobalCommonPaymentOptions,
GlobalCustId,
GlobalEstimateBooking, GlobalFailedTotalAmt, GlobalNavHoldData, GlobalOrderCardDetails,
GlobalOrderType, GlobalOtherServiceTicketClaim, GlobalOtherSevices, GlobalOverAllDiscEstimate,
GlobalOverAllDiscSales, GlobalPayementloader, GlobalProductCategorie, GlobalProductSubCategorie,
GlobalReorderHoldDetails, GlobalSelCustId, GlobalSelectedTableDetails, GlobalSelOption, GlobalSelProdWiseEst,
GlobalSummeryTotalItems, GlobaltipAmount, Globalunpaidflow, PaymentGatewayGetdetail, PostBookingData,
PostPaymentdevice, PreferenceData, PutBookingData, PutBookingPaymentStatusChange, PutPendingPaymentList,
putSplitpaymentStatus
} from '../../../../../Features/BookingScreen/BookingData/BookingData';
import { shallowEqual, useSelector } from 'react-redux';
import { Global_OrderOfferDetail, Global_OverallOfferAmount } from "../../../../../Features/Offer/Offer";
import { useCallback, useEffect, useState } from "react";
import { settingDataSelector } from "../../../../../Features/PreferenceMaster/PreferenceMaster";
import { getTemplateData, GlobalprintDatas, GlobalSelectedFont, SelectedPrintTemplate, StoredSessionData } from "../../../../../Features/ThemeChange/ThemeChange";
import { getCustomerDisplayWindow } from "../../../../../Features/customerDisplayWindow/customerDisplayWindow";
import { ChangeTotalAmount, globalExtraTotalAmount } from "../../../../../Features/ExteraCharges/ExtraCharges";
import { extractLastNumberOrderId } from "../../../../../Services/Others";
import { useDispatch } from "react-redux";
import { getPaymentOptionsData } from "../../../../../Features/BookingScreen/BookingData/KioskBookingData";
import { PostOtherServices } from "../../../../../Features/OtherServices/OtherServices";
import { getCombolist } from "../../../../../Features/ComboMaster/ComboMaster";
import paygate from '../../../../../Images/paygate.png';
import defaultupi from '../../../../../Images/defaultupi.png';
import paydevice from '../../../../../Images/paydevice.png';
import QrinScreen from '../../BookingFunctionality/DynamicScreenQr.jsx';
import { changeholddata, gettinghold } from "../../../../../Features/BookingScreen/HoldOption/HoldOption";
import { Tooltip } from "antd";
import { changeSalesPaymentoption, GlobalSalesPaymentoption } from "../../../../../Features/Payment/Paymentoptions/Paymentoptions";
import UpiPopover from "./Utils/UpiPopOver";
import { isMobile } from 'react-device-detect';
import { MobilePdfPrint } from "../../BookingFunctionality/MobilePdfPrint";
import IndividualTokenMobilePrint from "../../BookingFunctionality/IndividualTokenMobilePrint";
import SingleTokenMobilePrint from "../../BookingFunctionality/SingleTokenMobilePrint";
import MobilePrint from "../../BookingFunctionality/MobilePrint";
import { PrintStyleFunction } from "../../../../paymentpdfPage/PrintStyleFunction";
import { printDiv } from "../../../../../Services/WSOthers";
import { MdSms } from "react-icons/md";
import WhatsAppShare from "../../../../WhatsAppShare/whatsAppShare";
import SMSShare from "../../../../WhatsAppShare/SmsShare";
import { GlobalBookingStatus } from "../../../../../Features/Payment/PaymentReceivedRetail/PaymentReceivedRetail";
import { useAuth } from "../../../../../AuthContext";
import CountUp from "react-countup";
import { BiRightArrowAlt } from "react-icons/bi";
import { GlobalpreOrderOpen } from "../../../../../Features/BookingScreen/PreOrder/PreOrder";
import BsBillingCreditCustomer from "../../BookingFunctionality/BSBillingCreditCustomer";
import TokensinglePrint from "../../../../paymentpdfPage/TokenOnlyPrints/TokeninsinglePrint";
import PaymentPdfBooking from "../../../../paymentpdfPage/PaymentPdfBooking";
import { DefaultModal } from "../../../../../Components/Modal/DefaultModal";
import Buttons from "../../../../../Components/Forms/Buttons";
import { ArrowRightOutlined } from '@ant-design/icons';
import Paymentoption from "../../../../Payment/PaymentOptions/PaymentOptions";
import PozoSplitPaymentIcon from "../../UtillComponents/Pozo retail icons/PozoSplitPaymentIcon";
import SplitPayment from '../../BookingFunctionality/SplitPayment';
import BSCreditCustomer from "../../UtillComponents/BSCreditCustomer";
import PozoAdvanceIcon from "../../UtillComponents/Pozo retail icons/PozoAdvanceIcon";
import { GlobalAddCustomerDetails } from "../../../../../Features/BookingScreen/Customer/addCustomer";
import { useNavigate } from "react-router-dom";
import { ApplicationPreferences } from "../../../../../Features/BrachLogin/BranchLogin";
import PozoDineInIcon from "../../UtillComponents/Pozo retail icons/PozoDineIn";
import { Messages } from "../../../../../Components/Notifications/Messages";
const subDirectory = import.meta.env.BASE_URL;
const MainHomeUrl = import.meta.env.ENV_MAIN_BASE_URL;
const currentDateValue = moment().format('YYYY-MM-DD HH:mm:ss');
const StandardTablePayment = () => {
const { SadminuserAccess } = useAuth();
let SAAccessCommonMaster = SadminuserAccess?.find(
(e) => e?.MenuName === 'Sales'
);
const dispatch = useDispatch();
const navigate = useNavigate();
const SessionData = useSelector(StoredSessionData);
const BranchId = SessionData?.BranchId;
const AppId = SessionData?.AppId;
const CompId = SessionData?.CompId;
const UserId = SessionData?.UserId;
const UserType = SessionData?.UserType;
const FontFamily = useSelector(GlobalSelectedFont);
const prodCat = useSelector(GlobalProductCategorie);
const ProdSubCat = useSelector(GlobalProductSubCategorie);
const templateData = useSelector(getTemplateData);
const printerTemplateStyle = useSelector(SelectedPrintTemplate);
const printDatas = useSelector(GlobalprintDatas);
const ReportholdData = useSelector(GlobalReorderHoldDetails);
const FailedTotalAmt = useSelector(GlobalFailedTotalAmt);
const orderCardDetail = useSelector(GlobalOrderCardDetails);
const preOrder = useSelector(GlobalpreOrderOpen);
const OverallOfferAmount = useSelector(Global_OverallOfferAmount);
const SelectedTableDetails = useSelector(GlobalSelectedTableDetails);
const globalTipAmount = useSelector(GlobaltipAmount);
const GlobalExtraCharge = useSelector(globalExtraTotalAmount);
const GlobalSalesPaymentoptions = useSelector(GlobalSalesPaymentoption);
const Discount =
useSelector(Global_OverallOfferAmount) +
Number(useSelector(GlobalComboOfferAmount));
const OverAllSales = useSelector(GlobalOverAllDiscSales);
const OverAllEstimate = useSelector(GlobalOverAllDiscEstimate);
const OfferCheckedInSetup = templateData?.BookingNavbar?.[1].some(
(item) => item?.OptionName == 'Offer'
);
const BookingType = useSelector(GlobalBookingType);
const BookingTypeBoth = useSelector(GlobalBookingTypeBoth);
const preferenceDatas = useSelector(PreferenceData);
const preferenceDetails = preferenceDatas?.[0]?.SettingDtlDetails;
const OtherServiceTicketClaim = useSelector(GlobalOtherServiceTicketClaim);
const NavHoldData = useSelector(GlobalNavHoldData);
const SettingDataSelector = useSelector(settingDataSelector);
const [SelectedBookingType, setSelectedBookingType] = useState(null);
const GlobaluseOptions = useSelector(GlobalCommonPaymentOptions);
const SelCustId = useSelector(GlobalSelCustId);
const OrderOfferDetail = useSelector(Global_OrderOfferDetail, shallowEqual);
const GlobProdwisedata = useSelector(GlobalSelProdWiseEst);
const GlobEstBooking = useSelector(GlobalEstimateBooking);
const OtherServicesglobal = useSelector(GlobalOtherSevices);
const OrderType = useSelector(GlobalOrderType);
const unpaidFlow = useSelector(Globalunpaidflow);
const selOption = useSelector(GlobalSelOption);
const paymentloader = useSelector(GlobalPayementloader);
const BookingStatus = useSelector(GlobalBookingStatus);
const GlobalAddCustomerDetails1 = useSelector(GlobalAddCustomerDetails);
const GetCustId = useSelector(GlobalCustId);
const appPreferences = useSelector(ApplicationPreferences);
const bookingTypePreference = appPreferences?.find((preference) => preference?.PreferredCatName === 'Booking Type')?.PreferenceCatDetails
const dinePreference = bookingTypePreference?.find((type) => type?.PreferredSubCatName?.toLowerCase() === "dine in" && type?.PreferredStatus === 'Y')
const [blink, setBlink] = useState(false);
const [showWhatsAppShare, setShowWhatsAppShare] = useState(false);
const [showSMSShare, setSMSShare] = useState(false);
const [formattedDate, setFormattedDate] = useState('');
const [OrderStatus, setOrderStatus] = useState(true);
const [OtherServicesPrintDetails, setOtherServicesPrintDetails] = useState([]);
const [UpiOpen, setUpiOpen] = useState(false);
const [useOptions, setuseOptions] = useState([]);
const [PaymentOptions, setPaymentOptions] = useState([]);
const [addnewAccess, setaddnewAccess] = useState(true);
const [empData, setEmpData] = useState();
const [paybtnselected, setPaybtnselected] = useState(
PaymentOptions?.[0]?.ModeId
);
const [Paybtnnameselected, setPaybtnnameselected] = useState(
PaymentOptions?.[0]?.ModeName
);
const [payBtns, setPayBtns] = useState();
console.log(payBtns, "payBtnspayBtns")
const [creditCustomerOpen, setcreditCustomerOpen] = useState(false);
const [Splitpayment, setSplitpayment] = useState(false);
const [PrintOrderDetails, setPrintOrderDetails] = useState([]);
const [PaymentUpiOptions, setPaymentUpiOptions] = useState([]);
const [PaymentDeviceCard, setPaymentDeviceCard] = useState([]);
const [SelectedCardOption, setSelectedCardOption] = useState(null);
const [PaymentgatewayCard, setPaymentgatewayCard] = useState([]);
const [PaymentgatewayUPI, setPaymentgatewayUPI] = useState([]);
const [PaymentDeviceUPI, setPaymentDeviceUPI] = useState([]);
const [ConfigDataList, setConfigDataList] = useState([]);
const [TotalAmount, setTotalAmount] = useState(0);
const [FirstPaymentclick, setFirstPaymentclick] = useState(false);
const [UpinotSelected, setUpinotSelected] = useState(false);
const [brachName, setbrachName] = useState('');
const [messageType, setMessageType] = useState(null);
const [messageData, setMessageData] = useState(null);
const [UpiOptionOpen, setUpiOptionOpen] = useState(false);
const [SelectedUpiOption, setSelectedUpiOption] = useState();
const [UpiOption, setUpiOption] = useState('');
const [UpiId, setUpiId] = useState();
const [Success, SetSuccess] = useState();
const [qrCode, setQrCode] = useState(false);
const [CardoptionnotSelected, setCardoptionnotSelected] = useState(false);
const [CreditCustomer, setCreditCustomer] = useState(false);
const [UpiPayOption, setUpiPayOption] = useState([]);
const [SelectedUPIPayOption, setSelectedUPIPayOption] = useState('Default');
const [CardPayOption, setCardPayOption] = useState([]);
const [MobileNoWhatsApp, setMobileNoWhatsApp] = useState();
const allowedNames = ['whatsapp', 'Print', 'SMS'];
const allowDecimal = preferenceDetails?.find((setting) =>
setting?.SettingIdName?.toLowerCase() === "decimal"
&& setting?.SettingValue === 'Y'
);
const filteredSettingNames = preferenceDetails?.filter((item) =>
allowedNames.includes(item?.SettingIdName)
&& item?.SettingValue === 'Y'
)?.map((item) => item?.SettingIdName);
const preferenceOffer = preferenceDetails?.find(
(item) => item.SettingIdName === 'Offer'
)?.SettingValue === 'Y';
const UomPrint = preferenceDetails?.filter(
(i) => i.SettingIdName === 'PrintUom'
)?.[0];
const Estimation = preferenceDetails?.find(
(item) => item.SettingIdName == 'Estimation'
);
const MobileA4Print = preferenceDetails?.find(
(setting) => setting?.SettingIdName?.toLowerCase() === "mobilea4"
&& setting?.SettingValue === 'Y'
);
const TokenOnly = preferenceDetails?.filter(
(i) => i.SettingIdName === 'TokenOnly'
)?.[0];
const IndividualToken = preferenceDetails?.filter(
(i) => i.SettingIdName === 'AllProductindividualToken'
)?.[0];
const CheckOrderType = orderCardDetail?.filter(
(a) => a?.BookingTypeName !== BookingType
);
const CheckBookingStatus =
BookingStatus?.find((item) => item.ScreenType === 'Booking')
?.ScreenStatus ?? 'Open';
const orderIdsArray =
PrintOrderDetails?.[0]?.OrderDetails?.map(
(orderDetail) => orderDetail?.OrderId
) || [];
const customerNameOrMobile = MobileNoWhatsApp?.CustName?.trim()
? `Dear ${MobileNoWhatsApp?.CustName}`
: `Dear ${MobileNoWhatsApp?.value}`;
const documentUrl = `${MainHomeUrl}viewbill?code=${orderIdsArray}`;
const encodedMessage = `${customerNameOrMobile},\n\n🙏 Thank you for being a valuable customer!\n\n🧾 To view your bill, please click the link below:\n${documentUrl}`;
const isDisabled =
(BookingType === 'Dine In' || BookingTypeBoth || CheckOrderType?.length > 0) &&
!unpaidFlow &&
OrderStatus;
const formatAmount = (value) => {
return allowDecimal ? parseFloat(value || 0).toFixed(2) : Math.round(value || 0);
};
console.log(BookingType, BookingTypeBoth, CheckOrderType, unpaidFlow, 'ffffffffffff')
useEffect(() => {
if (NavHoldData) {
AddBookingDetails('Hold');
}
}, [NavHoldData]);
useEffect(() => {
let hasAccess = false;
if (UserType === 'Admin' || UserType === 'Super Admin') {
hasAccess = true;
} else if (UserType === 'Employee') {
hasAccess = empData?.AddAccess === 'Y';
} else if (UserType === 'Super Admin User') {
hasAccess = SAAccessCommonMaster?.AddAccess === 'Y';
}
setaddnewAccess(!hasAccess);
}, [empData, SAAccessCommonMaster, UserType]);
useEffect(() => {
if (selOption) {
closePrintOption();
setMobileNoWhatsApp(selOption);
}
}, [selOption]);
useEffect(() => {
const handleKeyPress = (event) => {
if (event.key === 'F4' && isButtonActive() && !isF4Pressed.current) {
isF4Pressed.current = true;
// BranchFinancialStatus==='N'? financialYearError():
handleButtonClick();
setTimeout(() => {
isF4Pressed.current = false; // Reset after a short delay
}, 1000);
}
};
window.addEventListener('keydown', handleKeyPress);
return () => {
window.removeEventListener('keydown', handleKeyPress);
};
}, [
FirstPaymentclick,
orderCardDetail,
paybtnselected,
OrderStatus,
qrCode,
SelectedUPIPayOption,
TotalAmount,
SelectedUpiOption,
SelectedCardOption,
]);
useEffect(() => {
const handleKeyPress = (event) => {
if (event.shiftKey && event.code === 'KeyM') {
if (
document.activeElement.tagName !== 'INPUT' &&
document.activeElement.tagName !== 'TEXTAREA'
) {
event.preventDefault();
setBlink(true);
}
}
};
const handleClickOutside = (event) => {
setBlink(false);
};
window.addEventListener('keydown', handleKeyPress);
window.addEventListener('mousedown', handleClickOutside);
return () => {
window.removeEventListener('keydown', handleKeyPress);
window.addEventListener('mousedown', handleClickOutside);
};
}, []);
useEffect(() => {
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setQrCode(false);
}, [PaymentOptions]);
useEffect(() => {
if (!preOrder) {
const totalSum = orderCardDetail?.reduce((acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), 0);
const extra = GlobalExtraCharge?.reduce((acc, obj) => acc + (obj.TotalAmt || 0), 0);
let withComboSum = 0;
const withComboOffer_CardDetail = orderCardDetail?.filter(item => item.Type === 'C');
if (withComboOffer_CardDetail?.length > 0) {
withComboSum = formatAmount(
withComboOffer_CardDetail.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty - card.TotalAmt || 0),
0
)
);
}
let Total = (extra === undefined
? totalSum - OverallOfferAmount - withComboSum
: totalSum + extra - OverallOfferAmount - withComboSum
);
// Subtract OtherServiceTicketClaim?.totalTicketamount if present and > 0
if (OtherServiceTicketClaim?.TotalAmt > 0) {
if ((Total - OtherServiceTicketClaim.TotalAmt) > 0) {
Total -= OtherServiceTicketClaim.TotalAmt;
} else {
dispatch(changeOtherServiceTicketClaim({
TicketId: null,
TotalAmt: 0,
ParkingClaimed: false,
ServiceCategory: null,
}));
}
} else if (OtherServiceTicketClaim?.OtherType == "Remove") {
dispatch(changeOtherServiceTicketClaim({
TicketId: null,
TotalAmt: 0,
ParkingClaimed: false,
ServiceCategory: null,
}));
}
let withdiscTotal = Total - ((OverAllSales || 0) + (OverAllEstimate || 0));
setTotalAmount(
formatAmount(
withdiscTotal > 0
? (Number(withdiscTotal) + Number(globalTipAmount)).toFixed(2)
: (Number(Total) + Number(globalTipAmount)).toFixed(2)
)
);
dispatch(
changeSummeryTotalAmount(
formatAmount(withdiscTotal > 0 ? withdiscTotal : Number(Total))
)
);
dispatch(changeSummeryComboOfferAmount(withComboSum));
if (withdiscTotal <= 0) {
dispatch(ChangeOverAllDiscSales(0));
dispatch(ChangeOverAllDiscEstimate(0));
}
} else {
setTotalAmount(0);
dispatch(changeSummeryTotalAmount(0));
dispatch(changeSummeryComboOfferAmount(0));
}
}, [orderCardDetail, GlobalExtraCharge, OverAllSales, OverAllEstimate, globalTipAmount, OtherServiceTicketClaim]);
useEffect(() => {
if (
PrintOrderDetails?.length > 0 &&
(!filteredSettingNames ||
filteredSettingNames?.includes('Print') ||
filteredSettingNames?.length === 0) &&
(
(!filteredSettingNames?.includes('whatsapp') &&
(!isMobile || !filteredSettingNames?.includes('SMS'))) ||
(
(filteredSettingNames?.includes('whatsapp') ||
(isMobile && filteredSettingNames?.includes('SMS'))) &&
(!MobileNoWhatsApp || Object.keys(MobileNoWhatsApp).length === 0)
)
)
) {
handlePrintOrToken();
}
}, [PrintOrderDetails]);
useEffect(() => {
getPaymentOptionFeature();
getBookingTypeId();
}, [])
useEffect(() => {
getPaymentOptionFeature();
}, [GlobaluseOptions]);
useEffect(() => {
getBookingTypeId();
}, [BookingType])
useEffect(() => {
if (SelCustId) {
setPayBtns(PaymentOptions);
} else {
const withoutCustomer = PaymentOptions?.filter?.(
(item) => item?.ModeName?.toLowerCase() !== 'credit'
);
setPayBtns(withoutCustomer);
}
}, [PaymentUpiOptions, PaymentOptions, SelCustId]);
useEffect(() => {
if (
(BookingType === 'Dine In' ||
BookingTypeBoth ||
CheckOrderType?.length > 0) &&
!unpaidFlow
) {
setOrderStatus(true);
} else {
setOrderStatus(false);
}
}, [BookingTypeBoth, BookingType, unpaidFlow]);
useEffect(() => {
if (UserType === 'Employee') {
fetchApi()
}
}, [UserType])
const isButtonActive = () => {
const baseCondition =
FirstPaymentclick === false &&
orderCardDetail?.length > 0 &&
paybtnselected &&
CheckBookingStatus !== 'Close';
let accessCondition = true;
if (UserType === 'Employee') {
accessCondition = empData?.AddAccess === 'Y';
} else if (UserType === 'Super Admin User') {
accessCondition = SAAccessCommonMaster?.AddAccess === 'Y';
}
return baseCondition && accessCondition;
};
const fetchApi = async () => {
let data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
EmpId: UserId,
};
let response = await dispatch(getEmpAccess(data)).unwrap();
let datas = response?.data?.data?.[0]?.EmpAccessDetails?.filter(
(item) => item.ConfigName === 'Sales'
);
setEmpData(datas?.[0]);
};
const handleButtonClick = () => {
if (qrCode && SelectedUPIPayOption === 'Default') {
UpiPayment();
} else {
OrderStatus
? AddBookingDetails('Dine-In', false)
: AddBookingDetails(BookingType, true);
}
};
const handleCreditCustomer = (type) => {
setCreditCustomer(false);
if (type == 'Submit') {
Booking(BookingType, true);
}
if (type == 'Cancel') {
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
}
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedRemovedData = {
type: 'remove',
keyValue: 'OrderTotalAmount',
};
customerDisplayWindow.postMessage(updatedRemovedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
};
const getBookingTypeId = async () => {
let tempconfigdata = await dispatch(
getConfigType({ TypeName: 'Booking Type' })
).unwrap();
if (tempconfigdata?.data?.statusCode == 1) {
setConfigDataList(tempconfigdata?.data?.data);
let configdata = tempconfigdata?.data?.data;
let checkName = BookingTypeBoth ? 'DineIn,TakeAway' : BookingType;
let filterconfigdata = configdata?.find(
(a) => a?.ConfigName === checkName
);
setSelectedBookingType(filterconfigdata?.ConfigId);
}
};
const UpiPayment = () => {
if (OrderStatus) {
AddBookingDetails('Dine-In', false);
} else {
if (SelectedUpiOption && TotalAmount == 0) {
Upimodel('Submit');
} else if (SelectedUpiOption) {
setUpiOpen(true);
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
OrderTotalAmount: TotalAmount,
};
customerDisplayWindow.postMessage(updatedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
} else {
setUpinotSelected(true);
setMessageType('error');
setMessageData('Please Select Upi Option');
}
}
};
const Upimodel = (type) => {
setUpiOpen(false);
if (type == 'Submit') {
AddBookingDetails(BookingType, true);
}
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedRemovedData = {
type: 'remove',
keyValue: 'OrderTotalAmount',
};
customerDisplayWindow.postMessage(updatedRemovedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
};
const AddBookingDetails = async (value, pay) => {
const customerDisplayWindow = getCustomerDisplayWindow();
const OnUpiSelected = PaymentOptions?.find(
(item) => item.ModeId === paybtnselected
);
if (
OnUpiSelected?.ModeName?.toLowerCase() === 'upi' &&
SelectedUPIPayOption?.toLowerCase() === 'default'
) {
SetSuccess(false);
setTimeout(function () {
SetSuccess(true);
// Add your state change code here
// For example:
// setNewState(newValue);
}, 3000);
if (SelectedUpiOption) {
Booking(value, pay);
} else {
setUpinotSelected(true);
setMessageType('error');
setMessageData('Please Select Upi Option');
}
}
else if (
OnUpiSelected?.ModeName?.toLowerCase() === 'card' &&
PaymentgatewayCard?.length > 0 &&
PaymentDeviceCard?.length > 0
) {
if (SelectedCardOption) {
if (SelectedCardOption?.toLowerCase() === 'pg') {
if (customerDisplayWindow && !customerDisplayWindow.closed) {
if (SelCustId) {
Booking(value, pay);
} else {
setMessageType('error');
setMessageData('Please Select Customer');
}
} else {
setMessageType('error');
setMessageData('Please Set the customer display');
}
} else {
Booking(value, pay);
}
} else {
setCardoptionnotSelected(true);
setMessageType('error');
setMessageData('Please Select Card Option');
}
} else if (OnUpiSelected?.ModeName?.toLowerCase() === 'credit') {
if (!SelCustId) {
setMessageType('error');
setMessageData('Please Select Customer');
} else {
setCreditCustomer(true);
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
OrderTotalAmount: TotalAmount,
};
customerDisplayWindow.postMessage(updatedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
}
} else if (
OnUpiSelected?.ModeName?.toLowerCase() === 'upi' &&
SelectedUPIPayOption?.toLowerCase() === 'pg'
) {
if (customerDisplayWindow && !customerDisplayWindow.closed) {
if (SelCustId) {
Booking(value, pay);
} else {
setMessageType('error');
setMessageData('Please Select Customer');
}
} else {
setMessageType('error');
setMessageData('Please Set the customer display');
}
} else if (
OnUpiSelected?.ModeName?.toLowerCase() === 'card' &&
SelectedCardOption?.toLowerCase() === 'pg'
) {
if (customerDisplayWindow && !customerDisplayWindow.closed) {
if (SelCustId) {
Booking(value, pay);
} else {
setMessageType('error');
setMessageData('Please Select Customer');
}
} else {
setMessageType('error');
setMessageData('Please Set the customer display');
}
} else {
Booking(value, pay);
}
};
const Booking = async (value, pay) => {
const TakAwayId = ConfigDataList?.find(
(a) => a?.ConfigName === 'TakeAway'
)?.ConfigId;
const DineinId = ConfigDataList?.find(
(a) => a?.ConfigName === 'Dine In'
)?.ConfigId;
setFirstPaymentclick(true);
let temporderdetail = orderCardDetail?.map((a) => ({
ProdId: a.ProdId,
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,
TaxId: a.TaxId,
ProdNameQty:
UomPrint?.SettingValue === 'N'
? `${a.ProdName} ${a.UomName?.toLowerCase() === 'half' ? '(Half)' : ''}`
: `${a.ProdName} ${a.Size} ${a.UomName}`,
OrderStatus: 'O',
OrderType:
BookingType === 'Dine In' ||
BookingTypeBoth ||
Estimation?.SettingValue == 'N'
? 'S'
: GlobEstBooking === 'OvrAllEst'
? 'E'
: GlobEstBooking === 'ParEst'
? GlobProdwisedata?.includes(
a.InwardDtlId + ' ' + a?.BookingTypeName
)
? 'E'
: 'S'
: 'S',
SinglePc: a.SinglePc,
BookingType: a.BookingTypeName === 'Dine In' ? DineinId : TakAwayId,
OfferValue: a?.Type === 'C' ? a?.OfferValue : a.Offer,
OfferAmt: a?.Type === 'C' ? a?.TotalAmt : a.Offer,
OfferType: a?.Type === 'C' ? a?.OfferType : '',
CounterName: a?.TokenAvailable === 'Y' ? a?.CounterName : null,
ProductIdentifierDtls: a.ProductIdentifierDtls,
ModelNumber: a.ModelNumber,
BatchRef: a.BatchRef,
}));
const NotSlectedTypeFind = temporderdetail?.find(
(a) => a?.BookingType != SelectedBookingType
);
const { totalwithouttax, totaltax } = orderCardDetail?.reduce(
(totals, card) => {
totals.totalwithouttax += parseFloat(card.WithoutTaxRate || 0);
totals.totaltax += parseFloat(card.TaxAmt || 0);
return totals;
},
{ totalwithouttax: 0, totaltax: 0 }
) || { totalwithouttax: 0, totaltax: 0 };
let updatedOfferDetails = OrderOfferDetail;
if (GlobEstBooking !== 'Sales') {
updatedOfferDetails = OrderOfferDetail?.filter(
(item) =>
!(
item.TableName === 'LoyaltyPoints' &&
item.TableUniqueName === 'UniqueId' &&
item.Type === 'A'
)
);
}
let temppostdata = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
OrderDate: formattedDate,
OrderType:
Object.keys(ReportholdData)?.length > 0
? ReportholdData?.OrderType
: 'S',
CustSuppId: SelCustId ? SelCustId : null,
Reference: 'test',
BookingType:
NotSlectedTypeFind && !BookingTypeBoth
? NotSlectedTypeFind?.BookingType
: SelectedBookingType,
ServiceProvider: 0,
ActiveStatus: 'A',
CreatedBy: UserId,
AddlInfo: 'test',
BillAmount: totalwithouttax.toFixed(2),
OverallDiscSales: OverAllSales > 0 ? OverAllSales : 0,
OverallDiscEst: OverAllEstimate > 0 ? OverAllEstimate : 0,
TaxAmount: totaltax.toFixed(2),
VatAmount: 0,
NetAmount: Math.round(TotalAmount),
PaymentType:
Paybtnnameselected?.toLowerCase() === 'upi'
? SelectedUPIPayOption?.toLowerCase() === 'pd'
? PaymentDeviceUPI?.[0]?.ModeId
: SelectedUPIPayOption?.toLowerCase() === 'pg'
? PaymentgatewayUPI?.[0]?.ModeId
: paybtnselected
: paybtnselected
? paybtnselected
: null,
GivenAmt: 0,
BalGiven: 0,
BookingMedia: 'DW',
RefundAmount: 0,
ServiceCategory: OtherServiceTicketClaim?.ServiceCategory || null,
OtherServiceTicketId: OtherServiceTicketClaim?.TicketId || null,
OtherServiceTicketAmount: OtherServiceTicketClaim?.TotalAmt || null,
PaymentStatus:
Paybtnnameselected?.toLowerCase() === 'cash'
? 'S'
: Paybtnnameselected?.toLowerCase() === 'credit'
? 'S'
: Paybtnnameselected?.toLowerCase() === 'upi' &&
SelectedUPIPayOption?.toLowerCase() === 'default'
? 'S'
: 'P',
OrderDtlDetails:
Object.keys(ReportholdData)?.length > 0
? ProductSummary(temporderdetail)
: temporderdetail,
// (BookingType === "Dine In" || BookingTypeBoth)
ExtraChargeDetails:
GlobalExtraCharge?.length > 0
? extrachargesbookingtype(GlobalExtraCharge)
: null,
SalesTableLinkDetails:
SelectedTableDetails?.length > 0 ? globalTipAmount === 0 ? SelectedTableDetails : SelectedTableDetails?.map(item => ({ ...item, "TipsAmount": globalTipAmount })) : null,
SalesPaymentType: 'normal',
PaymentDetail: [
{
PaymentType:
Paybtnnameselected?.toLowerCase() === 'upi'
? SelectedUPIPayOption?.toLowerCase() === 'pd'
? PaymentDeviceUPI?.[0]?.ModeId
: SelectedUPIPayOption?.toLowerCase() === 'pg'
? PaymentgatewayUPI?.[0]?.ModeId
: paybtnselected
: paybtnselected
? paybtnselected
: null,
Amount: Math.round(TotalAmount),
PaymentOptionType:
Paybtnnameselected?.toLowerCase() === 'cash'
? 'PC'
: Paybtnnameselected?.toLowerCase() === 'credit'
? 'PC'
: Paybtnnameselected?.toLowerCase() === 'card'
? SelectedCardOption
: Paybtnnameselected?.toLowerCase() === 'upi'
? SelectedUPIPayOption?.toLowerCase() === 'default'
? 'PC'
: SelectedUPIPayOption
: null,
ModeOfPayment:
SelectedUPIPayOption?.toLowerCase() === 'default'
? PaymentUpiOptions?.find((upipay) => upipay?.UPIId === UpiId)
?.UPIDetailId
: null,
AccountDtl:
Paybtnnameselected?.toLowerCase() === 'upi' &&
SelectedUPIPayOption?.toLowerCase() === 'default'
? useOptions?.[0]?.PaymentDetails?.Payatthecounter?.find(
(upipay) => upipay?.UPIId === UpiId
)
: (Paybtnnameselected?.toLowerCase() === 'upi' &&
SelectedUPIPayOption?.toLowerCase() === 'pd') ||
(Paybtnnameselected?.toLowerCase() === 'card' &&
SelectedCardOption?.toLowerCase() === 'pd')
? useOptions?.[0]?.PaymentDetails?.PaymentDevice
: (Paybtnnameselected?.toLowerCase() === 'upi' &&
SelectedUPIPayOption?.toLowerCase() === 'pg') ||
(Paybtnnameselected?.toLowerCase() === 'card' &&
SelectedCardOption?.toLowerCase() === 'pg')
? useOptions?.[0]?.PaymentDetails?.PaymentGateway
: [],
PaymentStatus:
Paybtnnameselected?.toLowerCase() === 'cash'
? 'S'
: Paybtnnameselected?.toLowerCase() === 'credit'
? 'S'
: Paybtnnameselected?.toLowerCase() === 'upi' &&
SelectedUPIPayOption?.toLowerCase() === 'default'
? 'S'
: 'P',
Debit: 0,
Credit:
Paybtnnameselected?.toLowerCase() === 'credit'
? Math.round(TotalAmount)
: 0,
},
],
OrderOfferDetail: updatedOfferDetails,
};
let PostData = temppostdata;
if (value === 'Dine-In') {
PostData['PaymentStatus'] = pay ? 'S' : 'P';
PostData['PaymentDetail'] = !pay && [];
PostData['PaymentType'] = !pay && '';
} else if (value === 'Hold') {
(PostData['PaymentStatus'] = pay ? 'S' : 'P'),
(PostData['PaymentDetail'] = !pay && []);
PostData['PaymentType'] = !pay && '';
PostData['ActiveStatus'] = pay ? 'A' : 'D';
} else if (value === 'Unpaid') {
PostData['PaymentStatus'] = pay ? 'S' : 'P';
PostData['PaymentDetail'] = !pay && [];
PostData['PaymentType'] = !pay && '';
PostData['PrintType'] = 'Y';
}
Object.keys(ReportholdData)?.length > 0
? OrderType === 'Failed'
? PutFailedPayment(PostData, value, pay)
: PutBooking(PostData, value, pay)
: !OtherServicesglobal ? PostBooking(PostData, value) : OtherServicePostBooking(PostData, value);
getstockbadge();
Combocarddata();
};
const PostBooking = async (PostData, value) => {
let response = await dispatch(PostBookingData(PostData)).unwrap();
if (response?.data?.statusCode == 1) {
let Paymentdevicefilter = response?.data?.PaymentOrderDtl?.filter(
(item) =>
item?.PaymentOptionType?.toLowerCase() === 'pd' &&
item?.PaymentStatus === 'P'
);
let PaymentGatewayfilter = response?.data?.PaymentOrderDtl?.filter(
(item) =>
item?.PaymentOptionType?.toLowerCase() === 'pg' &&
item?.PaymentStatus === 'P'
);
let PayatCounterfilter = response?.data?.PaymentOrderDtl?.filter(
(item) => item?.PaymentOptionType?.toLowerCase() === 'pc'
);
if (
PayatCounterfilter?.length === 1 ||
response?.data?.PaymentOrderDtl?.length === 0
) {
setMessageType('success');
setMessageData(
response?.data?.response +
' ' +
(response?.data?.OrderDetails?.length > 0
? response?.data?.OrderId &&
extractLastNumberOrderId(
response?.data?.OrderId,
response?.data?.OrderDetails?.[0]?.FYStatus
)
: '')
);
response?.data?.OrderDetails?.length > 0 &&
setPrintOrderDetails([response?.data]);
CustomerDisplay(value);
ClearAllGlobalStateDatas(value);
}
if (Paymentdevicefilter?.length === 1) {
if (
Paymentdevicefilter?.[0]?.PaymentOptionType?.toLowerCase() === 'pd'
) {
PaymentDeviceFlow(Paymentdevicefilter, value);
}
} else {
console.log('more pd data');
}
if (PaymentGatewayfilter?.length === 1) {
if (
PaymentGatewayfilter?.[0]?.PaymentOptionType?.toLowerCase() === 'pg'
) {
await dispatch(changePaymentloader(true));
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
OrderBookingId: PaymentGatewayfilter?.[0]?.OrderId,
Paymentgateway: true,
OrderPaymentId: PaymentGatewayfilter?.[0]?.PaymentOrderId,
OrderTotalAmount: PaymentGatewayfilter?.[0]?.Amount,
};
customerDisplayWindow.postMessage(updatedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
const checkPaymentStatus = async () => {
const intervalId = setInterval(async () => {
try {
let getpaymentgatewaydetail = await dispatch(
PaymentGatewayGetdetail(PaymentGatewayfilter?.[0]?.OrderId)
).unwrap();
if (getpaymentgatewaydetail?.data?.statusCode === 1) {
let paymentdataget =
getpaymentgatewaydetail?.data?.PaymentOrderDtl?.find(
(item) =>
item?.PaymentOrderId ===
PaymentGatewayfilter?.[0]?.PaymentOrderId
)?.PaymentStatus;
if (paymentdataget === 'S') {
setMessageType('success');
setMessageData('Payment Success');
await dispatch(changePaymentloader(false));
if (
getpaymentgatewaydetail?.data?.OrderDetails?.length > 0
) {
setPrintOrderDetails([getpaymentgatewaydetail?.data]);
CustomerDisplay(value);
ClearAllGlobalStateDatas(value);
}
clearInterval(intervalId); // Stop the loop when payment is successful
} else if (paymentdataget === 'F') {
setMessageType('error');
setMessageData('Payment Failed');
setFirstPaymentclick(false);
await dispatch(changePaymentloader(false));
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
clearInterval(intervalId); // Stop the loop when payment fails
CustomerDisplayRemovedData();
ClearAllGlobalStateDatas(value);
}
}
} catch (error) {
console.error('Error fetching payment details: ', error);
}
}, 3000); // Call the API every 3 seconds
};
// Call the function to start checking payment status
checkPaymentStatus();
}
}
else {
console.log('more pg data');
}
}
else {
setMessageType('error');
setMessageData(response?.data?.response);
setFirstPaymentclick(false);
}
};
const PutBooking = async (putdatas, value, pay) => {
let putdata = putdatas;
putdata['OrderId'] = ReportholdData?.OrderId;
putdata['SalesId'] = ReportholdData?.SalesId;
putdata['UpdatedBy'] = UserId;
if (value === 'Dine-In') {
putdata['PaymentStatus'] = pay ? 'S' : 'P';
putdata['PaymentDetail'] = !pay && [];
putdata['PaymentType'] = !pay && '';
} else if (value === 'Hold') {
(putdata['PaymentStatus'] = pay ? 'S' : 'P'),
(putdata['PaymentDetail'] = !pay && []);
putdata['PaymentType'] = !pay && '';
putdata['ActiveStatus'] = pay ? 'A' : 'D';
} else if (value === 'Unpaid') {
putdata['PaymentStatus'] = pay ? 'S' : 'P';
putdata['PaymentDetail'] = !pay && [];
putdata['PaymentType'] = !pay && '';
putdata['PrintType'] = 'Y';
}
let response = await dispatch(PutBookingData(putdata)).unwrap();
if (value !== 'Unpaid') {
if (response?.data?.statusCode == 1) {
let Paymentdevicefilter = response?.data?.PaymentOrderDtl?.filter(
(item) =>
item?.PaymentOptionType?.toLowerCase() === 'pd' &&
item?.PaymentStatus === 'P'
);
let PaymentGatewayfilter = response?.data?.PaymentOrderDtl?.filter(
(item) =>
item?.PaymentOptionType?.toLowerCase() === 'pg' &&
item?.PaymentStatus === 'P'
);
let PayatCounterfilter = response?.data?.PaymentOrderDtl?.filter(
(item) => item?.PaymentOptionType?.toLowerCase() === 'pc'
);
if (
PayatCounterfilter?.length === 1 ||
response?.data?.PaymentOrderDtl?.length === 0
) {
setMessageType('success');
setMessageData(
response?.data?.response +
' ' +
(response?.data?.OrderDetails?.length > 0
? response?.data?.OrderId &&
extractLastNumberOrderId(
response?.data?.OrderId,
response?.data?.OrderDetails?.[0]?.FYStatus
)
: '')
);
response?.data?.OrderDetails?.length > 0 &&
setPrintOrderDetails([response?.data]);
CustomerDisplay(value);
ClearAllGlobalStateDatas(value);
}
if (Paymentdevicefilter?.length === 1) {
if (
Paymentdevicefilter?.[0]?.PaymentOptionType?.toLowerCase() === 'pd'
) {
PaymentDeviceFlow(Paymentdevicefilter, value);
}
} else {
console.log('more pd data');
}
if (PaymentGatewayfilter?.length === 1) {
PaymentGatewayFlow(PaymentGatewayfilter);
} else {
console.log('more pg data');
}
}
} else {
setPrintOrderDetails([response?.data]);
await dispatch(changeOrderCardDetails([]));
await dispatch(changeReorderHoldDetails({}));
await dispatch(changeReorderProductDetails([]));
setFirstPaymentclick(false);
await dispatch(changeBookingType('TakeAway'));
await dispatch(changeSelectTable([]));
await dispatch(changeSelectChair([]));
getUnpaiddatas();
}
};
const PutFailedPayment = async (PayData, value, pay) => {
let tempsplitdata = {
CompId: PayData?.CompId,
BranchId: PayData?.BranchId,
AppId: PayData?.AppId,
CustSuppId: PayData?.SelCustId ? SelCustId : null,
UpdatedBy: UserId,
OrderId: ReportholdData?.OrderId,
PaymentType: PayData?.PaymentDetail?.[0]?.PaymentType,
Amount: FailedTotalAmt,
PaymentOptionType: PayData?.PaymentDetail?.[0]?.PaymentOptionType,
ModeOfPayment: PayData?.PaymentDetail?.[0]?.ModeOfPayment,
AccountDtl: PayData?.PaymentDetail?.[0]?.AccountDtl,
PaymentStatus: PayData?.PaymentDetail?.[0]?.PaymentStatus,
Debit: PayData?.PaymentDetail?.[0]?.Debit,
Credit: PayData?.PaymentDetail?.[0]?.Credit,
};
let response = await dispatch(
putSplitpaymentStatus(tempsplitdata)
).unwrap();
if (response?.data?.statusCode == 1) {
let Paymentdevicefilter = response?.data?.PaymentOrderDtl?.filter(
(item) =>
item?.PaymentOptionType?.toLowerCase() === 'pd' &&
item?.PaymentStatus === 'P'
);
let PaymentGatewayfilter = response?.data?.PaymentOrderDtl?.filter(
(item) =>
item?.PaymentOptionType?.toLowerCase() === 'pg' &&
item?.PaymentStatus === 'P'
);
let PayatCounterfilter = response?.data?.PaymentOrderDtl?.filter(
(item) =>
item?.PaymentOptionType?.toLowerCase() === 'pc' &&
item?.PaymentType === PayData?.PaymentDetail?.[0]?.PaymentType
);
if (
PayatCounterfilter?.length > 0 ||
response?.data?.PaymentOrderDtl?.length === 0
) {
setMessageType('success');
// setSplitSelPayMode({...SplitSelPayMode,...{[`PaymentStatus-${i}`]:"S"}})
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
upi: null,
};
customerDisplayWindow.postMessage(updatedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
setMessageData(
response?.data?.response +
' ' +
(response?.data?.OrderDetails?.length > 0
? response?.data?.OrderId &&
extractLastNumberOrderId(
response?.data?.OrderId,
response?.data?.OrderDetails?.[0]?.FYStatus
)
: '')
);
if (response?.data?.OrderDetails?.length > 0) {
setPrintOrderDetails([response?.data]);
CustomerDisplay();
ClearAllGlobalStateDatas();
}
}
if (Paymentdevicefilter?.length === 1) {
if (
Paymentdevicefilter?.[0]?.PaymentOptionType?.toLowerCase() === 'pd'
) {
PaymentDeviceFlow(Paymentdevicefilter, value);
}
}
if (PaymentGatewayfilter?.length === 1) {
if (
PaymentGatewayfilter?.[0]?.PaymentOptionType?.toLowerCase() === 'pg'
) {
PaymentGatewayFlow(PaymentGatewayfilter, value);
}
}
}
};
const OtherServicePostBooking = async (PostData, value) => {
console.log(PostData, value, "PostData, value");
let postdata = {
"AppId": AppId,
"CompId": CompId,
"BranchId": BranchId,
"BillAmount": PostData?.BillAmount,
"TaxAmount": PostData?.TaxAmount,
"NetAmount": PostData?.NetAmount,
"OtherServicesTicketDetails": orderCardDetail.map((item) => ({
ServiceId: item.ServiceId,
ServiceCategory: item.ServiceCategory,
VehicleNumber: item.VehicleNo || "",
Qty: item.OrderQty,
Rate: item.Rate,
TaxAmount: item.TaxAmt,
TotalAmount: item.TotalAmt
})),
PaymentDetail: PostData?.PaymentDetail,
"CreatedBy": UserId
}
let Response = await dispatch(PostOtherServices(postdata)).unwrap();
if (Response?.data?.statusCode == 1) {
setMessageType('success');
setMessageData(Response?.data?.response);
ClearAllGlobalStateDatas(value);
setOtherServicesPrintDetails([Response?.data?.OtherServicesTicketDetails?.[0]]);
}
console.log(postdata, "PostdataPostdataPostdata");
}
const getstockbadge = async () => {
let data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
};
await dispatch(getSelectedFavItems(data)).unwrap();
let data1 = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
ProdSubCat: ProdSubCat,
};
let data2 = {
compId: CompId,
branchId: BranchId,
appId: AppId,
prodCat: prodCat,
};
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 Combocarddata = async () => {
let data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
ActiveStatus: 'A',
};
let response = await dispatch(getCombolist(data)).unwrap();
let datas = response?.data?.data;
await dispatch(ChangeComboCarddata(datas));
if (response?.data?.statusCode === 1) {
// let Data = response?.data?.data
// let comboList = Data?.map((item, index) => ({
// ...item,
// id: `${item.ComboName || 'Combo'}-${index}`,
// ProdName:item?.ComboName,
// OverAllQty:item?.OverallQuantity
// }));
// setCombocardata(comboList);
}
};
const CustomerDisplay = (value) => {
const customerDisplayWindow = getCustomerDisplayWindow();
if (value == 'TakeAway') {
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
userData: [],
ExtraCharges: [],
Paymentgateway: false,
upioption1: 'okk',
type: 'remove',
keyValue: 'customer',
};
customerDisplayWindow.postMessage(updatedData, '*');
const updatedRemovedData = {
type: 'remove',
keyValue: 'OrderTotalAmount',
};
customerDisplayWindow.postMessage(updatedRemovedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
} else {
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
type: 'remove',
keyValue: 'customer',
};
customerDisplayWindow.postMessage(updatedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
}
};
const CustomerDisplayRemovedData = () => {
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
userData: [],
ExtraCharges: [],
Paymentgateway: false,
type: 'remove',
keyValue: 'customer',
};
customerDisplayWindow.postMessage(updatedData, '*');
const updatedRemovedData = {
type: 'remove',
keyValue: 'OrderTotalAmount',
};
customerDisplayWindow.postMessage(updatedRemovedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
};
const PaymentDeviceFlow = async (Paymentdevicefilter, value) => {
await dispatch(changePaymentloader(true));
await dispatch(
changePaymentTransactionNumber(Paymentdevicefilter?.[0]?.PaymentOrderId)
);
let paymentdetail = {
TransactionNumber: Paymentdevicefilter?.[0]?.PaymentOrderId,
SequenceNumber: 1,
AllowedPaymentMode:
Paymentdevicefilter?.[0]?.PaymentTypeName?.toLowerCase() === 'card'
? '1'
: Paymentdevicefilter?.[0]?.PaymentTypeName?.toLowerCase() === 'upi'
? '10'
: '',
Amount: `${parseInt(Paymentdevicefilter?.[0]?.Amount) * 100}`,
ClientID: useOptions?.[0]?.PDConfigDetails?.[0]?.ClientId,
StoreID: useOptions?.[0]?.PDConfigDetails?.[0]?.StoreId,
UserID: useOptions?.[0]?.PDConfigDetails?.[0]?.UserId,
MerchantID: useOptions?.[0]?.PDConfigDetails?.[0]?.MerchantId,
SecurityToken: useOptions?.[0]?.PDConfigDetails?.[0]?.SecurityToken,
IMEI: useOptions?.[0]?.PDConfigDetails?.[0]?.IMEI,
AutoCancelDurationInMinutes:
useOptions?.[0]?.PDConfigDetails?.[0]?.AutoCancelDurationInMinutes,
};
let apiresponse = await dispatch(PostPaymentdevice(paymentdetail)).unwrap();
if (apiresponse?.ResponseMessage?.toLowerCase() === 'approved') {
let pendingPaymentList = {
MerchantID: useOptions?.[0]?.PDConfigDetails?.[0]?.MerchantId,
SecurityToken: useOptions?.[0]?.PDConfigDetails?.[0]?.SecurityToken,
ClientID: useOptions?.[0]?.PDConfigDetails?.[0]?.ClientId,
StoreID: useOptions?.[0]?.PDConfigDetails?.[0]?.StoreId,
IMEI: useOptions?.[0]?.PDConfigDetails?.[0]?.IMEI,
PlutusTransactionReferenceId: apiresponse?.PlutusTransactionReferenceID,
PaymentOrderId: Paymentdevicefilter?.[0]?.PaymentOrderId,
UpdatedBy: UserId,
};
await dispatch(PutPendingPaymentList(pendingPaymentList)).unwrap();
let isApproved = false;
const startTime = Date.now();
let postpaymentdata = {
MerchantID: useOptions?.[0]?.PDConfigDetails?.[0]?.MerchantId,
SecurityToken: useOptions?.[0]?.PDConfigDetails?.[0]?.SecurityToken,
ClientID: useOptions?.[0]?.PDConfigDetails?.[0]?.ClientId,
StoreID: useOptions?.[0]?.PDConfigDetails?.[0]?.StoreId,
IMEI: useOptions?.[0]?.PDConfigDetails?.[0]?.IMEI,
PlutusTransactionReferenceID: apiresponse?.PlutusTransactionReferenceID,
};
// Loop to call the second API every 3 seconds
while (!isApproved) {
let ApiResponseget = await dispatch(
GetPaymentdeviceResponse(postpaymentdata)
).unwrap();
if (ApiResponseget?.ResponseMessage?.toLowerCase() === 'txn approved') {
let putbookingdata = {
OrderBookingId: Paymentdevicefilter?.[0]?.OrderId,
OrderId: Paymentdevicefilter?.[0]?.PaymentOrderId,
PaymentStatus: 'S',
Amount: Paymentdevicefilter?.[0]?.Amount,
ResponseDtl: [ApiResponseget],
PaymentType: Paymentdevicefilter?.[0]?.PaymentType,
UpdatedBy: UserId,
};
let bookingpaymentupdate = await dispatch(
PutBookingPaymentStatusChange(putbookingdata)
).unwrap();
if (bookingpaymentupdate?.data?.statusCode === 1) {
setMessageType('success');
setMessageData(
bookingpaymentupdate?.data?.response +
' ' +
(bookingpaymentupdate?.data?.OrderDetails?.length > 0
? bookingpaymentupdate?.data?.OrderId &&
extractLastNumberOrderId(
bookingpaymentupdate?.data?.OrderId,
bookingpaymentupdate?.data?.OrderDetail?.[0]?.FYStatus
)
: '')
);
bookingpaymentupdate?.data?.OrderDetails?.length > 0 &&
setPrintOrderDetails([bookingpaymentupdate?.data]);
CustomerDisplay(value);
ClearAllGlobalStateDatas(value);
await dispatch(changePaymentloader(false));
}
isApproved = true;
console.log('Transaction Approved!');
// Exit the loop
break;
}
// Check if 1 minute has passed
if (
Date.now() - startTime >
useOptions?.[0]?.PDConfigDetails?.[0]?.AutoCancelDurationInMinutes *
60000
) {
// 60,000 ms = 1 minute
let putbookingdata = {
OrderBookingId: Paymentdevicefilter?.[0]?.OrderId,
OrderId: Paymentdevicefilter?.[0]?.PaymentOrderId,
PaymentStatus: 'F',
Amount: Paymentdevicefilter?.[0]?.Amount,
ResponseDtl: [ApiResponseget],
PaymentType: Paymentdevicefilter?.[0]?.PaymentType,
UpdatedBy: UserId,
};
let bookingpaymentupdate = await dispatch(
PutBookingPaymentStatusChange(putbookingdata)
).unwrap();
if (bookingpaymentupdate?.data?.statusCode === 1) {
setMessageType('error');
setMessageData(
`Payment Failed. Your Transaction Number is ${Paymentdevicefilter?.[0]?.PaymentOrderId}`
);
setFirstPaymentclick(false);
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
await dispatch(changePaymentloader(false));
CustomerDisplayRemovedData();
ClearAllGlobalStateDatas(value);
}
console.error('Transaction not approved within 1 minute.');
// Send an error message or handle the timeout
// You can dispatch an action, show a notification, etc.
break;
}
// Wait for 3 seconds before making the next call
await new Promise((resolve) => setTimeout(resolve, 3000));
}
} else {
let putbookingdata = {
OrderBookingId: Paymentdevicefilter?.[0]?.OrderId,
OrderId: Paymentdevicefilter?.[0]?.PaymentOrderId,
PaymentStatus: 'F',
Amount: Paymentdevicefilter?.[0]?.Amount,
PaymentType: Paymentdevicefilter?.[0]?.PaymentType,
UpdatedBy: UserId,
};
let bookingpaymentupdate = await dispatch(
PutBookingPaymentStatusChange(putbookingdata)
).unwrap();
if (bookingpaymentupdate?.data?.statusCode === 1) {
setMessageType('error');
setMessageData(apiresponse?.ResponseMessage);
setFirstPaymentclick(false);
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
dispatch(changePaymentloader(false));
CustomerDisplayRemovedData();
ClearAllGlobalStateDatas(value);
}
}
};
const PaymentGatewayFlow = async (PaymentGatewayfilter) => {
if (PaymentGatewayfilter?.[0]?.PaymentOptionType?.toLowerCase() === 'pg') {
await dispatch(changePaymentloader(true));
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
OrderBookingId: PaymentGatewayfilter?.[0]?.OrderId,
Paymentgateway: true,
OrderPaymentId: PaymentGatewayfilter?.[0]?.PaymentOrderId,
OrderTotalAmount: PaymentGatewayfilter?.[0]?.Amount,
};
customerDisplayWindow.postMessage(updatedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
const checkPaymentStatus = async () => {
const intervalId = setInterval(async () => {
try {
let getpaymentgatewaydetail = await dispatch(
PaymentGatewayGetdetail(PaymentGatewayfilter?.[0]?.OrderId)
).unwrap();
if (getpaymentgatewaydetail?.data?.statusCode === 1) {
let paymentdataget =
getpaymentgatewaydetail?.data?.PaymentOrderDtl?.find(
(item) =>
item?.PaymentOrderId ===
PaymentGatewayfilter?.[0]?.PaymentOrderId
)?.PaymentStatus;
if (paymentdataget === 'S') {
setMessageType('success');
setMessageData('Payment Success');
await dispatch(changePaymentloader(false));
if (getpaymentgatewaydetail?.data?.OrderDetails?.length > 0) {
setPrintOrderDetails([getpaymentgatewaydetail?.data]);
CustomerDisplay(value);
ClearAllGlobalStateDatas(value);
}
clearInterval(intervalId); // Stop the loop when payment is successful
} else if (paymentdataget === 'F') {
setMessageType('error');
setMessageData('Payment Failed');
await dispatch(changePaymentloader(false));
setFirstPaymentclick(false);
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
clearInterval(intervalId); // Stop the loop when payment fails
CustomerDisplayRemovedData();
ClearAllGlobalStateDatas(value);
// const customerDisplayWindow = getCustomerDisplayWindow();
// if (customerDisplayWindow && !customerDisplayWindow.closed) {
// const updatedData = {
// userData: orderCardDetail,
// ExtraCharges: GlobalExtraCharge,
// upi: GlobalUpiID,
// customer: selOption != null ? selOption : GetCustId,
// paymentMethod: Paybtnnameselected,
// Paymentgateway: false,
// OrderTotalAmount: PaymentGatewayfilter?.[0]?.Amount
// };
// customerDisplayWindow.postMessage(updatedData, '*');
// }
}
}
} catch (error) {
console.error('Error fetching payment details: ', error);
}
}, 3000); // Call the API every 3 seconds
};
// Call the function to start checking payment status
checkPaymentStatus();
}
};
const getPaymentOptionFeature = async () => {
const FiltersalesPayment = GlobaluseOptions?.filter(
(item) => item.FlowName?.toLowerCase() === 'sales'
);
setuseOptions(FiltersalesPayment);
const filterpaycounter = FiltersalesPayment?.[0]?.OptionDetails?.filter(
(item) => item?.OptionName?.toLowerCase() === 'pay at the counter'
);
const filterpaymentgateway = FiltersalesPayment?.[0]?.OptionDetails?.filter(
(item) => item?.OptionName?.toLowerCase() === 'payment gateway'
);
const filterpaymentdevice = FiltersalesPayment?.[0]?.OptionDetails?.filter(
(item) => item?.OptionName?.toLowerCase() === 'payment device'
);
const cardinpaymentgateway =
filterpaymentgateway?.[0]?.ModeDetails?.filter((item) =>
item?.ModeName?.toLowerCase()?.includes('card')
) || [];
const cardinpaymentdevice =
filterpaymentdevice?.[0]?.ModeDetails?.filter((item) =>
item?.ModeName?.toLowerCase()?.includes('card')
) || [];
const upiinpaymentgateway =
filterpaymentgateway?.[0]?.ModeDetails?.filter((item) =>
item?.ModeName?.toLowerCase()?.includes('upi')
) || [];
const upiinpaymentdevice =
filterpaymentdevice?.[0]?.ModeDetails?.filter((item) =>
item?.ModeName?.toLowerCase()?.includes('upi')
) || [];
setPaymentOptions(filterpaycounter?.[0]?.ModeDetails);
setPaymentUpiOptions(
FiltersalesPayment?.[0]?.PaymentDetails?.Payatthecounter
);
setPaymentDeviceCard(cardinpaymentdevice);
setPaymentgatewayCard(cardinpaymentgateway);
setPaymentgatewayUPI(upiinpaymentgateway);
setPaymentDeviceUPI(upiinpaymentdevice);
const cardoptions = [];
if (cardinpaymentgateway?.length > 0) {
cardoptions.push({
label: 'Payment Gateway',
value: 'PG',
imgSrc: paygate,
});
}
if (cardinpaymentdevice?.length > 0) {
cardoptions.push({
label: 'Payment Device',
value: 'PD',
imgSrc: paydevice,
});
}
setCardPayOption(cardoptions);
const options = [];
if (FiltersalesPayment?.[0]?.PaymentDetails?.Payatthecounter?.length > 0) {
options.push({
label: 'Default UPI',
value: 'Default',
imgSrc: defaultupi,
});
}
if (upiinpaymentgateway?.length > 0) {
options.push({ label: 'Payment Gateway', value: 'PG', imgSrc: paygate });
}
if (upiinpaymentdevice?.length > 0) {
options.push({ label: 'Payment Device', value: 'PD', imgSrc: paydevice });
}
setUpiPayOption(options);
// }
};
const ProductSummary = (salesData) => {
// Create a map to store the aggregated values for each unique product
const productMap = new Map();
// Iterate over the sales data to aggregate values
salesData.forEach((item) => {
const key = `${item.ProdId}-${item.InwardDtlId}-${item.BookingType}-${item.SinglePc}-${item.OrderRate}`;
if (productMap.has(key)) {
const existingItem = productMap.get(key);
existingItem.OrderQty += item.OrderQty || 0;
existingItem.TotalAmt += item.TotalAmt || 0;
existingItem.TaxAmt =
parseFloat(existingItem.TaxAmt) + parseFloat(item.TaxAmt) || 0;
} else {
// If the key doesn't exist, add a new entry
productMap.set(key, { ...item });
}
});
// Convert the map values back to an array
const aggregatedProducts = Array.from(productMap.values());
return aggregatedProducts;
};
const extrachargesbookingtype = (extradata) => {
const TakAwayId = ConfigDataList?.find(
(a) => a?.ConfigName === 'TakeAway'
)?.ConfigId;
const DineinId = ConfigDataList?.find(
(a) => a?.ConfigName === 'Dine In'
)?.ConfigId;
let tempdata = extradata?.map((data) => ({
...data,
BookingType: data?.BookingTypeName === 'Dine In' ? DineinId : TakAwayId,
}));
return tempdata;
};
const getUnpaiddatas = async () => {
let data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
};
await dispatch(getUnpaidData(data)).unwrap();
};
const AddUPIPaymentOption = async (data) => {
setSelectedUpiOption('');
setUpiOption('');
setUpiId('');
await dispatch(changeUpiIDprint(null));
await dispatch(changeUpiIDName(''));
await dispatch(changeUpiIDoptionId(null));
setSelectedUPIPayOption(data);
setUpinotSelected(false);
setCardoptionnotSelected(false);
if (data !== 'Default') {
setUpiOptionOpen(false);
}
};
const hideDefault = () => {
setUpiOptionOpen(false);
};
const handleUPIButtonClick = (id, name) => {
if (paymentloader === false) {
setPaybtnnameselected(name);
setPaybtnselected(id);
let brachName1 = PaymentUpiOptions?.[0]?.BrName;
setbrachName(brachName1);
if (UpiPayOption?.length === 1) {
setSelectedUPIPayOption(UpiPayOption?.[0]?.value);
if (UpiPayOption?.[0]?.value?.toLowerCase() === 'default') {
if (PaymentUpiOptions?.length === 1) {
addUpiOption(
PaymentUpiOptions?.[0]?.Mode,
PaymentUpiOptions?.[0]?.ModeName,
PaymentUpiOptions?.[0]?.UPIId
);
}
}
}
setQrCode(true);
SetSuccess(true);
}
};
const handlePaymentMode = (id, name) => {
if (paymentloader === false) {
setPaybtnselected(id);
setPaybtnnameselected(name);
if (CardPayOption?.length === 1) {
setSelectedCardOption(CardPayOption?.[0]?.value);
}
setUpiOptionOpen(false);
setQrCode(false);
setUpinotSelected(false);
setCardoptionnotSelected(false);
}
};
const addUpiOption = async (id, name, UPIId) => {
await dispatch(changeUpiIDprint(UPIId));
await dispatch(changeUpiIDName(name));
await dispatch(changeUpiIDoptionId(id));
setSelectedUpiOption(id);
setUpiOption(name);
setUpiId(UPIId);
setUpinotSelected(false);
setCardoptionnotSelected(false);
// setQrCode(true)
};
const ClearAllGlobalStateDatas = async (value) => {
if (OfferCheckedInSetup && preferenceOffer) {
await applyOffer([]);
} else {
dispatch(changeOrderCardDetails([]));
}
dispatch(changeOtherServiceTicketClaim({
TotalAmt: 0,
ParkingClaimed: false,
}));
dispatch(changeTipAmount(0));
await dispatch(ChangeTotalAmount([]));
await dispatch(changeReorderHoldDetails({}));
await dispatch(changeReorderProductDetails([]));
setFirstPaymentclick(false);
await dispatch(ChangeNavHoldData(false));
await dispatch(changeCustomerID(null));
await dispatch(changeSelectedCustId());
await dispatch(changeSelectedOption(null));
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
setQrCode(false);
setUpinotSelected(false);
getHolddata();
await dispatch(changeBookingType('TakeAway'));
await dispatch(changeSelProdWiseEst([]));
await dispatch(ChangeOverAllDiscSales(null));
await dispatch(ChangeOverAllDiscEstimate(null));
// await dispatch(changeEstimateBooking(null))
getstockbadge();
Combocarddata();
getUnpaiddatas();
await dispatch(changeSelectTable([]));
await dispatch(changeSelectChair([]));
await dispatch(changeSelectedTableDetails([]));
await dispatch(changeOrderType());
if (value === 'Dine-In') {
navigate(`${subDirectory}sales/dine-in`);
}
let data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
UserId: UserId,
FromDate: currentDateValue,
ToDate: currentDateValue,
};
await dispatch(getSalesDetailData(data));
};
const getHolddata = async () => {
const data = { CompId: CompId, BranchId: BranchId, AppId: AppId };
let response = await dispatch(gettinghold(data)).unwrap();
if (response?.data?.statusCode == 1) {
dispatch(changeholddata(response?.data?.data));
} else {
dispatch(changeholddata([]));
}
};
const handlePrintOrToken = async () => {
const dinein =
PrintOrderDetails?.[0]?.OrderDetails?.[0]?.productDetails?.some(
(product) => product.BookingTypeName === 'Dine In'
);
const Tokenthere =
PrintOrderDetails?.[0]?.OrderDetails?.[0]?.productDetails?.some(
(product) => product.TokenAvailable === 'Y'
);
if (isMobile) {
if (MobileA4Print) {
await MobilePdfPrint({
printerTemplateStyle,
printDatas,
PrintOrderDetails,
setPrintOrderDetails
});
} else {
if (Tokenthere && TokenOnly?.SettingValue === 'Y' && !dinein) {
if (IndividualToken?.SettingValue === 'Y' && !dinein) {
IndividualTokenMobilePrint(PrintOrderDetails, UpiId, 'Booking');
closePrintOption();
} else {
SingleTokenMobilePrint(PrintOrderDetails, UpiId, 'Booking');
closePrintOption();
}
} else {
MobilePrint(appPreferences, PrintOrderDetails, UpiId, 'Booking', SettingDataSelector);
closePrintOption();
}
}
} else {
if (Tokenthere && TokenOnly?.SettingValue === 'Y' && !dinein) {
AllProductTokenFunction();
} else {
Print();
}
}
};
const Print = async () => {
const style = await PrintStyleFunction(
printerTemplateStyle == undefined ? 'Style 13' : printerTemplateStyle,
'Sales'
);
const stylesMap = {
'Style 1': 'PrintStyle1',
'Style 2': 'PrintStyle2',
'Style 3': 'PrintStyle3',
'Style 4': 'PrintStyle4',
'Style 5': 'PrintStyle5',
'Style 6': 'PrintStyle6',
'Style 7': 'PrintStyle7',
'Style 8': 'PrintStyle8',
'Style 9': 'PrintStyle9',
'Style 10': 'PrintStyle10',
'Style 11': 'PrintStyle11',
'Style 12': 'PrintStyle12',
'Style 13': 'RePrint',
A4: 'PrintStyleA4',
A5: 'PrintStyleA5',
A4Standard: 'A4Standard',
};
const selectedStyle =
stylesMap[
printerTemplateStyle == undefined ? 'Style 13' : printerTemplateStyle
];
if (selectedStyle) {
await Promise.all(
PrintOrderDetails?.[0]?.OrderDetails?.map(
async (orderDetail, index) => {
await printDiv(`${selectedStyle}-${index}`, style); // Use unique IDs for each print
if (orderDetail?.BookingTypeName !== 'Dine In') {
const groupedTokens = orderDetail?.productDetails?.reduce(
(acc, item, idx) => {
if (item.TokenAvailable === 'Y') {
if (!item.CounterName) {
// If CounterName is null or empty
acc[`individual-${idx}`] = [item]; // Unique entry for each null/empty CounterName item
} else {
if (!acc[item.CounterName]) {
acc[item.CounterName] = [];
}
acc[item.CounterName].push(item); // Group by CounterName
}
}
return acc;
},
{}
);
// Iterate over grouped tokens and print them
const tokensToPrint = Object.entries(groupedTokens).map(
async ([counterName, items], idx) => {
// Use the counterName (or unique identifier for individual items) as part of the tokenId
const tokenId = `${idx}-${counterName}`;
await TokenPrint(tokenId, items); // Pass all grouped items to the print function
}
);
if (tokensToPrint?.length > 0) {
await Promise.all(tokensToPrint);
}
}
}
)
);
setPrintOrderDetails([]);
closePrintOption();
}
};
const AllProductTokenFunction = async () => {
if (IndividualToken?.SettingValue === 'Y') {
await Promise.all(
PrintOrderDetails?.[0]?.OrderDetails?.map(
async (orderDetail, index) => {
const groupedTokens = orderDetail?.productDetails?.reduce(
(acc, item, idx) => {
if (item.TokenAvailable === 'Y') {
if (!item.CounterName) {
// If CounterName is null or empty
acc[`single-${idx}`] = [item]; // Unique entry for each null/empty CounterName item
} else {
if (!acc[item.CounterName]) {
acc[item.CounterName] = [];
}
acc[item.CounterName].push(item); // Group by CounterName
}
}
return acc;
},
{}
);
// Iterate over grouped tokens and print them
const tokensToPrint = Object.entries(groupedTokens).map(
async ([counterName, items], idx) => {
// Use the counterName (or unique identifier for individual items) as part of the tokenId
const tokenId = `${idx}-${counterName}`;
await TokenPrint(tokenId, items); // Pass all grouped items to the print function
}
);
if (tokensToPrint?.length > 0) {
await Promise.all(tokensToPrint);
}
setPrintOrderDetails([]);
closePrintOption();
}
)
);
} else {
await Promise.all(
PrintOrderDetails?.[0]?.OrderDetails?.map(
async (orderDetail, index) => {
await TokenPrint(`${index}-${orderDetail?.OrderId}`);
}
)
);
setPrintOrderDetails([]);
closePrintOption();
}
};
const handlePaymentOptions = async () => {
dispatch(changeSalesPaymentoption(true));
dispatch(
getPaymentOptionsData({
AppId: AppId,
CompId: CompId,
BranchId: BranchId,
})
);
};
const closePrintOption = () => {
setShowWhatsAppShare(false);
setSMSShare(false);
setPrintOrderDetails([]);
setMobileNoWhatsApp();
};
const handleWhatsAppClick = () => {
setShowWhatsAppShare(true);
};
const handleSMSClick = () => {
setSMSShare(true);
};
const EnableUpiOptions = () => {
setUpiOptionOpen(!UpiOptionOpen);
};
function safeRound(amountStr) {
if (amountStr == null) return allowDecimal ? '0.00' : '0';
const cleaned = String(amountStr).replace(/[^0-9.-]+/g, '');
const num = Number(cleaned);
if (isNaN(num)) return allowDecimal ? '0.00' : '0';
return allowDecimal ? num.toFixed(2) : Math.round(num).toString();
}
const CreditCustomer1 = () => {
if (
orderCardDetail?.length === 0 &&
(selOption?.value !== undefined ||
GlobalAddCustomerDetails1?.length > 0 ||
GetCustId?.CustMobile !== undefined)
) {
setcreditCustomerOpen(true);
} else {
if (selOption?.value == undefined) {
setMessageType('warning');
setMessageData('Please Select the Customer');
}
}
};
const SplitPaymentOpen = () => {
if (orderCardDetail?.length > 0) {
// const updatedData = {
// userData: OrderCardDetail,
// ExtraCharges: GlobalExtraCharge,
// customer: selOption != null ? selOption : GetCustId,
// Paymentgateway: false,
// };
// setFailedOrderData(updatedData);
setSplitpayment(true);
} else {
setMessageType('warning');
setMessageData('Please Select the Product');
}
};
const CreditCustomerHAndleCancel = () => {
setcreditCustomerOpen(false);
};
const handlesplitpaymentclose = () => {
setSplitpayment(false);
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
const customerDisplayWindow = getCustomerDisplayWindow();
if (customerDisplayWindow && !customerDisplayWindow.closed) {
const updatedData = {
paymentMethod: PaymentOptions?.[0]?.ModeName,
Paymentgateway: false,
};
customerDisplayWindow.postMessage(updatedData, '*');
} else {
console.error(
'Customer display window is not available or has been closed.'
);
}
};
const onComplete = useCallback(() => {
setMessageData(null);
setMessageType(null);
}, []);
const changeOrderStatus = () => {
setOrderStatus(!OrderStatus);
setPaybtnnameselected(PaymentOptions?.[0]?.ModeName);
setPaybtnselected(PaymentOptions?.[0]?.ModeId);
};
return (
<div className='booking-table-footer'>
<Messages
messageType={messageType}
messageData={messageData}
onComplete={onComplete}
/>
<div className="paymentDetailsSection">
<div className="detailsSummarty-Title">
<div>Items :</div>
<p>{orderCardDetail?.length || 0}</p>
</div>
<div className="detailsSummarty-Title">
<div>Total Qty :</div>
<p>{orderCardDetail?.reduce((acc, data) => data?.OrderQty + acc, 0)}</p>
</div>
<div className="detailsSummarty-Title">
<div>MRP Total :</div>
<p>{orderCardDetail?.reduce((acc, data) => parseFloat(data?.TotalAmt || 0) + acc, 0)}</p>
</div>
<div className="detailsSummarty-Title1">
<div>Discount :</div>
<p>-{(OverAllSales > 0 ? OverAllSales : 0) +
(OverAllEstimate > 0 ? OverAllEstimate : 0) +
(Discount > 0 ? Discount : 0)}</p>
</div>
<div className="detailsTitle">
<div>Total :</div>
<p>{orderCardDetail?.reduce((acc, data) => parseFloat(data?.TotalAmt || 0) + acc, 0) - ((OverAllSales > 0 ? OverAllSales : 0) +
(OverAllEstimate > 0 ? OverAllEstimate : 0) +
(Discount > 0 ? Discount : 0))}</p>
</div>
</div>
<div style={{ display: 'flex', gap: '3rem' }}>
<div>
{' '}
<PozoAdvanceIcon
className="BSBillingNav-icon-table-icon"
onClick={CreditCustomer1}
style={{
cursor: orderCardDetail?.length > 0 && 'not-allowed',
color:
orderCardDetail?.length > 0 ||
(selOption?.value === undefined &&
GlobalAddCustomerDetails1?.length === 0 &&
GetCustId?.CustMobile === undefined)
? 'gray'
: 'rgb(18, 146, 238)',
fontSize: '28px',
}}
/>{' '}
</div>
{!OtherServicesglobal && (
<Tooltip title="Split Payment" isMobile={isMobile}>
{' '}
<div
className="BSBillingNav-icon-table-icon"
onClick={
CheckBookingStatus != 'Close' && !addnewAccess
? SplitPaymentOpen
: ''
}
style={{
width: '1.5rem',
cursor:
orderCardDetail?.length === 0 ||
CheckBookingStatus == 'Close' ||
addnewAccess
? 'not-allowed'
: 'pointer',
color:
orderCardDetail?.length === 0 ||
CheckBookingStatus == 'Close' ||
addnewAccess
? 'gray'
: 'rgb(18, 146, 238)',
display: 'flex',
alignItems: 'center',
height: '2.46rem',
}}
>
<PozoSplitPaymentIcon />
</div>
</Tooltip>
)}
{dinePreference && (BookingType === 'Dine In' ||
BookingTypeBoth ||
CheckOrderType?.length > 0) &&
!unpaidFlow && (
<div style={{ width: '4rem', display: 'flex', alignItems: 'center' }}>
<Tooltip title="ORDER" isMobile={isMobile}>
{' '}
<PozoDineInIcon
className={
FirstPaymentclick === false && !addnewAccess
? OrderStatus
? 'Dinein-order-btn pulse-element ChairClrRed'
: 'Dinein-order-btn pulse-element ChairClrGreen'
: 'Dinein-order-btn-disabled pulse-element'
}
onClick={() =>
FirstPaymentclick === false && !addnewAccess
? changeOrderStatus()
: ''
}
/>
</Tooltip>
{/* {FirstPaymentclick === false && !addnewAccess && !OrderStatus && <BSTipAmount />} */}
</div>
)}
</div>
<Tooltip title={'Payment Mode (SHIFT + M)'} placement={'left'}>
<div
className="paymentsButtons"
style={{
pointerEvents: isDisabled ? 'none' : 'auto',
opacity: isDisabled ? 0.5 : 1,
}}
>
{payBtns?.length > 0 ? (
payBtns.map((payment) => {
const mode = payment.ModeName?.toLowerCase();
const isSelected = paybtnselected === payment.ModeId;
const buttonClass =
isSelected ? 'paybutton-selected' : 'paybutton';
const handleClick =
mode === 'upi'
? () => handleUPIButtonClick(payment.ModeId, payment.ModeName)
: () => handlePaymentMode(payment.ModeId, payment.ModeName);
return (
<div className="standard-pay-btns" key={payment.ModeId}>
<button
className={buttonClass}
style={{
fontFamily: FontFamily['para'],
backgroundColor:
mode === 'upi'
? '#2563eb'
: mode === 'card'
? '#7e22ce'
: '#16a34a',
animation: blink ? 'blink-animation 0.5s infinite alternate' : 'none',
}}
onClick={handleClick}
>
<div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>
{mode === 'cash' && <FaMoneyBillWave />}
{mode === 'upi' && <FaMobileScreenButton />}
{mode === 'card' && <FaCreditCard />}
{payment.ModeName}
{mode === 'upi' && <UpiPopover
UpiOptionOpen={UpiOptionOpen}
UpiPayOption={UpiPayOption}
SelectedUPIPayOption={SelectedUPIPayOption}
AddUPIPaymentOption={AddUPIPaymentOption}
PaymentUpiOptions={PaymentUpiOptions}
UpiOption={UpiOption}
UpiId={UpiId}
paygate={paygate}
paydevice={paydevice}
EnableUpiOptions={EnableUpiOptions}
PaymentgatewayUPI={PaymentgatewayUPI}
PaymentDeviceUPI={PaymentDeviceUPI}
SelectedUpiOption={SelectedUpiOption}
addUpiOption={addUpiOption}
hideDefault={hideDefault}
/>}
{mode === 'card' && <CardPopover />}
</div>
</button>
</div>
);
})
) : (
<div
onClick={handlePaymentOptions}
style={{ cursor: 'pointer' }}
className="payment-error-msg"
>
Please Set Payment Options
</div>
)}
{/* {PrintOrderDetails?.length > 0 && (
<div style={{ display: 'flex', gap: '1rem', justifyContent: 'center', marginTop: '1rem' }}>
{filteredSettingNames?.includes('whatsapp') && (
<FaWhatsapp
size={32}
color="#25D366"
style={{ cursor: 'pointer' }}
onClick={handleWhatsAppClick}
title="Share on WhatsApp"
/>
)}
<FaPrint
size={32}
color="#1292EE"
style={{ cursor: 'pointer' }}
onClick={handlePrintOrToken}
title="Print"
/>
{filteredSettingNames?.includes('SMS') && isMobile && (
<MdSms
size={32}
color="#FF8800"
style={{ cursor: 'pointer' }}
onClick={handleSMSClick}
title="Send SMS"
/>
)}
</div>
)}
{showWhatsAppShare && (
<WhatsAppShare
message={encodedMessage}
mobileNumber={MobileNoWhatsApp?.value}
onClose={() => closePrintOption(false)}
/>
)}
{showSMSShare && isMobile && (
<SMSShare
message={encodedMessage}
mobileNumber={MobileNoWhatsApp?.value}
onClose={() => closePrintOption(false)}
/>
)} */}
</div>
</Tooltip>
<Tooltip title="Create Bill (F4)" isMobile={isMobile}>
<div
className={
addnewAccess
? 'standard-pay-btn-disabled'
: FirstPaymentclick === false &&
orderCardDetail?.length > 0 &&
paybtnselected &&
CheckBookingStatus !== 'Close'
? !OrderStatus
? 'standard-pay-btn'
: 'standard-pay-btn order-complete'
: 'standard-pay-btn-disabled'
}
onClick={handleButtonClick}
>
{!OrderStatus ? (
<>
<p className="standard-pay-amount" style={{ fontFamily: FontFamily['head'] }}>
{isMobile ? (
`${safeRound(OrderType === 'Failed' ? FailedTotalAmt : TotalAmount)}`
) : (
<div>
{' '}
<CountUp
duration={0.4}
className="counter"
end={safeRound(OrderType === 'Failed' ? FailedTotalAmt : TotalAmount)}
/>
</div>
)}
</p>
<div className="standard-pay-arrow">
<BiRightArrowAlt size={25} />
</div>
</>
) : (
<div className="standard-pay-order-label">ORDER</div>
)}
</div>
</Tooltip>
{
UpiOpen && (
<DefaultModal
open={UpiOpen}
title="UPI PAYMENT"
width={500}
handleCancel={() => {
Upimodel('Cancel');
}}
footer={false}
children={
<div style={{ overflow: 'scroll' }}>
<div
style={{
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-evenly',
alignItems: 'center',
}}
>
<div>
<QrinScreen
Amount={
OrderType === 'Failed'
? FailedTotalAmt
: Math.round(TotalAmount)
}
UpiId={UpiId}
/>
</div>
<div>
<h1>
{' '}
RS :
{OrderType === 'Failed'
? FailedTotalAmt
: Math.round(TotalAmount)}{' '}
</h1>
</div>
</div>
<div className="sentok">
{(selOption || SelCustId) && (
<div className="sentLink" onClick={onFinalSubmit}>
Sent Payment Link
<img
src={WpIcon}
alt="Your Alt Text"
style={{ width: '30px', height: '30px' }}
/>
</div>
)}
<div
style={{
display: 'flex',
flexDirection: 'row-reverse',
width: '100px',
}}
>
<Buttons
buttonText="OK"
color="901D77"
icon={<ArrowRightOutlined />}
handleSubmit={() => {
Upimodel('Submit');
}}
/>
</div>
</div>
</div>
}
/>
)
}
{
PrintOrderDetails?.length > 0 &&
PrintOrderDetails?.[0]?.OrderDetails?.map((orderDetail, index) => (
<div style={{ display: 'none' }}>
<PaymentPdfBooking
index={index}
table2Data={orderDetail}
singleData2={orderDetail?.productDetails}
orderId={
orderDetail?.OrderId &&
extractLastNumberOrderId(
orderDetail?.OrderId,
orderDetail?.FYStatus
)
}
CreatedDate={orderDetail?.CreatedDate}
PaymentStatus={PrintOrderDetails?.[0]?.PaymentOrderDtl}
Preference={SettingDataSelector}
printDatas={printDatas}
/>
</div>
))
}
{
PrintOrderDetails?.length > 0 &&
(TokenOnly?.SettingValue === 'Y' ||
IndividualToken?.SettingValue === 'Y') &&
PrintOrderDetails?.[0]?.OrderDetails?.map((orderDetail, index) => (
<div style={{ display: 'none' }}>
<TokensinglePrint
index={index}
table2Data={orderDetail}
singleData2={orderDetail?.productDetails}
orderId={
orderDetail?.OrderId &&
extractLastNumberOrderId(
orderDetail?.OrderId,
orderDetail?.FYStatus
)
}
CreatedDate={orderDetail?.CreatedDate}
PaymentStatus={PrintOrderDetails?.[0]?.PaymentOrderDtl}
/>
</div>
))
}
{
CreditCustomer && (
<div style={{ display: 'none' }}>
<BsBillingCreditCustomer
ModalCreditCustomer={CreditCustomer}
handlemodalclose={() => {
handleCreditCustomer('Cancel');
}}
handleOk={() => {
handleCreditCustomer('Submit');
}}
/>
</div>
)
}
{
creditCustomerOpen && (
<BSCreditCustomer
creditCustomerOpen={creditCustomerOpen}
CreditCustomerHAndleCancel={CreditCustomerHAndleCancel}
/>
)
}
{
Splitpayment && (
<SplitPayment
SplitPaymentModal={Splitpayment}
handlesplitpaymentclose={handlesplitpaymentclose}
TotalNetAmount={Math.round(
orderCardDetail?.reduce((acc, data) => data?.TotalAmt + acc, 0) -
((OverAllSales > 0 ? OverAllSales : 0) +
(OverAllEstimate > 0 ? OverAllEstimate : 0) +
(Discount > 0 ? Discount : 0))
)}
// failedOrderData={failedOrderData}
/>
)
}
<DefaultModal
className={'paymentoptionsModal'}
open={GlobalSalesPaymentoptions}
width={500}
height={1000}
handleCancel={() => {
dispatch(changeSalesPaymentoption(false));
}}
footer={false}
children={
<div className="paymentoptionsModalContent" style={{ overflow: 'scroll' }}>
<Paymentoption onSuccess={getPaymentOptionFeature} />
</div>
}
/>
</div >
)
}
export default StandardTablePayment