import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import moment from 'moment'; import { dateFormatChange, dateFormatChange1, extractLastNumber, extractLastNumberOrderId, getSession, } from '../../Services/Others'; import { ApplicationPreferences, getBranchDetail, } from '../../Features/BrachLogin/BranchLogin'; import PrintStyle1 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle1'; import PrintStyle2 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle2'; import PrintStyle3 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle3'; import PrintStyle4 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle4'; import PrintStyle5 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle5'; import PrintStyle6 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle6'; import PrintStyle7 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle7'; import PrintStyle8 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle8'; import PrintStyle9 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle9'; import PrintStyle10 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle10'; import PrintStyle11 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle11'; import PrintStyle12 from '../BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle12'; import { SelectedPrintTemplate } from '../../Features/ThemeChange/ThemeChange'; import PrintA4Style11 from '../BookingScreen/PrintTemplates/A4/PrintA4Style11'; import PrintA5Style11 from '../BookingScreen/PrintTemplates/A4/PrintStyleA5'; import A4Standard from '../BookingScreen/PrintTemplates/A4/A4Standard'; import TaxInvoice from '../BookingScreen/PrintTemplates/A4/TaxInvoice'; import { settingDataSelector } from '../../Features/PreferenceMaster/PreferenceMaster'; import { PreferenceData } from '../../Features/BookingScreen/BookingData/BookingData'; const PaymentPdfBooking = ({ index, orderId, CreatedDate, singleData2, table2Data, PaymentStatus, Preference, printDatas, ReprintType, }) => { const MembershipApplied = table2Data?.OrderOfferDetails?.find( (i) => i.TableName === 'MemberShip' ); let PaymentStatusSuccess = PaymentStatus?.filter( (ps) => ps.PaymentStatus === 'S' ); const isEditedBill = PaymentStatus?.some(payment => { const type = payment?.AdjustmentType?.toLowerCase(); return ( (type === 'extra' || type === 'refund') && payment?.BeforeAdjustment != null && payment?.AfterAdjustment != null ); }); const lastTransaction = PaymentStatus?.find( (ps) => ps.PaymentStatus === 'S' && ps?.LastOrderTran === 'Y' ) console.log(singleData2?.filter(data => data?.EditTokenAvailable !== 'N'), "singleData2") const ExtraChargeTotal = table2Data?.ExtraChargeDetails?.reduce( (accumulator, currentObject) => { return accumulator + currentObject.TotalAmt; }, 0 ); let PrintLogo = Preference?.[0]?.SettingDtlDetails?.filter( (i) => i.SettingIdName === 'PrintLogo' )?.[0]; let PrintGreeting = Preference?.[0]?.SettingDtlDetails?.filter( (i) => i.SettingIdName === 'PrintGreetings' )?.[0]; let SalesModePref = Preference?.[0]?.SettingDtlDetails?.filter( (i) => i.SettingIdName === 'Sales Mode' )?.[0]; const Weightasquantity = Preference?.[0]?.SettingDtlDetails?.some( (setting) => setting?.SettingIdName?.toLowerCase() === 'weightasquantity' && setting?.SettingValue === 'Y' ); const dispatch = useDispatch(); const BranchId = getSession('BranchId'); const Date1 = dateFormatChange1(table2Data?.SalesDate); console.log(Date1, 'CreatedDate', CreatedDate); const [BranchLogo, setBranchLogo] = useState(null); const [BranchAddress, setBranchAddress] = useState(); const [BranchCity, setBranchCity] = useState(); const [BranchZip, setBranchZip] = useState(); const CashierName = getSession('userName'); const printerTemplateStyle = useSelector(SelectedPrintTemplate); console.log(printerTemplateStyle, "printerTemplateStyle") const appPreferences = useSelector(ApplicationPreferences); const SettingData = useSelector(PreferenceData); const estimatePrintHeader = SettingData?.[0]?.SettingDtlDetails?.find( (setting) => setting?.SettingIdName?.toLowerCase() === 'estimateprintheader' )?.SettingValue === 'Y'; const bookingTypePreference = appPreferences?.find( (preference) => preference?.PreferredCatName === 'Booking Type' )?.PreferenceCatDetails; const PackageDetails = table2Data?.PackageDtl; const dinePreference = bookingTypePreference?.find( (type) => type?.PreferredSubCatName?.toLowerCase() === 'dine in' && type?.PreferredStatus === 'Y' ); const takeAwayPreference = bookingTypePreference?.find( (type) => type?.PreferredSubCatName?.toLowerCase() === 'take away' && type?.PreferredStatus === 'Y' ); const commonModulePreference = appPreferences?.find( (preference) => preference?.PreferredCatName === 'Common Module' )?.PreferenceCatDetails; const sportsAppPreference = commonModulePreference?.find( (preference) => preference?.PreferredSubCatName === 'SportsApp' && preference?.PreferredStatus === 'Y' ); const branchLogo = table2Data?.CompLogo; // const TotalCal= singleData2?.map((item) =>(item.Price)) const productsData = table2Data?.productDetails || []; const offers = table2Data?.OrderOfferDetails || []; let TotalOfferAmount = 0; // Calculate SalesWiseOffers total amount offers.forEach((offer) => { if (offer.TableName === 'SalesWiseOffers') { TotalOfferAmount += offer.OfferAmount; } }); const hasMappedOffer = offers.some((offer) => ['ItemWiseOffers', 'BundleOffers', 'QuantityWiseOffers'].includes( offer.TableName ) ); if (hasMappedOffer) { const productTotal = productsData?.reduce( (acc, item) => acc + (item?.Type != 'C' ? item.OfferAmt : item.OfferValue || 0), 0 ); TotalOfferAmount += productTotal; } else { const Combothere = productsData?.filter((item) => item?.Type == 'C'); const CombothereTotal = Combothere?.reduce( (acc, item) => acc + (item.OfferValue || 0), 0 ); TotalOfferAmount += CombothereTotal; } // useEffect(() => { // fetchBranchData(); // }, []); // const fetchBranchData = async () => { // const response = await dispatch( // getBranchDetail({ BrId: BranchId }) // ).unwrap(); // if (response?.data?.statusCode === 1) { // setBranchAddress(response?.data?.data?.[0]?.Address1); // setBranchCity(response?.data?.data?.[0]?.City); // setBranchZip(response?.data?.data?.[0]?.Zip); // setBranchLogo(response?.data?.data?.[0]?.CompLogo); // } else { // setBranchAddress(); // setBranchCity(); // setBranchZip(); // setBranchLogo(); // } // }; let Companystate = table2Data?.AddressDetails?.[0]?.State?.toLowerCase() || null; let Customerstate = table2Data?.CustomerDetails?.[0]?.State?.toLowerCase() || null; let Samestate = Companystate && Customerstate ? Companystate == Customerstate ? true : false : true; console.log(Samestate, 'Samestate'); // const singleData2GST = OrderDetails?.[0]?.TaxDetails?.filter(item => item.TaxIdName === "CGST,SGST") let totalQuantityFilter = table2Data?.productDetails?.map( (item) => item?.SalesQty || item?.OrderQty ); const totalQuantity = table2Data?.productDetails?.reduce((acc, item) => { const isWeightScale = item?.ScaleType === 'weight'; if (isWeightScale) { return ( acc + (Weightasquantity ? Math.round(Number(item?.SalesQty || item?.OrderQty || 0)) : 1) ); } return acc + Math.round(Number(item?.SalesQty || item?.OrderQty || 0)); }, 0); let OrderDetailGST = table2Data?.TaxDetails?.filter( (item) => item.TaxIdName?.toLowerCase() === 'cgst,sgst' ) || []; let OrderDetailIGST = table2Data?.TaxDetails?.filter( (item) => item.TaxIdName?.toLowerCase() === 'igst' ) || []; console.log(OrderDetailGST, 'OrderDetailGST'); // If same state, push GST data into IGST but rename TaxIdName if (!Samestate) { const converted = OrderDetailGST.map((item) => ({ ...item, TaxIdName: 'igst', })); OrderDetailIGST = [...OrderDetailIGST, ...converted]; // ✅ works OrderDetailGST = []; // ✅ works } console.log(OrderDetailIGST, 'OrderDetailIGST'); const OrderDetailVAT = table2Data?.TaxDetails?.filter( (item) => item.TaxIdName?.toLowerCase() === 'vat' ); const TakeawayData = table2Data?.productDetails?.filter( (item) => item.BookingTypeName?.toLowerCase() === 'takeaway' ); const TakeawayTotalOfferAmt = TakeawayData?.reduce( (accumulator, currentValue) => accumulator + currentValue.OfferAmt, 0 ); const DineInData = table2Data?.productDetails?.filter( (item) => item.BookingTypeName?.toLowerCase() === 'dine in' ); const DineinTotalOfferAmt = DineInData?.reduce( (accumulator, currentValue) => accumulator + currentValue.OfferAmt, 0 ); const TakeawayTotal = TakeawayData?.reduce( (accumulator, currentValue) => accumulator + currentValue.TotalAmt, 0 ); const DineInTotal = DineInData?.reduce( (accumulator, currentValue) => accumulator + currentValue.TotalAmt, 0 ); const aggregatedPayments = PaymentStatusSuccess?.filter( (ps) => ps.PaymentStatus === 'S' )?.reduce((acc, paymentdata) => { const paymentType = paymentdata?.PaymentTypeName; const amount = Number(paymentdata?.Amount); if (acc[paymentType]) { acc[paymentType] += amount; } else { acc[paymentType] = amount; } return acc; }, {}); console.log(aggregatedPayments, 'aggregatedPayments'); const imageUrlToBase64 = async (url) => { try { const response = await fetch(url); const blob = await response.blob(); return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(blob); }); } catch (error) { console.error('Error fetching or converting image:', error); throw error; } }; // Usage in your component const [base64Image, setBase64Image] = useState(null); const [conversionError, setConversionError] = useState(null); // Call the function to convert the image URL to base64 useEffect(() => { async function fetchImage() { try { const base64 = await imageUrlToBase64(BranchLogo); setBase64Image(base64); } catch (error) { setConversionError(error.message || 'Error converting image'); } } if (BranchLogo) { fetchImage(); } }, [BranchLogo]); const to12Hour = (timeStr) => { if (!timeStr) return ''; let [h, m] = timeStr.split(':'); h = parseInt(h, 10); const suffix = h >= 12 ? 'PM' : 'AM'; h = h % 12 || 12; return `${h}:${m}${suffix}`; }; const getAdjustmentLabel = (type) => { switch (type?.toUpperCase()) { case 'REFUND': return 'Returned Item Amount'; case 'EXTRA': return 'Additional Amount'; case 'DISCOUNT': return 'Discount Applied'; case 'ROUND_OFF': return 'Round Off'; default: return 'Adjustment Amount'; } }; return ( <>
{table2Data?.BrName}
{table2Data?.AddressDetails?.length > 0 && ({table2Data?.AddressDetails?.[0]?.Address1 && table2Data?.AddressDetails?.[0]?.Address1}{' '} , {table2Data?.AddressDetails?.[0]?.City && table2Data?.AddressDetails?.[0]?.Zip && table2Data?.AddressDetails?.[0]?.City + '- ' + table2Data?.AddressDetails?.[0]?.Zip}
)} {table2Data?.BrGSTIN && (GSTIN: {table2Data?.BrGSTIN}
)} {table2Data?.BrMobile &&Mobile:+91 {table2Data?.BrMobile}
}Estimate
{SalesModePref?.SettingValue == 'Y' && `(${table2Data?.SalesMode ? table2Data?.SalesMode : 'R'})`}
{PaymentStatusSuccess?.length === 1 ? PaymentStatusSuccess?.[0]?.PaymentTypeName + ' Bill' : 'Bill'}
{SalesModePref?.SettingValue == 'Y' && `(${table2Data?.SalesMode ? table2Data?.SalesMode : 'R'})`}
TakeAway
| S.No | Item | Qty | Rate | {TakeawayTotalOfferAmt > 0 && (Dis | )} {table2Data?.OrderType !== 'E' && (Tax % | )} {/*Extra Charges | */}Amt |
|---|---|---|---|---|---|---|---|
| {index + 1} |
{item?.ProdName}
{PackageDetails?.filter(
(pkg) => pkg.ProdId === item.ProdId
).length > 0 ? (
{PackageDetails?.filter(
(pkg) => pkg.ProdId === item.ProdId
)?.map((pkg, index) => (
{pkg.ParcelCount} PCS {pkg.ParcelQty} PACK (
{pkg.ParcelType})
))}
(
{item?.SinglePc === 'Y'
? 'PCS'
: item?.Type !== 'C'
? item?.UomName
: 'COMBO'}
) {' '}
{item?.BrandName !== null ? item?.BrandName : ''}
{item?.ProductIdentifierDtls?.length > 0
? item?.ProductIdentifierDtls.filter(
(items) =>
items.SerialNumber &&
items.SerialNumber !== ''
).map((a, i) => (
) : (
({item?.Size ? item?.Size : '1'}{' '}
{item?.SinglePc === 'Y'
? 'PCS'
: item?.Type !== 'C'
? item?.UomName
: 'COMBO'}
) {' '}
{item?.BrandName !== null ? item?.BrandName : ''}
{item?.ProductIdentifierDtls?.length > 0
? item?.ProductIdentifierDtls.filter(
(items) =>
items.SerialNumber &&
items.SerialNumber !== ''
).map((a, i) => (
{a.SerialNumber}
))
: ''}
{item?.ProductIdentifierDtls?.length > 0
? item?.ProductIdentifierDtls.filter(
(id) => id.IMEI1 !== '' || id.IMEI2 !== ''
).map((id, i) => {
const imei1 = id.IMEI1 || '';
const imei2 = id.IMEI2 || '';
return (
{[imei1, imei2]
.filter(Boolean)
.join(',')}
);
})
: ''}
{a.SerialNumber}
))
: ''}
{item?.ProductIdentifierDtls?.length > 0
? item?.ProductIdentifierDtls.filter(
(id) => id.IMEI1 !== '' || id.IMEI2 !== ''
).map((id, i) => {
const imei1 = id.IMEI1 || '';
const imei2 = id.IMEI2 || '';
return (
{[imei1, imei2].filter(Boolean).join(',')}
);
})
: ''}
)}
{sportsAppPreference &&
`(${to12Hour(item?.AvailableFrom)} - ${to12Hour(item?.AvailableTo)})`}
|
{item?.SalesQty} | {item?.Rate} | {TakeawayTotalOfferAmt > 0 && ({item?.Type != 'C' ? item?.OfferAmt || 0 : item?.OfferValue || 0} | )} {table2Data?.OrderType !== 'E' ? ({item?.ProdTaxPercentage} | ) : ( '' )} {/*{table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.[0]?.TotalAmt? table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.map(item=>item.ExtraChargeType+':'+item.TotalAmt).join(','):0} | */}{/* {table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.[0]?.TotalAmt? table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.map(item=>item.TotalAmt)?.reduce( (accumulator, currentValue) => accumulator + currentValue, 0, ) +item?.TotalAmt:item?.TotalAmt} */} {item?.Type != 'C' ? item?.TotalAmt - item?.OfferAmt || 0 : item?.TotalAmt - item?.OfferValue || 0} |
| S.No | Item | Qty | Rate | {DineinTotalOfferAmt > 0 && (Dis | )} {table2Data?.OrderType !== 'E' && (Tax % | )} {/*Extra Charges | */}Amt |
|---|---|---|---|---|---|---|---|
| {index + 1} | {item?.ProdName} ({item?.Size ? item?.Size : '1'}{' '} {item?.SinglePc == 'Y' ? 'PCS' : item?.Type != 'C' ? item?.UomName : 'COMBO'} ) {' '} {item?.BrandName !== null ? item?.BrandName : ''} | {item?.SalesQty} | {item?.Rate} | {DineinTotalOfferAmt > 0 && ({item?.Type != 'C' ? item?.OfferAmt || 0 : item?.OfferValue || 0} | )} {table2Data?.OrderType !== 'E' ? ({item?.ProdTaxPercentage} | ) : ( '' )} {/*{table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.[0]?.TotalAmt? table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.map(item=>item.ExtraChargeType+':'+item.TotalAmt).join(','):0} | */}{/* {table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.[0]?.TotalAmt? table2Data?.ExtraChargeDetails?.filter(data=>item?.ProdId==data?.ProdId)?.map(item=>item.TotalAmt)?.reduce( (accumulator, currentValue) => accumulator + currentValue, 0, ) +item?.TotalAmt:item?.TotalAmt} */} {item?.Type != 'C' ? item?.TotalAmt - item?.OfferAmt || 0 : item?.TotalAmt - item?.OfferValue || 0} |
{' '} Items:{totalQuantityFilter?.length}
{' '} Qty:{totalQuantity}
{ExtraChargeTotal > 0 && ({' '} Extra Charges:{ExtraChargeTotal}
)} {(TotalOfferAmount > 0 || table2Data?.OverallDisc > 0) && (Off : {Number(TotalOfferAmount + table2Data?.OverallDisc).toFixed(2)}
)} {/* {table2Data?.OverallDisc > 0 &&Discount :{Number(table2Data?.OverallDisc).toFixed(2)}
} */} {/*Amount :{Number(table2Data?.NetAmount).toFixed(2)}
*/}{' '} Dine-In: {Number(DineInTotal).toFixed(2)}
{' '} TakeAway: {Number(TakeawayTotal).toFixed(2)}
--------- GST Breakup Details -----------
{OrderDetailGST?.length > 0 && OrderDetailGST?.[0]?.TaxAmt > 0 && (| Taxable Amount | CGST | SGST | Total Amount | |
| {item?.TaxPercentage} % | {Number(item.WithOutTaxAmount).toFixed(2)} | {Number(item.CGST).toFixed(2)} | {Number(item.SGST).toFixed(2)} | {Number(item.TotalAmt).toFixed(2)} |
| Taxable Amount | IGST ({OrderDetailIGST?.[0]?.TaxPercentage}%) | Total Amount |
| {Number(item.WithOutTaxAmount).toFixed(2)} | {Number(item.TaxAmt).toFixed(2)} | {Number(item.TotalAmt).toFixed(2)} |
| Taxable Amount | VAT ({OrderDetailVAT?.[0]?.TaxPercentage}%) | Total Amount |
| {Number(item.WithOutTaxAmount).toFixed(2)} | {Number(item.TaxAmt).toFixed(2)} | {Number(item.TotalAmt).toFixed(2)} |
{PaymentStatusSuccess?.length === 1 ? PaymentStatusSuccess?.[0]?.PaymentTypeName : 'Split'}{' '} Payment : {Number(table2Data?.NetAmount).toFixed(2)} /-{' '}
{i.label} : {i.value}
)); })()}Split Payment:
*/} {Object.keys(aggregatedPayments)?.map((paymentType) => (Customer: {table2Data?.CustSuppName}
Cashier Name: {CashierName}
Captain Name:{' '} {table2Data?.SalesTableLinkDetails?.[0]?.WaiterName}
Thank You Visit Again
)}{items[0]?.BrName}
Token
Bill No: {orderId}
{Date1}
| S.No | Item | Qty | Rate | Price |
|---|---|---|---|---|
| {idx + 1} | {item.ProdName} | {item?.EditTokenAvailable === 'Y' ? item?.EditTokenQty : item.SalesQty} | {item.Rate} | {((item?.EditTokenAvailable === 'Y' ? item?.EditTokenQty : item.SalesQty) * item.Rate) - ((item?.EditTokenAvailable === 'Y' ? (item?.OfferAmt / item?.EditTokenQty) : item?.OfferAmt))} |