# Process QueueS

A process queue is a table view of processes in DB with configured types, columns, filter and sort.

## Setup

| You can see the feature operation in Demo System.

Queue configuration happens in Administration / Processes / Process Queues tool.

In queue properties have been defined the process types.

| Enabling a parent type, like on the screen above, implicitly includes all its children types.

The rest of settings is done in the queue configuration.

### Columns

| You can see (queue Kernel Process Queue Column) the feature operation in Demo System.

One or more records of the following format:

    column.<ID>.title=<TITLE>
    column.<ID>.value=<TYPE>

    # optional

    # do not wrap column value
    column.<ID>.nowrap=1
    # horizontal align: left, center, right
    column.<ID>.align=
    # CSS style
    column.<ID>.style=
    # convert line brakes to HTML <br> tags, to make them visible in the column
    column.<ID>.formatToHtml=1
    # truncate a column value longer than <MAX_SYMBOLS> characters with link to show the full value
    column.<ID>.cutIfMore=<MAX_SYMBOLS>
    # truncate a column value longer than <TITLE_IF_MORE> characters, the full value is shown as HTML title popup on mouse hover
    column.<ID>.titleIfMore=<TITLE_IF_MORE>
    # show the value as URL for HTML link
    column.<ID>.showAsLink=<LINK_TITLE>

    # different process to take value for
    #column.<ID>.process=<TARGET_PROCESS>
    # convert the column value text to unsigned int, can be useful for sorting
    #column.<ID>.convert=int
    # aggregating function
    column.<ID>.aggregate=<AGGREGATE_FUNCTION>

Where:

- <ID> - unique numeric column ID;

- <TITLE> - title;

- <TYPE> - the selected value, see the possible variants below;

- <MAX_SYMBOLS>, <TITLE_IF_MORE> - maximal not truncated column value text;

- <LINK_TITLE> - text for the HTML link, linkUrl - use the column value itself;

- <TARGET_PROCESS> - linked the column value has been taken for the parent linked process;

- <AGGREGATE_FUNCTION> - aggregating function: SUM, AVG, COUNT.

When an aggregate function is specified for a column, the column header will display the function’s value for all filtered processes in square brackets, in addition to the column name. Only one function is allowed per column.

| Using aggregate functions requires an additional query for each process queue table output, which may slow down display performance.

#### Types

<TYPE> can have the following values:

