Содержание
MySQL сервер и клиент версии 5.1 и старше, хранилище InnoDB.
Oracle JDK версии 1.7.X, последнее обновление.
Загрузите архив
.Извлеките каталог BGCRM из него его в требуемый каталог установки. (например /opt).
Извлеките файл
в каталог /tmp.Выполните создание БД:
mysql --default-character-set=utf8 -uroot < /tmp/bgcrm.sql
При доступе к БД с другим логином - паролем, либо если база расположена на другой машине - скорректируйте команду.
Перейдите в каталог BGCRM и сделайте файлы исполняемыми:
chmod 744 *.sh
При необходимости поправьте в
логин и пароль подключения к БД, сервер БД и имя. Также там можно изменить HTTP порт и порт управления.Установите в
путь к 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
Для запуска/останова сервера используйте
. - просмотр статуса запущенного сервера.После запуска проверьте
и в на наличие ошибок (Exception).По умолчанию CRM доступна по адресу:
При создании БД в системе присутствует единственный пользователь
, пароль - .Плагины дополняют функционал ядра, позволяя максимально гибко сконфигурировать систему под нужды конкретной организации-пользователя.
В данный момент доступны плагины: Document (генерация документов), BGBilling (интеграция с системой BGBilling), Report (разработка отчётов). Все плагины в данный момент включены в общую сборку. Для отключения функций плагина необходимо удалить XML файл описания из каталога
., он же - способ доступа к CRM системе, определяющий набор разрешённого функционала. Выбор интерфейса производится при входе в CRM систему:
В системе доступны интерфейсы:
- для настройки параметров системы, префикс . |
- для непосредственной работы, префикс . |
- усечённый интерфейс пользователя для мобильных устройств, префикс . |
Для перехода в другой интерфейс можно поправить URL в адресной строке браузера либо использовать ссылку в правом нижнем углу экрана.
Интерфейс пользователя:
Пользовательский интерфейс разделён на вкладку
и вкладки-буферы , . Вкладки-буферы позволяют держать открытыми множество сущностей одного типа. Вкладка предназначена для запуска различных редакторов, кнопки доступа к которым расположены над вкладками.Плагины могут добавлять собственные буферные вкладки и оснастки, они описаны в документациях плагинов. Оснастки ядра описаны далее в данном разделе.
Оснастка позволяет осуществлять поиск всех сущностей в системе. В данный момент реализован поиск контрагента. Для поиска необходимо нажать Enter в поле с параметром поиска, либо в поле Квартира для адресного параметра (можно оставить пустым). При поиске по адресу доступен контекстный поиск улиц и домов.
Ядро предоставляет поиск контрагентов по адресу, наименованию, коду. Для поиска по наименованию необходимо набрать подстроку наименования и нажать Enter. Для поиска по коду - ввести точный код контрагента и нажать Enter. При поиске контрагента по наименованию возможен дополнительный вывод описывающих его параметров, что задаётся в конфигурации.
При поиске по адресу осуществляется поиск по всем адресным параметрам контрагентов. В результатах поиска отображается наименование контрагента, наименование параметра и значение. Возможен поиск как только по улице: выбрать улицу в контекстном поиске и нажать Enter; так и по Улице + Дому или Улице + Дому + Квартире - Enter нажимается в последнем заполненном поле.
Просмотр и редактирование адресных справочников.
Для того, чтобы разрешить пользователю править справочники в конфигурации пользователя должно быть установлено:
directory.address.update=country:*;city:*;street:*;quarter:*;area:*;house:*
, вместо * можно устанавливать определённые коды стран, городов, улиц через запятую.
В ближайшем будущем данные ограничения будут перемещены в стандартную систему разграничения доступа.
Как настроить выгрузку справочника адресов в BGBilling и первичную выгрузку из него описано в WiKi.
В данной оснастке отображаются разрешённые для пользователя очереди процессов, сконфигурированные в интерфейсе администратора.
Обработка сообщений.
Очень большое количество редко меняющихся настроек поведения системы вынесено в конфигурации. Конфигурация - это текстовый блок, состоящих из записей вида:
. На одной строке может быть только одна такая запись, символ # в начале строки означает комментарий.Конфигурации вводятся либо в текстовых
- файлах (опции подключения к БД, базовые настройки), либо в редакторах конфигурации, сохраняясь в базе данных.В значениях параметров конфигурации возможна подстановка ранее указанных значений с помощью подстановок
. Рассмотрим пример подстановки.# определение значения howYou=how you # использование подстановки some.kind.of.config.record=Thats {@howYou} should use macro!
Т.е. при такой конфигурации при взятии значения
получаем в результате строку "Thats how you should use macro!". Подставляемое значение должно быть обязательно определено ранее подстановки.После разбора конфигурация используется системой как набор пар ключ - значение, в котором порядок не определён. При необходимости указания порядка в ключе вводятся дополнительные числовые индексы.
Например:
object.1.id=1 object.1.title=Title1 object.2.id=2 object.2.title=Title2
При большом количестве подобных записей ведение индекса может быть затруднительным, особенно при необходимости изменения номеров записей. В этом случе индекс можно вынести в отдельную переменную, увеличивая его с помощью макроса
. Далее приведена идентичная конфигурация, индексы в которой выведены в переменную.index=1 object.{@index}.id=1 object.{@index}.title=Title1 object.{@inc:index}.id=2 object.{@index}.title=Title2
Помимо присвоения параметр конфигурации можно приклеивать к уже существующему под таким ключём значению. Для этого используется оператор
. Например:key=1 key+=,2 key+=,3
В этом случе под ключом
будет храниться строка "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
Также оно полезно при объединении нескольких конфигураций, позволяя создать общую объединённую переменную.
Основная конфигурация BGCRM определяет большинство параметров функционирования ядра и плагинов.
В основную конфигурацию попадают параметры, определённые в файле
, далее загружается конфигурация указанная в интерфейсе администратора.Одномоментно может быть активна только одна конфигурация выделенная признаком
. Для создания конфигурации - кнопка . Изменении конфигурации применяется "на лету", перезапуск системы не требуется.В конфигурации указываются параметры ядра и подключённых плагинов. Для ядра доступны следующие параметры:
# формат адресного параметра, доступны переменные: 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
Записи параметров плагинов начинаются с префикса
, например . Возможно включение в одну конфигурации другой, для этого во включающей конфигурации размещается инструкция , где - код включаемой на данной позиции конфигурации.Редактирование учётных записей пользователей системы и их прав доступа осуществляется на вкладке
интерфейса администратора.Наборы прав определяют разрешаемые пользователю интерфейсы и действия в них. Интерфейсы определяются через роли.
Роли указываются через пробел, допустимые значения:
, , . Роли всех установленных пользователю наборов прав объединяются. В дереве действий указываются разрешённые набору действия.Подробно о логике работы системы ограничений см. далее, в описании редактора пользователей.
Проверка прав доступа включается переменной конфигурации.
Группы пользователей обозначают подразделения в организации и выступают группами решения для подсистемы процессов.
В группе могут быть указаны очереди процессов, наборы прав, конфигурация.
Подробно о логике работы системы ограничений см. далее, в описании редактора пользователей.
Группы выстроены в иерархию, что позволяет учитывать службы, отделы и другие структурные единицы организации.
В свойствах пользователя указывается одна или несколько групп с указанием периода, наборы прав, имя пользователя, его логин и пароль. Пользователи выступают исполнителями для подсистемы процессов.
Параметры пользователя определяются в редакторе параметров.
Группы пользователя определяют вхождение пользователя в подразделения либо как классифицирующий признак.
Результирующие права пользователя, параметры его конфигурации и разрешённые очереди процессов определяются описанным ниже образом. Сложение списка обозначает добавление в конец списка новых элементов.
Действующий список групп (ДСГ) - упорядоченный список = список групп в алфавитном порядке (как отображаются в списке групп), из них оставлены только действующие в настоящий момент у пользователя.
Действующий список наборов прав (ДСНП) - упорядоченный список = списки всех наборов прав групп ДСГ + список наборов прав пользователя.
Действующая конфигурация (ДК) - строка = конфигурации всех наборов прав из ДСНП + конфигурации всех групп из ДСГ (конфигурация каждой группы составлена из конфигурации всех его предков + конфигурация группы) + конфигурация пользователя. Переменная более поздно добавленная в конфигурацию переопределит более раннюю.
Очереди процессов = список очередей процессов, из которых оставлены очереди указанные в пользователе либо в одной из групп ДСГ.
Разрешения = разрешения из наборов прав ДСНП + разрешения из пользователя.
Роли - набор = роли всех наборов прав ДСНП + роли из пользователя.
В действующую конфигурацию пользователя дополнительно добавляются переменные:
ctxUserId=<код пользователя в БД> ctxUserGroupIds=<коды групп пользователя через запятую> ctxUserPermsetIds=<коды наборов прав пользователя через запятую>
Схема довольно сложна, однако позволяет очень гибко настраивать права пользователей.
Редактор разрешённых действий в наборе прав и пользователе представляет из себя
следующего вида:Установка галочки на узле дерева резрешает действия. У некоторых действий есть дополнительная конфигурация (в квадратных скобках на снимке экрана ранее), задающая дополнительные ограничения. В данную конфигурацию допускается подставлять переменные из действующей конфигурации пользователя. Подстановка осуществляется макросом
, где - параметр из конфигурации. Например: . Так, на приведённым выше снимке пользователю разрешают просматривать список пользователя только входящих в те же группы, что и он сам. Используется подставновка системной переменной из действующей конфигурации пользователя.В зависимости от разрешённых действий и их конфигураций в интерфейсе, отображаемом пользователю, могут скрываться либо отображаться различные элементы.
Для отключения проверки прав в действующей конфигурации пользователя должна присутствовать опция:
.Для большинства сущностей в системе возможно определение настраиваемых параметров. Редактирование перечня параметров осуществляется на вкладке
интерфейса администратора. Выбор сущности, для которой определяются параметры, производится в выпадающем списке. Список сущностей может расширяться при установке плагинов.Редактор параметра выглядит следующим образом. Для всех типов кроме спискового (отличия будут рассмотрены далее) его вид идентичен.
Таблица параметров сущности выглядит подобным образом. Порядок записи в таблице определяется числовым полем
параметра.Свойство динамический класс, обрабатывающий события изменения параметра.
параметра позволяет установитьКлючи конфигурации параметра различаются для типов параметров, общие для всех типов необязательные значения:
# коды параметров сущности, которые должны быть заполнены перед установкой данного параметра requireBeforeFillParamIds=<codes> # коды параметров сущности, которые должны быть пустыми перед установкой данного параметра requireBeforeEmptyParamIds=<codes> # теги параметра через запятую - тегированный параметр можно просматривать или править # только явно разрешив тег в настройке прав на изменение параметра либо просмотр параметров tags=<tags> # редактор параметра недоступен (параметр загружается посредством API к БД либо HTTP API) readonly=1
Где:
- коды параметров через запятую; |
- теги через запятую. |
Группа параметров необходима для ограничения списка параметров контрагента определённого объекта. Например: "Физическое лицо", "Юридическое лицо".
Шаблон названия позволяет устанавливать зависимость названия объектов от его параметров. Подстановка параметров осуществляется макросами вида
, где - уникальный код параметра. Так, например, возможна генерация названия контрагента юридического лица из параметров спискового "Форма собственности" и текстового "Наименование организации", что предотвращает дублирование информации. При изменении параметров в дальнейшем наименование объекта будет правиться автоматически.Однострочная строка до 250 символов.
В конфигурации параметра могут быть указаны следующие необязательные параметры:
saveOn=<saveOn>
Где:
- режим сохранения, может быть "focusLost" (потеря фокуса полем) либо "enter" (нажатие клавиши "Enter"), по-умолчанию режим "enter". |
В конфигурации параметра могут быть указаны одна или несколько конструкций вида:
regexp.<n>.title=<title> regexp.<n>.regexp=<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.
В таблице параметр выглядит следующим образом.
Большая многострочная строка до 65000 символов.
В конфигурации параметра могут быть указаны следующие необязательные параметры:
rows=<rows> saveOn=<saveOn>
Где:
- количество отображаемых в редакторе строк, по-умолчанию 4; |
- режим сохранения, может быть "focusLost" (потеря фокуса полем) либо "enter" (нажатие кнопки под полем), по-умолчанию режим "enter". |
В таблице параметр выглядит следующим образом.
Параметр с выбираемыми из набора значениями. Значения могут быть определены как конфигурации параметра так и во внешнем справочнике, на который ссылается параметр. Для некоторых значений можно добавить возможность или установить обязательное требование указания комментария.
В конфигурации параметра могут быть указаны следующие необязательные параметры:
# мультивыбор multiple=1 # сохранение сразу после выбора значения, без нажатия кнопки Ок (только для параметра с одним выбором) saveOn=select # allowCommentValues=<allowCommentValues> needCommentValues=<needCommentValues> # directory=<dirName> availableValues=<values> availableValuesInnerJoinFilter=<joinTable>;<joinColumn>;<joinFilter>
Где:
- справочник, из которого берутся значения, может быть "address_city" для городов, если справочника нет - значения указываются в самом параметре; |
- допустимые коды значений через запятую; |
- перечень значений для которых допустимо указание комментария, возможно указание диапазонов, например: 1-3,7,9-14 |
- перечень значений для которых обязателен комментарий, указывается аналогично ; |
- имя таблицы, с которой осуществляется фильтрующая операция SQL INNER JOIN справочной таблицы; |
- колонка таблицы, по которой проводится JOIN столбца id справочной таблицы; |
- дополнительное условие INNER JOIN. |
Пример конфигурации параметра, в котором доступны контрагенты, входящие в группу с кодом 3.
multiple=1 directory=customer availableValuesInnerJoinFilter=customer_group;customer_id;group_id IN (3)
Пример параметра с одним значением. Конфигурация - как выглядит в таблице и редактирование.
Пример параметра с несколькими значениями (мультивыбор). Конфигурация - как выглядит в таблице и редактирование.
Дата: год - месяц - день.
В конфигурации параметра могут быть указаны следующие необязательные параметры:
# возможность смены месяца changeMonth=true # возможность смены года changeYear=true yearRange=<yearRange> # возможность редактирования поля с клавиатуры editable=1 saveOn=<saveOn> # при редактировании поля отправка классу-обработчику изменений параметра события ru.bgcrm.event.DateChangingEvent, позволяющего раскрашивать даты различными цветами и сопровождать примечаниями #sendColorMapRequest=1
Где:
- диапазон отображаемых лет в выпадающем списке годов, могут быть значения от текущего года (-10:+30) либо значения от текущей выбранной даты (c:-10:c+30), по-умолчанию с-10:с+10; |
- режим сохранения, может быть "focusLost" (потеря фокуса полем) либо "enter" (нажатие клавиши "Enter"), по-умолчанию режим "enter"; актуально только при =1. |
В таблице параметр и его редактор выглядят следующим образом.
Дата + время различной точности.
В конфигурации параметра могут быть указаны следующие необязательные параметры:
type=<type> stepHour=<stepHour> stepMinute=<stepMinute> # # при редактировании поля отправка классу-обработчику изменений параметра события ru.bgcrm.event.DateChangingEvent, позволяющего раскрашивать даты различными цветами и сопровождать примечаниями #sendColorMapRequest=1
Где:
- может принимать значения ymdh, ymdhm, ymdhms в зависимости от требуемой точности поля; |
- шаг в выборе часов; |
- шаг в выборе минут. |
Пример параметра. Конфигурация, как выглядит в таблице и редактирование.
Адресный, ссылающийся на дом в справочнике адресов.
В конфигурации параметра могут быть указаны следующие необязательные параметры:
# несколько адресов в параметре multiple=1
Как выглядит в таблице и редактирование.
Доступен контекстный поиск по подстроке улицы и дому. Несмотря на приведённый пример использовать подобный параметр для адреса прописки не следует, т.к. он требует наличия в справочнике домов записей обо всех домах, используемых в значениях параметров.
Формат строки отображаемой в таблице задаётся в конфигурации.
Один или несколько телефонов с комментариями.
В конфигурации параметра ничего не указывается.
Как выглядит в таблице и редактирование.
Формат строки отображаемой в таблице задаётся в конфигурации.
Один или несколько EMail адресов либо только адресов доменов с комментариями.
В конфигурации параметра могут быть указаны следующие необязательные параметры:
# несколько EMail в параметре multiple=1
Как выглядит в таблице и редактирование.
Вы можете пропустить этот раздел при первом знакомстве с системой.
Подсистема планировщика позволяет выполнять периодический запуск определённых задач. Для запуска задачи в конфигурацию сервера добавляются записи вида:
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>
Где:
- уникальный числовой идентификатор задачи; |
> - имя класса запускаемой задачи; |
- часы в которые запускается задача, через запятую от 0 до 23; |
- дни недели в которые запускается задача, через запятую от 1 до 7, 1 - понедельник. |
Планировщик ежеменутно проверяет задачи и выполняет те из них, чьи ограничения по времени отвечают указанным в конфигурации условиям.
В планировщике может быть запущен любой объект Java-класса, реализующий интерфейс java.lang.Runnable. Класс может быть статическим либо динамическим. Для разового запуска вы можете использовать запуск класса.
Контрагент - физическое лицо либо организация, с которым взаимодействует пользователь BGCRM.
Карточки открытых контрагентов отображаются в буфере поиска.
. Для создания нового контрагента перейдите в буфер и нажмите . Также кнопка создания доступна в оснасткеПосле создания открывается редактор свойств контрагента, в котором можно установить его наименование, группу параметров, шаблон наименования.
На вкладке Параметры редактируются параметры контрагента. На вкладке отображаются привязанные к контрагенту процессы и возможно создание привязанного процесса (список типов процессов можно ограничить в конфигурации действия).
Процесс - сущность, позволяющая учитывать различные протекающие в организации процессы. Процесс обладает обязательными параметрами:
тип;
текущий статус и время его установки;
время начала;
время завершения;
исполнители и группы решения;
описание;
приоритет.
Остальные параметры назначаются с помощью системы параметров для разных типов процессов.
Каждый процесс обслуживается одним или несколькими подразделениями (группами). При этом группа выступает в процессе в той или иной роли. По-умолчанию в системе определена одна роль с кодом 0 - "Выполнение" процесса. Список ролей может быть дополнен в конфигурации. Примерами ролей могут быть: "Инициация", "Продажа", "Согласование" и т.п. У каждой роли должен быть свой уникальный код.
Статус определяет текущее состояние процесса. Позиция статуса определяет порядок его в списке статусов.
Типы процессов представляют из себя дерево.
При редактирование типа может быть указано его название и признак наследования либо не наследования свойств от родительского типа.
В свойствах типа указываются следующие параметры:
разрешённые статусы, их порядок в редакторе и возможные переходы между ними;
допустимые параметры процесса, их порядок;
код (ID) начального и конечных статусов;
динамический класс, обрабатывающий события изменения процесса (не обязательно);
начальные группы решения, устанавливаемые в процесс с указанием их ролей (не обязательно) ;
допустимые для установки в процесс группы решения с указанием их ролей;
конфигурация (не обязательно).
Далее описываются параметры конфигурации типа процесса, поддержанные ядром. Параметры, поддерживаемые различными плагинами, описываются в разделах документации соответствующих плагинов.
В конфигурации типа процесса может быть указано:
# код параметра - категории, который должен быть указан перед переводом процесса в конечный статус 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
Где:
- код параметра процесса, который должен быть указан при его закрытии, при этом редактор открывается под переключением статуса процесса; |
- код статуса, в который переводится процесс; |
- коды параметров процесса через запятую; |
- коды статусов через запятую; |
- код текущего статуса процеса. |
Одно или несколько правил вида:
executorRestriction.<n>.groupId=<groupId> executorRestriction.<n>.maxCount=<maxCount>
Где:
- порядковый числовой номер правила; |
- код группы пользователей; |
- максимальное число исполнителей из данной группы на процессе. |
Просматриваются все правила в порядке их номеров.
Процесс может ссылаться на другой процесс следующими способами:
- простая ссылка одного процесса на другой; |
- указание, что ссылаемый процесс создан из данного процесса; |
- процесс не может быть закрыт пока не закрыты все процессы на которые он ссылается данным способом. |
Параметры в конфигурации типа процесса:
- отображение в карточке процесса вкладки со связями процесса с другими процессами; |
- привязка к процессу произвольных открытых процессов (цифра 3 на снимке далее). |
Рассмотрим отображаемые на снимке экрана области В таблице
отображаются процессы, которые ссылаются на текущий процесс. В таблице - те процессы, на которые ссылается текущий процесс.Кнопки удаления связей должны быть включены специальной опцией в конфигурации действия "Удаление привязки".
Выпадающий список
- позволяет выбрать метод отношейний для привязки к текущему другого процесса, открытого на вкладке.Выпадающий список
- позволяет создать процесс и привязать к данному процессу. Содержимое списка определяется записями в конфигурации типа процесса вида:processCreateLink.<n>.title=<title> processCreateLink.<n>.processTypeId=<typeId> processCreateLink.<n>.linkType=<linkType> # необязательные параметры #processCreateLink.<n>.checkExpression=<expression> #processCreateLink.<n>.copyParams=<copyRules> # копирование привязок #processCreateLink.<n>.copyLinks=1
Где:
- порядковый номер записи; |
- наименование для списка; |
- тип связи: "processLink" - ссылается, "processMade" - порождён, "processDepend" - зависит; |
- код типа создаваемого процесса; |
JEXL выражение, позволяющее показывать пункт списка в зависимости от условий; | -
- через запятую коды копирующихся с текущего на создаваемый параметров, либо пары <from>:<to> - кодов однотипных параметров с какого на какой необходимо копировать. |
В JEXL процессор передаются объекты:
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
Разрешает создание процесса во вкладке
объекта.Переменная в конфигурации типа процесса:
create.in.objectTypes=<типы объектов через запятую> create.in.copyParams=перечень пар <с параметра>:<на параметр>, разделённых точкой с запятой # открывать (1) либо не открывать (0) вкладку с созданным привязанным процессом create.in.<тип объекта>.openCreated=1
Копирование параметров поддерживается только для объектов, использующих стандартную систему параметров системы.
Типы объектов ядра:
- контрагент. |
Типы объектов плагинов описаны в документации плагинов.
Пример. Возможность создания процесса с привязкой контрагента, копированием параметра с кодами 1 и 5 в контрагента в параметры процесса с кодами 3 и 6 соответственно:
create.in.objectTypes=customer create.in.copyParams=1:3;5:6
Макрос описаний процесса позволяет сгенерировать текст для заголовка вкладки процесса или для перечня процессов.
Для генерации описаний в конфигурацию типа процесса добавляются записи вида:
processReference.<n>.objectTypes=<objectTypes> processReference.<n>.stringExpression=<macros>
Где:
- порядковый номер записи; |
- области, где используется данный макрос через запятую, перечень областей см. далее; |
JEXL выражение, передаваемые объекты см. далее. | -
Перечень областей:
- вкладка контрагента; |
- заголовок вкладки процесса; |
- список процессов к которым привязан данный процесс; |
- список процессов, привязанных к данному. |
В JEXL процессор передаются объекты:
ru.bgcrm.model.process.Process - процесс; | - объект класса
ru.bgcrm.dao.expression.ParamValueFunction - параметры процесса. | - объект класса
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' ) ) ) + " "
Как выглядит в интерфейсе.
Может использоваться в типовых случаях, без необходимости написания динамического кода. Позволяет гибко ограничивать в конфигурации правила правки процессов и автоматически выполняемые с ними операции.
Одно или несколько правил вида:
onProcessEvent.<n>.commands=<commands> onProcessEvent.<n>.events=<events> onProcessEvent.<n>.eventsExclude=<eventsExclude> # необязательные параметры onProcessEvent.<n>.ifExpression=<ifExpression> onProcessEvent.<n>.checkExpression=<expression> onProcessEvent.<n>.checkErrorMessage=<message>
Где:
- подядковый числовой номер правила; |
- обрабатываемые правилом события через точку с запятой, если параметр не указывается - то обрабатываются все события связанные с данным типом процесса; |
- исключаемые из обработки правилом события через точку с запятой, если параметр не указывается - то никакие событие не исключаются; |
JEXL выражение проверки условия при котором отрабатывают команды макроса; | -
JEXL выражение проверки условия при невыполнении которого генерируется ошибка , используется только с ; | -
- текст ошибки, сообщаемой при невыполнении условия ; |
- команды макроса обработки. |
В
поддержаны следующие события:- статус изменяется на одно на одно из значений, коды которых указаны через запятую в ; |
- статус изменился на одно из значений, коды которых указаны через запятую в ; |
- процесс закрыт; |
- процесс создан; |
- процесс создан как привязанный к другому процессу; |
- в описание процесса добавляется текст; |
- в описание процесса добавлен текст; |
- описание процесса изменяется целиком; |
- описание процесса изменилось целиком; |
- к процессу добавляется привязка; |
- к процессу добавлена привязка; |
- удаляется привязка процесса; |
- удалена привязка процесса; |
- в процесс поступило новое сообщение; |
- изменяется параметр процесса, код которого указан через запятую в ; |
- изменился параметр процесса, код которого указан через запятую в . |
В JEXL процессор передаются следующие объекты для вызова функций:
ru.bgcrm.model.user.User - текущий пользователь; | - объект класса
ru.bgcrm.dao.expression.ParamValueFunction - параметры текущего пользователя; | - объект класса
ru.bgcrm.model.process.Process - изменяющийся процесс; | - объект класс
ru.bgcrm.dao.expression.ParamValueFunction - параметры изменяющегося процесса. | - объект класса
Правила просматриваются в порядке их номеров. Первое правило выдавшее сообщение прерывает просмотр и отменяет изменение связанное с процессом.
В
указывается макрос обработки процесса, состоящий из команд, разделённых точкой с запятой. Все команды макроса выполняются последовательно и в рамках текущей транзакции. Ошибка в любой из команд прерывает текущую транзакцию, откатывая внесённые в БД изменения.Команды поддержанные макросе:
- добавить в процесс разрешённые для типа процесса группы решения с ролью 0 "Выполнение", коды которых указанны через запятую в ; |
- очистить список групп процесса; |
- добавить в процесс исполнителей, коды которых указаны через запятую в ; группа для привязки определяется путём пересечения множества текущих групп исполнителя с множеством групп, соотнесённых процессу; |
- добавить исполнителей, коды которых указаны через запятую в ; исполнители привязываются к одной группе процесса, код которой попадает в перечень указанный в через запятую; |
- установить в процесс исполнителей, коды которых указаны через запятую в ; исполнители привязываются к одной группе процесса, код которой попадает в перечень указанный в через запятую, существующие исполнители заменяются; |
- аналогично предыдущему, но исполнители устанавливаются, только если к группе-роли из перечня не приязан исполнитель; |
- очистить список исполнителей процесса; |
- установить статус процесса, код которого указан в ; |
- проверить наличие исполнителей с группами, коды которых указаны через запятую в ; |
- перейти в текущую открытую очередь процессов и обновить её; |
- открыть или обновить карточку обрабатываемого процесса; |
- закрыть карточку обрабатываемого процесса; |
- понизить приоритет процесса на ; |
- повысить приоритет процесса на . |
В команды могут быть подставлены паременные из объединённой конфигурации пользователя.
Пример. Разршение на правку процесса в различных статусах различным группам, исполнителю либо администратору и запрет правки закрытого процесса.
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
Карточка процесса открывается в буфере
и позволяет редактировать свойства уже созданного процесса.В левой области расположены основные свойства процесса и ссылки для их редактирования. Далее настроенные для процесса параметры.
В правой области отображаются редакторы свойств процесса либо различные расширения, предоставляемые плагинами. На снимке ниже в процессе отображено расширение от плагина BGBilling, позволяющее создавать привязанные к процессу проблемы в CRM плагине биллинга.
Очередь процессов - это интерфейс доступа к массиву процессов определённых типов. Очередь определяет вид таблицы, доступные сортировки и фильтры. Очереди отображаются в пользовательском интерфейсе оснасткой Очереди процессов.
В свойствах очереди определяются доступные в ней типы процессов, прочие параметры вводятся в конфигурации.
Одна или несколько записей вида:
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>
Где:
- уникальный числовой идентификатор колонки; |
- заголовок; |
- выводимое значение, см. значения далее; |
- выравнивание: "left", "center", "right"; |
- CSS стиль столбца; |
- максимальная не обрезаемая длина текста; |
Выводимое значение
может быть следующим:- идентификатор процесса; |
- тип процесса; |
- текщий статус; |
- время установки текущего статуса; |
- пользователь, установивший текущий статус; |
- комментарий текущего статуса; |
- дата и время последней установки статуса из перечисленных через запятую в ; |
- пользователь, последним установвший стаус из перечисленных через запятую в ; |
- комментарий последней установки статуса из перечисленных через запятую в ; |
- приоритет; |
- дата и время создания; |
- пользователь, создавший процесс; |
- дата и время закрытия; |
- пользователь, закрывший процесс; |
- исполнители, при необходимости указать исполнителей процесса только из определённых групп - , где - коды групп пользователей через запятую; |
- описание; |
- параметр процесса, где - код параметра; |
- вывод если списковый параметр процесса с кодом установлен в значение либо в противоположном случае, - необязательные параметры, по умолчанию это символы "✓" и "✗"; |
- параметр привязанного к процессу контрагента, где - код параметра; |
- значения столбца из таблицы для привязанных контрагентов; - код, - наименование; |
- названия привязанных к процессу сущностей в таблице с префиксом типа ; |
- перечень контрагентов, привязанных к процессу со ссылками на открытие их карточек; |
операциями над процессом. | - ссылки с
Одна или несколько записей вида:
filter.<id>.type=<type> #дополнительные обязательные и необязательные параметры различные для разных фильтров filter.<id>.<param1>=<value1> .. filter.<id>.<paramX>=<valueX>
Где:
- уникальный числовой идентификатор фильтра; |
- тип фильтра, единственный обязательный параметр, см. значения далее. |
Пример. Фильтр по статусу с выбранным по-умолчанию значением и ограничениям на значения, фильтр по дате создания, по группам решения, исполнителям, коду и дате закрытия.
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
Далее описываются фильтры по их типу (параметр
), обязательные и необязательные параметры.Необязательные параметры:
- 0, если фильтр необходимо скрыть. |
Вывод только открытых, только закрытых либо всех процессов, значительно ускоряет выборку.
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- "none", "open" либо "close" - значение фильтра по-умолчанию. |
Необязательные параметры:
- 0, если фильтр необходимо скрыть. |
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- отображаемые в фильтре коды статусов, в порядке их отображения; если параметр не указан - отображаются все статусы. |
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- ширина фильтра в пикселях; |
- жёстко заданные в фильтре коды статусов, в этом случае фильтр имеет смысл только скрытым; |
- отображаемые в фильтре коды статусов, в порядке их отображения; если параметр не указан - отображаются все статусы; |
- коды статусов, выбранные в фильтре по-умолчанию через запятую; |
- значения фильтра, используемые, если никакие значения пользователем не выбраны. |
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- ширина фильтра в пикселях; |
- отображаемые в фильтре коды типов процессов, в порядке их отображения; если параметр не указан - отображаются все типы процессов; |
- коды типов процессов, выбранных в фильтре по-умолчанию через запятую; |
- значения фильтра, используемые, если никакие значения пользователем не выбраны. |
Фильтр без учёта ролей групп.
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- ширина фильтра в пикселях; |
- отображаемые в фильтре коды групп, в порядке их отображения; если параметр не указан - отображаются все группы; |
- коды типов групп, выбранных в фильтре по-умолчанию через запятую; |
- значения фильтра, используемые, если никакие значения пользователем не выбраны. |
Без учёта в составе какой группы участвует пользователь. Фильтр работает только совместно с фильтром groups, при этом в списке исполнителей отображаются пользователи, когда-либо состоявшие в группах, указанных в фильтре groups.
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- ширина фильтра в пикселях; |
- "current", если необходимо отображать только процессы с текущим пользователем в исполнителях, фильтр в этом случае желательно скрыть. |
Фильтрует с учётом роли групп в процессах.
Обязательные параметры:
- код роли. |
Необязательные параметры:
- 0, если выбор групп необходимо скрыть; |
- ширина выбора групп в пикселях; |
- отображаемые в фильтре коды групп, в порядке их отображения; если параметр не указан - отображаются все группы; |
- коды типов групп, выбранных в фильтре по-умолчанию через запятую; |
- значения групп фильтра, используемые, если никакие значения пользователем не выбраны; |
- 0, если выбор исполнителей необходимо скрыть; |
- ширина выбора исполнителей в пикселях. |
Поддерживаются параметры одного из следующих типов: "list", "date", "datetime", "address".
Обязательные параметры:
- подпись к фильтру. |
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- ширина фильтра в пикселях; для параметров типа "list", "address"; |
- доступные значения спискового параметра; |
- выбранные по-умолчанию значения спискового параметра; |
- значения параметра, используемые, если никакие значения пользователем не выбраны. |
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- ширина фильтра в пикселях. |
Поддерживаются параметры только типа "list".
Обязательные параметры:
- подпись к фильтру. |
Необязательные параметры:
- 0, если фильтр необходимо скрыть; |
- ширина фильтра в пикселях; |
- доступные значения спискового параметра; |
- выбранные по-умолчанию значения спискового параметра; |
- значения параметра, используемые, если никакие значения пользователем не выбраны. |
Конфигурация количества последовательных сортировок (выпадающих списков с режимами сортировки).
sort.combo.count=<count>
Где:
- количество последовательных сортировок. |
Пример:
sort.combo.count=3
Для каждого выпадающего списка возможно определение значния по-умолчанию:
sort.combo.<combo_id>.default=<defaultValue>
Где:
- порядковый номер выпадающего списка начиная с 1; |
- выбранное по-умолчанию значение в выпадающем списке начиная с 1. |
Либо жёстко определить значение (используется в основном для мобильного интерфейса):
sort.combo.<combo_id>.value=<value>
Где:
- порядковый номер выпадающего списка начиная с 1; |
- выбранное значение в выпадающем списке начиная с 1. |
Конфигурация режимов сортировок (значения для выпадающих списков), одна или несколько записей вида:
sort.mode.<id>.columnId=<col_id> sort.mode.<id>.title=<title> # обратный режим сортировки 1 - обратный, 0 - прямой sort.mode.<id>.desc=1
Где:
- уникальный числовой идентификатор режима сортировки; |
- числовой идентификатор колонки, по которой производится сортировка, либо "0" - случайный режим сортировки; |
- название режима сортировки. |
Пример. Режимы сортировки по типу процесса, выводимому в колонке 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
Настраиваемые операции над процессом, ссылки которых выводятся в колонке с value=actions.
Операции определяются в конфигурации очереди следующим образом:
action.<id>.title=<title> action.<id>.statusIds=<statusIds> action.<id>.commands=<commands>
Где:
- уникальный числовой идентификатор режима сортировки; |
- наименование операции. |
- коды статусов через запятую, в которых разрешена операция; |
макроса обработки процесса. | - команды
# в каком интерфейсе отображать очередь showIn=<show_in> # для мобильного интерфейса кнопки создания процессов в очереди createAllowedProcessList=<process_id_1>:<title_1>;<process_id_2>:<title_2>;..<process_id_n>:<title_n> # для стационарного интерфейса - запрет создания процессов в очереди (нет кнопки "Создать") allowCreateProcess=0
Где:
- может быть , ; по-умолчанию принимается значение . |
- код типа процесса; |
- наименование кнопки. |
Система сообщений позволяет организовать обмен различными типами сообщений с привязкой их к процессам. В данный момент поддержаны только сообщения типа EMail.
Типы сообщения настраиваются в конфигурации, одна или несколько записей вида:
messageType.<id>.title=<title> messageType.<id>.class=<class_name>
Где:
- уникальный числовой идентификатор типа сообщения, не должен меняться впоследствии; |
- наименование типа сообщения; |
- имя класса-обработчика сообщений. |
Остальные параметры различаются для разных видов сообщений.
. Дополнительные параметры:
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. Сообщения считываются из папки
. Параметры подключения IMAP задаются параметрами , , . После разбора текста сообщений и вложений сообщение перемещается в , при возникновении ошибок - в .подставляется в поле отправителя исходящего письма. Папка указывает папку, из которой считываются ответные письма на отправленные из 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.
Получение новых сообщений и отправку созданных в BGCRM осуществляет класс планировщике.
, настройте его запуск вВ оснастке производится разбор новых поступивших сообщений, которые необходимо разбить по процессам.
Открытое сообщение:
При обработке сообщение должно быть помечено как обработанное и быть привязанным к существующему процессу (необходимо указать его код) либо к вновь созданному. При создании процесса система ищет по адресу отправителя сообщения контрагентов, которые могут быть соотнесены с процессом. Для EMail поиск производится по параметру типа EMail по точному совпадению либо указанному в контрагенте домену.
Созданному процессу возможно сразу установить группу решения, исполнителя, параметры.
Отображение вкладки сообщений должно быть настроено в конфигурации типа процесса.
Для создания сообщения в рамках процесса используйте кнопку реализовать переключением статуса процесса по событию поступления сообщения.
, для ответа на сообщение - кнопку рядом с каждым сообщением. Ответы на сообщения автоматически будут разнесены в процесс. Пометку процессов с новыми сообщениями можноОрганизация работ - общее название раздела системы, предназначенного для организации учета рабочего времени. Основной рабочий элемент -
.Виды работ - это описание типов деятельности по отношению к той или иной группе пользователей (чем именно они занимаются и какое время на это тратится).
Каждый вид работы содежрит название, цвет (для визуального отличия в
или на ) и правила.Кажде правило содержит:
(один или несколько), (одна или несколько), .Где:
типы процессов, которые используются в системе; | - это
списковый параметр процесса; | - это
- количетсво времени (минут), необходимое для выполнения данного типа работ; |
Для настройки списка
необходимо создать списковый параметр процесса, пример:Далее, необходимо в конфигруции указать значение параметра
равное id спискового параметра . Для примера выше:#id параметра Услуги callboard.serviceListId = 63
Допускается создание вида работы без правил (пустой тип).
видов работ, с указанием временного промежутка, отведенного на тот или иной тип работы.
- это перечень- это календарь с распределением типов рабочих дней в году (рабочий день, выходной день и т.д.).
Первоначальная настройка
осуществляется через конфигурацию, далее в интерфейсе редактора только добавляются/удаляются исключения.Конфигурация
выглядит следующим образом:#конфигурация календаря рабочих дней #настройка типов рабочих дней 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: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 (Выходные дни).
Можно создать неограниченное количество календарей с различными наборами распределения рабочих дней.
Настроенные в конфигурации Календари доступны для дальнейшего редактирования во вкладке Календарь рабочих дней Организации Работ.
При открытии календаря для редактирования по умолчанию выбирается текущий год (для редактирования доступны также предыдущий и следующий).
Для того, чтобы отредактировать график (проставить исключения) необходимо выбрать тип рабочего дня из выпадающего списка и установить его на необходимую дату.
Если необходимо скопировать распределение рабочих дней с одного года на другой, доступна функция копирования. Для ее использования следует нажать кнопку "Копирование параметров".
Первоначальная настройка Виды работ и Смены.
производится через конфигурацию. Кроме того, для работы необходимы созданныеКонфигурация графика выглядит следующим образом:
#конфигурация графика дежурств callboard.X.groupId=<id родительской группы> callboard.X.calendarId=<id календаря рабочих дней> callboard.X.pastEditAllowed=<разрешить редаткриование прошлым> callboard.X.autoAddGroup=<автоматически добавлять группу>
Где:
- порядковый номер; |
- id родительской группы, для подгрупп которой будет строиться график; |
- (необязательный параметр) id календаря с распределением рабочих дней>; |
- 0 или 1, соответственно запретить или разрешить редактирование графика за прошедшие дни; |
- 0 или 1, при попытке установить сотруднику смену на день, в который он не числится в данной группе, при установленном значении 1 - автоматически добавит на этот день пользователя в эту группу; |
Пример конфигурации:
#кофигурация графика дежурств callboard.1.groupId=36 callboard.1.calendarId=1 callboard.1.pastEditAllowed=0 callboard.1.autoAddGroup=0
Следует обратить внимание на то, что пользователь который будет редактировать график дежурств, должен состоять в группе для которой сконфигурирован график (в примере выше, в группе с id=36)
Перед началом редактирования графика предлагается выбор из одной или нескольких Групп (в зависимости от прав пользователя и конфигурации графиков). Также необходимо выбрать промежуток времени, за который будет производится редактирование. Дата начала по умолчанию - текущая дата. Конечную дату можно не указывать: в этом случае график будет построен на 10 дней, с даты начала.
Для редактирования графика нужно выбрать одну из настроенных Смен и нажать на необходимое поле, на пересечении даты и сотрудника. Чтобы открыть список доступных смен, нужно нажать кнопку "Смены". Выбранная смена помечается красным прямоугольником. Пустая смена используется для удаления ранее проставленной смены.
- объединение нескольких работнику в пределах смены. Если это необходимо, то любому работнику можно установить номер бригады в пределах одной даты. Это может пригодиться в том случае, если показать на графике как именно работают сотрудники: по одиночке, парно и т.д. Для установки номера бригады необходимо кликнуть в левом верхнем углу клетки с проставленной сменой и далее, в появившемся окне, написать номер и нажать <Enter>.
Изменение номера бригады происходит анналогичным образом.
Если на одну и ту же дату, в одной группе, под одним номером бригады объединяются сотрудники с разными шаблонами смен, выводится диалоговое окно где нужно выбрать какой именно из двух шаблонов следует использовать:
- вызывается правым кликом на проставленном шаблоне смены и позволяет вручную отредактировать виды работ и установить номер бригады:
При определенном количестве контрагентов стандартная СУБД MySQL не всегда должным образом может справляться с нагрузкой, вызываемой поиском контрагентов, что может приводить к увеличению времени обработки запросов. Для повышения скорости и разгрузке основной базы при поиске контагента по ФИО, адресу, году рождения и другим параметрам существует возможность интеграции BGCRM с системой полнотекстового поиска Sphinx.
Из репозиториев необходимо установить дистрибутив Sphinx версии не ниже 2.0.6. В конфигурационном файле, который находится обычно (зависит от дистрибутива) в
описываем конфигурацию:# название индекса 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
Для интеграции со Sphinx в Конфигурации нужно настроить следующие пункты:
# включить поиск в кэше sphinx.enable=<flag> # URL/IP на котором находится сервер sphinx sphinx.url=<url> # номер порта, прослушиваемый sphinx sphinx.port=<port> # максимальное время в секундах, через которое измененный контрагент будет перекэширован sphinx.cacheTimeout=<seconds> # максимальное количество контрагентов, которое может быть отправлено в кэш за один раз sphinx.cacheLimit=<count> # список параметров контрагента, по которым ведется поиск в кэше sphinx.customerParamIds=<paramIds>
Где:
- 1, если поиск необходимо включить, любое другое значение отключает поиск
- URL, либо IP-адрес хоста, на котором настроен Sphinx
- номер порта сервера Sphinx
- максимальное время в секундах, через которое измененный контрагент будет перекэширован
- максимальное количество контрагентов, которое может быть отправлено в кэш за один раз
- 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
После этого в графическом интерфейсе появится поле, которое использует при поиске кэш:
Система BGCRM является в первую очередь платформой, поэтому значительный эффект от её применения достигается путём реализации различного рода расширений под спицифику пользователя. Вы можете пропустить данный раздел целиком при первичном знакомстве с системой.
Регулярные выражения позволяют гибко описывать шаблоны строк.
Описание строк осуществляется путём подстановки определённых макросов, обозначающих части строки либо символы определённого типа.
Например:
(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, () - группа символов. |
Ссылки:
http://www.opennet.ru/docs/RUS/perlre_man/ - регулярные выражения Perl, практически идентичны Java.
http://j2w.blogspot.com/2008/01/java.html - регулярные выражения Java.
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html - спецификация на английском.
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 директив, встречающихся в приведенном фрагменте:
- для каждого узла исходного дерева XML данных выполнить то что указано до- создать переменную uid и присвоить ей значение из атрибута uid текущего узла bill
- вставить значение атрибута number текущего элемента bill
- условный оператор, аналог case либо if-else, внутри могу быть несколько <xsl:when> условий и действие по умолчанию <xsl:otherwise> Ниже приведены ссылки на руководства по XSLT. Язык разметки XSLT тесно завязан с языком XPath - языком выборки данных в XML деревьях. XSLT процессор "Saxon HE" используемый в BGCRM поддерживает спецификации XSLT и XPath версий 2.0 и 2.0.
http://ru.wikipedia.org/wiki/XSLT - статья в Wikipedia
http://www.xmlhack.ru/texts/02/xslt20/xslt20.html - отличия XSLT 2.0 от 1.0 версии
http://www.xmlhack.ru/texts/02/xpath20/xpath20.html - отличия XPath 2.0 от 1.0 вервсии
http://www.saxonica.com/documentation/functions/intro.xml - реализованные в процессере Saxon функции XSLT
http://www.w3.org/TR/xslt20/ - XSLT 2.0 спецификация
http://www.w3.org/TR/xpath20/ - XPath 2.0 спецификация
http://www.w3.org/TR/xpath-datamodel/ - модель данных XPath
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 процессор всегда передаются объекты:
ru.bgcrm.Utils - возможность вызова статических функций; | - статический контекст объекта
org.apache.commons.lang.StringUtils - возможность вызова статических функций; | - статический контекст объекта
org.apache.commons.collections.CollectionUtils - возможность вызова статических функций. | - статический контекст объекта
Дополнительные объекты передаются в зависимости от места использования.
Ссылки:
Log4j - библиотека логирования для Java. Настройка логирования производится в файле
, изменение файла можно производить при работающем приложении. Вид файла при установке системы: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
Сообщения в логе разделяются на уровни (в порядке возрастания):
, , , , . По-умолчанию настроен уровень INFO, т.е. выводятся информационные и ошибочные сообщения (INFO, FATAL, ERROR), отладка не выводится. Вывод осуществляется в файл , который обрезается на размере 10МБ с созданием отдельных файлов.Для включения вывода отладочной информации необходимо установить:
log4j.logger.ru.bgcrm=DEBUG, file
В конфигурационном файле возможно изменять формат информации в файле, фильтр по классам и другие параметры логирования.
Ссылки:
http://artamonov.ru/2007/04/06/vvedenie-v-log4j/ - вводная статья на русском.
Динамический код - это Java файлы, которые можно изменять и подгружать без перезапуска приложения. С его помощью можно обрабатывать различные события в системе. Файлы с классами динамического кода располагаются в по-умолчанию каталоге
. Динамические классы рекомендуется создавать в пакете .Параметры динамического кода могут быть настроены в конфигурации.
Для написания динамического кода возможно использование как простого текстового редактора, так и полноценные IDE для Java разработки. Методология при этом аналогична примяемой для разработки в BGBilling.
Компиляция динамического кода осуществляется на вкладке
интерфейса администратора. Можно скомпилировать только все классы сразу. При успешной компиляции динамический код применяется также целиком.Создаваемые динамические классы - обработчики событий должны расширять абстрактный класс ru.bgcrm.event.listener.DynamicEventListener. Информацию по типам событий можно получить из API документации к системе в формате JavaDoc.
<crmUrl>/admin/dynamic.do?action=runDynamicClass&class=<className>¶m1=value¶m2=..
Где:
- URL и порт BGCRM; |
- имя динамического класса. |
Класс должен расширять абстрактный класс ru.bgcrm.event.listener.DynamicEventListener в который передаётся событие ru.bgcrm.event.RunClassRequestEvent.
Пользовательские JSP страницы располагайте в каталогах WEB-INF/jspf/.../custom/.., это гарантирует вас от перетирания названия каталога штатными шаблонами.
Например: "/WEB-INF/jspf/user/process/process/custom/process_jur/zayavka.jsp".
Все запросы на изменение данных в возвращают результат в JSON формате. Запросы выборки данных возвращают результат в HTML формате, однако возможно получение данных и в JSON формате, путём добавления в запрос параметра
.Для прозрачной авторизации запроса сторонней системы логин и пароль пользователя могут быть переданы в запросе в HTTP параметрах запроса
и соответственно. Параметр в запросе указывает на хранение отсутствие необходимости в HTTP сессии. Настоятельно рекомендуется использовать его при запросах внешних систем, т.к. предотвращение создания HTTP сессий экономит память BGCRM.Пример запроса на получение данных во внешнюю систему в JSON формате (выборка по очереди процессов):
http://ncrm.core.ufanet.ru/user/process.do?action=queueShow&id=4&dateStatusStatus=10&status=10&status=9&status=13¤tUserMode=&group=7&sort=0&j_username=shamil&j_password=*****&responseType=json&authToSession=0
При изучении формата запросов и ответов возможно использование FireBug или иного инструмент разработчика в браузере с возможность просмотра запросов, в данный момент описания формата запросов нет. Т.е. получение протокола взаимодействия доступно только путём мониторинга вида запросов, отправляемых браузером при работе пользователя в BGCRM.
Для запуска любого класса, статического или динамического в контексте сервера BGCRM вызовите:
./crm.sh "runclass <class_name>"
Где
- полное имя класса с пакетом. Класс должен реализовывать интерфейс java.lang.Runnable.Запуск в контексте сервера обозначает, что класс будет выполнен в рамках отдельного потока процесса сервера, получив доступ к соединению с БД, конфигурациям и другим объектам контекста. Результаты работы можно выводить в логи.
Для периодического выполнения класса необходимо использовать планировщик.
Плагин предназначен для интеграции BGCRM с биллинговой системой BGBilling и предоставляет функционал:
поиск договоров по базе биллингов;
создание и модификация параметров договоров;
привязка договоров к контрагентам;
копирование параметров контрагентов в договора;
создание базы контрагентов по базе договоров.
Для добавления биллингов в конфигурации сервера добавляют конструкции вида:
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>
Где:
- уникальный порядковый номер биллинга в конфигурации; |
- строковый идентификатор биллинга, короткая строка, именно на него ссылаются все остальные записи в конфигурации; |
- отображаемое наименование; |
- URL для подключения к сервлету executer биллинга; |
- версия, поддерживаются 5.1 и 5.2; |
- код текстового параметра договора в биллинге, в котором сохраняется код контрагента. |
Например:
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>
Где:
- код шаблона договора из биллинга; |
- шаблон нумерации договоров по этому шаблону при создании их из BGCRM; |
- перечень статусов проблем в CRM плагине BGBilling, по-умолчанию "0:открыта;1:принята;2:закрыта". |
- правила копирования параметров контрагента в договор, см. далее. |
В параметре
могут быть определены разделённые точкой с запятой значения вида : .Где:
- числовой код параметра контрагента либо - наименование контрагента; для списковых параметров указывается код параметра и коды значениий в квадратных скобках после кода; |
- числовой код параметра договора биллинга; для списковых параметров указывается код параметра и коды значениий в квадратных скобках после кода. |
Например:
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 обращения плагина выглядят так же как и обращения обычного пользователя биллинга, аналогично действуют ограничения прав.
Единый договор - это привязанный к адресу номер-префикс, с которым создаются договора услуг на данном адресе. Договора услуг могут быть созданы в различных биллиингах. Номер договора услуги начинается с номера единого договора и заканчивается кодом услуги. Номер единого договора начинается с префикса области, далее следует порядковый номер.
Для включения функционала единого договора в конфигурации сервера необходимо добавить:
# код параметра контрагента с адресами услуг, параметр должен поддерживать множественное значение 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})
Где:
адресного справочника кодам областей, в каждом из кодов областей осуществляется последовательная нумерация единого договора. | - соотношение кодов городов из
Пример:
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
Единые договора создаются в карточке контрагента.
Это договоры, которые могут быть созданы в привязке к контрагенту в его карточке. Договоры услуг могут быть как связаны с единым договором, там и создаваться независимо от него, при этом нумерацию осуществляет биллинг. Для добавления договора услуги в конфигурации указываются одна или несколько записей вида:
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>
Где:
- уникальный порядковый номер типа в конфигурации; |
- наименование типа договора; |
- строковый идентификатор биллинга; |
- код шаблона договора в биллинге; |
- перечень разделённых через точку с запятой записей вида : , где -код тарифа в биллинге, - обозначение тарифа; |
- код области ЕД; |
- код услуги договора, используется только в связке с единым договором, иначе параметр можно пропустить. |
Общее описание алгоритма импорта:
Из базы биллинга выбирается следующий договор с текстовым полем
= 0 (код поля настраивается, само поле нужно создать в биллинге).Наименование контрагента извлекается из комментария договора биллинга.
Производится поиск в базе контрагентов с названием, включающем в себя название контрагента договора, для всех найденных контрагентов сверяются
(адреса, телефоны, паспортные данные и т.п.). При совпдадении хотя бы одного из подтверждающих параметров контрагент считается установленным.Если в шаге 2 контрагент не найден, то контрегент ищется по расстояние Левенштейна между двумя наименованиями не превышает указанного в конфигурации значения, то контрагент считается установленным. К наименованию контрагента в BGCRM добавляется новый вариант написания через символ пайпа (|). В дальнейшем правильный вариант написания предстоит установить оператору.
, после чего для найденных контрагентов определяется степень несовпадения наименования с наименованием контрагента договора. ЕслиЕсли контрагент не найден при прямом и обратном поиске - создаётся новый контрагент.
К созданному контрагенту привязывается договор, в него импортируются параметры договора.
Для настройки импорта контрагентов из базы договов биллинга добавьте в конфигурацию правила импорта:
bgbilling:creator.confirmParameters=<confirm_params> bgbilling:creator.searchParameters=<search_params> bgbilling:creator.titleDistance=<title_dist> bgbilling:creator.importParameters=<import_params>
Где:
- подтверждающие параметры контрагента, коды через запятую; |
- ключевые параметры контрагента, коды через запятую; |
- максимальное расстояние Левенштейна; |
- импортируемые из договора параметры контрагента. |
Далее одно или несколько правил определения группы контрагента из номера договора:
bgbilling:creator.parameterGroupRule.<id>.paramGroupId=<param_group> # необязательный параметр, если шаблона нет - то группа выставляется всем контрагентам bgbilling:creator.parameterGroupRule.<id>.contractTitlePattern=<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> #
Где:
- уникальный числовой идентификатор; |
идентификатор биллинга; | - строковый
- логин и пароль пользователя биллинга, под которым осуществляется импорт; |
- количество договоров для импорта, выбираемых за один раз; |
- соотношение договоров контрагента и биллинга, разделённые точкой с запятой пары для простых параметров и [ ]: [ ] - для спискового типа. |
При импорте поддерживаются параметры договоров и, соответственно, контрагентов типа: "дата", "текст", "адрес", "телефон", "список". Параметры дата и текст перетирают значение параметра в договора, адрес, телефон и список - дополняют.
Пример конфигурации импорта контрагентов:
# загрузчик контрагентов # дата рожд, адреса услуг, сот. телефон(ы), паспорт с.-н. 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
Импорт контрагента можно инициировать вручную в карточке договора, либо настроить в планировщике.
Для настройки импорта контрагента по таймеру добавьте в конфигурацию планировщика класс , например:
scheduler.task.1.class=ru.bgcrm.plugin.bgbilling.creator.CustomerCreator scheduler.task.1.minutes=2,12,22,32,42,52
Мониторить выполнение задачи можно по логам.
В конфигурацию типа процесса возможна установка следующих параметров.
Для автоматического добавления групп решения процесса по названию либо биллингу привязанного договора одна или несколько правил вида:
bgbilling:processLinkedContract.<n>.groupIds=<groupIds> bgbilling:processLinkedContract.<n>.titleRegexp=<titleRegexp> bgbilling:processLinkedContract.<n>.billingIds=<billingIds>
Где:
- порядковый номер правила; |
REGEXP номера договора; | -
- строковые идентификаторы биллингов через запятую, к которым может относится договор |
Правила отрабатывают при привязке договора к процессу, либо при создании привязанного к договору процесса. Проверка осуществляется до первого совпавшего по REGEXP либо кодам биллингов правила. Достаточно указать лишь одно из этих условий.
Для вкладки документов карточки единого договора в конфигурации типов документов указывать scope= для документов карточки договора scope=
- получение из биллинга со строковым идентификатором XML документа карточки договора с кодом , запрос осуществляется под пользователем и паролем - две строки разделены двоеточием;
- получение 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> <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 )" /> ...
В оснастке плагин добавляет функционал поиска договоров по базам. Поиск может осуществляться по номеру договора, комментарию, адресным параметрам.
Поиск по номеру и комментарию осуществляется по подстроке. Поиск по адресным параметрам - аналогично поиску контрагента, можно искать как по только по улице так и дополнять данные для поиска. Из результатов поиска отображаются только первые 30 на каждый биллинг. Под результатами поиска в каждом из биллингов отображается число найденных и отображённых записей.
Вкладка отображает созданные для контрагента единые договоры и позволяет создать единый договор для адреса из определённого в конфигурации параметра контрагента, для которого ещё нет единого договора.
Единый договор можно удалить а также перейти на его карточку нажав по номеру-ссылке. Единый договор связан с договором услуги посредством номера.
Позволяет просматривать договоры контрагента, создавать сконфигурированные типы договоров.
Также возможно копирование параметров в договоры, переход на карточку договора нажатием на ссылку-номер.
В карточке процесса возможно отображение привязанных к процессу проблем из CRM плагина BGBilling. Данный функционал полезен в переходный этап миграции на BGCRM, когда часть служб работает в плагине CRM биллинга.
Для включения данного функционала в конфигурации типа процесса должно быть указано:
bgbilling:processShowLinkedProblems=1 # описание создаваемых проблем подставлять описание процесса, опционально #bgbilling:processLinkProblemSetProcessDescription=1 # требование по статусам привязанных проблем - запрет перехода процесса в определённый статус, пока привязанные проблемы не будут в нужных статусах #bgbilling:processToStatus.<processStatusCode>.needLinkedProblemsStatus=<billingId>:<statusCode>;<billingId1>:<statusCode1>..
Где:
- статус, в который переходит процесс; |
- идентификатор биллинга; |
- код статуса проблемы, который должен стоять при переходе процесса. |
Для отображения в карточке процесса привязанных к процессу единых договоров установить в конфигурации типа процесса:
bgbilling:processShowCommonContract=1
Карточки единых договоров открываются в буфере Единые договоры.
По ссылке
доступно изменение номера единого договора, его периода и пароля.Карточка договора открывается в буферы
и отображает основные параметры договора в биллинге.Кнопка изменения контрагента (*) позволяет убрать привязку контрагента к договору либо привязать договор к одному из открытых в буфере импорта контрагентов и привязывает его к договору.
контрагентов. Кнопка вызывает импорт параметров из договора в выбранного контрагента, либо создаёт контрагента в соответствии с правиламиКнопка
- позволяет быстро открыть вкладку договора клиенте BGBillingClient. Для этого клиент биллинга должен быть подключен к серверу под тем же пользователем, что и текущий пользователь в BGCRM. Для открытия договора - нажать кнопку и перейти в клиент биллинга. Быстрый переход предназначен для операций с договором, не реализованных через интерфейс BGCRM.Для создания договора в биллинге в буфере
нажмите кнопку .Для создания договора выбрать биллинг, шаблон. В конфигурации сервера биллинга для шаблонов договоров может быть указан шаблон нумерации. Выбираемые контрагенты должны быть открытыми в буферы .
Для добавления генератора документа в конфигурации указывается запись вида:
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>
Где:
- уникальный числовой идентификатор типа документа; |
- тип сущности, для которой генерируется документ; |
- тип генерируемого документа, в данный момент поддерживается только - PDF форма; |
- имя сгенерированного документа; |
- имя файла со шаблоном документа (PDF форма либо иной исходный документ для подстановки параметров) рекомендуется располагать в каталоге ; |
XSLT 2.0 шаблон, генерирующий XML документ со значениями полей; | -
REGEXP шаблон имени сущности, для которой будет предлагаться к генерации данный тип документа; | -
- 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>
Где:
- код объекта для которого генерируется документ; |
- тип объекта; |
и - параметры 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.
- возвращает результат проверки установленности в значении бита , нумерация с 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> ...
- получение 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" 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> ...
В интерфейсе пользователя функционал плагина доступен на вкладках настроенные для данного типа сущности виды документов.
различных сущностей. В выпадающем списке отображаютсяЗдесь же возможно удаление документа, его открытие.
Каждый отчёт состоит из файла - описания, размещаемого в каталоге BGCRM/report и JSP страницы с логигой и оформлением отчёта. Вы можете посмотреть примеры отчётов на WiKi.
Файл-описание содержит в себе информацию о названии отчёта, его идентификатор и имя JSP файла с реализацией. При разработке своих отчётов необходимо именовать идентификаторы отчёта с префикса
, так же как и файл-описание отчёта. JSP файл отчёта располагать в каталоге .Пример содержимого файла-описания отчёта
:<?xml version="1.0" encoding="UTF-8"?> <report id="custom_ncc_smena" title="Отчёт ЦУС по сменам" jspFile="/WEB-INF/jspf/user/plugin/report/custom/ncc_smena.jsp"/>