Нормализация телефонных номеров триггером в RetailCRM

Нормализация телефонных номеров триггером в RetailCRM

RetailCRM Tips and Tricks by Alexey Erm

Часто телефонные номера из интеграций могут прилетать в очень разных форматах. Например:

8 916 123-4567
+7 (916) 123-45-67
7 916 123 45 67

На выходе хочется получить 79161234567

Так будет выглядеть результат работы триггера


С одной стороны, в шаблонах вы можете использовать фильтр и при выводе значения вместо {{ order.phone }} написать {{ order.phone|international_phone }}. С другой стороны, в базе у вас всё равно будет хранится значение в исходном формате. При выгрузке базы в файл, вам может быть сложно искать телефон, так как форматы из разных источников могут быть разными. Проблему можно решить нормализацией через API, но это потребует от вас наличие внешнего скрипта, подключенного по API к вашей системе. Альтернативно можно проделать нормализацию триггером.


Название: Нормализация телефона

Символьный код: phone-normalize

Событие: Изменение заказа

Условие:

// заказ создается или находится в группе статусов "Новый"
(changeSet.isCreate or order.status.group.code in ['new'])
// есть телефон или телефон изменился
and (order.phone != null or changeSet.hasChangedField("phone"))
// телефон содержит что-то кроме цифр
and order.phone matches '/[^\\d]/u'

Действие:

Изменить данные заказа > Телефон
Выражение:

