Универсальная CRM/ERM система BGCRM 2.5


Содержание

1. Ядро BGCRM
1. Установка
1.1. Требуемое ПО
1.2. Установка на ОС Linux
1.3. Установка обновлений на ОС Linux
1.4. Плагины
2. Интерфейс системы
2.1. Общие сведения
2.2. Интерфейс пользователя
2.2.1. Общие сведения
2.2.2. Оснастка "Поиск"
2.2.3. Оснастка "Адреса"
2.2.4. Оснастка "Очереди процессов"
2.2.5. Оснастка "Сообщения"
2.3. Интерфейс администратора
3. Настройка
3.1. Конфигурации
3.2. Основная конфигурация
3.3. Пользователи
3.4. Параметры
3.5. Планировщик
4. Контрагенты
4.1. Общие сведения
4.2. Карточка контрагента
5. Процессы
5.1. Общие сведения
5.2. Роли
5.3. Статусы
5.4. Типы процессов
5.5. Тип процесса - конфигурация
5.6. Карточка процесса
5.7. Очереди процессов
5.7.1. Общие сведения
5.7.2. Колонки
5.7.3. Фильтры
5.7.4. Сортировка
5.7.5. Операции
5.7.6. Прочие параметры очереди
6. Сообщения
6.1. Общие сведения
6.2. Настройка типов сообщений
6.3. Настройка планировщика
6.4. Оснастка "Сообщения"
6.5. Работа с сообщениями в процессе
7. Организация работ
7.1. Общие сведения
7.2. Виды работ
7.3. Редактор смен
7.4. Календарь рабочих дней
7.4.1. Общие сведения
7.4.2. Настройка
7.4.3. Работа с календарем
7.5. График дежурств
7.5.1. Общие сведения
7.5.2. Настройка
7.5.3. Использование графика
8. Ускорение поиска контрагентов с помощью Sphinx
8.1. Настройка Sphinx
8.2. Настройка BGCRM
9. Расширение функционала
9.1. Общие сведения
9.2. Технологии
9.3. Динамический код
9.4. JSP страницы
9.5. Интеграция с внешними системами
9.6. Запуск классов в контексте сервера
2. Плагин BGBilling
1. О плагине
2. Конфигурация
2.1. Серверы биллинга
2.2. Единый договор
2.3. Типы договоров
2.4. Импорт контрагентов из договоров
2.5. Конфигурация типа процесса
2.6. Интеграция с плагином Document
3. Оснастка "Поиск"
4. Карточка "Контрагент"
5. Карточка "Процесс"
6. Карточка "Единый договор"
7. Карточка "Договор"
3. Плагин Document
1. О плагине
2. Конфигурация
3. Интерфейс пользователя
4. Плагин Report
1. О плагине
2. Конфигурация
3. Оснастка "Отчёты"

Глава 1. Ядро BGCRM

1. Установка

1.1. Требуемое ПО

  • MySQL сервер и клиент версии 5.1 и старше, хранилище InnoDB.

  • Oracle JDK версии 1.7.X, последнее обновление.

1.2. Установка на ОС Linux

Загрузите архив bgcrm_<version>_<build>.zip.

Извлеките каталог BGCRM из него его в требуемый каталог установки. (например /opt).

Извлеките файл bgcrm.sql в каталог /tmp.

Выполните создание БД:

mysql --default-character-set=utf8 -uroot < /tmp/bgcrm.sql

При доступе к БД с другим логином - паролем, либо если база расположена на другой машине - скорректируйте команду.

Перейдите в каталог BGCRM и сделайте файлы исполняемыми:

chmod 744 *.sh

При необходимости поправьте в bgcrm.properties логин и пароль подключения к БД, сервер БД и имя. Также там можно изменить HTTP порт и порт управления.

Установите в setenv.sh путь к Java, например:

JAVA_HOME=/opt/java/jre                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                            
if [ -z "$JAVA_HOME" ]; then
  echo "The JAVA_HOME environment variable is not defined"
  echo "This environment variable is needed to run this program"
  exit 1
fi

Для запуска/останова сервера используйте crm_start.sh/crm_stop.sh. crm_status.sh - просмотр статуса запущенного сервера.

После запуска проверьте log/bgcrm.log и в log/bgcrm.out на наличие ошибок (Exception).

По умолчанию CRM доступна по адресу: http://<HOST>:9088

При создании БД в системе присутствует единственный пользователь admin, пароль - admin.

1.3. Установка обновлений на ОС Linux

Для обновления вызовите команду:

./installer.sh update

1.4. Плагины

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

В данный момент доступны плагины: Document (генерация документов), BGBilling (интеграция с системой BGBilling), Report (разработка отчётов). Все плагины в данный момент включены в общую сборку. Для отключения функций плагина необходимо удалить XML файл описания из каталога BGCRM/plugin.

2. Интерфейс системы

2.1. Общие сведения

Интерфейс, он же роль - способ доступа к CRM системе, определяющий набор разрешённого функционала. Выбор интерфейса производится при входе в CRM систему:

В системе доступны интерфейсы:

Администратор - для настройки параметров системы, префикс /admin.
Пользователь - для непосредственной работы, префикс /user.
Пользователь(мобильный) - усечённый интерфейс пользователя для мобильных устройств, префикс /usermob.

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

Интерфейс пользователя:

2.2. Интерфейс пользователя

2.2.1. Общие сведения

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

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

2.2.2. Оснастка "Поиск"

Оснастка позволяет осуществлять поиск всех сущностей в системе. В данный момент реализован поиск контрагента. Для поиска необходимо нажать Enter в поле с параметром поиска, либо в поле Квартира для адресного параметра (можно оставить пустым). При поиске по адресу доступен контекстный поиск улиц и домов.

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

При поиске по адресу осуществляется поиск по всем адресным параметрам контрагентов. В результатах поиска отображается наименование контрагента, наименование параметра и значение. Возможен поиск как только по улице: выбрать улицу в контекстном поиске и нажать Enter; так и по Улице + Дому или Улице + Дому + Квартире - Enter нажимается в последнем заполненном поле.

2.2.3. Оснастка "Адреса"

Просмотр и редактирование адресных справочников.

Для того, чтобы разрешить пользователю править справочники в конфигурации пользователя должно быть установлено:

directory.address.update=country:*;city:*;street:*;quarter:*;area:*;house:*

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

Замечание

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

Как настроить выгрузку справочника адресов в BGBilling и первичную выгрузку из него описано в WiKi.

2.2.4. Оснастка "Очереди процессов"

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

2.2.5. Оснастка "Сообщения"

Обработка сообщений.

2.3. Интерфейс администратора

Интерфейс администратора представляет из себя набор редакторов, собранный в иерархию вкладок. Описание редакторов производится в документации по мере разбора настраиваемых подсистем.

3. Настройка

3.1. Конфигурации

Очень большое количество редко меняющихся настроек поведения системы вынесено в конфигурации. Конфигурация - это текстовый блок, состоящих из записей вида: <ключ>=<значение>. На одной строке может быть только одна такая запись, символ # в начале строки означает комментарий.

Конфигурации вводятся либо в текстовых .properties - файлах (опции подключения к БД, базовые настройки), либо в редакторах конфигурации, сохраняясь в базе данных.

3.1.1. Переменные

В значениях параметров конфигурации возможна подстановка ранее указанных значений с помощью подстановок {@имя параметра}. Рассмотрим пример подстановки.

# определение значения
howYou=how you
# использование подстановки
some.kind.of.config.record=Thats {@howYou} should use macro!

Т.е. при такой конфигурации при взятии значения some.kind.of.config.record получаем в результате строку "Thats how you should use macro!". Подставляемое значение должно быть обязательно определено ранее подстановки.

3.1.2. Счётчики

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

Например:

object.1.id=1
object.1.title=Title1
object.2.id=2
object.2.title=Title2

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

index=1
object.{@index}.id=1
object.{@index}.title=Title1
object.{@inc:index}.id=2
object.{@index}.title=Title2

3.1.3. Склеивание значений

Помимо присвоения параметр конфигурации можно приклеивать к уже существующему под таким ключём значению. Для этого используется оператор +=. Например:

key=1
key+=,2
key+=,3

В этом случе под ключом key будет храниться строка "1,2,3".

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

# дата рожд., с.-н. пасп., д.в. пасп., кем выд. пасп, адрес проп., тел. гор, тел. сот, адрес(а) усл., перс. данные
bgbilling:creator.importParameters=73,74,75,76,77,78,14,12,115
# ИНН, КПП, ФИО руководителя, полное название, должность рук.-ля, E-Mail(ы)
bgbilling:creator.importParameters+=,248,249, 252, 428, 429, 15

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

3.2. Основная конфигурация

Основная конфигурация BGCRM определяет большинство параметров функционирования ядра и плагинов.

В основную конфигурацию попадают параметры, определённые в файле bgcrm.properties, далее загружается конфигурация указанная в интерфейсе администратора.

Одномоментно может быть активна только одна конфигурация выделенная признаком Активный. Для создания конфигурации - кнопка Создать. Изменении конфигурации применяется "на лету", перезапуск системы не требуется.

В конфигурации указываются параметры ядра и подключённых плагинов. Для ядра доступны следующие параметры:

# формат адресного параметра, доступны переменные: index, сity, area, quarter, street, house, flat, room, pod, floor, comment 
address.format=(${city})(, ${street})(, д. ${house})(, кв. ${flat})( ${room})
#
# шаблон описания контрагента для поиска 
# в нём можно указать параметры контрагента подстановками вида (param:<code>); например: (${param:73} г.р.)(, ${param:12})
#customer.reference.pattern=
#
# минимальная длина подстроки в поиске контрагента
searchCustomerTitleMinSubstringLength=2
#
# форматирование параметра типа "phone", общий формат одного номера
param.phone.format=(${number})( [${comment}]);
# форматирование поля ${number} внутри каждого номера, в зависимости от формата
param.phone.format.number=+X XXX XXX-XX-XX
param.phone.format.number.f10=+X XXX-XXX-XX-XX
param.phone.format.number.f13=+X (XXX) XXX-XX-XX
param.phone.format.number.f14=+X (XXXX) XX-XX-XX
param.phone.format.number.f15=+X (XXXXX) X-XX-XX
# количество полей в параметре типа "телефон"
param.phone.item.count=4
# префикс по-умолчанию для параметра типа "телефон"
param.phone.default.prefix=3472
# ускорение ввода номеров - подстановка 7 в код страны
param.phone.part.1.default=7
# переход в третье поле при введение во втором кода российского мобильного, без удаление последнего символа
param.phone.part.2.jumpRegexp.1.regexp=^9\d{2}
param.phone.part.2.jumpRegexp.1.moveLastChars=0
# переход в третье поле с переносом последнего введённого во втором поле при наборе во втором поле 3472
param.phone.part.2.jumpRegexp.2.regexp=^3472
param.phone.part.2.jumpRegexp.2.moveLastChars=1
#
# при пробросе запросов на сервер с помощью Proxy сервера - имя HTTP заголовка, в котором передаётся адрес клиента
#header.name.remote.addr=X-Real-IP
#
# роли, в которых контрагент может быть привязан к процессу, роли должны начинаться с customer, например: customer:Контрагент;customerSogl:Согласователь
processCustomerLinkRoles=customer:Контрагент
# 
# проверка прав доступа пользователей, 1 - включить 
user.permission.check=0
#
# роли групп в процессах, добавляются через точку с запятой в виде <id>:<title> 
processGroupRoles=0:Выполнение
#
# параметры EMail 
mail.smtp.host=
mail.smtp.user=
mail.smtp.pswd=
#
# динамический код 
dynamic.src.dir=dyn
dynamic.src.encoding=UTF-8
# перечень через запятую динамических или обычных классов, реализующих интерфейс java.lang.Runnable, запускаемых при старте сервера
#runOnStart=
# перечень через запятую динамических или обычных классов, объекты которых создаются при старте сервера, при перекомпиляции динамических классов создание объектов производится повторно
#createOnStart=
#
# планировщик, запуск - 1  
scheduler.start=0

