diff --git a/classes/ApiHelper.php b/classes/ApiHelper.php index 8e039d7..27148a8 100644 --- a/classes/ApiHelper.php +++ b/classes/ApiHelper.php @@ -48,67 +48,89 @@ class ApiHelper { $orders = $this->filterOrders($orders); - if ($this->uploadOrders($orders)) { - $a = sizeof($orders); - echo "uploaded $a orders" . PHP_EOL; - return true; - } else { - echo "upload failed" . PHP_EOL; - return false; - } + $this->uploadOrders($orders); } protected function uploadOrders($orders) { - if ($orders === false) - return false; if (sizeof($orders)) { $orders = array_chunk($orders, $this->config['retailcrm_order_chunk_size']); foreach ($orders as $chunk) { try { $result = $this->crmClient->ordersUpload($chunk); + if (!$result->isSuccessful()) { + $this->writeLog('ordersUpload: ' . $result['errorMsg'] . (isset($result['errors']) ? ': ' . json_encode($result['errors']) : '')); + } + time_nanosleep(0, 200000000); } catch (\RetailCrm\Exception\CurlException $e) { - $this->writeLog( - '\Retailcrm\ApiClient::ordersUpload: ' . $e, - 'error' - ); - return false; + $this->writeLog('ordersUpload: ' . $e, 'error'); } - if (! $result->isSuccessful()) { - $this->writeLog( - '\Retailcrm\ApiClient::ordersUpload: ' . $result['errorMsg'] . (isset($result['errors']) ? ': ' . json_encode($result['errors']) : '') - ); - } - time_nanosleep(0, 200000000); } + + return true; + } else { + return false; } - return true; } protected function checkCustomers($order) { $customerId = false; - if ($order['email'] != '') $filter['email']= $order['email']; - if ($order['phone'] != '') $filter['name'] = $order['phone']; + $filter = array(); - if (isset($filter)) { + if (!empty($order['email'])) $filter['email']= $order['email']; + if (!empty($order['phone'])) $filter['name'] = $order['phone']; + + if (!empty($filter)) { try { $customers = $this->crmClient->customersList($filter); } catch (\RetailCrm\Exception\CurlException $e) { - $this->writeLog( - '\Retailcrm\ApiClient::customersList: ' . $e, - 'error' - ); - return false; + $this->writeLog('customersList: ' . $e, 'error'); } if (!empty($customers['customers'])) { - foreach ($customers as $_customer) { + foreach ($customers['customers'] as $_customer) { if (!empty($_customer['externalId'])) { $customerId = $_customer['externalId']; break; } } - } + if ($customerId === false) { + try { + $request = $this->crmClient->customersFixExternalId( + array( + 'id' => $customers['customers'][0]['id'], + 'externalId' => $order['externalId'] + ) + ); + + if ($request->isSuccessful()) { + $customerId = $order['externalId']; + } + } catch (\RetailCrm\Exception\CurlException $e) { + $this->writeLog('customersFixExternalIds: ' . $e, 'error'); + } + } + } else { + try { + $request = $this->crmClient->customersCreate( + array( + 'externalId' => $order['externalId'], + 'firstName' => $order['firstName'], + 'lastName' => !empty($order['lastName']) ? $order['lastName'] : '', + 'email' => !empty($order['email']) ? $order['email'] : '', + 'phones' => !empty($order['phone']) + ? array(array('number' => $order['phone'])) + : array() + ) + ); + + if ($request->isSuccessful()) { + $customerId = $order['externalId']; + } + } catch (\RetailCrm\Exception\CurlException $e) { + $this->writeLog('customersCreate: ' . $e, 'error'); + } + } } return $customerId; @@ -129,6 +151,7 @@ class ApiHelper { protected function filterOrders($toUpload) { $numbers = array_keys($toUpload); + if (date_create_from_format('Y-m-d H:i:s', $this->config['date_from'])) { foreach ($toUpload as $i => $order) { if ($order['createdAt'] < $this->config['date_from']) { @@ -140,4 +163,4 @@ class ApiHelper { return $toUpload; } -} +} \ No newline at end of file diff --git a/classes/Parser.php b/classes/Parser.php index 1497559..9bd4913 100644 --- a/classes/Parser.php +++ b/classes/Parser.php @@ -17,6 +17,7 @@ class Parser { case 'id': $val = (string)$val; $order['number'] = $this->config['order_prefix'] . $val; + $order['externalId'] = $val; break; case 'state': $orderStatuses = array_flip($this->config['order_statuses']); @@ -32,22 +33,42 @@ class Parser { $order = array_merge($order, array( 'email' => (string)$xml->email, 'phone' => (string)$xml->phone, - 'orderMethod' => $this->config['order_method'], 'createdAt' => $createdAt, - 'paymentType' => $this->config['payment'][(string)$xml->paymentType], 'delivery' => array( 'address' => array( - 'text' => (string)$xml->address + 'text' => trim((string)$xml->address) ), - 'code' => $this->config['delivery'][(string)$xml->deliveryType] ) )); + + if (empty($xml->name) && empty((string) $xml->email)) { + $order['orderMethod'] = 'callback'; + } else { + $order['orderMethod'] = $this->config['order_method']; + } + + if (!empty($xml->deliveryType) && isset($this->config['delivery'][(string)$xml->deliveryType])) { + $order['delivery']['code'] = $this->config['delivery'][(string)$xml->deliveryType]; + } + + if (!empty($xml->paymentType) && isset($this->config['payment'][(string)$xml->paymentType])) { + $order['paymentType'] = $this->config['payment'][(string)$xml->paymentType]; + } + + if (!empty($xml->salescomment)) { + $order['managerComment'] = (string)$xml->salescomment; + } + + if (!empty($xml->payercomment)) { + $order['customerComment'] = (string)$xml->payercomment; + } + $items = array(); $xmlItems = $xml->items; foreach($xmlItems as $xmlItem) { $xmlItem = $xmlItem->item; $items[] = array( - 'productId' => (string)$xmlItem->external_id, + 'productId' => (string)$xmlItem['id'], 'productName' => (string)$xmlItem->name, 'quantity' => (string)$xmlItem->quantity, 'initialPrice' => (string)$xmlItem->price diff --git a/run.php b/run.php index 7c29848..2fcd4b5 100644 --- a/run.php +++ b/run.php @@ -2,11 +2,13 @@ require(__DIR__ . "/classes/ApiHelper.php"); require(__DIR__ . "/config/config.php"); -if (! file_exists(__DIR__ . "/logs")) +if (! file_exists(__DIR__ . "/logs")) { mkdir(__DIR__ . "/logs"); +} -if (file_exists(__DIR__ . "/logs/cookie.txt")) +if (file_exists(__DIR__ . "/logs/cookie.txt")) { unlink(__DIR__ . "/logs/cookie.txt"); +} $lockFile = __DIR__ . "/run.lock"; @@ -25,5 +27,7 @@ if (file_exists(__DIR__ . "/logs/sync.log")) { $apiHelper = new ApiHelper($сonfig); -if ($apiHelper->processXMLOrders()) +if ($apiHelper->processXMLOrders()) { unlink($lockFile); + file_put_contents(__DIR__ . "/logs/sync.log", date('Y-m-d H:i:s')); +} \ No newline at end of file