(order.phone matches '/^\\+1/' ? '1')~(order.phone matches '/^\\+2/' ? '2')~(order.phone matches '/^\\+3/' ? '3')~(order.phone matches '/^\\+4/' ? '4')~(order.phone matches '/^\\+5/' ? '5')~(order.phone matches '/^\\+6/' ? '6')~(order.phone matches '/^\\+7/' ? '7')~(order.phone matches '/^\\+8/' ? '8')~(order.phone matches '/^\\+9/' ? '9')~
(order.phone matches '/^1/' ? '1')~(order.phone matches '/^2/' ? '2')~(order.phone matches '/^3/' ? '3')~(order.phone matches '/^4/' ? '4')~(order.phone matches '/^5/' ? '5')~(order.phone matches '/^6/' ? '6')~(order.phone matches '/^7/' ? '7')~(order.phone matches '/^8/' ? '7')~(order.phone matches '/^9/' ? '9')~
(order.phone matches '/^.0/' and order.phone not matches '/^\\+0/' ? '0')~(order.phone matches '/^.1/' and order.phone not matches '/^\\+1/' ? '1')~(order.phone matches '/^.2/' and order.phone not matches '/^\\+2/' ? '2')~(order.phone matches '/^.3/' and order.phone not matches '/^\\+3/' ? '3')~(order.phone matches '/^.4/' and order.phone not matches '/^\\+4/' ? '4')~(order.phone matches '/^.5/' and order.phone not matches '/^\\+5/' ? '5')~(order.phone matches '/^.6/' and order.phone not matches '/^\\+6/' ? '6')~(order.phone matches '/^.7/' and order.phone not matches '/^\\+7/' ? '7')~(order.phone matches '/^.8/' and order.phone not matches '/^\\+8/' ? '8')~(order.phone matches '/^.9/' and order.phone not matches '/^\\+9/' ? '9')~
(order.phone matches '/^..0/' ? '0')~(order.phone matches '/^..1/' ? '1')~(order.phone matches '/^..2/' ? '2')~(order.phone matches '/^..3/' ? '3')~(order.phone matches '/^..4/' ? '4')~(order.phone matches '/^..5/' ? '5')~(order.phone matches '/^..6/' ? '6')~(order.phone matches '/^..7/' ? '7')~(order.phone matches '/^..8/' ? '8')~(order.phone matches '/^..9/' ? '9')~
(order.phone matches '/^...0/' ? '0')~(order.phone matches '/^...1/' ? '1')~(order.phone matches '/^...2/' ? '2')~(order.phone matches '/^...3/' ? '3')~(order.phone matches '/^...4/' ? '4')~(order.phone matches '/^...5/' ? '5')~(order.phone matches '/^...6/' ? '6')~(order.phone matches '/^...7/' ? '7')~(order.phone matches '/^...8/' ? '8')~(order.phone matches '/^...9/' ? '9')~
(order.phone matches '/^....0/' ? '0')~(order.phone matches '/^....1/' ? '1')~(order.phone matches '/^....2/' ? '2')~(order.phone matches '/^....3/' ? '3')~(order.phone matches '/^....4/' ? '4')~(order.phone matches '/^....5/' ? '5')~(order.phone matches '/^....6/' ? '6')~(order.phone matches '/^....7/' ? '7')~(order.phone matches '/^....8/' ? '8')~(order.phone matches '/^....9/' ? '9')~
(order.phone matches '/^.....0/' ? '0')~(order.phone matches '/^.....1/' ? '1')~(order.phone matches '/^.....2/' ? '2')~(order.phone matches '/^.....3/' ? '3')~(order.phone matches '/^.....4/' ? '4')~(order.phone matches '/^.....5/' ? '5')~(order.phone matches '/^.....6/' ? '6')~(order.phone matches '/^.....7/' ? '7')~(order.phone matches '/^.....8/' ? '8')~(order.phone matches '/^.....9/' ? '9')~
(order.phone matches '/^......0/' ? '0')~(order.phone matches '/^......1/' ? '1')~(order.phone matches '/^......2/' ? '2')~(order.phone matches '/^......3/' ? '3')~(order.phone matches '/^......4/' ? '4')~(order.phone matches '/^......5/' ? '5')~(order.phone matches '/^......6/' ? '6')~(order.phone matches '/^......7/' ? '7')~(order.phone matches '/^......8/' ? '8')~(order.phone matches '/^......9/' ? '9')~
(order.phone matches '/^.......0/' ? '0')~(order.phone matches '/^.......1/' ? '1')~(order.phone matches '/^.......2/' ? '2')~(order.phone matches '/^.......3/' ? '3')~(order.phone matches '/^.......4/' ? '4')~(order.phone matches '/^.......5/' ? '5')~(order.phone matches '/^.......6/' ? '6')~(order.phone matches '/^.......7/' ? '7')~(order.phone matches '/^.......8/' ? '8')~(order.phone matches '/^.......9/' ? '9')~
(order.phone matches '/^........0/' ? '0')~(order.phone matches '/^........1/' ? '1')~(order.phone matches '/^........2/' ? '2')~(order.phone matches '/^........3/' ? '3')~(order.phone matches '/^........4/' ? '4')~(order.phone matches '/^........5/' ? '5')~(order.phone matches '/^........6/' ? '6')~(order.phone matches '/^........7/' ? '7')~(order.phone matches '/^........8/' ? '8')~(order.phone matches '/^........9/' ? '9')~
(order.phone matches '/^.........0/' ? '0')~(order.phone matches '/^.........1/' ? '1')~(order.phone matches '/^.........2/' ? '2')~(order.phone matches '/^.........3/' ? '3')~(order.phone matches '/^.........4/' ? '4')~(order.phone matches '/^.........5/' ? '5')~(order.phone matches '/^.........6/' ? '6')~(order.phone matches '/^.........7/' ? '7')~(order.phone matches '/^.........8/' ? '8')~(order.phone matches '/^.........9/' ? '9')~
(order.phone matches '/^..........0/' ? '0')~(order.phone matches '/^..........1/' ? '1')~(order.phone matches '/^..........2/' ? '2')~(order.phone matches '/^..........3/' ? '3')~(order.phone matches '/^..........4/' ? '4')~(order.phone matches '/^..........5/' ? '5')~(order.phone matches '/^..........6/' ? '6')~(order.phone matches '/^..........7/' ? '7')~(order.phone matches '/^..........8/' ? '8')~(order.phone matches '/^..........9/' ? '9')~
(order.phone matches '/^...........0/' ? '0')~(order.phone matches '/^...........1/' ? '1')~(order.phone matches '/^...........2/' ? '2')~(order.phone matches '/^...........3/' ? '3')~(order.phone matches '/^...........4/' ? '4')~(order.phone matches '/^...........5/' ? '5')~(order.phone matches '/^...........6/' ? '6')~(order.phone matches '/^...........7/' ? '7')~(order.phone matches '/^...........8/' ? '8')~(order.phone matches '/^...........9/' ? '9')~
(order.phone matches '/^............0/' ? '0')~(order.phone matches '/^............1/' ? '1')~(order.phone matches '/^............2/' ? '2')~(order.phone matches '/^............3/' ? '3')~(order.phone matches '/^............4/' ? '4')~(order.phone matches '/^............5/' ? '5')~(order.phone matches '/^............6/' ? '6')~(order.phone matches '/^............7/' ? '7')~(order.phone matches '/^............8/' ? '8')~(order.phone matches '/^............9/' ? '9')~
(order.phone matches '/^.............0/' ? '0')~(order.phone matches '/^.............1/' ? '1')~(order.phone matches '/^.............2/' ? '2')~(order.phone matches '/^.............3/' ? '3')~(order.phone matches '/^.............4/' ? '4')~(order.phone matches '/^.............5/' ? '5')~(order.phone matches '/^.............6/' ? '6')~(order.phone matches '/^.............7/' ? '7')~(order.phone matches '/^.............8/' ? '8')~(order.phone matches '/^.............9/' ? '9')~
(order.phone matches '/^..............0/' ? '0')~(order.phone matches '/^..............1/' ? '1')~(order.phone matches '/^..............2/' ? '2')~(order.phone matches '/^..............3/' ? '3')~(order.phone matches '/^..............4/' ? '4')~(order.phone matches '/^..............5/' ? '5')~(order.phone matches '/^..............6/' ? '6')~(order.phone matches '/^..............7/' ? '7')~(order.phone matches '/^..............8/' ? '8')~(order.phone matches '/^..............9/' ? '9')~
(order.phone matches '/^...............0/' ? '0')~(order.phone matches '/^...............1/' ? '1')~(order.phone matches '/^...............2/' ? '2')~(order.phone matches '/^...............3/' ? '3')~(order.phone matches '/^...............4/' ? '4')~(order.phone matches '/^...............5/' ? '5')~(order.phone matches '/^...............6/' ? '6')~(order.phone matches '/^...............7/' ? '7')~(order.phone matches '/^...............8/' ? '8')~(order.phone matches '/^...............9/' ? '9')~
(order.phone matches '/^................0/' ? '0')~(order.phone matches '/^................1/' ? '1')~(order.phone matches '/^................2/' ? '2')~(order.phone matches '/^................3/' ? '3')~(order.phone matches '/^................4/' ? '4')~(order.phone matches '/^................5/' ? '5')~(order.phone matches '/^................6/' ? '6')~(order.phone matches '/^................7/' ? '7')~(order.phone matches '/^................8/' ? '8')~(order.phone matches '/^................9/' ? '9')~
(order.phone matches '/^.................0/' ? '0')~(order.phone matches '/^.................1/' ? '1')~(order.phone matches '/^.................2/' ? '2')~(order.phone matches '/^.................3/' ? '3')~(order.phone matches '/^.................4/' ? '4')~(order.phone matches '/^.................5/' ? '5')~(order.phone matches '/^.................6/' ? '6')~(order.phone matches '/^.................7/' ? '7')~(order.phone matches '/^.................8/' ? '8')~(order.phone matches '/^.................9/' ? '9')~
(order.phone matches '/^..................0/' ? '0')~(order.phone matches '/^..................1/' ? '1')~(order.phone matches '/^..................2/' ? '2')~(order.phone matches '/^..................3/' ? '3')~(order.phone matches '/^..................4/' ? '4')~(order.phone matches '/^..................5/' ? '5')~(order.phone matches '/^..................6/' ? '6')~(order.phone matches '/^..................7/' ? '7')~(order.phone matches '/^..................8/' ? '8')~(order.phone matches '/^..................9/' ? '9')~
(order.phone matches '/^...................0/' ? '0')~(order.phone matches '/^...................1/' ? '1')~(order.phone matches '/^...................2/' ? '2')~(order.phone matches '/^...................3/' ? '3')~(order.phone matches '/^...................4/' ? '4')~(order.phone matches '/^...................5/' ? '5')~(order.phone matches '/^...................6/' ? '6')~(order.phone matches '/^...................7/' ? '7')~(order.phone matches '/^...................8/' ? '8')~(order.phone matches '/^...................9/' ? '9')~
(order.phone matches '/^....................0/' ? '0')~(order.phone matches '/^....................1/' ? '1')~(order.phone matches '/^....................2/' ? '2')~(order.phone matches '/^....................3/' ? '3')~(order.phone matches '/^....................4/' ? '4')~(order.phone matches '/^....................5/' ? '5')~(order.phone matches '/^....................6/' ? '6')~(order.phone matches '/^....................7/' ? '7')~(order.phone matches '/^....................8/' ? '8')~(order.phone matches '/^....................9/' ? '9')~
(order.phone matches '/^.....................0/' ? '0')~(order.phone matches '/^.....................1/' ? '1')~(order.phone matches '/^.....................2/' ? '2')~(order.phone matches '/^.....................3/' ? '3')~(order.phone matches '/^.....................4/' ? '4')~(order.phone matches '/^.....................5/' ? '5')~(order.phone matches '/^.....................6/' ? '6')~(order.phone matches '/^.....................7/' ? '7')~(order.phone matches '/^.....................8/' ? '8')~(order.phone matches '/^.....................9/' ? '9')~
(order.phone matches '/^......................0/' ? '0')~(order.phone matches '/^......................1/' ? '1')~(order.phone matches '/^......................2/' ? '2')~(order.phone matches '/^......................3/' ? '3')~(order.phone matches '/^......................4/' ? '4')~(order.phone matches '/^......................5/' ? '5')~(order.phone matches '/^......................6/' ? '6')~(order.phone matches '/^......................7/' ? '7')~(order.phone matches '/^......................8/' ? '8')~(order.phone matches '/^......................9/' ? '9')~
(order.phone matches '/^.......................0/' ? '0')~(order.phone matches '/^.......................1/' ? '1')~(order.phone matches '/^.......................2/' ? '2')~(order.phone matches '/^.......................3/' ? '3')~(order.phone matches '/^.......................4/' ? '4')~(order.phone matches '/^.......................5/' ? '5')~(order.phone matches '/^.......................6/' ? '6')~(order.phone matches '/^.......................7/' ? '7')~(order.phone matches '/^.......................8/' ? '8')~(order.phone matches '/^.......................9/' ? '9')


