...
Блок кода | ||
---|---|---|
| ||
status { // возможность изменения статуса договора //statusChange = { contract -> return contractInGroup( contract, [1, 2, 3, 4, 20] ) && isUserInRoleisCustomer( "customer" ); } //statusChange = { contract -> contractInGroup( contract, [1, 2, 3, 4, 20] ) && isUserInRoleisCustomer( "customer" ) } statusChange = { isUserInRoleisCustomer( "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; } } } |
В замыканиях можно использовать методы:
- isCustomer() или isUserInRole('customer') - возвращает true, если в режиме аутентификации, которым воспользовался абонент, не указан параметр role = 'unauthCustomer';
- contractInGroup( contract, groupIds ) - возвращает true, если переданный в первый аргумент объект-contract содержит в себе одну из групп, указанных списке второго аргумента, например: contractInGroup( contract, [2, 3, 8, 13] ).
Основная конфигурация (mybgbilling-conf.groovy)
...
Блок кода | ||
---|---|---|
| ||
content { kernel { // название контрагента, отображаемое на странице customerTitle = { contract, contractParameterMap -> contract.comment } ... } |
Или же отобразить параметр договора, в зависимости от типа лица договора (физ. лицо или юр. лицо):
Блок кода | ||
---|---|---|
| ||
content {
kernel {
// название контрагента, отображаемое на странице
customerTitle = { contract, contractParameterMap ->
// ID параметров договоров названия физ. лиц (для customerTitle)
def individualCustomerTitleParamIds = [33, 0, 0, 0, 0];
// ID параметров договоров названия юр. лиц (для customerTitle)
def corporationCustomerParamIds = [10, 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 );
return result;
}
...
}
...} |
Группировка субдоговоров в меню
Если субдоговоров у данного договора меньше 10 - они отображаются прямо в меню. В этом случае можно сортировать и группировать список субдоговоров:
Блок кода | ||
---|---|---|
| ||
content {
kernel {
// группировка субдоговоров (для меню)
subContractGroup = { subContractList ->
subContractList
.stream()
.sorted({ a,b -> a.title.compareTo(b.title) })
.collect( Collectors.groupingBy{ contract ->
// можно группировать субдоговора по группам договоров
if( contractInGroup( contract, [1, 2, 3, 4, 20] ) ) {
return "contract.sub.group.01.internet";
}else if( contractInGroup( contract, [5, 6, 7, 8, 9] ) ) {
return "contract.sub.group.02.phone";
} else {
return "contract.sub.group.99.other";
}
// если всем возвращать пустую строку - то группировки не будет
return "";
})
.entrySet()
.stream()
.sorted({ a,b -> a.key.compareTo(b.key) })
.collect( Collectors.toList() );
}
...
}
...} |
В примере при группировке используются строки вида "contract.sub.group.01.internet". Число в данном случае используется для сортировки групп, а само название группы должно быть прописано в Locale_ru_RU.properties по ключу:
Блок кода | ||
---|---|---|
| ||
contract.sub.group.01.internet=Интернет
contract.sub.group.02.phone=Телефония
contract.sub.group.99.other=Другое |
Конфигурация меню (mybgbilling-menu.groovy)
Данный файл конфигурации возвращает дерево пунктов меню для договора. Выглядит конфигурация, например, так:
Блок кода | ||
---|---|---|
| ||
menu {
// список пунктов верхнего уровня
children = [
// Новости
menu( page: "kernel/news", icon: "fa-newspaper-o", title: "menu.news" ),
// Уведомления + Рассылки
menu( page: "kernel/notificationsEx", subPage: "notifications", icon: "fa-envelope-o",
title: "menu.notifications", badge: "#{notificationBean.getUnreadCount()}", badgeUpdate: "#{notificationBean.populate()}",
show: isCustomer() ),
// Уведомления (отдельно от рассылок)
menu( page: "kernel/notifications", icon: "fa-envelope-o", title: "menu.notifications",
show: !isCustomer() ),
// Баланс
menu( page: "kernel/balance", icon: "fa-rub", title: "menu.balance" ),
// Лимит
menu( page: "kernel/limit", icon: "fa-umbrella", title: "menu.limit" ),
// Тарифные опции
menu( page: "kernel/tariffOptions", icon: "fa-cogs", title: "menu.tariffOptions", show: isCustomer() ),
// Договор
menu( icon: "fa-briefcase", title: "menu.contract" ) {
children = [
// Статус
menu( page: "kernel/status", title: "menu.status" ),
// Тарифы
menu( page: "kernel/tariffs", title: "menu.tariffs", show: isCustomer() ),
// Действия
menu( page: "kernel/additionalActions", title: "menu.additionalActions", show: isCustomer() ),
// Документы
menu( page: "kernel/documents", title: "menu.documents", show: isCustomer() ),
// Документы (включены в предыдущий пункт)
//menu( page: "plugins/documents/documents", title: "menu.documents" ),
// Бухгалтерия
menu( module: "bill", page: "modules/bill/bill", title: "menu.bill", show: isCustomer() ),
// Примечания
menu( page: "kernel/notes", title: "menu.notes", show: isCustomer() ),
// Смена пароля
menu( page: "kernel/password", title: "menu.password", show: isCustomer() )
]
},
// Интернет
menu( module:"inet", icon:"fa-globe", title:"menu.inet" ) {
children = [
// Сессии
menu( page: "modules/inet/sessions", title: "menu.inet.sessions" ),
// Трафик
menu( page: "modules/inet/traffics", title: "menu.inet.traffics" ),
// Смена пароля
menu( page: "modules/inet/password", title: "menu.inet.password", show: isCustomer() )
]
},
// ТВ
menu( module:"tv", page:"modules/tv/tv", icon:"fa-tv", title:"menu.tv" ),
// Поддержка
menu( page: "plugins/helpdesk/helpdesk", icon: "fa-wrench", title: "menu.helpdesk",
badge: "#{helpdeskBean.getUnreadTopicCount()}", badgeUpdate: "#{helpdeskBean.populateTopics()}",
show: isCustomer() )
]
} |
У каждого объекта-пункта меню есть набор параметров:
- module - модуль, если данный пункт относится к модулю;
- page - страница, без .xhtml;
- subPage - подстраница;
- icon - иконка;
- title - название пункта меню (ключ для Locale.properties);
- badge - счетчик, указывается JSF-вызов метода, который вернет число;
- badgeUpdate - JSF-вызов метода, который нужно произвести для обновления счетчика
- show - показывать пункт или нет (если не указан, то показывать)
- children - список дочерних пунктов меню
Список дочерних пунктов меню можно определить как переменную:
Блок кода | ||
---|---|---|
| ||
asd |