Записи параметров плагинов начинаются с префикса <plugin>:, например bgbilling:. Возможно включение в одну конфигурации другой, для этого во включающей конфигурации размещается инструкция include.<configId>=1, где <configId> - код включаемой на данной позиции конфигурации.

3.3. Пользователи

Редактирование учётных записей пользователей системы и их прав доступа осуществляется на вкладке Пользователи интерфейса администратора.

3.3.1. Наборы прав

Наборы прав определяют разрешаемые пользователю интерфейсы и действия в них. Интерфейсы определяются через роли.

Роли указываются через пробел, допустимые значения: user, admin, usermob. Роли всех установленных пользователю наборов прав объединяются. В дереве действий указываются разрешённые набору действия.

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

Замечание

Проверка прав доступа включается переменной конфигурации.

3.3.2. Группы

Группы пользователей обозначают подразделения в организации и выступают группами решения для подсистемы процессов.

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

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

Группы выстроены в иерархию, что позволяет учитывать службы, отделы и другие структурные единицы организации.

3.3.3. Пользователи

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

Параметры пользователя определяются в редакторе параметров.

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

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

  1. Действующий список групп (ДСГ) - упорядоченный список = список групп в алфавитном порядке (как отображаются в списке групп), из них оставлены только действующие в настоящий момент у пользователя.

  2. Действующий список наборов прав (ДСНП) - упорядоченный список = списки всех наборов прав групп ДСГ + список наборов прав пользователя.

  3. Действующая конфигурация (ДК) - строка = конфигурации всех наборов прав из ДСНП + конфигурации всех групп из ДСГ (конфигурация каждой группы составлена из конфигурации всех его предков + конфигурация группы) + конфигурация пользователя. Переменная более поздно добавленная в конфигурацию переопределит более раннюю.

  4. Очереди процессов = список очередей процессов, из которых оставлены очереди указанные в пользователе либо в одной из групп ДСГ.

  5. Разрешения = разрешения из наборов прав ДСНП + разрешения из пользователя.

  6. Роли - набор = роли всех наборов прав ДСНП + роли из пользователя.

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

ctxUserId=<код пользователя в БД>
ctxUserGroupIds=<коды групп пользователя через запятую>
ctxUserPermsetIds=<коды наборов прав пользователя через запятую>

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

Редактор разрешённых действий в наборе прав и пользователе представляет из себя дерево действий следующего вида:

Установка галочки на узле дерева резрешает действия. У некоторых действий есть дополнительная конфигурация (в квадратных скобках на снимке экрана ранее), задающая дополнительные ограничения. В данную конфигурацию допускается подставлять переменные из действующей конфигурации пользователя. Подстановка осуществляется макросом {@<paramName>}, где<paramName> - параметр из конфигурации. Например: groupSet={@smGroup}. Так, на приведённым выше снимке пользователю разрешают просматривать список пользователя только входящих в те же группы, что и он сам. Используется подставновка системной переменной из действующей конфигурации пользователя.

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

Для отключения проверки прав в действующей конфигурации пользователя должна присутствовать опция: dontCheckPermission=1.

3.4. Параметры

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

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

Таблица параметров сущности выглядит подобным образом. Порядок записи в таблице определяется числовым полем Порядок параметра.

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

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

# коды параметров сущности, которые должны быть заполнены перед установкой данного параметра
requireBeforeFillParamIds=<codes>
# коды параметров сущности, которые должны быть пустыми перед установкой данного параметра
requireBeforeEmptyParamIds=<codes>
# теги параметра через запятую - тегированный параметр можно просматривать или править 
# только явно разрешив тег в настройке прав на изменение параметра либо просмотр параметров
tags=<tags>
# редактор параметра недоступен (параметр загружается посредством API к БД либо HTTP API)
readonly=1 

Где:

<codes> - коды параметров через запятую;
<tags> - теги через запятую.

3.4.1. Группы параметров контрагентов

Группа параметров необходима для ограничения списка параметров контрагента определённого объекта. Например: "Физическое лицо", "Юридическое лицо".

3.4.2. Шаблоны названия контрагентов

Шаблон названия позволяет устанавливать зависимость названия объектов от его параметров. Подстановка параметров осуществляется макросами вида ${param_<code>}, где <code> - уникальный код параметра. Так, например, возможна генерация названия контрагента юридического лица из параметров спискового "Форма собственности" и текстового "Наименование организации", что предотвращает дублирование информации. При изменении параметров в дальнейшем наименование объекта будет правиться автоматически.

3.4.3. Параметр типа "text"

Однострочная строка до 250 символов.

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

saveOn=<saveOn>

Где:

<saveOn> - режим сохранения, может быть "focusLost" (потеря фокуса полем) либо "enter" (нажатие клавиши "Enter"), по-умолчанию режим "enter".

В конфигурации параметра могут быть указаны одна или несколько конструкций вида:

regexp.<n>.title=<title> 
regexp.<n>.regexp=<regexp>

Где:

<n> - число, порядковый номер регулярного выражения;
<title> - наименование шаблона;
<regexp> - Java регулярное выражение, описывающее шаблон.

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

regexp.1.title=<город без г.>,<улица без ул.>,<дом без д.>
regexp.1.regexp=[а-яА-Я\s\-]+,[\dа-яА-Я\s\-]+,\s*[\dа-яА-Я/]+
regexp.2.title=<город без г.>,<улица без ул.>,<дом без д.>,<номер квартиры> 
regexp.2.regexp=[а-яА-Я\s\-]+,[\dа-яА-Я\s\-]+,\s*[\dа-яА-Я/]+,*\s*\d+
regexp.3.title=<город без г.>,<улица без ул.>,<дом без д.>,<номер квартиры>, <номер комнаты>
regexp.3.regexp=[а-яА-Я\s\-]+,[\dа-яА-Я\s\-]+,\s*[\dа-яА-Я/]+,*\s*\d+,\s*\d+

В данном случае параметр контрагента адрес по прописке проверяется на соответствие одному из шаблонов. Содержание шаблонов легко понять из атрибутов title.

В таблице параметр выглядит следующим образом.

3.4.4. Параметр типа "blob"

Большая многострочная строка до 65000 символов.

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

rows=<rows>
saveOn=<saveOn>

Где:

<rows> - количество отображаемых в редакторе строк, по-умолчанию 4;
<saveOn> - режим сохранения, может быть "focusLost" (потеря фокуса полем) либо "enter" (нажатие кнопки под полем), по-умолчанию режим "enter".

В таблице параметр выглядит следующим образом.

3.4.5. Параметр типа "list"

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

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

# мультивыбор
multiple=1
# сохранение сразу после выбора значения, без нажатия кнопки Ок (только для параметра с одним выбором) 
saveOn=select
#
allowCommentValues=<allowCommentValues>
needCommentValues=<needCommentValues>
#
directory=<dirName>
availableValues=<values>
availableValuesInnerJoinFilter=<joinTable>;<joinColumn>;<joinFilter>

Где:

<dirName> - справочник, из которого берутся значения, может быть "address_city" для городов, если справочника нет - значения указываются в самом параметре;
<values> - допустимые коды значений через запятую;
<allowCommentValues> - перечень значений для которых допустимо указание комментария, возможно указание диапазонов, например: 1-3,7,9-14
<needCommentValues> - перечень значений для которых обязателен комментарий, указывается аналогично <allowCommentValues>;
<joinTable> - имя таблицы, с которой осуществляется фильтрующая операция SQL INNER JOIN справочной таблицы;
<joinColumn> - колонка таблицы, по которой проводится JOIN столбца id справочной таблицы;
<joinFilter> - дополнительное условие INNER JOIN.

Пример конфигурации параметра, в котором доступны контрагенты, входящие в группу с кодом 3.

multiple=1
directory=customer
availableValuesInnerJoinFilter=customer_group;customer_id;group_id IN (3) 

Пример параметра с одним значением. Конфигурация - как выглядит в таблице и редактирование.

Пример параметра с несколькими значениями (мультивыбор). Конфигурация - как выглядит в таблице и редактирование.

3.4.6. Параметр типа "date"

Дата: год - месяц - день.

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

# возможность смены месяца
changeMonth=true
# возможность смены года
changeYear=true
yearRange=<yearRange>
# возможность редактирования поля с клавиатуры
editable=1
saveOn=<saveOn>
# при редактировании поля отправка классу-обработчику изменений параметра события ru.bgcrm.event.DateChangingEvent, позволяющего раскрашивать даты различными цветами и сопровождать примечаниями 
#sendColorMapRequest=1

Где:

<yearRange> - диапазон отображаемых лет в выпадающем списке годов, могут быть значения от текущего года (-10:+30) либо значения от текущей выбранной даты (c:-10:c+30), по-умолчанию с-10:с+10;
<saveOn> - режим сохранения, может быть "focusLost" (потеря фокуса полем) либо "enter" (нажатие клавиши "Enter"), по-умолчанию режим "enter"; актуально только при editable=1.

В таблице параметр и его редактор выглядят следующим образом.

3.4.7. Параметр типа "datetime"

Дата + время различной точности.

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

type=<type>
stepHour=<stepHour>
stepMinute=<stepMinute>
#
# при редактировании поля отправка классу-обработчику изменений параметра события ru.bgcrm.event.DateChangingEvent, позволяющего раскрашивать даты различными цветами и сопровождать примечаниями 
#sendColorMapRequest=1

Где:

<type> - может принимать значения ymdh, ymdhm, ymdhms в зависимости от требуемой точности поля;
<stepHour> - шаг в выборе часов;
<stepMinute> - шаг в выборе минут.

Пример параметра. Конфигурация, как выглядит в таблице и редактирование.

3.4.8. Параметр типа "address"

Адресный, ссылающийся на дом в справочнике адресов.

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

# несколько адресов в параметре
multiple=1

Как выглядит в таблице и редактирование.

Доступен контекстный поиск по подстроке улицы и дому. Несмотря на приведённый пример использовать подобный параметр для адреса прописки не следует, т.к. он требует наличия в справочнике домов записей обо всех домах, используемых в значениях параметров.

Замечание

Формат строки отображаемой в таблице задаётся в конфигурации.

3.4.9. Параметр типа "phone"

Один или несколько телефонов с комментариями.

В конфигурации параметра ничего не указывается.

Как выглядит в таблице и редактирование.

Замечание

Формат строки отображаемой в таблице задаётся в конфигурации.

3.4.10. Параметр типа "email"

Один или несколько EMail адресов либо только адресов доменов с комментариями.

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

# несколько EMail в параметре
multiple=1

Как выглядит в таблице и редактирование.

3.4.11. Параметр типа "file"

Один или несколько файлов.

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

# несколько файлов в параметре
multiple=1

В таблице параметр выглядит следующим образом.

3.5. Планировщик

Замечание

Вы можете пропустить этот раздел при первом знакомстве с системой.

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

scheduler.task.<id>.class=<class_name>
scheduler.task.<id>.minutes=<minutes>
scheduler.task.<id>.minutes=<minutes>
# необязательные параметры
scheduler.task.<id>.hours=<hours>
scheduler.task.<id>.dw=<dw>

Где:

<id> - уникальный числовой идентификатор задачи;
<class_name> - имя класса запускаемой задачи;
<hours> - часы в которые запускается задача, через запятую от 0 до 23;
<dw> - дни недели в которые запускается задача, через запятую от 1 до 7, 1 - понедельник.

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

