About

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

В ядре поддерживаются сообщения типа Звонок, Заметки (Комментарии). Дополнительные типы сообщений предоставляются плагинами.

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

Сообщения E-Mail могут быть использованы для коммуникации двух BGERP между собой. В каждой из них сообщения будут привязаны к своему процессу, имеющих собственных исполнителей.

Setup

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

Following settings should be done in the configuration.

Types

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

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

Где:

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

  • <title> - наименование типа сообщения;

  • <messageTypeClassName> - имя класса-обработчика сообщений.

Optional config:

# не информировать о необработанных сообщениях данного типа
messageType.<id>.unprocessedMessageNotify=0
# do not check empty subject on saving
messageType.<id>.check.empty.subject=0

Rest of configurations is different for message types.

<messageTypeClassName>, description Configuration

MessageTypeNote

Used for appending process notes.

message notes
messageType.<id>.create.unread=1

Allows to create notes as unread.

Example of configuration:

messageType.100.title=Note
messageType.100.class=MessageTypeNote

MessageTypeCall

Тип сообщения представляет из себя звонок, который обрабатывается оператором.

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

i0109

As a call’s supplier should be used Asterisk plugin or external HTTP requests.

messageType.<id>.offerNumberFromParamId=<offerNumberFromParamId>
messageType.<id>.autoNumberRegister=<autoNumberRegister>

Where:

  • <offerNumberFromParamId> - код текстового параметра пользователя, содержащий номер, предлагаемый к занятию по-умолчанию.

  • <autoNumberRegister> - 0, to disable automatic registering user number on login.

MessageTypeEmail (Plugin Email)

Allows reading email boxes, separation the incoming messages other processes, there message exchange can be further continued.

process message

Configuration pattern:

messageType.<id>.title=<title>
messageType.<id>.class=MessageTypeEmail
messageType.<id>.email=<email>
messageType.<id>.host=<host>
messageType.<id>.login=<login>
messageType.<id>.pswd=<pswd>

messageType.<id>.folderIn=<inFolder>
# если не указан - CRM_PROCESSED
#messageType.<id>.folderProcessed=<processedFolder>
# если не указан - CRM_SKIPPED
#messageType.<id>.folderSkipped=<skippedFolder>
# если не указан - CRM_SENT
#messageType.<id>.folderSent=<sentFolder>
# если не указан - Trash
#messageType.<id>.folderTrash=<trashFolder>

# IMAP SSL
#messageType.<id>.store=imaps
# порт, если не указано - 143 для IMAP, 993 для IMAP SSL
#messageType.<id>.port=
# отладка почтового обмена IMAP и SMTP
#messageType.<id>.debug=1

# параметры SMTP, добавляются идентично опциям из основной конфигурации после префикса messageType.<id>.

# do not make read all process related messages
#messageType.<id>.processed.read=0

# JEXL expression for generation signature text
#messageType.<id>.sign.expression=<signExpression>
# отключение стандартной подписи, что сообщение отправлено BGERP
#messageType.<id>.sign.standard=0
# иной адрес отправителя письма
messageType.<id>.from=<from>
# адрес для ответов в письме
messageType.<id>.replayTo=<replayTo>

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

<email> подставляется в поле отправителя исходящего письма.
Поля <from> и <replayTo> используются в случае необходимости в момент отправки подставить в поле "От" (From) иной адрес и "Ответить на" (Replay-To).

<signExpression> - JEXL выражение, определяющее подпись письма при отправке его через данный тип сообщения.

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

Additional settings for the message type are documented here

Simple configuration example with unencrypted IMAP and SMTP.

messageType.1.title=billing@bitel.ru
messageType.1.class=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
messageType.1.folderProcessed=INBOX.CRM_PROCESSED
messageType.1.folderSkipped=INBOX.CRM_SKIPPED
messageType.1.folderSent=INBOX.CRM_SENT
messageType.1.signExpression=<<END
    sign = NEW_LINE + user.getTitle() + NEW_LINE + "Служба технической поддержки" + NEW_LINE;
    sign += "ОАО \"Инет\"" + NEW_LINE + "тел. 2232333" + NEW_LINE + "email. mastea@inet.ru" + NEW_LINE;
END
messageType.1.mail.transport.protocol=smtp
messageType.1.mail.smtp.user=billing@inet.ru
messageType.1.mail.smtp.host=smtp.ufamail.ru
messageType.1.mail.smtp.pswd=******

Other samples can be found here