<TYPE> | what is selected | titleIfMore, cutIfMore | Sorting | Print
--- | --- | --- | --- | ---
id | process ID with link to open it | Yes | Yes | Yes
title | Process Title | Yes | No | Yes
type_title | process type title | Yes | Yes | Yes
status_title | current process status title | Yes | Yes | Yes
status_pos | position of the current process status | Yes | Yes | Yes
status_dt | date and time when the current status was set | Yes | Yes | Yes
status_user | user which set the current status | Yes | Yes | Yes
status_comment | comment of the current status | Yes | Yes | Yes
status:<STATUS_IDS>:dt | date and time of the last set status with ID in comma-separated <STATUS_IDS> values | Yes | Yes | Yes
status:<STATUS_IDS>:user | user of the last set status with ID in comma-separated <STATUS_IDS> values | Yes | Yes | Yes
status:<STATUS_IDS>:comment | comment of the last set status with ID in comma-separated <STATUS_IDS> values | Yes | Yes | Yes
priority | the column colors process row with priority background | No | Yes | Priority number
create_dt | date and time of process creation | Yes | Yes | Yes
create_user | created process user | Yes | Yes | Yes
close_dt | date and time of closing process | Yes | Yes | Yes
close_user | closed process user | Yes | Yes | Yes
executors:<GROUP_IDS>:<ROLE_IDS> | Comma-separated process executors. Optional suffixes :<GROUP_IDS> and :<ROLE_IDS> allow restriction the executors by comma-separated process execution group and role IDs. For only roles restriction use: executors:*:<ROLE_IDS> | Yes | No | Yes
groups:<ROLE_IDS> | Comma-separated process execution groups. Optional suffix :<ROLE_IDS> restricts those by comma-separated execution role IDs. | Yes | No | Yes
description | process description | Yes | Yes | Yes
descriptionLink | process description with link opening the process | Yes | Yes | Yes
param:<PARAM_ID> | Value of process parameter with ID equal to <PARAM_ID>. For parameters with types date and datetime can be defined the output format. For parameter with type address param:<PARAM_ID>:quarter or param:<PARAM_ID>:street - for showing only address quarter or street. | Yes | Yes | Yes
ifListParam:<PARAM_ID>:<VALUE>:<SET_FLAG>:<UNSET_FLAG> | Show <SET_FLAG> if list parameter value with ID <PARAM_ID> is set to <VALUE>, or <UNSET_FLAG> in another case; :<SET_FLAG>:<UNSET_FLAG> are optionally needed, by default are used symbols ✓ and ✗. | No | No | the numeric value
messageInCount | quantity of incoming process messages (messages type Note are also counted there too) | Yes | Yes | Yes
messageInLastDt | creation date and time of the last incoming process message | Yes | Yes | Yes
messageInUnreadCount | quantity of unread incoming process messages | Yes | Yes | Yes
messageInLastText | text of the last incoming process message | Yes | Yes | Yes
messageInLastUser | the user, read the last incoming process message | Yes | Yes | Yes
messageInLastSubject | subject of the last incoming process message | Yes | Yes | Yes
messageOutCount | quantity of outgoing process messages | Yes | Yes | Yes
messageOutLastDt | creation date and time of the last outgoing process message | Yes | Yes | Yes
messageOutLastText | text of the last outgoing process message | Yes | Yes | Yes
messageOutLastUser | the user, created the last outgoing process message | Yes | Yes | Yes
messageOutLastSubject | subject of the last outgoing process message | Yes | Yes | Yes
message:<TYPE_IDS>:systemId | system_id of process message with comma-separated type IDs <TYPE_IDS> | Yes | Yes | Yes
| You can see (queue Kernel Process Link) the columns' below operation in Demo System.
linkCustomer:param:<PARAM_ID> | value of parameter ID <PARAM_ID> of process linked customer | Yes | Yes | Yes
linkCustomer:<COLUMN> | value of <COLUMN> in DB table customer for process linked customer: id - ID, title - title | Yes | Yes | Yes
linkObject:<OBJECT_TYPE_PREFIX> | comma-separated process_link::title with object_type prefix <OBJECT_TYPE_PREFIX> | Yes | Yes | Yes
linkObject:<OBJECT_TYPE_PREFIX>:id | Comma-separated process_link::id with object_type prefix <OBJECT_TYPE_PREFIX>. Example: linkObject:bgbilling-helpdesk:id - ID of linked topic BGBilling HelpDesk. | Yes | Yes | Yes
linkCustomerLink | linked customers list with UI open links | No | No | No
linkObject:process | comma-separated list of related child processes with UI open links | No | No | No
linkProcessList:<LINK_TYPE>:<OPEN>:<TYPE_IDS> | ID, type and status of related child processes. Optional settings: <LINK_TYPE> - process relation type; <OPEN> - open only open processes; <TYPE_IDS> - comma-separated process type IDs. | Yes | No | Yes
linkedProcessList:<LINK_TYPE>:<OPEN>:<TYPE_IDS> | ID, type and status of related parent processes. Optional settings: <LINK_TYPE> - process relation type; <OPEN> - open only open processes; <TYPE_IDS> - comma-separated process type IDs. | Yes | No | Yes
linkProcessCount:<LINK_TYPE>:<OPEN>:<TYPE_IDS> | count of related child processes. Optional settings: <LINK_TYPE> - process relation type; <OPEN> - open only open processes; <TYPE_IDS> - comma-separated process type IDs. | Yes | Yes | Yes
linkedProcessCount:<LINK_TYPE>:<OPEN>:<TYPE_IDS> | count of related parent processes. Optional settings: <LINK_TYPE> - process relation type; <OPEN> - open only open processes; <TYPE_IDS> - comma-separated process type IDs. | Yes | Yes | Yes
actions | Links or buttons with process actions. | No | No | No
BGBilling [RU]
linkObject:contract:<BILLING_IDS> | Перечень привяазанных к процессу договоров BGBilling, необязательный суффикс :<BILLING_IDS> позволяет уточнить идентификаторы биллингов через запятую. | No | No | No

