configuration PK: id 12 required 2 unique

Description

Stores per-organization configuration including branding, terminology overrides, regional preferences, sensitive field policies, impact multipliers, and support contact details. Each organization has exactly one settings record that controls platform behavior for all users within that tenant.

27
Attributes
2
Indexes
11
Validation Rules
31
CRUD Operations

Data Structure

Name Type Description Constraints
id uuid Primary key, unique identifier for the settings record
PKrequiredunique
organization_id uuid Foreign key to the organizations table. Enforces one-to-one relationship — each organization has exactly one settings record
requiredunique
display_name string Organization display name shown in UI headers, reports, and certificates. May differ from the legal entity name in the organizations table
-
logo_url string URL to the uploaded organization logo stored in cloud storage. Used in certificates, reports, and branding across mobile and admin portal
-
contact_email string Organization-level support contact email displayed on the Contact Us screen and used for support request routing
-
contact_phone string Organization-level support contact phone number for the Contact Us screen tel: deep link
-
default_language enum Default locale for the organization, applied to new users and as fallback when user has no preference set
required
timezone string IANA timezone identifier for the organization, used in report date boundaries and activity timestamp display
required
currency string ISO 4217 currency code used for expense amounts, reimbursements, and financial reports
required
terminology_overrides json JSONB map of platform default labels to organization-specific terminology. Keys are platform label keys, values are override strings. Example: {"peer_mentor": "Likeperson", "contact": "Bruker"}. Missing keys fall back to platform defaults
-
sensitive_fields json JSONB array of field IDs that should trigger a screen reader warning before readout. Controls the Sensitive Field Readout Warning feature per organization. Example: ["contact.address", "contact.health_summary", "assignment.epikrise"]
-
impact_multipliers json JSONB object containing organization-specific hourly rates and impact calculation multipliers for the Advantage Calculator. Example: {"hourly_rate_nok": 300, "cost_per_km_nok": 3.50, "social_value_multiplier": 1.5}
-
support_config json JSONB object defining support contact options, helpdesk routing webhooks, and available contact methods per organization. Example: {"methods": ["email", "phone"], "helpdesk_webhook_url": null}
-
expense_auto_approve_enabled boolean Master toggle for whether auto-approval rules are evaluated for this organization's expenses. When false, all expenses require manual review regardless of auto-approval rule configuration
required
require_activity_approval boolean Whether submitted activities require coordinator/admin approval before counting toward statistics and reports
required
default_activity_duration_minutes integer Default pre-filled duration in minutes for quick activity logging. Workshop consensus was 30 minutes as the standard default
required
bufdir_reporting_enabled boolean Whether Bufdir report generation and export features are available for this organization. All four pilot organizations require this
required
bufdir_organization_code string Organization identifier used in Bufdir report submissions for grant tracking
-
accounting_provider enum Configured external accounting system for expense export integration. Xledger for Blindeforbundet, dynamics for HLF
-
external_portal_enabled boolean Whether bidirectional sync with an external member portal (e.g., HLF Dynamics 'Min Side') is active
required
max_expense_auto_approve_nok decimal Maximum expense amount in NOK that can be auto-approved. Claims above this always require manual review. HLF uses distance-based thresholds (50 km), converted to monetary equivalent here
-
receipt_required_threshold_nok decimal Expense amount above which a receipt photo attachment is mandatory. HLF requires receipts above 100 NOK
-
assignment_threshold_config json JSONB defining honorarium tiers triggered by assignment count. Blindeforbundet: office honorarium at 3rd assignment, higher rate at 15th. Example: {"tiers": [{"count": 3, "label": "Kontorhonorar", "rate_nok": 500}, {"count": 15, "label": "Høy sats", "rate_nok": 1000}]}
-
notification_defaults json JSONB defining default notification preferences for new users in this organization, including enabled channels and scenario opt-ins
-
created_at datetime Timestamp when the settings record was created, set on organization initialization
required
updated_at datetime Timestamp of the last settings modification, updated automatically on every change for cache invalidation
required
updated_by uuid Foreign key to users table identifying who last modified the settings. Used for audit trail
-