В планировщике может быть запущен любой объект Java-класса, реализующий интерфейс java.lang.Runnable. Класс может быть статическим либо динамическим. Для разового запуска вы можете использовать запуск класса.

4. Контрагенты

4.1. Общие сведения

Контрагент - физическое лицо либо организация, с которым взаимодействует пользователь BGCRM.

4.2. Карточка контрагента

Карточки открытых контрагентов отображаются в буфере Контрагенты. Для создания нового контрагента перейдите в буфер и нажмите Создать. Также кнопка создания доступна в оснастке поиска.

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

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

5. Процессы

5.1. Общие сведения

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

  • тип;

  • текущий статус и время его установки;

  • время начала;

  • время завершения;

  • исполнители и группы решения;

  • описание;

  • приоритет.

Остальные параметры назначаются с помощью системы параметров для разных типов процессов.

5.2. Роли

Каждый процесс обслуживается одним или несколькими подразделениями (группами). При этом группа выступает в процессе в той или иной роли. По-умолчанию в системе определена одна роль с кодом 0 - "Выполнение" процесса. Список ролей может быть дополнен в конфигурации. Примерами ролей могут быть: "Инициация", "Продажа", "Согласование" и т.п. У каждой роли должен быть свой уникальный код.

5.3. Статусы

Статус определяет текущее состояние процесса. Позиция статуса определяет порядок его в списке статусов.

5.4. Типы процессов

Типы процессов представляют из себя дерево.

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

В свойствах типа указываются следующие параметры:

  • разрешённые статусы, их порядок в редакторе и возможные переходы между ними;

  • допустимые параметры процесса, их порядок;

  • код (ID) начального и конечных статусов;

  • динамический класс, обрабатывающий события изменения процесса (не обязательно);

  • начальные группы решения, устанавливаемые в процесс с указанием их ролей (не обязательно) ;

  • допустимые для установки в процесс группы решения с указанием их ролей;

  • конфигурация (не обязательно).

5.5. Тип процесса - конфигурация

Далее описываются параметры конфигурации типа процесса, поддержанные ядром. Параметры, поддерживаемые различными плагинами, описываются в разделах документации соответствующих плагинов.

В конфигурации типа процесса может быть указано:

# код параметра - категории, который должен быть указан перед переводом процесса в конечный статус
categoryParamId=<param_code>
# требование заполненности параметров перед установкой статуса, одна или несколько записей вида
requireFillParamIdsBeforeStatusSet.<status_to_code>=<param_codes>
# при создании процесса занесение в исполнители создавшего пользователя
setExecutor=current
# скрытие в редакторе процесса смены исполнителей
hideExecutors=1
# скрытие в редакторе процесса смены приоритета
hidePrioprity=1
# скрытие в редакторе процесса просмотра сообщений
hideMessages=1
# скрытие в редакторе процесса кнопки полного изменения описания
hideDescriptionChange=1
# скрытие в редакторе процесса кнопки добавления в описание процесса
hideDescriptionAdd=1
# сокрытие (0) либо отображение 1 (на вкладке), 2 (в левой части карточки процесса) в процессе привязок
processShowLinks=1
# сокрытие (0) либо отображение 1 (на вкладке) сообщений, связанных с процессом
processShowMessages=1
# требования указания обязательного комментария при переводы в статусы
requireChangeCommentStatusIds=<status_ids>
# сокрытие параметров в том или ином статусе, одна или несколько записей вида
hideParamIdsInStatus.<status_code>=<param_codes>
# параметры, редактор для которых скрыт в данном типе процесса (заполняются программно)
readonlyParamIds=<param_codes>
# шаблон текста при добавлении в описание процесса текста кнопкой "Добавить"
descriptionAddPattern=\n[${time} ${user}]\n\t${text}
# JSP шаблон для отображения карточки процесса вместо стандартного /WEB-INF/jspf/user/process/process/process.jsp, выполняйте рекомендации
#processCardJsp=/WEB-INF/jspf/user/process/process/custom/process_jur/zayavka.jsp

Где:

<param_code> - код параметра процесса, который должен быть указан при его закрытии, при этом редактор открывается под переключением статуса процесса;
<status_to_code> - код статуса, в который переводится процесс;
<param_codes> - коды параметров процесса через запятую;
<status_ids> - коды статусов через запятую;
<status_code> - код текущего статуса процеса.

5.5.1. Ограничение количества исполнителей по группам

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

executorRestriction.<n>.groupId=<groupId>
executorRestriction.<n>.maxCount=<maxCount>

Где:

<n> - порядковый числовой номер правила;
<groupId> - код группы пользователей;
<maxCount> - максимальное число исполнителей из данной группы на процессе.

Просматриваются все правила в порядке их номеров.

5.5.2. Настройка связки процессов между собой

Процесс может ссылаться на другой процесс следующими способами:

Ссылается - простая ссылка одного процесса на другой;
Порождён - указание, что ссылаемый процесс создан из данного процесса;
Зависит - процесс не может быть закрыт пока не закрыты все процессы на которые он ссылается данным способом.

Параметры в конфигурации типа процесса:

processShowProcessLinks=1 - отображение в карточке процесса вкладки со связями процесса с другими процессами;
processCreateLinkModeSelect=1 - привязка к процессу произвольных открытых процессов (цифра 3 на снимке далее).

Рассмотрим отображаемые на снимке экрана области В таблице 1 отображаются процессы, которые ссылаются на текущий процесс. В таблице 2 - те процессы, на которые ссылается текущий процесс.

Замечание

Кнопки удаления связей должны быть включены специальной опцией в конфигурации действия "Удаление привязки".

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

Выпадающий список 4 - позволяет создать процесс и привязать к данному процессу. Содержимое списка определяется записями в конфигурации типа процесса вида:

processCreateLink.<n>.title=<title>
processCreateLink.<n>.processTypeId=<typeId>
processCreateLink.<n>.linkType=<linkType>
# необязательные параметры
#processCreateLink.<n>.checkExpression=<expression>
#processCreateLink.<n>.copyParams=<copyRules>
# копирование привязок
#processCreateLink.<n>.copyLinks=1

Где:

<n> - порядковый номер записи;
<title> - наименование для списка;
<linkType> - тип связи: "processLink" - ссылается, "processMade" - порождён, "processDepend" - зависит;
<typeId> - код типа создаваемого процесса;
<expression> - JEXL выражение, позволяющее показывать пункт списка в зависимости от условий;
<copyRules> - через запятую коды копирующихся с текущего на создаваемый параметров, либо пары <from>:<to> - кодов однотипных параметров с какого на какой необходимо копировать.

В JEXL процессор передаются объекты:

processParam - объект класса ru.bgcrm.dao.expression.ParamValueFunction - параметры процесса.

Пример конфигурации. Создаётся ссылаемый процесс с кодом типа 9244, запись отображается в списке только если значение параметра с кодом 227 равно 1.

processShowProcessLinks=1
processCreateLink.1.title=Авария
processCreateLink.1.processTypeId=9244
# processLink - ссылается, processMade - порождён
processCreateLink.1.linkType=processLink
#processCreateLink.1.checkExpression=processParam: getParamValue(227) == 1
#processCreateLink.1.copyParams=48,46,150,151
processCreateLink.1.copyLinks=1

5.5.3. Создание процесса с привязанными объектами

Разрешает создание процесса во вкладке Процессы объекта.

Переменная в конфигурации типа процесса:

create.in.objectTypes=<типы объектов через запятую>
create.in.copyParams=перечень пар <с параметра>:<на параметр>, разделённых точкой с запятой
# открывать (1) либо не открывать (0) вкладку с созданным привязанным процессом
create.in.<тип объекта>.openCreated=1

Копирование параметров поддерживается только для объектов, использующих стандартную систему параметров системы.

Типы объектов ядра:

customer - контрагент.

Типы объектов плагинов описаны в документации плагинов.

Пример. Возможность создания процесса с привязкой контрагента, копированием параметра с кодами 1 и 5 в контрагента в параметры процесса с кодами 3 и 6 соответственно:

create.in.objectTypes=customer
create.in.copyParams=1:3;5:6

5.5.4. Описание процесса

Макрос описаний процесса позволяет сгенерировать текст для заголовка вкладки процесса или для перечня процессов.

Для генерации описаний в конфигурацию типа процесса добавляются записи вида:

processReference.<n>.objectTypes=<objectTypes>
processReference.<n>.stringExpression=<macros>

Где:

<n> - порядковый номер записи;
<objectTypes> - области, где используется данный макрос через запятую, перечень областей см. далее;
<macros> - JEXL выражение, передаваемые объекты см. далее.

Перечень областей:

customer - вкладка Процессы контрагента;
processCard - заголовок вкладки процесса;
linkedProcessList - список процессов к которым привязан данный процесс;
linkProcessList - список процессов, привязанных к данному.

В JEXL процессор передаются объекты:

process - объект класса ru.bgcrm.model.process.Process - процесс;
processParam - объект класса ru.bgcrm.dao.expression.ParamValueFunction - параметры процесса.
processLink - объект класса ru.bgcrm.dao.expression.ProcessLinkFunction для работы с привязками процесса.

Кроме того доступны переменные устанавливаемые в ru.bgcrm.servlet.filter.SetRequestParamsFilter.

Пример конфигурации для генерации описания списке процессов контрагента из адреса и перечня услуг и на вкладке процесса из наименования контрагента и адреса:

processReference.1.objectTypes=customer
processReference.1.stringExpression=u.toString( processParam.addressValues( 90, 'fromStreet' ) ) + " : " + u.toString( processParam.listValueTitles( 238 ) )
processReference.2.objectTypes=processCard
processReference.2.stringExpression="Запрос док. ОИО: " + u.escapeXml( u.toString( processLink:linkTitles( "customer" ) ) ) + "<br/>" + u.escapeXml( u.toString( processParam:addressValues( 90, 'fromStreet' ) )  ) + "&nbsp;"

Как выглядит в интерфейсе.

5.5.5. Простая обработка изменения процессов

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

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

onProcessEvent.<n>.commands=<commands>
onProcessEvent.<n>.events=<events>
onProcessEvent.<n>.eventsExclude=<eventsExclude>
# необязательные параметры
onProcessEvent.<n>.ifExpression=<ifExpression>
onProcessEvent.<n>.checkExpression=<expression>
onProcessEvent.<n>.checkErrorMessage=<message>

Где:

<n> - подядковый числовой номер правила;
<events> - обрабатываемые правилом события через точку с запятой, если параметр не указывается - то обрабатываются все события связанные с данным типом процесса;
<eventsExclude> - исключаемые из обработки правилом события через точку с запятой, если параметр не указывается - то никакие событие не исключаются;
<ifExpression> - JEXL выражение проверки условия при котором отрабатывают команды макроса;
<expression> - JEXL выражение проверки условия при невыполнении которого генерируется ошибка <expression>, используется только с <expression>;
<message> - текст ошибки, сообщаемой при невыполнении условия <expression>;
<commands> - команды макроса обработки.

В <events> поддержаны следующие события:

statusChanging:<statusIds> - статус изменяется на одно на одно из значений, коды которых указаны через запятую в <statusIds>;
statusChanged:<statusIds>- статус изменился на одно из значений, коды которых указаны через запятую в <statusIds>;
closed - процесс закрыт;
created - процесс создан;
createdAsLink - процесс создан как привязанный к другому процессу;
descriptionAdding - в описание процесса добавляется текст;
descriptionAdded - в описание процесса добавлен текст;
descriptionChanging - описание процесса изменяется целиком;
descriptionChanged - описание процесса изменилось целиком;
linkAdding - к процессу добавляется привязка;
linkAdded - к процессу добавлена привязка;
linkRemoving - удаляется привязка процесса;
linkRemoved - удалена привязка процесса;
messageAdded - в процесс поступило новое сообщение;
paramChanging:<paramIds> - изменяется параметр процесса, код которого указан через запятую в <paramIds>;
paramChanged:<paramIds> - изменился параметр процесса, код которого указан через запятую в <paramIds>.