| For all date and time columns after <TYPE> can be defined :<FORMAT>. As an example, status_dt:dd.MM.yy displays only date with two-digits year. If a column used not for showing but sorting then instead the format :value suffix should be added. A column can be added two times if its used both for displaying and sorting, the sorting column have to be hidden.

By default all configured queue columns are visible and ordered by ID. That can be changed with configuration record media.html.columns=<COLUMN_IDS>, where <COLUMN_IDS> - comma-separated order of IDs of visible columns. For example:

    media.html.columns=1,2,3

#### Actions

| You can see (queue Kernel Process Queue Action) the feature operation in Demo System.

The actions are configurable operations, performed over a process in a queue. The list of them is shown in queue column actions as links.

Or buttons.

Case in the process queue configuration is defined:

    actionShowMode=buttons

Any of action has been added to the configuration:

    # link text or buttons' tooltip
    action.{@inc:cnt}.title=<TITLE>
    # action logic, see below
    action.{@cnt}.doExpression=<EXPRESSION>
    # optional
    # comma-separated status IDs for displaying the action
    action.{@cnt}.statusIds=<STATUS_IDS>
    # buttons' text
    action.{@cnt}.shortcut=<SHORTCUT>
    # html style for button
    action.{@cnt}.style=<STYLE>

The <EXPRESSION> contains JEXL expression with action logic.

| Previously used commands key must be replaced to doExpression

Example of process queue action configuration:

    // PzdcDoc snippet of: 'Configuration of "Kernel Process Queue Action" queue', lines: 13 - 28

    actionShowMode=buttons
    action.{@inc:cnt}.title=Accept to Progress
    action.{@cnt}.shortcut=A
    action.{@cnt}.statusIds={@STATUS_OPEN_ID},{@STATUS_WAIT_ID}
    action.{@cnt}.style=padding: 0.2em 0.6em;
    action.{@cnt}.doExpression=setStatus({@STATUS_PROGRESS_ID});addExecutors({ctxUser.getId()});ui.refreshQueue()
    action.{@inc:cnt}.title=Accept to Progress and Open
    action.{@cnt}.shortcut=P&O
    action.{@cnt}.statusIds={@STATUS_OPEN_ID},{@STATUS_WAIT_ID}
    action.{@cnt}.style=padding: 0.2em 0.6em;
    action.{@cnt}.doExpression=setStatus({@STATUS_PROGRESS_ID});addExecutors({ctxUser.getId()});ui.open()
    action.{@inc:cnt}.title=Back to Open
    action.{@cnt}.shortcut=O
    action.{@cnt}.statusIds={@STATUS_PROGRESS_ID},{@STATUS_WAIT_ID}
    action.{@cnt}.style=padding: 0.2em 0.6em;
    action.{@cnt}.doExpression=setStatus({@STATUS_OPEN_ID});deleteExecutors(p.getExecutorIds());ui.refreshQueue()

#### Check Column

Enabled with:

    checkColumn=1

Allows print or export to Excel only selected rows. The column appears without the key, if any processor is used.

#### Print

For generation PDF print form for queue, place to the configuration media.print.columns key with comma-separated column IDs, have to be visible. Page orientation for that setup is lanscape, all column widths are same, except process description with doubled one.

The print setting may by defined more precisely with configuration blocks:

    media.print.{@inc:cnt}.title=<TITLE>
    media.print.{@cnt}.columns=<COLUMNS_MAPPING>
    # optional
    # portrait orientation
    #media.print.{@cnt}.orientation=portrait
    # file name
    #media.print.{@cnt}.fileName=bgerp_process_queue.pdf

