Organization Settings
Data Entity
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.
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
Columns: organization_id
idx_organization_settings_updated_at
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
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
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
Only users with Organization Administrator or Global Administrator role can modify organization settings. Coordinators and Peer Mentors have read-only access
settings_changes_audited
Every modification to organization settings must produce an audit log entry recording the changed fields, previous values, actor, and timestamp
impact_multipliers_non_negative
All numeric values within impact_multipliers JSON must be non-negative. Negative hourly rates or multipliers are business-logic errors
accounting_provider_requires_credentials
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
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
Organization settings records cannot be deleted independently. They are only removed if the parent organization is fully decommissioned, which cascades from the organizations table