В JEXL процессор передаются следующие объекты для вызова функций:

user - объект класса ru.bgcrm.model.user.User - текущий пользователь;
userParam - объект класса ru.bgcrm.dao.expression.ParamValueFunction - параметры текущего пользователя;
process - объект класс ru.bgcrm.model.process.Process - изменяющийся процесс;
processParam - объект класса ru.bgcrm.dao.expression.ParamValueFunction - параметры изменяющегося процесса.

Правила просматриваются в порядке их номеров. Первое правило выдавшее сообщение прерывает просмотр и отменяет изменение связанное с процессом.

В <commands> указывается макрос обработки процесса, состоящий из команд, разделённых точкой с запятой. Все команды макроса выполняются последовательно и в рамках текущей транзакции. Ошибка в любой из команд прерывает текущую транзакцию, откатывая внесённые в БД изменения.

Команды поддержанные макросе:

addGroups:<groupIds> - добавить в процесс разрешённые для типа процесса группы решения с ролью 0 "Выполнение", коды которых указанны через запятую в <groupIds>;
clearGroups - очистить список групп процесса;
addExecutors:<executorIds> - добавить в процесс исполнителей, коды которых указаны через запятую в <executorIds>; группа для привязки определяется путём пересечения множества текущих групп исполнителя с множеством групп, соотнесённых процессу;
addExecutorsInGroups:<groupIds>:<executorIds> - добавить исполнителей, коды которых указаны через запятую в <executorIds>; исполнители привязываются к одной группе процесса, код которой попадает в перечень указанный в <groupIds> через запятую;
setExecutorsInGroups:<groupIds>:<executorIds> - установить в процесс исполнителей, коды которых указаны через запятую в <executorIds>; исполнители привязываются к одной группе процесса, код которой попадает в перечень указанный в <groupIds> через запятую, существующие исполнители заменяются;
setExecutorsInGroupsIfNot:<groupIds>:<executorIds> - аналогично предыдущему, но исполнители устанавливаются, только если к группе-роли из перечня не приязан исполнитель;
clearExecutors - очистить список исполнителей процесса;
setStatus:<statusId> - установить статус процесса, код которого указан в <statusId>;
checkExecutorsInGroups:<groupIds> - проверить наличие исполнителей с группами, коды которых указаны через запятую в <groupIds>;
refreshCurrentQueue - перейти в текущую открытую очередь процессов и обновить её;
open - открыть или обновить карточку обрабатываемого процесса;
close - закрыть карточку обрабатываемого процесса;
decreasePriority:<count> - понизить приоритет процесса на <count>;
increasePriority:<count> - повысить приоритет процесса на <count>.

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

Пример. Разршение на правку процесса в различных статусах различным группам, исполнителю либо администратору и запрет правки закрытого процесса.

changeControl.1.checkExpression=process:getStatusId() !~ [9, 13, 36,39] or 8 =~ user:getGroupIds()
changeControl.1.checkErrorMessage=В этом статусе разрешена правка только сотрудникам КС
changeControl.2.checkExpression=process:getStatusId() != 9 or user:getId()  =~ process:getExecutorIds() or 33 =~ user:getPermsetIds()
changeControl.2.checkErrorMessage=В этом статусе разрешена правка только исполнителем процесса либо администратором КС
changeControl.3.checkExpression=empty process:getCloseTime()
changeControl.3.checkErrorMessage=Запрещена правка закрытого процесса

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

onProcessEvent.1.events=createdAsLink
onProcessEvent.1.commands=addExecutors:{@ctxUserId};setStatus:40

Пример. Изменение статуса процесса на 3 при получении в него нового сообщения.

onProcessEvent.1.events=messageAdded
onProcessEvent.1.ifExpression=process:getStatusId() != 3
onProcessEvent.1.commands=setStatus:3

5.6. Карточка процесса

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

В левой области расположены основные свойства процесса и ссылки для их редактирования. Далее настроенные для процесса параметры.

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

5.7. Очереди процессов

5.7.1. Общие сведения

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

В свойствах очереди определяются доступные в ней типы процессов, прочие параметры вводятся в конфигурации.

5.7.2. Колонки

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

column.<id>.title=<title>
column.<id>.value=<type>
# необязательные параметры
# запрет переносов в столбце 
column.<id>.nowrap=1
# выравнивание в столбце
column.<id>.align=<align>
# стиль столбца
column.<id>.style=<style>
# форматирование переносов строк в столбце к HTML формату (переносы строк отображаются в таблице)
column.<id>.formatToHtml=1
# обрезание значения столбца с добавлением ссылки на развёртывание полного текста, если длина текста больше <maxSymbols> символов
column.<id>.cutIfMore=<maxSymbols>

Где:

<id> - уникальный числовой идентификатор колонки;
<title> - заголовок;
<type> - выводимое значение, см. значения далее;
<align> - выравнивание: "left", "center", "right";
<style> - CSS стиль столбца;
<maxSymbols> - максимальная не обрезаемая длина текста;

Выводимое значение <type> может быть следующим:

id - идентификатор процесса;
type_title - тип процесса;
status_title - текщий статус;
status_dt - время установки текущего статуса;
status_user - пользователь, установивший текущий статус;
status_comment - комментарий текущего статуса;
status:<statusIds>:dt - дата и время последней установки статуса из перечисленных через запятую в <statusIds>;
status:<statusIds>:user - пользователь, последним установвший стаус из перечисленных через запятую в <statusIds>;
status:<statusIds>:comment - комментарий последней установки статуса из перечисленных через запятую в <statusIds>;
priority - приоритет;
create_dt - дата и время создания;
create_user - пользователь, создавший процесс;
close_dt - дата и время закрытия;
close_user - пользователь, закрывший процесс;
executors - исполнители, при необходимости указать исполнителей процесса только из определённых групп - executors:<group_ids>, где <groups_ids> - коды групп пользователей через запятую;
description - описание;
param:<param_id> - параметр процесса, где <param_id> - код параметра;
ifListParam:<paramId>:<value>:<existFag>:<notExistFlag> - вывод <existFlat> если списковый параметр процесса с кодом <paramid> установлен в значение <value> либо <notExistFlag> в противоположном случае, :<existFag>:<notExistFlag> - необязательные параметры, по умолчанию это символы "✓" и "✗";
linkedCustomer:param:<param_id> - параметр привязанного к процессу контрагента, где <param_id> - код параметра;
linkedCustomer:<column> - значения столбца <column> из таблицы customer для привязанных контрагентов; id - код, title - наименование;
linkedObject:<object_type_prefix> - названия привязанных к процессу сущностей в таблице process_link с префиксом типа <object_type_prefix>;
linkedCustomerLink - перечень контрагентов, привязанных к процессу со ссылками на открытие их карточек;
actions - ссылки с операциями над процессом.

5.7.3. Фильтры

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

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

Где:

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

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

filter.1.type=status
filter.1.show=1
filter.1.availableValues=9,10,12
filter.1.defaultValues=10
#
filter.2.type=create_date
#
filter.3.type=groups
filter.3.defaultValues=17
#
filter.4.type=executors
#
filter.5.type=code
filter.6.type=close_date

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

5.7.3.1. "code" - код процесса

Необязательные параметры:

show - 0, если фильтр необходимо скрыть.
5.7.3.2. "description" - подстрока в описании процесса

Необязательные параметры:

show - 0, если фильтр необходимо скрыть.
5.7.3.3. "openClose" - открытые либо закрытые процессы

Вывод только открытых, только закрытых либо всех процессов, значительно ускоряет выборку.

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
defaultValue - "none", "open" либо "close" - значение фильтра по-умолчанию.
5.7.3.4. "create_date" - диапазон дат создания процесса, "close_date" - диапазон дат закрытия процесса

Необязательные параметры:

show - 0, если фильтр необходимо скрыть.
5.7.3.5. "status_date" - диапазон дат когда процесс последний раз был переведён в статус

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
availableValues - отображаемые в фильтре коды статусов, в порядке их отображения; если параметр не указан - отображаются все статусы.
5.7.3.6. "status" - статус

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
width - ширина фильтра в пикселях;
values - жёстко заданные в фильтре коды статусов, в этом случае фильтр имеет смысл только скрытым;
availableValues - отображаемые в фильтре коды статусов, в порядке их отображения; если параметр не указан - отображаются все статусы;
defaultValues - коды статусов, выбранные в фильтре по-умолчанию через запятую;
onEmptyValues - значения фильтра, используемые, если никакие значения пользователем не выбраны.
5.7.3.7. "type" - тип процесса

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
width - ширина фильтра в пикселях;
availableValues - отображаемые в фильтре коды типов процессов, в порядке их отображения; если параметр не указан - отображаются все типы процессов;
defaultValues - коды типов процессов, выбранных в фильтре по-умолчанию через запятую;
onEmptyValues - значения фильтра, используемые, если никакие значения пользователем не выбраны.
5.7.3.8. "groups" - группы, исполняющие процесс

Фильтр без учёта ролей групп.

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
width - ширина фильтра в пикселях;
availableValues - отображаемые в фильтре коды групп, в порядке их отображения; если параметр не указан - отображаются все группы;
defaultValues - коды типов групп, выбранных в фильтре по-умолчанию через запятую;
onEmptyValues - значения фильтра, используемые, если никакие значения пользователем не выбраны.
5.7.3.9. "executors" - исполнители процесса

Без учёта в составе какой группы участвует пользователь. Фильтр работает только совместно с фильтром groups, при этом в списке исполнителей отображаются пользователи, когда-либо состоявшие в группах, указанных в фильтре groups.

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
width - ширина фильтра в пикселях;
values - "current", если необходимо отображать только процессы с текущим пользователем в исполнителях, фильтр в этом случае желательно скрыть.
5.7.3.10. "grex" - совмещённый фильтр по группам и исполнителям процесса

Фильтрует с учётом роли групп в процессах.

Обязательные параметры:

roleId - код роли.

Необязательные параметры:

groups.show - 0, если выбор групп необходимо скрыть;
groups.width - ширина выбора групп в пикселях;
groups.availableValues - отображаемые в фильтре коды групп, в порядке их отображения; если параметр не указан - отображаются все группы;
groups.defaultValues - коды типов групп, выбранных в фильтре по-умолчанию через запятую;
groups.onEmptyValues - значения групп фильтра, используемые, если никакие значения пользователем не выбраны;
executors.show - 0, если выбор исполнителей необходимо скрыть;
executors.width - ширина выбора исполнителей в пикселях.
5.7.3.11. "param:<paramId>" - фильтр по параметру процесса с кодом <paramId>

Поддерживаются параметры одного из следующих типов: "list", "date", "datetime", "address".

Обязательные параметры:

title - подпись к фильтру.

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
width - ширина фильтра в пикселях; для параметров типа "list", "address";
availableValues - доступные значения спискового параметра;
defaultValues - выбранные по-умолчанию значения спискового параметра;
onEmptyValues - значения параметра, используемые, если никакие значения пользователем не выбраны.
5.7.3.12. "linkedCustomer:title" - подстрока в наименовании привязанного к процессу контрагента

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
width - ширина фильтра в пикселях.
5.7.3.13. "linkedCustomer:param:<paramId>" - параметр привязанного к процессу контрагента

Поддерживаются параметры только типа "list".

Обязательные параметры:

title - подпись к фильтру.

Необязательные параметры:

