YetiForceCompany/YetiForceCRM

View on GitHub
config/ConfigTemplates.php

Summary

Maintainability
F
3 days
Test Coverage
D
68%
<?php
/**
 * Main config.
 *
 * @copyright YetiForce S.A.
 * @license   YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com)
 */
return [
    'api' => [
        'enabledServices' => [
            'default' => [],
            'description' => 'List of active services. Available: dav, webservice',
            'validation' => function () {
                $arg = func_get_arg(0);
                return \is_array($arg) && empty(array_diff($arg, ['dav', 'webservice']));
            },
        ],
        'enableBrowser' => [
            'default' => false,
            'description' => 'Dav configuration. Available: false, true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'enableCardDAV' => [
            'default' => false,
            'description' => 'Dav configuration. Available: false, true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'enableCalDAV' => [
            'default' => false,
            'description' => 'Dav configuration. Available: false, true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'enableWebDAV' => [
            'default' => false,
            'description' => 'Dav configuration. Available: false, true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'enableEmailPortal' => [
            'default' => true,
            'description' => 'Webservice config. Enabling contact notifications about the new account in the portal. Available: false, true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'ENCRYPT_DATA_TRANSFER' => [
            'default' => false,
            'description' => 'Webservice config. Available: false, true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'AUTH_METHOD' => [
            'default' => 'Basic',
            'description' => 'Webservice config.',
            'validation' => fn () => 'Basic' === func_get_arg(0),
        ],
        'PRIVATE_KEY' => [
            'default' => 'config/private.key',
            'description' => 'Webservice config.',
        ],
        'PUBLIC_KEY' => [
            'default' => 'config/public.key',
            'description' => 'Webservice config.',
        ],
    ],
    'main' => [
        'USE_RTE' => [
            'default' => true,
            'description' => 'Use rte',
        ],
        'PORTAL_URL' => [
            'default' => '',
            'description' => 'Url for customer portal (Example: https://portal.yetiforce.com/)',
        ],
        //        'HELPDESK_SUPPORT_NAME' => [
        //            'default' => 'your-support name',
        //            'description' => 'Helpdesk support email id and support name (Example: "support@yetiforce.com" and "yetiforce support")',
        //            'validation' => ''
        //        ],
        'HELPDESK_SUPPORT_EMAIL_REPLY' => [
            'default' => '',
            'description' => 'Help desk support email reply',
        ],
        'site_URL' => [
            'default' => '',
            'description' => 'Backslash is required at the end of URL',
            'validation' => '\App\Validator::url',
        ],
        'cache_dir' => [
            'default' => 'cache/',
            'description' => 'Cache directory path',
        ],
        'tmp_dir' => [
            'type' => 'function',
            'default' => 'return self::$cache_dir . "images/";',
            'description' => 'Default value prepended by cache_dir = images/',
        ],
        'upload_maxsize' => [
            'default' => 52428800,
            'description' => 'Maximum file size for uploaded files in bytes also used when uploading import files: upload_maxsize default value = 52428800 (50MB)',
            'validation' => function () {
                $arg = func_get_arg(0);
                return $arg && \App\Validator::naturalNumber($arg) && ($arg * 1048576) <= \App\Config::getMaxUploadSize(false);
            },
            'sanitization' => fn () => (int) func_get_arg(0) * 1048576,
        ],
        'allow_exports' => [
            'default' => 'all',
            'description' => 'Flag to allow export functionality: "all" - to allow anyone to use exports, "admin" - to only allow admins to export, "none" -  to block exports completely',
            'validation' => function () {
                $arg = func_get_arg(0);
                return \in_array($arg, ['all', 'admin', 'none']);
            },
        ],
        'upload_badext' => [
            'default' => ['php', 'php3', 'php4', 'php5', 'pl', 'cgi', 'py', 'asp', 'cfm', 'js', 'vbs', 'html', 'htm', 'exe', 'bin', 'bat', 'sh', 'dll', 'phps', 'phtml', 'xhtml', 'rb', 'msi', 'jsp', 'shtml', 'sth', 'shtm'],
            'description' => 'Files with one of these extensions will have ".txt" appended to their filename on upload.',
        ],
        'list_max_entries_per_page' => [
            'default' => 20,
            'description' => 'List max entries per page: default value = 20',
            'validation' => function () {
                $arg = func_get_arg(0);
                return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg);
            },
            'sanitization' => fn () => (int) func_get_arg(0),
        ],
        'default_module' => [
            'default' => 'Home',
            'description' => 'Default module: default value = Home',
            'validation' => function () {
                $arg = func_get_arg(0);
                return true === \App\Module::isModuleActive($arg);
            },
        ],
        'default_charset' => [
            'default' => 'UTF-8',
            'description' => 'Default charset:  default value = "UTF-8"',
            'validation' => fn () => 'UTF-8' === func_get_arg(0),
        ],
        'default_language' => [
            'default' => 'en-US',
            'description' => 'Default language: default value = en-US',
            'validation' => '\App\Validator::languageTag',
        ],
        'application_unique_key' => [
            'default' => sha1(time() . '' . random_int(1, 9999999)),
            'description' => 'Unique Application Key',
            'validation' => fn () => !class_exists('\\Config\\Main'),
            'sanitization' => fn () => sha1(time() . '' . random_int(1, 9999999)),
        ],
        'listview_max_textlength' => [
            'default' => 40,
            'description' => 'Trim descriptions, titles in listviews to this value',
            'validation' => function () {
                $arg = func_get_arg(0);
                return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg);
            },
            'sanitization' => fn () => (int) func_get_arg(0),
        ],
        'php_max_execution_time' => [
            'default' => 0,
            'description' => 'Maximum time limit for PHP script execution (in seconds)',
        ],
        'default_timezone' => [
            'default' => '_TIMEZONE_',
            'description' => 'Set the default timezone as per your preference',
            'validation' => function () {
                $arg = func_get_arg(0);
                return \in_array($arg, timezone_identifiers_list());
            },
        ],
        'title_max_length' => [
            'default' => 60,
            'description' => 'Maximum length of characters for title',
            'validation' => function () {
                $arg = func_get_arg(0);
                return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg);
            },
            'sanitization' => fn () => (int) func_get_arg(0),
        ],
        'href_max_length' => [
            'default' => 50,
            'description' => 'Maximum length for href tag',
            'validation' => function () {
                $arg = func_get_arg(0);
                return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg);
            },
            'sanitization' => fn () => (int) func_get_arg(0),
        ],
        'MINIMUM_CRON_FREQUENCY' => [
            'default' => 1,
            'description' => 'Minimum cron frequency [min]',
            'validation' => function () {
                $arg = func_get_arg(0);
                return $arg && \App\Validator::naturalNumber($arg) && (100 >= $arg) && (0 < $arg);
            },
            'sanitization' => fn () => (int) func_get_arg(0),
        ],
        'davStorageDir' => [
            'default' => 'storage/Files',
            'description' => 'Update the current session id with a newly generated one after login',
        ],
        'systemMode' => [
            'default' => 'prod',
            'description' => 'System mode. Available: prod, demo, test',
            'validationValues' => ['prod', 'demo', 'test'],
        ],
        'listMaxEntriesMassEdit' => [
            'default' => 500,
            'description' => 'Maximum number of records in a mass edition',
            'validation' => function () {
                $arg = func_get_arg(0);
                return $arg && \App\Validator::naturalNumber($arg) && (5000 >= $arg);
            },
            'sanitization' => fn () => (int) func_get_arg(0),
        ],
        'backgroundClosingModal' => [
            'default' => true,
            'description' => 'Enable closing of modal window by clicking on the background',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'isActiveSendingMails' => [
            'default' => true,
            'description' => 'Is sending emails active?',
        ],
        'isActiveRecordTemplate' => [
            'default' => false,
            'description' => 'Activates / deactivates batch adding of records',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'unblockedTimeoutCronTasks' => [
            'default' => true,
            'description' => 'Should the task in cron be unblocked if the script execution time was exceeded?',
        ],
        'maxExecutionCronTime' => [
            'default' => 3600,
            'description' => 'The maximum time of executing a cron. Recommended the same as the max_exacution_time parameter value.',
        ],
        'langInLoginView' => [
            'default' => false,
            'description' => "System's language selection in the login window (true/false).",
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'layoutInLoginView' => [
            'default' => false,
            'description' => "System's layout selection in the login window (true/false)",
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'defaultLayout' => [
            'default' => 'basic',
            'description' => 'Set the default layout',
            'validation' => fn () => isset(\App\Layout::getAllLayouts()[func_get_arg(0)]),
        ],
        'phoneFieldAdvancedVerification' => [
            'default' => true,
            'description' => 'Enable advanced phone number validation. Enabling it will block saving invalid phone number.',
        ],
        'phoneFieldAdvancedHrefFormat' => [
            'default' => new \Nette\PhpGenerator\PhpLiteral('\libphonenumber\PhoneNumberFormat::RFC3966'),
            'description' => "Phone number display format. Values:\nfalse - formatting is disabled \n\\libphonenumber\\PhoneNumberFormat::RFC3966 - +48-44-668-18-00\n\\libphonenumber\\PhoneNumberFormat::E164 - +48446681800 \n\\libphonenumber\\PhoneNumberFormat::INTERNATIONAL - 044 668 18 00\n\\libphonenumber\\PhoneNumberFormat::NATIONAL - +48 44 668 18 00",
            'validation' => function () {
                return \in_array(func_get_arg(0), [
                    false,
                    \libphonenumber\PhoneNumberFormat::RFC3966,
                    \libphonenumber\PhoneNumberFormat::E164,
                    \libphonenumber\PhoneNumberFormat::INTERNATIONAL,
                    \libphonenumber\PhoneNumberFormat::NATIONAL,
                ]);
            },
        ],
        'headerAlertMessage' => [
            'default' => '',
            'description' => 'Header alert message',
        ],
        'headerAlertType' => [
            'default' => '',
            'description' => 'Header alert type, ex. alert-primary, alert-danger, alert-warning, alert-info',
        ],
        'headerAlertIcon' => [
            'default' => '',
            'description' => 'Header alert icon, ex.  fas fa-exclamation-triangle, fas fa-exclamation-circle, fas fa-exclamation, far fa-question-circle, fas fa-info-circle',
        ],
        'loginPageAlertMessage' => [
            'default' => '',
            'description' => 'Login page alert message',
        ],
        'loginPageAlertType' => [
            'default' => '',
            'description' => 'Login page alert type, ex. alert-primary, alert-danger, alert-warning, alert-info',
        ],
        'loginPageAlertIcon' => [
            'default' => '',
            'description' => 'Login page alert icon, ex.  fas fa-exclamation-triangle, fas fa-exclamation-circle, fas fa-exclamation, far fa-question-circle, fas fa-info-circle',
        ],
    ],
    'debug' => [
        'LOG_TO_FILE' => [
            'default' => false,
            'description' => 'Enable saving logs to file. Values: false/true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'LOG_TO_PROFILE' => [
            'default' => false,
            'description' => 'Enable saving logs profiling. Values: false/true',
        ],
        'LOG_PROFILE_CATEGORIES' => [
            'default' => [],
            'description' => 'Categories to be registered in profiling, an empty value means all categories. ex. "yii\db\Command::query", "Integrations/MagentoApi"',
        ],
        'LOG_LEVELS' => [
            'default' => false,
            'description' => 'Level of saved/displayed logs. Values: false = All / 3 = error and warning / ["error", "warning", "info", "trace", "profile"]',
            'validation' => function () {
                $arg = func_get_arg(0);
                return false === $arg || (\is_array($arg) && array_diff(['error', 'warning', 'info', 'trace', 'profile'], $arg));
            },
        ],
        'LOG_TRACE_LEVEL' => [
            'default' => 0,
            'description' => 'Level of saved/displayed tracerts. // Values: int',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'SQL_DIE_ON_ERROR' => [
            'default' => false,
            'description' => 'Stop the running process of the system if there is an error in sql query',
        ],
        'EXCEPTION_ERROR_TO_SHOW' => [
            'default' => false,
            'description' => 'Display errors',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'DISPLAY_EXCEPTION_BACKTRACE' => [
            'default' => false,
            'description' => 'Displays information about the tracking code when an error occurs. Available only with the active SQL_DIE_ON_ERROR = true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'DISPLAY_EXCEPTION_LOGS' => [
            'default' => false,
            'description' => 'Display logs when error exception occurs',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'EXCEPTION_ERROR_HANDLER' => [
            'default' => false,
            'description' => 'Turn on/off the error handler',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'EXCEPTION_ERROR_TO_FILE' => [
            'default' => false,
            'description' => 'Save logs to file (cache/logs/errors.log)',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'DISPLAY_DEBUG_CONSOLE' => [
            'default' => false,
            'description' => 'Display main debug console',
        ],
        'DISPLAY_LOGS_IN_CONSOLE' => [
            'default' => false,
            'description' => 'Enable displaying logs in debug console. Values: false/true',
        ],
        'DISPLAY_CONFIG_IN_CONSOLE' => [
            'default' => false,
            'description' => 'Enable displaying logs in debug console. Values: false/true',
        ],
        'DEBUG_CONSOLE_ALLOWED_IPS' => [
            'default' => false,
            'description' => 'List of IP addresses allowed to display debug console. Values: false = All IPS / "192.168.1.10" / ["192.168.1.10","192.168.1.11"]',
        ],
        'DEBUG_CONSOLE_ALLOWED_USERS' => [
            'default' => [],
            'description' => 'List of user IDs allowed to display debug console. ',
        ],
        'DEBUG_CRON' => [
            'default' => false,
            'description' => 'Debug cron => cache/logs/cron/',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'DEBUG_VIEWER' => [
            'default' => false,
            'description' => 'Debug Viewer => cache/logs/viewer-debug.log',
        ],
        'DISPLAY_DEBUG_VIEWER' => [
            'default' => false,
            'description' => 'Display Smarty Debug Console',
        ],
        'SMARTY_ERROR_REPORTING' => [
            'default' => new \Nette\PhpGenerator\PhpLiteral('E_ALL & ~E_NOTICE'),
            'description' => 'Do not show Smarty Notice in phpError.log',
            'validation' => function () {
                $arg = (string) func_get_arg(0);
                return \in_array($arg, ['E_ALL', 'E_ALL & ~E_NOTICE']);
            },
        ],
        'EXCEPTION_ERROR_LEVEL' => [
            'default' => new \Nette\PhpGenerator\PhpLiteral('E_ALL & ~E_NOTICE'),
            'description' => "Set the error reporting level. The parameter is either an integer representing a bit field, or named constants.\nhttps://secure.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting\nAll errors - E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED / Critical errors - E_ERROR | E_WARNING | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR",
            'validation' => function () {
                $arg = (string) func_get_arg(0);
                return \in_array($arg, ['E_ALL', 'E_ALL & ~E_NOTICE']);
            },
        ],
        'JS_DEBUG' => [
            'default' => true,
            'description' => 'Turn on/off error debugging in javascript',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'apiShowExceptionMessages' => [
            'default' => false,
            'description' => '[WebServices/API] Show exception messages in response body',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'apiShowExceptionReasonPhrase' => [
            'default' => false,
            'description' => '[WebServices/API] Show exception reason phrase in response header',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'apiShowExceptionBacktrace' => [
            'default' => false,
            'description' => '[WebServices/API] Show exception backtrace in response body',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'apiLogException' => [
            'default' => false,
            'description' => '[WebServices/API] Log to file only exception errors in the logs',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'apiLogAllRequests' => [
            'default' => false,
            'description' => '[WebServices/API] Log to file all communications data (request + response)',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'davDebugExceptions' => [
            'default' => false,
            'description' => 'API - Sabre dav - This is a flag that allows (or not) showing file, line, and code of the exception in the returned XML',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'davDebugPlugin' => [
            'default' => false,
            'description' => 'Activate the plugin recording log in DAV',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'MAILER_DEBUG' => [
            'default' => false,
            'description' => 'Mailer debug',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'ROUNDCUBE_DEBUG_LEVEL' => [
            'default' => 1,
            'description' => 'System error reporting, sum of: 1 = log; 4 = show, 8 = trace',
        ],
        'ROUNDCUBE_DEVEL_MODE' => [
            'default' => false,
            'description' => 'Devel_mode this will print real PHP memory usage into logs/console and do not compress JS libraries',
        ],
        'ROUNDCUBE_PER_USER_LOGGING' => [
            'default' => false,
            'description' => "Activate this option if logs should be written to per-user directories.\nData will only be logged if a directory cache/logs/<username>/ exists and is writable.",
        ],
        'ROUNDCUBE_SMTP_LOG' => [
            'default' => false,
            'description' => 'Log sent messages to cache/logs/sendmail or to syslog',
        ],
        'ROUNDCUBE_LOG_LOGINS' => [
            'default' => false,
            'description' => 'Log successful/failed logins to cache/logs/userlogins or to syslog',
        ],
        'ROUNDCUBE_LOG_SESSION' => [
            'default' => false,
            'description' => 'Log session authentication errors to cache/logs/session or to syslog',
        ],
        'ROUNDCUBE_SQL_DEBUG' => [
            'default' => false,
            'description' => 'Log SQL queries to cache/logs/sql or to syslog',
        ],
        'ROUNDCUBE_IMAP_DEBUG' => [
            'default' => false,
            'description' => 'Log IMAP conversation to cache/logs/imap or to syslog',
        ],
        'ROUNDCUBE_LDAP_DEBUG' => [
            'default' => false,
            'description' => 'Log LDAP conversation to cache/logs/ldap or to syslog',
        ],
        'ROUNDCUBE_SMTP_DEBUG' => [
            'default' => false,
            'description' => 'Log SMTP conversation to cache/logs/smtp or to syslog',
        ],
    ],
    'developer' => [
        'CHANGE_GENERATEDTYPE' => [
            'default' => false,
            'description' => 'Turn the possibility to change generatedtype',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'MINIMIZE_JS' => [
            'default' => true,
            'description' => 'Enable minimize JS files',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'MINIMIZE_CSS' => [
            'default' => true,
            'description' => ' Enable minimize CSS files',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'CHANGE_VISIBILITY' => [
            'default' => false,
            'description' => 'Change of fields visibility',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'CHANGE_RELATIONS' => [
            'default' => false,
            'description' => 'Adding/Deleting relations between modules.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'MISSING_LIBRARY_DEV_MODE' => [
            'default' => false,
            'description' => 'Developer libraries update mode',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'LANGUAGES_UPDATE_DEV_MODE' => [
            'default' => false,
            'description' => 'Developer libraries update mode',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'updaterDevMode' => [
            'default' => false,
            'description' => 'Developer updater mode',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
    ],
    'layout' => [
        'breadcrumbs' => [
            'default' => true,
            'description' => 'Should menu breadcrumbs be visible? true = show, false = hide',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'breadcrumbsHref' => [
            'default' => true,
            'description' => 'Should the breadcrumb menu have href enabled? true = enabled, false = off',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'tileDefaultSize' => [
            'default' => 'very_small',
            'description' => 'Default tile size. Available sizes: very_small, small, medium, big',
        ],
    ],
    'performance' => [
        'CACHING_DRIVER' => [
            'default' => 'Base',
            'description' => 'Data caching is about storing some PHP variables in cache and retrieving it later from cache. Drivers: Base, Apcu',
            'validation' => function () {
                $arg = func_get_arg(0);
                return 'Basic' === $arg || 'Apcu' === $arg;
            },
        ],
        'ENABLE_CACHING_USERS' => [
            'default' => false,
            'description' => 'Enable caching of user data',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'ENABLE_CACHING_DB_CONNECTION' => [
            'default' => false,
            'description' => 'Enable caching database instance, accelerate time database connection',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'DB_DEFAULT_CHARSET_UTF8' => [
            'default' => true,
            'description' => 'If database default charset is UTF-8, set this to true. This avoids executing the SET NAMES SQL for each query!',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'LISTVIEW_COMPUTE_PAGE_COUNT' => [
            'default' => false,
            'description' => 'Compute list view record count while loading listview each time. Recommended value false',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'AUTO_REFRESH_RECORD_LIST_ON_SELECT_CHANGE' => [
            'default' => true,
            'description' => 'Enable automatic records list refreshing while changing the value of the selection list',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SEARCH_SHOW_OWNER_ONLY_IN_LIST' => [
            'default' => false,
            'description' => 'Show in search engine/filters only users and groups available in records list. It might result in a longer search time.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'INTERVAL_FOR_NOTIFICATION_NUMBER_CHECK' => [
            'default' => 100,
            'description' => 'Time to update number of notifications in seconds',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'SEARCH_OWNERS_BY_AJAX' => [
            'default' => false,
            'description' => 'Search owners by AJAX. We recommend selecting the "true" value if there are numerous users in the system.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SEARCH_ROLES_BY_AJAX' => [
            'default' => false,
            'description' => 'Search roles by AJAX',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SEARCH_REFERENCE_BY_AJAX' => [
            'default' => false,
            'description' => 'Search reference by AJAX. We recommend selecting the "true" value if there are numerous users in the system.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'MAX_NUMBER_EXPORT_RECORDS' => [
            'default' => 500,
            'description' => 'Max number of exported records',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'maxMassDeleteRecords' => [
            'default' => 1000,
            'description' => 'Max number of mass deleted records',
        ],
        'maxMassTransferOwnershipRecords' => [
            'default' => 1000,
            'description' => 'Max number of transfer ownership records',
        ],
        'OWNER_MINIMUM_INPUT_LENGTH' => [
            'default' => 2,
            'description' => 'Minimum number of characters to search for record owner',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'ROLE_MINIMUM_INPUT_LENGTH' => [
            'default' => 2,
            'description' => 'Minimum number of characters to search for role',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'NUMBERS_EMAILS_DOWNLOADED_DURING_ONE_SCANNING' => [
            'default' => 100,
            'description' => 'The numbers of emails downloaded during one scanning',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'CRON_MAX_NUMBERS_RECORD_PRIVILEGES_UPDATER' => [
            'default' => 1000000,
            'description' => 'The maximum number of global search permissions that cron can update during a single execution',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'CRON_MAX_NUMBERS_RECORD_ADDRESS_BOOK_UPDATER' => [
            'default' => 10000,
            'description' => 'The maximum number of records in address book to be updated in cron',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'CRON_MAX_NUMBERS_RECORD_LABELS_UPDATER' => [
            'default' => 10000,
            'description' => 'The maximum number of record labels that cron can update during a single execution',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'CRON_MAX_NUMBERS_SENDING_MAILS' => [
            'default' => 1000,
            'description' => 'The maximum number of emails that cron can send during a single execution. Pay attention to the server limits.',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'CRON_MAX_ATACHMENTS_DELETE' => [
            'default' => 1000,
            'description' => 'The maximum number of attachments that cron can delete during a single execution',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'LOAD_CUSTOM_FILES' => [
            'default' => false,
            'description' => "Parameter that allows to disable file overwriting.\nAfter enabling it the system will additionally check whether the file exists in the custom directory. Ex. custom/modules/Assets/Assets.php.",
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SHOW_ADMIN_PANEL' => [
            'default' => false,
            'description' => 'Parameter that determines whether admin panel should be available to admin by default',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SHOW_ADMINISTRATORS_IN_USERS_LIST' => [
            'default' => true,
            'description' => 'Display administrators in the list of users (Assigned To)',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'GLOBAL_SEARCH' => [
            'default' => true,
            'description' => 'Global search: true/false',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'BROWSING_HISTORY_WORKING' => [
            'default' => true,
            'description' => 'Browsing history working if true',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'BROWSING_HISTORY_VIEW_LIMIT' => [
            'default' => 20,
            'description' => 'Number of browsing history steps',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'BROWSING_HISTORY_DELETE_AFTER' => [
            'default' => 7,
            'description' => 'Number of days after which browsing history will be deleted',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'SESSION_DRIVER' => [
            'default' => 'File',
            'description' => 'Session handler name, handler dir: app/Session/',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'CHART_MULTI_FILTER_LIMIT' => [
            'default' => 5,
            'description' => 'Charts multi filter limit',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'CHART_ADDITIONAL_FILTERS_LIMIT' => [
            'default' => 6,
            'description' => "Additional filters limit for ChartFilter's",
            'validation' => '\App\Validator::naturalNumber',
        ],
        'MAX_MERGE_RECORDS' => [
            'default' => 4,
            'description' => 'Maximum number of merged records',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'ACCESS_TO_INTERNET' => [
            'default' => true,
            'description' => 'Can CRM have access to the Internet?',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'CHANGE_LOCALE' => [
            'default' => true,
            'description' => 'Change the locale for sort the data',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'INVENTORY_EDIT_VIEW_LAYOUT' => [
            'default' => true,
            'description' => 'Is divided layout style on edit view in modules with products',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'MODULES_SPLITTED_EDIT_VIEW_LAYOUT' => [
            'default' => [],
            'description' => 'List of modules with splitted edit view layout',
            'validation' => function () {
                $arg = func_get_arg(0);
                return \is_array($arg) && array_diff($arg, App\Module::getAllModuleNames());
            },
        ],
        'RECORD_POPOVER_DELAY' => [
            'default' => 500,
            'description' => "Popover record's trigger delay in ms",
            'validation' => '\App\Validator::naturalNumber',
        ],
        'picklistLimit' => [
            'default' => 50,
            'description' => 'Number of items displayed in picklists.',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'recursiveTranslate' => [
            'default' => false,
            'description' => 'If there is no translation in the chosen language, then get from the default language.',
        ],
        'quickEditLayout' => [
            'default' => 'blocks',
            'description' => 'Parameter defining how fields are displayed in quick edit. Available values: standard,blocks,vertical',
            'validationValues' => ['blocks', 'standard', 'vertical'],
        ],
        'quickCreateLayout' => [
            'default' => 'blocks',
            'description' => 'Parameter defining how fields are displayed in quick create. Available values: blocks,standard',
            'validationValues' => ['blocks', 'standard'],
        ],
        'REPORT_RECORD_NUMBERS' => [
            'default' => 10,
            'description' => 'Number of records that can be shown in report mail',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'LOGIN_HISTORY_VIEW_LIMIT' => [
            'default' => 30,
            'description' => 'Number of records that can be shown in history login modal',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'recordActivityNotifier' => [
            'default' => false,
            'description' => 'Functionality notifying about activity on the record',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
            'docTags' => ['var' => 'bool'],
        ],
        'recordActivityNotifierInterval' => [
            'default' => 5,
            'description' => 'Interval for Record activity notifier',
            'validation' => '\App\Validator::naturalNumber',
            'sanitization' => '\App\Purifier::naturalNumber',
            'docTags' => ['var' => 'int Number of seconds'],
        ],
    ],
    'relation' => [
        'COMMENT_MAX_LENGTH' => [
            'default' => 20,
            'description' => 'Maximum length of a comment visible in the related module',
            'validation' => '\App\Validator::naturalNumber',
            'sanitization' => fn () => (int) func_get_arg(0),
        ],
        'SHOW_RELATED_MODULE_NAME' => [
            'default' => true,
            'description' => 'Show related modules names',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SHOW_RELATED_ICON' => [
            'default' => true,
            'description' => 'Show related modules icon',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SHOW_RECORDS_COUNT' => [
            'default' => false,
            'description' => 'Show record count in tabs of related modules',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'addSearchParamsToCreateView' => [
            'default' => true,
            'description' => 'Fill in the record creation form with the data used in filtering (search_params)',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'separateChangeRelationButton' => [
            'default' => false,
            'description' => 'Separate change relation button in related module',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
    ],
    'search' => [
        'GLOBAL_SEARCH_SELECT_MODULE' => [
            'default' => true,
            'description' => 'Auto select current module in global search (true/false)',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'GLOBAL_SEARCH_MODAL_MAX_NUMBER_RESULT' => [
            'default' => 100,
            'description' => 'Auto select current module in global search (int)',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'GLOBAL_SEARCH_SORTING_RESULTS' => [
            'default' => 0,
            'description' => 'Global search - Should the results be sorted in MySQL or PHP while displaying (None = 0, PHP = 1, Mysql = 2). The parameter impacts system efficiency.',
            'validation' => function () {
                $arg = func_get_arg(0);
                return \is_int($arg) && \in_array($arg, [0, 1, 2]);
            },
        ],
        'GLOBAL_SEARCH_CURRENT_MODULE_TO_TOP' => [
            'default' => true,
            'description' => 'Global search - Show current module as first in search results (true/false).',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'GLOBAL_SEARCH_AUTOCOMPLETE' => [
            'default' => 1,
            'description' => 'Global search - Search for records while entering text  (1/0).',
            'validation' => function () {
                $arg = func_get_arg(0);
                return \is_int($arg) && \in_array($arg, [0, 1]);
            },
        ],
        'GLOBAL_SEARCH_AUTOCOMPLETE_LIMIT' => [
            'default' => 15,
            'description' => 'Global search - Max number of displayed results. The parameter impacts system efficiency.',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'GLOBAL_SEARCH_AUTOCOMPLETE_MIN_LENGTH' => [
            'default' => 3,
            'description' => 'Global search - The minimum number of characters a user must type before a search is performed. The parameter impacts system efficiency',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'GLOBAL_SEARCH_OPERATOR_SELECT' => [
            'default' => true,
            'description' => 'Global search - Show operator list.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'LIST_ENTITY_STATE_COLOR' => [
            'default' => [
                'Archived' => '#0032a2',
                'Trash' => '#ab0505',
                'Active' => '#009405',
            ],
            'description' => 'Colors for record state will be displayed in list view, history, and preview.',
        ],
    ],
    'securityKeys' => [
        'encryptionPass' => [
            'default' => 'yeti',
            'description' => 'Key to encrypt passwords, changing the key results in the loss of all encrypted data.',
            'validation' => fn () => true,
        ],
        'encryptionMethod' => [
            'default' => 'aes-256-cbc',
            'description' => 'Encryption method.',
            'validation' => function () {
                $arg = func_get_arg(0);
                return empty($arg) || ($arg && \in_array($arg, \App\Encryption::getMethods()));
            },
        ],
    ],
    'security' => [
        'USER_ENCRYPT_PASSWORD_COST' => [
            'default' => 10,
            'description' => "Password encrypt algorithmic cost. Numeric values - we recommend values greater than 10.\nThe greater the value, the longer it takes to encrypt the password.",
        ],
        'RESET_LOGIN_PASSWORD' => [
            'default' => false,
            'description' => 'Possible to reset the password while logging in (true/false)',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'SHOW_MY_PREFERENCES' => [
            'default' => true,
            'description' => 'Show my preferences',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'CHANGE_LOGIN_PASSWORD' => [
            'default' => true,
            'description' => 'Changing the settings by the user is possible true/false',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'PERMITTED_BY_ROLES' => [
            'default' => true,
            'description' => 'Permitted by roles.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'PERMITTED_BY_SHARING' => [
            'default' => true,
            'description' => 'Permitted by sharing.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'PERMITTED_BY_SHARED_OWNERS' => [
            'default' => true,
            'description' => 'Permitted by shared owners.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'PERMITTED_BY_RECORD_HIERARCHY' => [
            'default' => true,
            'description' => 'Permitted by record hierarchy.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'PERMITTED_BY_ADVANCED_PERMISSION' => [
            'default' => true,
            'description' => 'Permitted by advanced permission.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'PERMITTED_BY_PRIVATE_FIELD' => [
            'default' => true,
            'description' => 'Permitted by private field.',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'permittedModulesByCreatorField' => [
            'default' => [],
            'description' => 'List of modules to which access is based on the record creation.',
            'validation' => function () {
                $arg = func_get_arg(0);
                return \is_array($arg) && array_diff($arg, App\Module::getAllModuleNames());
            },
        ],
        'permittedWriteAccessByCreatorField' => [
            'default' => false,
            'description' => 'Permission level access based on the record creation',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'CACHING_PERMISSION_TO_RECORD' => [
            'default' => false,
            'description' => "Configuration of the permission mechanism on records list.\ntrue - Permissions based on the users column in vtiger_crmentity.\n        Permissions are not verified in real time. They are updated via cron.\n        We do not recommend using this option in production environments.\nfalse - Permissions based on adding tables with permissions to query (old mechanism).",
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'EMAIL_FIELD_RESTRICTED_DOMAINS_ACTIVE' => [
            'default' => false,
            'description' => "Restricted domains allow you to block saving an email address from a given domain in the system.\nRestricted domains work only for email address type fields.",
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'EMAIL_FIELD_RESTRICTED_DOMAINS_VALUES' => [
            'default' => [],
            'description' => 'Restricted domains',
        ],
        'EMAIL_FIELD_RESTRICTED_DOMAINS_ALLOWED' => [
            'default' => [],
            'description' => 'List of modules where restricted domains are enabled, if empty it will be enabled everywhere.',
        ],
        'EMAIL_FIELD_RESTRICTED_DOMAINS_EXCLUDED' => [
            'default' => ['OSSEmployees', 'Users'],
            'description' => 'List of modules excluded from restricted domains validation.',
        ],
        'LOGIN_PAGE_REMEMBER_CREDENTIALS' => [
            'default' => false,
            'description' => 'Remember user credentials',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'fieldsReferencesDependent' => [
            'default' => false,
            'description' => 'Interdependent reference fields',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'maxLifetimeSession' => [
            'default' => 900,
            'description' => 'Lifetime session (in seconds)',
            'validation' => '\App\Validator::integer',
        ],
        'maxLifetimeSessionCookie' => [
            'default' => 0,
            'description' => "Specifies the lifetime of the cookie in seconds which is sent to the browser. The value 0 means 'until the browser is closed.'\nHow much time can someone be logged in to the browser. Defaults to 0.",
            'validation' => '\App\Validator::integer',
        ],
        'loginSessionRegenerate' => [
            'default' => true,
            'description' => 'Update the current session id with a newly generated one after login and logout',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'cookieSameSite' => [
            'default' => 'Strict',
            'description' => "Same-site cookie attribute allows a web application to advise the browser that cookies should only be sent if the request originates from the website the cookie came from.\nValues: None, Lax, Strict",
            'validationValues' => ['None', 'Lax', 'Strict'],
        ],
        'cookieForceHttpOnly' => [
            'default' => true,
            'description' => "Force the use of https only for cookie.\nValues: true, false, null",
            'validation' => function () {
                $arg = func_get_arg(0);
                return null === $arg ? $arg : \is_bool($arg);
            },
        ],
        'apiLifetimeSessionCreate' => [
            'default' => 1440,
            'description' => 'Maximum session lifetime from the time it was created (in minutes)',
            'validation' => '\App\Validator::integer',
        ],
        'apiLifetimeSessionUpdate' => [
            'default' => 240,
            'description' => 'Maximum session lifetime since the last modification (in minutes)',
            'validation' => '\App\Validator::integer',
        ],
        'USER_AUTHY_MODE' => [
            'default' => 'TOTP_OPTIONAL',
            'description' => "User authentication mode.\n\n@see \\Users_Totp_Authmethod::ALLOWED_USER_AUTHY_MODE\nAvailable values:\nTOTP_OFF - 2FA TOTP is checking off\nTOTP_OPTIONAL - It is defined by the user\nTOTP_OBLIGATORY - It is obligatory.",
            'validation' => function () {
                $arg = func_get_arg(0);
                return \in_array($arg, \Users_Totp_Authmethod::ALLOWED_USER_AUTHY_MODE);
            },
        ],
        'whitelistIp2fa' => [
            'default' => [],
            'description' => "IP address whitelisting.\nAllow access without 2FA.",
            'validation' => '\App\Validator::ip',
        ],
        'CACHE_LIFETIME_SENSIOLABS_SECURITY_CHECKER' => [
            'default' => 3600,
            'description' => 'Cache lifetime for SensioLabs security checker.',
            'validation' => '\App\Validator::naturalNumber',
        ],
        'forceHttpsRedirection' => [
            'default' => false,
            'description' => 'Force site access to always occur under SSL (https) for selected areas. You will not be able to access selected areas under non-ssl. Note, you must have SSL enabled on your server to utilise this option.',
        ],
        'forceUrlRedirection' => [
            'default' => true,
            'description' => 'Redirect to proper url when wrong url is entered.',
        ],
        'hpkpKeysHeader' => [
            'default' => [],
            'description' => "HTTP Public-Key-Pins (HPKP) pin-sha256 For HPKP to work properly at least 2 keys are needed.\nhttps://scotthelme.co.uk/hpkp-http-public-key-pinning/, https://sekurak.pl/mechanizm-http-public-key-pinning/.",
        ],
        'verifyRefererHeader' => [
            'default' => true,
            'description' => 'Verify referer header',
        ],
        'csrfActive' => [
            'default' => true,
            'description' => 'Enable CSRF protection',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'csrfLifetimeToken' => [
            'default' => 28800,
            'description' => 'Default expire time of CSRF token in seconds',
            'validation' => '\App\Validator::naturalNumber',
            'sanitization' => '\App\Purifier::naturalNumber',
        ],
        'csrfFrameBreaker' => [
            'default' => true,
            'description' => 'Enable verified frame protection, used in CSRF',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'csrfFrameBreakerWindow' => [
            'default' => 'top',
            'description' => 'Which window should be verified? It is used to check if the system is loaded in the frame, used in CSRF.',
            'validationValues' => ['top', 'parent'],
        ],
        'cspHeaderActive' => [
            'default' => true,
            'description' => 'HTTP Content Security Policy response header allows website administrators to control resources the user agent is allowed to load for a given page',
            'validation' => '\App\Validator::alnumSpace',
        ],
        'cspHeaderTokenTime' => [
            'default' => '5 minutes',
            'description' => 'HTTP Content Security Policy time interval for generating a new nonce token',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'allowedImageDomains' => [
            'default' => [],
            'description' => 'Allowed domains for loading images, used in CSP.',
            'loopValidate' => true,
            'validation' => '\App\Validator::text',
        ],
        'allowedFrameDomains' => [
            'default' => [],
            'description' => "Specifies valid parents that may embed a page using <frame>, <iframe>, <object>, <embed> or <applet> and validate referer.\nCSP: frame-ancestors.",
            'loopValidate' => true,
            'validation' => '\App\Validator::url',
        ],
        'allowedScriptDomains' => [
            'default' => [],
            'description' => 'Allowed domains for loading script, used in CSP.',
            'loopValidate' => true,
            'validation' => '\App\Validator::url',
        ],
        'allowedFormDomains' => [
            'default' => ['https://www.paypal.com'],
            'description' => 'Allowed domains which can be used as the target of a form submissions from a given context, used in CSP.',
        ],
        'allowedConnectDomains' => [
            'default' => [],
            'description' => "Allowed domains which can be loaded using script interfaces.\nCSP: connect-src.",
            'loopValidate' => true,
            'validation' => '\App\Validator::url',
        ],
        'generallyAllowedDomains' => [
            'default' => [],
            'description' => 'Generally allowed domains, used in CSP.',
        ],
        'allowedDomainsLoadInFrame' => [
            'default' => [],
            'description' => "Specifies valid sources for nested browsing contexts loading using elements such as <frame> and <iframe>.\nCSP: frame-src.",
            'loopValidate' => true,
            'validation' => '\App\Validator::url',
        ],
        'purifierAllowedDomains' => [
            'default' => [],
            'description' => 'List of allowed domains for fields with HTML support',
        ],
        'proxyConnection' => [
            'default' => false,
            'description' => 'Do you want all connections to be made using a proxy?',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'proxyProtocol' => [
            'default' => '',
            'description' => 'Proxy protocol: http, https, tcp',
            'validationValues' => ['http', 'https', 'tcp', ''],
        ],
        'proxyHost' => [
            'default' => '',
            'description' => 'Proxy host',
            'validation' => '\App\Validator::url',
        ],
        'proxyPort' => [
            'default' => 0,
            'description' => 'Proxy port',
            'validation' => '\App\Validator::port',
        ],
        'proxyLogin' => [
            'default' => '',
            'description' => 'Proxy login',
            'validation' => '\App\Validator::text',
            'sanitization' => '\App\Purifier::purify',
        ],
        'proxyPassword' => [
            'default' => '',
            'description' => 'Proxy password',
            'validation' => '\App\Validator::text',
            'sanitization' => '\App\Purifier::purify',
        ],
        'askAdminAboutVisitPurpose' => [
            'default' => true,
            'description' => '@var bool Ask admin about visit purpose',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'askAdminAboutVisitSwitchUsers' => [
            'default' => true,
            'description' => '@var bool Ask admin about switch users purpose',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'askSuperUserAboutVisitPurpose' => [
            'default' => true,
            'description' => '@var bool Ask super user about visit purpose, only for the settings part',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
    ],
    'sounds' => [
        'IS_ENABLED' => [
            'default' => true,
            'description' => 'Enable system sounds',
            'validation' => '\App\Validator::bool',
            'sanitization' => '\App\Purifier::bool',
        ],
        'REMINDERS' => [
            'default' => 'sound_1.mp3',
            'description' => 'Sets the type of sound of reminders',
        ],
        'CHAT' => [
            'default' => 'sound_2.mp3',
            'description' => 'Sets the type of sound of chat',
        ],
        'MAILS' => [
            'default' => 'sound_1.mp3',
            'description' => 'Sets the type of sound of mails',
        ],
    ],
    'db' => [
        'db_server' => [
            'default' => '>URL<',
            'description' => 'Gets the database server',
            'validation' => '\App\Validator::domain',
            'sanitization' => '\App\Purifier::purify',
        ],
        'db_port' => [
            'default' => '',
            'description' => 'Gets the database port',
            'validation' => '\App\Validator::port',
        ],
        'db_username' => [
            'default' => '_DBC_USER_',
            'description' => 'Gets the database user name',
            'validation' => '\App\Validator::dbUserName',
            'sanitization' => '\App\Purifier::purify',
        ],
        'db_password' => [
            'default' => '_DBC_PASS_',
            'description' => 'Gets the database password',
            'validation' => fn () => true,
        ],
        'db_name' => [
            'default' => '_DBC_NAME_',
            'description' => 'Gets the database name',
            'validation' => '\App\Validator::dbName',
            'sanitization' => '\App\Purifier::purify',
        ],
        'db_type' => [
            'default' => 'mysql',
            'description' => 'Gets the database type',
            'validation' => '\App\Validator::dbType',
        ],
        'db_hostname' => [
            'type' => 'function',
            'default' => 'return self::$db_server . \':\' . self::$db_port;',
            'description' => 'Gets host name.',
        ],
        'base' => [
            'type' => 'function',
            'default' => "return [
    'dsn' => self::\$db_type . ':host=' . self::\$db_server . ';dbname=' . self::\$db_name . ';port=' . self::\$db_port,
    'host' => self::\$db_server,
    'port' => self::\$db_port,
    'username' => self::\$db_username,
    'password' => self::\$db_password,
    'dbName' => self::\$db_name,
    'tablePrefix' => 'yf_',
    'charset' => 'utf8',
];",
            'description' => 'Basic database configuration.',
        ],
    ],
];