Skip to content

Commit 1a9aa1d

Browse files
committed
different pie chart groups and accurate finance information
1 parent 0d28470 commit 1a9aa1d

10 files changed

Lines changed: 122 additions & 125 deletions

File tree

src/backend/src/services/finance.services.ts

Lines changed: 40 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ export default class FinanceServices {
421421

422422
const reimbursementRequests = await prisma.reimbursement_Request.findMany({
423423
where: {
424+
dateDeleted: null,
424425
reimbursementProducts: {
425426
some: {
426427
reimbursementProductReason: {
@@ -460,7 +461,7 @@ export default class FinanceServices {
460461
}
461462
});
462463

463-
const { pendingFinance, pendingLeadership, submittedToSabo, reimbursed } = computeRRTotals(reimbursementRequests);
464+
const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests);
464465

465466
const totalBalance =
466467
reimbursementRequests.reduce((acc, curr) => {
@@ -472,9 +473,9 @@ export default class FinanceServices {
472473

473474
const data: ReimbursementRequestData = {
474475
totalBudget: project.budget,
475-
pendingFinance,
476-
pendingLeadership,
477-
submittedToSabo,
476+
approved,
477+
pendingApproval,
478+
addedToSabo,
478479
reimbursed,
479480
available
480481
};
@@ -558,7 +559,7 @@ export default class FinanceServices {
558559

559560
const totalBudget = team.projects.reduce((acc, curr) => acc + curr.budget, 0);
560561

561-
const { pendingFinance, pendingLeadership, submittedToSabo, reimbursed } = computeRRTotals(reimbursementRequests);
562+
const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests);
562563

563564
const totalBalance =
564565
reimbursementRequests.reduce((acc, curr) => {
@@ -570,9 +571,9 @@ export default class FinanceServices {
570571

571572
const data: ReimbursementRequestData = {
572573
totalBudget,
573-
pendingFinance,
574-
pendingLeadership,
575-
submittedToSabo,
574+
approved,
575+
pendingApproval,
576+
addedToSabo,
576577
reimbursed,
577578
available
578579
};
@@ -665,7 +666,7 @@ export default class FinanceServices {
665666
}
666667
});
667668

668-
const { pendingFinance, pendingLeadership, submittedToSabo, reimbursed } = computeRRTotals(reimbursementRequests);
669+
const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests);
669670

670671
const totalBalance =
671672
reimbursementRequests.reduce((acc, curr) => {
@@ -677,9 +678,9 @@ export default class FinanceServices {
677678

678679
const data: ReimbursementRequestData = {
679680
totalBudget,
680-
pendingFinance,
681-
pendingLeadership,
682-
submittedToSabo,
681+
approved,
682+
pendingApproval,
683+
addedToSabo,
683684
reimbursed,
684685
available
685686
};
@@ -885,9 +886,9 @@ export default class FinanceServices {
885886
}, 0) / 100;
886887

887888
const {
888-
pendingFinance: allPendingFinance,
889-
pendingLeadership: allPendingLeadership,
890-
submittedToSabo: allSubmittedToSabo,
889+
approved: allApproved,
890+
pendingApproval: allPendingApproval,
891+
addedToSabo: allAddedToSabo,
891892
reimbursed: allReimbursed
892893
} = computeRRTotals(allReimbursementRequests);
893894

@@ -896,9 +897,9 @@ export default class FinanceServices {
896897
const allAvailable = allTotalBudget - allTotalBalance;
897898

898899
const {
899-
pendingFinance: cashPendingFinance,
900-
pendingLeadership: cashPendingLeadership,
901-
submittedToSabo: cashSubmittedToSabo,
900+
approved: cashApproved,
901+
pendingApproval: cashPendingApproval,
902+
addedToSabo: cashAddedToSabo,
902903
reimbursed: cashReimbursed
903904
} = computeRRTotals(cashReimbursementRequests);
904905

@@ -907,9 +908,9 @@ export default class FinanceServices {
907908
const cashAvailable = cashTotalBudget - cashTotalBalance;
908909

909910
const {
910-
pendingFinance: budgetPendingFinance,
911-
pendingLeadership: budgetPendingLeadership,
912-
submittedToSabo: budgetSubmittedToSabo,
911+
approved: budgetApproved,
912+
pendingApproval: budgetPendingApproval,
913+
addedToSabo: budgetAddedToSabo,
913914
reimbursed: budgetReimbursed
914915
} = computeRRTotals(budgetReimbursementRequests);
915916

@@ -919,27 +920,27 @@ export default class FinanceServices {
919920

920921
const allData: ReimbursementRequestData = {
921922
totalBudget: allTotalBudget,
922-
pendingFinance: allPendingFinance,
923-
pendingLeadership: allPendingLeadership,
924-
submittedToSabo: allSubmittedToSabo,
923+
approved: allApproved,
924+
pendingApproval: allPendingApproval,
925+
addedToSabo: allAddedToSabo,
925926
reimbursed: allReimbursed,
926927
available: allAvailable
927928
};
928929

929930
const cashData: ReimbursementRequestData = {
930931
totalBudget: cashTotalBudget,
931-
pendingFinance: cashPendingFinance,
932-
pendingLeadership: cashPendingLeadership,
933-
submittedToSabo: cashSubmittedToSabo,
932+
approved: cashApproved,
933+
pendingApproval: cashPendingApproval,
934+
addedToSabo: cashAddedToSabo,
934935
reimbursed: cashReimbursed,
935936
available: cashAvailable
936937
};
937938

938939
const budgetData: ReimbursementRequestData = {
939940
totalBudget: budgetTotalBudget,
940-
pendingFinance: budgetPendingFinance,
941-
pendingLeadership: budgetPendingLeadership,
942-
submittedToSabo: budgetSubmittedToSabo,
941+
approved: budgetApproved,
942+
pendingApproval: budgetPendingApproval,
943+
addedToSabo: budgetAddedToSabo,
943944
reimbursed: budgetReimbursed,
944945
available: budgetAvailable
945946
};
@@ -1036,39 +1037,21 @@ export default class FinanceServices {
10361037

10371038
const totalBudget = category.budget;
10381039

1039-
const totals: Partial<Record<Reimbursement_Status_Type, number>> = {
1040-
[Reimbursement_Status_Type.PENDING_FINANCE]: 0,
1041-
[Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL]: 0,
1042-
[Reimbursement_Status_Type.SABO_SUBMITTED]: 0,
1043-
[Reimbursement_Status_Type.REIMBURSED]: 0
1044-
};
1045-
1046-
reimbursementRequests.forEach((req) => {
1047-
const lastStatus = req.reimbursementStatuses.at(-1)?.type;
1048-
1049-
if (lastStatus && totals[lastStatus] !== undefined) {
1050-
const categoryProductsCost = req.reimbursementProducts.reduce((prodAcc, prod) => prodAcc + prod.cost, 0);
1051-
totals[lastStatus] += categoryProductsCost;
1052-
}
1053-
});
1054-
1055-
const pendingFinance = totals[Reimbursement_Status_Type.PENDING_FINANCE] ?? 0;
1056-
const pendingLeadership = totals[Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL] ?? 0;
1057-
const submittedToSabo = totals[Reimbursement_Status_Type.SABO_SUBMITTED] ?? 0;
1058-
const reimbursed = totals[Reimbursement_Status_Type.REIMBURSED] ?? 0;
1040+
const { approved, pendingApproval, addedToSabo, reimbursed } = computeRRTotals(reimbursementRequests);
10591041

1060-
const totalBalance = reimbursementRequests.reduce((acc, curr) => {
1061-
const categoryProductsCost = curr.reimbursementProducts.reduce((prodAcc, prod) => prodAcc + prod.cost, 0);
1062-
return acc + categoryProductsCost;
1063-
}, 0);
1042+
const totalBalance =
1043+
reimbursementRequests.reduce((acc, curr) => {
1044+
const categoryProductsCost = curr.reimbursementProducts.reduce((prodAcc, prod) => prodAcc + prod.cost, 0);
1045+
return acc + categoryProductsCost;
1046+
}, 0) / 100;
10641047

10651048
const available = totalBudget - totalBalance;
10661049

10671050
const data: ReimbursementRequestData = {
10681051
totalBudget,
1069-
pendingFinance,
1070-
pendingLeadership,
1071-
submittedToSabo,
1052+
approved,
1053+
pendingApproval,
1054+
addedToSabo,
10721055
reimbursed,
10731056
available
10741057
};

src/backend/src/utils/finance.utils.ts

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -117,34 +117,48 @@ export const computeRRTotals = (
117117
reimbursementProducts?: { cost: number }[];
118118
}[]
119119
): {
120-
pendingFinance: number;
121-
pendingLeadership: number;
122-
submittedToSabo: number;
120+
approved: number;
121+
pendingApproval: number;
122+
addedToSabo: number;
123123
reimbursed: number;
124124
} => {
125-
const totals: Partial<Record<Reimbursement_Status_Type, number>> = {
126-
[Reimbursement_Status_Type.PENDING_FINANCE]: 0,
127-
[Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL]: 0,
128-
[Reimbursement_Status_Type.SABO_SUBMITTED]: 0,
129-
[Reimbursement_Status_Type.REIMBURSED]: 0
130-
};
125+
let pendingApproval = 0;
126+
let approved = 0;
127+
let addedToSabo = 0;
128+
let reimbursed = 0;
131129

132130
reimbursementRequests.forEach((req) => {
133131
const lastStatus = req.reimbursementStatuses.at(-1)?.type;
132+
if (!lastStatus) return;
133+
134+
// If reimbursementProducts are provided, sum their costs; otherwise use totalCost
135+
const costToAdd = req.reimbursementProducts
136+
? req.reimbursementProducts.reduce((acc, prod) => acc + prod.cost, 0)
137+
: req.totalCost;
134138

135-
if (lastStatus && totals[lastStatus] !== undefined) {
136-
// If reimbursementProducts are provided, sum their costs; otherwise use totalCost
137-
const costToAdd = req.reimbursementProducts
138-
? req.reimbursementProducts.reduce((acc, prod) => acc + prod.cost, 0)
139-
: req.totalCost;
140-
totals[lastStatus] += costToAdd;
139+
switch (lastStatus) {
140+
case Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL:
141+
pendingApproval += costToAdd;
142+
break;
143+
case Reimbursement_Status_Type.LEADERSHIP_APPROVED:
144+
case Reimbursement_Status_Type.PENDING_FINANCE:
145+
case Reimbursement_Status_Type.ADVISOR_APPROVED:
146+
approved += costToAdd;
147+
break;
148+
case Reimbursement_Status_Type.SABO_SUBMITTED:
149+
case Reimbursement_Status_Type.PENDING_SABO_SUBMISSION:
150+
addedToSabo += costToAdd;
151+
break;
152+
case Reimbursement_Status_Type.REIMBURSED:
153+
reimbursed += costToAdd;
154+
break;
141155
}
142156
});
143157

144-
const pendingFinance = (totals[Reimbursement_Status_Type.PENDING_FINANCE] ?? 0) / 100;
145-
const pendingLeadership = (totals[Reimbursement_Status_Type.PENDING_LEADERSHIP_APPROVAL] ?? 0) / 100;
146-
const submittedToSabo = (totals[Reimbursement_Status_Type.SABO_SUBMITTED] ?? 0) / 100;
147-
const reimbursed = (totals[Reimbursement_Status_Type.REIMBURSED] ?? 0) / 100;
148-
149-
return { pendingFinance, pendingLeadership, submittedToSabo, reimbursed };
158+
return {
159+
approved: approved / 100,
160+
pendingApproval: pendingApproval / 100,
161+
addedToSabo: addedToSabo / 100,
162+
reimbursed: reimbursed / 100
163+
};
150164
};

src/frontend/src/pages/FinancePage/FinanceComponents/PieChart.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,36 @@ import { Button, List, ListItem, Typography } from '@mui/material';
88

99
interface FinancePieChartProps {
1010
totalBalance: number;
11-
pendingLeadership: number;
12-
pendingFinance: number;
13-
submittedToSABO: number;
11+
pendingApproval: number;
12+
approved: number;
13+
addedToSABO: number;
1414
reimbursed: number;
1515
available: number;
1616
}
1717

1818
const FinancePieChart: React.FC<FinancePieChartProps> = ({
1919
totalBalance,
20-
pendingLeadership,
21-
pendingFinance,
22-
submittedToSABO,
20+
pendingApproval,
21+
approved,
22+
addedToSABO,
2323
reimbursed,
2424
available
2525
}) => {
2626
const [isLegendOpen, setIsLegendOpen] = useState(true);
2727
const [sectionStates, setSectionStates] = useState([
28-
{ title: 'Pending Leadership', color: '#562016', expanded: false },
29-
{ title: 'Pending Finance', color: '#8e3c2d', expanded: false },
30-
{ title: 'Submitted to SABO', color: '#dd514c', expanded: false },
28+
{ title: 'Pending Approval', color: '#562016', expanded: false },
29+
{ title: 'Approved', color: '#8e3c2d', expanded: false },
30+
{ title: 'Added to SABO', color: '#dd514c', expanded: false },
3131
{ title: 'Reimbursed', color: '#797a7a', expanded: false },
3232
{ title: 'Available', color: '#afafaf', expanded: false }
3333
]);
3434

3535
const MIN_PERCENTAGE = 0.05;
3636

3737
const data = [
38-
{ name: 'Pending Leadership', value: pendingLeadership },
39-
{ name: 'Pending Finance', value: pendingFinance },
40-
{ name: 'Submitted to SABO', value: submittedToSABO },
38+
{ name: 'Pending Approval', value: pendingApproval },
39+
{ name: 'Approved', value: approved },
40+
{ name: 'Added to SABO', value: addedToSABO },
4141
{ name: 'Reimbursed', value: reimbursed },
4242
{ name: 'Available', value: available }
4343
];
@@ -73,9 +73,9 @@ const FinancePieChart: React.FC<FinancePieChartProps> = ({
7373
}
7474

7575
const sectionColorMap = new Map([
76-
['Pending Leadership', '#562016'],
77-
['Pending Finance', '#8e3c2d'],
78-
['Submitted to SABO', '#dd514c'],
76+
['Pending Approval', '#562016'],
77+
['Approved', '#8e3c2d'],
78+
['Added to SABO', '#dd514c'],
7979
['Reimbursed', '#797a7a'],
8080
['Available', '#afafaf']
8181
]);
@@ -171,7 +171,7 @@ const FinancePieChart: React.FC<FinancePieChartProps> = ({
171171
}}
172172
>
173173
{data[index].value < 0
174-
? `($${Math.abs(data[index].value).toLocaleString()})`
174+
? `-$${Math.abs(data[index].value).toLocaleString()}`
175175
: `$${data[index].value.toLocaleString()}`}
176176
</Box>
177177
)}

src/frontend/src/pages/FinancePage/FinanceComponents/SpendingBar.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ const isAllUppercase = (label: string): boolean => {
2121
};
2222

2323
const getTotalMoneySpent = (data: ReimbursementRequestData) =>
24-
data.available + data.pendingFinance + data.pendingLeadership + data.reimbursed + data.submittedToSabo;
24+
data.available + data.approved + data.pendingApproval + data.reimbursed + data.addedToSabo;
2525

2626
const getTotalMoneySpentNotAvailable = (data: ReimbursementRequestData) =>
27-
data.pendingFinance + data.pendingLeadership + data.reimbursed + data.submittedToSabo;
27+
data.approved + data.pendingApproval + data.reimbursed + data.addedToSabo;
2828

2929
const transformReimbursementDataToBarData = (
3030
title: string,
@@ -96,9 +96,9 @@ const SpendingBar = ({ data, title, edit }: SpendingBarProps) => {
9696
datasets: data.flatMap((val, index) => {
9797
if (index === hoveredIndex) {
9898
return [
99-
getBarData('Leadership', val.spendingInfo.pendingLeadership + average, '#ef2020', data.length + 4),
100-
getBarData('Finance', val.spendingInfo.pendingFinance + average, '#ef4545', data.length + 4),
101-
getBarData('SABO', val.spendingInfo.submittedToSabo + average, '#efA0A0', data.length + 4),
99+
getBarData('Pending Approval', val.spendingInfo.pendingApproval + average, '#ef2020', data.length + 4),
100+
getBarData('Approved', val.spendingInfo.approved + average, '#ef4545', data.length + 4),
101+
getBarData('Added to SABO', val.spendingInfo.addedToSabo + average, '#efA0A0', data.length + 4),
102102
getBarData('Reimbursed', val.spendingInfo.reimbursed + average, grey[800], data.length + 4),
103103
getBarData('Available', val.spendingInfo.available + average, grey[500], data.length + 4)
104104
];

0 commit comments

Comments
 (0)