show - 0, если фильтр необходимо скрыть;
width - ширина фильтра в пикселях;
availableValues - доступные значения спискового параметра;
defaultValues - выбранные по-умолчанию значения спискового параметра;
onEmptyValues - значения параметра, используемые, если никакие значения пользователем не выбраны.

5.7.4. Сортировка

Конфигурация количества последовательных сортировок (выпадающих списков с режимами сортировки).

sort.combo.count=<count>

Где:

<count> - количество последовательных сортировок.

Пример:

sort.combo.count=3

Для каждого выпадающего списка возможно определение значния по-умолчанию:

sort.combo.<combo_id>.default=<defaultValue>

Где:

<combo_id> - порядковый номер выпадающего списка начиная с 1;
<defaultValue> - выбранное по-умолчанию значение в выпадающем списке начиная с 1.

Либо жёстко определить значение (используется в основном для мобильного интерфейса):

sort.combo.<combo_id>.value=<value>

Где:

<combo_id> - порядковый номер выпадающего списка начиная с 1;
<value> - выбранное значение в выпадающем списке начиная с 1.

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

sort.mode.<id>.columnId=<col_id>
sort.mode.<id>.title=<title>
# обратный режим сортировки 1 - обратный, 0 - прямой
sort.mode.<id>.desc=1

Где:

<id> - уникальный числовой идентификатор режима сортировки;
<col_id> - числовой идентификатор колонки, по которой производится сортировка, либо "0" - случайный режим сортировки;
<title> - название режима сортировки.

Пример. Режимы сортировки по типу процесса, выводимому в колонке 1 и режим обратной соротировке по id процесса.

sort.mode.1.columnId=1
sort.mode.1.title=Тип
sort.mode.2.column.id=2
sort.mode.2.title=Создан обр.
sort.mode.2.desc=1

5.7.5. Операции

Настраиваемые операции над процессом, ссылки которых выводятся в колонке с value=actions.

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

action.<id>.title=<title>
action.<id>.statusIds=<statusIds>
action.<id>.commands=<commands>

Где:

<id> - уникальный числовой идентификатор режима сортировки;
<title> - наименование операции.
<statusIds> - коды статусов через запятую, в которых разрешена операция;
<commands> - команды макроса обработки процесса.

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

# в каком интерфейсе отображать очередь
showIn=<show_in>
# для мобильного интерфейса кнопки создания процессов в очереди
createAllowedProcessList=<process_id_1>:<title_1>;<process_id_2>:<title_2>;..<process_id_n>:<title_n>
# для стационарного интерфейса - запрет создания процессов в очереди (нет кнопки "Создать")
allowCreateProcess=0

Где:

<show_in> - может быть usermob, user; по-умолчанию принимается значение user.
<process_id_x> - код типа процесса;
<title_x> - наименование кнопки.

6. Сообщения

6.1. Общие сведения

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

6.2. Настройка типов сообщений

Типы сообщения настраиваются в конфигурации, одна или несколько записей вида:

messageType.<id>.title=<title>
messageType.<id>.class=<class_name>

Где:

<id> - уникальный числовой идентификатор типа сообщения, не должен меняться впоследствии;
<title> - наименование типа сообщения;
<class_name> - имя класса-обработчика сообщений.

Остальные параметры различаются для разных видов сообщений.

6.2.1. Сообщения EMail

<class_name>=ru.bgcrm.dao.message.MessageTypeEmail. Дополнительные параметры:

messageType.<id>.email=<email>
messageType.<id>.host=<host>
messageType.<id>.login=<login>
messageType.<id>.pswd=<pswd>
messageType.<id>.folderIn=<inFolder>
messageType.<id>.folderProcessed=<processedFolder>
messageType.<id>.folderSkipped=<skippedFolder>
messageType.<id>.folderSent=<sentFolder>
# необязательные параметры
messageType.<id>.folderInProcessLinked=<inProcessedFolder>

Входящие сообщения считываются с EMail ящика по протоколу IMAP. Сообщения считываются из папки <inFolder>. Параметры подключения IMAP задаются параметрами <host>, <login>, <pswd>. После разбора текста сообщений и вложений сообщение перемещается в <processedFolder>, при возникновении ошибок - в <skippedFolder>.

<email> подставляется в поле отправителя исходящего письма. Папка <inProcessedFolder> указывает папку, из которой считываются ответные письма на отправленные из BGCRM привязанные к процессу сообщения. Определение привязки производится по теме письма, в которую при отправке из BGCRM добавляется маркер с типом процесса.

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

Пример настройки:

messageType.1.title=billing@bitel.ru
messageType.1.class=ru.bgcrm.dao.message.MessageTypeEmail
messageType.1.email=billing@bitel.ru
messageType.1.host=imap.ufamail.ru
messageType.1.login=billing@bitel.ru
messageType.1.pswd=*****
messageType.1.folderIn=INBOX.CRM
messageType.1.folderInProcessLinked=INBOX
messageType.1.folderProcessed=INBOX.CRM_PROCESSED
messageType.1.folderSkipped=INBOX.CRM_SKIPPED
messageType.1.folderSent=INBOX.CRM_SENT

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

6.3. Настройка планировщика

Получение новых сообщений и отправку созданных в BGCRM осуществляет класс ru.bgcrm.worker.MessageExchange, настройте его запуск в планировщике.

6.4. Оснастка "Сообщения"

В оснастке производится разбор новых поступивших сообщений, которые необходимо разбить по процессам.

Открытое сообщение:

При обработке сообщение должно быть помечено как обработанное и быть привязанным к существующему процессу (необходимо указать его код) либо к вновь созданному. При создании процесса система ищет по адресу отправителя сообщения контрагентов, которые могут быть соотнесены с процессом. Для EMail поиск производится по параметру типа EMail по точному совпадению либо указанному в контрагенте домену.

Созданному процессу возможно сразу установить группу решения, исполнителя, параметры.

6.5. Работа с сообщениями в процессе

Отображение вкладки сообщений должно быть настроено в конфигурации типа процесса.

Для создания сообщения в рамках процесса используйте кнопку Создать, для ответа на сообщение - кнопку A рядом с каждым сообщением. Ответы на сообщения автоматически будут разнесены в процесс. Пометку процессов с новыми сообщениями можно реализовать переключением статуса процесса по событию поступления сообщения.

7. Организация работ

7.1. Общие сведения

Организация работ - общее название раздела системы, предназначенного для организации учета рабочего времени. Основной рабочий элемент - График Дежурств.

7.2. Виды работ

Виды работ - это описание типов деятельности по отношению к той или иной группе пользователей (чем именно они занимаются и какое время на это тратится).

Каждый вид работы содежрит название, цвет (для визуального отличия в Смене или на Графике Дежурств) и правила.

Кажде правило содержит: Процессы (один или несколько), Услуги (одна или несколько), Продолжительность.

Где:

Процессы - это типы процессов, которые используются в системе;
Услуги - это списковый параметр процесса;
Продолжительность - количетсво времени (минут), необходимое для выполнения данного типа работ;

Для настройки списка Услуги необходимо создать списковый параметр процесса, пример:

Далее, необходимо в конфигруции указать значение параметра callboard.serviceListId равное id спискового параметра Услуги. Для примера выше:

#id параметра Услуги
callboard.serviceListId = 63

Допускается создание вида работы без правил (пустой тип).

7.3. Редактор смен

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

7.4. Календарь рабочих дней

7.4.1. Общие сведения

Календарь рабочих дней - это календарь с распределением типов рабочих дней в году (рабочий день, выходной день и т.д.).

7.4.2. Настройка

Первоначальная настройка Календаря осуществляется через конфигурацию, далее в интерфейсе редактора только добавляются/удаляются исключения.

Конфигурация Календаря выглядит следующим образом:

#конфигурация календаря рабочих дней

#настройка типов рабочих дней
callboard.workdays.type.X.title=<Название>
callboard.workdays.type.X.title=<Цвет для обозначения на календаре>

#настройка календарей
callboard.workdays.calendar.X.title=<Название>
callboard.workdays.calendar.X.comment=<Комментарий>
callboard.workdays.calendar.X.rule=<Правила распределения>

Где:

<X> - порядковый номер
<rule> - правила распределния. Правила разделяются ";". Правила могут быть вида X:Y, либо X1-X2:Y (где X - порядковый день недели, Y - id типа рабочего дня, X1-X2 - диапазон дней недели, например 1-5 значит с 1 по 5)

Пример заполнения конфигурации:

#настройка типов рабочих дней
callboard.workdays.type.1.title=Рабочий день
callboard.workdays.type.1.color=#1C94C4

callboard.workdays.type.2.title=Выходной день
callboard.workdays.type.2.color=#FF0000

callboard.workdays.calendar.1.title=Стандартный
callboard.workdays.calendar.1.comment=Общий план распределения рабочих дней
callboard.workdays.calendar.1.rule=1-5:1;6,7:2;

Здесь правила означают, что: дни с 1 по 5 каждой недели будут соотноситься с типом 1 (Рабочие дни в данном примере), а дни 6 и 7 с типом 2 (Выходные дни).

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

7.4.3. Работа с календарем

Настроенные в конфигурации Календари доступны для дальнейшего редактирования во вкладке Календарь рабочих дней Организации Работ.

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

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

Если необходимо скопировать распределение рабочих дней с одного года на другой, доступна функция копирования. Для ее использования следует нажать кнопку "Копирование параметров".

7.5. График дежурств

7.5.1. Общие сведения

График дежурств - это с таблица с перечнем работников и описанием кто, когда и как работает.

7.5.2. Настройка

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

Конфигурация графика выглядит следующим образом:

#конфигурация графика дежурств
callboard.X.groupId=<id родительской группы>
callboard.X.calendarId=<id календаря рабочих дней>
callboard.X.pastEditAllowed=<разрешить редаткриование прошлым>
callboard.X.autoAddGroup=<автоматически добавлять группу>

Где:

<X> - порядковый номер;
<groupId> - id родительской группы, для подгрупп которой будет строиться график;
<calendarId> - (необязательный параметр) id календаря с распределением рабочих дней>;
<pastEditAllowed> - 0 или 1, соответственно запретить или разрешить редактирование графика за прошедшие дни;
<autoAddGroup> - 0 или 1, при попытке установить сотруднику смену на день, в который он не числится в данной группе, при установленном значении 1 - автоматически добавит на этот день пользователя в эту группу;

Пример конфигурации:

#кофигурация графика дежурств
callboard.1.groupId=36
callboard.1.calendarId=1
callboard.1.pastEditAllowed=0
callboard.1.autoAddGroup=0

Следует обратить внимание на то, что пользователь который будет редактировать график дежурств, должен состоять в группе для которой сконфигурирован график (в примере выше, в группе с id=36)

7.5.3. Использование графика

Перед началом редактирования графика предлагается выбор из одной или нескольких Групп (в зависимости от прав пользователя и конфигурации графиков). Также необходимо выбрать промежуток времени, за который будет производится редактирование. Дата начала по умолчанию - текущая дата. Конечную дату можно не указывать: в этом случае график будет построен на 10 дней, с даты начала.

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

Бригада - объединение нескольких работнику в пределах смены. Если это необходимо, то любому работнику можно установить номер бригады в пределах одной даты. Это может пригодиться в том случае, если показать на графике как именно работают сотрудники: по одиночке, парно и т.д. Для установки номера бригады необходимо кликнуть в левом верхнем углу клетки с проставленной сменой и далее, в появившемся окне, написать номер и нажать <Enter>.

Изменение номера бригады происходит анналогичным образом.

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

Контекстное меню - вызывается правым кликом на проставленном шаблоне смены и позволяет вручную отредактировать виды работ и установить номер бригады:

8. Ускорение поиска контрагентов с помощью Sphinx

8.1. Настройка Sphinx

