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",
"@tanstack/react-query": "^5.90.11",
"@tanstack/react-query-devtools": "^5.91.1",
"@tanstack/react-virtual": "^3.13.18",
"antd": "^5.17.4",
"antd-img-crop": "^4.22.0",
"aos": "^2.3.4",

View File

@ -1,52 +1,36 @@
// AppRoutes.jsx
import React, { useEffect, useState, useRef, lazy, } from 'react';
import { useEffect, lazy, Suspense } from 'react';
import { Routes, Route } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import { useSelector } from 'react-redux';
import ProtectedRoutes from './ProtectedRoutes';
import SelfBooking from './Pages/SelfBooking/SelfBooking.jsx'
import { isMobile, isIOS } from "react-device-detect";
// const { routesConfig } = lazy(() => import('./routesConfig'));
import SelfBooking from './Pages/SelfBooking/SelfBooking.jsx';
import { isMobile, isIOS } from 'react-device-detect';
import { routesConfig } from './routesConfig';
import {
ChangeAppExpDateData,
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 { GlobalItemCard } from './Features/BookingScreen/BookingData/BookingData.js';
import { clearSession, getSession } from './Services/Others.js';
import devtools from 'devtools-detect';
import KisokSelBooking from './Pages/SelfBooking/KisokSelBooking.jsx';
import IndividualBooking from './Pages/SelfBooking/IndividualBooking.jsx';
const KisokSelBooking = lazy(
() => import('./Pages/SelfBooking/KisokSelBooking')
);
const IndividualBooking = lazy(
() => import('./Pages/SelfBooking/IndividualBooking')
);
const commonSubDir = import.meta.env.ENV_COMMON_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 WeightScaleApp from './Pages/BookingScreen/WeightscaleApp.jsx';
import { getPurchasedAppDetails, postInvoice } from './Features/BookingScreen/Pricing/Pricing.js';
import { sendSms } from './Features/Payment/PaymentDetails/PaymentDetails.js';
import useSubscriptionManager from './useSubscriptionManager.js';
import useSessionManager from './useSessionManager.js';
import ExtendSubscriptionModal from './Pages/ExtentedModal/ExtendSubscriptionModal.jsx';
const AppRoutes = () => {
const navigate = useNavigate();
const dispatch = useDispatch();
const ItemCard = useSelector(GlobalItemCard);
const [remainingDays, setRemainingDays] = useState(null);
const prevRemainingDays = useRef(null);
const [sessionData, setSessionData] = useState(null);
const [devToolsOpen, setDevToolsOpen] = useState(false);
const [extendModel, setExtendModel] = useState(false);
const { sessionData, logout } = useSessionManager(ItemCard);
const { remainingDays, handleCancel, handlePay, freeExtend, extendModel } = useSubscriptionManager(sessionData, logout);
useEffect(() => {
const handlePopState = (e) => {
const handlePopState = () => {
const SessionId = getSession('SessionId');
if (!SessionId) {
alert(
@ -68,296 +52,18 @@ const AppRoutes = () => {
};
}, []);
//cmd it start
// useEffect(() => {
// sessionCheckFun()
// }, [navigate, ItemCard]);
//cmd it End
useEffect(() => {
const loadSessionData = () => {
const CompId = getSession('CompId');
const AppId = getSession('AppId');
const BranchId = getSession('BranchId');
const UserType = getSession('UserType');
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
};
if (!loadSessionData()) {
const interval = setInterval(() => {
if (loadSessionData()) {
clearInterval(interval); // Stop checking once data is available
if (isMobile || isIOS) return;
const timer = setInterval(() => {
if (devtools.isOpen) {
document.body.innerHTML =
"<h1 style='color:red;text-align:center'>Close Inspect to continue</h1>";
}
}, 1000);
return () => clearInterval(interval); // Cleanup interval on unmount
}
return () => clearInterval(timer);
}, []);
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) {
return (
@ -368,9 +74,8 @@ const AppRoutes = () => {
/>
);
}
return (
<>
<Suspense fallback={<div>Loading</div>}>
<Routes>
<Route
path={`${subDirectory}selfBooking/:SelfBookingId`}
@ -384,7 +89,10 @@ const AppRoutes = () => {
path={`${subDirectory}weightscaleapp`}
element={<WeightScaleApp />}
/>
<Route path={`${subDirectory}kioskSelfBooking`} element={<KisokSelBooking />} />
<Route
path={`${subDirectory}kioskSelfBooking`}
element={<KisokSelBooking />}
/>
<Route
path={`${subDirectory}kiosk-individual-self-booking`}
@ -395,7 +103,7 @@ const AppRoutes = () => {
element={<ProtectedRoutes routesConfig={routesConfig} />}
/>
</Routes>
</>
</Suspense>
);
};

View File

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

View File

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

View File

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

View File

@ -5,7 +5,6 @@ import { Menu } from 'antd';
import {
changePreviewComponents,
changeSelectedPrintdummyData,
getTemplate,
} from '../../Features/ThemeChange/ThemeChange';
import {
changeBookingType,
@ -69,9 +68,6 @@ const SideMenu = ({ mode, theme, items }) => {
const [clickedKeys, setClickedKeys] = useState([]);
const dispatch = useDispatch();
const navigate = useNavigate();
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const DineinDefault = useSelector(GlobalDineinDefault);
const handleMouseEnter = (e) => {
@ -187,28 +183,7 @@ const SideMenu = ({ mode, theme, items }) => {
if (e == `${subDirectory}saleslayouts/print-selection`) {
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);
} 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 { 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 { FaCaretDown } from 'react-icons/fa';
import { useDispatch } from 'react-redux';
import { useContext } from 'react';
import { AuthContext } from '../../AuthContext';
import PozoMenu from './PozoMenu';
import { getSession } from '../../Services/Others';
import {
changePreviewComponents,
changeSelectedPrintdummyData,
getTemplate,
changeSelectedPrintdummyData
} from '../../Features/ThemeChange/ThemeChange';
import {
changeBookingType,
@ -67,7 +37,7 @@ import {
import { ChangeTotalAmount } from '../../Features/ExteraCharges/ExtraCharges';
import * as Offer from '../../Features/Offer/Offer';
import { FiMenu } from 'react-icons/fi';
import POZOMIND from '../../Images/PozomindWLogo.png';
import {
ChangeFullFreeProductList,
changeFullOfferAppliedProducts,
@ -165,9 +135,7 @@ const SideMenuPozo = ({ items = [] }) => {
const [collapsed, setCollapsed] = useState(window.innerWidth < 768);
const [dropdownPosition, setDropdownPosition] = useState({});
const menuRef = useRef();
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const DineinDefault = useSelector(GlobalDineinDefault);
const [collapse, setCollapse] = useState(false);
@ -381,57 +349,7 @@ const SideMenuPozo = ({ items = [] }) => {
(item) => !bottomKeys.includes(item.label)
);
// 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
const handlePozoMenuClick = (e) => {

View File

@ -70,13 +70,15 @@ export const postStockAdjustment = createAsyncThunk(
export const getPurchaseSupplierAndWareHouseData = createAsyncThunk(
'PurchaseOrder/getPurchaseSupplierAndWareHouseData',
async (ProdData, { rejectWithValue }) => {
const { AppId, CompId, BranchId } = ProdData;
const { AppId, CompId, BranchId, Type } = ProdData;
if (AppId && CompId && BranchId) {
try {
const response = await axiosRetailInstanceData.get(
`/Supplier/AllSupplierBranchDropdown?appId=${AppId}&compId=${CompId}&branchId=${BranchId}`
);
let url = `/Supplier/AllSupplierBranchDropdown?appId=${AppId}&compId=${CompId}&branchId=${BranchId}`;
if (Type) {
url += `&Type=${Type}`;
}
const response = await axiosRetailInstanceData.get(url);
return response.data;
} catch (error) {
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 { render } from "react-dom";
import { useAuth } from "../../AuthContext";
import "./AutomatedReorder.scss";
const subDirectory = import.meta.env.BASE_URL;

View File

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

View File

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

View File

@ -305,12 +305,17 @@ const BSBillingTable1 = () => {
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);

View File

@ -244,12 +244,17 @@ const BSBillingTable3 = () => {
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);

View File

@ -297,12 +297,17 @@ const BSBillingTable4 = () => {
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);

View File

@ -1943,12 +1943,17 @@ const BsBill = () => {
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);

View File

@ -267,16 +267,20 @@ const BSBillingTable6 = () => {
}
// 👉 CTRL shortcuts
if (!event.ctrlKey) return;
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);

View File

@ -263,11 +263,17 @@ const BSBillingTable7 = () => {
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);

View File

@ -73,9 +73,9 @@ import {
} from '../../../../../Features/Offer/Offernew/BookingOffernew.js';
import { useRemoveProducts } from '../BSBillingTable3/RemoveCartWithOffer.jsx';
import { useUtilsComponent } from '../../../../../Services/utils.js';
import ComboEditQty from '../ComboBillTableEdit/ComboEditQty.jsx';
import ComboEditRate from '../ComboBillTableEdit/ComboEditRate.jsx';
import CustomerPriceHistory from '../../UtillComponents/CustomerPriceHistory.jsx';
import ComboEditQtyAndRate from '../ComboBillTableEdit/ComboEditQtyAndRate.jsx';
const ComboSalesBillTable = () => {
const { removeExtraCharge } = useUtilsComponent();
@ -177,6 +177,10 @@ const ComboSalesBillTable = () => {
const [qtyEdit, setQtyEdit] = useState(false);
const qtyTdRef = 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 = () => {
if (!qtyEdit) {
@ -268,7 +272,7 @@ const ComboSalesBillTable = () => {
const item = getSelectedItem();
if (!item) return;
handleEditQuantity(item);
handleEditQuantityCombo(item);
setshortKeyMethod(method);
};
@ -288,12 +292,17 @@ const ComboSalesBillTable = () => {
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);
@ -2074,6 +2083,95 @@ const ComboSalesBillTable = () => {
...(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);
const displayTableData =
BillOrderPre === 'N' ? [...combinedTableData].reverse() : combinedTableData;
@ -2261,7 +2359,7 @@ const ComboSalesBillTable = () => {
return (
<tr
key={`${row?.InwardDtlId || index}-${row?.BookingTypeName || ''}-${row?.SalesId || ''}-${index}`}
className={row.highlighted ? 'highlighted-row' : ''}
className={`${row.highlighted ? 'highlighted-row' : ''} ${activeRowIndex === index ? 'active-row' : ''}`}
style={{
fontFamily: SelectedFont,
backgroundColor:
@ -2305,7 +2403,15 @@ const ComboSalesBillTable = () => {
: 'none',
}}
>
{tableOptions?.map((item) => (
{tableOptions?.map((item, colIdx) => {
const isActiveCell =
activeRowIndex === index &&
activeColIndex !== null &&
['Item', 'Quantity', 'Rate', 'Total'].indexOf(
item.OptionName
) === activeColIndex;
return (
<>
{/* HSN Code */}
{item.OptionName === 'HSNCode' && (
@ -2323,7 +2429,7 @@ const ComboSalesBillTable = () => {
item.OptionName === 'Product Name') && (
<td
key={`prod-${index}`}
className="productNameTd"
className={`productNameTd ${isActiveCell ? 'active-cell' : ''}`}
onClick={() =>
row.FullProductIdentifierDtls?.length > 0 ||
row.ProductIdentifierDtls?.length > 0
@ -2367,24 +2473,30 @@ const ComboSalesBillTable = () => {
{/* Quantity */}
{item.OptionName === 'Quantity' && (
<td
ref={qtyTdRef}
ref={(el) => {
if (
shortKeyMethod === 'qty' &&
row?.localId === Index
) {
el?.focus();
el?.click();
}
}}
key={`qty-${index}`}
// className="qtyTd"
className={
EditQtyCombo && row?.localId === Index
tabIndex={0}
className={`${EditQtyCombo && row?.localId === Index
? 'EditQTYcomboTD'
: 'qtyTd'
}
} ${isActiveCell ? 'active-cell' : ''}`}
onClick={() =>
editField && handleEditQuantityCombo(row)
}
// onClick={() => handleEditQTYcombo()}
>
{(!EditQtyCombo || row?.localId !== Index) && (
<>{row.OrderQty}</>
)}
{EditQtyCombo && row?.localId === Index && (
<ComboEditQty
<ComboEditQtyAndRate
key={`edit-qty-${Index}`}
handleEditQuantityCancel={
handleEditQuantityComboCancel
@ -2394,7 +2506,6 @@ const ComboSalesBillTable = () => {
Index={Index}
setIndex={setIndex}
setEditQtyCombo={setEditQtyCombo}
// id={`qty-${index}`}
/>
)}
</td>
@ -2404,9 +2515,7 @@ const ComboSalesBillTable = () => {
{item.OptionName === 'Rate' && (
<td
key={`rate-${index}`}
// className="rateTd"
className={EditRateCombo ? 'rateTdEditRate' : 'rateTd'}
// onClick={() => editField && handleEditQuantity(row)}
className={`${EditRateCombo ? 'rateTdEditRate' : 'rateTd'} ${isActiveCell ? 'active-cell' : ''}`}
onClick={() => editField && handleEditRateCombo(row)}
>
{!EditRateCombo || row?.localId !== Index ? (
@ -2417,7 +2526,7 @@ const ComboSalesBillTable = () => {
</>
) : null}
{EditRateCombo && row?.localId === Index && (
<ComboEditRate
<ComboEditQtyAndRate
key={`edit-rate-${Index}`}
handleEditRateComboCancel={
handleEditRateComboCancel
@ -2463,7 +2572,7 @@ const ComboSalesBillTable = () => {
{item.OptionName === 'Total' && (
<td
key={`total-${index}`}
className="totalTd"
className={`totalTd ${isActiveCell ? 'active-cell' : ''}`}
onClick={() => {
// if (editField) {
// handleEditQuantity(row)
@ -2474,7 +2583,9 @@ const ComboSalesBillTable = () => {
}}
>
{allowDecimal
? Number(row.TotalAmt - (row?.Offer || 0)).toFixed(2)
? Number(row.TotalAmt - (row?.Offer || 0)).toFixed(
2
)
: Number(row.TotalAmt - (row?.Offer || 0))}
</td>
)}
@ -2486,12 +2597,18 @@ const ComboSalesBillTable = () => {
</td>
)}
{item.OptionName === '%' && (
<td key={`percentage-${index}`} className="percentageTd">
<td
key={`percentage-${index}`}
className="percentageTd"
>
{row.percentage || '-'}
</td>
)}
{item.OptionName === 'Commission' && (
<td key={`commission-${index}`} className="commissionTd">
<td
key={`commission-${index}`}
className="commissionTd"
>
{row.commission || '-'}
</td>
)}
@ -2521,7 +2638,8 @@ const ComboSalesBillTable = () => {
</td>
)}
</>
))}
);
})}
</tr>
);
})}

View File

@ -40,6 +40,16 @@
background-color: #e5d434;
}
&.active-row {
outline: 2px solid #1292ee;
outline-offset: -2px;
}
td.active-cell {
background-color: #1292ee !important;
color: #ffffff;
}
td {
padding: 4px 8px;
border: 1px solid #9c9c9c;
@ -189,3 +199,14 @@
padding: 1px !important;
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

@ -274,18 +274,28 @@ const StandardTable = () => {
}
// 👉 CTRL shortcuts
if (!event.ctrlKey) return;
// if (key === 'q') {
// event.preventDefault();
// handleShortcut('qty');
// }
// if (key === 'e') {
// event.preventDefault();
// handleShortcut('price');
// }
if (key === 'q') {
event.preventDefault();
handleShortcut('qty');
}
if (key === 'e') {
} 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);
return () => {

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,10 @@
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
import moment from 'moment';
import { Badge, Modal, Tooltip } from 'antd';
import { ExclamationCircleOutlined } from '@ant-design/icons';
import { Badge, Tooltip } from 'antd';
import defaultimage from '../../../../Images/defaultItemImg.png';
import FormHeader from '../../../PageComponents/FormHeader';
import {
GlobalPricingAppPricingName,
SelectedGlobalCardColorDetail,
SelectedGlobalCardFont,
StoredSessionData,
@ -44,15 +42,12 @@ import {
GlobalReorderHoldDetails,
GlobalWeightScalePort,
GlobalWeightScaleWeight,
changeWeightScaleWeight,
GlobalExpDateforHeight,
GlobalBookingTypeBoth,
GlobalOrderType,
GlobalReorderProductDetails,
getConfigType,
GlobalPayementloader,
GlobalPaymentTransactionNumber,
GlobalSelOption,
PreferenceData,
changeCardData,
GlobaldraggingComponent,
@ -127,6 +122,7 @@ import AddProduct from '../../../../Components/AddProduct/AddProduct.jsx';
import { MdOutlineAddShoppingCart } from 'react-icons/md';
import { bulkpostdata } from '../../../../Features/ProductPage/ProductPage.js';
import ProductPriceChange from '../UtillComponents/ProductPriceChange.jsx';
import ExpireConfirmModal from '../BookingFunctionality/ExpireConfirmModal.jsx';
export function SortableCard({ id, children, item }) {
const {
@ -193,18 +189,14 @@ const BSItemCard = (props) => {
const AllCategoryDatas = useSelector(GlobalCategorieData, shallowEqual);
const AllsubcatgoryDatas = useSelector(GlobalSubcategorieData, shallowEqual);
const RetailWSSalesType = useSelector(GlobalRetailWSSalesType, shallowEqual);
// const CustDetails = SelectedCust ? SelectedCust : AddCustomerDetails?.[0];
const BookingTypeBoth = useSelector(GlobalBookingTypeBoth);
const GPreOrderList = useSelector(GlobalPreOrderList, shallowEqual);
const [modelQty, setModelQty] = useState(false);
const [modelstock, setModelstock] = useState(false);
const [ModalVarient, setModalVarient] = useState(false);
const [QtyIndex, setQtyIndex] = useState(0);
const [VarientIndex, setVarientIndex] = useState(0);
const [expModel, setexpModel] = useState(false);
const [prodexpir, setProdexpir] = useState(false);
const [expVarModel, setexpVarModel] = useState(false);
const [expStockModel, setexpStockModel] = useState(false);
const [initialRun, setInitialRun] = useState(false);
const [Item, setItem] = useState();
const [VarItem, setVarItem] = useState(0);
@ -246,7 +238,10 @@ const BSItemCard = (props) => {
SelectedGlobalCardColorDetail,
shallowEqual
);
const GetmultipleSearchDatas = useSelector(GlobalGetmultipleSearchDatas, shallowEqual)
const GetmultipleSearchDatas = useSelector(
GlobalGetmultipleSearchDatas,
shallowEqual
);
const SelectedCardFont = useSelector(SelectedGlobalCardFont, shallowEqual);
const CartOrderDetails = useSelector(GlobalOrderCardDetails, shallowEqual);
const SelectedDatas = useSelector(GlobalSelectedDatas, shallowEqual);
@ -254,7 +249,7 @@ const BSItemCard = (props) => {
const WSProductdata = useSelector(GlobalWSProduct, shallowEqual);
const NewQrProductData = useSelector(GlobalNewQrProduct, shallowEqual);
const ReportholdData = useSelector(GlobalReorderHoldDetails, shallowEqual);
console.log(GetmultipleSearchDatas, "GetmultipleSearchDatas")
console.log(GetmultipleSearchDatas, 'GetmultipleSearchDatas');
const ReorderProductData = useSelector(
GlobalReorderProductDetails,
shallowEqual
@ -285,12 +280,11 @@ const BSItemCard = (props) => {
const [QuickAdd, setQuickAdd] = useState(true);
const [onePeiceFlow, setOnePeiceFlow] = useState(false);
const [BillOrderPre, setBillOrderPre] = useState();
const [expQtyModel, setExpQtyModel] = useState(false);
const [qtyExpData, setQtyExpData] = useState();
const OrderOfferDetail = useSelector(Global_OrderOfferDetail);
const [freeProductsOffers, setfreeProductsOffers] = useState([]);
// const [freeProductsOffers, setfreeProductsOffers] = useState([]);
const [screenWidth, setScreenWidth] = useState(window.innerWidth);
const [screenHeight, setScreenHeight] = useState(window.innerHeight);
// const [screenHeight, setScreenHeight] = useState(window.innerHeight);
const ProdCat = useSelector(GlobalProductCategorie, shallowEqual);
const paymentloader = useSelector(GlobalPayementloader, shallowEqual);
const SessionData = useSelector(StoredSessionData, shallowEqual);
@ -318,6 +312,13 @@ const BSItemCard = (props) => {
const triggerOfferFree = useSelector(GlobalTriggerOfferFree);
const productCardTrigger = useSelector(GlobalProductCardTrigger);
const appPreferences = useSelector(ApplicationPreferences);
const [expireModal, setExpireModal] = useState({
open: false,
title: '',
onOk: null,
onCancel: null,
});
const salespagefields = appPreferences?.find(
(pref) => pref?.PreferredCatName === 'Sales Page Fields'
)?.PreferenceCatDetails;
@ -326,7 +327,7 @@ const BSItemCard = (props) => {
type?.PreferredSubCatName?.toLowerCase() === 'available date' &&
type?.PreferredStatus === 'Y'
);
console.log(AvailableDate, salespagefields, 'Available Date');
const SingleMember = salespagefields?.find(
(type) =>
type?.PreferredSubCatName?.toLowerCase() === 'single member' &&
@ -934,6 +935,19 @@ const BSItemCard = (props) => {
};
}
const openExpireModal = ({ title, onOk, onCancel }) => {
setExpireModal({
open: true,
title,
onOk,
onCancel,
});
};
const closeExpireModal = () => {
setExpireModal((prev) => ({ ...prev, open: false }));
};
// Usage example:
// const result = handleLoyaltyFreeProducts(orderCardDtls, freeProdDtls);
// console.log(result.ModifiedData);
@ -941,13 +955,9 @@ const BSItemCard = (props) => {
// console.log(result.AppliedOffers);
async function getOffers() {
let response = await dispatch(
await dispatch(
getOfferinBooking({ AppId: AppId, CompId: CompId, BranchId: BranchId })
).unwrap();
if (response?.data?.statusCode == 1) {
let expiredProd = response?.data?.data;
}
}
useEffect(() => {
@ -968,7 +978,7 @@ const BSItemCard = (props) => {
if (TableName === 'BuyXGetXOffers') return true;
}
);
setfreeProductsOffers(filteredOffers);
// setfreeProductsOffers(filteredOffers);
getOffers();
}, [OrderOfferDetail]);
@ -982,12 +992,7 @@ const BSItemCard = (props) => {
});
}
}, [SelectedCardFont]);
// const cardData = !globalAccessForOthers
// ? CardAccess
// ? SelectedDatas
// : ItemCard?.length == 0 ? noSubcatCardData : ItemCard
// : "";
//mohan 18-04-2025
const cardData = !globalAccessForOthers
? CardAccess
? SelectedDatas?.length > 1
@ -1029,7 +1034,7 @@ const BSItemCard = (props) => {
useEffect(() => {
if (AppId && CompId && BranchId) {
fetchedit();
GetmultipleSearchData()
GetmultipleSearchData();
}
// dispatch(changepreOrder(false)); Commented to Add Normal Produts After Adding the Combo Pack !!!!!! Dont Touch Without Shifayath Permission
@ -1043,10 +1048,9 @@ const BSItemCard = (props) => {
};
try {
const response = await dispatch(getmultipleSearch(data))
const response = await dispatch(getmultipleSearch(data));
} catch (error) {
console.error("Get Search Terms Error:", error);
console.error('Get Search Terms Error:', error);
}
};
@ -1065,9 +1069,10 @@ const BSItemCard = (props) => {
setNoSubcatCardData();
}
if (ProductSearch?.length > 5 && GetmultipleSearchDatas.some(
e => e.toLowerCase() === "qrcode"
)) {
if (
ProductSearch?.length > 5 &&
GetmultipleSearchDatas.some((e) => e.toLowerCase() === 'qrcode')
) {
setQuickAdd(true);
}
}, [ProductSearch, GetmultipleSearchDatas]);
@ -1180,13 +1185,6 @@ const BSItemCard = (props) => {
if (tempconfigdata?.data?.statusCode == 1) {
setConfigDataList(tempconfigdata?.data?.data);
let configdata = tempconfigdata?.data?.data;
let checkName = BookingTypeBoth ? 'DineIn,TakeAway' : BookingType;
let filterconfigdata = configdata?.find(
(a) => a?.ConfigName === checkName
);
// setSelectedBookingType(filterconfigdata?.ConfigId);
}
};
@ -1220,7 +1218,10 @@ const BSItemCard = (props) => {
useEffect(() => {
if (ItemCard?.[0]?.QrBasedSearch === 'Y') {
if (ItemCard?.[0]?.OverAllExpStatus == 'Y' && ExpiredProduct) {
setexpModel(true);
openExpireModal({
title: 'Product Expires',
onOk: () => expFun(Item),
});
setItem(ItemCard?.[0]);
} else {
setQtydata(ItemCard?.[0]);
@ -1228,7 +1229,10 @@ const BSItemCard = (props) => {
}
} else if (ItemCard?.[0]?.OnePcQRBased === 'Y') {
if (ItemCard?.[0]?.OverAllExpStatus == 'Y' && ExpiredProduct) {
setexpModel(true);
openExpireModal({
title: 'Product Expires',
onOk: () => expFun(Item),
});
setItem(ItemCard?.[0]);
setOnePeiceFlow(true);
} else {
@ -1320,14 +1324,6 @@ const BSItemCard = (props) => {
)?.SettingValue === 'Y';
setExpiredProduct(expiredDate);
};
const to12Hour = (timeStr) => {
if (!timeStr) return '';
let [h, m] = timeStr.split(':');
h = parseInt(h, 10);
const suffix = h >= 12 ? 'PM' : 'AM';
h = h % 12 || 12; // 0 12
return `${h}${suffix}`;
};
const CloseModal = () => {
setModelQty(false);
@ -1489,55 +1485,6 @@ const BSItemCard = (props) => {
}
};
// const Stockfun = (index) => {
// setVarientIndex(index.key)
// let count = qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[index.key]?.StockDetails?.length;
// if (StockPreferenceDetail?.SettingValue === "Y") {
// if (count > 1) {
// if (qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[index.key]?.OverAllExpStatus == 'N') {
// setModalVarient(false)
// setModelstock(true)
// setVarItem(index.key)
// }
// else if (qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[index.key]?.OverAllExpStatus == 'Y') {
// if (prodexpir) {
// setRepeatedModel(true)
// setModalVarient(false)
// setModelstock(true)
// setVarItem(index.key)
// }
// else {
// setexpVarModel(true);
// setVarItem(index.key)
// }
// }
// // setVarientIndex(index.key)
// }
// else {
// if (qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[index.key]?.OverAllExpStatus == 'N') {
// dataTransfer(qtydata, QtyIndex, index.key, 0);
// setModelQty(false)
// setVarItem(index.key)
// }
// else if (qtydata?.ProductDetail?.[QtyIndex]?.ProdVariantDetails?.[index.key]?.OverAllExpStatus == 'Y') {
// if (prodexpir) {
// setProdexpir(false)
// setRepeatedModel(true)
// dataTransfer(qtydata, QtyIndex, index.key, 0);
// setModelQty(false)
// setVarItem(index.key)
// }
// else{
// setexpVarModel(true);
// setVarItem(index.key)
// }
// }
// }
// } else {
// dataTransfer(qtydata, QtyIndex, index.key, 0);
// setModelQty(false)
// }
// }
const Stockfun = (index) => {
setVarientIndex(index.key);
const variantDetails =
@ -1562,7 +1509,14 @@ const BSItemCard = (props) => {
}
} else if (overallExpStatus === 'Y' && ExpiredProduct) {
setVarItem(index.key);
setexpVarModel(true);
openExpireModal({
title: 'Variant Expires',
onOk: () => expVerFun(VarItem),
onCancel: () => {
setRepeatedModel(false);
setProdexpir(false);
},
});
}
} else {
if (
@ -1638,7 +1592,14 @@ const BSItemCard = (props) => {
}
} else if (overallExpStatus === 'Y' && ExpiredProduct) {
setVarItem(index.key);
setexpVarModel(true);
openExpireModal({
title: 'Variant Expires',
onOk: () => expVerFun(VarItem),
onCancel: () => {
setRepeatedModel(false);
setProdexpir(false);
},
});
return;
}
}
@ -1695,16 +1656,6 @@ const BSItemCard = (props) => {
dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
}
} else {
// if (Isincart && Isincart?.StockAvailable === 'Y') {
// if (Isincart?.BalanceQty > Isincart?.OrderQty) {
// dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
// } else {
// dataTransfer(qtydata, QtyIndex, index.key, 1, onePeiceFlow);
// }
// } else {
// dataTransfer(qtydata, QtyIndex, index.key, 0, onePeiceFlow);
// }
const findNextAvailableStockIndex = (
stockDetails,
CartOrderDetails,
@ -1770,7 +1721,14 @@ const BSItemCard = (props) => {
}
} else if (overallExpStatus === 'Y' && ExpiredProduct) {
setVarItem(index.key);
setexpVarModel(true);
openExpireModal({
title: 'Variant Expires',
onOk: () => expVerFun(VarItem),
onCancel: () => {
setRepeatedModel(false);
setProdexpir(false);
},
});
return;
}
setModelQty(false);
@ -1782,7 +1740,14 @@ const BSItemCard = (props) => {
(item) => item.OverAllExpStatus === 'Y'
);
if (QtyExpire && ExpiredProduct) {
setExpQtyModel(true);
openExpireModal({
title: 'Quantity Expires',
onOk: () => expQtyFun(qtyExpData),
onCancel: () => {
setRepeatedModel(false);
(setProdexpir(false), closeExpireModal());
},
});
setQtyExpData(index);
} else {
const selectedProIndex = qtydata?.ProductDetail?.findIndex(
@ -2048,7 +2013,14 @@ const BSItemCard = (props) => {
} else if (overallExpStatus === 'Y' && repeatedModel) {
dataTransfer(qtydata, QtyIndex, VarientIndex, item.key, onePeiceFlow);
} else {
setexpStockModel(true);
openExpireModal({
title: 'Stock Expires',
onOk: () => expStockFun(StockItem),
onCancel: () => {
setRepeatedModel(false);
setProdexpir(false);
},
});
setStockItem(item.key);
}
}
@ -2057,178 +2029,9 @@ const BSItemCard = (props) => {
setRepeatedModel(false);
};
const pressTimer = useRef(null);
const isLongPress = useRef(false);
const [priceChangeProduct, setPriceChangeProduct] = useState([]);
const [productPriceChange, setProductPriceChange] = useState(false);
const handleMouseDownItemCard = (e, item) => {
isLongPress.current = false;
pressTimer.current = setTimeout(() => {
if (
!(
(item?.OverAllQty !== undefined && !preferenceSingleSales
? returnCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllQty,
CartOrderDetails
)
: returnOnepcCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllPcs,
CartOrderDetails
)) > 0 ||
item?.ProductDetail?.some((item) => item?.StockAvailable !== 'Y')
)
) {
e.stopPropagation();
} else {
isLongPress.current = true;
handleLongPress(item);
}
}, 1000); // Adjust duration as needed
};
const handleMouseUpItemCard = (e, item, check) => {
clearTimeout(pressTimer.current);
if (!isLongPress.current) {
// Your existing onClick logic
if (
!(
(item?.OverAllQty !== undefined && !preferenceSingleSales
? returnCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllQty,
CartOrderDetails
)
: returnOnepcCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllPcs,
CartOrderDetails
)) > 0 ||
item?.ProductDetail?.some((item) => item?.StockAvailable !== 'Y')
)
) {
e.stopPropagation();
} else {
if (check && !e.target.closest('.card4Main-onepiece')) {
CardOnclick(
item,
item?.OnePcsAvailable === 'Y' &&
preferenceSingleSales &&
'OnePeiceProduct'
);
} else if (!check) {
CardOnclick(
item,
item?.OnePcsAvailable === 'Y' &&
preferenceSingleSales &&
'OnePeiceProduct'
);
}
}
}
isLongPress.current = false;
};
const handleMouseLeave = () => {
clearTimeout(pressTimer.current);
isLongPress.current = false;
};
// Mobile - Touch Start
const handleTouchStartItemCard = (e, item) => {
e.preventDefault();
isLongPress.current = false;
pressTimer.current = setTimeout(() => {
if (
!(
(item?.OverAllQty !== undefined && !preferenceSingleSales
? returnCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllQty,
CartOrderDetails
)
: returnOnepcCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllPcs,
CartOrderDetails
)) > 0 ||
item?.ProductDetail?.some((item) => item?.StockAvailable !== 'Y')
)
) {
e.stopPropagation();
} else {
isLongPress.current = true;
handleLongPress(item);
}
}, 1000);
};
// Mobile - Touch End
const handleTouchEndItemCard = (e, item, check = false) => {
e.preventDefault();
clearTimeout(pressTimer.current);
if (!isLongPress.current) {
// Same logic as mouse up
if (
!(
(item?.OverAllQty !== undefined && !preferenceSingleSales
? returnCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllQty,
CartOrderDetails
)
: returnOnepcCount(
item?.ProductDetail?.[0]?.ProdName,
item?.OverAllPcs,
CartOrderDetails
)) > 0 ||
item?.ProductDetail?.some((item) => item?.StockAvailable !== 'Y')
)
) {
e.stopPropagation();
} else {
if (check && !e.target.closest('.card4Main-onepiece')) {
CardOnclick(
item,
item?.OnePcsAvailable === 'Y' &&
preferenceSingleSales &&
'OnePeiceProduct'
);
} else if (!check) {
CardOnclick(
item,
item?.OnePcsAvailable === 'Y' &&
preferenceSingleSales &&
'OnePeiceProduct'
);
}
}
}
isLongPress.current = false;
};
// Mobile - Touch Cancel (when interrupted)
const handleTouchCancelItemCard = () => {
clearTimeout(pressTimer.current);
isLongPress.current = false;
};
const handleLongPress = (item) => {
console.log('Long press triggered for:', item);
setPriceChangeProduct([item]);
setProductPriceChange(true);
// Add your long press logic here
// For example: open a context menu, show options, etc.
};
const CardOnclick = async (item, Parameter) => {
setOnePeiceFlow(Parameter === 'OnePeiceProduct');
@ -2248,7 +2051,10 @@ const BSItemCard = (props) => {
Parameter === 'OnePeiceProduct' ? transformedItem : item;
setQtydata(modiffiedData);
if (modiffiedData.OverAllExpStatus === 'Y' && ExpiredProduct) {
setexpModel(true);
openExpireModal({
title: 'Product Expires',
onOk: () => expFun(modiffiedData),
});
setItem(modiffiedData);
} else if (modiffiedData) {
setQtydata(modiffiedData);
@ -2370,19 +2176,6 @@ const BSItemCard = (props) => {
)
: [];
const freeProductAvailableForThisItem = hasOffer
? OverAllproductBasedOfferDatas?.ProdDtl?.filter(
(o) =>
o?.ProdId === item?.ProdId &&
o?.ProdVariantDetails?.some((variant) =>
variant?.StockDetails?.some(
(stock) =>
stock?.InwardDtlId === item?.InwardDtlId && o?.MinQty > 0
)
)
)
: [];
const calculateTaxAmounts = (qty, rate, taxPercentage) => {
const totalAmount = qty * rate;
const taxAmount = (
@ -2447,7 +2240,8 @@ const BSItemCard = (props) => {
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
? true
: cartItem?.OfferMode !== 'B') &&
cartItem?.OfferMode !== 'P' && cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'P' &&
cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'O' &&
cartItem?.OfferMode !== 'L'
? true
@ -2460,7 +2254,8 @@ const BSItemCard = (props) => {
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
? true
: cartItem?.OfferMode !== 'B') &&
cartItem?.OfferMode !== 'P' && cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'P' &&
cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'O' &&
cartItem?.OfferMode !== 'L'
? true
@ -2476,7 +2271,8 @@ const BSItemCard = (props) => {
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
? true
: cartItem?.OfferMode !== 'B') &&
cartItem?.OfferMode !== 'P' && cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'P' &&
cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'O' &&
cartItem?.OfferMode !== 'L'
? true
@ -2491,7 +2287,8 @@ const BSItemCard = (props) => {
((cartItem?.OfferModeType && cartItem?.OfferMode === 'B'
? true
: cartItem?.OfferMode !== 'B') &&
cartItem?.OfferMode !== 'P' && cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'P' &&
cartItem?.OfferMode !== 'C' &&
cartItem?.OfferMode !== 'O' &&
cartItem?.OfferMode !== 'L'
? true
@ -2825,9 +2622,12 @@ const BSItemCard = (props) => {
const UpdatedCartItemWithOffer = {
...item,
Offer: (sameProduct || bestOffer?.OfferMode === 'I' || bestOffer?.OfferMode === 'Q')
? (bestOffer?.OfferAmount || item.Offer)
: (item.Offer || bestOffer?.OfferAmount),
Offer:
sameProduct ||
bestOffer?.OfferMode === 'I' ||
bestOffer?.OfferMode === 'Q'
? bestOffer?.OfferAmount || item.Offer
: item.Offer || bestOffer?.OfferAmount,
OfferType: item?.OfferType || bestOffer?.OfferType,
OfferMessage: item?.OfferMessage || bestOffer?.OfferMessage,
OfferMode: item?.OfferMode || bestOffer?.OfferMode,
@ -2842,7 +2642,8 @@ const BSItemCard = (props) => {
((c?.OfferModeType && c?.OfferMode === 'B'
? true
: c?.OfferMode !== 'B') &&
c?.OfferMode !== 'P' && c?.OfferMode !== 'C' &&
c?.OfferMode !== 'P' &&
c?.OfferMode !== 'C' &&
c?.OfferMode !== 'O' &&
c?.OfferMode !== 'L'
? true
@ -3159,7 +2960,6 @@ const BSItemCard = (props) => {
};
});
console.log(Postdata, 'Postdata');
const response = await dispatch(
bulkpostdata({ ProdDetails: Postdata })
).unwrap();
@ -5321,6 +5121,7 @@ const BSItemCard = (props) => {
}, []);
const expFun = (item) => {
console.log(item, 'itemitemitemitemitemitemitemitem');
let count = item?.ProductDetail?.length;
if (count > 1) {
Quantity();
@ -5328,7 +5129,8 @@ const BSItemCard = (props) => {
setVarItem(0);
SingleQuantity(item, onePeiceFlow);
}
setexpModel(false);
closeExpireModal();
setProdexpir(true);
setQtydata(item);
};
@ -5434,7 +5236,7 @@ const BSItemCard = (props) => {
setQtyIndex(selectedProIndex);
setRepeatedModel(true);
setExpQtyModel(false);
closeExpireModal();
};
const expVerFun = (item) => {
@ -5451,12 +5253,12 @@ const BSItemCard = (props) => {
setModelQty(false);
setSelectedBrand('Others');
}
setexpVarModel(false);
closeExpireModal();
};
const expStockFun = (item) => {
dataTransfer(qtydata, QtyIndex, VarientIndex, item, onePeiceFlow);
setexpStockModel(false);
closeExpireModal();
};
const getMaxBrandWidth = () => {
@ -5488,18 +5290,6 @@ const BSItemCard = (props) => {
};
}, []);
useEffect(() => {
function handleResize() {
setScreenHeight(window.innerHeight);
}
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
// Example usage for checking the length of 'ProdVariantDetails'
const widthBasedOnProdVariantDetails = getMaxBrandWidth();
const ExpDate = useSelector(GlobalExpDateforHeight);
@ -7458,11 +7248,9 @@ const BSItemCard = (props) => {
</SortableContext>
</DndContext>
</>
)
: ProductSearch?.length > 5 && GetmultipleSearchDatas.some(
e => e.toLowerCase() === "qrcode"
) : ProductSearch?.length > 5 &&
GetmultipleSearchDatas.some(
(e) => e.toLowerCase() === 'qrcode'
) &&
(cardData?.length == 0 || cardData == undefined) ? (
<div>
@ -7483,19 +7271,19 @@ const BSItemCard = (props) => {
display: globalAccessForOthers && 'none',
}}
>
<div align="center" class="fond">
<div class="contener_general">
<div class="contener_mixte">
<div class="ballcolor ball_1">&nbsp;</div>
<div align="center" className="fond">
<div className="contener_general">
<div className="contener_mixte">
<div className="ballcolor ball_1">&nbsp;</div>
</div>
<div class="contener_mixte">
<div class="ballcolor ball_2">&nbsp;</div>
<div className="contener_mixte">
<div className="ballcolor ball_2">&nbsp;</div>
</div>
<div class="contener_mixte">
<div class="ballcolor ball_3">&nbsp;</div>
<div className="contener_mixte">
<div className="ballcolor ball_3">&nbsp;</div>
</div>
<div class="contener_mixte">
<div class="ballcolor ball_4">&nbsp;</div>
<div className="contener_mixte">
<div className="ballcolor ball_4">&nbsp;</div>
</div>
</div>
</div>
@ -7503,19 +7291,19 @@ const BSItemCard = (props) => {
</>
)}
{paymentloader === true && (
<div class="Payment-loader1">
<div class="Payment-loader">
<div class="contener_mixte">
<div class="ballcolor ball_1">&nbsp;</div>
<div className="Payment-loader1">
<div className="Payment-loader">
<div className="contener_mixte">
<div className="ballcolor ball_1">&nbsp;</div>
</div>
<div class="contener_mixte">
<div class="ballcolor ball_2">&nbsp;</div>
<div className="contener_mixte">
<div className="ballcolor ball_2">&nbsp;</div>
</div>
<div class="contener_mixte">
<div class="ballcolor ball_3">&nbsp;</div>
<div className="contener_mixte">
<div className="ballcolor ball_3">&nbsp;</div>
</div>
<div class="contener_mixte">
<div class="ballcolor ball_4">&nbsp;</div>
<div className="contener_mixte">
<div className="ballcolor ball_4">&nbsp;</div>
</div>
<p style={{ marginTop: '2rem' }}>
{' '}
@ -7532,107 +7320,19 @@ const BSItemCard = (props) => {
</div>
</div>
</div>
{expModel && (
<Modal
title={
<div
style={{ display: 'flex', gap: '1rem', flexDirection: 'row' }}
>
<div>
<ExclamationCircleOutlined
style={{ color: 'rgb(231 176 12)', fontSize: '30px' }}
/>
</div>
<div>
<h4>Product Expires</h4>
</div>
</div>
}
open={expModel}
onOk={() => expFun(Item)}
onCancel={() => setexpModel(false)}
okText="Submit"
cancelText="Don't Submit"
maskTransitionName="" // Remove animation for the mask
transitionName=""
></Modal>
)}
{expQtyModel && (
<Modal
title={
<div
style={{ display: 'flex', gap: '1rem', flexDirection: 'row' }}
>
<ExclamationCircleOutlined
style={{ color: 'rgb(231 176 12)', fontSize: '30px' }}
/>
<h3>Quantity Expires</h3>
</div>
}
open={expQtyModel}
onOk={() => expQtyFun(qtyExpData)}
onCancel={() => {
(setRepeatedModel(false),
setProdexpir(false),
setExpQtyModel(false));
{expireModal?.open && (
<ExpireConfirmModal
open={expireModal?.open}
title={expireModal?.title}
onOk={() => {
expireModal.onOk?.();
closeExpireModal();
}}
okText="Submit"
cancelText="Don't Submit"
maskTransitionName=""
transitionName=""
></Modal>
)}
{expVarModel && (
<Modal
title={
<div
style={{ display: 'flex', gap: '1rem', flexDirection: 'row' }}
>
<ExclamationCircleOutlined
style={{ color: 'rgb(231 176 12)', fontSize: '30px' }}
/>
<h3>Variant Expires</h3>
</div>
}
open={expVarModel}
onOk={() => expVerFun(VarItem)}
onCancel={() => {
(setexpVarModel(false),
setRepeatedModel(false),
setProdexpir(false));
expireModal.onCancel?.();
closeExpireModal();
}}
okText="Submit"
cancelText="Don't Submit"
maskTransitionName=""
transitionName=""
></Modal>
)}
{expStockModel && (
<Modal
title={
<div
style={{ display: 'flex', gap: '1rem', flexDirection: 'row' }}
>
<ExclamationCircleOutlined
style={{ color: 'rgb(231 176 12)', fontSize: '30px' }}
/>
<h3>Stock Expires</h3>
</div>
}
open={expStockModel}
onOk={() => expStockFun(StockItem)}
onCancel={() => {
(setexpStockModel(false),
setRepeatedModel(false),
setProdexpir(false));
}}
okText="Submit"
cancelText="Don't Submit"
maskTransitionName=""
transitionName=""
></Modal>
)}
{modelQty && (

View File

@ -1,19 +1,15 @@
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
import moment from 'moment';
import { App, Badge, DatePicker, Modal, Tooltip, Form, message } from 'antd';
import { GoTriangleRight } from 'react-icons/go';
import { Badge, DatePicker, Modal, Tooltip, message } from 'antd';
import { ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons';
import defaultimage from '../../../../Images/defaultItemImg.png';
import FormHeader from '../../../PageComponents/FormHeader';
import {
GlobalPricingAppPricingName,
SelectedGlobalCardColorDetail,
SelectedGlobalCardFont,
StoredSessionData,
getTemplateData,
} from '../../../../Features/ThemeChange/ThemeChange';
import { Tables } from '../../../../Components/Tables/Table';
import {
GlobalProductSubCategorie,
GlobalItemCard,
@ -107,26 +103,13 @@ import { v4 as uuidv4 } from 'uuid';
// Dummy SortableCard component
import { useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import HuggingFaceVoiceForm from '../../../VoiceToText/VoiceToText.jsx';
import VoiceToTextItemCard from '../../../VoiceToText/VoiceToTextItemCard.jsx';
import { ExtractDateFormate } from '../../../../Services/Others.js';
import {
changeFreeProductForLoyalty,
ChangeFreeProductList,
ChangeFullFreeProductList,
changeFullOfferAppliedProducts,
ChangeOfferAppliedProducts,
changeOfferAppliedProductsForLoyalty,
changeOfferAppliedProductsForMembership,
changeTriggerOfferFree,
getOfferinBooking,
GlobalFreeProdList,
GlobalOfferAppliedProducts,
GlobalOverAllOfferAmt,
GlobalTriggerOfferFree,
RemoveOfferAppliedProduct,
GlobalOfferAppliedProducts
} from '../../../../Features/Offer/Offernew/BookingOffernew.js';
import { validateOffers } from './ValidateOffer.jsx';
import { useSaleswiseOfferWatcher } from './SalesWiseOffer.jsx';
import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLogin.js';
import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js';
@ -137,10 +120,7 @@ import dayjs from 'dayjs';
import BSCustomerSelect from '../UtillComponents/BSSelectCustomer.jsx';
import BSNavBarAddUser from '../UtillComponents/BSNavBarAddUser.jsx';
import { FaAngleLeft, FaAngleRight } from 'react-icons/fa';
import useRemoveFromCart from './RemoveFromCartFunction.jsx';
import { IoIosAdd } from 'react-icons/io';
import { LuMinus } from 'react-icons/lu';
import BranchName from '../../Template/BranchName.jsx';
import { FiPlus } from 'react-icons/fi';
@ -179,7 +159,7 @@ export function SortableCard({ id, children, item }) {
</div>
);
}
const { RangePicker } = DatePicker;
const BsBookingitemCard = (props) => {
const voiceTriggerRef = useRef(null);
const unsubscribeRef = useRef(null);
@ -191,14 +171,10 @@ const BsBookingitemCard = (props) => {
const handleDecline = async (item) => {
await decline(item, setPreviousdataLength);
};
const handleClearAll = async () => {
await clearAllItems();
};
const Clearall = async () => {
await handleClearAll();
};
const [form] = Form.useForm();
const cardFunction = props?.cardFunctionality;
// const applyOffer = useApplyOfferto_CardDetail();
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,30 +1,56 @@
import { Switch, Tooltip } from "antd"
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 { 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";
import { Switch, Tooltip } from 'antd';
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 { 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 CompId = getSession("CompId")
const BranchId = getSession("BranchId")
const AppId = getSession("AppId")
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const UserId = getSession('UserId');
const dispatch = useDispatch()
const dispatch = useDispatch();
const [PrintType, setPrintType] = useState(false);
const [PageSize, setPageSize] = useState(false);
// const [PrintTemplates, setPrintTemplates] = useState([])
const [SizeOptionData, setSizeOptionData] = useState([])
const [selectedTemplate, setSelectedTemplate] = useState(null)
const [messageType, setMessageType] = useState('')
const [messageData, setMessageData] = useState('')
const [SizeOptionData, setSizeOptionData] = useState([]);
const [selectedTemplate, setSelectedTemplate] = useState(null);
const [messageType, setMessageType] = useState('');
const [messageData, setMessageData] = useState('');
console.log(selectedTemplate, 'selectedTemplate');
// Memoized values for better performance
const currentPrintType = useMemo(() => {
if (selectedTemplate) {
@ -56,13 +82,15 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
};
useEffect(() => {
printsyleget()
}, [])
printsyleget();
}, []);
// Auto-select default template when data loads
useEffect(() => {
if (SizeOptionData.length > 0) {
const defaultTemplate = SizeOptionData.find(template => template.SetasDefault === "Y");
const defaultTemplate = SizeOptionData.find(
(template) => template.SetasDefault === 'Y'
);
if (defaultTemplate) {
handleTemplateSelect(defaultTemplate);
}
@ -80,7 +108,7 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
const currentSettings = {
PrintType: template.PrintType,
PageSize: template.PageSize,
selectedTemplate: template
selectedTemplate: template,
};
console.log('Template Selected - Settings:', currentSettings);
onSettingsChange(currentSettings);
@ -95,7 +123,7 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
if (selectedTemplate) {
const updatedTemplate = {
...selectedTemplate,
PrintType: e ? 'S' : 'C'
PrintType: e ? 'S' : 'C',
};
setSelectedTemplate(updatedTemplate);
@ -104,7 +132,7 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
const currentSettings = {
PrintType: updatedTemplate.PrintType,
PageSize: updatedTemplate.PageSize,
selectedTemplate: updatedTemplate
selectedTemplate: updatedTemplate,
};
onSettingsChange(currentSettings);
}
@ -118,14 +146,14 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
if (selectedTemplate) {
const updatedTemplate = {
...selectedTemplate,
PageSize: e ? 'A5' : 'A4'
PageSize: e ? 'A5' : 'A4',
};
setSelectedTemplate(updatedTemplate);
if (onSettingsChange && typeof onSettingsChange === 'function') {
const currentSettings = {
PrintType: updatedTemplate.PrintType,
PageSize: updatedTemplate.PageSize,
selectedTemplate: updatedTemplate
selectedTemplate: updatedTemplate,
};
onSettingsChange(currentSettings);
}
@ -135,13 +163,21 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
const stylePreview = async (template) => {
if (!template) return;
const { StyleId, StyleName, PrintType: printType, PageSize, Notes, PrintHdrName, Signature, TermsandConditions, OptionDetails } = template;
const {
StyleId,
StyleName,
PrintType: printType,
PageSize,
Notes,
PrintHdrName,
Signature,
TermsandConditions,
OptionDetails,
} = template;
const helperFunction = (param) => {
return OptionDetails.some(
(item) => item.ConfigName === param
)
}
return OptionDetails.some((item) => item.ConfigName === param);
};
dispatch(changeSelectedSlNo(helperFunction('Sl.No')));
dispatch(changeSelectedItem(helperFunction('Item')));
@ -153,20 +189,26 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
dispatch(changeSelectedHsnCode(helperFunction('HsnCode')));
dispatch(changeSelectedQrcode(helperFunction('Qrcode')));
dispatch(changeSelectedSignature(helperFunction('signature')));
dispatch(changeSelectedtermsAndConditions(helperFunction('terms&conditions')));
dispatch(
changeSelectedtermsAndConditions(helperFunction('terms&conditions'))
);
dispatch(changeNotes(helperFunction('Notes')));
dispatch(changeSignatureImage(Signature));
dispatch(changeBillName(PrintHdrName));
dispatch(changeSelectedprintStyle({
dispatch(
changeSelectedprintStyle({
ConfigId: StyleId,
ConfigName: StyleName,
}));
})
);
};
const printsyleget = async () => {
try {
const Data = { AppId, CompId, BranchId };
let response = await dispatch(getPrintSelectionComponentData(Data)).unwrap();
let response = await dispatch(
getPrintSelectionComponentData(Data)
).unwrap();
if (response?.data?.statusCode === 1) {
// const salesTemplates = response.data.data?.flatMap(template =>
@ -221,7 +263,7 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
const currentSettings = {
PrintType: getPrintTypeValue(),
PageSize: getPageSizeValue(),
selectedTemplate
selectedTemplate,
};
console.log('Current Print Settings:', currentSettings);
@ -233,11 +275,15 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
// Also pass data when component mounts and when selectedTemplate changes
useEffect(() => {
if (selectedTemplate && onSettingsChange && typeof onSettingsChange === 'function') {
if (
selectedTemplate &&
onSettingsChange &&
typeof onSettingsChange === 'function'
) {
const currentSettings = {
PrintType: selectedTemplate.PrintType,
PageSize: selectedTemplate.PageSize,
selectedTemplate
selectedTemplate,
};
console.log('Template-based Print Settings:', currentSettings);
onSettingsChange(currentSettings);
@ -258,19 +304,15 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
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")
) {
if (item.PrintType === 'Sales' || item.PrintType === 'S') {
return {
...item,
SetasDefault:
item.StyleId === selectedTemplate.StyleId ? "Y" : "N",
SetasDefault: item.StyleId === selectedTemplate.StyleId ? 'Y' : 'N',
};
}
return item;
@ -342,7 +384,15 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
}, []);
return (
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>
<div
style={{
display: 'flex',
flexDirection: 'column',
gap: '1rem',
alignItems: 'center',
justifyContent: 'center',
}}
>
<Messages
messageType={messageType}
messageData={messageData}
@ -353,7 +403,7 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
</div>
<div style={{ display: 'flex', gap: '1rem' }}>
<div>
{(
{
<div
style={{
display: 'flex',
@ -394,7 +444,7 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
</Tooltip>
</span>
</div>
)}
}
</div>
<div>
@ -420,7 +470,9 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
</div>
</div>
<div style={{ display: 'flex', justifyContent: 'flex-end', width: '100%' }}>
<div
style={{ display: 'flex', justifyContent: 'flex-end', width: '100%' }}
>
<Buttons
buttonText="Save"
color="901D77"
@ -430,7 +482,7 @@ const SalesPrintSize = ({ onSettingsChange, closeModel }) => {
/>
</div>
</div>
)
}
);
};
export default SalesPrintSize
export default SalesPrintSize;

View File

@ -1,18 +1,21 @@
import { ArrowRightOutlined } from "@ant-design/icons";
import Buttons from "../../../../Components/Forms/Buttons";
import { gettableData, postPreferenceAppNames } from "../../../../Features/PreferenceMaster/PreferenceMaster";
import { getSession } from "../../../../Services/Others";
import { useDispatch } from "react-redux";
import { useEffect, useState } from "react";
import { getPreferenceData } from "../../../../Features/BookingScreen/BookingData/BookingData";
import { Messages } from "../../../../Components/Notifications/Messages";
import { changeSelectedPrintdummyData } from "../../../../Features/ThemeChange/ThemeChange";
import { ArrowRightOutlined } from '@ant-design/icons';
import Buttons from '../../../../Components/Forms/Buttons';
import {
gettableData,
postPreferenceAppNames,
} from '../../../../Features/PreferenceMaster/PreferenceMaster';
import { getSession } from '../../../../Services/Others';
import { useDispatch } from 'react-redux';
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 CompId = getSession("CompId");
const BranchId = getSession("BranchId");
const AppId = getSession("AppId");
const UserId = getSession("UserId");
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const UserId = getSession('UserId');
const dispatch = useDispatch();
const [modes, setModes] = useState([]);
@ -20,20 +23,18 @@ const SelectPrintMode = ({ closeModel }) => {
whatsapp: false,
sms: false,
print: false,
email: false
email: false,
});
const [messageType, setMessageType] = useState("");
const [messageData, setMessageData] = useState("");
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();
@ -47,40 +48,36 @@ const SelectPrintMode = ({ closeModel }) => {
setSelected({
whatsapp: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "whatsapp" &&
i.SettingValue === "Y"
i.SettingIdName?.trim()?.toLowerCase() === 'whatsapp' &&
i.SettingValue === 'Y'
),
sms: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "sms" &&
i.SettingValue === "Y"
i.SettingIdName?.trim()?.toLowerCase() === 'sms' &&
i.SettingValue === 'Y'
),
print: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "print" &&
i.SettingValue === "Y"
i.SettingIdName?.trim()?.toLowerCase() === 'print' &&
i.SettingValue === 'Y'
),
email: !!data.find(
(i) =>
i.SettingIdName?.trim()?.toLowerCase() === "email" &&
i.SettingValue === "Y"
)
i.SettingIdName?.trim()?.toLowerCase() === 'email' &&
i.SettingValue === 'Y'
),
});
};
const handleChange = (key) => {
setSelected((prev) => ({
...prev,
[key]: !prev[key]
[key]: !prev[key],
}));
};
const handleSave = async () => {
const allowed = ["whatsapp", "sms", "print", "email"];
const allowed = ['whatsapp', 'sms', 'print', 'email'];
const updatedSettings = modes.map((item) => {
const name = item.SettingIdName?.trim()?.toLowerCase();
@ -88,12 +85,11 @@ const SelectPrintMode = ({ closeModel }) => {
if (allowed?.includes(name)) {
return {
...item,
SettingValue: selected[name] ? "Y" : "N"
SettingValue: selected[name] ? 'Y' : 'N',
};
}
return item;
});
const payload = {
@ -101,40 +97,45 @@ const SelectPrintMode = ({ closeModel }) => {
BranchId,
CreatedBy: UserId,
AppId,
SettingDtlDetails: updatedSettings
SettingDtlDetails: updatedSettings,
};
console.log(payload, "payload to send");
console.log(payload, 'payload to send');
try {
const response = await dispatch(postPreferenceAppNames(payload)).unwrap();
if (response?.data?.statusCode === 1) {
setMessageType("success");
setMessageData("Printer settings saved successfully.");
setMessageType('success');
setMessageData('Printer settings saved successfully.');
dispatch(changeSelectedPrintdummyData(false));
await updatePreference();
closeModel()
closeModel();
} else {
setMessageType("error");
setMessageData(response?.data?.message || "Failed to save printer settings.");
setMessageType('error');
setMessageData(
response?.data?.message || 'Failed to save printer settings.'
);
}
} catch (error) {
console.error("Error while saving:", error);
console.error('Error while saving:', error);
}
};
const updatePreference = async () => {
await dispatch(getPreferenceData({ CompId, BranchId, AppId }));
}
};
return (
<div
style={{
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
backgroundColor:"#c4c4c4",
padding:"16px",
borderRadius:"8px"
}}
>
<Messages
@ -145,17 +146,17 @@ const SelectPrintMode = ({ closeModel }) => {
setMessageType(null);
}}
/>
<p style={{ fontSize: "18px", marginBottom: "10px" }}>
<p style={{ fontSize: '18px', marginBottom: '10px' }}>
Select Print Mode
</p>
<div style={{ display: "flex", gap: "1rem", padding: "10px" }}>
<div style={{ display: 'flex', gap: '1rem', padding: '10px' }}>
<label>
<input
type="checkbox"
style={{ marginRight: "0.5rem" }}
style={{ marginRight: '0.5rem' }}
checked={selected.whatsapp}
onChange={() => handleChange("whatsapp")}
onChange={() => handleChange('whatsapp')}
/>
WhatsApp
</label>
@ -163,9 +164,9 @@ const SelectPrintMode = ({ closeModel }) => {
<label>
<input
type="checkbox"
style={{ marginRight: "0.5rem" }}
style={{ marginRight: '0.5rem' }}
checked={selected.sms}
onChange={() => handleChange("sms")}
onChange={() => handleChange('sms')}
/>
SMS
</label>
@ -173,9 +174,9 @@ const SelectPrintMode = ({ closeModel }) => {
<label>
<input
type="checkbox"
style={{ marginRight: "0.5rem" }}
style={{ marginRight: '0.5rem' }}
checked={selected.print}
onChange={() => handleChange("print")}
onChange={() => handleChange('print')}
/>
Print
</label>
@ -183,20 +184,19 @@ const SelectPrintMode = ({ closeModel }) => {
<label>
<input
type="checkbox"
style={{ marginRight: "0.5rem" }}
style={{ marginRight: '0.5rem' }}
checked={selected.email}
onChange={() => handleChange("email")}
onChange={() => handleChange('email')}
/>
Email
</label>
</div>
<div
style={{
width: "100%",
display: "flex",
justifyContent: "flex-end",
width: '100%',
display: 'flex',
justifyContent: 'flex-end',
marginTop: 24,
}}
>

View File

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

View File

@ -1,120 +1,47 @@
import React from "react";
import { useDispatch, useSelector } from "react-redux";
import {
dateFormatChange1,
extractLastNumber,
extractLastNumberOrderId,
dateFormatChange1
} from "../../../../Services/Others";
import {
GlobalprintSlNo,
GlobalprintItem,
GlobalprintMRP,
GlobalprintDiscount,
GlobalprintQuantity,
GlobalprintRate,
GlobalprintAmount,
GlobalprintHsnCode,
GlobalprintQrcodet,
GlobalPritdummyData,
changeReprintDataFound,
GloabalFieldDetails,
GlobalprintSignature,
GlobalprinttermsAndConditions,
GlobalSignatureImage,
Globalnotes,
GlobalthemeFormat,
GlobalBillName,
} from "../../../../Features/ThemeChange/ThemeChange";
import "../../../../Styles/BookingScreen/PrintTemplates/ThermalPrinter/PrintStyle1.scss";
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";
const OtherServicePrintStyle1 = ({
index,
totalQuantityFilter,
Date1,
CashierName,
totalQuantity,
OrderDetailGST,
OrderDetailIGST,
OrderDetailVAT,
table2Data,
UpiId,
PaymentStatus,
PrintLogo,
PrintGreeting,
printDatas,
}) => {
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 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 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 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 PageSize = printDatas?.PageSize
const Signature = FieldDetails?.["signature"];
const TermsnAdCondition = FieldDetails?.["terms&conditions"];
console.log("table2Datatable2Datatable2Datatable2Data", table2Data,table2Data?.[0]?.BranchName );
if (keysLength > 0) {
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);
// `${day}-${monthNames[monthIndex]}-${year}`;
@ -125,37 +52,13 @@ console.log("table2Datatable2Datatable2Datatable2Data", table2Data,table2Data?.[
const DineInData = table2Data?.productDetails?.filter(
(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 || [];
let TotalOfferAmount = 0;
// Calculate SalesWiseOffers total amount
offers.forEach(offer => {
@ -163,19 +66,9 @@ console.log("table2Datatable2Datatable2Datatable2Data", table2Data,table2Data?.[
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 = [

View File

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

View File

@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react';
import { useState, useEffect } from 'react';
import { Tooltip } from 'antd';
import './GraphChart.scss'; // For styling
import TooltipWrapper from '../../../Components/Tooltip/Tooltip';
@ -206,36 +206,7 @@ const GraphChart = ({ datasets }) => {
.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 reversedData = [...data].reverse();
@ -507,7 +478,7 @@ const GraphChart = ({ datasets }) => {
</svg>
<div className="labels">
{Array.from({ length: 7 }, (_, i) => {
{Array.from({ length: 8 }, (_, i) => {
const date = new Date();
date.setDate(date.getDate() - i);
return (

View File

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

View File

@ -1,93 +1,4 @@
// 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}` // 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 { useMemo } from 'react';
import Highcharts from 'highcharts';
import HighchartsReact from 'highcharts-react-official';
import './PieChart.scss';
@ -105,7 +16,11 @@ const DynamicPieChart = ({ chartData }) => {
);
if (!chartData?.length) {
return <div style={{textAlign:"center",display: 'flex',
return (
<div
style={{
textAlign: 'center',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: '250px',
@ -114,7 +29,12 @@ const DynamicPieChart = ({ chartData }) => {
fontSize: '16px',
fontWeight: '500',
border: '1px dashed #d9d9d9',
borderRadius: '8px',}}>No Data Found</div>;
borderRadius: '8px',
}}
>
No Data Found
</div>
);
}
return (

View File

@ -1,28 +1,26 @@
import React, { useCallback, useEffect, useRef, useState } 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 { useCallback, useEffect, useRef, useState,lazy, Suspense } from 'react';
import { useNavigate, useOutletContext } from 'react-router-dom';
import CalendarDropdown from '../../Components/CalendarDropdown';
import { MdKeyboardArrowDown } from 'react-icons/md';
import { IoMdNotificationsOutline } from 'react-icons/io';
import {
getdashboard,
getdashboarddate,
getpreOrderDashBoard,
getSalesHdr,
getTopSellingCustomers,
} from '../../Features/RetailDashboard/Dashboard.js';
import { FaTimesCircle } from 'react-icons/fa';
import { shallowEqual, useDispatch } from 'react-redux';
import { useSelector } from 'react-redux';
import { DatePicker, Tooltip } from 'antd';
import dayjs from 'dayjs';
import '../../Styles/DashBoard/RetailDashBoard.scss';
const GraphChart = lazy(() => import('./Chart/GraphChart'));
const TopSellingProductsChart = lazy(
() => import('./TopSellingProductsChart.jsx')
);
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 {
FeatureAddon,
getTemplate,
GlobalPricingAppPricingName,
StoredSessionData,
} from '../../Features/ThemeChange/ThemeChange.js';
@ -31,15 +29,20 @@ import {
getAppSubscriptionDate,
getPreferenceData,
} from '../../Features/BookingScreen/BookingData/BookingData.js';
import {
getdashboard,
getdashboarddate,
getpreOrderDashBoard,
getSalesHdr,
getTopSellingCustomers,
} from '../../Features/RetailDashboard/Dashboard.js';
import {
clearSession,
dateFormatChange,
encryptedValuesUrlFun,
ExtractDateFormate,
getSession,
} from '../../Services/Others';
import { shallowEqual, useDispatch } from 'react-redux';
import { useSelector } from 'react-redux';
import {
getAllprodIds,
getExpireProductsList,
@ -58,28 +61,36 @@ import {
PUTLoginuser,
} from '../../Features/BrachLogin/BranchLogin.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 {
ChangeRedirectStatus,
getEmpAccess,
GlobalRedirectStatus,
} from '../../Features/AppPage/CenterPage.js';
import { UserDataBasedOnBranchId } from '../../Features/Reports/Reports.js';
import { gettableData } from '../../Features/PreferenceMaster/PreferenceMaster.js';
import Loader from '../../Components/Loader/Loader.jsx';
import { getUserProfile } from '../../Features/UserAccount/userData.js';
import TopSellingProductsChart from './TopSellingProductsChart.jsx';
import { Messages } from '../../Components/Notifications/Messages.jsx';
const commonUrl = import.meta.env.ENV_COMMON_BASE_URL;
@ -97,7 +108,6 @@ const RetailDashboard = () => {
const navigate = useNavigate();
const dispatch = useDispatch();
const { RangePicker } = DatePicker;
const [selectedTab, setSelectedTab] = useState('dashboard');
const tabs = [
{ value: 'dashboard', label: 'Dashboard' },
{ value: 'top-selling-products', label: 'Top Selling Products' },
@ -116,16 +126,7 @@ const RetailDashboard = () => {
]);
const [ismounted, setIsmounted] = useState(true);
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 userProfileRef = useRef(null);
@ -142,7 +143,6 @@ const RetailDashboard = () => {
const [totalPages, setTotalPages] = useState(0);
const [loading, setLoading] = useState(false);
const [products, setProducts] = useState([]);
console.log(selection, 'selection');
const [CompBranchData, setCompBranchData] = useState();
const [EmpAcces, setEmpAccess] = useState();
const [seletedBranchData, setseletedBranchData] = useState(BranchId);
@ -151,7 +151,6 @@ const RetailDashboard = () => {
BrLength == 1 ? null : 'all'
);
const [ApiData, setApiData] = useState([]);
console.log(CompBranchData, 'CompBranchData');
const [Zero, SetZero] = useState(false);
const [ResponseData, setResponseData] = useState();
const [DateApiData, setDateApiData] = useState([]);
@ -216,18 +215,7 @@ const RetailDashboard = () => {
type?.PreferredStatus === 'Y'
);
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 =
ApiData?.[0]?.ChartDtl?.map((item) => {
return {
@ -441,10 +429,6 @@ const RetailDashboard = () => {
if (res?.data?.statusCode === 1 && res?.data?.data?.length > 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();
@ -1075,39 +1059,6 @@ const RetailDashboard = () => {
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
const getpreOrderDashBoardFnAllBranches = async (FromDate, ToDate) => {
if (!CompBranchData || CompBranchData.length === 0) return;
@ -1284,14 +1235,6 @@ const RetailDashboard = () => {
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
getpreOrderDashBoardFnAllBranches(fromDate, toDate);
getTopBuyingCustomersAllBranches(fromDate, toDate);
@ -1477,6 +1420,7 @@ const RetailDashboard = () => {
?.toUpperCase()}
</div>
{userprofile && (
<Suspense fallback={null}>
<BSNavBarUserInfo
isOpen={userprofile}
divRef={userProfileRef}
@ -1487,6 +1431,7 @@ const RetailDashboard = () => {
}}
Logout={Logout}
/>
</Suspense>
)}
</div>
</div>
@ -1511,6 +1456,7 @@ const RetailDashboard = () => {
{/* Branch Filter Dropdown */}
{CompBranchData?.length > 1 && selection !== 'top-selling-products' && (
<div className="branch-filter-dropdown">
<Suspense fallback={<div>Loading...</div>}>
<DropDowns
options={[
{ value: 'all', label: 'All Branches' },
@ -1525,6 +1471,7 @@ const RetailDashboard = () => {
defaultValue="all"
placeholder="All Branches"
/>
</Suspense>
</div>
)}
@ -1537,14 +1484,6 @@ const RetailDashboard = () => {
className="datepickerDashboardrange"
inputReadOnly={true}
/>
{/* <div className="refershdashboard">
<div>
{' '}
<IoMdRefresh />
Refresh
</div>
<span>10sec auto refresh</span>
</div> */}
</div>
</div>
{selection === 'dashboard' ? (
@ -1553,7 +1492,9 @@ const RetailDashboard = () => {
<div className="TotalRevenue">
<div className="tlxHeader"></div>
<div className="TotalRevenue-Graph">
<Suspense fallback={<Loader />}>
<GraphChart datasets={datasets} />
</Suspense>
</div>
</div>
@ -2418,28 +2359,6 @@ const RetailDashboard = () => {
No Low Stock Product
</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>
@ -2448,6 +2367,7 @@ const RetailDashboard = () => {
</>
) : (
<>
<Suspense fallback={<Loader />}>
<TopSellingProductsChart
dates={dates}
products={products}
@ -2458,16 +2378,17 @@ const RetailDashboard = () => {
fetchProducts={fetchProducts}
initialDate={initialDate}
/>
</Suspense>
</>
)}
<Suspense fallback={null}>
<DefaultModal
open={modal}
title="Authentication"
width={500}
footer={false}
handleCancel={handlePageChange}
children={
>
<>
<div className="modalContentsadminuser">
<DropDowns
@ -2475,7 +2396,7 @@ const RetailDashboard = () => {
value: option?.UserId,
label: option?.UserName,
}))}
label={<label class="required">User Name</label>}
label={<label className="required">User Name</label>}
className="field-DropDown"
onChangeFunction={(e) => UserDropDownChange(e)}
isOnchanges={selectedUserData ? true : false}
@ -2484,6 +2405,7 @@ const RetailDashboard = () => {
/>
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
<div className="RadioButton">
<Suspense fallback={<div>Loading...</div>}>
<RadioGrpButton
content={[
{ value: 'O', label: 'OTP' },
@ -2493,6 +2415,7 @@ const RetailDashboard = () => {
defaultSelect={SelectType}
onSelectFuntion={(e) => ChangeMethod(e)}
/>
</Suspense>
</div>
</div>
@ -2546,8 +2469,8 @@ const RetailDashboard = () => {
</div>
</div>
</>
}
/>
</DefaultModal>
</Suspense>
</div>
);
};

View File

@ -1,17 +1,26 @@
import { useState, useEffect, useRef, useLayoutEffect, useMemo } from 'react';
import { BarChart, Bar, PieChart, Pie, Cell, XAxis, YAxis, CartesianGrid, Legend, Tooltip, ResponsiveContainer } from 'recharts';
import { TrendingUp, Package, IndianRupee, ChevronLeft, ChevronRight } from 'lucide-react';
import {
useState,
useEffect,
useRef,
useLayoutEffect,
useMemo,
lazy,
Suspense,
} from 'react';
import { PieChart, Pie, Cell, Tooltip, ResponsiveContainer } from 'recharts';
import { TrendingUp, Package, IndianRupee } from 'lucide-react';
import './TopSellingProductsChart.scss';
import { useDispatch } from 'react-redux';
import { getTopSellingProduct } from '../../Features/ProductPage/ProductPage';
import { getSession } from '../../Services/Others';
import { changeBreadCrumb } from '../../Features/AppPage/CenterPage';
import { Switch, DatePicker } from 'antd';
import moment from 'moment';
import dayjs from 'dayjs';
import { DropDowns } from '../../Components/Forms/DropDown';
const { RangePicker } = DatePicker;
import dayjs from 'dayjs';
const DropDowns = lazy(() =>
import('../../Components/Forms/DropDown').then((module) => ({
default: module.DropDowns,
}))
);
const subDirectory = import.meta.env.BASE_URL;
@ -22,8 +31,16 @@ const items = [
},
];
const TopSellingProducts = ({ dates = [null, null], products = [], loading = false, totalPages, page = 1, setPage = () => { }, fetchProducts = () => { }, initialDate = true }) => {
const TopSellingProducts = ({
dates = [null, null],
products = [],
loading = false,
totalPages,
page = 1,
setPage = () => {},
fetchProducts = () => {},
initialDate = true,
}) => {
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth();
@ -47,9 +64,8 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
const [windowWidth, setWindowWidth] = useState(window.innerWidth);
const [hoveredItem, setHoveredItem] = useState(null);
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
const startIndex = (page - 1) * 10;
console.log(products?.[0]?.TotalCount, "products")
console.log(products?.[0]?.TotalCount, 'products');
const options = useMemo(() => {
const total = products?.[0]?.TotalCount || 0;
@ -65,7 +81,7 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
arr.push({
label: `${start}-${end}`,
value: page
value: page,
});
}
@ -80,7 +96,7 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
setContainerWidth(el.clientWidth || 800);
// ResizeObserver to update container width precisely
const ro = new ResizeObserver(entries => {
const ro = new ResizeObserver((entries) => {
for (const entry of entries) {
const w = Math.floor(entry.contentRect.width);
if (w && w !== containerWidth) setContainerWidth(w);
@ -97,17 +113,22 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
// compute sizes based on actual container width
// make pie fill a good portion of container (leave some padding)
const pieOuterRadius = Math.max(48, Math.floor(containerWidth * (isNarrow ? 0.36 : 0.28)));
const pieOuterRadius = Math.max(
48,
Math.floor(containerWidth * (isNarrow ? 0.36 : 0.28))
);
const pieInnerRadius = Math.floor(pieOuterRadius * (isNarrow ? 0.5 : 0.55));
// height for ResponsiveContainer: tether to containerWidth so chart stays proportional
const responsiveHeight = Math.max(220, Math.floor(containerWidth * (isNarrow ? 0.62 : 0.5)));
const responsiveHeight = Math.max(
220,
Math.floor(containerWidth * (isNarrow ? 0.62 : 0.5))
);
// tweak minAngle: small screens should allow smaller minAngle so slices remain visible
const minAngle = isNarrow ? 4 : 8;
console.log(pieOuterRadius, "pieOuterRadius")
console.log(pieOuterRadius, 'pieOuterRadius');
// const COLORS = ['#2563eb', '#7c3aed', '#db2777', '#ea580c', '#16a34a', '#0891b2', '#d97706', '#65a30d', '#4f46e5', '#0d9488'];
const COLORS = [
@ -120,7 +141,7 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
'#e39a1a', // lighter amber (was #d97706)
'#8bc329', // lighter lime (was #65a30d)
'#6d63ef', // lighter indigo (was #4f46e5)
'#35bfa9' // lighter teal (was #0d9488)
'#35bfa9', // lighter teal (was #0d9488)
];
useEffect(() => {
@ -131,22 +152,24 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
}
}, []);
const handlePageChange = (data) => {
setPage(prev => prev + data)
}
const CustomTooltip = ({ active, payload }) => {
if (active && payload && payload?.[0]) {
const product = payload?.[0]?.payload;
return (
<div className="custom-tooltip">
<p className="tooltip-title">{product?.ProdName} - {product?.UOMName}</p>
{(product?.BrandName) ? <p className="tooltip-brand">Brand: {product?.BrandName}</p> : null}
<p className="tooltip-title">
{product?.ProdName} - {product?.UOMName}
</p>
{product?.BrandName ? (
<p className="tooltip-brand">Brand: {product?.BrandName}</p>
) : null}
<div className="tooltip-divider">
<p className="tooltip-subtitle">Variants:</p>
{product?.variantDetails?.map((variant, idx) => (
<div key={idx} className="tooltip-variant">
<span className="variant-name">{variant?.ProdVariantName}:</span>
<span className="variant-name">
{variant?.ProdVariantName}:
</span>
<span className="variant-data">
{variant?.SalesCount} sold | {variant?.Revenue}
</span>
@ -170,7 +193,13 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
};
const renderPercentInside = ({
cx, cy, midAngle, innerRadius, outerRadius, percent, value
cx,
cy,
midAngle,
innerRadius,
outerRadius,
percent,
value,
}) => {
const percentValue = Math.round(percent * 100);
// hide labels for very small percentages on narrow screens
@ -178,7 +207,8 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
const RADIAN = Math.PI / 180;
// place label inside slice (closer to inner radius on narrow screens)
const radius = innerRadius + (outerRadius - innerRadius) * (isNarrow ? 0.55 : 0.6);
const radius =
innerRadius + (outerRadius - innerRadius) * (isNarrow ? 0.55 : 0.6);
const x = cx + radius * Math.cos(-midAngle * RADIAN);
const y = cy + radius * Math.sin(-midAngle * RADIAN);
@ -196,7 +226,7 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
textAnchor="middle"
dominantBaseline="central"
pointerEvents="none"
style={{ textShadow: "0px 1px 2px rgba(0,0,0,0.35)" }}
style={{ textShadow: '0px 1px 2px rgba(0,0,0,0.35)' }}
>
{/* {`${percentValue}%`} */}
{value}
@ -208,54 +238,34 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
const benchmarks = [
// Fine granularity for small numbers, coarser for large numbers
1, 2, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50,
60, 70, 80, 90, 100, 125, 150, 175, 200, 225, 250, 275, 300,
350, 400, 450, 500, 600, 700, 800, 900, 1000,
1250, 1500, 1750, 2000, 2500, 3000, 3500, 4000, 4500, 5000,
6000, 7000, 8000, 9000, 10000, 12500, 15000, 17500, 20000, 25000,
30000, 35000, 40000, 45000, 50000, 60000, 70000, 80000, 90000, 100000,
125000, 150000, 175000, 200000, 250000, 300000, 350000, 400000, 450000, 500000,
600000, 700000, 800000, 900000, 1000000
1, 2, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 125,
150, 175, 200, 225, 250, 275, 300, 350, 400, 450, 500, 600, 700, 800, 900,
1000, 1250, 1500, 1750, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 6000,
7000, 8000, 9000, 10000, 12500, 15000, 17500, 20000, 25000, 30000, 35000,
40000, 45000, 50000, 60000, 70000, 80000, 90000, 100000, 125000, 150000,
175000, 200000, 250000, 300000, 350000, 400000, 450000, 500000, 600000,
700000, 800000, 900000, 1000000,
];
const benchmark = benchmarks.find(b => b >= maxValue);
const benchmark = benchmarks.find((b) => b >= maxValue);
return benchmark || Math.ceil(maxValue / 10000) * 10000;
};
const chartData = products?.map(p => ({
const chartData = products?.map((p) => ({
...p,
name: p?.ProdName,
value: metric === 'sales' ? p?.TotalSoldQty : p?.TotalRevenue,
benchMarkValue: metric === 'sales' ? p?.TotalRevenueCount : p?.TotalRevenueAmount
benchMarkValue:
metric === 'sales' ? p?.TotalRevenueCount : p?.TotalRevenueAmount,
}));
const benchmarkValue = getBenchmarkValue(Math.max(...(chartData?.map(d => d?.benchMarkValue) || [0])));
const benchmarkValue = getBenchmarkValue(
Math.max(...(chartData?.map((d) => d?.benchMarkValue) || [0]))
);
return (
<div className="top-selling-container">
<div className="content-wrapper">
{/* Header */}
{/* <div className="header-title-wrapper">
<div className="header-title">Top Selling Products</div>
<div className="header-date-picker">
<div className="date-picker-label">Date Range :</div>
<RangePicker
format="DD MMM YYYY"
placeholder={['Start Date', 'End Date']}
disabledDate={(current) => current && current > moment().endOf('day')}
onChange={async (dates) => {
setDates(dates);
const FromDate = dates?.[0]?.format('YYYY-MM-DD') || intialFromDate;
const ToDate = dates?.[1]?.format('YYYY-MM-DD') || intialToDate;
await fetchProducts({ AppId, CompId, BranchId, FromDate, ToDate, pageNumber: 1 });
setPage(1);
}}
value={dates}
/>
</div>
</div> */}
{/* Stats Cards */}
<div className="stats-grid">
<div className="stat-card1">
@ -272,7 +282,10 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
<div className="stat-text">
<p className="stat-label">Total Sales</p>
<p className="stat-value">
{products?.reduce((sum, p) => sum + (p?.TotalSoldQty || 0), 0)}
{products?.reduce(
(sum, p) => sum + (p?.TotalSoldQty || 0),
0
)}
</p>
</div>
<TrendingUp className="stat-icon" />
@ -283,7 +296,10 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
<div className="stat-text">
<p className="stat-label">Total Revenue</p>
<p className="stat-value">
{products?.reduce((sum, p) => sum + (p?.TotalRevenue || 0), 0)?.toFixed(2)}
{products
?.reduce((sum, p) => sum + (p?.TotalRevenue || 0), 0)
?.toFixed(2)}
</p>
</div>
<IndianRupee className="stat-icon" />
@ -311,14 +327,6 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
</div>
</div>
<div className="chart-type-controls">
{/* <Switch
checked={chartType === 'bar' ? true : false}
onChange={(checked) => setChartType(checked ? 'bar' : 'pie')}
checkedChildren="Bar Chart"
unCheckedChildren="Pie Chart"
className="bar-pie-switch"
value={chartType === 'bar' ? true : false}
/> */}
<div
onClick={() => setChartType('bar')}
className={`btn-chart-type ${chartType === 'bar' ? 'active' : ''}`}
@ -332,19 +340,8 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
Pie Chart
</div>
</div>
{/* {(dates?.[0] && dates?.[1]) && (
<div className='date-wrapper-class' style={{
display: "flex",
alignItems: "center",
justifyContent: "flex-end",
gap: "1rem",
flexWrap: "wrap"
}}>
<div className='date-range'>{`${dates[0]?.format('DD/MMM/YYYY') || intialFromDate} - ${dates[1]?.format('DD/MMM/YYYY') || intialToDate}`}</div>
</div>
)} */}
<Suspense fallback={<div>Loading...</div>}>
<DropDowns
className={'item-range-dropdown'}
valueData={page}
@ -352,38 +349,46 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
label={'Products'}
onChangeFunction={async (value) => {
setPage(value);
const FromDate = dates?.[0]?.format('YYYY-MM-DD') || intialFromDate;
const ToDate = dates?.[1]?.format('YYYY-MM-DD') || intialToDate;
await fetchProducts({ AppId, CompId, BranchId, FromDate, ToDate, pageNumber: value });
const FromDate =
dates?.[0]?.format('YYYY-MM-DD') || intialFromDate;
const ToDate =
dates?.[1]?.format('YYYY-MM-DD') || intialToDate;
await fetchProducts({
AppId,
CompId,
BranchId,
FromDate,
ToDate,
pageNumber: value,
});
}}
isOnchanges={page ? true : false}
/>
</Suspense>
</div>
</div>
{((initialDate ? true : (!dates && !dates?.[0] && !dates?.[1])) && intialFromDate && intialToDate) && <div className='date-range'>{`${dayjs(intialFromDate)?.format('DD/MMM/YYYY')} - ${dayjs(intialToDate)?.format('DD/MMM/YYYY')}`}</div>}
<div className='chart-dtls'>
{(initialDate ? true : !dates && !dates?.[0] && !dates?.[1]) &&
intialFromDate &&
intialToDate && (
<div className="date-range">{`${dayjs(intialFromDate)?.format('DD/MMM/YYYY')} - ${dayjs(intialToDate)?.format('DD/MMM/YYYY')}`}</div>
)}
<div className="chart-dtls">
{/* Chart */}
<div className='chart-section'>
<div className="chart-section">
<div className="chart-card" ref={chartWrapperRef}>
{loading && products?.length === 0 ? (
<div className="loading-container">
<div className="loading-spinner"></div>
</div>
) : chartData?.length === 0 ? (
<div className="no-data">
No data available
</div>
<div className="no-data">No data available</div>
) : (
<>
{chartType === 'bar' ? (
<div className='chart-data'>
<div className='chart-axis'>
<div className="chart-data">
<div className="chart-axis">
<div></div>
<div className="axis-points">
{[
@ -391,7 +396,7 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
Math.round(benchmarkValue * 0.25),
Math.round(benchmarkValue * 0.5),
Math.round(benchmarkValue * 0.75),
benchmarkValue
benchmarkValue,
].map((num, i) => (
<div key={i} className="axis-label-wrapper">
<div className="axis-tick"></div>
@ -406,40 +411,52 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
{chartData?.map((item, index) => (
<div
key={index}
className='chart-data-item'
className="chart-data-item"
onMouseEnter={(e) => {
setHoveredItem(item);
setMousePosition({ x: e.clientX, y: e.clientY });
setMousePosition({
x: e.clientX,
y: e.clientY,
});
}}
// style={{}}
onMouseLeave={() => setHoveredItem(null)}
onMouseMove={(e) => setMousePosition({ x: e.clientX, y: e.clientY })}
onMouseMove={(e) =>
setMousePosition({ x: e.clientX, y: e.clientY })
}
>
<div className='chart-data-item-name'><span>{`#${(index + 1) + ((page - 1) * 10)}`}</span><span>{item?.name}</span></div>
<div className='barcharLine' style={{ borderRadius: "1px" }}>
<div className="chart-data-item-name">
<span>{`#${index + 1 + (page - 1) * 10}`}</span>
<span>{item?.name}</span>
</div>
<div
className='barcharLineInside'
className="barcharLine"
style={{ borderRadius: '1px' }}
>
<div
className="barcharLineInside"
style={{
width: `${Math.max(5, (item?.value / benchmarkValue) * 100)}%`,
backgroundColor: COLORS[index % COLORS.length]
backgroundColor:
COLORS[index % COLORS.length],
}}
>
<span className='bar-percentage'>
<span className="bar-percentage">
{/* {((item?.value / Math.max(...chartData.map(d => d?.value))) * 100).toFixed(1)}% */}
</span>
</div>
</div>
<div className='chart-data-item-value'>{item?.value}</div>
<div className="chart-data-item-value">
{item?.value}
</div>
</div>
))}
</>
) : (
<div className='chart-data'>
<div className='chart-data-item'>
<div className='chart-data-item-name'>No Data</div>
<div className='chart-data-item-value'>0</div>
<div className="chart-data">
<div className="chart-data-item">
<div className="chart-data-item-name">No Data</div>
<div className="chart-data-item-value">0</div>
</div>
</div>
)}
@ -449,14 +466,19 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
/* PIE + RIGHT-LEGEND: replace the existing pie rendering */
<div className="pie-with-legend">
<div className="pie-wrapper">
<ResponsiveContainer width="100%" height={responsiveHeight}>
<ResponsiveContainer
width="100%"
height={responsiveHeight}
>
<PieChart>
<Pie
data={chartData}
cx="50%"
cy="50%"
labelLine={false}
label={windowWidth <= 600 ? false : renderPercentInside}
label={
windowWidth <= 600 ? false : renderPercentInside
}
// outerRadius={pieOuterRadius}
innerRadius={pieInnerRadius - 50}
paddingAngle={1}
@ -464,7 +486,10 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
dataKey="value"
>
{chartData.map((entry, index) => (
<Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />
<Cell
key={`cell-${index}`}
fill={COLORS[index % COLORS.length]}
/>
))}
</Pie>
<Tooltip content={<CustomTooltip />} />
@ -474,19 +499,33 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
<div className="pie-legend">
{(() => {
const total = chartData.reduce((s, d) => s + (Number(d?.value || 0)), 0) || 1;
const total =
chartData.reduce(
(s, d) => s + Number(d?.value || 0),
0
) || 1;
return chartData.map((d, i) => {
const color = COLORS[i % COLORS.length];
const value = Number(d?.value || 0);
const percent = total ? ((value / total) * 100) : 0;
const percent = total ? (value / total) * 100 : 0;
return (
<div className="legend-row" key={i}>
<span className="legend-color" style={{ backgroundColor: color }} />
<span
className="legend-color"
style={{ backgroundColor: color }}
/>
<div className="legend-text">
<div className="legend-title">{d?.name}</div>
<div className="legend-sub">
<span className="legend-value">{value}</span>
<span className="legend-percent" style={{ color: color }} >{percent.toFixed(2)}%</span>
<span className="legend-value">
{value}
</span>
<span
className="legend-percent"
style={{ color: color }}
>
{percent.toFixed(2)}%
</span>
</div>
</div>
</div>
@ -495,13 +534,10 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
})()}
</div>
</div>
)}
</>
)}
</div>
</div>
</div>
</div>
@ -512,7 +548,7 @@ const TopSellingProducts = ({ dates = [null, null], products = [], loading = fal
left: mousePosition.x + 10,
top: mousePosition.y - 10,
zIndex: 1000,
pointerEvents: 'none'
pointerEvents: 'none',
}}
>
<CustomTooltip active={true} payload={[{ payload: hoveredItem }]} />

View File

@ -61,6 +61,10 @@
.DeliveryChallan-inputForm .ant-table-content {
width: 70vw;
}
.DeliveryChallan-inputForm .ant-table-thead tr {
background-color: #2c88ee !important;
}
.DeliveryChallan-inputForm {
display: flex;
@ -129,7 +133,6 @@
}
.Deliverychallan-table {
// width: 70px;
.ant-table table {
border-spacing: 0px;
@ -139,3 +142,7 @@
width: 84% !important;
}
}
.product-scan .sales-quotation{
display: flex;
}

View File

@ -62,6 +62,7 @@ import { getPrintSelectionComponentData } from '../../Features/ThemeChange/Theme
import { DCPDFMobilePrint } from './DCPDFMobilePrint.js';
import { isMobile } from 'react-device-detect';
const DeliveryChellanForm = () => {
const { SadminuserAccess } = useAuth();
let SAAccessCommonMaster = SadminuserAccess?.find(

View File

@ -24,6 +24,9 @@
vertical-align: middle;
height: 35px;
}
.ant-table-thead tr {
background-color: #2c88ee !important;
}
}
.dc-to-invoice-payment-mode {
@ -47,3 +50,15 @@
gap: 10px;
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
ref={formRef}
initialValues={editstate}
className="formDivAnt"
className="DCformDivAnt"
onFinish={onFinish}
>
<Form.Item
@ -409,7 +409,7 @@ const DeliveryChallanToInvoiceForm = () => {
/>
</Form.Item>
</>}
<div className="submitButton">
<Form.Item>
<Buttons
buttonText="SUBMIT"
@ -442,7 +442,7 @@ const DeliveryChallanToInvoiceForm = () => {
</div>
</div>
)}
</div>
</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 axios from 'axios';
import { Skeleton } from 'antd';
@ -64,119 +64,7 @@ const KioskBookingPage = () => {
};
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();
}, []);

View File

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

View File

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

View File

@ -65,7 +65,7 @@ const PreferenceList = () => {
const buildInitialValues = () => ({
dashboard: allSettingsMap['dashboard'] === 'Y',
shortcutkeys:allSettingsMap['shortcutkeys']==="Y",
shortcutkeys: allSettingsMap['shortcutkeys'] === 'Y',
autoreceivestock: allSettingsMap['autoreceivestock'] === 'Y',
decimal: allSettingsMap['decimal'] === 'Y',
enabledModules: [
@ -749,7 +749,6 @@ const PreferenceList = () => {
'estimateprintheader',
'Do you want to include a header when printing Estimate bills?'
)}
</div>
<div className="PreferencesBTN">
<Buttons

View File

@ -99,6 +99,14 @@
&:hover {
background-color: #c0cbf8;
}
@media (max-width: 500px) {
border: none !important;
text-decoration: none !important;
font-style: unset !important;
}
}
@media (max-width: 500px) {
overflow: auto;
}
}

View File

@ -537,9 +537,12 @@ const ProductForm = ({ formType }) => {
useEffect(() => {
if (
AppId !== undefined && AppId !== null &&
CompId !== undefined && CompId !== null &&
BranchId !== undefined && BranchId !== null
AppId !== undefined &&
AppId !== null &&
CompId !== undefined &&
CompId !== null &&
BranchId !== undefined &&
BranchId !== null
) {
productFetchData();
fetchRackData();
@ -2136,6 +2139,7 @@ const ProductForm = ({ formType }) => {
initialValues={
editstate || { LowStockCount: 0, ExpiryNotificationDays: 0 }
}
style={{ marginTop: '0' }}
>
<div className="formDivS">
<div className="productinputForm">
@ -2174,26 +2178,12 @@ const ProductForm = ({ formType }) => {
/>
</Form.Item>
</div>
{/* </Form> */}
{/* </div> */}
{/* <div className="formDiv">
<Form
ref={formRef}
className="formDivAnt"
onFinish={onFinish}
initialValues={
editstate || { LowStockCount: 0, ExpiryNotificationDays: 0 }
}
>
<div className="formDivS">
<div className="productinputForm"> */}
{/* dhana */}
<div style={{ display: 'flex' }}>
<div className="ProductMainRowFlex">
{/* <div> */}
<div className="subRowFlex">
<div className="ProSubRowFlex">
<Form.Item
name="ProdName"
rules={[
@ -2629,7 +2619,8 @@ const ProductForm = ({ formType }) => {
<div className="productonlineImg">
{imagedata?.map((item, index) => (
<div
className={`singleimg ${selectedImage === item ? 'selected' : ''
className={`singleimg ${
selectedImage === item ? 'selected' : ''
}`}
key={index}
onClick={() => setSelectedImage(item)}
@ -2977,7 +2968,7 @@ const ProductForm = ({ formType }) => {
<Collapse defaultActiveKey={expandCollapseActive}>
<Panel header="Price" key="1">
<div className="subColumnFlex">
<div className="subRowFlex">
<div className="ProSubRowFlex">
<Form.Item
name="ProdType"
rules={[
@ -3767,7 +3758,7 @@ const ProductForm = ({ formType }) => {
{openVariant && (
<Form ref={formVariantRef}>
<div className="subColumnFlex">
<div className="subRowFlex">
<div className="ProSubRowFlex">
<Form.Item
name="ProdVariantName"
rules={[
@ -4053,7 +4044,7 @@ const ProductForm = ({ formType }) => {
buttonText="Submit"
children={
<Form ref={formCategoryRef} className="formDivAnt">
<div className="subRowFlex">
<div className="ProSubRowFlex">
<div className="subColumnFlex">
<div>
<Form.Item
@ -4116,7 +4107,7 @@ const ProductForm = ({ formType }) => {
handleCancel={handleSubCategory}
children={
<Form ref={formSubCategoryRef} className="formDivAnt">
<div className="subRowFlex">
<div className="ProSubRowFlex">
<div className="subColumnFlex">
<div className="subProdCatData">
<Form.Item
@ -4235,7 +4226,7 @@ const ProductForm = ({ formType }) => {
handleCancel={handleBrand}
children={
<Form ref={formBrandRef} className="formDivAnt">
<div className="subRowFlex">
<div className="ProSubRowFlex">
<div className="subColumnFlex">
<div className="subProdCatData">
<Form.Item
@ -4315,7 +4306,7 @@ const ProductForm = ({ formType }) => {
buttonText="Submit"
children={
<Form ref={formTaxRef} className="formDivAnt">
<div className="subRowFlex">
<div className="ProSubRowFlex">
<Form.Item name="TaxName">
<DropDowns
options={ProdTaxData?.map((option) => ({
@ -4419,7 +4410,7 @@ const ProductForm = ({ formType }) => {
onOk={handleExistsData}
onCancel={handleExistsDataCancel}
>
<div className="subRowFlex">
<div className="ProSubRowFlex">
<div className="qrExistsData">
<img
src={QrcodeExistsData?.[0]?.ProdLogo}

View File

@ -8,7 +8,7 @@ import {
EditFilled,
} from '@ant-design/icons';
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 {
getSession,
@ -134,6 +134,7 @@ const PurchaseOrder = () => {
const [itemsPerPage] = useState(20);
const [searchTerm, setSearchTerm] = useState('');
const [minQty, setMinQty] = useState('');
const [showAllSuppliers, setShowAllSuppliers] = useState(false);
// const filteredData = currentData.filter((item) => {
// const matchesSearch =
@ -153,7 +154,7 @@ const PurchaseOrder = () => {
{
name: 'Purchase Order',
link: `${subDirectory}setting/purchase-order/new`,
link: `${subDirectory}setting/purchase-order`,
},
{
name: 'New',
@ -301,20 +302,21 @@ console.log('hi');
let SelectSupDetails = Supplierdata?.filter(
(item) => item.SuppName?.toLowerCase() === 'self'
); //naresh
setselecSuppDetails(SelectSupDetails?.[0]);
setselecPurSupplierDetails(SelectSupDetails);
formRef.current?.setFieldsValue({ SuppId: SupplierId });
setselecPurSupplier(SupplierId);
getProductDatas(SupplierId);
};
const getSupplierData = async () => {
const getSupplierData = async (Type = null) => {
try {
let Supplier = await dispatch(
getPurchaseSupplierAndWareHouseData({
CompId,
AppId,
BranchId,
Type,
})
).unwrap();
if (Supplier?.statusCode == 1) {
@ -1322,6 +1324,7 @@ console.log('hi');
style={{ paddingTop: '0px', rowGap: '0px' }}
>
<div className="inputForm">
<Form.Item
name="SuppId"
rules={[
@ -1379,10 +1382,29 @@ console.log('hi');
<PlusCircleOutlined onClick={addPurSupplier} />
</Tooltip>
</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 &&
(() => {
(<div className='deliveryaddress'>
{(() => {
const fields = [];
if (selecSuppDetails?.SuppName) {
fields.push(
@ -1456,7 +1478,8 @@ console.log('hi');
</div>
);
})()}
</div>
</div>)
}
<div
className="lowStock-button"
onClick={() => setisLowStockModel(true)}

View File

@ -71,20 +71,6 @@
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 {
text-align: left;
@ -138,11 +124,7 @@
}
}
.summaryContent2 {
.centerDivList {
// width: 50%;
}
}
.custom-table {
Button:disabled,

View File

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

View File

@ -12,25 +12,32 @@ import {
Row,
Col,
Form,
Modal
Modal,
} from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import dayjs from 'dayjs';
import { useDispatch } from 'react-redux';
import { getAllTipAmountSettlementList, getTipAmountSettlementList, postTipSettle } from '../../../Features/TipAmountSettlementList/TipAmountSettlementList';
import {
getAllTipAmountSettlementList,
getTipAmountSettlementList,
postTipSettle,
} from '../../../Features/TipAmountSettlementList/TipAmountSettlementList';
import { getSession } from '../../../Services/Others';
import { WaiterNames } from '../../../Features/Reports/Reports';
import { Messages } from '../../../Components/Notifications/Messages';
import { getEmployeeSettlementList, getEmployeeSettlementListindIvidually, postEmployeeSettle } from '../../../Features/EmployeeSettlement/EmployeeSettlement';
import {
getEmployeeSettlementList,
getEmployeeSettlementListindIvidually,
postEmployeeSettle,
} from '../../../Features/EmployeeSettlement/EmployeeSettlement';
import FormHeader from '../../PageComponents/FormHeader';
import { changeBreadCrumb } from '../../../Features/AppPage/CenterPage';
const { Option } = Select;
const subDirectory = import.meta.env.BASE_URL;
const EmployeeSettlement = () => {
const [form] = Form.useForm();
const dispatch = useDispatch()
const dispatch = useDispatch();
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [loading, setLoading] = useState(false);
const [modalOpen, setModalOpen] = useState(false);
@ -45,21 +52,25 @@ const EmployeeSettlement = () => {
const UserId = getSession('UserId');
const [TableData, setTableData] = useState([]);
const [employeeList, setEmployee] = useState([]); // Add this state for employee dropdown
const checkedTotal = checkedRows.reduce((sum, row) => sum + (Number(row?.IncentiveDetails?.[0]?.IncentiveAmount) || 0), 0);
const checkedTotal = checkedRows.reduce(
(sum, row) =>
sum + (Number(row?.IncentiveDetails?.[0]?.IncentiveAmount) || 0),
0
);
const Paymentstatus = form.getFieldValue('status');
console.log(checkedRowKeys, "checkedRowKeys")
console.log(checkedRowKeys, 'checkedRowKeys');
// const employeeOptions = [
// ...new Set(TableData.map(item => item.Employee))
// ];
const [filteredData, setFilteredData] = useState(TableData);
const items = [
{
name: 'Home',
link: `${subDirectory}app-page/home`,
}, {
},
{
name: 'Incentive Settlement',
link: `${subDirectory}report/EmployeeSettlement`,
},
@ -70,23 +81,20 @@ const EmployeeSettlement = () => {
dataIndex: 'SalesDate',
key: 'SalesDate',
width: 100,
render: (date) => date ? dayjs(date).format('DD/MM/YYYY') : '',
render: (date) => (date ? dayjs(date).format('DD/MM/YYYY') : ''),
},
{
title: 'Tip Date',
dataIndex: 'TipsAmount',
key: 'TipsAmount',
width: 100,
render: (item) => (
<span style={{}}>{item}</span>
),
render: (item) => <span style={{}}>{item}</span>,
},
// Add more columns as needed based on your TipsDetails structure
];
const handleEyeClick = (record) => {
// Assuming TipsDetails is an array inside WaiterDetails[0]
setModalData(record);
setModalOpen(true);
@ -118,26 +126,31 @@ const EmployeeSettlement = () => {
dataIndex: 'TotalSalesAmount',
key: 'TotalSalesAmount',
render: (_, record) => {
const statusMap = { toBe: "N", already: "Y" };
const statusMap = { toBe: 'N', already: 'Y' };
const value = statusMap[form.getFieldValue('status')];
const group = record?.StatusGroups?.find(e => e?.SettledStatus === value);
const group = record?.StatusGroups?.find(
(e) => e?.SettledStatus === value
);
return <span>{group?.TotalSalesAmount ?? 0}</span>;
}
}
,
},
},
{
title: 'IncentiveAmount',
align: 'right',
dataIndex: 'IncentiveAmount',
key: 'IncentiveAmount',
render: (_, record) => {
const statusMap = { toBe: "N", already: "Y" };
const statusMap = { toBe: 'N', already: 'Y' };
const value = statusMap[form.getFieldValue('status')];
const group = record?.StatusGroups?.find(e => e?.SettledStatus === value);
const group = record?.StatusGroups?.find(
(e) => e?.SettledStatus === value
);
return <span>{group?.IncentiveAmount ?? 0}</span>;
}
},
... (Paymentstatus !== "already") ? [{
},
...(Paymentstatus !== 'already'
? [
{
title: 'Settle',
key: 'settle',
width: 80,
@ -150,30 +163,43 @@ const EmployeeSettlement = () => {
<Checkbox
checked={checkedRowKeys.includes(waiterId)}
disabled={isDisabled}
onChange={e => {
onChange={(e) => {
if (e.target.checked) {
setCheckedRowKeys(prev => prev.includes(waiterId) ? prev : [...prev, waiterId]);
setCheckedRows(prev => prev.find(row => row?.EmployeeId === waiterId) ? prev : [...prev, record]);
setCheckedRowKeys((prev) =>
prev.includes(waiterId) ? prev : [...prev, waiterId]
);
setCheckedRows((prev) =>
prev.find((row) => row?.EmployeeId === waiterId)
? prev
: [...prev, record]
);
} else {
setCheckedRowKeys(prev => prev.filter(key => key !== waiterId));
setCheckedRows(prev => prev.filter(row => row?.EmployeeId !== waiterId));
setCheckedRowKeys((prev) =>
prev.filter((key) => key !== waiterId)
);
setCheckedRows((prev) =>
prev.filter((row) => row?.EmployeeId !== waiterId)
);
}
}}
/>
);
},
}] : [{}]
},
]
: [{}]),
];
// Handle select all checkboxes
const handleSelectAll = e => {
const handleSelectAll = (e) => {
if (e.target.checked) {
const allWaiterIds = groupByEmployeeAndStatus(TableData)
.map(emp => ({
.map((emp) => ({
...emp,
StatusGroups: emp.StatusGroups.filter(g => g.SettledStatus === "N")
StatusGroups: emp.StatusGroups.filter((g) => g.SettledStatus === 'N'),
}))
.filter(emp => emp.StatusGroups.length > 0)?.map(row => row?.EmployeeId);
.filter((emp) => emp.StatusGroups.length > 0)
?.map((row) => row?.EmployeeId);
setCheckedRowKeys(allWaiterIds);
setCheckedRows(TableData.slice());
} else {
@ -202,10 +228,10 @@ const EmployeeSettlement = () => {
};
let response = await dispatch(getEmployeeSettlementList(data)).unwrap();
if (response?.data?.statusCode === 1) {
setTableData(response?.data?.data?.EmployeeDetails)
setTableData(response?.data?.data?.EmployeeDetails);
}
// handle response as needed
}
};
const fetchData = async () => {
let data = {
activeStatus: 'A',
@ -217,18 +243,13 @@ const EmployeeSettlement = () => {
if (response?.data?.statusCode === 1) {
setEmployee(response?.data?.data);
}
}
};
const handleReset = () => {
form.resetFields();
setSelectedRowKeys([]);
setFilteredData(TableData);
setTableData([])
setTableData([]);
};
const onFinish = async (values) => {
@ -238,37 +259,41 @@ const EmployeeSettlement = () => {
BranchId,
AppId,
...restValues,
...(Employee && Employee !== "all" && Employee !== "undefined" ? { employeeId: Employee } : {}),
...(Employee && Employee !== 'all' && Employee !== 'undefined'
? { employeeId: Employee }
: {}),
};
let response
Employee !== "all" ? response = await dispatch(getEmployeeSettlementListindIvidually(data)).unwrap() : response = await dispatch(getEmployeeSettlementList(data)).unwrap()
let response;
Employee !== 'all'
? (response = await dispatch(
getEmployeeSettlementListindIvidually(data)
).unwrap())
: (response = await dispatch(getEmployeeSettlementList(data)).unwrap());
if (response?.data?.statusCode === 1) {
setTableData(response?.data?.data?.EmployeeDetails)
setTableData(response?.data?.data?.EmployeeDetails);
const StatusValue = form.getFieldValue('status') === 'toBe' ? "N" : "Y";
const StatusValue = form.getFieldValue('status') === 'toBe' ? 'N' : 'Y';
const employees = response?.data?.data?.EmployeeDetails ?? [];
const data = employees.some(e =>
e?.IncentiveDetails?.some(a => a?.SettledStatus === StatusValue && a?.IncentiveAmount > 0)
const data = employees.some((e) =>
e?.IncentiveDetails?.some(
(a) => a?.SettledStatus === StatusValue && a?.IncentiveAmount > 0
)
);
if (data) {
setMessageType('success');
setMessageData(response?.data?.response);
}
} else {
setMessageType('error');
setMessageData(response?.data?.response);
setTableData([])
setTableData([]);
}
};
const handleCheckedSubmit = async () => {
const today = dayjs();
const statusMap = { toBe: "N", already: "Y" };
const statusMap = { toBe: 'N', already: 'Y' };
const value = statusMap[form.getFieldValue('status')]; // "N" or "Y"
const postData = {
@ -277,31 +302,31 @@ const EmployeeSettlement = () => {
AppId,
CreatedBy: UserId,
EmployeeDetails: checkedRows.map((item) => {
const group = item?.StatusGroups?.find(g => g?.SettledStatus === value);
const group = item?.StatusGroups?.find(
(g) => g?.SettledStatus === value
);
return {
SettlementAmount: group?.IncentiveAmount ?? 0,
EmployeeId: item?.EmployeeId,
SettledPeriodDate: formatToYYYYMMDD(today),
IncentiveDetails: group?.items ?? []
IncentiveDetails: group?.items ?? [],
};
})
}),
};
console.log(postData)
console.log(postData);
let response = await dispatch(postEmployeeSettle(postData))?.unwrap();
if (response?.data?.statusCode === 1) {
setMessageType('success');
setMessageData(response?.data?.response);
handleReset()
setCheckedRows([])
handleReset();
setCheckedRows([]);
} else {
setMessageType('error');
setMessageData(response?.data?.response);
handleReset()
handleReset();
}
};
function formatToYYYYMMDD(dateString) {
@ -331,7 +356,7 @@ const EmployeeSettlement = () => {
// }, [form, TableData]);
function groupByEmployeeAndStatus(tableData) {
return tableData
.map(emp => {
.map((emp) => {
const grouped = emp.IncentiveDetails.reduce((acc, curr) => {
if ((curr.IncentiveAmount || 0) === 0) {
return acc; // skip this detail entirely
@ -343,7 +368,7 @@ const EmployeeSettlement = () => {
SettledStatus: status,
TotalSalesAmount: 0,
IncentiveAmount: 0,
items: []
items: [],
};
}
acc[status].TotalSalesAmount += curr.TotalSalesAmount || 0;
@ -355,16 +380,14 @@ const EmployeeSettlement = () => {
return {
EmployeeId: emp?.EmployeeId,
EmployeeName: emp.EmployeeName,
StatusGroups: Object.values(grouped)
StatusGroups: Object.values(grouped),
};
})
.filter(emp => emp.StatusGroups.length > 0); // remove employees with no valid items
.filter((emp) => emp.StatusGroups.length > 0); // remove employees with no valid items
}
let dataaaa = groupByEmployeeAndStatus(TableData)
console.log(dataaaa, "dataaaa")
let dataaaa = groupByEmployeeAndStatus(TableData);
console.log(dataaaa, 'dataaaa');
useEffect(() => {
setCheckedRowKeys([]);
setCheckedRows([]);
@ -376,51 +399,38 @@ const EmployeeSettlement = () => {
setFilteredData([]);
};
return (
<div style={{
<div
style={{
padding: '0',
width: "100%", height: "90%", overflow: "scroll"
}}>
<div style={{ marginBottom: "10px" }}>
<FormHeader title={"Incentive"} />
width: '99%',
height: '90%',
overflow: 'scroll',
}}
>
<div style={{ marginBottom: '10px' }}>
<FormHeader title={'Incentive'} />
</div>
<Messages
messageType={messageType}
messageData={messageData}
onComplete={onComplete}
/>
<Card
// title="Incentive"
style={{
boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
borderRadius: '8px',
height: "100%"
}}
>
<Card
size="small"
style={{
marginBottom: '20px',
backgroundColor: '#fafafa',
border: '1px solid #d9d9d9',
width: "72vw",
}}
>
<Form
form={form}
layout="inline"
onFinish={onFinish}
initialValues={{
Employee: 'all',
status: 'toBe'
status: 'toBe',
}}
>
<Row style={{ rowGap: "1rem", flexWrap: "wrap" }} wrap={true} gutter={16} >
<Row
style={{ rowGap: '1rem', flexWrap: 'wrap' }}
wrap={true}
gutter={16}
>
<Col>
<Form.Item
name="Employee"
@ -430,9 +440,12 @@ const EmployeeSettlement = () => {
>
<Select style={{ width: 180 }}>
<Option value="all">All</Option>
{employeeList.map(emp => (
{employeeList.map((emp) => (
<Option key={emp.UniqueId} value={emp.UniqueId}>
{emp.EmpFirstName ? emp.EmpFirstName + (emp.EmpLastName ? ' ' + emp.EmpLastName : '') : emp.MobileNo}
{emp.EmpFirstName
? emp.EmpFirstName +
(emp.EmpLastName ? ' ' + emp.EmpLastName : '')
: emp.MobileNo}
</Option>
))}
</Select>
@ -492,50 +505,67 @@ const EmployeeSettlement = () => {
>
Search
</Button>
<Button onClick={handleReset}>
Cancel
</Button>
<Button onClick={handleReset}>Cancel</Button>
</Space>
</Form.Item>
</Col>
</Row>
</Form>
</Card>
{/* Data Table */}
{Paymentstatus !== "already" && <div style={{ marginBottom: 8, float: "right" }}>
{Paymentstatus !== 'already' && (
<div style={{ marginBottom: 8, float: 'right' }}>
<Checkbox
indeterminate={checkedRowKeys?.length > 0 && checkedRowKeys?.length < TableData?.length}
checked={TableData?.length > 0 && checkedRowKeys?.length === TableData?.length}
indeterminate={
checkedRowKeys?.length > 0 &&
checkedRowKeys?.length < TableData?.length
}
checked={
TableData?.length > 0 &&
checkedRowKeys?.length === TableData?.length
}
onChange={handleSelectAll}
>
Select All
</Checkbox>
</div>}
</div>
)}
<div className="reportTable">
<Table
columns={columns}
dataSource={form.getFieldValue('status') == "toBe" ? groupByEmployeeAndStatus(TableData)
.map(emp => ({
dataSource={
form.getFieldValue('status') == 'toBe'
? groupByEmployeeAndStatus(TableData)
.map((emp) => ({
...emp,
StatusGroups: emp.StatusGroups.filter(g => g.SettledStatus === "N")
StatusGroups: emp.StatusGroups.filter(
(g) => g.SettledStatus === 'N'
),
}))
.filter(emp => emp.StatusGroups.length > 0) : groupByEmployeeAndStatus(TableData).map(emp => ({
.filter((emp) => emp.StatusGroups.length > 0)
: groupByEmployeeAndStatus(TableData)
.map((emp) => ({
...emp,
StatusGroups: emp.StatusGroups.filter(g => g.SettledStatus === "Y")
StatusGroups: emp.StatusGroups.filter(
(g) => g.SettledStatus === 'Y'
),
}))
.filter(emp => emp.StatusGroups.length > 0)
.filter((emp) => emp.StatusGroups.length > 0)
}
loading={loading}
scroll={{ x: 'max-content' }}
size="middle"
style={{ backgroundColor: 'white' }}
/>
</div>
{/* Button to submit checked rows */}
<div className='incenbtivepayBTN' style={{ marginTop: 16, float: "right" }}>
<div style={{ display: "flex", gap: "1rem" }}>
<div
className="incenbtivepayBTN"
style={{ marginTop: 16, float: 'right' }}
>
<div style={{ display: 'flex', gap: '1rem' }}>
{/* {checkedRowKeys.length !== 0 && (
<input
disabled
@ -571,19 +601,20 @@ const EmployeeSettlement = () => {
{/* Selected Rows Info */}
{selectedRowKeys.length > 0 && (
<div style={{
<div
style={{
marginTop: '16px',
padding: '8px 16px',
backgroundColor: '#e6f7ff',
border: '1px solid #91d5ff',
borderRadius: '4px'
}}>
borderRadius: '4px',
}}
>
<span style={{ color: '#1890ff' }}>
Selected {selectedRowKeys.length} items
</span>
</div>
)}
</Card>
</div>
);
};

View File

@ -6,7 +6,8 @@ import { getProductStockDetails } from "../../../Features/PurchaseOrder/Purchase
import { dateFormatChange, ExtractDateFormate, getSession } from "../../../Services/Others";
import { useDispatch } from "react-redux";
import { changeBreadCrumb } from "../../../Features/AppPage/CenterPage";
// import "./PurchaseOrderReport.css";
import "./PurchaseOrderReport.scss";
const subDirectory = import.meta.env.BASE_URL;
const PurchaseOrderReport = () => {
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,6 +21,7 @@ import { getSession, validateSafeInput } from '../../Services/Others';
import { postshift, putshift } from '../../Features/ShiftMaster/ShiftMaster.js';
import './ShiftMaster.scss';
import { FaPlus } from 'react-icons/fa6';
import "../../Styles/OverAllStyle/OverAllStyle.scss";
const subDirectory = import.meta.env.BASE_URL;

View File

@ -254,8 +254,128 @@
.stockAdjustListMaster {
.primary_Button {
width: 290px !important;
.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;
}
}
.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>
<FormHeader title={'Stock Adjustment'} />
</div>
<div className="searchAddDiv">
<div className="formSearch">
<Search
placeholder="Search"
@ -211,7 +211,7 @@ const StockadjustmentList = () => {
onSearchChange={onSearchChange}
/>
</div>
</div>
<Buttons
buttonText={'Stock Adjustment'}
handleSubmit={() => handelAddButton()}

View File

@ -13,7 +13,7 @@ import {
PlusCircleOutlined,
SearchOutlined,
} from '@ant-design/icons';
import { Form, Tooltip, Table, Input, AutoComplete, Switch } from 'antd';
import { Form, Tooltip, Table, Input, AutoComplete, Switch, Checkbox } from 'antd';
import { IoAddCircleSharp } from 'react-icons/io5';
import { InputField } from '../../Components/Forms/InputField.jsx';
import Buttons from '../../Components/Forms/Buttons.jsx';
@ -268,6 +268,7 @@ const StockForm = ({ formType }) => {
// const [filteredPurchaseData, setFilteredPurchaseData] = useState([]);
const [searchValue, setSearchValue] = useState('');
const isSearching = Boolean(searchValue?.trim());
const [showAllSuppliers, setShowAllSuppliers] = useState(false);
const SelInvoiceAmount = useMemo(() => {
const total = PurchaseData?.reduce(
@ -324,7 +325,7 @@ const StockForm = ({ formType }) => {
deliveryPerformance();
discountLevel();
qualityofSupp();
getSuplaierApi({});
getSuplaierApi({ Type: null });
if (formType == 'add') {
formRef.current?.setFieldsValue({ SuppInvoiceDate: new Date().toJSON() });
@ -416,9 +417,9 @@ const StockForm = ({ formType }) => {
: setSelectedSupplierName(true);
};
const getSuplaierApi = async ({ dataReturn = false }) => {
const getSuplaierApi = async ({ dataReturn = false, Type = null }) => {
const response = await dispatch(
getPurchaseSupplierAndWareHouseData({ CompId, AppId, BranchId })
getPurchaseSupplierAndWareHouseData({ CompId, AppId, BranchId, Type })
).unwrap();
if (response?.statusCode === 1) {
@ -3381,6 +3382,8 @@ const StockForm = ({ formType }) => {
</FloatLabel>
</Form.Item>
)}
<div className={`${orderType ? 'div-flex' : ''}`}>
<Form.Item
name="CustSuppId"
rules={[
@ -3430,8 +3433,32 @@ const StockForm = ({ formType }) => {
/>
</Tooltip>
</Form.Item>
{orderType && <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);
setInitialLoad(true);
getSuplaierApi({ Type: checked ? 'Y' : null });
}}
>
All
</Checkbox>
</span>
</Tooltip>
</Form.Item>
}
</div>
{!selectedSupplierName && (
<RadioGrpButton
content={[
{ value: 'own', label: 'Own' },
{ value: 'paid', label: 'With paid' },
@ -3443,6 +3470,7 @@ const StockForm = ({ formType }) => {
/>
)}
<div className="pe-inward-date">
<label className="required">Inward Date</label>

View File

@ -241,7 +241,6 @@ const StockList = () => {
if (Response?.data?.statusCode === 1) {
return Response?.data?.data;
} else {
return [];
}
};
@ -295,7 +294,6 @@ const StockList = () => {
setpage(1);
return Response?.data?.data;
} else {
return [];
}
}
@ -991,7 +989,6 @@ const StockList = () => {
(e) => `${e.ProdName} (${e.Size} ${e.UomName})`
);
const SupplierNames = SupplierData?.map((e) => e.SuppName);
const TaxDatas = TaxData.map((e) => e.TaxIdName);
@ -1006,9 +1003,6 @@ const StockList = () => {
const InwardDtlIds = Varientdata?.map((e) => e.InwardDtlId);
const StockProductId = Varientdata?.map((e) => e.ProdId);
const onFinish = async () => {
const template = barcodeTemplateDetails?.find(
(find) => find.SessionName === dropdownValue
@ -1164,7 +1158,7 @@ const StockList = () => {
? countData?.length
: 0
: data?.[0]?.TotalCount;
console.log(debouncedSearchText, countData, data, "kkkk", countOfProduct)
console.log(debouncedSearchText, countData, data, 'kkkk', countOfProduct);
return (
<div className="userPageTable">
<div className="userPageContent">
@ -1178,9 +1172,10 @@ const StockList = () => {
<FormHeader title={'Product Receipt'} />
</div>
<div
className="searchAddDiv"
style={{ justifyContent: 'flex-start' }}
><Tooltip title="Search using Invoice No,Supp Name">
className="StocklistsearchAddDiv"
style={{ justifyContent: 'flex-start', flexWrap: 'wrap' }}
>
<Tooltip title="Search using Invoice No,Supp Name">
<div className="formSearch" style={{ Width: '200px' }}>
<Search
placeholder="Search by Invoice No"
@ -1393,7 +1388,9 @@ const StockList = () => {
generateQRCodeCopy={(code) =>
generateQRCodeCopy(QrandbarcodeDatas, code)
}
generateCodeImage={(code, codeType = 'Q') => generateCodeImage(code, codeType, QrandbarcodeDatas)}
generateCodeImage={(code, codeType = 'Q') =>
generateCodeImage(code, codeType, QrandbarcodeDatas)
}
imageTagBarcodeAndQR={imageTagBarcodeAndQR}
dropdownValue={dropdownValue}
barcodeTemplateDetails={barcodeTemplateDetails}

View File

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

View File

@ -275,3 +275,26 @@
color: #1292ee;
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 { useDispatch } from 'react-redux';
import {
@ -29,20 +29,14 @@ const ProtectedRoutes = ({ routesConfig }) => {
const UserId = getSession('UserId');
const sessionId = getSession('SessionId');
const [accessCheckComplete, setAccessCheckComplete] = useState(false);
const[AppPreference,setAppPreference]= useState([]);
const kioskPath = `${subDirectory}kiosksales`; // or your actual path
useEffect(() => {
getApplicationPreference()
},[])
getApplicationPreference();
}, []);
const getApplicationPreference = async () => {
const response = await dispatch(getCommonAppPreference(AppId)).unwrap();
if (response?.data?.statusCode === 1) {
setAppPreference(response?.data?.data)
}
}
await dispatch(getCommonAppPreference(AppId)).unwrap();
};
const getEmpAccess = async () => {
let data = {
@ -90,7 +84,7 @@ const ProtectedRoutes = ({ routesConfig }) => {
?.SettingDtlDetails?.some(
(e) => e.SettingIdName === 'Estimation' && e.SettingValue === 'Y'
);
return SettingValueData, EstimateValueData;
return (SettingValueData, EstimateValueData);
}
}
};
@ -123,10 +117,10 @@ const ProtectedRoutes = ({ routesConfig }) => {
const hasAdvance = pricingData?.some(
(item) => item.PricingName === 'Premium'
);
console.log(pricingData,"pricingDatapricingData")
const hasProOrAdvance =
hasAdvance || pricingData.some((item) => item.PricingName === 'Customized');
return hasAdvance, hasProOrAdvance;
hasAdvance ||
pricingData.some((item) => item.PricingName === 'Customized');
return (hasAdvance, hasProOrAdvance);
} catch (error) {
console.error('Error fetching pricing name:', error);
}

View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,7 @@
}
.required:after {
content: ' *';
content: " *";
color: #ff4d4f;
}
@ -96,7 +96,6 @@
}
}
.image-preview__content {
background-color: #f5f5f5;
margin: 1rem;
@ -144,8 +143,6 @@
&:active {
background-color: #5e5e5e;
}
}
.padding-less-modal {
@ -153,3 +150,17 @@
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 {
width: 65px;
background-color: #dbd1d1;
border: 0.5px solid gray;
border: 0.5px solid #808080;
border-radius: 3px;
font-size: 10px;
font-weight: 600;
@ -74,7 +74,7 @@
.samplereportTableButton {
justify-content: flex-end;
margin: 1rem 0;
margin: 10px 0;
align-items: center;
display: flex;
width: 100%;
@ -754,6 +754,7 @@
.StorekitchenlistTable {
scrollbar-width: thin;
padding-right: 8px;
margin-top: 10px;
@media (max-width: 600px) {
}
@ -1538,6 +1539,9 @@ table {
padding: 3px 14px 4px 11px !important;
text-align: center;
}
.ant-table-thead tr {
background-color: #2c88ee !important;
}
}
.PriChangeUpper {
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 {
display: flex;
flex-wrap: wrap;
gap: 6px;
& .field-DropDown {
width: 200px !important;
@ -124,6 +125,24 @@
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 {
display: flex;
@ -469,10 +488,12 @@
flex-wrap: wrap;
justify-content: flex-start;
padding-bottom: 0;
flex-direction: row !important;
@media (max-width: 768px) {
gap: 10px;
align-items: flex-start;
justify-content: space-between;
}
}
@ -488,7 +509,8 @@
}
.productFormproductImg {
width: 350px;
width: 250px;
height: 190px;
align-items: center;
}
@ -510,3 +532,13 @@
bottom: 8px;
}
}
.ProductMainRowFlex {
display: flex;
align-items: flex-start;
gap: 1rem;
width: 100%;
@media (max-width: 768px) {
flex-direction: column;
}
}

View File

@ -18,6 +18,9 @@
overflow: auto !important;
scrollbar-width: thin;
}
.ant-table-thead tr {
background-color: #2c88ee !important;
}
}
.purchaseQuoaDetails {
@ -102,7 +105,6 @@
}
.Quotation-table {
// width: 70px;
.ant-table table {
border-spacing: 0px;
@ -122,7 +124,7 @@
border-radius: 8px;
font-size: 14px;
font-weight: 500;
font-family: 'Poppins', sans-serif;
font-family: "Poppins", sans-serif;
padding: 6px 12px;
border: 1px solid #d1d1d1;
}

View File

@ -146,7 +146,7 @@
background-color: var(--PRIMARY_BUTTON_BG_COLOR) !important;
margin-bottom: 2px;
font-size: 16px;
font-family: 'Gilroy';
font-family: "Gilroy";
color: #ffffff;
border-radius: 5px;
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 {
background-color: #bad4f9;
}
@ -585,29 +540,107 @@
font-weight: 600;
}
// .ItemWiseReport-table {
// overflow-y: auto;
// scrollbar-width: unset;
// scrollbar-color: #c1c1c1 transparent;
// }
.custom-table {
width: 100%;
border-collapse: collapse;
border: 1px solid #909090;
font-family: "Poppins", sans-serif;
// .ItemWiseReport-table::-webkit-scrollbar {
// width: 25px;
// }
> thead {
position: sticky;
top: -1px;
}
}
// .ItemWiseReport-table::-webkit-scrollbar-track {
// background: #f0f0f0;
// border-radius: 10px;
// }
.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;
}
// .ItemWiseReport-table::-webkit-scrollbar-thumb {
// background-color: #c1c1c1;
// border-radius: 10px;
// border: 6px solid transparent;
// background-clip: content-box;
// transition: background-color 0.3s ease;
// }
.centerDivList {
display: flex;
flex-direction: column;
gap: 4px;
// width: 100%;
// height: 43vh;
overflow: scroll;
padding-bottom: 2rem;
}
// .ItemWiseReport-table::-webkit-scrollbar-thumb:hover {
// background-color: #a0a0a0;
// }
.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

@ -833,9 +833,36 @@
}
@media (max-width: 500px) {
.tdProductrecipt,
.proReceiptTD {
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;
}
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
/* background: #8F1E78; */
}
.samplereportTable {
overflow: auto;
width: 80vw;
@ -178,8 +173,6 @@ a {
/* Position the tooltip */
position: absolute;
z-index: 1;
}
.navbar-top {
@ -331,3 +324,7 @@ a {
.ant-table table {
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 { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
@ -7,23 +6,20 @@ import './Fonts/Gilroy/stylesheet.css';
import './index.css';
import AppRoutes from './App.jsx';
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';
const queryClient = new QueryClient();
ReactDOM.createRoot(document.getElementById('root')).render(
<QueryClientProvider client={queryClient}>
<Provider store={store}>
<BrowserRouter>
<AuthProvider>
<AppRoutes />
</AuthProvider>
</BrowserRouter>
</Provider>
{process.env.NODE_ENV == "development" && (
{process.env.NODE_ENV == 'development' && (
<ReactQueryDevtools initialIsOpen={false} />
)}
</QueryClientProvider>

View File

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