aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLauri Vuorela <lauri.vuorela@gmail.com>2024-02-13 20:35:57 +0100
committerGitHub <noreply@github.com>2024-02-13 14:35:57 -0500
commitf7a13a0436badbf46be38c5b578b8543c7743d07 (patch)
tree186c7808e89e4587101c1920eee9c96a94031abd
parent5b65b8f049443ee8b95ce101d894df411676f51b (diff)
Round totals rather than expense by expense (#88)
* do balance rounding only on full balances rather than on every expense * use "public balances" calculated from reimbursements to show on balance page * fixes for totals that did not work as expected * prettier
-rw-r--r--src/app/groups/[groupId]/balances/page.tsx9
-rw-r--r--src/lib/balances.ts34
2 files changed, 37 insertions, 6 deletions
diff --git a/src/app/groups/[groupId]/balances/page.tsx b/src/app/groups/[groupId]/balances/page.tsx
index b35a379..93223a4 100644
--- a/src/app/groups/[groupId]/balances/page.tsx
+++ b/src/app/groups/[groupId]/balances/page.tsx
@@ -9,7 +9,11 @@ import {
CardTitle,
} from '@/components/ui/card'
import { getGroupExpenses } from '@/lib/api'
-import { getBalances, getSuggestedReimbursements } from '@/lib/balances'
+import {
+ getBalances,
+ getPublicBalances,
+ getSuggestedReimbursements,
+} from '@/lib/balances'
import { Metadata } from 'next'
import { notFound } from 'next/navigation'
@@ -28,6 +32,7 @@ export default async function GroupPage({
const expenses = await getGroupExpenses(groupId)
const balances = getBalances(expenses)
const reimbursements = getSuggestedReimbursements(balances)
+ const publicBalances = getPublicBalances(reimbursements)
return (
<>
@@ -40,7 +45,7 @@ export default async function GroupPage({
</CardHeader>
<CardContent>
<BalancesList
- balances={balances}
+ balances={publicBalances}
participants={group.participants}
currency={group.currency}
/>
diff --git a/src/lib/balances.ts b/src/lib/balances.ts
index 0bcd915..aa8d26f 100644
--- a/src/lib/balances.ts
+++ b/src/lib/balances.ts
@@ -24,7 +24,6 @@ export function getBalances(
if (!balances[paidBy]) balances[paidBy] = { paid: 0, paidFor: 0, total: 0 }
balances[paidBy].paid += expense.amount
- balances[paidBy].total += expense.amount
const totalPaidForShares = paidFors.reduce(
(sum, paidFor) => sum + paidFor.shares,
@@ -46,13 +45,40 @@ export function getBalances(
const dividedAmount = isLast
? remaining
- : Math.floor((expense.amount * shares) / totalShares)
+ : (expense.amount * shares) / totalShares
remaining -= dividedAmount
balances[paidFor.participantId].paidFor += dividedAmount
- balances[paidFor.participantId].total -= dividedAmount
})
}
+ // rounding and add total
+ for (const participantId in balances) {
+ // add +0 to avoid negative zeros
+ balances[participantId].paidFor =
+ Math.round(balances[participantId].paidFor) + 0
+ balances[participantId].paid = Math.round(balances[participantId].paid) + 0
+
+ balances[participantId].total =
+ balances[participantId].paid - balances[participantId].paidFor
+ }
+ return balances
+}
+
+export function getPublicBalances(reimbursements: Reimbursement[]): Balances {
+ const balances: Balances = {}
+ reimbursements.forEach((reimbursement) => {
+ if (!balances[reimbursement.from])
+ balances[reimbursement.from] = { paid: 0, paidFor: 0, total: 0 }
+
+ if (!balances[reimbursement.to])
+ balances[reimbursement.to] = { paid: 0, paidFor: 0, total: 0 }
+
+ balances[reimbursement.from].paidFor += reimbursement.amount
+ balances[reimbursement.from].total -= reimbursement.amount
+
+ balances[reimbursement.to].paid += reimbursement.amount
+ balances[reimbursement.to].total += reimbursement.amount
+ })
return balances
}
@@ -86,5 +112,5 @@ export function getSuggestedReimbursements(
balancesArray.shift()
}
}
- return reimbursements.filter(({ amount }) => amount !== 0)
+ return reimbursements.filter(({ amount }) => Math.round(amount) + 0 !== 0)
}