diff options
Diffstat (limited to 'src/lib/totals.ts')
| -rw-r--r-- | src/lib/totals.ts | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/lib/totals.ts b/src/lib/totals.ts new file mode 100644 index 0000000..797318c --- /dev/null +++ b/src/lib/totals.ts @@ -0,0 +1,66 @@ +import { getGroupExpenses } from '@/lib/api' + +export function getTotalGroupSpending( + expenses: NonNullable<Awaited<ReturnType<typeof getGroupExpenses>>>, +): number { + return expenses.reduce( + (total, expense) => + !expense.isReimbursement ? total + expense.amount : total + 0, + 0, + ) +} + +export function getTotalActiveUserPaidFor( + activeUserId: string | null, + expenses: NonNullable<Awaited<ReturnType<typeof getGroupExpenses>>>, +): number { + return expenses.reduce( + (total, expense) => + expense.paidBy.id === activeUserId ? total + expense.amount : total + 0, + 0, + ) +} + +export function getTotalActiveUserShare( + activeUserId: string | null, + expenses: NonNullable<Awaited<ReturnType<typeof getGroupExpenses>>>, +): number { + let total = 0 + + expenses.forEach((expense) => { + const paidFors = expense.paidFor + const userPaidFor = paidFors.find( + (paidFor) => paidFor.participantId === activeUserId, + ) + + if (!userPaidFor) { + // If the active user is not involved in the expense, skip it + return + } + + switch (expense.splitMode) { + case 'EVENLY': + // Divide the total expense evenly among all participants + total += expense.amount / paidFors.length + break + case 'BY_AMOUNT': + // Directly add the user's share if the split mode is BY_AMOUNT + total += userPaidFor.shares + break + case 'BY_PERCENTAGE': + // Calculate the user's share based on their percentage of the total expense + total += (expense.amount * userPaidFor.shares) / 10000 // Assuming shares are out of 10000 for percentage + break + case 'BY_SHARES': + // Calculate the user's share based on their shares relative to the total shares + const totalShares = paidFors.reduce( + (sum, paidFor) => sum + paidFor.shares, + 0, + ) + total += (expense.amount * userPaidFor.shares) / totalShares + break + } + }) + + return parseFloat(total.toFixed(2)) +} |
