Setting.create_if_not_exists(
  title: 'Application secret',
  name: 'application_secret',
  area: 'Core',
  description: 'Defines the random application secret.',
  options: {},
  state: SecureRandom.hex(128),
  preferences: {
    permission: ['admin'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'System Init Done',
  name: 'system_init_done',
  area: 'Core',
  description: 'Defines if application is in init mode.',
  options: {},
  state: false,
  preferences: { online_service_disable: true },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'App Version',
  name: 'app_version',
  area: 'Core::WebApp',
  description: 'Only used internally to propagate current web app version to clients.',
  options: {},
  state: '',
  preferences: { online_service_disable: true },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Maintenance Mode',
  name: 'maintenance_mode',
  area: 'Core::WebApp',
  description: 'Enable or disable the maintenance mode of Zammad. If enabled, all non-administrators get logged out and only administrators can start a new session.',
  options: {},
  state: false,
  preferences: {
    permission: ['admin.maintenance'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Maintenance Login',
  name: 'maintenance_login',
  area: 'Core::WebApp',
  description: 'Put a message on the login page. To change it, click on the text area below and change it inline.',
  options: {},
  state: false,
  preferences: {
    permission: ['admin.maintenance'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Maintenance Login',
  name: 'maintenance_login_message',
  area: 'Core::WebApp',
  description: 'Message for login page.',
  options: {},
  state: 'Something about to share. Click here to change.',
  preferences: {
    permission: ['admin.maintenance'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Developer System',
  name: 'developer_mode',
  area: 'Core::Develop',
  description: 'Defines if application is in developer mode (useful for developer, all users have the same password, password reset will work without email delivery).',
  options: {},
  state: false,
  preferences: { online_service_disable: true },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Online Service',
  name: 'system_online_service',
  area: 'Core',
  description: 'Defines if application is used as online service.',
  options: {},
  state: false,
  preferences: { online_service_disable: true },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Product Name',
  name: 'product_name',
  area: 'System::Branding',
  description: 'Defines the name of the application, shown in the web interface, tabs and title bar of the web browser.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'product_name',
        tag: 'input',
      },
    ],
  },
  preferences: {
    render: true,
    prio: 1,
    placeholder: true,
    permission: ['admin.branding'],
  },
  state: 'Zammad Helpdesk',
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Logo',
  name: 'product_logo',
  area: 'System::Branding',
  description: 'Defines the logo of the application, shown in the web interface.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'product_logo',
        tag: 'input',
      },
    ],
  },
  preferences: {
    prio: 3,
    controller: 'SettingsAreaLogo',
    permission: ['admin.branding'],
  },
  state: 'logo.svg',
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Organization',
  name: 'organization',
  area: 'System::Branding',
  description: 'Will be shown in the app and is included in email footers.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'organization',
        tag: 'input',
      },
    ],
  },
  state: '',
  preferences: {
    prio: 2,
    placeholder: true,
    permission: ['admin.branding'],
  },
  frontend: true
)
Setting.create_or_update(
  title: 'Pretty Date',
  name: 'pretty_date_format',
  area: 'System::Branding',
  description: 'Defines pretty date format.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'pretty_date_format',
        tag: 'select',
        options: {
          'relative': 'relative - e. g. "2 hours ago" or "2 days and 15 minutes ago"',
          'absolute': 'absolute - e. g. "Monday 09:30" or "Tuesday 23. Feb 14:20"',
        },
      },
    ],
  },
  preferences: {
    render: true,
    prio: 10,
    permission: ['admin.branding'],
  },
  state: 'relative',
  frontend: true
)
options = {}
(10..99).each { |item|
  options[item] = item
}
system_id = rand(10..99)
Setting.create_if_not_exists(
  title: 'SystemID',
  name: 'system_id',
  area: 'System::Base',
  description: 'Defines the system identifier. Every ticket number contains this ID. This ensures that only tickets which belong to your system will be processed as follow-ups (useful when communicating between two instances of Zammad).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'system_id',
        tag: 'select',
        options: options,
      },
    ],
  },
  state: system_id,
  preferences: {
    online_service_disable: true,
    placeholder: true,
    authentication: true,
    permission: ['admin.system'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Fully Qualified Domain Name',
  name: 'fqdn',
  area: 'System::Base',
  description: 'Defines the fully qualified domain name of the system. This setting is used as a variable, #{setting.fqdn} which is found in all forms of messaging used by the application, to build links to the tickets within your system.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'fqdn',
        tag: 'input',
      },
    ],
  },
  state: 'zammad.example.com',
  preferences: {
    online_service_disable: true,
    placeholder: true,
    permission: ['admin.system'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Websocket port',
  name: 'websocket_port',
  area: 'System::WebSocket',
  description: 'Defines the port of the websocket server.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'websocket_port',
        tag: 'input',
      },
    ],
  },
  state: '6042',
  preferences: { online_service_disable: true },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'HTTP type',
  name: 'http_type',
  area: 'System::Base',
  description: 'Define the http protocol of your instance.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'http_type',
        tag: 'select',
        options: {
          'https' => 'https',
          'http'  => 'http',
        },
      },
    ],
  },
  state: 'http',
  preferences: {
    online_service_disable: true,
    placeholder: true,
    permission: ['admin.system'],
  },
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Storage Mechanism',
  name: 'storage_provider',
  area: 'System::Storage',
  description: '"Database" stores all attachments in the database (not recommended for storing large amounts of data). "Filesystem" stores the data in the filesystem. You can switch between the modules even on a system that is already in production without any loss of data.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'storage_provider',
        tag: 'select',
        tranlate: true,
        options: {
          'DB' => 'Database',
          'File' => 'Filesystem',
        },
      },
    ],
  },
  state: 'DB',
  preferences: {
    controller: 'SettingsAreaStorageProvider',
    online_service_disable: true,
    permission: ['admin.system'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Image Service',
  name: 'image_backend',
  area: 'System::Services',
  description: 'Defines the backend for user and organization image lookups.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'image_backend',
        tag: 'select',
        options: {
          '' => '-',
          'Service::Image::Zammad' => 'Zammad Image Service',
        },
      },
    ],
  },
  state: 'Service::Image::Zammad',
  preferences: {
    prio: 1,
    permission: ['admin.system'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Geo IP Service',
  name: 'geo_ip_backend',
  area: 'System::Services',
  description: 'Defines the backend for geo IP lookups. Shows also location of an IP address if an IP address is shown.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'geo_ip_backend',
        tag: 'select',
        options: {
          '' => '-',
          'Service::GeoIp::Zammad' => 'Zammad GeoIP Service',
        },
      },
    ],
  },
  state: 'Service::GeoIp::Zammad',
  preferences: {
    prio: 2,
    permission: ['admin.system'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Geo Location Service',
  name: 'geo_location_backend',
  area: 'System::Services',
  description: 'Defines the backend for geo location lookups to store geo locations for addresses.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'geo_location_backend',
        tag: 'select',
        options: {
          '' => '-',
          'Service::GeoLocation::Gmaps' => 'Google Maps',
        },
      },
    ],
  },
  state: 'Service::GeoLocation::Gmaps',
  preferences: {
    prio: 3,
    permission: ['admin.system'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Geo Calendar Service',
  name: 'geo_calendar_backend',
  area: 'System::Services',
  description: 'Defines the backend for geo calendar lookups. Used for initial calendar succession.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'geo_calendar_backend',
        tag: 'select',
        options: {
          '' => '-',
          'Service::GeoCalendar::Zammad' => 'Zammad GeoCalendar Service',
        },
      },
    ],
  },
  state: 'Service::GeoCalendar::Zammad',
  preferences: {
    prio: 2,
    permission: ['admin.system'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Proxy Settings',
  name: 'proxy',
  area: 'System::Network',
  description: 'Address of the proxy server for http and https resources.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'proxy',
        tag: 'input',
        placeholder: 'proxy.example.com:3128',
      },
    ],
  },
  state: '',
  preferences: {
    online_service_disable: true,
    controller: 'SettingsAreaProxy',
    prio: 1,
    permission: ['admin.system'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Proxy User',
  name: 'proxy_username',
  area: 'System::Network',
  description: 'Username for proxy connection.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'proxy_username',
        tag: 'input',
      },
    ],
  },
  state: '',
  preferences: {
    disabled: true,
    online_service_disable: true,
    prio: 2,
    permission: ['admin.system'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Proxy Password',
  name: 'proxy_password',
  area: 'System::Network',
  description: 'Password for proxy connection.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'proxy_password',
        tag: 'input',
      },
    ],
  },
  state: '',
  preferences: {
    disabled: true,
    online_service_disable: true,
    prio: 3,
    permission: ['admin.system'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'No Proxy',
  name: 'proxy_no',
  area: 'System::Network',
  description: 'No proxy for the following hosts.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'proxy_no',
        tag: 'input',
      },
    ],
  },
  state: 'localhost,127.0.0.0,::1',
  preferences: {
    disabled: true,
    online_service_disable: true,
    prio: 4,
    permission: ['admin.system'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Send client stats',
  name: 'ui_send_client_stats',
  area: 'System::UI',
  description: 'Send client stats/error message to central server to improve the usability.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ui_send_client_stats',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 1,
    permission: ['admin.system'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Client storage',
  name: 'ui_client_storage',
  area: 'System::UI',
  description: 'Use client storage to cache data to enhance performance of application.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ui_client_storage',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 2,
    permission: ['admin.system'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Note - default visibility',
  name: 'ui_ticket_zoom_article_note_new_internal',
  area: 'UI::TicketZoom',
  description: 'Default visibility for new note.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ui_ticket_zoom_article_note_new_internal',
        tag: 'boolean',
        translate: true,
        options: {
          true  => 'internal',
          false => 'public',
        },
      },
    ],
  },
  state: true,
  preferences: {
    prio: 100,
    permission: ['admin.ui'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Email - subject field',
  name: 'ui_ticket_zoom_article_email_subject',
  area: 'UI::TicketZoom',
  description: 'Use subject field for emails. If disabled, the ticket title will be used as subject.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ui_ticket_zoom_article_email_subject',
        tag: 'boolean',
        translate: true,
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 200,
    permission: ['admin.ui'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Email - full quote',
  name: 'ui_ticket_zoom_article_email_full_quote',
  area: 'UI::TicketZoom',
  description: 'Enable if you want to quote the full email in your answer. The quoted email will be put at the end of your answer. If you just want to quote a certain phrase, just mark the text and press reply (this feature is always available).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ui_ticket_zoom_article_email_full_quote',
        tag: 'boolean',
        translate: true,
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 220,
    permission: ['admin.ui'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Twitter - tweet initials',
  name: 'ui_ticket_zoom_article_twitter_initials',
  area: 'UI::TicketZoom',
  description: 'Add sender initials to end of a tweet.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ui_ticket_zoom_article_twitter_initials',
        tag: 'boolean',
        translate: true,
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    prio: 300,
    permission: ['admin.ui'],
  },
  frontend: true
)

Setting.create_if_not_exists(
  title: 'New User Accounts',
  name: 'user_create_account',
  area: 'Security::Base',
  description: 'Enables users to create their own account via web interface.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'user_create_account',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    permission: ['admin.security'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Lost Password',
  name: 'user_lost_password',
  area: 'Security::Base',
  description: 'Activates lost password feature for users.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'user_lost_password',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    permission: ['admin.security'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'User email for muliple users',
  name: 'user_email_multiple_use',
  area: 'Model::User',
  description: 'Allow to use email address for muliple users.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'user_email_multiple_use',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    permission: ['admin'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_ldap',
  area: 'Security::Authentication',
  description: 'Enables user authentication via %s.',
  preferences: {
    title_i18n: ['LDAP'],
    description_i18n: ['LDAP'],
    permission: ['admin.security'],
  },
  state: {
    adapter: 'Auth::Ldap',
    host: 'localhost',
    port: 389,
    bind_dn: 'cn=Manager,dc=example,dc=org',
    bind_pw: 'example',
    uid: 'mail',
    base: 'dc=example,dc=org',
    always_filter: '',
    always_roles: %w(Admin Agent),
    always_groups: ['Users'],
    sync_params: {
      firstname: 'sn',
      lastname: 'givenName',
      email: 'mail',
      login: 'mail',
    },
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_twitter',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_twitter',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_twitter_credentials'],
    title_i18n: ['Twitter'],
    description_i18n: ['Twitter', 'Twitter Developer Site', 'https://dev.twitter.com/apps'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Twitter App Credentials',
  name: 'auth_twitter_credentials',
  area: 'Security::ThirdPartyAuthentication::Twitter',
  description: 'App credentials for Twitter.',
  options: {
    form: [
      {
        display: 'Twitter Key',
        null: true,
        name: 'key',
        tag: 'input',
      },
      {
        display: 'Twitter Secret',
        null: true,
        name: 'secret',
        tag: 'input',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_facebook',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_facebook',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_facebook_credentials'],
    title_i18n: ['Facebook'],
    description_i18n: ['Facebook', 'Facebook Developer Site', 'https://developers.facebook.com/apps/'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Facebook App Credentials',
  name: 'auth_facebook_credentials',
  area: 'Security::ThirdPartyAuthentication::Facebook',
  description: 'App credentials for Facebook.',
  options: {
    form: [
      {
        display: 'App ID',
        null: true,
        name: 'app_id',
        tag: 'input',
      },
      {
        display: 'App Secret',
        null: true,
        name: 'app_secret',
        tag: 'input',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_google_oauth2',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_google_oauth2',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_google_oauth2_credentials'],
    title_i18n: ['Google'],
    description_i18n: ['Google', 'Google API Console Site', 'https://console.developers.google.com/apis/credentials'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Google App Credentials',
  name: 'auth_google_oauth2_credentials',
  area: 'Security::ThirdPartyAuthentication::Google',
  description: 'Enables user authentication via Google.',
  options: {
    form: [
      {
        display: 'Client ID',
        null: true,
        name: 'client_id',
        tag: 'input',
      },
      {
        display: 'Client Secret',
        null: true,
        name: 'client_secret',
        tag: 'input',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_linkedin',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_linkedin',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_linkedin_credentials'],
    title_i18n: ['LinkedIn'],
    description_i18n: ['LinkedIn', 'Linkedin Developer Site', 'https://www.linkedin.com/developer/apps'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'LinkedIn App Credentials',
  name: 'auth_linkedin_credentials',
  area: 'Security::ThirdPartyAuthentication::Linkedin',
  description: 'Enables user authentication via LinkedIn.',
  options: {
    form: [
      {
        display: 'App ID',
        null: true,
        name: 'app_id',
        tag: 'input',
      },
      {
        display: 'App Secret',
        null: true,
        name: 'app_secret',
        tag: 'input',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_github',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_github',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_github_credentials'],
    title_i18n: ['Github'],
    description_i18n: ['Github', 'Github OAuth Applications', 'https://github.com/settings/applications'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Github App Credentials',
  name: 'auth_github_credentials',
  area: 'Security::ThirdPartyAuthentication::Github',
  description: 'Enables user authentication via Github.',
  options: {
    form: [
      {
        display: 'App ID',
        null: true,
        name: 'app_id',
        tag: 'input',
      },
      {
        display: 'App Secret',
        null: true,
        name: 'app_secret',
        tag: 'input',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_gitlab',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_gitlab',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_gitlab_credentials'],
    title_i18n: ['Gitlab'],
    description_i18n: ['Gitlab', 'Gitlab Applications', 'https://your-gitlab-host/admin/applications'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Gitlab App Credentials',
  name: 'auth_gitlab_credentials',
  area: 'Security::ThirdPartyAuthentication::Gitlab',
  description: 'Enables user authentication via Gitlab.',
  options: {
    form: [
      {
        display: 'App ID',
        null: true,
        name: 'app_id',
        tag: 'input',
      },
      {
        display: 'App Secret',
        null: true,
        name: 'app_secret',
        tag: 'input',
      },
      {
        display: 'Site',
        null: true,
        name: 'site',
        tag: 'input',
        placeholder: 'https://gitlab.YOURDOMAIN.com',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_microsoft_office365',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via %s. Register your app first at [%s](%s).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_microsoft_office365',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_microsoft_office365_credentials'],
    title_i18n: ['Office 365'],
    description_i18n: ['Office 365', 'Microsoft Application Registration Portal', 'https://apps.dev.microsoft.com'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Office 365 App Credentials',
  name: 'auth_microsoft_office365_credentials',
  area: 'Security::ThirdPartyAuthentication::Office365',
  description: 'Enables user authentication via Office 365.',
  options: {
    form: [
      {
        display: 'App ID',
        null: true,
        name: 'app_id',
        tag: 'input',
      },
      {
        display: 'App Secret',
        null: true,
        name: 'app_secret',
        tag: 'input',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Authentication via %s',
  name: 'auth_oauth2',
  area: 'Security::ThirdPartyAuthentication',
  description: 'Enables user authentication via generic OAuth2. Register your app first.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'auth_oauth2',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    controller: 'SettingsAreaSwitch',
    sub: ['auth_oauth2_credentials'],
    title_i18n: ['Generic OAuth2'],
    permission: ['admin.security'],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Generic OAuth2 App Credentials',
  name: 'auth_oauth2_credentials',
  area: 'Security::ThirdPartyAuthentication::GenericOAuth',
  description: 'Enables user authentication via generic OAuth2.',
  options: {
    form: [
      {
        display: 'Name',
        null: true,
        name: 'name',
        tag: 'input',
        placeholder: 'Some Provider Name',
      },
      {
        display: 'App ID',
        null: true,
        name: 'app_id',
        tag: 'input',
      },
      {
        display: 'App Secret',
        null: true,
        name: 'app_secret',
        tag: 'input',
      },
      {
        display: 'Site',
        null: true,
        name: 'site',
        tag: 'input',
        placeholder: 'https://oauth.YOURDOMAIN.com',
      },
      {
        display: 'authorize_url',
        null: true,
        name: 'authorize_url',
        tag: 'input',
        placeholder: '/oauth/authorize',
      },
      {
        display: 'token_url',
        null: true,
        name: 'token_url',
        tag: 'input',
        placeholder: '/oauth/token',
      },
    ],
  },
  state: {},
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Minimum length',
  name: 'password_min_size',
  area: 'Security::Password',
  description: 'Password needs to have at least a minimal number of characters.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'password_min_size',
        tag: 'select',
        options: {
          4 => ' 4',
          5 => ' 5',
          6 => ' 6',
          7 => ' 7',
          8 => ' 8',
          9 => ' 9',
          10 => '10',
          11 => '11',
          12 => '12',
          13 => '13',
          14 => '14',
          15 => '15',
          16 => '16',
          17 => '17',
          18 => '18',
          19 => '19',
          20 => '20',
        },
      },
    ],
  },
  state: 6,
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: '2 lower and 2 upper characters',
  name: 'password_min_2_lower_2_upper_characters',
  area: 'Security::Password',
  description: 'Password needs to contain 2 lower and 2 upper characters.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'password_min_2_lower_2_upper_characters',
        tag: 'select',
        options: {
          1 => 'yes',
          0 => 'no',
        },
      },
    ],
  },
  state: 0,
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Digit required',
  name: 'password_need_digit',
  area: 'Security::Password',
  description: 'Password needs to contain at least one digit.',
  options: {
    form: [
      {
        display: 'Needed',
        null: true,
        name: 'password_need_digit',
        tag: 'select',
        options: {
          1 => 'yes',
          0 => 'no',
        },
      },
    ],
  },
  state: 1,
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Maximum failed logins',
  name: 'password_max_login_failed',
  area: 'Security::Password',
  description: 'Number of failed logins after account will be deactivated.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'password_max_login_failed',
        tag: 'select',
        options: {
          4 => ' 4',
          5 => ' 5',
          6 => ' 6',
          7 => ' 7',
          8 => ' 8',
          9 => ' 9',
          10 => '10',
          11 => '11',
          13 => '13',
          14 => '14',
          15 => '15',
          16 => '16',
          17 => '17',
          18 => '18',
          19 => '19',
          20 => '20',
        },
      },
    ],
  },
  state: 10,
  preferences: {
    permission: ['admin.security'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Ticket Hook',
  name: 'ticket_hook',
  area: 'Ticket::Base',
  description: 'The identifier for a ticket, e. g. Ticket#, Call#, MyTicket#. The default is Ticket#.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'ticket_hook',
        tag: 'input',
      },
    ],
  },
  preferences: {
    render: true,
    placeholder: true,
    authentication: true,
    permission: ['admin.ticket'],
  },
  state: 'Ticket#',
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Ticket Hook Divider',
  name: 'ticket_hook_divider',
  area: 'Ticket::Base::Shadow',
  description: 'The divider between TicketHook and ticket number. E. g. \': \'.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ticket_hook_divider',
        tag: 'input',
      },
    ],
  },
  state: '',
  preferences: {
    permission: ['admin.ticket'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Ticket Hook Position',
  name: 'ticket_hook_position',
  area: 'Ticket::Base',
  description: "The format of the subject.
* **Right** means **Some Subject [Ticket#12345]**
* **Left** means **[Ticket#12345] Some Subject**
* **None** means **Some Subject** (without ticket number). In the last case you should enable *postmaster_follow_up_search_in* to recognize follow-ups based on email headers and/or body.",
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ticket_hook_position',
        tag: 'select',
        translate: true,
        options: {
          'left'  => 'left',
          'right' => 'right',
          'none'  => 'none',
        },
      },
    ],
  },
  state: 'right',
  preferences: {
    controller: 'SettingsAreaTicketHookPosition',
    permission: ['admin.ticket'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Ticket Number Format',
  name: 'ticket_number',
  area: 'Ticket::Number',
  description: "Selects the ticket number generator module.
* **Increment** increments the ticket number, the SystemID and the counter are used with SystemID.Counter format (e.g. 1010138, 1010139).
* With **Date** the ticket numbers will be generated by the current date, the SystemID and the counter. The format looks like Year.Month.Day.SystemID.counter (e.g. 201206231010138, 201206231010139).",
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ticket_number',
        tag: 'select',
        translate: true,
        options: {
          'Ticket::Number::Increment' => 'Increment (SystemID.Counter)',
          'Ticket::Number::Date'      => 'Date (Year.Month.Day.SystemID.Counter)',
        },
      },
    ],
  },
  state: 'Ticket::Number::Increment',
  preferences: {
    settings_included: %w(ticket_number_increment ticket_number_date),
    controller: 'SettingsAreaTicketNumber',
    permission: ['admin.ticket'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Ticket Number Increment',
  name: 'ticket_number_increment',
  area: 'Ticket::Number',
  description: '-',
  options: {
    form: [
      {
        display: 'Checksum',
        null: true,
        name: 'checksum',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
      {
        display: 'Min. size of number',
        null: true,
        name: 'min_size',
        tag: 'select',
        options: {
          1 => ' 1',
          2 => ' 2',
          3 => ' 3',
          4 => ' 4',
          5 => ' 5',
          6 => ' 6',
          7 => ' 7',
          8 => ' 8',
          9 => ' 9',
          10 => '10',
          11 => '11',
          12 => '12',
          13 => '13',
          14 => '14',
          15 => '15',
          16 => '16',
          17 => '17',
          18 => '18',
          19 => '19',
          20 => '20',
        },
      },
    ],
  },
  state: {
    checksum: false,
    min_size: 5,
  },
  preferences: {
    permission: ['admin.ticket'],
    hidden: true,
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Ticket Number Increment Date',
  name: 'ticket_number_date',
  area: 'Ticket::Number',
  description: '-',
  options: {
    form: [
      {
        display: 'Checksum',
        null: true,
        name: 'checksum',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: {
    checksum: false
  },
  preferences: {
    permission: ['admin.ticket'],
    hidden: true,
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Enable Ticket creation',
  name: 'customer_ticket_create',
  area: 'CustomerWeb::Base',
  description: 'Defines if a customer can create tickets via the web interface.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'customer_ticket_create',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    authentication: true,
    permission: ['admin.channel_web'],
  },
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Group selection for Ticket creation',
  name: 'customer_ticket_create_group_ids',
  area: 'CustomerWeb::Base',
  description: 'Defines groups for which a customer can create tickets via web interface. "-" means all groups are available.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'group_ids',
        tag: 'select',
        multiple: true,
        nulloption: true,
        relation: 'Group',
      },
    ],
  },
  state: '',
  preferences: {
    authentication: true,
    permission: ['admin.channel_web'],
  },
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Enable Ticket creation',
  name: 'form_ticket_create',
  area: 'Form::Base',
  description: 'Defines if tickets can be created via web form.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'form_ticket_create',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    permission: ['admin.channel_formular'],
  },
  frontend: false,
)

group = Group.where(active: true).first
if !group
  group = Group.first
end
group_id = 1
if group
  group_id = group.id
end
Setting.create_if_not_exists(
  title: 'Group selection for Ticket creation',
  name: 'form_ticket_create_group_id',
  area: 'Form::Base',
  description: 'Defines if group of created tickets via web form.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'form_ticket_create_group_id',
        tag: 'select',
        relation: 'Group',
      },
    ],
  },
  state: group_id,
  preferences: {
    permission: ['admin.channel_formular'],
  },
  frontend: false,
)

Setting.create_if_not_exists(
  title: 'Limit tickets by ip per hour',
  name: 'form_ticket_create_by_ip_per_hour',
  area: 'Form::Base',
  description: 'Defines limit of tickets by ip per hour via web form.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'form_ticket_create_by_ip_per_hour',
        tag: 'input',
      },
    ],
  },
  state: 20,
  preferences: {
    permission: ['admin.channel_formular'],
  },
  frontend: false,
)
Setting.create_if_not_exists(
  title: 'Limit tickets by ip per day',
  name: 'form_ticket_create_by_ip_per_day',
  area: 'Form::Base',
  description: 'Defines limit of tickets by ip per day via web form.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'form_ticket_create_by_ip_per_day',
        tag: 'input',
      },
    ],
  },
  state: 240,
  preferences: {
    permission: ['admin.channel_formular'],
  },
  frontend: false,
)
Setting.create_if_not_exists(
  title: 'Limit tickets per day',
  name: 'form_ticket_create_per_day',
  area: 'Form::Base',
  description: 'Defines limit of tickets per day via web form.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'form_ticket_create_per_day',
        tag: 'input',
      },
    ],
  },
  state: 5000,
  preferences: {
    permission: ['admin.channel_formular'],
  },
  frontend: false,
)

Setting.create_if_not_exists(
  title: 'Ticket Subject Size',
  name: 'ticket_subject_size',
  area: 'Email::Base',
  description: 'Max. length of the subject in an email reply.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'ticket_subject_size',
        tag: 'input',
      },
    ],
  },
  state: '110',
  preferences: {
    permission: ['admin.channel_email'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Ticket Subject Reply',
  name: 'ticket_subject_re',
  area: 'Email::Base',
  description: 'The text at the beginning of the subject in an email reply, e. g. RE, AW, or AS.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ticket_subject_re',
        tag: 'input',
      },
    ],
  },
  state: 'RE',
  preferences: {
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Sender Format',
  name: 'ticket_define_email_from',
  area: 'Email::Base',
  description: 'Defines how the From field of emails (sent from answers and email tickets) should look like.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ticket_define_email_from',
        tag: 'select',
        options: {
          SystemAddressName: 'System Address Display Name',
          AgentNameSystemAddressName: 'Agent Name + FromSeparator + System Address Display Name',
        },
      },
    ],
  },
  state: 'AgentNameSystemAddressName',
  preferences: {
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Sender Format Separator',
  name: 'ticket_define_email_from_separator',
  area: 'Email::Base',
  description: 'Defines the separator between the agent\'s real name and the given group email address.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'ticket_define_email_from_separator',
        tag: 'input',
      },
    ],
  },
  state: 'via',
  preferences: {
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Maximum Email Size',
  name: 'postmaster_max_size',
  area: 'Email::Base',
  description: 'Maximum size in MB of emails.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'postmaster_max_size',
        tag: 'select',
        options: {
          1 => '  1',
          2 => '  2',
          3 => '  3',
          4 => '  4',
          5 => '  5',
          6 => '  6',
          7 => '  7',
          8 => '  8',
          9 => '  9',
          10 => ' 10',
          15 => ' 15',
          20 => ' 20',
          25 => ' 25',
          30 => ' 30',
          35 => ' 35',
          40 => ' 40',
          45 => ' 45',
          50 => ' 50',
          60 => ' 60',
          70 => ' 70',
          80 => ' 80',
          90 => ' 90',
          100 => '100',
          125 => '125',
          150 => '150',
        },
      },
    ],
  },
  state: 10,
  preferences: {
    online_service_disable: true,
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Additional follow-up detection',
  name: 'postmaster_follow_up_search_in',
  area: 'Email::Base',
  description: 'By default the follow-up check is done via the subject of an email. With this setting you can add more fields for which the follow-up check will be executed.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'postmaster_follow_up_search_in',
        tag: 'checkbox',
        options: {
          'references' => 'References - Search for follow up also in In-Reply-To or References headers.',
          'body'       => 'Body - Search for follow up also in mail body.',
          'attachment' => 'Attachment - Search for follow up also in attachments.',
        },
      },
    ],
  },
  state: [],
  preferences: {
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Sender based on Reply-To header',
  name: 'postmaster_sender_based_on_reply_to',
  area: 'Email::Base',
  description: 'Set/overwrite sender/from of email based on reply-to header. Useful to set correct customer if email is received from a third party system on behalf of a customer.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'postmaster_sender_based_on_reply_to',
        tag: 'select',
        options: {
          ''                                     => '-',
          'as_sender_of_email'                   => 'Take reply-to header as sender/from of email.',
          'as_sender_of_email_use_from_realname' => 'Take reply-to header as sender/from of email and use realname of origin from.',
        },
      },
    ],
  },
  state: [],
  preferences: {
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Notification Sender',
  name: 'notification_sender',
  area: 'Email::Base',
  description: 'Defines the sender of email notifications.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'notification_sender',
        tag: 'input',
      },
    ],
  },
  state: 'Notification Master <noreply@#{config.fqdn}>',
  preferences: {
    online_service_disable: true,
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Block Notifications',
  name: 'send_no_auto_response_reg_exp',
  area: 'Email::Base',
  description: 'If this regex matches, no notification will be sent by the sender.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'send_no_auto_response_reg_exp',
        tag: 'input',
      },
    ],
  },
  state: '(mailer-daemon|postmaster|abuse|root|noreply|noreply.+?|no-reply|no-reply.+?)@.+?\..+?',
  preferences: {
    online_service_disable: true,
    permission: ['admin.channel_email'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'API Token Access',
  name: 'api_token_access',
  area: 'API::Base',
  description: 'Enable REST API using tokens (not username/email address and password). Each user needs to create its own access tokens in user profile.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'api_token_access',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    permission: ['admin.api'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'API Password Access',
  name: 'api_password_access',
  area: 'API::Base',
  description: 'Enable REST API access using the username/email address and password for the authentication user.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'api_password_access',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    permission: ['admin.api'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Monitoring Token',
  name: 'monitoring_token',
  area: 'HealthCheck::Base',
  description: 'Token for monitoring.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'monitoring_token',
        tag: 'input',
      },
    ],
  },
  state: SecureRandom.urlsafe_base64(40),
  preferences: {
    permission: ['admin.monitoring'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Enable Chat',
  name: 'chat',
  area: 'Chat::Base',
  description: 'Enable/disable online chat.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'chat',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    trigger: ['menu:render', 'chat:rerender'],
    permission: ['admin.channel_chat'],
  },
  state: false,
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Agent idle timeout',
  name: 'chat_agent_idle_timeout',
  area: 'Chat::Extended',
  description: 'Idle timeout in seconds until agent is set offline automatically.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'chat_agent_idle_timeout',
        tag: 'input',
      },
    ],
  },
  state: '120',
  preferences: {
    permission: ['admin.channel_chat'],
  },
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Defines searchable models.',
  name: 'models_searchable',
  area: 'Models::Base',
  description: 'Defines the searchable models.',
  options: {},
  state: [],
  preferences: {
    authentication: true,
  },
  frontend: true,
)

