Skip to content

Commit 5b462a9

Browse files
author
Katelyn Grimes
committed
Added rounding to MPGA download
1 parent 0f735ed commit 5b462a9

3 files changed

Lines changed: 98 additions & 27 deletions

File tree

src/components/Reports/MPGAIncomeExpensesReport/CustomExport/CustomExport.test.tsx

Lines changed: 71 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { ReportTypeEnum } from '../Helper/MPGAReportEnum';
2-
import { mockData, months } from '../mockData';
2+
import { DataFields, mockData, months } from '../mockData';
33
import { createTable, exportToCsv } from './CustomExport';
44

5+
const locale = 'en-US';
6+
57
const mockSetAttribute = jest.fn();
68
const mockClick = jest.fn();
79

@@ -51,7 +53,12 @@ describe('CustomExport', () => {
5153
jest.spyOn(link, 'setAttribute').mockImplementation(mockSetAttribute);
5254
jest.spyOn(link, 'click').mockImplementation(mockClick);
5355

54-
const data = exportToCsv(mockData.income, ReportTypeEnum.Income, months);
56+
const data = exportToCsv(
57+
mockData.income,
58+
ReportTypeEnum.Income,
59+
months,
60+
locale,
61+
);
5562

5663
expect(mockSetAttribute).toHaveBeenCalledWith(
5764
'href',
@@ -69,36 +76,79 @@ describe('CustomExport', () => {
6976
});
7077

7178
it('should contain correct data', () => {
72-
const csvData = createTable(mockHeaders, mockData.income);
79+
const csvData = createTable(mockHeaders, mockData.income, locale);
7380

7481
expect(csvData).toContain(mockHeaders);
7582
expect(csvData[1]).toEqual([
7683
'Contributions',
77-
6770,
78-
6090,
79-
5770,
80-
7355,
81-
8035,
82-
6575,
83-
7556,
84-
8239,
85-
9799,
86-
9729,
87-
13020,
88-
19215,
89-
9013,
90-
108156,
84+
'6770',
85+
'6090',
86+
'5770',
87+
'7355',
88+
'8035',
89+
'6575',
90+
'7556',
91+
'8239',
92+
'9799',
93+
'9729',
94+
'13020',
95+
'19215',
96+
'9013',
97+
'108156',
98+
]);
99+
});
100+
101+
it('should round values to two decimal places', () => {
102+
const decimalData: DataFields[] = [
103+
{
104+
id: 'rounding-test',
105+
description: 'Rounding',
106+
monthly: [10.234, 10.236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
107+
average: 9012.567,
108+
total: 108155.555,
109+
},
110+
];
111+
112+
const csvData = createTable(mockHeaders, decimalData, locale);
113+
114+
expect(csvData[1]).toEqual([
115+
'Rounding',
116+
'10.23',
117+
'10.24',
118+
'-',
119+
'-',
120+
'-',
121+
'-',
122+
'-',
123+
'-',
124+
'-',
125+
'-',
126+
'-',
127+
'-',
128+
'9012.57',
129+
'108155.56',
91130
]);
92131
});
93132

94133
it('should display correct totals', () => {
95-
const csvData = createTable(mockHeaders, dataWithTotal);
134+
const csvData = createTable(mockHeaders, dataWithTotal, locale);
96135

97136
expect(csvData[csvData.length - 1]).toEqual([
98137
'Overall Total',
99-
...monthlyTotals,
100-
overallAverage,
101-
overallTotal,
138+
'6870',
139+
'6190',
140+
'5870',
141+
'7455',
142+
'8135',
143+
'6675',
144+
'7656',
145+
'8239',
146+
'9799',
147+
'9729',
148+
'13020',
149+
'19215',
150+
'9071',
151+
'108856',
102152
]);
103153
});
104154
});

src/components/Reports/MPGAIncomeExpensesReport/CustomExport/CustomExport.tsx

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,30 @@ import { buildURI } from 'react-csv/lib/core';
22
import { ReportTypeEnum } from '../Helper/MPGAReportEnum';
33
import { DataFields } from '../mockData';
44

5-
export const createTable = (csvHeader: string[], data: DataFields[]) => {
5+
const round = (value: number, locale: string) =>
6+
new Intl.NumberFormat(locale, {
7+
style: 'decimal',
8+
minimumFractionDigits: 2,
9+
maximumFractionDigits: 2,
10+
trailingZeroDisplay: 'stripIfInteger',
11+
useGrouping: false,
12+
}).format(value);
13+
14+
export const createTable = (
15+
csvHeader: string[],
16+
data: DataFields[],
17+
locale: string,
18+
) => {
619
const csvData = data.map((item) => {
7-
const monthlyData = item.monthly.map((month) =>
8-
month === 0 ? '-' : month,
20+
const monthlyData = item.monthly.map((monthlyAmount) =>
21+
monthlyAmount === 0 ? '-' : round(monthlyAmount, locale),
922
);
10-
return [item.description, ...monthlyData, item.average, item.total];
23+
return [
24+
item.description,
25+
...monthlyData,
26+
round(item.average, locale),
27+
round(item.total, locale),
28+
];
1129
});
1230

1331
return [csvHeader, ...csvData];
@@ -17,6 +35,7 @@ export const exportToCsv = (
1735
data: DataFields[],
1836
reportType: ReportTypeEnum,
1937
months: string[],
38+
locale: string,
2039
) => {
2140
const title =
2241
reportType === ReportTypeEnum.Income
@@ -46,7 +65,7 @@ export const exportToCsv = (
4665
];
4766

4867
const csvHeader = ['Description', ...last12Months, 'Average', 'Total'];
49-
const csvData = createTable(csvHeader, dataWithTotal);
68+
const csvData = createTable(csvHeader, dataWithTotal, locale);
5069

5170
const csvBlob = buildURI(csvData, true);
5271

src/components/Reports/MPGAIncomeExpensesReport/CustomToolbar/CustomToolbar.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ToolbarButton,
1111
} from '@mui/x-data-grid';
1212
import { useTranslation } from 'react-i18next';
13+
import { useLocale } from 'src/hooks/useLocale';
1314
import { exportToCsv } from '../CustomExport/CustomExport';
1415
import { ReportTypeEnum } from '../Helper/MPGAReportEnum';
1516
import { TableCardHead } from '../Tables/TableCardHead';
@@ -27,6 +28,7 @@ export const CustomToolbar: React.FC<CustomToolbarProps> = ({
2728
months,
2829
}) => {
2930
const { t } = useTranslation();
31+
const locale = useLocale();
3032

3133
return (
3234
<Toolbar style={{ display: 'flex', justifyContent: 'left' }}>
@@ -71,7 +73,7 @@ export const CustomToolbar: React.FC<CustomToolbarProps> = ({
7173
/>
7274

7375
<Tooltip title={t('Download as CSV')}>
74-
<ToolbarButton onClick={() => exportToCsv(data, type, months)}>
76+
<ToolbarButton onClick={() => exportToCsv(data, type, months, locale)}>
7577
<FileDownloadIcon fontSize="small" color="primary" />
7678
</ToolbarButton>
7779
</Tooltip>

0 commit comments

Comments
 (0)