* feat(reports): add Resultatrapport and Balansrapport (operational reports)
Per user feedback (Anders Gengård): Swedish accounting practice (BFL 6 kap,
ÅRL Bilaga 1-3) distinguishes operational reports (Resultatrapport /
Balansrapport, used during the year for reconciliation, account-level
detail with numbers) from formal statements (Resultaträkning /
Balansräkning, part of årsbokslut/årsredovisning, ÅRL uppställningsform,
no account numbers). Until now gnubok only had a hybrid version under
"Bokslut" that did neither well.
This adds the operational pair as their own reports under a new "Löpande
rapporter" section on the Reports page. Resultaträkning and Balansräkning
under "Bokslut" are kept untouched (their yellow ÅRL 2:7 § draft
disclaimer stays — it's appropriate there). Saldobalans moves into the
new operational section.
Both new generators reuse generateTrialBalance — Balansrapport filters to
classes 1-2 with IB/UB/förändring; Resultatrapport filters to classes 3-8,
calls trial balance for the previous period (via fiscal_periods.previous_period_id)
and joins per account so the user sees current vs prior side-by-side.
Account 8999 is excluded the same way generateIncomeStatement excludes it.
13 new unit tests cover grouping, prior-period join, account-class
exclusions, zero-row filtering, and the missing-period fallback.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(reports): show Balanscheck on Balansrapport
Addresses the most material PR review finding (raised by both the Swedish
compliance bot and Greptile): BalansrapportReport returned total_assets_ub
and total_equity_liabilities_ub but the UI never displayed them, so the
user could not verify that books balance.
generateBalansrapport now also returns:
- beraknat_resultat = total_assets - total_eq_liab (Fortnox/Visma
convention: residual on the balance side; equals current-year P&L
during a running year, drops to 0 once year-end closing posts
8999 → 2099)
- is_balanced from the underlying trial balance — that's the meaningful
integrity check (a missing IB row or continuity break shows up as an
imbalanced TB)
UI gets a Balanscheck card showing the three totals plus a Balanserar /
Balanserar ej verdict.
Other PR review items (Föregående header polish, inline subtotal diff
rounding, class-8 filter scope, 2099 caveat, terminology disclaimer) are
non-blocking and deferred.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(reports): correct BAS class labels and add bokslut caveat
Addresses three findings from the Swedish compliance bot's review of the
prior commit:
- Class 6 label dropped the informal '(forts.)' marker — '6 Övriga
externa kostnader' is the BAS-correct heading.
- Balansrapport class 2 label expanded to 'Eget kapital, obeskattade
reserver, avsättningar och skulder' to match ÅRL Bilaga 1. The old
label hid 21xx (periodiseringsfond, överavskrivningar) and 22xx
(avsättningar) which matter for AB users.
- Beräknat resultat row in the Balanscheck card now reads 'Beräknat
resultat (ej bokslutsjusterat)' so the residual is not misread as
a confirmed profit figure pre-closing.
Skipped the bot's 8910/8999 finding: 8910 is 'Skatt på årets resultat'
(regular tax expense), not a closing account; 8999 is the only BAS
closing account, so the existing exclusion is correct.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>