fix(vat): make the ruta drill-down reconcile with the figure it explains (#2016)

* fix(vat): make the ruta drill-down reconcile with the figure it explains

get_vat_declaration_totals drops four classes of entry before summing: posted
closing entries, source_type 'vat_settlement', the two kontantmetod year-end
reversals, and anything shaped like a momsredovisning. The drill-down behind
each ruta filtered on company, status and date only.

So expanding a ruta listed verifikat that are not in the number it claims to
explain, and the panel shows no total that would reveal the mismatch. On
production, 322 posted/reversed entries carrying 26xx lines across 214
companies sit in those excluded classes.

A momsdeklaration is räkenskapsinformation under BFL 5 kap. and this
drill-down is what a consultant uses to substantiate a filed figure, so the
two have to agree exactly.

The exclusion CTEs are lifted verbatim from the figure rather than re-derived,
because any divergence reintroduces exactly this bug. The new pg test asserts
the equality for the whole account set at once, so editing one function and
not the other fails CI instead of silently misreporting.

opening_balance entries are deliberately kept: the figure exempts them from
its `shaped` set, which leaves their lines in the totals, so excluding them
here would break the equality in the other direction. That has its own test.

Verified the test catches the defect by reinstalling the old function body and
watching it fail with the real numbers (2611: drill-down 250/240 vs figure
0/200), then restoring.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(vat): update the existing drill-down pg test to the new signature

get_vat_ruta_source_lines gained p_ruta_accounts / p_net_accounts, and
production-error-regressions.pg.test.ts still called the old 9-argument form,
so pg-real failed with 42883 "function does not exist". I had grepped app/,
lib/ and extensions/ for callers and not tests/.

Neither fixture in that paging test is settlement-shaped, so paging behaviour
is unchanged; the equality itself is covered by the new reconcile test.

Also documents, in the tool-pg reset script, that its blanket grant to `anon`
(which PostgREST requires) makes that database invalid for the pg-real suite:
~29 of those files assert least privilege and fail there even on unmodified
main. That cost a confusing local run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-08-29 00:29:11 +02:00
committed by GitHub
co-authored by Claude Opus 5 Jakob Wennberg
parent 4e1eb3d662
commit 338ac4e913
7 changed files with 415 additions and 4 deletions
+8 -1
View File
@@ -137,7 +137,14 @@ export const ACCOUNT_RUTA: Record<string, { box: keyof VatDeclarationRutor; side
'4547': { box: 'ruta50', side: 'debit' }, // Beskattningsunderlag import 6%
}
const VAT_ACCOUNTS = Object.keys(ACCOUNT_RUTA)
/**
* The fixed BAS accounts that define a momsdeklaration line, and with it the
* settlement SHAPE detector passed as `p_ruta_accounts` to both
* get_vat_declaration_totals and get_vat_ruta_source_lines. Exported so the
* ruta drill-down route detects shape from the same list the figure does; a
* second copy is what let the two disagree.
*/
export const VAT_ACCOUNTS = Object.keys(ACCOUNT_RUTA)
/**
* 26xx output VAT accounts feeding rutor 10/11/12, 30/31/32 and 60/61/62.