18 октября 2016

Хаос в контактах

Как привести номера клиентов в CRM к единому формату
Александр Куц
Аналитик корпоративных систем
CRM-система упрощает работу сотрудников, совершенствует качество сервиса и помогает больше продавать. С ее помощью вы можете сформировать и вести базу клиентов, быстро оформлять сделки, оценивать эффективность коммерческого отдела. Основное назначение системы — автоматизировать процессы. Но иногда это не удается по очень простой причине.
Все дело — в контактах, которые нужно привести в порядок. CRM постоянно пополняется городскими и мобильными номерами клиентов — одни из них вводят менеджеры, другие подгружаются из форм на сайтах, третьи попадают в систему из писем, приходящих на почту. Выглядят они абсолютно по-разному: со скобками, дефисами, пробелами, плюсами, кодами, запятыми и т.п. — чтобы разобраться, где мобильный, а где городской номер, часто приходится тратить уйму времени. Особенно, когда клиенты из разных регионов. А если один и тот же номер дублируется дважды, но в разной форме? Какая с такими проблемами автоматизация?

Мы поняли, что пока не приведешь номера к единому формату, автоматизировать ничего не получится. Поэтому разработали бизнес-процесс (здорово, что в «Битрикс24» есть такая возможность!). Приведение номеров к единому формату снижает вероятность ошибки менеджера при наборе телефона клиента и делает возможным автоматический звонок по клику из CRM.

Суть бизнес-процесса — в исправлении новых и ранее введенных номеров. Как мы это сделали, делимся с вами.
Как работает бизнес-процесс
Вы вводите новый номер или изменяете тот,
что уже есть в системе
CRM автоматически производит посимвольный
разбор введенного номера и приводит его к виду

+7 (ХХХ) ХХХ-ХХ-Х
Исключение составляют короткие и добавочные номера. Короткий номер (меньше 11 цифр) отражается таким, как есть. Добавочный указывается в скобках после основного номера, например, +7 (ХХХ) ХХХ-ХХ-ХХ (2315).
Сложность реализации
1. Определение префикса номера
Первая сложность состоит в том, что нужно однозначно определить, какие цифры являются префиксом номера. Если префикс отсутствует, система должна это заметить и дополнить номер.

Рассмотрим пример. Цифра 8, с которой начинается номер, может быть как префиксом (вместо +7), так и частью кода города (например, 8352). В первом случае цифру нужно заменить, во втором — добавить. Еще один важный момент: нужно учитывать, что у разных стран разные префиксы в телефонных номерах. Если менеджер вводит номер с российским кодом, например, 495… или 937..., CRM должна добавить префикс +7. Однако если номер украинский, нужно добавить другой префикс — 37.
2. Определение добавочного номера
Еще больше усложняют задачу добавочные номера, которые могут быть представлены самым разным образом. Система должна определить, где кончается основной номер и начинается добавочный.

Особенность реализации бизнес-процесса в «Битрикс24» — в том, что по запросу телефона из полей «Лид» или «Контакт» при наличии нескольких номеров процедура извлекает сплошную текстовую строку с разделителями в виде запятой. Но дело в том, что добавочный номер тоже может быть введен через запятую. Поэтому от универсального разделения необходимо было отказаться.

Для получения, а также последующей записи каждого номера пришлось использовать php-процедуру прямого доступа к таблице хранения данных по их ID.
Алгоритм бизнес-процесса
Алгоритм бизнес-процесса включает 3 блок-схемы.
Управление данными
С помощью PHP-процедуры выполняется запрос к базе лидов или контактов.
PHP-код получает из базы лидов и контактов номера телефонов и их идентификаторы. Для их разделения мы решили использовать квадратные скобки — [ и ]. Это нужно, чтобы при обработке система понимала, где номер, а где его идентификатор.

Пример: +7 (495) 332-16-98[1215]909-723-4167[1217]
Каждому номеру присваивается тип (num_type) — work, mobile и др., а также длина (num_len).
Запускаем цикл посимвольного перебора полученной строки номеров. Переменная «Счетчик цикла» (i) меньше длины строки номеров (num_len).
Очередной i-ый символ номера телефона (sumb1) считываем в блоке действия «Чтение следующего символа». Проверяем, не является ли он специальным символом разделения номеров.
Если очередной символ — [, значит мы дошли до конца номера телефона. Изменим значение управляющего переключателя (flag) с 0 на 1, добавим 1 к счетчику цикла (i) и прочитаем следующий символ после [. Символы, считываемые после открывающей квадратной скобки, будут относиться к идентификатору номера.

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

Если в номере меньше 11 символов, оставляем его без изменений. Для этого проверяем позицию последнего символа в номере (pos). Если pos меньше 11, запись номера в таблицу контактов и лидов пропускается.

Если в номере больше 11 символов (есть добавочный номер), то добавляем закрывающую скобку — ). В итоге формируется номер такого вида: 7ХХХХХХХХХХ (ХХХХ).
Чтобы привести номер к единому виду — +7 (ХХХ) ХХХ-ХХ-ХХ (ХХХХ), разбиваем его на 4 сегмента функцией substr. Получаем строковые переменные: kod, part1, part2 и part3. Собираем их в строку номера, добавляем +, скобки и дефисы. Порядок сборки можно поменять и получить любой другой шаблон номера.
После этого определяем тип номера. Для этого из строки «Тип номера» (num_type) считываем сначала первый символ, который отражает длину номера, записываем его в переменные «Длина типа» (len_type) и «Записать тип номера» (num_value_type). Затем прочитываем тип нужной длины, а переменную «Записать комплексную строку типа» (num_complex_type) формируем, добавляя к началу «PHONE_». Получаем PHONE_WORK, PHONE_MOBILE и т.п. Все эти действия необходимо проделать, чтобы записанный в таблицу номер имел конкретный тип.
Заносим данные в нужную ячейку таблицы согласно идентификатору номера и параметрам записи.
Считываем символ, следующий после ]. Затем очищаем содержание переменных «Номер телефона» (number_tel), «ID телефона» (id_tel) и «Позиция символа в номере» (pos).

