The /sie-data route parsed only the newest fiscal year's SIE file for the
import preview and the returned SIEData.parsed. Mid-year provider exports
have few or zero vouchers in the newest year, so the first real Fortnox
migration (3 fiscal years, 4153 vouchers) previewed "0 verifikationer"
and drew an almost-empty migration theater while the import itself
landed all 4153 vouchers from the older files.
- New mergeParsedSIEFiles (lib/import/sie-merge.ts): pure, browser-clean
whole-dataset merge (accounts union first-wins, vouchers concatenated,
fiscal years union oldest-first re-indexed newest=0, balances and
issues concatenated, dimensions deduped), with unit tests.
- /sie-data parses each file exactly once, builds the preview from the
merged parse and returns parsed: merged; response shape unchanged.
Validation stays newest-file-only so no previously accepted dataset
is newly rejected.
- /preview drops latestOnly and computes sieStats from the merged parse:
the connect step's "Hittade X konton och Y verifikationer" line
renders from THESE stats, so this is where the founder-visible count
was lying.
- The migration theater spreads its account waves across ~10s and
births an additional wave on each real step label during the SIE
phase (progress <= 55), through a shared rate-limited gate, so the
canvas keeps performing over a multi-minute run. Narration labels and
progress remain the wizard's real values; reduced motion unchanged.
Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>