2026-01-27 18:27:29 +05:30
|
|
|
|
import React, {
|
|
|
|
|
|
useState,
|
|
|
|
|
|
useRef,
|
|
|
|
|
|
useEffect,
|
|
|
|
|
|
useCallback,
|
|
|
|
|
|
useContext,
|
|
|
|
|
|
} from 'react';
|
|
|
|
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
|
|
|
|
import {
|
|
|
|
|
|
Button,
|
|
|
|
|
|
Form,
|
|
|
|
|
|
Input,
|
|
|
|
|
|
Table,
|
|
|
|
|
|
Space,
|
|
|
|
|
|
Select,
|
|
|
|
|
|
Checkbox,
|
|
|
|
|
|
AutoComplete,
|
|
|
|
|
|
Switch,
|
|
|
|
|
|
Tooltip,
|
|
|
|
|
|
Popconfirm,
|
|
|
|
|
|
} from 'antd';
|
|
|
|
|
|
import { TiDelete } from 'react-icons/ti';
|
|
|
|
|
|
import { CiCalculator1 } from 'react-icons/ci';
|
|
|
|
|
|
import { Tables } from '../../../../Components/Tables/Table';
|
|
|
|
|
|
import { DefaultModal } from '../../../../Components/Modal/DefaultModal';
|
|
|
|
|
|
import { DeleteFilled } from '@ant-design/icons';
|
|
|
|
|
|
import { Radio } from 'antd';
|
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
|
import FormHeader from '../../../PageComponents/FormHeader';
|
|
|
|
|
|
import {
|
|
|
|
|
|
changeCustomerDelete,
|
|
|
|
|
|
changeCustomerID,
|
|
|
|
|
|
changeReorderHoldDetails,
|
|
|
|
|
|
ChangeWSProduct,
|
|
|
|
|
|
getSelectedFavItems,
|
|
|
|
|
|
GlobalProductCategorie,
|
|
|
|
|
|
getLayoutproductCard,
|
|
|
|
|
|
GlobalProductSubCategorie,
|
|
|
|
|
|
getAllCustomer,
|
|
|
|
|
|
getCardDataWithoutSub,
|
|
|
|
|
|
getCardDataWithoutSubmodule,
|
|
|
|
|
|
changeSelectedCustId,
|
|
|
|
|
|
changeSelectedOption,
|
|
|
|
|
|
changeHoldOrderDtl,
|
|
|
|
|
|
changeCombofocus,
|
|
|
|
|
|
ChangeSelectedCustDisable,
|
|
|
|
|
|
GlobalReorderHoldDetails,
|
|
|
|
|
|
GlobalBookingType,
|
|
|
|
|
|
GlobalEstimateBooking,
|
|
|
|
|
|
GlobalSelProdWiseEst,
|
|
|
|
|
|
changeSelProdWiseEst,
|
|
|
|
|
|
changeEstimateBooking,
|
|
|
|
|
|
changeOrderType,
|
|
|
|
|
|
GlobalBookingTypeBoth,
|
|
|
|
|
|
changeReorderProductDetails,
|
|
|
|
|
|
ChangeOverAllDiscEstimate,
|
|
|
|
|
|
ChangeOverAllDiscSales,
|
|
|
|
|
|
PreferenceData,
|
|
|
|
|
|
ChangeComboCarddata,
|
|
|
|
|
|
getPreferenceData,
|
|
|
|
|
|
getCustomerForHold,
|
|
|
|
|
|
PostBlockSlots,
|
|
|
|
|
|
} from '../../../../Features/BookingScreen/BookingData/BookingData';
|
|
|
|
|
|
import { getTemplateData } from '../../../../Features/ThemeChange/ThemeChange';
|
|
|
|
|
|
import { DropDowns } from '../../../../Components/Forms/DropDown.jsx';
|
|
|
|
|
|
import { ArrowRightOutlined, CloseSquareFilled } from '@ant-design/icons';
|
|
|
|
|
|
import { InputField } from '../../../../Components/Forms/InputField';
|
|
|
|
|
|
import { Messages } from '../../../../Components/Notifications/Messages';
|
|
|
|
|
|
import Buttons from '../../../../Components/Forms/Buttons';
|
|
|
|
|
|
import ProductForm from '../../../../Pages/BookingScreen/Forms/QuickAdd/QuickAdd.jsx';
|
|
|
|
|
|
import {
|
|
|
|
|
|
GlobalAddCustomerDetails,
|
|
|
|
|
|
getAddCustomerDetails,
|
|
|
|
|
|
postAddCustomerDetails,
|
|
|
|
|
|
triggerCustomerRefresh,
|
|
|
|
|
|
} from '../../../../Features/BookingScreen/Customer/addCustomer';
|
|
|
|
|
|
import {
|
|
|
|
|
|
extractLastNumberOrderId,
|
|
|
|
|
|
getSession,
|
|
|
|
|
|
validateSafeInput,
|
|
|
|
|
|
} from '../../../../Services/Others';
|
|
|
|
|
|
import { getExtTabledata } from '../../../../Features/ExteraCharges/ExtraCharges';
|
|
|
|
|
|
import {
|
|
|
|
|
|
globalExtraChargesType,
|
|
|
|
|
|
ChangeTotalAmount,
|
|
|
|
|
|
globalExtraTotalAmount,
|
|
|
|
|
|
} from '../../../../Features/ExteraCharges/ExtraCharges.js';
|
|
|
|
|
|
import WeightScaleComp from '../../../../Components/WeightScale/weightScale.jsx';
|
|
|
|
|
|
import {
|
|
|
|
|
|
gettinghold,
|
|
|
|
|
|
puttinghold,
|
|
|
|
|
|
changeholddata,
|
|
|
|
|
|
} from '../../../../Features/BookingScreen/HoldOption/HoldOption.js';
|
|
|
|
|
|
import {
|
|
|
|
|
|
changeOrderCardDetails,
|
|
|
|
|
|
GlobalOrderCardDetails,
|
|
|
|
|
|
getProductsearch,
|
|
|
|
|
|
} from '../../../../Features/BookingScreen/BookingData/BookingData';
|
|
|
|
|
|
import { AiOutlineDownCircle, AiOutlineUpCircle } from 'react-icons/ai';
|
|
|
|
|
|
import '../../../../Styles/BookingScreen/Components/BookingFunctionality/FeaturesFunctionalities.scss';
|
|
|
|
|
|
import {
|
|
|
|
|
|
IoCloseSharp,
|
|
|
|
|
|
IoPersonAddSharp,
|
|
|
|
|
|
IoSearchOutline,
|
|
|
|
|
|
} from 'react-icons/io5';
|
|
|
|
|
|
import { GrCheckboxSelected } from 'react-icons/gr';
|
|
|
|
|
|
import { BiCustomize } from 'react-icons/bi';
|
|
|
|
|
|
import { DatePicProd } from '../../../../Components/Forms/DatePickerProduct.jsx';
|
|
|
|
|
|
import {
|
|
|
|
|
|
GlobalPreOrderList,
|
|
|
|
|
|
GlobalpreOrderOpen,
|
|
|
|
|
|
} from '../../../../Features/BookingScreen/PreOrder/PreOrder.js';
|
|
|
|
|
|
import Imageupload from '../../../../Components/Forms/Upload.jsx';
|
|
|
|
|
|
import { useApplyOfferto_CardDetail } from '../UtillComponents/BSNavBarOffer/BSNavBarOffer_CustomHooks.jsx';
|
|
|
|
|
|
import { getCombolist } from '../../../../Features/ComboMaster/ComboMaster.js';
|
|
|
|
|
|
import {
|
|
|
|
|
|
ChangeFullFreeProductList,
|
|
|
|
|
|
changeFullOfferAppliedProducts,
|
|
|
|
|
|
changeLoyaltyConsumedQuantities,
|
|
|
|
|
|
} from '../../../../Features/Offer/Offernew/BookingOffernew.js';
|
|
|
|
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
|
|
import { ApplicationPreferences } from '../../../../Features/BrachLogin/BranchLogin.js';
|
|
|
|
|
|
import { useDateStore } from '../../../../Features/BookingScreen/BookingData/DateStore.js';
|
|
|
|
|
|
import { FaEdit, FaMapMarkedAlt, FaTrash } from 'react-icons/fa';
|
|
|
|
|
|
import { MdHome, MdLocationOn } from 'react-icons/md';
|
|
|
|
|
|
import { RadioGrpButton } from '../../../../Components/Forms/RadioGroup.jsx';
|
|
|
|
|
|
|
|
|
|
|
|
const FeaturesFunctionalities = (props) => {
|
2026-02-04 19:16:18 +05:30
|
|
|
|
const { closeModal = () => {} } = props;
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const applyOffer = useApplyOfferto_CardDetail();
|
|
|
|
|
|
const EditableContext = React.createContext(null);
|
|
|
|
|
|
const EditableContext1 = React.createContext(null);
|
|
|
|
|
|
const CompId = getSession('CompId');
|
|
|
|
|
|
const BranchId = getSession('BranchId');
|
|
|
|
|
|
const AppId = getSession('AppId');
|
|
|
|
|
|
const UserId = getSession('UserId');
|
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
|
const formRef = useRef();
|
|
|
|
|
|
const formWsRef = useRef();
|
|
|
|
|
|
const formRefExtraCharges = useRef();
|
|
|
|
|
|
const ExtraChargesType = useSelector(globalExtraChargesType);
|
|
|
|
|
|
const GlobalExtraCharge = useSelector(globalExtraTotalAmount);
|
|
|
|
|
|
const ReorderHoldDetails = useSelector(GlobalReorderHoldDetails);
|
|
|
|
|
|
const BookingType = useSelector(GlobalBookingType);
|
|
|
|
|
|
const BookingTypeBoth = useSelector(GlobalBookingTypeBoth);
|
|
|
|
|
|
const [dataSource, setDataSource] = useState(
|
|
|
|
|
|
ExtraChargesType.filter((item) => item.ActiveStatus == 'A')
|
|
|
|
|
|
);
|
|
|
|
|
|
const [dataSource1, setDataSource1] = useState(
|
|
|
|
|
|
ExtraChargesType.filter((item) => item.ActiveStatus == 'A')
|
|
|
|
|
|
);
|
|
|
|
|
|
const [ImageUrl, setImageUrl] = useState(null);
|
|
|
|
|
|
const preOrder = useSelector(GlobalpreOrderOpen);
|
|
|
|
|
|
const PreOrderList = useSelector(GlobalPreOrderList);
|
|
|
|
|
|
const withoutPreOrderList = useSelector(GlobalOrderCardDetails);
|
|
|
|
|
|
const PreferenceDatas = useSelector(PreferenceData);
|
|
|
|
|
|
console.log(PreferenceDatas, 'PreferenceDatas');
|
|
|
|
|
|
const CartOrderDetails = preOrder ? PreOrderList : withoutPreOrderList;
|
|
|
|
|
|
const [InitialOutStandingType, setInitialOutStandingType] = useState(null);
|
|
|
|
|
|
const [amountType, setAmountType] = useState('C');
|
|
|
|
|
|
|
|
|
|
|
|
const templateData = useSelector(getTemplateData);
|
|
|
|
|
|
const prodCat = useSelector(GlobalProductCategorie);
|
|
|
|
|
|
const ProdSubCat = useSelector(GlobalProductSubCategorie);
|
|
|
|
|
|
|
|
|
|
|
|
const GlobalAddCustomerDetails1 = useSelector(GlobalAddCustomerDetails);
|
|
|
|
|
|
const GlobEstBooking = useSelector(GlobalEstimateBooking);
|
|
|
|
|
|
const GlobProdwisedata = useSelector(GlobalSelProdWiseEst);
|
|
|
|
|
|
|
|
|
|
|
|
const [hold, setHold] = useState(props.modalOpen);
|
|
|
|
|
|
const [WeightScale, setWeightScale] = useState(props.WeightScale);
|
|
|
|
|
|
const [WeightScale2, setWeightScale2] = useState(true);
|
|
|
|
|
|
|
|
|
|
|
|
const [CusDetails, setCusDetails] = useState(false);
|
|
|
|
|
|
const [zipCodeData, setZipCodeData] = useState(false);
|
|
|
|
|
|
const [messageType, setMessageType] = useState(null);
|
|
|
|
|
|
const [messageData, setMessageData] = useState(null);
|
|
|
|
|
|
const [totalAmount, setTotalAmount] = useState(0);
|
|
|
|
|
|
const [Tabledata, setTabledata] = useState();
|
|
|
|
|
|
const [extdata, setExtdata] = useState([]);
|
|
|
|
|
|
const [extdata1, setExtdata1] = useState([]);
|
|
|
|
|
|
const [SelectData, setSelectData] = useState([]);
|
|
|
|
|
|
|
|
|
|
|
|
const [SelectData2, setSelectData2] = useState([]);
|
|
|
|
|
|
const [oldUserId, setoldUserId] = useState(null);
|
|
|
|
|
|
const [CalcProductRate, setCalcProductRate] = useState();
|
|
|
|
|
|
const [CalcProductWeight, setCalcProductWeight] = useState();
|
|
|
|
|
|
|
|
|
|
|
|
const [WSProductList, setWSProductList] = useState([]);
|
|
|
|
|
|
const [ProductValue, setProductValue] = useState();
|
|
|
|
|
|
const [WSProductDataSource, setWSProductDataSource] = useState([]);
|
|
|
|
|
|
const [WSProductRate, setWSProductRate] = useState(0);
|
|
|
|
|
|
const [WSProductWeight, setWSProductWeight] = useState(0);
|
|
|
|
|
|
const [WSTotalPrice, setWSTotalPrice] = useState(0);
|
|
|
|
|
|
const [WSSelectedStockDetail, setWSSelectedStockDetail] = useState([]);
|
|
|
|
|
|
const [WSSelectedOnekgProd, setWSSelectedOnekgProd] = useState([]);
|
|
|
|
|
|
const [CalcPriceWeightOpen, setCalcPriceWeightOpen] = useState(false);
|
|
|
|
|
|
const [wsport, setwsport] = useState(null);
|
|
|
|
|
|
|
|
|
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
|
|
|
|
const [Searchopen, setSearchopen] = useState(false);
|
|
|
|
|
|
|
|
|
|
|
|
const [gender, setGender] = useState('M');
|
|
|
|
|
|
const [isSearching, setIsSearching] = useState(false);
|
|
|
|
|
|
const [suggestionClicked, setSuggestionClicked] = useState(false);
|
|
|
|
|
|
const [selectSearchDefaultValue, setselectSearchDefaultValue] = useState('');
|
|
|
|
|
|
const [TableName, setTableName] = useState([]);
|
|
|
|
|
|
const [Checkbox1, setCheckbox1] = useState(true);
|
|
|
|
|
|
const [selectedProduct, setselectedProduct] = useState();
|
|
|
|
|
|
|
|
|
|
|
|
const [inputValue, setInputValue] = useState('');
|
|
|
|
|
|
const [suggestions, setSuggestions] = useState(['prematix', 'pr']);
|
|
|
|
|
|
const [searchResults, setSearchResults] = useState([]);
|
|
|
|
|
|
const [selectedSearchValue, setselectedSearchValue] = useState('CustMobile');
|
|
|
|
|
|
|
|
|
|
|
|
const [selectedValue, setSelectedValue] = useState(null);
|
|
|
|
|
|
const [offerType, setofferType] = useState('P');
|
|
|
|
|
|
const [OfferValue, setOfferValue] = useState(null);
|
|
|
|
|
|
const [Maritalstatus, setMaritalstatus] = useState('N');
|
|
|
|
|
|
const [allowDecimal, setAllowDecimal] = useState(false);
|
|
|
|
|
|
const [DobDate, setDobDate] = useState();
|
|
|
|
|
|
const [SpouseDobDate, setSpouseDobDate] = useState();
|
|
|
|
|
|
const [anniversaryDate, setanniversaryDate] = useState();
|
|
|
|
|
|
const [customerAddress, setCustomerAddress] = useState();
|
|
|
|
|
|
const appPreferences = useSelector(ApplicationPreferences);
|
|
|
|
|
|
const { selectedDate } = useDateStore();
|
|
|
|
|
|
const salespagefields = appPreferences?.find(
|
|
|
|
|
|
(pref) => pref?.PreferredCatName === 'Sales Page Fields'
|
|
|
|
|
|
)?.PreferenceCatDetails;
|
|
|
|
|
|
const AvailableDate = salespagefields?.find(
|
|
|
|
|
|
(type) =>
|
|
|
|
|
|
type?.PreferredSubCatName?.toLowerCase() === 'available date' &&
|
|
|
|
|
|
type?.PreferredStatus === 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
const commonModulePreference = appPreferences?.find(
|
|
|
|
|
|
(preference) => preference?.PreferredCatName === 'Common Module'
|
|
|
|
|
|
)?.PreferenceCatDetails;
|
|
|
|
|
|
const sportsAppPreference = commonModulePreference?.find(
|
|
|
|
|
|
(preference) =>
|
|
|
|
|
|
preference?.PreferredSubCatName === 'SportsApp' &&
|
|
|
|
|
|
preference?.PreferredStatus === 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
const [addressPreview, setAddressPreview] = useState([]);
|
|
|
|
|
|
const [addressesList, setAddressesList] = useState([]);
|
|
|
|
|
|
const [addressTypes, setAddressTypes] = useState({});
|
|
|
|
|
|
const [editingIndex, setEditingIndex] = useState(null);
|
|
|
|
|
|
|
|
|
|
|
|
const yesNoOptions = [
|
|
|
|
|
|
{ value: 'A', label: 'Active' },
|
|
|
|
|
|
{ value: 'D', label: 'Deactive' },
|
|
|
|
|
|
];
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
fetchdata();
|
|
|
|
|
|
getPreference();
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
getPreference();
|
|
|
|
|
|
}, [PreferenceDatas]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
hold ? dispatch(changeCombofocus(true)) : dispatch(changeCombofocus(false));
|
|
|
|
|
|
}, [hold]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
WeightScale
|
|
|
|
|
|
? dispatch(changeCombofocus(true))
|
|
|
|
|
|
: dispatch(changeCombofocus(false));
|
|
|
|
|
|
}, [WeightScale]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
WeightScale2
|
|
|
|
|
|
? dispatch(changeCombofocus(true))
|
|
|
|
|
|
: dispatch(changeCombofocus(false));
|
|
|
|
|
|
}, [WeightScale2]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (preOrder) {
|
|
|
|
|
|
if (GlobalExtraCharge?.length > 0) {
|
|
|
|
|
|
if (
|
|
|
|
|
|
GlobalExtraCharge?.[0]?.ProdId === null ||
|
|
|
|
|
|
(GlobalExtraCharge?.[0]?.ProdId === '' &&
|
|
|
|
|
|
GlobalExtraCharge?.[0]?.InwardDtlId === '')
|
|
|
|
|
|
) {
|
|
|
|
|
|
setCheckbox1(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setCheckbox1(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setCheckbox1(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [preOrder]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (props?.mobileNo && String(props?.mobileNo)?.length === 10) {
|
|
|
|
|
|
handleSelectSuggestion(String(props?.mobileNo));
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [props?.mobileNo]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
const { addcustomer, ExtraCharges, QuickAdd, reprint } = props;
|
|
|
|
|
|
|
|
|
|
|
|
if (addcustomer || ExtraCharges || QuickAdd || reprint) {
|
|
|
|
|
|
dispatch(changeCombofocus(true));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(changeCombofocus(false));
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [props.addcustomer, props.ExtraCharges, props.QuickAdd, props.reprint]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.Zip === undefined &&
|
|
|
|
|
|
setZipCodeData(false);
|
|
|
|
|
|
}, [inputValue]);
|
|
|
|
|
|
|
|
|
|
|
|
let CustIdForDynamicChange = ` ${' '}${suggestions?.[0]?.CustId?.match(/(.+)-\d+$/)?.[1]}-`;
|
|
|
|
|
|
const statusFormatters = (index) => {
|
|
|
|
|
|
const rows = [...TableName];
|
|
|
|
|
|
const remove = rows?.filter(
|
|
|
|
|
|
(e) => !(e.ProdName === index?.ProdName && e.UniqueId === index?.UniqueId)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
setTableName(remove);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const fetchdata = async () => {
|
|
|
|
|
|
let res = await dispatch(
|
|
|
|
|
|
getAllCustomer({ CompId: CompId, AppId: AppId, branchId: BranchId })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if (res?.data?.statusCode == 1) {
|
|
|
|
|
|
setSuggestions(res?.data?.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleSelectSuggestion = (suggestion) => {
|
|
|
|
|
|
checkExistingCustomer(
|
|
|
|
|
|
suggestions.filter((a) => a[selectedSearchValue] === suggestion)?.[0]
|
|
|
|
|
|
?.CustMobile || suggestion
|
|
|
|
|
|
);
|
|
|
|
|
|
setInputValue(
|
|
|
|
|
|
suggestions.filter((a) => a[selectedSearchValue] === suggestion)?.[0]
|
|
|
|
|
|
?.CustMobile || suggestion
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const getPreference = async () => {
|
|
|
|
|
|
// const data = { AppId: AppId, CompId: CompId, BranchId: BranchId };
|
|
|
|
|
|
// const { data: res } = await dispatch(getPreferenceData(data)).unwrap() // comment for karthiga
|
|
|
|
|
|
const decimalSetting = PreferenceDatas?.[0]?.SettingDtlDetails?.find(
|
|
|
|
|
|
(setting) =>
|
|
|
|
|
|
setting?.SettingIdName?.toLowerCase() === 'decimal' &&
|
|
|
|
|
|
setting?.SettingValue === 'Y'
|
|
|
|
|
|
);
|
|
|
|
|
|
if (decimalSetting) {
|
|
|
|
|
|
setAllowDecimal(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
function safeRound(amountStr) {
|
|
|
|
|
|
if (amountStr == null) return allowDecimal ? '0.00' : '0';
|
|
|
|
|
|
|
|
|
|
|
|
const cleaned = String(amountStr).replace(/[^0-9.-]+/g, '');
|
|
|
|
|
|
const num = Number(cleaned);
|
|
|
|
|
|
|
|
|
|
|
|
if (isNaN(num)) return allowDecimal ? '0.00' : '0';
|
|
|
|
|
|
|
|
|
|
|
|
return allowDecimal ? num.toFixed(2) : Math.round(num).toString();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const options = suggestions
|
|
|
|
|
|
? suggestions
|
2026-02-04 19:16:18 +05:30
|
|
|
|
?.filter((item) =>
|
|
|
|
|
|
selectedSearchValue === 'CustName' ? item.CustName !== null : item
|
|
|
|
|
|
)
|
|
|
|
|
|
.map((item) => ({
|
|
|
|
|
|
value: item?.CustMobile,
|
|
|
|
|
|
label:
|
|
|
|
|
|
selectedSearchValue === 'CustMobile'
|
|
|
|
|
|
? `${item?.CustMobile} - ${item?.CustName ? item?.CustName : ''} ${item?.CustName ? ' - ' : ''} ${'Id:' + item?.CustId?.match(/-(\d+)$/)?.[1]}`
|
|
|
|
|
|
: selectedSearchValue === 'CustId'
|
|
|
|
|
|
? `${'Id:' + item?.CustId?.match(/-(\d+)$/)?.[1]}${item?.CustName ? ' - ' : ''} ${item?.CustName ? item?.CustName : ''} - ${item?.CustMobile}`
|
|
|
|
|
|
: selectedSearchValue === 'CustName' &&
|
|
|
|
|
|
item?.CustName !== null &&
|
|
|
|
|
|
`${item?.CustName ? item?.CustName : ''} ${item?.CustName ? ' - ' : ''} ${item?.CustMobile} - ${'Id:' + item?.CustId?.match(/-(\d+)$/)?.[1]}`,
|
|
|
|
|
|
CustMobile: item?.CustMobile,
|
|
|
|
|
|
CustId: item?.CustId?.match(/-(\d+)$/)?.[1],
|
|
|
|
|
|
CustName: item?.CustName,
|
|
|
|
|
|
}))
|
|
|
|
|
|
: GlobalAddCustomerDetails1?.map((item) => ({
|
|
|
|
|
|
value: item.CustMobile,
|
|
|
|
|
|
label: `${item?.CustName} ${item?.CustMobile}`,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
CustMobile: item?.CustMobile,
|
2026-02-04 19:16:18 +05:30
|
|
|
|
CustId: item?.CustId,
|
2026-01-27 18:27:29 +05:30
|
|
|
|
CustName: item?.CustName,
|
2026-02-04 19:16:18 +05:30
|
|
|
|
}));
|
2026-01-27 18:27:29 +05:30
|
|
|
|
const handleYesOrNoChange = (value) => {
|
|
|
|
|
|
setSelectedValue(value);
|
|
|
|
|
|
formRef.current?.setFieldsValue({ OfferActiveStatus: value });
|
|
|
|
|
|
};
|
|
|
|
|
|
const columnshold = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Order.Id',
|
|
|
|
|
|
key: 'productDetails',
|
|
|
|
|
|
dataIndex: 'productDetails',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
const productDetails = record?.productDetails;
|
|
|
|
|
|
const Combodtl =
|
|
|
|
|
|
record?.productDetails?.[0]?.comboDtl?.[0]?.ComboInwardDetails?.[0]
|
|
|
|
|
|
?.ComboDetails;
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
HoldPutfun(productDetails, record, Combodtl);
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
render: (productDetails, record) => (
|
|
|
|
|
|
<a
|
|
|
|
|
|
style={{ color: 'black' }}
|
|
|
|
|
|
onClick={() => HoldPutfun(productDetails, record)}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record?.OrderId &&
|
|
|
|
|
|
extractLastNumberOrderId(record?.OrderId, record?.FYStatus)}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Order Type',
|
|
|
|
|
|
key: 'productDetails',
|
|
|
|
|
|
dataIndex: 'productDetails',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
const productDetails = record?.productDetails;
|
|
|
|
|
|
const Combodtl =
|
|
|
|
|
|
record?.productDetails?.[0]?.comboDtl?.[0]?.ComboInwardDetails?.[0]
|
|
|
|
|
|
?.ComboDetails;
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
HoldPutfun(productDetails, record, Combodtl);
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
render: (productDetails, record) => (
|
|
|
|
|
|
<a
|
|
|
|
|
|
style={{ color: 'black' }}
|
|
|
|
|
|
onClick={() => HoldPutfun(productDetails, record)}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record?.OrderType == 'E' ? 'Estimate' : 'Sales'}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
...(sportsAppPreference
|
|
|
|
|
|
? [
|
2026-02-04 19:16:18 +05:30
|
|
|
|
{
|
|
|
|
|
|
title: 'Subcategory',
|
|
|
|
|
|
key: 'productDetails',
|
|
|
|
|
|
dataIndex: 'productDetails',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
const productDetails = record?.productDetails;
|
|
|
|
|
|
const Combodtl =
|
|
|
|
|
|
record?.productDetails?.[0]?.comboDtl?.[0]
|
|
|
|
|
|
?.ComboInwardDetails?.[0]?.ComboDetails;
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
HoldPutfun(productDetails, record, Combodtl);
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
render: (productDetails, record) => (
|
|
|
|
|
|
<a
|
|
|
|
|
|
style={{ color: 'black' }}
|
|
|
|
|
|
onClick={() => HoldPutfun(productDetails, record)}
|
|
|
|
|
|
>
|
|
|
|
|
|
{record?.productDetails?.[0]?.ProdSubCatName}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
2026-01-27 18:27:29 +05:30
|
|
|
|
},
|
2026-02-04 19:16:18 +05:30
|
|
|
|
]
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: []),
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Orders',
|
|
|
|
|
|
key: 'productDetails',
|
|
|
|
|
|
dataIndex: 'productDetails',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
const productDetails = record?.productDetails;
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
HoldPutfun(productDetails, record);
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
render: (productDetails, record) => (
|
|
|
|
|
|
<a
|
|
|
|
|
|
style={{ color: 'black' }}
|
|
|
|
|
|
onClick={() => HoldPutfun(productDetails, record)}
|
|
|
|
|
|
>
|
|
|
|
|
|
{productDetails?.length > 0 &&
|
|
|
|
|
|
productDetails
|
|
|
|
|
|
?.map(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item.ProdName +
|
|
|
|
|
|
('(' + item.Size + '' + ' ' + item.UomName) +
|
|
|
|
|
|
')'
|
|
|
|
|
|
)
|
|
|
|
|
|
.join(',')}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Customer Name/Mobile.No/Cust.Id',
|
|
|
|
|
|
key: 'sno',
|
|
|
|
|
|
dataIndex: 'CustSuppName',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
const productDetails = record?.productDetails;
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
HoldPutfun(productDetails, record);
|
|
|
|
|
|
},
|
|
|
|
|
|
style: { cursor: 'pointer' },
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
render: (text, record) =>
|
|
|
|
|
|
record?.CustSuppName || record?.CustSuppMobileNo || '-',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Delete',
|
|
|
|
|
|
key: 'sno',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
render: (record) => (
|
|
|
|
|
|
<a className="BSC1Payment-HoldModel-delete">
|
|
|
|
|
|
<TiDelete
|
|
|
|
|
|
style={{ cursor: 'pointer' }}
|
|
|
|
|
|
onClick={() => statusFormatter(record)}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
const WSStockColumns = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Stock Quantity',
|
|
|
|
|
|
dataIndex: 'BalanceQty',
|
|
|
|
|
|
key: 'BalanceQty',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
GetProductRate(record);
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
render: (text, row) => (
|
|
|
|
|
|
<a style={{ color: 'black', width: '200px' }}>
|
|
|
|
|
|
{row.BalanceQty ? row.BalanceQty : 'Stock Not Maintained'}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Amount',
|
|
|
|
|
|
dataIndex: 'SellPrice',
|
|
|
|
|
|
key: 'SellPrice',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
onCell: (record) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
onClick: () => {
|
|
|
|
|
|
GetProductRate(record);
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setWeightScale(props.WeightScale);
|
|
|
|
|
|
}, [props.WeightScale]);
|
|
|
|
|
|
// useEffect(() => {
|
|
|
|
|
|
// if (!props.addcustomer) {
|
|
|
|
|
|
// formRef.current?.resetFields();
|
|
|
|
|
|
// setZipCodeData(false);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }, [props.addcustomer]);
|
|
|
|
|
|
const ExtTabledata = async () => {
|
|
|
|
|
|
const data = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
};
|
|
|
|
|
|
await dispatch(getExtTabledata(data)).unwrap();
|
|
|
|
|
|
};
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setDataSource(
|
|
|
|
|
|
ExtraChargesType.filter(
|
|
|
|
|
|
(item) => item.ActiveStatus == 'A' && item?.PackageAvilable != 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
setDataSource1(
|
|
|
|
|
|
ExtraChargesType.filter(
|
|
|
|
|
|
(item) => item.ActiveStatus == 'A' && item?.PackageAvilable != 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, [ExtraChargesType]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (props.ExtraCharges == true) {
|
|
|
|
|
|
if (ExtraChargesType?.length === 0) {
|
|
|
|
|
|
ExtTabledata();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [props.ExtraCharges]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setTotalAmount(
|
|
|
|
|
|
extdata.reduce((sum, item) => sum + item.QTY * item.Price, 0)
|
|
|
|
|
|
);
|
|
|
|
|
|
}, [extdata]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setselectedProduct();
|
|
|
|
|
|
|
|
|
|
|
|
if (GlobalExtraCharge?.length === 0) {
|
|
|
|
|
|
setTableName([]);
|
|
|
|
|
|
setExtdata([]);
|
|
|
|
|
|
setSelectData([]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [Checkbox1]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (GlobalExtraCharge?.length > 0) {
|
|
|
|
|
|
if (
|
|
|
|
|
|
GlobalExtraCharge?.[0]?.ProdId === null ||
|
|
|
|
|
|
(GlobalExtraCharge?.[0]?.ProdId === '' &&
|
|
|
|
|
|
GlobalExtraCharge?.[0]?.InwardDtlId === '')
|
|
|
|
|
|
) {
|
|
|
|
|
|
let globalexdata = GlobalExtraCharge?.map((item) => {
|
|
|
|
|
|
let mappedItem = {
|
|
|
|
|
|
UniqueId: item?.ExtraChargeId,
|
|
|
|
|
|
QTY: item?.OrderQty,
|
|
|
|
|
|
Price: item?.OrderRate,
|
|
|
|
|
|
ProdId: null,
|
|
|
|
|
|
InwardDtlId: null,
|
|
|
|
|
|
ExtraChargeType: item?.ExtraChargeType,
|
|
|
|
|
|
TotalAmt: item?.TotalAmt,
|
|
|
|
|
|
TaxAmt: item?.TaxAmt,
|
|
|
|
|
|
ProdName: item?.ProdName,
|
|
|
|
|
|
TaxId: item?.TaxId,
|
|
|
|
|
|
TaxPercentage: item?.TaxPercentage,
|
|
|
|
|
|
SinglePc: null,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Add SalesId only if it exists
|
|
|
|
|
|
if (item?.SalesId) {
|
|
|
|
|
|
mappedItem['SalesId'] = item?.SalesId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return mappedItem;
|
|
|
|
|
|
});
|
|
|
|
|
|
setExtdata(globalexdata);
|
|
|
|
|
|
setSelectData(globalexdata?.map((item) => item.UniqueId));
|
|
|
|
|
|
let mergedArray = mergearrays(dataSource, globalexdata);
|
|
|
|
|
|
setDataSource(mergedArray);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let globalexdata = GlobalExtraCharge?.map((item) => {
|
|
|
|
|
|
let mappedItem = {
|
|
|
|
|
|
UniqueId: item?.ExtraChargeId,
|
|
|
|
|
|
QTY: item?.OrderQty,
|
|
|
|
|
|
Price: item?.OrderRate * item?.OrderQty,
|
|
|
|
|
|
ProdId: item?.ProdId,
|
|
|
|
|
|
InwardDtlId: item?.InwardDtlId,
|
|
|
|
|
|
ProdName: item?.ProdName,
|
|
|
|
|
|
ExtraChargeType: item?.ExtraChargeType,
|
|
|
|
|
|
TotalAmt: item?.TotalAmt,
|
|
|
|
|
|
TaxAmt: item?.TaxAmt,
|
|
|
|
|
|
BookingTypeName: item?.BookingTypeName,
|
|
|
|
|
|
BookingType: item?.BookingType,
|
|
|
|
|
|
TaxId: item?.TaxId,
|
|
|
|
|
|
TaxPercentage: item?.TaxPercentage,
|
|
|
|
|
|
SinglePc: item?.SinglePc,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Add SalesId only if it exists
|
|
|
|
|
|
if (item?.SalesId) {
|
|
|
|
|
|
mappedItem['SalesId'] = item?.SalesId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return mappedItem;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
setCheckbox1(false);
|
|
|
|
|
|
setTableName(globalexdata);
|
|
|
|
|
|
setSelectData([]);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setTableName([]);
|
|
|
|
|
|
setExtdata([]);
|
|
|
|
|
|
setSelectData([]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [GlobalExtraCharge]);
|
|
|
|
|
|
function mergearrays(array1, array2) {
|
|
|
|
|
|
let mergedArray = [];
|
|
|
|
|
|
|
|
|
|
|
|
// Merge array1 into mergedArray
|
|
|
|
|
|
mergedArray = array1.slice();
|
|
|
|
|
|
|
|
|
|
|
|
// Merge array2 into mergedArray, ensuring unique objects based on UniqueId
|
|
|
|
|
|
for (let item2 of array2) {
|
|
|
|
|
|
let existingItemIndex = mergedArray.findIndex(
|
|
|
|
|
|
(item) => item.UniqueId === item2.UniqueId
|
|
|
|
|
|
);
|
|
|
|
|
|
if (existingItemIndex !== -1) {
|
|
|
|
|
|
// If item2 exists in mergedArray, update its properties
|
|
|
|
|
|
mergedArray[existingItemIndex] = {
|
|
|
|
|
|
...mergedArray[existingItemIndex],
|
|
|
|
|
|
...item2,
|
|
|
|
|
|
};
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// If item2 doesn't exist in mergedArray, add it
|
|
|
|
|
|
mergedArray.push(item2);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return mergedArray;
|
|
|
|
|
|
}
|
|
|
|
|
|
useEffect(
|
|
|
|
|
|
() => {
|
|
|
|
|
|
if (WSProductWeight > 0 && WSProductRate > 0) {
|
|
|
|
|
|
WSTotalCalculation();
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
[WSProductWeight],
|
|
|
|
|
|
[WSProductRate]
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const addeddata = (record) => {
|
|
|
|
|
|
if (SelectData.includes(record.UniqueId)) {
|
|
|
|
|
|
if (totalAmount > 0) {
|
|
|
|
|
|
setTotalAmount(totalAmount - record.Price * parseInt(record.QTY));
|
|
|
|
|
|
const remove = extdata?.filter(
|
|
|
|
|
|
(item) => item.UniqueId !== record.UniqueId
|
|
|
|
|
|
);
|
|
|
|
|
|
setExtdata(remove);
|
|
|
|
|
|
setSelectData(SelectData?.filter((a) => a != record.UniqueId));
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setSelectData([...SelectData, record.UniqueId]);
|
|
|
|
|
|
setTotalAmount(totalAmount + record.Price * parseInt(record.QTY));
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
ExtraChargeType: record.ExtraChargeType,
|
|
|
|
|
|
Price: record.Price,
|
|
|
|
|
|
QTY: parseInt(record.QTY),
|
|
|
|
|
|
UniqueId: record.UniqueId,
|
|
|
|
|
|
TotalAmt: parseFloat(
|
|
|
|
|
|
formatAmount(parseInt(record.Price) * parseInt(record.QTY))
|
|
|
|
|
|
),
|
|
|
|
|
|
TaxAmt: formatAmount(
|
|
|
|
|
|
((record.Price * record.TaxPercentage) /
|
|
|
|
|
|
(100 + record.TaxPercentage)) *
|
2026-02-04 19:16:18 +05:30
|
|
|
|
record.QTY
|
2026-01-27 18:27:29 +05:30
|
|
|
|
),
|
|
|
|
|
|
TaxId: record.TaxId,
|
|
|
|
|
|
TaxPercentage: record.TaxPercentage,
|
|
|
|
|
|
};
|
|
|
|
|
|
setExtdata([data, ...extdata]);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const formatAmount = (value) => {
|
|
|
|
|
|
return allowDecimal
|
|
|
|
|
|
? parseFloat(value || 0).toFixed(2)
|
|
|
|
|
|
: Math.round(value || 0);
|
|
|
|
|
|
};
|
|
|
|
|
|
const addeddata1 = (record) => {
|
|
|
|
|
|
// Check if the UniqueId of the record is included in SelectData2
|
|
|
|
|
|
if (SelectData2.includes(record.UniqueId)) {
|
|
|
|
|
|
// If included, remove the record from extdata1 and update SelectData2
|
|
|
|
|
|
const remove = extdata1?.filter(
|
|
|
|
|
|
(item) => item.UniqueId !== record.UniqueId
|
|
|
|
|
|
);
|
|
|
|
|
|
setExtdata1(remove);
|
|
|
|
|
|
setSelectData2(SelectData2?.filter((a) => a !== record.UniqueId));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// If not included, check for duplicates in extdata1 based on ExtraChargeType and UniqueId
|
|
|
|
|
|
const isDuplicate = TableName?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item.InwardDtlId +
|
2026-02-04 19:16:18 +05:30
|
|
|
|
' ' +
|
|
|
|
|
|
item.BookingTypeName +
|
|
|
|
|
|
' ' +
|
|
|
|
|
|
item.SinglePc ===
|
|
|
|
|
|
selectedProduct && item.UniqueId === record.UniqueId
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if (!isDuplicate) {
|
|
|
|
|
|
// If not a duplicate, add the UniqueId to SelectData2 and construct data object
|
|
|
|
|
|
setSelectData2([...SelectData2, record.UniqueId]);
|
|
|
|
|
|
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
ExtraChargeType: record.ExtraChargeType,
|
|
|
|
|
|
Price: record.Price,
|
|
|
|
|
|
QTY: parseInt(record.QTY),
|
|
|
|
|
|
UniqueId: record.UniqueId,
|
|
|
|
|
|
TotalAmt: parseFloat(
|
|
|
|
|
|
formatAmount(parseInt(record.Price) * parseInt(record.QTY))
|
|
|
|
|
|
),
|
|
|
|
|
|
TaxAmt: formatAmount(
|
|
|
|
|
|
((record.Price * record.TaxPercentage) /
|
|
|
|
|
|
(100 + record.TaxPercentage)) *
|
2026-02-04 19:16:18 +05:30
|
|
|
|
record.QTY
|
2026-01-27 18:27:29 +05:30
|
|
|
|
),
|
|
|
|
|
|
TaxId: record?.TaxId,
|
|
|
|
|
|
TaxPercentage: record.TaxPercentage,
|
|
|
|
|
|
SinglePc: record?.SinglePc,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Add the constructed data object to extdata1
|
|
|
|
|
|
setExtdata1([data, ...extdata1]);
|
|
|
|
|
|
}
|
|
|
|
|
|
// If it's a duplicate, you can handle it accordingly (e.g., show a message)
|
|
|
|
|
|
else {
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
setMessageData('Data Already Exists');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const ProfuctName = CartOrderDetails?.find(
|
|
|
|
|
|
(e) =>
|
|
|
|
|
|
e.InwardDtlId + ' ' + e.BookingTypeName + ' ' + e.SinglePc ==
|
|
|
|
|
|
selectedProduct
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const producttName = ProfuctName?.ProdName;
|
|
|
|
|
|
|
|
|
|
|
|
const globalamount1 = () => {
|
|
|
|
|
|
if (selectedProduct) {
|
|
|
|
|
|
setSelectData2([]);
|
|
|
|
|
|
setExtdata1([]);
|
|
|
|
|
|
|
|
|
|
|
|
const newArray = extdata1?.map((obj) => ({
|
|
|
|
|
|
...obj,
|
|
|
|
|
|
ProdName:
|
|
|
|
|
|
ProfuctName?.ProdVariantName !== 'Variant 1'
|
|
|
|
|
|
? `${ProfuctName?.ProdName} (${ProfuctName.Size} ${ProfuctName.UomName}) (${ProfuctName.ProdVariantName}${BookingTypeBoth ? ` (${ProfuctName?.BookingTypeName})` : ''})`
|
|
|
|
|
|
: `${ProfuctName?.ProdName} (${ProfuctName.Size} ${ProfuctName.UomName}) ${BookingTypeBoth ? ` (${ProfuctName?.BookingTypeName})` : ''}`,
|
|
|
|
|
|
InwardDtlId: ProfuctName?.InwardDtlId,
|
|
|
|
|
|
ProdId: ProfuctName?.ProdId,
|
|
|
|
|
|
BookingTypeName: ProfuctName?.BookingTypeName,
|
|
|
|
|
|
BookingType: ProfuctName?.BookingType,
|
|
|
|
|
|
// booking type no came from global booking
|
|
|
|
|
|
SinglePc: ProfuctName?.SinglePc,
|
|
|
|
|
|
}));
|
|
|
|
|
|
setTableName([...TableName, ...newArray]);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const globalamount = async (data) => {
|
|
|
|
|
|
setSelectData2([]);
|
|
|
|
|
|
setTableName([]);
|
|
|
|
|
|
props.ExtraChargesCancle();
|
|
|
|
|
|
const modifiedData = data?.map(
|
|
|
|
|
|
({ UniqueId, ExtraChargeType, Price, QTY, ...rest }) => ({
|
|
|
|
|
|
...rest,
|
|
|
|
|
|
ExtraChargeId: UniqueId,
|
|
|
|
|
|
ExtraChargeType: ExtraChargeType,
|
|
|
|
|
|
ProdId: null,
|
|
|
|
|
|
InwardDtlId: '',
|
|
|
|
|
|
OrderRate: Price,
|
|
|
|
|
|
OrderQty: QTY,
|
|
|
|
|
|
OrderType:
|
|
|
|
|
|
GlobEstBooking === 'OvrAllEst' ? 'E' : preOrder ? 'PRE' : 'S',
|
|
|
|
|
|
SinglePc: null,
|
|
|
|
|
|
BookingTypeName: rest?.BookingTypeName,
|
|
|
|
|
|
BookingType: rest?.BookingType,
|
|
|
|
|
|
})
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
await dispatch(ChangeTotalAmount(modifiedData));
|
|
|
|
|
|
};
|
|
|
|
|
|
const globalamount2 = async (data) => {
|
|
|
|
|
|
setTotalAmount(0);
|
|
|
|
|
|
props.ExtraChargesCancle();
|
|
|
|
|
|
setDataSource(
|
|
|
|
|
|
ExtraChargesType.filter(
|
|
|
|
|
|
(item) => item.ActiveStatus == 'A' && item?.PackageAvilable != 'Y'
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const modifiedData = data?.map(
|
|
|
|
|
|
({ UniqueId, ExtraChargeType, QTY, Price, ProdName, ...item }) => ({
|
|
|
|
|
|
...item,
|
|
|
|
|
|
SinglePc: item?.SinglePc ? item?.SinglePc : 'N',
|
|
|
|
|
|
ExtraChargeId: UniqueId,
|
|
|
|
|
|
ExtraChargeType: ExtraChargeType,
|
|
|
|
|
|
OrderQty: QTY,
|
|
|
|
|
|
OrderRate: Price / QTY,
|
|
|
|
|
|
ProdName: ProdName,
|
|
|
|
|
|
OrderType:
|
|
|
|
|
|
GlobEstBooking === 'OvrAllEst'
|
|
|
|
|
|
? 'E'
|
|
|
|
|
|
: GlobEstBooking === 'ParEst'
|
|
|
|
|
|
? GlobProdwisedata?.includes(item?.InwardDtlId)
|
|
|
|
|
|
? 'E'
|
|
|
|
|
|
: 'S'
|
|
|
|
|
|
: preOrder
|
|
|
|
|
|
? 'PRE'
|
|
|
|
|
|
: 'S',
|
|
|
|
|
|
Size: item?.Size,
|
|
|
|
|
|
UomName: item?.UomName,
|
|
|
|
|
|
ProdVariantName: item?.ProdVariantName,
|
|
|
|
|
|
BookingTypeName: item?.BookingTypeName,
|
|
|
|
|
|
BookingType: item?.BookingType,
|
|
|
|
|
|
})
|
|
|
|
|
|
);
|
|
|
|
|
|
await dispatch(ChangeTotalAmount(modifiedData));
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const EditableRow = ({ index, ...props }) => {
|
|
|
|
|
|
const [form] = Form.useForm();
|
|
|
|
|
|
return (
|
|
|
|
|
|
<Form form={form} component={false}>
|
|
|
|
|
|
<EditableContext.Provider value={form}>
|
|
|
|
|
|
<tr {...props} />
|
|
|
|
|
|
</EditableContext.Provider>
|
|
|
|
|
|
</Form>
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
const EditableRow1 = ({ index, ...props }) => {
|
|
|
|
|
|
const [form] = Form.useForm();
|
|
|
|
|
|
return (
|
|
|
|
|
|
<Form form={form} component={false}>
|
|
|
|
|
|
<EditableContext1.Provider value={form}>
|
|
|
|
|
|
<tr {...props} />
|
|
|
|
|
|
</EditableContext1.Provider>
|
|
|
|
|
|
</Form>
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onChangeProduct = (e) => {
|
|
|
|
|
|
formRefExtraCharges.current.setFieldsValue({
|
|
|
|
|
|
Extracharges: e,
|
|
|
|
|
|
});
|
|
|
|
|
|
setselectedProduct(e);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const EditableCell = ({
|
|
|
|
|
|
title,
|
|
|
|
|
|
editable,
|
|
|
|
|
|
children,
|
|
|
|
|
|
dataIndex,
|
|
|
|
|
|
record,
|
|
|
|
|
|
handleSave,
|
|
|
|
|
|
...restProps
|
|
|
|
|
|
}) => {
|
|
|
|
|
|
const [editing, setEditing] = useState(false);
|
|
|
|
|
|
const inputRef = useRef(null);
|
|
|
|
|
|
const form = useContext(EditableContext);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (editing) {
|
|
|
|
|
|
inputRef?.current?.focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [editing]);
|
|
|
|
|
|
|
|
|
|
|
|
const toggleEdit = () => {
|
|
|
|
|
|
setEditing(!editing);
|
|
|
|
|
|
form.setFieldsValue({
|
|
|
|
|
|
[dataIndex]: record[dataIndex],
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const save = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const values = await form.validateFields();
|
|
|
|
|
|
toggleEdit();
|
|
|
|
|
|
handleSave({
|
|
|
|
|
|
...record,
|
|
|
|
|
|
...values,
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (errInfo) {
|
|
|
|
|
|
console.log('Save failed:', errInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let childNode = children;
|
|
|
|
|
|
|
|
|
|
|
|
if (editable) {
|
|
|
|
|
|
childNode = editing ? (
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
style={{
|
|
|
|
|
|
margin: 0,
|
|
|
|
|
|
}}
|
|
|
|
|
|
name={dataIndex}
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
pattern: /^[1-9]\d*(\.\d+)?$/,
|
|
|
|
|
|
message: `${title} is required.`,
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Input
|
|
|
|
|
|
ref={inputRef}
|
|
|
|
|
|
type="number"
|
|
|
|
|
|
onPressEnter={save}
|
|
|
|
|
|
onBlur={save}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="editable-cell-value-wrap"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
paddingRight: 24,
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={toggleEdit}
|
|
|
|
|
|
>
|
|
|
|
|
|
{children}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return <td {...restProps}>{childNode}</td>;
|
|
|
|
|
|
};
|
|
|
|
|
|
const EditableCell1 = ({
|
|
|
|
|
|
title,
|
|
|
|
|
|
editable,
|
|
|
|
|
|
children,
|
|
|
|
|
|
dataIndex,
|
|
|
|
|
|
record,
|
|
|
|
|
|
handleSave,
|
|
|
|
|
|
...restProps
|
|
|
|
|
|
}) => {
|
|
|
|
|
|
const [editing1, setEditing1] = useState(false);
|
|
|
|
|
|
const inputRef1 = useRef(null);
|
|
|
|
|
|
const form1 = useContext(EditableContext1);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (editing1) {
|
|
|
|
|
|
inputRef1?.current?.focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [editing1]);
|
|
|
|
|
|
|
|
|
|
|
|
const toggleEdit1 = () => {
|
|
|
|
|
|
setEditing1(!editing1);
|
|
|
|
|
|
form1.setFieldsValue({
|
|
|
|
|
|
[dataIndex]: record[dataIndex],
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const save1 = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const values = await form1.validateFields();
|
|
|
|
|
|
toggleEdit1();
|
|
|
|
|
|
handleSave1({
|
|
|
|
|
|
...record,
|
|
|
|
|
|
...values,
|
|
|
|
|
|
});
|
2026-02-04 19:16:18 +05:30
|
|
|
|
} catch (errInfo) {}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let childNode = children;
|
|
|
|
|
|
|
|
|
|
|
|
if (editable) {
|
|
|
|
|
|
childNode = editing1 ? (
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
style={{
|
|
|
|
|
|
margin: 0,
|
|
|
|
|
|
}}
|
|
|
|
|
|
name={dataIndex}
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
pattern: /^[1-9]\d*(\.\d+)?$/,
|
|
|
|
|
|
message: `${title} is required.`,
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Input
|
|
|
|
|
|
ref={inputRef1}
|
|
|
|
|
|
type="number"
|
|
|
|
|
|
onPressEnter={save1}
|
|
|
|
|
|
onBlur={save1}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="editable-cell-value-wrap"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
paddingRight: 24,
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={toggleEdit1}
|
|
|
|
|
|
>
|
|
|
|
|
|
{children}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return <td {...restProps}>{childNode}</td>;
|
|
|
|
|
|
};
|
|
|
|
|
|
const calculateTaxAmount = (record) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
((record.Price * record.TaxPercentage) / (100 + record.TaxPercentage)) *
|
|
|
|
|
|
record.QTY
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
const WithoutTaxAmountTaxAmount = (record) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
record.Price * record.QTY -
|
|
|
|
|
|
((record.Price * record.TaxPercentage) / (100 + record.TaxPercentage)) *
|
2026-02-04 19:16:18 +05:30
|
|
|
|
record.QTY
|
2026-01-27 18:27:29 +05:30
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
const WithTaxAmountTaxAmount = (record) => {
|
|
|
|
|
|
return record.Price * record.QTY;
|
|
|
|
|
|
};
|
|
|
|
|
|
const WithoutTaxAmountTaxAmount2 = (record) => {
|
|
|
|
|
|
return record.Price - record.TaxAmt;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const defaultColumns = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'ExtraCharge Type',
|
|
|
|
|
|
key: 'ExtraChargeType',
|
|
|
|
|
|
dataIndex: 'ExtraChargeType',
|
|
|
|
|
|
width: '200px',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'QTY',
|
|
|
|
|
|
key: 'QTY',
|
|
|
|
|
|
dataIndex: 'QTY',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
editable: Checkbox1 ? true : false,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Price',
|
|
|
|
|
|
key: 'Price',
|
|
|
|
|
|
dataIndex: 'Price',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{formatAmount(WithoutTaxAmountTaxAmount(record))}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Tax Amt',
|
|
|
|
|
|
key: 'TotalTaxAmt',
|
|
|
|
|
|
dataIndex: 'TotalTaxAmt',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{formatAmount(calculateTaxAmount(record))}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Amt',
|
|
|
|
|
|
key: 'Price',
|
|
|
|
|
|
dataIndex: 'Price',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{formatAmount(WithTaxAmountTaxAmount(record))}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Action',
|
|
|
|
|
|
key: 'Action',
|
|
|
|
|
|
dataIndex: 'Action',
|
|
|
|
|
|
width: '80px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<Space size="middle">
|
|
|
|
|
|
<Checkbox
|
|
|
|
|
|
checked={SelectData?.includes(record.UniqueId) ? true : false}
|
|
|
|
|
|
onClick={() => addeddata(record)}
|
|
|
|
|
|
disabled={
|
|
|
|
|
|
Object.keys(ReorderHoldDetails).length !== 0 &&
|
2026-02-04 19:16:18 +05:30
|
|
|
|
BookingType === 'Dine In' &&
|
|
|
|
|
|
GlobalExtraCharge.some(
|
|
|
|
|
|
(item) => item.ExtraChargeId === record.UniqueId
|
|
|
|
|
|
)
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Space>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
const defaultColumns1 = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'ExtraCharge Type',
|
|
|
|
|
|
key: 'ExtraChargeType',
|
|
|
|
|
|
dataIndex: 'ExtraChargeType',
|
|
|
|
|
|
width: '200px',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'QTY',
|
|
|
|
|
|
key: 'QTY',
|
|
|
|
|
|
dataIndex: 'QTY',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
// editable: Checkbox1 ? true : false,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Price1',
|
|
|
|
|
|
key: 'Price',
|
|
|
|
|
|
dataIndex: 'Price',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
render: (text, record) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{formatAmount(WithoutTaxAmountTaxAmount(record))}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
);
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Tax Amt',
|
|
|
|
|
|
key: 'TotalTaxAmt',
|
|
|
|
|
|
dataIndex: 'TotalTaxAmt',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{formatAmount(calculateTaxAmount(record))}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Amt',
|
|
|
|
|
|
key: 'Price',
|
|
|
|
|
|
dataIndex: 'Price',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{formatAmount(WithTaxAmountTaxAmount(record))}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Action',
|
|
|
|
|
|
key: 'Action',
|
|
|
|
|
|
dataIndex: 'Action',
|
|
|
|
|
|
width: '80px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<Space size="middle">
|
|
|
|
|
|
<Checkbox
|
|
|
|
|
|
checked={SelectData2?.includes(record.UniqueId) ? true : false}
|
|
|
|
|
|
onClick={() => addeddata1(record)}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Space>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
const handleSave = (row) => {
|
|
|
|
|
|
const newData = [...dataSource];
|
|
|
|
|
|
const index = newData.findIndex((item) => row.UniqueId === item.UniqueId);
|
|
|
|
|
|
const item = newData[index];
|
|
|
|
|
|
if (SelectData?.includes(row.UniqueId)) {
|
|
|
|
|
|
const isDuplicate = extdata?.some(
|
|
|
|
|
|
(item) => item.UniqueId === row.UniqueId
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const remove = extdata?.filter((item) => item.UniqueId !== row.UniqueId);
|
|
|
|
|
|
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
ExtraChargeType: row.ExtraChargeType,
|
|
|
|
|
|
Price: row.Price,
|
|
|
|
|
|
QTY: parseInt(row.QTY),
|
|
|
|
|
|
TaxAmt: formatAmount(
|
|
|
|
|
|
((row.Price * row.TaxPercentage) / (100 + row.TaxPercentage)) *
|
2026-02-04 19:16:18 +05:30
|
|
|
|
row.QTY
|
2026-01-27 18:27:29 +05:30
|
|
|
|
),
|
|
|
|
|
|
TotalAmt: row.Price * row.QTY,
|
|
|
|
|
|
// ((row.Price * row.TaxPercentage) / (100 + row.TaxPercentage) *row.QTY ).toFixed(2),
|
|
|
|
|
|
TaxId: row.TaxId,
|
|
|
|
|
|
TaxPercentage: row.TaxPercentage,
|
|
|
|
|
|
UniqueId: row.UniqueId,
|
|
|
|
|
|
};
|
|
|
|
|
|
setExtdata([...remove, data]);
|
|
|
|
|
|
}
|
|
|
|
|
|
newData.splice(index, 1, {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
...row,
|
|
|
|
|
|
});
|
|
|
|
|
|
// let vv={...newData,
|
|
|
|
|
|
// TotalTaxAmt:(row.Price * row.TaxPercentage) / (100 + row.TaxPercentage) * parseInt(row.QTY)
|
|
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
const newArray = newData.map((obj) => ({
|
|
|
|
|
|
...obj,
|
|
|
|
|
|
// TotalTaxAmt: parseFloat((obj.Price * obj.TaxPercentage) / (100 + obj.TaxPercentage) * parseInt(obj.QTY)).toFixed(2)
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
setDataSource(newArray);
|
|
|
|
|
|
};
|
|
|
|
|
|
const handleSave1 = (row) => {
|
|
|
|
|
|
const newData = [...TableName];
|
|
|
|
|
|
const index = newData.findIndex(
|
|
|
|
|
|
(item) => row.UniqueId === item.UniqueId && row.ProdName === item.ProdName
|
|
|
|
|
|
);
|
|
|
|
|
|
const item = newData[index];
|
|
|
|
|
|
const tax = dataSource?.find((e) => e.UniqueId == item.UniqueId);
|
|
|
|
|
|
let Taxx = tax?.TaxPercentage;
|
|
|
|
|
|
let Price2 = tax?.Price;
|
|
|
|
|
|
|
|
|
|
|
|
const hasUniqueId = TableName.some(
|
|
|
|
|
|
(item) => item.UniqueId === row.UniqueId
|
|
|
|
|
|
);
|
|
|
|
|
|
if (hasUniqueId) {
|
|
|
|
|
|
let updateQty = [...TableName];
|
|
|
|
|
|
|
|
|
|
|
|
updateQty[index] = {
|
|
|
|
|
|
ProdName: row.ProdName,
|
|
|
|
|
|
ExtraChargeType: row.ExtraChargeType,
|
|
|
|
|
|
Price: Price2 * row.QTY,
|
|
|
|
|
|
QTY: parseInt(row.QTY),
|
|
|
|
|
|
ProdId: row.ProdId,
|
|
|
|
|
|
InwardDtlId: row.InwardDtlId,
|
|
|
|
|
|
UniqueId: row.UniqueId,
|
|
|
|
|
|
//((record.Price * record.TaxPercentage) / (100 + record.TaxPercentage)) *
|
|
|
|
|
|
TaxAmt: formatAmount(
|
|
|
|
|
|
((Price2 * Taxx) / (100 + Taxx)) * parseInt(row.QTY)
|
|
|
|
|
|
),
|
|
|
|
|
|
TotalAmt: formatAmount(parseInt(Price2) * parseInt(row.QTY)),
|
|
|
|
|
|
BookingTypeName: row.BookingTypeName,
|
|
|
|
|
|
};
|
|
|
|
|
|
setTableName(updateQty);
|
|
|
|
|
|
}
|
|
|
|
|
|
newData.splice(index, 1, {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
...row,
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const components = {
|
|
|
|
|
|
body: {
|
|
|
|
|
|
row: EditableRow,
|
|
|
|
|
|
cell: EditableCell,
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
const components1 = {
|
|
|
|
|
|
body: {
|
|
|
|
|
|
row: EditableRow1,
|
|
|
|
|
|
cell: EditableCell1,
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
const ExtraChargescolumns = [
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Sl.No',
|
|
|
|
|
|
key: 'sno',
|
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>{index + 1}</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Product Name',
|
|
|
|
|
|
dataIndex: 'ProdName',
|
|
|
|
|
|
key: 'ProdName',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{record?.ProdName + '(' + record?.BookingTypeName + ')'}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'EXTRACHARGE TYPE',
|
|
|
|
|
|
dataIndex: 'ExtraChargeType',
|
|
|
|
|
|
key: 'ExtraChargeType',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Price',
|
|
|
|
|
|
dataIndex: 'Price',
|
|
|
|
|
|
key: 'Price',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
render: (text, record) => (
|
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
|
{formatAmount(WithoutTaxAmountTaxAmount2(record))}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'QTY',
|
|
|
|
|
|
dataIndex: 'QTY',
|
|
|
|
|
|
key: 'QTY',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
width: '200px',
|
|
|
|
|
|
editable: true,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: ' Tax AMT',
|
|
|
|
|
|
dataIndex: 'TaxAmt',
|
|
|
|
|
|
key: 'ProdId',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
render: (text) => <span>{safeRound(text)}</span>,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'AMT',
|
|
|
|
|
|
dataIndex: 'TotalAmt',
|
|
|
|
|
|
key: 'ProdId',
|
|
|
|
|
|
align: 'right',
|
|
|
|
|
|
width: '150px',
|
|
|
|
|
|
render: (amt) => <span>{safeRound(amt)}</span>,
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
title: 'Action',
|
|
|
|
|
|
dataIndex: 'Action',
|
|
|
|
|
|
key: 'Action',
|
|
|
|
|
|
align: 'center',
|
|
|
|
|
|
render: (_, record, index) => (
|
|
|
|
|
|
<Space size="middle">
|
|
|
|
|
|
<a>
|
|
|
|
|
|
{Object.keys(ReorderHoldDetails).length !== 0 &&
|
2026-02-04 19:16:18 +05:30
|
|
|
|
BookingType === 'Dine In' &&
|
|
|
|
|
|
GlobalExtraCharge?.some(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
item.ExtraChargeId === record.UniqueId &&
|
|
|
|
|
|
item.InwardDtlId === record.InwardDtlId
|
|
|
|
|
|
) ? (
|
2026-01-27 18:27:29 +05:30
|
|
|
|
<DeleteFilled
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: '#FF4D4F',
|
|
|
|
|
|
opacity: '0.4',
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<DeleteFilled
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: '#FF4D4F',
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={() => statusFormatters(record, index)}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</a>
|
|
|
|
|
|
</Space>
|
|
|
|
|
|
),
|
|
|
|
|
|
},
|
|
|
|
|
|
];
|
|
|
|
|
|
const columns = defaultColumns?.map((col) => {
|
|
|
|
|
|
if (!col.editable) {
|
|
|
|
|
|
return col;
|
|
|
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
|
|
|
...col,
|
|
|
|
|
|
onCell: (record) => ({
|
|
|
|
|
|
record,
|
|
|
|
|
|
editable: col.editable,
|
|
|
|
|
|
dataIndex: col.dataIndex,
|
|
|
|
|
|
title: col.title,
|
|
|
|
|
|
handleSave,
|
|
|
|
|
|
}),
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
const columns1 = ExtraChargescolumns?.map((col) => {
|
|
|
|
|
|
if (!col.editable) {
|
|
|
|
|
|
return col;
|
|
|
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
|
|
|
...col,
|
|
|
|
|
|
onCell: (record) => ({
|
|
|
|
|
|
record,
|
|
|
|
|
|
editable: col.editable,
|
|
|
|
|
|
dataIndex: col.dataIndex,
|
|
|
|
|
|
title: col.title,
|
|
|
|
|
|
handleSave1,
|
|
|
|
|
|
}),
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const handleToggle = () => {
|
|
|
|
|
|
setIsOpen(!isOpen);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
setHold(props.modalOpen);
|
|
|
|
|
|
}, [props.modalOpen]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (hold == true) {
|
|
|
|
|
|
holding();
|
|
|
|
|
|
dispatch(changeCustomerDelete('Deleted'));
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [hold]);
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
if (customerAddress && customerAddress[0]?.CustomerAddressDtl) {
|
|
|
|
|
|
const addressList = customerAddress[0].CustomerAddressDtl.map((addr) => ({
|
|
|
|
|
|
ActiveStatus: addr.ActiveStatus,
|
|
|
|
|
|
Address1: addr.Address1 || '',
|
|
|
|
|
|
Address2: addr.Address2 || '',
|
|
|
|
|
|
Zip: addr.Zip || '',
|
|
|
|
|
|
AddId: addr.AddId || '',
|
|
|
|
|
|
City: addr.City || '',
|
|
|
|
|
|
Dist: addr.Dist || '',
|
|
|
|
|
|
State: addr.State || '',
|
|
|
|
|
|
Latitude: addr.Latitude || '',
|
|
|
|
|
|
Longitude: addr.Longitude || '',
|
|
|
|
|
|
AddressType: addr.AddressType || '',
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
console.log(addressList, 'ddddddddddddd');
|
|
|
|
|
|
const prefilled = {};
|
|
|
|
|
|
addressList.forEach((addr, idx) => {
|
|
|
|
|
|
switch (addr.AddressType) {
|
|
|
|
|
|
case 'Both Address':
|
|
|
|
|
|
prefilled[idx] = [
|
|
|
|
|
|
'Delivery Address',
|
|
|
|
|
|
'Billing Address',
|
|
|
|
|
|
'Both Address',
|
|
|
|
|
|
];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'Delivery Address':
|
|
|
|
|
|
prefilled[idx] = ['Delivery Address'];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'Billing Address':
|
|
|
|
|
|
prefilled[idx] = ['Billing Address'];
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
prefilled[idx] = [];
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
setAddressTypes(prefilled);
|
|
|
|
|
|
setAddressesList(addressList);
|
|
|
|
|
|
setAddressPreview(addressList);
|
|
|
|
|
|
// setZipCodeData(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, [customerAddress]);
|
|
|
|
|
|
|
|
|
|
|
|
const pinCodeChange = (e) => {
|
|
|
|
|
|
const value = e.target.value;
|
|
|
|
|
|
if (value.length === 6) {
|
|
|
|
|
|
getPincodeValues(value);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setZipCodeData(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const getPincodeValues = async (pinCode) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const res = await fetch(
|
|
|
|
|
|
`https://api.postalpincode.in/pincode/${pinCode}`
|
|
|
|
|
|
);
|
|
|
|
|
|
const response = await res.json();
|
|
|
|
|
|
|
|
|
|
|
|
if (response[0]?.Status === 'Success') {
|
|
|
|
|
|
const postOffice = response[0].PostOffice?.[0];
|
|
|
|
|
|
setZipCodeData(true);
|
|
|
|
|
|
formRef.current?.setFieldsValue({
|
|
|
|
|
|
City: postOffice?.Block || postOffice?.Name || '',
|
|
|
|
|
|
Dist: postOffice?.District || '',
|
|
|
|
|
|
State: postOffice?.State || '',
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setZipCodeData(false);
|
|
|
|
|
|
formRef.current?.setFieldsValue({
|
|
|
|
|
|
City: '',
|
|
|
|
|
|
Dist: '',
|
|
|
|
|
|
State: '',
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('Error fetching pincode info:', error);
|
|
|
|
|
|
setZipCodeData(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// const getPincodeValues = async (pinCode) => {
|
|
|
|
|
|
// let response = '';
|
|
|
|
|
|
// await fetch(`https://api.postalpincode.in/pincode/${pinCode}`)
|
|
|
|
|
|
// .then((res) => res.text())
|
|
|
|
|
|
// .then((text) => (response = JSON.parse(text)));
|
|
|
|
|
|
|
|
|
|
|
|
// if (response[0]['Status'] === 'Success') {
|
|
|
|
|
|
// setZipCodeData(true);
|
|
|
|
|
|
// formRef.current?.setFieldsValue({
|
|
|
|
|
|
// City: response[0]['PostOffice'][0]['Block'],
|
|
|
|
|
|
// Dist: response[0]['PostOffice'][0]['District'],
|
|
|
|
|
|
// State: response[0]['PostOffice'][0]['State'],
|
|
|
|
|
|
// });
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// setZipCodeData(false);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
const onComplete = useCallback(() => {
|
|
|
|
|
|
setMessageData(null);
|
|
|
|
|
|
setMessageType(null);
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
const customerData = async (e) => {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
MobileNo: e,
|
|
|
|
|
|
CompId: getSession('CompId'),
|
|
|
|
|
|
BranchId: getSession('BranchId'),
|
|
|
|
|
|
AppId: getSession('AppId'),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let response = await dispatch(getAddCustomerDetails(data)).unwrap();
|
|
|
|
|
|
if (response?.data?.statusCode === 1) {
|
|
|
|
|
|
setoldUserId(response?.data?.data?.[0]?.UserId);
|
|
|
|
|
|
setCustomerAddress(response?.data?.data);
|
|
|
|
|
|
if (response?.data?.data?.[0]?.Zip) {
|
|
|
|
|
|
getPincodeValues(response?.data?.data?.[0].Zip);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (response?.data?.data?.[0]?.OfferActiveStatus) {
|
|
|
|
|
|
setSelectedValue(response?.data?.data?.[0]?.OfferActiveStatus);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (response?.data?.data?.[0]?.OfferType) {
|
|
|
|
|
|
setofferType(response?.data?.data?.[0]?.OfferType);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (response?.data?.data?.[0]?.MarriedStatus) {
|
|
|
|
|
|
setMaritalstatus(response?.data?.data?.[0]?.MarriedStatus);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (response?.data?.data?.[0]?.SpouseDOB) {
|
|
|
|
|
|
setSpouseDobDate(response?.data?.data?.[0]?.SpouseDOB);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (response?.data?.data?.[0]?.AnniversaryDate) {
|
|
|
|
|
|
setanniversaryDate(response?.data?.data?.[0]?.AnniversaryDate);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (response?.data?.data?.[0]?.CustDOB) {
|
|
|
|
|
|
setDobDate(response?.data?.data?.[0]?.CustDOB);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (
|
|
|
|
|
|
response?.data?.data?.[0]?.OfferValue == 0 ||
|
|
|
|
|
|
response?.data?.data?.[0]?.OfferValue
|
|
|
|
|
|
) {
|
|
|
|
|
|
setOfferValue(
|
|
|
|
|
|
response?.data?.data?.[0]?.OfferValue
|
|
|
|
|
|
? response?.data?.data?.[0]?.OfferValue
|
|
|
|
|
|
: 0
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
formRef.current?.setFieldsValue(response?.data?.data?.[0]);
|
|
|
|
|
|
|
|
|
|
|
|
if (response?.data?.data?.[0]?.InitialOutStanding) {
|
|
|
|
|
|
setInitialOutStandingType(
|
|
|
|
|
|
response?.data?.data?.[0]?.InitialOutStanding
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (response?.data?.statusCode === 0) {
|
|
|
|
|
|
setoldUserId(null);
|
|
|
|
|
|
!Searchopen && formRef.current?.resetFields();
|
|
|
|
|
|
!Searchopen && formRef.current?.setFieldsValue({ CustMobile: e });
|
|
|
|
|
|
Searchopen && setCusDetails(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleSubmit = async (value) => {
|
|
|
|
|
|
let PostData = value;
|
|
|
|
|
|
PostData['CompId'] = getSession('CompId');
|
|
|
|
|
|
PostData['BranchId'] = getSession('BranchId');
|
|
|
|
|
|
PostData['AppId'] = getSession('AppId');
|
|
|
|
|
|
PostData['CreatedBy'] = getSession('UserId');
|
|
|
|
|
|
// PostData['Document'] = ImageUrl ? ImageUrl : null;
|
|
|
|
|
|
PostData['CustomerProfile'] = ImageUrl ? ImageUrl : null;
|
|
|
|
|
|
PostData['InitialOutStanding'] = parseInt(value?.OutStandingAmount);
|
|
|
|
|
|
if (oldUserId) {
|
|
|
|
|
|
PostData['UserId'] = oldUserId;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (offerType) {
|
|
|
|
|
|
PostData['OfferType'] = offerType;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (Maritalstatus == 'N') {
|
|
|
|
|
|
PostData['MarriedStatus'] = 'N';
|
|
|
|
|
|
PostData['CustDOB'] = DobDate;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (Maritalstatus == 'Y') {
|
|
|
|
|
|
PostData['MarriedStatus'] = 'Y';
|
|
|
|
|
|
PostData['CustDOB'] = DobDate;
|
|
|
|
|
|
PostData['SpouseDOB'] = SpouseDobDate;
|
|
|
|
|
|
PostData['AnniversaryDate'] = anniversaryDate;
|
|
|
|
|
|
}
|
|
|
|
|
|
const addedAddresses = addressesList || [];
|
|
|
|
|
|
const validAddresses = addedAddresses?.filter(
|
|
|
|
|
|
(addr) => addr?.Address1 && addr?.Zip
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
PostData['CustomerAddressDtl'] = validAddresses;
|
|
|
|
|
|
|
|
|
|
|
|
let response = await dispatch(postAddCustomerDetails(PostData)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
|
fetchdata();
|
|
|
|
|
|
dispatch(changeSelectedOption(null));
|
|
|
|
|
|
dispatch(
|
|
|
|
|
|
changeCustomerID(
|
|
|
|
|
|
response?.data?.CustomerDetails?.[
|
2026-02-04 19:16:18 +05:30
|
|
|
|
response?.data?.CustomerDetails.length - 1
|
2026-01-27 18:27:29 +05:30
|
|
|
|
]
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
dispatch(
|
|
|
|
|
|
changeSelectedCustId(response?.data?.CustomerDetails?.[0]?.CustId)
|
|
|
|
|
|
);
|
|
|
|
|
|
setMessageType('success');
|
|
|
|
|
|
setMessageData('Customer Added Successfully');
|
|
|
|
|
|
setInputValue('');
|
|
|
|
|
|
setoldUserId(null);
|
|
|
|
|
|
dispatch(triggerCustomerRefresh());
|
|
|
|
|
|
formRef.current?.resetFields();
|
|
|
|
|
|
props.handleAddCustomerCancel();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
setMessageData(response?.data?.response);
|
|
|
|
|
|
}
|
|
|
|
|
|
setIsOpen(false);
|
|
|
|
|
|
setSearchopen(false);
|
|
|
|
|
|
setCusDetails(false);
|
|
|
|
|
|
setselectedSearchValue('CustMobile');
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const checkExistingCustomer = (value) => {
|
|
|
|
|
|
if (!isNaN(value)) {
|
|
|
|
|
|
if (value?.length == 10) {
|
|
|
|
|
|
customerData(value);
|
|
|
|
|
|
setCusDetails(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setCusDetails(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (value?.length == 50) {
|
|
|
|
|
|
customerData(value);
|
|
|
|
|
|
setCusDetails(true);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
setCusDetails(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const holding = async () => {
|
|
|
|
|
|
const data = { CompId: CompId, BranchId: BranchId, AppId: AppId };
|
|
|
|
|
|
let response = await dispatch(gettinghold(data)).unwrap();
|
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
|
let modifiedData = response?.data?.data?.map((item) => {
|
|
|
|
|
|
return {
|
|
|
|
|
|
...item,
|
|
|
|
|
|
productDetails: item.productDetails.map((product) => {
|
|
|
|
|
|
// Clone the product to avoid modifying the original object
|
|
|
|
|
|
let newProduct = { ...product };
|
|
|
|
|
|
|
|
|
|
|
|
if (product.Type === 'P') {
|
|
|
|
|
|
if (product.SinglePc === 'Y') {
|
|
|
|
|
|
newProduct.UomName = 'PCS';
|
|
|
|
|
|
newProduct.MRP = newProduct.OrderRate;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
newProduct.ProdName = newProduct.ProdName;
|
|
|
|
|
|
newProduct.Size = 1;
|
|
|
|
|
|
newProduct.UomName = 'Combo';
|
|
|
|
|
|
newProduct.MRP = newProduct.OrderRate;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return newProduct; // Return the modified product
|
|
|
|
|
|
}),
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
setTabledata(modifiedData);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const statusFormatter = async (row) => {
|
|
|
|
|
|
let orderListIds = [];
|
|
|
|
|
|
orderListIds.push(row.OrderId);
|
|
|
|
|
|
|
|
|
|
|
|
let putData = { OrderId: orderListIds };
|
|
|
|
|
|
let response = await dispatch(puttinghold(putData)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
const extractedData = row?.productDetails?.map((prod) => ({
|
|
|
|
|
|
ProdId: prod.ProdId,
|
|
|
|
|
|
InwardDtlId: prod.InwardDtlId,
|
|
|
|
|
|
SinglePc: prod.SinglePc,
|
|
|
|
|
|
Qty: prod.OrderQty,
|
|
|
|
|
|
Date: prod?.BookingDate,
|
|
|
|
|
|
}));
|
|
|
|
|
|
let BlockPostdata = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
Status: 'UnBlock',
|
|
|
|
|
|
CreatedBy: UserId,
|
|
|
|
|
|
ProductList: extractedData,
|
|
|
|
|
|
};
|
|
|
|
|
|
await dispatch(PostBlockSlots(BlockPostdata)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
|
setMessageType('success');
|
|
|
|
|
|
setMessageData(response?.data?.response);
|
|
|
|
|
|
let holdingData = await dispatch(
|
|
|
|
|
|
gettinghold({ CompId: CompId, BranchId: BranchId, AppId: AppId })
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
if (holdingData?.data?.statusCode === 1) {
|
|
|
|
|
|
setTabledata(holdingData?.data?.data);
|
|
|
|
|
|
dispatch(changeholddata(holdingData?.data?.data));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// props.handleHoldCancel();
|
|
|
|
|
|
props?.closeModal();
|
|
|
|
|
|
setHold(false);
|
|
|
|
|
|
const dataValue = { CompId: CompId, BranchId: BranchId, AppId: AppId };
|
|
|
|
|
|
let responseValue = await dispatch(gettinghold(dataValue)).unwrap();
|
|
|
|
|
|
if (responseValue?.data?.statusCode == 1) {
|
|
|
|
|
|
dispatch(changeholddata(responseValue?.data?.data));
|
|
|
|
|
|
getstockbadge();
|
|
|
|
|
|
Combocarddata();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(changeholddata([]));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
getstockbadge();
|
|
|
|
|
|
Combocarddata();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const HoldPutfun = async (a, b) => {
|
|
|
|
|
|
const updated = a?.map((item) => ({
|
|
|
|
|
|
...item,
|
|
|
|
|
|
Offer: item?.OfferAmt,
|
|
|
|
|
|
localId: uuidv4(),
|
|
|
|
|
|
OfferMode: item?.OfferMode ? item?.OfferMode?.trim() : null,
|
|
|
|
|
|
VariantAvailableFrom: item?.AvailableFrom || null,
|
|
|
|
|
|
VariantAvailableTo: item?.AvailableTo || null,
|
|
|
|
|
|
// TotalAmt: formatAmount((item.TotalAmt - item.OfferValue)),
|
|
|
|
|
|
}));
|
|
|
|
|
|
b?.RefDetails?.[0]?.FreeProdList &&
|
|
|
|
|
|
dispatch(ChangeFullFreeProductList(b?.RefDetails[0]?.FreeProdList));
|
|
|
|
|
|
b?.RefDetails?.[0]?.OfferAppliedProductList &&
|
|
|
|
|
|
dispatch(
|
|
|
|
|
|
changeFullOfferAppliedProducts(
|
|
|
|
|
|
b?.RefDetails[0]?.OfferAppliedProductList
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const loyaltyFreeProductOfferApplied =
|
|
|
|
|
|
b?.RefDetails?.[0]?.OfferAppliedProductList?.filter(
|
|
|
|
|
|
(off) =>
|
|
|
|
|
|
off?.FreeProductsList?.OfferMode === 'L' &&
|
|
|
|
|
|
off?.TableUniqueName === 'FreeProduct'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
let res = await dispatch(
|
|
|
|
|
|
getCustomerForHold({
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
branchId: BranchId,
|
|
|
|
|
|
OrderId: b?.OrderId,
|
|
|
|
|
|
})
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
if (res?.data?.statusCode == 1) {
|
|
|
|
|
|
let custdetail = res?.data?.data?.find(
|
|
|
|
|
|
(item) => item.CustId === b.CustSuppId
|
|
|
|
|
|
);
|
|
|
|
|
|
if (custdetail !== undefined) {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
CustId: custdetail?.CustId,
|
|
|
|
|
|
CustName: custdetail?.CustName,
|
|
|
|
|
|
label: custdetail?.CustName
|
|
|
|
|
|
? custdetail?.CustName
|
|
|
|
|
|
: custdetail?.CustMobile,
|
|
|
|
|
|
value: custdetail?.CustMobile,
|
|
|
|
|
|
LoyaltyPointsDetail: custdetail?.LoyaltyPointsDetail,
|
|
|
|
|
|
TotalLoyaltyPoints: custdetail?.TotalLoyaltyPoints,
|
|
|
|
|
|
};
|
|
|
|
|
|
await dispatch(changeSelectedOption(data));
|
|
|
|
|
|
await dispatch(ChangeSelectedCustDisable(true));
|
|
|
|
|
|
if (loyaltyFreeProductOfferApplied?.length > 0) {
|
|
|
|
|
|
const loyaltyProdQuantities = {};
|
|
|
|
|
|
|
|
|
|
|
|
loyaltyFreeProductOfferApplied.forEach((off) => {
|
|
|
|
|
|
const freeProdDtls = off?.FreeProductsList;
|
|
|
|
|
|
const freeProdOfferId =
|
|
|
|
|
|
freeProdDtls?.ProdVariantDetails?.[0]?.StockDetails?.[0]
|
|
|
|
|
|
?.ProdOfferId;
|
|
|
|
|
|
|
|
|
|
|
|
const key = [
|
|
|
|
|
|
freeProdDtls?.OfferId,
|
|
|
|
|
|
freeProdDtls?.FreeProdId,
|
|
|
|
|
|
freeProdDtls?.FreeProdVariantName,
|
|
|
|
|
|
freeProdOfferId,
|
|
|
|
|
|
].join('|');
|
|
|
|
|
|
|
|
|
|
|
|
loyaltyProdQuantities[key] = freeProdDtls?.FreeQty || 0;
|
|
|
|
|
|
});
|
|
|
|
|
|
if (Object.keys(loyaltyProdQuantities).length > 0) {
|
|
|
|
|
|
dispatch(changeLoyaltyConsumedQuantities(loyaltyProdQuantities));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log(loyaltyProdQuantities, 'loyaltyProdQuantities');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let temp = a
|
|
|
|
|
|
?.filter((item) => item.OrderType === 'E')
|
|
|
|
|
|
.map((item) => item.InwardDtlId + ' ' + item.BookingTypeName);
|
|
|
|
|
|
await dispatch(changeSelProdWiseEst(temp));
|
|
|
|
|
|
if (b.OrderType == 'E') {
|
|
|
|
|
|
await dispatch(changeEstimateBooking('OvrAllEst'));
|
|
|
|
|
|
await dispatch(ChangeOverAllDiscEstimate(parseFloat(b.OverallDisc)));
|
|
|
|
|
|
await dispatch(changeOrderCardDetails(updated));
|
|
|
|
|
|
} else {
|
|
|
|
|
|
await dispatch(changeEstimateBooking('Sales'));
|
|
|
|
|
|
await dispatch(ChangeOverAllDiscSales(parseFloat(b.OverallDisc)));
|
|
|
|
|
|
const salesOffer = templateData?.BookingNavbar?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'Offer'
|
|
|
|
|
|
);
|
|
|
|
|
|
const preferenceOffer =
|
|
|
|
|
|
PreferenceDatas?.[0]?.['SettingDtlDetails']?.find(
|
|
|
|
|
|
(item) => item.SettingIdName === 'Offer'
|
|
|
|
|
|
)?.SettingValue === 'Y';
|
|
|
|
|
|
// if (salesOffer && preferenceOffer) {
|
|
|
|
|
|
// await applyOffer(a, b.OrderOfferDetails);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else
|
|
|
|
|
|
// {
|
|
|
|
|
|
await dispatch(changeOrderCardDetails(updated));
|
|
|
|
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
await dispatch(changeOrderType('Hold'));
|
|
|
|
|
|
await dispatch(changeHoldOrderDtl(true));
|
|
|
|
|
|
await dispatch(changeReorderHoldDetails(b));
|
|
|
|
|
|
await dispatch(changeReorderProductDetails(b?.productDetails));
|
|
|
|
|
|
await dispatch(changeSelectedCustId(b?.CustSuppId));
|
|
|
|
|
|
await dispatch(ChangeTotalAmount(b?.ExtraChargeDetails));
|
|
|
|
|
|
setHold(false);
|
|
|
|
|
|
// props.handleHoldCancel();
|
|
|
|
|
|
props?.closeModal();
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const removeAll = async () => {
|
|
|
|
|
|
let data = [];
|
|
|
|
|
|
Tabledata?.map((item) => {
|
|
|
|
|
|
data?.push(item.OrderId);
|
|
|
|
|
|
});
|
|
|
|
|
|
let putData = { OrderId: data };
|
|
|
|
|
|
clearall(putData);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const clearall = async (data) => {
|
|
|
|
|
|
let response = await dispatch(puttinghold(data)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
const allProducts = Tabledata.flatMap((row) =>
|
|
|
|
|
|
row?.productDetails?.map((prod) => ({
|
|
|
|
|
|
ProdId: prod.ProdId,
|
|
|
|
|
|
InwardDtlId: prod.InwardDtlId,
|
|
|
|
|
|
SinglePc: prod.SinglePc,
|
|
|
|
|
|
Qty: prod.OrderQty,
|
|
|
|
|
|
Date: row?.SalesDate,
|
|
|
|
|
|
}))
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const BlockPostdata = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
Status: 'UnBlock',
|
|
|
|
|
|
CreatedBy: UserId,
|
|
|
|
|
|
ProductList: allProducts,
|
|
|
|
|
|
};
|
|
|
|
|
|
await dispatch(PostBlockSlots(BlockPostdata)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
|
setMessageType('success');
|
|
|
|
|
|
setMessageData(response?.data?.response);
|
|
|
|
|
|
|
|
|
|
|
|
// props.handleHoldCancel();
|
|
|
|
|
|
props?.closeModal();
|
|
|
|
|
|
setHold(false);
|
|
|
|
|
|
const dataValue = { CompId: CompId, BranchId: BranchId, AppId: AppId };
|
|
|
|
|
|
let responseValue = await dispatch(gettinghold(dataValue)).unwrap();
|
|
|
|
|
|
if (responseValue?.data?.statusCode == 1) {
|
|
|
|
|
|
dispatch(changeholddata(responseValue?.data?.data));
|
|
|
|
|
|
getstockbadge();
|
|
|
|
|
|
Combocarddata();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dispatch(changeholddata([]));
|
|
|
|
|
|
getstockbadge();
|
|
|
|
|
|
Combocarddata();
|
|
|
|
|
|
}
|
|
|
|
|
|
dispatch(triggerCustomerRefresh());
|
|
|
|
|
|
dispatch(changeSelectedOption(null));
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const setWsport = async (e) => {
|
|
|
|
|
|
setwsport(e);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const myfun = async (e) => {
|
|
|
|
|
|
setWSProductWeight(e);
|
|
|
|
|
|
formWsRef.current?.setFieldsValue({ WSProductWeight: e });
|
|
|
|
|
|
};
|
|
|
|
|
|
const WSProductSelect = (data) => {
|
|
|
|
|
|
formWsRef.current.resetFields(['CalcProductRate']);
|
|
|
|
|
|
setCalcProductWeight();
|
|
|
|
|
|
setCalcProductRate();
|
|
|
|
|
|
formWsRef.current.resetFields(['CalcProductWeight', 'CalcProductRate']);
|
|
|
|
|
|
setProductValue(data);
|
|
|
|
|
|
let ProdNamedata = WSProductList?.find((item) => item.ProdName === data);
|
|
|
|
|
|
let OneKgProd = ProdNamedata?.ProductDetail?.find(
|
|
|
|
|
|
(item) =>
|
|
|
|
|
|
(item?.UomName?.toLowerCase() === 'KGS'?.toLowerCase() ||
|
|
|
|
|
|
item?.UomName?.toLowerCase() === 'KG'?.toLowerCase()) &&
|
|
|
|
|
|
item?.Size === 1
|
|
|
|
|
|
);
|
|
|
|
|
|
setWSSelectedOnekgProd(OneKgProd);
|
|
|
|
|
|
setWSProductDataSource(OneKgProd?.ProdVariantDetails?.[0]?.StockDetails);
|
|
|
|
|
|
if (OneKgProd?.ProdVariantDetails?.[0]?.StockDetails?.length === 1) {
|
|
|
|
|
|
GetProductRate(OneKgProd?.ProdVariantDetails?.[0]?.StockDetails?.[0]);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const WSProductChange = async (data) => {
|
|
|
|
|
|
formWsRef.current.resetFields([
|
|
|
|
|
|
'WSProductWeight',
|
|
|
|
|
|
'WSProductRate',
|
|
|
|
|
|
'WSTotalPrice',
|
|
|
|
|
|
]);
|
|
|
|
|
|
setWSProductRate(0);
|
|
|
|
|
|
setWSProductWeight(0);
|
|
|
|
|
|
setWSTotalPrice(0);
|
|
|
|
|
|
setWSProductDataSource([]);
|
|
|
|
|
|
setProductValue(data);
|
|
|
|
|
|
if (data?.length > 2) {
|
|
|
|
|
|
let ProductList = await dispatch(
|
|
|
|
|
|
getProductsearch({
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
ProdName: data,
|
|
|
|
|
|
})
|
|
|
|
|
|
).unwrap();
|
|
|
|
|
|
if (ProductList?.data?.statusCode == 1) {
|
|
|
|
|
|
setWSProductList(ProductList?.data?.data);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const GetProductRate = (data) => {
|
|
|
|
|
|
setWSSelectedStockDetail(data);
|
|
|
|
|
|
setWSProductRate(data?.SellPrice);
|
|
|
|
|
|
formWsRef.current?.setFieldsValue({ WSProductRate: data?.SellPrice });
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const WSTotalCalculation = () => {
|
|
|
|
|
|
let pricepergram = WSProductRate / 1000;
|
|
|
|
|
|
let total = formatAmount(parseFloat(WSProductWeight) * 1000 * pricepergram);
|
|
|
|
|
|
|
|
|
|
|
|
setWSTotalPrice(total);
|
|
|
|
|
|
formWsRef.current?.setFieldsValue({ WSTotalPrice: total });
|
|
|
|
|
|
};
|
|
|
|
|
|
const onFinish = async () => {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
Type: WSProductList?.[0]?.Type,
|
|
|
|
|
|
OverallQuantity: WSProductList?.[0]?.OverAllQty,
|
|
|
|
|
|
ActiveStatus: WSSelectedOnekgProd?.ActiveStatus,
|
|
|
|
|
|
AvailableFrom: WSSelectedOnekgProd?.AvailableFrom,
|
|
|
|
|
|
AvailableTo: WSSelectedOnekgProd?.AvailableTo,
|
|
|
|
|
|
Cess: WSSelectedOnekgProd?.Cess,
|
|
|
|
|
|
ExpDate: WSSelectedStockDetail?.ExpDate,
|
|
|
|
|
|
HSNCode: WSSelectedOnekgProd?.HSNCode,
|
|
|
|
|
|
ManufDate: WSSelectedStockDetail?.ManufDate,
|
|
|
|
|
|
OpeningQty: WSSelectedOnekgProd?.OpeningQty,
|
|
|
|
|
|
ProdType: WSProductList?.[0]?.ProdType,
|
|
|
|
|
|
PartNumber: WSSelectedOnekgProd?.PartNumber,
|
|
|
|
|
|
ProdId: WSSelectedOnekgProd?.ProdId,
|
|
|
|
|
|
ProdLogo: WSSelectedOnekgProd?.ProdLogo,
|
|
|
|
|
|
ProdName: WSSelectedOnekgProd?.ProdName,
|
|
|
|
|
|
QRCode: WSSelectedOnekgProd?.QRCode,
|
|
|
|
|
|
QtyBasedPrice: WSSelectedOnekgProd?.QtyBasedPrice,
|
|
|
|
|
|
Rack: WSSelectedOnekgProd?.Rack,
|
|
|
|
|
|
Size: parseFloat(WSProductWeight).toFixed(3),
|
|
|
|
|
|
StockAvailable: WSSelectedOnekgProd?.StockAvailable,
|
|
|
|
|
|
TaxId: WSSelectedOnekgProd?.TaxId,
|
|
|
|
|
|
TaxPercentage: WSSelectedOnekgProd?.TaxPercentage,
|
|
|
|
|
|
TaxName: WSSelectedOnekgProd?.TaxIdName,
|
|
|
|
|
|
UniqueId: WSSelectedOnekgProd?.UniqueId,
|
|
|
|
|
|
UomName: WSSelectedOnekgProd?.UomName,
|
|
|
|
|
|
BalanceQty: WSSelectedStockDetail?.BalanceQty,
|
|
|
|
|
|
BatchRef: WSSelectedStockDetail?.BatchRef,
|
|
|
|
|
|
InwardDate: WSSelectedStockDetail?.InwardDate,
|
|
|
|
|
|
InwardDtlId: WSSelectedStockDetail?.InwardDtlId,
|
|
|
|
|
|
InwardId: WSSelectedStockDetail?.InwardId,
|
|
|
|
|
|
MRP: WSSelectedStockDetail?.MRP,
|
|
|
|
|
|
Offer: WSSelectedStockDetail?.OfferPrice,
|
|
|
|
|
|
SellPrice: WSSelectedStockDetail?.SellPrice,
|
|
|
|
|
|
ProdVariantName: 'Variant1',
|
|
|
|
|
|
OrderRate: Math.round(WSTotalPrice),
|
|
|
|
|
|
SuppId: WSSelectedStockDetail?.SuppId,
|
|
|
|
|
|
SuppName: WSSelectedStockDetail?.SuppName,
|
|
|
|
|
|
OrderQty: WSProductWeight,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (WSTotalPrice > 0) {
|
|
|
|
|
|
await dispatch(ChangeWSProduct(data));
|
|
|
|
|
|
WSModalPortclose();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
WSModalPortclose();
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
setMessageData('Total is not calculated');
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const WSModalPortclose = () => {
|
|
|
|
|
|
setWeightScale2(false);
|
|
|
|
|
|
|
|
|
|
|
|
setWSProductWeight(0);
|
|
|
|
|
|
formWsRef.current?.resetFields();
|
|
|
|
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
WSModalClose();
|
|
|
|
|
|
// setwsport(null)
|
|
|
|
|
|
}, 20);
|
|
|
|
|
|
};
|
|
|
|
|
|
const WSModalClose = () => {
|
|
|
|
|
|
setWeightScale2(true);
|
|
|
|
|
|
|
|
|
|
|
|
setWSProductList([]);
|
|
|
|
|
|
setProductValue();
|
|
|
|
|
|
setWSProductDataSource([]);
|
|
|
|
|
|
setWSProductRate(0);
|
|
|
|
|
|
setWSProductWeight(0);
|
|
|
|
|
|
setWSTotalPrice(0);
|
|
|
|
|
|
setWSSelectedStockDetail([]);
|
|
|
|
|
|
setWSSelectedOnekgProd([]);
|
|
|
|
|
|
setCalcProductWeight();
|
|
|
|
|
|
setCalcProductRate();
|
|
|
|
|
|
formWsRef.current?.resetFields();
|
|
|
|
|
|
setWeightScale(false);
|
|
|
|
|
|
if (props.handleWeightScaleCancel) {
|
|
|
|
|
|
props.handleWeightScaleCancel();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const CalculateWeight = async (e) => {
|
|
|
|
|
|
if (WSSelectedOnekgProd && ProductValue) {
|
|
|
|
|
|
setCalcProductRate(e?.target?.value);
|
|
|
|
|
|
let tempCalcProductWeight = (e.target.value / WSProductRate).toFixed(3);
|
|
|
|
|
|
|
|
|
|
|
|
setCalcProductWeight(parseFloat(tempCalcProductWeight));
|
|
|
|
|
|
formWsRef.current?.setFieldsValue({
|
|
|
|
|
|
CalcProductWeight: tempCalcProductWeight,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const CalculateWeightOpen = () => {
|
|
|
|
|
|
setCalcPriceWeightOpen(!CalcPriceWeightOpen);
|
|
|
|
|
|
setCalcProductWeight();
|
|
|
|
|
|
setCalcProductRate();
|
|
|
|
|
|
formWsRef.current.resetFields(['CalcProductWeight', 'CalcProductRate']);
|
|
|
|
|
|
};
|
|
|
|
|
|
const HandleProductName = (_, value) => {
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
if (WSSelectedOnekgProd && ProductValue) {
|
|
|
|
|
|
resolve();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
reject('Please Select Product');
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const HandleCloseModal = () => {
|
|
|
|
|
|
props.handleAddCustomerCancel();
|
|
|
|
|
|
setInputValue('');
|
|
|
|
|
|
setCusDetails(false);
|
|
|
|
|
|
setselectedSearchValue('CustMobile');
|
|
|
|
|
|
setSearchopen(false);
|
|
|
|
|
|
setIsOpen(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const getstockbadge = async () => {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
...(AvailableDate && selectedDate
|
|
|
|
|
|
? {
|
2026-02-04 19:16:18 +05:30
|
|
|
|
fromDate: selectedDate?.[0],
|
|
|
|
|
|
toDate: selectedDate?.[1],
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: {}),
|
|
|
|
|
|
};
|
|
|
|
|
|
await dispatch(getSelectedFavItems(data)).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
let data1 = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
ProdSubCat: ProdSubCat,
|
|
|
|
|
|
...(AvailableDate && selectedDate
|
|
|
|
|
|
? {
|
2026-02-04 19:16:18 +05:30
|
|
|
|
fromDate: selectedDate?.[0],
|
|
|
|
|
|
toDate: selectedDate?.[1],
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: {}),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let data2 = {
|
|
|
|
|
|
compId: CompId,
|
|
|
|
|
|
branchId: BranchId,
|
|
|
|
|
|
appId: AppId,
|
|
|
|
|
|
prodCat: prodCat,
|
|
|
|
|
|
...(AvailableDate && selectedDate
|
|
|
|
|
|
? {
|
2026-02-04 19:16:18 +05:30
|
|
|
|
fromDate: selectedDate?.[0],
|
|
|
|
|
|
toDate: selectedDate?.[1],
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: {}),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
templateData?.BookingLayout?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'SubCategory'
|
|
|
|
|
|
) &&
|
|
|
|
|
|
ProdSubCat
|
|
|
|
|
|
) {
|
|
|
|
|
|
await dispatch(getLayoutproductCard(data1)).unwrap();
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
!templateData?.BookingLayout?.[1]?.some(
|
|
|
|
|
|
(item) => item?.OptionName === 'SubCategory'
|
|
|
|
|
|
)
|
|
|
|
|
|
) {
|
|
|
|
|
|
await dispatch(getCardDataWithoutSubmodule(data2)).unwrap();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
await dispatch(getCardDataWithoutSub(data2)).unwrap();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const Combocarddata = async () => {
|
|
|
|
|
|
let data = {
|
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
|
ActiveStatus: 'A',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let response = await dispatch(getCombolist(data)).unwrap();
|
|
|
|
|
|
let datas = response?.data?.data;
|
|
|
|
|
|
await dispatch(ChangeComboCarddata(datas));
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const HandleSearch = () => {
|
|
|
|
|
|
setSearchopen(!Searchopen);
|
|
|
|
|
|
setselectedSearchValue('CustMobile');
|
|
|
|
|
|
setInputValue('');
|
|
|
|
|
|
setCusDetails(false);
|
|
|
|
|
|
setIsOpen(false);
|
|
|
|
|
|
setselectSearchDefaultValue();
|
|
|
|
|
|
formRef.current?.resetFields();
|
|
|
|
|
|
Searchopen == true && setCusDetails(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleRadioChange = (event) => {
|
|
|
|
|
|
setselectedSearchValue(event.target.value);
|
|
|
|
|
|
event.target.value === 'CustName' ? setInputValue('') : setInputValue('');
|
|
|
|
|
|
setIsOpen(false);
|
|
|
|
|
|
setCusDetails(false);
|
|
|
|
|
|
event.target.value === 'CustId' && setInputValue(CustIdForDynamicChange);
|
|
|
|
|
|
setselectSearchDefaultValue();
|
|
|
|
|
|
formRef.current?.resetFields();
|
|
|
|
|
|
};
|
|
|
|
|
|
const validateEmail = (_, value) => {
|
|
|
|
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
|
|
|
|
if (!value || emailRegex.test(value)) {
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
}
|
|
|
|
|
|
return Promise.reject('Invalid email address');
|
|
|
|
|
|
};
|
|
|
|
|
|
const ClearMobileInput = () => {
|
|
|
|
|
|
setInputValue('');
|
|
|
|
|
|
setIsOpen(false);
|
|
|
|
|
|
setCusDetails(false);
|
|
|
|
|
|
formRef.current?.resetFields();
|
|
|
|
|
|
};
|
|
|
|
|
|
const handleCustomerSelectChange = (value, option) => {
|
|
|
|
|
|
handleSelectSuggestion(value);
|
|
|
|
|
|
setZipCodeData(false);
|
|
|
|
|
|
setIsOpen(false);
|
|
|
|
|
|
setselectSearchDefaultValue(
|
|
|
|
|
|
option[selectedSearchValue] !== null
|
|
|
|
|
|
? option[selectedSearchValue]
|
|
|
|
|
|
: option?.CustMobile
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
const handleSearchInputChange = (inputValue) => {
|
|
|
|
|
|
handleSelectSuggestion(inputValue);
|
|
|
|
|
|
};
|
|
|
|
|
|
const Onchangeoffertype = (a) => {
|
|
|
|
|
|
setofferType(a);
|
|
|
|
|
|
// dispatch(changeSetup_OfferType(a))
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const Handleoffervalue = (e) => {
|
|
|
|
|
|
formRef.current?.setFieldsValue({ OfferValue: e?.target?.value });
|
|
|
|
|
|
setOfferValue(e?.target?.value);
|
|
|
|
|
|
// dispatch(changeSetup_OfferValue(e?.target?.value))
|
|
|
|
|
|
};
|
|
|
|
|
|
const onchangeStatus = (e) => {
|
|
|
|
|
|
setMaritalstatus(e?.target?.value);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// const dobchange=(e)
|
|
|
|
|
|
const dobchange = async (date, dateString) => {
|
|
|
|
|
|
if (dateString) {
|
|
|
|
|
|
const Date1 = moment(dateString, ['DD-MM-YYYY']).format(
|
|
|
|
|
|
'YYYY-MM-DDTHH:mm:ss'
|
|
|
|
|
|
);
|
|
|
|
|
|
// formRef.current?.setFieldsValue({ ManufDate: Date1 })
|
|
|
|
|
|
await setDobDate(Date1);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const spousedobchange = async (date, dateString) => {
|
|
|
|
|
|
if (dateString) {
|
|
|
|
|
|
const Date1 = moment(dateString, ['DD-MM-YYYY']).format(
|
|
|
|
|
|
'YYYY-MM-DDTHH:mm:ss'
|
|
|
|
|
|
);
|
|
|
|
|
|
// formRef.current?.setFieldsValue({ ManufDate: Date1 })
|
|
|
|
|
|
await setSpouseDobDate(Date1);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
const anniversaryDatechange = async (date, dateString) => {
|
|
|
|
|
|
if (dateString) {
|
|
|
|
|
|
const Date1 = moment(dateString, ['DD-MM-YYYY']).format(
|
|
|
|
|
|
'YYYY-MM-DDTHH:mm:ss'
|
|
|
|
|
|
);
|
|
|
|
|
|
// formRef.current?.setFieldsValue({ ManufDate: Date1 })
|
|
|
|
|
|
await setanniversaryDate(Date1);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const updateImageUrl = (url) => {
|
|
|
|
|
|
setImageUrl(url);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const deliveryOptions = [
|
|
|
|
|
|
'Delivery Address',
|
|
|
|
|
|
'Billing Address',
|
|
|
|
|
|
'Both Address',
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
const handleAddOrUpdateAddress = () => {
|
|
|
|
|
|
const currentFormValues = formRef.current?.getFieldsValue() || {};
|
|
|
|
|
|
|
|
|
|
|
|
if (!currentFormValues?.Address1 || !currentFormValues?.Zip) {
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
setMessageData('Please enter Address Line1 and Zipcode before adding');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
const selectedAddressType =
|
|
|
|
|
|
editingIndex !== null
|
|
|
|
|
|
? addressTypes[editingIndex] || []
|
|
|
|
|
|
: addressTypes[Object.keys(addressTypes).length - 1] || [];
|
|
|
|
|
|
|
|
|
|
|
|
let addressType = '';
|
|
|
|
|
|
if (selectedAddressType.includes('Both Address')) {
|
|
|
|
|
|
addressType = 'Both Address';
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
selectedAddressType.includes('Delivery Address') &&
|
|
|
|
|
|
selectedAddressType.includes('Billing Address')
|
|
|
|
|
|
) {
|
|
|
|
|
|
addressType = 'Both Address';
|
|
|
|
|
|
} else if (selectedAddressType.includes('Delivery Address')) {
|
|
|
|
|
|
addressType = 'Delivery Address';
|
|
|
|
|
|
} else if (selectedAddressType.includes('Billing Address')) {
|
|
|
|
|
|
addressType = 'Billing Address';
|
|
|
|
|
|
}
|
|
|
|
|
|
const newAddress = {
|
|
|
|
|
|
AddressType: addressType,
|
|
|
|
|
|
Address1: currentFormValues?.Address1,
|
|
|
|
|
|
Address2: currentFormValues?.Address2 || '',
|
|
|
|
|
|
Zip: currentFormValues?.Zip,
|
|
|
|
|
|
City: currentFormValues?.City || '',
|
|
|
|
|
|
Dist: currentFormValues?.Dist || '',
|
|
|
|
|
|
State: currentFormValues?.State || '',
|
|
|
|
|
|
Latitude: currentFormValues?.Latitude || '',
|
|
|
|
|
|
Longitude: currentFormValues?.Longitude || '',
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (editingIndex !== null) {
|
|
|
|
|
|
// 🛠️ Update existing address
|
|
|
|
|
|
setAddressesList((prev) => {
|
|
|
|
|
|
const updated = [...prev];
|
|
|
|
|
|
updated[editingIndex] = newAddress;
|
|
|
|
|
|
setAddressPreview(updated);
|
|
|
|
|
|
return updated;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
setEditingIndex(null);
|
|
|
|
|
|
setMessageType('success');
|
|
|
|
|
|
setMessageData('Address updated successfully!');
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// ➕ Add new address
|
|
|
|
|
|
setAddressesList((prev) => {
|
|
|
|
|
|
const updated = [...prev, newAddress];
|
|
|
|
|
|
setAddressPreview(updated);
|
|
|
|
|
|
return updated;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
setMessageType('success');
|
|
|
|
|
|
setMessageData('Address added successfully!');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 🧹 Clear form
|
|
|
|
|
|
formRef.current?.setFieldsValue({
|
|
|
|
|
|
Address1: '',
|
|
|
|
|
|
AddressType: '',
|
|
|
|
|
|
Address2: '',
|
|
|
|
|
|
Zip: '',
|
|
|
|
|
|
City: '',
|
|
|
|
|
|
Dist: '',
|
|
|
|
|
|
State: '',
|
|
|
|
|
|
Latitude: '',
|
|
|
|
|
|
Longitude: '',
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
setZipCodeData(false);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleAddressTypeChange = (index, type, checked) => {
|
|
|
|
|
|
setAddressTypes((prev) => {
|
|
|
|
|
|
const updated = { ...prev };
|
|
|
|
|
|
let currentTypes = [...(updated[index] || [])];
|
|
|
|
|
|
|
|
|
|
|
|
if (type === 'Both Address') {
|
|
|
|
|
|
if (checked) {
|
|
|
|
|
|
currentTypes = [
|
|
|
|
|
|
'Delivery Address',
|
|
|
|
|
|
'Billing Address',
|
|
|
|
|
|
'Both Address',
|
|
|
|
|
|
];
|
|
|
|
|
|
// Clear other addresses when Both Address is selected
|
|
|
|
|
|
Object.keys(updated).forEach((i) => {
|
|
|
|
|
|
if (parseInt(i) !== index) {
|
|
|
|
|
|
updated[i] = [];
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
currentTypes = [];
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (checked) {
|
|
|
|
|
|
if (!currentTypes.includes(type)) {
|
|
|
|
|
|
currentTypes.push(type);
|
|
|
|
|
|
}
|
|
|
|
|
|
// If both Delivery and Billing are selected, add Both Address
|
|
|
|
|
|
if (
|
|
|
|
|
|
currentTypes.includes('Delivery Address') &&
|
|
|
|
|
|
currentTypes.includes('Billing Address')
|
|
|
|
|
|
) {
|
|
|
|
|
|
currentTypes.push('Both Address');
|
|
|
|
|
|
}
|
|
|
|
|
|
// Clear same type from other addresses
|
|
|
|
|
|
Object.keys(updated).forEach((i) => {
|
|
|
|
|
|
if (parseInt(i) !== index) {
|
|
|
|
|
|
updated[i] = (updated[i] || []).filter(
|
|
|
|
|
|
(opt) => opt !== type && opt !== 'Both Address'
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
currentTypes = currentTypes.filter(
|
|
|
|
|
|
(t) => t !== type && t !== 'Both Address'
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
updated[index] = currentTypes;
|
|
|
|
|
|
|
|
|
|
|
|
// Update addresses list
|
|
|
|
|
|
setAddressesList((prev) => {
|
|
|
|
|
|
const newList = prev.map((addr, i) => {
|
|
|
|
|
|
const opts = updated[i] || [];
|
|
|
|
|
|
let addressType = '';
|
|
|
|
|
|
|
|
|
|
|
|
if (opts.includes('Both Address')) addressType = 'Both Address';
|
|
|
|
|
|
else if (opts.includes('Delivery Address'))
|
|
|
|
|
|
addressType = 'Delivery Address';
|
|
|
|
|
|
else if (opts.includes('Billing Address'))
|
|
|
|
|
|
addressType = 'Billing Address';
|
|
|
|
|
|
|
|
|
|
|
|
return { ...addr, AddressType: addressType };
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
setAddressPreview(newList);
|
|
|
|
|
|
return newList;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return updated;
|
|
|
|
|
|
});
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleEditAddress = (index) => {
|
|
|
|
|
|
const addrToEdit = addressPreview[index];
|
|
|
|
|
|
|
|
|
|
|
|
formRef.current.setFieldsValue({
|
|
|
|
|
|
AddId: addrToEdit.AddId,
|
|
|
|
|
|
AddressType: addrToEdit.AddressType,
|
|
|
|
|
|
Address1: addrToEdit.Address1,
|
|
|
|
|
|
Address2: addrToEdit.Address2,
|
|
|
|
|
|
Zip: addrToEdit.Zip,
|
|
|
|
|
|
City: addrToEdit.City,
|
|
|
|
|
|
Dist: addrToEdit.Dist,
|
|
|
|
|
|
State: addrToEdit.State,
|
|
|
|
|
|
Latitude: addrToEdit.Latitude,
|
|
|
|
|
|
Longitude: addrToEdit.Longitude,
|
|
|
|
|
|
});
|
|
|
|
|
|
if (addrToEdit.Zip) {
|
|
|
|
|
|
setZipCodeData(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setEditingIndex(index);
|
|
|
|
|
|
|
|
|
|
|
|
// Scroll to and focus Address1 input
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
const addressForm = document.querySelector('.subinputForm');
|
|
|
|
|
|
const address1Input = document.querySelector('input[id*="Address1"]');
|
|
|
|
|
|
|
|
|
|
|
|
if (addressForm) {
|
|
|
|
|
|
addressForm.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (address1Input) {
|
|
|
|
|
|
address1Input.focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 100);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// const handleRemoveAddress = (index) => {
|
|
|
|
|
|
// setAddressPreview((prev) => prev.filter((_, i) => i !== index));
|
|
|
|
|
|
// setAddressesList((prev) => prev.filter((_, i) => i !== index));
|
|
|
|
|
|
|
|
|
|
|
|
// setNewAddress((prev) => prev.filter((_, i) => i !== index));
|
|
|
|
|
|
// setAddressTypes((prev) => {
|
|
|
|
|
|
// const updated = { ...prev };
|
|
|
|
|
|
// delete updated[index];
|
|
|
|
|
|
// return updated;
|
|
|
|
|
|
// });
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
const handleRemoveAddress = (index) => {
|
|
|
|
|
|
setAddressPreview((prev) =>
|
|
|
|
|
|
prev.map((item, i) =>
|
|
|
|
|
|
i === index ? { ...item, ActiveStatus: 'D' } : item
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
setAddressesList((prev) =>
|
|
|
|
|
|
prev.map((item, i) =>
|
|
|
|
|
|
i === index ? { ...item, ActiveStatus: 'D' } : item
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
setNewAddress((prev) =>
|
|
|
|
|
|
prev.map((item, i) =>
|
|
|
|
|
|
i === index ? { ...item, ActiveStatus: 'D' } : item
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<div className="BSBilling7-icon-flex">
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
title={
|
|
|
|
|
|
<div className="Holdmodel-title">
|
|
|
|
|
|
<FormHeader title={'Holding Orders'} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
open={hold}
|
|
|
|
|
|
width={900}
|
|
|
|
|
|
footer={null}
|
|
|
|
|
|
children={
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
className="BSC1Payment-HoldModel-cancleall"
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
danger
|
|
|
|
|
|
onClick={(e) => {
|
|
|
|
|
|
e?.stopPropagation();
|
|
|
|
|
|
removeAll();
|
|
|
|
|
|
}}
|
2026-02-04 19:16:18 +05:30
|
|
|
|
// onClick={() => statusFormatter(record,index)}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
>
|
|
|
|
|
|
Clear All
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="BSC1Payment-Tablediv">
|
|
|
|
|
|
<Tables
|
|
|
|
|
|
columns={columnshold}
|
|
|
|
|
|
data={Tabledata}
|
|
|
|
|
|
dataSource={Tabledata}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
handleCancel={props.handleHoldCancel}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="BSBilling7-icon-flex">
|
|
|
|
|
|
<Messages
|
|
|
|
|
|
messageType={messageType}
|
|
|
|
|
|
messageData={messageData}
|
|
|
|
|
|
onComplete={onComplete}
|
|
|
|
|
|
/>
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
width={650}
|
|
|
|
|
|
className={'AddCustomerModal'}
|
|
|
|
|
|
title={
|
|
|
|
|
|
<div className="Holdmodel-title">
|
|
|
|
|
|
<FormHeader
|
|
|
|
|
|
title={Searchopen ? 'Search Customer' : 'Add Customer'}
|
|
|
|
|
|
/>
|
|
|
|
|
|
{Searchopen && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
columnGap: '0.7rem',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<label
|
|
|
|
|
|
htmlFor="CustMobile"
|
|
|
|
|
|
className="search-addcustomer-inputlabel"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
selectedSearchValue === 'CustMobile' && '#1292EE',
|
|
|
|
|
|
color: selectedSearchValue === 'CustMobile' && '#fff',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<input
|
|
|
|
|
|
onChange={handleRadioChange}
|
|
|
|
|
|
type="radio"
|
|
|
|
|
|
value={'CustMobile'}
|
|
|
|
|
|
name="search"
|
|
|
|
|
|
id="CustMobile"
|
|
|
|
|
|
checked={selectedSearchValue === 'CustMobile'}
|
|
|
|
|
|
/>
|
|
|
|
|
|
Mobile
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<label
|
|
|
|
|
|
htmlFor="CustName"
|
|
|
|
|
|
className="search-addcustomer-inputlabel"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
selectedSearchValue === 'CustName' && '#1292EE',
|
|
|
|
|
|
color: selectedSearchValue === 'CustName' && '#fff',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<input
|
|
|
|
|
|
onChange={handleRadioChange}
|
|
|
|
|
|
type="radio"
|
|
|
|
|
|
value={'CustName'}
|
|
|
|
|
|
name="search"
|
|
|
|
|
|
id="CustName"
|
|
|
|
|
|
checked={selectedSearchValue === 'CustName'}
|
|
|
|
|
|
/>
|
|
|
|
|
|
Name
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<label
|
|
|
|
|
|
htmlFor="CustId"
|
|
|
|
|
|
className="search-addcustomer-inputlabel"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor:
|
|
|
|
|
|
selectedSearchValue === 'CustId' && '#1292EE',
|
|
|
|
|
|
color: selectedSearchValue === 'CustId' && '#fff',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<input
|
|
|
|
|
|
onChange={handleRadioChange}
|
|
|
|
|
|
type="radio"
|
|
|
|
|
|
value={'CustId'}
|
|
|
|
|
|
name="search"
|
|
|
|
|
|
id="CustId"
|
|
|
|
|
|
checked={selectedSearchValue === 'CustId'}
|
|
|
|
|
|
/>
|
|
|
|
|
|
Cust Id
|
|
|
|
|
|
</label>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
open={props.addcustomer}
|
|
|
|
|
|
// width={900}
|
|
|
|
|
|
footer={null}
|
|
|
|
|
|
children={
|
|
|
|
|
|
<Form ref={formRef} onFinish={handleSubmit} initialValues={''}>
|
|
|
|
|
|
<div style={{ height: '45vh', overflow: 'auto' }}>
|
|
|
|
|
|
<div className="CustMob-Name">
|
|
|
|
|
|
{!isSearching && (
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="CustMobile"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
pattern:
|
|
|
|
|
|
selectedSearchValue == 'CustMobile' && /^\d{10}$/,
|
|
|
|
|
|
message:
|
|
|
|
|
|
selectedSearchValue == 'CustMobile' &&
|
|
|
|
|
|
'Please Enter a Valid 10-digit Mobile Number',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
message:
|
|
|
|
|
|
selectedSearchValue == 'CustMobile'
|
|
|
|
|
|
? 'Please Enter Valid Mobile Number'
|
|
|
|
|
|
: selectedSearchValue == 'CustName'
|
|
|
|
|
|
? 'Please Enter Valid Name'
|
|
|
|
|
|
: selectedSearchValue == 'CustId' &&
|
2026-02-04 19:16:18 +05:30
|
|
|
|
'Please EnterCustomer Id',
|
2026-01-27 18:27:29 +05:30
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
{Searchopen && (
|
|
|
|
|
|
<Select
|
|
|
|
|
|
showSearch
|
|
|
|
|
|
value={selectSearchDefaultValue}
|
|
|
|
|
|
type={
|
|
|
|
|
|
!Searchopen
|
|
|
|
|
|
? 'number'
|
|
|
|
|
|
: selectedSearchValue === 'CustMobile'
|
|
|
|
|
|
? 'number'
|
|
|
|
|
|
: 'text'
|
|
|
|
|
|
}
|
|
|
|
|
|
style={{ width: 250 }}
|
|
|
|
|
|
placeholder="Search to Select"
|
|
|
|
|
|
name="CustMobile"
|
|
|
|
|
|
optionFilterProp={selectedSearchValue}
|
|
|
|
|
|
filterOption={(input, option) =>
|
|
|
|
|
|
(option[selectedSearchValue] ?? '')
|
|
|
|
|
|
?.toLowerCase()
|
|
|
|
|
|
?.includes(input?.toLowerCase())
|
|
|
|
|
|
}
|
|
|
|
|
|
filterSort={(optionA, optionB) =>
|
|
|
|
|
|
(optionA[selectedSearchValue] ?? '')
|
|
|
|
|
|
?.toLowerCase()
|
|
|
|
|
|
?.localeCompare(
|
|
|
|
|
|
(
|
|
|
|
|
|
optionB[selectedSearchValue] ?? ''
|
|
|
|
|
|
)?.toLowerCase()
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
options={options}
|
|
|
|
|
|
onSelect={(value, option) =>
|
|
|
|
|
|
setselectSearchDefaultValue(
|
|
|
|
|
|
` ${option[selectedSearchValue] !== null ? option[selectedSearchValue] : option?.CustMobile}`
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
onChange={(value, option) =>
|
|
|
|
|
|
handleCustomerSelectChange(value, option)
|
|
|
|
|
|
}
|
|
|
|
|
|
onSearch={(inputValue) =>
|
|
|
|
|
|
handleSearchInputChange(inputValue)
|
|
|
|
|
|
}
|
|
|
|
|
|
onInputKeyDown={(e) => {
|
|
|
|
|
|
// Prevent minus sign and non-numeric characters for CustMobile and CustId
|
|
|
|
|
|
if (
|
|
|
|
|
|
(selectedSearchValue === 'CustMobile' ||
|
|
|
|
|
|
selectedSearchValue === 'CustId') &&
|
|
|
|
|
|
(e.key === '-' || e.key === 'e')
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Ensure max length is respected
|
|
|
|
|
|
if (
|
|
|
|
|
|
(selectedSearchValue === 'CustMobile' &&
|
|
|
|
|
|
e.target.value.length >= 10 &&
|
|
|
|
|
|
e.key !== 'Backspace') ||
|
|
|
|
|
|
(selectedSearchValue === 'CustId' &&
|
|
|
|
|
|
e.target.value.length >= 9 &&
|
|
|
|
|
|
e.key !== 'Backspace')
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Prevent numbers in name field
|
|
|
|
|
|
if (
|
|
|
|
|
|
selectedSearchValue === 'CustName' &&
|
|
|
|
|
|
!/^[A-Za-z]+$/.test(e.key) &&
|
|
|
|
|
|
e.key !== 'Backspace'
|
|
|
|
|
|
) {
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
onWheel={(e) => e.preventDefault()} // Prevent scrolling from changing input value
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{!Searchopen && (
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={
|
|
|
|
|
|
<label class="required">
|
|
|
|
|
|
{Searchopen
|
|
|
|
|
|
? selectedSearchValue == 'CustMobile'
|
|
|
|
|
|
? 'Enter Mobile'
|
|
|
|
|
|
: selectedSearchValue == 'CustName'
|
|
|
|
|
|
? 'Enter Name'
|
|
|
|
|
|
: selectedSearchValue == 'CustId' &&
|
2026-02-04 19:16:18 +05:30
|
|
|
|
'Enter Customer Id'
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: ' Mobile Number'}
|
|
|
|
|
|
</label>
|
|
|
|
|
|
}
|
|
|
|
|
|
id="fruitInput"
|
|
|
|
|
|
options={options}
|
|
|
|
|
|
value={inputValue}
|
|
|
|
|
|
type={
|
|
|
|
|
|
!Searchopen
|
|
|
|
|
|
? 'number'
|
|
|
|
|
|
: selectedSearchValue === 'CustMobile'
|
|
|
|
|
|
? 'number'
|
|
|
|
|
|
: 'text'
|
|
|
|
|
|
}
|
|
|
|
|
|
list="fruits"
|
|
|
|
|
|
maxLength={
|
|
|
|
|
|
!Searchopen || selectedSearchValue === 'CustMobile'
|
|
|
|
|
|
? 10
|
|
|
|
|
|
: undefined
|
|
|
|
|
|
}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
selectedSearchValue === 'CustMobile'
|
|
|
|
|
|
? inputValue?.length > 1
|
|
|
|
|
|
? true
|
|
|
|
|
|
: inputValue && true
|
|
|
|
|
|
: true
|
|
|
|
|
|
}
|
|
|
|
|
|
onChange={(e) =>
|
|
|
|
|
|
handleSelectSuggestion(e?.target?.value)
|
|
|
|
|
|
}
|
|
|
|
|
|
onInput={(e) => {
|
|
|
|
|
|
let value = e?.target.value;
|
|
|
|
|
|
|
|
|
|
|
|
if (!suggestionClicked) {
|
|
|
|
|
|
// Allow only digits
|
|
|
|
|
|
value = value?.replace(/\D/g, '');
|
|
|
|
|
|
|
|
|
|
|
|
// Restrict starting digits to 6, 7, 8, 9
|
|
|
|
|
|
if (
|
|
|
|
|
|
value?.length === 1 &&
|
|
|
|
|
|
!/^[6-9]$/.test(value)
|
|
|
|
|
|
) {
|
|
|
|
|
|
value = '';
|
|
|
|
|
|
setMessageData('Incorrect Number');
|
|
|
|
|
|
setMessageType('error');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Restrict to max 10 digits
|
|
|
|
|
|
if (value?.length > 10) {
|
|
|
|
|
|
value = value?.slice(0, 10);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Update the input field value
|
|
|
|
|
|
e.target.value = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
setSuggestionClicked(false);
|
|
|
|
|
|
}}
|
|
|
|
|
|
suffix={
|
|
|
|
|
|
inputValue?.length >= 1 ? (
|
|
|
|
|
|
<IoCloseSharp onClick={ClearMobileInput} />
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<div></div>
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{!Searchopen && (
|
|
|
|
|
|
<datalist id="fruits">
|
|
|
|
|
|
{suggestions
|
|
|
|
|
|
?.filter(
|
|
|
|
|
|
(suggestion) => suggestion[selectedSearchValue]
|
|
|
|
|
|
)
|
|
|
|
|
|
?.map((suggestion, index) => (
|
|
|
|
|
|
<option
|
|
|
|
|
|
className="custom-suggestion-item"
|
|
|
|
|
|
key={index}
|
|
|
|
|
|
name={suggestion.MobileNo}
|
|
|
|
|
|
onMouseDown={() => {
|
|
|
|
|
|
setSuggestionClicked(true);
|
|
|
|
|
|
setInputValue(
|
|
|
|
|
|
suggestion[selectedSearchValue]
|
|
|
|
|
|
);
|
|
|
|
|
|
}}
|
|
|
|
|
|
value={suggestion[selectedSearchValue]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<span>
|
|
|
|
|
|
{selectedSearchValue == 'CustName'
|
|
|
|
|
|
? suggestion?.CustMobile
|
|
|
|
|
|
: suggestion?.CustName}
|
|
|
|
|
|
{selectedSearchValue === 'CustId' && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
CustId:
|
|
|
|
|
|
{
|
|
|
|
|
|
suggestion?.CustId?.match(
|
|
|
|
|
|
/-(\d+)$/
|
|
|
|
|
|
)?.[1]
|
|
|
|
|
|
}
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</option>
|
|
|
|
|
|
))}
|
|
|
|
|
|
</datalist>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{searchResults.length > 0 && (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<p>Search Results:</p>
|
|
|
|
|
|
<ul>
|
|
|
|
|
|
{searchResults.map((result, index) => (
|
|
|
|
|
|
<li key={index}>{result}</li>
|
|
|
|
|
|
))}
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<div></div>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
)}
|
|
|
|
|
|
<div className="search-and-addcust">
|
|
|
|
|
|
{Searchopen ? (
|
|
|
|
|
|
<div style={{ alignItems: 'center' }}>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="tooltip"
|
|
|
|
|
|
placement="bottom"
|
|
|
|
|
|
title={'Add Customer'}
|
|
|
|
|
|
>
|
|
|
|
|
|
<span className="tooltiptext">Add Customer</span>
|
|
|
|
|
|
<IoPersonAddSharp
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: 'rgb(18, 146, 238)',
|
|
|
|
|
|
fontSize: '20px',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={HandleSearch}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<div style={{ alignItems: 'center' }}>
|
|
|
|
|
|
<div className="tooltip" placement="bottom">
|
|
|
|
|
|
<span className="tooltiptext">Search Customer</span>
|
|
|
|
|
|
<IoSearchOutline
|
|
|
|
|
|
style={{
|
|
|
|
|
|
color: 'rgb(18, 146, 238)',
|
|
|
|
|
|
fontSize: '26px',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={HandleSearch}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
className={
|
|
|
|
|
|
CusDetails ? 'BSC1-CusDetails' : 'BSC1-CusDetails1'
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div className="BSC1-Basicdetails">
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="CustName"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
pattern: /^(?!\s*$).+/,
|
|
|
|
|
|
message: 'Please Enter Customer Name',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
await validateSafeInput(value); // To block HTML tags & SQL keywords
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label>Customer Name</label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.CustName ||
|
2026-02-04 19:16:18 +05:30
|
|
|
|
inputValue
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="CustShortName"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
pattern: /^(?!\s*$).+/,
|
|
|
|
|
|
message: 'Please Enter Customer Short Name',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
await validateSafeInput(value); // To block HTML tags & SQL keywords
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label>Customer Short Name </label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.CustShortName
|
|
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item name={'Gender'}>
|
|
|
|
|
|
<RadioGrpButton
|
|
|
|
|
|
Header={'Gender'}
|
|
|
|
|
|
content={[
|
|
|
|
|
|
{ label: 'Male', value: 'M' },
|
|
|
|
|
|
{ label: 'Female', value: 'F' },
|
|
|
|
|
|
]}
|
|
|
|
|
|
// value={formRef.current?.getFieldsValue()?.Gender}
|
|
|
|
|
|
defaultSelect={gender}
|
|
|
|
|
|
onSelectFuntion={(e) => {
|
|
|
|
|
|
setGender(e);
|
|
|
|
|
|
formRef.current.setFieldsValue({ Gender: e });
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item name={'AadhaarNo'}>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={'Aadhaar No'}
|
|
|
|
|
|
maxLength={12}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.AadhaarNo
|
|
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
inputMode="numeric"
|
|
|
|
|
|
onInput={(e) => {
|
|
|
|
|
|
e.target.value = e.target.value.replace(/\D/g, '');
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<div className="upload_btn emp-master-form__upload">
|
|
|
|
|
|
<p>Upload Profile</p>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="CustomerProfile"
|
2026-02-04 19:16:18 +05:30
|
|
|
|
// getValueFromEvent={(e) =>
|
|
|
|
|
|
// formType === 'edit' ? editstate?.EmpPhotoLink : e
|
|
|
|
|
|
// }
|
2026-01-27 18:27:29 +05:30
|
|
|
|
>
|
|
|
|
|
|
<Imageupload
|
|
|
|
|
|
singleImage={true}
|
|
|
|
|
|
updateImageUrl={updateImageUrl}
|
|
|
|
|
|
ImageLink={(() => {
|
|
|
|
|
|
const link =
|
|
|
|
|
|
formRef.current?.getFieldsValue()
|
|
|
|
|
|
?.CustomerProfile || ImageUrl;
|
|
|
|
|
|
// Always return a string
|
|
|
|
|
|
return typeof link === 'string' ? link : '';
|
|
|
|
|
|
})()}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{/* <p
|
|
|
|
|
|
onClick={handleToggle}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize: '13px',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
padding: '1rem 0.3rem',
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
// alignItems: "center",
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
columnGap: '0.3rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{' '}
|
|
|
|
|
|
{isOpen ? 'More info close' : 'More info open'}{' '}
|
|
|
|
|
|
<AiOutlineDownCircle />
|
|
|
|
|
|
</p> */}
|
|
|
|
|
|
<p
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize: '13px',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
padding: '1rem 0.3rem',
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
// alignItems: "center",
|
|
|
|
|
|
flexDirection: 'row',
|
|
|
|
|
|
columnGap: '0.3rem',
|
|
|
|
|
|
color: 'rgb(18, 146, 238)',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{' '}
|
|
|
|
|
|
{isOpen ? (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
alignItems: 'flex-start',
|
|
|
|
|
|
gap: '4px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={handleToggle}
|
|
|
|
|
|
>
|
|
|
|
|
|
More info close{' '}
|
|
|
|
|
|
<AiOutlineUpCircle style={{ marginTop: '4px' }} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
alignItems: 'flex-start',
|
|
|
|
|
|
gap: '4px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
onClick={handleToggle}
|
|
|
|
|
|
>
|
|
|
|
|
|
More info open{' '}
|
|
|
|
|
|
<AiOutlineDownCircle style={{ marginTop: '4px' }} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}{' '}
|
|
|
|
|
|
</p>
|
|
|
|
|
|
{
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{ display: !isOpen && 'none' }}
|
|
|
|
|
|
className="BSC1-AdressInputs"
|
|
|
|
|
|
>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="CustEmail"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
// required: true,
|
|
|
|
|
|
message: 'Please enter Customer Email',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: validateEmail,
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label="Email Id"
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.CustEmail
|
|
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="CustGSTIN"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
pattern:
|
|
|
|
|
|
/^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Za-z]{1}[Z]{1}[0-9A-Za-z]{1}$/,
|
|
|
|
|
|
message: 'Enter a valid GSTIN',
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
style={{ textTransform: 'uppercase' }}
|
|
|
|
|
|
autoComplete="off"
|
|
|
|
|
|
label="GST No"
|
|
|
|
|
|
autocapitalize="on"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.CustGSTIN
|
|
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
{isOpen && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<div className="formAddressDiv">
|
|
|
|
|
|
<p> Address Details</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div className="customer-address-details-list">
|
|
|
|
|
|
{addressPreview.length > 0 ? (
|
|
|
|
|
|
addressPreview
|
|
|
|
|
|
?.filter((addr) => addr.ActiveStatus !== 'D')
|
|
|
|
|
|
?.map((addr, idx) => (
|
|
|
|
|
|
<div key={idx} className="address-card">
|
|
|
|
|
|
<div className="address-header">
|
|
|
|
|
|
<div className="header-left">
|
|
|
|
|
|
<h4>Address {idx + 1}</h4>
|
|
|
|
|
|
{/* <h4>Address</h4> */}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<div className="address-type-section">
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Checkbox
|
|
|
|
|
|
checked={(
|
|
|
|
|
|
addressTypes[idx] || []
|
|
|
|
|
|
).includes('Delivery Address')}
|
|
|
|
|
|
onChange={(e) =>
|
|
|
|
|
|
handleAddressTypeChange(
|
|
|
|
|
|
idx,
|
|
|
|
|
|
'Delivery Address',
|
|
|
|
|
|
e.target.checked
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
Delivery Address
|
|
|
|
|
|
</Checkbox>
|
|
|
|
|
|
<Checkbox
|
|
|
|
|
|
checked={(
|
|
|
|
|
|
addressTypes[idx] || []
|
|
|
|
|
|
).includes('Billing Address')}
|
|
|
|
|
|
onChange={(e) =>
|
|
|
|
|
|
handleAddressTypeChange(
|
|
|
|
|
|
idx,
|
|
|
|
|
|
'Billing Address',
|
|
|
|
|
|
e.target.checked
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
Billing Address
|
|
|
|
|
|
</Checkbox>
|
|
|
|
|
|
<Checkbox
|
|
|
|
|
|
checked={(
|
|
|
|
|
|
addressTypes[idx] || []
|
|
|
|
|
|
).includes('Both Address')}
|
|
|
|
|
|
onChange={(e) =>
|
|
|
|
|
|
handleAddressTypeChange(
|
|
|
|
|
|
idx,
|
|
|
|
|
|
'Both Address',
|
|
|
|
|
|
e.target.checked
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
Both Address
|
|
|
|
|
|
</Checkbox>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<div className="address-details-grid">
|
|
|
|
|
|
<div className="address-detail-item address1">
|
|
|
|
|
|
<div className="value">
|
|
|
|
|
|
{addr?.Address1 || ''}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<div className="address-detail-item address2">
|
|
|
|
|
|
<div className="value">
|
|
|
|
|
|
{addr?.Address2 || ''}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<div className="address-detail-item zip">
|
|
|
|
|
|
<div className="value">
|
|
|
|
|
|
{addr?.Zip || ''}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<div className="address-detail-item city">
|
|
|
|
|
|
<div className="value">
|
|
|
|
|
|
{addr?.City || ''}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<div className="address-detail-item district">
|
|
|
|
|
|
<div className="value">
|
|
|
|
|
|
{addr?.Dist || ''}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<div className="address-detail-item state">
|
|
|
|
|
|
<div className="value">
|
|
|
|
|
|
{addr?.State || ''}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
2026-02-04 18:10:12 +05:30
|
|
|
|
|
2026-02-04 19:16:18 +05:30
|
|
|
|
{addr?.Latitude && (
|
|
|
|
|
|
<div className="address-detail-item coordinates">
|
|
|
|
|
|
<div className="value coordinates">
|
|
|
|
|
|
<MdLocationOn />{' '}
|
|
|
|
|
|
{addr?.Latitude || ''},{' '}
|
|
|
|
|
|
{addr?.Longitude || ''}
|
2026-02-04 18:10:12 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div className="header-actions">
|
|
|
|
|
|
<button
|
|
|
|
|
|
type="button"
|
|
|
|
|
|
onClick={() => handleEditAddress(idx)}
|
|
|
|
|
|
className="edit-btn"
|
|
|
|
|
|
>
|
|
|
|
|
|
<FaEdit /> Edit
|
|
|
|
|
|
</button>
|
|
|
|
|
|
|
|
|
|
|
|
<Popconfirm
|
|
|
|
|
|
title="Remove Address"
|
|
|
|
|
|
description="Are you sure you want to remove this address?"
|
|
|
|
|
|
onConfirm={() => handleRemoveAddress(idx)}
|
|
|
|
|
|
okText="Yes, Remove"
|
|
|
|
|
|
cancelText="Cancel"
|
|
|
|
|
|
okType="danger"
|
|
|
|
|
|
>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
<button
|
2026-02-04 19:16:18 +05:30
|
|
|
|
className="remove-btn"
|
2026-01-27 18:27:29 +05:30
|
|
|
|
type="button"
|
|
|
|
|
|
>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
<FaTrash /> Remove
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</button>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</Popconfirm>
|
2026-01-27 18:27:29 +05:30
|
|
|
|
</div>
|
2026-02-04 19:16:18 +05:30
|
|
|
|
</div>
|
|
|
|
|
|
))
|
2026-01-27 18:27:29 +05:30
|
|
|
|
) : (
|
|
|
|
|
|
<div className="empty-state">
|
|
|
|
|
|
<MdHome />
|
|
|
|
|
|
<h3>No addresses added yet</h3>
|
|
|
|
|
|
<p>
|
|
|
|
|
|
Add your first address using the form below
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{/* Single Address Input Form */}
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="subinputForm"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
border: '1px solid #ddd',
|
|
|
|
|
|
borderRadius: '8px',
|
|
|
|
|
|
padding: '16px',
|
|
|
|
|
|
marginBottom: '16px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<h4
|
|
|
|
|
|
style={{ marginBottom: '12px', color: '#1677ff' }}
|
|
|
|
|
|
>
|
|
|
|
|
|
Address Form
|
|
|
|
|
|
</h4>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
|
gap: '16px',
|
|
|
|
|
|
alignItems: 'flex-start',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{/* Address1 */}
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="Address1"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
// { required: true, pattern: /^(?!\s*$).+/, message: "Please Enter Address1" },
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
await validateSafeInput(value);
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
field="Address1"
|
|
|
|
|
|
autoComplete="off"
|
|
|
|
|
|
label={
|
|
|
|
|
|
<label className="required">
|
|
|
|
|
|
Address Line1
|
|
|
|
|
|
</label>
|
|
|
|
|
|
}
|
|
|
|
|
|
fieldState={true}
|
|
|
|
|
|
fieldApi={true}
|
|
|
|
|
|
isOnChange={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
{/* Address2 */}
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="Address2"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
pattern: /^(?!\s*$).+/,
|
|
|
|
|
|
message: 'Please Enter Address2',
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
await validateSafeInput(value);
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
field="Address2"
|
|
|
|
|
|
autoComplete="off"
|
|
|
|
|
|
label="Address Line2"
|
|
|
|
|
|
fieldState={true}
|
|
|
|
|
|
fieldApi={true}
|
|
|
|
|
|
isOnChange={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
{/* Zip */}
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="Zip"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
// { required: true, pattern: /^(?!\s*$).+/, message: "Please Enter Zipcode" },
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
await validateSafeInput(value);
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
field="Zip"
|
|
|
|
|
|
autoComplete="off"
|
|
|
|
|
|
label={
|
|
|
|
|
|
<label className="required">Zipcode</label>
|
|
|
|
|
|
}
|
|
|
|
|
|
maxLength={6}
|
|
|
|
|
|
fieldState={true}
|
|
|
|
|
|
fieldApi={true}
|
|
|
|
|
|
isOnChange={true}
|
|
|
|
|
|
onChange={(e) => pinCodeChange(e, 0)}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
{zipCodeData && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="City"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
// { required: true },
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
await validateSafeInput(value);
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
field="City"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
label="City"
|
|
|
|
|
|
fieldState={true}
|
|
|
|
|
|
fieldApi={true}
|
|
|
|
|
|
isOnChange={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="Dist"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
// { required: true },
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
await validateSafeInput(value);
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
field="Dist"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
label="District"
|
|
|
|
|
|
fieldState={true}
|
|
|
|
|
|
fieldApi={true}
|
|
|
|
|
|
isOnChange={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="State"
|
2026-02-04 19:16:18 +05:30
|
|
|
|
// rules={[{ required: true }]}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
field="State"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
label="State"
|
|
|
|
|
|
fieldState={true}
|
|
|
|
|
|
fieldApi={true}
|
|
|
|
|
|
isOnChange={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{/* Add Address Button */}
|
|
|
|
|
|
<button
|
|
|
|
|
|
type="button"
|
|
|
|
|
|
onClick={handleAddOrUpdateAddress}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
backgroundColor: '#1677ff',
|
|
|
|
|
|
color: '#fff',
|
|
|
|
|
|
padding: '6px 12px',
|
|
|
|
|
|
border: 'none',
|
|
|
|
|
|
borderRadius: '6px',
|
|
|
|
|
|
cursor: 'pointer',
|
|
|
|
|
|
marginTop: '8px',
|
|
|
|
|
|
fontWeight: '500',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{editingIndex !== null
|
|
|
|
|
|
? 'Update Address'
|
|
|
|
|
|
: 'Add Address'}
|
|
|
|
|
|
</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<div className="customerOffer">
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={
|
|
|
|
|
|
offerType == 'P'
|
|
|
|
|
|
? {
|
2026-02-04 19:16:18 +05:30
|
|
|
|
opacity: '1',
|
|
|
|
|
|
boxShadow:
|
|
|
|
|
|
'rgba(0, 0, 0, 0.05) 0px 6px 24px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px',
|
|
|
|
|
|
margin: '3px',
|
|
|
|
|
|
padding: '5px',
|
|
|
|
|
|
backgroundColor: '#fff',
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: { opacity: '0.6', boxShadow: 'none' }
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
Onchangeoffertype('P');
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<GrCheckboxSelected />
|
|
|
|
|
|
<p style={{ fontSize: '13px', textWrap: 'nowrap' }}>
|
|
|
|
|
|
Percentage
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={
|
|
|
|
|
|
offerType == 'F'
|
|
|
|
|
|
? {
|
2026-02-04 19:16:18 +05:30
|
|
|
|
opacity: '1',
|
|
|
|
|
|
boxShadow:
|
|
|
|
|
|
'rgba(0, 0, 0, 0.05) 0px 6px 24px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px',
|
|
|
|
|
|
margin: '3px',
|
|
|
|
|
|
padding: '5px',
|
|
|
|
|
|
backgroundColor: '#fff',
|
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
: { opacity: '0.6', boxShadow: 'none' }
|
|
|
|
|
|
}
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
Onchangeoffertype('F');
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<BiCustomize />
|
|
|
|
|
|
<p style={{ fontSize: '13px', textWrap: 'nowrap' }}>
|
|
|
|
|
|
Fixed
|
|
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="OfferValue"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
validator: async (_, value) => {
|
|
|
|
|
|
// Check for unsafe input first
|
|
|
|
|
|
await validateSafeInput(value); // Blocks HTML tags & SQL keywords
|
|
|
|
|
|
|
|
|
|
|
|
// Allow empty values (assumes optional field)
|
|
|
|
|
|
if (value === undefined || value === '') {
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Ensure it's a number
|
|
|
|
|
|
if (isNaN(value)) {
|
|
|
|
|
|
return Promise.reject(
|
|
|
|
|
|
new Error('Offer Value must be a number')
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// If offer type is percentage, check range
|
|
|
|
|
|
if (offerType === 'P' && value >= 100) {
|
|
|
|
|
|
return Promise.reject(
|
|
|
|
|
|
new Error(
|
|
|
|
|
|
'Offer Value must be less than 100'
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return Promise.resolve();
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label>Offer Value</label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
OfferValue || OfferValue == 0 ? true : false
|
|
|
|
|
|
}
|
|
|
|
|
|
onChange={Handleoffervalue}
|
|
|
|
|
|
inputMode="decimal"
|
|
|
|
|
|
onInput={(e) => {
|
|
|
|
|
|
const cleanedValue = e.target.value.replace(
|
|
|
|
|
|
/[^0-9.]/g,
|
|
|
|
|
|
''
|
|
|
|
|
|
);
|
|
|
|
|
|
const parts = cleanedValue.split('.');
|
|
|
|
|
|
e.target.value =
|
|
|
|
|
|
parts.length > 2
|
|
|
|
|
|
? `${parts[0]}.${parts.slice(1).join('')}`
|
|
|
|
|
|
: cleanedValue;
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<Form.Item name="OfferActiveStatus">
|
|
|
|
|
|
<DropDowns
|
|
|
|
|
|
defaultValue={selectedValue}
|
|
|
|
|
|
options={yesNoOptions?.map((option) => ({
|
|
|
|
|
|
value: option?.value,
|
|
|
|
|
|
label: option?.label,
|
|
|
|
|
|
}))}
|
|
|
|
|
|
label={<label>Active / Deactive</label>}
|
|
|
|
|
|
className="field-DropDown"
|
|
|
|
|
|
onChangeFunction={(e) => handleYesOrNoChange(e)}
|
|
|
|
|
|
valueData={selectedValue}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{/* sree */}
|
|
|
|
|
|
<Form.Item name="CreditDays">
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label="Credit Days"
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
disabled={
|
|
|
|
|
|
InitialOutStandingType === 'Y' ? true : false
|
|
|
|
|
|
}
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.CustEmail ||
|
2026-02-04 19:16:18 +05:30
|
|
|
|
inputValue
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
inputMode="decimal"
|
|
|
|
|
|
onInput={(e) => {
|
|
|
|
|
|
const cleanedValue = e.target.value.replace(
|
|
|
|
|
|
/[^0-9.]/g,
|
|
|
|
|
|
''
|
|
|
|
|
|
);
|
|
|
|
|
|
const parts = cleanedValue.split('.');
|
|
|
|
|
|
e.target.value =
|
|
|
|
|
|
parts.length > 2
|
|
|
|
|
|
? `${parts[0]}.${parts.slice(1).join('')}`
|
|
|
|
|
|
: cleanedValue;
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item name="CreditLimit">
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
name="CreditLimit"
|
|
|
|
|
|
label="Credit Limits"
|
|
|
|
|
|
disabled={
|
|
|
|
|
|
InitialOutStandingType === 'Y' ? true : false
|
|
|
|
|
|
}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.CreditLimit ||
|
2026-02-04 19:16:18 +05:30
|
|
|
|
inputValue
|
2026-01-27 18:27:29 +05:30
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
inputMode="decimal"
|
|
|
|
|
|
onInput={(e) => {
|
|
|
|
|
|
const cleanedValue = e.target.value.replace(
|
|
|
|
|
|
/[^0-9.]/g,
|
|
|
|
|
|
''
|
|
|
|
|
|
);
|
|
|
|
|
|
const parts = cleanedValue.split('.');
|
|
|
|
|
|
e.target.value =
|
|
|
|
|
|
parts.length > 2
|
|
|
|
|
|
? `${parts[0]}.${parts.slice(1).join('')}`
|
|
|
|
|
|
: cleanedValue;
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item name="AmountType" label="Type of Amount">
|
|
|
|
|
|
<Switch
|
|
|
|
|
|
size="small"
|
|
|
|
|
|
checked={amountType === 'D'}
|
|
|
|
|
|
onChange={(checked) => {
|
|
|
|
|
|
const newValue = checked ? 'D' : 'C';
|
|
|
|
|
|
formRef.current?.setFieldsValue({
|
|
|
|
|
|
AmountType: newValue,
|
|
|
|
|
|
});
|
|
|
|
|
|
setAmountType(newValue);
|
|
|
|
|
|
}}
|
|
|
|
|
|
checkedChildren="Advance"
|
|
|
|
|
|
unCheckedChildren="Balance"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
{/* Then add the input field */}
|
|
|
|
|
|
<Form.Item name="OutStandingAmount">
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
field="OutStandingAmount"
|
|
|
|
|
|
name="OutStandingAmount"
|
|
|
|
|
|
label={
|
|
|
|
|
|
formRef.current?.getFieldValue('AmountType') === 'D'
|
|
|
|
|
|
? 'Out Standing Advance'
|
|
|
|
|
|
: 'Out Standing Balances'
|
|
|
|
|
|
}
|
|
|
|
|
|
disabled={InitialOutStandingType === 'Y'}
|
|
|
|
|
|
inputMode="numeric"
|
|
|
|
|
|
autoComplete="off"
|
|
|
|
|
|
fieldState={true}
|
|
|
|
|
|
fieldApi={true}
|
|
|
|
|
|
id="error2"
|
|
|
|
|
|
isOnChange={true}
|
|
|
|
|
|
value={formRef.current?.getFieldValue(
|
|
|
|
|
|
'OutStandingAmount'
|
|
|
|
|
|
)}
|
|
|
|
|
|
onChange={(e) => {
|
|
|
|
|
|
let value = e.target.value.replace(/[^0-9.]/g, '');
|
|
|
|
|
|
// Handle decimal points
|
|
|
|
|
|
const parts = value.split('.');
|
|
|
|
|
|
if (parts.length > 2) {
|
|
|
|
|
|
value = `${parts[0]}.${parts.slice(1).join('')}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
// Limit to 2 decimal places
|
|
|
|
|
|
if (parts.length === 2 && parts[1].length > 2) {
|
|
|
|
|
|
value = `${parts[0]}.${parts[1].slice(0, 2)}`;
|
|
|
|
|
|
}
|
|
|
|
|
|
formRef.current?.setFieldsValue({
|
|
|
|
|
|
OutStandingAmount: value,
|
|
|
|
|
|
});
|
|
|
|
|
|
}}
|
|
|
|
|
|
onKeyDown={(e) => {
|
|
|
|
|
|
// Allow backspace, delete, arrow keys, tab
|
|
|
|
|
|
if (
|
|
|
|
|
|
[
|
|
|
|
|
|
'Backspace',
|
|
|
|
|
|
'Delete',
|
|
|
|
|
|
'ArrowLeft',
|
|
|
|
|
|
'ArrowRight',
|
|
|
|
|
|
'Tab',
|
|
|
|
|
|
].includes(e.key)
|
|
|
|
|
|
) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// Allow numbers and a single decimal point
|
|
|
|
|
|
if (!/[\d.]/.test(e.key)) {
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// Prevent multiple decimal points
|
|
|
|
|
|
if (e.key === '.' && e.target.value.includes('.')) {
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
}
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
{/* <div className="upload_btn">
|
|
|
|
|
|
<p>Upload Document</p>
|
|
|
|
|
|
<Form.Item name="Document" valuePropName="ImageLink">
|
|
|
|
|
|
<Imageupload
|
|
|
|
|
|
singleImage={true}
|
|
|
|
|
|
updateImageUrl={updateImageUrl}
|
|
|
|
|
|
ImageLink={
|
|
|
|
|
|
formRef.current?.getFieldsValue()?.UserImage ||
|
|
|
|
|
|
ImageUrl
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
</div> */}
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
paddingLeft: '10px',
|
|
|
|
|
|
flexDirection: 'column',
|
|
|
|
|
|
rowGap: '0.5rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<label style={{ fontWeight: '600' }}>
|
|
|
|
|
|
Marital Status{' '}
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<Radio.Group
|
|
|
|
|
|
onChange={onchangeStatus}
|
|
|
|
|
|
value={Maritalstatus}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Radio value={'N'}>Single</Radio>
|
|
|
|
|
|
<Radio value={'Y'}>Married </Radio>
|
|
|
|
|
|
</Radio.Group>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
alignitems: 'center',
|
|
|
|
|
|
padding: '0px 10px',
|
|
|
|
|
|
columnGap: '2rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<label style={{ fontWeight: '600' }}>
|
|
|
|
|
|
Date of Birth
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<DatePicProd
|
|
|
|
|
|
canSelectPast={true}
|
|
|
|
|
|
onChange={dobchange}
|
|
|
|
|
|
valueData={DobDate}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{Maritalstatus == 'Y' && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
alignitems: 'center',
|
|
|
|
|
|
columnGap: '2rem',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<label style={{ fontWeight: '600' }}>
|
|
|
|
|
|
{' '}
|
|
|
|
|
|
Spouse DOB
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<DatePicProd
|
|
|
|
|
|
canSelectPast={true}
|
|
|
|
|
|
onChange={spousedobchange}
|
|
|
|
|
|
valueData={SpouseDobDate}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<label style={{ fontWeight: '600' }}>
|
|
|
|
|
|
Anniversary Date
|
|
|
|
|
|
</label>
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<DatePicProd
|
|
|
|
|
|
canSelectPast={true}
|
|
|
|
|
|
onChange={anniversaryDatechange}
|
|
|
|
|
|
valueData={anniversaryDate}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
|
|
|
|
|
|
<Buttons
|
|
|
|
|
|
buttonText="SUBMIT"
|
|
|
|
|
|
color="901D77"
|
|
|
|
|
|
icon={<ArrowRightOutlined />}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</Form>
|
|
|
|
|
|
}
|
|
|
|
|
|
handleCancel={
|
|
|
|
|
|
// props.handleAddCustomerCancel
|
|
|
|
|
|
|
|
|
|
|
|
HandleCloseModal
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{/* <div>
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
title={
|
|
|
|
|
|
<div className="Holdmodel-title">
|
|
|
|
|
|
<FormHeader title={'Reprint'} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
open={props.reprint}
|
|
|
|
|
|
width={1000}
|
|
|
|
|
|
footer={null}
|
|
|
|
|
|
children={<BSReprint />}
|
|
|
|
|
|
handleCancel={props.handleReprintCancel}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div> */}
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
open={props.QuickAdd}
|
|
|
|
|
|
width={800}
|
|
|
|
|
|
footer={false}
|
|
|
|
|
|
children={
|
|
|
|
|
|
// cardData Mohan 18-4-2025
|
|
|
|
|
|
<ProductForm
|
|
|
|
|
|
formType="add"
|
|
|
|
|
|
handleCancelData={props.handleQuickAddCancel}
|
|
|
|
|
|
ProductSearch={props.ProductSearch}
|
|
|
|
|
|
ProductSearchType={props.ProductSearchType}
|
|
|
|
|
|
cardData={props.cardData}
|
|
|
|
|
|
/>
|
|
|
|
|
|
}
|
|
|
|
|
|
handleCancel={props.handleQuickAddCancel}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
open={props.ExtraCharges}
|
|
|
|
|
|
width={900}
|
|
|
|
|
|
footer={false}
|
|
|
|
|
|
children={
|
|
|
|
|
|
<>
|
|
|
|
|
|
<h1 class="formHeader">Extra Charges</h1>
|
|
|
|
|
|
|
|
|
|
|
|
<div style={{ display: 'flex' }}>
|
|
|
|
|
|
<Checkbox
|
|
|
|
|
|
checked={Checkbox1 ? true : false}
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
setCheckbox1(!Checkbox1);
|
|
|
|
|
|
}}
|
|
|
|
|
|
></Checkbox>{' '}
|
|
|
|
|
|
<p>Overall orders </p> {' '}
|
|
|
|
|
|
|
|
|
|
|
|
<Checkbox
|
|
|
|
|
|
checked={!Checkbox1 ? true : false}
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
setCheckbox1(!Checkbox1);
|
|
|
|
|
|
}}
|
|
|
|
|
|
></Checkbox>{' '}
|
|
|
|
|
|
{/* {!Checkbox1 ? ( */}
|
|
|
|
|
|
<p> Individual orders</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<Form ref={formRefExtraCharges} onFinish={globalamount1}>
|
|
|
|
|
|
{!Checkbox1 && (
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="Extracharges"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
message: 'Please Select Dropdown',
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div style={{ display: 'flex' }}>
|
|
|
|
|
|
<DropDowns
|
|
|
|
|
|
defaultValue={selectedProduct}
|
|
|
|
|
|
options={CartOrderDetails?.map((option) => ({
|
|
|
|
|
|
value:
|
|
|
|
|
|
option?.InwardDtlId +
|
|
|
|
|
|
' ' +
|
|
|
|
|
|
option?.BookingTypeName +
|
|
|
|
|
|
' ' +
|
|
|
|
|
|
option?.SinglePc,
|
|
|
|
|
|
// label: option.Type === 'P' ? option.ProdVariantName !== 'Variant 1'
|
|
|
|
|
|
// ? `${option?.ProdName} (${option.Size} ${option.UomName}) (${option.ProdVariantName}${BookingTypeBoth ? ` (${option?.BookingTypeName})` : ''})`
|
|
|
|
|
|
// : `${option?.ProdName} (${option.Size} ${option.UomName}) ${BookingTypeBoth ? ` (${option?.BookingTypeName})` : ''}`
|
|
|
|
|
|
// : `${option?.ProdName} (1 Combo)`
|
|
|
|
|
|
label:
|
|
|
|
|
|
option.Type === 'P'
|
|
|
|
|
|
? option.ProdVariantName !== 'Variant 1'
|
|
|
|
|
|
? `${option?.ProdName} (${option.Size} ${option?.SinglePc === 'PCS' ? 'PCS' : option.UomName}) (${option.ProdVariantName}${BookingTypeBoth ? ` (${option?.BookingTypeName})` : ''})`
|
|
|
|
|
|
: `${option?.ProdName} (${option.Size}${option?.SinglePc === 'PCS' ? 'PCS' : option.UomName}) ${BookingTypeBoth ? ` (${option?.BookingTypeName})` : ''}`
|
|
|
|
|
|
: `${option?.ProdName} (1 Combo)`,
|
|
|
|
|
|
}))}
|
|
|
|
|
|
label={<label className="required">Product Name</label>}
|
|
|
|
|
|
className="field-DropDown"
|
|
|
|
|
|
onChangeFunction={(e) => onChangeProduct(e)}
|
|
|
|
|
|
valueData={selectedProduct}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
)}
|
|
|
|
|
|
<div>
|
|
|
|
|
|
{Checkbox1 ? (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<Table
|
|
|
|
|
|
components={components}
|
|
|
|
|
|
rowClassName={() => 'editable-row'}
|
|
|
|
|
|
bordered
|
|
|
|
|
|
dataSource={dataSource}
|
|
|
|
|
|
columns={columns}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
{/* JSX specific to false branch */}
|
|
|
|
|
|
<Table
|
|
|
|
|
|
dataSource={dataSource1}
|
|
|
|
|
|
columns={defaultColumns1}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
{!Checkbox1 && (
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
justifyContent: 'right',
|
|
|
|
|
|
width: '100%',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: 'flex',
|
|
|
|
|
|
justifyContent: 'flex-end',
|
|
|
|
|
|
width: '100px',
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Buttons
|
|
|
|
|
|
buttonText="SAVE"
|
|
|
|
|
|
color="901D77"
|
|
|
|
|
|
icon={<ArrowRightOutlined />}
|
2026-02-04 19:16:18 +05:30
|
|
|
|
// handleSubmit={() => { globalamount1() }}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{!Checkbox1 && (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<Table
|
|
|
|
|
|
columns={columns1}
|
|
|
|
|
|
rowClassName={() => 'editable-row'}
|
|
|
|
|
|
components={components1}
|
|
|
|
|
|
bordered
|
|
|
|
|
|
dataSource={TableName}
|
|
|
|
|
|
width={'120px'}
|
2026-02-04 19:16:18 +05:30
|
|
|
|
//pagination={column2?.length < "11" ? false : true}
|
2026-01-27 18:27:29 +05:30
|
|
|
|
></Table>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{Checkbox1 && (
|
|
|
|
|
|
<div style={{ display: 'flex' }}>
|
|
|
|
|
|
<h3>Total Amount:</h3>
|
|
|
|
|
|
<h3>{safeRound(totalAmount)}</h3>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}{' '}
|
|
|
|
|
|
<br />
|
|
|
|
|
|
{Checkbox1 && (
|
|
|
|
|
|
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
|
|
|
|
|
|
<Buttons
|
|
|
|
|
|
buttonText="SUBMIT"
|
|
|
|
|
|
color="901D77"
|
|
|
|
|
|
icon={<ArrowRightOutlined />}
|
|
|
|
|
|
handleSubmit={() => {
|
|
|
|
|
|
globalamount(extdata);
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
{!Checkbox1 && (
|
|
|
|
|
|
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
|
|
|
|
|
|
<Buttons
|
|
|
|
|
|
buttonText="SUBMIT"
|
|
|
|
|
|
color="901D77"
|
|
|
|
|
|
icon={<ArrowRightOutlined />}
|
|
|
|
|
|
handleSubmit={() => {
|
|
|
|
|
|
globalamount2(TableName);
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</Form>
|
|
|
|
|
|
</>
|
|
|
|
|
|
}
|
|
|
|
|
|
handleCancel={props.ExtraChargesCancle}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<DefaultModal
|
|
|
|
|
|
open={WeightScale}
|
|
|
|
|
|
title="Item Info"
|
|
|
|
|
|
width={1000}
|
|
|
|
|
|
footer={false}
|
|
|
|
|
|
children={
|
|
|
|
|
|
<>
|
|
|
|
|
|
<br />
|
|
|
|
|
|
<div className="WeightScaleMainDiv">
|
|
|
|
|
|
<Form ref={formWsRef} onFinish={onFinish}>
|
|
|
|
|
|
<div className="WeightScaleSubDiv">
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="ItemName"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
message: 'Please Enter Item Name',
|
|
|
|
|
|
},
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<AutoComplete
|
|
|
|
|
|
value={ProductValue}
|
|
|
|
|
|
options={WSProductList?.map((option) => ({
|
|
|
|
|
|
value: option.ProdName,
|
|
|
|
|
|
label: option.ProdName,
|
|
|
|
|
|
}))}
|
|
|
|
|
|
style={{
|
|
|
|
|
|
width: 200,
|
|
|
|
|
|
}}
|
|
|
|
|
|
// onSearch={(text) => setOptions(getPanelValue(text))}
|
|
|
|
|
|
onChange={WSProductChange}
|
|
|
|
|
|
onSelect={WSProductSelect}
|
|
|
|
|
|
placeholder="Product Name"
|
|
|
|
|
|
allowClear={{
|
|
|
|
|
|
clearIcon: <CloseSquareFilled />,
|
|
|
|
|
|
}}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
{WeightScale === true && (
|
|
|
|
|
|
<WeightScaleComp
|
|
|
|
|
|
testfun={myfun}
|
|
|
|
|
|
setportfun={setWsport}
|
|
|
|
|
|
portval={wsport}
|
|
|
|
|
|
portclose={WeightScale2}
|
|
|
|
|
|
WeightScale={WeightScale}
|
|
|
|
|
|
/>
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
<Form.Item name="WSProductWeight">
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label>Product Weight</label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={WSProductWeight ? true : false}
|
|
|
|
|
|
readOnly={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item name="WSProductRate">
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label>Product Price</label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={WSProductRate ? true : false}
|
|
|
|
|
|
valueData={WSProductRate}
|
|
|
|
|
|
readOnly={true}
|
|
|
|
|
|
disabled={
|
|
|
|
|
|
formWsRef.current?.getFieldsValue().WSProductRate
|
|
|
|
|
|
? true
|
|
|
|
|
|
: false
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<CiCalculator1
|
|
|
|
|
|
className="WSCalculator-icon"
|
|
|
|
|
|
onClick={CalculateWeightOpen}
|
|
|
|
|
|
/>
|
|
|
|
|
|
{CalcPriceWeightOpen && (
|
|
|
|
|
|
<>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
name="CalcProductRate"
|
|
|
|
|
|
rules={[
|
|
|
|
|
|
{
|
|
|
|
|
|
pattern: /^[1-9]\d*(\.\d+)?$/,
|
|
|
|
|
|
message: 'Please Enter Valid Price',
|
|
|
|
|
|
},
|
|
|
|
|
|
{ validator: HandleProductName },
|
|
|
|
|
|
]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label> Customer Product Price</label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={CalcProductRate > 0 ? true : false}
|
|
|
|
|
|
valueData={CalcProductRate}
|
|
|
|
|
|
onChange={CalculateWeight}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item name="CalcProductWeight">
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label> Weight For Given Price</label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={CalcProductWeight > 0 ? true : false}
|
|
|
|
|
|
valueData={CalcProductWeight}
|
|
|
|
|
|
readOnly={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
</>
|
|
|
|
|
|
)}
|
|
|
|
|
|
<Form.Item name="WSTotalPrice">
|
|
|
|
|
|
<InputField
|
|
|
|
|
|
label={<label>Product Total Price</label>}
|
|
|
|
|
|
autocomplete="off"
|
|
|
|
|
|
isOnChange={WSTotalPrice > 0 ? true : false}
|
|
|
|
|
|
valueData={WSTotalPrice}
|
|
|
|
|
|
readOnly={true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
|
|
|
|
|
|
<Buttons
|
|
|
|
|
|
buttonText="ADD"
|
|
|
|
|
|
color="901D77"
|
|
|
|
|
|
icon={<ArrowRightOutlined />}
|
|
|
|
|
|
disabled={WSTotalPrice > 0 ? false : true}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</Form>
|
|
|
|
|
|
|
|
|
|
|
|
{WSProductDataSource?.length > 0 ? (
|
|
|
|
|
|
<div className="WeightScale-table">
|
|
|
|
|
|
<Tables
|
|
|
|
|
|
columns={WSStockColumns}
|
|
|
|
|
|
data={WSProductDataSource}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
) : (
|
|
|
|
|
|
ProductValue && (
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<p>No Data Found</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</>
|
|
|
|
|
|
}
|
|
|
|
|
|
handleCancel={WSModalPortclose}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
export default FeaturesFunctionalities;
|