Условия выполнения действия по событию

Описание настройки

Для каждого действия по событию может быть задано одно или несколько условий выполнения этого действия.

Момент проверки условия зависит от значения параметра "Выполнять проверку синхронно":

  • синхронные условия проверяются сразу после наступления инициирующего события (в той же транзакции);
  • асинхронные условия проверяются непосредственно перед выполнением действия по событию.

Если для действия по событию заданы значения параметра "Выполнять действие при изменении атрибутов" (Инициирующие события для выполнения действия по событию), то сначала выполняется проверка, изменились ли указанные в списке атрибуты.

Место настройки в интерфейсе

Меню навигации "Настройка системы" → настройка "Действия по событиям" → вкладка "Действия по событиям" → карточка действия по событию → блок "Условия выполнения действия".

Выполнение настройки

В блоке "Условия выполнения действия" нажмите Добавить условие, на форме добавления заполните поля и нажмите Сохранить.

Поля на форме добавления условия действия по событию:

  • Название — название скрипта, используемое в системе.
  • Выполнять проверку синхронно:

    • флажок снят (по умолчанию) — проверка условия проводится непосредственно перед выполнением действия (асинхронное условие);
    • флажок установлен — проверка условий выполняется сразу после наступления инициирующего события, в той же транзакции (синхронное условие).
  • Скрипт — содержание скрипта, который задает и проверят условия выполнения действия по событию.

Результат настройки

Условия заданы и будут проверяться при выполнении действия по событию.

Условия выполнены

Если проверка прошла успешно, то далее система будет проверять условия выполнения действия по событию, заданные в самом скрипте. Выполнение действия или постановка его в очередь происходит уже после проверки.

Если заданы только синхронные условия:

  • Для синхронных действий по событию:

    • Наступление инициирующего события, проверка условий и само действие выполняются в рамках одной транзакции.
    • Синхронные условия проверяются в произвольном порядке, до первого ошибочного.
    • Действие по событию выполняется, если все условия выполнены.
  • Для асинхронных действий по событию:

    • После наступления инициирующего события выполняется проверка синхронных условий в рамках одной транзакции. Синхронные условия проверяются в произвольном порядке, до первого ошибочного.
    • Если все синхронные условия выполнены, действие по событию становится в очередь выполнения.

Если заданы только асинхронные условия:

  • Для синхронных действий по событию:

    • Наступление инициирующего события, проверка условий и само действие выполняются в рамках одной транзакции.
    • Асинхронные условия в произвольном порядке, до первого ошибочного.
    • Действие по событию выполняется, если все условия выполнены.
  • Для асинхронных действий по событию:

    • После наступления инициирующего события действие по событию становится в очередь выполнения.
    • В момент обработки действия в очереди выполняется проверка асинхронных условий в произвольном порядке, до первого ошибочного. Действие выполняется, если все условия выполнены.

Если заданы синхронные и асинхронные условия, то:

  • Для синхронных действий по событию:

    • Наступление инициирующего события, проверка условий и само действие выполняются в рамках одной транзакции.
    • Сначала проверяются синхронные условия в произвольном порядке, затем — асинхронные условия в произвольном порядке. Условия проверяются до первого ошибочного.
    • Действие по событию выполняется, если все условия выполнены.
  • Для асинхронных действий по событию:

    • После наступления инициирующего события выполняется проверка синхронных условий в рамках одной транзакции. Синхронные условия проверяются в произвольном порядке. Условия проверяются до первого ошибочного.
    • Если все синхронные условия выполнены, действие по событию становится в очередь выполнения.
    • В момент обработки действия в очереди выполняется проверка асинхронных условий в произвольном порядке. Условия проверяются до первого ошибочного. Действие по событию выполняется, если все условия выполнены.

Условия не выполнены

Если проверка не прошла, действие не выполняется независимо от того синхронное оно или нет.

При этом информация о причине ошибки фиксируется в логе событий, а в логе приложения создается запись с уровнем логирования WARN.

  • Для синхронных действий по событию:

    • Если не выполнено синхронное условие, то в интерфейсе оператора отображается сообщение об ошибке в отдельном окне.
  • Для асинхронных действий по событию:

    • Если хотя бы одно синхронное условие не выполнено:

      • Для действия по событию "Пользовательское событие" в интерфейсе оператора отображается сообщение об ошибке в отдельном окне.
      • Для остальных событий сообщение об ошибке записывается только в лог приложения и лог событий.
    • Если хотя бы одно асинхронное условие не выполнено, то сообщение об ошибке записывается только в лог приложения и лог событий.

Примеры условий отправки оповещения

Комментарий к объекту добавлен в рамках изменения статуса или не в рамках изменения статуса

Copy
//Категория: Условия выполнения действий по событию.
//Назначение: проверка условия - комментарий был добавлен при изменении статуса/ не в рамках изменения статуса.

//ПАРАМЕТРЫ----------------------------------------------------------
// логическая переменная, если значение true, то проверяем добавление в рамках смены статуса, 
//если false, то не в рамках смены статуса.
def IN_CHANGE_STATE = true

