From d20453cc9c338549754bdf60f28c3c2945e7d21d Mon Sep 17 00:00:00 2001 From: anton Date: Thu, 24 Oct 2024 17:44:18 +0300 Subject: [PATCH] Agent-upload-fix --- .../classes/general/RCrmActions.php | 5 +-- .../general/order/RetailCrmOrder_v5.php | 40 ++++++++++++++++++- intaro.retailcrm/description.ru | 2 +- intaro.retailcrm/install/version.php | 4 +- intaro.retailcrm/lang/en/options.php | 1 + intaro.retailcrm/lang/ru/options.php | 2 +- .../lib/component/configprovider.php | 30 ++++++++++++++ intaro.retailcrm/lib/component/constants.php | 3 +- intaro.retailcrm/options.php | 39 +++++++++++++++++- 9 files changed, 114 insertions(+), 12 deletions(-) diff --git a/intaro.retailcrm/classes/general/RCrmActions.php b/intaro.retailcrm/classes/general/RCrmActions.php index 60ee360f..b19a6ad3 100644 --- a/intaro.retailcrm/classes/general/RCrmActions.php +++ b/intaro.retailcrm/classes/general/RCrmActions.php @@ -266,8 +266,8 @@ class RCrmActions if (is_array($failedIds) && !empty($failedIds)) { RetailCrmOrder::uploadOrders(50, true); } - - return; + + return 'RCrmActions::uploadOrdersAgent();'; } /** @@ -290,7 +290,6 @@ class RCrmActions RetailCrmHistory::customerHistory(); RetailCrmHistory::orderHistory(); - self::uploadOrdersAgent(); } catch (\Throwable $exception) { Logger::getInstance()->write( 'Fail orderAgent:' . PHP_EOL . diff --git a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php b/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php index 78b4e5b5..68a9d667 100644 --- a/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php +++ b/intaro.retailcrm/classes/general/order/RetailCrmOrder_v5.php @@ -10,6 +10,7 @@ */ use Bitrix\Main\Context; +use Bitrix\Main\Type\DateTime; use Bitrix\Main\Context\Culture; use Bitrix\Main\UserTable; use Bitrix\Sale\Delivery\Services\Manager; @@ -429,7 +430,7 @@ class RetailCrmOrder return false; } } - + if ('ordersEdit' === $methodApi) { $order = RetailCrmService::unsetIntegrationDeliveryFields($order); } @@ -536,9 +537,11 @@ class RetailCrmOrder $resCustomersAdded = []; $resCustomersCorporate = []; $orderIds = []; + $orderUpdateIds = []; $lastUpOrderId = RetailcrmConfigProvider::getLastOrderId(); $failedIds = RetailcrmConfigProvider::getFailedOrdersIds(); + $uploadMethod = RetailcrmConfigProvider::getOrderDischarge(); if ($failed == true && $failedIds !== false && count($failedIds) > 0) { $orderIds = $failedIds; @@ -557,6 +560,24 @@ class RetailCrmOrder } } + if((int)$uploadMethod === 0) { + $dateOfLastUpdate = RetailcrmConfigProvider::getLastOrderUpdate(); + $dbOrderUpdate = OrderTable::GetList([ + 'order' => ['ID' => 'ASC'], + 'filter' => ['>DATE_UPDATE' => DateTime::createFromTimestamp(strtotime($dateOfLastUpdate))], + 'limit' => $pSize, + 'select' => ['ID'], + ]); + + while ($arOrderUpdate = $dbOrderUpdate->fetch()) { + $orderUpdateIds[] = $arOrderUpdate['ID']; + } + } + + + $orderIds = array_unique(array_merge($orderIds, $orderUpdateIds)); + + if (count($orderIds) <= 0) { return false; } @@ -615,6 +636,16 @@ class RetailCrmOrder continue; } + $orderCrm = RCrmActions::apiMethod($api, 'ordersGet', __METHOD__, $orderId, $site); + RetailcrmConfigProvider::setLastOrderUpdate(date("Y-m-d H:i:s")); + + if (isset($orderCrm['order'])) { + $methodApi = 'ordersEdit'; + $arParams['crmOrder'] = $orderCrm['order']; + } else { + $methodApi = 'ordersCreate'; + } + self::createCustomerForOrder($api, $arCustomer, $arCustomerCorporate,$arParams, $order, $site); if (isset($order['RESPONSIBLE_ID']) && !empty($order['RESPONSIBLE_ID'])) { @@ -622,7 +653,12 @@ class RetailCrmOrder $arParams['managerId'] = $managerService->getManagerCrmId((int) $order['RESPONSIBLE_ID']); } - $arOrders = self::orderSend($order, $api, $arParams, false, $site,'ordersCreate'); + if ($methodApi === 'ordersEdit') { + $arOrders = self::orderSend($order, $api, $arParams, true, $site, 'ordersEdit'); + continue; + } + + $arOrders = self::orderSend($order, $api, $arParams, false, $site, $methodApi); if (!$arCustomer || !$arOrders) { continue; diff --git a/intaro.retailcrm/description.ru b/intaro.retailcrm/description.ru index 0f5d5e40..8435764c 100644 --- a/intaro.retailcrm/description.ru +++ b/intaro.retailcrm/description.ru @@ -1 +1 @@ -- Исправлена подписка модуля на событие сохранения заказа +- Исправлена выгрузка заказов через агент diff --git a/intaro.retailcrm/install/version.php b/intaro.retailcrm/install/version.php index 3ef34253..2d927742 100644 --- a/intaro.retailcrm/install/version.php +++ b/intaro.retailcrm/install/version.php @@ -1,6 +1,6 @@ '6.5.37', - 'VERSION_DATE' => '2024-10-30 14:00:00' + 'VERSION' => '6.5.38', + 'VERSION_DATE' => '2024-10-31 15:00:00' ]; diff --git a/intaro.retailcrm/lang/en/options.php b/intaro.retailcrm/lang/en/options.php index d40b3cc6..3c218b98 100644 --- a/intaro.retailcrm/lang/en/options.php +++ b/intaro.retailcrm/lang/en/options.php @@ -41,6 +41,7 @@ $MESS ['ICRM_OPTIONS_ORDER_DISCHARGE_TAB'] = 'Orders uploading mode'; $MESS ['ORDER_DISCH'] = 'Orders uploading mode'; $MESS ['DISCHARGE_AGENT'] = 'Upload orders using agent'; $MESS ['DISCHARGE_EVENTS'] = 'Upload orders by events'; +$MESS ['DISCHARGE_WITHOUT_UPDATE'] = 'Upload orders by agent (without update)'; $MESS ['INFO_2'] = ' Set the correspondence between 1C-Bitrix and RetailCRM order fields.'; $MESS ['ORDER_PROPS'] = 'Correspondence settings between RetailCRM order fields and 1C-Bitrix order properties'; $MESS ['FIO'] = 'Full name'; diff --git a/intaro.retailcrm/lang/ru/options.php b/intaro.retailcrm/lang/ru/options.php index a5804cc1..e03b4632 100644 --- a/intaro.retailcrm/lang/ru/options.php +++ b/intaro.retailcrm/lang/ru/options.php @@ -62,7 +62,7 @@ $MESS ['ICRM_OPTIONS_ORDER_DISCHARGE_TAB'] = 'Режим выгрузки зак $MESS ['ORDER_DISCH'] = 'Режим выгрузки заказов'; $MESS ['DISCHARGE_AGENT'] = 'Выгрузка заказов с помощью агента'; $MESS ['DISCHARGE_EVENTS'] = 'Выгрузка заказов по событию'; - +$MESS ['DISCHARGE_WITHOUT_UPDATE'] = 'Выгрузка заказов по агенту (только создание заказов)'; $MESS ['INFO_2'] = ' Задайте соответствие между полями заказа 1C-Битрикс и RetailCRM.'; $MESS ['ORDER_PROPS'] = 'Настройки соответствия полей заказа RetailCRM свойствам заказа 1С-Битрикс'; diff --git a/intaro.retailcrm/lib/component/configprovider.php b/intaro.retailcrm/lib/component/configprovider.php index 5dd3e1fc..ab84faa2 100644 --- a/intaro.retailcrm/lib/component/configprovider.php +++ b/intaro.retailcrm/lib/component/configprovider.php @@ -548,6 +548,36 @@ class ConfigProvider return static::getOption(Constants::CRM_ORDER_LAST_ID); } + /** + * getLastOrderUpdate + * + * @return bool|string|null + */ + public static function getLastOrderUpdate() + { + return static::getOption(Constants::LAST_ORDER_UPDATE); + } + + /** + * setLastOrderUpdate + * + * @return bool|string|null + */ + public static function setLastOrderUpdate($value) + { + static::setOption(Constants::LAST_ORDER_UPDATE, $value); + } + + /** + * getOrderDischarge + * + * @return bool|string|null + */ + public static function getOrderDischarge() + { + return static::getOption(Constants::CRM_ORDER_DISCHARGE); + } + /** * getSendPaymentAmount * diff --git a/intaro.retailcrm/lib/component/constants.php b/intaro.retailcrm/lib/component/constants.php index 37f28c0b..5f4efb4a 100644 --- a/intaro.retailcrm/lib/component/constants.php +++ b/intaro.retailcrm/lib/component/constants.php @@ -18,7 +18,7 @@ namespace Intaro\RetailCrm\Component; */ class Constants { - public const MODULE_VERSION = '6.5.37'; + public const MODULE_VERSION = '6.5.38'; public const CRM_PURCHASE_PRICE_NULL = 'purchasePrice_null'; public const BITRIX_USER_ID_PREFIX = 'bitrixUserId-'; public const CRM_USERS_MAP = 'crm_users_map'; @@ -134,4 +134,5 @@ class Constants public const MODULE_DEACTIVATE = 'module_deactivate'; public const AGENTS_DEACTIVATE = 'agents_deactivate'; public const EVENTS_DEACTIVATE = 'events_deactivate'; + public const LAST_ORDER_UPDATE = 'last_order_update'; } diff --git a/intaro.retailcrm/options.php b/intaro.retailcrm/options.php index 36291d03..ba8c436b 100644 --- a/intaro.retailcrm/options.php +++ b/intaro.retailcrm/options.php @@ -314,16 +314,48 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) { //order discharge mode // 0 - agent // 1 - event + // 2 - agent without update + $agentUpload = false; $orderDischarge = (int) htmlspecialchars(trim($_POST['order-discharge'])); - if (($orderDischarge != $previousDischarge) && ($orderDischarge === 0)) { + if (($orderDischarge != $previousDischarge) && ($orderDischarge === 0 || $orderDischarge === 2 )) { // remove depenedencies - UnRegisterModuleDependences('sale', 'OnOrderUpdate', $mid, 'RetailCrmEvent', "onUpdateOrder"); UnRegisterModuleDependences('sale', 'OnSaleOrderDeleted', $mid, 'RetailCrmEvent', "orderDelete"); + UnRegisterModuleDependences('sale', 'OnSaleOrderSaved', $mid, 'RetailCrmEvent', "orderSave"); + UnRegisterModuleDependences('sale', 'OnOrderUpdate', $mid, 'RetailCrmEvent', "onUpdateOrder"); + $agentUpload = true; + + if ($orderDischarge === 0 && COption::GetOptionString($mid, Constants::LAST_ORDER_UPDATE) === '') { + COption::SetOptionString($mid, Constants::LAST_ORDER_UPDATE, date("Y-m-d H:i:s")); + } else { + COption::RemoveOption($mid, Constants::LAST_ORDER_UPDATE); + } + } elseif (($orderDischarge != $previousDischarge) && ($orderDischarge === 1)) { // event dependencies RegisterModuleDependences('sale', 'OnOrderUpdate', $mid, 'RetailCrmEvent', "onUpdateOrder"); RegisterModuleDependences('sale', 'OnSaleOrderDeleted', $mid, 'RetailCrmEvent', "orderDelete"); + RegisterModuleDependences('sale', 'OnSaleOrderSaved', $mid, 'RetailCrmEvent', "orderSave"); + COption::RemoveOption($mid, Constants::LAST_ORDER_UPDATE); + } + + if ($agentUpload) { + $dateAgent = new DateTime(); + $intAgent = new DateInterval('PT60S'); + $dateAgent->add($intAgent); + + CAgent::AddAgent( + 'RCrmActions::uploadOrdersAgent();', + $mid, + 'N', + 180, + $dateAgent->format('d.m.Y H:i:s'), + 'Y', + $dateAgent->format('d.m.Y H:i:s'), + 30 + ); + } else { + CAgent::RemoveAgent("RCrmActions::uploadOrdersAgent();", $mid); } $optionCart = COption::GetOptionString($mid, Constants::CART, 'N'); @@ -3015,6 +3047,9 @@ if (isset($_POST['Update']) && ($_POST['Update'] === 'Y')) { +