From b4200c952f17fff1e9a0a0faace3ecac3f263a78 Mon Sep 17 00:00:00 2001 From: Pavel Date: Tue, 19 Nov 2019 11:09:22 +0300 Subject: [PATCH] orders upload with corporate customers --- src/include/class-wc-retailcrm-customers.php | 16 ++++ src/include/class-wc-retailcrm-history.php | 63 ++++---------- src/include/class-wc-retailcrm-orders.php | 92 +++++++++++++++++++- src/include/class-wc-retailcrm-plugin.php | 32 +++++++ 4 files changed, 155 insertions(+), 48 deletions(-) diff --git a/src/include/class-wc-retailcrm-customers.php b/src/include/class-wc-retailcrm-customers.php index 8f82b4b..86836ab 100644 --- a/src/include/class-wc-retailcrm-customers.php +++ b/src/include/class-wc-retailcrm-customers.php @@ -54,6 +54,22 @@ if (!class_exists('WC_Retailcrm_Customers')) : $this->customer_address = $customer_address; } + /** + * setCustomerAddress + * + * @param $address + * + * @return $this + */ + public function setCustomerAddress($address) + { + if ($address instanceof WC_Retailcrm_Customer_Address) { + $this->customer_address = $address; + } + + return $this; + } + /** * Returns true if corporate customers are enabled and accessible * diff --git a/src/include/class-wc-retailcrm-history.php b/src/include/class-wc-retailcrm-history.php index 1944e89..8a672b6 100644 --- a/src/include/class-wc-retailcrm-history.php +++ b/src/include/class-wc-retailcrm-history.php @@ -174,6 +174,17 @@ if ( ! class_exists( 'WC_Retailcrm_History' ) ) : $history = $response['history']; $end_change = end($history); $new_since_id = $end_change['id']; + + $mapping = array( + 'first_name' => 'first_name', + 'last_name' => 'last_name', + 'email' => 'billing_email', + 'phones' => 'billing_phone', + 'address.region' => 'billing_state', + 'address.index' => 'billing_postcode', + 'address.country' => 'billing_country', + 'address.city' => 'billing_city' + ); foreach ($history as $record) { if ($record['source'] == 'api' && $record['apiKey']['current'] == true) { @@ -196,51 +207,15 @@ if ( ! class_exists( 'WC_Retailcrm_History' ) ) : WC_Retailcrm_Plugin::$history_run = true; - if ($record['field'] == 'first_name' && isset($record['customer']['externalId'])) { - if ($record['newValue']){ - update_user_meta($record['customer']['externalId'], 'first_name', $record['newValue']); - } - } - - elseif ($record['field'] == 'last_name' && isset($record['customer']['externalId'])) { + if (isset($mapping[$record['field']]) && isset($record['customer']['externalId'])) { if ($record['newValue']) { - update_user_meta($record['customer']['externalId'], 'last_name', $record['newValue']); - } - } - - elseif ($record['field'] == 'email' && isset($record['customer']['externalId'])) { - if ($record['newValue']){ - update_user_meta($record['customer']['externalId'], 'billing_email', $record['newValue']); - } - } - - elseif ($record['field'] == 'phones' && isset($record['customer']['externalId'])) { - if ($record['newValue']){ - update_user_meta($record['customer']['externalId'], 'billing_phone', $record['newValue']); - } - } - - elseif ($record['field'] == 'address.region' && isset($record['customer']['externalId'])) { - if ($record['newValue']){ - update_user_meta($record['customer']['externalId'], 'billing_state', $record['newValue']); - } - } - - elseif ($record['field'] == 'address.index' && isset($record['customer']['externalId'])) { - if ($record['newValue']){ - update_user_meta($record['customer']['externalId'], 'billing_postcode', $record['newValue']); - } - } - - elseif ($record['field'] == 'address.country' && isset($record['customer']['externalId'])) { - if ($record['newValue']){ - update_user_meta($record['customer']['externalId'], 'billing_country', $record['newValue']); - } - } - - elseif ($record['field'] == 'address.city' && isset($record['customer']['externalId'])) { - if ($record['newValue']){ - update_user_meta($record['customer']['externalId'], 'billing_city', $record['newValue']); + if (is_array($mapping[$record['field']])) { + foreach ($mapping[$record['field']] as $mappingField) { + update_user_meta($record['customer']['externalId'], $mappingField, $record['newValue']); + } + } else { + update_user_meta($record['customer']['externalId'], $mapping[$record['field']], $record['newValue']); + } } } diff --git a/src/include/class-wc-retailcrm-orders.php b/src/include/class-wc-retailcrm-orders.php index 826003f..5d1b69a 100644 --- a/src/include/class-wc-retailcrm-orders.php +++ b/src/include/class-wc-retailcrm-orders.php @@ -14,7 +14,7 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) : */ class WC_Retailcrm_Orders { - /** @var bool|WC_Retailcrm_Proxy */ + /** @var bool|WC_Retailcrm_Proxy|\WC_Retailcrm_Client_V5|\WC_Retailcrm_Client_V4 */ protected $retailcrm; /** @var array */ @@ -72,6 +72,13 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) : return null; } + $isCorporateEnabled = WC_Retailcrm_Customers::isCorporateEnabledInApi($this->retailcrm); + $uploader = new WC_Retailcrm_Customers( + $this->retailcrm, + $this->retailcrm_settings, + new WC_Retailcrm_Customer_Address() + ); + $orders = get_posts(array( 'numberposts' => -1, 'post_type' => wc_get_order_types('view-orders'), @@ -80,6 +87,7 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) : )); $orders_data = array(); + $orders_data_corps = array(); foreach ($orders as $data_order) { $order = wc_get_order($data_order->ID); @@ -95,20 +103,96 @@ if ( ! class_exists( 'WC_Retailcrm_Orders' ) ) : } } - $orders_data[] = $this->order; + if ($isCorporateEnabled + && WC_Retailcrm_Customers::customerPossiblyCorporate(new WC_Customer($customer->get('ID'))) + ) { + $corporate = $this->retailcrm->customersCorporateGet($customer->get('ID')); + time_nanosleep(0, 100000000); + + if ($corporate instanceof WC_Retailcrm_Response + && $corporate->isSuccessful() + && $corporate->offsetExists('customerCorporate') + && isset($corporate['customerCorporate']['mainCustomerContact']) + && isset($corporate['customerCorporate']['mainCustomerContact']['customer']) + && isset($corporate['customerCorporate']['mainCustomerContact']['customer']['id']) + && isset($corporate['customerCorporate']['mainCustomerContact']['customer']['externalId']) + ) { + $this->order['contact'] = array( + 'id' => + $corporate['customerCorporate']['mainCustomerContact']['customer']['id'] + ); + + $orders_data_corps[] = $this->order; + } else { + $orders_data[] = $this->order; + } + } else { + $orders_data[] = $this->order; + } } + $corporateCustomers = array(); + if ($withCustomers === true && !empty($customers)) { - $this->customers->customersUpload($customers); + if ($isCorporateEnabled) { + foreach ($customers as $key => $customer) { + if (WC_Retailcrm_Customers::customerPossiblyCorporate(new WC_Customer($customer))) { + $corporateCustomers[] = $customer; + unset($customers[$key]); + } + } + + $uploadCustomers = array_chunk($customers, 50); + + foreach ($uploadCustomers as $uploadCustomer) { + $this->customers->customersUpload($uploadCustomer); + time_nanosleep(0, 250000000); + } + + foreach ($corporateCustomers as $corporateCustomer) { + $response = $uploader->createCorporateCustomer(new WC_Customer($corporateCustomer)); + + if ($response instanceof WC_Retailcrm_Customer_Corporate_Response) { + if ($response->getContactId() != 0) { + foreach ($orders_data as $key => $order) { + if (isset($order['customer']['externalId']) + && $order['customer']['externalId'] == $response->getExternalId() + ) { + $order['contact'] = array( + 'id' => $response->getContactId() + ); + $orders_data_corps[] = $order; + unset($orders_data[$key]); + + break; + } + } + } + } + } + } else { + $uploadCustomers = array_chunk($customers, 50); + + foreach ($uploadCustomers as $uploadCustomer) { + $this->customers->customersUpload($uploadCustomer); + time_nanosleep(0, 250000000); + } + } } - $uploadOrders = array_chunk($orders_data, 50); + $uploadOrders = array_chunk(WC_Retailcrm_Plugin::clearArray($orders_data), 50); + $uploadOrdersCorps = array_chunk(WC_Retailcrm_Plugin::clearArray($orders_data_corps), 50); foreach ($uploadOrders as $uploadOrder) { $this->retailcrm->ordersUpload($uploadOrder); time_nanosleep(0, 250000000); } + foreach ($uploadOrdersCorps as $uploadOrdersCorp) { + $this->retailcrm->ordersUpload($uploadOrdersCorp); + time_nanosleep(0, 250000000); + } + return $uploadOrders; } diff --git a/src/include/class-wc-retailcrm-plugin.php b/src/include/class-wc-retailcrm-plugin.php index f78c62e..34017df 100644 --- a/src/include/class-wc-retailcrm-plugin.php +++ b/src/include/class-wc-retailcrm-plugin.php @@ -127,6 +127,38 @@ class WC_Retailcrm_Plugin { return false; } + /** + * Unset empty fields + * + * @param array $arr input array + * + * @return array + */ + public static function clearArray(array $arr) + { + if (!is_array($arr)) { + return $arr; + } + + $result = []; + + foreach ($arr as $index => $node) { + $result[$index] = (is_array($node)) + ? self::clearArray($node) + : $node; + + if ($result[$index] == '' + || $result[$index] === null + || (is_array($result[$index]) && count($result[$index]) < 1) + ) { + unset($result[$index]); + } + } + + return $result; + } + + /** * Check running history *