import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useLocation, useNavigate } from 'react-router-dom'; import { ArrowRightOutlined, PlusCircleOutlined, DeleteFilled, EditFilled, } from '@ant-design/icons'; import { Messages } from '../../Components/Notifications/Messages'; import { Form, Tooltip, Space, Input, Button, AutoComplete } from 'antd'; import { IoWarningOutline } from 'react-icons/io5'; import { getSession, pdfDiv, printDiv, validateSafeInput, } from '../../Services/Others.js'; import FormHeader from '../PageComponents/FormHeader.jsx'; import Buttons from '../../Components/Forms/Buttons.jsx'; import { InputField } from '../../Components/Forms/InputField.jsx'; import { DropDowns } from '../../Components/Forms/DropDown.jsx'; import { getPurProductData, getPurProdvaraiantdata, getPurcProdTaxData, getPurcTaxTypeData, getPurchaseSupplierData, postPurcOrderData, getProductData, Emailsend, getPurchaseSupplierAndWareHouseData, getProductStockDetails, } from '../../Features/PurchaseOrder/PurchaseOrder.js'; import { Tables } from '../../Components/Tables/Table.jsx'; import { DefaultModal } from '../../Components/Modal/DefaultModal.jsx'; import { postSupplier } from '../../Features/ProductPage/ProductPage.js'; import { changeBreadCrumb } from '../../Features/AppPage/CenterPage.js'; import { DropDowns1 } from '../../Components/Forms/DropDown1.jsx'; import PurchaseOrderPrint from './PurchaseOrderPrint.jsx'; import { FaEye, FaLink, FaPrint } from 'react-icons/fa'; import { MdOutlineMail } from 'react-icons/md'; import { getSupplaierIdwithTypeBasedProducts } from '../../Features/SupplierProductMapping/SupplierProductMapping.js'; import SupplierProductMappingForm from '../SupplierProductMapping/SuplierProductMappingForm.jsx'; import { getConfigType } from '../../Features/BookingScreen/BookingData/BookingData.js'; import FloatLabel from '../../Components/Forms/FloatLabel/index.jsx'; import '../../Styles/OverAllStyle/OverAllStyle.scss'; import { BsUpcScan } from 'react-icons/bs'; import { debounce } from 'lodash'; import { getPrintSelectionComponentData } from '../../Features/ThemeChange/ThemeChange.js'; import { PrintStyleFunction } from '../paymentpdfPage/PrintStyleFunction.js'; import { PurchaseOrderMobilePrint } from './PurchsasePrintStyle/PurchaseOrderMobilePrint.js'; import { isMobile } from 'react-device-detect'; import { CiEdit } from 'react-icons/ci'; const subDirectory = import.meta.env.BASE_URL; const stylesMap = { 'Style 1': 'PurchaseStyle1', 'Style 2': 'PrintStyle2', 'Style 3': 'PrintStyle3', 'Style 4': 'PrintStyle4', 'Style 5': 'PrintStyle5', 'Style 6': 'PrintStyle6', 'Style 7': 'PrintStyle7', 'Style 8': 'PrintStyle8', 'Style 9': 'PrintStyle9', 'Style 10': 'PrintStyle10', 'Style 11': 'PrintStyle11', 'Style 12': 'PrintStyle12', 'Style 13': 'Pur-Order-Print', A4: 'PrintStyleA4', A5: 'PrintStyleA5', A4Standard: 'A4Standard', TaxInvoice: 'TaxInvoice', }; const PurchaseOrder = () => { const [form] = Form.useForm(); const navigate = useNavigate(); const formRef = useRef(null); const location = useLocation(); const formProductRef = useRef(null); const formSupplierRef = useRef(null); const deliveryAddressRef = useRef(null); const dispatch = useDispatch(); const CompId = getSession('CompId'); const BranchId = getSession('BranchId'); const AppId = getSession('AppId'); const UserId = getSession('UserId'); const [message, setMessage] = useState({ type: null, data: null }); const [Supplierdata, setSupplierdata] = useState([]); const [selecPurSupplier, setselecPurSupplier] = useState(null); const [selectedProductName, setSelectedProductName] = useState(null); const [productSearchText, setProductSearchText] = useState(''); const [scanner, setScanner] = useState(false); const [selecPurSupplierDetails, setselecPurSupplierDetails] = useState(null); const [selecSuppDetails, setselecSuppDetails] = useState(null); const [OpenPurSupplierModel, setOpenPurSupplierModel] = useState(false); const [PurProductdata, setPurProductdata] = useState([]); const [selectedPurProductData, setselectedPurProductData] = useState(null); const [VariantDetails, setVariantDetails] = useState(null); const [SelProductVariant, setSelProductVariant] = useState(null); const [ProductTableData, setProductTableData] = useState([]); const [zipCodeData, setZipCodeData] = useState(false); const [Edit, setEdit] = useState(false); const [currentIndex, setCurrentIndex] = useState(null); const [PrintData, setPrintData] = useState([]); const [printTrigger, setPrintTrigger] = useState(false); // <-- add this line const [isSubmitted, setIsSubmitted] = useState(false); const [submittedOrderData, setSubmittedOrderData] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [isLowStockModel, setisLowStockModel] = useState(false); const [addressModel, setAddressModel] = useState(false); const [deliveryAddress, setDeliveryAddress] = useState(''); const [searchedText, setSearchedText] = useState(''); const [iSEmail, setiSEmail] = useState(false); const [enteredEmail, setEnteredEmail] = useState(''); const [pendingOrderDetails, setPendingOrderDetails] = useState(null); const [pendingRecord, setPendingRecord] = useState(null); const [deliveryPerformanceData, SetDeleveryPerformanceData] = useState([]); const [DiscountData, setDiscountData] = useState([]); const [QualityData, setQualityData] = useState([]); const [Delivery, setDeliveryValue] = useState(); const [DicountValue, setDicountValue] = useState(); const [QualityValue, setQualityValue] = useState(); const [ViewDtl, setViewDtl] = useState(false); const [selectedStyleData, setselectedStyleData] = useState(); const [ProductStockData, seProductStockData] = useState([]); const [selectedStockDetails, setSelectedStockDetails] = useState({ StockDetails: [], }); console.log(ProductStockData, 'ProductStockData'); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage] = useState(20); const [searchTerm, setSearchTerm] = useState(''); const [minQty, setMinQty] = useState(''); // const filteredData = currentData.filter((item) => { // const matchesSearch = // item.ProdName.toLowerCase().includes(searchTerm.toLowerCase()) || // item.ProdVariantName.toLowerCase().includes(searchTerm.toLowerCase()); // const matchesMinQty = minQty === "" || item.BalanceQty <= Number(minQty); // return matchesSearch && matchesMinQty; // }); // const styleName = selectedStyleData == undefined ? 'Pur-Order-Print' : selectedStyleData; // const selectedStyle = stylesMap[styleName] || 'Pur-Order-Print'; const items = [ { name: 'Home', link: `${subDirectory}app-page/home`, }, { name: 'Purchase Order', link: `${subDirectory}setting/purchase-order/new`, }, { name: 'New', link: null, }, ]; useEffect(() => { dispatch(changeBreadCrumb({ items: items })); getSupplierData(); }, []); useEffect(() => { dispatch(changeBreadCrumb({ items: items })); getSupplierData(); // Handle incoming navigation state if (location.state) { const { selecPurSupplierDetails, OrderId, ProductTableData } = location.state; if (selecPurSupplierDetails) { setselecPurSupplierDetails(selecPurSupplierDetails); if (selecPurSupplierDetails[0]?.SuppId) { setselecPurSupplier(selecPurSupplierDetails[0].SuppId); getProductDatas(selecPurSupplierDetails[0].SuppId); formRef.current?.setFieldsValue({ SuppId: selecPurSupplierDetails[0].SuppId, }); } } if (ProductTableData) { setProductTableData(ProductTableData); } } }, [location.state]); useEffect(() => { SetSelfSupplier(); }, [Supplierdata]); useEffect(() => { deliveryPerformance(); discountLevel(); qualityofSupp(); printsyleget(); ProductStockFun(); }, []); const handleSaveLowStock = () => { let ChoosenLowStockProd = ProductStockData?.filter( (e) => e?.needQty > 0 )?.map((e) => ({ OrderQty: e?.needQty, ProdId: e?.ProdId, ProdName: `${e?.ProdName}(${e?.Size}${e?.UOMName})`, ProdVariantName: e?.ProdVariantName, })); setProductTableData((prev) => [...ChoosenLowStockProd]); setisLowStockModel(false); }; const ProductStockFun = async (qty = 5) => { console.log(qty, 'qtyqty'); try { const Data = { AppId, CompId, BranchId, qty: qty }; let response = await dispatch(getProductStockDetails(Data)).unwrap(); if (response?.data?.statusCode === 1) { seProductStockData(response?.data?.data); } } catch (err) { console.error('Error fetching stock details:', err); } }; console.log('hi'); const debouncedFetchStock = useMemo(() => debounce(ProductStockFun, 600), []); const handleMinQtyChange = (e) => { const value = e.target.value; setMinQty(value); debouncedFetchStock(value || 0); }; const filteredData = ProductStockData.filter( (row) => !searchTerm || (row.ProdName && row.ProdName?.toLowerCase()?.includes(searchTerm?.toLowerCase())) ); const totalPages = Math.ceil(filteredData.length / itemsPerPage); const startIndex = (currentPage - 1) * itemsPerPage; const endIndex = startIndex + itemsPerPage; const currentData = filteredData.slice(startIndex, endIndex); const printsyleget = async () => { const Data = { AppId, CompId, BranchId }; let response = await dispatch( getPrintSelectionComponentData(Data) ).unwrap(); if (response?.data?.statusCode == 1) { setselectedStyleData( response?.data?.data?.[0]?.ComponentDetails?.find( (e) => e?.PrintTypeName == 'Purchase Order' && e?.SetasDefault == 'Y' )?.StyleName ); } else { setselectedStyleData(null); } }; const debouncedScannerSearch = useCallback( debounce((value) => { const qr = value?.trim(); if (qr === '') return; const matchedProduct = PurProductdata.find( (p) => p.QRCode?.toLowerCase() === qr?.toLowerCase() ); if (matchedProduct) { let productName = {}; productName.label = `${matchedProduct?.ProdName} (${matchedProduct.Size} ${matchedProduct.UomName})${matchedProduct?.BrandName ? ` - ${matchedProduct?.BrandName}` : ''}`; PurcProductDropDownChange(matchedProduct.ProdId, productName); if (matchedProduct?.ProdVariantPriceDetails?.length < 2) { setSelProduct(null); } } else { setMessage({ type: 'error', data: 'The Scanned Product not Available in Product List', }); } }, 300), [PurProductdata] ); const handlePrevious = () => { if (currentPage > 1) { setCurrentPage(currentPage - 1); } }; const handleNext = () => { if (currentPage < totalPages) { setCurrentPage(currentPage + 1); } }; const SetSelfSupplier = async () => { let SupplierId = Supplierdata?.filter( (item) => item.SuppName?.toLowerCase() === 'self' )?.[0]?.['SuppId']; let SelectSupDetails = Supplierdata?.filter( (item) => item.SuppName?.toLowerCase() === 'self' ); //naresh setselecPurSupplierDetails(SelectSupDetails); formRef.current?.setFieldsValue({ SuppId: SupplierId }); setselecPurSupplier(SupplierId); getProductDatas(SupplierId); }; const getSupplierData = async () => { try { let Supplier = await dispatch( getPurchaseSupplierAndWareHouseData({ CompId, AppId, BranchId, }) ).unwrap(); if (Supplier?.statusCode == 1) { setSupplierdata(Supplier?.data); } else { setSupplierdata([]); } } catch (error) { setMessage({ type: 'error', data: error, }); } }; const getProductDatas = async (SuppId) => { if (!SuppId) { setPurProductdata([]); return; } // Supplierdata const Type = Supplierdata?.find((find) => find.SuppId === SuppId)?.Type; const LocationType = Type === 'Supplier' ? 'S' : Type === 'Branch' ? 'B' : Type === 'WareHouse' ? 'W' : ''; const productResponse = await dispatch( getSupplaierIdwithTypeBasedProducts({ CompId, AppId, BranchId, SuppId, LocationType, }) ).unwrap(); if (productResponse?.data?.statusCode == 1) { setPurProductdata(productResponse?.data?.data); } else { // setMessage({ // type: "error", // data: productResponse?.data?.response // }) setPurProductdata([]); } }; const handleSupplierDropDownChange = async (SuppId) => { let SelectSupDetails = Supplierdata?.filter( (item) => item.SuppId?.toLowerCase() === SuppId?.toLowerCase() ); //naresh setselecPurSupplierDetails(SelectSupDetails); formRef.current?.setFieldsValue({ SuppId: SuppId }); setselecPurSupplier(SuppId); getProductDatas(SuppId); formProductRef.current.resetFields(['ProdId']); setselectedPurProductData(null); setProductTableData([]); let SelectSuppData = Supplierdata?.filter((item) => item.SuppId === SuppId); if (SelectSuppData?.length > 0) { setselecSuppDetails(SelectSuppData?.[0]); setIsSubmitted(false); } else { setselecSuppDetails(null); } // let productdtl = await dispatch(getPurProductData({ SuppId: SuppId })).unwrap(); // if (productdtl?.data?.statusCode == 1) { // console.log(productdtl?.data?.data, "setPurProductdata") // setPurProductdata(productdtl?.data?.data) // } // else { // setPurProductdata(null) // } }; const addPurSupplier = () => { setOpenPurSupplierModel(true); }; const PurcProductDropDownChange = async (Prodid, option) => { setSelProductVariant(null); setProductSearchText(''); setSelectedProductName(option?.label ? option?.label : ''); formProductRef?.current?.resetFields(['ProdVariantName']); formProductRef.current?.setFieldsValue({ ProdId: Prodid }); setselectedPurProductData(Prodid); let x = PurProductdata.find((e) => e.ProdId == Prodid)?.ProdName; let variantValues1 = await dispatch( getPurProdvaraiantdata({ CompId: CompId, AppId: AppId, BranchId: BranchId, prodName: x, }) ).unwrap(); if (variantValues1?.data?.statusCode === 1) { console.log(variantValues1?.data?.data, 'productdetail'); setVariantDetails( variantValues1?.data?.data?.[0]?.ProductDetail?.[0]?.ProdVariantDetails ); } else { setVariantDetails(null); } }; const handleQRCodeChange = async (e) => { let qrcode = e.target.value; formProductRef.current?.setFieldsValue({ QRCode: qrcode }); console.log(PurProductdata, 'PurProductdata'); let x = PurProductdata.find((e) => e.QRCode === qrcode); if (x !== undefined) { formProductRef.current?.setFieldsValue({ ProdId: x?.ProdId }); setselectedPurProductData(x?.ProdId); let variantValues1 = await dispatch( getPurProdvaraiantdata({ CompId: CompId, AppId: AppId, BranchId: BranchId, prodName: x?.ProdName, }) ).unwrap(); if (variantValues1?.data?.statusCode === 1) { console.log(variantValues1?.data?.data, 'productdetail'); setVariantDetails( variantValues1?.data?.data?.[0]?.ProductDetail?.[0] ?.ProdVariantDetails ); } else { setVariantDetails(null); } } }; const ProductVariantDropDownChange = async (Variant) => { setSelProductVariant(Variant); formProductRef.current?.setFieldsValue({ ProdVariantName: Variant }); console.log(Variant, 'VariantVariant'); }; const handleProductSearch = (value) => { if (scanner) { debouncedScannerSearch(value); } setProductSearchText(value); setSelectedProductName(value); setVariantDetails([]); }; const handleScanSearch = () => { if (scanner === false) { setMessage({ type: 'success', data: 'Search by QrCode/BarCode Enabled' }); } else { setMessage({ type: 'success', data: 'Search by QrCode/BarCode Disabled', }); } setScanner((prev) => !prev); setSelectedProductName(null); setVariantDetails(null); formRef?.current?.setFieldsValue({ ProdId: null, VarProdId: null, }); }; const PurchaseOrderStyle = ``; const AddProduct = async () => { let ProductNameadd = {}; let variant; let ProductDetail = formProductRef.current?.getFieldsValue(); console.log(typeof ProductDetail?.ProdVariantName, 'ProductDetail'); if ( ProductDetail?.OrderQty && ProductDetail?.ProdId && new RegExp(`^P${AppId}(-[0-9]+)+$`).test(ProductDetail.ProdId) ) { let ProductName = PurProductdata?.find( (item) => item?.ProdId === ProductDetail?.ProdId ); if (!ProductName) { setMessage({ type: 'error', data: 'Please Enter Product Details' }); return; } if (ProductDetail?.hasOwnProperty('ProdVariantName')) { variant = ProductDetail?.ProdVariantName ? ProductDetail?.ProdVariantName : 'Variant 1'; delete ProductDetail?.ProdVariantName; ProductNameadd = { ProdName: ProductName?.ProdName + '(' + ProductName?.Size + ProductName?.UomName + ')', ProdVariantName: variant, ...ProductDetail, }; } else { ProductNameadd = { ProdName: ProductName?.ProdName + '(' + ProductName?.Size + ProductName?.UomName + ')', ProdVariantName: 'Variant 1', UomName: ProductName?.UomName, ...ProductDetail, }; } if (ProductTableData?.length > 0) { let filterTableData = ProductTableData?.filter( (item) => !( item.ProdId === ProductNameadd?.ProdId && item.ProdVariantName === ProductNameadd?.ProdVariantName ) ); setProductTableData([ProductNameadd, ...filterTableData]); } else { setProductTableData([ProductNameadd]); } console.log(ProductTableData, 'ProductDetailProductDetail'); } else if (ProductDetail?.OrderQty && ProductDetail?.QRCode) { let ProductName = PurProductdata?.find( (item) => item?.QRCode === ProductDetail?.QRCode ); if (ProductDetail?.hasOwnProperty('ProdVariantName')) { variant = ProductDetail?.ProdVariantName ? ProductDetail?.ProdVariantName : 'Variant 1'; delete ProductDetail?.ProdVariantName; ProductNameadd = { ProdName: ProductName?.ProdName + '(' + ProductName?.Size + ProductName?.UomName + ')', ProdVariantName: variant, ...ProductDetail, }; } else { ProductNameadd = { ProdName: ProductName?.ProdName + '(' + ProductName?.Size + ProductName?.UomName + ')', ProdVariantName: 'Variant 1', ...ProductDetail, }; } if (ProductTableData?.length > 0) { let filterTableData = ProductTableData?.filter( (item) => !( item.ProdId === ProductNameadd?.ProdId && item.ProdVariantName === ProductNameadd?.ProdVariantName ) ); setProductTableData([ProductNameadd, ...filterTableData]); } else { setProductTableData([ProductNameadd]); } } else { setMessage({ type: 'error', data: 'Please Enter Product Details' }); } // after adding reset field values formProductRef?.current?.resetFields(); setselectedPurProductData(null); setSelProductVariant(null); setEdit(false); setSelectedProductName(null); }; const cancelEdit = (e) => { e.preventDefault(); e.stopPropagation(); formProductRef.current?.resetFields(); setCurrentIndex(null); setEdit(false); setSelectedProductName(null); setSelProductVariant(null); }; const updateProduct = async (e) => { e.preventDefault(); e.stopPropagation(); let productDetail = formProductRef.current?.getFieldsValue(); console.log(productDetail, 'productDetail'); if (!productDetail?.OrderQty || !productDetail?.ProdId) { console.error('Please fill all required product details'); return; } // Find product name from PurProductdata let ProductName = PurProductdata?.find( (item) => item?.ProdId === productDetail?.ProdId ); // Determine variant let variant = productDetail?.ProdVariantName ? productDetail?.ProdVariantName : 'Variant 1'; let updatedProduct = { ProdName: ProductName?.ProdName + '(' + ProductName?.Size + ProductName?.UomName + ')', ProdVariantName: variant, ...productDetail, }; // Check if product already exists (excluding current index) let exists = ProductTableData.some( (item, index) => index !== currentIndex && // exclude current editing row item.ProdId === updatedProduct.ProdId && item.ProdVariantName === updatedProduct.ProdVariantName ); if (exists) { setMessage({ type: 'error', data: 'Product Already Exists' }); return; } // Update product in the table let newData = [...ProductTableData]; newData[currentIndex] = updatedProduct; setProductTableData(newData); // Reset form state formProductRef?.current?.resetFields(); setselectedPurProductData(null); setSelProductVariant(null); setEdit(false); setCurrentIndex(null); setSelectedProductName(null); }; console.log(ProductTableData, 'ProductDetailProductDetail'); const onComplete = useCallback(() => { setMessage({ type: null, data: null }); }, []); const columns = [ { title: 'Sl.No', align: 'center', key: 'sno', width: '50px', render: (text, object, index) => ( {index + 1} ), }, { title: 'Product Name', dataIndex: 'ProdName', key: 'ProdName', width: '50px', // align: "right", render: (text) => {text}, }, { title: 'Variant Name', dataIndex: 'ProdVariantName', key: 'ProdVariantName', width: '50px', // align: "right", render: (text) => {text}, }, { title: 'Quantity', dataIndex: 'OrderQty', key: 'OrderQty', width: '20px', align: 'right', render: (text) => {text}, }, { title: 'Action', dataIndex: 'Action', width: '60px', key: 'Action', render: (_, record, index) => ( !isSubmitted && actionsFormatter(record, index)} /> !isSubmitted && statusFormatter(index)} /> ), }, ]; const statusFormatter = (index) => { setProductTableData((prevData) => { const rows = [...prevData]; rows.splice(index, 1); if (index === currentIndex) { formProductRef.current?.resetFields(); setCurrentIndex(null); setEdit(false); setSelectedProductName(null); setSelProductVariant(null); } else if (index < currentIndex) { setCurrentIndex((prev) => prev - 1); } return rows; }); }; const actionsFormatter = async (record, index) => { setEdit(true); setCurrentIndex(index); console.log(record, index, 'actionsFormatter'); let x = PurProductdata.find((e) => e.ProdId == record?.ProdId)?.ProdName; let variantValues1 = await dispatch( getPurProdvaraiantdata({ CompId: CompId, AppId: AppId, BranchId: BranchId, prodName: x, }) ).unwrap(); if (variantValues1?.data?.statusCode === 1) { console.log(variantValues1?.data?.data, 'productdetail'); setVariantDetails( variantValues1?.data?.data?.[0]?.ProductDetail?.[0]?.ProdVariantDetails ); } else { setVariantDetails(null); } formProductRef.current?.setFieldsValue({ ProdId: record?.ProdId, OrderQty: record?.OrderQty, ProdVariantName: record?.ProdVariantName, }); setselectedPurProductData(record?.ProdId); setSelProductVariant(record?.ProdVariantName); setSelectedProductName(record?.ProdName); }; const onFinish = async () => { if (ProductTableData?.length === 0) { setMessage({ type: 'error', data: 'Please Enter Product Detail' }); } else { let PostData = {}; PostData = formRef.current?.getFieldsValue(); PostData['OrderDetails'] = ProductTableData; PostData['AppId'] = AppId; PostData['CompId'] = CompId; PostData['BranchId'] = BranchId; PostData['PurOrderDate'] = new Date().toJSON(); PostData['CreatedBy'] = UserId; PostData['LocationType'] = Supplierdata?.find( (find) => find.SuppId === selecPurSupplier )?.Type; PostData['DeliveryAddressDetails'] = deliveryAddress; let PostPurOrder = await dispatch(postPurcOrderData(PostData)).unwrap(); if (PostPurOrder?.data?.statusCode === 1) { setMessage({ type: 'success', data: PostPurOrder?.data?.response }); ProductStockFun(); const orderData = { OrderId: PostPurOrder?.data?.OrderId, PurOrderDate: PostData.PurOrderDate, SupplierName: selecPurSupplierDetails?.[0]?.SuppName, SuppMobile: selecPurSupplierDetails?.[0]?.SuppMobile, SuppGSTIN: selecPurSupplierDetails?.[0]?.SuppGSTIN, SuppEmail: selecPurSupplierDetails?.[0]?.SuppEmail, Remarks: PostData.Remarks, ProductDetails: ProductTableData, }; // Set all necessary states setSubmittedOrderData(orderData); setPrintData([orderData]); setIsSubmitted(true); // Reset form fields formProductRef?.current?.resetFields(); formRef?.current?.resetFields(); deliveryAddressRef?.current?.resetFields(); setDeliveryAddress(''); setselecPurSupplier(null); getProductDatas(null); setselecSuppDetails(null); setselectedPurProductData(null); setSelProductVariant(null); setProductTableData([]); setSelectedProductName(null); // navigate(`${subDirectory}purchaseordermail`, { // state: { // selecPurSupplierDetails: selecPurSupplierDetails, // OrderId: PostPurOrder?.data?.OrderId, // ProductTableData: ProductTableData, // }, // }); } else { setMessage({ type: 'error', data: PostPurOrder?.data?.response }); } } }; // Suppier details const pinCodeChange = async (e) => { if (e.target.value?.length < 6) { setZipCodeData(false); return false; } await getPincodeValues(e?.target?.value); }; 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); formSupplierRef.current?.setFieldsValue({ City: response[0]['PostOffice'][0]['Block'], Dist: response[0]['PostOffice'][0]['District'], State: response[0]['PostOffice'][0]['State'], }); deliveryAddressRef.current?.setFieldsValue({ City: response[0]['PostOffice'][0]['Block'], Dist: response[0]['PostOffice'][0]['District'], State: response[0]['PostOffice'][0]['State'], }); } else { setZipCodeData(false); } }; const submitSupplier = async () => { const subSupplierData = await formSupplierRef?.current?.validateFields(); const addSupplierData = { CompId: getSession('CompId'), AppId: getSession('AppId'), BranchId: getSession('BranchId'), SuppName: subSupplierData?.SuppName, SuppGSTIN: subSupplierData?.SuppGSTIN, SuppPOC: subSupplierData?.SuppPOC, SuppMobile: subSupplierData?.SuppMobile, SuppEmail: subSupplierData?.SuppEmail, Address1: subSupplierData?.Address1, Address2: subSupplierData?.Address1, Zip: subSupplierData?.Zip, City: subSupplierData?.City, State: subSupplierData?.State, Dist: subSupplierData?.Dist, SuppPOCMobile: subSupplierData?.SuppPOCMobile, SuppPOCEmail: subSupplierData?.SuppPOCEmail, DeliveryPerformance: subSupplierData?.DeliveryPerformance, DiscountLevel: subSupplierData?.DiscountLevel, QualityofSupp: subSupplierData?.QualityofSupp, CreatedBy: UserId, }; let response = {}; response = await dispatch(postSupplier(addSupplierData)).unwrap(); if (response?.data?.statusCode == 1) { setMessage({ type: 'success', data: response?.data?.response }); formSupplierRef?.current?.resetFields(); setZipCodeData(false); setOpenPurSupplierModel(false); setDeliveryValue(); setDicountValue(); setQualityValue(); setViewDtl(false); let response1 = await dispatch( getSupplierData({ CompId: CompId, AppId: AppId, BranchId: BranchId, ActiveStatus: 'A', }) ).unwrap(); if (response1.data?.statusCode == 1) { setOpenPurSupplierModel(false); } } else { setMessage({ type: 'error', data: response?.data?.response }); formSupplierRef?.current?.resetFields(); } }; const handleSupplier = () => { setOpenPurSupplierModel(false); formSupplierRef?.current?.resetFields(); setZipCodeData(false); }; // const handleEmailClick = () => { // if (!submittedOrderData) { // setMessage({ type: 'error', data: 'Please submit the order first before sending email' }); // return; // } // navigate(`${subDirectory}purchaseordermail`, { // state: { // selecPurSupplierDetails: selecPurSupplierDetails, // ProductTableData: ProductTableData, // orderData: submittedOrderData, // }, // }); // }; const handleEmailClick = async (ProductDetails, record) => { const toEmail = record?.SuppEmail; if (toEmail) { try { const blob = await pdfDiv('Pur-Order-Print', PurchaseOrderStyle); console.log(blob, 'blobblob'); const payload = { fileBlob: blob, toEmail: toEmail, type: 'PurchaseOrder', messageTemplatesList: [], }; const res = await dispatch(Emailsend(payload))?.unwrap(); console.log('✅ API Response:', res?.data || res); setMessage({ type: 'success', data: 'Email sent successfully' }); } catch (error) { setMessage({ type: 'error', data: 'Email failed to send' }); console.error('❌ Email send failed:', error); } } else { setPendingOrderDetails(ProductDetails); setPendingRecord(record); setiSEmail(true); } }; const handleSendEmailWithEnteredEmail = async (values) => { const recordWithEmail = { ...pendingRecord, SuppEmail: values.email }; setiSEmail(false); await handleEmailClick(pendingOrderDetails, recordWithEmail); setPendingOrderDetails(null); setPendingRecord(null); form.resetFields(); }; const handlePrint = () => { setPrintData([submittedOrderData]); setPrintTrigger(true); // trigger print after render }; useEffect(() => { if (printTrigger && PrintData.length > 0) { setTimeout(() => { let style; if (selectedStyleData) { style = stylesMap[selectedStyleData] ? PrintStyleFunction(selectedStyleData) : PurchaseOrderStyle; } else { style = PurchaseOrderStyle; } const styleName = selectedStyleData == undefined ? 'Style 13' : selectedStyleData; const selectedStyle = stylesMap[styleName] || 'Style 13'; // printDiv(`${selectedStyle}`, style); setPrintTrigger(false); if (isMobile) { PurchaseOrderMobilePrint({ PrintTempData: selectedStyleData, PrintOrderDetails: PrintData, setPrintOrderDetails: setPrintData, }); } else { printDiv(selectedStyle, style); } }, 100); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [printTrigger, PrintData, selectedStyleData]); const handleModalSubmited = () => { setIsModalOpen(false); getProductDatas(selecPurSupplier); }; const validatePhoneNumber = (rule, value, callback) => { if (value && value?.length !== 10) { callback(); } else { callback(); } }; const validateEmail = (rule, value, callback) => { const regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; if (!value || regex.test(value)) { callback(); } else { callback('Please enter a valid Mail Id'); } }; const deliveryPerformance = async () => { let response = await dispatch( getConfigType({ TypeName: 'Delivery Performance' }) ).unwrap(); SetDeleveryPerformanceData(response?.data?.data); }; const discountLevel = async () => { let response = await dispatch( getConfigType({ TypeName: 'Discount Level' }) ).unwrap(); setDiscountData(response?.data?.data); }; const qualityofSupp = async () => { let response = await dispatch( getConfigType({ TypeName: 'Quality Of Supplier' }) ).unwrap(); setQualityData(response?.data?.data); }; const handleDeliveryPerformanceChange = (value) => { formSupplierRef?.current?.setFieldsValue({ DeliveryPerformance: value }); setDeliveryValue(value); }; const handleDiscountLevelChange = (value) => { formSupplierRef?.current?.setFieldsValue({ DiscountLevel: value }); setDicountValue(value); }; const handleQualityofSuppChange = (value) => { formSupplierRef?.current?.setFieldsValue({ QualityofSupp: value }); setQualityValue(value); }; const ViewMoreFields = () => { if (ViewDtl) { setViewDtl(false); } else { setViewDtl(true); } }; const handleAddressSubmit = async () => { try { const values = await deliveryAddressRef.current?.validateFields(); const formattedAddress = { Address1: values.Address1, Address2: values.Address2, Zip: Number(values.Zip), City: values.City, Dist: values.Dist, State: values.State, Latitude: values.Latitude ?? 0, Longitude: values.Longitude ?? 0, CreatedBy: UserId }; setDeliveryAddress(formattedAddress); setAddressModel(false); } catch (err) { console.log('Validation error:', err); } }; return (
navigate(`${subDirectory}setting/purchase-order`)} >

