CommerceML: При каждом импорте из 1с изменений в заказах система постоянно меняет статус заказа с "Незавершенный" на текущий статус

Где возникла проблема: CS-Cart 4.16.2 RU

Суть проблемы: При каждом импорте из 1с изменений в заказах система постоянно меняет статус заказа с “Незавершенный” на текущий статус, что негативно влияет на зависимые от статусов заказа сущности, например на передаваемый в аналитику показатель конверсий. Также при установленном модуле “Журнал изменений заказа” наглядно видно как плодятся строки вида “Незавершенный → Выполнен” при каждом импорте заказов из 1с.

Как воспроизвести проблему: В настройках синхронизации во вкладке “Заказы” далее в самом низу раздела “Импорт заказов” ставим галочку “Импортировать изменения в заказах”, выбираем “Статус заказа после получения даты оплаты: Оплата принята” и “Статус заказа после получения даты отгрузки: Выполнен”. Для наглядности можно установить модуль “Журнал изменений заказа”. В 1с устанавливаем периодичность обмена заказами к примеру каждый час. Проводим заказ в 1с устанавливая даты оплаты и отгрузки. После нескольких обменов наблюдаем в журнале, что при каждом обмене статус меняется “Незавершенный → Выполнен” и так до бесконечности в зависимости сколько было и еще будет обменов со стороны 1с.

@Asya @ikoshkin Обратите внимание!

Дополню, что тут скорее всего необходимо на стороне cs-cart сделать доработку, чтобы если у заказа есть и дата оплаты и дата отгрузки, то импортировать эту информацию 1 раз, после чего считать заказ выполненным (архивным)

Здравствуйте!

Пожалуйста, уточните, про какой показатель конверсий и в какой аналитике идёт речь?

Как один из примеров в аддоне Google Analytics Enhanced Ecommerce add-on for CS-Cart есть настройка “Статусы оплаченных заказов” где выбран статус “Выполнен”.
Но это только как один из примеров, тоесть если используется функция статуса заказа то она постоянно передается далее, так как 1с постоянно изменяет статус при каждом импорте.

Также устанвите модуль “Журнал изменений заказа”, поставьте период импорта заказов, например, каждый час. Потом зайдите в какой-то из заказов и увидите, что на вкладке журнала изменения заказа будут ежечасно плодиться строки вида “Незавершенный → Выполнен” и так до бесконечности, в зависимости с какой периодичностью будет выполняться импорт заказов

Спасибо за уточнение.

Для начала, я проверил модуль Google Analytics, там смена статусов заказов модулем CommerceML не влияет на аналитику, поскольку запросы в Google в таком случае не отправляются.

Что касается работы модуля Google Analytics for your business, возможно, для него требуются дополнительные доработки для случая с CommerceML. В этом конкретном случае, вы можете написать нам в Help Desk, мои коллеги из модульного отдела посмотрят и дадут свой комментарий.

Журнал изменений заказа действительно фиксирует все изменения статуса у заказа, но это никак не должно отражаться на работе магазина.

Вообще, статус заказа изменяется на Незавершённый, поскольку заказ в процессе импорта обновляется. По умолчанию, любое изменение заказа, приводит к смену статуса на Незавершённый. После обновления, модуль возвращает заказу исходный статус. Это штатное поведение.

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

Index: app/addons/commerceml/src/Importers/OrderImporter.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/addons/commerceml/src/Importers/OrderImporter.php b/app/addons/commerceml/src/Importers/OrderImporter.php
--- a/app/addons/commerceml/src/Importers/OrderImporter.php	(revision fada0841b9d068f472502b11805f3f8e9deb7a57)
+++ b/app/addons/commerceml/src/Importers/OrderImporter.php	(date 1687778130495)
@@ -68,6 +68,12 @@
             return $result;
         }
 
+        if (in_array($current_order_data['status'], fn_get_order_paid_statuses())) {
+            $result->setSuccess(false);
+            $result->addMessage('order.not_updated', 'order skipped due to its status');
+            return $result;
+        }
+
         $order_status = $this->fillOrderStatus($order, $current_order_data);
 
         $notify_user = $order_status !== $current_order_data['status'];