[modRetailCRM] - Интеграция с RetailCRM
Представляю модуль для интеграции популярного сервиса RetailCRM с MODX.
Небольшой функционал предусмотрен сразу же при установке приложения.
Дополнение основано на собственной библиотеке RetailCRM и в ручном режиме поддерживает ВЕСЬ функционал доступный через API RetaiCRM
Для любителей кастомизировать функционал сайта\интернет-магазина под собственные нужды это означает, что вы можете как угодно взаимодействовать с CRM, оперируя любыми данными.
Для этого доступны десятки методов.
Достаточно Вызвать приложение и указать нужны метод
Например:
Все доступные методы и их параметры вы можете просмотреть в API RetaiCRM. У Сервиса отличная документация.
Точный вызов того или иного метода — можно найти в файле класса ApiClient внутри дополнения.
Как правило метод вроде /api/v4/customers/create вызывается как customersCreate
Главная идея — в том, что мы можем используя существующую библиотеку, передавать в CRM любые данные с сайта, и наоборот получать любую информацию из CRM. Возможности очень гибкие. Мы никак не привязаны к MiniShop2, например.
Можно написать собственные сниппеты и плагины работающие с ShopKeeper.
Совсем не обязательно вообще привязываться к интернет-магазинам.
Совсем простой сниппет позволит создавать в CRM контакт при заполнении классической контактной формы на сайте (пример я написал выше).
Естественно у вас должен быть аккаунт в RetailCRM.
В системных настройках сайта (раздел modretailcrm) Вам нужно указать API ключ, адрес вашей CRM и символьный код сайта. Все эти данные Вы можете посмотреть в личном кабинете RetailCRM
Приложение на данный момент находится на модерации в Modstore.pro, на днях будет опубликовано.
Если кому то не терпится попробовать — могу выслать установочный пакет на E-mail.
Обсуждаем компонент в комментариях. Постараюсь ответить на любые вопросы.
Также готов обсудить персональную адаптацию приложения под ваши конкретные проекты.
Работа из коробки
Небольшой функционал предусмотрен сразу же при установке приложения.
- Плагин срабатывающий на событие onUserSave, автоматически создает новый контакт в CRM при регистрации нового пользователя в MODX. Данное событие срабатывает в том числе при оформлении заказа в интернет-магазине.
- Плагин срабатывающий на событие msOnCreateOrder, автоматические создает новый заказ в CRM при оформлении заказа в MiniShop2
Ручной режим
Дополнение основано на собственной библиотеке RetailCRM и в ручном режиме поддерживает ВЕСЬ функционал доступный через API RetaiCRM
Для любителей кастомизировать функционал сайта\интернет-магазина под собственные нужды это означает, что вы можете как угодно взаимодействовать с CRM, оперируя любыми данными.
Для этого доступны десятки методов.
Достаточно Вызвать приложение и указать нужны метод
Например:
//Вызываем приложение
if (!$RetailCrm = $modx->getService('RetailCrm','modretailcrm',MODX_CORE_PATH.'components/modretailcrm/model/modretailcrm/')) {
$modx->log(1, '[RetailCrm] - Not found class RetailCrm');
return;
}
//Получаем список всех заказов одного клиента из CRM
$filters = array();
$filter['customer'] = '+7 701 987 65 43';
$orders = $RetailCrm->ordersList($filter);
//Массив $filters - позволяет фильтровать данные, указав, например, номер или Имя клиента.
//Создаем новый контакт
$customer = array();
$customer['firstName'] = 'Федор';
$customer['lastName'] = 'Бондарчук';
$customer['email'] = 'mail@mail.ru';
$customer['phones'][]['number'] = '+7 701 987 65 43';
$RetailCrm->customersCreate($customer);
Все доступные методы и их параметры вы можете просмотреть в API RetaiCRM. У Сервиса отличная документация.
Точный вызов того или иного метода — можно найти в файле класса ApiClient внутри дополнения.
Как правило метод вроде /api/v4/customers/create вызывается как customersCreate
Основное преимущество — гибкость в разработке
Главная идея — в том, что мы можем используя существующую библиотеку, передавать в CRM любые данные с сайта, и наоборот получать любую информацию из CRM. Возможности очень гибкие. Мы никак не привязаны к MiniShop2, например.
Можно написать собственные сниппеты и плагины работающие с ShopKeeper.
Совсем не обязательно вообще привязываться к интернет-магазинам.
Совсем простой сниппет позволит создавать в CRM контакт при заполнении классической контактной формы на сайте (пример я написал выше).
Предварительная настройка
Естественно у вас должен быть аккаунт в RetailCRM.
В системных настройках сайта (раздел modretailcrm) Вам нужно указать API ключ, адрес вашей CRM и символьный код сайта. Все эти данные Вы можете посмотреть в личном кабинете RetailCRM
Приложение на данный момент находится на модерации в Modstore.pro, на днях будет опубликовано.
Если кому то не терпится попробовать — могу выслать установочный пакет на E-mail.
Обсуждаем компонент в комментариях. Постараюсь ответить на любые вопросы.
Также готов обсудить персональную адаптацию приложения под ваши конкретные проекты.
Поблагодарить автора
Отправить деньги
Комментарии: 46
А есть пример с минишопом?
Нужно передать данные о корзине, заказчике, доставке, оплате.
Нужно передать данные о корзине, заказчике, доставке, оплате.
<?php
if (!$RetailCrm = $modx->getService('RetailCrm','modretailcrm',MODX_CORE_PATH.'components/modretailcrm/model/modretailcrm/')) {
$modx->log(1, '[RetailCrm] - Not found class RetailCrm');
return;
}
$site = $modx->getOption('modretailcrm_siteCode');
/** @var modX $modx */
switch ($modx->event->name) {
case 'msOnCreateOrder':
$Address = $msOrder->getOne('Address');
$orderData = array();
$orderData['customer']['externalId'] = $Address->get('user_id');
//Отправляем данные клиента
if ($profile = $modx->getObject('modUserProfile', $Address->get('user_id'))) {
$customer = array();
$customer['externalId'] = $Address->get('user_id');
$customer['firstName'] = $profile->fullname;
$customer['email'] = $profile->email;
if(!empty($profile->phone)){
$customer['phones'][]['number'] = $profile->phone;
}
if(!empty($profile->mobilephone)){
$customer['phones'][]['number'] = $profile->mobilephone;
}
$response = $RetailCrm->customersCreate($customer, $site);
}
$orderData['externalId'] = $Address->get('id');
$orderData['firstName'] = $Address->get('receiver');
$orderData['phone'] = $Address->get('phone');
$orderData['email'] = $Address->get('email');
$Products = $msOrder->getMany('Products');
$items = array();
$key = 0;
foreach ($Products as $pr) {
$options = $pr->toArray();
$orderData['items'][$key]['initialPrice'] = $pr->get('cost');
$orderData['items'][$key]['purchasePrice'] = $pr->get('cost');
$orderData['items'][$key]['productName'] = $pr->get('name');
$orderData['items'][$key]['quantity'] = $pr->get('count');
$orderData['items'][$key]['offer']['externalId'] = $pr->get('id');
$key ++;
}
//Указываем какие поля заполняются в корзине
$fields = array(
'index' => 'Индекс',
'country' => 'Страна',
'region' => 'Регион',
'city' => 'Город',
'metro' => 'Метро',
'street' => 'Улица',
'building' => 'Дом',
'room' => 'Квартира\офис',
'comment' => 'Комментарий к адресу'
);
$address = '';
foreach($fields as $field=>$comment){
if(!empty($Address->get($field))){
$address .= $comment.':'.$Address->get($field).' ';
$orderData['delivery']['address'][$field] = $Address->get($field);
}
}
$orderData['delivery']['address']['text'] = $address;
//Оплата и доставка довольно индивидуальны
//Если надо заполнять данные о сервисе и методе доставки заполняем поля раздела order[delivery]
//Данные об оплате заполняются в order[paymentType] order[paymentStatus] order[paymentDetail]
$response = $RetailCrm->ordersCreate($orderData, $site);
break;
}
Грац! Шикарное дополнение, особенно нравится НЕпривязка к minishop'у.
Рад помочь.
Опубликовано: modstore.pro/packages/import-and-export/modretailcrm!
Николай, у меня после установки лог забит ошибками
... xpdo.class.php : 503) Path specified for package modsendpulse is not a valid or accessible directory: ...
modsendpulse не устанавливал.
Спасибо за сигнал. Я использовал заготовку от modsendpulse. Видимо где то забыл заменить адрес каталога.
Вот уж не за что, это Вам — спасибо!
Заметил, что лог забивается сам по себе, без каких-то действий на сайте (он тестовый у меня). Как будто cron работает )
Заметил, что лог забивается сам по себе, без каких-то действий на сайте (он тестовый у меня). Как будто cron работает )
Николай, а будет ли обновление? Чтобы лог отдохнул )
Да конечно, на днях будет. Никак не выделю время с работой.
Выпустил обновление. Баг устранен.
Не совсем:
(ERROR @ /core/xpdo/xpdo.class.php: 503) Path specified for package modsendpulse is not a valid or accessible directory: core/components/modsendpulse/model/
Источник здесь: components/modretailcrm/index.class.php
(ERROR @ /core/xpdo/xpdo.class.php: 503) Path specified for package modsendpulse is not a valid or accessible directory: core/components/modsendpulse/model/
Источник здесь: components/modretailcrm/index.class.php
Подскажите, а смена статуса в админке магазина передается в retailCRM?
Нет в исходном плагине прописана отправка данных пользователя и отправка заказа, у которого соответственно статус Новый.
Для отправки обновления статуса нужно дописать плагин на событие msOnChangeOrderStatus
Я честно говоря не знаю, будет ли сейчас работать метод обновления, так как RetailCRM сейчас выпустили обновление API. Что то изменили, что то добавили, некоторые методы убрали. Надо тестировать короче.
Для отправки обновления статуса нужно дописать плагин на событие msOnChangeOrderStatus
Я честно говоря не знаю, будет ли сейчас работать метод обновления, так как RetailCRM сейчас выпустили обновление API. Что то изменили, что то добавили, некоторые методы убрали. Надо тестировать короче.
Только руки дошли…
В общем, у кого осталась ошибка с «modsendpulse» в логе после обновления, уберите «modsendpulse» из системной настройки minishop2 «extension_packages»
В общем, у кого осталась ошибка с «modsendpulse» в логе после обновления, уберите «modsendpulse» из системной настройки minishop2 «extension_packages»
Если не верно указать адрес retailCRM (modretailcrm_urlCrm), то будет
PHP message: PHP Fatal error: Uncaught Error: Class 'InvalidJsonException' not found in /home/xxx/xxx/xxx/components/modretailcrm/model/modretailcrm/Response/ApiResponse.php:52
Ошибка не очевидная… Наверно желательно добавить проверку нужных настроек в начале + добавить исключение, я так понимаю.
Добрый день.
Если пользователь есть в админке после оформления заказа выдает ошибку, данные не передаются в CRM
Подскажите как поправить. Спасибо.
Если пользователь есть в админке после оформления заказа выдает ошибку, данные не передаются в CRM
[customer.externalId] => Customer with externalId=6 not found. Order externalId=43.
Если пользователя нет админке, создает нового и данные в CRM передаетПодскажите как поправить. Спасибо.
Здравствуйте. Надо тестировать, так сходу не подскажу решение.
Добрый день! Такой вопрос, заказчик захотел подружить «Мой склад» и Retail CRM, при передаче заказа в Retail CRM к заказу надо добавить поле «Внешний код», которое есть в «Мой склад». Точнее не добавить, а вставить вместо id товара, чтобы Мой склад мог понять какой товар куплен и сброшен в заказе в Retail CRM. Это через tv поля можно сделать?
Да, почему бы и нет. Правильнее было бы не TV использовать, а добавить новое свойство товара. Это уменьшит время оформления заказа. Ну и подставляйте новый идентификатор в массив товаров, поле externalID, в плагине
У Вас модуль передает id товара вот этой строчкой
$orderData['items'][$key]['offer']['externalId'] = $product['externalCode'];
При такой настрйоке не срабатывает ничего, заказ не отправляется в Retail CRM
$orderData['items'][$key]['offer']['externalId'] = $product['externalId'];Для того, чтобы мой склад понял, что упало в заказе в Retail CRM, должно быть типа так
$orderData['items'][$key]['offer']['externalId'] = $product['externalCode'];
При такой настрйоке не срабатывает ничего, заказ не отправляется в Retail CRM
В конце плагина есть закомментированная строчка записи результата в лог. Нужно раскомментировать и посмотреть какая будет ошибка
Добрый день! Такой вопрос, а по какому полю Retail CRM понимаеьт какой товар заказали и сравнивает его с своей структурой, которую мы туда загрузили.
Вообще при выгрузке нужно указывать идентификатор товара в поле ExternalID
Если Вы этого не делали, тогда отдельного специального поля для связи товаров в различных системах нет.
В таком случае, можно перед передачей заказа в RetailCRM, получить идентификаторы товара, используя поиск по товарам в CRM
Для этого в плагине, там где начинается перебор товаров заказа, можно добавить дополнительный поисковый запрос в RetailCRM
Разумеется фокус сработает, если указанные данные у товаров в разных системах один и тот же.
Никто не мешает искать по другим общим параметрам.
Важно также понимать, что эти дополнительные запросы занимают время и заказ передается дольше, а клиент в этот момент сидит и смотрит на экран корзины.
Если Вы этого не делали, тогда отдельного специального поля для связи товаров в различных системах нет.
В таком случае, можно перед передачей заказа в RetailCRM, получить идентификаторы товара, используя поиск по товарам в CRM
Для этого в плагине, там где начинается перебор товаров заказа, можно добавить дополнительный поисковый запрос в RetailCRM
$store_response = $modRetailCrm->request->storeProducts(array('name' => $product['article']), 1, 20);
if($store_response->getStatusCode() == 200){
$product_id = $store_response['products'][0]['offers'][0]['id'];
}
$orderData['items'][$key]['offer']['id'] = $product_id;
Здесь вы ищите на складе RetailCRM товар, у которого наименование совпадает с артикулом в minishop2. Если такой товар найден получаем его id. Разумеется фокус сработает, если указанные данные у товаров в разных системах один и тот же.
Никто не мешает искать по другим общим параметрам.
Важно также понимать, что эти дополнительные запросы занимают время и заказ передается дольше, а клиент в этот момент сидит и смотрит на экран корзины.
Доброй ночи! Выше код, который я прописал, работает, но почему — то предает только правильно количество товара и цену, а название товара передает всегда одно и то же.
В этом случае ни цену, ни название товара вообще передавать не нужно, они есть в базе RetailCRM. Достаточно передавать идентификатор
Я, наверное не так выразился, в самой Retail CRM, когда туда заказ приходит, там в заказе вот имя товара высвечивается одно и то же, хотя остальные параметры (цена и количетсво) как надо.
Ну значит у тебя либо все товары с одним и тем же именем, либо ты передаешь один и тот же id товара
В админке все товары разные и при выгрущке структуры в Retail тоже разные,
Ну значит происходит магия
Retail CRM связана с «Мой склад», выгрузка структуры в Retail CRM просиходит с помощью мануала от «Мой склад», по идее этот никак не должно влиять на заказ, который приходит из minishop2, но сейчас приходит заказ с одинковым названием, но разными ценами и количеством
В общем, магия или нет, но 85 строчка была такой
$orderData['items'][$key]['productName'] = $product['name'];а должна быть такой
$orderData['items'][$key]['name'] = $product['name'];И вставка вот этого кода не нужна
$store_response = $modRetailCrm->request->storeProducts(array('name' => $product['article']), 1, 20); if($store_response->getStatusCode() == 200){ $product_id = $store_response['products'][0]['offers'][0]['id']; } $orderData['items'][$key]['offer']['id'] = $product_id;
Предыдущий комментарий ошибочный.
У меня чехарда с сайтом идет, вот этот код вставляю и работает, ничего более не меняю
У меня чехарда с сайтом идет, вот этот код вставляю и работает, ничего более не меняю
В общем, магия или нет, но код вот такой должен быть <pre> $store_response = $modRetailCrm->request->storeProducts(array('name' => $product['name']), 1, 20); if($store_response->getStatusCode() == 200){ $product_id = $store_response['products'][0]['offers'][0]['id']; } $orderData['items'][$key]['offer']['id'] = $product_id; </pre>
Спасибо, это сработало, для «Мой склад» теперь все передается. Вы можете это добавить себе в Ваш плагин, так как смогие их используют вмесет, «Мой склад» и «Retail CRM»
Хотя бы плюсик к статье поставьте вместе со спасибо,
По существу Не уверен что такая доработка плагина нужна. Вы пока второй на 130 загрузок, кто такое спрашивает.
По существу Не уверен что такая доработка плагина нужна. Вы пока второй на 130 загрузок, кто такое спрашивает.
Ну может быть, к статье не могу поставить плюсик, не дает, а вот к ответу да, могу.
Здравствуйте!
Ваш модуль использует устаревшую версию АПИ v4 и если да то когда вы планируете на v5 переводить?
Спасибо!
Ваш модуль использует устаревшую версию АПИ v4 и если да то когда вы планируете на v5 переводить?
Спасибо!
Это откуда у вас такая информация позвольте спросить?
исключительно из вашего поста "… Как правило метод вроде /api/v4/customers/create вызывается как customersCreate..." :) извините если ошибся в выводах
Пост 17 года, вполне может быть на момент написания была еще 4, а то и третья версия API.
На данный момент в компоненте пятая актуальная версия. Нормально все.
На данный момент в компоненте пятая актуальная версия. Нормально все.
Спасибо! в ближайшие пару дней покупаю однозначно у нас вообще нестандартная связка из двух баз 1С ут10 и ут11 товары льются в единый каталог в црм и из этих баз на сайт по складам остатки и цены и на сайте не все товары из этих баз, а новые создаются на сайте только из ут11 и всё это моими обработками по АПИ сайта, а дальше с сайта по разным правилам на разные магазины в црм льются заказы(но это все на кскарт и мне предстоит все адаптировать на MODX и ваш модуль просто вовремя мне попался на глаза иначе я думал с нуля писать придется!)
Пользуйтесь на здоровье!
купил :)
Здравствуйте,
Компонент приобрел недавно, прошу помощи в настройке или в устранение причины. Устанавливал не я, а другой человек с которым на связи.
Есть две пока что выявленной причины:
1. Сдэк. При выборе тарифа в карточке заказа выдает ошибку. Написал в сдэк получил ответ: " Так как вы пользуетесь модулем сторонней компании, по вопросам настройки, работы и доработки, вам необходимо обращаться к разработчикам данного модуля ...."
Глубоко по другим КС не смотрел и не настраивал, но выбор тарифа у Шиптора или Боксберри — работает.
2. UIS телефония. Ответа точного не получил по их части проблема или нет, по телефону проверили настройки базовые, сказали все ок. Проблема в том, что при звонке не появляется окошко о входящем звонке где отображается данные о покупателе да и в целом нет уведомления, что был пропущенный, а так же вместе с оператором заметили, что нет кнопки «трубка» там где она должна быть, чтобы можно было сразу позвонить из СРМ
Но там где сохраняются разговоры они есть и их прослушать можно, но опять же нет кнопки «трубка»
Компонент приобрел недавно, прошу помощи в настройке или в устранение причины. Устанавливал не я, а другой человек с которым на связи.
Есть две пока что выявленной причины:
1. Сдэк. При выборе тарифа в карточке заказа выдает ошибку. Написал в сдэк получил ответ: " Так как вы пользуетесь модулем сторонней компании, по вопросам настройки, работы и доработки, вам необходимо обращаться к разработчикам данного модуля ...."
Глубоко по другим КС не смотрел и не настраивал, но выбор тарифа у Шиптора или Боксберри — работает.
2. UIS телефония. Ответа точного не получил по их части проблема или нет, по телефону проверили настройки базовые, сказали все ок. Проблема в том, что при звонке не появляется окошко о входящем звонке где отображается данные о покупателе да и в целом нет уведомления, что был пропущенный, а так же вместе с оператором заметили, что нет кнопки «трубка» там где она должна быть, чтобы можно было сразу позвонить из СРМ
Но там где сохраняются разговоры они есть и их прослушать можно, но опять же нет кнопки «трубка»
Добрый день. Я так понимаю речь о неполадках внутри самой CRM?
Мой компонент не имеет к этому никакого отношения. Он работает ТОЛЬКО на сайте.
Мой компонент не имеет к этому никакого отношения. Он работает ТОЛЬКО на сайте.
Я сам не понимаю в чем именно проблема, пока что все перекидывают стрелки на других. Жду ответа от самого РетейлСРМ. За ответ и быстроту респект!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.