Примеры скриптов кастомизации

Добавление в текст оповещения последнего комментария к объекту

Если комментарий отсутствует в оповещении указано "отсутствует".

//Категория: Кастомизация оповещения
//Назначение: Cкрипт отправляет в письме оповещения последний комментарий, если комментарий отсутствует в оповещении указано "отсутствует"

//ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННОЙ-------------------------------------------
// В тело оповещения вставляется переменная: ${notification.scriptParams['comm']}

//ОСНОВНОЙ БЛОК------------------------------------------------------
def commentList = utils.comments(subject)
notification.scriptParams['comm'] = commentList.isEmpty() ? "отсутствует" : commentList[commentList.size() - 1].text

Добавление получателей оповещения из атрибутов

//Категория: Кастомизация оповещения
 //Назначение:
 /**
  * Данный скрипт оперирует следующими понятиями:
  * - ПОЛУЧАТЕЛЬ
  *      Атрибут содержащий данные необходимые для отправки оповещения.
  *      Получатели могут быть либо строкой, либо ссылкой на бизнес-объект, либо набором ссылок на бизнес-объекты, либо обратной сссылкой.
  *      Если получатель - строка, она должна содержать адрес эл. почты.
  *      Если получатель - ссылка(ки) на бизнес-объект, бизнес-объект должен иметь атрибут с кодом "email" (например, класс "Сотрудник")

  * - ТЕКУЩИЙ ОБЪЕКТ (subject)
  *      Объект который стал причиной отправки оповещения. Например, если оповещение вызвано сменой статуса запроса, текущим объектом будет запрос.
       
  * - ПОЛУЧАТЕЛЬ ТЕКУЩЕГО ОБЪЕКТА - задается параметром RECIPIENTS.
        
  * - СВЯЗАННЫЙ ОБЪЕКТ - задается параметром LINKED_OBJECTS
  *      Объект связанный с текущим при помощи одного из атрибутов.
  *      Атрубуты связи могут иметь любой из следующих типов:
  *          - ссылка на бизнес-объект
  *          - набор ссылок на бизнес-объекты
  *          - обратная ссылка
  *      Бизнес-объект может быть любого типа.

  * - ПОЛУЧАТЕЛЬ СВЯЗАННОГО ОБЪЕКТА - задается параметром LINKED_RECIPIENTS.
  *
  * Алгоритм работы:
  *      Скрипт ищет ПОЛУЧАТЕЛЕЙ оповещения в атрибутах ТЕКУЩЕГО ОБЪЕКТА и/или в атрибутах СВЯЗАННЫХ ОБЪЕКТОВ.
  *      Если находит, добавляет к списку получателей оповещения. Если не находит, пишет сообщение в лог и продолжает поиск.
  */
        
//ПАРАМЕТРЫ----------------------------------------------------------
def RECIPIENTS = [
//получатели текущего объекта (коды атрибутов объекта subject)
'',
''
]
def LINKED_OBJECTS = [
//связанные объекты (коды атрибутов объекта subject)
'',
''
]
def LINKED_RECIPIENTS = [
//получатели связаных объектов (коды атрибутов связанных объектов)
'',
''
]
def LOGGING_IS_ENABLED = false // true - логирование включено, false - логирование отключено
//ФУНКЦИИ------------------------------------------------------------
def foreach(objects, Closure closure)
{
if(!objects)
return false
if(objects instanceof Collection)
objects.each(closure)
else
closure(objects)
return true
}
def extractAttribute(object, String attribute)
{
try
{
object[attribute]
}
catch (e)
{
null
}
}
//ОСНОВНОЙ БЛОК------------------------------------------------------
def countOfRecipients = 0
def log = { message ->
if(LOGGING_IS_ENABLED) logger.debug(message)
}
def error = { message ->
if(LOGGING_IS_ENABLED) logger.error("Не удалось добавить получателей ($message)")
}
def addEmail = { String email, String title ->
log("Добавление получателя: '$title <$email>'")
notification.to[email] = title
countOfRecipients++
}
def addRecipientsByCodes = { object, attributes ->
attributes.findAll().each {
log("Обработка атрибута: '$it'")
def recipient = extractAttribute(object ,it)
if(!recipient)
{
error("атрибут не существует или пуст")
return
}
if(recipient instanceof String)
addEmail(recipient, '')
else
{
foreach(recipient) {
def email = extractAttribute(it, 'email')
if(!email)
{
error("объект ${it.getMetainfo()}='${it.title}' не содержит атрибут 'email' или он пуст")
return
}
addEmail(email, it.title)
}
}
}
}
log("Скрипт добавления получателей оповещения")
log("Поиск по атрибутам объекта subject: ${subject.getMetainfo()} = '${subject.title}'")
addRecipientsByCodes(subject, RECIPIENTS)
log("Поиск по связанным объектам")
LINKED_OBJECTS.findAll().each { attribute ->
log("Обаботка атрибута связи: '$attribute'")
def object = extractAttribute(subject, attribute)
if(!object)
{
error("атрибут не существует или пуст")
return
}
def result = foreach(object) {
log("Обработка связанного объекта: ${it.getMetainfo()} = '${it.title}'")
addRecipientsByCodes(it, LINKED_RECIPIENTS)
}
if(!result)
error("атрибут пуст")
}
log("Всего добавлено получателей: $countOfRecipients")