Database Indexes

idx_organization_settings_org_id
btree unique

Columns: organization_id

idx_organization_settings_updated_at
btree

Columns: updated_at

Validation Rules

valid_organization_reference error

Validation failed

valid_email_format error

Validation failed

valid_logo_url error

Validation failed

terminology_overrides_valid_keys warning

Validation failed

terminology_overrides_non_empty_values error

Validation failed

sensitive_fields_valid_identifiers error

Validation failed

impact_multipliers_schema_valid error

Validation failed

default_activity_duration_range error

Validation failed

expense_thresholds_non_negative error

Validation failed

assignment_threshold_config_schema error

Validation failed

timezone_valid_iana error

Validation failed

Business Rules

one_settings_per_organization
on_create

Each organization has exactly one settings record. Attempting to create a second record for the same organization must be rejected. Settings are created automatically during organization onboarding

terminology_override_fallback
always

When a terminology key is not present in terminology_overrides, the platform default label must be used. The merge happens at read time, not at write time, so platform defaults can evolve independently

settings_change_requires_admin_role
on_update

Only users with Organization Administrator or Global Administrator role can modify organization settings. Coordinators and Peer Mentors have read-only access

settings_changes_audited
on_update

Every modification to organization settings must produce an audit log entry recording the changed fields, previous values, actor, and timestamp

impact_multipliers_non_negative
on_update

All numeric values within impact_multipliers JSON must be non-negative. Negative hourly rates or multipliers are business-logic errors

accounting_provider_requires_credentials
on_update

Setting accounting_provider to a value other than 'none' requires valid encrypted credentials to be stored in the accounting credentials store before export operations can execute

sensitive_fields_propagate_to_mobile
on_update

Changes to the sensitive_fields array must be synced to mobile clients on next app launch or background sync so the Sensitive Field Readout Warning widget uses current configuration

settings_not_deletable
on_delete

Organization settings records cannot be deleted independently. They are only removed if the parent organization is fully decommissioned, which cascades from the organizations table

Enforced by: Organization Service

Storage Configuration

Storage Type
primary_table
Location
main_db
Partitioning
No Partitioning
Retention
Permanent Storage

Components Managing This Entity

service Profile Service ["mobile"] service Profile Service ["mobile"] ui Profile Settings Screen ["mobile"] ui Profile Settings Screen ["mobile"] data Accounting Configuration Store ["backend"] service Notification Settings Service ["mobile"] service Notification Settings Service ["mobile"] data Impact Multiplier Store ["mobile"] service Impact Calculator Service ["mobile"] service Impact Calculator Service ["mobile"] data Sensitive Field Config Store ["mobile"] data Sensitive Field Config Store ["mobile"] service Readout Warning Service ["mobile"] service Readout Warning Service ["mobile"] service Support Service ["mobile","backend"] service Support Service ["backend"] data Local SQLite Database ["mobile"] data Local SQLite Database ["mobile"] service Offline Manager ["mobile"] service Offline Manager ["mobile"] service Audit Log Service ["backend"] service Audit Log Service ["backend"] service Auto-Approval Rule Engine ["backend"] service Auto-Approval Rule Engine ["backend"] data Organization Config Store ["backend"] data Organization Config Store ["backend"] service Organization Service ["backend"] service Organization Service ["backend"] ui Organization Settings Page ["frontend"] ui Organization Settings Page ["frontend"] data Terminology Store ["backend"] service Terminology Service ["backend"] service Terminology Service ["backend"] ui Terminology Config Page ["frontend"] ui Terminology Config Page ["frontend"] service Feature Flag Service ["backend"] service Feature Flag Service ["backend"] ui Integration Settings Page ["frontend"] ui Integration Settings Page ["frontend"] data Accounting Credential Store ["backend"] service Accounting API Service ["backend"] service Accounting API Service ["backend"] service Accounting Mapping Service ["backend"] service Audit Log Service ["backend"] service Audit Log Service ["backend"] service Impact Calculator Service ["frontend"] service Impact Calculator Service ["frontend"]