Where:

- <TITLE> - item title for the queue’s More drop-down;

- <COLUMNS_MAPPING> - semicolon-separated pairs <COLUMN_ID>:<WIDTH_PROPORTION>

Here is the configuration sample:

    // PzdcDoc snippet of: 'Configuration of "Kernel Process" queue', lines: 34 - 41

    # print columns with default widths
    media.print.columns=1,17,4,11,19

    # fine print configuration
    media.print.{@inc:cnt}.title=Print Special
    # column width proportion mapping
    media.print.{@cnt}.columns=1:2;4:10;9:4
    media.print.{@cnt}.orientation=portrait

And how does it look in UI:

#### Export to Excel

To export table data in XLS format, define comma-separated column IDs in media.xls.columns like here:

    // PzdcDoc snippet of: 'Configuration of "Kernel Process" queue', lines: 43 - 44

    # export to Excel
    media.xls.columns=1,17,4,11,19

#### JEXL

Выводимую в очереди таблицу с процессами можно настроить ещё более гибко, указав в конфигурации очереди:

    rowConfig.{@inc:cnt}.media=html
    rowConfig.{@cnt}.expressionHead=<CONFIG_HEAD>
    rowConfig.{@cnt}.expressionRow=<CONFIG_ROW>

Где <CONFIG_HEAD> и <CONFIG_ROW> - JEXL выражения, генерирующие HTML для вывода заголовочного столбца таблицы и строк данных соответственно.

В контекст JEXL выражения передаются объекты, при генерации заголовка:

- checkAllLink - строка, содержащая ссылку для выделения всех строк в случае использования обработчиков в очереди.

При генерации строки:

- priority - строка с цветом, соответствующим приоритету процесса;

- colX - HTML со значением столбца с кодом X.

Пример настройки отображения заголовка таблицы и строк с помощью JEXL (выражения можно более коротко оформить с помощью многострочных значений переменных конфигураций с JEXL выражениями):

    column.1.title=ID
    column.1.value=id
    column.2.title=Причины
    column.2.value=param:500
    column.3.title=Работы
    column.3.value=param:466
    column.4.title=Создан
    column.4.value=create_dt
    column.5.title=Приор.
    column.5.value=priority
    column.6.title=Статус
    column.6.value=status_title
    column.7.title=Группа
    column.7.value=groups
    column.8.title=Адрес
    column.8.value=param:345
    column.30.title=Описание
    column.30.value=description
    column.31.title=Исполнители
    column.31.value=executors
    column.32.title=Время
    column.32.value=param:610
    column.33.title=Время (значение)
    column.33.value=param:610:value
    column.34.title=Действия
    column.34.value=actions
    column.34.align=center

    CONFIG_HEAD=<<END
       return "<td width='20' class='printHide'>" + checkAllLink  + "</td>"
        + "<td>ID</td>"
        + "<td>Статус [создан]</td>"
        + "<td>Адрес</td>"
        + "<td>Описание</td>"
        + "<td>Группа [исполнители]</td>"
        + "<td>Время</td>"
        + "<td class='printHide'>Действия</td>";
    END

    CONFIG_ROW=<<END
       return "<tr bgcolor='" + urgColor + "' processId='" + process.getId() + "'>"
         + "<td class='printHide'><input type='checkbox' name='processId' value='" + process.getId() + "'/></td>"
         + "<td>" + col1 + "</td>"
         + "<td><b>" + col6 + "</b> [" + col4 + "]" + "</td>"
         + "<td>" + col8 + col36 + "</td>"
         + "<td><b>" + process.getTypeTitle() + "</b><br/>"
         + (process.getTypeId() != 9432 ? "Причины: " + col2 + "Работы: " + col3 + "<br/>" : "")
         + (process.getTypeId() == 9432 ? "И: " + col40 + "; КТВ: " + col45 + "; ТЛФ: " + col50 + "; VOIP: " + col55 + "<br/>" : "")
         + col30 + "</td>"
         + "<td>" + col7 + " [" + col31 + "]</td>"
         + "<td>" + col32 + "</td>"
         + "<td class='printHide'>" + col34 + "</td>"
         + "</tr>";
    END

    rowConfig.{@inc:cnt}.media=html
    rowConfig.{@cnt}.expressionHead={@CONFIG_HEAD}
    rowConfig.{@cnt}.expressionRow={@CONFIG_ROW}

