diff --git a/src/app/api/splits/settle/route.ts b/src/app/api/splits/settle/route.ts deleted file mode 100644 index bcfaa2b..0000000 --- a/src/app/api/splits/settle/route.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { NextRequest, NextResponse } from "next/server"; -import { queryRaw } from "@/lib/db"; -import { getCurrentUser } from "@/lib/auth"; - -// A split may be settled by the transaction's effective owner or by the -// participant the split belongs to. -const SCOPE = ` - AND EXISTS ( - SELECT 1 FROM transactions t - LEFT JOIN statements s ON s.id = t.statement_id - WHERE t.id = transaction_splits.transaction_id - AND (COALESCE(t.owner_id, s.owner_id) = $2 OR transaction_splits.participant_id = $2) - )`; - -export async function POST(req: NextRequest) { - const user = await getCurrentUser(req); - if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 403 }); - - const body = await req.json(); - const { participant_id, split_ids } = body as { - participant_id?: number; - split_ids?: number[]; - }; - - if (participant_id) { - const rows = await queryRaw<{ id: number }>( - `UPDATE transaction_splits SET settled = true, settled_at = NOW() - WHERE participant_id = $1 AND settled = false ${SCOPE} - RETURNING id`, - [participant_id, user.id] - ); - return NextResponse.json({ settled: rows.length }); - } - - if (split_ids?.length) { - const rows = await queryRaw<{ id: number }>( - `UPDATE transaction_splits SET settled = true, settled_at = NOW() - WHERE id = ANY($1::int[]) AND settled = false ${SCOPE} - RETURNING id`, - [split_ids, user.id] - ); - return NextResponse.json({ settled: rows.length }); - } - - return NextResponse.json({ error: "participant_id or split_ids required" }, { status: 400 }); -} diff --git a/src/app/trips/[id]/page.tsx b/src/app/trips/[id]/page.tsx index 5b060b5..4312623 100644 --- a/src/app/trips/[id]/page.tsx +++ b/src/app/trips/[id]/page.tsx @@ -277,7 +277,7 @@ export default function TripDetailPage({ params }: { params: Promise<{ id: strin
| {p.name} | ${Number(p.owed).toFixed(2)} | -${Number(p.settled).toFixed(2)} | -0 ? "text-amber-400" : "text-zinc-600"}`}> - ${Number(p.unsettled).toFixed(2)} - |
+ Settlement is tracked across all shared expenses, not per trip — + see Shared for + what is actually owed. +
)} diff --git a/src/lib/queries.ts b/src/lib/queries.ts index f2696b6..9f5ad28 100644 --- a/src/lib/queries.ts +++ b/src/lib/queries.ts @@ -753,7 +753,7 @@ export interface TripAnalytics { daily_spend: { date: string; amount: number }[]; top_merchants: { merchant: string; amount: number; count: number }[]; tag_breakdown: { tag_id: number; name: string; color: string; amount: number; count: number }[]; - participant_splits: { participant_id: number; name: string; owed: number; settled: number; unsettled: number }[]; + participant_splits: { participant_id: number; name: string; owed: number }[]; } export async function getTrips(ownerId: number): Promise