From bce545979c153d54c2ba14d11651f5a63c629b7c Mon Sep 17 00:00:00 2001 From: Kocmonavtik <61938582+Kocmonavtik@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:14:39 +0300 Subject: [PATCH] Optimization of order unloading (#359) --- CHANGELOG.md | 3 ++ VERSION | 2 +- src/include/class-wc-retailcrm-orders.php | 26 +++++++++++++ src/include/class-wc-retailcrm-uploader.php | 43 ++++++++++++++++----- src/readme.txt | 5 ++- src/retailcrm.php | 4 +- src/uninstall.php | 2 +- tests/test-wc-retailcrm-uploader.php | 12 ++++-- 8 files changed, 79 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c1d928..6c49d17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2025-02-04 4.8.19 +* Optimization of order unloading + ## 2025-02-03 4.8.18 * Added additional parameters to GET requests diff --git a/VERSION b/VERSION index b5de5f0..1e10d52 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.8.18 +4.8.19 diff --git a/src/include/class-wc-retailcrm-orders.php b/src/include/class-wc-retailcrm-orders.php index 596b640..33124e2 100644 --- a/src/include/class-wc-retailcrm-orders.php +++ b/src/include/class-wc-retailcrm-orders.php @@ -602,6 +602,32 @@ if (!class_exists('WC_Retailcrm_Orders')) : ); } + public function processOrderForUpload($orderIds) + { + $ordersForUpload = []; + $errorOrders = []; + + foreach ($orderIds as $orderId) { + try { + $this->order = []; + $this->processOrder(wc_get_order($orderId)); + + if ($this->order === []) { + throw new \RuntimeException(sprintf('Order %s is not uploaded', $orderId)); + } + + $ordersForUpload[] = $this->order; + } catch (Throwable $exception) { + $errorOrders[$orderId] = sprintf( + 'Exception for Order [%s]: %s. Trace: %s', + $orderId, $exception->getMessage(), $exception->getTraceAsString() + ); + } + } + + return [$ordersForUpload, $errorOrders]; + } + /** * Send payment in CRM * diff --git a/src/include/class-wc-retailcrm-uploader.php b/src/include/class-wc-retailcrm-uploader.php index 2422d27..75c2824 100644 --- a/src/include/class-wc-retailcrm-uploader.php +++ b/src/include/class-wc-retailcrm-uploader.php @@ -83,14 +83,11 @@ if (class_exists('WC_Retailcrm_Uploader') === false) { */ public function uploadArchiveOrders(?int $page, array $ids = []) { - WC_Retailcrm_Logger::info(__METHOD__, 'Archive order IDs: ' . implode(', ', $ids)); - if (!$this->retailcrm instanceof WC_Retailcrm_Proxy) { return null; } $orderIds = []; - $uploadErrors = []; if (null !== $page) { $orderIds = $this->getCmsOrders($page); @@ -98,14 +95,40 @@ if (class_exists('WC_Retailcrm_Uploader') === false) { $orderIds = $ids; } - if ($orderIds !== []) { - foreach ($orderIds as $orderId) { - $errorMessage = $this->orders->orderCreate($orderId); + if ($orderIds === []) { + return null; + } - if (is_string($errorMessage)) { - $uploadErrors[$orderId] = $errorMessage; - } + WC_Retailcrm_Logger::info(__METHOD__, 'Archive order IDs: ' . implode(', ', $ids)); + + [$ordersForUpload, $uploadErrors] = $this->orders->processOrderForUpload($orderIds); + + try { + $response = $this->retailcrm->ordersUpload($ordersForUpload); + + if (!$response->isSuccessful()) { + throw new RuntimeException( + sprintf( + 'Failure to upload orders: %s. Status code: %s', + $response->getErrorString(), + $response->getStatusCode() + ) + ); } + } catch (Exception $exception) { + WC_Retailcrm_Logger::error( + __METHOD__, + sprintf("Error while uploading orders: %s", $exception->getMessage()) + ); + + return null; + } + + /** WP version >= 6 */ + if (function_exists('wp_cache_flush_runtime')) { + wp_cache_flush_runtime(); + } else { + wp_cache_flush(); } $this->logOrdersUploadErrors($uploadErrors); @@ -225,7 +248,7 @@ if (class_exists('WC_Retailcrm_Uploader') === false) { */ private function logOrdersUploadErrors($errors) { - if (empty($errors) === true) { + if ($errors === []) { return; } diff --git a/src/readme.txt b/src/readme.txt index fdc96a4..de92e1f 100644 --- a/src/readme.txt +++ b/src/readme.txt @@ -5,7 +5,7 @@ Tags: Интеграция, Simla.com, simla Requires PHP: 7.1 Requires at least: 5.3 Tested up to: 6.5 -Stable tag: 4.8.18 +Stable tag: 4.8.19 License: GPLv1 or later License URI: http://www.gnu.org/licenses/gpl-1.0.html @@ -82,6 +82,9 @@ Asegúrate de tener una clave API específica para cada tienda. Las siguientes i == Changelog == += 4.8.19 = +* Optimization of order unloading + = 4.8.18 = * Added additional parameters to GET requests diff --git a/src/retailcrm.php b/src/retailcrm.php index 01af638..8c17de5 100644 --- a/src/retailcrm.php +++ b/src/retailcrm.php @@ -5,7 +5,7 @@ * Description: Integration plugin for WooCommerce & Simla.com * Author: RetailDriver LLC * Author URI: http://retailcrm.pro/ - * Version: 4.8.18 + * Version: 4.8.19 * Tested up to: 6.5 * Requires Plugins: woocommerce * WC requires at least: 5.4 @@ -27,7 +27,7 @@ if (!class_exists( 'WC_Integration_Retailcrm')) : class WC_Integration_Retailcrm { const WOOCOMMERCE_SLUG = 'woocommerce'; const WOOCOMMERCE_PLUGIN_PATH = 'woocommerce/woocommerce.php'; - const MODULE_VERSION = '4.8.18'; + const MODULE_VERSION = '4.8.19'; private static $instance; diff --git a/src/uninstall.php b/src/uninstall.php index 0619379..7a232fd 100644 --- a/src/uninstall.php +++ b/src/uninstall.php @@ -16,7 +16,7 @@ * * @link https://wordpress.org/plugins/woo-retailcrm/ * - * @version 4.8.18 + * @version 4.8.19 * * @package RetailCRM */ diff --git a/tests/test-wc-retailcrm-uploader.php b/tests/test-wc-retailcrm-uploader.php index eec6ff3..9fa8967 100644 --- a/tests/test-wc-retailcrm-uploader.php +++ b/tests/test-wc-retailcrm-uploader.php @@ -36,7 +36,8 @@ class WC_Retailcrm_Uploader_Test extends WC_Retailcrm_Test_Case_Helper 'getCountOrders', 'customersGet', 'customersList', - 'ordersCreate' + 'ordersCreate', + 'ordersUpload', )) ->getMock(); @@ -96,10 +97,10 @@ class WC_Retailcrm_Uploader_Test extends WC_Retailcrm_Test_Case_Helper * @param $retailcrm * @dataProvider dataProviderApiClient */ - public function test_upload_selected_orders() + public function test_upload_selected_orders($retailcrm) { $_GET['order_ids_retailcrm'] = '123, 345, 456'; - $retailcrm_uploader = $this->getRetailcrmUploader($this->apiMock); + $retailcrm_uploader = $this->getRetailcrmUploader($retailcrm); $uploadSelectedOrders = $retailcrm_uploader->uploadSelectedOrders(); $this->assertEquals(null, $uploadSelectedOrders); @@ -123,6 +124,11 @@ class WC_Retailcrm_Uploader_Test extends WC_Retailcrm_Test_Case_Helper public function dataProviderApiClient() { $this->setUp(); + $this->apiMock + ->expects($this->any()) + ->method('ordersUpload') + ->willReturn(new WC_Retailcrm_Response(200, '')) + ; return array( array(