Ga naar hoofdinhoud

Multi-administratie (accountant multi-client)

One HRMQ instance can carry multiple administraties (companies or clients) — the dominant Dutch payroll distribution channel, where one accountant's office runs payroll for many SMBs.

The tenant model

An Administration (name, KvK, loonheffingennummer) is the client record. AdministrationAccess is the membership — which user can act on which administratie, with a role (accountant/hr/employee). Every core HR/payroll object carries an optional, plain-string administrationId (the same convention PayrollRun already used — deliberately never a $ref, since the manifest filter grammar cannot reach a two-hop relationship from a record to its employee's administration).

Switching administration

Each user has a per-user active-administratie pointer, set and read through a guarded endpoint that refuses any administratie the caller has no AdministrationAccess row for — unknown or inaccessible both collapse to the same 404, so the switcher never leaks which administraties exist. The Configuratie › Administraties switcher drives it, and every administration-scoped list and detail page re-scopes to the active administratie automatically from the moment it is selected, with no page reload required.

A consistency rule (nl-administratie-scope-consistency, recommended severity) flags a child object whose administrationId disagrees with its parent's — vacuous when the field is absent, so a single-administratie install is entirely unaffected by this rule.

occ hrmq:rules:audit

Scoping is NOT a security boundary — read this before relying on it

This is the single most important thing to understand about multi-administratie: the active-administratie pointer and the per-page filtering it drives are a convenience scoping layer, not an isolation guarantee. OpenRegister still serves objects according to the app's own RBAC — and a user with register access can read across administraties via the API, regardless of which administratie is currently "active" in the UI.

Hard tenant isolation — per-administratie OpenRegister organisation ownership, so one client's data is genuinely inaccessible from another's context, not merely hidden by a filter — is a named security fast-follow, tracked separately. Do not rely on administratie scoping to keep one client's payroll data from another client's eyes in any environment where that separation actually matters; treat it as a UX convenience for an office that already trusts everyone with instance access, not as a tenant-isolation control.