import React, { useState, useEffect, useRef, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { useDispatch } from 'react-redux'; import { Form, Table, Input, Select, AutoComplete, Radio, DatePicker, Button, Tooltip, Space, Segmented, } from 'antd'; import { BsUpcScan } from "react-icons/bs"; import { ArrowRightOutlined, DeleteFilled, SearchOutlined, } from '@ant-design/icons'; import { IoMdAddCircleOutline } from 'react-icons/io'; import { FaEye, FaPrint, FaTruck } from 'react-icons/fa'; import { Messages } from '../../Components/Notifications/Messages.jsx'; import { InputField } from '../../Components/Forms/InputField.jsx'; import Buttons from '../../Components/Forms/Buttons.jsx'; import { getSession, pdfDiv, printDiv, validateSafeInput, } from '../../Services/Others.js'; import FormHeader from '../PageComponents/FormHeader.jsx'; import { DropDowns } from '../../Components/Forms/DropDown.jsx'; import { CiBarcode } from 'react-icons/ci'; import { AdminUserData, getProdQuoaVariantdata, getPurProductData, } from '../../Features/PurchaseQuotation/PurchaseQuotation.js'; import './DeliveryChallan.scss'; import { getPurchaseTaxTypeData } from '../../Features/StockMaster/StockMaster.js'; import { changeBreadCrumb, getEmpAccess, } from '../../Features/AppPage/CenterPage.js'; import { useAuth } from '../../AuthContext.jsx'; import { getAllCustomerAndBranch, PendingOrdersDC } from '../../Features/BookingScreen/BookingData/BookingData.js'; const subDirectory = import.meta.env.BASE_URL; import TooltipWrapper from '../../Components/Tooltip/Tooltip.jsx'; import { DefaultModal } from '../../Components/Modal/DefaultModal.jsx'; import { PostChallan } from '../../Features/DeliveryChallan/DeliveryChallan.js'; import { MdOutlineMail } from 'react-icons/md'; import DeliveryPrint from './DeliveryPrint.jsx'; import { Emailsend } from '../../Features/PurchaseOrder/PurchaseOrder.js'; import FloatLabel from '../../Components/Forms/FloatLabel/index.jsx'; import { debounce } from 'lodash'; import { DCPrintStyleFunction } from './DCPrintStyleFunction.js'; import { useSelector } from 'react-redux'; import { getPrintSelectionComponentData } from '../../Features/ThemeChange/ThemeChange.js'; import { DCPDFMobilePrint } from './DCPDFMobilePrint.js'; import { isMobile } from 'react-device-detect'; import EmailModel from '../BookingScreen/Components/UtillComponents/EmailModel.jsx'; const DeliveryChellanForm = () => { const { SadminuserAccess } = useAuth(); let SAAccessCommonMaster = SadminuserAccess?.find( (e) => e?.MenuName === 'Delivery Challan' ); const formRef = useRef(null); const transportFormRef = useRef(null); const [form] = Form.useForm(); const dispatch = useDispatch(); const navigate = useNavigate(); const CompId = getSession('CompId'); const BranchId = getSession('BranchId'); const AppId = getSession('AppId'); const UserId = getSession('UserId'); const UserType = getSession('UserType'); const [DCPrintTemplateStyle, setDCPrintTemplateStyle] = useState(null); const [DCPrintTemplateDtl, setDCPrintTemplateDtl] = useState(null); const [messageType, setMessageType] = useState(null); const [messageData, setMessageData] = useState(null); const [SelecAdminUser, setSelecAdminUser] = useState(null); const [SelTaxType, setSelTaxType] = useState(null); const [SelTaxTypeName, setSelTaxTypeName] = useState(null); const [ProductData, setProductData] = useState([]); const [AllCustomer, setAllCustomer] = useState(null); const [Modal, setModal] = useState(false); const [SelProduct, setSelProduct] = useState(null); const [selectedProductName, setSelectedProductName] = useState(null); const [productSearchText, setProductSearchText] = useState(""); const [scanner, setScanner] = useState(false); const [Variants, setVariants] = useState([]); const [TableData, setTableData] = useState([]); const [editingKey, setEditingKey] = useState(''); const [ordersCustomer, setOrdersCustomer] = useState([]); const [TotalBillAmount, setTotalBillAmount] = useState(null); const [TotalCgst, setTotalCgst] = useState(null); const [TotalSgst, setTotalSgst] = useState(null); const [TotalIgst, setTotalIgst] = useState(null); const [TotalAmount, setTotalAmount] = useState(null); const isEditing = (record, index) => index === editingKey; const [empData, setEmpData] = useState(); const [addnewAccess, setaddnewAccess] = useState(true); const [selectedMode, setSelectedMode] = useState(''); const [isSubmitted, setIsSubmitted] = useState(false); const [PrintingData, setPrintingData] = useState([]); const [iSEmail, setiSEmail] = useState(false); const [pendingOrderDetails, setPendingOrderDetails] = useState(null); const [pendingRecord, setPendingRecord] = useState(null); const [segmentValue, setSegmentValue] = useState("N") const [selectedOrder, setSelectedOrder] = useState(); const [orderTableData, setOrderTableData] = useState([]); const [emailSending, setEmailSending] = useState(false); const items = [ { name: 'Home', link: `${subDirectory}app-page/home`, }, { name: 'Delivery Challan', link: `${subDirectory}setting/delivery-challan`, }, ]; useEffect(() => { dispatch(changeBreadCrumb({ items: items })); getProduct(); fetchdata(); getPrintData(); }, []); useEffect(() => { if (UserType === 'Employee') { fetchApi(); } }, [UserType]); useEffect(() => { let hasAccess = false; if (UserType === 'Admin' || UserType === 'Super Admin') { hasAccess = true; } else if (UserType === 'Employee') { hasAccess = empData?.AddAccess === 'Y'; } else if (UserType === 'Super Admin User') { hasAccess = SAAccessCommonMaster?.AddAccess === 'Y'; } setaddnewAccess(!hasAccess); }, [empData, SAAccessCommonMaster, UserType]); const debouncedScannerSearch = useCallback( debounce((value) => { const qr = value?.trim(); const matchedProduct = ProductData.find( (p) => p.QRCode?.toLowerCase() === qr?.toLowerCase() ); if (matchedProduct) { let productName = {}; productName.label = `${matchedProduct?.ProdName} (${matchedProduct.Size} ${matchedProduct.UomName})${matchedProduct?.BrandName ? ` - ${matchedProduct?.BrandName}` : ''}` ProductDropDownChange(matchedProduct.ProdId, productName); if (matchedProduct?.ProdVariantPriceDetails?.length < 2) { setSelectedProductName(""); setSelProduct(null) } } else { setMessageType("error"); setMessageData("The Scanned Product not Available in Product List") } }, 300), [ProductData] ); const fetchApi = async () => { let data = { CompId: CompId, BranchId: BranchId, AppId: AppId, EmpId: UserId, }; let response = await dispatch(getEmpAccess(data)).unwrap(); let datas = response?.data?.data?.[0]?.EmpAccessDetails?.filter( (item) => item.ConfigName === 'Delivery Challan' ); setEmpData(datas?.[0]); }; const getPrintData = async () => { let data = { CompId: CompId, BranchId: BranchId, AppId: AppId, }; let response = await dispatch(getPrintSelectionComponentData(data)).unwrap(); if (response?.data?.statusCode === 1) { let DCPrintTemplate = response?.data?.data?.[0]?.ComponentDetails?.find( (item) => item.SetasDefault == 'Y' && item.PrintTypeName === 'Delivery Chalan' ); console.log(DCPrintTemplate, response?.data?.data?.[0]?.ComponentDetails?.find( (item) => item.SetasDefault == 'Y' && item.PrintTypeName === 'Delivery Chalan' ), 'DCPrintTemplate'); setDCPrintTemplateStyle(DCPrintTemplate?.StyleName); setDCPrintTemplateDtl(DCPrintTemplate); } }; // useEffect(() => { // Print(); // }, [PrintData]); useEffect(() => { let total = TableData?.reduce((accumulator, currentValue) => { return accumulator + currentValue.NetAmt; }, 0); setTotalAmount(total); let cgst = TableData?.filter( (item) => item.TaxName?.toLowerCase() === 'cgst,sgst' ); let totalgst = cgst?.reduce((accumulator, currentValue) => { return accumulator + currentValue.TaxAmt; }, 0); setTotalCgst(totalgst / 2); setTotalSgst(totalgst / 2); let igst = TableData?.filter( (item) => item.TaxName?.toLowerCase() === 'igst' ); let totaligst = igst?.reduce((accumulator, currentValue) => { return accumulator + currentValue.TaxAmt; }, 0); setTotalIgst(totaligst); let billtotal = TableData?.reduce((accumulator, currentValue) => { return accumulator + currentValue.NetAmt; }, 0); console.log(billtotal, total, TableData, 'billtotal'); setTotalBillAmount(billtotal); }, [TableData]); const getProduct = async () => { let Product = await dispatch( getPurProductData({ CompId: CompId, AppId: AppId, BranchId: BranchId, ActiveStatus: 'A', }) ).unwrap(); if (Product?.data?.statusCode === 1) { let Productonlydata = Product?.data?.data?.filter( (item) => item?.ProdTypeName === 'Product' ); setProductData(Productonlydata); } else { setProductData([]); } }; console.log(AllCustomer, "AllCustomerAllCustomer") const fetchdata = async () => { try { const resCustomer = await dispatch(getAllCustomerAndBranch({ CompId, AppId, BranchId })).unwrap(); if (resCustomer?.data?.statusCode === 1) { setAllCustomer(resCustomer?.data?.data); } else { setAllCustomer([]); setMessageType("error"); setMessageData(resCustomer?.data?.response); } const resOrders = await dispatch(PendingOrdersDC({ CompId, AppId, BranchId })).unwrap(); if (resOrders?.data?.statusCode === 1) { setOrdersCustomer(resOrders?.data?.data?.PurchaseOrder); } else { setOrdersCustomer([]); setMessageType("error"); setMessageData(resOrders?.data?.response); } } catch (err) { // setAllCustomer([]); setOrdersCustomer([]); setMessageType("error"); setMessageData("Something went wrong"); } }; const handleOrderChange = (params) => { const [suppId, purOrderId] = params.split("||"); formRef?.current?.setFieldsValue({ Order: suppId }) setSelectedOrder(suppId) const { OrderDetails } = ordersCustomer?.find(find => find.SuppId === suppId && find.PurOrderId === purOrderId); setOrderTableData(OrderDetails?.map(item => { const { InwardDtlId, OnePcsAvailable, SellPrice, TaxId, TaxName } = ProductData?.find((e) => e.ProdId === item.ProdId); return { ...item, InwardDtlId, TaxId, TaxName, SinglePc: OnePcsAvailable, ProductRate: SellPrice, TotalAmount: item.OrderQty * SellPrice, TaxAmount: 0, GrossTotal: item.OrderQty * SellPrice } })) setSelectedProductName(null) setVariants([]) setTableData([]) formRef?.current?.setFieldsValue({ ProdId: undefined, }) } const handleAdminUserDropDownChange = (UserId) => { setSelecAdminUser(UserId); formRef.current?.setFieldsValue({ CustId: UserId }); setIsSubmitted(false); }; const handleScanSearch = () => { if (scanner === false) { setMessageType("success"); setMessageData("Search by QrCode/BarCode Enabled") } else { setMessageType("success"); setMessageData("Search by QrCode/BarCode Disabled") } setScanner(prev => !prev) setSelectedProductName(null); setVariants(null) formRef?.current?.setFieldsValue({ ProdId: null, VarProdId: null }); } const handleProductSearch = (value) => { if (scanner) { debouncedScannerSearch(value); } setSelectedProductName(value); setProductSearchText(value) setVariants([]) }; const ProductDropDownChange = async (ProdId, option) => { formRef?.current?.resetFields(['VarProdId']); setProductSearchText("") setSelectedProductName(option?.label ? option?.label : '') setSelProduct(ProdId); formRef.current?.setFieldsValue({ ProdId: ProdId }); let x = ProductData?.find((e) => e.ProdId === ProdId)?.ProdName; let variantValues1 = await dispatch( getProdQuoaVariantdata({ CompId: CompId, AppId: AppId, BranchId: BranchId, prodName: x, }) ).unwrap(); let variants1 = variantValues1?.data?.data; // let cc = variants1?.[0]?.ProductDetail; let cc = variants1?.filter((item) => item?.ProdName == x)?.[0]?.ProductDetail; setVariants( cc?.[0]?.ProdVariantDetails?.map((detail) => ({ ...detail, ProdIdProdName: `${detail.ProdVariantName} ${detail.ProdId}`, })) ); if (segmentValue === "O") { if (cc?.[0]?.ProdVariantDetails?.length < 2) { if (orderTableData?.some((e) => e.ProdId === ProdId)) { setMessageType('error'); setMessageData('Already Product Exists'); } else { const { ProdName, UomName, OnePcsAvailable, SellPrice, InwardDtlId, TaxId, TaxName } = ProductData?.find(item => item.ProdId === ProdId); setOrderTableData(prev => [...prev, { OrderQty: 1, ProdId, ProdName: ProdName, ProdVariantName: "Variant 1", PurOrderId: "", UOM: UomName, InwardDtlId, TaxId, TaxName, SinglePc: OnePcsAvailable, ProductRate: SellPrice, TotalAmount: 1 * SellPrice, TaxAmount: 0, GrossTotal: 1 * SellPrice }]) } } } else { if (cc?.[0]?.ProdVariantDetails?.length < 2) { if (TableData?.some((e) => e.ProdId === ProdId)) { setMessageType('error'); setMessageData('Already Product Exists'); } else { let ProductData1 = ProductData?.find((e) => e.ProdId === ProdId); let ProduData2 = { ProdId: ProductData1?.ProdId, ProdName: ProductData1?.ProdName, UomName: ProductData1?.UomName, Price: ProductData1?.SellPrice, TaxName: ProductData1?.TaxName, HSNCode: ProductData1?.HSNCode, Size: ProductData1?.Size, InwardDtlId: ProductData1?.InwardDtlId, TaxId: ProductData1?.TaxId, TaxPercentage: ProductData1?.TaxPercentage, SinglePc: ProductData1?.OnePcsAvailable, }; let tempPurData = { ...ProduData2, Qty: 0, ProdVariantName: 'Variant 1', }; setTableData([...TableData, tempPurData]); } } } }; const ProductVariantDropDownChange = (value) => { if (segmentValue === "O") { const selectedVarientName = Variants?.filter(({ ProdIdProdName }) => ProdIdProdName === value)?.[0]?.ProdVariantName; const isVarientDublicate = orderTableData?.some(({ ProdId, ProdVariantName }) => ProdId === SelProduct && ProdVariantName === selectedVarientName); if (isVarientDublicate) { setMessageType('error'); setMessageData('Already variant Exists'); } else { formRef?.current?.setFieldsValue({ VarProdId: value }); setOrderTableData(prev => prev.map(item => { if (item.ProdId === SelProduct) { return { ...item, ProdVariantName: selectedVarientName } } return item })) const { ProdName, UomName, OnePcsAvailable, SellPrice, InwardDtlId, TaxId, TaxName } = ProductData?.find(item => item.ProdId === SelProduct); setOrderTableData(prev => [...prev, { OrderQty: 1, ProdId: SelProduct, ProdName: ProdName, ProdVariantName: "Variant 1", PurOrderId: "", UOM: UomName, InwardDtlId, TaxId, TaxName, SinglePc: OnePcsAvailable, ProductRate: SellPrice, TotalAmount: 1 * SellPrice, TaxAmount: 0, GrossTotal: 1 * SellPrice }]) } } else { const ProdName2 = Variants?.filter( (item) => item.ProdIdProdName === value )?.[0]?.ProdVariantName; const ProdName1 = TableData?.some( (e) => e.ProdId === SelProduct && e.ProdVariantName === ProdName2 ); if (ProdName1) { setMessageType('error'); setMessageData('Already variant Exists'); } else { const ProdName = Variants?.filter( (item) => item.ProdIdProdName === value )?.[0]?.ProdVariantName; formRef?.current?.setFieldsValue({ VarProdId: value }); let ProductData1 = ProductData?.find((e) => e.ProdId === SelProduct); let mrp; let sellprice; let InwardDtlId; if (ProdName == 'Variant 1') { mrp = ProductData1?.MRP; sellprice = ProductData1?.SellPrice; InwardDtlId = ProductData1?.ProdVariantPriceDetails?.find( (item) => item.ProdVariantName == ProdName )?.InwardDtlId; } else { mrp = ProductData1?.ProdVariantPriceDetails?.find( (item) => item.ProdVariantName == ProdName )?.MRP; sellprice = ProductData1?.ProdVariantPriceDetails?.find( (item) => item.ProdVariantName == ProdName )?.SellPrice; InwardDtlId = ProductData1?.ProdVariantPriceDetails?.find( (item) => item.ProdVariantName == ProdName )?.InwardDtlId; } let ProduData2 = { ProdId: ProductData1?.ProdId, ProdName: ProductData1?.ProdName, UomName: ProductData1?.UomName, Price: sellprice, TaxName: ProductData1?.TaxName, HSNCode: ProductData1?.HSNCode, InwardDtlId: InwardDtlId, Size: ProductData1?.Size, TaxId: ProductData1?.TaxId, TaxPercentage: ProductData1?.TaxPercentage, }; let tempPurData = { ...ProduData2, Qty: 0, ProdVariantName: ProdName, }; setTableData([...TableData, tempPurData]); } } }; const onComplete = useCallback(() => { setMessageData(null); setMessageType(null); }, []); const save = async (index) => { try { const row = await form?.validateFields(); const modifiedObject = {}; for (const key in row) { const newKey = key.slice(0, -1); // Remove the last character ("0") from the key modifiedObject[newKey] = row[key]; } const newData = [...TableData]; // const index = newData.findIndex((item) => recordKey === item.InwardDtlId); if (index > -1) { const item = newData[index]; newData.splice(index, 1, { ...item, ...modifiedObject }); setTableData(newData); setEditingKey(''); } } catch (err) { console.error('Save failed:', err); } }; const handleKeyPress = async (e, record, index) => { if (e.key === 'Enter') { try { await form.validateFields(); save(index); } catch (error) { console.error('Save failed:', error); } } }; const statusFormatter = (record) => { let filterData = TableData?.filter((e) => e?.InwardDtlId != record.InwardDtlId); setTableData(filterData) } const getColumns = (data, seltax) => { const hasDiscount = data?.some((record) => record.PurcDisc > 0); const baseColumns = [ { title: 'Sl.No', align: 'center', key: 'sno', width: '50px', render: (text, object, index) => ( {index + 1} ), }, { title: 'Product Name', dataIndex: 'ProdName', key: 'ProdName', align: 'right', width: '300px', render: (text, record, index) => ( { record?.ProdName + '(' + record?.Size + '-' + record?.UomName + ')' // + // '(' + // record?.ProdVariantName + // ')' } ), }, { title: 'Variant Name', dataIndex: 'ProdVariantName', key: 'ProdVariantName', }, { title: 'Qty', dataIndex: 'Qty', key: 'Qty', editable: true, with: '100px', render: (text, record, index) => { return isEditing(record, index) ? (