При определенном количестве контрагентов стандартная СУБД MySQL не всегда должным образом может справляться с нагрузкой, вызываемой поиском контрагентов, что может приводить к увеличению времени обработки запросов. Для повышения скорости и разгрузке основной базы при поиске контагента по ФИО, адресу, году рождения и другим параметрам существует возможность интеграции BGCRM с системой полнотекстового поиска Sphinx.

Из репозиториев необходимо установить дистрибутив Sphinx версии не ниже 2.0.6. В конфигурационном файле, который находится обычно (зависит от дистрибутива) в /etc/sphinx/sphinx.conf описываем конфигурацию:

# название индекса
index customer 
{
        # real-time тип индекса
        type            = rt               
        # путь хранения             
        path            = /var/local/sphinx/customer    
        morphology      = stem_ru
        min_word_len    = 1
        charset_type    = utf-8
        enable_star     = 1
        #min_prefix_len = 2
        #min_infix_len  = 2

        # атрибутиы индекса
        # id
        rt_field        = index                         
        # ФИО или название организации
        rt_attr_string  = title                      
        # полная строка описание контрагента с параметрами, по которой осуществляется поиск   
        rt_attr_string  = reference                  
}

searchd
{
        # слушаем порт 9306, тип совместимый с mysql
        listen          = 9306:mysql41
        # логи сервера                  
        log             = /var/log/sphinx/sphinx.log
        # лог запросов    
        query_log       = /var/log/sphinx/query.log     
        binlog_path     = /var/log/sphinx/
        pid_file        = /var/run/sphinx/sphinx.pid
        read_timeout    = 5
        max_children    = 30
        # максимальное количество выводимы совпадений
        max_matches     = 5000                          
        workers         = threads
}

Запуск осуществляется стандартным для *nix систем образом:

# /etc/init.d/searchd start

После запуска можно удостовериться, что демон действительно запущен:

# netstat -nlptu
...

tcp 0 0 0.0.0.0:9306:* LISTEN 27095/searchd

Так как тип выбирали совместимый с MySQL, то мы можем подключиться к серверу Sphinx стандартным клиентом для MySQL:

# mysql -h 127.0.0.1 -P 9306

8.2. Настройка BGCRM

Для интеграции со Sphinx в Конфигурации нужно настроить следующие пункты:

# включить поиск в кэше
sphinx.enable=<flag>
# URL/IP на котором находится сервер sphinx
sphinx.url=<url>
# номер порта, прослушиваемый sphinx
sphinx.port=<port>
# максимальное время в секундах, через которое измененный контрагент будет перекэширован
sphinx.cacheTimeout=<seconds>
# максимальное количество контрагентов, которое может быть отправлено в кэш за один раз
sphinx.cacheLimit=<count>
# список параметров контрагента, по которым ведется поиск в кэше
sphinx.customerParamIds=<paramIds>

Где:

<flag> - 1, если поиск необходимо включить, любое другое значение отключает поиск

<url> - URL, либо IP-адрес хоста, на котором настроен Sphinx

<port> - номер порта сервера Sphinx

<seconds> - максимальное время в секундах, через которое измененный контрагент будет перекэширован

<count> - максимальное количество контрагентов, которое может быть отправлено в кэш за один раз

<paramIds> - id параметров контрагента, указанные через запятую

Пример конфигурации:

sphinx.enable=1
sphinx.url=127.0.0.1
sphinx.port=9306
sphinx.cacheTimeout=300
sphinx.cacheLimit=500
sphinx.customerParamIds=73,12,248

Также наобходимо настроить задачу в планировщике, которая периодически отправляет в кэш контрагентов, у которых изменялись параметры:

scheduler.task.<number>.class=<className>
scheduler.task.<number>.minutes=<minutes>

Пример:

scheduler.task.4.class=ru.bgcrm.dyn.sphinx.SphinxCache
scheduler.task.4.minutes=5,10,15,20,25,30,35,40,45,50,55,60

После этого в графическом интерфейсе появится поле, которое использует при поиске кэш:

9. Расширение функционала

9.1. Общие сведения

Система BGCRM является в первую очередь платформой, поэтому значительный эффект от её применения достигается путём реализации различного рода расширений под спицифику пользователя. Вы можете пропустить данный раздел целиком при первичном знакомстве с системой.

9.2. Технологии

9.2.1. Java REGEXP

Регулярные выражения позволяют гибко описывать шаблоны строк.

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

Например:

(342) - это символы 342 следующие один за другим;
3\d2 - это 3 затем любая цифра и 2;
((342)|(559)) - последовательность симоволов 342 либо 559;
44[2-8] - строки 442, 443, 444, 445, 446, 447, 448.

Расшифровка некоторых макросов:

а-b - на этом месте может располагаться симовол от a до b (в таблице символов);
[abc] - на этом месте может располагаться любой из символов a, b либо c;
abc - последовательное расположение символов a, b, c;
((abc)|(def)) - на этом месте последовательно располагаются abc либо def, () - группа символов.

Ссылки:

9.2.2. XSLT 2.0

XSLT - язык, основанный на формате XML. Его назначение - трансформация XML дерева с данными в какой-либо результирующий формат. Например: TXT, XHTML (HTML документ, соответсвующий правилам формата XML). Трансформация производится XSLT процессором.

Версия 2.0 является существенным расширением версии 1.0, ключевые изменения можно посмотреть здесь: http://www.xmlhack.ru/texts/02/xslt20/xslt20.html

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

<tbody>
  <xsl:for-each select="bills/bill">
  <xsl:variable name="uid" select="@uid"/>
  <tr>
   <td nowrap="nowrap"><xsl:value-of select="@number"/></td>
   <td><xsl:value-of select="@create_dt"/></td>
   <td><xsl:value-of select="@pay_dt"/></td>
   <td nowrap="nowrap"><xsl:value-of select="@summ"/></td>
   <td nowrap="nowrap">
    <xsl:choose>
     <xsl:when test="@status=0">не оплачен</xsl:when>
     <xsl:otherwise>оплачен</xsl:otherwise>
    </xsl:choose>
   </td>
   <td>
     <xsl:choose>
     <xsl:when test="$uid=-1">создан Вами</xsl:when>
     <xsl:otherwise>создан администратором</xsl:otherwise>
    </xsl:choose>
  < /td>

Здесь форматируется XHTML документ, при этом используются стандартые HTML теги (tr, td) и управляющие теги поцессора (xsl:choose, xsl:value-of). Рассмотрим несколько XSLT директив, встречающихся в приведенном фрагменте: <xsl:for-each select="bills/bill"> - для каждого узла bills/bill исходного дерева XML данных выполнить то что указано до </xsl:for-each>

<xsl:variable name="uid" select="@uid"/> - создать переменную uid и присвоить ей значение из атрибута uid текущего узла bill

<xsl:value-of select="@number"/> - вставить значение атрибута number текущего элемента bill

<xsl:choose> - условный оператор, аналог case либо if-else, внутри могу быть несколько <xsl:when> условий и действие по умолчанию <xsl:otherwise> Ниже приведены ссылки на руководства по XSLT. Язык разметки XSLT тесно завязан с языком XPath - языком выборки данных в XML деревьях. XSLT процессор "Saxon HE" используемый в BGCRM поддерживает спецификации XSLT и XPath версий 2.0 и 2.0.

9.2.3. JEXL

JEXL - язык условий. Используется для написания в конфигурации макросов условных выражений. Помимо операторов, описание которых доступно по ссылке в конце раздела, язык поддерживает обращение к функциям Java - объектов, переданных на вход обработчика в зависисимости от условий. Для вызова функции Java объекта необходимо ввести название объекта в контексте, точку и непосредственно вызов функции.

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

processCreateLink.1.title=Проект (Уфа)
processCreateLink.1.processTypeId=9260
processCreateLink.1.linkType=processDepend
processCreateLink.1.checkExpression=1 =~ processParam.addressCityIds( 90 ) and process.getStatusId() == 39
processCreateLink.1.copyParams=90,89,238
processCreateLink.1.copyLinks=1

В данном случае создание связанного процесса будет доступно только для процессов в статусе с кодом 39 и с наличием адреса в параметре с кодом 90 с городом 1.

В JEXL процессор всегда передаются объекты:

u - статический контекст объекта ru.bgcrm.Utils - возможность вызова статических функций;
su - статический контекст объекта org.apache.commons.lang.StringUtils - возможность вызова статических функций;
сu - статический контекст объекта org.apache.commons.collections.CollectionUtils - возможность вызова статических функций.

Дополнительные объекты передаются в зависимости от места использования.

Ссылки:

9.2.4. Log4j

Log4j - библиотека логирования для Java. Настройка логирования производится в файле log4j.properties, изменение файла можно производить при работающем приложении. Вид файла при установке системы:

log4j.rootLogger=INFO, file

log4j.logger.ru.bgcrm=INFO, file
log4j.additivity.ru.bgcrm=false

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd/HH:mm:ss} %5p [%t] %c{1} - %m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{MM-dd/HH:mm:ss} %5p [%t] %c{1} - %m%n
log4j.appender.file.File=./log/bgcrm.log
log4j.appender.file.Append=true
log4j.appender.file.BufferedIO=false
log4j.appender.file.BufferSize=1024
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.MaxFileSize=10MB

Сообщения в логе разделяются на уровни (в порядке возрастания): DEBUG, INFO, WARN, ERROR, FATAL. По-умолчанию настроен уровень INFO, т.е. выводятся информационные и ошибочные сообщения (INFO, FATAL, ERROR), отладка не выводится. Вывод осуществляется в файл log/bgcrm.log, который обрезается на размере 10МБ с созданием отдельных файлов.

Для включения вывода отладочной информации необходимо установить:

log4j.logger.ru.bgcrm=DEBUG, file

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

Ссылки:

9.3. Динамический код

Динамический код - это Java файлы, которые можно изменять и подгружать без перезапуска приложения. С его помощью можно обрабатывать различные события в системе. Файлы с классами динамического кода располагаются в по-умолчанию каталоге dyn. Динамические классы рекомендуется создавать в пакете ru.bgcrm.dyn.<дальнейшая иерархия пакетов>.

Замечание

Параметры динамического кода могут быть настроены в конфигурации.

Для написания динамического кода возможно использование как простого текстового редактора, так и полноценные IDE для Java разработки. Методология при этом аналогична примяемой для разработки в BGBilling.

Компиляция динамического кода осуществляется на вкладке Динамический код интерфейса администратора. Можно скомпилировать только все классы сразу. При успешной компиляции динамический код применяется также целиком.

Создаваемые динамические классы - обработчики событий должны расширять абстрактный класс ru.bgcrm.event.listener.DynamicEventListener. Информацию по типам событий можно получить из API документации к системе в формате JavaDoc.

9.3.1. Вызов динамического класса HTTP запросом

<crmUrl>/admin/dynamic.do?action=runDynamicClass&class=<className>&param1=value&param2=..

Где:

<crmUrl> - URL и порт BGCRM;
<className> - имя динамического класса.

Класс должен расширять абстрактный класс ru.bgcrm.event.listener.DynamicEventListener в который передаётся событие ru.bgcrm.event.RunClassRequestEvent.

9.4. JSP страницы

Пользовательские JSP страницы располагайте в каталогах WEB-INF/jspf/.../custom/.., это гарантирует вас от перетирания названия каталога штатными шаблонами.

Например: "/WEB-INF/jspf/user/process/process/custom/process_jur/zayavka.jsp".

9.5. Интеграция с внешними системами

Все запросы на изменение данных в возвращают результат в JSON формате. Запросы выборки данных возвращают результат в HTML формате, однако возможно получение данных и в JSON формате, путём добавления в запрос параметра responseType=json.

