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.
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.
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).
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.
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.