fix(sie): selectable IB voucher series, smarter IB toggle on re-import, orphan-IB guard (#1896)

* fix(sie): selectable IB voucher series that never collides with the file's numbering

The Ingående balanser voucher was hardcoded to series A and created before
the file's vouchers, so it consumed the A series' next number and shifted
every imported A voucher one number higher than in the source system
(issue #1882).

- IB voucher series is now selectable in the import wizard; the default is
  the first of M,O,P,Q,R,S,T,V,W,X,Y,Z not used by the file's #VER records
  (M matches the existing migration-adjustment series).
- Plumbed end to end: wizard -> /api/import/sie/execute -> executeSIEImport,
  v1 REST options.openingBalanceSeries, MCP gnubok_import_sie
  opening_balance_series -> commitImportSie.
- The wizard's 'Importera ingående balanser' toggle now defaults OFF when a
  posted IB voucher already exists inside the file's fiscal year, with a
  hint saying why.
- Orphan-IB guard in executeSIEImport: replace_sie_import deletes only
  source_type='import' entries and clears the period's OB pointer, so a
  prior import's IB voucher survived every replace cycle and each re-import
  created another one (field report: five accumulated). The import now
  skips IB creation with a warning when a posted opening_balance entry
  already exists in the period.
- MCP import_opening_balances default (false) vs web (true) documented as
  deliberate in the tool schema and DECISIONS.md.

Fixes #1882

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sie): harden IB series fix after skeptic review (relink orphan, exclude fallback series, type-check option)

Skeptic findings on PR #1896, all four blocking items:

- Orphan-IB guard now relinks a single surviving opening-balance voucher
  as the period's OB entry (permitted by the immutability trigger while
  the pointer is NULL): without it, reports showed IB 0, year-end's
  duplicate-IB blocker never armed, and the manual IB flow could
  double-book. It also diffs the survivor's lines against the file's IB
  and calls out stale amounts in the warning instead of keeping them
  silently; reverseEntry clears the pointer again for the
  storno-then-reimport path.
- Series-less #VER records resolve to the transaction fallback series at
  import time, so the IB default picker now treats that series as used by
  the file (the same #1882 shift pattern through the fallback). The
  wizard recomputes its IB default with the effective transaction series
  once loaded.
- openingBalanceSeries is type-checked on the web execute route, the MCP
  stage, and the staged-operation commit: a non-string falls back to the
  default instead of crashing mid-import after side effects.
- The wizard's IB series select flags series used by the file and shows
  an attention line when the chosen series collides; the engine warns
  when an explicitly chosen series collides with the file's series (the
  choice is honored).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sie): uppercase caller-chosen IB series before persisting

Swedish accounting review on PR #1896: a lowercase series from v1 or
MCP was persisted as-is, booking a case-distinct parallel series next
to its uppercase sibling (BFL 5 kap requires one systematic series)
and slipping past the file-collision warning. Normalize centrally in
executeSIEImport, the single funnel for web, v1, and MCP.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Mattsson
2026-08-25 15:14:59 +02:00
committed by GitHub
co-authored by Claude Fable 5
parent 79013cf092
commit c6f2bebab9
14 changed files with 1020 additions and 6 deletions
+5
View File
@@ -7513,6 +7513,11 @@
"tab_import": "Import",
"tab_export": "Export",
"sandbox_disabled": "Bank connections and migration from other systems require a real account and are disabled in the sandbox. File-based imports (bank files, CSV/Excel and SIE) work as usual.",
"ib_series_label": "Voucher series for opening balances",
"ib_series_hint": "Pick a series the file's own vouchers do not use, otherwise their numbering shifts",
"ib_series_in_file": "used in the file",
"ib_series_collision": "This series is used by the file's own vouchers: the opening-balance voucher takes the series' next number and shifts the file's numbering by one",
"ib_exists_hint": "An opening-balance voucher already exists for this fiscal year, so opening-balance import is off by default",
"back_to_choices": "Back to choices",
"psd2_title": "Connect bank",
"psd2_recommended": "Recommended",
+5
View File
@@ -7513,6 +7513,11 @@
"tab_import": "Importera",
"tab_export": "Exportera",
"sandbox_disabled": "Bankkoppling och migrering från andra system kräver ett riktigt konto och är avstängda i sandlådan. Filbaserad import (bankfiler, CSV/Excel och SIE) fungerar som vanligt.",
"ib_series_label": "Verifikationsserie för ingående balanser",
"ib_series_hint": "Välj en serie som inte används av verifikationerna i filen, annars förskjuts deras numrering",
"ib_series_in_file": "används i filen",
"ib_series_collision": "Serien används av verifikationerna i filen: IB-verifikationen tar seriens nästa nummer och filens numrering förskjuts ett steg",
"ib_exists_hint": "En verifikation för ingående balanser finns redan för det här räkenskapsåret, därför är importen av ingående balanser avstängd som standard",
"back_to_choices": "Tillbaka till val",
"psd2_title": "Koppla bank",
"psd2_recommended": "Rekommenderat",