Ранее мы уже рассматривали механизмы создания лида и создания компании и сделки через API в коробочной версии Битрикс24. В данной статье я опубликую несколько полезных функций, которые позволяют осуществить предварительный поиск компании по номеру телефона или электронной почте в CRM Битрикс24. Все примеры относятся к коробочной версии продукта и не затрагивают REST API.
Суть проблемы, которую мы решаем в данном случае состоит в следующем: приведенные выше решения для создания лидов и сделок не учитывают того, что в CRM уже могут существовать компании с точно такими же контактными данными. В случае с лидами — будет создан новый лид, который пройдет по стадиям воронки и на этапе конвертации его в сделку и компанию может появиться дубликат уже существующей в рамках вашего портала компании. Причина проста: на этапе конвертации лида никаких проверок на дубли не осуществляется, оно и понятно: менеджер некоторое количество времени общался с потенциальным клиентом, не выявил проблем и решил конвертировать лид.
Как избежать появления дубликатов в CRM в данном случае. Разберем теорию вопроса, она максимально проста: на этапе конвертации выполнять проверки на дубликаты — поздно, данные проверки должны выполняться в процессе создания лида (или сделки).
От теории переходим к практике. С поиском по телефону есть сложности: номер может быть написан в самых различных форматах. Например:
Следовательно, для корректного поиска нам потребуется преобразовать значения в некий общий формат. Оговорюсь, что данное решение не универсально и корректно работает только для российских номеров. Суть преобразований проста: отбрасываем все спецсимволы и оставляем только только цифры, если цифр более 10-ти, то берем только последние десять. Готовая функция:
function translate_phone($phone){ $result = preg_replace('/[^0-9,.]/', '', $phone); if(strlen($result) > 10){ $result = substr($result, (strlen($result) - 10)); } return $result; }
Пример вызова функции и результаты:
$phone_number = translate_phone("+7 123 456 7890"); //вывод 1234567890
Функция для поиска компании по номеру телефона или e-mail:
function company($type, $value){ $searchCondition = '=%VALUE'; if($type == 'PHONE') { $searchCondition = '%VALUE'; } $arFilter = array( 'FM' => array( array( 'TYPE_ID' => $type, $searchCondition => $value ) ), 'CHECK_PERMISSIONS' => 'N' ); $obCompany = \CCrmCompany::GetListEx( array('ID' => 'ASC'), $arFilter, false, false, array('*') ); $arResult = []; while($arCompany = $obCompany->Fetch()){ $arResult[] = $arCompany; } return $arResult; }
Пример вызова:
//поиск по номеру телефона $result = company("PHONE", $phone_number); //поиск по электронной почте $result = company("EMAIL", $mail);
Общая логика работы должна быть следующей:
Пример кода:
//поиск по номеру телефона $search = company("PHONE", translate_phone($_REQUEST['phone'])); $company_id = $search[0]['ID']; if (!empty($company_id)) { $comments = "Компания была найдена по номеру телефона"; $manager_id = $search[0]['ASSIGNED_BY_ID']; } //поиск по e-mail if (empty($company_id)) { $search = company("EMAIL", $_REQUEST['email']); $company_id = $search[0]['ID']; if (!empty($company_id)) { $comments = "Компания была найдена по E-MAIL"; $manager_id = $search[0]['ASSIGNED_BY_ID']; } } /* запускаем создание компании и лида */ //запись в таймлайн if ($comments) { \Bitrix\Crm\Timeline\CommentEntry::create( array( 'TEXT' => $comments, 'SETTINGS' => array('HAS_FILES' => 'N'), 'AUTHOR_ID' => 1, //ID пользователя, от которого будет добавлен комментарий 'BINDINGS' => array(array('ENTITY_TYPE_ID' => 1, 'ENTITY_ID' => $LEAD_ID)) )); }
В переменной manager_id
содержится идентификатор ответственного за компанию менеджера. Подразумевается, что на этапе создания лида он может быть назначен ответственным.
Отдельное внимание тут стоит уделить небольшой, но крайне полезной фиче: записи комментариев в таймлайн (историю) лида или сделки. Обратите внимание на ключ BINDINGS
. Это комментария привязка к сущности CRM: ENTITY_TYPE_ID
— тип сущности CRM (1- Лид, 2 — Сделка), ENTITY_ID
— идентификатор элемента, к которому будут осуществлена привязка комментария.
Выглядеть такая запись будет следующим образом:
IMHO, поиск по маске слишком ресурсозатратен. Намного быстрее искать через crm.duplicate.findbycomm. При этом, crm.duplicate.findbycomm находит контакты без предварительного преобразования искомых данных к единому формату.
crm.duplicate.findbycomm — хороший метод решения задачи. Но далеко не универсальный. Попробуйте воспользоваться им на большой выборке данных, я думаю вы поймете что с ним не так.
Если в вашем случае он решает поставленную задачу, то можно только порадоваться.
Большое спасибо за данное решение.
Взял за основу и дописал логику под свою задачу.