MessageTypeChannel (Plugin Slack)

Connecting processes with Slack channels

slack 2

Для Slack может быть создан только один тип сообщения:

messageType.<id>.title=<title>
messageType.<id>.class=MessageTypeChannel
messageType.<id>.authToken=<token>
# необязательные параметры
messageType.<id>.accountParamId=<slackLoginParamId>
messageType.<id>.expressionMessageExtract=<jexl>

Параметры, отличные от прочих типов сообщений:

  • <token> - TOKEN авторизации, сохранённый ранее;

  • <slackLoginParamId> - код текстового параметра пользователя, хранящего логин Slack, позволяющий сопоставить пользователя BGERP с пользователем Slack;

  • <jexl> - JEXL выражение для извлечения сообщения Slack в текст входящего сообщения,
    исходное сообщение передаётся в параметре message, не null результат скрипта используется как текст входящего сообщения.

Пример настройки типа сообщения. Входящие сообщения выбираются с подстрокой bg.

messageType.5.title=Slack
messageType.5.class=MessageTypeChannel
messageType.5.authToken=xoxp-112244252083-112987389558-112322797394-6aa31425be1725ee6ee0265a2dff1236
messageType.5.accountParamId=88
messageType.5.expressionMessageExtract=<<END
    pos = message.toLowerCase().indexOf("bg");
    if (pos >= 0)
        return message.substring(0, pos) + message.substring(pos + 2);
    return null;
END

MessageTypeHelpDesk (Плагин BGBilling)

Интеграция с HelpDesk

process helpdesk

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

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

messageType.<id>.title=<title>
messageType.<id>.billingId=<billingId>
messageType.<id>.class=MessageTypeHelpDesk
messageType.<id>.user=<user>
messageType.<id>.pswd=<pswd>
messageType.<id>.processTypeId=<processTypeId>
messageType.<id>.openStatusId=<openStatusId>
messageType.<id>.closeStatusId=<closeStatusId>
messageType.<id>.costParamId=<costParamId>
messageType.<id>.statusParamId=<statusParamId>
messageType.<id>.autoCloseParamId=<autoCloseParamId>
messageType.<id>.pageSize=<pageSize>
messageType.<id>.newMessageEvent=<event>
# необязательные
messageType.<id>.markMessagesReadStatusIds=<readStatusIds>
# добавлять первое сообщение в описание процесса
messageType.<id>.addFirstMessageInDescription=1
# во время отладки ограничение синхронизацию одной темой
#messageType.<id>.topicId=<topicId>

Где:

  • <id> - код типа сообщения;

  • <billingId> - строковый идентификатор сервера биллинга;

  • <user> - пользователь биллинга, под которым BGERP будет производить периодическое сканирование тем для синхронизации;

  • <pswd> - пароль пользователя биллинга <user>;

  • <processTypeId> - тип создаваемого процесса;

  • <openStatusId> - код статуса, в который процесс переводится при открытии темы в биллинге;

  • <closeStatusId> - код статуса, в который процесс переводится при закрытии темы в биллинге;

  • <costParamId> - код текстового параметра процесса со стоимостью обращения;

  • <statusParamId> - код спискового параметра процесса со статусом темы, значения должны соответствовать занесённым в справочник BGBilling;

  • <autoCloseParamId> - код спискового параметра с флагом автозакрытия темы, должно быть одно значение 1=Да;

  • <pageSize> - количество отслеживаемых тем HelpDesk, можно выставить в 10000;

  • <event> - 1, если необходимо генерировать событие при поступлении нового сообщения в тему, при первичном импорте лучше установить в 0 - не генерировать;

  • <readStatusIds> - коды статусов процессов, при переводе в которые все сообщения помечаются прочитанными (необязательно).

Тип процесса <processTypeId> должен существовать, у него должны присутствовать указанные выше параметры и статусы, переходы в которые должны быть разрешены.

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

messageType.2.title=HD
messageType.2.billingId=bg
messageType.2.class=MessageTypeHelpDesk
messageType.2.user=bgcrm
messageType.2.pswd=bgcrm
messageType.2.processTypeId=3
messageType.2.costParamId=23
messageType.2.statusParamId=25
messageType.2.autoCloseParamId=24
messageType.2.openStatusId=1
messageType.2.closeStatusId=4
messageType.2.pageSize=100000
messageType.2.newMessageEvent=1
messageType.2.markMessagesReadStatusIds=2,3,4,5

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

For message type can be defined different search modes (1) and contact savers (2)