В результате очередь будет выглядеть приблизительно подобным образом.

Обратите внимание на группировку различных данных в столбцах описание и статус.

### Фильтры

Одна или несколько записей вида:

    filter.<ID>.type=<TYPE>
    # при необходимости сделать фильтр скрытым
    #filter.<ID>.show=0
    # дополнительные обязательные и необязательные параметры различные для разных фильтров
    filter.<ID>.<param1>=<value1>
    ..
    filter.<ID>.<paramX>=<valueX>

Где:

- <ID> - уникальный числовой идентификатор фильтра;

- <TYPE> - тип фильтра, единственный обязательный параметр, см. значения далее.

Порядок фильтров в конфигурации определяет их порядок в отображении.

Пример. Фильтр по статусу с выбранным по-умолчанию значением и ограничениям на значения, фильтр по дате создания, по группам решения, исполнителям, коду и дате закрытия.

    filter.{@inc:cnt}.type=status
    filter.{@cnt}.availableValues=9,10,12
    filter.{@cnt}.defaultValues=10

    filter.{@inc:cnt}.type=create_date

    filter.{@inc:cnt}.type=groups
    filter.{@cnt}.defaultValues=17

    filter.{@inc:cnt}.type=executors
    filter.{@inc:cnt}.type=code
    filter.{@inc:cnt}.type=close_date

Далее описываются фильтры по их типу (параметр <TYPE>), обязательные и необязательные параметры. В таблице перечислены типы фильтров и их параметры.

Значение <TYPE> | Фильтр | Информация
--- | --- | ---
type | Тип процесса. | Необязательные параметры: availableValues - отображаемые в фильтре коды типов процессов, в порядке их отображения; если параметр не указан - отображаются все типы процессов; defaultValues - коды типов процессов, выбранных в фильтре по-умолчанию через запятую; onEmptyValues - значения фильтра, используемые, если никакие значения пользователем не выбраны.
status_date | Диапазон дат когда процесс последний раз был переведён в какой-то статус. | Необязательные параметры: availableValues - отображаемые в фильтре коды статусов, в порядке их отображения; если параметр не указан - отображаются все статусы.
status | Текущий статус процесса. | Необязательные параметры: width - ширина фильтра в пикселях; values - жёстко заданные в фильтре коды статусов, в этом случае фильтр имеет смысл только скрытым; availableValues - отображаемые в фильтре коды статусов, в порядке их отображения; если параметр не указан - отображаются все статусы; defaultValues - коды статусов, выбранные в фильтре по-умолчанию через запятую; onEmptyValues - значения фильтра, используемые, если никакие значения пользователем не выбраны.
param:<PARAM_ID> | Параметр процесса с кодом <PARAM_ID>. | Поддерживаются параметры одного из следующих типов: "address" , "blob", "date", "datetime", "list", "listcount", "money", "text". Обязательные параметры: title - подпись к фильтру. Необязательные параметры: orEmpty - "1", для включения в выборку процессов с пустым значением параметра; для параметров "date", "datetime". width - ширина фильтра в пикселях; для параметров типа "list", "address"; values - hardly defined values; availableValues - доступные значения спискового параметра; defaultValues - выбранные по-умолчанию значения спискового параметра; onEmptyValues - значения параметра, используемые, если никакие значения пользователем не выбраны; valueFrom - "curdate", для принудительного задания начала периода равным текущей дате; для параметров "date", "datetime"; valueTo - "curdate", для принудительного задания конца периода равным текущей дате; для параметров "date", "datetime"; fields - разделённые точкой с запятой поля для параметра типа "address", доступные значения: "city;quarter;street;house;flat"; поля город, улица и дом отображаются всегда, вне зависимости от наличия в конфигурации.
openClose | Открытые либо закрытые процессы. | В отличие от фильтра по статусу данный фильтр может существенно ускорять выборку. Дополнительные параметры: defaultValue - open либо close, значение по-умолчанию; values - open либо close, жестко заданные значения.
linkedCustomer:title | Подстрока в наименовании привязанного к процессу контрагента. | Необязательные параметры: width - ширина фильтра в пикселях.
linkedCustomer:param:<PARAM_ID> | Параметр привязанного к процессу контрагента с кодом <PARAM_ID>. | Поддержан только тип list. Обязательные параметры: title - подпись к фильтру. Необязательные параметры: width - ширина фильтра в пикселях; availableValues - доступные значения спискового параметра; defaultValues - выбранные по-умолчанию значения спискового параметра; onEmptyValues - значения параметра, используемые, если никакие значения пользователем не выбраны.
linkedObject | Привязка процесса, все фильтры жёстко заданы. | Параметры: objectTypeMask - SQL LIKE выражение по типу объекта; objectTitleRegExp - SQL REGEXP выражение по названию привязанного объекта; notMode - 1, если необходимо искать процессы без привязки.
linkObject | Привязка процесса, в отличие от linkedObject, значения для фильтра вводится пользователем | Обязательные параметры: title - filter’s title; objectType - type of linked objects; whatFilter - what to filter: id - ID of linked object, title - its title. Пример фильтра по коду темы HelpDesk:
    filter.{@inc:cnt}.type=linkObject
    filter.{@cnt}.objectType=bgbilling-helpdesk:bitel
    filter.{@cnt}.whatFilter=id
    filter.{@cnt}.title=Тема HelpDesk
