В данной статье рассмотрим примеры триггеров, которые можно создать в системе для автоматизации некоторых моментов, а также полезные выражения для создания триггеров. Тут будут представлены основные настройки и код для некоторых триггеров, который можно скопировать к себе в систему с небольшой модификацией.
Полезные выражения для триггеров:
- Работа с пользовательскими полями
- Работа с датой и временем
- Работа с номером телефона
- Работа с составом заказа, складами, товарами
- Email и sms
- Работа с оплатами
- Прочее
О том, как создавать и работать с триггерами читайте в статьях:
Примеры триггеров
Создание заказа при пропущенном звонке (если он не привязался к существующему заказу)
Описание триггера: Проверяет наличие существующего заказа у клиента по входящему номеру телефона. Если заказа нет, то создается новый.
- Событие: Пропущенный звонок
- Условие: Новый заказ «Да»
- Действие: Создать заказ
Создание задачи при пропущенном звонке, если заказ уже есть
Описание триггера: Проверяет наличие существующего заказа у клиента по входящему номеру телефона. Если заказ есть, то ставит задачу менеджеру.
- Событие: Пропущенный звонок
- Условие: Новый заказ «Нет»
- Действие: Поставить задачу (настройте описание задачи)
Создание нового клиента по пропущенному звонку, если его нет в системе
Описание триггера: Проверяет наличие в системе клиента по пропущенному звонку. Если клиента нет, то создает нового.
- Событие: Пропущенный звонок
- Условие: Новый клиент «Да»
- Действие: Создать клиента
Создание клиента по звонку, если его нет в системе
Описание триггера: Проверяет наличие в системе клиента по входящему принятому звонку. Если клиента нет, то создает нового.
- Событие: Новый звонок
- Условие: Новый клиент «Да»
- Действие: Создать клиента
Согласование деталей заказа
Описание триггера: При переводе заказа в статус "Наличие подтверждено" ставит задачу менеджеру (статус заказа может быть любой)
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Наличие подтверждено»
- Действие: Поставить задачу (настройте описание задачи)
Заказ был просрочен в статусе Наличие подтверждено
Описание триггера: Уведомляет менеджера о просроченном заказе
- Событие: Изменение заказа
- Условие: условие в конструкторе не настраивается, используйте представленный ниже код
- Действие: Отправить оповещение (создайте шаблон оповещения)
((changeSet.hasChangedField("expired") and changeSet.getNewValue("expired")) and (order.status.code in ['availability-confirmed']))
Заказ был переведен в статус Готов ждать
Описание триггера: При переводе заказа в статус "Готов ждать" (кастомный статус. Может быть любым) запускает цепочку триггеров на проверку наличия товара через день и его дальнейшего автобронирования.
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Готов ждать»
- Действие: Изменить данные заказа «Имя». В выражении действия указываем значение order.firstName, чтобы имя было изменено на то, которое уже указано в заказе (это необходимо, чтобы запустить событие следующего триггера)
Отложенный триггер для перевода в статус для автобронирования
Примечание
Данный триггер напрямую связан с триггером, который описан выше.
Описание триггера: Цепочка триггеров на автобронирование товаров. Переводит заказ в статус срабатывания автобронирования.
- Событие: После срабатывания триггера для заказа
- Условие: В поле «После триггера» выбираем триггер, который описан выше (Заказ был переведен в статус Готов ждать), в значении «Через» указываем 1 день.
- Действие: Изменить данные заказа «Статус заказа». В выражении действия указываем символьный код статуса, который запускает автобронирование товаров.
Возврат
Описание триггера: При переводе заказа в статус "Возврат", отправляет клиенту сообщения об отмене заказа.
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Возврат»
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Отправка ссылки на оплату
Описание триггера: Отправляет клиенту ссылку на оплату заказа.
Важно!
Вместо
код_типа_оплаты
нужно вставить символьный код интеграционного типа оплаты
- Событие: Изменение заказа
- Условие: условие в конструкторе не настраивается, используйте представленный ниже код
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Код условия применения триггера:
(changeSet.isCreate() and order.payments|contains(item => item.type.code == "код_типа_оплаты")) or (changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "код_типа_оплаты"))
Заказ был оплачен
Описание триггера: При изменении статуса оплаты на "Оплачен" (учитывается частичная оплата), меняет статус заказа на "Передано в комплектацию" и ставит задачу
- Событие: Изменение заказа
- Условие: Изменение статуса оплаты с Любой на = «Оплачен»
- Действие: Изменить данные заказа «Статус заказа» (в выражении укажите
"send-to-assembling"
) и Поставить задачу
Заказ был укомплектован
Описание триггера: Если статус заказа меняется на "Укомплектован", переводит заказ в статус "Передано в доставку"
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Укомплектован»
- Действие: Изменить данные заказа «Статус заказа» (в выражении укажите
"send-to-delivery"
)
Доставка была перенесена
Описание триггера: При переводе заказа в статус "Доставка перенесена" ставит задачу
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Доставка перенесена» (кастомный статус)
- Действие: Поставить задачу
Пришёл трек-номер
Описание триггера: Отправляет клиенту трек-номер для отслеживания заказа при оформлении доставки через модуль транспортной компании в интерфейсе системы
- Событие: Изменение заказа
- Условие: условие в конструкторе не настраивается, используйте представленный ниже код
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Код условия применения триггера:
changeSet.hasChangedField("integration_delivery_data.track_number") and changeSet.getOldValue("integration_delivery_data.track_number") == null
Заказ прибыл в ПВЗ
Описание триггера: При переводе заказа в статус "Прибыл в ПВЗ", отправляет клиенту уведомление об этом
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Прибыл в ПВЗ» (кастомный статус)
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Заказ не выкуплен из ПВЗ 5 дней
Примечание
Данный триггер напрямую связан с триггером, который описан выше.
Описание триггера: Отправляет сообщение клиенту с необходимостью забрать заказ, если заказ не выкуплен из ПВЗ через 5 дней.
- Событие: После срабатывания триггера для заказа
- Условие: В поле «После триггера» выбираем триггер, который описан выше (Заказ прибыл в ПВЗ), в значении «Через» указываем 5 дней. Статус заказа не равняется «Выполнен».
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Задача менеджеру если заказ не выкуплен после 5 дней (ТК)
Примечание
Данный триггер напрямую связан с триггером, который описан выше.
Описание триггера: Если заказ не выкуплен из ПВЗ на 6й день, триггер ставить задачу менеджеру для уточнения причины
- Событие: После срабатывания триггера для заказа
- Условие: В поле «После триггера» выбираем триггер, который описан выше (Заказ не выкуплен из ПВЗ 5 дней), в значении «Через» указываем 1 день. Статус заказа не равняется «Выполнен».
- Действие: Поставить задачу
Заказ выполнен, благодарность
Описание триггера: После перевода заказа в статус "Выполнен" отправляет клиенту уведомление с благодарностью
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Выполнен»
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Отзыв
Примечание
Данный триггер напрямую связан с триггером, который описан выше.
Описание триггера: Через 24 часа после перевода заказ в статус "Выполнен" отправляет клиенту сообщение с просьбой оставить отзыв.
- Событие: После срабатывания триггера для заказа
- Условие: В поле «После триггера» выбираем триггер, который описан выше (Заказ выполнен, благодарность), в значении «Через» указываем 1 день
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Заказ готов к самовывозу
Описание триггера: При переводе статуса заказа в "Готов к самовывозу" отправляет клиенту уведомление с адресом магазина и сроком хранения
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с Любой на = «Готов к самовывозу» (кастомный статус)
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Заказ готов к самовывозу уже 2 дня
Примечание
Данный триггер напрямую связан с триггером, который описан выше.
Описание триггера: Если заказ не забрали из магазина через 2 дня, отправляет сообщение с информацией, что срок хранения заканчивается.
- Событие: После срабатывания триггера для заказа
- Условие: В поле «После триггера» выбираем триггер, который описан выше (Заказ готов к самовывозу), в значении «Через» указываем 2 дня. Статус заказа = «Готов к самовывозу».
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
На заказ был назначен курьер
Описание триггера: Если доставка осуществляется собственным курьером, триггер отправляет клиенту сообщение с информацией о курьере
- Событие: Изменение заказа
- Условие: условие в конструкторе не настраивается, используйте представленный ниже код
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Код условия применения триггера:
changeSet.hasChangedField("integration_delivery_data.courier") and order.deliveryType.code == "courier"
Для повтора процесса автобронирования
Описание триггера: При переводе заказ из статуса "Ожидается поступление" в "Предложить замену", автоматически переводит заказ в статус "Готов ждать", для повторного срабатывания автобронирования
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с = «Ожидается поступление» на = «Предложить замену»
- Действие: Изменить данные заказа «Статус заказа». В выражении действия указываем символьный код статуса, который запускает автобронирование товаров.
Предлагаем замену
Описание триггера: Если товара нет в наличии и не сработало автобронирование, ставит задачу менеджеру "Предложить замену"
- Событие: Изменение заказа
- Условие: Изменение статуса заказа с = «Новый» на = «Предложить замену»
- Действие: Поставить задачу
Заказ поступил
Описание триггера: При поступлении нового заказа клиенту отправляется sms/email уведомление с номером заказа
- Событие: Изменение заказа
- Условие: Новый заказ
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Доставка заказа на сегодня или на завтра
Описание триггера: Если заказ планируется доставить сегодня или завтра, отправляется sms/email уведомление клиенту
- Событие: Изменение заказа
- Условие: условие в конструкторе не настраивается, используйте представленный ниже код
- Действие: Отправить письмо (заранее созданный шаблон письма) и Отправить SMS (заранее созданный шаблон SMS)
Код условия применения триггера, если доставка на сегодня:
changeSet.getNewValue("delivery_date").format('d.m.Y') == date('today').format('d.m.Y')
Если доставка на завтра:
order.getDeliveryDate().format('d.m') == date("now + 1 day").format('d.m'))
Полезные выражения для триггеров
Работа с пользовательскими полями
Обращение к элементу кастомного справочника
Код условия применения триггера:
changeSet.hasChangedField('custom_otv_logist') and changeSet.getNewValue('custom_otv_logist') != null and order.getCustomField('otv_logist').getCode() == 'olesja'
'olesja'- символьный код справочника
Проверка на наличие артикулов в пользовательском поле
Код условия применения триггера:
order.availableOrderProducts | reduce( (sum, x) => sum or (order.getCustomField("dsa") matches '/'~x.offer.article~'/'), false)
Округление значения до копеек
Код действия триггера:
round(sum, 2)
Определение возраста клиента
Необходимо два триггера:
1) Код условия применения триггера:
(changeSet.isCreate() and customer.birthday != null) or (changeSet.isUpdate() and customer.birthday != null)
date("now").format("md") < customer.birthday.format("md")
Значение пользовательского поля с возрастом
Код действия триггера:
date("now").format("Y")-customer.birthday.format("Y")-1
2) Код условия применения триггера:
(changeSet.isCreate() and customer.birthday != null) or (changeSet.isUpdate() and customer.birthday != null)
date("now").format("md") >= customer.birthday.format("md")
Значение пользовательского поля с возрастом
Код действия триггера:
date("now").format("Y")-customer.birthday.format("Y")
Работа с датой и временем
Проверка на рабочее время
Код условия применения триггера:
(date('now') < date("today 19:00") and date('now') > date("today 02:00"))
Проверка по рабочим и выходным дням в триггерах
Код условия применения триггера:
(date('today').format('w') in ['1','2','3','4','5'] and
(date('now').format('H') < 21 or date('now').format('H') > 10 )) or
(date('today').format('w') in ['0','6'] and
(date('now').format('H') < 20 or date('now').format('H') > 12 ))
Сравнивание времени доставки с настоящим временем
Код условия применения триггера:
order.getDeliveryTime().getTo().format("H") == date("now - 4 hours").format("H")
Вывод разницы по временной зоне клиента
Код действия триггера:
((date(local_time(order.getPhone())).format("U")-date("now - 3hours").format("U"))/60)/60
Добавление дней к полю с типом дата
Код действия триггера:
date(order.deliveryDate.format('Y-m-d H:i:s') ~ '+10 days')
Получение часового пояса из номера телефона (клиента или заказа) в формате +0300
Код действия триггера:
date(local_time(order.customer.phone)).format('O')
Применение фильтра по дню недели, например, для отслеживания
Код условия применения триггера:
order.createdAt().format('w') in [0,6] - заказ создан в субботу или в воскресенье
Работа с номером телефона
Проверка, что введен городской телефон с использованием регулярных выражений
Код действия триггера:
'/((8|\\+7)[\\- ]?)?(\\(?\\[495|094|499]{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}/'
Проверка, что введен мобильный телефон с использованием регулярных выражений
Код действия триггера:
'/^(8|\\+7)[ \\-\\(\\)]+9[\\d \\-\\(\\)]+$/'
Проверка, что введен формат телефона +7 (ХХХ) ХХХ-ХХ-ХХ с использованием регулярных выражений
Код действия триггера:
not (order.getAnyPhone() matches '/\\+7\\s\\([0-9]{3}\\)\\s[0-9]{3}-[0-9]{2}-[0-9]{2}/')
Работа с составом заказа, складами, товарами
Суммирование в триггере значений из состава заказа
Код действия триггера:
order.availableOrderProducts | reduce( (sum, x) => sum + x.offer.properties.amount * x.quantity ) #Версия с учётом количества в каждой позиции.
Вывод наибольшего значения доп.свойства «вес»
Код действия триггера:
products | map ( x => x.weight ) | reduce ( (rez, x) => x > rez ? x : rez)
Проверка, что все товары в заказе забронированы
Код условия применения триггера:
not order.availableOrderProducts | every (item => item.packs | contains (p => p))
Обращение к добавленному вручную доп.свойству товара с помощью pipe фильтров
Триггер проверяет, что в заказе есть товары, с определенным свойством и значением этого свойства (нужное свойство и его значение задаются через символьный_код_свойства
и значение_свойства
соответственно).
Код условия применения триггера:
order.orderProducts | map( x => x.properties ) | contains(item => item.bonus_spend_per_one.value matches "/-/" )
order.orderProducts | contains(item => item.properties | contains (item => item.code == 'символьный_код_свойства' and item.value == 'значение_свойства'))
Запрет на добавление товара в заказ с количеством больше, чем есть свободных остатков
Код действия триггера:
changeSet | contains (c => c.fieldName matches '#order_product#' and (c.newValue.offer.product.quantity < c.newValue.quantity))
Запрет на изменение количества имеющегося товара в заказе больше, чем есть свободных остатков
Код действия триггера:
changeSet | contains (c => c.fieldName matches '#order_product#' and (c.orderProduct.offer.quantity < c.orderProduct.quantity))
Запрет на установку рублевой скидки более 5% на 1 позицию
Код действия триггера:
changeSet | contains (c => c.fieldName == 'order_product.discount_manual_amount' and c.orderProduct.discountManualAmount > (c.orderProduct.price*0.05))
Проверка на наличие определенного товара в заказе
Условие применения триггера:
order_contains(order, entities_by_ids("ProductGroup", [214])
Email и sms
Условие позволяет триггеру запуститься, если хотя бы одно письмо, отправленное с помощью родительского триггера, было открыто
Код условия применения триггера:
parent.actions | contains( action => action.letters | contains (letter => letter.isOpened))
Если требуется проверка, что письмо не было открыто
Код условия применения триггера:
parent.actions | contains( action => action.letters | contains (letter => not letter.isOpened))
Если требуется проверка, что SMS было доставлено
Код условия применения триггера:
parent.actions | contains (action => action.sms.isDelivered)
Работа с оплатами
Изменение статуса оплаты у определенного платежа
Код условия применения триггера:
changeSet | contains(item => item.fieldName == "payments.status" and item.newValue.code == "paid") and
order.payments | contains(payment => payment.type.code == "bank-card" and payment.status.code == "paid")
Запрет на удаление конкретной оплаты
Код условия применения триггера:
(changeSet.getOldValue("payments") and changeSet|contains(item => item.fieldName == "payments" and item.oldValue.type.code != "bank-card"))
Запрет на изменение суммы платежа, если есть оплаченный платеж
Код условия применения триггера:
order.payments | contains(i => i.status.code == "paid") and changeSet | contains(item => item.fieldName == "payments.amount" and item.newValue)
Обращение к изменению конкретного платежа
Условие проверяет, что у оплаты в заказе с типом cash
установлен оплаченный статус paid
.
Код условия применения триггера:
changeSet | contains ( item => item.fieldName matches '#payment\.#' and item.payment.type.code == 'cash' and item.payment.status.code == "paid")
Вывод суммы конкретного платежа
Код действия триггера:
order.payments | filter(item => item.type.code == "bank-card") | reduce( (sum, x) => x.amount )
Проверка на удаление одного типа оплаты и добавления взамен другого типа
Код условия применения триггера:
changeSet | contains(item => item.fieldName == "payments" and item.oldValue.type.code == "cash" and item.newValue == null) and changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "credit")
Запрет на удаление платежа со статусом «Оплачено»
Код условия применения триггера:
changeSet | contains(item => item.fieldName == "payments" and item.oldValue and item.oldValue.status.code == "paid" and item.newValue == null)
Запрет на изменение суммы платежа
Код условия применения триггера:
changeSet | contains(paym => paym.fieldName == "payments.amount" and paym.newValue != paym.oldValue and paym.oldValue != 0 and paym.type and paym.type.code in ["cash"])
Добавление платежа с указанным статусом
Код действия триггера:
changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "cash" and item.newValue.status.code == "paid")
Проверка на добавление второго платежа с таким же типом
Условие проверяет, что добавили оплаты в заказ, и что среди добавленных оплат есть не менее 2-х оплат с типом cash
Код условия применения триггера:
((order.payments | filter(item => item.type.code == "cash")) | length) >= 2 and changeSet | contains(item => item.fieldName == "payments" and item.oldValue == null and item.newValue.type.code == "cash")
Проверка на добавление второго платежа с таким же типом
В данном условии нет привязки к типу оплаты. Если в заказе уже есть оплата и добавляют еще одну с таким же типом, то триггер сработает.
Код условия применения триггера:
order.payments | group ( p => p.type.code ) | contains ( pp => (pp | length) > 1)
Запрет на внесение изменений в платежи после полной оплаты
К данному триггеру дополнительно необходимы два триггера на постановку/снятие галочки в поле при изменении даты полной оплаты.
Код условия применения триггера:
(((changeSet.hasChangedField("payments") and changeSet.getOldValue("payments")) or (changeSet.hasChangedField("payments") and changeSet.getNewValue("payments"))) or (changeSet | contains ( item => item.fieldName matches '#payment\.#' or item.fieldName matches "/payments/"))) and order.customField('поле-с-галкой') == true
Прочее
Действие добавление/удаление тега
Уникальные значения объектов, например, тег, необходимо заключить в двойные или одинарные кавычки:
"Название тега"
Проверка, что клиент создан из чата
Код условия применения триггера:
changeSet.isCreate() and customer.getMgCustomers() | contains(item => item.dialogs | contains(item => item.createdAt != null))
Использование тернарных операторов
В зависимости от перечисленных условий (a, b или c) в заданное поле будет записываться нужное значение (1, 2 или 3)
Код действия триггера:
order.firstName == 'a' ? '1' : order.firstName == 'b' ? '2' : order.firstName == 'c' ? '3'
Простановка нечетных заказов на менеджера
Код действия триггера:
order.getId()%2 != 0
Условие несовпадения значения поля с указанными
Код условия применения триггера:
not (order.getCustomerComment() matches "/(C11)|(drop1)|(MPB)|(PN)|(OPN)/")
Добавление нескольких условий в одном триггере
Код условия применения триггера:
{
"символьный код типа доставки": "символьный код соответствия другого нужного поля",
"символьный код типа доставки": "символьный код соответствия другого нужного поля"
}[order.getDeliveryType().getCode()]
Динамическое значение поля в зависимости от условия
Код действия триггера:
(order.payments | contains (p => p.type.code == "sber-online") ? (order.getPrepaySum()*0.05) :
(order.payments | contains (p => p.type.code == "installments") ? (order.getPrepaySum()*0.025) :
(order.payments | contains (p => p.type.code == "robokassa") ? (order.getPrepaySum()*0.05) :
(order.payments | contains (p => p.type.code == "terminal") ? (order.getPrepaySum()*0.025)))))
Проверка в триггере, что клиент создан меньше месяца назад
Код условия применения триггера:
order.getCustomer().getCreatedAt() > date("30 days ago")`
Проверка на онлайн-статус ответственного менеджера
Код условия применения триггера:
user_online_status(order.getManager()) == true