message process

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

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=<searchModeClassName>

Где:

  • <searchModeId> - уникальный числовой идентификатор режима поиска, начиная с 1;

  • <title> - наименование режима поиска;

  • <searchModeclassName> - имя класса, реализующего режим поиска.

Search modes, marked as Auto are automatically and parallel running when a message is opened.

Значение <searchModeClassName>, что ищет Конфигурация и пример

MessageTypeSearchCustomerByTitle
Контрагента по наименованию, для любого типа сообщения.

i0111

Нет дополнительных параметров.
Пример:

messageType.1.search.{@inc:cnt}.title=Customer by Title
messageType.1.search.{@cnt}.class=MessageTypeSearchCustomerByTitle

MessageTypeSearchCall
Auto
Поиск контрагента в базе BGERP по номеру телефона звонящего для типа сообщения Call. Поиск производится по точному совпадению.

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=MessageTypeSearchCall
messageType.<id>.search.<searchModeId>.commands=<commands>
# необязательный параметр
messageType.<id>.search.<searchModeId>.expressionNumberPreprocess=<jexl>

Где:

  • <commands> - команды разделённые точкой с запятой, в данный момент поддержана customerByPhoneParam:<paramIds>, где <paramIds> - коды параметров типа "телефон" в биллинге через запятую;

  • <jexl> - JEXL выражение для предобработки номера перед поиском с его использованием, исходный номер передаётся переменной numberFrom.

Пример:

messageType.1.search.{@inc:cnt}.title=Customer by Phone
messageType.1.search.{@cnt}.class=MessageTypeSearchCall
messageType.1.search.{@cnt}.commands=customerByPhoneParam:10
messageType.1.search.{@cnt}.expressionNumberPreprocess=if (numberFrom.length() == 11) { numberFrom = numberFrom.substring(1) }; return numberFrom;

MessageTypeSearchEmail
Auto
Поиск контрагента по Email для типа сообщения Email.

Нет дополнительных параметров.
Пример:

messageType.1.search.{@inc:cnt}.title=Customer by EMail
messageType.1.search.{@cnt}.class=MessageTypeSearchEmail

BGBillingMessageTypeSearchEmail
Auto
Поиск договора в базе BGBilling по EMail парамеру для типа сообщения EMail.

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=BGBillingMessageTypeSearchEmail
messageType.<id>.search.<searchModeId>.billingId=<billingId>
messageType.<id>.search.<searchModeId>.paramIds=<paramIds>

Где:

  • <billingId> - идентификатор биллинга;

  • <paramIds> - коды параметров договора т ипа EMail через запятую.

Пример:

messageType.1.search.3.title=Договор по параметру EMail
messageType.1.search.3.class=BGBillingMessageTypeSearchEmail
messageType.1.search.3.billingId=bitel
messageType.1.search.3.paramIds=7

BGBillingMessageTypeSearchCall
Auto
Поиск договора в базе BGBilling по номеру телефона звонящего для типа сообщения Call. Поиск производится по подстроке.

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=BGBillingMessageTypeSearchCall
messageType.<id>.search.<searchModeId>.billingId=<billingId>
messageType.<id>.search.<searchModeId>.commands=<commands>
# необязательный параметр
messageType.<id>.search.<searchModeId>.expressionNumberPreprocess=<jexl>

Где:

  • <billingId> - идентификатор биллинга;

  • <commands> - команды, в данный момент поддержана contractByPhoneParam:<paramId>, где <paramId> - идентификатор параметра типа "телефон" в биллинге;

  • <jexl> - JEXL выражение для предобработки номера перед поиском с его использованием, исходный номер передаётся переменной numberFrom.

Пример:

messageType.1.search.1.title=Договор по номеру
messageType.1.search.1.class=BGBillingMessageTypeSearchCall
messageType.1.search.1.billingId=bg
messageType.1.search.1.commands=contractByPhoneParam:27
messageType.1.search.1.expressionNumberPreprocess=if (numberFrom.length() == 11) { numberFrom = numberFrom.substring(1) }; return numberFrom;

BGBillingMessageTypeSearchContractByTitleAndComment
Поиск договора в базе BGBilling по номеру и комментарию, для любого типа сообщения.

i0112
messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=BGBillingMessageTypeSearchContractByTitleAndComment
messageType.<id>.search.<searchModeId>.billingId=<billingId>

Где:

  • <billingId> - идентификатор биллинга.

Пример:

messageType.1.search.2.title=По номеру/примечанию
messageType.1.search.2.class=BGBillingMessageTypeSearchContractByTitleAndComment
messageType.1.search.2.billingId=bg

Contact Savers

Contact Saver has defined in a message type configuration:

messageType.<id>.saver.class=<saverClassName>
Значение <saverClassName>, что делает Конфигурация и пример

MessageTypeContactSaverPhone
Save the calling phone number to parameter with type phone of process or a linked customer

messageType.<id>.saver.class=MessageTypeContactSaverPhone
messageType.<id>.saver.paramId=<paramId>

Where:

  • <paramId> - the parameter ID

Example:

messageType.1.saver.class=MessageTypeContactSaverPhone
messageType.1.saver.paramId=37

MessageTypeContactSaverEmail
Сохранение EMail в параметр типа "email" контрагента. Возможно сохранение домена либо только EMail а.

messageType.<id>.saver.class=MessageTypeContactSaverEmail
messageType.<id>.saver.paramId=<paramId>

Где:

  • <paramId> - код параметра контрагента типа "EMail".

Пример:

messageType.{@inc:cnt}.saver.class=MessageTypeContactSaverEmail
messageType.{@cnt}.saver.paramId=27

BGBillingMessageTypeContactSaverPhone
Сохранение телефона в параметр типа "телефон" договора биллинга.

messageType.<id>.saver.class=BGBillingMessageTypeContactSaverPhone
messageType.<id>.saver.paramId=<paramId>
messageType.<id>.saver.format=<format>

Где:

Пример:

messageType.{@inc:cnt}.saver.class=BGBillingMessageTypeContactSaverPhone
messageType.{@cnt}.saver.paramId=27

Tags

Colored message tags allow to separate messages in process tab. Example of configuration:

tag.1.title=Access
tag.1.color=red
tag.2.title=Requirements
tag.2.color=green
tag.3.title=TODO
tag.3.color=magenta

Possible Processes

You can see a sample configurations in Demo System. For doing that open the message with subject Kernel Message Possible Process Unprocessed message in queue. Server configuration with Possible Processes for that has the name Kernel Message Possible Process.

To configure Possible Processes to be found during message processing add to configuration following blocks:

message.possible.process.<id>.class=<class>
message.possible.process.<id>.color=<color>

Where:

  • <id> - unique block’s numeric ID, found processes are sorted by the IDs

  • <color> - optional HTML color for table rows with found processes

  • <class> - search type, one of the following values:

    • MessagePossibleProcessSearchMessageFrom - processes with messages from the same from address (E-Mail sender or calling number) as the processed message.

    • MessagePossibleProcessSearchFoundLinks - processes with the same links as found for the processed message.

    • MessagePossibleProcessSearchFoundLinksCustomerAddressCity - processes with a list parameter values, matching to city IDs of address parameter of found customers. That type requires additional properties set:

      • processCityParamId, ID of the list parameter.

    • BGBillingMessagePossibleProcessSearchFoundLinksContractAddressCity - processes with a list parameter values, matching to city IDs of address parameter of found contracts in BGBilling system. That type requires additional properties set:

      • processCityParamId, ID of the list parameter;

      • contractAddressParamId.<billingId>, ID of address parameter in BGBilling system with ID <billingId>.

If no block is defined then a single ones with class MessagePossibleProcessSearchMessageFrom is added.

Scheduler

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

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

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

Usage

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

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

Уведомление о количестве необработанных сообщений выводится в области уведомлений.

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

messages

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

message process

Либо для E-Mail.

message process email

In the left bottom area during message processing are shown possible processes, that can be assinged for the message using set links.

message process possible process

Работа в процессе

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

process messages

Для создания сообщения в рамках процесса используйте кнопку Создать.

Доступен фильтр по сообщениям со вложениями и тегам. Теги позволяют маркировать каждое сообщение определёнными метками, позволяющими их позже легко найти, например: "TODO", "Реквизиты".

Кнопка M рядом с каждым сообщением вызывает всплывающее меню с операциями:

  • Вкл./выкл. разрывы строк - перенос длинных строк в сообщениях либо отображение скроллинга;

  • Теги - установить теги на выбранное сообщение.

  • Изменить процесс на - привязать сообщение к другому процессу:

  • Ответить - создать новое сообщение, являющееся ответом на выбранное и также привязанное к текущему процессу;

  • Редактировать - редактировать сообщение, если тип поддерживает;

  • Удалить - удалить сообщение, если тип поддерживает.

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