2026-01-27 18:27:29 +05:30
|
|
|
import { RadioGrpButton } from '../../../Components/Forms/RadioGroup';
|
|
|
|
|
import { DatePicker, Space, Tooltip } from 'antd';
|
|
|
|
|
import React, { useEffect, useRef, useState } from 'react';
|
|
|
|
|
import { useDispatch } from 'react-redux';
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
import { DropDowns } from '../../../Components/Forms/DropDown.jsx';
|
|
|
|
|
import { Tables } from '../../../Components/Tables/Table';
|
|
|
|
|
import { BiSolidPrinter } from 'react-icons/bi';
|
2026-03-06 18:31:44 +05:30
|
|
|
import {
|
|
|
|
|
getAllCustomerWithoutActive,
|
|
|
|
|
PreferenceData,
|
|
|
|
|
} from '../../../Features/BookingScreen/BookingData/BookingData';
|
2026-01-27 18:27:29 +05:30
|
|
|
import {
|
|
|
|
|
getSession,
|
|
|
|
|
extractLastNumber,
|
|
|
|
|
printDiv,
|
|
|
|
|
ExtractDateFormate,
|
|
|
|
|
} from '../../../Services/Others';
|
|
|
|
|
import { changeBreadCrumb } from '../../../Features/AppPage/CenterPage';
|
|
|
|
|
import dayjs from 'dayjs';
|
|
|
|
|
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
|
|
|
import Buttons from '../../../Components/Forms/Buttons';
|
|
|
|
|
import { Form } from 'antd';
|
|
|
|
|
import { ArrowRightOutlined } from '@ant-design/icons';
|
|
|
|
|
import LedgerReportPdf from '../../paymentpdfPage/LedgerReportPdf.jsx';
|
|
|
|
|
import {
|
|
|
|
|
LedgergetReport,
|
|
|
|
|
getFirstOrderLedgerDate,
|
|
|
|
|
} from '../../../Features/Reports/Reports';
|
|
|
|
|
import '../../../Styles/Reports/LedgerReport/LedgerReport.scss';
|
|
|
|
|
import { isMobile } from 'react-device-detect';
|
|
|
|
|
import { ReportMobilePDFPrint } from '../../paymentpdfPage/ReportMobilePDFPrint.js';
|
|
|
|
|
import { useSelector } from 'react-redux';
|
2026-03-05 19:11:12 +05:30
|
|
|
import excelExport from '../../../Images/xls-export.png';
|
|
|
|
|
import ExcelJS from 'exceljs';
|
|
|
|
|
import { saveAs } from 'file-saver';
|
2026-03-31 18:54:18 +05:30
|
|
|
import { downloadFile } from '../../../utils/downloadFile.js';
|
2026-01-27 18:27:29 +05:30
|
|
|
|
|
|
|
|
dayjs.extend(customParseFormat);
|
|
|
|
|
|
|
|
|
|
const { RangePicker } = DatePicker;
|
|
|
|
|
const dateFormat = 'DD-MM-YYYY';
|
|
|
|
|
|
|
|
|
|
const LedgerReport = () => {
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
const [AllCustomer1, setAllCustomer1] = useState([]);
|
|
|
|
|
const [SelectedCusId, setSelectedCusId] = useState(null);
|
|
|
|
|
const [LedgerData, setLedgerData] = useState([]);
|
|
|
|
|
const [SelectType, setSelectType] = useState('ALL');
|
|
|
|
|
const [Type, setType] = useState('Y');
|
|
|
|
|
const [Fromdate, setFromdate] = useState(null);
|
|
|
|
|
const [Todate, setTodate] = useState(null);
|
|
|
|
|
const [selectedMonth, setSelectedMonth] = useState(null);
|
|
|
|
|
const [Year, setYear] = useState(null);
|
|
|
|
|
const [filteredInfo, setFilteredInfo] = useState({});
|
|
|
|
|
const [sortedInfo, setSortedInfo] = useState({});
|
|
|
|
|
const [page, setpage] = useState(1);
|
|
|
|
|
const [FirstOrderLedgerDate, setFirstOrderLedgerDate] = useState('');
|
|
|
|
|
const formRef = useRef(null);
|
|
|
|
|
const CompId = getSession('CompId');
|
|
|
|
|
const BranchId = getSession('BranchId');
|
|
|
|
|
const AppId = getSession('AppId');
|
|
|
|
|
const SettingDataSelector = useSelector(PreferenceData);
|
|
|
|
|
const subDirectory = import.meta.env.BASE_URL;
|
2026-03-06 18:31:44 +05:30
|
|
|
const MobileA4Print = SettingDataSelector?.[0]?.SettingDtlDetails?.find(
|
|
|
|
|
(setting) =>
|
|
|
|
|
setting?.SettingIdName?.toLowerCase() === 'mobilea4' &&
|
|
|
|
|
setting?.SettingValue === 'Y'
|
|
|
|
|
);
|
2026-01-27 18:27:29 +05:30
|
|
|
const items = [
|
|
|
|
|
{
|
|
|
|
|
name: 'Home',
|
|
|
|
|
link: `${subDirectory}app-page/home`,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
// name: "Ledger",
|
|
|
|
|
// link: `${subDirectory}report/ledgerreport`,
|
|
|
|
|
// },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const style = `<style>
|
|
|
|
|
|
|
|
|
|
.imgDiv{
|
|
|
|
|
height:50px;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
}
|
|
|
|
|
.Dates{
|
|
|
|
|
margin-left:10px;
|
|
|
|
|
width:230px;
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
alignItems:center;
|
|
|
|
|
}
|
|
|
|
|
.DatesStyle{
|
|
|
|
|
display: flex;
|
|
|
|
|
gap:0.2rem;
|
|
|
|
|
}
|
|
|
|
|
.p
|
|
|
|
|
{
|
|
|
|
|
font-size: 10px;
|
|
|
|
|
}
|
|
|
|
|
.totalAmount{
|
|
|
|
|
padding-left:90px;
|
|
|
|
|
font: 15px Arial, sans-serif;
|
|
|
|
|
}
|
|
|
|
|
.Table ,.th ,.td {
|
|
|
|
|
border: 1px solid black;
|
|
|
|
|
border-collapse: collapse;
|
|
|
|
|
font: 10px Arial, sans-serif;
|
|
|
|
|
}
|
|
|
|
|
.td{
|
|
|
|
|
padding:4px
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.th{
|
|
|
|
|
padding:4px
|
|
|
|
|
}
|
|
|
|
|
.ItemWiseSales{
|
|
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
font-size: 15px
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
.Table{
|
|
|
|
|
margin-left:10px;
|
|
|
|
|
width:90%;
|
|
|
|
|
height :100x;
|
|
|
|
|
}
|
|
|
|
|
</style>`;
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
dispatch(changeBreadCrumb({ items: items }));
|
|
|
|
|
fetchdata2();
|
|
|
|
|
}, []);
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
setLedgerData();
|
|
|
|
|
setSelectedCusId(null);
|
|
|
|
|
setFromdate(null);
|
|
|
|
|
setTodate(null);
|
|
|
|
|
setSelectedMonth(null);
|
|
|
|
|
setYear(null);
|
|
|
|
|
setSelectedCusId(null);
|
|
|
|
|
fetchdata();
|
|
|
|
|
formRef.current?.resetFields();
|
|
|
|
|
// Assuming formRef is a ref assigned to your Form component
|
|
|
|
|
}, [Type, SelectType]);
|
|
|
|
|
|
|
|
|
|
const fetchdata = async () => {
|
|
|
|
|
let res = await dispatch(
|
|
|
|
|
getAllCustomerWithoutActive({
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
branchId: BranchId,
|
|
|
|
|
})
|
|
|
|
|
).unwrap();
|
|
|
|
|
setAllCustomer1(res?.data?.data);
|
|
|
|
|
};
|
|
|
|
|
const fetchdata2 = async () => {
|
|
|
|
|
let response = await dispatch(
|
|
|
|
|
getFirstOrderLedgerDate({
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
})
|
|
|
|
|
).unwrap();
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
setFirstOrderLedgerDate(response?.data?.data?.[0]?.OrderDate);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const ledger = (e) => {
|
|
|
|
|
formRef.current?.resetFields();
|
|
|
|
|
setSelectType(e);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const ledgerDatePicker = (e) => {
|
|
|
|
|
setType(e);
|
|
|
|
|
formRef.current?.resetFields();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const CusSelect = (e) => {
|
|
|
|
|
formRef.current?.setFieldsValue({ CustomerName: e });
|
|
|
|
|
setSelectedCusId(e);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const onChange = (date, dateString) => {
|
|
|
|
|
setYear(dateString);
|
|
|
|
|
// setFromdate(null);
|
|
|
|
|
// setTodate(null);
|
|
|
|
|
// selectedMonth(null);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleCalendarChange = (dates, dateStrings) => {
|
|
|
|
|
if (dates && dates[1]) {
|
|
|
|
|
setFromdate(dateStrings[0]);
|
|
|
|
|
setTodate(dateStrings[1]);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const Datetrimmer = (data) => {
|
|
|
|
|
let dateVal = moment(data, ['YYYY-MM-DDTHH:mm:ss']).format('DD-MM-YYYY');
|
|
|
|
|
return dateVal;
|
|
|
|
|
// const dateObject = new Date(data);
|
|
|
|
|
|
|
|
|
|
// // Get day, month, and year components
|
|
|
|
|
// const day = dateObject.toLocaleDateString("en-US", { day: "2-digit" });
|
|
|
|
|
// const month = dateObject.toLocaleDateString("en-US", { month: "2-digit" });
|
|
|
|
|
// const year = dateObject.getFullYear();
|
|
|
|
|
|
|
|
|
|
// return `${day}/ ${month}/ ${year}`;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const columns = [
|
|
|
|
|
{
|
|
|
|
|
title: 'SI no',
|
|
|
|
|
dataIndex: 'sno',
|
|
|
|
|
key: 'sno',
|
|
|
|
|
align: 'center',
|
|
|
|
|
width: 10,
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a style={{ color: 'black' }}>{index + 1}</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Type',
|
|
|
|
|
dataIndex: 'TypeName',
|
|
|
|
|
key: 'TypeName',
|
|
|
|
|
align: 'left',
|
|
|
|
|
width: 10,
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a
|
|
|
|
|
style={
|
|
|
|
|
text == 'OB'
|
|
|
|
|
? { color: 'red', fontWeight: '500px', fontSize: '15px' }
|
|
|
|
|
: { color: 'Black' }
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
{text == 'OB' ? 'OB' : text}
|
|
|
|
|
</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: ' Cus-Id',
|
|
|
|
|
dataIndex: 'CustId',
|
|
|
|
|
key: 'CustId',
|
|
|
|
|
align: 'left',
|
|
|
|
|
width: 100,
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a style={{ color: 'black' }}>
|
|
|
|
|
{text == null ? 'GEN' : extractLastNumber(text)}
|
|
|
|
|
</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Cus-Name',
|
|
|
|
|
dataIndex: 'CustName',
|
|
|
|
|
key: 'CustName',
|
|
|
|
|
align: 'left',
|
|
|
|
|
width: 150,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'RC.NO',
|
|
|
|
|
dataIndex: 'ReceiptNo',
|
|
|
|
|
key: 'ReceiptNo',
|
|
|
|
|
align: 'left',
|
|
|
|
|
width: 10,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Mob.No',
|
|
|
|
|
dataIndex: 'MobileNo',
|
|
|
|
|
key: 'MobileNo',
|
|
|
|
|
align: 'left',
|
|
|
|
|
width: 100,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Address',
|
|
|
|
|
dataIndex: 'Address1',
|
|
|
|
|
key: 'Address1',
|
|
|
|
|
align: 'left',
|
|
|
|
|
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<Tooltip title={`${text}`}>
|
|
|
|
|
<p
|
|
|
|
|
style={{
|
|
|
|
|
color: 'black',
|
|
|
|
|
whiteSpace: 'nowrap',
|
|
|
|
|
overflow: 'hidden',
|
|
|
|
|
textOverflow: 'ellipsis',
|
|
|
|
|
width: '40px',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{text}
|
|
|
|
|
</p>
|
|
|
|
|
</Tooltip>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Payment Mode',
|
|
|
|
|
dataIndex: 'PaymentTypeName',
|
|
|
|
|
key: 'PaymentTypeName',
|
|
|
|
|
align: 'left',
|
|
|
|
|
width: 150,
|
|
|
|
|
// ellipsis: true,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Date',
|
|
|
|
|
dataIndex: 'Date',
|
|
|
|
|
key: 'Date',
|
|
|
|
|
align: 'center',
|
|
|
|
|
width: 250,
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a style={{ color: 'black' }}>{ExtractDateFormate(text)}</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Debit',
|
|
|
|
|
dataIndex: 'Debit',
|
|
|
|
|
key: 'Debit',
|
|
|
|
|
align: 'right',
|
|
|
|
|
width: 10,
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a style={{ color: 'black' }}>{text > 0 ? text : ' '}</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Credit',
|
|
|
|
|
dataIndex: 'Credit',
|
|
|
|
|
key: 'Credit',
|
|
|
|
|
align: 'right',
|
|
|
|
|
width: 10,
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a style={{ color: 'black' }}>{text > 0 ? text : ' '}</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Balance',
|
|
|
|
|
// dataIndex: "company",
|
|
|
|
|
key: 'company',
|
|
|
|
|
align: 'center',
|
|
|
|
|
width: 100,
|
|
|
|
|
children: [
|
|
|
|
|
{
|
|
|
|
|
title: 'Credit',
|
|
|
|
|
key: 'BalCredit',
|
|
|
|
|
dataIndex: 'BalCredit',
|
|
|
|
|
// width: 30,
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a style={{ color: 'red', fontSize: '20px' }}>
|
|
|
|
|
{text > 0 ? text : ' '}
|
|
|
|
|
</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
title: 'Debit',
|
|
|
|
|
dataIndex: 'BalDebit',
|
|
|
|
|
key: 'BalDebit',
|
|
|
|
|
render: (text, object, index) => (
|
|
|
|
|
<a style={{ color: 'green', fontSize: '15px' }}>
|
|
|
|
|
{text > 0 ? text : ' '}
|
|
|
|
|
</a>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const handleOk = (date) => {
|
|
|
|
|
// Handle the "OK" button click event
|
|
|
|
|
setSelectedMonth(date.format('YYYY-MM'));
|
|
|
|
|
setYear(null);
|
|
|
|
|
setFromdate(null);
|
|
|
|
|
setTodate(null);
|
|
|
|
|
};
|
|
|
|
|
const getReport = async (value) => {
|
|
|
|
|
let data1 = {
|
|
|
|
|
CompId: CompId,
|
|
|
|
|
BranchId: BranchId,
|
|
|
|
|
AppId: AppId,
|
|
|
|
|
Year: Year,
|
|
|
|
|
Month: selectedMonth,
|
|
|
|
|
Fromdate: Fromdate,
|
|
|
|
|
Todate: Todate,
|
|
|
|
|
CustId: SelectedCusId,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let response = await dispatch(LedgergetReport(data1)).unwrap();
|
|
|
|
|
if (response?.data?.statusCode == 1) {
|
|
|
|
|
setLedgerData(response?.data?.data);
|
|
|
|
|
} else {
|
|
|
|
|
setLedgerData();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const handleChange = (pagination, filters, sorter) => {
|
|
|
|
|
setFilteredInfo(filters);
|
|
|
|
|
setSortedInfo(sorter);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handlePageChange = (current) => {
|
|
|
|
|
setpage(current);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const Print = async () => {
|
|
|
|
|
if (isMobile) {
|
|
|
|
|
if (MobileA4Print) {
|
|
|
|
|
ReportMobilePDFPrint({
|
|
|
|
|
printId: 'RePrint',
|
|
|
|
|
printStyle: style,
|
|
|
|
|
});
|
|
|
|
|
}
|
2026-03-06 18:31:44 +05:30
|
|
|
} else {
|
2026-01-27 18:27:29 +05:30
|
|
|
await printDiv('RePrint', style);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2026-03-05 19:11:12 +05:30
|
|
|
const exportToExcel = async () => {
|
|
|
|
|
if (!LedgerData || LedgerData.length === 0) return;
|
|
|
|
|
|
|
|
|
|
const workbook = new ExcelJS.Workbook();
|
2026-03-06 18:31:44 +05:30
|
|
|
const worksheet = workbook.addWorksheet('Ledger Report');
|
2026-03-05 19:11:12 +05:30
|
|
|
|
|
|
|
|
worksheet.views = [
|
|
|
|
|
{
|
2026-03-06 18:31:44 +05:30
|
|
|
state: 'frozen',
|
|
|
|
|
ySplit: 2,
|
|
|
|
|
},
|
2026-03-05 19:11:12 +05:30
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// HEADER ROW 1
|
|
|
|
|
worksheet.addRow([
|
2026-03-06 18:31:44 +05:30
|
|
|
'SI No',
|
|
|
|
|
'Type',
|
|
|
|
|
'Cus-Id',
|
|
|
|
|
'Cus-Name',
|
|
|
|
|
'RC.NO',
|
|
|
|
|
'Mob.No',
|
|
|
|
|
'Address',
|
|
|
|
|
'Payment Mode',
|
|
|
|
|
'Date',
|
|
|
|
|
'Debit',
|
|
|
|
|
'Credit',
|
|
|
|
|
'Balance in',
|
|
|
|
|
'',
|
2026-03-05 19:11:12 +05:30
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// HEADER ROW 2
|
|
|
|
|
worksheet.addRow([
|
2026-03-06 18:31:44 +05:30
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'',
|
|
|
|
|
'Credit',
|
|
|
|
|
'Debit',
|
2026-03-05 19:11:12 +05:30
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// MERGE CELLS
|
2026-03-06 18:31:44 +05:30
|
|
|
worksheet.mergeCells('A1:A2');
|
|
|
|
|
worksheet.mergeCells('B1:B2');
|
|
|
|
|
worksheet.mergeCells('C1:C2');
|
|
|
|
|
worksheet.mergeCells('D1:D2');
|
|
|
|
|
worksheet.mergeCells('E1:E2');
|
|
|
|
|
worksheet.mergeCells('F1:F2');
|
|
|
|
|
worksheet.mergeCells('G1:G2');
|
|
|
|
|
worksheet.mergeCells('H1:H2');
|
|
|
|
|
worksheet.mergeCells('I1:I2');
|
|
|
|
|
worksheet.mergeCells('J1:J2');
|
|
|
|
|
worksheet.mergeCells('K1:K2');
|
|
|
|
|
worksheet.mergeCells('L1:M1');
|
2026-03-05 19:11:12 +05:30
|
|
|
|
|
|
|
|
// worksheet.eachRow((row) => {
|
|
|
|
|
// row.eachCell((cell) => {
|
|
|
|
|
// cell.protection = {
|
|
|
|
|
// locked: true
|
|
|
|
|
// };
|
|
|
|
|
// });
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
// Lock header rows
|
|
|
|
|
[1, 2].forEach((rowNumber) => {
|
|
|
|
|
const row = worksheet.getRow(rowNumber);
|
|
|
|
|
row.eachCell((cell) => {
|
|
|
|
|
cell.protection = { locked: true };
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// HEADER STYLE
|
|
|
|
|
const headerRows = [1, 2];
|
|
|
|
|
|
|
|
|
|
headerRows.forEach((rowNumber) => {
|
|
|
|
|
const row = worksheet.getRow(rowNumber);
|
|
|
|
|
|
|
|
|
|
row.eachCell((cell) => {
|
|
|
|
|
cell.font = {
|
|
|
|
|
bold: true,
|
2026-03-06 18:31:44 +05:30
|
|
|
color: { argb: 'FFFFFFFF' }, // white text
|
2026-03-05 19:11:12 +05:30
|
|
|
};
|
|
|
|
|
|
|
|
|
|
cell.alignment = {
|
2026-03-06 18:31:44 +05:30
|
|
|
vertical: 'middle',
|
|
|
|
|
horizontal: 'center',
|
2026-03-05 19:11:12 +05:30
|
|
|
};
|
|
|
|
|
|
|
|
|
|
cell.fill = {
|
2026-03-06 18:31:44 +05:30
|
|
|
type: 'pattern',
|
|
|
|
|
pattern: 'solid',
|
|
|
|
|
fgColor: { argb: 'FF2E7D32' }, // green header
|
2026-03-05 19:11:12 +05:30
|
|
|
};
|
|
|
|
|
|
|
|
|
|
cell.border = {
|
2026-03-06 18:31:44 +05:30
|
|
|
top: { style: 'thin' },
|
|
|
|
|
left: { style: 'thin' },
|
|
|
|
|
bottom: { style: 'thin' },
|
|
|
|
|
right: { style: 'thin' },
|
2026-03-05 19:11:12 +05:30
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// specifically ensure Balance in header center
|
2026-03-06 18:31:44 +05:30
|
|
|
worksheet.getCell('L1').alignment = {
|
|
|
|
|
horizontal: 'center',
|
|
|
|
|
vertical: 'middle',
|
|
|
|
|
};
|
2026-03-05 19:11:12 +05:30
|
|
|
|
|
|
|
|
// COLUMN WIDTH
|
|
|
|
|
worksheet.columns = [
|
|
|
|
|
{ width: 8 },
|
|
|
|
|
{ width: 10 },
|
|
|
|
|
{ width: 12 },
|
|
|
|
|
{ width: 20 },
|
|
|
|
|
{ width: 12 },
|
|
|
|
|
{ width: 15 },
|
|
|
|
|
{ width: 25 },
|
|
|
|
|
{ width: 15 },
|
|
|
|
|
{ width: 15 },
|
|
|
|
|
{ width: 12 },
|
|
|
|
|
{ width: 12 },
|
|
|
|
|
{ width: 12 },
|
2026-03-06 18:31:44 +05:30
|
|
|
{ width: 12 },
|
2026-03-05 19:11:12 +05:30
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// DATA ROWS
|
|
|
|
|
LedgerData.forEach((row, index) => {
|
|
|
|
|
const r = worksheet.addRow([
|
|
|
|
|
index + 1,
|
2026-03-06 18:31:44 +05:30
|
|
|
row.TypeName === 'OB' ? 'OB' : row.TypeName,
|
|
|
|
|
row.CustId ? extractLastNumber(row.CustId) : 'GEN',
|
|
|
|
|
row.CustName || '',
|
|
|
|
|
row.ReceiptNo || '',
|
|
|
|
|
row.MobileNo || '',
|
|
|
|
|
row.Address1 || '',
|
|
|
|
|
row.PaymentTypeName || '',
|
|
|
|
|
ExtractDateFormate(row.Date) || '',
|
|
|
|
|
row.Debit > 0 ? row.Debit : '',
|
|
|
|
|
row.Credit > 0 ? row.Credit : '',
|
|
|
|
|
row.BalCredit > 0 ? row.BalCredit : '',
|
|
|
|
|
row.BalDebit > 0 ? row.BalDebit : '',
|
2026-03-05 19:11:12 +05:30
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 🔓 Unlock every cell in this row
|
|
|
|
|
r.eachCell({ includeEmpty: true }, (cell) => {
|
|
|
|
|
cell.protection = { locked: false };
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Credit red
|
|
|
|
|
if (row.BalCredit > 0) {
|
2026-03-06 18:31:44 +05:30
|
|
|
r.getCell(12).font = { color: { argb: 'FFFF0000' } };
|
2026-03-05 19:11:12 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Debit green
|
|
|
|
|
if (row.BalDebit > 0) {
|
2026-03-06 18:31:44 +05:30
|
|
|
r.getCell(13).font = { color: { argb: 'FF008000' } };
|
2026-03-05 19:11:12 +05:30
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Unlock all data rows
|
|
|
|
|
worksheet.eachRow((row, rowNumber) => {
|
|
|
|
|
if (rowNumber > 2) {
|
|
|
|
|
row.eachCell((cell) => {
|
|
|
|
|
cell.protection = { locked: false };
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2026-03-06 18:31:44 +05:30
|
|
|
await worksheet.protect('ledger123', {
|
2026-03-05 19:11:12 +05:30
|
|
|
selectLockedCells: true,
|
|
|
|
|
selectUnlockedCells: true,
|
2026-03-06 18:31:44 +05:30
|
|
|
formatColumns: true, // allow column resize
|
2026-03-05 19:11:12 +05:30
|
|
|
formatRows: false,
|
|
|
|
|
insertColumns: false,
|
|
|
|
|
insertRows: false,
|
|
|
|
|
deleteColumns: false,
|
2026-03-06 18:31:44 +05:30
|
|
|
deleteRows: false,
|
2026-03-05 19:11:12 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const buffer = await workbook.xlsx.writeBuffer();
|
|
|
|
|
|
|
|
|
|
const blob = new Blob([buffer], {
|
2026-03-06 18:31:44 +05:30
|
|
|
type: 'application/vnd.openxmlformats-of ficedocument.spreadsheetml.sheet',
|
2026-03-05 19:11:12 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const now = new Date();
|
|
|
|
|
|
2026-03-06 18:31:44 +05:30
|
|
|
const day = String(now.getDate()).padStart(2, '0');
|
|
|
|
|
const month = String(now.getMonth() + 1).padStart(2, '0');
|
2026-03-05 19:11:12 +05:30
|
|
|
const year = now.getFullYear();
|
|
|
|
|
|
|
|
|
|
let hours = now.getHours();
|
2026-03-06 18:31:44 +05:30
|
|
|
const minutes = String(now.getMinutes()).padStart(2, '0');
|
2026-03-05 19:11:12 +05:30
|
|
|
|
2026-03-06 18:31:44 +05:30
|
|
|
const ampm = hours >= 12 ? 'PM' : 'AM';
|
2026-03-05 19:11:12 +05:30
|
|
|
hours = hours % 12;
|
|
|
|
|
hours = hours ? hours : 12;
|
|
|
|
|
|
2026-03-06 18:31:44 +05:30
|
|
|
hours = String(hours).padStart(2, '0');
|
2026-03-05 19:11:12 +05:30
|
|
|
|
|
|
|
|
const fileName = `Ledger Report_${day}-${month}-${year}_${hours}-${minutes}-${ampm}.xlsx`;
|
2026-03-31 18:54:18 +05:30
|
|
|
downloadFile(
|
|
|
|
|
buffer,
|
|
|
|
|
fileName,
|
|
|
|
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
|
|
|
(success) => {
|
|
|
|
|
if (success) {
|
|
|
|
|
console.log("File downloaded and opened successfully!");
|
|
|
|
|
} else {
|
|
|
|
|
console.log("Failed to download/open file.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
// saveAs(blob, fileName);
|
2026-03-05 19:11:12 +05:30
|
|
|
};
|
|
|
|
|
|
2026-01-27 18:27:29 +05:30
|
|
|
const FirstOrderLedgerDateRaw = dayjs(FirstOrderLedgerDate);
|
|
|
|
|
|
|
|
|
|
const disabledDate = (current) => {
|
|
|
|
|
return (
|
|
|
|
|
current &&
|
|
|
|
|
(current < FirstOrderLedgerDateRaw.startOf('day') ||
|
|
|
|
|
current > dayjs().endOf('day'))
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<>
|
|
|
|
|
<div className="MasterLedger-Report">
|
|
|
|
|
<Form className="formDivAnt" ref={formRef} onFinish={getReport}>
|
|
|
|
|
{/* <FormHeader title={"Ledger Report"} /> */}
|
|
|
|
|
<div
|
|
|
|
|
style={{
|
|
|
|
|
display: 'flex',
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
width: '100%',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
className="formHeader"
|
|
|
|
|
style={{
|
|
|
|
|
display: 'flex',
|
|
|
|
|
width: '100%',
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{' '}
|
|
|
|
|
<p className="LedgerReport-heading">Ledger</p>
|
|
|
|
|
<div
|
|
|
|
|
className="AllRadioButtonDate"
|
|
|
|
|
style={{
|
|
|
|
|
display: 'flex',
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
flexWrap: 'wrap',
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
gap: '0.5rem',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<div className="AllRadioButton">
|
|
|
|
|
<div className="RadioButton">
|
|
|
|
|
<RadioGrpButton
|
|
|
|
|
content={[
|
|
|
|
|
{ value: 'ALL', label: 'All' },
|
|
|
|
|
{ value: 'CUS', label: 'Customer' },
|
|
|
|
|
]}
|
|
|
|
|
fieldState={true}
|
|
|
|
|
defaultSelect={SelectType}
|
|
|
|
|
onSelectFuntion={(e) => ledger(e)}
|
|
|
|
|
/>
|
|
|
|
|
</div>{' '}
|
|
|
|
|
<div className="RadioButton-DMYPicker">
|
|
|
|
|
<RadioGrpButton
|
|
|
|
|
content={[
|
|
|
|
|
{ value: 'Y', label: 'Year' },
|
|
|
|
|
{ value: 'M', label: 'Month' },
|
|
|
|
|
{ value: 'D', label: 'Date' },
|
|
|
|
|
]}
|
|
|
|
|
fieldState={true}
|
|
|
|
|
defaultSelect={Type}
|
|
|
|
|
onSelectFuntion={(e) => ledgerDatePicker(e)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* datepicer */}
|
|
|
|
|
<div
|
|
|
|
|
style={{
|
|
|
|
|
display: 'flex',
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
width: 'auto',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<div className="Ledger-datePicker">
|
|
|
|
|
<Space direction="horizontal">
|
|
|
|
|
{Type == 'Y' && (
|
|
|
|
|
<Form.Item
|
|
|
|
|
name="EffectiveFrom"
|
|
|
|
|
// hasFeedback
|
|
|
|
|
rules={[
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: 'Please Enter The Year',
|
|
|
|
|
},
|
|
|
|
|
]}
|
|
|
|
|
>
|
|
|
|
|
<DatePicker
|
|
|
|
|
picker="year"
|
|
|
|
|
disabledDate={(current) =>
|
|
|
|
|
current &&
|
|
|
|
|
(current.year() <
|
|
|
|
|
FirstOrderLedgerDateRaw.year() ||
|
|
|
|
|
current.year() > moment().year())
|
|
|
|
|
}
|
|
|
|
|
onChange={(date, dateString) =>
|
|
|
|
|
onChange(date, dateString)
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
</Form.Item>
|
|
|
|
|
)}
|
|
|
|
|
{Type == 'M' && (
|
|
|
|
|
<Form.Item
|
|
|
|
|
name="EffectiveFrom"
|
|
|
|
|
// hasFeedback
|
|
|
|
|
rules={[
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: 'Please Enter The Month',
|
|
|
|
|
},
|
|
|
|
|
]}
|
|
|
|
|
>
|
|
|
|
|
<DatePicker
|
|
|
|
|
picker="month"
|
|
|
|
|
disabledDate={(current) =>
|
|
|
|
|
current &&
|
|
|
|
|
(current <
|
|
|
|
|
FirstOrderLedgerDateRaw.startOf('month') ||
|
|
|
|
|
current > moment().endOf('month'))
|
|
|
|
|
}
|
|
|
|
|
onChange={(date, dateString) => handleOk(date)}
|
|
|
|
|
/>
|
|
|
|
|
</Form.Item>
|
|
|
|
|
)}
|
|
|
|
|
{Type == 'D' && (
|
|
|
|
|
<Form.Item
|
|
|
|
|
name="EffectiveFrom"
|
|
|
|
|
// hasFeedback
|
|
|
|
|
rules={[
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: 'Please Enter The Date',
|
|
|
|
|
},
|
|
|
|
|
]}
|
|
|
|
|
>
|
|
|
|
|
<RangePicker
|
|
|
|
|
// defaultValue={[dayjs(), dayjs()]}
|
|
|
|
|
format={dateFormat}
|
|
|
|
|
showTime
|
|
|
|
|
disabledDate={disabledDate}
|
|
|
|
|
// onOk={handleOk}
|
|
|
|
|
onCalendarChange={handleCalendarChange}
|
|
|
|
|
inputReadOnly={true}
|
|
|
|
|
/>
|
|
|
|
|
</Form.Item>
|
|
|
|
|
)}
|
|
|
|
|
</Space>
|
|
|
|
|
</div>
|
|
|
|
|
<div
|
|
|
|
|
className="dropDown-ledger"
|
|
|
|
|
style={{ paddingLeft: '30px' }}
|
|
|
|
|
>
|
|
|
|
|
{SelectType === 'CUS' && (
|
|
|
|
|
<Form.Item
|
|
|
|
|
name="CustomerName"
|
|
|
|
|
// hasFeedback
|
|
|
|
|
rules={[
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: 'please choose The Customer ',
|
|
|
|
|
},
|
|
|
|
|
]}
|
|
|
|
|
>
|
|
|
|
|
{/* <DropDowns
|
|
|
|
|
options={AllCustomer1?.map((option) => ({
|
|
|
|
|
value: option.CustId,
|
|
|
|
|
label: option.CustName,
|
|
|
|
|
}))}
|
|
|
|
|
placeholder="Customer Name"
|
|
|
|
|
// label={<label className="required">CustomerName</label>}
|
|
|
|
|
label="Config Type"
|
|
|
|
|
onChangeFunction={(e) => CusSelect(e)}
|
|
|
|
|
isOnchanges={true}
|
|
|
|
|
className="field-DropDown"
|
|
|
|
|
valueData={SelectedCusId}
|
|
|
|
|
width={20}
|
|
|
|
|
/> */}
|
|
|
|
|
<DropDowns
|
|
|
|
|
options={AllCustomer1?.map((option) => ({
|
|
|
|
|
value: option.CustId,
|
|
|
|
|
label: option.CustName || option?.MobileNo,
|
|
|
|
|
}))}
|
|
|
|
|
// defaultValue="Select" // Set "Select" as the default value
|
|
|
|
|
// placeholder="Name"
|
|
|
|
|
label={
|
|
|
|
|
<label className="required">CustomerName</label>
|
|
|
|
|
}
|
|
|
|
|
// onChangeFunction={(e)=>ConfigSelect(e)}
|
|
|
|
|
// isOnchanges={}
|
|
|
|
|
className="field-DropDown"
|
|
|
|
|
valueData={SelectedCusId}
|
|
|
|
|
onChangeFunction={(e) => CusSelect(e)}
|
2026-03-06 18:31:44 +05:30
|
|
|
// onFilter={(value, record) =>
|
|
|
|
|
// String(record.TypeName)
|
|
|
|
|
// .toLowerCase()
|
|
|
|
|
// .includes(value.toLowerCase())
|
|
|
|
|
// }
|
2026-01-27 18:27:29 +05:30
|
|
|
/>
|
|
|
|
|
</Form.Item>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
{/* datepicer */}
|
|
|
|
|
</div>
|
|
|
|
|
<div className="Submit" style={{ paddingBottom: '10px' }}>
|
|
|
|
|
<Buttons
|
|
|
|
|
buttonText="Search"
|
|
|
|
|
color="901D77"
|
|
|
|
|
icon={<ArrowRightOutlined />}
|
2026-03-06 18:31:44 +05:30
|
|
|
// handleSubmit={() => { getReport() }}
|
2026-01-27 18:27:29 +05:30
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="ledger-PrintIcon">
|
|
|
|
|
<BiSolidPrinter
|
2026-03-06 18:31:44 +05:30
|
|
|
onClick={LedgerData?.length > 0 ? () => Print() : () => {}}
|
2026-01-27 18:27:29 +05:30
|
|
|
className={
|
|
|
|
|
LedgerData?.length > 0
|
|
|
|
|
? 'ItemWiseReport-printerIcon'
|
|
|
|
|
: 'ItemWiseReport-printerIcon-disabled'
|
|
|
|
|
}
|
|
|
|
|
/>
|
2026-03-06 18:31:44 +05:30
|
|
|
<Tooltip
|
|
|
|
|
title={
|
|
|
|
|
LedgerData?.length > 0
|
|
|
|
|
? 'Export as Excel'
|
|
|
|
|
: 'No data to Export'
|
|
|
|
|
}
|
|
|
|
|
placement="top"
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
style={{
|
|
|
|
|
width: '35px',
|
|
|
|
|
height: '35px',
|
|
|
|
|
display: 'flex',
|
|
|
|
|
justifyContent: 'center',
|
|
|
|
|
alignItems: 'center',
|
|
|
|
|
cursor:
|
|
|
|
|
LedgerData?.length > 0 ? 'pointer' : 'not-allowed',
|
|
|
|
|
opacity: LedgerData?.length > 0 ? 1 : 0.5,
|
|
|
|
|
}}
|
|
|
|
|
>
|
2026-03-05 19:11:12 +05:30
|
|
|
<img
|
|
|
|
|
width={'95%'}
|
|
|
|
|
height={'95%'}
|
|
|
|
|
src={excelExport}
|
|
|
|
|
alt="Excel Export"
|
2026-03-06 18:31:44 +05:30
|
|
|
onClick={
|
|
|
|
|
LedgerData?.length > 0
|
|
|
|
|
? () => exportToExcel()
|
|
|
|
|
: () => {}
|
|
|
|
|
}
|
2026-03-05 19:11:12 +05:30
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</Tooltip>
|
2026-01-27 18:27:29 +05:30
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="LedgerTable">
|
|
|
|
|
{/* <Tables
|
|
|
|
|
data={LedgerData}
|
|
|
|
|
columns={columns}
|
|
|
|
|
pagination={handlePageChange}
|
|
|
|
|
onChange={handleChange}
|
|
|
|
|
/> */}
|
|
|
|
|
<table className="custom-table">
|
|
|
|
|
<thead>
|
|
|
|
|
<tr>
|
|
|
|
|
<th rowSpan={2}>SI no</th>
|
|
|
|
|
<th rowSpan={2}>Type</th>
|
|
|
|
|
<th rowSpan={2}>Cus-Id</th>
|
|
|
|
|
<th rowSpan={2}>Cus-Name</th>
|
|
|
|
|
<th rowSpan={2}>RC.NO</th>
|
|
|
|
|
<th rowSpan={2}>Mob.No</th>
|
|
|
|
|
<th rowSpan={2} style={{ width: '90px' }}>
|
|
|
|
|
Address
|
|
|
|
|
</th>
|
|
|
|
|
<th rowSpan={2}>Payment Mode</th>
|
|
|
|
|
<th rowSpan={2}>Date</th>
|
|
|
|
|
<th rowSpan={2}>Debit</th>
|
|
|
|
|
<th rowSpan={2}>Credit</th>
|
|
|
|
|
<th colSpan={2} style={{ textAlign: 'center' }}>
|
|
|
|
|
Balance in
|
|
|
|
|
</th>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<th style={{ textAlign: 'center' }}>Credit</th>
|
|
|
|
|
<th style={{ textAlign: 'center' }}>Debit</th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
{LedgerData && LedgerData.length > 0 ? (
|
|
|
|
|
LedgerData.map((row, idx) => (
|
|
|
|
|
<tr key={idx}>
|
|
|
|
|
<td style={{ textAlign: 'center' }}>{idx + 1}</td>
|
|
|
|
|
<td
|
|
|
|
|
style={
|
|
|
|
|
row.TypeName === 'OB'
|
|
|
|
|
? {
|
2026-03-06 18:31:44 +05:30
|
|
|
color: 'red',
|
|
|
|
|
fontWeight: 500,
|
|
|
|
|
fontSize: '15px',
|
|
|
|
|
}
|
2026-01-27 18:27:29 +05:30
|
|
|
: { color: 'black' }
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
{row.TypeName === 'OB' ? 'OB' : row.TypeName}
|
|
|
|
|
</td>
|
|
|
|
|
<td style={{ textAlign: 'left' }}>
|
|
|
|
|
{row.CustId == null
|
|
|
|
|
? 'GEN'
|
|
|
|
|
: typeof extractLastNumber === 'function'
|
|
|
|
|
? extractLastNumber(row.CustId)
|
|
|
|
|
: row.CustId}
|
|
|
|
|
</td>
|
|
|
|
|
<td style={{ textAlign: 'left' }}>{row.CustName}</td>
|
|
|
|
|
<td style={{ textAlign: 'left' }}>{row.ReceiptNo}</td>
|
|
|
|
|
<td style={{ textAlign: 'left' }}>{row.MobileNo}</td>
|
|
|
|
|
<td
|
|
|
|
|
style={{
|
|
|
|
|
textAlign: 'left',
|
|
|
|
|
maxWidth: '40px',
|
|
|
|
|
whiteSpace: 'nowrap',
|
|
|
|
|
overflow: 'hidden',
|
|
|
|
|
textOverflow: 'ellipsis',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<span title={row.Address1}>{row.Address1}</span>
|
|
|
|
|
</td>
|
|
|
|
|
<td style={{ textAlign: 'left' }}>
|
|
|
|
|
{row.PaymentTypeName}
|
|
|
|
|
</td>
|
|
|
|
|
<td style={{ textAlign: 'center' }}>
|
|
|
|
|
{ExtractDateFormate(row.Date)}
|
|
|
|
|
</td>
|
|
|
|
|
<td style={{ textAlign: 'right' }}>
|
|
|
|
|
{row.Debit > 0 ? row.Debit : ''}
|
|
|
|
|
</td>
|
|
|
|
|
<td style={{ textAlign: 'right' }}>
|
|
|
|
|
{row.Credit > 0 ? row.Credit : ''}
|
|
|
|
|
</td>
|
|
|
|
|
<td
|
|
|
|
|
style={{
|
|
|
|
|
color: 'red',
|
|
|
|
|
fontSize: '20px',
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{row.BalCredit > 0 ? row.BalCredit : ''}
|
|
|
|
|
</td>
|
|
|
|
|
<td
|
|
|
|
|
style={{
|
|
|
|
|
color: 'green',
|
|
|
|
|
fontSize: '15px',
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{row.BalDebit > 0 ? row.BalDebit : ''}
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
))
|
|
|
|
|
) : (
|
|
|
|
|
<tr>
|
|
|
|
|
<td
|
|
|
|
|
colSpan={13}
|
|
|
|
|
style={{ textAlign: 'center', padding: '10px' }}
|
|
|
|
|
>
|
|
|
|
|
Data not found
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
)}
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
</Form>
|
|
|
|
|
<div style={{ display: 'none' }}>
|
|
|
|
|
<LedgerReportPdf LedgerData={LedgerData} />
|
|
|
|
|
</div>
|
|
|
|
|
</div>{' '}
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default LedgerReport;
|