groups | Группы, исполняющие процесс. Без учёта ролей. | Необязательные параметры: width - ширина фильтра в пикселях; availableValues - отображаемые в фильтре коды групп, в порядке их отображения; если параметр не указан - отображаются все группы; defaultValues - коды типов групп, выбранных в фильтре по-умолчанию через запятую; onEmptyValues - значения фильтра, используемые, если никакие значения пользователем не выбраны.
grex | Совмещённый фильтр по группам и исполнителям процесса. | Фильтрует с учётом роли групп в процессах. Обязательные параметры: roleId - код роли. Необязательные параметры: groups.show - 0, если выбор групп необходимо скрыть; groups.width - ширина выбора групп в пикселях; groups.availableValues - отображаемые в фильтре коды групп, в порядке их отображения; если параметр не указан - отображаются все группы; groups.defaultValues - коды типов групп, выбранных в фильтре по-умолчанию через запятую; groups.onEmptyValues - значения групп фильтра, используемые, если никакие значения пользователем не выбраны; groups.title - title for the groups selection, for example: Follower Group; executors.show - 0, если выбор исполнителей необходимо скрыть; executors.width - ширина выбора исполнителей в пикселях; executors.title - подпись к выбору исполнителей, например: Наблюдение.
executors | Исполнители процесса. | Без учёта в составе какой группы участвует пользователь. Фильтр работает только совместно с фильтром groups, при этом в списке исполнителей отображаются пользователи, когда-либо состоявшие в группах, указанных в фильтре groups. Необязательные параметры: width - ширина фильтра в пикселях; values - "current", если необходимо отображать только процессы с текущим пользователем в исполнителях, фильтр в этом случае желательно скрыть; showEmptyExecutor - "1", отображение в фильтре исполнителей пункта "не указан" для выбора процессов без исполнителя.
create_user | User created of process. | User list includes the current one and other users, having the same groups as the current.
close_user | User closed of process. | User list includes the current one and other users, having the same groups as the current.
description | Подстрока в описании процесса. |
create_date | Диапазон дат создания процесса. |
code | Числовой код процесса. |
close_date | Диапазон дат закрытия процесса. |
message:systemId | Системный идентификатор сообщения. |

### Sort