Если очередной символ не является разделителем, ничего не делаем и переходим к посимвольному разбору.
Посимвольный разбор строки
Так выглядит алгоритм удаления лишних, ничего не значащих символов — +, (, ), - и других.
По значению переменной «Переключатель» (flag) определяем, с чем сейчас работаем — с номером или с идентификатором.
Если работаем с номером, ведем подсчет позиции символа (pos). Номер не должен превышать 11 символов (все, что свыше, — это добавочный номер, его мы не трогаем).

Если в телефонной строке меньше 11 символов, определяем тип символа номера (sumb1). Если это цифра, добавляем ее в строковую переменную «Номер телефона» (number_tel). После этого прибавляем 1 к позиции символа в номере (pos).
Если позиция символа в номере (pos) равна 11, то после номера ставим пробел и открывающую скобку. Цифры, указанные после скобки, оформляются как добавочный номер, пока не встретится символ [, обозначающий конец телефона.

Исключение в данном случае составляет запятая. Если она встречается не на первой позиции, то также добавляется в номер как разделитель для двух и более добавочных номеров.
Если мы работаем с идентификатором, считываем символ номера телефона (sumb1) и добавляем его в переменную «ID_телефона» (id_tel) в конец.
Определение начала номера
Как мы писали выше, самое сложное — определить, что делать с началом номера. Телефон может начинаться с +7, 8, 37, (909) и других подобных комбинаций. При этом 8 может быть как префиксом, заменяющим +7, так и самостоятельной значащей цифрой кода города, например (8352). То есть только по цифре 8 на первой позиции мы не можем однозначно решить, что делать: менять ее на 7 или добавлять 7 перед 8. Кроме того в нашей CRM фигурируют украинские номера, которые начинаются с 37.

Для определения начала номера мы разработали алгоритм:
Если номер начинается с +7 или 7, убираем +, оставляем только цифру.
Если номер начинается с 3, оставляем его без изменений.
Если номер начинается с 8 или с (8), проводим дополнительную проверку, чтобы выяснить, что это за цифра — префикс или часть кода города.
  • Если первые две цифры — 89 или 88, заменяем 8 на 7.
  • Если вторая цифра не 8 и не 9, добавляем 7 перед 8.
Если номер начинается с любой другой цифры, добавляем вперед 7 и увеличиваем счетчик символов номера на 1.
Блок-схема получилась объемной. Показываем на двух скриншотах. На первом — начало алгоритма, на втором — конец.
Алгоритм используется, когда уже прочитаны и очищены от незначащих символов первые цифры номера, поскольку необходимо понять их комбинации.

Вариант 1

Если счетчик символов равен 3, начинаем проверку:

Считываем первый символ номера. В зависимости от его значения выбираем продолжение:

  • 8 — проводим дополнительную проверку.
  • 7 — оставляем номер без изменений.
  • 3 — оставляем номер без изменений.
  • Другой символ — добавляем 7 к началу номера.

Вариант 2


Если первый символ — 8, считываем уже не один, а два первых символа и проверяем:

  • 89 или 88 — меняем 8 на 7.
  • Другой символ — добавляем 7 перед 8.

В результате получаем сформированную 11-символьную строку (если номер не короткий) без лишних символов и пробелов. Номер начинается или с 7, или с 37.

Когда все преобразования очередного символа выполнены, увеличиваем счетчик цикла (i) на 1 и переходим к началу цикла.
Пока алгоритм несовершенный, поскольку не учитывает некоторые редкие сочетания, например, 84 и 83. В дальнейшем мы планируем это исправить, а также добавить дополнительный анализ исходного номера на наличие скобок и пробелов. Скажем, в комбинации «8(495)» 8 можно будет заменять на +7, а в комбинации «(849)» перед 8 добавлять 7.

Сейчас бизнес-процесс запущен только в нашей корпоративной CRM, мы плотно продолжаем над ним работать. Однако совсем скоро мы планируем выпустить полезное дополнение к «Битрикс24» в свет. Хотите сделать подарок вашему коммерческому отделу и повысить клиентский сервис? Закажите автоматизацию бизнеса с приведением телефонных номеров к единому формату. Избавьтесь от хаоса :)
1224

Поделитесь материалом с друзьями и коллегами

Комментарии к статье

+7 499 653 78 83