Сообщения

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

message 1

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

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

message 1

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

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

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

Где:

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

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

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

Опциональные параметры:

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

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

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

Где:

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

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

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

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

messageType.<id>.saver.class=<saverClassName>

На скриншоте цифрой 1 изображены режимы поиска, 2 - режимы сохранения контакта.

message 3

Режимы поиска и сохранения могут быть специфичны для типа сообщения.

Режимы поиска

Таблица. Режимы поиска

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

ru.bgcrm.dao.message.MessageTypeSearchCustomerByTitle

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

message 4

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

Пример:

messageType.1.search.2.title=Контрагент по названию
messageType.1.search.2.class=ru.bgcrm.dao.message.MessageTypeSearchCustomerByTitle

ru.bgcrm.dao.message.MessageTypeSearchEmail

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

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

Пример:

messageType.1.search.1.title=Авто по EMail
messageType.1.search.1.class=ru.bgcrm.dao.message.MessageTypeSearchEmail

ru.bgcrm.dao.message.MessageTypeSearchCall

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

Поиск производится по точному совпадению.

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

Где:

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

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

Пример:

messageType.1.search.1.title=Авто контрагент (номер)
messageType.1.search.1.class=ru.bgcrm.dao.message.MessageTypeSearchCall
messageType.1.search.1.commands=customerByPhoneParam:10
messageType.1.search.1.stringExpressionNumberPreprocess=if( numberFrom.length() == 11 ){ numberFrom = numberFrom.substring(1)}; return numberFrom;

ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchEmail

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

message 5

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchEmail
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=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchEmail
messageType.1.search.3.billingId=avantys
messageType.1.search.3.paramIds=7

ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchCall

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

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchCall
messageType.<id>.search.<searchModeId>.billingId=<billingId>
messageType.<id>.search.<searchModeId>.commands=<commands>
# необязательный параметр
messageType.<id>.search.<searchModeId>.stringExpressionNumberPreprocess=<jexl>

Где:

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

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

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

Пример:

messageType.1.search.1.title=Авто (номер)
messageType.1.search.1.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchCall
messageType.1.search.1.billingId=bg
messageType.1.search.1.commands=contractByPhoneParam:27
messageType.1.search.1.stringExpressionNumberPreprocess=if( numberFrom.length() == 11 ){ numberFrom = numberFrom.substring(1)}; return numberFrom;

ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchContractByTitleAndComment Поиск договора в базе ABilling по номеру и комментарию, для любого типа сообщения. message 6

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchContractByTitleAndComment
messageType.<id>.search.<searchModeId>.billingId=<billingId>

Где:

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

Пример:

messageType.1.search.2.title=По номеру/примечанию
messageType.1.search.2.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchContractByTitleAndComment
messageType.1.search.2.billingId=bg

ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchContractByDialUpLogin Поиск договора в базе ABilling по логину либо алиасу DialUp модуля.

messageType.<id>.search.<searchModeId>.title=<title>
messageType.<id>.search.<searchModeId>.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchContractByDialUpLogin
messageType.<id>.search.<searchModeId>.billingId=<billingId>
messageType.<id>.search.<searchModeId>.moduleId=<moduleId>

Где:

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

  • <moduleId> - код экземпляра модуля DialUp.

Пример:

messageType.1.search.3.title=По логину DialUp
messageType.1.search.3.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeSearchContractByDialUpLogin
messageType.1.search.3.billingId=bg
messageType.1.search.3.moduleId=1

Режимы сохранения

Таблица. Режимы сохранения

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

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

messageType.<id>.saver.class=ru.bgcrm.dao.message.MessageTypeContactSaverEmail
messageType.<id>.saver.paramId=<paramId>

Где:

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

Пример:

messageType.1.saver.class=ru.bgcrm.dao.message.MessageTypeContactSaverEmail
messageType.1.saver.paramId=27

ru.bgcrm.dao.message.MessageTypeContactSaverPhone Сохранение телефона в параметр типа "phone" контрагента. Возможно сохранение домена либо только EMail а.