Для прозрачной авторизации запроса сторонней системы логин и пароль пользователя могут быть переданы в запросе в HTTP параметрах запроса j_username и j_password соответственно. Параметр authToSession=0 в запросе указывает на хранение отсутствие необходимости в HTTP сессии. Настоятельно рекомендуется использовать его при запросах внешних систем, т.к. предотвращение создания HTTP сессий экономит память BGCRM.

Пример запроса на получение данных во внешнюю систему в JSON формате (выборка по очереди процессов):

http://ncrm.core.ufanet.ru/user/process.do?action=queueShow&id=4&dateStatusStatus=10&status=10&status=9&status=13&currentUserMode=&group=7&sort=0&j_username=shamil&j_password=*****&responseType=json&authToSession=0

При изучении формата запросов и ответов возможно использование FireBug или иного инструмент разработчика в браузере с возможность просмотра запросов, в данный момент описания формата запросов нет. Т.е. получение протокола взаимодействия доступно только путём мониторинга вида запросов, отправляемых браузером при работе пользователя в BGCRM.

9.6. Запуск классов в контексте сервера

Для запуска любого класса, статического или динамического в контексте сервера BGCRM вызовите:

./crm.sh "runclass <class_name>"

Где <class_name> - полное имя класса с пакетом. Класс должен реализовывать интерфейс java.lang.Runnable.

Запуск в контексте сервера обозначает, что класс будет выполнен в рамках отдельного потока процесса сервера, получив доступ к соединению с БД, конфигурациям и другим объектам контекста. Результаты работы можно выводить в логи.

Для периодического выполнения класса необходимо использовать планировщик.

Глава 2. Плагин BGBilling

1. О плагине

Плагин предназначен для интеграции BGCRM с биллинговой системой BGBilling и предоставляет функционал:

  • поиск договоров по базе биллингов;

  • создание и модификация параметров договоров;

  • привязка договоров к контрагентам;

  • копирование параметров контрагентов в договора;

  • создание базы контрагентов по базе договоров.

2. Конфигурация

2.1. Серверы биллинга

Для добавления биллингов в конфигурации сервера добавляют конструкции вида:

bgbilling:server.<n>.id=<id>
bgbilling:server.<n>.title=<title>
bgbilling:server.<n>.url=<url>
bgbilling:server.<n>.version=<version>
bgbilling:server.<n>.customerIdParam=<paramId>

Где:

<n> - уникальный порядковый номер биллинга в конфигурации;
<id> - строковый идентификатор биллинга, короткая строка, именно на него ссылаются все остальные записи в конфигурации;
<title> - отображаемое наименование;
<url> - URL для подключения к сервлету executer биллинга;
<version> - версия, поддерживаются 5.1 и 5.2;
<param_id> - код текстового параметра договора в биллинге, в котором сохраняется код контрагента.

Например:

bgbilling:server.1.id=bitel
bgbilling:server.1.title=BiTel
bgbilling:server.1.url=http://billing.office.bitel.ru/executer
bgbilling:server.1.version=5.2
bgbilling:server.1.customerIdParam=100

Дополнительно для каждого сервера могут быть указаны необязательные параметры:

bgbilling.<n>.contract_pattern.<pat_num>.title_pattern=<pattern>
bgbilling.<n>.crm.problem.status.list=<status_list>
bgbilling.<n>.copyParamMapping=<mapping>

Где:

<pat_num> - код шаблона договора из биллинга;
<pattern> - шаблон нумерации договоров по этому шаблону при создании их из BGCRM;
<status_list> - перечень статусов проблем в CRM плагине BGBilling, по-умолчанию "0:открыта;1:принята;2:закрыта".
<mapping> - правила копирования параметров контрагента в договор, см. далее.

В параметре <mapping> могут быть определены разделённые точкой с запятой значения вида <cust_id>:<billing_id>.

Где:

<cust_id> - числовой код параметра контрагента либо customerTitle - наименование контрагента; для списковых параметров указывается код параметра и коды значениий в квадратных скобках после кода;
<billing_id> - числовой код параметра договора биллинга; для списковых параметров указывается код параметра и коды значениий в квадратных скобках после кода.

Например:

bgbilling:server.11.copyParamMapping=15:9;72:46;73:5;74:51;75:68;76:69;77:56;78:7;14:8;12:6;109:48;110:50;114:12;115[1,2]:25[4,3];customerTitle:1

Обращение к биллингу осуществляется с использованием логина и пароля пользователя BGCRM. Возможна установка отличного логина и пароля в конфигурации пользователя:

bgbilling:login=<login>
bgbilling:password=<pswd>

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

2.2. Единый договор

Единый договор - это привязанный к адресу номер-префикс, с которым создаются договора услуг на данном адресе. Договора услуг могут быть созданы в различных биллиингах. Номер договора услуги начинается с номера единого договора и заканчивается кодом услуги. Номер единого договора начинается с префикса области, далее следует порядковый номер.

Для включения функционала единого договора в конфигурации сервера необходимо добавить:

# код параметра контрагента с адресами услуг, параметр должен поддерживать множественное значение
bgbilling:commonContract.customerAddressParamId=<customerParamId>
# код параметра "Адрес" единого договора, параметр необходимо создать в редакторе параметров
bgbilling:commonContract.addressParamId=<commonContractParamId>
# соотношение областей городам
bgbilling:commonContract.cityAreaIds=<city_areas>
# формат номера единого договора, состоит из кода области и  порядкового номера в области
bgbilling:commonContract.titleFormat=(${area:00})(${number:000000})
# формат номера сервисного договора в биллинге, разрешено изменять только длину кода типа (:00)
bgbilling:commonContract.serviceContractTitleFormat=(${common})(${type:00})

Где:

<city_areas> - соотношение кодов городов из адресного справочника кодам областей, в каждом из кодов областей осуществляется последовательная нумерация единого договора.

Пример:

bgbilling:commonContract.customerAddressParamId=12
bgbilling:commonContract.addressParamId=93
bgbilling:commonContract.titleFormat=(${area:00})(${number:000000})
bgbilling:commonContract.serviceContractTitleFormat=(${common})(${type:00})
bgbilling:commonContract.cityAreaIds=37:51;1:72

Единые договора создаются в карточке контрагента.

2.3. Типы договоров

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

bgbilling:contractType.<n>.title=<title>
bgbilling:contractType.<n>.billing=<billing_id>
bgbilling:contractType.<n>.patternId=<pattern_id>
bgbilling:contractType.<n>.tariffList=<tariff_list>
# указывается только при использовании единых договоров
# необязательно - код области ЕД, договор данного типа можно создавать только для ЕД в данной области
bgbilling:contractType.<n>.commonContractAreaCode=<area_code>
bgbilling:contractType.<n>.serviceCode=<service_code>

Где:

<n> - уникальный порядковый номер типа в конфигурации;
<title> - наименование типа договора;
<billing_id> - строковый идентификатор биллинга;
<pattern_id> - код шаблона договора в биллинге;
<tariff_list> - перечень разделённых через точку с запятой записей вида <id>:<title>, где <id> -код тарифа в биллинге, <title> - обозначение тарифа;
<area_code> - код области ЕД;
<service_code> - код услуги договора, используется только в связке с единым договором, иначе параметр можно пропустить.

2.4. Импорт контрагентов из договоров

Общее описание алгоритма импорта:

  1. Из базы биллинга выбирается следующий договор с текстовым полем Код контрагента = 0 (код поля настраивается, само поле нужно создать в биллинге).

  2. Наименование контрагента извлекается из комментария договора биллинга.

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

  4. Если в шаге 2 контрагент не найден, то контрегент ищется по ключевым параметрам, после чего для найденных контрагентов определяется степень несовпадения наименования с наименованием контрагента договора. Если расстояние Левенштейна между двумя наименованиями не превышает указанного в конфигурации значения, то контрагент считается установленным. К наименованию контрагента в BGCRM добавляется новый вариант написания через символ пайпа (|). В дальнейшем правильный вариант написания предстоит установить оператору.

  5. Если контрагент не найден при прямом и обратном поиске - создаётся новый контрагент.

  6. К созданному контрагенту привязывается договор, в него импортируются параметры договора.

Для настройки импорта контрагентов из базы договов биллинга добавьте в конфигурацию правила импорта:

bgbilling:creator.confirmParameters=<confirm_params>
bgbilling:creator.searchParameters=<search_params>
bgbilling:creator.titleDistance=<title_dist>
bgbilling:creator.importParameters=<import_params>

Где:

<confirm_params> - подтверждающие параметры контрагента, коды через запятую;
<search_params> - ключевые параметры контрагента, коды через запятую;
<title_dist> - максимальное расстояние Левенштейна;
<import_params> - импортируемые из договора параметры контрагента.

Далее одно или несколько правил определения группы контрагента из номера договора:

bgbilling:creator.parameterGroupRule.<id>.paramGroupId=<param_group>
# необязательный параметр, если шаблона нет - то группа выставляется всем контрагентам
bgbilling:creator.parameterGroupRule.<id>.contractTitlePattern=<title_pattern>

Где:

<id> - уникальный числовой идентификатор правила, правила просматриваются в порядке их идентификаторов;
<param_group> - группа параметров контрагента;
<title_pattern> - REGEXP выражение, с которым сравнивается номер договора.

И для каждого из серверов биллинга записи:

#
bgbilling:creator.server.<id>.billingId=<billing_id>
bgbilling:creator.server.<id>.user=<user>
bgbilling:creator.server.<id>.pswd=<pswd>
bgbilling:creator.server.<id>.paramMapping=<mapping>
bgbilling:creator.server.<id>.pageSize=<page_size>
#

Где:

<id> - уникальный числовой идентификатор;
<billing_id> - строковый идентификатор биллинга;
<user>, <pswd> - логин и пароль пользователя биллинга, под которым осуществляется импорт;
<page_size> - количество договоров для импорта, выбираемых за один раз;
<mapping> - соотношение договоров контрагента и биллинга, разделённые точкой с запятой пары <код параметра контрагента>:<код параметра договора> для простых параметров и <код параметра контрагента>[<коды значений спискового параметра через запятую>]:<код параметра договора>[<коды значений спискового параметра через запятую>] - для спискового типа.

При импорте поддерживаются параметры договоров и, соответственно, контрагентов типа: "дата", "текст", "адрес", "телефон", "список". Параметры дата и текст перетирают значение параметра в договора, адрес, телефон и список - дополняют.

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

# загрузчик контрагентов
# дата рожд, адреса  услуг, сот. телефон(ы), паспорт с.-н.
bgbilling:creator.confirmParameters=73,12,14,74
# поиск по с.-н. паспорта, адресам услуг, сот. телефонам
bgbilling:creator.searchParameters=74,12,14
# расстояние по Левинштейну
bgbilling:creator.titleDistance=2
# кодовая фр., дата рожд., с.-н. пасп., д.в. пасп., кем выд. пасп, адрес проп., тел. гор, тел. сот, адрес(а) усл.
bgbilling:creator.importParameters=72,73,74,75,76,77,78,14,12
#
# группа параметров контрагента
bgbilling:creator.parameterGroupRule.1.paramGroupId=3
#
bgbilling:creator.server.1.billingId=ds
bgbilling:creator.server.1.user=bgcrm
bgbilling:creator.server.1.pswd=bgcrmv2
bgbilling:creator.server.1.paramMapping=72:456;73:386;74:457;75:458;76:459;77:460;78:401;14:399;12:42;46:378;115[1,2]:421[14575,14576]
bgbilling:creator.server.1.pageSize=10
#
bgbilling:creator.server.2.billingId=tks
bgbilling:creator.server.2.user=bgcrm
bgbilling:creator.server.2.pswd=bgcrmv2
bgbilling:creator.server.2.paramMapping=72:95;73:51;74:96;75:97;76:98;77:99;78:59;14:60;12:9,80,83
bgbilling:creator.server.2.pageSize=10

