fix(bokslut): derive preview netResult from the 2099/2010 closing amount (#1045)

The Arets resultat summary card on the bokslut preview step read its
figure from generateIncomeStatement, which excludes entries tagged
source_type='year_end'. Bokslut-flow entries (annual depreciation,
bokslutsdispositioner) carry that tag, so the card showed the
pre-depreciation result while the bokslutsverifikation table below it
(built from the unfiltered trial balance) included depreciation in the
2099 balancing line.

previewYearEndClosing now derives netResult from the closing-lines
totals before the balancing line is appended: it equals, by
construction, the signed amount transferred to 2099 (AB) or 2010 (EF);
positive = credit = vinst, negative = debit = forlust. The posted
verifikat is unchanged: executeYearEndClosing only consumes
preview.closingLines, never netResult.

Fixes #766

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-07-17 11:51:10 +02:00
committed by GitHub
co-authored by Claude Fable 5
parent 88f53350de
commit 03fd1b60b7
3 changed files with 66 additions and 6 deletions
+1
View File
@@ -190,3 +190,4 @@ One line per decision: `[YYYY-MM-DD] <decision>: <why>`. Appended by agents and
[2026-07-17] Settings PUT keeps update(body) without a pick() allow-list: UpdateSettingsSchema is the write boundary (z.object strips unknown keys; company_id/onboarding_complete are not in the schema, org_number is deleted post-onboarding), so the mass-assignment finding does not apply.
[2026-07-17] Turning vat_registered off (or vat_has_eu_trade off) now coerces the dependent flags (vat_taxable_base_over_40m, vat_has_eu_trade, periodisk_sammanstallning_enabled) to false server-side instead of 400-ing on the stale stored combination; explicitly enabling PS without registration or EU trade still 400s. PS period/filing-method preferences are deliberately preserved while PS is disabled (they are inert until re-enabled).
[2026-07-17] Kept the cron's cross-tenant company_settings/deadlines scans on the service client: a daily all-company repair job is inherently cross-tenant, is cron-secret-gated, and per-company scoping would turn one paginated query into N queries; the per-company writes remain scoped by company_id inside the generator.
[2026-07-17] YearEndPreview.netResult now derived from the closing-lines totals (the signed 2099/2010 transfer) instead of generateIncomeStatement: the income statement excludes source_type='year_end' entries, so bokslut-flow depreciation/dispositioner were missing from the preview summary card while the bokslutsverifikation table included them (issue #766); patching the income statement instead was rejected because its exclusion is load-bearing (post-closing RR would collapse to zero) and executeYearEndClosing never reads netResult.