messageType.<id>.saver.class=ru.bgcrm.dao.message.MessageTypeContactSaverPhone
messageType.<id>.saver.paramId=<paramId>

Где:

Пример:

messageType.1.saver.class=ru.bgcrm.dao.message.MessageTypeContactSaverPhone
messageType.1.saver.paramId=37
messageType.1.saver.format=13

ru.bgcrm.plugin.bgbilling.dao.MessageTypeContactSaverPhone Сохранение телефона в параметр типа "телефон" договора биллинга.

messageType.<id>.saver.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeContactSaverPhone
messageType.<id>.saver.paramId=<paramId>
messageType.<id>.saver.format=<format>

Где:

Пример:

messageType.1.saver.class=ru.bgcrm.plugin.bgbilling.dao.MessageTypeContactSaverPhone
messageType.1.saver.paramId=27

Сообщения EMail

<messageTypeClassName>=ru.bgcrm.dao.message.MessageTypeEmail.

Дополнительные параметры:

messageType.<id>.email=<email>
messageType.<id>.host=<host>
messageType.<id>.login=<login>
messageType.<id>.pswd=<pswd>
messageType.<id>.folderIn=<inFolder>
messageType.<id>.folderProcessed=<processedFolder>
messageType.<id>.folderSkipped=<skippedFolder>
messageType.<id>.folderSent=<sentFolder>
#
# IMAP SSL протокол
#messageType.<id>.store=imaps
# порт, если не указано - 143 для IMAP, 993 для IMAP SSL
#messageType.<id>.port=
# отладка почтового обмена IMAP и SMTP
#messageType.<id>.debug=1
#
# параметры SMTP, добавляются после префикса идентично опциям из основной конфигурации
messageType.<id>....
# необязательные параметры
messageType.<id>.folderInProcessLinked=<inProcessedFolder>
messageType.<id>.signExpression=<signExpression>
messageType.<id>.signFooter=<signFooter>
# иной адрес отправителя письма
messageType.<id>.from=<from>
# адрес для ответов в письме
messageType.<id>.replayTo=<replayTo>
# обработка входящего сообщения с помощью события
messageType.<id>.processMessageWithEvent=<processMessageWithEvent>

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

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

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

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

  • <signFooter> - строка подписи письма при отправке его через данный тип сообщения.

Example 1. по умолчанию:

Сообщение подготовлено системой Avantys ERP (https://avantys.group/products/avantys-erp).

Не изменяйте, пожалуйста, тему сообщения и не цитируйте данное сообщение в ответе!

Историю переписки вы можете посмотреть в приложенном файле History.txt

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

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

messageType.1.title=billing@avantys.ru
messageType.1.class=ru.bgcrm.dao.message.MessageTypeEmail
messageType.1.email=billing@avantys.ru
messageType.1.host=imap.ufamail.ru
messageType.1.login=billing@avantys.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=NEW_LINE + user.getTitle() + NEW_LINE + "Служба
технической поддержки" + NEW_LINE + "ОАО \"Инет\"" + NEW_LINE + "тел. 2232333" +
NEW_LINE + "email. mastera@inet.ru" + NEW_LINE
messageType.1.mail.transport.protocol=smtp
messageType.1.mail.smtp.user=billing@avantys.ru
messageType.1.mail.smtp.host=smtp.ufamail.ru
messageType.1.mail.smtp.pswd=******

Быстрый ответ

Полученные по E-Mail уведомления о новых сообщениях процесса могут быть использованы для быстрого ответа на них. Для этого в тему уведомлений добавляется маркер QA:код сообщения. Быстрый ответ может быть произведён на любой тип сообщения и идентичен написанию ответа из интерфейса ERP. Пользователь идентифицируется по EMail, сохранённому в параметре типа EMail, код которого указывается в опции quickAnswerEmailParamId типа сообщения.

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

Отправка уведомлений в конфигурации типа процесса. На адрес EMail указанный в параметре исполнителей с кодом 21 отправляется письмо. В тему добавляется QA маркер для быстрого ответа.

onProcessEvent.5.events=messageAdded
onProcessEvent.5.doExpression=<<END
 text = "Новое сообщение в процессе, в котором вы числитесь исполнителем." +
 NEW_LINE2 + "Сообщение:" + NEW_LINE +
 event.getMessage().getText() +
 NEW_LINE2 + "Открыть процесс: http://erp.core.ufanet.ru/user/process#" +
process.getId() +
 NEW_LINE2 + "Для быстрого ответа на сообщение ответьте на это письмо
сохранив идентификатор в теме.";
 subject = "Новое сообщение в процессе #" + process.getId() +
 " [" + (process.getDescription().length() < 15 ? process.getDescription() :
process.getDescription().substring(0, 15) + "..") + "] " +
 " QA:" + event.getMessage().getId();
 emailNotifyExecutors(21, subject, text);
END

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

onProcessEvent.6.events=executorsChanged
onProcessEvent.6.doExpression=<<END
 text = "Изменён состав исполнителей процесса." + NEW_LINE2;
 searchResult = new("ru.bgcrm.model.SearchResult");
 searchResult.getPage().setPageIndex(-1);
 dao = new("ru.bgcrm.dao.message.MessageDAO", conSet.getConnection());
 dao.searchMessageList(searchResult, process.getId(), null, 1, null, null, nul
l, null, null, true);
 lastMsg = null;
 for (m : searchResult.getList()) {
 if (lastMsg == null) lastMsg = m;
 text += "Входящее сообщение #" + m.getId() + NEW_LINE;
 text += "##########################" + NEW_LINE;
 text += m.getText() + NEW_LINE2;
 }
 subject = "#" + process.getId() +
 " [" + (process.getDescription().length() < 30 ? process.getDescription() :
process.getDescription().substring(0, 30) + "..") + "] ";
 if (lastMsg != null) subject += " QA:" + lastMsg.getId();
 emailNotifyExecutors(21, subject, text);
END

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

messageType.<id>.title=Наименование
messageType.<id>.class=ru.bgcrm.dao.message.MessageTypeEmail...
messageType.<id>.quickAnswerEmailParamId=21

Сообщения Note

<messageTypeClassName>=ru.bgcrm.dao.message.MessageTypeNote.

Используются для добавления примечаний по ходу процесса.

message 7

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

#
messageType.100.title=Заметка
messageType.100.class=ru.bgcrm.dao.message.MessageTypeNote

Сообщения Call

<messageTypeClassName>=ru.bgcrm.dao.message.MessageTypeCall.

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

messageType.<id>.offerNumberFromParamId=<offerNumberFromParamId>

Где:

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

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

message 8

По занятому номеру система определяет какой из пользователей получил звонок и открывает для него сообщение для обработки. Для включения данного функционала в переменной createOnStart конфигурации сервера должен быть указан класс ru.bgcrm.event.listener.MessageTypeCallListener.

"Поставщиком" звонков может, выступить плагин Asterisk либо звонок может быть зарегистрирован внешним HTTP запросом класса ru.bgcrm.event.listener.MessageTypeCallRegister.

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

Получение новых сообщений и отправку созданных в ERP осуществляет класс ru.bgcrm.worker.MessageExchange, настройте его запуск в планировщике. Дополнительные опциональные параметры конфигурации задачи:

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

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

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

message 9

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

message 10

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

message 11

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

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

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

message 12

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

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

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

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

    • Другой существующий- по коду уже существующего процесса;

    • Независимую копию текущего - создаётся новый процесс, копия текущего, в него копируются все привязки;

    • Зависящую копию текущего - создаётся новый процесс, копия текущего и привязанный к нему с типом processDepend;

    • Порождённую копию текущего - создаётся новый процесс, копия текущего и привязанный к нему с типом processMade;

    • Ссылаемую копию текущего - создаётся новый процесс, копия текущего и привязанный к нему с типом processLink.

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

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

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

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

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

Генерация событий при поступлении входящих e-mail сообщений

Для генерации событий при поступлении входящих писем, в шаблоне e-mail сообщения необходимо заполнить поле processMessageWithEvent значением true.(По умолчанию: false)

...
messageType.{@msg}.processMessageWithEvent=true
...