diff --git a/src/app/api/participants/[id]/balance/route.ts b/src/app/api/participants/[id]/balance/route.ts index eae3ae7..111d9b2 100644 --- a/src/app/api/participants/[id]/balance/route.ts +++ b/src/app/api/participants/[id]/balance/route.ts @@ -19,7 +19,7 @@ export async function GET( const rows = await queryRaw( `SELECT ts.participant_id, p.name, - SUM(t.amount * ts.share_percent / 100)::numeric(12,2) as total_owed, + SUM(COALESCE(t.amount_aud, t.amount) * ts.share_percent / 100)::numeric(12,2) as total_owed, COUNT(*)::int as transaction_count FROM transaction_splits ts JOIN transactions t ON t.id = ts.transaction_id diff --git a/src/app/transactions/page.tsx b/src/app/transactions/page.tsx index 93a0f02..3603516 100644 --- a/src/app/transactions/page.tsx +++ b/src/app/transactions/page.tsx @@ -22,10 +22,13 @@ function formatDate(d: string) { const SPEND_TYPES = new Set(["debit", "fee", "interest"]); -function formatAmount(amount: number, type: string) { +// `amount` is in the statement's native currency; pass the currency to label it +// correctly. Callers showing a headline figure should pass amount_aud, which is +// what every analytics query totals. +function formatAmount(amount: number, type: string, currency = "AUD") { const formatted = new Intl.NumberFormat("en-AU", { style: "currency", - currency: "AUD", + currency, }).format(amount); return SPEND_TYPES.has(type) ? formatted : `+${formatted}`; } @@ -947,7 +950,12 @@ function TransactionsContent() { - {formatAmount(t.amount, t.transaction_type)} + {formatAmount(t.amount_aud ?? t.amount, t.transaction_type)} + {t.currency && t.currency !== "AUD" && ( +
+ {formatAmount(t.amount, t.transaction_type, t.currency)} +
+ )} ))}