RetailCRM pro
383 subscribers
8 photos
4 videos
243 links
Официальный канал RetailCRM с техническими обновлениями.

@retailcrm — наш основной канал. В нем мы постим кейсы, новые интеграции и полезные статьи.
@retailCRMbot — отвечаем на вопросы, связанные с RetailCRM
Download Telegram
Рабочее время склада в twig-шаблонах

В справочник объектов, доступных в триггерах и Twig-шаблонах, добавлены данные о рабочем времени склада.
Информация о рабочем времени склада передаётся в объекте Store:

store.workTimes — массив объектов с интервалами рабочего времени склада отгрузки.

Каждый элемент массива содержит следующие поля:
- day — день недели (0 — воскресенье, 6 — суббота)
- workFrom — время начала работы (в формате ЧЧ:ММ)
- workUntil — время окончания работы (в формате ЧЧ:ММ)
lunchFrom — время начала обеденного перерыва (в формате ЧЧ:ММ)
- lunchUntil — время окончания обеденного перерыва (в формате ЧЧ:ММ)

Доступ к объекту Store осуществляется через поля объекта заказа Order либо объекта упаковки товаров OrderProductPack.
👍10
Media is too big
VIEW IN TELEGRAM
⭐️ Доступ JS-модулей к составу заказа

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

