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) => (
View Order
{' '} {ViewDtl ? 'View Less' : 'View More'}
{ViewDtl && ( <>| 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}>