feat(reconciliation,bokslut): underlag on a balansdag + persisted closing checklist (Reko bilagor, PR 2 + PR 3) (#1873)

* feat(reconciliation): underlag on a balansdag, the files behind a sign-off (Reko bilagor, PR 2)

A konsult attaches the kontoutdrag, engagemangsbesked or reskontralista an
account was reconciled against to (account_key, through_date), before or
after the sign-off, from every account body on the Avstämning page. Rows
live in account_reconciliation_attachments (append-only, removal stamp by
trigger, RLS like account_reconciliations), bytes in the documents bucket
under the company prefix so its RLS applies unchanged, and the full
archive copies them into bilagor/ with a hash manifest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvFveUpbdPBXdm7f5FEYoz

* fix(reconciliation): literal selects and payload in the attachments store so the phantom-column scanner can read them

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvFveUpbdPBXdm7f5FEYoz

* feat(bokslut): persisted closing checklist and missing-fiscal-year warning (Reko bilagor, PR 3) (#1867)

* feat(bokslut): persisted closing checklist and missing-fiscal-year warning (Reko bilagor, PR 3)

The bokslut checklist is a catalogue in code with one state row per period
(bokslut_checklist_items): the steps the system can judge (sign-offs through
balansdagen, reskontra tie-outs, drafts, voucher gaps, trial balance) are
computed live and a stored row only overrides them; the manual steps are
the konsult's ticks, with who and when. It sits on the wizard's Kontroll
step and is dumped into the full archive.

A hole between fiscal years (one-file SIE migrations) is now named on the
bokslut readiness screen and on the import result screen, where the next
file is one click away. Non-adjacent period links are #1849's fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvFveUpbdPBXdm7f5FEYoz

* fix(bokslut): count unexplained voucher gaps, literal select and payload for the checklist store

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvFveUpbdPBXdm7f5FEYoz

---------

Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-08-25 09:34:05 +02:00
committed by GitHub
co-authored by Claude Fable 5 Jakob Wennberg
parent ebbdf96b74
commit c62321988b
30 changed files with 2642 additions and 1 deletions
+35
View File
@@ -8056,5 +8056,40 @@
"settings_toggle_help": "Shows the driving log in the menu. There you log business trips and book tax-free mileage allowance at the statutory rate.",
"settings_save_failed_title": "Could not save the setting",
"settings_open_page": "Open the driving log"
},
"reconciliation_underlag": {
"heading": "Supporting documents",
"heading_dated": "Supporting documents as of {date}",
"attach": "Attach document",
"empty": "No supporting documents for this date. Attach the bank statement, engagement letter or other specification the account was reconciled against.",
"remove": "Remove",
"attached": "{name} attached",
"removed": "{name} removed. The file stays in the archive with a note about the removal.",
"upload_failed": "Could not attach the document",
"remove_failed": "Could not remove the document",
"too_large_title": "The file is too large"
},
"bokslut_checklist": {
"heading": "Closing checklist",
"progress": "{done} of {total} done",
"group_avstamning": "Reconciliations",
"group_periodisering": "Accruals",
"group_vardering": "Valuation",
"group_dispositioner": "Appropriations and tax",
"group_kontroll": "Controls",
"group_rapportering": "Reporting",
"auto_chip": "computed",
"done_at": "done {date}",
"open": "Open",
"reopen": "Reopen",
"not_applicable": "Not applicable",
"use_auto": "Let the system decide",
"save_failed": "Could not save the checklist"
},
"fiscal_year_gaps": {
"title": "{count, plural, one {One fiscal year is missing} other {# fiscal years are missing}}",
"gap": "{from} to {to} (between {after} and {before})",
"hint": "Import the SIE file for that year, or create the fiscal year manually, so balances roll forward.",
"manage": "Manage fiscal years"
}
}
+35
View File
@@ -8056,5 +8056,40 @@
"settings_toggle_help": "Visar körjournalen i menyn. Där loggar du tjänsteresor och bokför milersättning skattefritt enligt schablon.",
"settings_save_failed_title": "Kunde inte spara inställningen",
"settings_open_page": "Öppna körjournalen"
},
"reconciliation_underlag": {
"heading": "Underlag",
"heading_dated": "Underlag per {date}",
"attach": "Bifoga underlag",
"empty": "Inget underlag bifogat för det här datumet. Bifoga kontoutdrag, engagemangsbesked eller annan specifikation som kontot stämts av mot.",
"remove": "Ta bort",
"attached": "{name} bifogad",
"removed": "{name} borttagen. Filen finns kvar i arkivet med en notering om borttagningen.",
"upload_failed": "Kunde inte bifoga underlaget",
"remove_failed": "Kunde inte ta bort underlaget",
"too_large_title": "Filen är för stor"
},
"bokslut_checklist": {
"heading": "Bokslutschecklista",
"progress": "{done} av {total} klara",
"group_avstamning": "Avstämningar",
"group_periodisering": "Periodiseringar",
"group_vardering": "Värdering",
"group_dispositioner": "Dispositioner och skatt",
"group_kontroll": "Kontroller",
"group_rapportering": "Rapportering",
"auto_chip": "beräknas",
"done_at": "klart {date}",
"open": "Öppna",
"reopen": "Öppna igen",
"not_applicable": "Ej tillämpligt",
"use_auto": "Låt systemet bedöma",
"save_failed": "Kunde inte spara checklistan"
},
"fiscal_year_gaps": {
"title": "{count, plural, one {Ett räkenskapsår saknas} other {# räkenskapsår saknas}}",
"gap": "{from} till {to} (mellan {after} och {before})",
"hint": "Importera SIE-filen för det året, eller skapa räkenskapsåret manuellt, så att balanserna rullar fram.",
"manage": "Hantera räkenskapsår"
}
}