diff --git a/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php b/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php index fb85c16..3e21d90 100644 --- a/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php +++ b/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php @@ -355,7 +355,7 @@ abstract class WC_Retailcrm_Abstracts_Settings extends WC_Integration } $this->form_fields[] = [ - 'title' => __('Coupon', 'retailcrm'), + 'title' => __("Coupon", 'retailcrm'), 'type' => 'heading', 'description' => '', 'id' => 'coupon_options' diff --git a/src/include/class-wc-retailcrm-history.php b/src/include/class-wc-retailcrm-history.php index 14cb9b0..0be5dc7 100644 --- a/src/include/class-wc-retailcrm-history.php +++ b/src/include/class-wc-retailcrm-history.php @@ -31,6 +31,9 @@ if (!class_exists('WC_Retailcrm_History')) : /** @var string */ protected $bindField = 'externalId'; + /** @var bool */ + protected $recalculateCoupons = false; + /** * WC_Retailcrm_History constructor. * @@ -280,7 +283,7 @@ if (!class_exists('WC_Retailcrm_History')) : $orderEditData['number'] = $wcOrderNumber; } - $items = $this->updateItemsForUsedCoupons($order, $wcOrder); + $items = $this->updateItemsForUsedCoupons($orderHistory, $wcOrder); if (!empty($items)) { $orderEditData['items'] = $items; @@ -467,6 +470,8 @@ if (!class_exists('WC_Retailcrm_History')) : } if (array_key_exists('items', $order)) { + $this->recalculateCoupons = true; + foreach ($order['items'] as $key => $crmProduct) { if (!isset($crmProduct['offer'][$this->bindField])) { continue; @@ -1015,47 +1020,72 @@ if (!class_exists('WC_Retailcrm_History')) : /** * Checks use coupons and updates offers * - * @param array $order + * @param array $orderHistory * @param array $wcOrder * * @return array */ - private function updateItemsForUsedCoupons($order, $wcOrder) + private function updateItemsForUsedCoupons($orderHistory, $wcOrder) { $couponField = apply_filters( 'retailcrm_coupon_order', $this->retailcrmSettings['woo_coupon_apply_field'], - $order, + $orderHistory, $wcOrder ); - $isNewCoupon = false; + if ($couponField === 'not-upload') { + return []; + } - if ($couponField !== 'not-upload' && !empty($order['customFields'][$couponField])) { - $masCoupons = explode(';', $order['customFields'][$couponField]); + $rewriteItems = false; + $wcOrderCoupons = $wcOrder->get_coupon_codes(); - foreach ($masCoupons as $coupon) { - if (!empty($coupon) && !in_array($coupon, $wcOrder->get_coupon_codes())) { - $wcOrder->apply_coupon($coupon); + if (!empty($orderHistory['customFields']) + && array_key_exists($couponField, $orderHistory['customFields']) + && empty($orderHistory['customFields'][$couponField]) + && !empty($wcOrderCoupons) + ) { + foreach ($wcOrderCoupons as $code) { + $wcOrder->remove_coupon($code); - $isNewCoupon = true; - } + $rewriteItems = true; + } + } + + if (!empty($orderHistory['customFields'][$couponField])) { + $masCoupons = explode('; ', $orderHistory['customFields'][$couponField]); + + foreach (array_diff($masCoupons, $wcOrderCoupons) as $coupon) { + $wcOrder->apply_coupon($coupon); + + $rewriteItems = true; } - if ($isNewCoupon) { - $orderItem = new WC_Retailcrm_Order_Item($this->retailcrmSettings); - $orderItems = []; + foreach (array_diff($wcOrderCoupons, $masCoupons) as $coupon) { + $wcOrder->remove_coupon($coupon); - foreach ($wcOrder->get_items() as $item) { - $orderItems[] = $orderItem->build($item)->getData(); - - $orderItem->resetData(); - } - - return $orderItems; + $rewriteItems = true; } } + if (!$rewriteItems && $this->recalculateCoupons) { + $wcOrder->recalculate_coupons(); + } + + if ($rewriteItems || $this->recalculateCoupons) { + $orderItem = new WC_Retailcrm_Order_Item($this->retailcrmSettings); + $orderItems = []; + + foreach ($wcOrder->get_items() as $item) { + $orderItems[] = $orderItem->build($item)->getData(); + + $orderItem->resetData(); + } + + return $orderItems; + } + return []; } diff --git a/src/include/class-wc-retailcrm-orders.php b/src/include/class-wc-retailcrm-orders.php index 11c0280..d7261d3 100644 --- a/src/include/class-wc-retailcrm-orders.php +++ b/src/include/class-wc-retailcrm-orders.php @@ -438,15 +438,15 @@ if (!class_exists('WC_Retailcrm_Orders')) : $couponCustomField = $this->retailcrm_settings['woo_coupon_apply_field']; if ($couponCustomField !== 'not-upload') { - $codeCoupons = ''; + $codeCoupons = []; foreach ($order->get_coupons() as $coupon) { if (!empty($coupon->get_code())) { - $codeCoupons .= $coupon->get_code() . ';'; + $codeCoupons[] = $coupon->get_code(); } } - $orderData['customFields'][$couponCustomField] = $codeCoupons; + $orderData['customFields'][$couponCustomField] = implode('; ', $codeCoupons); } $this->order = WC_Retailcrm_Plugin::clearArray($orderData); diff --git a/tests/helpers/class-wc-retailcrm-test-case-helper.php b/tests/helpers/class-wc-retailcrm-test-case-helper.php index 7b1ebbe..4b46519 100644 --- a/tests/helpers/class-wc-retailcrm-test-case-helper.php +++ b/tests/helpers/class-wc-retailcrm-test-case-helper.php @@ -79,6 +79,7 @@ class WC_Retailcrm_Test_Case_Helper extends WC_Unit_Test_Case ), 'product_description' => 'full', 'stores_for_uploading' => ['woocommerce', 'main'], + 'woo_coupon_apply_field' => 'testField', ]; update_option(WC_Retailcrm_Base::$option_key, $options); diff --git a/tests/test-wc-retailcrm-orders.php b/tests/test-wc-retailcrm-orders.php index c1889b6..812a279 100644 --- a/tests/test-wc-retailcrm-orders.php +++ b/tests/test-wc-retailcrm-orders.php @@ -120,6 +120,7 @@ class WC_Retailcrm_Orders_Test extends WC_Retailcrm_Test_Case_Helper $this->assertEquals($orderData['customFields']['crm_order'], 'test_custom_fields'); $this->assertEquals($orderData['customerComment'], 'crm_customer_comment_test'); $this->assertEquals($orderData['delivery']['address']['text'], 'crm_address_text_test'); + $this->assertEquals($orderData['customFields']['testField'], 'test1;test2;'); } else { $this->assertEquals(null, $order); } @@ -596,6 +597,11 @@ class WC_Retailcrm_Orders_Test extends WC_Retailcrm_Test_Case_Helper { /** @var WC_Order order */ $this->order = WC_Helper_Order::create_order(0); + $coupon1 = WC_Helper_Coupon::create_coupon('test1'); + $coupon2 = WC_Helper_Coupon::create_coupon('test2'); + + $this->order->apply_coupon($coupon1); + $this->order->apply_coupon($coupon2); foreach ($this->order->get_address('billing') as $prop => $value) { if (method_exists($this->order, 'set_shipping_' . $prop)) {