пятница, 2 октября 2020 г.

Битрикс24 КП. CRM. Как сделать своё правило для обработки писем?

Самая главная проблема КП в том, что проще приспособиться к его алгоритму работы, чем реализовать что-то своё нестандартное )))

Теория, алгоритм

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

Теперь потестируем и попопробуем понять как битрикс обрабатывает письма и создаёт Лиды:
1. получается письмо с почтового ящика
2. емейл отправителя этого письма ищется в Контакте, Компании, в Лидах
3. если найден в Компании/Контакте, то ищется Сделка  и... дальше нам пока неинтересно ))) более всего мне интересно было, как создаётся/меняется Лид
4. если найден незакрытый Лид, то письмо (вернее Дело) прикрепляется туда
если Лид в закрытом статусе - то создаётся Повторный Лид
5. ну и если такого емейла не было найдено нигде, то просто создаётся новый Лид

Теперь сопоставляем с тем, как хочет клиент:
1. если найден незакрытый Лид, и письмо является частью цепочки общения из этого Лида, то письмо надо прикреплять к этому Лиду.
2. если письмо не является частью цепочки, то надо создавать новый Лид, а не лепить все письма от одного отправителя в один открытый Лид.

Когда такое нужно, спросите вы? А, например, когда у нас не КП для магазина, а система обработки Обращений в стиле техпода. А теперь подумаем:
* один отправитель может прислать два разных вопроса как на один support-емейл, так и на разные
* один Лид (в наших терминах он уже превратился в Обращение) может иметь в цепочке писем разных сотрудников техпода, обслуживающих этот Лид
* письма от обоих сотрудников техпода должны быть в одной цепочке писем этого Лида, также как и ответы исходного отправителя вопроса
* отправитель может параллельно прислать другой вопрос, и это будет другой Лид, потому что это не ответ на предыдущее письмо от менеджера

Как это сделано

Для получения правил обработки писем модуль Почта использует CMailFilter:: GetFilterList. В этом же методе находится событие OnGetFilterList модуля mail
По коду метода можно увидеть, что возвращаемый массив из вашего обработчика этого события будет подмешан в существующий массив правил из ядра Битрикс и возвращён в качестве результата работы метода CMailFilter:: GetFilterList.

Модуль Почта добавляет туда одно imap правило

То есть непосредственно метод ядра imapEmailMessageAdd и осуществляет распределение по указанному правилу. Данное правило привязано к нашему почтовому ящику, что можно увидеть 
в Администрирование -- Сервисы -- Почта -- Правила. Однаком сменить эту привязку через интерфейс не получается, ибо интерфейс, кажется, работает только с pop3-правилами и ящиками.

DIY

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

Делай два. Из-за невозможности адекватного изменения правил через админку - мы приходим к непосредственному использованию API. Для получения всех почтовых ящиков в системе можно использовать \Bitrix\Mail\MailboxTable, а для работы с привязками правил - \Bitrix\Mail\MailFilterTable
Добавляем к своему ящику новоиспечённое правило.

1. Наше правило должно быть выше остальных для нашего ящика. То есть сортировка должна быть меньше, чем у нижестоящих правил. Ну или можно удалить все остальные правила вообще.
2. Если сохраняете другие правила - полезно поставить ACTION_STOP_EXEC в Y, чтобы последующие правила не выполнялись. Но это, конечно, если вы хотите полностью переделать битриксовый алгоритм работы.

Делай три. Самое "интересное" в данном деле - это разобраться как работает родной метод обработки писем; к сожалению, оставлю это на ваше усмотрение (мой код принадлежит организации, в которой я работаю). Разве что подскажу, что для выполнения описанного выше алгоритма для формирования Обращений полезно будет обратить своё внимание на переменную $forceNewLead внутри родного метода CCrmEmail::imapEmailMessageAdd.

Удачи вам в ваших свершениях!

P.S. Большое спасибо за помощь в освоении данной темы хочу выразить Рыкову Ивану, который дал мне начальный пинок "куда смотреть" )