Terminology Override
Data Entity
Description
Per-organization overrides for display strings and labels used throughout the Meander platform. Enables each tenant to substitute canonical terms (e.g. 'Contact', 'Peer Mentor', 'Coordinator') with organization-specific vocabulary (e.g. 'Familie', 'Bruker', 'Veileder') without code changes. Overrides are fetched at session bootstrap and cached offline on the mobile app.
Data Structure
| Name | Type | Description | Constraints |
|---|---|---|---|
id |
uuid |
Primary key — surrogate UUID for the override row | PKrequiredunique |
organization_id |
uuid |
Foreign key to the organization that owns this override. Each override is strictly scoped to one tenant. | required |
key |
string |
The canonical terminology key being overridden. Must be a value from the platform-defined key registry (e.g. 'contact', 'contacts', 'my_contacts', 'peer_mentor', 'peer_mentors', 'coordinator', 'activity', 'assignment', 'reimbursement'). Clients resolve labels by key at runtime. | required |
value |
string |
The replacement display string for this key within the owning organization. Must be non-empty. Example: key='contact', value='Familie' for Barnekreftforeningen. | required |
locale |
string |
BCP-47 locale tag for the override value. Defaults to 'nb' (Norwegian Bokmål). Future support for 'nn' (Nynorsk), 'en', and Sami ('se') planned. Allows separate overrides per locale for the same key. | required |
is_active |
boolean |
Soft-disable flag. When false the override is ignored and the platform default is used. Allows admins to preview or roll back terminology changes without deleting records. | required |
description |
text |
Optional free-text note explaining why this override exists (e.g. 'Barnekreftforeningen uses Familie instead of Contact to reflect their family-centred model'). Admin-facing only, never displayed to end users. | - |
created_at |
datetime |
UTC timestamp when the override was first created. | required |
updated_at |
datetime |
UTC timestamp of the most recent update to this row. | required |
created_by |
uuid |
FK to users.id — the Org Admin or Global Admin who created this override. Preserved for audit purposes even if the user is later deactivated. | required |
updated_by |
uuid |
FK to users.id — the Org Admin or Global Admin who last modified this override. | required |
Database Indexes
idx_terminology_overrides_org_key_locale
Columns: organization_id, key, locale
idx_terminology_overrides_organization_id
Columns: organization_id
idx_terminology_overrides_active
Columns: organization_id, is_active
Validation Rules
value_not_empty
error
Validation failed
value_max_length
error
Validation failed
locale_bcp47_format
error
Validation failed
key_snake_case_lowercase
error
Validation failed
description_max_length
error
Validation failed
Business Rules
unique_key_per_org_locale
Each (organization_id, key, locale) triplet must be unique. An organization cannot have two active values for the same display key in the same locale. Enforced by the unique index; the service layer surfaces a descriptive error when violated.
key_must_be_registered
The key field must match an entry in the platform's static terminology key registry. Keys outside the registry are rejected. This prevents unbounded key proliferation and ensures the mobile client can always resolve a label. The registry currently includes: contact, contacts, my_contacts, peer_mentor, peer_mentors, coordinator, coordinators, activity, activities, assignment, assignments, reimbursement.
org_scoped_write_access
Only Org Admins belonging to the owning organization, or Global Admins with active time-bounded support access for that organization, may create, update, or delete overrides. The service verifies the caller's organization membership and role before any write.
bootstrap_cache_invalidation
Any write to terminology_overrides for an organization must invalidate the bootstrap cache for all active sessions belonging to that organization, so the updated labels reach clients on their next token refresh without requiring a force-logout.
soft_disable_over_delete
Deleting a terminology override hard-deletes the row. Admins are encouraged to use is_active=false to disable an override rather than deleting it, preserving the audit trail and allowing easy re-activation. The UI presents this as a toggle rather than a delete action.
audit_all_writes
Every create, update, and delete on terminology_overrides must produce an entry in audit_logs with actor, organization_id, key, old_value, and new_value. Terminology changes affect every user in the organization and must be fully traceable.