Sort modes have been defined using multiple configuration blocks:

    sort.mode.<ID>.columnId=<COL_ID>
    sort.mode.<ID>.title=<TITLE>
    # desceniding
    #sort.mode.<ID>.desc=1

Where:

- <ID> - unique numeric mode’s ID, starting from 1;

- <COL_ID> - the column ID, used in the mode;

- <TITLE> - mode’s title for the combobox item;

Amount of sort comboboxes with modes, are configured in this way:

    sort.combo.count=<AMOUNT>

For each of the comboboxes can be set a default selected mode:

    sort.combo.<COMBO_ID>.default=<DEFAULT_MODE_ID>

Or the fixed one, used as example in Mobile interface:

    sort.combo.<COMBO_ID>.value=<FIXED_MODE_ID>

Here is the sample of sort configuration:

    // PzdcDoc snippet of: 'Configuration of "Kernel Process" queue', lines: 62 - 73

    sort.mode.1.columnId=4
    sort.mode.1.title=Description
    sort.mode.2.columnId=1
    sort.mode.2.title=Created desc
    sort.mode.2.desc=1
    sort.mode.3.columnId=3
    sort.mode.3.title=Priority desc
    sort.mode.3.desc=1

    sort.combo.count=2
    sort.combo.1.default=3
    sort.combo.2.default=2

And how does it look like in UI. By default sorting is first performed by descending priority and after by decending creation time.

### Processor

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

    processor.{@inc:cnt}.title=<TITLE>
    processor.{@cnt}.class=<CLASS>
    #
    # необязательные параметры
    processor.{@cnt}.page=<JSP_PAGE>
    processor.{@cnt}.responseType=file
    # optional parameters for open interface only
    processor.{@cnt}.page.url=<PAGE_URL>

Где:

- <CLASS> - динамический либо обычный класс, расширяющий org.bgerp.app.event.iface.EventListener

- <JSP_PAGE> - JSP страница со свойствами обработчика.

Параметр responseType=file необходимо указывать для обработчиков, генерирующих файлы, например для печати.

Пример обработчиков в конфигурации:

    processor.{@inc:cnt}.title=Создать компанию обзвона Астериск
    processor.{@cnt}.class=ru.bgcrm.dyn.ufanet.otm.CreateTMCallCampaign

    processor.{@inc:cnt}.title=Принять на
    processor.{@cnt}.class=ru.bgcrm.dyn.ufanet.stp.SetProcessExecutor
    processor.{@cnt}.page=/WEB-INF/jspf/user/process/queue/custom/executor_list.jsp

Обработчики отображаются в пункте меню Ещё очереди процессов наряду со стандартными пунктами.

В системе поставляется обработчик DefaultMarkedProcessor, позволяющий выполнять некоторые типовые обработки процессов в очереди. Шаблон добавления обработчика:

    processor.{@inc:cnt}.title=<TITLE>
    processor.{@cnt}.class=DefaultMarkedProcessor
    processor.{@cnt}.commands=<COMMANDS>
    # additional JEXL script, without UI defined params
    processor.{@cnt}.doExpression=<DO_EXPRESSION>

    # если печать
    #processor.{@cnt}.responseType=file
    # если печать - открытие диалога печати браузера
    #processor.{@cnt}.openPrintDialog=1

Где:

- <ID> - числовой идентификатор обработчика;

- <COMMANDS> - команды, см. далее;

- <DO_EXPRESSION> - JEXL script with standard context for process.

Поддержанные команды:

- setStatus:<STATUS_IDS> - установка одного из статусов, коды которых через запятую перечислены в <STATUS_IDS>;

- addExecutors:<GROUP_IDS> - добавление в процесс исполнителей из групп, коды которых перечислены через запятую в <GROUP_IDS>;

- setParam:<PARAM_ID> - установка параметра процесса с кодом <PARAM_ID>, поддержаны типы 'date' и 'datetime', 'list';

- print:<PATTERN_ID> - команда должна быть единственной в обработчике; генерация бланка документа типа jspHtml либо pdfForm.