Setting.create_if_not_exists(
  title: 'Default Screen',
  name: 'default_controller',
  area: 'Core',
  description: 'Defines the default screen.',
  options: {},
  state: '#dashboard',
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Elasticsearch Endpoint URL',
  name: 'es_url',
  area: 'SearchIndex::Elasticsearch',
  description: 'Defines endpoint of Elasticsearch.',
  state: '',
  preferences: { online_service_disable: true },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Elasticsearch Endpoint User',
  name: 'es_user',
  area: 'SearchIndex::Elasticsearch',
  description: 'Defines HTTP basic auth user of Elasticsearch.',
  state: '',
  preferences: { online_service_disable: true },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Elasticsearch Endpoint Password',
  name: 'es_password',
  area: 'SearchIndex::Elasticsearch',
  description: 'Defines HTTP basic auth password of Elasticsearch.',
  state: '',
  preferences: { online_service_disable: true },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Elasticsearch Endpoint Index',
  name: 'es_index',
  area: 'SearchIndex::Elasticsearch',
  description: 'Defines Elasticsearch index name.',
  state: 'zammad',
  preferences: { online_service_disable: true },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Elasticsearch Attachment Extensions',
  name: 'es_attachment_ignore',
  area: 'SearchIndex::Elasticsearch',
  description: 'Defines attachment extensions which will be ignored by Elasticsearch.',
  state: [ '.png', '.jpg', '.jpeg', '.mpeg', '.mpg', '.mov', '.bin', '.exe', '.box', '.mbox' ],
  preferences: { online_service_disable: true },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Elasticsearch Attachment Size',
  name: 'es_attachment_max_size_in_mb',
  area: 'SearchIndex::Elasticsearch',
  description: 'Define max. attachment size for Elasticsearch.',
  state: 50,
  preferences: { online_service_disable: true },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Import Mode',
  name: 'import_mode',
  area: 'Import::Base',
  description: 'Puts Zammad into import mode (disables some triggers).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'import_mode',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Import Backend',
  name: 'import_backend',
  area: 'Import::Base::Internal',
  description: 'Set backend which is being used for import.',
  options: {},
  state: '',
  frontend: true
)
Setting.create_if_not_exists(
  title: 'Ignore Escalation/SLA Information',
  name: 'import_ignore_sla',
  area: 'Import::Base',
  description: 'Ignore escalation/SLA information for import.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'import_ignore_sla',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Import Endpoint',
  name: 'import_otrs_endpoint',
  area: 'Import::OTRS',
  description: 'Defines OTRS endpoint to import users, tickets, states and articles.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'import_otrs_endpoint',
        tag: 'input',
      },
    ],
  },
  state: 'http://otrs_host/otrs',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Import Key',
  name: 'import_otrs_endpoint_key',
  area: 'Import::OTRS',
  description: 'Defines OTRS endpoint authentication key.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'import_otrs_endpoint_key',
        tag: 'input',
      },
    ],
  },
  state: '',
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Import User for HTTP basic authentication',
  name: 'import_otrs_user',
  area: 'Import::OTRS',
  description: 'Defines HTTP basic authentication user (only if OTRS is protected via HTTP basic auth).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'import_otrs_user',
        tag: 'input',
      },
    ],
  },
  state: '',
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Import Password for http basic authentication',
  name: 'import_otrs_password',
  area: 'Import::OTRS',
  description: 'Defines http basic authentication password (only if OTRS is protected via http basic auth).',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'import_otrs_password',
        tag: 'input',
      },
    ],
  },
  state: '',
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Import Endpoint',
  name: 'import_zendesk_endpoint',
  area: 'Import::Zendesk',
  description: 'Defines Zendesk endpoint to import users, ticket, states and articles.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'import_zendesk_endpoint',
        tag: 'input',
      },
    ],
  },
  state: 'https://yours.zendesk.com/api/v2',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Import Key for requesting the Zendesk API',
  name: 'import_zendesk_endpoint_key',
  area: 'Import::Zendesk',
  description: 'Defines Zendesk endpoint authentication key.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'import_zendesk_endpoint_key',
        tag: 'input',
      },
    ],
  },
  state: '',
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Import User for requesting the Zendesk API',
  name: 'import_zendesk_endpoint_username',
  area: 'Import::Zendesk',
  description: 'Defines Zendesk endpoint authentication user.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'import_zendesk_endpoint_username',
        tag: 'input',
      },
    ],
  },
  state: '',
  frontend: false
)
Setting.create_if_not_exists(
  title:       'Import Backends',
  name:        'import_backends',
  area:        'Import',
  description: 'A list of active import backends that get scheduled automatically.',
  options:     {},
  state:       ['Import::Ldap'],
  preferences: {
    permission: ['admin'],
  },
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Time Accounting',
  name: 'time_accounting',
  area: 'Web::Base',
  description: 'Enable time accounting.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'time_accounting',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    authentication: true,
    permission: ['admin.time_accounting'],
  },
  state: false,
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Time Accounting Selector',
  name: 'time_accounting_selector',
  area: 'Web::Base',
  description: 'Enable time accounting for these tickets.',
  options: {
    form: [
      {},
    ],
  },
  preferences: {
    authentication: true,
    permission: ['admin.time_accounting'],
  },
  state: {},
  frontend: true
)

