Скрипт действия при входе в статус / выходе из статуса

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

Скрипт задает действия, которые будут автоматически выполняться при переводе объекта в другой статус.

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

Форма "Добавление действия", вызванная из карточки статуса жизненного цикла, см. Действия при смене статуса.

Когда выполняется скрипт

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

Результат выполнения скрипта

Нет возвращаемого значения.

Переменные и их значения

Глобальные переменные:

  • user — пользователь, инициализировавший событие. Является объектом класса "Сотрудник" (employee).

    Если событие инициализировал суперпользователь, то user=null.

    Если событие инициализировано скриптом (скриптовое действие по событию, скрипт на вход в статус), то переменная user берется из контекста инициировавшего его скрипта.

    Пример: пользователь выполнил изменение атрибута → произошло изменение статуса объекта (действие по событию) → произошло изменение ответственного (действие на вход в статус) → произошло оповещение (действие по событию) .Во всех скриптах этой цепочки переменная user должна содержать сотрудника, выполнившего первоначальное изменение атрибута.

  • ip — ip-адрес рабочего места пользователя user. Если действие выполняется автоматически системой, а не пользователем, то переменная не определяется.
  • appVersion — версия приложения.
  • api — используется для обращения к методам api, например api.utils, api.ldap, api.timing, см. Методы API;
  • modules — используется для обращения к скриптовому модулю и конкретному методу, определенному в нем, с помощью конструкции: modules.{код модуля}.{имя метода}({параметры метода}...), см. Скрипт текста модуля;
  • logger — используется для отладки скриптов и позволяет вывести в лог на указанный уровень переданную строку, см. Оформление и отладка скриптов.
  • utils — синоним api.utils.

Переменные контекста:

  • subject — текущий объект, статус которого изменяется;
  • oldSubject — объект в состоянии до изменения статуса;

    При использовании переменной значение атрибутов типа "Обратная ссылка" всегда будет равно null.

  • initialValues — значения атрибутов на форме смены статуса и на форме добавления объекта (при входе в статус "Зарегистрирован" (registered)).

    При проверке значения initialValues на null следует использовать конструкции if(!initialValues) или if(initialValues.isEmpty()).

    Примеры использования initialValues:

    initialValues.getProperty('service')initialValues.getProperty('client')

    У определенного атрибута можно получить его свойства:

    // UUID
    def uuid = client.UUID
    // Название атрибута
    def title = client.title

    Значение атрибута "Ответственный" (responsible):

    initialValues.getProperty('responsible')
    // ответственная команда
    def team = resp.team
    // ответственный сотрудник
    def employee = resp.employee
  • comment — текст комментария, заполненный при смене статуса или при смене ответственного.
  • isCommentPrivate — признак приватности комментария, заполненного на форме смены статуса или форме смены ответственного:

    • true — комментарий, заполненный при смене ответственного или при смене статуса, приватный;
    • false — комментарий не приватный.
  • cardObject — объект, из карточки которого было инициировано действие.

    Если действие инициировано не из карточки объекта, то cardObject = null.

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

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

Примеры скрипта

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

def STATES = [
'closed',
'registered',
'resolved'
]
if (STATES.contains(oldSubject.state))
{
utils.edit(subject, [ 'responsibleEmployee' :  oldSubject.responsibleEmployee, 'responsibleTeam' : oldSubject.responsibleTeam ])
}

2. Скрипт при входе объекта в статус заполняет атрибут текущей датой/временем.

//ПАРАМЕТРЫ------------------------------------------------------------
// код атрибута, куда будет помещено значение текущей даты-времени
final def DATE_TIME_CODE = 'lastSolved' 
//ОСНОВНОЙ БЛОК--------------------------------------------------------
utils.edit(subject, [(DATE_TIME_CODE) : new Date()])

3. Скрипт копирует значение атрибута в комментарий.

//ПАРАМЕТРЫ------------------------------------------------------------
//код атрибута, значение которого надо скопировать
ATTRIBUTE     = 'attrCode'; 
//текст перед значением атрибута
PRE_TEXT      = 'Вопрос от специалиста: '; 
//текст после значения атрибута
POST_TEXT     = '';  
//ОСНОВНОЙ БЛОК--------------------------------------------------------
def properties = [:];
def attrValue = utils.asRTF(subject, ATTRIBUTE)
if (attrValue.isEmpty())
{
 utils.throwReadableException("Комментарий не создан. Значение атрибута '${ATTRIBUTE}' пусто.")
 }
properties.text = api.string.concat("", [PRE_TEXT, attrValue, POST_TEXT])
properties.author = user
properties.source = subject.UUID
api.utils.create('comment', properties)