Скрипты фильтрации соглашений/услуг/типов при редактировании

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

Скрипт применяется для фильтрации соглашений, и/или услуг, или типов запроса в полях "Тип запроса" и "Новый тип запроса" на всех формах редактирования и добавления объекта (например, форма добавления запроса, форма изменения привязки запроса, форма смены типа), кроме формы быстрой фильтрации.

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

Структура скрипта

Формально скрипт состоит из двух частей:

Часть 1, вычисляемая в интерфейсе администратора (subject == null). Возвращается список кодов атрибута, от которых зависит данный атрибут.

def ATTRS_FOR_UPDATE_ON_FORMS = ['attrCode1', 'attrCode2', ...]
// Обязательная проверка! Даже если фильтрующих атрибутов нет.
if (subject == null)
{
return ATTRS_FOR_UPDATE_ON_FORMS
}

Часть 2, вычисляемая в интерфейсе оператора (в момент открытия формы). Возвращается список объектов, которые будут отображаться в списке.

return utils.find('class$type',['attrCode1':'value1']...);

Если скрипт фильтрации должен вернуть все объекты (более 500), то вместо конструкции типа:

return utils.find('class$type',[:])

рекомендуется использовать конструкцию, которая значительно сократит время формирования списка объектов:

return api.filtration.disableFiltration()

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

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

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

В интерфейсе технолога: скрипт возвращает коллекцию (список) кодов атрибутов, от которых зависят возможные значения фильтруемого атрибута. Условие выполнения скрипта subject==null. Если значение фильтруемого атрибута не зависит ни от одного из атрибутов объекта, то возвращается пустой список [].

В интерфейсе оператора: скрипт возвращает коллекцию (список) объектов классов "Соглашение" (agreement) и "Услуга" (slmService), доступных для выбора (скрипт фильтрации соглашений/услуг), или список строк fqn'ов или объектов ClassFqn, доступных для выбора (скрипт фильтрации типов запроса). Если скрипт не обнаружил ни одного объекта, удовлетворяющего условиями фильтрации, то возвращается "пусто", что означает отсутствие значений, доступных для выбора.

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

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

  • 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 — владелец атрибута. Переменная может использоваться во всех скриптах фильтрации.

    Если скрипт используется на форме добавления, то в переменной subject содержится набор атрибутов, определяющих фильтрацию.

  • sourceForm — значения полей формы, с которой была открыта текущая форма быстрого добавления и редактирования. Пример: sourceForm.title

    В остальных случаях переменная имеет значение null.

  • cardObject — объект, с карточки которого было инициировано действие.

    Переменная не поддерживается в мобильном приложении.

    Если действие осуществляется не с карточки объекта (например, с формы добавления), то cardObject = null.

    Например, если с карточки запроса вызвана форма редактирования связанного объекта, то cardObject — объект класса "Запрос" (serviceCall), с карточки которого вызвана форма редактирования.

  • origin — тип месторасположения.

    Переменная не поддерживается в мобильном приложении.

    Возможные значения:

    • readForm (форма для чтения) — скрипт вычисляется на карточке объекта, на сложной форме добавления и редактирования связей (расширенная форма редактирования), в списке по ссылке на отдельной странице, в списке на странице результатов поиска, при нажатии на кнопку вызова действий в строке списка;
    • addForm — скрипт вычисляется на форме добавления, на быстрой форме добавления;
    • editForm — скрипт вычисляется на форме редактирования объекта, на форме редактирования атрибутов, вызванной из контента "Параметры объекта", на форме редактирования в ячейке списка, на форме быстрого редактирования, на форме массового редактирования, на форме смены типа; на форме смены ответственного, на форме смены привязки (переклассификации), на форме работы с массовостью (управление массовостью запроса), на форме смены статуса, на форме перемещения (смены родителя);
    • addFormComment/editFormComment — скрипт вычисляется на форме добавления/редактирования комментария;
    • addFormFile/editFormFile — скрипт вычисляется на форме добавления/редактирования файла.

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

  • Скрипт фильтрации соглашений/услуг возвращает только объекты классов "Соглашение" (agreement) и "Услуга" (slmService) либо их идентификаторы.
  • Скрипт фильтрации типов запроса возвращает только объекты класса ClassFqn или их строковые идентификаторы (fqn'ы).
  • Возможно раздельное ограничение списка соглашений и списка услуг, а также списка типов, настройка выполняется отдельно для каждого атрибута.
    • Если ограничен список соглашений, то в списке не отображаются несоответствующие условиям фильтрации соглашения и связанные с ними услуги, вне зависимости от представления для редактирования списка.
    • Если ограничен список услуг, то в списке не отображаются только несоответствующие условиям фильтрации услуги.
    • Если ограничен список типов, то в списке не отображаются только несоответствующие условиям фильтрации типы.
  • Фильтрация применяется именно к раскрывающемуся списку "Соглашение/Услуга" или "Тип запроса": если контент "Выбор типа запроса" не отображается на форме добавления запроса и задано значение по умолчанию поля "Соглашение/Услуга" или "Тип запроса", то его соответствие условиям фильтрации не проверяется.

Рекомендации

Для получения FQN класса (типа) объекта рекомендуется использовать метод .getMetainfo(). Для сравнения его со строкой необходимо выполнить явное преобразование с помощью метода .toString().

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

1. Получение соглашения в зависимости от статуса объекта:

if (subject == null)
{
return [] as List
}
if (api.wf.state(subject)?.code.equals('resolved'))
{
return [utils.get('agreement$3610')]
}
else
{
return [utils.get('agreement$3614')]
}

2. Получение списка услуг в зависимости от заполненности атрибута и исключение определенного объекта по идентификатору:

//ПАРАМЕТРЫ------------------------------------------------------------
// код метакласса Услуги
def METACLASS_SERVICE = 'slmService$sType'
// UUID услуги, которую нужно исключить из выбора 
def SERVICE_UUID = 'slmService$123' 
// код атрибута, который должен быть заполнен
def ATR_CODE = 'attrCode' 
//ОСНОВНОЙ БЛОК--------------------------------------------------------
if(null == subject)
{
return [ATR_CODE]
}
def allService =  utils.find(METACLASS_SERVICE,[:])
def serviceListUUID = []
for (def service : allService)
{
if ((service[ATR_TYPE])&&(service.UUID != SERVICE_UUID))
{
serviceListUUID.add(service)
}
}
return serviceListUUID

3. Получение списка типов запросов, доступных для выбора в зависимости от значения атрибута на форме добавления:

def ATTRS_FOR_UPDATE_ON_FORMS = ['testAttr'];
if(null == subject)
{
return ATTRS_FOR_UPDATE_ON_FORMS;
}
if(subject.testAttr)
{
return ['serviceCall$testCall1', 'serviceCall$testCall2'];
}
return ['serviceCall$testCall3', 'serviceCall$testCall4'];