Setting.create_if_not_exists(
  title: 'New Tags',
  name: 'tag_new',
  area: 'Web::Base',
  description: 'Allow users to create new tags.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'tag_new',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  preferences: {
    authentication: true,
    permission: ['admin.tag'],
  },
  state: true,
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Default calendar tickets subscriptions',
  name: 'defaults_calendar_subscriptions_tickets',
  area: 'Defaults::CalendarSubscriptions',
  description: 'Defines the default calendar tickets subscription settings.',
  options: {},
  state: {
    escalation: {
      own: true,
      not_assigned: false,
    },
    new_open: {
      own: true,
      not_assigned: false,
    },
    pending: {
      own: true,
      not_assigned: false,
    }
  },
  preferences: {
    authentication: true,
  },
  frontend: true
)

Setting.create_if_not_exists(
  title: 'Defines translator identifier.',
  name: 'translator_key',
  area: 'i18n::translator_key',
  description: 'Defines the translator identifier for contributions.',
  options: {},
  state: '',
  frontend: false
)

Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0010_postmaster_filter_trusted',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to remove X-Zammad headers from not trusted sources.',
  options: {},
  state: 'Channel::Filter::Trusted',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0011_postmaster_sender_based_on_reply_to',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to set the sender/from of emails based on reply-to header.',
  options: {},
  state: 'Channel::Filter::ReplyToBasedSender',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0012_postmaster_filter_sender_is_system_address',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to check if email has been created by Zammad itself and will set the article sender.',
  options: {},
  state: 'Channel::Filter::SenderIsSystemAddress',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0014_postmaster_filter_own_notification_loop_detection',
  area: 'Postmaster::PreFilter',
  description: 'Define postmaster filter to check if email is a own created notification email, then ignore it to prevent email loops.',
  options: {},
  state: 'Channel::Filter::OwnNotificationLoopDetection',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0015_postmaster_filter_identify_sender',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to identify sender user.',
  options: {},
  state: 'Channel::Filter::IdentifySender',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0020_postmaster_filter_auto_response_check',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to identify auto responses to prevent auto replies from Zammad.',
  options: {},
  state: 'Channel::Filter::AutoResponseCheck',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0030_postmaster_filter_out_of_office_check',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to identify out-of-office emails for follow-up detection and keeping current ticket state.',
  options: {},
  state: 'Channel::Filter::OutOfOfficeCheck',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0100_postmaster_filter_follow_up_check',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to identify follow-ups (based on admin settings).',
  options: {},
  state: 'Channel::Filter::FollowUpCheck',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0110_postmaster_filter_follow_up_merged',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to identify follow-up ticket for merged tickets.',
  options: {},
  state: 'Channel::Filter::FollowUpMerged',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0200_postmaster_filter_follow_up_possible_check',
  area: 'Postmaster::PreFilter',
  description: 'Define postmaster filter to check if follow ups get created (based on admin settings).',
  options: {},
  state: 'Channel::Filter::FollowUpPossibleCheck',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0900_postmaster_filter_bounce_follow_up_check',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to identify postmaster bounced - to handle it as follow-up of the original ticket.',
  options: {},
  state: 'Channel::Filter::BounceFollowUpCheck',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '0950_postmaster_filter_bounce_delivery_permanent_failed',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to identify postmaster bounced - disable sending notification on permanent deleivery failed.',
  options: {},
  state: 'Channel::Filter::BounceDeliveryPermanentFailed',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '1000_postmaster_filter_database_check',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter for filters managed via admin interface.',
  options: {},
  state: 'Channel::Filter::Database',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '5000_postmaster_filter_icinga',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to manage Icinga (http://www.icinga.org) emails.',
  options: {},
  state: 'Channel::Filter::Icinga',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines postmaster filter.',
  name: '5100_postmaster_filter_nagios',
  area: 'Postmaster::PreFilter',
  description: 'Defines postmaster filter to manage Nagios (http://www.nagios.org) emails.',
  options: {},
  state: 'Channel::Filter::Nagios',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Icinga integration',
  name: 'icinga_integration',
  area: 'Integration::Switch',
  description: 'Defines if Icinga (http://www.icinga.org) is enabled or not.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'icinga_integration',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 1,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Sender',
  name: 'icinga_sender',
  area: 'Integration::Icinga',
  description: 'Defines the sender email address of Icinga emails.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'icinga_sender',
        tag: 'input',
        placeholder: 'icinga@monitoring.example.com',
      },
    ],
  },
  state: 'icinga@monitoring.example.com',
  preferences: {
    prio: 2,
    permission: ['admin.integration'],
  },
  frontend: false,
)
Setting.create_if_not_exists(
  title: 'Auto close',
  name: 'icinga_auto_close',
  area: 'Integration::Icinga',
  description: 'Defines if tickets should be closed if service is recovered.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'icinga_auto_close',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    prio: 3,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Auto close state',
  name: 'icinga_auto_close_state_id',
  area: 'Integration::Icinga',
  description: 'Defines the state of auto closed tickets.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'icinga_auto_close_state_id',
        tag: 'select',
        relation: 'TicketState',
      },
    ],
  },
  state: 4,
  preferences: {
    prio: 4,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Nagios integration',
  name: 'nagios_integration',
  area: 'Integration::Switch',
  description: 'Defines if Nagios (http://www.nagios.org) is enabled or not.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'nagios_integration',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 1,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Sender',
  name: 'nagios_sender',
  area: 'Integration::Nagios',
  description: 'Defines the sender email address of Nagios emails.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'nagios_sender',
        tag: 'input',
        placeholder: 'nagios@monitoring.example.com',
      },
    ],
  },
  state: 'nagios@monitoring.example.com',
  preferences: {
    prio: 2,
    permission: ['admin.integration'],
  },
  frontend: false,
)
Setting.create_if_not_exists(
  title: 'Auto close',
  name: 'nagios_auto_close',
  area: 'Integration::Nagios',
  description: 'Defines if tickets should be closed if service is recovered.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'nagios_auto_close',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: true,
  preferences: {
    prio: 3,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Auto close state',
  name: 'nagios_auto_close_state_id',
  area: 'Integration::Nagios',
  description: 'Defines the state of auto closed tickets.',
  options: {
    form: [
      {
        display: '',
        null: false,
        name: 'nagios_auto_close_state_id',
        tag: 'select',
        relation: 'TicketState',
      },
    ],
  },
  state: 4,
  preferences: {
    prio: 4,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'LDAP integration',
  name: 'ldap_integration',
  area: 'Integration::Switch',
  description: 'Defines if LDAP is enabled or not.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'ldap_integration',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 1,
    authentication: true,
    permission: ['admin.integration'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'LDAP config',
  name: 'ldap_config',
  area: 'Integration::LDAP',
  description: 'Defines the LDAP config.',
  options: {},
  state: {},
  preferences: {
    prio: 2,
    permission: ['admin.integration'],
  },
  frontend: false,
)
Setting.create_if_not_exists(
  title: 'Defines sync transaction backend.',
  name: '0100_trigger',
  area: 'Transaction::Backend::Sync',
  description: 'Defines the transaction backend to execute triggers.',
  options: {},
  state: 'Transaction::Trigger',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines transaction backend.',
  name: '0100_notification',
  area: 'Transaction::Backend::Async',
  description: 'Defines the transaction backend to send agent notifications.',
  options: {},
  state: 'Transaction::Notification',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines transaction backend.',
  name: '1000_signature_detection',
  area: 'Transaction::Backend::Async',
  description: 'Defines the transaction backend to detect customer signatures in emails.',
  options: {},
  state: 'Transaction::SignatureDetection',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines transaction backend.',
  name: '6000_slack_webhook',
  area: 'Transaction::Backend::Async',
  description: 'Defines the transaction backend which posts messages to Slack (http://www.slack.com).',
  options: {},
  state: 'Transaction::Slack',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Slack integration',
  name: 'slack_integration',
  area: 'Integration::Switch',
  description: 'Defines if Slack (http://www.slack.org) is enabled or not.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'slack_integration',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 1,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Slack config',
  name: 'slack_config',
  area: 'Integration::Slack',
  description: 'Defines the slack config.',
  options: {},
  state: {
    items: []
  },
  preferences: {
    prio: 2,
    permission: ['admin.integration'],
  },
  frontend: false,
)
Setting.create_if_not_exists(
  title: 'sipgate.io integration',
  name: 'sipgate_integration',
  area: 'Integration::Switch',
  description: 'Defines if sipgate.io (http://www.sipgate.io) is enabled or not.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'sipgate_integration',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 1,
    trigger: ['menu:render', 'cti:reload'],
    authentication: true,
    permission: ['admin.integration'],
  },
  frontend: true
)
Setting.create_if_not_exists(
  title: 'sipgate.io config',
  name: 'sipgate_config',
  area: 'Integration::Sipgate',
  description: 'Defines the sipgate.io config.',
  options: {},
  state: {},
  preferences: {
    prio: 2,
    permission: ['admin.integration'],
  },
  frontend: false,
)
Setting.create_if_not_exists(
  title: 'Clearbit integration',
  name: 'clearbit_integration',
  area: 'Integration::Switch',
  description: 'Defines if Clearbit (http://www.clearbit.com) is enabled or not.',
  options: {
    form: [
      {
        display: '',
        null: true,
        name: 'clearbit_integration',
        tag: 'boolean',
        options: {
          true  => 'yes',
          false => 'no',
        },
      },
    ],
  },
  state: false,
  preferences: {
    prio: 1,
    permission: ['admin.integration'],
  },
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Clearbit config',
  name: 'clearbit_config',
  area: 'Integration::Clearbit',
  description: 'Defines the Clearbit config.',
  options: {},
  state: {},
  frontend: false,
  preferences: {
    prio: 2,
    permission: ['admin.integration'],
  },
)
Setting.create_if_not_exists(
  title: 'Defines transaction backend.',
  name: '9000_clearbit_enrichment',
  area: 'Transaction::Backend::Async',
  description: 'Defines the transaction backend which will enrich customer and organization information from Clearbit (http://www.clearbit.com).',
  options: {},
  state: 'Transaction::ClearbitEnrichment',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines transaction backend.',
  name: '9100_cti_caller_id_detection',
  area: 'Transaction::Backend::Async',
  description: 'Defines the transaction backend which detects caller IDs in objects and store them for CTI lookups.',
  options: {},
  state: 'Transaction::CtiCallerIdDetection',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines transaction backend.',
  name: '9200_karma',
  area: 'Transaction::Backend::Async',
  description: 'Defines the transaction backend which creates the karma score.',
  options: {},
  state: 'Transaction::Karma',
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Defines karma levels.',
  name: 'karma_levels',
  area: 'Core::Karma',
  description: 'Defines the karma levels.',
  options: {},
  state: [
    {
      name: 'Beginner',
      start: 0,
      end: 499,
    },
    {
      name: 'Newbie',
      start: 500,
      end: 1999,
    },
    {
      name: 'Intermediate',
      start: 2000,
      end: 4999,
    },
    {
      name: 'Professional',
      start: 5000,
      end: 6999,
    },
    {
      name: 'Expert',
      start: 7000,
      end: 8999,
    },
    {
      name: 'Master',
      start: 9000,
      end: 18_999,
    },
    {
      name: 'Evangelist',
      start: 19_000,
      end: 45_999,
    },
    {
      name: 'Hero',
      start: 50_000,
      end: nil,
    },
  ],
  frontend: false
)
Setting.create_if_not_exists(
  title: 'Set limit of agents',
  name: 'system_agent_limit',
  area: 'Core::Online',
  description: 'Defines the limit of the agents.',
  options: {},
  state: false,
  preferences: { online_service_disable: true },
  frontend: false
)