View Order

({ value: option.SuppId, label: (
{option.DeliveryPerformanceImage && ( )}
), searchLabel: option.SuppName, // <<--- Add this line }))} /> {/* {renderPerformanceImg(selecSuppDetails?.DeliveryPerformance)} */}
{selecSuppDetails !== null && (() => { const fields = []; if (selecSuppDetails?.SuppName) { fields.push(

Name: {selecSuppDetails.SuppName}

); } if (selecSuppDetails?.Address1) { fields.push(

Address:{' '} {selecSuppDetails.Address1}

); } if (selecSuppDetails?.SuppMobile) { fields.push(

Mobile Number:{' '} {selecSuppDetails.SuppMobile}

); } if (selecSuppDetails?.DiscountLevel) { fields.push(

Discount Level:{' '} {selecSuppDetails.DiscountLevel}

); } if (selecSuppDetails?.QualityofSupp) { fields.push(

Quality of Supplier:{' '} {selecSuppDetails.QualityofSupp}

); } if (selecSuppDetails?.OtherInfo) { fields.push(

Other Info:{' '} {selecSuppDetails.OtherInfo}

); } const firstColumn = fields.slice(0, 3); const secondColumn = fields.slice(3); return (

{`${selecSuppDetails?.Type} Details:`}

{firstColumn}
{secondColumn.length > 0 && (


{secondColumn}
)}
); })()}
setisLowStockModel(true)} > Low Stock
{!deliveryAddress &&
setAddressModel(true)} > Delivery Address
} {deliveryAddress && (
setAddressModel(true)}>Delivery Address Details: {deliveryAddress?.Address1 &&

Address:{' '} {deliveryAddress?.Address1}

} {deliveryAddress?.City &&

City: {deliveryAddress?.City}

} {deliveryAddress?.Dist &&

district: {deliveryAddress?.Dist}

} {deliveryAddress?.State &&

State: {deliveryAddress?.State}

} {deliveryAddress?.Zip &&

Zip: {deliveryAddress?.Zip}

}
)}
{(() => { const styleName = selectedStyleData === undefined ? 'Style 13' : selectedStyleData; const selectedStyle = stylesMap[styleName] || stylesMap['Style 13']; return (
); })()} {/*
*/}
{/* ({ // value: option.ProdId, // label: option.ProdName + "( " + option.Size + " " + option.UomName + " )", // }))} options={PurProductdata?.map((option) => ({ value: option.ProdId, label: option.ProdName + '( ' + option.Size + ' ' + option.UomName + ' )', }))} filterOption={(input, option) => { const product = PurProductdata.find( (p) => p.ProdId === option.value ); const nameMatch = option.label .toLowerCase() .includes(input.toLowerCase()); const qrMatch = product?.QRCode?.toLowerCase() == input.toLowerCase(); console.log( qrMatch, 'qrMatch', product?.QRCode?.toLowerCase(), input.toLowerCase() ); return nameMatch || qrMatch; }} label={'Product Name'} className="field-DropDown" onChangeFunction={(e) => PurcProductDropDownChange(e)} valueData={selectedPurProductData} disabled={Edit ? true : false} /> */}
{ const product = PurProductdata.find( (p) => p.ProdId === option.value ); const nameMatch = option.label ?.toLowerCase() ?.includes(productSearchText?.toLowerCase()); const qrMatch = product?.QRCode?.toLowerCase() == productSearchText?.toLowerCase(); return nameMatch || qrMatch; }} options={ !scanner ? PurProductdata?.map((option) => ({ value: option.ProdId, label: `${option.ProdName} (${option.Size} ${option.UomName})${option?.BrandName ? ` - ${option?.BrandName}` : ''}`, })) : [] } onSelect={PurcProductDropDownChange} onChange={handleProductSearch} onKeyDown={(e) => { if (scanner && e.key === 'Enter') { e.preventDefault(); } }} >
setIsModalOpen(true)} /> {isModalOpen && ( setIsModalOpen(false)} CompId={CompId} BranchId={BranchId} AppId={AppId} setMessage={setMessage} onMappingAdded={handleModalSubmited} /> )} {/* { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > handleQRCodeChange(e)} /> */} {VariantDetails?.length > 1 && ( ({ value: option.ProdVariantName, label: option.ProdVariantName, }))} label={'Variant Name'} className="field-DropDown" onChangeFunction={(e) => ProductVariantDropDownChange(e) } valueData={SelProductVariant} // disabled={Edit ? true : false} /> )}
{ await validateSafeInput(value); if (value?.length > 10) { return Promise.reject( 'Quantity cannot exceeds more than 10 chars' ); } return Promise.resolve(); }, }, ]} > Purchase Quantity } autocomplete="off" isOnChange={ formProductRef.current?.getFieldsValue()?.OrderQty ? true : false } inputMode="numeric" onInput={(e) => (e.target.value = e.target.value.replace( /[^0-9]/g, '' )) } />
{!Edit ? (
!isSubmitted && AddProduct()} style={{ cursor: isSubmitted ? 'not-allowed' : 'pointer', opacity: isSubmitted ? 0.5 : 1, }} > {'Add'}
) : (
)}
{' '}
} /> {isSubmitted && ( <>
handleEmailClick( submittedOrderData.ProductDetails, submittedOrderData ) } title="Share by Email" />
)}
{ await validateSafeInput(value); if (value && value.length > 30) { return Promise.reject( 'Supplier Name should not exceed 30 characters' ); } return Promise.resolve(); }, }, ]} > Supplier Name} autocomplete="off" /> { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > Address} /> { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > Zipcode} maxLength="6" onChange={pinCodeChange} />

