- invoice/article posting-account overrides accept active class 1-3 accounts;
class 1-2 (balance-sheet) accounts are rejected on VAT-bearing lines so the
ruta 05 tax base always books to a 3xxx account
- shared posting-account regex across server schemas, pending-operation
re-validation, and client forms
- share-capital settings (aktiekapital/antal_aktier) feed the annual-report
note; kvotvarde derived per ABL 1 kap 6 $; all-or-nothing pair constraint
- signed per-rate VAT breakdown on credit-note PDFs; U+2212 to ASCII hyphen
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(arsredovisning): make the aktiekapital note completable via company settings
The annual report warned every AB that the aktiekapital note was missing
and pointed at Installningar -> Foretag, but the referenced columns
(aktiekapital, antal_aktier, kvotvarde) never existed and no settings UI
was ever built, so the warning was a dead end and no AB could produce a
complete note before Bolagsverket filing.
- migration 20260723103000: company_settings.aktiekapital (numeric) and
antal_aktier (integer) with positive CHECKs; kvotvarde is intentionally
not stored since ABL 1 kap 6 defines it as aktiekapital / antal aktier
- build-data.ts (K2 and K3 note paths): select only the two stored
columns and derive kvotvarde with roundOre
- UpdateSettingsSchema: aktiekapital (positive), antal_aktier (positive
integer), both nullable to allow clearing
- new ShareCapitalForm section on Installningar -> Foretag, rendered for
aktiebolag only, with live derived kvotvarde display; wired through the
existing CompanySettingsContent save path (empty string clears to null)
- sv/en strings; settings route tests (round-trip, clear, 400 on invalid);
builder tests for derived kvotvarde and the empty-settings warning
Staging (metjnjrhvujscngnpzdv) already has the columns applied and the
note verified end-to-end against a rehearsal company.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(arsredovisning): address PR review findings on the share-capital note
- enforce aktiekapital/antal_aktier as an all-or-nothing pair (DB CHECK,
K2/K3 note guard now requires both, partial pair warns instead)
- numeric(15,2) column, .int() Zod constraint, maxFractionDigits 0 render
- guard numberOrNull against NaN; align kvotvarde preview with schema
- strengthen clearing test, add fractional and partial-pair tests
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat: enhance supplier invoice payment process and settings handling
- Implemented linking of invoice documents to journal entries for cash payments in the supplier invoice payment process.
- Refactored settings fetching logic to improve loading states and error handling across various settings components.
- Introduced a new SettingsLoadError component to handle cases where settings fetch fails or returns no data.
- Updated useSettings hook to manage loading and error states more effectively, allowing for retries on failure.
- Enhanced tests for supplier invoice creation to ensure document IDs are persisted correctly for cash method payments.
* feat(salary): enable monthly salary edits in draft runs and handle zero-total declarations
* feat(reports,settings): report library + focused report routes, settings modal
Reports
- Replace the monolithic /reports tab-switcher with a calm, grouped report
library landing (ReportLibrary + RecentReportsShelf) driven by a new
lib/reports/catalog.ts.
- Each report opens a focused /reports/[slug] route (FocusedReport) with a
shared fiscal-year selector, optional date-range, and URL-based account
drill-down into the general ledger.
- Extract every report view into components/reports/views, add a reusable
ReportExportMenu, and remove the old ReportsNav.
Settings
- Add an intercepting @settingsModal parallel route so in-app navigation to
/settings opens as a modal over the current page; hard loads still resolve
to the full page.
- Share one SettingsShell (rail + content) between page and modal, extract each
section into components/settings/sections/*Content, add a settings hotkey and
command-palette entry, and remove the old SettingsSidebar.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(reports,settings): remove dead salary-journal entry, fix border token
Addresses PR review feedback (#629):
- Remove the unreachable `salary-journal` report from the catalog. It had
needsEmployees + no route + no FocusedView handler and `hasEmployees` was
never plumbed through, so it never appeared in the library and a direct
/reports/salary-journal URL rendered a blank frame. The report was never on
the old page and has no view component; the API + generator stay in place for
a proper follow-up. Drops its two now-unused i18n keys.
- Replace opacity-suffixed `border-border/8` section dividers with full-opacity
`border-border` across the extracted settings section components, per the
design system (no opacity-suffixed border tokens on surfaces).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: re-trigger checks (pg-real hit a Docker Hub registry timeout)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>