//ОСНОВНОЙ БЛОК------------------------------------------------------
if(IN_CHANGE_STATE == (comment != null))
{
return ""
}
return "условие не выполнилось"

Добавляемый комментарий не является приватным

Copy
//Категория: Условия выполнения действий по событию.
//Назначение: проверка условия - добавляемый комментарий не является приватным.

// Возвращаем список всех комментариев, комментарии расположены в хронологическом порядке
def comments = utils.comments(subject)
// Берется последний добавленный комментарий
def LastComment=comments[-1]
// проверяются условия приватности добавленного комментария
if (!LastComment.private)
{
return ''
}
else
{
return "Условие не выполнилось. Был добавлен приватный комментарий"
}

Запрос зарегистрирован клиентом

Copy
//Категория: Условия выполнения действий по событию
//Назначение: запрос зарегистрирован клиентом
        
//ОСНОВНОЙ БЛОК------------------------------------------------------
if (utils.equal(subject.author, subject.clientEmployee))
{
return ""
}
return "Заданное условие не выполнилось."

Объект находится /не находится в указанных статусах

Copy
//Категория: Условия выполнения действий по событию
//Назначение: 
//* Если переменнная CONTAINS=true, 
//то проверяется условие - нахождение объекта в одном из перечисленных статусов.
//* Если переменнная CONTAINS=false, 
//то проверяется условие - объект не находится ни в одном из перечисленных статусов.
        
//ПАРАМЕТРЫ----------------------------------------------------------
def STATES = [
'resolved',
'state2']   // Коды статусов
def CONTAINS = true             
// логическая переменная: содержит или не содержит
        
//ОСНОВНОЙ БЛОК------------------------------------------------------
return STATES.contains(subject.state) == CONTAINS ? "" : "Статус не соответствует."

Назначен ответственный за запрос

Copy
//Категория: Условия выполнения действий по событию
//Проверка условия: назначен ответственный за запрос.
      
//ОСНОВНОЙ БЛОК------------------------------------------------------
if (subject.responsible != null)
{
return ""
}
return "Заданное условие не выполнилось."

Ответственный за запрос совпадает с указанным в скрипте

Copy
//Категория: Условия выполнения действий по событию
//Назначение: ответственный за запрос (команда) = заданной в скрипте
       
//ПАРАМЕТРЫ----------------------------------------------------------
def RESPONSIBLE = 'team$1802' // Уникальный идентификатор команды
        
 //ОСНОВНОЙ БЛОК------------------------------------------------------
if (subject.responsible?.UUID == RESPONSIBLE)
{
return ""
}
return "Заданное условие не выполнилось."

Запрос выполняется в рамках определенного соглашения

Copy
//Категория: Условия выполнения действий по событию
//Назначение: запрос выполняется в рамках определенного соглашения

//ПАРАМЕТРЫ----------------------------------------------------------
def AGREEMENT = 'agreement$2001' // Уникальный идентификатор соглашения

//ОСНОВНОЙ БЛОК------------------------------------------------------
if (subject.agreement?.UUID == AGREEMENT)
{
return ""
}
return "Заданное условие не выполнилось."

Изменен атрибут объекта

Copy
//Категория: Условия выполнения действий по событию
//Назначение: был изменен конкретный атрибут объекта, например "Влияние" запроса
//ПАРАМЕТРЫ----------------------------------------------------------
def ATTRIBUTE = 'impact' // Код атрибута, который был изменен

//ОСНОВНОЙ БЛОК------------------------------------------------------
if (!utils.equal (subject[ATTRIBUTE], oldSubject[ATTRIBUTE]))
{
return ""
}
return "Заданное условие не выполнилось."

Комплекс условий

1. Запрос зарегистрирован клиентом и находится в заданном статусе

Copy
//Категория: Условия выполнения действий по событию
//Назначение: Скрипт - условие действия по событию: 
//запрос зарегистрирован клиентом и Находится в статусе заданном в скрипте.

//ПАРАМЕТРЫ----------------------------------------------------------
def STATE = 'registered' // Код статуса
        
//ОСНОВНОЙ БЛОК------------------------------------------------------
if (subject.state == STATE
&&  utils.equal(subject.author, subject.clientEmployee))
{
return ""
}
return "Заданные условия не выполнились."

2. Запрос находится в любом статусе кроме заданного и не находится в персональной ответственности

Copy
//Категория: Условия выполнения действий по событию
//Проверка условий:  Статус запроса отличается от заданного в скрипте значения и запрос не находится в персональной ответственности.

//ПАРАМЕТРЫ----------------------------------------------------------
def STATE  = 'registered'   // Код статуса

//ОСНОВНОЙ БЛОК------------------------------------------------------
if (subject.responsibleEmployee != null || subject.state == STATE)
{
return "Заданные условия не выполнились."
}

или

Copy
//ОСНОВНОЙ БЛОК------------------------------------------------------
 if (subject.responsibleEmployee == null
 && subject.state != STATE)
 {
 return ""
 }
 return "Заданные условия не выполнились."