import React, { useEffect, useState, useCallback } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import {
changeBreadCrumb,
getEmpAccess,
} from '../../../Features/AppPage/CenterPage.js';
import { Messages } from '../../../Components/Notifications/Messages.jsx';
import FormHeader from '../../PageComponents/FormHeader.jsx';
import { Search } from '../../../Components/Forms/Search.jsx';
import Buttons from '../../../Components/Forms/Buttons.jsx';
import {
EditFilled,
DeleteFilled,
PlusOutlined,
ReloadOutlined,
} from '@ant-design/icons';
import { AiOutlineMail } from 'react-icons/ai';
import { MdOutlineTextsms } from 'react-icons/md';
import { Checkbox, Space, Spin, Table } from 'antd';
import { Tables } from '../../../Components/Tables/Table.jsx';
import { getSession, dateFormatChange } from '../../../Services/Others.js';
import {
getOfferCode,
deleteOfferCode,
} from '../../../Features/Offer/OfferCode/OfferCode.js';
import { useAuth } from '../../../AuthContext.jsx';
import { getAllCustomer, getPreferenceData } from '../../../Features/BookingScreen/BookingData/BookingData.js';
import { DefaultModal } from '../../../Components/Modal/DefaultModal.jsx';
import { BiSolidCoupon } from 'react-icons/bi';
import { postCustomerOfferMail, postSMSOffer } from '../../../Features/Payment/PaymentDetails/PaymentDetails.js';
const CheckboxGroup = Checkbox.Group;
const subDirectory = import.meta.env.ENV_BASE_URL;
const items = [
{
name: 'Home',
link: `${subDirectory}app-page/home`,
},
{
name: 'Offercode',
link: `${subDirectory}setting/offer-code`,
},
];
const plainOptions = [
{
label: (
),
value: 'Mail',
},
{
label: (SMS
),
value: 'SMS',
},
// {
// label: (<>WatsApp>),
// value: 'WatsApp',
// },
];
const OfferCodeList = () => {
const { SadminuserAccess } = useAuth();
let SAAccessCommonMaster = SadminuserAccess?.find(
(e) => e?.MenuName === 'Offer Code'
);
console.log(SadminuserAccess, 'SadminuserAccessSadminuserAccess');
const dispatch = useDispatch();
const location = useLocation();
const navigateTo = useNavigate();
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const UserId = getSession('UserId');
const UserType = getSession('UserType');
const [messageType, setMessageType] = useState(null);
const [messageData, setMessageData] = useState(null);
const [searchedText, setSearchedText] = useState('');
const [sortedInfo, setSortedInfo] = useState({});
const [page, setpage] = useState(1);
const [tabledata, setTabledata] = useState();
const [Open, setOpen] = useState(false);
const [empData, setEmpData] = useState();
const [addnewAccess, setaddnewAccess] = useState(true);
const [allowDecimal, setAllowDecimal] = useState(false);
const [checkedList, setCheckedList] = useState([]);
const [customerData, setCustomerData] = useState([]);
const [page1, setpage1] = useState(1);
const [sortedInfo1, setSortedInfo1] = useState({});
const [selectedOfferCode, setSelectedOfferCode] = useState(null);
const [selectedRowKeys, setSelectedRowKeys] = 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 };
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 onComplete = useCallback(() => {
setMessageData(null);
setMessageType(null);
}, []);
useEffect(() => {
dispatch(changeBreadCrumb({ items: items }));
if (location?.state?.Notiffy) {
setMessageType(location?.state?.Notiffy.messageType);
setMessageData(location?.state?.Notiffy.messageData);
}
TableData();
getPreference()
fetchCustomerApi()
// if (UserType === "Employee") {
// fetchApi()
// }
}, []);
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 fetchCustomerApi = async () => {
let res = await dispatch(getAllCustomer({ CompId, AppId, branchId: BranchId })).unwrap();
if (res?.data?.statusCode === 1) {
setCustomerData(res?.data?.data?.map((item, index) => ({ ...item, key: index + 1 })));
} else {
setCustomerData([]);
}
};
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 === 'Offer Code'
);
setEmpData(datas?.[0]);
};
const TableData = async () => {
let response = await dispatch(
getOfferCode({ CompId: CompId, BranchId: BranchId, AppId: AppId })
).unwrap();
if (response?.data?.statusCode == 1) {
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 handelAddButton = () => {
navigateTo(`${subDirectory}setting/offer-code/new`);
};
const actionsFormatter = async (row, rowIndex) => {
if (row.ActiveStatus !== 'D') {
navigateTo(
`${subDirectory}setting/offer-code/update`,
{ state: { editstate: row } },
{ key: rowIndex }
);
}
};
const statusFormatter = async (row) => {
let deleteData = {
uniqueId: row?.UniqueId,
updatedBy: UserId,
activeStatus: row?.ActiveStatus == 'A' ? 'D' : 'A',
};
let response = await dispatch(deleteOfferCode(deleteData)).unwrap();
if (response?.data?.statusCode === 1) {
TableData();
setMessageType('success');
setMessageData(
row.ActiveStatus == 'A'
? 'In-Activated Successfully'
: 'Activated Successfully'
);
} else if (response?.data?.statusCode === 0) {
setMessageType('error');
setMessageData(response?.data?.response);
}
};
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: "50px",
render: (text, object, index) => (
{(page - 1) * 10 + index + 1}
),
},
{
title: 'Offer Name',
dataIndex: 'OfferName',
key: 'OfferName',
// width: "100px",
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: "90px",
align: 'right',
render: (text) => {text},
},
{
title: 'Min Purchase',
dataIndex: 'MinPurchase',
key: 'MinPurchase',
// width: "95px",
align: 'right',
render: (text) => {safeRound(text)},
},
{
title: 'Offer Code',
dataIndex: 'OfferCode',
key: 'OfferCode',
width: '180px',
align: 'center',
render: (text) => {text},
},
{
title: 'Reward Type',
dataIndex: 'RewardTypeName',
key: 'RewardTypeName',
// width: "90px",
align: 'right',
render: (text) => {text},
},
{
title: 'Reward Value',
dataIndex: 'Discount',
key: 'Discount',
// width: "100px",
align: 'center',
render: (_, record, index) => (
{record?.RewardTypeName === 'Discount' ? (
record?.OfferType == 'F' ? (
'₹' + safeRound(record?.OfferAmt)
) : (
record?.OfferAmt + '%'
)
) : (
{record?.RewardTypeDetails.length + ' ' + 'Products'}
)}
),
},
{
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: 'Share Offer Code',
dataIndex: 'OfferId',
key: 'OfferId',
width: '100px',
align: 'center',
render: (text, record) => (
record.ActiveStatus === 'A'
? (UserType === 'Super Admin' ||
(UserType === 'Super Admin User' &&
SAAccessCommonMaster?.UpdateAccess === 'Y') ||
(UserType === 'Employee' &&
(empData?.UpdateAccess === 'Y' ||
empData?.AddAccess === 'Y')) ||
UserType === 'Admin') &&
handleShareOfferCode(record)
: null
}
style={{
cursor: record.ActiveStatus === 'A' ? 'pointer' : 'not-allowed',
color: record.ActiveStatus === 'A' ? '#1677ff' : 'gray',
opacity: record.ActiveStatus === 'A' ? 1 : 0.5,
pointerEvents: record.ActiveStatus === 'A' ? 'auto' : 'none',
}}
>
),
},
{
title: 'Action',
key: 'Action',
align: 'center',
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) => (
{(page1 - 1) * 10 + index + 1}
),
},
{
title: 'Customer 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: sortedInfo1.columnKey === 'OfferName' ? sortedInfo1.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 Email',
dataIndex: 'CustEmail',
key: 'CustEmail',
width: '150px',
align: 'center',
},
];
const handleShareOfferCode = async (record) => {
setSelectedOfferCode(record)
setOpen(prev => !prev);
}
const onCheckAllChange = e => {
setCheckedList(e.target.checked ? plainOptions?.map(({ value }) => value) : []);
};
const onChange = list => {
setCheckedList(list);
};
const handlePage1Change = (current) => {
setpage1(current);
};
const handleChange1 = (pagination, filters, sorter) => {
setSortedInfo1(sorter);
};
const onSelectChange = newSelectedRowKeys => {
setSelectedRowKeys(newSelectedRowKeys);
};
const rowSelection = {
selectedRowKeys,
onChange: onSelectChange,
};
const handleSubmit = async () => {
if (checkedList?.includes("Mail") || checkedList?.includes("SMS")) {
const selectedCustomers = customerData?.filter((_, index) => selectedRowKeys.includes(index))
if (selectedCustomers?.length > 0) {
const { BrName, BrEmail } = selectedCustomers?.[0] || {};
const {
OfferCode,
Description,
MinQty,
MinPurchase,
RewardTypeName,
AppliesTo,
OfferAmt,
ProdCount,
RewardOrderTypeDetails,
RewardTypeDetails,
RewardFreeTypeDetails } = selectedOfferCode;
let response = { mail: "", sms: "" };
setIsLoading(true);
if (checkedList?.includes("Mail")) {
const applicableEmailCustomers = selectedCustomers?.filter(({ CustEmail }) => CustEmail !== null)?.map(({ CustId, CustName, CustMobile, CustEmail }) => ({
CustId, CustName, CustMobile, CustEmail,
})) || [];
if (applicableEmailCustomers?.length > 0) {
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, OfferCode,
CustomerDtl: applicableEmailCustomers, RewardTypeName, AppliesTo, Categories, Products, Amount: OfferAmt,
Qty: ProdCount
};
response.mail = await dispatch(postCustomerOfferMail(postEmailData)).unwrap();
}
}
if (checkedList?.includes("SMS")) {
const applicableSMSCustomers = selectedCustomers?.filter(({ CustMobile }) => CustMobile !== null)?.map(({ CustId, CustName, CustMobile, CustEmail }) => ({
CustId, CustName, CustMobile, CustEmail,
})) || [];
if (applicableSMSCustomers?.length > 0) {
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, OfferCode,
CustomerDtl: applicableSMSCustomers, RewardTypeName, AppliesTo, Categories, Products, Amount: OfferAmt,
Qty: ProdCount
};
response.sms = await dispatch(postSMSOffer(postSMSData)).unwrap();
}
}
setIsLoading(false);
setOpen(prev => !prev);
setSelectedRowKeys([]);
setCheckedList([])
if (response?.mail?.data?.statusCode === 1 || response?.sms?.data?.statusCode === 1) {
setMessageType('success');
setMessageData(`${response?.mail?.data?.response} & ${response?.sms?.data?.response}`);
return;
} else {
setMessageType('error');
setMessageData('Failed to send Email and SMS');
return;
}
} else {
setMessageType('error');
setMessageData('Choose Customer');
}
} else {
setMessageType('error');
setMessageData('Please select at least one communication method (Mail/SMS)');
}
};
const handleCancel = () => {
setOpen(prev => !prev)
setSelectedRowKeys([]);
}
return (
<>
handelAddButton()}
color="901D77"
disabled={addnewAccess}
icon={}
>
OPEN
Share Codes via :
Check All
>
}
handleSubmit={handleSubmit}
handleCancel={handleCancel}
/>
>
);
};
export default OfferCodeList;