Periodeafsluiting grootboek + mutatie-log 2026

Locked-through bewaking op (kantoor, klant) + append-only journal_mutation_log voor de NV COS 4410 audit-trail.

Een definitief vastgestelde periode (maand, kwartaal, boekjaar) mag niet meer worden gemuteerd. Taxmo Kantoor implementeert dit als een database-side regel: per (office, client) wordt een locked_through datum bewaard; elke INSERT/UPDATE/DELETE op journal_entries met entry_date <= locked_through krijgt HTTP 409 PERIOD_LOCKED. Elke gemuteerde regel wordt bovendien append-only vastgelegd in journal_mutation_log met before-/after-JSON, actor, en tijdstempel - onmisbaar voor de NV COS 4410-samenstellingsverklaring en de Wwft-audit-trail.

Hoe werkt het period-lock?

Het kantoor maakt een rij in office_period_locks aan met (office_id, office_client_id, locked_through, locked_by, reason). De helper isPeriodLockedFor() resolveert het office_client op twee manieren: (a) expliciet via de officeClientId in de request body - gebruikt door kantoor-side schrijvers die de klant bij id kennen, en (b) impliciet via office_clients.client_user_id = userId - gebruikt door de act-as-flow waarin een kantoor-medewerker namens een klant inboekt. De write-paden POST/DELETE /api/journal-entries en de PSD2-approve route raadplegen de helper en geven 409/423 met de lockedThrough-datum terug zodat de UI duidelijk kan aangeven welke periode eerst ontgrendeld moet worden.

Wat zit er in de mutatie-log?

Elke create/update/delete op een journal_entry schrijft een rij naar journal_mutation_log met: journal_entry_id, actor_user_id (de echte staffer, niet de impersonated client), action (create | update | delete | post | void), before_json (volledige snapshot van de rij voor de wijziging, NULL bij create) en after_json (nieuwe snapshot, NULL bij delete). Het audit-paneel in de kantoor-UI toont de laatste 200 mutaties per entry; de retentie volgt de fiscale 84-maandentermijn (AWR art. 52) plus AVG art. 5 lid 1 onder e (opslagbeperking).

Kostenplaatsen en dimensies

Journal_lines is uitgebreid met drie kolommen: cost_center (kostendrager - projectcode, afdeling), dimension1 en dimension2 (vrije analyse-as voor bijvoorbeeld merk, regio, productcategorie). Idempotent toegevoegd via ALTER TABLE ADD COLUMN IF NOT EXISTS; pre-existing rijen behouden NULL. Een partial index op cost_center (WHERE cost_center IS NOT NULL) ondersteunt de per-kostendrager rapportage zonder de hoofdindex op (entry_id) te belasten.

Hoe ontgrendelt een kantoor een periode?

DELETE /api/kantoor/period-locks/:clientId wist de lock-rij. Alleen rollen met write-permissie (eigenaar of staff met permissions=admin/write) mogen ontgrendelen; de mutatie wordt vastgelegd in audit_log met action='period_lock.remove'. Het is een bewuste keuze om geen ondertekend bestand of MFA-prompt te vereisen - de mutatie-log van eventuele wijzigingen na ontgrendeling levert de juridische trail.

Veelgestelde vragen

Welke HTTP-status geeft Taxmo terug bij een vergrendelde periode?
POST /api/journal-entries: 409 PERIOD_LOCKED met de lockedThrough-datum in de body. POST /api/kantoor/workspace/:clientId/bank-transactions/:txId/approve: 423 Locked. Beide bevatten code='PERIOD_LOCKED' en lockedThrough zodat de frontend de juiste melding kan tonen.
Hoe lang blijft de mutatie-log bewaard?
Tenminste 84 maanden (Algemene wet inzake rijksbelastingen art. 52 - fiscale bewaarplicht). De AVG art. 5 lid 1 onder e (opslagbeperking) is de bovengrens; voor gegevens over onroerende zaken geldt 120 maanden (10 jaar).
Kan een kantoor-medewerker met read-only permissie de lock omzeilen?
Nee. De DELETE-route is gegated door requireKantoorWrite - staff met permissions='read' krijgt 403 KANTOOR_READ_ONLY. Bovendien checken zowel het kantoor-side journal-write pad als de PSD2-approve pad de lock voordat een mutatie wordt toegestaan.
Bewaart Taxmo de IBAN van counterparties in de mutatie-log?
Ja, in de before_json/after_json. De DB-encryptie at-rest dekt de kolom; de PII-toegang via de UI volgt het officemate-RBAC-model. PSD2-aanvragen verlopen via Ponto (Ibanity) - Taxmo bewaart de IBAN niet onversleuteld in logs.