retailCRM Документация

Набор изменений

Особенности работы с набором изменений

Объект changeSet (тип Change\EntityChangeSet) представляет интерфейс получения информации об изменениях при редактировании объектов (например заказа или клиента). В справочнике объектов можно увидеть доступные методы данного объекта.

Наиболее часто используемые методы – это hasChangedField(), getOldValue() и getNewValue(). C помощью hasChangedField() можно определить, изменялось ли поле, а getOldValue() и getNewValue() позволяют получить соответственно старое и новое значение поля.

Пример:

changeSet.hasChangedField("status") and changeSet.getNewValue("status").getCode() == "did-not-get-through"

Данные методы принимают в качестве параметра служебное название поле в формате underscore. Если мы обращаемся ко вложенному полю, то вложенность указывается через точку.

Примеры:

changeSet.hasChangedField("status") # Определяем, изменилось ли поле Статус заказа
changeSet.getNewValue("delivery_cost") # Получаем новое значение поля Стоимость доставки
changeSet.getNewValue("delivery_address.city") # Получаем новое значение поля Город доставки
changeSet.hasChangedField("delivery_type") and changeSet.getNewValue("delivery_type").getCode() == "russian-post" # Определяем, что изменился тип доставки на "Почта России"

В данных примерах мы смотрим изменения полей:

order.getStatus()
order.getDeliveryCost()
order.getDeliveryAddress().getCity()
order.getDeliveryType()

Изменения в пользовательских полях хранятся с приставкой custom_. Например, чтобы определить наличие изменения в пользовательском поле transaction_id, следует написать:

changeSet.hasChangedField("custom_transaction_id")

Важно понимать отличие проверки:

changeSet.hasChangedField("delivery_type") and changeSet.getNewValue("delivery_type").getCode() == "russian-post"

от

order.getDeliveryType() and order.getDeliveryType().getCode() == "russian-post"

Первое условие сработает только в момент, когда мы изменяем тип доставки на «Почта России». Второе сработает в момент изменения типа доставки на «Почта России», а также при всех последующих изменениях заказа, пока мы не сменим тип доставки на что-либо другое.

Для того чтобы узнать какое из действий сейчас совершается с объектом (создание, изменение, удаление) в changeSet предусмотрены соответствующие методы:

changeSet.isCreate() # создание
changeSet.isUpdate() # изменение
changeSet.isDelete() # удаление

Получение автора изменения

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

Для того чтобы узнать какой менеджер изменил то или иное поле нужно воспользоваться функцией getAuthorOfChange, которая возвращает менеджера который произвел изменение (User) или null если изменение сделано самой системой, через API или в триггере.

changeSet.getAuthorOfChange("status")
changeSet.getSourceOfChange("status") in ["code", "user", "api", "rule"]

Также можно проверить наличие любых изменений от определенного источника:

changeSet.hasChangesWithSource("api")

Редакция от 20.12.2016 15:25