diff --git a/src/upload/catalog/model/extension/retailcrm/order.php b/src/upload/catalog/model/extension/retailcrm/order.php index c8e67fb..c208388 100644 --- a/src/upload/catalog/model/extension/retailcrm/order.php +++ b/src/upload/catalog/model/extension/retailcrm/order.php @@ -37,30 +37,7 @@ class ModelExtensionRetailcrmOrder extends Model { } if (!isset($order['customer']['externalId']) && !isset($order['customer']['id'])) { - $new_customer = array( - 'firstName' => $data['firstname'], - 'lastName' => $data['lastname'], - 'email' => $data['email'], - 'createdAt' => $data['date_added'], - 'address' => array( - 'countryIso' => $data['payment_iso_code_2'], - 'index' => $data['payment_postcode'], - 'city' => $data['payment_city'], - 'region' => $data['payment_zone'], - 'text' => $data['payment_address_1'] . ' ' . $data['payment_address_2'] - ) - ); - - if (!empty($data['telephone'])) { - $new_customer['phones'] = array( - array( - 'number' => $data['telephone'] - ) - ); - } - - $res = $retailcrmApiClient->customersCreate($new_customer); - + $res = $this->createCustomer($data, $retailcrmApiClient); if ($res->isSuccessful() && isset($res['id'])) { $order['customer']['id'] = $res['id']; } @@ -68,12 +45,28 @@ class ModelExtensionRetailcrmOrder extends Model { if ($create) { $order = self::filterRecursive($order); - $retailcrmApiClient->ordersCreate($order); + $response = $retailcrmApiClient->ordersCreate($order); + if (isset($response['errors']['customer.externalId'])) { + $res = $this->createCustomer($data, $retailcrmApiClient); + if ($res->isSuccessful() && isset($res['id'])) { + $order['customer']['id'] = $res['id']; + } + + $retailcrmApiClient->ordersCreate($order); + } } else { $order_payment = reset($order['payments']); unset($order['payments']); $order = self::filterRecursive($order); $response = $retailcrmApiClient->ordersEdit($order); + if (isset($response['errors']['customer.externalId'])) { + $res = $this->createCustomer($data, $retailcrmApiClient); + if ($res->isSuccessful() && isset($res['id'])) { + $order['customer']['id'] = $res['id']; + } + + $response = $retailcrmApiClient->ordersEdit($order); + } if ($this->settings[$this->moduleTitle . '_apiversion'] == 'v5' && $response->isSuccessful()) { $this->updatePayment($order_payment, $order['externalId'], $retailcrmApiClient); @@ -110,9 +103,9 @@ class ModelExtensionRetailcrmOrder extends Model { $shippingModule = $shippingCode[0]; if (isset($this->settings[$this->moduleTitle . '_delivery'][$order_data['shipping_code']])) { - $delivery_code = $this->settings[$this->moduleTitle . '_delivery'][$order_data['shipping_code']]; + $delivery_code = $this->settings[$this->moduleTitle . '_delivery'][$order_data['shipping_code']]; } elseif (isset($this->settings[$this->moduleTitle . '_delivery'][$shippingModule])) { - $delivery_code = $this->settings[$this->moduleTitle . '_delivery'][$shippingModule]; + $delivery_code = $this->settings[$this->moduleTitle . '_delivery'][$shippingModule]; } } @@ -423,4 +416,37 @@ class ModelExtensionRetailcrmOrder extends Model { } return $haystack; } + + /** + * @param array $data + * @param \RetailcrmProxy $retailcrmApiClient + * + * @return ApiResponse + */ + private function createCustomer($data, $retailcrmApiClient) + { + $customer = array( + 'firstName' => $data['firstname'], + 'lastName' => $data['lastname'], + 'email' => $data['email'], + 'createdAt' => $data['date_added'], + 'address' => array( + 'countryIso' => $data['payment_iso_code_2'], + 'index' => $data['payment_postcode'], + 'city' => $data['payment_city'], + 'region' => $data['payment_zone'], + 'text' => $data['payment_address_1'] . ' ' . $data['payment_address_2'] + ) + ); + + if (!empty($data['telephone'])) { + $customer['phones'] = array( + array( + 'number' => $data['telephone'] + ) + ); + } + + return $retailcrmApiClient->customersCreate($customer); + } } diff --git a/tests/catalog/ModelRetailcrmOrderCatalogTest.php b/tests/catalog/ModelRetailcrmOrderCatalogTest.php index 4a9bc93..c7a7b01 100644 --- a/tests/catalog/ModelRetailcrmOrderCatalogTest.php +++ b/tests/catalog/ModelRetailcrmOrderCatalogTest.php @@ -71,6 +71,32 @@ class ModelRetailcrmOrderCatalogTest extends TestCase } $orderProcess = $this->orderModel->processOrder($order); + $successResponse = new \RetailcrmApiResponse( + 200, + json_encode( + array( + 'success' => true, + 'id' => 1, + ) + ) + ); + + $orderCreateErrorResponse = new \RetailcrmApiResponse( + 400, + json_encode( + array( + 'errors' => array ( + 'customer.externalId' => "Customer with externalId=1 not found.", + ) + ) + ) + ); + + $this->apiClientMock->expects($this->any())->method('customersCreate')->willReturn($successResponse); + $this->apiClientMock->expects($this->any())->method('ordersCreate')->will( + $this->onConsecutiveCalls($orderCreateErrorResponse, $successResponse) + ); + $orderSend = $this->orderModel->sendToCrm($orderProcess, $this->apiClientMock, $order); $this->assertArrayHasKey('status', $orderSend); @@ -103,6 +129,7 @@ class ModelRetailcrmOrderCatalogTest extends TestCase $this->assertArrayHasKey('customer', $orderSend); $this->assertArrayHasKey('externalId', $orderSend['customer']); $this->assertEquals(self::CUSTOMER_ID, $orderSend['customer']['externalId']); + $this->assertEquals(1, $orderSend['customer']['id']); $this->assertArrayHasKey('payments', $orderSend); $this->assertEquals('cod', $orderSend['payments'][0]['type']); $this->assertNotEmpty($orderSend['payments']); @@ -145,9 +172,23 @@ class ModelRetailcrmOrderCatalogTest extends TestCase ) ); - $this->apiClientMock->expects($this->any())->method('ordersEdit')->willReturn($orderEditResponse); + $orderEditErrorResponse = new \RetailcrmApiResponse( + 400, + json_encode( + array( + 'errors' => array ( + 'customer.externalId' => "Customer with externalId=1 not found.", + ) + ) + ) + ); + $this->apiClientMock->expects($this->any())->method('ordersGet')->willReturn($ordersGetResponse); $this->apiClientMock->expects($this->any())->method('customersCreate')->willReturn($orderEditResponse); + $this->apiClientMock->expects($this->any())->method('ordersEdit')->will( + $this->onConsecutiveCalls($orderEditErrorResponse, $orderEditResponse) + ); + $orderProcess = $this->orderModel->processOrder($order); $orderSend = $this->orderModel->sendToCrm($orderProcess, $this->apiClientMock, $order, false); @@ -171,6 +212,7 @@ class ModelRetailcrmOrderCatalogTest extends TestCase $this->assertEquals('Rostov-na-Donu', $orderSend['delivery']['address']['region']); $this->assertEquals('111111', $orderSend['delivery']['address']['index']); $this->assertArrayHasKey('items', $orderSend); + $this->assertEquals(1, $orderSend['customer']['id']); foreach($orderSend['items'] as $item) { $this->assertArrayHasKey('priceType', $item); @@ -209,12 +251,12 @@ class ModelRetailcrmOrderCatalogTest extends TestCase array( 'success' => true, "pagination"=> [ - "limit"=>20, - "totalCount"=> 0, - "currentPage"=> 1, - "totalPageCount"=> 0 - ], - "customers"=> [] + "limit"=>20, + "totalCount"=> 0, + "currentPage"=> 1, + "totalPageCount"=> 0 + ], + "customers"=> [] ) ) );