import React, { useCallback, useEffect, useState } from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import { useDispatch } from 'react-redux'; import { MdOutlineTextsms } from "react-icons/md"; import { AiOutlineMail } from "react-icons/ai"; import { changeBreadCrumb, getEmpAccess, } from '../../../Features/AppPage/CenterPage'; import { Messages } from '../../../Components/Notifications/Messages'; import FormHeader from '../../PageComponents/FormHeader.jsx'; import { Search } from '../../../Components/Forms/Search'; import Buttons from '../../../Components/Forms/Buttons'; import { Space, Table, Checkbox, Spin } from 'antd'; import { EditFilled, DeleteFilled, PlusOutlined, ReloadOutlined, } from '@ant-design/icons'; import { Tables } from '../../../Components/Tables/Table'; import { getSession, dateFormatChange } from '../../../Services/Others'; import { DefaultModal } from '../../../Components/Modal/DefaultModal'; import { getCouponsdata, deleteCouponsdata, getGenCoupondata, postGenCoupondata, } from '../../../Features/Offer/CouponWiseOffer/CouponWiseoffer.js'; import { BiSolidCoupon } from 'react-icons/bi'; import { useAuth } from '../../../AuthContext.jsx'; import { postCustomerCouponMail, postSMSCoupon } from '../../../Features/Payment/PaymentDetails/PaymentDetails.js'; import { getPreferenceData } from '../../../Features/BookingScreen/BookingData/BookingData.js'; const CheckboxGroup = Checkbox.Group; const subDirectory = import.meta.env.ENV_BASE_URL; const items = [ { name: 'Home', link: `${subDirectory}app-page/home`, }, { name: 'CouponWiseOffer', link: `${subDirectory}setting/coupon`, }, ]; const plainOptions = [ { label: (
Mail
), value: 'Mail', }, { label: (
SMS
), value: 'SMS', }, // { // label: (<>WatsApp), // value: 'WatsApp', // }, ]; const CouponWiseOfferlist = () => { const { SadminuserAccess } = useAuth(); let SAAccessCommonMaster = SadminuserAccess?.find( (e) => e?.MenuName === 'Coupon Wise Offer' ); console.log(SAAccessCommonMaster, 'SAAccessCommonMaster', SadminuserAccess); const navigateTo = useNavigate(); const dispatch = useDispatch(); const location = useLocation(); const CompId = getSession('CompId'); const BranchId = getSession('BranchId'); const AppId = getSession('AppId'); const UserId = getSession('UserId'); const UserType = getSession('UserType'); const [tabledata, setTabledata] = useState([]); const [messageType, setMessageType] = useState(null); const [messageData, setMessageData] = useState(null); const [searchedText, setSearchedText] = useState(''); const [sortedInfo, setSortedInfo] = useState({}); const [page, setpage] = useState(1); const [Open, setOpen] = useState(false); const [Coupondata, setCoupondata] = useState(); const [selectedRowKeys, setSelectedRowKeys] = useState(); const [selectedRowData, setSelectedRowData] = useState(); const [data, setdata] = useState([]); const [selectionType, setSelectionType] = useState('checkbox'); const [Uniqueid, setUniqueid] = useState(); const [empData, setEmpData] = useState(); const [addnewAccess, setaddnewAccess] = useState(true); const [allowDecimal, setAllowDecimal] = useState(false); const [checkedList, setCheckedList] = useState([]); const [isLoading, setIsLoading] = useState(false); const checkAll = plainOptions.length === checkedList.length; const indeterminate = checkedList.length > 0 && checkedList.length < plainOptions.length; const getPreference = async () => { const data = { AppId: AppId, CompId: CompId, BranchId: BranchId,UserId:UserId }; const { data: res } = await dispatch(getPreferenceData(data)).unwrap() const decimalSetting = res?.data?.[0]?.SettingDtlDetails?.find((setting) => setting?.SettingIdName?.toLowerCase() === "decimal" && setting?.SettingValue === 'Y'); if (decimalSetting) { setAllowDecimal(true) } } const actionsFormatter = async (row, rowIndex) => { if (row.ActiveStatus !== 'D') { navigateTo( `${subDirectory}setting/coupon/update`, { state: { editstate: row } }, { key: rowIndex } ); } }; const statusFormatter = async (row) => { let deleteData = { UniqueId: row.UniqueId, ActiveStatus: row.ActiveStatus == 'A' ? 'D' : 'A', UpdatedBy: getSession('UserId'), }; let response = await dispatch(deleteCouponsdata(deleteData)).unwrap(); if (response?.data?.statusCode == 1) { Tabledatas(); setMessageType('success'); setMessageData( row.ActiveStatus == 'A' ? 'In-Activated Successfully' : 'Activated Successfully' ); } }; 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 columns = [ { title: 'Sl.No', key: 'sno', align: 'center', width: '80px', render: (text, object, index) => ( {(page - 1) * 10 + index + 1} ), }, { title: 'Offer Name', dataIndex: 'OfferName', key: 'OfferName', width: '150px', render: (text) => {text}, filteredValue: [searchedText], onFilter: (value, record) => { return ( String(record.OfferName) ?.toLowerCase() ?.includes(value?.toLowerCase()) || String(record.MinQty)?.toLowerCase()?.includes(value?.toLowerCase()) || String(record.MinPurchase) ?.toLowerCase() ?.includes(value?.toLowerCase()) || String(record.Point)?.toLowerCase()?.includes(value?.toLowerCase()) || String(record.RewardTypeName) ?.toLowerCase() ?.includes(value?.toLowerCase()) ); }, sorter: (a, b) => a?.OfferName?.length - b?.OfferName?.length, sortOrder: sortedInfo.columnKey === 'OfferName' ? sortedInfo.order : null, ellipsis: true, }, { title: 'Min Qty', dataIndex: 'MinQty', key: 'MinQty', // width: "100px", align: 'right', render: (text) => {text}, }, { title: 'Min Purchase', dataIndex: 'MinPurchase', key: 'MinPurchase', width: '100px', align: 'right', render: (text) => {safeRound(text)}, }, { title: 'Reward Type', dataIndex: 'RewardTypeName', key: 'RewardTypeName', width: '100px', align: 'center', render: (text) => {text}, }, { title: 'Reward Value', dataIndex: 'Discount', key: 'Discount', // width: "100px", align: 'right', render: (_, record, index) => ( {record?.RewardTypeName === 'Discount' ? ( record?.OfferType == 'F' ? ( '₹' + safeRound(record?.OfferAmt) ) : ( record?.OfferAmt + '%' ) ) : ( {record?.RewardTypeDetails.length + ' ' + "Product's"} )} ), }, { title: 'Generate Coupon', key: 'Print', dataIndex: 'Print', // width: "150px", align: 'center', render: (_, record, index) => tabledata.length >= 1 ? ( {/* {record.QRCode != null ? ( */} (UserType === 'Super Admin' || (UserType === 'Super Admin User' && SAAccessCommonMaster?.UpdateAccess === 'Y') || (UserType === 'Employee' && (empData?.UpdateAccess === 'Y' || empData?.AddAccess === 'Y')) || UserType === 'Admin') && CouponGenereate(record, index) } /> {/* ) : ( */} {/* "-" */} {/* )} */} ) : null, }, { title: 'From', dataIndex: 'OfferFrom', key: 'OfferFrom', width: '120px', render: (text) => ( {dateFormatChange(text)} ), }, { title: 'To', dataIndex: 'OfferTo', key: 'OfferTo', width: '120px', render: (text) => ( {dateFormatChange(text)} ), }, { title: 'Action', key: 'Action', align: 'center', // width: "150px", dataIndex: 'Action', render: (_, record, index) => tabledata.length >= 1 ? ( {record.ActiveStatus === 'A' ? ( UserType === 'Super Admin' || (UserType === 'Super Admin User' && SAAccessCommonMaster?.UpdateAccess === 'Y') || (UserType === 'Employee' && empData?.UpdateAccess === 'Y') || UserType === 'Admin' ? actionsFormatter(record, index) : null } /> ) : ( '' )} {record.ActiveStatus === 'A' ? ( UserType === 'Super Admin' || (UserType === 'Super Admin User' && SAAccessCommonMaster?.DeleteAccess === 'Y') || (UserType === 'Employee' && empData?.DeleteAccess === 'Y') || UserType === 'Admin' ? statusFormatter(record, index) : null } /> ) : ( UserType === 'Super Admin' || (UserType === 'Super Admin User' && SAAccessCommonMaster?.DeleteAccess === 'Y') || (UserType === 'Employee' && empData?.DeleteAccess === 'Y') || UserType === 'Admin' ? statusFormatter(record, index) : null } /> )} ) : null, }, ]; const columns1 = [ { title: 'Sl.No', key: 'sno', align: 'center', width: '100px', render: (text, object, index) => ( {(page - 1) * 10 + index + 1} ), }, { title: 'Customber ID', dataIndex: 'CustId', key: 'CustId', width: '150px', render: (text) => {text}, filteredValue: [searchedText], onFilter: (value, record) => { return ( String(record.OfferName) ?.toLowerCase() ?.includes(value?.toLowerCase()) || String(record.MinQty)?.toLowerCase()?.includes(value?.toLowerCase()) || String(record.MinPurchase) ?.toLowerCase() ?.includes(value?.toLowerCase()) || String(record.Point)?.toLowerCase()?.includes(value?.toLowerCase()) || String(record.RewardTypeName) ?.toLowerCase() ?.includes(value?.toLowerCase()) ); }, sorter: (a, b) => a?.OfferName?.length - b?.OfferName?.length, sortOrder: sortedInfo.columnKey === 'OfferName' ? sortedInfo.order : null, ellipsis: true, }, { title: 'Cust Name', dataIndex: 'CustName', key: 'CustName', width: '80px', align: 'right', }, { title: 'Cust Mobile No', dataIndex: 'CustMobile', key: 'CustMobile', width: '120px', align: 'right', }, { title: 'Cust Address', dataIndex: 'Address1', key: 'Address1', width: '150px', align: 'center', }, { title: 'Coupon Code', dataIndex: 'CouponCode', key: 'CouponCode', width: '90px', align: 'right', }, { title: 'Coupon Status', dataIndex: 'CouponStatus', key: 'CouponStatus', width: '100px', align: 'right', render: (text, record) => record.CouponStatus === 'N' ? 'Not Used' : 'Used', }, { title: 'Issue Date', dataIndex: 'IssueDate', key: 'IssueDate', width: '110px', align: 'right', render: (text) => ( {dateFormatChange(text)} ), }, ]; useEffect(() => { dispatch(changeBreadCrumb({ items: items })); if (location?.state?.Notiffy) { setMessageType(location?.state?.Notiffy.messageType); setMessageData(location?.state?.Notiffy.messageData); } Tabledatas(); getPreference(); }, []); 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 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 === 'Coupon Wise Offer' ); setEmpData(datas?.[0]); }; const handelAddButton = () => { navigateTo(`${subDirectory}setting/coupon/new`); }; const onComplete = useCallback(() => { setMessageData(null); setMessageType(null); }, []); const Tabledatas = async () => { let data = { CompId: CompId, BranchId: BranchId, AppId: AppId, }; let Response = await dispatch(getCouponsdata(data)).unwrap(); setTabledata(Response.data?.data); }; const onSearch = (value) => { setSearchedText(value); }; const onSearchChange = (e) => { setSearchedText(e?.target?.value); }; const handleChange = (pagination, filters, sorter) => { setSortedInfo(sorter); }; const handlePageChange = (current) => { setpage(current); }; const CouponGenereate = async (row) => { const { OfferId, UniqueId } = row; const response = await dispatch(getGenCoupondata({ CompId, BranchId, OfferId, AppId, type: 'C' })).unwrap(); if (response?.data?.statusCode === 1) { setCoupondata(response.data?.data); const defaultSelectedKeys = []; const data = response?.data?.data?.map(({ CustId, CustName, CustMobile, CustEmail, Address1, CouponCode, CouponStatus, IssueDate, Type, BrName, BrEmail, }, index) => { if (Type === 'Y') defaultSelectedKeys.push(index); return { key: index, CustId, CustName, CustMobile, CustEmail, Address1, CouponStatus, IssueDate, Type, BrName, BrEmail, CouponCode: CouponCode !== null ? CouponCode : genCoupencode() } }) setdata(data); setSelectedRowKeys(defaultSelectedKeys); setOpen(prev => !prev); setUniqueid(UniqueId); } else { setMessageType('error'); setMessageData(response?.data?.data?.length === 0 ? "No Customers Listed for this Perticular Offer" : response?.data?.response); } }; const handleCancelNew = () => { setOpen(prev => !prev); }; const genCoupencode = (length = 6) => { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; let promoCode = ''; for (let i = 0; i < length; i++) { promoCode += characters.charAt( Math.floor(Math.random() * characters.length) ); } return promoCode; } useEffect(() => { if (data?.length > 0) { let Filteredrowdata = data?.filter((a) => selectedRowKeys?.includes(a.key) ); setSelectedRowData(Filteredrowdata); } }, [data]); const onSelectChange = (newSelectedRowKeys) => { let Filteredrowdata = data?.filter((a) => newSelectedRowKeys?.includes(a.key) ); setSelectedRowKeys(newSelectedRowKeys); setSelectedRowData(Filteredrowdata); }; const rowSelection = { selectedRowKeys, onChange: onSelectChange, getCheckboxProps: (record) => ({ disabled: record.Type === 'Y', }), selections: [ Table.SELECTION_ALL, Table.SELECTION_INVERT, Table.SELECTION_NONE, { key: 'odd', text: 'Select Odd Row', onSelect: (changeableRowKeys) => { const newSelectedRowKeys = changeableRowKeys.filter( (_, index) => index % 2 !== 0 ); setSelectedRowKeys(newSelectedRowKeys); }, }, { key: 'even', text: 'Select Even Row', onSelect: (changeableRowKeys) => { const newSelectedRowKeys = changeableRowKeys.filter( (_, index) => index % 2 === 0 ); setSelectedRowKeys(newSelectedRowKeys); }, }, ], }; const handleSubmit = async () => { if (selectedRowData?.length >= 1) { const filteredData = selectedRowData?.filter(({ Type }) => Type != 'Y'); const { BrName, BrEmail } = filteredData?.[0] || {}; const Postdata = { BrName, BrEmail, CouponId: Uniqueid, CouponDetails: filteredData?.map(({ CustId, CouponCode, CustName, CustMobile, CustEmail }) => ({ CustId, CouponCode, CustName, CustMobile, CustEmail, })), CreatedBy: UserId, }; setIsLoading(true); const response = await dispatch(postGenCoupondata(Postdata)).unwrap(); if (response?.data?.statusCode === 1) { const { CustomerDtl, BrName, BrEmail, Description, MinQty, MinPurchase } = response?.data; if (checkedList?.includes("Mail")) { const applicableEmailCustomers = CustomerDtl?.filter(({ CustEmail }) => CustEmail !== null) || []; if (applicableEmailCustomers?.length > 0) { const { RewardTypeName, AppliesTo, OfferAmt, ProdCount, RewardOrderTypeDetails, RewardTypeDetails, RewardFreeTypeDetails } = tabledata?.find(({ UniqueId: uid }) => uid === Uniqueid) let Categories = '' let Products = '' if (RewardTypeName === 'Discount' && AppliesTo === 'S') { Categories = RewardOrderTypeDetails?.filter(({ ProdCat }) => ProdCat !== 0 || ProdCat !== null)?.map(({ ProdCatName }) => ProdCatName)?.filter(Boolean).join() Products = RewardOrderTypeDetails?.filter(({ ProdCat }) => ProdCat === 0 || ProdCat === null)?.map(({ ProdName }) => ProdName)?.filter(Boolean).join() } else if (RewardTypeName === 'Free Products') { Products = [...RewardTypeDetails?.map(({ ProdName }) => ProdName), ...RewardFreeTypeDetails?.map(({ ProdName }) => ProdName)]?.filter(Boolean).join() } const postEmailData = { BrName, BrEmail, Description, MinQty, MinPurchase, CustomerDtl: applicableEmailCustomers, RewardTypeName, AppliesTo, Categories, Products, Amount: OfferAmt, Qty: ProdCount }; await dispatch(postCustomerCouponMail(postEmailData)).unwrap(); } } if (checkedList?.includes("SMS")) { const applicableSMSCustomers = CustomerDtl?.filter(({ CustMobile }) => CustMobile !== null) || []; if (applicableSMSCustomers?.length > 0) { const { RewardTypeName, AppliesTo, OfferAmt, ProdCount, RewardOrderTypeDetails, RewardTypeDetails, RewardFreeTypeDetails } = tabledata?.find(({ UniqueId: uid }) => uid === Uniqueid) let Categories = '' let Products = '' if (RewardTypeName === 'Discount' && AppliesTo === 'S') { Categories = RewardOrderTypeDetails?.filter(({ ProdCat }) => ProdCat !== 0 || ProdCat !== null)?.map(({ ProdCatName }) => ProdCatName)?.filter(Boolean).join() Products = RewardOrderTypeDetails?.filter(({ ProdCat }) => ProdCat === 0 || ProdCat === null)?.map(({ ProdName }) => ProdName)?.filter(Boolean).join() } else if (RewardTypeName === 'Free Products') { Products = [...RewardTypeDetails?.map(({ ProdName }) => ProdName), ...RewardFreeTypeDetails?.map(({ ProdName }) => ProdName)]?.filter(Boolean).join() } const postSMSData = { BrName, BrEmail, Description, MinQty, MinPurchase, CustomerDtl: applicableSMSCustomers, RewardTypeName, AppliesTo, Categories, Products, Amount: OfferAmt, Qty: ProdCount }; await dispatch(postSMSCoupon(postSMSData)).unwrap(); } } setOpen(prev => !prev); setMessageType('success'); setMessageData(`${response?.data?.response}`) ; } setIsLoading(false); } }; const onChange = list => { setCheckedList(list); }; const onCheckAllChange = e => { setCheckedList(e.target.checked ? plainOptions?.map(({ value }) => value) : []); }; return (
handelAddButton()} color="901D77" disabled={addnewAccess} icon={} > OPEN

Share Codes via :

Check All
} handleSubmit={handleSubmit} handleCancel={handleCancelNew} /> ); }; export default CouponWiseOfferlist;