Конфигурация ЛК состоит из трех файлов, расположенных в папке WEB-INF: основного файла конфигурации mybgbilling-conf.groovy, файла конфигурации меню mybgbilling-menu.groovy, файла конфигурации платежных систем mybgbilling-payment.groovy. Файлы конфигурации созданы с использованием синтаксиса Groovy.
Описание синтаксиса
Группы параметров в конфиге разделяются не точкой, а с помощью вложенных блоков. Значение параметра должно быть правильным Groovy/Java-объектом - в простом случае строкой, заключенной в одинарные или двойные кавычки, или числом, например:
one { two { parameterA = 'value1' three { parameterA = 'value2' parameterB = 100 } } }
Т.е. параметр конфигурации - это один или несколько вложенных блоков, имя параметра и значение после знака =. Данный пример в конфигурации модулей биллинга выглядел бы так:
one.two.parameterA=value1 one.two.three.parameterA=value2 one.two.three.parameterB=100
Некоторые значения параметров должны быть списками или массивами определенных объектов. Объекты списка заключены в квадратные скобки [] и разделены между собой символом запятой. Например:
authentication { modes = [ authenticationMode { mode = 'contract' }, authenticationMode { mode = 'login' module = 'inet' moduleId = 1 } ] }
Некоторые значения параметров могут быть ассоциативными массивами (список ключ:значение, map). Связки ключ:значение заключены в квадратные скобки [] и разделены между собой символом запятой. Например:
example { map = [ key: 'value', key2: 200 ] }
Также параметры могут быть прописаны как ассоциативный массив, заключенный в круглые скобки (значение в этом случае прописывается через ':' (двеоточие), а не через символ '='):
authentication { modes = [ authenticationMode( mode: 'contract' ), authenticationMode( mode: 'login', module: 'inet', moduleId: 1 ) } ] }
Некоторые значения могут быть динамическими, если использовать замыкания (closure). Т.е., грубо говоря, значением может быть функция, которая будет возвращать нужное значение:
status { // возможность изменения статуса договора //statusChange = { contract -> return contractInGroup( contract, [1, 2, 3, 4, 20] ) && isUserInRole( "customer" ); } //statusChange = { contract -> contractInGroup( contract, [1, 2, 3, 4, 20] ) && isUserInRole( "customer" ) } statusChange = { isUserInRole( "customer" ) } }
В mybgbilling-conf.groovy и mybgbilling-menu.groovy в таких замыканиях можно использовать определенный набор методов, аргумент объект-contract, а также дополнительные аргументы, специфичные для определенного параметра конфигурации (например, параметры content.kernel.customerTitle и content.kernel.subContractGroup):
content { kernel { // название контрагента, отображаемое на странице customerTitle = { contract, contractParameterMap -> // ID параметров договоров названия физ. лиц (для customerTitle) def individualCustomerTitleParamIds = [0, 0, 0, 0, 0]; // ID параметров договоров названия юр. лиц (для customerTitle) def corporationCustomerParamIds = [0, 0, 0, 0, 0]; def paramIds = contract.personType == 1 ? corporationCustomerParamIds : individualCustomerTitleParamIds; String result = contractParameterMap.values().stream() .filter{ v -> paramIds.contains( v.entitySpecAttrId ) && notBlankString( v.toString() ) } .findFirst() .map{ v -> v.toString() } .orElse( null ); // можно отобразить и просто комментарий договора //if( result == null ) { // result = contract.comment; //} return result; } } }
Основная конфигурация (mybgbilling-conf.groovy)
Основная конфигурация личного кабинета состоит из нескольких блоков:
- bgbilling - конфигурация подключения к BGBillingServer,
- authentication - параметры аутентификации абонента,
- mail - параметры почтовой подсистемы (чтобы ЛК мог отправлять письма при необходимости),
- content - параметры содержимого страниц.
Конфигурация подключения к BGBillingServer
// Параметры подключения к BGBillingServer. // ЛК является пользователем биллинга, общается с ним также, как BGBillingClient bgbilling { // URL доступа к BGBilling url = 'http://127.0.0.1:8080/bgbilling/executer' // Логин user = 'customer' // Пароль password = '123456' }
Параметры аутентификации абонента
// Параметры аутентификации абонента authentication { // Кол-во ошибок аутентификации, после которого будет отображаться captcha для этого логина captchaLoginErrorCount = 5 // Кол-во ошибок аутентификации, после которого будет отображаться captcha для хоста captchaHostErrorCount = 20 // Кол-во ошибок аутентификации, после которых будут заблокированы попытки этого хоста blockHostErrorCount = 30 // Режимы аутентификации для входа в ЛК modes = [ // аутентификация по номеру договора authenticationMode { mode = 'contract' } ] }
Режимов аутентификации может быть несколько - в этом случае в окне логина можно выбрать необходимый. На данный момент поддерживаются три режима аутентификации:
по номеру договора
authenticationMode { mode = 'contract' }
по логину модуля Inet
authenticationMode { module = 'inet' mode = 'login' // ID модуля moduleId = 1 }
по IP-адресу сессии модуля Inet (вход без пароля)
authenticationMode { module = 'inet' mode = 'ip' // ID модуля moduleId = 1 // ограниченный доступ role = 'unauthCustomer' }
Для режима аутентификации можно назначить, чтобы доступ после аутентификации через него был ограничен. Для этого указывается параметр role = 'unauthCustomer'. В этом случае, вызов isUserInRole( "customer" ) будет возвращать false. Ограниченный доступ может быть указан, например, для режима аутентификации по IP-адресу модуля Inet.
Можно разрешить аутентификацию для определенных групп договоров, указав условие в параметре filter:
authenticationMode { module = 'inet' mode = 'ip' //ID модуля moduleId = 1 // ограниченный доступ role = 'unauthCustomer' // фильтр по группам договоров filter = { contract -> contractInGroup( contract, [1, 2, 3, 4, 20] ) } }
Или наоборот, запретить для определенных групп договоров:
filter = { contract -> !contractInGroup( contract, [1, 2, 3, 4, 20] ) }
Или разрешить по номеру договора:
filter = { contract -> contract.title.startsWith( "NK" ) }
Или использовать регулярное выражение:
filter = { contract -> contract.title.matches( "NK.*" ) }
Параметры почтовой подсистемы
// Параметры SMTP, чтобы ЛК мог отправлять письма mail { smtp { host = 'smtp.provider.ru' } from { email = 'support@provider.ru' name = 'BGBilling' } }
Параметры содержимого страниц
Разрешенные фрагменты
Данный блок конфигурации позволяет настраивать, какие фрагменты страницы или какие действия доступны абонентам или группам абонентов. Например, в коде страницы статусов договора есть фрагмент смены статуса:
<ui:fragment rendered="#{configuration.get('content.kernel.status.statusChange', true)}"> ... </ui:fragment>
Соответственно можно в конфигурации запретить всем менять статус договора из личного кабинета:
content { kernel { ... // status.xhtml status { // возможность изменения статуса договора statusChange = false } ... } ... }
Можно разрешить только тем, кто был аутентифицирован по логину/паролю (в конфигурации по умолчанию установлен этот вариант):
statusChange = { isUserInRole( "customer" ) }
Разрешить только аутентифицированным по логину/паролю физ. лицам:
statusChange = { contract -> isUserInRole( "customer" ) && contract.getPersonType() == 0 }
Или разрешить только аутентифицированным по логину/паролю определенным группам договоров:
statusChange = { contract -> isUserInRole( "customer" ) && contractInGroup( contract, [1, 2, 3, 4, 20] ) }
Название контрагента в верхней части страницы
По умолчанию в шапке страницы название или имя контрагента не отображается. В конфигурации можно указать,
Группировка субдоговоров в меню