Импорт контрагента можно инициировать вручную в карточке договора, либо настроить в планировщике.

2.4.1. Настройка импорта в планировщике

Для настройки импорта контрагента по таймеру добавьте в конфигурацию планировщика класс ru.bgcrm.plugin.bgbilling.creator.CustomerCreator, например:

scheduler.task.1.class=ru.bgcrm.plugin.bgbilling.creator.CustomerCreator
scheduler.task.1.minutes=2,12,22,32,42,52

Мониторить выполнение задачи можно по логам.

2.5. Конфигурация типа процесса

В конфигурацию типа процесса возможна установка следующих параметров.

Для автоматического добавления групп решения процесса по названию либо биллингу привязанного договора одна или несколько правил вида:

bgbilling:processLinkedContract.<n>.groupIds=<groupIds>
bgbilling:processLinkedContract.<n>.titleRegexp=<titleRegexp>
bgbilling:processLinkedContract.<n>.billingIds=<billingIds>   

Где:

<n> - порядковый номер правила;
<titleRegexp> - REGEXP номера договора;
<billingIds> - строковые идентификаторы биллингов через запятую, к которым может относится договор

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

2.5.1. Создание процесса с привязанными объектами

Переменная в конфигурации типа процесса:

create.in.objectTypes=<типы объектов через запятую>

Типы объектов плагина:

contract:<billingId> - договор в биллинге с идентификатором <billingId>.

2.6. Интеграция с плагином Document

Для вкладки документов карточки единого договора в конфигурации типов документов указывать scope=bgbilling-commonContract, для документов карточки договора scope=bgbilling-contract.

2.6.1. Расширения пространства имён "http://bgcrm.ru/saxon-extension"

bgbilling-contractCard( <billingId>, <loginAndPswd>, <contractId> ) - получение из биллинга со строковым идентификатором <billingId> XML документа карточки договора с кодом <contractId>, запрос осуществляется под пользователем и паролем <loginAndPswd> - две строки разделены двоеточием;

bgbilling-commonContract( <commonContractId> ) - получение XML документа с параметрами единого договора с кодом <commonContractId>.

Пример сводный:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:bgcrm="http://bgcrm.ru/saxon-extension"
 xmlns:bgcrm-math="http://bgcrm.ru/saxon-extension-math"
 xmlns:t="http://bgcrm.ru/template" 
 exclude-result-prefixes="bgcrm bgcrm-math t"
 version="2.0">
...
<xsl:template match="/event">
 <data>
   <xsl:variable name="commonContract" select="bgcrm:bgbilling-commonContract(@objectId)" />
...
<xsl:variable name="ktvContractId" select="$customer/data/links/customer_link[@object_title=$ktvContractNumber]/@object_id" />
<xsl:variable name="contractCard" select="bgcrm:bgbilling-contractCard( 'tks', 'bgcrm:XXXXXX', $ktvContractId )" />
...

3. Оснастка "Поиск"

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

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

4. Карточка "Контрагент"

4.1. Вкладка "Единые договоры"

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

Единый договор можно удалить а также перейти на его карточку нажав по номеру-ссылке. Единый договор связан с договором услуги посредством номера.

4.2. Вкладка "Договоры"

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

Также возможно копирование параметров в договоры, переход на карточку договора нажатием на ссылку-номер.

5. Карточка "Процесс"

В карточке процесса возможно отображение привязанных к процессу проблем из CRM плагина BGBilling. Данный функционал полезен в переходный этап миграции на BGCRM, когда часть служб работает в плагине CRM биллинга.

Для включения данного функционала в конфигурации типа процесса должно быть указано:

bgbilling:processShowLinkedProblems=1
# описание создаваемых проблем подставлять описание процесса, опционально
#bgbilling:processLinkProblemSetProcessDescription=1
# требование по статусам привязанных проблем - запрет перехода процесса в определённый статус, пока привязанные проблемы не будут в нужных статусах
#bgbilling:processToStatus.<processStatusCode>.needLinkedProblemsStatus=<billingId>:<statusCode>;<billingId1>:<statusCode1>..

Где:

<processStatusCode> - статус, в который переходит процесс;
<billingId> - идентификатор биллинга;
<statusCode> - код статуса проблемы, который должен стоять при переходе процесса.

Для отображения в карточке процесса привязанных к процессу единых договоров установить в конфигурации типа процесса:

bgbilling:processShowCommonContract=1

6. Карточка "Единый договор"

Карточки единых договоров открываются в буфере Единые договоры.

По ссылке Редактировать доступно изменение номера единого договора, его периода и пароля.

7. Карточка "Договор"

Карточка договора открывается в буферы Договоры и отображает основные параметры договора в биллинге.

Кнопка изменения контрагента (*) позволяет убрать привязку контрагента к договору либо привязать договор к одному из открытых в буфере Контрагенты контрагентов. Кнопка Импорт вызывает импорт параметров из договора в выбранного контрагента, либо создаёт контрагента в соответствии с правилами импорта контрагентов и привязывает его к договору.

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

7.1. Создание договоров в биллинге

Для создания договора в биллинге в буфере Договоры нажмите кнопку Создать.

Для создания договора выбрать биллинг, шаблон. В конфигурации сервера биллинга для шаблонов договоров может быть указан шаблон нумерации. Выбираемые контрагенты должны быть открытыми в буферы Контрагенты.

Глава 3. Плагин Document

1. О плагине

Плагин предназначен для генерации и учёта печатных форм документов.

2. Конфигурация

Для добавления генератора документа в конфигурации указывается запись вида:

document:pattern.<id>.title=<title>
document:pattern.<id>.scope=<scope>
document:pattern.<id>.script=ru.bgcrm.plugin.document.docgen.CommonDocumentGenerator
document:pattern.<id>.type=<type>
document:pattern.<id>.documentTitle=<doc_title>
document:pattern.<id>.file=<file>
document:pattern.<id>.xslt=<xslt>
#
# необязательные параметры общие
document:pattern.<id>.titleRegexp=<title_pattern>
#
# необязательный параметры для type=pdfForm
document:pattern.<id>.flattening=<flattening>

Где:

<id> - уникальный числовой идентификатор типа документа;
<scope> - тип сущности, для которой генерируется документ;
<type> - тип генерируемого документа, в данный момент поддерживается только pdfForm - PDF форма;
<doc_title> - имя сгенерированного документа;
<file> - имя файла со шаблоном документа (PDF форма либо иной исходный документ для подстановки параметров) рекомендуется располагать в каталоге BGCRM/docpattern;
<xslt> - XSLT 2.0 шаблон, генерирующий XML документ со значениями полей;
<title_pattern> - REGEXP шаблон имени сущности, для которой будет предлагаться к генерации данный тип документа;
<flattening> - 1, если сгенерированный PDF документ следует сделать нередактируемым.

Замечание

PDF формы можно подготовить с помощью Adobe Acrobat или аналогичной программы.

Например:

document:pattern.3.title=Уфа заказ
document:pattern.3.scope=bgbilling-commonContract
document:pattern.3.script=ru.bgcrm.plugin.document.docgen.CommonDocumentGenerator
document:pattern.3.titleRegexp=^72\d{6}
document:pattern.3.file=docpattern/ufa_zakaz.pdf
document:pattern.3.xslt=docpattern/ufa_zakaz.xsl
document:pattern.3.type=pdfForm
document:pattern.3.documentTitle=Уфа заказ.pdf

Принцип генерации основан на подстановке в именованные поля документа (для PDF формы это имена редактируемых полей) определённых значений. Значения полей получаются из XML документа - результата XSLT трансформации.

На вход XSLT генератора подаётся XML документ следующего содержания:

<event objectId="<objectId>" objectType="<objectType>">
<request>
<param name="<paramName1>" value="<value1>"/>
<param name="<paramName2>" value="<value2>"/>
....
<param name="<paramNameX>" value="<valueX>"/>
</request>
</event>

Где:

<objectId> - код объекта для которого генерируется документ;
<objectType> - тип объекта;
<paramNameX> и <valueX> - параметры HTTP запроса, переданные на генерацию документа, благодаря этим данным возможен параметризированный вызов генерации документа из внешних систем.

Для просмотра хода генерации включите вывод в лог отладочной информации. Работу можно начать с подобного шаблона, который просто выводит в результирующий документ (а следовательно и в лог) исходный XML.

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:bgcrm="http://bgcrm.ru/saxon-extension"
 xmlns:bgcrm-math="http://bgcrm.ru/saxon-extension-math"
 xmlns:t="http://bgcrm.ru/template" 
 exclude-result-prefixes="bgcrm bgcrm-math t"
 version="2.0">

 <xsl:template match="/event">
  <data>
     <!-- отладочный исходной XML -->
    <xsl:copy-of select="/event"/>
  </data>
 </xsl:template>
</xsl:transform>

Получение дополнительной информации осуществляется с помощью функций-расширений. Результат вызова функции-расширения можно вывести в отладку с помощью инструкции <xsl:copy-of>.

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

08-07/19:03:49 DEBUG [http-bio-9089-exec-6] CommonDocumentGenerator - Transformation debug: <?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xs="http://www.w3.org/2001/XMLSchema">
<field name="contract_number">72000784</field>
<field name="contract_day">11</field>
<field name="contract_month">апреля</field>
...

В составе ядра представлены перечисленные далее пространства имён и функции в них. Список может дополняться в плагинах. Примеры XSLT шаблонов для генерации документов доступны в WiKi.

2.1. Расширения пространства имён "http://bgcrm.ru/saxon-extension-math"

isbitset( <value>, <bitNumber> ) - возвращает результат проверки установленности в значении <value> бита <bitNumber>, нумерация с 0 от конца двоичного представления числа.

Пример:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:bgcrm-math="http://bgcrm.ru/saxon-extension-math"
 exclude-result-prefixes="bgcrm-math"
 version="2.0">

...
<xsl:when test="bgcrm-math:isbitset( $contractCard/data/contract/@gr, 43 )">
   <field name="contract_ctv_erkc">On</field>
</xsl:when>
...

2.2. Расширения пространства имён "http://bgcrm.ru/saxon-extension"

customer( <id> ) - получение XML документа с данными контрагента с кодом <id>.

Пример:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:bgcrm="http://bgcrm.ru/saxon-extension"
 exclude-result-prefixes="bgcrm"
 version="2.0">
...
<xsl:variable name="customer" select="bgcrm:customer($customerId)" />
...
<field name="fio_full">
  <xsl:value-of select="$customer/data/customer/@title" />
</field>
...

3. Интерфейс пользователя

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

Здесь же возможно удаление документа, его открытие.

Глава 4. Плагин Report

1. О плагине

Плагин предназначен для разработки отчётов.

2. Конфигурация

Каждый отчёт состоит из файла - описания, размещаемого в каталоге BGCRM/report и JSP страницы с логигой и оформлением отчёта. Вы можете посмотреть примеры отчётов на WiKi.

Файл-описание содержит в себе информацию о названии отчёта, его идентификатор и имя JSP файла с реализацией. При разработке своих отчётов необходимо именовать идентификаторы отчёта с префикса custom_, так же как и файл-описание отчёта. JSP файл отчёта располагать в каталоге WEB-INF/jspf/user/plugin/report/custom.

Пример содержимого файла-описания отчёта report/custom_ncc_smena.xml:

<?xml version="1.0" encoding="UTF-8"?>
<report id="custom_ncc_smena" title="Отчёт ЦУС по сменам" jspFile="/WEB-INF/jspf/user/plugin/report/custom/ncc_smena.jsp"/>

3. Оснастка "Отчёты"

В оснастке отображаются все сконфигурированные в системе отчёты. При выборе кнопки отчёта вызывается связанный с отчётом JSP файл.