Особенности:

Учитывайте, что изменение телефона будет автоматически переоформлять интеграционную доставку, если синхронизация с интеграционной службой доставки уже совершена. В некоторых ситуациях это может изменить трек-номер отправления. Именно поэтому в условиях выбраны заказы которые создаются, либо находятся в группе статусов «Новый» и изменяется номер телефона. Рекомендуется производить нормализацию ДО синхронизации со службой доставки, а отправлять данные в доставку в группе статусов отличной от «Новый».

Текущее решение рассчитано на длину исходной строки до 25 знаков, а также заменяет первую цифру 8, на 7, только если телефон не начинается с +8. 


Объяснение:

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

Все выражение состоит из блоков по примеру
(order.phone matches '/^..7/' ? '7') , соединенных конкатенацией ~
Соответствие регулярному выражению ^..7 означает, что на третьем месте мы ищем цифру 7, а в значении тернарного оператора определяем, что тогда напишем 7. Если же на третьем месте что-то другое, то мы ничего не напишем. Пономерной перебор всех значений указанной позиции позволяет записать любую цифру из указанных, но ничего не написать, если на указанной позиции не указанная в условии цифра.

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

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

Код выражения выглядит очень брутально, но ввиду того, что в действиях триггеров нельзя использовать Twig фильтр |replace, то выходом видится только посимвольный перебор значений. Допускаю, что это связано с архитектурой синтаксиса Pipeline, который не позволяет выполнять операции кроме математических и условных.


#триггер #хак


__________________________

❤️ Поблагодарить автора 💸

__________________________

✍️ Предложить тему публикации
__________________________


Настройка RetailCRM / Триггеры RetailCRM / Валидации RetailCRM / Примеры RetailCRM / Хаки RetailCRM / Секреты RetailCRM

Оригинальный пост https://t.me/retailcrm_tips/8

Подписывайте на канал RetailCRM Tips and Tricks

Список статей по настройке RetailCRM

Report Page