RetailCRM стандартный модуль

Добрый день!

Подскажите, возможно ли как-то инициировать прогрузку заказа в CRM, который по какой-то причине не ушел автоматически?

@cs-cart_team Вероятно, есть какая-то команда в командной строке? Или какой-то специальный режим? Быть может, лог есть что может подсказать, по какой причине не ушел заказ?

Я решил еще раз попробовать применить этот модуль на абслютно стандартной установке… синхронизировал на 100% статусы заказов, способы оплаты, способы доставки. Чистый каталог, меньше 200 товаров. И блин, вроде пару раз выгрузило заказы неделю назад и снова не выгружает. Ну должно же оно хоть немного то работать, хоть по-минимуму. Но что-то не работает.

По идее либо у заказа должно быть поле, либо это отдельная таблица модуля, в которой заказу проставляется статус, что он успешно принят CRM. То есть идет передача, CRM получает данные, записывает, и по итогу отдает связку “номер заказа” -> “статус выполнения”. Модуль получает этот ответ и прописывает полученный статус заказу. При следующем проходе по крону (либо если часть задач выполнилась с ошибкой запустить повторный проход, но тут надо быть осторожным и сначала проэкспериментироваепть, иначе можно впасть в бесконечный цикл) необработанные заказы будут обработаны снова.
Потому как есть только два пути: или по крону по расписанию, или по событию, но тогда скрипт должен довести выполнение до логичесмкого конца.

Добрый день.

Лог есть, находится в служебных файлах, папка retailcrm_logs. У нас в единичных случаях невыгрузки причиной является некорректный email.

1 лайк

Вот спасибо! Странная ерунда, ведь генерируется email, т.к. не обязателен для ввода.

Мысли

Вообще было бы здорово чтобы разработчики добавляли не просто что подходит для такой то версии такой то системы, а в каких условиях объемах и нагрузках тестировали. А то может под фразой, что модуль делает то то и то то подразумевается совсем не то, что нами подразумевается…

А как в таких случаях прогружаете?

Вручную создаем в crm,
Либо “действовать от лица покупателя” - заказы - оформить заказ повторно.

Немного топорно, я был бы тоже признателен, если бы cs-cart_team подсказала более элегантное решение :slight_smile:

Вообще конечно странно что проверки на существование email нет, а есть только странная регулярка, которая пропускает что ни попадя. Классов в нете на эту тему навалом, принцип - один и тот же - обмен заголовками с сервером без отправки письма, ну хоть например
https://htmlweb.ru/php/example/is_e-mail.php
я в свое время использовал две функции на проверку домена и проверку доступности адреса, но не суть. Может разработчики боятся тормозов при запросах, так всё происходит значительно быстрее, чем расчет доставки, который часто вообще падает.
А вот польза, что можно быть уверенным, что покупатель получит все уведомления (менеджеры не обращают внимание, что письмо не доставлено, они просто шлют и шлют письма, а потом аннулируют заказ потому что клиент не отвечает, или клиент не забирает заказ, потому что на правильную почту не пришел код отслеживания).
Но это конечно - для другой темы…

Так зачем вообще нужна эта проверка, если такого email заведомо не существует - он не введен при оформлении заказа и сформирован автоматически в виде test-testovyy-1620804942@example.com

Вот я так и хочу сделать у себя: у меня фейковые адреса формируются по схеме:
номер-телефона@мой-домен.ru
таким образом я могу исключить из проверки емэйлы с собственным доменом, а все остальные проверять.

Я имел в виду несколько иное. Ограничение на стороне RCRM, поэтому некоторые http запросы не принимаются в обработку.
В файле OrderConverter.php просто добавили удаление лишних символов из email адреса.


image

И всё-таки… ведь нереально написать аналогичный модуль не тестируя 100500 раз. Ведь 100% должен быть скрипт выгружающий определенный заказ, или все? Да или просто перевыгрузить, мало ли по каким причинам не выгрузилось…

Заказы в retailcrm отправляются по триггеру при создании заказа с помощью хуков. Других вариантов в модуле из коробки нет. Можно написать отдельный скрипт, который отправит заказы с выбранными id в Retailcrm - это не так сложно, но костыльно очень. Но Чтобы по кнопке выгружать отдельные заказы из админки в Retaicrm - это сложнее, нужно проверять наличие заказа в crm сначала, потом уже отправлять или обновлять заказ, больше логики и кода.

Но это же не нормально сделать модуль без описания, без инструкции, без особенностей, без вывода сообщений об ошибках и без возможности перевыгрузить когда что-то пошло не так, не поддерживающий даже коробочный функционал движка, даже самую базовую его часть, модуль который не работает даже с демо-данными… А не так пошло из-за имейла, который генерируется самой же коробкой и нет механизма исправления. Нельзя прогрузить старые заказы, нельзя покупателей… Для кого было сделано, уж если в магазине со 150 товарами, двумя способами оплаты и двумя способами доставки не работает, один из которых и там и там - Обсудить с менеджером…

Ошибки в логи пишутся, но очень скудно и каждый раз лезть и смотреть в файл не появилась ли какая-то ошибка и все ли заказы выгрузились - то ещё занятие. Куда удобнее, если б ошибки отправлялись боту в телеграмм для оперативности и наглядности. Вобщем есть, что развивать в модуле.

Да его похоже за несколько дней в рамках рекламы запилили в 2017 и с тех пор и не трогали… В третий раз пытаюсь его применить, уже в совсем примитивнейшем магазине. И в третий раз полный облом. Тут уже вообще нихрена нет - 150 простейших товаров, 2 способа доставки, 2 способа оплаты(коробочные, даже не переименовывались), никаких доработок. Не работает…

2 лайка

Вот накатал быстро функцию, которая выгружает все заказы в RetailCRM.
Если нужно выгрузить определенные заказы, то включите их ids в массив $order_ids вместо sql запроса.

function fn_retailcrm_export_orders()
{
    $order_ids = array();
    $order_ids = db_get_fields('SELECT order_id FROM ?:orders');

    if (!empty($order_ids)) {
	    foreach ($order_ids as $order_id) {
		    $order = fn_get_order_info($order_id);
		
		    if ($order['is_parent_order'] === 'Y') {
		        return;
		    }

		    /** @var \Tygh\Addons\Retailcrm\Service $service */
		    $service = Tygh::$app['addons.retailcrm.service'];
		
		    $service->createRetailCrmOrder($order);
		    fn_print_r("Заказ ID" . $order_id . " выгружен в RetailCRM");
		    sleep(1);
		}
	}
}
3 лайка

Добрый день.

Подскажите, в какой файл вы ставили функцию? В кастомный скрипт?
В заголовках use Tygh\Api;
use Tygh\Registry;
use Tygh\Addons\Retailcrm\Service as RetailcrmService;

Спасибо.

  1. В двух файлах насоображали изменений
    /app/addons/retailcrm/Tygh/Addons/Retailcrm/Converters
    orderconverter.php и customerconverter.php

Где передается массив данных по заказу, пишем
‘email’ => filter_var( $order[‘email’], FILTER_VALIDATE_EMAIL ) ? mb_strtolower( trim($order[‘email’]) ) : ( $order[‘order_id’] . ‘@example.com’ )

То есть, если почта корректная, передаем без изменений. Если нет - меняем на номеразаказа@example.com

  1. На днях столкнулись еще с ошибкой Error creating RetailCRM order: Order discount cannot be divided between items.

Решается установкой галки в настройках retailcrm.