* chore: repo-wide bloat sweep, remove dead code and fold duplicate helpers
Remove 33 dead files, ~270 unreferenced exports/types, 13 dead i18n
namespaces and 4 unused dependencies; fold byte-identical helper copies
into one canonical home each (lib/utils chunk/sleep/utcDateStamp,
lib/dates/iso, lib/invariants/uuid, lib/xml/escape, lib/reports/sru/format,
lib/pdf/number-text, lib/browser/panel-request, lib/api/v1/body +
v1ValidationError rolled out to ~55 v1 routes, booking-template schemas).
No behaviour change: v1 bodies and status codes, MCP tool schemas, DB
writes and money math are untouched. Naive ore rounding was deliberately
not swapped for roundOre; see DECISIONS.md 2026-09-02 for the full list
of things left alone on purpose.
tsc, lint, 19588 unit tests and check:guards green; antipattern baseline
ratcheted (naive-ore-round 622 -> 620, hand-rolled-invariant 115 -> 113).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* test(transactions): import RawTransaction from @/types after the ingest re-export removal
CI's type ratchet (check:types, full tsconfig) caught the one test file
that still imported the type through lib/transactions/ingest.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---------
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* feat(transactions): filter /transactions by rakenskapsar and kvartal
User request: booking a specific period (including brutet rakenskapsar,
e.g. July-June) meant scrolling past every other year's transactions.
- New FyPicker chip in the toolbar scopes both the inbox and history views
to a fiscal year; quarter chips (Q1-Q4, fiscal-year aligned) appear once
a year is selected. Clicking the active quarter widens back to the year.
- Bounds are pushed into the Supabase queries (window, pending backlog,
badge count, load-more) so pagination and the Att bokfora count stay
consistent with the visible list; skattekonto rows are bounded client-side.
- Scope persists under a page-local localStorage key, deliberately separate
from the shared report scope so a year picked on a report page never
silently hides pending inbox rows.
- lib/transactions/period-filter.ts derives quarter bounds from fiscal
period dates (handles brutet, shortened and extended years); unit tested.
- FyPicker gains an optional storageKeyPrefix prop; default unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(transactions): never hide pending rows behind the period filter
Swedish accounting review on PR #1545: scoping the pending-backlog fetch
and badge count to the period made unbooked rows outside the selected
year vanish from the inbox worklist (BFL 5 kap: pending affarshandelser
must stay visible until booked).
- Pending-backlog fetch and the DB pending count are unscoped again;
only the history window pages server-side within the period.
- The inbox applies the period client-side over the complete backlog;
the tab badge counts pending rows inside the scope.
- When pending rows (bank or skattekonto) fall outside the scope, the
footer says how many and offers Visa alla, which clears the filter
and its persisted value.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(transactions): guard list fetches against stale cross-scope responses
CodeRabbit on PR #1545:
- fetchTransactions/loadMoreTransactions now carry a fetch generation;
a response applies only if no newer fetch (scope change, realtime
refresh, load-more) started meanwhile, so a slow pre-filter request
can no longer overwrite the active period scope's window, paging
offsets, or loading skeleton.
- FyPicker restore effect includes storageKeyPrefix in its deps.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(transactions): label quarter chips as fiscal-year quarters
Swedish accounting review note on PR #1545: Q1-Q4 follow the company's
rakenskapsar, which on a brutet rakenskapsar differs from the calendar
quarters that momsdeklaration periods use. Say so in the group's
aria-label and hover title so the chips are not mistaken for VAT
periods.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>