diff --git a/doc/3. Customization/Filters.md b/doc/3. Customization/Filters.md index 586d015..e04a7c4 100644 --- a/doc/3. Customization/Filters.md +++ b/doc/3. Customization/Filters.md @@ -30,6 +30,8 @@ > retailcrm_process_order_custom_fields - позволяет изменить данные кастомных полей заказ при передачи из CRM -> CMS. +> retailcrm_coupon_order - позволяет изменить данные кастомного поля купона при передачи из CRM -> CMS. + > retailcrm_process_offer - позволяет изменить данные товара перед записью в ICML каталог. > retailcrm_process_order - позволяет изменить данные заказа при передачи из CMS -> CRM. diff --git a/resources/pot/retailcrm-es_ES.pot b/resources/pot/retailcrm-es_ES.pot index 8e72c43..8b4dedf 100644 --- a/resources/pot/retailcrm-es_ES.pot +++ b/resources/pot/retailcrm-es_ES.pot @@ -124,6 +124,9 @@ msgstr "Ajustes del stock" msgid "Statuses" msgstr "Los estados" +msgid "Coupon" +msgstr 'Cupón' + msgid "Payment types" msgstr "Métodos de pago" diff --git a/resources/pot/retailcrm-ru_RU.pot b/resources/pot/retailcrm-ru_RU.pot index cbfb439..6e1605a 100644 --- a/resources/pot/retailcrm-ru_RU.pot +++ b/resources/pot/retailcrm-ru_RU.pot @@ -133,6 +133,9 @@ msgstr "Настройка управления остатками" msgid "Statuses" msgstr "Статусы" +msgid "Coupon" +msgstr "Купон" + msgid "Payment types" msgstr "Способы оплаты" diff --git a/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php b/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php index b73fff2..fb85c16 100644 --- a/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php +++ b/src/include/abstracts/class-wc-retailcrm-abstracts-settings.php @@ -341,6 +341,36 @@ abstract class WC_Retailcrm_Abstracts_Settings extends WC_Integration } } + /** + * Coupon options + */ + $coupon_option_list = ['not-upload' => __("Don't send to CRM", 'retailcrm')]; + $retailcrm_metaFiels_list = $this->apiClient->customFieldsList( + ['entity' => 'order', 'type' => ['string', 'text']] + ); + + if (!empty($retailcrm_metaFiels_list) && $retailcrm_metaFiels_list->isSuccessful()) { + foreach ($retailcrm_metaFiels_list['customFields'] as $retailcrm_metaField) { + $coupon_option_list[$retailcrm_metaField['code']] = $retailcrm_metaField['name']; + } + + $this->form_fields[] = [ + 'title' => __('Coupon', 'retailcrm'), + 'type' => 'heading', + 'description' => '', + 'id' => 'coupon_options' + ]; + + $this->form_fields['woo_coupon_apply_field'] = [ + 'title' => __('Coupon', 'retailcrm'), + 'css' => 'min-width:350px;', + 'class' => 'select', + 'type' => 'select', + 'options' => $coupon_option_list, + 'desc_tip' => true, + ]; + } + /** * Meta data options */ diff --git a/src/include/class-wc-retailcrm-history.php b/src/include/class-wc-retailcrm-history.php index 86c9595..14cb9b0 100644 --- a/src/include/class-wc-retailcrm-history.php +++ b/src/include/class-wc-retailcrm-history.php @@ -270,14 +270,27 @@ if (!class_exists('WC_Retailcrm_History')) : $this->updateMetaData($customFields, $order, $wcOrder); $wcOrderNumber = $wcOrder->get_order_number(); + $orderEditData = []; if ( $order['number'] != $wcOrderNumber && isset($this->retailcrmSettings['update_number']) && $this->retailcrmSettings['update_number'] == WC_Retailcrm_Base::YES ) { + $orderEditData['number'] = $wcOrderNumber; + } + + $items = $this->updateItemsForUsedCoupons($order, $wcOrder); + + if (!empty($items)) { + $orderEditData['items'] = $items; + } + + if (!empty($orderEditData)) { + $orderEditData['id'] = $order['id']; + $this->retailcrm->ordersEdit( - ['id' => $order['id'], 'number' => $wcOrderNumber], + $orderEditData, 'id' ); } @@ -999,6 +1012,53 @@ if (!class_exists('WC_Retailcrm_History')) : } } + /** + * Checks use coupons and updates offers + * + * @param array $order + * @param array $wcOrder + * + * @return array + */ + private function updateItemsForUsedCoupons($order, $wcOrder) + { + $couponField = apply_filters( + 'retailcrm_coupon_order', + $this->retailcrmSettings['woo_coupon_apply_field'], + $order, + $wcOrder + ); + + $isNewCoupon = false; + + if ($couponField !== 'not-upload' && !empty($order['customFields'][$couponField])) { + $masCoupons = explode(';', $order['customFields'][$couponField]); + + foreach ($masCoupons as $coupon) { + if (!empty($coupon) && !in_array($coupon, $wcOrder->get_coupon_codes())) { + $wcOrder->apply_coupon($coupon); + + $isNewCoupon = true; + } + } + + if ($isNewCoupon) { + $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 []; + } + /** * Returns data for address_1 and address_2(if exist data for this field) for WC order. * diff --git a/src/include/class-wc-retailcrm-orders.php b/src/include/class-wc-retailcrm-orders.php index e543c2c..11c0280 100644 --- a/src/include/class-wc-retailcrm-orders.php +++ b/src/include/class-wc-retailcrm-orders.php @@ -435,6 +435,20 @@ if (!class_exists('WC_Retailcrm_Orders')) : } } + $couponCustomField = $this->retailcrm_settings['woo_coupon_apply_field']; + + if ($couponCustomField !== 'not-upload') { + $codeCoupons = ''; + + foreach ($order->get_coupons() as $coupon) { + if (!empty($coupon->get_code())) { + $codeCoupons .= $coupon->get_code() . ';'; + } + } + + $orderData['customFields'][$couponCustomField] = $codeCoupons; + } + $this->order = WC_Retailcrm_Plugin::clearArray($orderData); $this->processOrderCustomerInfo($order, $update);