CC account value consistency

This commit is contained in:
2026-04-21 08:25:16 -04:00
parent d67a80b413
commit 7ccd64a7bb
3 changed files with 11 additions and 19 deletions

View File

@@ -26,19 +26,12 @@ export default async function BudgetsPage({ searchParams }: { searchParams: Sear
orderBy: { createdAt: 'asc' },
}),
prisma.$queryRaw<{ budgetId: string; total: bigint }[]>`
SELECT t."budgetId",
COALESCE(SUM(
CASE
WHEN a.type = 'CREDIT_CARD' AND t.type = 'CREDIT' THEN t."amountCents"
WHEN a.type = 'CREDIT_CARD' AND t.type = 'DEBIT' THEN -t."amountCents"
WHEN a.type = 'BANK' AND t.type = 'DEBIT' THEN t."amountCents"
ELSE -t."amountCents"
END
), 0)::bigint AS total
SELECT t."budgetId", COALESCE(SUM(t."amountCents"), 0)::bigint AS total
FROM "Transaction" t
JOIN "Account" a ON t."accountId" = a.id
WHERE a."userId" = ${userId}
AND t."budgetId" IS NOT NULL
AND t.type = 'DEBIT'
AND t.date >= ${start}
AND t.date <= ${end}
GROUP BY t."budgetId"

View File

@@ -41,19 +41,12 @@ export default async function DashboardPage({ searchParams }: { searchParams: Se
orderBy: { name: 'asc' },
}),
prisma.$queryRaw<{ budgetId: string; total: bigint }[]>`
SELECT t."budgetId",
COALESCE(SUM(
CASE
WHEN a.type = 'CREDIT_CARD' AND t.type = 'CREDIT' THEN t."amountCents"
WHEN a.type = 'CREDIT_CARD' AND t.type = 'DEBIT' THEN -t."amountCents"
WHEN a.type = 'BANK' AND t.type = 'DEBIT' THEN t."amountCents"
ELSE -t."amountCents"
END
), 0)::bigint AS total
SELECT t."budgetId", COALESCE(SUM(t."amountCents"), 0)::bigint AS total
FROM "Transaction" t
JOIN "Account" a ON t."accountId" = a.id
WHERE a."userId" = ${userId}
AND t."budgetId" IS NOT NULL
AND t.type = 'DEBIT'
AND t.date >= ${start}
AND t.date <= ${end}
GROUP BY t."budgetId"

View File

@@ -74,7 +74,13 @@ export async function POST(req: Request) {
config = result.data
}
const normalized = normalizeRows(allRows, accountId, config)
const rawNormalized = normalizeRows(allRows, accountId, config)
// Credit card CSVs have inverted sign semantics: CREDIT = charge, DEBIT = refund.
// Flip types so the rest of the app can treat DEBIT = spending universally.
const normalized = account.type === 'CREDIT_CARD'
? rawNormalized.map((r) => ({ ...r, type: r.type === 'CREDIT' ? 'DEBIT' as const : 'CREDIT' as const }))
: rawNormalized
// Apply budget auto-assign rules (first match wins)
const budgetRules = await prisma.budgetRule.findMany({