ci / lint-test (push) Successful in 1m24s
The transactions page rendered the statement's native amount through a formatter hardcoded to AUD, so a USD row displayed its USD figure labelled as dollars while every analytics query counted the converted amount_aud. Same transaction, two different numbers depending on the page. getTransactions now returns the statement currency, the amount column shows amount_aud with the native figure beneath it when the two differ, and the split and duplicate modals seed from the converted amount (a duplicate becomes a manual AUD row, so the native figure would be wrong there). Settlement balances had the same split: getParticipantBalances and the per-participant balance route summed raw amount while trip totals summed amount_aud, so a shared foreign expense would net a USD figure against AUD ones. All three now agree on amount_aud. No change to current balances - every statement in the database is AUD today - but correct once Wise data lands.
36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { queryRaw } from "@/lib/db";
|
|
import { getCurrentUser } from "@/lib/auth";
|
|
|
|
interface BalanceRow {
|
|
participant_id: number;
|
|
name: string;
|
|
total_owed: number;
|
|
transaction_count: number;
|
|
}
|
|
|
|
export async function GET(
|
|
req: NextRequest,
|
|
{ params }: { params: Promise<{ id: string }> }
|
|
) {
|
|
const user = await getCurrentUser(req);
|
|
if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 403 });
|
|
const { id } = await params;
|
|
|
|
const rows = await queryRaw<BalanceRow>(
|
|
`SELECT ts.participant_id, p.name,
|
|
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
|
|
JOIN participants p ON p.id = ts.participant_id
|
|
WHERE ts.participant_id = $1 AND ts.settled = false
|
|
GROUP BY ts.participant_id, p.name`,
|
|
[Number(id)]
|
|
);
|
|
|
|
return NextResponse.json(
|
|
rows[0] ?? { participant_id: Number(id), total_owed: 0, transaction_count: 0 }
|
|
);
|
|
}
|