diff --git a/README.md b/README.md new file mode 100644 index 0000000..a1f2377 --- /dev/null +++ b/README.md @@ -0,0 +1,2556 @@ +# POZO Retail Web to Andriod by using capcitor package + +A short description of what the project does. + +--- + +## 📦 Prerequisites + +Make sure you have the following installed: + +- Node.js (v20+ recommended) +- npm or yarn + +--- + +## 🔧 Required Changes Before Running the App + +Before running the application, make the following updates: + +### 1️⃣ Update Vite Config +Open the file: + + +// this is ProtecedRoute.jsx make sure need to cmd or add some thng like this before changing react to capcitor +import { useEffect, useState } from 'react'; +import { Routes, Route, useNavigate } from 'react-router-dom'; +import { useDispatch } from 'react-redux'; +import { + getEmpAccesData, + GenerateLogout, + getSAdminUserAccesData, + PricingAppPricingName, + checkSession, + getCompBranchData, + getCommonAppPreference, + changeWarehouse, +} from './Features/BrachLogin/BranchLogin.js'; +import { clearSession, getSession, sessionStore } from './Services/Others'; +import { + FeatureAddon, + GlobalFeatAddOnData, +} from './Features/BookingScreen/BookingData/BookingData.js'; +import { Suspense } from 'react'; +import { gettableData } from './Features/PreferenceMaster/PreferenceMaster.js'; +import { useSelector } from 'react-redux'; +import { useTemplate } from './utils/useTemplate.js'; + +const commonUrl = import.meta.env.ENV_COMMON_BASE_URL; +const subDirectory = import.meta.env.BASE_URL; + +const ProtectedRoutes = ({ routesConfig }) => { + // useTemplate( + // getSession('CompId'), + // getSession('BranchId'), + // getSession('AppId') + // ); + sessionStore('AppId', 2); + sessionStore('BranchId', 791); + sessionStore('AppName', 'Bakery'); + sessionStore('CompId', 657); + sessionStore('MobileNo', '8888888888'); + sessionStore('UserType', 'Admin'); + sessionStore('UserId', 286); + sessionStore('userName', 'Karthiga'); + + sessionStore( + 'auth','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiODg4ODg4ODg4OCIsIlBhc3N3b3JkIjoiWkB6MTIzNCIsImF1ZCI6WyJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLXJldGFpbC1hcGkiLCJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLWNvbW1vbi1hcGkiLCJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLXNtcy1lbWFpbC10ZW1wbGF0ZS1hcGkiLCJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLWNvbW1vbi1hcGkiXSwiZXhwIjoxNzc0NjM3OTA5LCJpc3MiOiJodHRwczovL2FwaS5wb3pvLmRldi9Kd3RUb2tlbiJ9.TWDS0cuHGIDW_16EH2RS4z2B-wnuuPmMNd_lre505qY' + ); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const UserType = getSession('UserType'); + const [hasRedirected, setHasRedirected] = useState(false); + const AppId = getSession('AppId'); + const CompId = getSession('CompId'); + const BranchId = getSession('BranchId'); + const UserId = getSession('UserId'); + const sessionId = getSession('SessionId'); + const Warehouse = getSession('Warehouse'); + const [accessCheckComplete, setAccessCheckComplete] = useState(false); + const FeatureAddonData = useSelector(GlobalFeatAddOnData); + useTemplate(657, 791, 2); + + useEffect(() => { + getApplicationPreference(); + }, []); + //sri + // useEffect(() => { + // if (Warehouse) { + // dispatch(changeWarehouse(true)); + // } + // }, [Warehouse]); + const getApplicationPreference = async () => { + await dispatch(getCommonAppPreference(AppId)).unwrap(); + }; + + const getEmpAccess = async () => { + let data = { + UserId: UserId, + AppId: AppId, + CompId: CompId, + BranchId: BranchId, + }; + + const response = await dispatch(getEmpAccesData(data)).unwrap(); + if (response?.data?.statusCode === 1) { + return response?.data?.data?.[0]?.EmpAccessDetails; + } + return null; + }; + + const getSadminUserAccess = async () => { + let data = { + UserId: UserId, + AppId: AppId, + }; + const response = await dispatch(getSAdminUserAccesData(data)).unwrap(); + if (response?.data?.statusCode === 1) { + return response?.data?.data?.[0]?.AppMenuAccessDetails; + } + return null; + }; + + const Dinein = async () => { + if (AppId && CompId && BranchId) { + let DineinData = { + AppId: AppId, + CompId: CompId, + BranchId: BranchId, + UserId: UserId, + }; + const response = await dispatch(gettableData(DineinData)).unwrap(); + if (response?.data?.statusCode === 1) { + const SettingValueData = response?.data?.data + ?.find((e) => e.AppId === AppId) + ?.SettingDtlDetails?.some( + (e) => e.SettingIdName === 'DineIn' && e.SettingValue === 'Y' + ); + const EstimateValueData = response?.data?.data + ?.find((e) => e.AppId === AppId) + ?.SettingDtlDetails?.some( + (e) => e.SettingIdName === 'Estimation' && e.SettingValue === 'Y' + ); + return (SettingValueData, EstimateValueData); + } + } + }; + + const checkAccess = async (empAccess) => { + if (!empAccess) return false; + let DineinData, + EstimateData = await Dinein(); + switch (empAccess) { + case 'Dine In': + case 'KOT': + return !!DineinData; + case 'Estimate': + return !!EstimateData; + default: + return false; // Restrict access if no valid match found + } + }; + + const getPricingName = async () => { + if (!AppId || !UserId) return; + const data = { + appId: AppId, + userId: UserId, + }; + try { + const response = await dispatch(PricingAppPricingName(data)).unwrap(); + const responseData = response?.data; + const pricingData = responseData?.data; + const hasAdvance = pricingData?.some( + (item) => item.PricingName === 'Premium' + ); + const hasProOrAdvance = + hasAdvance || + pricingData.some((item) => item.PricingName === 'Customized'); + return (hasAdvance, hasProOrAdvance); + } catch (error) { + console.error('Error fetching pricing name:', error); + } + }; + + const checkPlanAccess = async (empAccess, featureAddonData) => { + if (!empAccess) return false; + let Advance, + ProORAdvance = await getPricingName(); + switch (empAccess) { + case 'Product Catalogue': + return ( + ProORAdvance || + featureAddonData?.some( + (item) => item?.FeatureAddonName?.toLowerCase() === 'catalog' + ) + ); + case 'Sales Setup': + case 'Print Setup': + return ( + Advance || + featureAddonData?.some( + (item) => + item?.FeatureAddonName?.toLowerCase() === 'customized template' + ) + ); + case 'Kiosk Setup': + case 'Kiosk Sales': + return featureAddonData?.some( + (item) => item?.FeatureAddonName?.toLowerCase() === 'kiosk sales' + ); + default: + return false; // Restrict access if no valid match found + } + }; + + const checkEmpAccess = async (empAccess, currentPath) => { + if (!empAccess) return false; + const Access = await getEmpAccess(); + let accessType; + if (currentPath.endsWith('/new')) { + accessType = 'AddAccess'; + } else if (currentPath.endsWith('/update')) { + accessType = 'UpdateAccess'; + } else { + accessType = 'ReadAccess'; + } + // const config = Access?.find(config => + // config.ConfigName === empAccess && config[accessType] === 'Y' + // ); + const config = Access?.find( + (config) => + (config.ConfigName === empAccess && config[accessType] === 'Y') || + (currentPath.includes('supplier-master') && + (config.ConfigName === 'Supplier' || + config.ConfigName === 'Seller') && + config[accessType] === 'Y') + ); + + return !!config; + }; + + const checkSuperAdminUserAccess = async (empAccess, currentPath) => { + console.log('empAccessData1', empAccess, currentPath); + if (!empAccess) return false; + const Access = await getSadminUserAccess(); + let accessType; + if (currentPath.endsWith('/new')) { + accessType = 'AddAccess'; + } else if (currentPath.endsWith('/update')) { + accessType = 'UpdateAccess'; + } else { + accessType = 'ReadAccess'; + } + console.log('empAccessData2', Access, accessType); + // const config = Access?.find(config => + // config.MenuName === empAccess && config[accessType] === 'Y' + // ); + const config = Access?.find( + (config) => + (config.MenuName === empAccess && config[accessType] === 'Y') || + (currentPath.includes('supplier-master') && + (config.MenuName === 'Supplier' || config.MenuName === 'Seller') && + config[accessType] === 'Y') + ); + console.log('empAccessData3', config); + + return !!config; + }; + + const getEmpAccessFromChildren = (route, currentPath) => { + if (route.path === currentPath) { + return route.empAccess || null; + } + + if (route.children) { + for (const child of route.children) { + const childPath = `${route.path}/${child.path}`; + if (childPath === currentPath) { + return child.empAccess || null; + } + } + } + + return null; + }; + + const getEmpAccessDataFromChildren = (route, currentPath) => { + if (route.path === currentPath) { + return route.access || null; + } + if (route.children) { + for (const child of route.children) { + const childPath = `${route.path}/${child.path}`; + if (childPath === currentPath) { + return child.access || null; + } + } + } + return null; + }; + + const fetchBranchData = async () => { + const response = await dispatch( + getCompBranchData({ CompId: CompId, AppId: AppId }) + ).unwrap(); + if (response?.data?.statusCode === 1) { + if (response?.data?.data?.length == 1) { + navigate(`${subDirectory}`); + } else { + navigate(`${subDirectory}app-page/branch-login`); + } + } + }; + + + const Logout = async () => { + const status = 'N'; // replace with your actual status + const res = await dispatch(GenerateLogout({ UserId, status })).unwrap(); + if (res?.data?.statusCode === 1) { + sessionStorage.clear(); + window.location.replace(`${commonUrl}`); + } + }; + + const renderRoutes = (routes) => { + return routes.map(({ path, component: Component, children }) => { + const fullPath = `${path}`; + + if (!Component) { + console.error(`Component not found for path: ${fullPath}`); + return null; + } + + if (children) { + return ( + }> + {children.map(({ path: childPath, component: ChildComponent }) => { + if (!ChildComponent) { + console.error( + `Child component not found for path: ${childPath}` + ); + return null; + } + return ( + } + /> + ); + })} + + ); + } + + return } />; + }); + }; + + return ( + }> + {renderRoutes(routesConfig)} + + ); +}; + +export default ProtectedRoutes; +/// Routes config +import React from 'react'; +import { lazy } from 'react'; +const CommonMaster = lazy( + () => import('./Pages/CommonMaster/CommonMaster.jsx') +); +const ConfigType = lazy(() => import('./Pages/ConfigType/ConfigTypeForm.jsx')); +const AdminTax = lazy(() => import('./Pages/AdminTax/AdminTaxForm.jsx')); +const ProductForm = lazy(() => import('./Pages/Product/ProductForm.jsx')); +const Sport_ProductForm = lazy( + () => import('./Pages/Product/SportsMaster.jsx') +); +const ShiftMasterList = lazy( + () => import('./Pages/ShiftMaster/ShiftMasterList.jsx') +); +const ShiftMasterForm = lazy( + () => import('./Pages/ShiftMaster/ShiftMasterForm.jsx') +); +const EmployeeMasterList = lazy( + () => import('./Pages/EmpMaster/EmpMasterList.jsx') +); +const EmployeeMasterForm = lazy( + () => import('./Pages/EmpMaster/EmpMasterForm.jsx') +); + +const SupplierMasterList = lazy( + () => import('./Pages/SupplierMaster/SupplierMasterList.jsx') +); +const SupplierMasterForm = lazy( + () => import('./Pages/SupplierMaster/SupplierMasterForm.jsx') +); + +const ComponentMasterForm = lazy( + () => import('./Pages/UiComponentPage/ComponentForm.jsx') +); +const ComponentMasterList = lazy( + () => import('./Pages/UiComponentPage/ComponentList.jsx') +); + +const CustomerForm = lazy( + () => import('./Pages/CustomerMaster/CustMasterForm.jsx') +); +const CustomerMasterList = lazy( + () => import('./Pages/CustomerMaster/CustMasterList.jsx') +); + +const DateWiseReport = lazy( + () => import('./Pages/Reports/DateWiseReport/DateWiseReport.jsx') +); + +const ItemWiseReport = lazy( + () => import('./Pages/Reports/ItemWiseReport/ItemWiseReport.jsx') +); + +const Reprint = lazy( + () => + import('./Pages/BookingScreen/Components/OtherConponents/Reprint/BSReprint.jsx') +); + +const BookingSelectionPage = lazy( + () => import('./Pages/BookingScreen/Components/MainPage/MainPage.jsx') +); + +const PrintSelectionPage = lazy( + () => import('./Pages/BookingScreen/Components/PrintMainPage/MainPage.jsx') +); +const KioskMainPage = lazy( + () => import('./Pages/BookingScreen/Components/Kiosk/KioskMainPage.jsx') +); + +const BookingPage = lazy(() => import('./Pages/BookingScreen/BookingPage.jsx')); + +const StockForm = lazy(() => import('./Pages/StockMaster/StockForm.jsx')); + +const StockList = lazy(() => import('./Pages/StockMaster/StockList.jsx')); + +const DiningMasterList = lazy(() => import('./Pages/Dining/DiningList.jsx')); + +const DiningMasterForm = lazy(() => import('./Pages/Dining/DiningForm.jsx')); + +const TableBooking = lazy( + () => import('./Pages/Tablebooking/TableBooking.jsx') +); + +const ComboMaster = lazy(() => import('./Pages/ComboPack/ComboMaster.jsx')); + +const ComboList = lazy(() => import('./Pages/ComboPack/ComboMasterlist.jsx')); +const EmpAccessForm = lazy(() => import('./Pages/EmpAccess/EmpAccessForm.jsx')); +const EmpAccessList = lazy(() => import('./Pages/EmpAccess/EmpAccessList.jsx')); + +const EmpScreenAccessList = lazy( + () => import('./Pages/EmpScreenAccess/EmpScreenAccessList.jsx') +); +const EmpScreenRightsAccess = lazy( + () => import('./Pages/EmpScreenAccess/EmpScreenRightsAccess.jsx') +); + +const PreferenceList = lazy( + () => import('./Pages/Preference/PreferenceList.jsx') +); + +const PaymentOptions = lazy( + () => import('./Pages/Payment/PaymentOptions/PaymentOptions.jsx') +); +const PaymentDetails = lazy( + () => import('./Pages/Payment/PaymentDetails/PaymentDetailsForm.jsx') +); +const PaymentDetailsList = lazy( + () => import('./Pages/Payment/PaymentDetails/PaymentDetailsList.jsx') +); +const PaymentReceivedRetail = lazy( + () => + import('./Pages/Payment/PaymentReceivedRetail/PaymentReceivedRetail.jsx') +); + +const ExtraChargesList = lazy( + () => import('./Pages/ExtraCharges/ExtraChargesList.jsx') +); + +const BranchLogin = lazy(() => import('./Pages/BranchLogin/BranchLogin.jsx')); +const BackToBranchLogin = lazy( + () => import('./Pages/BranchLogin/BackToBranchLogin.jsx') +); +const Logout = lazy(() => import('./Pages/Logout.jsx')); + +const BacktoLogin = lazy(() => import('./Pages/BranchLogin/BacktoLogin.jsx')); + +const StockPriceUpdate = lazy( + () => import('./Pages/StockPriceUpdate/StockPriceUpdate.jsx') +); + +const ProductCatalogueList = lazy( + () => import('./Pages/ProductCatlogue/ProductcatlogueList.jsx') +); + +const KOT = lazy(() => import('./Pages/Reports/KOT/kot.jsx')); + +const CustomerKOTDisplay = lazy( + () => import('./Pages/Reports/KOT/CustomerKOTDisplay.jsx') +); + +const RedirectApps = lazy(() => import('./Pages/RedirectApps.jsx')); + +const WSTransaction = lazy( + () => import('./Pages/WholeSaleTransaction/WSSalesTransaction.jsx') +); + +const LedgerReport = lazy( + () => import('./Pages/Reports/LedgerReport/LedgerReport.jsx') +); +const PaymentDetailsPage = lazy( + () => + import('./Pages/BookingScreen/Components/BookingFunctionality/PaymentDetailsPage.jsx') +); + +const CreditCustomerPrint = lazy( + () => + import('./Pages/BookingScreen/Components/BookingFunctionality/CreditDownloadpage.jsx') +); + +const Cancellation = lazy( + () => import('./Pages/CancelReschedule/Cancellation.jsx') +); + +const ChangePaymentmode = lazy( + () => import('./Pages/CancelReschedule/ChangePaymentmode.jsx') +); + +const CancellationList = lazy( + () => import('./Pages/CancelReschedule/CancellationList.jsx') +); + +const CancelApplicableProd = lazy( + () => import('./Pages/CancelReschedule/CancelApplicableProd.jsx') +); + +const CancellationListPending = lazy( + () => import('./Pages/CancelReschedule/CancelPendingPayment.jsx') +); + +const AndroidApp = lazy(() => import('./Pages/AndroidApp/AndroidApp.jsx')); + +const EstimateItemWiseReport = lazy( + () => import('./Pages/Reports/Estimate/EstimateItemWiseReport.jsx') +); + +const EstimateDateWiseReport = lazy( + () => import('./Pages/Reports/Estimate/EstimateDateWiseReport.jsx') +); + +const OfferForm = lazy(() => import('./Pages/Offer/Offer/OfferFormNew.jsx')); + +const OfferList = lazy(() => import('./Pages/Offer/Offer/OfferListNew.jsx')); + +const ItemWise = lazy(() => import('./Pages/Offer/ItemOffer/ItemWiseForm.jsx')); +const SalesWiseForm = lazy( + () => import('./Pages/Offer/SalesOffer/SalesWiseForm.jsx') +); +const SalesWiseList = lazy( + () => import('./Pages/Offer/SalesOffer/SalesWiseList.jsx') +); + +const QuantityWise = lazy( + () => import('./Pages/Offer/QuantityOffer/QuantityWiseForm.jsx') +); + +const BuyOneGetOneForm = lazy( + () => import('./Pages/Offer/BuyOneGetOneOffer/BuyOneGetOneForm.jsx') +); + +const LoyaltyPointsList = lazy( + () => import('./Pages/Offer/LoyaltyPoints/LoyaltyPointsList.jsx') +); + +const BundleOfferForm = lazy( + () => import('./Pages/Offer/BundleOffer/BundleOfferForm.jsx') +); +const BundleOfferList = lazy( + () => import('./Pages/Offer/BundleOffer/BundleOfferList.jsx') +); +const CouponWiseOfferlist = lazy( + () => import('./Pages/Offer/CouponOffer/CouponWiseOfferlist.jsx') +); + +const PromocodeList = lazy( + () => import('./Pages/Offer/PromoCode/PromocodeList.jsx') +); + +const OfferCodeList = lazy( + () => import('./Pages/Offer/OfferCode/OfferCodeList.jsx') +); + +const PricingPage = lazy( + () => + import('./Pages/BookingScreen/Components/UtillComponents/PricingPage.jsx') +); + +const PurchaseOrder = lazy( + () => import('./Pages/PurchaseOrder/PurchaseOrder.jsx') +); + +const PurchaseOrderMail = lazy( + () => import('./Pages/PurchaseOrder/PurchaseOrderMail.jsx') +); + +const PurchaseOrderList = lazy( + () => import('./Pages/PurchaseOrder/PurchaseOrderList.jsx') +); + +const StockReceivedList = lazy( + () => import('./Pages/StockTransfer/StockReceivedList.jsx') +); + +const GstInvoiceSetUpForm = lazy( + () => import('./Pages/GstInvoiceSetup/GstInvoiceSetUpForm.jsx') +); + +const gstInvoiceSetUpList = lazy( + () => import('./Pages/GstInvoiceSetup/GstInvoiceSetupList.jsx') +); + +const StockinHand = lazy(() => import('./Pages/StockinHand/StockinHand.jsx')); + +const PurchaseReturn = lazy( + () => import('./Pages/PurchaseReturn/purchaseReturn.jsx') +); + +const PurchaseReturnget = lazy( + () => import('./Pages/PurchaseReturn/PurchaseReturnGet.jsx') +); + +const KioskBookingPage = lazy( + () => import('./Pages/Kiosk/KioskBookingPage.jsx') +); + +const KioskBookingReceipt = lazy( + () => import('./Pages/Kiosk/PaymentGateway/PaymentGatewayReceipt.jsx') +); + +const KioskComponentList = lazy( + () => import('./Pages/KioskComponent/KioskComponentList.jsx') +); + +const CustomerDisplay = lazy( + () => import('./Pages/CustomerDisplay/CustomerDisplay.jsx') +); + +const PurchaseQuotationForm = lazy( + () => import('./Pages/PurchaseQuotation/PurchaseQuotationForm.jsx') +); + +const DeliveryChallanForm = lazy( + () => import('./Pages/DeliveryChallan/Deliverychallan.jsx') +); + +const DeliveryChallanList = lazy( + () => import('./Pages/DeliveryChallan/DeliverychallanList.jsx') +); + +const ComboOfferMaster = lazy( + () => import('./Pages/Offer/ComboOfferPack/ComboOfferForm.jsx') +); + +const PaymentDeviceForm = lazy( + () => import('./Pages/Payment/PaymentDevice/PaymentDeviceForm.jsx') +); +const PaymentFailedDetailsList = lazy( + () => + import('./Pages/Payment/PaymentFailedDetails/PaymentFailedDetailsList.jsx') +); + +const CounterCategoryMappingForm = lazy( + () => import('./Pages/CounterCategoryMapping/CounterCategoryMappingForm.jsx') +); + +const ImageBulkUpload = lazy( + () => import('./Pages/ImageBulkUpload/ImageBulkUpload.jsx') +); + +const WholesaleBookingPage = lazy( + () => import('./Pages/PurchaseScreen/LayoutScreen8/LayoutScreen8.jsx') +); + +const WholeSaleProductList = lazy( + () => import('./Pages/Wholesale/ProductList.jsx') +); + +const ProductEntry = lazy(() => import('./Pages/Wholesale/ProductEntry.jsx')); + +const ProductEntryList = lazy( + () => import('./Pages/Wholesale/ProductEntryList.jsx') +); +const ItemEntry = lazy( + () => import('./Pages/Wholesale/ItemEntry/ItemEntry.jsx') +); + +const WsPreorder = lazy( + () => import('./Pages/Wholesalespreorder/WholesalePreorderList.jsx') +); + +const WsPreorderForm = lazy( + () => import('./Pages/Wholesalespreorder/WholesalePreorderForm.jsx') +); + +const ExtraChrgesList = lazy( + () => import('./Pages/Wholesale/ItemEntry/ExtraChrgesList.jsx') +); + +const SalesBillCancel = lazy( + () => import('./Pages/SalesRemoval/SalesBillCancelList.jsx') +); + +const WholeSaleAbstract = lazy( + () => import('./Pages/WholeSaleAbstract/WholeSaleAbstract.jsx') +); + +const WholeSaleSellerAbstract = lazy( + () => import('./Pages/WholeSaleAbstract/WholeSaleSellerAbstract.jsx') +); + +const PaymentReceived = lazy( + () => import('./Pages/WholeSaleTransaction/PaymentReceived.jsx') +); + +const WholeSaleSalesReport = lazy( + () => import('./Pages/WholeSaleReport/WholeSalesSalesReport.jsx') +); + +const WholeSalePurchaseReport = lazy( + () => import('./Pages/WholeSaleReport/WholeSalePurchaseReport.jsx') +); +const WholeSalePaymentPurchaseReport = lazy( + () => + import('./Pages/WholesalePaymentReport/WholeSalePaymentPurchaseReport.jsx') +); + +const WholeSalePaymentSalesReport = lazy( + () => + import('./Pages/WholesalePaymentReport/WholeSalePaymementSaleReport.jsx') +); + +const SpeechLanguagesList = lazy( + () => import('./Pages/SpeechLanguages/SpeechLanguagesList.jsx') +); + +const LegderList = lazy( + () => import('./Pages/WholeSaleLedger/WholeSaleLedger.jsx') +); + +const SellerMasterTran = lazy( + () => import('./Pages/WholeSaleTransaction/SellerMasterTransaction.jsx') +); + +const TicketForm = lazy(() => import('./Pages/Ticket/TicketForm.jsx')); + +const ThemeCreation = lazy( + () => import('./Pages/BookingScreen/Components/ThemeCreation/ThemeList.jsx') +); + +const ThemeSelection = lazy( + () => + import('./Pages/BookingScreen/Components/ThemeCreation/ThemePreview.jsx') +); + +const BarcodeTemplateSetup = lazy( + () => import('./Pages/BarcodeSetup/BarcodeTemplateSetup.jsx') +); + +const BarcodeComponentList = lazy( + () => import('./Pages/BarcodeComponent/BarcodeComponentList.jsx') +); + +const StoreRecipelist = lazy( + () => import('./Pages/StoreKitchen/StoreRecipe/StoreRecipelist.jsx') +); + +const StoreRecipeform = lazy( + () => import('./Pages/StoreKitchen/StoreRecipe/StoreRecipeform.jsx') +); + +const Storekitchenlist = lazy( + () => import('./Pages/StoreKitchen/StoretoKitchen/StoretoKitchenlist.jsx') +); + +const StoreKitchenform = lazy( + () => import('./Pages/StoreKitchen/StoretoKitchen/Storetokitchenform.jsx') +); +import { getSession, sessionStore } from './Services/Others'; +import axios from 'axios'; +const KitchenFinishlist = lazy( + () => import('./Pages/StoreKitchen/StoreKitchenFinish/KitchenFinishlist.jsx') +); +const KitechenFinishform = lazy( + () => import('./Pages/StoreKitchen/StoreKitchenFinish/KitechenFinishform.jsx') +); + +const FreeProductList = lazy( + () => import('./Pages/FreeProducts/FreeProduct/FreeProductList.jsx') +); + +const FreePurchaseEnteryForm = lazy( + () => + import('./Pages/FreeProducts/FreePurchase/FreePurchaseEntery/FreePurchaseEnteryForm.jsx') +); +const FreePurchaseEnteryList = lazy( + () => + import('./Pages/FreeProducts/FreePurchase/FreePurchaseEntery/FreePurchaseEnteryList.jsx') +); + +const FreePurchaseOrderList = lazy( + () => + import('./Pages/FreeProducts/FreePurchase/FreePurchaseOrder/FreePurchaseOrderList.jsx') +); +const FreePurchaseOrderForm = lazy( + () => + import('./Pages/FreeProducts/FreePurchase/FreePurchaseOrder/FreePurchaseOrderForm.jsx') +); + +const FreePurchaseReturnList = lazy( + () => + import('./Pages/FreeProducts/FreePurchase/FreePurchaseReturn/FreePurchaseReturnList.jsx') +); +const FreePurchaseReturnForm = lazy( + () => + import('./Pages/FreeProducts/FreePurchase/FreePurchaseReturn/FreePurchaseReturnForm.jsx') +); +const CommonForm = lazy( + () => import('./Pages/Offer/LoyaltyPoints/CommonForm.jsx') +); + +const ReprintReasonReportList = lazy( + () => + import('./Pages/Reports/ReprintReasonReport/ReprintReasonReportList.jsx') +); + +const RevenueItemWiseReport = lazy( + () => import('./Pages/Reports/Revenue/RevenueItemWiseReport.jsx') +); + +const LinkUrlCreate = lazy( + () => import('./Pages/paymentpdfPage/LinkUrlCreate.jsx') +); + +const SupplierProductMapping = lazy( + () => import('./Pages/SupplierProductMapping/SupplierProductMapping.jsx') +); + +const RedirectUserProfile = lazy( + () => import('./Pages/RedirectUserProfile.jsx') +); + +const RelieveRequestForm = lazy( + () => import('./Pages/EmpMaster/EmpRelieve.jsx') +); + +const PurchaseQuotationList = lazy( + () => import('./Pages/PurchaseQuotation/PurchaseQuotationList.jsx') +); + +const ExchangeAndReplacementList = lazy( + () => import('./Pages/ExchangeAndReplacement/ExchangeAndReplacementList.jsx') +); +const ExchangeAndReplacementForm = lazy( + () => import('./Pages/ExchangeAndReplacement/ExchangeAndReplacementForm.jsx') +); + +const ExchangeReturnMapForm = lazy( + () => import('./Pages/ExchangeReturnMap/ExchangeReturnMapForm.jsx') +); +const ExchangeReturnMapList = lazy( + () => import('./Pages/ExchangeReturnMap/ExchangeReturnMapList.jsx') +); + +const OtherServicesForm = lazy( + () => import('./Pages/OtherServices/OtherServicesForm.jsx') +); +const OtherServicesList = lazy( + () => import('./Pages/OtherServices/OtherServicesList.jsx') +); +const EmpCommisionOrIncentiveForm = lazy( + () => + import('./Pages/EmpCommissionOrIncentive/EmpCommisionOrIncentiveForm.jsx') +); + +const EmpCommisionOrIncentiveList = lazy( + () => + import('./Pages/EmpCommissionOrIncentive/EmpCommisionOrIncentiveList.jsx') +); + +const SalesBillProductsReturnList = lazy( + () => import('./Pages/CancelReschedule/SalesBillProductReturnList.jsx') +); + +const SalesBillProductsReturn = lazy( + () => import('./Pages/CancelReschedule/SalesBillProductsReturn.jsx') +); + +const DeliveryChallanToInvoiceForm = lazy( + () => + import('./Pages/DeliveryChallanToInvoice/DeliveryChallanToInvoiceForm.jsx') +); + +const DeliveryChallanToInvoiceList = lazy( + () => + import('./Pages/DeliveryChallanToInvoice/DeliveryChallanToInvoiceList.jsx') +); + +const TipAmountSettlementList = lazy( + () => + import('./Pages/Reports/TipAmountSettlement/TipAmountSettlementList.jsx') +); + +const EmployeeSettlement = lazy( + () => import('./Pages/Reports/EmployeeSettlement/EmployeeSettlement.jsx') +); +const Settlement = lazy( + () => import('./Pages/Reports/TipAmountSettlement/Settlement.jsx') +); +const PublicQrCode = lazy(() => import('./Pages/Reports/PublicQrCode.jsx')); + +const TableMapping = lazy( + () => import('./Pages/TableMapping/TableMapping.jsx') +); +const TableMAppingList = lazy( + () => import('./Pages/TableMapping/TableMAppingList.jsx') +); + +const PurchaseOrderReport = lazy( + () => import('./Pages/Reports/PurchaseReport/PurchaseOrderReport.jsx') +); + +const SalesOrder = lazy(() => import('./Pages/SalesOrder/SalesOrder.jsx')); + +const LoyaltyBased = lazy( + () => import('./Pages/Offer/LoyaltyBased/LoyaltyBased.jsx') +); +const LoyaltyBasedList = lazy( + () => import('./Pages/Offer/LoyaltyBased/LoyaltyBasedList.jsx') +); +const CodeBase = lazy(() => import('./Pages/Offer/CodeBase/CodeBase.jsx')); +const CodeBaseList = lazy( + () => import('./Pages/Offer/CodeBase/CodeBaseList.jsx') +); + +const TurboAddForm = lazy(() => import('./Pages/Product/TurboAddForm.jsx')); + +const ProductMaster = lazy(() => import('./Pages/Product/ProductMaster.jsx')); + +const GatewayMasterConfiguration = lazy( + () => + import('./Pages/GatewayMasterConfiguration/GatewayMasterConfiguration.jsx') +); +const GatewayMasterConfigurationList = lazy( + () => + import('./Pages/GatewayMasterConfiguration/GatewayMasterConfigurationList.jsx') +); + +const MembershipForm = lazy( + () => import('./Pages/Membership/MembershipForm.jsx') +); +const MembershipList = lazy( + () => import('./Pages/Membership/MembershipList.jsx') +); +const SlotManagementForm = lazy( + () => import('./Pages/SlotManagement/SlotManagement.jsx') +); +const SlotManagementList = lazy( + () => import('./Pages/SlotManagement/SlotManagementList.jsx') +); + +const BookingReScedule = lazy( + () => import('./Pages/CancelReschedule/BookingReScedule.jsx') +); +const BookingReSceduleList = lazy( + () => import('./Pages/CancelReschedule/BookingReSceduleList.jsx') +); + +const MembershipReport = lazy( + () => import('./Pages/Reports/Membership/MembershipReport.jsx') +); +const OpeningStock = lazy( + () => import('./Pages/openingStock/openingstockForm.jsx') +); +const OpeningStockList = lazy( + () => import('./Pages/openingStock/OpeningStockList.jsx') +); + +const StockAdjustment = lazy( + () => import('./Pages/StockAdjustment/StockAdjustment.jsx') +); +const StockAdjustmentList = lazy( + () => import('./Pages/StockAdjustment/StockAdjustmentList.jsx') +); +const TopSellingProducts = lazy( + () => import('./Pages/DashBoard/TopSellingProductsChart.jsx') +); + +const AutomatedReorder = lazy( + () => import('./Pages/Automated Reorder/AutomatedReorder.jsx') +); +const AutomatedReorderList = lazy( + () => import('./Pages/Automated Reorder/AutomatedReorderList.jsx') +); + +const CustomerPurchaseConfirm = lazy( + () => + import('./Pages/PurchaseOrder/CustomerPurchaseConfirm/CustomerPurchaseConfirm.jsx') +); + +const MenuQRCode = lazy( + () => import('./Pages/Reports/MenuQRCode/MenuQRCode.jsx') +); + +const PurchaseLink = lazy( + () => import('./Pages/PurchaseOrder/CustomerPurchaseConfirm/PurchaseLink.jsx') +); +const RackForm = lazy(() => import('./Pages/Rack/RackForm.jsx')); +const RackList = lazy(() => import('./Pages/Rack/RackList.jsx')); + +const CreateTransfer = lazy( + () => import('./Pages/StockTransfer/CreateTransfer.jsx') +); +const Dispatch = lazy(() => import('./Pages/StockTransfer/Dispatch.jsx')); +const StockTransferList = lazy( + () => import('./Pages/StockTransfer/TransferList.jsx') +); + +const ComboLayout3 = lazy( + () => import('./Pages/BookingScreen/Template/ComboLayout3/ComboLayout3.jsx') +); + +const Productcatlogue = lazy( + () => import('./Pages/ProductCatlogue/Productcatalogue.jsx') +); + +const subDirectory = import.meta.env.BASE_URL; +const apiCommonUrl = import.meta.env.ENV_API_URL_COMMON; + +const initSession = () => { + sessionStore('AppId', 2); + sessionStore('BranchId', 791); + sessionStore('AppName', 'Bakery'); + sessionStore('CompId', 657); + sessionStore('MobileNo', '8888888888'); + sessionStore('UserType', 'Admin'); + sessionStore('UserId', 286); + sessionStore('userName', 'Karthiga'); + + sessionStore( + 'auth','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiODg4ODg4ODg4OCIsIlBhc3N3b3JkIjoiWkB6MTIzNCIsImF1ZCI6WyJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLXJldGFpbC1hcGkiLCJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLWNvbW1vbi1hcGkiLCJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLXNtcy1lbWFpbC10ZW1wbGF0ZS1hcGkiLCJodHRwczovL2FwaS5wb3pvLmRldi9wb3pvLWNvbW1vbi1hcGkiXSwiZXhwIjoxNzc0NjM3OTA5LCJpc3MiOiJodHRwczovL2FwaS5wb3pvLmRldi9Kd3RUb2tlbiJ9.TWDS0cuHGIDW_16EH2RS4z2B-wnuuPmMNd_lre505qY' + ); +}; + +const getAppType = async () => { + // 🔥 If already stored, don't call API again + const storedType = getSession('AppType'); + if (storedType) { + return storedType === 'Wholesale'; + } + + const AppId = getSession('AppId'); + if (!AppId) return null; + + const response = await axios.get( + `${apiCommonUrl}/application?AppId=${AppId}` + ); + + const subCategoryName = + response?.data?.data?.[0]?.SubCategoryName?.toLowerCase(); + + const isWholesale = subCategoryName === 'wholesale'; + + sessionStore('AppType', isWholesale ? 'Wholesale' : 'Sale'); + + return isWholesale; +}; + +const fetchComponent = async () => { + try { + initSession(); + + const isWholesale = await getAppType(); + if (isWholesale === null) return null; + + return isWholesale + ? import('./Pages/AppPage/WholesaleAppPage.jsx') + : import('./Pages/AppPage/AppPage.jsx'); + } catch (err) { + console.error('API call failed:', err); + return null; + } +}; +const fetchHomeComponent = async () => { + try { + initSession(); + + const isWholesale = await getAppType(); + if (isWholesale === null) return null; + + return isWholesale + ? import('./Pages/DashBoard/WholesaleDashboard.jsx') + : import('./Pages/DashBoard/RetailDashboard.jsx'); + } catch (err) { + console.error('API call failed:', err); + return null; + } +}; + +export const routesConfig = [ + { path: `${subDirectory}customer-display`, component: CustomerDisplay }, + { path: `${subDirectory}PricingPage`, component: PricingPage }, + { + path: `${subDirectory}android-app`, + component: AndroidApp, + empAccess: 'Android App', + }, + { path: `${subDirectory}purchaseordermail`, component: PurchaseOrderMail }, + { + path: `${subDirectory}viewbill`, + component: LinkUrlCreate, + empAccess: 'View Bill', + }, + // writed b=y sree + // { + // path: `${subDirectory}MenuQRCode`, + // component: CustomerMenuPage, + // }, + { + path: `${subDirectory}purchaseconfirm`, + component: CustomerPurchaseConfirm, + }, + { + path: `${subDirectory}viewpurchaseorder`, + component: PurchaseLink, + }, + { + path: `${subDirectory}combolayout3`, + component: ComboLayout3, + }, + + { + path: `${subDirectory}`, + component: React.lazy(() => + fetchComponent().then((module) => ({ default: module.default })) + ), + children: [ + { + path: '/', + component: React.lazy(() => + fetchHomeComponent().then((module) => ({ default: module.default })) + ), + }, + { path: `relieve-request`, component: RelieveRequestForm }, + { path: 'branch-login', component: BranchLogin }, + { path: 'branch-all', component: BackToBranchLogin }, + { path: 'back-to-login', component: BacktoLogin }, + { path: 'logout', component: Logout }, + { path: 'redirect-apps', component: RedirectApps }, + { path: 'redirect-userprofile', component: RedirectUserProfile }, + // { path: 'transaction', component: WSTransaction } + ], + }, + { + path: `${subDirectory}qrprint`, + component: CreditCustomerPrint, + empAccess: 'Public', + }, + { path: `${subDirectory}sales`, component: BookingPage, empAccess: 'Sales' }, + { + path: `${subDirectory}wholesales`, + component: WholesaleBookingPage, + empAccess: 'Whole Sales', + }, + { + path: `${subDirectory}kiosksales`, + component: KioskBookingPage, + empAccess: 'Kiosk Sales', + }, + { + path: `${subDirectory}kiosk-receipt`, + component: KioskBookingReceipt, + empAccess: 'Public', + }, + { + path: `${subDirectory}payment-page`, + component: PaymentDetailsPage, + empAccess: 'Public', + }, + { path: `${subDirectory}reprint`, component: Reprint }, + { + path: `${subDirectory}transaction`, + component: React.lazy(() => + fetchComponent().then((module) => ({ default: module.default })) + ), + children: [ + { path: 'sales', component: WSTransaction, empAccess: 'Sales' }, + { path: 'payment-received', component: PaymentReceived }, + { path: 'seller-payment', component: SellerMasterTran }, + ], + }, + { + path: `${subDirectory}kitchen`, + component: React.lazy(() => + fetchComponent().then((module) => ({ default: module.default })) + ), + children: [ + { path: 'kot', component: KOT, empAccess: 'KOT' }, + { + path: 'kot-display', + component: CustomerKOTDisplay, + empAccess: 'KOT Display', + }, + ], + }, + { + path: `${subDirectory}report`, + component: React.lazy(() => + fetchComponent().then((module) => ({ default: module.default })) + ), + children: [ + { + path: 'PublicQrCode', + component: PublicQrCode, + empAccess: 'SelfBooking QR Code', + }, + { + path: 'MenuQRCode', + component: MenuQRCode, + empAccess: 'MenuQRCode', + }, + // { + // path: 'tipamountsettlementlist', + // component: TipAmountSettlementList, + // empAccess: 'Tips', + // }, + // { + // path: 'EmployeeSettlement', + // component: EmployeeSettlement, + // empAccess: 'Incentive', + // }, + { + path: 'Settlement', + component: Settlement, + empAccess: 'Settlement', + }, + + { + path: 'datewisereport', + component: DateWiseReport, + empAccess: 'Daily Sales', + }, + { + path: 'itemwisereport', + component: ItemWiseReport, + empAccess: 'By Item', + }, + { + path: 'top-selling-products', + component: TopSellingProducts, + empAccess: 'Top Selling Products', + }, + { + path: 'estimateitemwisereport', + component: EstimateItemWiseReport, + empAccess: 'By Item', + }, + { + path: 'estimatedatewisereport', + component: EstimateDateWiseReport, + empAccess: 'Daily Sales', + }, + { path: 'ledgerreport', component: LedgerReport, empAccess: 'Ledger' }, + { path: 'ledger', component: LegderList, empAccess: 'Ledger' }, + { + path: 'stock-in-hand', + component: StockinHand, + empAccess: 'Stock Inhand', + }, + { + path: 'abstract', + component: WholeSaleAbstract, + empAccess: 'Abstract For Sales', + }, + { + path: 'sellerabstract', + component: WholeSaleSellerAbstract, + empAccess: 'Abstract For Purchase', + }, + { + path: 'salesreport', + component: WholeSaleSalesReport, + empAccess: 'Daily Sales', + }, + { + path: 'purchasereport', + component: WholeSalePurchaseReport, + empAccess: 'Purchase', + }, + { + path: 'paymentpurchasereport', + component: WholeSalePaymentPurchaseReport, + empAccess: 'Purchase Payment', + }, + { + path: 'paymentsalesreport', + component: WholeSalePaymentSalesReport, + empAccess: 'Sales Payment', + }, + { + path: 'reprintreasonreport', + component: ReprintReasonReportList, + empAccess: 'Reprint Details', + }, + { + path: 'membership', + component: MembershipReport, + empAccess: 'Membership Report', + }, + { + path: 'revenueitemWisereport', + component: RevenueItemWiseReport, + empAccess: 'Gross Margin', + }, + + { + path: 'PurchaseOrderReport', + component: PurchaseOrderReport, + empAccess: 'Purchase', + }, + ], + }, + { + path: `${subDirectory}setting`, + component: React.lazy(() => + fetchComponent().then((module) => ({ default: module.default })) + ), + children: [ + { + path: 'common-master', + component: CommonMaster, + empAccess: 'Common Master', + }, + { + path: 'other-services', + component: OtherServicesList, + empAccess: 'OtherServices', + }, + { + path: 'other-services/new', + component: (props) => , + empAccess: 'OtherServices', + }, + { + path: 'other-services/update', + component: (props) => , + empAccess: 'OtherServices', + }, + { + path: 'config-type', + component: ConfigType, + access: 'Super Admin', + empAccess: 'Config Type', + }, + { + path: 'languages', + component: SpeechLanguagesList, + access: 'Super Admin', + empAccess: 'Languages', + }, + { + path: 'preference', + component: PreferenceList, + empAccess: 'Preference', + }, + { + path: 'price-change', + component: StockPriceUpdate, + empAccess: 'Price Change', + }, + { + path: 'extra-charges', + component: ExtraChargesList, + empAccess: 'Extra Charges', + }, + { + path: 'Exchange-Return-policy', + component: ExchangeAndReplacementList, + empAccess: 'Exchange / Return', + }, + { + path: 'Exchange-Return-policy/new', + component: (props) => ( + + ), + empAccess: 'Exchange / Return', + }, + { + path: 'exchange-return-mapping', + component: ExchangeReturnMapList, + empAccess: 'Rules Mapping', + }, + { + path: 'exchange-return-mapping/new', + component: (props) => ( + + ), + empAccess: 'Rules Mapping', + }, + + { + path: 'product-catalogue-list', + component: ProductCatalogueList, + empAccess: 'Product Catalogue', + }, + { + path: 'product-catalogue', + component: Productcatlogue, + empAccess: 'Product Catalogue', + }, + { path: 'admin-tax', component: AdminTax, empAccess: 'Tax' }, + { + path: 'create-ticket', + component: TicketForm, + empAccess: 'Create Ticket', + }, + { + path: 'payment-options', + component: PaymentOptions, + empAccess: 'Payment Options', + }, + { + path: 'payment-received-retail', + component: PaymentReceivedRetail, + empAccess: 'Payment Updates', + }, + { + path: 'payment-device-access', + component: PaymentDeviceForm, + empAccess: 'Payment Device Access', + }, + { + path: 'counter-category-mapping', + component: CounterCategoryMappingForm, + empAccess: 'Counter Mapping', + }, + + { + path: 'wholesale-product-master', + component: WholeSaleProductList, + empAccess: 'Product', + }, + { + path: 'product-entry', + component: ProductEntryList, + empAccess: 'Product Entry', + }, + { + path: 'product', + component: ProductMaster, + empAccess: 'Product Entry', + }, + + { + path: 'product-entry/new', + component: (props) => , + empAccess: 'Product Entry', + }, + { + path: 'wholesale-extracharges/new', + component: ItemEntry, + empAccess: 'Extra Charges', + }, + { + path: 'wholesale-extracharges', + component: ExtraChrgesList, + empAccess: 'Extra Charges', + }, + { + path: 'membership-master/list', + component: MembershipList, + empAccess: 'Membership', + }, + { + path: 'membership-master/new', + component: (props) => , + empAccess: 'Membership', + }, + { + path: 'membership-master/update', + component: (props) => , + empAccess: 'Membership', + }, + + { + path: 'opening-stock/new', + component: OpeningStock, + empAccess: 'Opening Stock', + }, + { + path: 'opening-stock', + component: OpeningStockList, + empAccess: 'Opening Stock', + }, + { + path: 'stock-adjustment', + component: StockAdjustment, + empAccess: 'Stock Adjustment', + }, + { + path: 'stock-adjustment-list', + component: StockAdjustmentList, + empAccess: 'Stock Adjustment', + }, + { + path: 'product-master', + component: ProductMaster, + empAccess: 'Add Product', + }, + { + path: 'product-master/combo', + component: ProductMaster, + component: (props) => , + empAccess: 'Add Product', + }, + { + path: 'product-master/new', + component: (props) => , + empAccess: 'Add Product', + }, + { + path: 'products-master/new', + component: (props) => , + empAccess: 'Add Product', + }, + { + path: 'products-master/update', + component: (props) => , + empAccess: 'Add Product', + }, + { + path: 'product-master/update', + component: (props) => , + empAccess: 'Add Product', + }, + { + path: 'product-master/turbo-add', + component: (props) => , + empAccess: 'Add Product', + }, + { + path: 'image-bulk-upload', + component: ImageBulkUpload, + empAccess: 'Image Upload', + }, + { + path: 'rack-master', + component: RackList, + empAccess: 'Add Rack', + }, + { + path: 'rack-master/new', + component: (props) => , + empAccess: 'Add Rack', + }, + { + path: 'rack-master/update', + component: (props) => , + empAccess: 'Add Rack', + }, + { + path: 'slot-management', + component: (props) => , + empAccess: 'Slot Management', + }, + { + path: 'slot-management-list', + component: (props) => , + empAccess: 'Slot Management', + }, + { + path: 'productBased-offer', + component: OfferList, + empAccess: 'Product Based', + }, + + { + path: 'productBased-offer/new', + component: (props) => , + empAccess: 'Product Based', + }, + { + path: 'productBased-offer/update', + component: (props) => , + empAccess: 'Product Based', + }, + { + path: 'code-base', + component: CodeBaseList, + empAccess: 'Code Based', + }, + { + path: 'code-base/new', + component: (props) => , + empAccess: 'Code Based', + }, + { + path: 'code-base/new', + component: (props) => , + empAccess: 'Code Based', + }, + + { path: 'item-wise', component: ItemWise, empAccess: 'Item Wise Offer' }, + { + path: 'quantity-wise', + component: QuantityWise, + empAccess: 'Quantity Wise Offer', + }, + { + path: 'buyone-getone', + component: BuyOneGetOneForm, + empAccess: 'Buy X and Get X or Y', + }, + + { + path: 'sales-wise', + component: SalesWiseList, + empAccess: 'Sales Wise Offer', + }, + { + path: 'sales-wise/new', + component: (props) => , + empAccess: 'Sales Wise Offer', + }, + { + path: 'sales-wise/update', + component: (props) => , + empAccess: 'Sales Wise Offer', + }, + + { + path: 'loyalty-point', + component: LoyaltyPointsList, + empAccess: 'Loyalty Cards', + }, + { + path: 'loyalty-based', + // component: LoyaltyBased, + component: LoyaltyBasedList, + empAccess: 'Loyalty Points', + }, + { + path: 'loyalty-based/new', + component: (props) => , + empAccess: 'Loyalty Points', + }, + { + path: 'loyalty-based/update', + component: (props) => , + empAccess: 'Loyalty Points', + }, + + { + path: 'loyalty-point/new', + component: (props) => ( + + ), + empAccess: 'Loyalty Cards', + }, + { + path: 'loyalty-point/update', + component: (props) => ( + + ), + empAccess: 'Loyalty Cards', + }, + // { path: 'loyalty-point/new', component: (props) => , empAccess: "Loyalty Cards" }, + // { path: 'loyalty-point/update', component: (props) => , empAccess: "Loyalty Cards" }, + + { + path: 'bundle-offer', + component: BundleOfferList, + empAccess: 'Bundle Offer', + }, + { + path: 'bundle-offer/new', + component: (props) => , + empAccess: 'Bundle Offer', + }, + { + path: 'bundle-offer/update', + component: (props) => , + empAccess: 'Bundle Offer', + }, + + { + path: 'coupon', + component: CouponWiseOfferlist, + empAccess: 'Coupon Wise Offer', + }, + { + path: 'coupon/new', + component: (props) => ( + + ), + empAccess: 'Coupon Wise Offer', + }, + { + path: 'coupon/update', + component: (props) => ( + + ), + empAccess: 'Coupon Wise Offer', + }, + // { path: 'coupon/new', component: (props) => , empAccess: "Coupon Wise Offer" }, + // { path: 'coupon/update', component: (props) => , empAccess: "Coupon Wise Offer" }, + + { path: 'promo-code', component: PromocodeList, empAccess: 'Promo Code' }, + { + path: 'promo-code/new', + component: (props) => ( + + ), + empAccess: 'Promo Code', + }, + { + path: 'promo-code/update', + component: (props) => ( + + ), + empAccess: 'Promo Code', + }, + // { path: 'promo-code/new', component: (props) => , empAccess: "Promo Code" }, + // { path: 'promo-code/update', component: (props) => , empAccess: "Promo Code" }, + + { path: 'offer-code', component: OfferCodeList, empAccess: 'Offer Code' }, + { + path: 'offer-code/new', + component: (props) => ( + + ), + empAccess: 'Offer Code', + }, + { + path: 'offer-code/update', + component: (props) => ( + + ), + empAccess: 'Offer Code', + }, + // { path: 'offer-code/new', component: (props) => , empAccess: "Offer Code" }, + // { path: 'offer-code/update', component: (props) => , empAccess: "Offer Code" }, + + { + path: 'customer-master', + component: CustomerMasterList, + empAccess: 'Customer', + }, + { + path: 'customer-master/new', + component: (props) => , + empAccess: 'Customer', + }, + { + path: 'customer-master/update', + component: (props) => , + empAccess: 'Customer', + }, + { + path: 'automated-reorder', + component: AutomatedReorderList, + empAccess: 'Automated Reorder', + }, + { + path: 'automated-reorder/new', + component: (props) => , + empAccess: 'Automated Reorder', + }, + { + path: 'automated-reorder/update', + component: (props) => , + empAccess: 'Automated Reorder', + }, + { + path: 'purchase-entry', + component: StockList, + empAccess: 'Product Receipt', + }, + { + path: 'purchase-entry/new', + component: (props) => , + empAccess: 'Product Receipt', + }, + { + path: 'purchase-entry/update', + component: (props) => , + empAccess: 'Product Receipt', + }, + + { + path: 'receive-stocks', + component: StockReceivedList, + empAccess: 'Purchase Order', + }, + { + path: 'gst-invoice-setup/new', + component: (props) => , + empAccess: 'Gst Invoice Setup', + }, + { + path: 'gst-invoice-setup/update', + component: (props) => ( + + ), + empAccess: 'Gst Invoice Setup', + }, + { + path: 'gst-invoice-setup', + component: gstInvoiceSetUpList, + empAccess: 'Gst Invoice Setup', + }, + { + path: 'purchase-order', + component: PurchaseOrderList, + empAccess: 'Purchase Order', + }, + { + path: 'purchase-order/new', + component: (props) => , + empAccess: 'Purchase Order', + }, + + { + path: 'purchase-return/list', + component: PurchaseReturnget, + empAccess: 'Product Return', + }, + { + path: 'purchaseconfirm', + component: CustomerPurchaseConfirm, + // empAccess: 'View Bill', + }, + { + path: 'purchase-return', + component: PurchaseReturn, + empAccess: 'Product Return', + }, + //free Products + { + path: 'free-product-master', + component: FreeProductList, + empAccess: 'Add Product', + }, + + { + path: 'free-purchase-entry', + component: FreePurchaseEnteryList, + empAccess: 'Purchase Entry', + }, + { + path: 'free-purchase-entry/new', + component: (props) => ( + + ), + empAccess: 'Purchase Entry', + }, + { + path: 'free-purchase-entry/update', + component: (props) => ( + + ), + empAccess: 'Purchase Entry', + }, + + { + path: 'free-purchase-order', + component: FreePurchaseOrderList, + empAccess: 'Purchase Order', + }, + { + path: 'free-purchase-order/new', + component: (props) => ( + + ), + empAccess: 'Purchase Order', + }, + + { + path: 'free-purchase-return', + component: FreePurchaseReturnList, + empAccess: 'Purchase Return', + }, + { + path: 'free-purchase-return/new', + component: FreePurchaseReturnForm, + empAccess: 'Purchase Return', + }, + //free Products + { + path: 'sales-quotation', + component: PurchaseQuotationForm, + empAccess: 'Sales Quotation', + }, + { + path: 'sales-quotation/list', + component: PurchaseQuotationList, + empAccess: 'Sales Quotation', + }, + { + path: 'sales-order', + component: SalesOrder, + empAccess: 'Sales Order', + }, + // { path: 'delivery-challan', + // component: DeliveryChallanList, + // empAccess: 'Delivery Challan' + // }, + { + path: 'delivery-challan/list', + component: DeliveryChallanList, + empAccess: 'Delivery Challan', + }, + { + path: 'delivery-challan', + component: DeliveryChallanForm, + empAccess: 'Delivery Challan', + }, + { + path: 'delivery-challan-to-invoice/list', + component: DeliveryChallanToInvoiceList, + empAccess: 'DC to Invoice', + }, + { + path: 'delivery-challan-to-invoice', + component: DeliveryChallanToInvoiceForm, + empAccess: 'DC to Invoice', + }, + + { path: 'shift-master', component: ShiftMasterList, empAccess: 'Shift' }, + { + path: 'shift-master/new', + component: (props) => , + empAccess: 'Shift', + }, + { + path: 'shift-master/update', + component: (props) => , + empAccess: 'Shift', + }, + + { + path: 'employee-master', + component: EmployeeMasterList, + empAccess: 'Add Employee', + }, + { + path: 'employee-master/new', + component: (props) => , + empAccess: 'Add Employee', + }, + { + path: 'employee-master/update', + component: (props) => , + empAccess: 'Add Employee', + }, + { + path: 'commission-or-incentive-master', + component: EmpCommisionOrIncentiveList, + empAccess: 'Incentive', + }, + { + path: 'commission-or-incentive-master/new', + component: (props) => ( + + ), + empAccess: 'Incentive', + }, + { + path: 'commission-or-incentive-master/update', + component: (props) => ( + + ), + empAccess: 'Incentive', + }, + { + path: 'supplier-master', + component: SupplierMasterList, + empAccess: 'Add Supplier', + }, + { + path: 'supplier-master/new', + component: (props) => , + empAccess: 'Add Supplier', + }, + { + path: 'supplier-master/update', + component: (props) => , + empAccess: 'Add Supplier', + }, + { + path: 'stock-transfer', + component: CreateTransfer, + empAccess: 'Create Transfer', + }, + { + path: 'stock-dispatch', + component: Dispatch, + empAccess: 'Dispatch', + }, + { + path: 'stock-transferlist', + component: StockTransferList, + empAccess: 'Create Transfer', + }, + { + path: 'supplierproductmapping-master', + component: SupplierProductMapping, + empAccess: 'Product Mapping', + }, + // { path: 'supplier-master/new', component: (props) => , empAccess: "Supplier" }, + // { path: 'supplier-master/update', component: (props) => , empAccess: "Supplier" }, + + { + path: 'dinein-master', + component: DiningMasterList, + empAccess: 'Dine In', + }, + { + path: 'dinein-master/new', + component: (props) => , + empAccess: 'Dine In', + }, + { + path: 'dinein-master/edit', + component: (props) => , + empAccess: 'Dine In', + }, + + { + path: 'combo-master', + component: ComboList, + empAccess: 'Add Product', + }, + { + path: 'combo-master/new', + component: (props) => , + empAccess: 'Add Product', + }, + { + path: 'combo-master/update', + component: (props) => , + empAccess: 'Add Product', + }, + + { + path: 'combo-offer-master', + component: ComboOfferMaster, + empAccess: 'Combo Price', + }, + + { + path: 'payment-details', + component: PaymentDetailsList, + empAccess: 'Payment Details', + }, + { + path: 'payment-details/new', + component: (props) => , + empAccess: 'Payment Details', + }, + { + path: 'payment-details/update', + component: (props) => , + empAccess: 'Payment Details', + }, + + { + path: 'payment-failed-details', + component: PaymentFailedDetailsList, + empAccess: 'Payment Failed Details', + }, + { + path: 'TableMapping/update', + component: (props) => , + empAccess: 'Table Mapping', + }, + { + path: 'TableMapping', + component: TableMAppingList, + empAccess: 'Table Mapping', + }, + { + path: 'employee-access', + component: EmpAccessList, + empAccess: 'Employee Access', + }, + { + path: 'employee-access/new', + component: (props) => , + empAccess: 'Employee Access', + }, + { + path: 'employee-access/update', + component: (props) => , + empAccess: 'Employee Access', + }, + { + path: 'employee-screenrights', + component: EmpScreenAccessList, + empAccess: 'Employee Screen Rights', + }, + { + path: 'employee-screenrights/new', + component: (props) => ( + + ), + empAccess: 'Employee Screen Rights', + }, + { + path: 'employee-screenrights/update', + component: (props) => ( + + ), + empAccess: 'Employee Screen Rights', + }, + + { + path: 'cancel-reschedule-rules', + component: CancellationList, + empAccess: 'Cancel / Reschedule', + }, + { + path: 'cancel-reschedule-rules/new', + component: (props) => , + empAccess: 'Cancel / Reschedule', + }, + { + path: 'cancel-reschedule-rules/update', + component: (props) => , + empAccess: 'Cancel / Reschedule', + }, + + { + path: 'cancel-applicable-product', + component: CancelApplicableProd, + empAccess: 'Cancel Applicable Products', + }, + { + path: 'cancel-paymentchange', + component: ChangePaymentmode, + empAccess: 'Payment Mode Change', + }, + { + path: 'cancel-pendingpayment', + component: CancellationListPending, + empAccess: 'Cancel Unpaid Order', + }, + { + path: 'sales-bill-cancel', + component: SalesBillCancel, + empAccess: 'Sales Entry Cancel', + }, + { + path: 'sales-bill-product-return/list', + component: SalesBillProductsReturnList, + empAccess: 'Sales Product Return', + }, + { + path: 'sales-bill-product-return', + component: SalesBillProductsReturn, + empAccess: 'Sales Product Return', + }, + { + path: 'booking-reschedule', + component: BookingReScedule, + empAccess: 'Booking Reschedule', + }, + { + path: 'booking-reschedule/list', + component: BookingReSceduleList, + empAccess: 'Booking Reschedule', + }, + + { + path: 'wholesale-preorder', + component: WsPreorder, + empAccess: 'Preorder', + }, + { + path: 'wholesale-preorder/new', + component: (props) => , + empAccess: 'Preorder', + }, + { + path: 'wholesale-preorder/update', + component: (props) => , + empAccess: 'Preorder', + }, + + { + path: 'custom-product', + component: StoreRecipelist, + empAccess: 'Bill Of Material', + }, + { + path: 'custom-product/new', + component: (props) => , + empAccess: 'Bill Of Material', + }, + { + path: 'custom-product/update', + component: (props) => , + empAccess: 'Bill Of Material', + }, + + { + path: 'store-to-production', + component: Storekitchenlist, + empAccess: 'Material Issue', + }, + { + path: 'store-to-production/new', + component: (props) => , + empAccess: 'Material Issue', + }, + { + path: 'store-to-production/update', + component: (props) => , + empAccess: 'Material Issue', + }, + + { + path: 'ready-for-sale', + component: KitchenFinishlist, + empAccess: 'Finished Goods', + }, + { + path: 'ready-for-sale/new', + component: (props) => , + empAccess: 'Finished Goods', + }, + { + path: 'ready-for-sale/update', + component: (props) => , + empAccess: 'Finished Goods', + }, + + { + path: 'gateway-master-configuration/new', + component: (props) => ( + + ), + empAccess: 'Gateway Master Configuration', + }, + { + path: 'gateway-master-configuration/update', + component: (props) => ( + + ), + empAccess: 'Gateway Master Configuration', + }, + { + path: 'gateway-master-configuration/list', + component: GatewayMasterConfigurationList, + empAccess: 'Gateway Master Configuration', + }, + ], + }, + { + path: `${subDirectory}sales`, + component: React.lazy(() => + fetchComponent().then((module) => ({ default: module.default })) + ), + children: [{ path: 'dine-in', component: TableBooking }], + empAccess: 'Sales Entry', + }, + { + path: `${subDirectory}saleslayouts`, + component: React.lazy(() => + fetchComponent().then((module) => ({ default: module.default })) + ), + children: [ + { + path: 'sales-selection', + component: BookingSelectionPage, + empAccess: 'Sales Screen', + }, + { + path: 'print-selection', + component: PrintSelectionPage, + empAccess: 'Print Forms', + }, + { + path: 'kiosk-selection', + component: KioskMainPage, + empAccess: 'Kiosk Screen', + }, + { + path: `barcode-qr-selection`, + component: BarcodeTemplateSetup, + empAccess: 'Barcode / QR', + }, + { + path: 'kiosk-component', + component: KioskComponentList, + access: 'Super Admin', + empAccess: 'Kiosk Component', + }, + { + path: 'component-master', + component: ComponentMasterList, + access: 'Super Admin', + empAccess: 'Component Master', + }, + { + path: 'barcode-master', + component: BarcodeComponentList, + access: 'Super Admin', + empAccess: 'Barcode Component', + }, + { + path: 'component-master/new', + component: (props) => , + access: 'Super Admin', + empAccess: 'Component Master', + }, + { + path: 'component-master/update', + component: (props) => ( + + ), + access: 'Super Admin', + empAccess: 'Component Master', + }, + { + path: 'theme-creation', + component: ThemeCreation, + access: 'Super Admin', + empAccess: 'Theme Creation', + }, + { + path: 'themeselection/new', + component: (props) => , + access: 'Super Admin', + empAccess: 'Theme Creation', + }, + { + path: 'themeselection/update', + component: (props) => , + access: 'Super Admin', + empAccess: 'Theme Creation', + }, + ], + }, +]; +// this is vite file +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig(({ mode }) => { + const isProd = mode === "production"; + + return { + plugins: [react()], + + base: isProd ? "/apps/retail/" : "/", //for capcitor base: isProd ? "/" : "/", + + envDir: "src", + envPrefix: "ENV_", + + server: { + host: true, // 🔥 auto detect your IP + port: process.env.PORT || 3015, + }, + + build: { + minify: "esbuild", + esbuild: { + drop: isProd ? ["console", "debugger"] : [], + }, + }, + }; +}); +/// android xml file ; + + + + + + + + + + + + + + + + + + + + + + + + +//pathfile android\app\src\main\res\xml\file_paths.xml + + + + + +///package.json + +{ + "name": "retail-application", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "node --max-old-space-size=4096 node_modules/vite/bin/vite.js build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "format": "prettier --write ." + }, + "dependencies": { + "@ant-design/plots": "^2.6.8", + "@capacitor-community/file-opener": "^8.0.0", + "@capacitor-community/speech-recognition": "^7.0.1", + "@capacitor-mlkit/barcode-scanning": "^8.0.1", + "@capacitor/android": "^8.3.0", + "@capacitor/app": "^8.0.1", + "@capacitor/cli": "^8.3.0", + "@capacitor/core": "^8.3.0", + "@capacitor/filesystem": "^8.1.2", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/material": "^5.15.18", + "@react-google-maps/api": "^2.20.8", + "@reduxjs/toolkit": "^1.9.5", + "@tanstack/react-query": "^5.90.11", + "@tanstack/react-query-devtools": "^5.91.1", + "@tanstack/react-virtual": "^3.13.18", + "@types/node": "^25.5.0", + "@vitejs/plugin-legacy": "^8.0.1", + "@zxing/library": "^0.21.3", + "antd": "^5.17.4", + "antd-img-crop": "^4.22.0", + "aos": "^2.3.4", + "apexcharts": "^5.10.4", + "axios": "^1.13.6", + "browser-image-compression": "^2.0.2", + "classnames": "^2.5.1", + "cropperjs": "^1.6.2", + "crypto-js": "^4.1.1", + "date-fns": "^4.1.0", + "devtools-detect": "^4.0.2", + "exceljs": "^4.4.0", + "file-saver": "^2.0.5", + "history": "^5.3.0", + "html2canvas": "^1.4.1", + "html2pdf": "^0.0.11", + "html5-qrcode": "^2.3.8", + "jquery": "^3.7.1", + "js-cookie": "^3.0.5", + "jsbarcode": "^3.11.6", + "jspdf": "^4.2.1", + "lucide": "^0.577.0", + "lucide-react": "^0.536.0", + "moment": "^2.30.1", + "number-to-words": "^1.2.4", + "pdf-lib": "^1.17.1", + "qr-scanner": "^1.4.2", + "qrcode": "^1.5.3", + "qrcode.react": "^4.2.0", + "react": "^18.3.1", + "react-apexcharts": "^2.1.0", + "react-beautiful-dnd": "^13.1.1", + "react-color": "^2.19.3", + "react-countup": "^6.5.3", + "react-device-detect": "^2.2.3", + "react-dom": "^18.3.1", + "react-icons": "^4.12.0", + "react-image-crop": "^11.0.10", + "react-qr-code": "^2.0.13", + "react-redux": "^8.1.2", + "react-router-dom": "^6.23.1", + "react-select": "^5.8.0", + "react-signature-canvas": "^1.0.7", + "react-speech-recognition": "^3.10.0", + "react-timer-hook": "^3.0.7", + "react-transition-group": "^4.4.5", + "recharts": "^3.5.0", + "string-similarity": "^4.0.4", + "tesseract.js": "^6.0.0", + "universal-cookie": "^8.0.1", + "webfontloader": "^1.6.28", + "zustand": "^5.0.8" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^6.0.1", + "esbuild": "^0.27.4", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "prettier": "^3.5.3", + "rollup-plugin-obfuscator": "^1.1.0", + "sass": "^1.98.0", + "terser": "^5.31.3", + "vite": "^8.0.0", + "vite-plugin-obfuscator": "^1.0.5", + "vite-plugin-remove-console": "^2.2.0" + } +} +