{' '} {ViewDtl ? 'View Less' : 'View More'}

{ViewDtl && ( <> Mobile Number} maxLength="10" autocomplete="off" // isOnChange={formType == 'edit' ? true : false} inputMode="numeric" onInput={(e) => (e.target.value = e.target.value.replace( /[^0-9]/g, '' )) } /> MailId} autocomplete="off" // isOnChange={formType == 'edit' ? true : false} /> { await validateSafeInput(value); if (value?.length > 30) { return Promise.reject( 'Point of Contact cannot exceeds more than 30 chars' ); } return Promise.resolve(); }, }, ]} > Point of Contact} autocomplete="off" // isOnChange={formType == 'edit' ? true : false} /> POC Mobile Number} autocomplete="off" maxLength="10" // isOnChange={formType == 'edit' ? true : false} /> POC MailId} autocomplete="off" // isOnChange={formType == 'edit' ? true : false} /> ({ value: option.ConfigId, label: option.ConfigName, }))} label={} className="field-DropDown" id="DeliveryPerformance" onChangeFunction={(e) => handleDeliveryPerformanceChange(e) } // isOnChange={formType == 'edit' ? true : false} valueData={Delivery} /> ({ value: option.ConfigId, label: option.ConfigName, }))} label={} className="field-DropDown" id="DiscountLevel" onChangeFunction={(e) => handleDiscountLevelChange(e)} // isOnChange={formType == 'edit' ? true : false} valueData={DicountValue} /> ({ value: option.ConfigId, label: option.ConfigName, }))} label={} className="field-DropDown" id="QualityofSupp" onChangeFunction={(e) => handleQualityofSuppChange(e)} // isOnChange={formType == 'edit' ? true : false} valueData={QualityValue} /> )} {zipCodeData ? ( <> { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > ) : ( '' )}
} handleSubmit={submitSupplier} handleCancel={handleSupplier} >
setiSEmail(false)} footer={false} children={
} /> setisLowStockModel(false)} footer={false} children={
setSearchTerm(e.target.value)} style={{ padding: '8px 10px', width: '60%', border: '1px solid #ccc', borderRadius: '6px', }} />
{currentData.length > 0 ? ( currentData.map((row, idx) => ( )) ) : ( )}
SI NO Product Name Balance Qty Required Qty
{startIndex + idx + 1} {row.ProdName} ({row.ProdVariantName}) {row.BalanceQty} { const newQty = e.target.value; seProductStockData((prev) => prev.map((item, i) => i === startIndex + idx ? { ...item, needQty: newQty } : item ) ); }} min="0" />
Data not found

<

Page {currentPage} of {totalPages}

>

SAVE
} /> {/* Address model */} setAddressModel(false)} footer={true} children={
{ await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > Address} /> { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > Address} /> { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > Zipcode} maxLength="6" onChange={pinCodeChange} /> {zipCodeData ? ( <> { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > { await validateSafeInput(value); // To block HTML tags & SQL keywords return Promise.resolve(); }, }, ]} > ) : ( '' )}
} />
); }; export default PurchaseOrder;