Шаблон документа для команды print должен обладать scope=processQueue, title=<любая строка>. Пример шаблона:

    document:pattern.100.scope=processQueue
    document:pattern.100.script=ru.bgcrm.plugin.document.docgen.CommonDocumentGenerator
    document:pattern.100.type=jspHtml
    document:pattern.100.jsp=/WEB-INF/jspf/user/plugin/document/template/example/process_queue_processor_html.jsp

Sample of processor, set parameter value and delete groups:

    processor.{@inc:cnt}.title=Set date, delete groups
    processor.{@cnt}.class=DefaultMarkedProcessor
    processor.{@cnt}.commands=setParam:40
    processor.{@cnt}.doExpression=deleteGroups(process.getGroupIds())

#### Open Interface

For open interface definition of processor is easier, example:

    processor.{@inc:cnt}.iface=open
    processor.{@cnt}.page=/WEB-INF/jspf/open/plugin/custom.bitel/calculate_processor.jsp

Only one open processor per queue is supported. JSP template here placed in custom area.

### Прочие параметры очереди

    # в каком интерфейсе отображать очередь
    showIn=<SHOW_IN>
    # для мобильного интерфейса кнопки создания процессов в очереди
    createAllowedProcessList=<BUTTONS>
    # для стационарного интерфейса - запрет создания процессов в очереди (нет кнопки "Создать")
    allowCreateProcess=0

Где:

- <SHOW_IN> - может быть usermob, user; по-умолчанию принимается значение user.

- <BUTTONS> - semicolon-separated pairs <PROCESS_TYPE_ID>:<TITLE> for process creation.

## Использование

Оснастка запускается через меню Пуск / Процессы.

Возможный вид очереди процессов изображён на рисунке ниже. Чтобы очередь появилась в списке доступных она должна быть добавлена в свойствах пользователя или его группы.

Нажатие кнопки в выпадающем списке очередей выделяет очередь в отдельную кнопку быстрого доступа рядом с выпадающим списком. Обратно в список кнопка может быть перемещена нажатием креста на ней.

По нажатию Ещё возможно:

- создание нового процесса одного из разрешённого в очереди типов;

- печать очереди (если она настроена в конфигурации);

- переход из режима полного фильтра в режим сохранённых а также сохранение либо удаление фильтра.

По-умолчанию очередь открывается с полным фильтром, определённым в конфигурации.

Для управления видимыми фильтрами используется одноимённый выпадающий список. Полужирный текст обозначает заполненность фильтра, при этом фильтр может быть скрыт.

Часто используемые фильтры могут быть сохранены. Для сохранения фильтра используется меню Ещё - Фильтр - Cохранить. Все сохранённые фильтры отображаются в виде отдельных кнопок, доступных для быстрого переключения с отображением на них количества текущих процессов.

Переключение из полного фильтра в сохранённые производится также через меню Ещё. Кнопки сохранённых фильтров возможно перемещать мышью, изменяя их порядок. Для корректировки сохранённого фильтра следует извлечь его в полный посредством Ещё - Фильтр - Извлечь в полный, после чего скорректировать и сохранить, удалив впоследствии старый фильтр. Таким же образом можно оценить, какие параметры у сохранённого фильтра.

Действия Ещё - Фильтр - Счётчик на панель / Фильтр - Счётчик убрать с панели позволяют выделить число счётчика на панель задач BGERP с определённым цветом и всегда иметь актуальную информацию о важных количественных параметрах процессов. На снимке экрана выше процессы фильтра No исполнителя вынесены на панель с красным цветом.

Кнопки сохранённых фильтров возможно перемещать с помощью мыши. Редко используемые сохранённые фильтры могут быть перетащены в выпадающий список Фильтр. Также перетаскиванием мышью их можно извлечь обратно.

Кнопка с символом * открывает список общих фильтров, в которые можно экспортировать любой из сохранённых. Общие фильтры становятся доступны всем пользователям, имеющим доступ к данной очереди процессов. Они могут быть импортированы и использованы. С помощью общих фильтров администратор может настроить типовые фильтры для остальных пользователей.