extendedPlan

This commit is contained in:
Tamilselvan 2026-02-11 12:45:21 +05:30
commit ea03af404f
74 changed files with 10954 additions and 7431 deletions

View File

@ -22,6 +22,7 @@
"@reduxjs/toolkit": "^1.9.5", "@reduxjs/toolkit": "^1.9.5",
"@tanstack/react-query": "^5.90.11", "@tanstack/react-query": "^5.90.11",
"@tanstack/react-query-devtools": "^5.91.1", "@tanstack/react-query-devtools": "^5.91.1",
"@tanstack/react-virtual": "^3.13.18",
"antd": "^5.17.4", "antd": "^5.17.4",
"antd-img-crop": "^4.22.0", "antd-img-crop": "^4.22.0",
"aos": "^2.3.4", "aos": "^2.3.4",

View File

@ -1,52 +1,36 @@
// AppRoutes.jsx import { useEffect, lazy, Suspense } from 'react';
import React, { useEffect, useState, useRef, lazy, } from 'react';
import { Routes, Route } from 'react-router-dom'; import { Routes, Route } from 'react-router-dom';
import { useNavigate } from 'react-router-dom'; import { useSelector } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import ProtectedRoutes from './ProtectedRoutes'; import ProtectedRoutes from './ProtectedRoutes';
import SelfBooking from './Pages/SelfBooking/SelfBooking.jsx';
import SelfBooking from './Pages/SelfBooking/SelfBooking.jsx' import { isMobile, isIOS } from 'react-device-detect';
import { isMobile, isIOS } from "react-device-detect";
// const { routesConfig } = lazy(() => import('./routesConfig'));
import { routesConfig } from './routesConfig'; import { routesConfig } from './routesConfig';
import { import { GlobalItemCard } from './Features/BookingScreen/BookingData/BookingData.js';
ChangeAppExpDateData, import { clearSession, getSession } from './Services/Others.js';
changeHeightforExpDate,
getAppSubscriptionDate,
GlobalItemCard,
} from './Features/BookingScreen/BookingData/BookingData.js';
import {
checkSession,
GenerateLogout,
} from './Features/BrachLogin/BranchLogin.js';
import {
clearSession,
getSession,
TokendecryptedValuesFun,
} from './Services/Others.js';
import devtools from 'devtools-detect'; import devtools from 'devtools-detect';
import KisokSelBooking from './Pages/SelfBooking/KisokSelBooking.jsx'; const KisokSelBooking = lazy(
import IndividualBooking from './Pages/SelfBooking/IndividualBooking.jsx'; () => import('./Pages/SelfBooking/KisokSelBooking')
);
const IndividualBooking = lazy(
() => import('./Pages/SelfBooking/IndividualBooking')
);
const commonSubDir = import.meta.env.ENV_COMMON_BASE_URL; const commonSubDir = import.meta.env.ENV_COMMON_BASE_URL;
const subDirectory = import.meta.env.ENV_BASE_URL; const subDirectory = import.meta.env.ENV_BASE_URL;
import "../ownLib/my-ui-lib.css" import '../ownLib/my-ui-lib.css';
import CustomerMenuPage from './Pages/Reports/MenuQRCode/CustomerMenuPage.jsx'; import CustomerMenuPage from './Pages/Reports/MenuQRCode/CustomerMenuPage.jsx';
import WeightScaleApp from './Pages/BookingScreen/WeightscaleApp.jsx'; import WeightScaleApp from './Pages/BookingScreen/WeightscaleApp.jsx';
import useSubscriptionManager from './useSubscriptionManager.js';
import { getPurchasedAppDetails, postInvoice } from './Features/BookingScreen/Pricing/Pricing.js'; import useSessionManager from './useSessionManager.js';
import { sendSms } from './Features/Payment/PaymentDetails/PaymentDetails.js';
import ExtendSubscriptionModal from './Pages/ExtentedModal/ExtendSubscriptionModal.jsx'; import ExtendSubscriptionModal from './Pages/ExtentedModal/ExtendSubscriptionModal.jsx';
const AppRoutes = () => { const AppRoutes = () => {
const navigate = useNavigate();
const dispatch = useDispatch();
const ItemCard = useSelector(GlobalItemCard); const ItemCard = useSelector(GlobalItemCard);
const [remainingDays, setRemainingDays] = useState(null); const { sessionData, logout } = useSessionManager(ItemCard);
const prevRemainingDays = useRef(null); const { remainingDays, handleCancel, handlePay, freeExtend, extendModel } = useSubscriptionManager(sessionData, logout);
const [sessionData, setSessionData] = useState(null);
const [devToolsOpen, setDevToolsOpen] = useState(false);
const [extendModel, setExtendModel] = useState(false);
useEffect(() => { useEffect(() => {
const handlePopState = (e) => { const handlePopState = () => {
const SessionId = getSession('SessionId'); const SessionId = getSession('SessionId');
if (!SessionId) { if (!SessionId) {
alert( alert(
@ -68,296 +52,18 @@ const AppRoutes = () => {
}; };
}, []); }, []);
//cmd it start
// useEffect(() => {
// sessionCheckFun()
// }, [navigate, ItemCard]);
//cmd it End
useEffect(() => { useEffect(() => {
const loadSessionData = () => { if (isMobile || isIOS) return;
const CompId = getSession('CompId'); const timer = setInterval(() => {
const AppId = getSession('AppId'); if (devtools.isOpen) {
const BranchId = getSession('BranchId'); document.body.innerHTML =
const UserType = getSession('UserType'); "<h1 style='color:red;text-align:center'>Close Inspect to continue</h1>";
console.log('loadSessionData:', CompId, AppId, BranchId, UserType);
if (CompId && AppId && BranchId) {
setSessionData({ CompId, AppId, BranchId, UserType });
return true; // Indicate that session data is available
} }
return false; // Indicate that session data is not yet available }, 1000);
};
if (!loadSessionData()) { return () => clearInterval(timer);
const interval = setInterval(() => {
if (loadSessionData()) {
clearInterval(interval); // Stop checking once data is available
}
}, 1000);
return () => clearInterval(interval); // Cleanup interval on unmount
}
}, []); }, []);
useEffect(() => {
const fetchExpDate = async () => {
if (!sessionData) {
console.log('Session data not available, skipping API call...');
return;
}
try {
const { CompId, AppId, BranchId, UserType } = sessionData;
const data = { CompId, BranchId, AppId };
let res = await dispatch(getAppSubscriptionDate(data)).unwrap();
if (res?.data?.statusCode === 1 && res?.data?.data?.length > 0) {
const expData = res?.data?.data?.[0];
if (prevRemainingDays.current !== expData.RemainingDays) {
prevRemainingDays.current = expData.RemainingDays;
setRemainingDays(expData.RemainingDays);
dispatch(ChangeAppExpDateData(expData));
dispatch(changeHeightforExpDate(expData.RemainingDays));
if (
expData.RemainingDays < 1 &&
expData.RemainingHours < 1 &&
expData.RemainingMinutes < 1 &&
expData.RemainingSeconds < 1
) {
if (
(UserType !== 'Super Admin' ||
UserType !== 'Super Admin User') && (expData?.PlanType?.toLowerCase() == "extend expired")
) {
console.log('Subscription expired, logging out...');
alert(
'Subscription expired, logging out. Redirecting to login...'
);
Logout();
}
else if (
(UserType !== 'Super Admin' ||
UserType !== 'Super Admin User') && (expData?.PlanType?.toLowerCase() == "plan expired")
) {
setExtendModel(true)
// "Extend Expired"
// alert(
// 'Subscription expired, logging out. Redirecting to login...'
// );
// Logout();
}
}
}
} else {
console.log('No subscription data found, logging out...');
alert(
'No subscription data found, logging out. Redirecting to login...'
);
Logout();
}
} catch (error) {
console.error('Error fetching subscription data:', error);
}
};
if (remainingDays === null) {
fetchExpDate();
}
const interval = setInterval(fetchExpDate, 60 * 60 * 1000);
return () => clearInterval(interval);
}, [sessionData, remainingDays]);
const Logout = async () => {
const UserId = getSession('UserId');
const status = 'N';
try {
const res = await dispatch(GenerateLogout({ UserId, status })).unwrap();
if (res?.data?.statusCode === 1) {
sessionStorage.clear();
window.location.replace(`${commonSubDir}`);
}
} catch (error) {
console.error('Logout failed:', error);
}
};
// mohan
// useEffect(() => {
// if (isMobile || isIOS) {
// console.log("📱 Mobile/iOS device skipping DevTools detection");
// return;
// }
// const checkDevTools = setInterval(() => {
// if (devtools.isOpen && !devToolsOpen) {
// setDevToolsOpen(true);
// document.body.innerHTML =
// "<h1 style='color: red; text-align: center;'>Close Inspect to continue using the application.</h1>";
// }
// else if (!devtools.isOpen && devToolsOpen) {
// setDevToolsOpen(false);
// setTimeout(() => {
// window.location.reload();
// }, 100);
// clearInterval(checkDevTools);
// }
// if (!devtools.isOpen) {
// let before = performance.now();
// let after = performance.now();
// let executionDelay = after - before;
// if (executionDelay > 100) {
// setDevToolsOpen(true);
// document.body.innerHTML =
// "<h1 style='color: red; text-align: center;'>Close Inspect to continue using the application.</h1>";
// } else {
// setDevToolsOpen(false);
// }
// }
// }, 1000);
// return () => clearInterval(checkDevTools);
// }, [devToolsOpen]);
const sessionCheckFun = async () => {
const UserId = getSession('UserId');
const sessionId = getSession('SessionId');
const IsLogout = getSession('Mode');
let encryptedLoginType = TokendecryptedValuesFun(
sessionStorage.getItem('LoginType')
);
if (encryptedLoginType != 'Kiosk') {
const res = await dispatch(checkSession({ UserId, sessionId })).unwrap();
if (res?.data?.statusCode === 1) {
if (res?.data?.response === 'False') {
if (IsLogout !== 'Logout') {
alert('Session invalid. Redirecting to login...');
}
clearSession();
window.location.replace(commonSubDir);
}
}
}
};
// ---------------- DATE UTILS ----------------
function formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
}
function addDays(dateString, days) {
// Make it ISO-safe for iOS / WebView
const isoDate = dateString.replace(' ', 'T');
const currentDate = new Date(isoDate);
currentDate.setDate(currentDate.getDate() + Number(days));
return formatDate(currentDate);
}
// ---------------- MAIN FUNCTION ----------------
const freeExtend = async () => {
try {
const { CompId, AppId, BranchId, UserType } = sessionData;
const UserId = getSession('UserId');
// Current date
const now = new Date();
const currentDate = formatDate(now);
// 1 Get purchased app details
const response1 = await dispatch(
getPurchasedAppDetails({ AppId, UserId })
).unwrap();
const PurchasedDetails = response1?.data?.data;
if (!PurchasedDetails || !PurchasedDetails.length) {
console.error('No purchased details found');
return;
}
// 2 Prepare post data
const postData = {
UserId: UserId,
AppId: AppId,
PricingId: PurchasedDetails[0]?.PricingId,
PurDate: currentDate,
NoofDays: 30,
PaymentMode: 27,
PaymentStatus: 'S',
LicenseStatus: PurchasedDetails[0]?.LicenseStatus,
Price: PurchasedDetails[0]?.Price ?? 0,
TaxId: PurchasedDetails[0]?.TaxId ?? 0,
NetPrice: PurchasedDetails[0]?.ExistingPlanNetPrice ?? 0,
ValidityStart: currentDate,
ValidityEnd: addDays(
currentDate,
PurchasedDetails[0]?.NoOfDays
),
CreatedBy: UserId,
TaxAmount: PurchasedDetails[0]?.TaxAmount ?? 0,
MobileNo: getSession('MobileNo'),
MailId: 'ts@gmmail.com',
Type: "FreeExtend"
};
// 3 Post invoice
const response = await dispatch(postInvoice(postData)).unwrap();
// 4 Send SMS if required
if (response?.data?.statusCode === 1 && response?.data?.SMSbody) {
await dispatch(
sendSms({ body: response.data.SMSbody })
);
setExtendModel(false)
}
} catch (error) {
console.error('freeExtend error:', error);
}
};
const handleCancel = () => {
Logout();
setExtendModel(false)
}
const handlePay = () => {
setExtendModel(false)
let AppName = getSession("AppName")
navigate(`${subDirectory}PricingPage`, { state: { AppName: AppName } });
}
if (extendModel) { if (extendModel) {
return ( return (
@ -368,9 +74,8 @@ const AppRoutes = () => {
/> />
); );
} }
return ( return (
<> <Suspense fallback={<div>Loading</div>}>
<Routes> <Routes>
<Route <Route
path={`${subDirectory}selfBooking/:SelfBookingId`} path={`${subDirectory}selfBooking/:SelfBookingId`}
@ -384,7 +89,10 @@ const AppRoutes = () => {
path={`${subDirectory}weightscaleapp`} path={`${subDirectory}weightscaleapp`}
element={<WeightScaleApp />} element={<WeightScaleApp />}
/> />
<Route path={`${subDirectory}kioskSelfBooking`} element={<KisokSelBooking />} /> <Route
path={`${subDirectory}kioskSelfBooking`}
element={<KisokSelBooking />}
/>
<Route <Route
path={`${subDirectory}kiosk-individual-self-booking`} path={`${subDirectory}kiosk-individual-self-booking`}
@ -395,7 +103,7 @@ const AppRoutes = () => {
element={<ProtectedRoutes routesConfig={routesConfig} />} element={<ProtectedRoutes routesConfig={routesConfig} />}
/> />
</Routes> </Routes>
</> </Suspense>
); );
}; };

View File

@ -1,5 +1,5 @@
// AuthContext.jsx // AuthContext.jsx
import React, { createContext, useContext, useState, useEffect } from 'react'; import { createContext, useContext, useState, useEffect } from 'react';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { getSession } from './Services/Others'; import { getSession } from './Services/Others';
import { import {
@ -64,7 +64,8 @@ export const AuthProvider = ({ children }) => {
); );
setAdvance(hasAdvance); setAdvance(hasAdvance);
const hasProOrAdvance = const hasProOrAdvance =
hasAdvance || pricingData.some((item) => item.PricingName === 'Customized'); hasAdvance ||
pricingData.some((item) => item.PricingName === 'Customized');
setProORAdvance(hasProOrAdvance); setProORAdvance(hasProOrAdvance);
} catch (error) { } catch (error) {
console.error('Error fetching pricing name:', error); console.error('Error fetching pricing name:', error);

View File

@ -564,7 +564,7 @@ Button[disabled] {
.ant-table-cell { .ant-table-cell {
background: #fafafa7a; background: #fafafa7a;
//vicky //vicky
padding: 1px 8px !important; padding: 6px 6px !important;
border: 0.5px solid rgb(235, 235, 235); border: 0.5px solid rgb(235, 235, 235);
} }

View File

@ -37,9 +37,9 @@ const Loader = () => {
<p>Loading</p> <p>Loading</p>
<div className="words"> <div className="words">
<span className="word">PozoApp</span> <span className="word">PozoApp</span>
<span className="word">BillingApp</span>
<span className="word">PozoApp</span> <span className="word">PozoApp</span>
<span className="word">BillingApp</span> <span className="word">PozoApp</span>
<span className="word">PozoApp</span>
<span className="word">PozoApp</span> <span className="word">PozoApp</span>
</div> </div>
<p></p> <p></p>

View File

@ -5,7 +5,6 @@ import { Menu } from 'antd';
import { import {
changePreviewComponents, changePreviewComponents,
changeSelectedPrintdummyData, changeSelectedPrintdummyData,
getTemplate,
} from '../../Features/ThemeChange/ThemeChange'; } from '../../Features/ThemeChange/ThemeChange';
import { import {
changeBookingType, changeBookingType,
@ -69,9 +68,6 @@ const SideMenu = ({ mode, theme, items }) => {
const [clickedKeys, setClickedKeys] = useState([]); const [clickedKeys, setClickedKeys] = useState([]);
const dispatch = useDispatch(); const dispatch = useDispatch();
const navigate = useNavigate(); const navigate = useNavigate();
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const DineinDefault = useSelector(GlobalDineinDefault); const DineinDefault = useSelector(GlobalDineinDefault);
const handleMouseEnter = (e) => { const handleMouseEnter = (e) => {
@ -187,28 +183,7 @@ const SideMenu = ({ mode, theme, items }) => {
if (e == `${subDirectory}saleslayouts/print-selection`) { if (e == `${subDirectory}saleslayouts/print-selection`) {
dispatch(changeSelectedPrintdummyData(true)); dispatch(changeSelectedPrintdummyData(true));
} }
// if(e==`${subDirectory}kiosksales`){
// const elem = document.documentElement;
// if (elem.requestFullscreen) {
// elem.requestFullscreen();
// } else if (elem.mozRequestFullScreen) { // Firefox
// elem.mozRequestFullScreen();
// } else if (elem.webkitRequestFullscreen) { // Chrome, Safari and Opera
// elem.webkitRequestFullscreen();
// } else if (elem.msRequestFullscreen) { // IE/Edge
// elem.msRequestFullscreen();
// }
// }else{
// if (document.exitFullscreen) {
// document.exitFullscreen();
// } else if (document.mozCancelFullScreen) { // Firefox
// document.mozCancelFullScreen();
// } else if (document.webkitExitFullscreen) { // Chrome, Safari and Opera
// document.webkitExitFullscreen();
// } else if (document.msExitFullscreen) { // IE/Edge
// document.msExitFullscreen();
// }
// }
navigate(e); navigate(e);
} catch (error) { } catch (error) {

View File

@ -1,45 +1,15 @@
import React, { useState, useEffect, useRef } from 'react'; import { useState, useEffect, useRef } from 'react';
import { useNavigate, useLocation } from 'react-router-dom'; import { useNavigate, useLocation } from 'react-router-dom';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import {
FaBars,
FaThLarge,
FaHome,
FaCog,
FaChartBar,
FaFileAlt,
FaMobileAlt,
FaSignOutAlt,
FaSignInAlt,
FaArrowRight,
FaCaretRight,
} from 'react-icons/fa';
import {
MdSettings,
MdOutlineReport,
MdOutlineHome,
MdOutlineKeyboardArrowDown,
MdOutlineKeyboardArrowRight,
} from 'react-icons/md';
import { BiLogOut, BiLogIn } from 'react-icons/bi';
import {
AiOutlineAppstore,
AiOutlineSetting,
AiOutlineBarChart,
AiOutlineFileText,
} from 'react-icons/ai';
import { GiHamburgerMenu } from 'react-icons/gi';
import './SideMenuPozo.scss'; import './SideMenuPozo.scss';
import { FaCaretDown } from 'react-icons/fa';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { useContext } from 'react'; import { useContext } from 'react';
import { AuthContext } from '../../AuthContext'; import { AuthContext } from '../../AuthContext';
import PozoMenu from './PozoMenu'; import PozoMenu from './PozoMenu';
import { getSession } from '../../Services/Others';
import { import {
changePreviewComponents, changePreviewComponents,
changeSelectedPrintdummyData, changeSelectedPrintdummyData
getTemplate,
} from '../../Features/ThemeChange/ThemeChange'; } from '../../Features/ThemeChange/ThemeChange';
import { import {
changeBookingType, changeBookingType,
@ -67,7 +37,7 @@ import {
import { ChangeTotalAmount } from '../../Features/ExteraCharges/ExtraCharges'; import { ChangeTotalAmount } from '../../Features/ExteraCharges/ExtraCharges';
import * as Offer from '../../Features/Offer/Offer'; import * as Offer from '../../Features/Offer/Offer';
import { FiMenu } from 'react-icons/fi'; import { FiMenu } from 'react-icons/fi';
import POZOMIND from '../../Images/PozomindWLogo.png';
import { import {
ChangeFullFreeProductList, ChangeFullFreeProductList,
changeFullOfferAppliedProducts, changeFullOfferAppliedProducts,
@ -165,9 +135,7 @@ const SideMenuPozo = ({ items = [] }) => {
const [collapsed, setCollapsed] = useState(window.innerWidth < 768); const [collapsed, setCollapsed] = useState(window.innerWidth < 768);
const [dropdownPosition, setDropdownPosition] = useState({}); const [dropdownPosition, setDropdownPosition] = useState({});
const menuRef = useRef(); const menuRef = useRef();
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const DineinDefault = useSelector(GlobalDineinDefault); const DineinDefault = useSelector(GlobalDineinDefault);
const [collapse, setCollapse] = useState(false); const [collapse, setCollapse] = useState(false);
@ -381,57 +349,7 @@ const SideMenuPozo = ({ items = [] }) => {
(item) => !bottomKeys.includes(item.label) (item) => !bottomKeys.includes(item.label)
); );
// Recursive render for menu and submenus // Recursive render for menu and submenus
const renderMenuItems = (items, parentKeys = [], level = 0) => (
<div className={`side-menu-list${level > 0 ? ' nested-list' : ''}`}>
{(items || []).filter(Boolean).map((item) => (
<div key={item.key}>
<div
className={`${level > 0 ? 'dropdown-submenu-item' : 'menu-item'}${isSelected(item.key) || (level === 0 && hasSelectedChild(item)) ? ' selecteded' : ''}${isOpen(item.key) ? ' open' : ''}${item.children ? ' has-children' : ''}`}
onClick={(e) => {
e.stopPropagation();
handleMenuClick(item, parentKeys, e, level);
}}
// style={{ paddingLeft: `${level * 10 + 1}px` }}
>
{item.icon && level === 0 && (
<span
className="menu-icon"
style={{
fontSize: collapse ? '1.5rem' : '',
}}
>
{item.icon}
</span>
)}
{!collapse && <span className="menu-label">{item.label}</span>}
{!collapse && (
<span className="menu-labelDot">
{isDropdownItemSelected(item) ? '●' : ''}
</span>
)}
{item.children && !collapse && (
<span className="menu-arrow">
{level === 0 ? (
<FaCaretRight size={14} />
) : (
<MdOutlineKeyboardArrowRight />
)}
</span>
)}
</div>
{item.children && isOpen(item.key) && !collapse && (
<div className={`dropdown-submenu${level > 0 ? ' nested' : ''}`}>
{renderMenuItems(
item.children,
[...parentKeys, item.key],
level + 1
)}
</div>
)}
</div>
))}
</div>
);
// Custom onClick handler for PozoMenu // Custom onClick handler for PozoMenu
const handlePozoMenuClick = (e) => { const handlePozoMenuClick = (e) => {

View File

@ -70,13 +70,15 @@ export const postStockAdjustment = createAsyncThunk(
export const getPurchaseSupplierAndWareHouseData = createAsyncThunk( export const getPurchaseSupplierAndWareHouseData = createAsyncThunk(
'PurchaseOrder/getPurchaseSupplierAndWareHouseData', 'PurchaseOrder/getPurchaseSupplierAndWareHouseData',
async (ProdData, { rejectWithValue }) => { async (ProdData, { rejectWithValue }) => {
const { AppId, CompId, BranchId } = ProdData; const { AppId, CompId, BranchId, Type } = ProdData;
if (AppId && CompId && BranchId) { if (AppId && CompId && BranchId) {
try { try {
const response = await axiosRetailInstanceData.get( let url = `/Supplier/AllSupplierBranchDropdown?appId=${AppId}&compId=${CompId}&branchId=${BranchId}`;
`/Supplier/AllSupplierBranchDropdown?appId=${AppId}&compId=${CompId}&branchId=${BranchId}` if (Type) {
); url += `&Type=${Type}`;
}
const response = await axiosRetailInstanceData.get(url);
return response.data; return response.data;
} catch (error) { } catch (error) {
return rejectWithValue(error.response?.data || error.message); return rejectWithValue(error.response?.data || error.message);

View File

@ -20,6 +20,7 @@ import { DefaultModal } from "../../Components/Modal/DefaultModal";
import { FaRegEye } from "react-icons/fa"; import { FaRegEye } from "react-icons/fa";
import { render } from "react-dom"; import { render } from "react-dom";
import { useAuth } from "../../AuthContext"; import { useAuth } from "../../AuthContext";
import "./AutomatedReorder.scss";
const subDirectory = import.meta.env.BASE_URL; const subDirectory = import.meta.env.BASE_URL;

View File

@ -3393,19 +3393,19 @@ const [RadioBtnSelection, setRadioBtnSelection] = useState(() => {
const enteredDiscount = parseFloat(data?.target.value); const enteredDiscount = parseFloat(data?.target.value);
if (limit === null || limit === undefined || limit === 0) { if (limit === null || limit === undefined || limit === 0) {
if ( // if (
parseFloat(enteredDiscount) < parseFloat(sellingPrice) || // parseFloat(enteredDiscount) < parseFloat(sellingPrice) ||
parseFloat(enteredDiscount) === parseFloat(sellingPrice) // parseFloat(enteredDiscount) === parseFloat(sellingPrice)
) { // ) {
setEditedPrice(enteredDiscount); setEditedPrice(enteredDiscount);
setDisableSubmitButton(true); setDisableSubmitButton(true);
} else { // } else {
setMessageType('error'); // setMessageType('error');
setMessageData('Please Give less than value for sell price'); // setMessageData('Please Give less than value for sell price');
setDisableSubmitButton(false); // setDisableSubmitButton(false);
setEditedPrice(0); // setEditedPrice(0);
formRef.current?.resetFields(); // formRef.current?.resetFields();
} // }
return; return;
} }

View File

@ -9,7 +9,7 @@ const WeightCalculatePrice = ({ itemData, CartOrderDetails, onSubmit }) => {
const [enteredPrice, setEnteredPrice] = useState(''); const [enteredPrice, setEnteredPrice] = useState('');
const [enteredQty, setEnteredQty] = useState(''); const [enteredQty, setEnteredQty] = useState('');
const [calculatedQty, setCalculatedQty] = useState(0); const [calculatedQty, setCalculatedQty] = useState(0);
const [calcMode, setCalcMode] = useState('amt'); const [calcMode, setCalcMode] = useState('kgs');
const priceInputRef = useRef(null); const priceInputRef = useRef(null);
const [form] = Form.useForm(); const [form] = Form.useForm();
@ -82,8 +82,8 @@ const WeightCalculatePrice = ({ itemData, CartOrderDetails, onSubmit }) => {
form.resetFields(); form.resetFields();
}} }}
> >
<Radio.Button value="amt">AMT</Radio.Button>
<Radio.Button value="kgs">KGS</Radio.Button> <Radio.Button value="kgs">KGS</Radio.Button>
<Radio.Button value="amt">AMT</Radio.Button>
</Radio.Group> </Radio.Group>
<p> <p>

View File

@ -303,14 +303,19 @@ const BSBillingTable1 = () => {
if (!event.ctrlKey) return; if (!event.ctrlKey) return;
if (key === 'q') { if (key === 'q') {
event.preventDefault(); event.preventDefault();
handleShortcut('qty'); handleShortcut('qty');
} } else if (key === 'e') {
event.preventDefault();
if (key === 'e') { handleShortcut('price');
event.preventDefault(); } else if (key === 'y') {
handleShortcut('price'); event.preventDefault();
} handleShortcut('Parcel');
} else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
}
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);

View File

@ -241,15 +241,20 @@ const BSBillingTable3 = () => {
// 👉 CTRL shortcuts // 👉 CTRL shortcuts
if (!event.ctrlKey) return; if (!event.ctrlKey) return;
if (key === 'q') { if (key === 'q') {
event.preventDefault(); event.preventDefault();
handleShortcut('qty'); handleShortcut('qty');
} } else if (key === 'e') {
event.preventDefault();
if (key === 'e') { handleShortcut('price');
event.preventDefault(); } else if (key === 'y') {
handleShortcut('price'); event.preventDefault();
} handleShortcut('Parcel');
} else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
}
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);

View File

@ -294,15 +294,20 @@ const BSBillingTable4 = () => {
// 👉 CTRL shortcuts // 👉 CTRL shortcuts
if (!event.ctrlKey) return; if (!event.ctrlKey) return;
if (key === 'q') { if (key === 'q') {
event.preventDefault(); event.preventDefault();
handleShortcut('qty'); handleShortcut('qty');
} } else if (key === 'e') {
event.preventDefault();
if (key === 'e') { handleShortcut('price');
event.preventDefault(); } else if (key === 'y') {
handleShortcut('price'); event.preventDefault();
} handleShortcut('Parcel');
} else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
}
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);

View File

@ -1940,15 +1940,20 @@ const BsBill = () => {
// 👉 CTRL shortcuts // 👉 CTRL shortcuts
if (!event.ctrlKey) return; if (!event.ctrlKey) return;
if (key === 'q') { if (key === 'q') {
event.preventDefault(); event.preventDefault();
handleShortcut('qty'); handleShortcut('qty');
} } else if (key === 'e') {
event.preventDefault();
if (key === 'e') { handleShortcut('price');
event.preventDefault(); } else if (key === 'y') {
handleShortcut('price'); event.preventDefault();
} handleShortcut('Parcel');
} else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
}
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);

View File

@ -267,16 +267,20 @@ const BSBillingTable6 = () => {
} }
// 👉 CTRL shortcuts // 👉 CTRL shortcuts
if (!event.ctrlKey) return; if (!event.ctrlKey) return;
if (key === 'q') {
if (key === 'q') { event.preventDefault();
event.preventDefault(); handleShortcut('qty');
handleShortcut('qty'); } else if (key === 'e') {
} event.preventDefault();
handleShortcut('price');
if (key === 'e') { } else if (key === 'y') {
event.preventDefault(); event.preventDefault();
handleShortcut('price'); handleShortcut('Parcel');
} } else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
}
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);

View File

@ -260,14 +260,20 @@ const BSBillingTable7 = () => {
return; return;
} }
if (!event.ctrlKey) return; if (!event.ctrlKey) return;
if (key === 'q') { if (key === 'q') {
event.preventDefault(); event.preventDefault();
handleShortcut('qty'); handleShortcut('qty');
} } else if (key === 'e') {
if (key === 'e') { event.preventDefault();
event.preventDefault(); handleShortcut('price');
handleShortcut('price'); } else if (key === 'y') {
} event.preventDefault();
handleShortcut('Parcel');
} else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
}
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);

View File

@ -73,9 +73,9 @@ import {
} from '../../../../../Features/Offer/Offernew/BookingOffernew.js'; } from '../../../../../Features/Offer/Offernew/BookingOffernew.js';
import { useRemoveProducts } from '../BSBillingTable3/RemoveCartWithOffer.jsx'; import { useRemoveProducts } from '../BSBillingTable3/RemoveCartWithOffer.jsx';
import { useUtilsComponent } from '../../../../../Services/utils.js'; import { useUtilsComponent } from '../../../../../Services/utils.js';
import ComboEditQty from '../ComboBillTableEdit/ComboEditQty.jsx';
import ComboEditRate from '../ComboBillTableEdit/ComboEditRate.jsx'; import ComboEditRate from '../ComboBillTableEdit/ComboEditRate.jsx';
import CustomerPriceHistory from '../../UtillComponents/CustomerPriceHistory.jsx'; import CustomerPriceHistory from '../../UtillComponents/CustomerPriceHistory.jsx';
import ComboEditQtyAndRate from '../ComboBillTableEdit/ComboEditQtyAndRate.jsx';
const ComboSalesBillTable = () => { const ComboSalesBillTable = () => {
const { removeExtraCharge } = useUtilsComponent(); const { removeExtraCharge } = useUtilsComponent();
@ -177,6 +177,10 @@ const ComboSalesBillTable = () => {
const [qtyEdit, setQtyEdit] = useState(false); const [qtyEdit, setQtyEdit] = useState(false);
const qtyTdRef = useRef(null); const qtyTdRef = useRef(null);
const qtyInputRef = useRef(null); const qtyInputRef = useRef(null);
const [shortKeyMethod, setshortKeyMethod] = useState(null);
const [activeRowIndex, setActiveRowIndex] = useState(null);
const [activeColIndex, setActiveColIndex] = useState(null);
const tableRef = useRef(null);
const handleEditQTYcombo = () => { const handleEditQTYcombo = () => {
if (!qtyEdit) { if (!qtyEdit) {
@ -268,7 +272,7 @@ const ComboSalesBillTable = () => {
const item = getSelectedItem(); const item = getSelectedItem();
if (!item) return; if (!item) return;
handleEditQuantity(item); handleEditQuantityCombo(item);
setshortKeyMethod(method); setshortKeyMethod(method);
}; };
@ -288,12 +292,17 @@ const ComboSalesBillTable = () => {
if (key === 'q') { if (key === 'q') {
event.preventDefault(); event.preventDefault();
handleShortcut('qty'); handleShortcut('qty');
} } else if (key === 'e') {
if (key === 'e') {
event.preventDefault(); event.preventDefault();
handleShortcut('price'); handleShortcut('price');
} else if (key === 'y') {
event.preventDefault();
handleShortcut('Parcel');
} else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
} }
}; };
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);
@ -2074,6 +2083,95 @@ const ComboSalesBillTable = () => {
...(tableDataDinein || []), ...(tableDataDinein || []),
]; ];
// Set last row as active when data changes
useEffect(() => {
if (combinedTableData?.length > 0 && activeRowIndex === null) {
setActiveRowIndex(combinedTableData.length - 1);
}
}, [combinedTableData?.length]);
// Table navigation
useEffect(() => {
const handleTableNav = (e) => {
if (EditQtyCombo || EditRateCombo) return;
if (!combinedTableData?.length || activeRowIndex === null) return;
const visibleCols =
tableOptions?.filter((opt) =>
['Item', 'Quantity', 'Rate', 'Total'].includes(opt.OptionName)
) || [];
// Arrow Up/Down - Row navigation
if (e.key === 'ArrowUp') {
e.preventDefault();
setActiveRowIndex((prev) => Math.max(0, prev - 1));
setActiveColIndex(null);
} else if (e.key === 'ArrowDown') {
e.preventDefault();
setActiveRowIndex((prev) =>
Math.min(combinedTableData.length - 1, prev + 1)
);
setActiveColIndex(null);
}
// Arrow Left/Right - Column navigation
else if (e.key === 'ArrowLeft') {
e.preventDefault();
if (activeColIndex === null) {
setActiveColIndex(visibleCols.length - 1);
} else {
setActiveColIndex((prev) => Math.max(0, prev - 1));
}
} else if (e.key === 'ArrowRight') {
e.preventDefault();
if (activeColIndex === null) {
setActiveColIndex(0);
} else {
setActiveColIndex((prev) =>
Math.min(visibleCols.length - 1, prev + 1)
);
}
}
// Tab - Move to next column
else if (e.key === 'Tab') {
e.preventDefault();
if (activeColIndex === null) {
setActiveColIndex(0);
} else {
const nextCol = activeColIndex + 1;
if (nextCol >= visibleCols.length) {
setActiveColIndex(0);
if (activeRowIndex < combinedTableData.length - 1) {
setActiveRowIndex((prev) => prev + 1);
}
} else {
setActiveColIndex(nextCol);
}
}
}
// Enter - Trigger cell action
else if (e.key === 'Enter' && activeColIndex !== null) {
e.preventDefault();
const row = combinedTableData[activeRowIndex];
const col = visibleCols[activeColIndex];
if (row && col && editField) {
if (col.OptionName === 'Quantity') handleEditQuantityCombo(row);
else if (col.OptionName === 'Rate') handleEditRateCombo(row);
}
}
};
window.addEventListener('keydown', handleTableNav);
return () => window.removeEventListener('keydown', handleTableNav);
}, [
activeRowIndex,
activeColIndex,
combinedTableData,
EditQtyCombo,
EditRateCombo,
editField,
tableOptions,
]);
console.log(combinedTableData, 'combinedTableData', tableData); console.log(combinedTableData, 'combinedTableData', tableData);
const displayTableData = const displayTableData =
BillOrderPre === 'N' ? [...combinedTableData].reverse() : combinedTableData; BillOrderPre === 'N' ? [...combinedTableData].reverse() : combinedTableData;
@ -2261,7 +2359,7 @@ const ComboSalesBillTable = () => {
return ( return (
<tr <tr
key={`${row?.InwardDtlId || index}-${row?.BookingTypeName || ''}-${row?.SalesId || ''}-${index}`} key={`${row?.InwardDtlId || index}-${row?.BookingTypeName || ''}-${row?.SalesId || ''}-${index}`}
className={row.highlighted ? 'highlighted-row' : ''} className={`${row.highlighted ? 'highlighted-row' : ''} ${activeRowIndex === index ? 'active-row' : ''}`}
style={{ style={{
fontFamily: SelectedFont, fontFamily: SelectedFont,
backgroundColor: backgroundColor:
@ -2305,86 +2403,100 @@ const ComboSalesBillTable = () => {
: 'none', : 'none',
}} }}
> >
{tableOptions?.map((item) => ( {tableOptions?.map((item, colIdx) => {
<> const isActiveCell =
{/* HSN Code */} activeRowIndex === index &&
{item.OptionName === 'HSNCode' && ( activeColIndex !== null &&
<td ['Item', 'Quantity', 'Rate', 'Total'].indexOf(
key={`hsn-${index}`} item.OptionName
className="hsnCodeTd" ) === activeColIndex;
onClick={() => editField && handleEditQuantity(row)}
>
{row.HSNCode || '-'}
</td>
)}
{/* Product Name / Item */} return (
{(item.OptionName === 'Item' || <>
item.OptionName === 'Product Name') && ( {/* HSN Code */}
{item.OptionName === 'HSNCode' && (
<td <td
key={`prod-${index}`} key={`hsn-${index}`}
className="productNameTd" className="hsnCodeTd"
onClick={() => onClick={() => editField && handleEditQuantity(row)}
row.FullProductIdentifierDtls?.length > 0 ||
row.ProductIdentifierDtls?.length > 0
? handleImeiDetails(row)
: editField && handleEditQuantity(row)
}
> >
{row?.Type !== 'OS' ? row.ProdName : row.ServiceName} {row.HSNCode || '-'}
{row?.BrandName ? ` ${row.BrandName}` : ''}
{row?.Type !== 'C' && (
<p className="Tbl3-Variant">
{/* {row?.ProdVariantName} {row?.Size} {row?.UomName} */}
(
{!row?.ProdVariantName?.toLowerCase()?.includes(
'variant'
) && <span>{row?.ProdVariantName} </span>}
{row?.Size}
{row?.SinglePc == 'Y' ? 'PCS' : row?.UomName})
</p>
)}
{row?.Type === 'C' &&
row.ProdDetail?.map((prod, idx) => (
<p key={idx}>
{prod.ProdName} - {prod.Size} {prod.UomName}
</p>
))}
</td> </td>
)} )}
{/* Barcode */} {/* Product Name / Item */}
{item.OptionName === 'Barcode' && ( {(item.OptionName === 'Item' ||
<td item.OptionName === 'Product Name') && (
key={`barcode-${index}`} <td
className="barcodeTd" key={`prod-${index}`}
onClick={() => editField && handleEditQuantity(row)} className={`productNameTd ${isActiveCell ? 'active-cell' : ''}`}
> onClick={() =>
{row.QRCode || '-'} row.FullProductIdentifierDtls?.length > 0 ||
</td> row.ProductIdentifierDtls?.length > 0
)} ? handleImeiDetails(row)
: editField && handleEditQuantity(row)
}
>
{row?.Type !== 'OS' ? row.ProdName : row.ServiceName}
{row?.BrandName ? ` ${row.BrandName}` : ''}
{row?.Type !== 'C' && (
<p className="Tbl3-Variant">
{/* {row?.ProdVariantName} {row?.Size} {row?.UomName} */}
(
{!row?.ProdVariantName?.toLowerCase()?.includes(
'variant'
) && <span>{row?.ProdVariantName} </span>}
{row?.Size}
{row?.SinglePc == 'Y' ? 'PCS' : row?.UomName})
</p>
)}
{row?.Type === 'C' &&
row.ProdDetail?.map((prod, idx) => (
<p key={idx}>
{prod.ProdName} - {prod.Size} {prod.UomName}
</p>
))}
</td>
)}
{/* Quantity */} {/* Barcode */}
{item.OptionName === 'Quantity' && ( {item.OptionName === 'Barcode' && (
<td <td
ref={qtyTdRef} key={`barcode-${index}`}
key={`qty-${index}`} className="barcodeTd"
// className="qtyTd" onClick={() => editField && handleEditQuantity(row)}
className={ >
EditQtyCombo && row?.localId === Index {row.QRCode || '-'}
</td>
)}
{/* Quantity */}
{item.OptionName === 'Quantity' && (
<td
ref={(el) => {
if (
shortKeyMethod === 'qty' &&
row?.localId === Index
) {
el?.focus();
el?.click();
}
}}
key={`qty-${index}`}
tabIndex={0}
className={`${EditQtyCombo && row?.localId === Index
? 'EditQTYcomboTD' ? 'EditQTYcomboTD'
: 'qtyTd' : 'qtyTd'
} } ${isActiveCell ? 'active-cell' : ''}`}
onClick={() => onClick={() =>
editField && handleEditQuantityCombo(row) editField && handleEditQuantityCombo(row)
} }
// onClick={() => handleEditQTYcombo()} >
> {(!EditQtyCombo || row?.localId !== Index) && (
{(!EditQtyCombo || row?.localId !== Index) && ( <>{row.OrderQty}</>
<>{row.OrderQty}</> )}
)} {EditQtyCombo && row?.localId === Index && (
{EditQtyCombo && row?.localId === Index && ( <ComboEditQtyAndRate
<ComboEditQty
key={`edit-qty-${Index}`} key={`edit-qty-${Index}`}
handleEditQuantityCancel={ handleEditQuantityCancel={
handleEditQuantityComboCancel handleEditQuantityComboCancel
@ -2394,30 +2506,27 @@ const ComboSalesBillTable = () => {
Index={Index} Index={Index}
setIndex={setIndex} setIndex={setIndex}
setEditQtyCombo={setEditQtyCombo} setEditQtyCombo={setEditQtyCombo}
// id={`qty-${index}`} />
/> )}
)} </td>
</td> )}
)}
{/* Rate */} {/* Rate */}
{item.OptionName === 'Rate' && ( {item.OptionName === 'Rate' && (
<td <td
key={`rate-${index}`} key={`rate-${index}`}
// className="rateTd" className={`${EditRateCombo ? 'rateTdEditRate' : 'rateTd'} ${isActiveCell ? 'active-cell' : ''}`}
className={EditRateCombo ? 'rateTdEditRate' : 'rateTd'} onClick={() => editField && handleEditRateCombo(row)}
// onClick={() => editField && handleEditQuantity(row)} >
onClick={() => editField && handleEditRateCombo(row)}
>
{!EditRateCombo || row?.localId !== Index ? ( {!EditRateCombo || row?.localId !== Index ? (
<> <>
{allowDecimal {allowDecimal
? Number(row?.OrderRate).toFixed(2) ? Number(row?.OrderRate).toFixed(2)
: Number(row?.OrderRate)} : Number(row?.OrderRate)}
</> </>
) : null} ) : null}
{EditRateCombo && row?.localId === Index && ( {EditRateCombo && row?.localId === Index && (
<ComboEditRate <ComboEditQtyAndRate
key={`edit-rate-${Index}`} key={`edit-rate-${Index}`}
handleEditRateComboCancel={ handleEditRateComboCancel={
handleEditRateComboCancel handleEditRateComboCancel
@ -2427,101 +2536,110 @@ const ComboSalesBillTable = () => {
Index={Index} Index={Index}
setIndex={setIndex} setIndex={setIndex}
setEditRateCombo={setEditRateCombo} setEditRateCombo={setEditRateCombo}
/> />
)} )}
</td> </td>
)} )}
{/* Disc % */} {/* Disc % */}
{item.OptionName === 'Discount' && ( {item.OptionName === 'Discount' && (
<td <td
key={`discPer-${index}`} key={`discPer-${index}`}
className="discPerTd" className="discPerTd"
onClick={() => editField && handleEditQuantity(row)} onClick={() => editField && handleEditQuantity(row)}
> >
{row?.Offer > 0 {row?.Offer > 0
? `${( ? `${(
(row.Offer / (row?.OrderQty * row?.OrderRate)) * (row.Offer / (row?.OrderQty * row?.OrderRate)) *
100 100
).toFixed(2)}%` ).toFixed(2)}%`
: '-'} : '-'}
</td> </td>
)} )}
{/* Disc Amt */} {/* Disc Amt */}
{item.OptionName === 'Amount' && ( {item.OptionName === 'Amount' && (
<td <td
key={`discAmt-${index}`} key={`discAmt-${index}`}
className="discAmtTd" className="discAmtTd"
onClick={() => editField && handleEditQuantity(row)} onClick={() => editField && handleEditQuantity(row)}
> >
{row.Offer || '-'} {row.Offer || '-'}
</td> </td>
)} )}
{/* Total */} {/* Total */}
{item.OptionName === 'Total' && ( {item.OptionName === 'Total' && (
<td <td
key={`total-${index}`} key={`total-${index}`}
className="totalTd" className={`totalTd ${isActiveCell ? 'active-cell' : ''}`}
onClick={() => { onClick={() => {
// if (editField) { // if (editField) {
// handleEditQuantity(row) // handleEditQuantity(row)
// } // }
if (GetCustId) { if (GetCustId) {
handleCustomerProductPriceHistory(row); handleCustomerProductPriceHistory(row);
} }
}}
>
{allowDecimal
? Number(row.TotalAmt - (row?.Offer || 0)).toFixed(2)
: Number(row.TotalAmt - (row?.Offer || 0))}
</td>
)}
{/* Optional columns */}
{item.OptionName === 'SalesMan' && (
<td key={`salesMan-${index}`} className="salesManTd">
{row.salesMan || '-'}
</td>
)}
{item.OptionName === '%' && (
<td key={`percentage-${index}`} className="percentageTd">
{row.percentage || '-'}
</td>
)}
{item.OptionName === 'Commission' && (
<td key={`commission-${index}`} className="commissionTd">
{row.commission || '-'}
</td>
)}
{item.OptionName === 'StockId' && (
<td key={`stockId-${index}`} className="stockIdTd">
{row.stockId || '-'}
</td>
)}
{item.OptionName === 'Points' && (
<td key={`points-${index}`} className="pointsTd">
{row.points || '-'}
</td>
)}
{/* Delete */}
{item.OptionName === 'Delete' && (
<td key={`delete-${index}`} className="deleteTd">
<AiOutlineClose
onClick={() => removeFromCart(row)}
style={{
color: '#FF4D4F',
cursor: 'pointer',
textAlign: 'center',
width: '100%',
}} }}
/> >
</td> {allowDecimal
)} ? Number(row.TotalAmt - (row?.Offer || 0)).toFixed(
</> 2
))} )
: Number(row.TotalAmt - (row?.Offer || 0))}
</td>
)}
{/* Optional columns */}
{item.OptionName === 'SalesMan' && (
<td key={`salesMan-${index}`} className="salesManTd">
{row.salesMan || '-'}
</td>
)}
{item.OptionName === '%' && (
<td
key={`percentage-${index}`}
className="percentageTd"
>
{row.percentage || '-'}
</td>
)}
{item.OptionName === 'Commission' && (
<td
key={`commission-${index}`}
className="commissionTd"
>
{row.commission || '-'}
</td>
)}
{item.OptionName === 'StockId' && (
<td key={`stockId-${index}`} className="stockIdTd">
{row.stockId || '-'}
</td>
)}
{item.OptionName === 'Points' && (
<td key={`points-${index}`} className="pointsTd">
{row.points || '-'}
</td>
)}
{/* Delete */}
{item.OptionName === 'Delete' && (
<td key={`delete-${index}`} className="deleteTd">
<AiOutlineClose
onClick={() => removeFromCart(row)}
style={{
color: '#FF4D4F',
cursor: 'pointer',
textAlign: 'center',
width: '100%',
}}
/>
</td>
)}
</>
);
})}
</tr> </tr>
); );
})} })}

View File

@ -28,7 +28,7 @@
} }
tbody { tbody {
> tr:last-child { >tr:last-child {
background-color: #e5d434 !important; background-color: #e5d434 !important;
position: sticky; position: sticky;
bottom: 0; bottom: 0;
@ -40,6 +40,16 @@
background-color: #e5d434; background-color: #e5d434;
} }
&.active-row {
outline: 2px solid #1292ee;
outline-offset: -2px;
}
td.active-cell {
background-color: #1292ee !important;
color: #ffffff;
}
td { td {
padding: 4px 8px; padding: 4px 8px;
border: 1px solid #9c9c9c; border: 1px solid #9c9c9c;
@ -189,3 +199,14 @@
padding: 1px !important; padding: 1px !important;
text-align: center; text-align: center;
} }
.focused-cell {
background-color: #fff3cd !important;
border: 2px solid #ffc107 !important;
box-shadow: 0 0 5px rgba(255, 193, 7, 0.5);
}
:where(.css-dev-only-do-not-override-mncuj7).ant-select-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) {
background-color: rgba(116, 107, 107, 0.356);
}

View File

@ -237,7 +237,7 @@ const StandardTable = () => {
window.removeEventListener('keydown', handleKeyDown); window.removeEventListener('keydown', handleKeyDown);
}; };
}, [GetCustId, OrderCardDetail]); }, [GetCustId, OrderCardDetail]);
useEffect(() => { useEffect(() => {
if (!preferenceshortcutkey) return; if (!preferenceshortcutkey) return;
@ -262,30 +262,40 @@ const StandardTable = () => {
handleEditQuantity(item); handleEditQuantity(item);
setshortKeyMethod(method); setshortKeyMethod(method);
}; };
const handleKeyDown = (event) => { const handleKeyDown = (event) => {
const key = event.key.toLowerCase(); const key = event.key.toLowerCase();
// 👉 ALT + P Open Edit Total Amount // 👉 ALT + P Open Edit Total Amount
if (event.altKey && key === 'p') { if (event.altKey && key === 'p') {
event.preventDefault(); event.preventDefault();
if (OrderCardDetail?.length > 0) { if (OrderCardDetail?.length > 0) {
OpenEditTotalAmount(); OpenEditTotalAmount();
}
return;
} }
return; // 👉 CTRL shortcuts
} if (!event.ctrlKey) return;
// 👉 CTRL shortcuts // if (key === 'q') {
if (!event.ctrlKey) return; // event.preventDefault();
// handleShortcut('qty');
if (key === 'q') { // }
event.preventDefault(); // if (key === 'e') {
handleShortcut('qty'); // event.preventDefault();
} // handleShortcut('price');
// }
if (key === 'e') { if (key === 'q') {
event.preventDefault(); event.preventDefault();
handleShortcut('price'); handleShortcut('qty');
} } else if (key === 'e') {
}; event.preventDefault();
handleShortcut('price');
} else if (key === 'y') {
event.preventDefault();
handleShortcut('Parcel');
} else if (key === 'b') {
event.preventDefault();
handleShortcut('weightAmount');
}
};
window.addEventListener('keydown', handleKeyDown); window.addEventListener('keydown', handleKeyDown);
return () => { return () => {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +1,15 @@
import React, { useCallback, useEffect, useRef, useState } from 'react'; import React, { useCallback, useEffect, useRef, useState } from 'react';
import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import { shallowEqual, useDispatch, useSelector } from 'react-redux';
import moment from 'moment'; import { Badge, DatePicker, Modal, Tooltip, message } from 'antd';
import { App, Badge, DatePicker, Modal, Tooltip, Form, message } from 'antd';
import { GoTriangleRight } from 'react-icons/go';
import { ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons'; import { ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons';
import defaultimage from '../../../../Images/defaultItemImg.png'; import defaultimage from '../../../../Images/defaultItemImg.png';
import FormHeader from '../../../PageComponents/FormHeader'; import FormHeader from '../../../PageComponents/FormHeader';
import { import {
GlobalPricingAppPricingName,
SelectedGlobalCardColorDetail, SelectedGlobalCardColorDetail,
SelectedGlobalCardFont, SelectedGlobalCardFont,
StoredSessionData, StoredSessionData,
getTemplateData, getTemplateData,
} from '../../../../Features/ThemeChange/ThemeChange'; } from '../../../../Features/ThemeChange/ThemeChange';
import { Tables } from '../../../../Components/Tables/Table';
import { import {
GlobalProductSubCategorie, GlobalProductSubCategorie,
GlobalItemCard, GlobalItemCard,
@ -107,26 +103,13 @@ import { v4 as uuidv4 } from 'uuid';
// Dummy SortableCard component // Dummy SortableCard component
import { useSortable } from '@dnd-kit/sortable'; import { useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities'; import { CSS } from '@dnd-kit/utilities';
import HuggingFaceVoiceForm from '../../../VoiceToText/VoiceToText.jsx';
import VoiceToTextItemCard from '../../../VoiceToText/VoiceToTextItemCard.jsx'; import VoiceToTextItemCard from '../../../VoiceToText/VoiceToTextItemCard.jsx';
import { ExtractDateFormate } from '../../../../Services/Others.js'; import { ExtractDateFormate } from '../../../../Services/Others.js';
import { import {
changeFreeProductForLoyalty,
ChangeFreeProductList,
ChangeFullFreeProductList,
changeFullOfferAppliedProducts, changeFullOfferAppliedProducts,
ChangeOfferAppliedProducts,
changeOfferAppliedProductsForLoyalty,
changeOfferAppliedProductsForMembership, changeOfferAppliedProductsForMembership,
changeTriggerOfferFree, GlobalOfferAppliedProducts
getOfferinBooking,
GlobalFreeProdList,
GlobalOfferAppliedProducts,
GlobalOverAllOfferAmt,
GlobalTriggerOfferFree,
RemoveOfferAppliedProduct,
} from '../../../../Features/Offer/Offernew/BookingOffernew.js'; } from '../../../../Features/Offer/Offernew/BookingOffernew.js';
import { validateOffers } from './ValidateOffer.jsx';
import { useSaleswiseOfferWatcher } from './SalesWiseOffer.jsx'; import { useSaleswiseOfferWatcher } from './SalesWiseOffer.jsx';
import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLogin.js'; import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLogin.js';
import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js'; import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js';
@ -137,10 +120,7 @@ import dayjs from 'dayjs';
import BSCustomerSelect from '../UtillComponents/BSSelectCustomer.jsx'; import BSCustomerSelect from '../UtillComponents/BSSelectCustomer.jsx';
import BSNavBarAddUser from '../UtillComponents/BSNavBarAddUser.jsx'; import BSNavBarAddUser from '../UtillComponents/BSNavBarAddUser.jsx';
import { FaAngleLeft, FaAngleRight } from 'react-icons/fa'; import { FaAngleLeft, FaAngleRight } from 'react-icons/fa';
import useRemoveFromCart from './RemoveFromCartFunction.jsx'; import useRemoveFromCart from './RemoveFromCartFunction.jsx';
import { IoIosAdd } from 'react-icons/io';
import { LuMinus } from 'react-icons/lu'; import { LuMinus } from 'react-icons/lu';
import BranchName from '../../Template/BranchName.jsx'; import BranchName from '../../Template/BranchName.jsx';
import { FiPlus } from 'react-icons/fi'; import { FiPlus } from 'react-icons/fi';
@ -179,7 +159,7 @@ export function SortableCard({ id, children, item }) {
</div> </div>
); );
} }
const { RangePicker } = DatePicker;
const BsBookingitemCard = (props) => { const BsBookingitemCard = (props) => {
const voiceTriggerRef = useRef(null); const voiceTriggerRef = useRef(null);
const unsubscribeRef = useRef(null); const unsubscribeRef = useRef(null);
@ -191,14 +171,10 @@ const BsBookingitemCard = (props) => {
const handleDecline = async (item) => { const handleDecline = async (item) => {
await decline(item, setPreviousdataLength); await decline(item, setPreviousdataLength);
}; };
const handleClearAll = async () => {
await clearAllItems();
};
const Clearall = async () => {
await handleClearAll();
};
const [form] = Form.useForm();
const cardFunction = props?.cardFunctionality; const cardFunction = props?.cardFunctionality;
// const applyOffer = useApplyOfferto_CardDetail(); // const applyOffer = useApplyOfferto_CardDetail();
const preferenceDatas = useSelector(PreferenceData, shallowEqual); const preferenceDatas = useSelector(PreferenceData, shallowEqual);

View File

@ -0,0 +1,30 @@
import { Modal } from 'antd';
import { ExclamationCircleOutlined } from '@ant-design/icons';
const ExpireConfirmModal = ({
open,
title,
onOk,
onCancel,
okText = 'Submit',
cancelText = "Don't Submit",
}) => {
return (
<Modal
open={open}
onOk={onOk}
onCancel={onCancel}
okText={okText}
cancelText={cancelText}
>
<div style={{ display: 'flex', gap: '1rem', alignItems: 'center' }}>
<ExclamationCircleOutlined
style={{ color: 'rgb(231 176 12)', fontSize: 30 }}
/>
<h3 style={{ margin: 0 }}>{title}</h3>
</div>
</Modal>
);
};
export default ExpireConfirmModal;

View File

@ -1,436 +1,488 @@
import { Switch, Tooltip } from "antd" import { Switch, Tooltip } from 'antd';
import { useDispatch } from "react-redux"; import { useDispatch } from 'react-redux';
import { changeBillName, changeNotes, changeSelectedAmount, changeSelectedDiscount, changeSelectedHsnCode, changeSelectedItem, changeSelectedMRP, changeSelectedprintStyle, changeSelectedQrcode, changeSelectedQuantity, changeSelectedRate, changeSelectedSignature, changeSelectedSlNo, changeSelectedtermsAndConditions, changeSignatureImage, changethemeFormat, getPrintSelectionComponentData, putPrintSelectionComponentData, changeSelectedPrintdummyData } from "../../../../Features/ThemeChange/ThemeChange"; import {
import { useEffect, useState, useMemo, useCallback } from "react"; changeBillName,
import { InfoCircleOutlined, UploadOutlined, PlusOutlined, MinusCircleOutlined, ArrowRightOutlined, EditFilled, DeleteFilled } from '@ant-design/icons'; changeNotes,
import { getSession } from "../../../../Services/Others"; changeSelectedAmount,
import Buttons from "../../../../Components/Forms/Buttons"; changeSelectedDiscount,
import { Messages } from "../../../../Components/Notifications/Messages"; changeSelectedHsnCode,
changeSelectedItem,
changeSelectedMRP,
changeSelectedprintStyle,
changeSelectedQrcode,
changeSelectedQuantity,
changeSelectedRate,
changeSelectedSignature,
changeSelectedSlNo,
changeSelectedtermsAndConditions,
changeSignatureImage,
changethemeFormat,
getPrintSelectionComponentData,
putPrintSelectionComponentData,
changeSelectedPrintdummyData,
} from '../../../../Features/ThemeChange/ThemeChange';
import { useEffect, useState, useMemo, useCallback } from 'react';
import {
InfoCircleOutlined,
UploadOutlined,
PlusOutlined,
MinusCircleOutlined,
ArrowRightOutlined,
EditFilled,
DeleteFilled,
} from '@ant-design/icons';
import { getSession } from '../../../../Services/Others';
import Buttons from '../../../../Components/Forms/Buttons';
import { Messages } from '../../../../Components/Notifications/Messages';
const SalesPrintSize = ({ onSettingsChange, closeModel }) => { const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
const CompId = getSession("CompId") const CompId = getSession('CompId');
const BranchId = getSession("BranchId") const BranchId = getSession('BranchId');
const AppId = getSession("AppId") const AppId = getSession('AppId');
const UserId = getSession('UserId'); const UserId = getSession('UserId');
const dispatch = useDispatch() const dispatch = useDispatch();
const [PrintType, setPrintType] = useState(false); const [PrintType, setPrintType] = useState(false);
const [PageSize, setPageSize] = useState(false); const [PageSize, setPageSize] = useState(false);
// const [PrintTemplates, setPrintTemplates] = useState([]) // const [PrintTemplates, setPrintTemplates] = useState([])
const [SizeOptionData, setSizeOptionData] = useState([]) const [SizeOptionData, setSizeOptionData] = useState([]);
const [selectedTemplate, setSelectedTemplate] = useState(null) const [selectedTemplate, setSelectedTemplate] = useState(null);
const [messageType, setMessageType] = useState('') const [messageType, setMessageType] = useState('');
const [messageData, setMessageData] = useState('') const [messageData, setMessageData] = useState('');
console.log(selectedTemplate, 'selectedTemplate'); console.log(selectedTemplate, 'selectedTemplate');
// Memoized values for better performance
const currentPrintType = useMemo(() => {
if (selectedTemplate) {
return selectedTemplate.PrintType === 'S' ? true : false;
}
return PrintType;
}, [selectedTemplate, PrintType]);
// Memoized values for better performance const currentPageSize = useMemo(() => {
const currentPrintType = useMemo(() => { if (selectedTemplate) {
if (selectedTemplate) { return selectedTemplate.PageSize === 'A5' ? true : false;
return selectedTemplate.PrintType === 'S' ? true : false; }
} return PageSize;
return PrintType; }, [selectedTemplate, PageSize]);
}, [selectedTemplate, PrintType]);
const currentPageSize = useMemo(() => { // Get the actual values to pass to parent component
if (selectedTemplate) { const getPrintTypeValue = () => {
return selectedTemplate.PageSize === 'A5' ? true : false; if (selectedTemplate) {
} return selectedTemplate.PrintType;
return PageSize; }
}, [selectedTemplate, PageSize]); return PrintType ? 'S' : 'C';
};
// Get the actual values to pass to parent component const getPageSizeValue = () => {
const getPrintTypeValue = () => { if (selectedTemplate) {
if (selectedTemplate) { return selectedTemplate.PageSize;
return selectedTemplate.PrintType; }
} return PageSize ? 'A5' : 'A4';
return PrintType ? 'S' : 'C'; };
};
const getPageSizeValue = () => { useEffect(() => {
if (selectedTemplate) { printsyleget();
return selectedTemplate.PageSize; }, []);
}
return PageSize ? 'A5' : 'A4';
};
useEffect(() => { // Auto-select default template when data loads
printsyleget() useEffect(() => {
}, []) if (SizeOptionData.length > 0) {
const defaultTemplate = SizeOptionData.find(
(template) => template.SetasDefault === 'Y'
);
if (defaultTemplate) {
handleTemplateSelect(defaultTemplate);
}
}
}, [SizeOptionData]);
// Auto-select default template when data loads const handleTemplateSelect = (template) => {
useEffect(() => { setSelectedTemplate(template);
if (SizeOptionData.length > 0) { setPrintType(template.PrintType === 'S');
const defaultTemplate = SizeOptionData.find(template => template.SetasDefault === "Y"); setPageSize(template.PageSize === 'A5');
if (defaultTemplate) { stylePreview(template);
handleTemplateSelect(defaultTemplate);
}
}
}, [SizeOptionData]);
const handleTemplateSelect = (template) => { // Immediately pass the template settings
setSelectedTemplate(template); if (onSettingsChange && typeof onSettingsChange === 'function') {
setPrintType(template.PrintType === 'S'); const currentSettings = {
setPageSize(template.PageSize === 'A5'); PrintType: template.PrintType,
stylePreview(template); PageSize: template.PageSize,
selectedTemplate: template,
};
console.log('Template Selected - Settings:', currentSettings);
onSettingsChange(currentSettings);
}
};
// Immediately pass the template settings const onChangeToggle = async (e) => {
if (onSettingsChange && typeof onSettingsChange === 'function') { setPrintType(e);
const currentSettings = { await dispatch(changethemeFormat(e));
PrintType: template.PrintType,
PageSize: template.PageSize,
selectedTemplate: template
};
console.log('Template Selected - Settings:', currentSettings);
onSettingsChange(currentSettings);
}
};
const onChangeToggle = async (e) => { // If a template is selected, update it
setPrintType(e); if (selectedTemplate) {
await dispatch(changethemeFormat(e)); const updatedTemplate = {
...selectedTemplate,
PrintType: e ? 'S' : 'C',
};
setSelectedTemplate(updatedTemplate);
// If a template is selected, update it // Immediately pass updated settings
if (selectedTemplate) { if (onSettingsChange && typeof onSettingsChange === 'function') {
const updatedTemplate = {
...selectedTemplate,
PrintType: e ? 'S' : 'C'
};
setSelectedTemplate(updatedTemplate);
// Immediately pass updated settings
if (onSettingsChange && typeof onSettingsChange === 'function') {
const currentSettings = {
PrintType: updatedTemplate.PrintType,
PageSize: updatedTemplate.PageSize,
selectedTemplate: updatedTemplate
};
onSettingsChange(currentSettings);
}
}
};
const onChangepageSize = async (e) => {
setPageSize(e);
// If a template is selected, update it
if (selectedTemplate) {
const updatedTemplate = {
...selectedTemplate,
PageSize: e ? 'A5' : 'A4'
};
setSelectedTemplate(updatedTemplate);
if (onSettingsChange && typeof onSettingsChange === 'function') {
const currentSettings = {
PrintType: updatedTemplate.PrintType,
PageSize: updatedTemplate.PageSize,
selectedTemplate: updatedTemplate
};
onSettingsChange(currentSettings);
}
}
};
const stylePreview = async (template) => {
if (!template) return;
const { StyleId, StyleName, PrintType: printType, PageSize, Notes, PrintHdrName, Signature, TermsandConditions, OptionDetails } = template;
const helperFunction = (param) => {
return OptionDetails.some(
(item) => item.ConfigName === param
)
}
dispatch(changeSelectedSlNo(helperFunction('Sl.No')));
dispatch(changeSelectedItem(helperFunction('Item')));
dispatch(changeSelectedMRP(helperFunction('MRP')));
dispatch(changeSelectedDiscount(helperFunction('Discount')));
dispatch(changeSelectedQuantity(helperFunction('Quantity')));
dispatch(changeSelectedRate(helperFunction('Rate')));
dispatch(changeSelectedAmount(helperFunction('Amount')));
dispatch(changeSelectedHsnCode(helperFunction('HsnCode')));
dispatch(changeSelectedQrcode(helperFunction('Qrcode')));
dispatch(changeSelectedSignature(helperFunction('signature')));
dispatch(changeSelectedtermsAndConditions(helperFunction('terms&conditions')));
dispatch(changeNotes(helperFunction('Notes')));
dispatch(changeSignatureImage(Signature));
dispatch(changeBillName(PrintHdrName));
dispatch(changeSelectedprintStyle({
ConfigId: StyleId,
ConfigName: StyleName,
}));
};
const printsyleget = async () => {
try {
const Data = { AppId, CompId, BranchId };
let response = await dispatch(getPrintSelectionComponentData(Data)).unwrap();
if (response?.data?.statusCode === 1) {
// const salesTemplates = response.data.data?.flatMap(template =>
// (template.ComponentDetails || []).filter(comp => comp.PrintTypeName === "Sales" && comp.SetasDefault === "Y")
// );
// setPrintTemplates(salesTemplates);
let TableData = response?.data?.data?.[0]?.ComponentDetails.map(
(item) => ({
ActiveStatus: 'A',
OptionDetails: item.FieldDetails,
StyleId: item.StyleId,
SetasDefault: item.SetasDefault,
SetasDefaultInvoice: item.SetasDefaultInvoice,
StyleName: item.StyleName,
Signature: item.Signature,
PrintType: item.PrintType,
PrintHdrName: item.PrintHdrName,
Notes: item?.Notes,
PageSize: item?.PageSize,
PrintTypeId: item?.PrintTypeId,
TermsandConditions: (item?.TermsandConditions
? item?.TermsandConditions
: []
)?.map((tc) => tc?.TermsandConditions),
})
)?.sort((a, b) => {
if ((a.StyleName || '') === 'A4Standard') return 1;
if ((b.StyleName || '') === 'A4Standard') return -1;
const isA4orA5 = (name) => /A4|A5/i.test(name);
const nameA = a.StyleName || '';
const nameB = b.StyleName || '';
if (isA4orA5(nameA) && !isA4orA5(nameB)) return 1;
if (!isA4orA5(nameA) && isA4orA5(nameB)) return -1;
const numA = parseInt(nameA.match(/\d+/)?.[0]) || 0;
const numB = parseInt(nameB.match(/\d+/)?.[0]) || 0;
return numA - numB;
});
setSizeOptionData(TableData);
}
} catch (error) {
console.error('Error fetching print styles:', error);
}
};
// Log current values for debugging
console.log('Current PrintType:', getPrintTypeValue());
console.log('Current PageSize:', getPageSizeValue());
console.log('Selected Template:', selectedTemplate);
useEffect(() => {
const currentSettings = { const currentSettings = {
PrintType: getPrintTypeValue(), PrintType: updatedTemplate.PrintType,
PageSize: getPageSizeValue(), PageSize: updatedTemplate.PageSize,
selectedTemplate selectedTemplate: updatedTemplate,
}; };
console.log('Current Print Settings:', currentSettings); onSettingsChange(currentSettings);
}
}
};
// Call the callback if provided const onChangepageSize = async (e) => {
if (onSettingsChange && typeof onSettingsChange === 'function') { setPageSize(e);
onSettingsChange(currentSettings);
}
}, [selectedTemplate, PrintType, PageSize]); // Removed onSettingsChange from dependencies
// Also pass data when component mounts and when selectedTemplate changes // If a template is selected, update it
useEffect(() => { if (selectedTemplate) {
if (selectedTemplate && onSettingsChange && typeof onSettingsChange === 'function') { const updatedTemplate = {
const currentSettings = { ...selectedTemplate,
PrintType: selectedTemplate.PrintType, PageSize: e ? 'A5' : 'A4',
PageSize: selectedTemplate.PageSize, };
selectedTemplate setSelectedTemplate(updatedTemplate);
}; if (onSettingsChange && typeof onSettingsChange === 'function') {
console.log('Template-based Print Settings:', currentSettings); const currentSettings = {
onSettingsChange(currentSettings); PrintType: updatedTemplate.PrintType,
} PageSize: updatedTemplate.PageSize,
}, [selectedTemplate]); selectedTemplate: updatedTemplate,
};
onSettingsChange(currentSettings);
}
}
};
const onfinish = async (values) => { const stylePreview = async (template) => {
try { if (!template) return;
if (!SizeOptionData || SizeOptionData.length === 0) {
setMessageType('error');
setMessageData('Please Setup the Screen');
return;
}
if (!selectedTemplate) { const {
setMessageType('error'); StyleId,
setMessageData('Please select a template first'); StyleName,
return; PrintType: printType,
} PageSize,
Notes,
PrintHdrName,
Signature,
TermsandConditions,
OptionDetails,
} = template;
const helperFunction = (param) => {
const currentPrintType = getPrintTypeValue(); // 'S' or 'C' return OptionDetails.some((item) => item.ConfigName === param);
const currentPageSize = getPageSizeValue(); // 'A4' or 'A5'
// Only one "Sales" style should have SetasDefault: "Y"
const updatedTemplates = SizeOptionData.map((item) => {
if (
(item.PrintType === "Sales" || item.PrintType === "S")
) {
return {
...item,
SetasDefault:
item.StyleId === selectedTemplate.StyleId ? "Y" : "N",
};
}
return item;
});
let TemplateDetails = updatedTemplates.map((item) => {
const isSelectedTemplate = item.StyleId === selectedTemplate.StyleId;
return {
SizeId: null,
StyleId: item.StyleId,
SetasDefault: item.SetasDefault,
SetasDefaultInvoice: item.SetasDefaultInvoice,
PrintTypeId: item?.PrintTypeId,
SizeDetails: item.OptionDetails.map((opt) => ({
OptionId: opt.ConfigId,
})),
...(item?.TermsandConditions?.length > 0
? {
PrintTermsandConditions: (item?.TermsandConditions
? item?.TermsandConditions
: []
)?.map((tc) => ({
TermsandConditions: tc,
})),
}
: {}),
...(item?.Notes ? { Notes: item.Notes } : {}),
PageSize: isSelectedTemplate ? currentPageSize : item?.PageSize,
...(item?.PrintHdrName ? { PrintHdrName: item.PrintHdrName } : {}),
...(item?.Signature ? { Signature: item?.Signature } : {}),
PrintType: isSelectedTemplate ? currentPrintType : item?.PrintType,
};
});
const Data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
TemplateDetails: TemplateDetails,
CreatedBy: UserId,
};
// console.log('API Request Data:', Data);
const response = await dispatch(
putPrintSelectionComponentData(Data)
).unwrap();
if (response?.data?.statusCode === 1) {
dispatch(changeSelectedPrintdummyData(false));
await printsyleget();
setMessageType('success');
setMessageData(response?.data?.response);
if (closeModel) {
closeModel();
}
}
} catch (error) {
console.error('Error setting default template:', error);
setMessageType('error');
setMessageData('Failed to set default template');
}
}; };
const onComplete = useCallback(() => { dispatch(changeSelectedSlNo(helperFunction('Sl.No')));
setMessageData(null); dispatch(changeSelectedItem(helperFunction('Item')));
setMessageType(null); dispatch(changeSelectedMRP(helperFunction('MRP')));
}, []); dispatch(changeSelectedDiscount(helperFunction('Discount')));
dispatch(changeSelectedQuantity(helperFunction('Quantity')));
dispatch(changeSelectedRate(helperFunction('Rate')));
dispatch(changeSelectedAmount(helperFunction('Amount')));
dispatch(changeSelectedHsnCode(helperFunction('HsnCode')));
dispatch(changeSelectedQrcode(helperFunction('Qrcode')));
dispatch(changeSelectedSignature(helperFunction('signature')));
dispatch(
changeSelectedtermsAndConditions(helperFunction('terms&conditions'))
);
dispatch(changeNotes(helperFunction('Notes')));
dispatch(changeSignatureImage(Signature));
dispatch(changeBillName(PrintHdrName));
dispatch(
changeSelectedprintStyle({
ConfigId: StyleId,
ConfigName: StyleName,
})
);
};
return ( const printsyleget = async () => {
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}> try {
<Messages const Data = { AppId, CompId, BranchId };
messageType={messageType} let response = await dispatch(
messageData={messageData} getPrintSelectionComponentData(Data)
onComplete={onComplete} ).unwrap();
/>
<div style={{ textAlign: 'center' }}> if (response?.data?.statusCode === 1) {
<p> Print : {selectedTemplate?.StyleName}</p> // const salesTemplates = response.data.data?.flatMap(template =>
</div> // (template.ComponentDetails || []).filter(comp => comp.PrintTypeName === "Sales" && comp.SetasDefault === "Y")
<div style={{ display: 'flex', gap: '1rem' }}> // );
<div> // setPrintTemplates(salesTemplates);
{(
<div let TableData = response?.data?.data?.[0]?.ComponentDetails.map(
style={{ (item) => ({
display: 'flex', ActiveStatus: 'A',
alignItems: 'center', OptionDetails: item.FieldDetails,
gap: '1rem', StyleId: item.StyleId,
backgroundColor: '#f5f5f5', SetasDefault: item.SetasDefault,
padding: '0.75rem 1rem', SetasDefaultInvoice: item.SetasDefaultInvoice,
borderRadius: '12px', StyleName: item.StyleName,
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)', Signature: item.Signature,
maxWidth: 'fit-content', PrintType: item.PrintType,
margin: '1rem 0 0 0', PrintHdrName: item.PrintHdrName,
}} Notes: item?.Notes,
> PageSize: item?.PageSize,
<span style={{ fontWeight: '500', color: '#555' }}> PrintTypeId: item?.PrintTypeId,
Customized TermsandConditions: (item?.TermsandConditions
<Tooltip title="Print will stop when the content finishes. It won't waste paper."> ? item?.TermsandConditions
<InfoCircleOutlined : []
style={{ )?.map((tc) => tc?.TermsandConditions),
color: '#1890ff', })
cursor: 'pointer', )?.sort((a, b) => {
marginLeft: '5px', if ((a.StyleName || '') === 'A4Standard') return 1;
}} if ((b.StyleName || '') === 'A4Standard') return -1;
/> const isA4orA5 = (name) => /A4|A5/i.test(name);
</Tooltip> const nameA = a.StyleName || '';
</span> const nameB = b.StyleName || '';
if (isA4orA5(nameA) && !isA4orA5(nameB)) return 1;
<Switch checked={currentPrintType} onChange={onChangeToggle} /> if (!isA4orA5(nameA) && isA4orA5(nameB)) return -1;
<span style={{ fontWeight: '500', color: '#555' }}> const numA = parseInt(nameA.match(/\d+/)?.[0]) || 0;
Standard const numB = parseInt(nameB.match(/\d+/)?.[0]) || 0;
<Tooltip title=" Print will take full paper, even if there's less content."> return numA - numB;
<InfoCircleOutlined });
style={{ setSizeOptionData(TableData);
color: '#1890ff', }
cursor: 'pointer', } catch (error) {
marginLeft: '5px', console.error('Error fetching print styles:', error);
}} }
/> };
</Tooltip>
</span> // Log current values for debugging
</div> console.log('Current PrintType:', getPrintTypeValue());
)} console.log('Current PageSize:', getPageSizeValue());
</div> console.log('Selected Template:', selectedTemplate);
<div> useEffect(() => {
{currentPrintType && ( const currentSettings = {
<div PrintType: getPrintTypeValue(),
style={{ PageSize: getPageSizeValue(),
display: 'flex', selectedTemplate,
alignItems: 'center', };
gap: '1rem', console.log('Current Print Settings:', currentSettings);
backgroundColor: '#f5f5f5',
padding: '0.75rem 1rem', // Call the callback if provided
borderRadius: '12px', if (onSettingsChange && typeof onSettingsChange === 'function') {
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)', onSettingsChange(currentSettings);
maxWidth: 'fit-content', }
margin: '1rem 0 0 0', }, [selectedTemplate, PrintType, PageSize]); // Removed onSettingsChange from dependencies
}}
> // Also pass data when component mounts and when selectedTemplate changes
<span style={{ fontWeight: '500', color: '#555' }}>A4</span> useEffect(() => {
<Switch checked={currentPageSize} onChange={onChangepageSize} /> if (
<span style={{ fontWeight: '500', color: '#555' }}>A5</span> selectedTemplate &&
</div> onSettingsChange &&
)} typeof onSettingsChange === 'function'
</div> ) {
</div> const currentSettings = {
PrintType: selectedTemplate.PrintType,
<div style={{ display: 'flex', justifyContent: 'flex-end', width: '100%' }}> PageSize: selectedTemplate.PageSize,
<Buttons selectedTemplate,
buttonText="Save" };
color="901D77" console.log('Template-based Print Settings:', currentSettings);
icon={<ArrowRightOutlined />} onSettingsChange(currentSettings);
htmlType={true} }
handleSubmit={onfinish} }, [selectedTemplate]);
/>
const onfinish = async (values) => {
try {
if (!SizeOptionData || SizeOptionData.length === 0) {
setMessageType('error');
setMessageData('Please Setup the Screen');
return;
}
if (!selectedTemplate) {
setMessageType('error');
setMessageData('Please select a template first');
return;
}
const currentPrintType = getPrintTypeValue(); // 'S' or 'C'
const currentPageSize = getPageSizeValue(); // 'A4' or 'A5'
// Only one "Sales" style should have SetasDefault: "Y"
const updatedTemplates = SizeOptionData.map((item) => {
if (item.PrintType === 'Sales' || item.PrintType === 'S') {
return {
...item,
SetasDefault: item.StyleId === selectedTemplate.StyleId ? 'Y' : 'N',
};
}
return item;
});
let TemplateDetails = updatedTemplates.map((item) => {
const isSelectedTemplate = item.StyleId === selectedTemplate.StyleId;
return {
SizeId: null,
StyleId: item.StyleId,
SetasDefault: item.SetasDefault,
SetasDefaultInvoice: item.SetasDefaultInvoice,
PrintTypeId: item?.PrintTypeId,
SizeDetails: item.OptionDetails.map((opt) => ({
OptionId: opt.ConfigId,
})),
...(item?.TermsandConditions?.length > 0
? {
PrintTermsandConditions: (item?.TermsandConditions
? item?.TermsandConditions
: []
)?.map((tc) => ({
TermsandConditions: tc,
})),
}
: {}),
...(item?.Notes ? { Notes: item.Notes } : {}),
PageSize: isSelectedTemplate ? currentPageSize : item?.PageSize,
...(item?.PrintHdrName ? { PrintHdrName: item.PrintHdrName } : {}),
...(item?.Signature ? { Signature: item?.Signature } : {}),
PrintType: isSelectedTemplate ? currentPrintType : item?.PrintType,
};
});
const Data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
TemplateDetails: TemplateDetails,
CreatedBy: UserId,
};
// console.log('API Request Data:', Data);
const response = await dispatch(
putPrintSelectionComponentData(Data)
).unwrap();
if (response?.data?.statusCode === 1) {
dispatch(changeSelectedPrintdummyData(false));
await printsyleget();
setMessageType('success');
setMessageData(response?.data?.response);
if (closeModel) {
closeModel();
}
}
} catch (error) {
console.error('Error setting default template:', error);
setMessageType('error');
setMessageData('Failed to set default template');
}
};
const onComplete = useCallback(() => {
setMessageData(null);
setMessageType(null);
}, []);
return (
<div
style={{
display: 'flex',
flexDirection: 'column',
gap: '1rem',
alignItems: 'center',
justifyContent: 'center',
}}
>
<Messages
messageType={messageType}
messageData={messageData}
onComplete={onComplete}
/>
<div style={{ textAlign: 'center' }}>
<p> Print : {selectedTemplate?.StyleName}</p>
</div>
<div style={{ display: 'flex', gap: '1rem' }}>
<div>
{
<div
style={{
display: 'flex',
alignItems: 'center',
gap: '1rem',
backgroundColor: '#f5f5f5',
padding: '0.75rem 1rem',
borderRadius: '12px',
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
maxWidth: 'fit-content',
margin: '1rem 0 0 0',
}}
>
<span style={{ fontWeight: '500', color: '#555' }}>
Customized
<Tooltip title="Print will stop when the content finishes. It won't waste paper.">
<InfoCircleOutlined
style={{
color: '#1890ff',
cursor: 'pointer',
marginLeft: '5px',
}}
/>
</Tooltip>
</span>
<Switch checked={currentPrintType} onChange={onChangeToggle} />
<span style={{ fontWeight: '500', color: '#555' }}>
Standard
<Tooltip title=" Print will take full paper, even if there's less content.">
<InfoCircleOutlined
style={{
color: '#1890ff',
cursor: 'pointer',
marginLeft: '5px',
}}
/>
</Tooltip>
</span>
</div> </div>
}
</div> </div>
)
}
export default SalesPrintSize <div>
{currentPrintType && (
<div
style={{
display: 'flex',
alignItems: 'center',
gap: '1rem',
backgroundColor: '#f5f5f5',
padding: '0.75rem 1rem',
borderRadius: '12px',
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
maxWidth: 'fit-content',
margin: '1rem 0 0 0',
}}
>
<span style={{ fontWeight: '500', color: '#555' }}>A4</span>
<Switch checked={currentPageSize} onChange={onChangepageSize} />
<span style={{ fontWeight: '500', color: '#555' }}>A5</span>
</div>
)}
</div>
</div>
<div
style={{ display: 'flex', justifyContent: 'flex-end', width: '100%' }}
>
<Buttons
buttonText="Save"
color="901D77"
icon={<ArrowRightOutlined />}
htmlType={true}
handleSubmit={onfinish}
/>
</div>
</div>
);
};
export default SalesPrintSize;

View File

@ -1,215 +1,215 @@
import { ArrowRightOutlined } from "@ant-design/icons"; import { ArrowRightOutlined } from '@ant-design/icons';
import Buttons from "../../../../Components/Forms/Buttons"; import Buttons from '../../../../Components/Forms/Buttons';
import { gettableData, postPreferenceAppNames } from "../../../../Features/PreferenceMaster/PreferenceMaster"; import {
import { getSession } from "../../../../Services/Others"; gettableData,
import { useDispatch } from "react-redux"; postPreferenceAppNames,
import { useEffect, useState } from "react"; } from '../../../../Features/PreferenceMaster/PreferenceMaster';
import { getPreferenceData } from "../../../../Features/BookingScreen/BookingData/BookingData"; import { getSession } from '../../../../Services/Others';
import { Messages } from "../../../../Components/Notifications/Messages"; import { useDispatch } from 'react-redux';
import { changeSelectedPrintdummyData } from "../../../../Features/ThemeChange/ThemeChange"; import { useEffect, useState } from 'react';
import { getPreferenceData } from '../../../../Features/BookingScreen/BookingData/BookingData';
import { Messages } from '../../../../Components/Notifications/Messages';
import { changeSelectedPrintdummyData } from '../../../../Features/ThemeChange/ThemeChange';
const SelectPrintMode = ({ closeModel }) => { const SelectPrintMode = ({ closeModel }) => {
const CompId = getSession("CompId"); const CompId = getSession('CompId');
const BranchId = getSession("BranchId"); const BranchId = getSession('BranchId');
const AppId = getSession("AppId"); const AppId = getSession('AppId');
const UserId = getSession("UserId"); const UserId = getSession('UserId');
const dispatch = useDispatch(); const dispatch = useDispatch();
const [modes, setModes] = useState([]); const [modes, setModes] = useState([]);
const [selected, setSelected] = useState({ const [selected, setSelected] = useState({
whatsapp: false, whatsapp: false,
sms: false, sms: false,
print: false, print: false,
email: false email: false,
});
const [messageType, setMessageType] = useState('');
const [messageData, setMessageData] = useState('');
console.log(selected, 'selected');
useEffect(() => {
fetchTableData();
}, []);
const fetchTableData = async () => {
const response = await dispatch(
gettableData({ CompId, BranchId, AppId })
).unwrap();
const data = response?.data?.data?.[0]?.SettingDtlDetails || [];
console.log(data, 'datadata');
setModes(data);
// Pre-fill checkboxes from API data
setSelected({
whatsapp: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === 'whatsapp' &&
i.SettingValue === 'Y'
),
sms: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === 'sms' &&
i.SettingValue === 'Y'
),
print: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === 'print' &&
i.SettingValue === 'Y'
),
email: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === 'email' &&
i.SettingValue === 'Y'
),
}); });
const [messageType, setMessageType] = useState(""); };
const [messageData, setMessageData] = useState("");
console.log(selected, 'selected'); const handleChange = (key) => {
setSelected((prev) => ({
...prev,
[key]: !prev[key],
}));
};
const handleSave = async () => {
const allowed = ['whatsapp', 'sms', 'print', 'email'];
useEffect(() => { const updatedSettings = modes.map((item) => {
fetchTableData(); const name = item.SettingIdName?.trim()?.toLowerCase();
}, []);
const fetchTableData = async () => { if (allowed?.includes(name)) {
return {
const response = await dispatch( ...item,
gettableData({ CompId, BranchId, AppId }) SettingValue: selected[name] ? 'Y' : 'N',
).unwrap();
const data = response?.data?.data?.[0]?.SettingDtlDetails || [];
console.log(data, 'datadata');
setModes(data);
// Pre-fill checkboxes from API data
setSelected({
whatsapp: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "whatsapp" &&
i.SettingValue === "Y"
),
sms: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "sms" &&
i.SettingValue === "Y"
),
print: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "print" &&
i.SettingValue === "Y"
),
email: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "email" &&
i.SettingValue === "Y"
)
});
};
const handleChange = (key) => {
setSelected((prev) => ({
...prev,
[key]: !prev[key]
}));
};
const handleSave = async () => {
const allowed = ["whatsapp", "sms", "print", "email"];
const updatedSettings = modes.map((item) => {
const name = item.SettingIdName?.trim()?.toLowerCase();
if (allowed?.includes(name)) {
return {
...item,
SettingValue: selected[name] ? "Y" : "N"
};
}
return item;
});
const payload = {
CompId,
BranchId,
CreatedBy: UserId,
AppId,
SettingDtlDetails: updatedSettings
}; };
}
console.log(payload, "payload to send"); return item;
});
try { const payload = {
const response = await dispatch(postPreferenceAppNames(payload)).unwrap(); CompId,
BranchId,
if (response?.data?.statusCode === 1) { CreatedBy: UserId,
setMessageType("success"); AppId,
setMessageData("Printer settings saved successfully."); SettingDtlDetails: updatedSettings,
dispatch(changeSelectedPrintdummyData(false));
await updatePreference();
closeModel()
} else {
setMessageType("error");
setMessageData(response?.data?.message || "Failed to save printer settings.");
}
} catch (error) {
console.error("Error while saving:", error);
}
}; };
const updatePreference = async () => { console.log(payload, 'payload to send');
await dispatch(getPreferenceData({ CompId, BranchId, AppId }));
try {
const response = await dispatch(postPreferenceAppNames(payload)).unwrap();
if (response?.data?.statusCode === 1) {
setMessageType('success');
setMessageData('Printer settings saved successfully.');
dispatch(changeSelectedPrintdummyData(false));
await updatePreference();
closeModel();
} else {
setMessageType('error');
setMessageData(
response?.data?.message || 'Failed to save printer settings.'
);
}
} catch (error) {
console.error('Error while saving:', error);
} }
};
return ( const updatePreference = async () => {
<div await dispatch(getPreferenceData({ CompId, BranchId, AppId }));
style={{ };
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
}}
>
<Messages
messageType={messageType}
messageData={messageData}
onComplete={() => {
setMessageData(null);
setMessageType(null);
}}
/>
<p style={{ fontSize: "18px", marginBottom: "10px" }}>
Select Print Mode
</p>
<div style={{ display: "flex", gap: "1rem", padding: "10px" }}> return (
<label> <div
<input style={{
type="checkbox" display: 'flex',
style={{ marginRight: "0.5rem" }} flexDirection: 'column',
checked={selected.whatsapp} alignItems: 'center',
onChange={() => handleChange("whatsapp")} justifyContent: 'center',
/> backgroundColor:"#c4c4c4",
WhatsApp padding:"16px",
</label> borderRadius:"8px"
}}
>
<Messages
messageType={messageType}
messageData={messageData}
onComplete={() => {
setMessageData(null);
setMessageType(null);
}}
/>
<p style={{ fontSize: '18px', marginBottom: '10px' }}>
Select Print Mode
</p>
<label> <div style={{ display: 'flex', gap: '1rem', padding: '10px' }}>
<input <label>
type="checkbox" <input
style={{ marginRight: "0.5rem" }} type="checkbox"
checked={selected.sms} style={{ marginRight: '0.5rem' }}
onChange={() => handleChange("sms")} checked={selected.whatsapp}
/> onChange={() => handleChange('whatsapp')}
SMS />
</label> WhatsApp
</label>
<label> <label>
<input <input
type="checkbox" type="checkbox"
style={{ marginRight: "0.5rem" }} style={{ marginRight: '0.5rem' }}
checked={selected.print} checked={selected.sms}
onChange={() => handleChange("print")} onChange={() => handleChange('sms')}
/> />
Print SMS
</label> </label>
<label> <label>
<input <input
type="checkbox" type="checkbox"
style={{ marginRight: "0.5rem" }} style={{ marginRight: '0.5rem' }}
checked={selected.email} checked={selected.print}
onChange={() => handleChange("email")} onChange={() => handleChange('print')}
/> />
Email Print
</label> </label>
</div>
<label>
<input
type="checkbox"
style={{ marginRight: '0.5rem' }}
checked={selected.email}
onChange={() => handleChange('email')}
/>
Email
</label>
</div>
<div <div
style={{ style={{
width: "100%", width: '100%',
display: "flex", display: 'flex',
justifyContent: "flex-end", justifyContent: 'flex-end',
marginTop: 24, marginTop: 24,
}} }}
> >
<Buttons <Buttons
buttonText="Save" buttonText="Save"
color="901D77" color="901D77"
icon={<ArrowRightOutlined />} icon={<ArrowRightOutlined />}
htmlType={true} htmlType={true}
handleSubmit={handleSave} handleSubmit={handleSave}
/> />
</div> </div>
</div> </div>
); );
}; };
export default SelectPrintMode; export default SelectPrintMode;

View File

@ -282,6 +282,7 @@ const TaxInvoice = ({
paginatedChunks.push(chunk); paginatedChunks.push(chunk);
} }
} }
console.log(paginatedChunks, "paginatedChunks")
const lastChunkRows = const lastChunkRows =
paginatedChunks.length > 0 paginatedChunks.length > 0
@ -878,7 +879,7 @@ const TaxInvoice = ({
> >
{Number( {Number(
table2Data?.OrderType !== 'E' table2Data?.OrderType !== 'E'
? item.Rate - item.ProdTaxAmt ? item.Rate - (item?.SinglePc === 'Y' ? (item?.TaxAmt / item?.SalesQty) : item.ProdTaxAmt)
: item.Rate || 0 : item.Rate || 0
).toLocaleString('en-IN', { ).toLocaleString('en-IN', {
minimumFractionDigits: 2, minimumFractionDigits: 2,

View File

@ -1,120 +1,47 @@
import React from "react";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { import {
dateFormatChange1, dateFormatChange1
extractLastNumber,
extractLastNumberOrderId,
} from "../../../../Services/Others"; } from "../../../../Services/Others";
import { import {
GlobalprintSlNo,
GlobalprintItem,
GlobalprintMRP,
GlobalprintDiscount,
GlobalprintQuantity,
GlobalprintRate,
GlobalprintAmount,
GlobalprintHsnCode,
GlobalprintQrcodet,
GlobalPritdummyData, GlobalPritdummyData,
changeReprintDataFound, changeReprintDataFound,
GloabalFieldDetails,
GlobalprintSignature,
GlobalprinttermsAndConditions,
GlobalSignatureImage,
Globalnotes,
GlobalthemeFormat,
GlobalBillName,
} from "../../../../Features/ThemeChange/ThemeChange"; } from "../../../../Features/ThemeChange/ThemeChange";
import "../../../../Styles/BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle1.scss"; import "../../../../Styles/BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle1.scss";
import QRCode from "react-qr-code"; import QRCode from "react-qr-code";
import { GlobalUpiIDprint } from "../../../../Features/BookingScreen/BookingData/BookingData";
import signature from "../../../../Images/signatureimage.jpg"
import { ApplicationPreferences } from "../../../../Features/BrachLogin/BranchLogin"; import { ApplicationPreferences } from "../../../../Features/BrachLogin/BranchLogin";
const OtherServicePrintStyle1 = ({ const OtherServicePrintStyle1 = ({
index,
totalQuantityFilter,
Date1,
CashierName,
totalQuantity,
OrderDetailGST,
OrderDetailIGST,
OrderDetailVAT,
table2Data, table2Data,
UpiId,
PaymentStatus, PaymentStatus,
PrintLogo,
PrintGreeting,
printDatas, printDatas,
}) => { }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const GlobalUpiID = useSelector(GlobalUpiIDprint);
const FieldDetails = useSelector(GloabalFieldDetails);
const SLNO = FieldDetails?.["Sl.No"];
const Item = FieldDetails?.["Item"];
const MRP = FieldDetails?.["MRP"];
const Discount = FieldDetails?.["Discount"];
const Quantity = FieldDetails?.["Quantity"];
const Rate = FieldDetails?.["Rate"];
const Amount = FieldDetails?.["Amount"];
const HsnCode = FieldDetails?.["HsnCode"];
const Qrcodet = FieldDetails?.["Qrcode"];
const GlobalSlNo = useSelector(GlobalprintSlNo);
const GlobalItem = useSelector(GlobalprintItem);
const GlobalMRP = useSelector(GlobalprintMRP);
const GlobalDiscount = useSelector(GlobalprintDiscount);
const GlobalQuantity = useSelector(GlobalprintQuantity);
const GlobalRate = useSelector(GlobalprintRate);
const GlobalAmount = useSelector(GlobalprintAmount);
const GlobalHsnCode = useSelector(GlobalprintHsnCode);
const GlobalQrcodet = useSelector(GlobalprintQrcodet);
const GlobaldummyData = useSelector(GlobalPritdummyData); const GlobaldummyData = useSelector(GlobalPritdummyData);
const GlobalSignature = useSelector(GlobalprintSignature);
const GlobaltermsAndConditions = useSelector(GlobalprinttermsAndConditions);
const GlobalSignatureImages = useSelector(GlobalSignatureImage);
const GlobalIsnotes = useSelector(Globalnotes);
const GlobalthemeFormatr = useSelector(GlobalthemeFormat)
const GlobalBilltext = useSelector(GlobalBillName)
const appPreferences = useSelector(ApplicationPreferences); const appPreferences = useSelector(ApplicationPreferences);
const bookingTypePreference = appPreferences?.find((preference) => preference?.PreferredCatName === 'Booking Type')?.PreferenceCatDetails const bookingTypePreference = appPreferences?.find((preference) => preference?.PreferredCatName === 'Booking Type')?.PreferenceCatDetails
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 takeAwayPreference = bookingTypePreference?.find((type) => type?.PreferredSubCatName?.toLowerCase() === "take away" && type?.PreferredStatus === 'Y')
const keysLength = Object.keys(table2Data ?? {}).length; const keysLength = Object.keys(table2Data ?? {}).length;
let TermsAndConditions = printDatas?.TermsandConditions
let SignatureImg = printDatas?.Signature
let Notestext = printDatas?.Notes
let BillName = printDatas?.PrintHdrName
let FormatTheme = printDatas?.PrintType == "S" ? true : false let FormatTheme = printDatas?.PrintType == "S" ? true : false
let PageSize = printDatas?.PageSize let PageSize = printDatas?.PageSize
const Signature = FieldDetails?.["signature"];
const TermsnAdCondition = FieldDetails?.["terms&conditions"];
console.log("table2Datatable2Datatable2Datatable2Data", table2Data,table2Data?.[0]?.BranchName ); console.log("table2Datatable2Datatable2Datatable2Data", table2Data,table2Data?.[0]?.BranchName );
if (keysLength > 0) { if (keysLength > 0) {
dispatch(changeReprintDataFound(true)); dispatch(changeReprintDataFound(true));
} }
const currentDate = new Date();
const day = currentDate.getDate().toString().padStart(2, "0");
const monthNames = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
const monthIndex = currentDate.getMonth();
const year = currentDate.getFullYear().toString().slice(-2);
const formattedDate =dateFormatChange1(table2Data?.[0]?.CreatedDate); const formattedDate =dateFormatChange1(table2Data?.[0]?.CreatedDate);
// `${day}-${monthNames[monthIndex]}-${year}`; // `${day}-${monthNames[monthIndex]}-${year}`;
@ -125,37 +52,13 @@ console.log("table2Datatable2Datatable2Datatable2Data", table2Data,table2Data?.[
const DineInData = table2Data?.productDetails?.filter( const DineInData = table2Data?.productDetails?.filter(
(item) => item.BookingTypeName?.toLowerCase() === "dine in" (item) => item.BookingTypeName?.toLowerCase() === "dine in"
); );
let PaymentStatusSuccess = PaymentStatus?.filter(
(ps) => ps.PaymentStatus === "S"
);
const TakeawayTotal = TakeawayData?.reduce(
(accumulator, currentValue) => accumulator + currentValue.TotalAmt,
0
);
const DineInTotal = DineInData?.reduce(
(accumulator, currentValue) => accumulator + currentValue.TotalAmt,
0
);
const aggregatedPayments = PaymentStatusSuccess?.reduce(
(acc, paymentdata) => {
const paymentType = paymentdata?.PaymentTypeName;
const amount = Number(paymentdata?.Amount);
if (acc[paymentType]) {
acc[paymentType] += amount;
} else {
acc[paymentType] = amount;
}
return acc;
},
{}
);
const productsData = table2Data?.productDetails || [];
const offers = table2Data?.OrderOfferDetails || []; const offers = table2Data?.OrderOfferDetails || [];
let TotalOfferAmount = 0;
// Calculate SalesWiseOffers total amount // Calculate SalesWiseOffers total amount
offers.forEach(offer => { offers.forEach(offer => {
@ -163,19 +66,9 @@ console.log("table2Datatable2Datatable2Datatable2Data", table2Data,table2Data?.[
TotalOfferAmount += offer.OfferAmount; 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;
}
const products = [ const products = [

View File

@ -40,7 +40,6 @@ import {
} from '../../../../Features/BookingScreen/BookingData/BookingData'; } from '../../../../Features/BookingScreen/BookingData/BookingData';
import signature from '../../../../Images/signatureimage.jpg'; import signature from '../../../../Images/signatureimage.jpg';
import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLogin'; import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLogin';
import { settingDataSelector } from '../../../../Features/PreferenceMaster/PreferenceMaster';
import Logo from '../../../../Images/Logo.jpg'; import Logo from '../../../../Images/Logo.jpg';
const PrintStyle1 = ({ const PrintStyle1 = ({
index, index,

View File

@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { Tooltip } from 'antd'; import { Tooltip } from 'antd';
import './GraphChart.scss'; // For styling import './GraphChart.scss'; // For styling
import TooltipWrapper from '../../../Components/Tooltip/Tooltip'; import TooltipWrapper from '../../../Components/Tooltip/Tooltip';
@ -206,36 +206,7 @@ const GraphChart = ({ datasets }) => {
.join(' '); .join(' ');
}; };
// const renderDots = (data, color) => {
// const maxValue = Math.max(...data.map(item => item.value));
// const svgHeight = 200;
// const svgWidth = 400;
// const gap = svgWidth / (data.length - 1);
// return data.map((point, index) => {
// const x = index * gap;
// const y = svgHeight - (point.value / maxValue) * svgHeight;
// return (
// <g key={index}>
// <circle
// cx={x}
// cy={animate ? y : svgHeight}
// r={5}
// fill={color}
// stroke={color}
// strokeWidth="2"
// style={{ transition: 'cy 0.5s ease-in-out' }}
// onMouseOver={(e) => handleMouseOver(e, point)}
// onMouseOut={handleMouseOut}
// />
// <text x={x} y={y - 10} fill="black" fontSize="12" textAnchor="middle">
// {formatValue(point.value)} ({item.date})
// </text>
// </g>
// );
// });
// };
const renderDots = (data, color) => { const renderDots = (data, color) => {
const reversedData = [...data].reverse(); const reversedData = [...data].reverse();
@ -507,7 +478,7 @@ const GraphChart = ({ datasets }) => {
</svg> </svg>
<div className="labels"> <div className="labels">
{Array.from({ length: 7 }, (_, i) => { {Array.from({ length: 8 }, (_, i) => {
const date = new Date(); const date = new Date();
date.setDate(date.getDate() - i); date.setDate(date.getDate() - i);
return ( return (

View File

@ -73,7 +73,7 @@
width: inherit; width: inherit;
margin-top: 10px; margin-top: 10px;
.labelss { .labelss {
font-size: 11px; font-size: 10px;
font-family: 'Poppins'; font-family: 'Poppins';
color: #000000; color: #000000;
font-weight: 400; font-weight: 400;

View File

@ -1,93 +1,4 @@
// import React, { useEffect, useRef, useState } from 'react'; import { useMemo } from 'react';
// import Highcharts from 'highcharts';
// import HighchartsReact from 'highcharts-react-official';
// import "./PieChart.scss"
// const DynamicPieChart = ({ chartData }) => {
// const [overallValue, setOverallValue] = useState(0);
// const chartRef = useRef();
// useEffect(() => {
// if (chartRef.current && chartData) {
// const chart = chartRef.current.chart;
// chart.series[0].setData(chartData);
// const sum = chartData.reduce((total, dataPoint) => total + dataPoint.y, 0);
// setOverallValue(sum);
// // Update the chart title to include the overall value
// chart.setTitle({ text: `Overall Amount: ${sum}` });
// }
// }, [chartData]);
// return (
// <div style={{width:"inherit"}}>
// <HighchartsReact
// highcharts={Highcharts}
// options={{
// chart: {
// type: 'pie'
// },
// title: {
// text: `Overall Amount: ${overallValue}` // Initial title with overall value
// },
// series: [{
// name: 'Amount',
// data: chartData
// }]
// }}
// ref={chartRef}
// />
// </div>
// );
// };
// export default DynamicPieChart;
// import React, { useEffect, useRef, useState } from 'react';
// import Highcharts from 'highcharts';
// import HighchartsReact from 'highcharts-react-official';
// import "./PieChart.scss"
// const DynamicPieChart = ({ chartData }) => {
// const [overallValue, setOverallValue] = useState(0);
// const chartRef = useRef();
// useEffect(() => {
// if (chartRef.current && chartData) {
// const chart = chartRef.current.chart;
// chart.series[0].setData(chartData);
// const sum = chartData.reduce((total, dataPoint) => total + dataPoint.y, 0);
// setOverallValue(sum);
// // Update the chart title to include the overall value
// chart.setTitle({ text: `Overall Amount: ${sum}` });
// }
// }, [chartData]);
// return (
// <div style={{ width: "inherit" }}>
// <HighchartsReact
// highcharts={Highcharts}
// options={{
// chart: {
// type: 'pie'
// },
// title: {
// text: `Overall Amount: ${overallValue}`
// },
// series: [{
// name: 'Amount',
// data: chartData
// }]
// }}
// ref={chartRef}
// />
// </div>
// );
// };
// export default DynamicPieChart;
// create by sree
import React, { useMemo } from 'react';
import Highcharts from 'highcharts'; import Highcharts from 'highcharts';
import HighchartsReact from 'highcharts-react-official'; import HighchartsReact from 'highcharts-react-official';
import './PieChart.scss'; import './PieChart.scss';
@ -105,16 +16,25 @@ const DynamicPieChart = ({ chartData }) => {
); );
if (!chartData?.length) { if (!chartData?.length) {
return <div style={{textAlign:"center",display: 'flex', return (
alignItems: 'center', <div
justifyContent: 'center', style={{
height: '250px', textAlign: 'center',
backgroundColor: '#fafafa', display: 'flex',
color: '#999', alignItems: 'center',
fontSize: '16px', justifyContent: 'center',
fontWeight: '500', height: '250px',
border: '1px dashed #d9d9d9', backgroundColor: '#fafafa',
borderRadius: '8px',}}>No Data Found</div>; color: '#999',
fontSize: '16px',
fontWeight: '500',
border: '1px dashed #d9d9d9',
borderRadius: '8px',
}}
>
No Data Found
</div>
);
} }
return ( return (

View File

@ -1,28 +1,26 @@
import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useCallback, useEffect, useRef, useState,lazy, Suspense } from 'react';
import '../../Styles/DashBoard/RetailDashBoard.scss';
import GraphChart from './Chart/GraphChart';
import { DatePicker, Space, Tooltip } from 'antd';
import dayjs from 'dayjs';
import { IoMdRefresh } from 'react-icons/io';
import { CiShop } from 'react-icons/ci';
import { FiMenu } from 'react-icons/fi';
import PozoMind from '../../Images/pozologowhite.svg';
import { useNavigate, useOutletContext } from 'react-router-dom'; import { useNavigate, useOutletContext } from 'react-router-dom';
import CalendarDropdown from '../../Components/CalendarDropdown'; import { shallowEqual, useDispatch } from 'react-redux';
import { MdKeyboardArrowDown } from 'react-icons/md'; import { useSelector } from 'react-redux';
import { IoMdNotificationsOutline } from 'react-icons/io';
import { import { DatePicker, Tooltip } from 'antd';
getdashboard, import dayjs from 'dayjs';
getdashboarddate,
getpreOrderDashBoard, import '../../Styles/DashBoard/RetailDashBoard.scss';
getSalesHdr,
getTopSellingCustomers, const GraphChart = lazy(() => import('./Chart/GraphChart'));
} from '../../Features/RetailDashboard/Dashboard.js'; const TopSellingProductsChart = lazy(
import { FaTimesCircle } from 'react-icons/fa'; () => import('./TopSellingProductsChart.jsx')
);
import sandClock from '../../Images/sandClock.png'; import sandClock from '../../Images/sandClock.png';
import Add from '../../Images/dashboard/Add.png';
import AddPurchase from '../../Images/dashboard/AddPurchase.png';
import invoice from '../../Images/dashboard/invoice.png';
import user from '../../Images/dashboard/user.jpg';
import report from '../../Images/dashboard/report.png';
import { import {
FeatureAddon,
getTemplate,
GlobalPricingAppPricingName, GlobalPricingAppPricingName,
StoredSessionData, StoredSessionData,
} from '../../Features/ThemeChange/ThemeChange.js'; } from '../../Features/ThemeChange/ThemeChange.js';
@ -31,15 +29,20 @@ import {
getAppSubscriptionDate, getAppSubscriptionDate,
getPreferenceData, getPreferenceData,
} from '../../Features/BookingScreen/BookingData/BookingData.js'; } from '../../Features/BookingScreen/BookingData/BookingData.js';
import {
getdashboard,
getdashboarddate,
getpreOrderDashBoard,
getSalesHdr,
getTopSellingCustomers,
} from '../../Features/RetailDashboard/Dashboard.js';
import { import {
clearSession, clearSession,
dateFormatChange,
encryptedValuesUrlFun, encryptedValuesUrlFun,
ExtractDateFormate, ExtractDateFormate,
getSession, getSession,
} from '../../Services/Others'; } from '../../Services/Others';
import { shallowEqual, useDispatch } from 'react-redux';
import { useSelector } from 'react-redux';
import { import {
getAllprodIds, getAllprodIds,
getExpireProductsList, getExpireProductsList,
@ -58,28 +61,36 @@ import {
PUTLoginuser, PUTLoginuser,
} from '../../Features/BrachLogin/BranchLogin.js'; } from '../../Features/BrachLogin/BranchLogin.js';
import { getPurchasedAppDetails } from '../../Features/BookingScreen/Pricing/Pricing.js'; import { getPurchasedAppDetails } from '../../Features/BookingScreen/Pricing/Pricing.js';
import Add from '../../Images/dashboard/Add.png';
import AddPurchase from '../../Images/dashboard/AddPurchase.png';
import invoice from '../../Images/dashboard/invoice.png';
import user from '../../Images/dashboard/user.jpg';
import report from '../../Images/dashboard/report.png';
import Calendar from '../../Components/Calendar/Calendar';
import { PiSignOut } from 'react-icons/pi';
import BSNavBarUserInfo from '../BookingScreen/Components/BSNavbar/BSNavBarUserInfo';
import { DefaultModal } from '../../Components/Modal/DefaultModal';
import { RadioGrpButton } from '../../Components/Forms/RadioGroup.jsx';
import { DropDowns } from '../../Components/Forms/DropDown.jsx'; const BSNavBarUserInfo = lazy(() =>
import('../BookingScreen/Components/BSNavbar/BSNavBarUserInfo')
);
const DefaultModal = lazy(() =>
import('../../Components/Modal/DefaultModal').then((m) => ({
default: m.DefaultModal,
}))
);
const RadioGrpButton = lazy(() =>
import('../../Components/Forms/RadioGroup.jsx').then((m) => ({
default: m.RadioGrpButton,
}))
);
const DropDowns = lazy(() =>
import('../../Components/Forms/DropDown.jsx').then((m) => ({
default: m.DropDowns,
}))
);
import { import {
ChangeRedirectStatus, ChangeRedirectStatus,
getEmpAccess, getEmpAccess,
GlobalRedirectStatus, GlobalRedirectStatus,
} from '../../Features/AppPage/CenterPage.js'; } from '../../Features/AppPage/CenterPage.js';
import { UserDataBasedOnBranchId } from '../../Features/Reports/Reports.js'; import { UserDataBasedOnBranchId } from '../../Features/Reports/Reports.js';
import { gettableData } from '../../Features/PreferenceMaster/PreferenceMaster.js';
import Loader from '../../Components/Loader/Loader.jsx'; import Loader from '../../Components/Loader/Loader.jsx';
import { getUserProfile } from '../../Features/UserAccount/userData.js'; import { getUserProfile } from '../../Features/UserAccount/userData.js';
import TopSellingProductsChart from './TopSellingProductsChart.jsx';
import { Messages } from '../../Components/Notifications/Messages.jsx'; import { Messages } from '../../Components/Notifications/Messages.jsx';
const commonUrl = import.meta.env.ENV_COMMON_BASE_URL; const commonUrl = import.meta.env.ENV_COMMON_BASE_URL;
@ -97,7 +108,6 @@ const RetailDashboard = () => {
const navigate = useNavigate(); const navigate = useNavigate();
const dispatch = useDispatch(); const dispatch = useDispatch();
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const [selectedTab, setSelectedTab] = useState('dashboard');
const tabs = [ const tabs = [
{ value: 'dashboard', label: 'Dashboard' }, { value: 'dashboard', label: 'Dashboard' },
{ value: 'top-selling-products', label: 'Top Selling Products' }, { value: 'top-selling-products', label: 'Top Selling Products' },
@ -116,16 +126,7 @@ const RetailDashboard = () => {
]); ]);
const [ismounted, setIsmounted] = useState(true); const [ismounted, setIsmounted] = useState(true);
const [customerPendingBalance, setcustomerPendingBalance] = useState([]); const [customerPendingBalance, setcustomerPendingBalance] = useState([]);
console.log(PricingAppPricingName, 'PricingAppPricingName');
// const {
// AppId: appId,
// CompId: compId,
// BranchId: branchId,
// } = SessionData || {};
// console.log(appId, compId, branchId, 'SessionData');
const [range1, setRange1] = useState('today');
const [range2, setRange2] = useState('today');
const [range3, setRange3] = useState('today');
const [userprofile, setUserprofile] = useState(false); const [userprofile, setUserprofile] = useState(false);
const userProfileRef = useRef(null); const userProfileRef = useRef(null);
@ -142,7 +143,6 @@ const RetailDashboard = () => {
const [totalPages, setTotalPages] = useState(0); const [totalPages, setTotalPages] = useState(0);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [products, setProducts] = useState([]); const [products, setProducts] = useState([]);
console.log(selection, 'selection');
const [CompBranchData, setCompBranchData] = useState(); const [CompBranchData, setCompBranchData] = useState();
const [EmpAcces, setEmpAccess] = useState(); const [EmpAcces, setEmpAccess] = useState();
const [seletedBranchData, setseletedBranchData] = useState(BranchId); const [seletedBranchData, setseletedBranchData] = useState(BranchId);
@ -151,7 +151,6 @@ const RetailDashboard = () => {
BrLength == 1 ? null : 'all' BrLength == 1 ? null : 'all'
); );
const [ApiData, setApiData] = useState([]); const [ApiData, setApiData] = useState([]);
console.log(CompBranchData, 'CompBranchData');
const [Zero, SetZero] = useState(false); const [Zero, SetZero] = useState(false);
const [ResponseData, setResponseData] = useState(); const [ResponseData, setResponseData] = useState();
const [DateApiData, setDateApiData] = useState([]); const [DateApiData, setDateApiData] = useState([]);
@ -216,18 +215,7 @@ const RetailDashboard = () => {
type?.PreferredStatus === 'Y' type?.PreferredStatus === 'Y'
); );
const timerDuration = 30; const timerDuration = 30;
let EndDate = AppDetails?.[0]?.ValidityEnd;
const isoDate = EndDate; // <-- July 24
const date = new Date(isoDate);
const options = { year: 'numeric', month: 'long', day: 'numeric' };
const formatted = date.toLocaleDateString('en-US', options);
// "July 24, 2025"
console.log(expiredList, lowStockList, 'lowStockList');
console.log(TopSellingCus, preorderData, 'preorderData');
let DineInData = let DineInData =
ApiData?.[0]?.ChartDtl?.map((item) => { ApiData?.[0]?.ChartDtl?.map((item) => {
return { return {
@ -441,10 +429,6 @@ const RetailDashboard = () => {
if (res?.data?.statusCode === 1 && res?.data?.data?.length > 0) { if (res?.data?.statusCode === 1 && res?.data?.data?.length > 0) {
const remaining = res?.data?.data?.[0]; const remaining = res?.data?.data?.[0];
// let RemainingDays = expData?.RemainingDays;
// let RemainingHours=expData?.RemainingHours;
// let RemainingMinutes=expData?.RemainingMinutes;
// let RemainingSeconds=expData?.RemainingSeconds
const now = new Date(); const now = new Date();
@ -1075,39 +1059,6 @@ const RetailDashboard = () => {
getSalesHdrFn(); getSalesHdrFn();
}; };
// Function to aggregate data from multiple branches
const aggregateBranchData = (branchDataArray) => {
const aggregated = {
DineInOrderCount: 0,
TakeAwayOrderCount: 0,
SelfTakeAwayOrderCount: 0,
OverAllSalesAmt: 0,
OverAllDineInAmount: 0,
OverAllTakeAwayAmount: 0,
ChartDtl: [],
};
branchDataArray.forEach((branchData) => {
if (branchData) {
aggregated.DineInOrderCount += branchData.DineInOrderCount || 0;
aggregated.TakeAwayOrderCount += branchData.TakeAwayOrderCount || 0;
aggregated.SelfTakeAwayOrderCount +=
branchData.SelfTakeAwayOrderCount || 0;
aggregated.OverAllSalesAmt += branchData.OverAllSalesAmt || 0;
aggregated.OverAllDineInAmount += branchData.OverAllDineInAmount || 0;
aggregated.OverAllTakeAwayAmount +=
branchData.OverAllTakeAwayAmount || 0;
// Merge chart data (you might want to customize this based on your needs)
if (branchData.ChartDtl && branchData.ChartDtl.length > 0) {
aggregated.ChartDtl = aggregated.ChartDtl.concat(branchData.ChartDtl);
}
}
});
return aggregated;
};
// Helper functions for fetching data from all branches // Helper functions for fetching data from all branches
const getpreOrderDashBoardFnAllBranches = async (FromDate, ToDate) => { const getpreOrderDashBoardFnAllBranches = async (FromDate, ToDate) => {
if (!CompBranchData || CompBranchData.length === 0) return; if (!CompBranchData || CompBranchData.length === 0) return;
@ -1284,14 +1235,6 @@ const RetailDashboard = () => {
setApiData([]); setApiData([]);
} }
// const allBranchData = await Promise.all(allBranchPromises);
// // Aggregate the data from all branches
// const aggregatedData = aggregateBranchData(allBranchData);
// setDateApiData([aggregatedData]);
// setApiData([aggregatedData]);
// setPiedat([aggregatedData]);
// Also refresh other data for all branches with date range // Also refresh other data for all branches with date range
getpreOrderDashBoardFnAllBranches(fromDate, toDate); getpreOrderDashBoardFnAllBranches(fromDate, toDate);
getTopBuyingCustomersAllBranches(fromDate, toDate); getTopBuyingCustomersAllBranches(fromDate, toDate);
@ -1477,6 +1420,7 @@ const RetailDashboard = () => {
?.toUpperCase()} ?.toUpperCase()}
</div> </div>
{userprofile && ( {userprofile && (
<Suspense fallback={null}>
<BSNavBarUserInfo <BSNavBarUserInfo
isOpen={userprofile} isOpen={userprofile}
divRef={userProfileRef} divRef={userProfileRef}
@ -1487,6 +1431,7 @@ const RetailDashboard = () => {
}} }}
Logout={Logout} Logout={Logout}
/> />
</Suspense>
)} )}
</div> </div>
</div> </div>
@ -1511,6 +1456,7 @@ const RetailDashboard = () => {
{/* Branch Filter Dropdown */} {/* Branch Filter Dropdown */}
{CompBranchData?.length > 1 && selection !== 'top-selling-products' && ( {CompBranchData?.length > 1 && selection !== 'top-selling-products' && (
<div className="branch-filter-dropdown"> <div className="branch-filter-dropdown">
<Suspense fallback={<div>Loading...</div>}>
<DropDowns <DropDowns
options={[ options={[
{ value: 'all', label: 'All Branches' }, { value: 'all', label: 'All Branches' },
@ -1525,6 +1471,7 @@ const RetailDashboard = () => {
defaultValue="all" defaultValue="all"
placeholder="All Branches" placeholder="All Branches"
/> />
</Suspense>
</div> </div>
)} )}
@ -1537,14 +1484,6 @@ const RetailDashboard = () => {
className="datepickerDashboardrange" className="datepickerDashboardrange"
inputReadOnly={true} inputReadOnly={true}
/> />
{/* <div className="refershdashboard">
<div>
{' '}
<IoMdRefresh />
Refresh
</div>
<span>10sec auto refresh</span>
</div> */}
</div> </div>
</div> </div>
{selection === 'dashboard' ? ( {selection === 'dashboard' ? (
@ -1553,7 +1492,9 @@ const RetailDashboard = () => {
<div className="TotalRevenue"> <div className="TotalRevenue">
<div className="tlxHeader"></div> <div className="tlxHeader"></div>
<div className="TotalRevenue-Graph"> <div className="TotalRevenue-Graph">
<GraphChart datasets={datasets} /> <Suspense fallback={<Loader />}>
<GraphChart datasets={datasets} />
</Suspense>
</div> </div>
</div> </div>
@ -2418,28 +2359,6 @@ const RetailDashboard = () => {
No Low Stock Product No Low Stock Product
</div> </div>
)} )}
{/* <div className="stockAlertsRow">
<div className="stockAlertsCol slno">2</div>
<div className="stockAlertsCol product">
<div className="stockAlertsProductLink">
Cotton Blend Mandarin Collar Self One Design Kurta
</div>
</div>
<div className="stockAlertsCol count">4</div>
</div>
<div className="stockAlertsRow">
<div className="stockAlertsCol slno">3</div>
<div className="stockAlertsCol product">
<div className="stockAlertsProductLink">
Cotton Blend Mandarin Collar Self One Design Kurta
</div>
</div>
<div className="stockAlertsCol count">1</div>
</div> */}
{/* <div className="stockAlertsViewAll">
<a href="#">View All</a>
</div> */}
</div> </div>
</div> </div>
</div> </div>
@ -2448,106 +2367,110 @@ const RetailDashboard = () => {
</> </>
) : ( ) : (
<> <>
<TopSellingProductsChart <Suspense fallback={<Loader />}>
dates={dates} <TopSellingProductsChart
products={products} dates={dates}
loading={loading} products={products}
totalPages={totalPages} loading={loading}
page={page} totalPages={totalPages}
setPage={setPage} page={page}
fetchProducts={fetchProducts} setPage={setPage}
initialDate={initialDate} fetchProducts={fetchProducts}
/> initialDate={initialDate}
/>
</Suspense>
</> </>
)} )}
<Suspense fallback={null}>
<DefaultModal <DefaultModal
open={modal} open={modal}
title="Authentication" title="Authentication"
width={500} width={500}
footer={false} footer={false}
handleCancel={handlePageChange} handleCancel={handlePageChange}
children={ >
<> <>
<div className="modalContentsadminuser"> <div className="modalContentsadminuser">
<DropDowns <DropDowns
options={userDropDown?.map((option) => ({ options={userDropDown?.map((option) => ({
value: option?.UserId, value: option?.UserId,
label: option?.UserName, label: option?.UserName,
}))} }))}
label={<label class="required">User Name</label>} label={<label className="required">User Name</label>}
className="field-DropDown" className="field-DropDown"
onChangeFunction={(e) => UserDropDownChange(e)} onChangeFunction={(e) => UserDropDownChange(e)}
isOnchanges={selectedUserData ? true : false} isOnchanges={selectedUserData ? true : false}
valueData={selectedUserData} valueData={selectedUserData}
disabled={disabled} disabled={disabled}
/> />
<div style={{ display: 'flex', justifyContent: 'space-between' }}> <div style={{ display: 'flex', justifyContent: 'space-between' }}>
<div className="RadioButton"> <div className="RadioButton">
<RadioGrpButton <Suspense fallback={<div>Loading...</div>}>
content={[ <RadioGrpButton
{ value: 'O', label: 'OTP' }, content={[
{ value: 'P', label: 'PIN' }, { value: 'O', label: 'OTP' },
]} { value: 'P', label: 'PIN' },
fieldState={true} ]}
defaultSelect={SelectType} fieldState={true}
onSelectFuntion={(e) => ChangeMethod(e)} defaultSelect={SelectType}
/> onSelectFuntion={(e) => ChangeMethod(e)}
</div> />
</div> </Suspense>
{pinInput && (
<div className="otpInputsadminuser">
{[0, 1, 2, 3].map((i) => (
<input
key={i}
ref={(el) => (inputRefs.current[i] = el)}
className="inputNumber"
type="text"
inputMode="numeric"
pattern="[0-9]"
maxLength={1}
onChange={(e) => handleChange(i, e)}
onKeyDown={(e) => handleKeyDown(i, e)}
style={{
textAlign: 'center',
width: '40px',
fontSize: '20px',
}}
/>
))}
</div>
)}
<div
style={{
width: '100%',
display: 'flex',
justifyContent: 'flex-end',
}}
>
<button
className="size-save-button-retail"
onClick={handleClick}
disabled={disabled}
>
{SelectTypeName === 'OTP'
? !FirstTimeOtp
? `send ${SelectTypeName.toLocaleLowerCase()}`
: `resend ${SelectTypeName.toLocaleLowerCase()}${
seconds > 0 ? ` in ${seconds}s` : ''
}`
: !FirstTimePin
? `send ${SelectTypeName.toLocaleLowerCase()}`
: `resend ${SelectTypeName.toLocaleLowerCase()}${
seconds > 0 ? ` in ${seconds}s` : ''
}`}
</button>
</div> </div>
</div> </div>
</>
} {pinInput && (
/> <div className="otpInputsadminuser">
{[0, 1, 2, 3].map((i) => (
<input
key={i}
ref={(el) => (inputRefs.current[i] = el)}
className="inputNumber"
type="text"
inputMode="numeric"
pattern="[0-9]"
maxLength={1}
onChange={(e) => handleChange(i, e)}
onKeyDown={(e) => handleKeyDown(i, e)}
style={{
textAlign: 'center',
width: '40px',
fontSize: '20px',
}}
/>
))}
</div>
)}
<div
style={{
width: '100%',
display: 'flex',
justifyContent: 'flex-end',
}}
>
<button
className="size-save-button-retail"
onClick={handleClick}
disabled={disabled}
>
{SelectTypeName === 'OTP'
? !FirstTimeOtp
? `send ${SelectTypeName.toLocaleLowerCase()}`
: `resend ${SelectTypeName.toLocaleLowerCase()}${
seconds > 0 ? ` in ${seconds}s` : ''
}`
: !FirstTimePin
? `send ${SelectTypeName.toLocaleLowerCase()}`
: `resend ${SelectTypeName.toLocaleLowerCase()}${
seconds > 0 ? ` in ${seconds}s` : ''
}`}
</button>
</div>
</div>
</>
</DefaultModal>
</Suspense>
</div> </div>
); );
}; };

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
flex-wrap: wrap; flex-wrap: wrap;
gap: 1rem; gap: 1rem;
.ant-input-affix-wrapper>input.ant-input { .ant-input-affix-wrapper > input.ant-input {
padding: 4px 1px !important; padding: 4px 1px !important;
padding-top: 1rem !important; padding-top: 1rem !important;
} }
@ -61,6 +61,10 @@
.DeliveryChallan-inputForm .ant-table-content { .DeliveryChallan-inputForm .ant-table-content {
width: 70vw; width: 70vw;
} }
.DeliveryChallan-inputForm .ant-table-thead tr {
background-color: #2c88ee !important;
}
.DeliveryChallan-inputForm { .DeliveryChallan-inputForm {
display: flex; display: flex;
@ -107,8 +111,8 @@
// right: 100px; // right: 100px;
} }
.ant-table-wrapper .ant-table-tbody>tr.ant-table-row:hover>td, .ant-table-wrapper .ant-table-tbody > tr.ant-table-row:hover > td,
.ant-table-wrapper .ant-table-tbody>tr>th.ant-table-cell-row-hover>td.ant-table-cell-row-hover { .ant-table-wrapper .ant-table-tbody > tr > th.ant-table-cell-row-hover > td.ant-table-cell-row-hover {
background: rgb(224, 223, 223) !important; background: rgb(224, 223, 223) !important;
font-size: unset !important; font-size: unset !important;
transition-duration: 0.4s !important; transition-duration: 0.4s !important;
@ -129,7 +133,6 @@
} }
.Deliverychallan-table { .Deliverychallan-table {
// width: 70px; // width: 70px;
.ant-table table { .ant-table table {
border-spacing: 0px; border-spacing: 0px;
@ -138,4 +141,8 @@
.ant-table-wrapper table { .ant-table-wrapper table {
width: 84% !important; width: 84% !important;
} }
}
.product-scan .sales-quotation{
display: flex;
} }

View File

@ -61,6 +61,7 @@ import { useSelector } from 'react-redux';
import { getPrintSelectionComponentData } from '../../Features/ThemeChange/ThemeChange.js'; import { getPrintSelectionComponentData } from '../../Features/ThemeChange/ThemeChange.js';
import { DCPDFMobilePrint } from './DCPDFMobilePrint.js'; import { DCPDFMobilePrint } from './DCPDFMobilePrint.js';
import { isMobile } from 'react-device-detect'; import { isMobile } from 'react-device-detect';
const DeliveryChellanForm = () => { const DeliveryChellanForm = () => {
const { SadminuserAccess } = useAuth(); const { SadminuserAccess } = useAuth();

View File

@ -24,6 +24,9 @@
vertical-align: middle; vertical-align: middle;
height: 35px; height: 35px;
} }
.ant-table-thead tr {
background-color: #2c88ee !important;
}
} }
.dc-to-invoice-payment-mode { .dc-to-invoice-payment-mode {
@ -46,4 +49,16 @@
margin: 0px 2rem; margin: 0px 2rem;
gap: 10px; gap: 10px;
padding-top: 0; padding-top: 0;
} }
.delivery-challan-to-invoice-form {
width: 100%;
}
.DCformDivAnt {
display: flex;
align-items: flex-start;
gap: 1rem;
justify-content: flex-start;
flex-direction: column;
}

View File

@ -342,7 +342,7 @@ const DeliveryChallanToInvoiceForm = () => {
<Form <Form
ref={formRef} ref={formRef}
initialValues={editstate} initialValues={editstate}
className="formDivAnt" className="DCformDivAnt"
onFinish={onFinish} onFinish={onFinish}
> >
<Form.Item <Form.Item
@ -409,7 +409,7 @@ const DeliveryChallanToInvoiceForm = () => {
/> />
</Form.Item> </Form.Item>
</>} </>}
<div className="submitButton">
<Form.Item> <Form.Item>
<Buttons <Buttons
buttonText="SUBMIT" buttonText="SUBMIT"
@ -442,7 +442,7 @@ const DeliveryChallanToInvoiceForm = () => {
</div> </div>
</div> </div>
)} )}
</div>
</Form> </Form>

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux'; import { useSelector, useDispatch } from 'react-redux';
import axios from 'axios'; import axios from 'axios';
import { Skeleton } from 'antd'; import { Skeleton } from 'antd';
@ -64,119 +64,7 @@ const KioskBookingPage = () => {
}; };
useEffect(() => { useEffect(() => {
// const fetchData = async () => {
// const queryParams = await getQueryParams();
// console.log("queryParams", queryParams)
// if (Object.keys(queryParams)?.length !== 0) {
// console.log("queryParams", queryParams)
// if(!sessionStorage.getItem('auth')){
// let data = {
// username: "1000000001",
// password: "1234"
// }
// const response = await axios.post(`${apiUrlToken}/jwtTokenGenerator`, data, {
// headers: {
// 'Content-Type': 'application/json',
// 'Accept': 'application/json',
// },
// });
// const { token } = response?.data;
// sessionStorage.setItem('auth', token)
// sessionStore("LoginType","Kiosk")
// }
// const MACAddress = queryParams?.MD
// if (MACAddress) {
// console.log("MACAddress", MACAddress)
// setDeviceAddress(MACAddress)
// setDevicePresent(true)
// let deviceMACResponse = await dispatch(getDeviceAccess({ DeviceAddress: MACAddress })).unwrap();
// if (deviceMACResponse?.data?.statusCode == 1 && deviceMACResponse?.data?.data?.length > 0 && deviceMACResponse?.data?.data?.[0]?.KioskStatus === 'Y') {
// setDeviceAccess(true)
// let responseData = deviceMACResponse?.data?.data?.[0]
// responseData?.MobileNo != null && responseData?.MobileNo != undefined && sessionStore("MobileNo", responseData?.MobileNo);
// responseData?.UserId != null && responseData?.UserId != undefined && sessionStore("UserId", responseData?.UserId);
// responseData?.UserType != null && responseData?.UserType != undefined && sessionStore("UserType", responseData?.UserType);
// responseData?.CompId != null && responseData?.CompId != undefined && sessionStore("CompId", responseData?.CompId);
// responseData?.CompName != null && responseData?.CompName != undefined && sessionStore("CompName", responseData?.CompName);
// responseData?.AppId != null && responseData?.AppId != undefined && sessionStore("AppId", responseData?.AppId);
// responseData?.AppName != null && responseData?.AppName != undefined && sessionStore("AppName", responseData?.AppName);
// responseData?.BranchId != null && responseData?.BranchId != undefined && sessionStore("BranchId", responseData?.BranchId);
// responseData?.userName != null && responseData?.userName != undefined && sessionStore("userName", responseData?.UserName);
// responseData?.SessionId != null && responseData?.SessionId != undefined && sessionStore("SessionId", responseData?.SessionId);
// sessionStore("hasRefreshed", true);
// dispatch(getKioskTemplate({ CompId: responseData?.CompId, BranchId: responseData?.BranchId, AppId: responseData?.AppId })).unwrap();
// dispatch(getProductCategories({ CompId: responseData?.CompId, BranchId: responseData?.BranchId, AppId: responseData?.AppId })).unwrap();
// } else {
// setDeviceAccess(false)
// }
// } else {
// const MobileNoValue = decryptedValuesFun(queryParams?.MN);
// const UserIdValue = decryptedValuesFun(queryParams?.UD);
// const UserTypeValue = decryptedValuesFun(queryParams?.UT);
// const CompIdValue = decryptedValuesFun(queryParams?.CD);
// const AppIdValue = decryptedValuesFun(queryParams?.AD);
// const BranchIdValue = decryptedValuesFun(queryParams?.BD);
// const OrderIdValue = decryptedValuesFun(queryParams?.OD);
// const AmountValue = decryptedValuesFun(queryParams?.AM);
// let CompNameValue = null, AppNameValue = null;
// if (CompIdValue) {
// let response = await dispatch(getCompanyData({ CompId: CompIdValue })).unwrap();
// if (response?.data?.statusCode == 1) {
// CompNameValue = response?.data?.data?.[0]?.["CompName"];
// } else {
// CompNameValue = null;
// }
// }
// if (AppIdValue) {
// let appResponse = await dispatch(getAllApplications({ AppId: AppIdValue })).unwrap();
// if (appResponse?.data?.statusCode == 1) {
// AppNameValue = appResponse?.data?.data?.[0]?.["AppName"];
// } else {
// AppNameValue = null;
// }
// }
// let userNameValue = null;
// if (queryParams?.UN != null && queryParams?.UN != undefined) {
// userNameValue = decryptedValuesFun(queryParams?.UN);
// }
// console.log("queryParams", MobileNoValue, UserIdValue, UserTypeValue, CompIdValue, AppIdValue, BranchIdValue)
// if (MobileNoValue && UserIdValue && UserTypeValue && CompIdValue && AppIdValue && BranchIdValue) {
// sessionStore("MobileNo", MobileNoValue);
// sessionStore("UserId", UserIdValue);
// sessionStore("UserType", UserTypeValue);
// sessionStore("CompId", CompIdValue);
// sessionStore("CompName", CompNameValue);
// sessionStore("AppId", AppIdValue);
// sessionStore("AppName", AppNameValue);
// sessionStore("BranchId", BranchIdValue);
// if (userNameValue != null) {
// sessionStore("userName", userNameValue);
// }
// dispatch(getKioskTemplate({ CompId: CompIdValue, BranchId: BranchIdValue, AppId: AppIdValue })).unwrap();
// dispatch(getProductCategories({ CompId: CompIdValue, BranchId: BranchIdValue, AppId: AppIdValue })).unwrap();
// dispatch(changeKioskPageName('OrderView'))
// dispatch(changePaymentgatewayRedirect(true))
// dispatch(changeKioskCustomerMobileNo(MobileNoValue))
// dispatch(changePGFailedTransId(OrderIdValue))
// dispatch(changePGFailedAmt(AmountValue))
// const url = new URL(window.location);
// url.search = '';
// window.history.replaceState({}, document.title, url.toString());
// }
// else {
// console.error("One or more decrypted values are null.");
// }
// }
// } else {
// dispatch(getKioskTemplate({ CompId: CompId, BranchId: BranchId, AppId: AppId })).unwrap();
// dispatch(getProductCategories({ CompId: CompId, BranchId: BranchId, AppId: AppId })).unwrap();
// }
// }
fetchData(); fetchData();
}, []); }, []);

View File

@ -1,9 +1,9 @@
.OfferList-Master { .OfferList-Master {
padding: 20px; padding: 0;
background: #fff; background: #fff;
min-height: 100vh; min-height: 100vh;
width: 100%; width: 100%;
margin: 0 0 1rem 1rem; margin: 0 0 0 0;
overflow: auto; overflow: auto;
margin-bottom: 2rem; margin-bottom: 2rem;
border-radius: 12px; border-radius: 12px;
@ -477,6 +477,12 @@
font-size: 14px; font-size: 14px;
color: #878787; color: #878787;
} }
.ant-input-affix-wrapper {
width: 250px !important;
}
.ant-input {
padding: 3px 14px 9px 11px !important;
}
} }
// Table Styles // Table Styles

View File

@ -1156,6 +1156,7 @@ const PaymentDetailsList = () => {
flexWrap: 'wrap', flexWrap: 'wrap',
alignItems: 'flex-start', alignItems: 'flex-start',
gap: '1rem', gap: '1rem',
display: 'flex',
}} }}
> >
<Tooltip <Tooltip

View File

@ -65,7 +65,7 @@ const PreferenceList = () => {
const buildInitialValues = () => ({ const buildInitialValues = () => ({
dashboard: allSettingsMap['dashboard'] === 'Y', dashboard: allSettingsMap['dashboard'] === 'Y',
shortcutkeys:allSettingsMap['shortcutkeys']==="Y", shortcutkeys: allSettingsMap['shortcutkeys'] === 'Y',
autoreceivestock: allSettingsMap['autoreceivestock'] === 'Y', autoreceivestock: allSettingsMap['autoreceivestock'] === 'Y',
decimal: allSettingsMap['decimal'] === 'Y', decimal: allSettingsMap['decimal'] === 'Y',
enabledModules: [ enabledModules: [
@ -287,7 +287,7 @@ const PreferenceList = () => {
const key = setting.SettingIdName.toLowerCase(); const key = setting.SettingIdName.toLowerCase();
const boolValues = { const boolValues = {
dashboard: values.dashboard, dashboard: values.dashboard,
shortcutkeys:values.shortcutkeys, shortcutkeys: values.shortcutkeys,
autoreceivestock: values.autoreceivestock, autoreceivestock: values.autoreceivestock,
decimal: values.decimal, decimal: values.decimal,
searchfocus: values.searchfocus, searchfocus: values.searchfocus,
@ -564,7 +564,7 @@ const PreferenceList = () => {
Sales Page Sales Page
</div> </div>
{renderCheckbox('searchfocus', 'Always focus the search bar?')} {renderCheckbox('searchfocus', 'Always focus the search bar?')}
{renderCheckbox( {renderCheckbox(
'shortcutkeys', 'shortcutkeys',
'Would you like to enable the shortcut keys?' 'Would you like to enable the shortcut keys?'
)} )}
@ -589,7 +589,7 @@ const PreferenceList = () => {
</Checkbox.Group> </Checkbox.Group>
</Form.Item> </Form.Item>
)} )}
{((allSettingsMap['dinein'] !== undefined && dinePreference) || {((allSettingsMap['dinein'] !== undefined && dinePreference) ||
allSettingsMap['estimation'] !== undefined) && ( allSettingsMap['estimation'] !== undefined) && (
<Form.Item <Form.Item
name="enabledModules" name="enabledModules"
@ -627,7 +627,7 @@ const PreferenceList = () => {
'customisedbillnumber', 'customisedbillnumber',
'Do you Want Customised Bill Number?' 'Do you Want Customised Bill Number?'
)} )}
{renderCheckbox('scanlayout', 'Do you Want Scan Layout Page?')} {renderCheckbox('scanlayout', 'Do you Want Scan Layout Page?')}
{renderCheckbox('upiqr', 'Do you want to show the UPI QR code?')} {renderCheckbox('upiqr', 'Do you want to show the UPI QR code?')}
{/* {renderCheckbox('editbill', 'Do you want to edit the previously created bill?')} */} {/* {renderCheckbox('editbill', 'Do you want to edit the previously created bill?')} */}
</div> </div>
@ -749,7 +749,6 @@ const PreferenceList = () => {
'estimateprintheader', 'estimateprintheader',
'Do you want to include a header when printing Estimate bills?' 'Do you want to include a header when printing Estimate bills?'
)} )}
</div> </div>
<div className="PreferencesBTN"> <div className="PreferencesBTN">
<Buttons <Buttons

View File

@ -18,7 +18,7 @@
color: #1890ff; // Ant Design blue color: #1890ff; // Ant Design blue
} }
.ant-form-item-label>label { .ant-form-item-label > label {
font-weight: 500; font-weight: 500;
color: #000000; color: #000000;
font-size: 16px; font-size: 16px;
@ -62,7 +62,7 @@
.submitButton { .submitButton {
position: unset; position: unset;
>button { > button {
width: max-content; width: max-content;
bottom: 30px; bottom: 30px;
} }
@ -83,7 +83,7 @@
.menu-section { .menu-section {
padding: 10px 0; padding: 10px 0;
>div { > div {
font-family: "Poppins"; font-family: "Poppins";
font-weight: 400; font-weight: 400;
font-size: 14px; font-size: 14px;
@ -99,6 +99,14 @@
&:hover { &:hover {
background-color: #c0cbf8; background-color: #c0cbf8;
} }
@media (max-width: 500px) {
border: none !important;
text-decoration: none !important;
font-style: unset !important;
}
}
@media (max-width: 500px) {
overflow: auto;
} }
} }
@ -118,7 +126,7 @@
font-size: 1rem; font-size: 1rem;
} }
.ant-form-item-label>label { .ant-form-item-label > label {
font-size: 14px; font-size: 14px;
} }
@ -141,7 +149,7 @@
margin: 0; margin: 0;
text-decoration: underline; text-decoration: underline;
>div { > div {
font-size: 12px; font-size: 12px;
margin: 0; margin: 0;
background-color: unset; background-color: unset;
@ -167,4 +175,4 @@
.primary_Button { .primary_Button {
width: 200px !important; width: 200px !important;
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ import {
EditFilled, EditFilled,
} from '@ant-design/icons'; } from '@ant-design/icons';
import { Messages } from '../../Components/Notifications/Messages'; import { Messages } from '../../Components/Notifications/Messages';
import { Form, Tooltip, Space, Input, Button, AutoComplete } from 'antd'; import { Form, Tooltip, Space, Input, Button, AutoComplete, Checkbox } from 'antd';
import { IoWarningOutline } from 'react-icons/io5'; import { IoWarningOutline } from 'react-icons/io5';
import { import {
getSession, getSession,
@ -134,6 +134,7 @@ const PurchaseOrder = () => {
const [itemsPerPage] = useState(20); const [itemsPerPage] = useState(20);
const [searchTerm, setSearchTerm] = useState(''); const [searchTerm, setSearchTerm] = useState('');
const [minQty, setMinQty] = useState(''); const [minQty, setMinQty] = useState('');
const [showAllSuppliers, setShowAllSuppliers] = useState(false);
// const filteredData = currentData.filter((item) => { // const filteredData = currentData.filter((item) => {
// const matchesSearch = // const matchesSearch =
@ -153,7 +154,7 @@ const PurchaseOrder = () => {
{ {
name: 'Purchase Order', name: 'Purchase Order',
link: `${subDirectory}setting/purchase-order/new`, link: `${subDirectory}setting/purchase-order`,
}, },
{ {
name: 'New', name: 'New',
@ -223,7 +224,7 @@ const PurchaseOrder = () => {
console.error('Error fetching stock details:', err); console.error('Error fetching stock details:', err);
} }
}; };
console.log('hi'); console.log('hi');
const debouncedFetchStock = useMemo(() => debounce(ProductStockFun, 600), []); const debouncedFetchStock = useMemo(() => debounce(ProductStockFun, 600), []);
const handleMinQtyChange = (e) => { const handleMinQtyChange = (e) => {
@ -301,20 +302,21 @@ console.log('hi');
let SelectSupDetails = Supplierdata?.filter( let SelectSupDetails = Supplierdata?.filter(
(item) => item.SuppName?.toLowerCase() === 'self' (item) => item.SuppName?.toLowerCase() === 'self'
); //naresh ); //naresh
setselecSuppDetails(SelectSupDetails?.[0]);
setselecPurSupplierDetails(SelectSupDetails); setselecPurSupplierDetails(SelectSupDetails);
formRef.current?.setFieldsValue({ SuppId: SupplierId }); formRef.current?.setFieldsValue({ SuppId: SupplierId });
setselecPurSupplier(SupplierId); setselecPurSupplier(SupplierId);
getProductDatas(SupplierId); getProductDatas(SupplierId);
}; };
const getSupplierData = async () => { const getSupplierData = async (Type = null) => {
try { try {
let Supplier = await dispatch( let Supplier = await dispatch(
getPurchaseSupplierAndWareHouseData({ getPurchaseSupplierAndWareHouseData({
CompId, CompId,
AppId, AppId,
BranchId, BranchId,
Type,
}) })
).unwrap(); ).unwrap();
if (Supplier?.statusCode == 1) { if (Supplier?.statusCode == 1) {
@ -1322,6 +1324,7 @@ console.log('hi');
style={{ paddingTop: '0px', rowGap: '0px' }} style={{ paddingTop: '0px', rowGap: '0px' }}
> >
<div className="inputForm"> <div className="inputForm">
<Form.Item <Form.Item
name="SuppId" name="SuppId"
rules={[ rules={[
@ -1379,10 +1382,29 @@ console.log('hi');
<PlusCircleOutlined onClick={addPurSupplier} /> <PlusCircleOutlined onClick={addPurSupplier} />
</Tooltip> </Tooltip>
</Form.Item> </Form.Item>
<Form.Item
name="showAll"
valuePropName="checked"
>
<Tooltip title="Show all branches and warehouses" placement="top">
<span>
<Checkbox
checked={showAllSuppliers}
onChange={(e) => {
const checked = e.target.checked;
setShowAllSuppliers(checked);
getSupplierData(checked ? 'Y' : null);
}}
>
All
</Checkbox>
</span>
</Tooltip>
</Form.Item>
<div className='deliveryaddress'> {selecSuppDetails !== null &&
{selecSuppDetails !== null && (<div className='deliveryaddress'>
(() => { {(() => {
const fields = []; const fields = [];
if (selecSuppDetails?.SuppName) { if (selecSuppDetails?.SuppName) {
fields.push( fields.push(
@ -1456,7 +1478,8 @@ console.log('hi');
</div> </div>
); );
})()} })()}
</div> </div>)
}
<div <div
className="lowStock-button" className="lowStock-button"
onClick={() => setisLowStockModel(true)} onClick={() => setisLowStockModel(true)}

View File

@ -71,21 +71,7 @@
font-size: 12px !important; font-size: 12px !important;
} }
// .custom-table tbody tr {
// >td:nth-child(6) {
// display: flex;
// flex-direction: column;
// width: 100%;
// gap: 2rem;
// }
// >td:nth-child(7) {
// display: flex;
// flex-direction: column;
// width: 100%;
// gap: 2rem;
// }
// }
.custom-table tbody tr td { .custom-table tbody tr td {
text-align: left; text-align: left;
@ -138,11 +124,7 @@
} }
} }
.summaryContent2 {
.centerDivList {
// width: 50%;
}
}
.custom-table { .custom-table {
Button:disabled, Button:disabled,

View File

@ -4419,6 +4419,7 @@
} }
.CustomerForm-Master { .CustomerForm-Master {
width: 100%;
.inputForm { .inputForm {
width: 50% !important; width: 50% !important;
} }

File diff suppressed because it is too large Load Diff

View File

@ -5,8 +5,9 @@ import { Modal } from "antd";
import { getProductStockDetails } from "../../../Features/PurchaseOrder/PurchaseOrder"; import { getProductStockDetails } from "../../../Features/PurchaseOrder/PurchaseOrder";
import { dateFormatChange, ExtractDateFormate, getSession } from "../../../Services/Others"; import { dateFormatChange, ExtractDateFormate, getSession } from "../../../Services/Others";
import { useDispatch } from "react-redux"; import { useDispatch } from "react-redux";
import { changeBreadCrumb } from "../../../Features/AppPage/CenterPage"; import { changeBreadCrumb } from "../../../Features/AppPage/CenterPage";
// import "./PurchaseOrderReport.css"; import "./PurchaseOrderReport.scss";
const subDirectory = import.meta.env.BASE_URL; const subDirectory = import.meta.env.BASE_URL;
const PurchaseOrderReport = () => { const PurchaseOrderReport = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();

View File

@ -0,0 +1,646 @@
.ItemWiseReport-table .ant-table table {
// height:60vh;
// overflow:scroll;
overflow: scroll;
// height: clamp(30vh , 85vh,95vh);
border-spacing: 0 0.3rem;
}
.ItemWiseReport-table .ant-table-thead {
position: sticky;
top: 0 !important;
background-color: #bad4f9;
z-index: 1;
border-spacing: 0 0 !important;
}
.ItemWiseReport-table .ant-table-wrapper .ant-table-thead > tr > th,
.ant-table-wrapper .ant-table-thead > tr > td {
color: #000000;
font-size: 12px;
font-weight: 600;
border-spacing: 0 0.3rem;
}
.ItemWiseReport-table .ant-table-row > td {
color: black !important;
font-weight: 500 !important;
font-size: 16px;
}
.ItemWiseReport-search {
display: flex;
justify-content: end;
column-gap: 1rem;
margin-bottom: 10px;
}
.ItemWiseReport-search-button {
border: none;
background-color: #e167ff;
padding: 1rem 1.5rem;
border-radius: 6px;
}
.ItemWiseReport-Date-from-heading {
width: 7rem;
}
.ItemWiseReport-container {
display: flex;
flex-direction: column;
row-gap: 0.5rem;
// padding: 10px 15px;
height: 88vh;
// overflow: hidden;
overflow: auto;
width: 100%;
flex-wrap: wrap;
background-color: #fff;
border-radius: 12px;
}
.ItemWiseReport-table .ant-pagination {
position: sticky;
bottom: 0;
margin: 0 !important;
padding: 0.5rem;
background-color: #fafafa;
}
.ItemWiseReport-header {
display: flex;
gap: 10px;
justify-content: space-between;
flex-wrap: wrap;
align-items: center;
margin-top: 10px;
}
.ItemWiseReport-heading {
font-size: 20px;
font-weight: 500;
}
.search-purchase {
input,
.ant-input {
border-start-end-radius: 6px !important;
border-end-end-radius: 6px !important;
padding-top: 6px !important;
}
.ant-input {
height: 40px;
}
.searchDiv {
height: 42px;
}
}
.ItemWiseReport-submit-btn-container {
display: flex;
flex-direction: column;
justify-content: center;
width: max-content;
margin-left: 20px;
}
.ItemWiseReport-PrinttAndSubmit {
display: flex;
column-gap: 3vw;
align-items: center;
// width: 100%;
justify-content: space-between;
margin-left: 30px;
}
.ItemWiseReport-dateaAnd-buttons {
display: flex;
column-gap: 2rem;
row-gap: 1rem;
// align-items: center;
// flex-wrap: wrap;
}
.ItemWiseReport-Date-picker {
display: flex;
flex-wrap: wrap;
align-items: center;
column-gap: 2rem;
// row-gap: 1rem;
.ant-form-item {
margin-bottom: 0 !important;
}
}
.ItemWiseReport-Date .ant-picker {
width: 20rem;
}
.ItemWiseReport-submit-btn {
padding: 0.6rem 1rem;
border: none;
background-color: var(--PRIMARY_BUTTON_BG_COLOR) !important;
margin-bottom: 2px;
font-size: 16px;
font-family: "Gilroy";
color: #ffffff;
border-radius: 5px;
cursor: pointer;
}
// .ItemWiseReport-submit-btn:hover {
// background-color: #a8a8a8;
// }
.ItemWiseReport-PrinterIcon-Container {
cursor: pointer;
// position: absolute;
// top: 6rem;
// right: 5rem;
}
.ItemWiseReport-printerIcon {
font-size: 25px;
cursor: pointer;
}
.ItemWiseReport-printerIcon:hover {
color: #414141;
}
.ItemWiseReport-Date {
display: flex;
column-gap: 1rem;
align-items: center;
}
.ItemWiseReport-Details-container {
display: flex;
justify-content: space-between;
align-items: center;
margin-right: 2rem;
column-gap: 1rem;
flex-wrap: wrap;
}
.ItemWiseReport-Details {
margin-left: 0.7rem;
display: flex;
column-gap: 1rem;
row-gap: 0.5rem;
flex-wrap: wrap;
}
.ItemWiseReport-Details-buttons {
border: none;
padding: 0.6rem 1rem;
width: max-content;
background-color: #006aff;
border-radius: 5px;
color: #fff;
cursor: pointer;
}
.ItemWiseReport-printerIcon {
font-size: 30px;
}
.ItemWiseReport-table-container {
margin: 1rem 1rem;
}
.ItemWiseReport-Date p {
font-size: 11px;
color: #5a5a5a;
margin-left: 5px;
margin-top: 2px;
}
.ItemWiseReport-table {
overflow: auto;
height: clamp(50vh, 30vh, 95vh);
scrollbar-width: thin;
tr:nth-child(even) {
background-color: #e9e8e8 !important;
border: none;
}
//dhana
// height: clamp(30vh, 50vh, 95vh);
}
// writed by sree
.ItemWiseReport-table1 {
overflow: auto;
height: clamp(40vh, 30vh, 95vh);
width: 79vw !important;
}
.ItemWiseReport-table .ant-table-thead tr .ant-table-cell {
font-size: 25px;
font-weight: 800;
}
.ItemWiseReport-Amount-Collected-table {
display: flex;
justify-content: flex-end;
}
.ItemWiseReport-netAmount {
display: flex;
justify-content: flex-end;
padding-top: 10px;
}
.ItemWiseReport-search .ant-input {
border-radius: 10px !important;
padding: 0.35rem 0.5rem !important;
}
.BSitemwise-Search-icon {
font-size: 25px;
color: #1292ee;
}
.dropDownandsumit {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
.ant-form-item {
margin-bottom: 0 !important;
}
}
.Submit_Print {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
}
@media only screen and (max-width: 950px) {
.ItemWiseReport-PrinttAndSubmit {
display: flex;
column-gap: 3vw;
align-items: center;
justify-content: space-between;
// margin-left: 30px;
// margin-bottom: 23px;
}
.ItemWiseReport-PrinterIcon-Container {
margin-left: 30px;
cursor: pointer;
// position: absolute;
// top: 5rem;
// right: 1rem;
}
.ItemWiseReport-table {
overflow: scroll;
height: 40vh;
}
.ItemWiseReport-container {
padding: 15px 15px;
}
.ItemWiseReport-dateaAnd-buttons {
column-gap: 0.5rem;
}
.ItemWiseReport-netAmount {
justify-content: flex-start !important;
padding-top: 10px;
}
.dropdownUserid {
margin-top: 0 !important;
}
// .ItemWiseReport-dateaAnd-buttons {
// // flex-wrap: wrap;
// }
.ItemWiseReport-submit-btn-container {
margin-left: 4.5rem;
justify-content: flex-start !important;
flex-direction: row;
column-gap: 0.5rem;
margin-bottom: 24px;
width: 83px;
}
.ItemWiseReport-Date p {
padding: 0;
}
.ItemWiseReport-table .ant-table-wrapper .ant-table-thead > tr > th,
.ant-table-wrapper .ant-table-thead > tr > td {
font-size: 10px !important;
}
}
@media only screen and (max-width: 768px) {
.ItemWiseReport-submit-btn-container {
margin-left: 5px;
}
.ItemWiseReport-table {
width: 80vw;
}
}
@media only screen and (max-width: 499px) {
.ItemWiseReport-submit-btn-container {
font-size: 12px !important;
}
.centerPageSub {
margin: 0;
}
.ItemWiseReport-table {
overflow-x: scroll;
height: 26vh;
}
}
@media only screen and (max-width: 280px) {
// .ItemWiseReport-PrinttAndSubmit {
// position: absolute !important;
// top: 18rem !important;
// }
.ItemWiseReport-PrinterIcon-Container {
position: absolute;
top: 290px !important;
left: 200px !important;
}
.Submit_Print {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
margin-left: 20px;
}
.ItemWiseReport-Date {
width: 3rem !important;
}
.ItemWiseReport-Date p {
font-size: 12px !important;
}
.dropDownandsumit {
margin-top: 30px !important;
height: 160px;
}
.ItemWiseReport-search {
display: flex;
justify-content: start;
column-gap: 1rem;
width: 4rem !important;
}
.ItemWiseReport-heading {
font-size: 13px;
font-weight: 500;
}
.ItemWiseReport-submit-btn-container {
margin-top: 20px;
}
.ItemWiseReport-dateaAnd-buttons {
column-gap: 0.5rem;
width: 75vw !important;
overflow: auto !important;
}
.ItemWiseReport-table {
overflow: scroll;
height: 30vh;
}
}
.ItemWiseReport-table .ant-table-thead th.ant-table-column-has-sorters:hover {
background-color: #bad4f9;
}
.ItemWiseReport-table .ant-table-wrapper .ant-table-thead > tr > th,
.ant-table-wrapper .ant-table-thead > tr > td {
background-color: #bad4f9;
}
.ItemWiseReport-printerIcon-disabled {
opacity: 0.5;
/* You can adjust the opacity to visually indicate it's disabled */
pointer-events: none;
/* Disable pointer events so it won't respond to clicks */
cursor: not-allowed;
/* Change cursor to indicate it's not clickable */
font-size: 30px;
}
.dropdownUserid {
margin-top: 10px;
}
.itemwiseDropdown {
width: 9rem !important;
}
.ItemWiseReport-Date {
width: 8rem;
}
.ItemWiseReport-table .ant-table-content table {
table-layout: unset !important;
}
.toggle {
display: flex;
width: inherit;
height: 2vw;
flex-direction: row-reverse;
z-index: 1;
// padding-right: 93px;
padding-bottom: 25px;
}
// .ant-switch:hover:not(.ant-switch-disabled) {
// background:var(--SELECTED_COLOR) ;
// }
//nk
@media only screen and (max-width: 499px) {
.ItemWiseReport-Amount-Collected-table tr {
justify-content: flex-start;
column-gap: 5rem;
}
.ItemWiseReport-border-dashed {
width: 10rem;
}
.ItemWiseReport-Amount-Collected-table {
justify-content: flex-start;
}
.centerPageSub {
margin: 0 !important;
}
.ItemWiseReport-border-dashed {
font-size: 15px;
}
.ItemWiseReport-border-dashed {
width: 10rem;
}
}
@media only screen and (max-width: 768px) {
.overalTotal {
width: 7rem;
font-size: 20px;
}
}
.ItemWiseReport-Amount-Collected-table {
display: flex;
justify-content: flex-end;
}
.ItemWiseReport-Amount-Collected-table tr {
display: flex;
// width: 15rem;
justify-content: space-between;
}
.ItemWiseReport-border-dashed {
border-bottom: 1px dashed rgb(46, 46, 46);
width: 17rem;
}
.ItemWiseReport-border-dashed {
font-size: 23px;
font-weight: 600;
}
.custom-table {
width: 100%;
border-collapse: collapse;
border: 1px solid #909090;
font-family: "Poppins", sans-serif;
> thead {
position: sticky;
top: -1px;
}
}
.custom-table th {
background-color: #a4c5f4;
color: #1e1e1e;
padding: 6px;
text-align: left;
border: 1px solid #909090;
-webkit-text-stroke-width: 0.2px;
font-size: 12px;
font-weight: 500;
font-family: VAR(--HEADING_FONT_FAMILY);
// text-transform: uppercase;
text-transform: capitalize;
letter-spacing: 0.2px;
}
.centerDivList {
display: flex;
flex-direction: column;
gap: 4px;
// width: 100%;
// height: 43vh;
overflow: scroll;
padding-bottom: 2rem;
}
.custom-table td {
padding: 4px 6px;
border: 1px solid #909090;
text-align: left;
font-size: 12px !important;
}
.custom-table tbody tr td {
text-align: left;
.ant-select.ant-select-in-form-item {
width: 190px !important;
}
}
.custom-table tbody tr td[colspan="7"] {
padding: 20px;
}
.custom-table tbody tr.additionalCharges-selected {
background-color: #dddddd;
}
.custom-table tbody tr.setAsDefault-selected {
background-color: #cceaf0;
}
.custom-table {
.ant-form-item {
margin-bottom: 0 !important;
}
.float-label {
margin-bottom: 8px !important;
}
}
.ChargesAddAndCancel {
display: flex;
justify-content: flex-end;
gap: 1rem;
> div {
border-radius: 6px;
padding: 5px 10px;
color: #fff;
font-weight: 600 !important;
cursor: pointer;
}
> div:nth-child(1) {
background-color: #28aa3a;
}
> div:nth-child(2) {
background-color: #ff0000;
}
}
.custom-table {
Button:disabled,
Button[disabled] {
width: unset !important;
height: unset !important;
border-radius: 50px !important;
}
}

View File

@ -21,7 +21,8 @@ import { getSession, validateSafeInput } from '../../Services/Others';
import { postshift, putshift } from '../../Features/ShiftMaster/ShiftMaster.js'; import { postshift, putshift } from '../../Features/ShiftMaster/ShiftMaster.js';
import './ShiftMaster.scss'; import './ShiftMaster.scss';
import { FaPlus } from 'react-icons/fa6'; import { FaPlus } from 'react-icons/fa6';
import "../../Styles/OverAllStyle/OverAllStyle.scss";
const subDirectory = import.meta.env.BASE_URL; const subDirectory = import.meta.env.BASE_URL;
const ShiftForm = ({ formType }) => { const ShiftForm = ({ formType }) => {

View File

@ -254,8 +254,128 @@
.stockAdjustListMaster { .custom-table {
.primary_Button { width: 100%;
width: 290px !important; border-collapse: collapse;
border: 1px solid #909090;
font-family: 'Poppins', sans-serif;
> thead {
position: sticky;
top: -1px;
} }
} }
.custom-table th {
background-color: #a4c5f4;
color: #1e1e1e;
padding: 6px;
text-align: left;
border: 1px solid #909090;
-webkit-text-stroke-width: 0.2px;
font-size: 12px;
font-weight: 500;
font-family: VAR(--HEADING_FONT_FAMILY);
// text-transform: uppercase;
text-transform: capitalize;
letter-spacing: 0.2px;
}
.centerDivList {
display: flex;
flex-direction: column;
gap: 4px;
// width: 100%;
// height: 43vh;
overflow: scroll;
padding-bottom: 2rem;
}
.custom-table td {
padding: 4px 6px;
border: 1px solid #909090;
text-align: left;
font-size: 12px !important;
}
.custom-table tbody tr td {
text-align: left;
.ant-select.ant-select-in-form-item {
width: 190px !important;
}
}
.custom-table tbody tr td[colspan='7'] {
padding: 20px;
}
.custom-table tbody tr.additionalCharges-selected {
background-color: #dddddd;
}
.custom-table tbody tr.setAsDefault-selected {
background-color: #cceaf0;
}
.custom-table {
.ant-form-item {
margin-bottom: 0 !important;
}
.float-label {
margin-bottom: 8px !important;
}
}
.ChargesAddAndCancel {
display: flex;
justify-content: flex-end;
gap: 1rem;
> div {
border-radius: 6px;
padding: 5px 10px;
color: #fff;
font-weight: 600 !important;
cursor: pointer;
}
> div:nth-child(1) {
background-color: #28aa3a;
}
> div:nth-child(2) {
background-color: #ff0000;
}
}
.custom-table {
Button:disabled,
Button[disabled] {
width: unset !important;
height: unset !important;
border-radius: 50px !important;
}
}
.openingStock-ignoreProductBTN {
width: max-content;
white-space: nowrap;
height: max-content;
padding: 10px 16px;
color: #fff;
border-radius: 8px;
cursor: pointer;
border: none;
background-color: #e42006;
font-size: 14px;
font-weight: 400;
font-family: "Poppins";
margin-left: 6px;
}

View File

@ -203,7 +203,7 @@ const StockadjustmentList = () => {
<div> <div>
<FormHeader title={'Stock Adjustment'} /> <FormHeader title={'Stock Adjustment'} />
</div> </div>
<div className="searchAddDiv">
<div className="formSearch"> <div className="formSearch">
<Search <Search
placeholder="Search" placeholder="Search"
@ -211,7 +211,7 @@ const StockadjustmentList = () => {
onSearchChange={onSearchChange} onSearchChange={onSearchChange}
/> />
</div> </div>
</div>
<Buttons <Buttons
buttonText={'Stock Adjustment'} buttonText={'Stock Adjustment'}
handleSubmit={() => handelAddButton()} handleSubmit={() => handelAddButton()}

File diff suppressed because it is too large Load Diff

View File

@ -241,7 +241,6 @@ const StockList = () => {
if (Response?.data?.statusCode === 1) { if (Response?.data?.statusCode === 1) {
return Response?.data?.data; return Response?.data?.data;
} else { } else {
return []; return [];
} }
}; };
@ -295,7 +294,6 @@ const StockList = () => {
setpage(1); setpage(1);
return Response?.data?.data; return Response?.data?.data;
} else { } else {
return []; return [];
} }
} }
@ -892,25 +890,25 @@ const StockList = () => {
PaymentAmount: PaymentAmount.toFixed(2), PaymentAmount: PaymentAmount.toFixed(2),
InvoiceDate: groupInfo.InwardDate InvoiceDate: groupInfo.InwardDate
? moment(groupInfo.InwardDate, 'YYYY-MM-DD').format( ? moment(groupInfo.InwardDate, 'YYYY-MM-DD').format(
'YYYY-MM-DDTHH:mm:ss' 'YYYY-MM-DDTHH:mm:ss'
) )
: null, : null,
SuppInvoiceNo: groupInfo.SupplierInvoiceNumber, SuppInvoiceNo: groupInfo.SupplierInvoiceNumber,
SuppInvoiceDate: groupInfo.SupplierInvoiceDate SuppInvoiceDate: groupInfo.SupplierInvoiceDate
? moment(groupInfo.SupplierInvoiceDate, 'YYYY-MM-DD').format( ? moment(groupInfo.SupplierInvoiceDate, 'YYYY-MM-DD').format(
'YYYY-MM-DDTHH:mm:ss' 'YYYY-MM-DDTHH:mm:ss'
) )
: null, : null,
DeliveryChallanNo: groupInfo.DeliveryChallanNo, DeliveryChallanNo: groupInfo.DeliveryChallanNo,
DeliveryInvoiceDate: groupInfo.DeliveryInvoiceDate DeliveryInvoiceDate: groupInfo.DeliveryInvoiceDate
? moment(groupInfo.DeliveryInvoiceDate, 'YYYY-MM-DD').format( ? moment(groupInfo.DeliveryInvoiceDate, 'YYYY-MM-DD').format(
'YYYY-MM-DDTHH:mm:ss' 'YYYY-MM-DDTHH:mm:ss'
) )
: null, : null,
DueDate: groupInfo.DueDate DueDate: groupInfo.DueDate
? moment(groupInfo.DueDate, 'YYYY-MM-DD').format( ? moment(groupInfo.DueDate, 'YYYY-MM-DD').format(
'YYYY-MM-DDTHH:mm:ss' 'YYYY-MM-DDTHH:mm:ss'
) )
: null, : null,
InvoiceAmount: Totalamount.toFixed(2), InvoiceAmount: Totalamount.toFixed(2),
TaxAmount: Totaltax.toFixed(2), TaxAmount: Totaltax.toFixed(2),
@ -928,13 +926,13 @@ const StockList = () => {
FreeQty: item.FreeQty, FreeQty: item.FreeQty,
ManufDate: item.ManufactureDate ManufDate: item.ManufactureDate
? moment(item.ManufactureDate, 'YYYY-MM-DD').format( ? moment(item.ManufactureDate, 'YYYY-MM-DD').format(
'YYYY-MM-DDTHH:mm:ss' 'YYYY-MM-DDTHH:mm:ss'
) )
: null, : null,
ExpDate: item.ExpireDate ExpDate: item.ExpireDate
? moment(item.ExpireDate, 'YYYY-MM-DD').format( ? moment(item.ExpireDate, 'YYYY-MM-DD').format(
'YYYY-MM-DDTHH:mm:ss' 'YYYY-MM-DDTHH:mm:ss'
) )
: null, : null,
BatchNo: item.BatchNo, BatchNo: item.BatchNo,
ModelNo: item.ModelNo, ModelNo: item.ModelNo,
@ -991,7 +989,6 @@ const StockList = () => {
(e) => `${e.ProdName} (${e.Size} ${e.UomName})` (e) => `${e.ProdName} (${e.Size} ${e.UomName})`
); );
const SupplierNames = SupplierData?.map((e) => e.SuppName); const SupplierNames = SupplierData?.map((e) => e.SuppName);
const TaxDatas = TaxData.map((e) => e.TaxIdName); const TaxDatas = TaxData.map((e) => e.TaxIdName);
@ -1006,9 +1003,6 @@ const StockList = () => {
const InwardDtlIds = Varientdata?.map((e) => e.InwardDtlId); const InwardDtlIds = Varientdata?.map((e) => e.InwardDtlId);
const StockProductId = Varientdata?.map((e) => e.ProdId); const StockProductId = Varientdata?.map((e) => e.ProdId);
const onFinish = async () => { const onFinish = async () => {
const template = barcodeTemplateDetails?.find( const template = barcodeTemplateDetails?.find(
(find) => find.SessionName === dropdownValue (find) => find.SessionName === dropdownValue
@ -1164,7 +1158,7 @@ const StockList = () => {
? countData?.length ? countData?.length
: 0 : 0
: data?.[0]?.TotalCount; : data?.[0]?.TotalCount;
console.log(debouncedSearchText, countData, data, "kkkk", countOfProduct) console.log(debouncedSearchText, countData, data, 'kkkk', countOfProduct);
return ( return (
<div className="userPageTable"> <div className="userPageTable">
<div className="userPageContent"> <div className="userPageContent">
@ -1178,9 +1172,10 @@ const StockList = () => {
<FormHeader title={'Product Receipt'} /> <FormHeader title={'Product Receipt'} />
</div> </div>
<div <div
className="searchAddDiv" className="StocklistsearchAddDiv"
style={{ justifyContent: 'flex-start' }} style={{ justifyContent: 'flex-start', flexWrap: 'wrap' }}
><Tooltip title="Search using Invoice No,Supp Name"> >
<Tooltip title="Search using Invoice No,Supp Name">
<div className="formSearch" style={{ Width: '200px' }}> <div className="formSearch" style={{ Width: '200px' }}>
<Search <Search
placeholder="Search by Invoice No" placeholder="Search by Invoice No"
@ -1229,7 +1224,7 @@ const StockList = () => {
data={filteredData} data={filteredData}
dataSource={filteredData} dataSource={filteredData}
onChange={handleChange} onChange={handleChange}
// pagination={handlePageChange} // pagination={handlePageChange}
/>{' '} />{' '}
{countOfProduct > 10 && ( {countOfProduct > 10 && (
<Pagination <Pagination
@ -1393,7 +1388,9 @@ const StockList = () => {
generateQRCodeCopy={(code) => generateQRCodeCopy={(code) =>
generateQRCodeCopy(QrandbarcodeDatas, code) generateQRCodeCopy(QrandbarcodeDatas, code)
} }
generateCodeImage={(code, codeType = 'Q') => generateCodeImage(code, codeType, QrandbarcodeDatas)} generateCodeImage={(code, codeType = 'Q') =>
generateCodeImage(code, codeType, QrandbarcodeDatas)
}
imageTagBarcodeAndQR={imageTagBarcodeAndQR} imageTagBarcodeAndQR={imageTagBarcodeAndQR}
dropdownValue={dropdownValue} dropdownValue={dropdownValue}
barcodeTemplateDetails={barcodeTemplateDetails} barcodeTemplateDetails={barcodeTemplateDetails}

View File

@ -106,7 +106,7 @@ const KitechenFinishform = ({ formType }) => {
useEffect(() => { useEffect(() => {
Proddatas(); Proddatas();
dispatch(changeBreadCrumb({ items: items })); dispatch(changeBreadCrumb({ items: items }));
getPreference() getPreference();
}, []); }, []);
const Empchanges = async (e) => { const Empchanges = async (e) => {
@ -982,12 +982,16 @@ const KitechenFinishform = ({ formType }) => {
const getPreference = async () => { const getPreference = async () => {
const data = { AppId: AppId, CompId: CompId, BranchId: BranchId }; const data = { AppId: AppId, CompId: CompId, BranchId: BranchId };
const { data: res } = await dispatch(getPreferenceData(data)).unwrap() const { data: res } = await dispatch(getPreferenceData(data)).unwrap();
const decimalSetting = res?.data?.[0]?.SettingDtlDetails?.find((setting) => setting?.SettingIdName?.toLowerCase() === "decimal" && setting?.SettingValue === 'Y'); const decimalSetting = res?.data?.[0]?.SettingDtlDetails?.find(
(setting) =>
setting?.SettingIdName?.toLowerCase() === 'decimal' &&
setting?.SettingValue === 'Y'
);
if (decimalSetting) { if (decimalSetting) {
setAllowDecimal(true) setAllowDecimal(true);
} }
} };
function safeRound(amountStr) { function safeRound(amountStr) {
if (amountStr == null) return allowDecimal ? '0.00' : '0'; if (amountStr == null) return allowDecimal ? '0.00' : '0';

View File

@ -274,4 +274,27 @@
margin-bottom: 10px; margin-bottom: 10px;
color: #1292ee; color: #1292ee;
text-decoration: underline; text-decoration: underline;
} }
.purchase-entry-fh {
@media (max-width: 600px) {
padding-top: 0;
}
.formName {
display: flex;
}
// .formHeader {
// width: -webkit-fill-available;
// }
.header-buttons {
display: flex;
align-items: center;
justify-content: flex-end;
flex-direction: row;
width: 100%;
gap: 10px;
}
}

View File

@ -1,4 +1,4 @@
import React, { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { Routes, Route, useNavigate } from 'react-router-dom'; import { Routes, Route, useNavigate } from 'react-router-dom';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { import {
@ -29,20 +29,14 @@ const ProtectedRoutes = ({ routesConfig }) => {
const UserId = getSession('UserId'); const UserId = getSession('UserId');
const sessionId = getSession('SessionId'); const sessionId = getSession('SessionId');
const [accessCheckComplete, setAccessCheckComplete] = useState(false); const [accessCheckComplete, setAccessCheckComplete] = useState(false);
const[AppPreference,setAppPreference]= useState([]);
const kioskPath = `${subDirectory}kiosksales`; // or your actual path
useEffect(()=>{ useEffect(() => {
getApplicationPreference() getApplicationPreference();
},[]) }, []);
const getApplicationPreference = async()=>{ const getApplicationPreference = async () => {
await dispatch(getCommonAppPreference(AppId)).unwrap();
const response = await dispatch(getCommonAppPreference(AppId)).unwrap(); };
if (response?.data?.statusCode === 1) {
setAppPreference(response?.data?.data)
}
}
const getEmpAccess = async () => { const getEmpAccess = async () => {
let data = { let data = {
@ -90,7 +84,7 @@ const ProtectedRoutes = ({ routesConfig }) => {
?.SettingDtlDetails?.some( ?.SettingDtlDetails?.some(
(e) => e.SettingIdName === 'Estimation' && e.SettingValue === 'Y' (e) => e.SettingIdName === 'Estimation' && e.SettingValue === 'Y'
); );
return SettingValueData, EstimateValueData; return (SettingValueData, EstimateValueData);
} }
} }
}; };
@ -123,10 +117,10 @@ const ProtectedRoutes = ({ routesConfig }) => {
const hasAdvance = pricingData?.some( const hasAdvance = pricingData?.some(
(item) => item.PricingName === 'Premium' (item) => item.PricingName === 'Premium'
); );
console.log(pricingData,"pricingDatapricingData")
const hasProOrAdvance = const hasProOrAdvance =
hasAdvance || pricingData.some((item) => item.PricingName === 'Customized'); hasAdvance ||
return hasAdvance, hasProOrAdvance; pricingData.some((item) => item.PricingName === 'Customized');
return (hasAdvance, hasProOrAdvance);
} catch (error) { } catch (error) {
console.error('Error fetching pricing name:', error); console.error('Error fetching pricing name:', error);
} }
@ -320,20 +314,20 @@ const ProtectedRoutes = ({ routesConfig }) => {
]; ];
// Cmd it start // Cmd it start
// if (!UserId && empAccessData != 'Public') { // if (!UserId && empAccessData != 'Public') {
// if (!UserId && (empAccessData === "Kiosk Sales" || empAccessData === "View Bill")) { // if (!UserId && (empAccessData === "Kiosk Sales" || empAccessData === "View Bill")) {
// // Allow KioskBookingPage to load and set session values // // Allow KioskBookingPage to load and set session values
// setAccessCheckComplete(true); // setAccessCheckComplete(true);
// return; // return;
// }else{ // }else{
// console.log("UserId is undefined, logging out..."); // console.log("UserId is undefined, logging out...");
// // alert("User invalid. Redirecting to login...") // // alert("User invalid. Redirecting to login...")
// sessionStorage.clear(); // sessionStorage.clear();
// window.location.replace(`${commonUrl}`); // window.location.replace(`${commonUrl}`);
// setHasRedirected(true); // setHasRedirected(true);
// return; // return;
// } // }
// } // }
// Cmd it End // Cmd it End
const userAccessChecks = { const userAccessChecks = {

View File

@ -168,6 +168,7 @@
flex-direction: row; flex-direction: row;
row-gap: 0.5rem; row-gap: 0.5rem;
gap: 2rem; gap: 2rem;
padding-bottom: 4px;
// flex-wrap: wrap; // flex-wrap: wrap;
@media (max-width: 768px) { @media (max-width: 768px) {
flex-wrap: wrap; flex-wrap: wrap;
@ -458,3 +459,8 @@
background-color: #2c88ee1c !important; background-color: #2c88ee1c !important;
font-weight: unset; font-weight: unset;
} }
.ant-table-thead tr {
background-color: #2c88ee !important;
}

View File

@ -46,7 +46,7 @@
padding: 5px; padding: 5px;
gap: 5px; gap: 5px;
align-items: center; align-items: center;
font-family: 'Poppins', sans-serif; font-family: "Poppins", sans-serif;
float: right; float: right;
background-color: #000; background-color: #000;
font-size: x-small; font-size: x-small;
@ -178,6 +178,9 @@
height: 70vh; height: 70vh;
overflow: scroll; overflow: scroll;
scrollbar-width: thin; scrollbar-width: thin;
.ant-table-thead tr {
background-color: #2c88ee !important;
}
.ant-table-cell { .ant-table-cell {
padding: 8px 8px !important; padding: 8px 8px !important;
@ -190,8 +193,8 @@
padding: 0.5rem; padding: 0.5rem;
background-color: #fafafa; background-color: #fafafa;
} }
.ant-table-content{ .ant-table-content {
font-family: 'Poppins'; font-family: "Poppins";
} }
} }
@ -208,7 +211,7 @@
} }
.bsreprintmodaltable-search input { .bsreprintmodaltable-search input {
font-family: 'Poppins'; font-family: "Poppins";
width: 250px; width: 250px;
padding: 4px 14px; padding: 4px 14px;
border: 1px solid #ccc; border: 1px solid #ccc;

View File

@ -1,9 +1,8 @@
.receipt-reprint { .receipt-reprint {
font-family: "Poppins";
font-family: 'Poppins';
.ant-table { .ant-table {
font-family: 'Poppins', sans-serif !important; font-family: "Poppins", sans-serif !important;
font-weight: 400 !important; font-weight: 400 !important;
} }
@ -12,24 +11,27 @@
align-items: center; align-items: center;
// justify-content: space-between; // justify-content: space-between;
gap: 10px; gap: 10px;
margin-bottom: 16px; margin-bottom: 16px;
} }
.receipt-reprint-body { .receipt-reprint-body {
height: 70vh; height: 70vh;
.ant-table-thead tr {
background-color: #2c88ee !important;
}
table { table {
tbody { tbody {
>tr { > tr {
box-shadow: unset !important; box-shadow: unset !important;
border-bottom: unset !important; border-bottom: unset !important;
} }
>tr:nth-child(even) { > tr:nth-child(even) {
background-color: #4b4b4b49 !important; background-color: #4b4b4b49 !important;
} }
>tr:nth-child(odd) { > tr:nth-child(odd) {
background-color: #ffffff00 !important; background-color: #ffffff00 !important;
} }
} }
@ -38,29 +40,23 @@
.search-input { .search-input {
width: 280px !important; width: 280px !important;
padding: 4px 12px; padding: 5px 12px;
border: 1px solid rgb(204, 204, 204) !important; border: 1px solid rgb(204, 204, 204) !important;
border-radius: 6px; border-radius: 6px;
font-size: 14px; font-size: 14px;
outline: none; outline: none;
transition: 0.2s; transition: 0.2s;
font-family: 'Poppins'; font-family: "Poppins";
&:focus { &:focus {
border: 1px solid #1677ff !important; border: 1px solid #1677ff !important;
} }
} }
.reprint-reason-header { .reprint-reason-header {
font-size: 3rem !important; font-size: 3rem !important;
} }
@media (max-width: 567px) { @media (max-width: 567px) {
.search-input { .search-input {
width: unset !important; width: unset !important;
@ -73,20 +69,18 @@
scrollbar-width: thin; scrollbar-width: thin;
} }
} }
} }
.reprint-reason-modal { .reprint-reason-modal {
font-family: 'Poppins' !important; font-family: "Poppins" !important;
.ant-table-cell { .ant-table-cell {
font-weight: 400 !important; font-weight: 400 !important;
font-family: 'Poppins' !important; font-family: "Poppins" !important;
font-size: 14px !important; font-size: 14px !important;
>div { > div {
font-family: 'Poppins' !important; font-family: "Poppins" !important;
} }
} }
@ -96,10 +90,9 @@
} }
.original-duplicate-switch { .original-duplicate-switch {
.ant-switch-inner-checked, .ant-switch-inner-checked,
.ant-switch-inner-unchecked { .ant-switch-inner-unchecked {
font-family: 'Poppins'; font-family: "Poppins";
font-weight: 500; font-weight: 500;
} }
@ -118,7 +111,6 @@
.ant-select-arrow { .ant-select-arrow {
top: 75%; top: 75%;
} }
} }
.action-icons-reprint { .action-icons-reprint {
@ -151,12 +143,10 @@
} }
.icon-email { .icon-email {
background-color: #f59e0b; background-color: #f59e0b;
} }
.icon-whatsapp { .icon-whatsapp {
background-color: #076e26ff; background-color: #076e26ff;
} }
} }

View File

@ -12,8 +12,7 @@ input::-webkit-inner-spin-button {
} }
.Dinein-Form-Structure { .Dinein-Form-Structure {
width: 80vw; width: 80vw;
background-color: #fff; background-color: #fff;
padding: 0rem 2rem;
border-radius: 15px; border-radius: 15px;
} }
.Dinein-Form { .Dinein-Form {
@ -21,7 +20,8 @@ input::-webkit-inner-spin-button {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
padding-top: 2rem; padding-top: 2rem;
gap: 1rem; gap: 0;
column-gap: 1rem;
border-radius: 10px; border-radius: 10px;
flex-wrap: wrap; flex-wrap: wrap;
} }

View File

@ -3,7 +3,7 @@
} }
.required:after { .required:after {
content: ' *'; content: " *";
color: #ff4d4f; color: #ff4d4f;
} }
@ -18,7 +18,7 @@
border: none; border: none;
} }
.subinputForm .ant-input-affix-wrapper>input.ant-input { .subinputForm .ant-input-affix-wrapper > input.ant-input {
font-size: inherit; font-size: inherit;
border: none; border: none;
padding: 18px 14px 6px 1px !important; padding: 18px 14px 6px 1px !important;
@ -96,7 +96,6 @@
} }
} }
.image-preview__content { .image-preview__content {
background-color: #f5f5f5; background-color: #f5f5f5;
margin: 1rem; margin: 1rem;
@ -144,12 +143,24 @@
&:active { &:active {
background-color: #5e5e5e; background-color: #5e5e5e;
} }
} }
.padding-less-modal { .padding-less-modal {
.ant-modal-content { .ant-modal-content {
padding: 34px !important; padding: 34px !important;
} }
} }
.StocklistsearchAddDiv {
display: flex;
align-items: center;
gap: 1rem;
flex-wrap: wrap;
margin-bottom: 10px;
}
.stockAdjustListMaster {
.primary_Button {
width: max-content !important;
}
}

View File

@ -10,7 +10,7 @@
.productListBrowseImageButton2 { .productListBrowseImageButton2 {
width: 65px; width: 65px;
background-color: #dbd1d1; background-color: #dbd1d1;
border: 0.5px solid gray; border: 0.5px solid #808080;
border-radius: 3px; border-radius: 3px;
font-size: 10px; font-size: 10px;
font-weight: 600; font-weight: 600;
@ -74,7 +74,7 @@
.samplereportTableButton { .samplereportTableButton {
justify-content: flex-end; justify-content: flex-end;
margin: 1rem 0; margin: 10px 0;
align-items: center; align-items: center;
display: flex; display: flex;
width: 100%; width: 100%;
@ -754,6 +754,7 @@
.StorekitchenlistTable { .StorekitchenlistTable {
scrollbar-width: thin; scrollbar-width: thin;
padding-right: 8px; padding-right: 8px;
margin-top: 10px;
@media (max-width: 600px) { @media (max-width: 600px) {
} }
@ -1538,6 +1539,9 @@ table {
padding: 3px 14px 4px 11px !important; padding: 3px 14px 4px 11px !important;
text-align: center; text-align: center;
} }
.ant-table-thead tr {
background-color: #2c88ee !important;
}
} }
.PriChangeUpper { .PriChangeUpper {
display: flex; display: flex;
@ -1561,3 +1565,44 @@ table {
} }
} }
} }
.pruchaseCatBTN {
display: flex;
align-items: center;
gap: 7px;
padding: 8px 16px;
background-color: #0bad77;
border-radius: 7px;
color: white;
cursor: pointer;
font-family: "Poppins";
font-weight: 400;
white-space: nowrap;
font-size: 13.5px;
transition: all 0.2s;
&:hover {
background-color: #069666;
}
}
.scan-receipt-btn {
display: flex;
align-items: center;
gap: 7px;
padding: 8px 16px;
background-color: #1292ee;
border-radius: 7px;
color: white;
cursor: pointer;
font-family: "Poppins";
font-weight: 400;
white-space: nowrap;
font-size: 13.5px;
transition: all 0.2s;
&:hover {
background-color: #0985be;
}
}
.CustomerForm-Master {
width: 100%;
}

View File

@ -28,6 +28,7 @@
.productinputForm { .productinputForm {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 6px;
& .field-DropDown { & .field-DropDown {
width: 200px !important; width: 200px !important;
@ -124,6 +125,24 @@
left: 2px; left: 2px;
} }
} }
.ProSubRowFlex {
display: flex;
flex-wrap: wrap;
flex-direction: row;
gap: 1.5rem;
width: 100%;
.ant-form-item,
.float-label {
margin-bottom: 0;
}
.ant-form-item-explain-error {
position: relative;
top: 16px;
left: 2px;
}
}
.scannerdiv { .scannerdiv {
display: flex; display: flex;
@ -469,10 +488,12 @@
flex-wrap: wrap; flex-wrap: wrap;
justify-content: flex-start; justify-content: flex-start;
padding-bottom: 0; padding-bottom: 0;
flex-direction: row !important;
@media (max-width: 768px) { @media (max-width: 768px) {
gap: 10px; gap: 10px;
align-items: flex-start; align-items: flex-start;
justify-content: space-between;
} }
} }
@ -488,7 +509,8 @@
} }
.productFormproductImg { .productFormproductImg {
width: 350px; width: 250px;
height: 190px;
align-items: center; align-items: center;
} }
@ -510,3 +532,13 @@
bottom: 8px; bottom: 8px;
} }
} }
.ProductMainRowFlex {
display: flex;
align-items: flex-start;
gap: 1rem;
width: 100%;
@media (max-width: 768px) {
flex-direction: column;
}
}

View File

@ -4,7 +4,7 @@
flex-wrap: wrap; flex-wrap: wrap;
gap: 1rem; gap: 1rem;
.ant-input-affix-wrapper>input.ant-input { .ant-input-affix-wrapper > input.ant-input {
padding-top: 1.7rem; padding-top: 1.7rem;
} }
} }
@ -18,6 +18,9 @@
overflow: auto !important; overflow: auto !important;
scrollbar-width: thin; scrollbar-width: thin;
} }
.ant-table-thead tr {
background-color: #2c88ee !important;
}
} }
.purchaseQuoaDetails { .purchaseQuoaDetails {
@ -86,8 +89,8 @@
// right: 100px; // right: 100px;
} }
.ant-table-wrapper .ant-table-tbody>tr.ant-table-row:hover>td, .ant-table-wrapper .ant-table-tbody > tr.ant-table-row:hover > td,
.ant-table-wrapper .ant-table-tbody>tr>th.ant-table-cell-row-hover>td.ant-table-cell-row-hover { .ant-table-wrapper .ant-table-tbody > tr > th.ant-table-cell-row-hover > td.ant-table-cell-row-hover {
background: rgb(224, 223, 223) !important; background: rgb(224, 223, 223) !important;
font-size: unset !important; font-size: unset !important;
transition-duration: 0.4s !important; transition-duration: 0.4s !important;
@ -102,7 +105,6 @@
} }
.Quotation-table { .Quotation-table {
// width: 70px; // width: 70px;
.ant-table table { .ant-table table {
border-spacing: 0px; border-spacing: 0px;
@ -122,7 +124,7 @@
border-radius: 8px; border-radius: 8px;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
font-family: 'Poppins', sans-serif; font-family: "Poppins", sans-serif;
padding: 6px 12px; padding: 6px 12px;
border: 1px solid #d1d1d1; border: 1px solid #d1d1d1;
} }
@ -146,4 +148,4 @@
input { input {
padding: 6px 25px 6px 12px !important; padding: 6px 25px 6px 12px !important;
} }
} }

View File

@ -146,7 +146,7 @@
background-color: var(--PRIMARY_BUTTON_BG_COLOR) !important; background-color: var(--PRIMARY_BUTTON_BG_COLOR) !important;
margin-bottom: 2px; margin-bottom: 2px;
font-size: 16px; font-size: 16px;
font-family: 'Gilroy'; font-family: "Gilroy";
color: #ffffff; color: #ffffff;
border-radius: 5px; border-radius: 5px;
cursor: pointer; cursor: pointer;
@ -436,51 +436,6 @@
} }
} }
// @media screen and (max-width: 620px) {
// .ItemWiseReport-table{
// height: 41vh !important;
// }
// .ItemWiseReport-dateaAnd-buttons{
// display: flex;
// flex-direction: column;
// column-gap: 0.5rem;
// row-gap: 0.5rem;
// // align-items: center;
// flex-wrap: wrap;
// }
// .ItemWiseReport-Date-picker {
// display: flex;
// // flex-wrap: wrap;
// column-gap: 0.3rem;
// row-gap: 0rem;
// }
// .dropdownUserid{
// .ant-select-single:not(.ant-select-customize-input) .ant-select-selector
// {
// width: 10rem;
// }
// }
// .ItemWiseReport-netAmount {
// display: flex;
// justify-content: flex-start;
// }
// }
// @media only screen and (min-width: 450px) and (max-width: 640px){
// .ItemWiseReport-table{
// width: 500px;
// }
// .ItemWiseReport-dateaAnd-buttons{
// display: flex;
// column-gap: 1rem;
// row-gap: 1rem;
// align-items: center;
// flex-wrap: wrap;
// justify-content: space-between;
// }
// }
.ItemWiseReport-table .ant-table-thead th.ant-table-column-has-sorters:hover { .ItemWiseReport-table .ant-table-thead th.ant-table-column-has-sorters:hover {
background-color: #bad4f9; background-color: #bad4f9;
} }
@ -585,29 +540,107 @@
font-weight: 600; font-weight: 600;
} }
// .ItemWiseReport-table { .custom-table {
// overflow-y: auto; width: 100%;
// scrollbar-width: unset; border-collapse: collapse;
// scrollbar-color: #c1c1c1 transparent; border: 1px solid #909090;
// } font-family: "Poppins", sans-serif;
// .ItemWiseReport-table::-webkit-scrollbar { > thead {
// width: 25px; position: sticky;
// } top: -1px;
}
}
// .ItemWiseReport-table::-webkit-scrollbar-track { .custom-table th {
// background: #f0f0f0; background-color: #a4c5f4;
// border-radius: 10px; color: #1e1e1e;
// } padding: 6px;
text-align: left;
border: 1px solid #909090;
-webkit-text-stroke-width: 0.2px;
font-size: 12px;
font-weight: 500;
font-family: VAR(--HEADING_FONT_FAMILY);
// text-transform: uppercase;
text-transform: capitalize;
letter-spacing: 0.2px;
}
// .ItemWiseReport-table::-webkit-scrollbar-thumb { .centerDivList {
// background-color: #c1c1c1; display: flex;
// border-radius: 10px; flex-direction: column;
// border: 6px solid transparent; gap: 4px;
// background-clip: content-box; // width: 100%;
// transition: background-color 0.3s ease; // height: 43vh;
// } overflow: scroll;
padding-bottom: 2rem;
}
// .ItemWiseReport-table::-webkit-scrollbar-thumb:hover { .custom-table td {
// background-color: #a0a0a0; padding: 4px 6px;
// } border: 1px solid #909090;
text-align: left;
font-size: 12px !important;
}
.custom-table tbody tr td {
text-align: left;
.ant-select.ant-select-in-form-item {
width: 190px !important;
}
}
.custom-table tbody tr td[colspan="7"] {
padding: 20px;
}
.custom-table tbody tr.additionalCharges-selected {
background-color: #dddddd;
}
.custom-table tbody tr.setAsDefault-selected {
background-color: #cceaf0;
}
.custom-table {
.ant-form-item {
margin-bottom: 0 !important;
}
.float-label {
margin-bottom: 8px !important;
}
}
.ChargesAddAndCancel {
display: flex;
justify-content: flex-end;
gap: 1rem;
> div {
border-radius: 6px;
padding: 5px 10px;
color: #fff;
font-weight: 600 !important;
cursor: pointer;
}
> div:nth-child(1) {
background-color: #28aa3a;
}
> div:nth-child(2) {
background-color: #ff0000;
}
}
.custom-table {
Button:disabled,
Button[disabled] {
width: unset !important;
height: unset !important;
border-radius: 50px !important;
}
}

View File

@ -87,7 +87,7 @@
width: 180px !important; width: 180px !important;
} }
> div:nth-child(2) { >div:nth-child(2) {
p { p {
display: none !important; display: none !important;
} }
@ -145,7 +145,7 @@
max-width: 130px !important; max-width: 130px !important;
} }
> td:nth-child(3) { >td:nth-child(3) {
.ant-input { .ant-input {
width: max-content !important; width: max-content !important;
max-width: 70px !important; max-width: 70px !important;
@ -153,7 +153,7 @@
} }
} }
> td:nth-child(5) { >td:nth-child(5) {
.ant-input { .ant-input {
width: max-content !important; width: max-content !important;
max-width: 100px !important; max-width: 100px !important;
@ -324,12 +324,12 @@
} }
.purchase-status { .purchase-status {
> div:nth-child(1) { >div:nth-child(1) {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
> p { >p {
padding-bottom: 0 !important; padding-bottom: 0 !important;
} }
} }
@ -447,7 +447,7 @@
.invoice-date { .invoice-date {
.ant-form-item-control-input-content { .ant-form-item-control-input-content {
> label { >label {
font-family: 'Poppins'; font-family: 'Poppins';
font-weight: 500; font-weight: 500;
} }
@ -473,7 +473,7 @@
gap: 1rem; gap: 1rem;
margin-bottom: 10px; margin-bottom: 10px;
> button { >button {
font-family: 'Poppins'; font-family: 'Poppins';
background-color: #ef4444; background-color: #ef4444;
color: #fff; color: #fff;
@ -481,8 +481,8 @@
align-items: center; align-items: center;
.ant-btn-icon { .ant-btn-icon {
> span { >span {
> svg { >svg {
width: 13px; width: 13px;
height: 13px; height: 13px;
} }
@ -833,9 +833,36 @@
} }
@media (max-width: 500px) { @media (max-width: 500px) {
.tdProductrecipt, .tdProductrecipt,
.proReceiptTD { .proReceiptTD {
font-size: 12px !important; font-size: 12px !important;
} }
.div-flex{
padding-bottom: 18px !important;
}
} }
.div-flex {
display: flex;
align-items: center;
gap: 10px;
background-color: rgb(218, 218, 218);
border-radius: 4px;
padding: 4px 4px 8px 4px;
.ant-form-item {
margin-bottom: 0 !important;
}
}
@media (max-width: 400px) {
.div-flex {
flex-direction: column;
align-items: flex-start;
padding-bottom: 8px !important;
}
}

View File

@ -101,11 +101,6 @@ a {
background: #999999; background: #999999;
} }
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
/* background: #8F1E78; */
}
.samplereportTable { .samplereportTable {
overflow: auto; overflow: auto;
width: 80vw; width: 80vw;
@ -178,8 +173,6 @@ a {
/* Position the tooltip */ /* Position the tooltip */
position: absolute; position: absolute;
z-index: 1; z-index: 1;
} }
.navbar-top { .navbar-top {
@ -331,3 +324,7 @@ a {
.ant-table table { .ant-table table {
border-spacing: 0 0 !important; border-spacing: 0 0 !important;
} }
.ant-table-tbody .ant-table-cell {
font-family: 'Poppins' !important;
}

View File

@ -1,4 +1,3 @@
import React from 'react';
import ReactDOM from 'react-dom/client'; import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom'; import { BrowserRouter } from 'react-router-dom';
@ -7,24 +6,21 @@ import './Fonts/Gilroy/stylesheet.css';
import './index.css'; import './index.css';
import AppRoutes from './App.jsx'; import AppRoutes from './App.jsx';
import { AuthProvider } from './AuthContext'; import { AuthProvider } from './AuthContext';
import GlobalErrorHandler from './GlobalErrorHandler'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import {QueryClient, QueryClientProvider,} from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import {ReactQueryDevtools } from '@tanstack/react-query-devtools';
const queryClient = new QueryClient(); const queryClient = new QueryClient();
ReactDOM.createRoot(document.getElementById('root')).render( ReactDOM.createRoot(document.getElementById('root')).render(
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
<Provider store={store}> <Provider store={store}>
<BrowserRouter>
<BrowserRouter > <AuthProvider>
<AuthProvider> <AppRoutes />
<AppRoutes /> </AuthProvider>
</BrowserRouter>
</AuthProvider> </Provider>
</BrowserRouter> {process.env.NODE_ENV == 'development' && (
</Provider> <ReactQueryDevtools initialIsOpen={false} />
{process.env.NODE_ENV == "development" && ( )}
<ReactQueryDevtools initialIsOpen={false} />
)}
</QueryClientProvider> </QueryClientProvider>
); );

View File

@ -1,209 +1,673 @@
import React from 'react'; import React from 'react';
import AppPage from './Pages/AppPage/AppPage.jsx'; import { lazy } from 'react';
import WholesaleAppPage from './Pages/AppPage/WholesaleAppPage.jsx'; const CommonMaster = lazy(
import Home from './Pages/DashBoard/RetailDashboard.jsx'; () => import('./Pages/CommonMaster/CommonMaster.jsx')
import CommonMaster from './Pages/CommonMaster/CommonMaster.jsx'; );
import ConfigType from './Pages/ConfigType/ConfigTypeForm.jsx'; const ConfigType = lazy(() => import('./Pages/ConfigType/ConfigTypeForm.jsx'));
import AdminTax from './Pages/AdminTax/AdminTaxForm.jsx'; const AdminTax = lazy(() => import('./Pages/AdminTax/AdminTaxForm.jsx'));
import ProductForm from './Pages/Product/ProductForm.jsx'; const ProductForm = lazy(() => import('./Pages/Product/ProductForm.jsx'));
import Sport_ProductForm from './Pages/Product/SportsMaster.jsx'; const Sport_ProductForm = lazy(
import ProductList from './Pages/Product/ProductList.jsx'; () => import('./Pages/Product/SportsMaster.jsx')
import ShiftMasterList from './Pages/ShiftMaster/ShiftMasterList.jsx'; );
import ShiftMasterForm from './Pages/ShiftMaster/ShiftMasterForm.jsx'; const ShiftMasterList = lazy(
import EmployeeMasterList from './Pages/EmpMaster/EmpMasterList.jsx'; () => import('./Pages/ShiftMaster/ShiftMasterList.jsx')
import EmployeeMasterForm from './Pages/EmpMaster/EmpMasterForm.jsx'; );
import SupplierMasterList from './Pages/SupplierMaster/SupplierMasterList.jsx'; const ShiftMasterForm = lazy(
import SupplierMasterForm from './Pages/SupplierMaster/SupplierMasterForm.jsx'; () => import('./Pages/ShiftMaster/ShiftMasterForm.jsx')
import ComponentMasterForm from './Pages/UiComponentPage/ComponentForm.jsx'; );
import ComponentMasterList from './Pages/UiComponentPage/ComponentList.jsx'; const EmployeeMasterList = lazy(
import CustomerForm from './Pages/CustomerMaster/CustMasterForm.jsx'; () => import('./Pages/EmpMaster/EmpMasterList.jsx')
import CustomerMasterList from './Pages/CustomerMaster/CustMasterList.jsx'; );
import DateWiseReport from './Pages/Reports/DateWiseReport/DateWiseReport.jsx'; const EmployeeMasterForm = lazy(
import ItemWiseReport from './Pages/Reports/ItemWiseReport/ItemWiseReport.jsx'; () => import('./Pages/EmpMaster/EmpMasterForm.jsx')
import Reprint from './Pages/BookingScreen/Components/OtherConponents/Reprint/BSReprint.jsx'; );
import BookingSelectionPage from './Pages/BookingScreen/Components/MainPage/MainPage.jsx';
import PrintSelectionPage from './Pages/BookingScreen/Components/PrintMainPage/MainPage.jsx';
import KioskMainPage from './Pages/BookingScreen/Components/Kiosk/KioskMainPage.jsx';
import BookingPage from './Pages/BookingScreen/BookingPage.jsx';
import StockForm from './Pages/StockMaster/StockForm.jsx';
import StockList from './Pages/StockMaster/StockList.jsx';
import DiningMasterList from './Pages/Dining/DiningList.jsx';
import DiningMasterForm from './Pages/Dining/DiningForm.jsx';
import TableBooking from './Pages/Tablebooking/TableBooking.jsx';
import ComboMaster from './Pages/ComboPack/ComboMaster.jsx';
import ComboList from './Pages/ComboPack/ComboMasterlist.jsx';
import EmpAccessForm from './Pages/EmpAccess/EmpAccessForm.jsx';
import EmpAccessList from './Pages/EmpAccess/EmpAccessList.jsx';
import EmpScreenAccessList from './Pages/EmpScreenAccess/EmpScreenAccessList.jsx';
import EmpScreenRightsAccess from './Pages/EmpScreenAccess/EmpScreenRightsAccess.jsx';
import PreferenceList from './Pages/Preference/PreferenceList.jsx';
import PaymentOptions from './Pages/Payment/PaymentOptions/PaymentOptions.jsx';
import PaymentDetails from './Pages/Payment/PaymentDetails/PaymentDetailsForm.jsx';
import PaymentDetailsList from './Pages/Payment/PaymentDetails/PaymentDetailsList.jsx';
import PaymentReceivedRetail from './Pages/Payment/PaymentReceivedRetail/PaymentReceivedRetail.jsx';
import ExtraChargesList from './Pages/ExtraCharges/ExtraChargesList.jsx';
import BranchLogin from './Pages/BranchLogin/BranchLogin.jsx';
import BackToBranchLogin from './Pages/BranchLogin/BackToBranchLogin.jsx';
import Logout from './Pages/Logout.jsx';
import BacktoLogin from './Pages/BranchLogin/BacktoLogin.jsx';
import StockPriceUpdate from './Pages/StockPriceUpdate/StockPriceUpdate.jsx';
import ProductCatalogueList from './Pages/ProductCatlogue/ProductcatlogueList.jsx';
import KOT from './Pages/Reports/KOT/kot.jsx';
import CustomerKOTDisplay from './Pages/Reports/KOT/CustomerKOTDisplay.jsx';
import RedirectApps from './Pages/RedirectApps.jsx';
import WSTransaction from './Pages/WholeSaleTransaction/WSSalesTransaction.jsx';
import LedgerReport from './Pages/Reports/LedgerReport/LedgerReport.jsx';
import PaymentDetailsPage from './Pages/BookingScreen/Components/BookingFunctionality/PaymentDetailsPage.jsx';
import CreditCustomerPrint from './Pages/BookingScreen/Components/BookingFunctionality/CreditDownloadpage.jsx';
import Cancellation from './Pages/CancelReschedule/Cancellation.jsx';
import ChangePaymentmode from './Pages/CancelReschedule/ChangePaymentmode.jsx';
import CancellationList from './Pages/CancelReschedule/CancellationList.jsx';
import CancelApplicableProd from './Pages/CancelReschedule/CancelApplicableProd.jsx';
import CancellationListPending from './Pages/CancelReschedule/CancelPendingPayment.jsx';
import AndroidApp from './Pages/AndroidApp/AndroidApp.jsx';
import EstimateItemWiseReport from './Pages/Reports/Estimate/EstimateItemWiseReport.jsx';
import EstimateDateWiseReport from './Pages/Reports/Estimate/EstimateDateWiseReport.jsx';
import OfferForm from './Pages/Offer/Offer/OfferFormNew.jsx';
import OfferList from './Pages/Offer/Offer/OfferListNew.jsx';
import ItemWise from './Pages/Offer/ItemOffer/ItemWiseForm.jsx';
import SalesWiseForm from './Pages/Offer/SalesOffer/SalesWiseForm.jsx';
import SalesWiseList from './Pages/Offer/SalesOffer/SalesWiseList.jsx';
import QuantityWise from './Pages/Offer/QuantityOffer/QuantityWiseForm.jsx';
import BuyOneGetOneForm from './Pages/Offer/BuyOneGetOneOffer/BuyOneGetOneForm.jsx';
// import LoyaltyPointsForm from "./Pages/Offer/LoyaltyPoints/LoyaltyPointsForm.jsx";
import LoyaltyPointsList from './Pages/Offer/LoyaltyPoints/LoyaltyPointsList.jsx';
import BundleOfferForm from './Pages/Offer/BundleOffer/BundleOfferForm.jsx';
import BundleOfferList from './Pages/Offer/BundleOffer/BundleOfferList.jsx';
// import CouponWiseOffer from "./Pages/Offer/CouponOffer/CouponWiseOfferForm.jsx"
import CouponWiseOfferlist from './Pages/Offer/CouponOffer/CouponWiseOfferlist.jsx';
import PromocodeList from './Pages/Offer/PromoCode/PromocodeList.jsx';
// import PromocodeForm from "./Pages/Offer/PromoCode/PromocodeForm.jsx";
import OfferCodeList from './Pages/Offer/OfferCode/OfferCodeList.jsx';
// import OfferCodeForm from "./Pages/Offer/OfferCode/OfferCodeForm.jsx";
import PricingPage from './Pages/BookingScreen/Components/UtillComponents/PricingPage.jsx';
import PurchaseOrder from './Pages/PurchaseOrder/PurchaseOrder.jsx';
import PurchaseOrderMail from './Pages/PurchaseOrder/PurchaseOrderMail.jsx';
import PurchaseOrderList from './Pages/PurchaseOrder/PurchaseOrderList.jsx';
import StockReceivedList from './Pages/StockTransfer/StockReceivedList.jsx';
import GstInvoiceSetUpForm from './Pages/GstInvoiceSetup/GstInvoiceSetUpForm.jsx';
import gstInvoiceSetUpList from './Pages/GstInvoiceSetup/GstInvoiceSetupList.jsx';
import StockinHand from './Pages/StockinHand/StockinHand.jsx';
import PurchaseReturn from './Pages/PurchaseReturn/purchaseReturn.jsx'; const SupplierMasterList = lazy(
import PurchaseReturnget from './Pages/PurchaseReturn/PurchaseReturnGet.jsx'; () => import('./Pages/SupplierMaster/SupplierMasterList.jsx')
import KioskBookingPage from './Pages/Kiosk/KioskBookingPage.jsx'; );
import KioskBookingReceipt from './Pages/Kiosk/PaymentGateway/PaymentGatewayReceipt.jsx'; const SupplierMasterForm = lazy(
import KioskComponentList from './Pages/KioskComponent/KioskComponentList.jsx'; () => import('./Pages/SupplierMaster/SupplierMasterForm.jsx')
import CustomerDisplay from './Pages/CustomerDisplay/CustomerDisplay.jsx'; );
import PurchaseQuotationForm from './Pages/PurchaseQuotation/PurchaseQuotationForm.jsx';
import DeliveryChallanForm from './Pages/DeliveryChallan/Deliverychallan.jsx'; const ComponentMasterForm = lazy(
import DeliveryChallanList from './Pages/DeliveryChallan/DeliverychallanList.jsx'; () => import('./Pages/UiComponentPage/ComponentForm.jsx')
import ComboOfferMaster from './Pages/Offer/ComboOfferPack/ComboOfferForm.jsx'; );
import PaymentDeviceForm from './Pages/Payment/PaymentDevice/PaymentDeviceForm.jsx'; const ComponentMasterList = lazy(
import PaymentFailedDetailsList from './Pages/Payment/PaymentFailedDetails/PaymentFailedDetailsList.jsx'; () => import('./Pages/UiComponentPage/ComponentList.jsx')
import CounterCategoryMappingForm from './Pages/CounterCategoryMapping/CounterCategoryMappingForm.jsx'; );
import ImageBulkUpload from './Pages/ImageBulkUpload/ImageBulkUpload.jsx';
import WholesaleBookingPage from './Pages/PurchaseScreen/LayoutScreen8/LayoutScreen8.jsx'; const CustomerForm = lazy(
import WholeSaleProductList from './Pages/Wholesale/ProductList.jsx'; () => import('./Pages/CustomerMaster/CustMasterForm.jsx')
import ProductEntry from './Pages/Wholesale/ProductEntry.jsx'; );
import ProductEntryList from './Pages/Wholesale/ProductEntryList.jsx'; const CustomerMasterList = lazy(
import ItemEntry from './Pages/Wholesale/ItemEntry/ItemEntry.jsx'; () => import('./Pages/CustomerMaster/CustMasterList.jsx')
import WsPreorder from './Pages/Wholesalespreorder/WholesalePreorderList.jsx'; );
import WsPreorderForm from './Pages/Wholesalespreorder/WholesalePreorderForm.jsx';
import ExtraChrgesList from './Pages/Wholesale/ItemEntry/ExtraChrgesList.jsx'; const DateWiseReport = lazy(
import SalesBillCancel from './Pages/SalesRemoval/SalesBillCancelList.jsx'; () => import('./Pages/Reports/DateWiseReport/DateWiseReport.jsx')
import WholeSaleAbstract from './Pages/WholeSaleAbstract/WholeSaleAbstract.jsx'; );
import WholeSaleSellerAbstract from './Pages/WholeSaleAbstract/WholeSaleSellerAbstract.jsx';
import PaymentReceived from './Pages/WholeSaleTransaction/PaymentReceived.jsx'; const ItemWiseReport = lazy(
import WholeSaleSalesReport from './Pages/WholeSaleReport/WholeSalesSalesReport.jsx'; () => import('./Pages/Reports/ItemWiseReport/ItemWiseReport.jsx')
import WholeSalePurchaseReport from './Pages/WholeSaleReport/WholeSalePurchaseReport.jsx'; );
import WholeSalePaymentPurchaseReport from './Pages/WholesalePaymentReport/WholeSalePaymentPurchaseReport.jsx';
import WholeSalePaymentSalesReport from './Pages/WholesalePaymentReport/WholeSalePaymementSaleReport.jsx'; const Reprint = lazy(
import SpeechLanguagesList from './Pages/SpeechLanguages/SpeechLanguagesList.jsx'; () =>
import LegderList from './Pages/WholeSaleLedger/WholeSaleLedger.jsx'; import('./Pages/BookingScreen/Components/OtherConponents/Reprint/BSReprint.jsx')
import SellerMasterTran from './Pages/WholeSaleTransaction/SellerMasterTransaction.jsx'; );
import TicketForm from './Pages/Ticket/TicketForm.jsx';
import ThemeCreation from './Pages/BookingScreen/Components/ThemeCreation/ThemeList.jsx'; const BookingSelectionPage = lazy(
import ThemeSelection from './Pages/BookingScreen/Components/ThemeCreation/ThemePreview.jsx'; () => import('./Pages/BookingScreen/Components/MainPage/MainPage.jsx')
import BarcodeTemplateSetup from './Pages/BarcodeSetup/BarcodeTemplateSetup.jsx'; );
import BarcodeComponentList from './Pages/BarcodeComponent/BarcodeComponentList.jsx';
import StoreRecipelist from './Pages/StoreKitchen/StoreRecipe/StoreRecipelist.jsx'; const PrintSelectionPage = lazy(
import StoreRecipeform from './Pages/StoreKitchen/StoreRecipe/StoreRecipeform.jsx'; () => import('./Pages/BookingScreen/Components/PrintMainPage/MainPage.jsx')
import Storekitchenlist from './Pages/StoreKitchen/StoretoKitchen/StoretoKitchenlist.jsx'; );
import StoreKitchenform from './Pages/StoreKitchen/StoretoKitchen/Storetokitchenform.jsx'; const KioskMainPage = lazy(
import { axiosCommonInstanceData } from './Features/AuthenicationToken/AuthenticationToken'; () => 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 { getSession, sessionStore } from './Services/Others';
import axios from 'axios'; import axios from 'axios';
import KitchenFinishlist from './Pages/StoreKitchen/StoreKitchenFinish/KitchenFinishlist.jsx'; const KitchenFinishlist = lazy(
import KitechenFinishform from './Pages/StoreKitchen/StoreKitchenFinish/KitechenFinishform.jsx'; () => import('./Pages/StoreKitchen/StoreKitchenFinish/KitchenFinishlist.jsx')
);
const KitechenFinishform = lazy(
() => import('./Pages/StoreKitchen/StoreKitchenFinish/KitechenFinishform.jsx')
);
import FreeProductList from './Pages/FreeProducts/FreeProduct/FreeProductList.jsx'; const FreeProductList = lazy(
import FreePurchaseEnteryForm from './Pages/FreeProducts/FreePurchase/FreePurchaseEntery/FreePurchaseEnteryForm.jsx'; () => import('./Pages/FreeProducts/FreeProduct/FreeProductList.jsx')
import FreePurchaseEnteryList from './Pages/FreeProducts/FreePurchase/FreePurchaseEntery/FreePurchaseEnteryList.jsx'; );
import FreePurchaseOrderList from './Pages/FreeProducts/FreePurchase/FreePurchaseOrder/FreePurchaseOrderList.jsx';
import FreePurchaseOrderForm from './Pages/FreeProducts/FreePurchase/FreePurchaseOrder/FreePurchaseOrderForm.jsx'; const FreePurchaseEnteryForm = lazy(
import FreePurchaseReturnList from './Pages/FreeProducts/FreePurchase/FreePurchaseReturn/FreePurchaseReturnList.jsx'; () =>
import FreePurchaseReturnForm from './Pages/FreeProducts/FreePurchase/FreePurchaseReturn/FreePurchaseReturnForm.jsx'; import('./Pages/FreeProducts/FreePurchase/FreePurchaseEntery/FreePurchaseEnteryForm.jsx')
import CommonForm from './Pages/Offer/LoyaltyPoints/CommonForm.jsx'; );
import ReprintReasonReportList from './Pages/Reports/ReprintReasonReport/ReprintReasonReportList.jsx'; const FreePurchaseEnteryList = lazy(
import RevenueItemWiseReport from './Pages/Reports/Revenue/RevenueItemWiseReport.jsx'; () =>
import LinkUrlCreate from './Pages/paymentpdfPage/LinkUrlCreate.jsx'; import('./Pages/FreeProducts/FreePurchase/FreePurchaseEntery/FreePurchaseEnteryList.jsx')
import SupplierProductMapping from './Pages/SupplierProductMapping/SupplierProductMapping.jsx'; );
import RedirectUserProfile from './Pages/RedirectUserProfile.jsx';
import RelieveRequestForm from './Pages/EmpMaster/EmpRelieve.jsx'; const FreePurchaseOrderList = lazy(
import PurchaseQuotationList from './Pages/PurchaseQuotation/PurchaseQuotationList.jsx'; () =>
import ExchangeAndReplacementList from './Pages/ExchangeAndReplacement/ExchangeAndReplacementList.jsx'; import('./Pages/FreeProducts/FreePurchase/FreePurchaseOrder/FreePurchaseOrderList.jsx')
import ExchangeAndReplacementForm from './Pages/ExchangeAndReplacement/ExchangeAndReplacementForm.jsx'; );
import ExchangeReturnMapForm from './Pages/ExchangeReturnMap/ExchangeReturnMapForm.jsx'; const FreePurchaseOrderForm = lazy(
import ExchangeReturnMapList from './Pages/ExchangeReturnMap/ExchangeReturnMapList.jsx'; () =>
import OtherServicesForm from './Pages/OtherServices/OtherServicesForm.jsx'; import('./Pages/FreeProducts/FreePurchase/FreePurchaseOrder/FreePurchaseOrderForm.jsx')
import OtherServicesList from './Pages/OtherServices/OtherServicesList.jsx'; );
import EmpCommisionOrIncentiveForm from './Pages/EmpCommissionOrIncentive/EmpCommisionOrIncentiveForm.jsx';
import EmpCommisionOrIncentiveList from './Pages/EmpCommissionOrIncentive/EmpCommisionOrIncentiveList.jsx'; const FreePurchaseReturnList = lazy(
import SalesBillProductsReturnList from './Pages/CancelReschedule/SalesBillProductReturnList.jsx'; () =>
import SalesBillProductsReturn from './Pages/CancelReschedule/SalesBillProductsReturn.jsx'; import('./Pages/FreeProducts/FreePurchase/FreePurchaseReturn/FreePurchaseReturnList.jsx')
import DeliveryChallanToInvoiceForm from './Pages/DeliveryChallanToInvoice/DeliveryChallanToInvoiceForm.jsx'; );
import DeliveryChallanToInvoiceList from './Pages/DeliveryChallanToInvoice/DeliveryChallanToInvoiceList.jsx'; const FreePurchaseReturnForm = lazy(
import TipAmountSettlementList from './Pages/Reports/TipAmountSettlement/TipAmountSettlementList.jsx'; () =>
import EmployeeSettlement from './Pages/Reports/EmployeeSettlement/EmployeeSettlement.jsx'; import('./Pages/FreeProducts/FreePurchase/FreePurchaseReturn/FreePurchaseReturnForm.jsx')
import PublicQrCode from './Pages/Reports/PublicQrCode.jsx'; );
import TableMapping from './Pages/TableMapping/TableMapping.jsx'; const CommonForm = lazy(
import TableMAppingList from './Pages/TableMapping/TableMAppingList.jsx'; () => import('./Pages/Offer/LoyaltyPoints/CommonForm.jsx')
import PurchaseOrderReport from './Pages/Reports/PurchaseReport/PurchaseOrderReport.jsx'; );
import SalesOrder from './Pages/SalesOrder/SalesOrder.jsx';
import LoyaltyBased from './Pages/Offer/LoyaltyBased/LoyaltyBased.jsx'; const ReprintReasonReportList = lazy(
import LoyaltyBasedList from './Pages/Offer/LoyaltyBased/LoyaltyBasedList.jsx'; () =>
import CodeBase from './Pages/Offer/CodeBase/CodeBase.jsx'; import('./Pages/Reports/ReprintReasonReport/ReprintReasonReportList.jsx')
import CodeBaseList from './Pages/Offer/CodeBase/CodeBaseList.jsx'; );
import TurboAddForm from './Pages/Product/TurboAddForm.jsx';
import ProductMaster from './Pages/Product/ProductMaster.jsx'; const RevenueItemWiseReport = lazy(
import GatewayMasterConfiguration from './Pages/GatewayMasterConfiguration/GatewayMasterConfiguration.jsx'; () => import('./Pages/Reports/Revenue/RevenueItemWiseReport.jsx')
import GatewayMasterConfigurationList from './Pages/GatewayMasterConfiguration/GatewayMasterConfigurationList.jsx'; );
import MembershipForm from './Pages/Membership/MembershipForm.jsx';
import MembershipList from './Pages/Membership/MembershipList.jsx'; const LinkUrlCreate = lazy(
import SlotManagementForm from './Pages/SlotManagement/SlotManagement.jsx'; () => import('./Pages/paymentpdfPage/LinkUrlCreate.jsx')
import SlotManagementList from './Pages/SlotManagement/SlotManagementList.jsx'; );
import BookingReScedule from './Pages/CancelReschedule/BookingReScedule.jsx';
import BookingReSceduleList from './Pages/CancelReschedule/BookingReSceduleList.jsx'; const SupplierProductMapping = lazy(
import MembershipReport from './Pages/Reports/Membership/MembershipReport.jsx'; () => import('./Pages/SupplierProductMapping/SupplierProductMapping.jsx')
import OpeningStock from './Pages/openingStock/openingstockForm.jsx'; );
import OpeningStockList from './Pages/openingStock/OpeningStockList.jsx';
import StockAdjustment from './Pages/StockAdjustment/StockAdjustment.jsx'; const RedirectUserProfile = lazy(
import StockAdjustmentList from './Pages/StockAdjustment/StockAdjustmentList.jsx'; () => import('./Pages/RedirectUserProfile.jsx')
import TopSellingProducts from './Pages/DashBoard/TopSellingProductsChart.jsx'; );
import AutomatedReorder from './Pages/Automated Reorder/AutomatedReorder.jsx';
import AutomatedReorderList from './Pages/Automated Reorder/AutomatedReorderList.jsx'; const RelieveRequestForm = lazy(
import CustomerPurchaseConfirm from './Pages/PurchaseOrder/CustomerPurchaseConfirm/CustomerPurchaseConfirm.jsx'; () => import('./Pages/EmpMaster/EmpRelieve.jsx')
import MenuQRCode from './Pages/Reports/MenuQRCode/MenuQRCode.jsx'; );
import CustomerMenuPage from './Pages/Reports/MenuQRCode/CustomerMenuPage.jsx';
import PurchaseLink from './Pages/PurchaseOrder/CustomerPurchaseConfirm/PurchaseLink.jsx'; const PurchaseQuotationList = lazy(
import RackForm from './Pages/Rack/RackForm.jsx'; () => import('./Pages/PurchaseQuotation/PurchaseQuotationList.jsx')
import RackList from './Pages/Rack/RackList.jsx'; );
import CreateTransfer from './Pages/StockTransfer/CreateTransfer.jsx';
import Dispatch from './Pages/StockTransfer/Dispatch.jsx'; const ExchangeAndReplacementList = lazy(
import ComboLayout3 from './Pages/BookingScreen/Template/ComboLayout3/ComboLayout3.jsx'; () => import('./Pages/ExchangeAndReplacement/ExchangeAndReplacementList.jsx')
import StockTransferList from './Pages/StockTransfer/TransferList.jsx'; );
import Productcatlogue from './Pages/ProductCatlogue/Productcatalogue.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 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 subDirectory = import.meta.env.BASE_URL;
const apiCommonUrl = import.meta.env.ENV_API_URL_COMMON; const apiCommonUrl = import.meta.env.ENV_API_URL_COMMON;
@ -268,7 +732,7 @@ const fetchComponent = async () => {
sessionStore('userName', 'Karthiga'); sessionStore('userName', 'Karthiga');
sessionStorage.setItem( sessionStorage.setItem(
'auth', 'auth',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiOTM2MDY0MjI0NCIsIlBhc3N3b3JkIjoiWkB6MTIzNCIsImF1ZCI6WyJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTIiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTQiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiXSwiZXhwIjoxNzcwMjMzMDA3LCJpc3MiOiJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMDEifQ.y6ZLDB3qz1nJk68XY13jXxHKd99LVX2GhzhtE5eGXqI' 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiOTM2MDY0MjI0NCIsIlBhc3N3b3JkIjoiWkB6MTIzNCIsImF1ZCI6WyJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTIiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTQiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiXSwiZXhwIjoxNzcwNzQ5MjkxLCJpc3MiOiJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMDEifQ.aXnhbA3ReRVyt8denDX_LK_ecVBiG5KdeHsurVR7iwQ'
); );
const AppId = getSession('AppId'); const AppId = getSession('AppId');
@ -373,7 +837,7 @@ const fetchHomeComponent = async () => {
sessionStore('userName', 'Karthiga'); sessionStore('userName', 'Karthiga');
sessionStorage.setItem( sessionStorage.setItem(
'auth', 'auth',
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiOTM2MDY0MjI0NCIsIlBhc3N3b3JkIjoiWkB6MTIzNCIsImF1ZCI6WyJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTIiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTQiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiXSwiZXhwIjoxNzcwMjMzMDA3LCJpc3MiOiJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMDEifQ.y6ZLDB3qz1nJk68XY13jXxHKd99LVX2GhzhtE5eGXqI' 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiOTM2MDY0MjI0NCIsIlBhc3N3b3JkIjoiWkB6MTIzNCIsImF1ZCI6WyJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTIiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTQiLCJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMTMiXSwiZXhwIjoxNzcwNzQ5MjkxLCJpc3MiOiJodHRwOi8vMTkyLjE2OC4xLjM3OjgwMDEifQ.aXnhbA3ReRVyt8denDX_LK_ecVBiG5KdeHsurVR7iwQ'
); );
const AppId = getSession('AppId'); const AppId = getSession('AppId');
@ -1087,8 +1551,6 @@ export const routesConfig = [
empAccess: 'Product Receipt', empAccess: 'Product Receipt',
}, },
{ {
path: 'receive-stocks', path: 'receive-stocks',
component: StockReceivedList, component: StockReceivedList,
@ -1228,7 +1690,6 @@ export const routesConfig = [
empAccess: 'DC to Invoice', empAccess: 'DC to Invoice',
}, },
{ path: 'shift-master', component: ShiftMasterList, empAccess: 'Shift' }, { path: 'shift-master', component: ShiftMasterList, empAccess: 'Shift' },
{ {
path: 'shift-master/new', path: 'shift-master/new',

72
src/useSessionManager.js Normal file
View File

@ -0,0 +1,72 @@
import { useEffect, useState } from 'react';
import { useDispatch } from 'react-redux';
import {
checkSession,
GenerateLogout,
} from './Features/BrachLogin/BranchLogin.js';
import {
clearSession,
getSession,
TokendecryptedValuesFun,
} from './Services/Others.js';
const commonSubDir = import.meta.env.ENV_COMMON_BASE_URL;
const useSessionManager = (dependencyTrigger) => {
const dispatch = useDispatch();
const [sessionData, setSessionData] = useState(null);
// 🔹 Load session
useEffect(() => {
const CompId = getSession('CompId');
const AppId = getSession('AppId');
const BranchId = getSession('BranchId');
const UserType = getSession('UserType');
if (CompId && AppId && BranchId) {
setSessionData({ CompId, AppId, BranchId, UserType });
}
}, []);
// 🔹 Session validity check (same logic, centralized)
useEffect(() => {
const sessionCheckFun = async () => {
const UserId = getSession('UserId');
const sessionId = getSession('SessionId');
const IsLogout = getSession('Mode');
let encryptedLoginType = TokendecryptedValuesFun(
sessionStorage.getItem('LoginType')
);
if (encryptedLoginType !== 'Kiosk') {
const res = await dispatch(
checkSession({ UserId, sessionId })
).unwrap();
if (res?.data?.statusCode === 1 && res?.data?.response === 'False') {
if (IsLogout !== 'Logout') {
alert('Session invalid. Redirecting to login...');
}
clearSession();
window.location.replace(commonSubDir);
}
}
};
sessionCheckFun();
}, [dependencyTrigger]);
// 🔹 Logout (shared everywhere)
const logout = async () => {
const UserId = getSession('UserId');
try {
await dispatch(GenerateLogout({ UserId, status: 'N' })).unwrap();
} finally {
sessionStorage.clear();
window.location.replace(commonSubDir);
}
};
return { sessionData, logout };
};
export default useSessionManager;

View File

@ -0,0 +1,155 @@
import { useEffect, useRef, useState } from 'react';
import { useDispatch } from 'react-redux';
import {
ChangeAppExpDateData,
changeHeightforExpDate,
getAppSubscriptionDate,
} from './Features/BookingScreen/BookingData/BookingData.js';
import { sendSms } from './Features/Payment/PaymentDetails/PaymentDetails.js';
import { getPurchasedAppDetails, postInvoice } from './Features/BookingScreen/Pricing/Pricing.js';
import { getSession } from './Services/Others.js';
import { useNavigate } from 'react-router-dom';
const useSubscriptionManager = (sessionData, logout) => {
const dispatch = useDispatch();
const navigate = useNavigate();
const prevRemainingDays = useRef(null);
const [remainingDays, setRemainingDays] = useState(null);
const [extendModel, setExtendModel] = useState(false);
const handleCancel = () => {
logout();
setExtendModel(false)
}
const handlePay = () => {
setExtendModel(false)
let AppName = getSession("AppName")
navigate(`${subDirectory}PricingPage`, { state: { AppName: AppName } });
}
function formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
}
function addDays(dateString, days) {
// Make it ISO-safe for iOS / WebView
const isoDate = dateString.replace(' ', 'T');
const currentDate = new Date(isoDate);
currentDate.setDate(currentDate.getDate() + Number(days));
return formatDate(currentDate);
}
// ---------------- MAIN FUNCTION ----------------
const freeExtend = async () => {
try {
const UserId = getSession('UserId');
const AppId = getSession('UserId')
// Current date
const now = new Date();
const currentDate = formatDate(now);
// 1⃣ Get purchased app details
const response1 = await dispatch(
getPurchasedAppDetails({ AppId, UserId })
).unwrap();
const PurchasedDetails = response1?.data?.data;
if (!PurchasedDetails || !PurchasedDetails.length) {
console.error('No purchased details found');
return;
}
// 2⃣ Prepare post data
const postData = {
UserId: UserId,
AppId: AppId,
PricingId: PurchasedDetails[0]?.PricingId,
PurDate: currentDate,
NoofDays: 30,
PaymentMode: 27,
PaymentStatus: 'S',
LicenseStatus: PurchasedDetails[0]?.LicenseStatus,
Price: PurchasedDetails[0]?.Price ?? 0,
TaxId: PurchasedDetails[0]?.TaxId ?? 0,
NetPrice: PurchasedDetails[0]?.ExistingPlanNetPrice ?? 0,
ValidityStart: currentDate,
ValidityEnd: addDays(
currentDate,
PurchasedDetails[0]?.NoOfDays
),
CreatedBy: UserId,
TaxAmount: PurchasedDetails[0]?.TaxAmount ?? 0,
MobileNo: getSession('MobileNo'),
MailId: 'ts@gmmail.com',
Type: "FreeExtend"
};
// 3⃣ Post invoice
const response = await dispatch(postInvoice(postData)).unwrap();
// 4⃣ Send SMS if required
if (response?.data?.statusCode === 1 && response?.data?.SMSbody) {
await dispatch(
sendSms({ body: response.data.SMSbody })
);
setExtendModel(false)
}
} catch (error) {
console.error('freeExtend error:', error);
}
};
useEffect(() => {
if (!sessionData) return;
const fetchExpDate = async () => {
const { CompId, AppId, BranchId, UserType } = sessionData;
const res = await dispatch(
getAppSubscriptionDate({ CompId, BranchId, AppId })
).unwrap();
const expData = res?.data?.data?.[0];
if (!expData) return logout();
if (prevRemainingDays.current !== expData.RemainingDays) {
prevRemainingDays.current = expData.RemainingDays;
setRemainingDays(expData.RemainingDays);
dispatch(ChangeAppExpDateData(expData));
dispatch(changeHeightforExpDate(expData.RemainingDays));
if (
expData.RemainingDays < 1 &&
expData.RemainingHours < 1 &&
expData.RemainingMinutes < 1 &&
expData.RemainingSeconds < 1 &&
UserType !== 'Super Admin'
) {
alert('Subscription expired');
logout();
}
}
};
fetchExpDate();
const interval = setInterval(fetchExpDate, 60 * 60 * 1000);
return () => clearInterval(interval);
}, [sessionData]);
return { remainingDays, handleCancel, handlePay, freeExtend, extendModel };
};
export default useSubscriptionManager;