Получать данные состава заказа можно из поля items контекста order/card (справочник таргетов и их контекстов https://docs.retailcrm.ru/Developers/modules/PublishingModuleMarketplace/JsModulesTargets)

Вносить изменения в состав заказа можно через новый объект действий useActions() контекста order/card. Список доступных действий приведен в том же справочнике таргетов и контекстов по ссылке выше. Работа с действиями описана в новом разделе документации https://docs.retailcrm.ru/Developers/modules/PublishingModuleMarketplace/JsModules#h-15

В библиотеке примеров подготовлен демонстрационный кейс cases/orderPromo, где показано как получение данных состава заказа, так и внесение в него изменений.

#jsapi
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍53
Передача внутреннего ID сообщения в webhook message_sent

Теперь в Transport API в запросе webhook с типом message_sent передаётся внутренний ID сообщения в MessageGateway. Кроме того, все методы редактирования сообщений принимают этот внутренний ID как ключ для работы с сообщением.

Изменения в API:
— Webhook message_sent — содержит внутренний ID сообщения.
— Методы, принимающие внутренний ID:
 • PUT /messages
 • POST /messages/ack
 • POST /messages/read
 • POST /messages/restore
 • DELETE /messages/reaction
 • POST /messages/reaction

Основная цель данного нововведения — повышение устойчивости взаимодействия MessageGateway с транспортами:

— Можно продолжать работу с сообщением даже если транспорт не вернул external_id в ответ на webhook message_sent или произошла сетевая ошибка, но запрос был обработан транспортом.
— В POST /messages/ack можно передать и внутренний ID, и external_id — тогда external_id будет установлен для сообщения и связь восстановится.

Обратная совместимость: работа, основанная на external_id, остается без изменений.

Подробнее в документации
🔥5👍1👏1
Twig/Pipelang-функция получения остатков торгового предложения по складам offer_inventories

В Twig и Pipelang добавлена функция offer_inventories для получения остатков торгового предложения (Offer) в разрезе складов.

Спецификация функции


offer_inventories(Offer offer, Site|null site = null, Store[]|Store|null stores = null): Inventory[]


Принимает параметры

Offer offer — объект торгового предложения
Site|null site = null — объект магазина, опциональный (будут возвращены остатки только по складам магазина)
Store[]|Store|null stores = null — объект или массив объектов склада, опциональный (будут возвращены остатки только по указанным складам)

Если указан и site, и stores, учитывается пересечение параметров.

Возвращаемое значение

Inventory[] — возвращается массив остатков по складам (массив объектов типа Inventory). В Inventory доступно значение остатка Inventory.quantity. Для складов в режиме «есть в наличии = да/нет», будет возвращаться 1/0 соответственно. Также доступны поля склада, по которому приведены данные, и закупочная цена на этом складе.

Примеры вызова

В Twig

{# Различные варианты вызова функции #}
{% set inventories = offer_inventories(op.offer) %}
{% set inventories = offer_inventories(op.offer, order.site) %}
{% set inventories = offer_inventories(op.offer, order.site, entity_by_code('Store', 'store-1')) %}
{% set inventories = offer_inventories(op.offer, null, [entity_by_code('Store', 'store-1'), entity_by_code('Store', 'store-2')]) %}
{% set inventories = offer_inventories(op.offer, null, order.shipmentStore) %}

{# Получаем остатки по торговым предложениях позиций заказа для склада 'store-1' c проверкой принадлежности склада к магазину заказа #}
{% for op in order.availableOrderProducts %}
{% for i in offer_inventories(op.offer, order.site, entity_by_code('Store', 'store-1')) %}
{{ i.store.code }}:{{ i.quantity }}
{% endfor %}
{% endfor %}


В Pipelang

# строка из пар <символьный код склада>:<остатки>
offer_inventories(offer, order.site) | reduce((res, x) => res ~ x.store.code ~ ':' ~ x.quantity ~ ';', '')

# вернет true, если на всех складах магазина site-1 остатки данного оффера больше 10
offer_inventories(offer, entity_by_code('Site', 'site-1')) | every(x => x.quantity > 10)

# возвращает склад магазина заказа, где больше всего остатков
(offer_inventories(offer, order.site) | sort((a, b) => a.quantity < b.quantity) | first).store


Описание функций в документации
https://docs.retailcrm.ru/Developers/Automation/Twig/FunctionDictionariesTwig
https://docs.retailcrm.ru/Developers/Automation/PipeLang/Expressionlanguage/AvailableFunctions
🔥111👍1
Минимальная остаточная стоимость товара/услуги в программе лояльности

В ответы API-методов GET /api/v5/loyalty/loyalties и GET /api/v5/loyalty/loyalties/{id} добавлено поле minResidualCost, позволяющее получать информацию о настройке минимальной остаточной стоимости товара/услуги. В случае, если настройка выключена, поле возвращаться не будет.

Данное поле может быть полезно, например, если необходимо учитывать программы лояльности только с включенной подобной настройкой.
👍3🔥32👀1
Добавлены API-методы получения и создания/редактирования категорий подписок

Добавлены API-методы:
* GET /api/v5/reference/subscriptions для получения списка всех категорий подписок
* POST /api/v5/reference/subscriptions/{channel}/{code}/edit для созданий или редактирования категории подписки.

Подробнее в документации:
* GET /api/v5/reference/subscriptions
* POST /api/v5/reference/subscriptions/{channel}/{code}/edit
👍3🔥1
Флаг массовой рассылки в Bot API

В методе Bot API POST /messages появилось новое булево поле mass_communication.

Что изменилось

В теле запроса можно передать mass_communication: true, чтобы пометить сообщение как часть массовой рассылки. Такое сообщение не открывает диалог в чате и не обновляет его last_activity. Чаты, инициированные такими сообщениями, а также связанные с ними WebSocket-события возвращаются только при указании параметра для получения массовых коммуникаций include_mass_communication.

Когда будет полезно


Флаг пригодится, если ваш бот занимается массовыми рассылками клиентам, а вы хотите избежать лишнего «шума» в интерфейсе чатов — появления новых диалогов и непрочитанных сообщений у менеджеров. Кроме того, использование mass_communication поможет снизить количество обращений к API: теперь нет необходимости вручную закрывать диалоги, созданные такими рассылками.

Подробнее в документации
🔥9
Twig-функция для выполнения HTTP-запроса к бекенду JS-модуля

В Twig добавлена функция integration_module_http_call для выполнения HTTP-запроса к бекенду JS-модуля.

Спецификация функции


integration_module_http_call(
string moduleCode,
string path,
string|json-object|null payload = null
): HttpCallResponse


Принимает параметры

string moduleCode — код экземпляра модуля
string path — путь, на который в бекенд модуля будет отправлен запрос
string|json-object|null payload = null — значение опционального POST-параметра payload

Возвращаемое значение

Объект типа HttpCallResponse с полями int status и HttpCallResponseBody body.

Примеры вызова


{% set response = integration_module_http_call(
'module-code', '/get-promocode', 'somePayload'
) %}
Ваш промокод {{ response.status == 200 ? response.body : 'error' }}

# Передача json-объекта в payload
{% set response = integration_module_http_call(
'module-code', '/get-promocode', {order_id: 1}
) %}

# Если response.body является закодированной в JSON строкой вида '{"promocode": "foobar"}', то доступ к полю "promocode" можно получить через свойство "json"
{{ response.body.json.promocode }}


Описание функции в документации
https://docs.retailcrm.ru/Developers/Automation/Twig/FunctionDictionariesTwig

#jsapi
👍5🔥32
Поле MGMessage.channelType в Sandbox

В объект MGMessage добавлено новое поле channelType, которое указывает тип канала, в который было отправлено сообщение.
Поле принимает одно из следующих значений, соответствующих поддерживаемым типам каналов в системе:
- telegram
- fbmessenger*
- viber
- whatsapp
- skype
- vk
- instagram*
- consultant
- yandex_chat
- odnoklassniki
- max
- ozon
- wildberries
- yandex_market
- mega_market
- avito
- drom
- youla
- custom

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

Пример использования в условии срабатывания триггера
При срабатывании триггера на событие (например, после выполнения родительского триггера для заказа), возможно задать следующее условие:

parent.actions | contains (action => action.mgMessages | contains(message => message.channelType == 'telegram'))

Так как родительский триггер может отправить сообщение в один из доступных для коммуникации каналов (в случае, если выбрана данная опция), тип канала заранее неизвестен.
В дочернем триггере можно проверить фактический тип канала, в который было отправлено сообщение.
В примере выше срабатывание дочернего триггера произойдет, только если сообщение, созданное в родительском триггере, было отправлено в канал Telegram.

Подробнее о доступных объектах и полях — в справочнике объектов.

* Деятельность компании Meta Platforms Inc. по реализации продуктов — социальных сетей Facebook и Instagram — на территории Российской Федерации запрещена решением суда.
🔥81👍1
Возможность указания родителя товарной группы через API

В API-методы POST /api/v5/store/product-groups/create и POST /api/v5/store/product-groups/{externalId}/edit добавлена возможность указания родителя товарной группы путём использования полей parentId и parentExternalId.

Подробнее в документации тут и тут.
🔥41👍1
Возможность добавлять и редактировать изображение товара по API

В API-методах POST /api/v5/store/products/batch/create и POST /api/v5/store/products/batch/edit появилась возможность добавления и редактирования изображения товара путём передачи параметра imageUrl. Необходимо указать ссылку на изображение (требования такие же, как и при работе с ICML - можно указывать изображения в формате jpg, png размером не более 2Мб, важно указывать корректный протокол (https:// или https://) и домен (с www или без него), а также важно, чтобы ссылка на товар была прямой и при переходе на нее не производились редиректы).

Подробнее в документации тут и тут.
🔥6
Vue-компонент UiTextbox для JS-модулей

В витрину компонентов добавлен Vue-компонент <UiTextbox> для использования в JS-модулях.

Компонент позволяет вывести текстовое поле ввода (как input поле, так и textarea) с возможностью донастройки:
* добавления иконки до/после поля
* добавления текста до/после поля
* указания типа допустимых значений (текст, число, email и др)
* и целый ряд других настроек

Рекомендовано использовать данный компонент в разрабатываемых модулях для вывода полей ввода.

Витрина компонентов https://retailcrm.github.io/embed-ui/v1-components/latest/index.html
Документация по JS-модулям https://docs.retailcrm.ru/Developers/modules/PublishingModuleMarketplace/JsModules

#jsapi
🔥7👍1
Перенаправление пользователя на страницы системы в JS-модулях

В JS API добавлена функция goTo(route, params?) для перенаправления пользователя на определенную страницу системы. Сигнатура функции такая же, как у функции роутера генерации ссылки на страницу системы.


import { useHost } from '@retailcrm/embed-ui'

const host = useHost()

// идентификатор заказа
const id = 12345
// перенаправляем пользователя на страницу с редактирования заказа
host.goTo(
'crm_orders_edit',
{ id }
)


Справочник роутов страниц системы, на которые можно перенаправлять https://docs.retailcrm.ru/Developers/modules/PublishingModuleMarketplace/JsModulesRoutes. Справочник расширен новыми страницами

Документация по данной функциональности https://docs.retailcrm.ru/Developers/modules/PublishingModuleMarketplace/JsModules#h-18

#jsapi
🔥5👍1
Новые точки встраивания JS-модулей в начале и конце блока «В работе» в карточке клиента

В карточке клиента в блоке «В работе» добавлены точки встраивания customer/card:inWork.before в начале и customer/card:inWork.after в конце.

Отображение элементов в новом таргете добавлено в примере cases/allTargetsButton библиотеки примеров @retailcrm/core-ui-extensions-examples.

Во всех таргетах карточки клиента customer/card:* доступны штатные поля клиента customer/card, а также все пользовательские поля клиента в режиме «только чтение».

Посмотреть доступные JS-модулям таргеты можно в справочнике.

#jsapi
🔥51👍1
API-метод для импорта инвойса

Добавлен API-метод POST /api/v5/payment/invoice/import для передачи информации об уже завершенной интеграционной оплате в CRM.

Подробнее в документации
🔥5👍1
Информация об упаковках интеграционной доставки заказа в справочнике объектов

В справочник объектов добавлены данные об упаковках интеграционной доставки в заказе - presentationPackages (order.integrationDeliveryData.presentationPackages).

Содержит в себе список упаковок с указанием основных параметров (идентификатор, вес и габариты) и входящих в состав товаров из заказа.

Теперь стал доступен, например, вывод информации о сформированных упаковках для печатных форм заказа.

Пример в Twig (со всеми доступными полями):
{% if order.integrationDeliveryData.presentationPackages %}
{% for package in order.integrationDeliveryData.presentationPackages %}
{{ package.packageId }}
{{ package.weight }}
{{ package.length }}
{{ package.width }}
{{ package.height }}

{% for item in package.items %}
{{ item.orderProduct.id }} / {{ item.orderProduct.externalId }}

{% for externalIds in item.orderProduct.externalIds %}
{{ externalIds.code }} - {{ externalIds.value }}
{% endfor %}

кол-во: {{ item.quantity }}шт
{% endfor %}
{% endfor %}
{% endif %}
🔥4👍2
Точки встраивания в новой форме редактирования заказа в чатах

В разделе Чаты запущена новая версия виджета Заказы, в которой можно редактировать практически все данные заказа.

В рамках заказа чата добавлены:
* order/mg:list.before – перед списком товарных позиций
* order/mg:list.after – после списка товарных позиций
* order/mg:delivery.before – в начале секции доставки
* order/mg:delivery.after – в конце секции доставки
* order/mg:payment.before – в начале секции оплаты
* order/mg:payment.after – в конце секции оплаты

В этих точках доступен контекст, который используется в точках встраивания карточки заказа order/card:*, так что расширения, написанные для карточки заказа должны работать корректно и в новых точках встраивания в чатах. Чтобы расширение заработало в новой точке, достаточно добавить цель встраивания в список доступных расширению целей.

Отображение элементов в новом таргете добавлено в примере cases/allTargetsButton библиотеки примеров @retailcrm/core-ui-extensions-examples.

Посмотреть доступные JS-модулям таргеты можно в справочнике.

#jsapi
🔥8👍21
Добавлен метод для более простого доступа к участию клиента в программе лояльности

В объект Customer добавлен новый метод customer.loyaltyAccount. Его можно использовать вместо более сложного выражения customer.loyaltyAccountBySiteCode(customer.site.code). Поведение и возвращаемый объект LoyaltyAccount для обоих выражений идентичны.

Подробнее в документации:
https://docs.retailcrm.ru/Developers/Automation/ObjectReference/Customer
https://docs.retailcrm.ru/Developers/Automation/ObjectReference/LoyaltyAccount
🎉6👍5