[modRetailCRM - 2.2.1]

Давненько я ничего не публиковал. Здравствуйте.

Для начала хочу рассказать об изменениях modRetaiCRM и поблагодарить всех ребят, которые мне пишут с багрепортами и замечаниями. Последние обновления были посвящены исправлению ошибок и дополнению функционала, о котором просили.
Вот что получилось.



Список изменений продукта



2.1.0
==============
— Отключена передача способа доставки и оплаты и за ошибки на стороне RetailCRM
— Исправлена передача общей стоимости нескольки разных тоаров
— Добавлена передача стоимости доставки
— Добавлена передача веса товара
— Добавлено разбиение Строки ФИО на отдельные поля
— Добавлена проверка на существование пользователя на стороне RetailCRM

2.2.0
==============
— В объект msDelivery, добавлено дополнительное поле retailcrm_delivery_code, позволяющее указать символьный код доставки из настроек retailCRM, что дает возможность передавать способ доставки при заказе.
— В объект msPayment, добавлено дополнительное поле retailcrm_payment_code, позволяющее указать символьный код способа оплаты из настроек retailCRM, что дает возможность передавать способ оплаты при заказе.













2.2.1 — (11.06.2018)
==============
— В выгрузку заказов добавлен передача способа доставки и способа оплаты

Статья была бы не полной, если я не отвечу на еще один повторяющийся вопрос

Как передать в minishop2 изменения на стороне RetailCRM



Я конечно понимаю, что изменений в магазине может быть огромное количество. Это и работа с товаром, и с клиентами и с заказами. Моя задача — объяснить общее направление мысли и показать пример.

Пример возьмем такой.
  1. Заказ, сделанный в интернет-магазине, плагин передал в RetailCRM
  2. Менеджер, обработав заказ — изменил ему статус в RetailCRM
  3. Обновленный статус должен автоматически выгрузиться в интернет-магазин, и обновить статус заказа на соответствующий
Конечно же в дело вступают всем известные webhooks, которые отлеживают изменения внутри CRM, по заранее заданному сценарию и передают информацию на коннектор сайта. В общем то типовая ситуация для любой современной CRM, но в RetailCRM решил быть оригинальными и спрятали эту возможность достаточно глубоко и неочевидно.

Итак что мы делаем для решения подобных задач.

1. В личном кабинете RetailCRM ищем пункт Коммуникации-Триггеры
2. Создаем новый триггер со следующими параметрами:
  • Событие, которое мы будем отлавливать Изменение заказа
  • Действие, которое будет выполняться при выполнение указанных условий Выполнить HTTP-запрос
  • HTTP метод POST запрос (на самом деле можно и GET — это уже вкусовщина)
  • Адрес: Коннектор на вашем сайте, на котором будет отправляться запрос. Естественно там должна быть программа, принимающая POST запрос и выполняющая необходимые действия. В нашем случае вызывая заказ с принятым id и устанавливая для него переданный статус
  • Условие применения триггера. Здесь нужно написать условие при наступлении которого будет выполняться HTTP запрос к нашему коннектору. Например можно перечислить статусы заказа RetailCRM при указании которых будет выполняться триггер. Допустим Вам нужно передать на сайт окончательный статус Оплачен или Отменен, и не передавать промежуточные статусы Подтвержден, Обработан, Выставлен счет и т.п.
    Для написания подобных условий нужно использовать шаблонизатор (по моему Twig) и предусмотренные для этого методы
    Я подготовил следующее условие
    changeSet.hasChangedField("status") and changeSet.getNewValue("status").getGroupCode() in ["complete", "cancel"]
    Условие расшифровывается так. Если при среди измененных полей есть поле Status и новое значение поля Status находится в группе статусов Выполнен или Отменен — то выполняем действие.

    Подробнее о правилах подготовки и написании триггеров можно узнать в документации
    Правила подготовки триггеров и триггеры
3. Последний параметр настройки триггера — передаваемые на наш коннектор параметры. В случае с моим примером это:
  • id заказа — order = {{ order.getExternalId() }}
  • код статуса status = {{ order.getStatus() }}





4. На нашем сайте коннектор должен принять передаваемую ему информацию, вызвать нужный заказ и поменять ему статус. Код программы получится примерно такой.

<?php
//Подключаем к произвольному файлу MODX API
define('MODX_API_MODE', true);
require_once($_SERVER['DOCUMENT_ROOT'].'/index.php');

$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);


if($_POST['status'] && $_POST['order']){
	//Принимаем параметры
	$status = trim( filter_input(INPUT_POST,'status',  FILTER_SANITIZE_STRING) );
	$order = trim( filter_input(INPUT_POST,'order',  FILTER_SANITIZE_STRING) );
	
	//Указываем какой статус заказа минишопа соответствует каждому возможному варианту RetailCRM
	$new_status = 0;
	switch($status){
		case 'sh-send':
			$new_status = 3;
			break;
		case 'cancel-other':
			$new_status = 4;
			break;
	}
	
	//Вызываем объект заказа и меняем ему статус
	$order = $modx->getObject('msOrder', array('num' => $order));
	if($order && $new_status > 0){
		$order->set('status', $new_status);
		$order->save();
	}
}
Николай Савин
12 июня 2018, 09:25
111
+5

Комментарии: 6

Dmitry
10 июля 2018, 16:03
0
Заказы не передаются, добавил в плагин строчку печати в лог, получаю такую ошибку:
[2018-07-10 15:52:03] (ERROR @ /home/s14252/www/meat/cache/includes/elements/modplugin/19.include.cache.php : 93) [modRetailCRM]  Order Response RetailCrm\Response\ApiResponse Object
(
    [statusCode:protected] => 400
    [response:protected] => Array
        (
            [success] => 
            [errorMsg] => Order is not loaded
            [errors] => Array
                (
                    [customer.externalId] => Customer with externalId=2 not found. Order externalId=16.
                )

        )

)
Буду благодарен за совет, как исправить.
    Николай Савин
    10 июля 2018, 16:12
    +1
    Вы обновляли компонент? По идее в свежей версии эта проблема устранена.
      Dmitry
      10 июля 2018, 16:37
      0
      Хм, установил компонент из репозитория только сегодня. Установилась версия 2.0.0. Нужно обновить как-то вручную?
        Николай Савин
        10 июля 2018, 16:39
        +1
        Текущая версия 2.2.1 Нужно устанавливать из репозитория modstore.pro. Все свежие версии и обновления там. За наводку спасибо дойдут руки обновлю в официальном
          Dmitry
          10 июля 2018, 16:43
          0
          Спасибо за ответ, обновился из репозитория modstore.pro, всё заработало.