From 76dc6535cc290d14e50b9419779e18320e9d36f9 Mon Sep 17 00:00:00 2001 From: dkorol Date: Thu, 14 Apr 2016 13:55:11 +0300 Subject: [PATCH] history for opencart >=2 --- admin/controller/module/retailcrm.php | 0 admin/model/retailcrm/history.php | 26 +- catalog/controller/module/retailcrm.php | 0 catalog/model/retailcrm/order.php | 4 + system/cron/getmyip.php | 2 + .../library/retailcrm/OpencartApiClient.php | 327 ++++++++++++++++++ 6 files changed, 354 insertions(+), 5 deletions(-) mode change 100644 => 100755 admin/controller/module/retailcrm.php mode change 100644 => 100755 admin/model/retailcrm/history.php mode change 100644 => 100755 catalog/controller/module/retailcrm.php mode change 100644 => 100755 catalog/model/retailcrm/order.php create mode 100644 system/cron/getmyip.php create mode 100755 system/library/retailcrm/OpencartApiClient.php diff --git a/admin/controller/module/retailcrm.php b/admin/controller/module/retailcrm.php old mode 100644 new mode 100755 diff --git a/admin/model/retailcrm/history.php b/admin/model/retailcrm/history.php old mode 100644 new mode 100755 index 6472a71..579ab4b --- a/admin/model/retailcrm/history.php +++ b/admin/model/retailcrm/history.php @@ -4,10 +4,15 @@ class ModelRetailcrmHistory extends Model { protected $createResult; + private $opencartApiClient; + public function request() - { + { $this->load->model('setting/setting'); $this->load->model('setting/store'); + if(version_compare(VERSION, '2.0.0', '>=')) { + $this->load->model('user/api'); + } $this->load->model('sale/order'); if (version_compare(VERSION, '2.1.0.0', '>=')) { $this->load->model('customer/customer'); @@ -32,6 +37,10 @@ class ModelRetailcrmHistory extends Model return false; } + if(version_compare(VERSION, '2.0.0', '>=')) { + $this->opencartApiClient = new OpencartApiClient($this->registry); + } + $crm = new RetailcrmProxy( $settings['retailcrm_url'], $settings['retailcrm_apikey'], @@ -100,7 +109,6 @@ class ModelRetailcrmHistory extends Model if (!empty($this->createResult['orders'])) { $crm->ordersFixExternalIds($this->createResult['orders']); } - } protected function updateOrders($orders) @@ -117,7 +125,7 @@ class ModelRetailcrmHistory extends Model $data['firstname'] = $order['firstName']; $data['lastname'] = (!empty($order['lastName'])) ? $order['lastName'] : ' '; $data['email'] = $order['email']; - $data['telephone'] = (!empty($order['phone']['number'])) ? $order['phone']['number'] : ' '; + $data['telephone'] = (!empty($order['phone'])) ? $order['phone'] : ''; $data['comment'] = !empty($order['customerComment']) ? $order['customerComment'] : ''; $data['fax'] = ''; @@ -239,7 +247,11 @@ class ModelRetailcrmHistory extends Model $data['order_status_id'] = $tmpOrder['order_status_id']; } - $this->model_sale_order->editOrder($order['externalId'], $data); + if(version_compare(VERSION, '2.0.0', '>=')) { + $this->opencartApiClient->editOrder($order['externalId'], $data); + } else { + $this->model_sale_order->editOrder($order['externalId'], $data); + } } } @@ -431,7 +443,11 @@ class ModelRetailcrmHistory extends Model $data['fromApi'] = true; $data['order_status_id'] = 1; - $this->model_sale_order->addOrder($data); + if(version_compare(VERSION, '2.0.0', '>=')) { + $this->opencartApiClient->addOrder($data); + } else { + $this->model_sale_order->addOrder($data); + } $last = $this->model_sale_order->getOrders($data = array('order' => 'DESC', 'limit' => 1, 'start' => 0)); diff --git a/catalog/controller/module/retailcrm.php b/catalog/controller/module/retailcrm.php old mode 100644 new mode 100755 diff --git a/catalog/model/retailcrm/order.php b/catalog/model/retailcrm/order.php old mode 100644 new mode 100755 index ac01816..5b62c88 --- a/catalog/model/retailcrm/order.php +++ b/catalog/model/retailcrm/order.php @@ -4,6 +4,8 @@ class ModelRetailcrmOrder extends Model { public function sendToCrm($order_data, $order_id) { + if(isset($this->request->post['fromApi'])) return; + $this->load->model('setting/setting'); $settings = $this->model_setting_setting->getSetting('retailcrm'); @@ -105,6 +107,8 @@ class ModelRetailcrmOrder extends Model { public function changeInCrm($order_data, $order_id) { + if(isset($this->request->post['fromApi'])) return; + $this->load->model('setting/setting'); $settings = $this->model_setting_setting->getSetting('retailcrm'); diff --git a/system/cron/getmyip.php b/system/cron/getmyip.php new file mode 100644 index 0000000..10db1bf --- /dev/null +++ b/system/cron/getmyip.php @@ -0,0 +1,2 @@ +model_module_name */ + public function __get($name) { + return $this->registry->get($name); + } + + public function __construct(Registry &$registry) { + $this->registry = $registry; + + $settings = $this->model_setting_setting->getSetting('retailcrm'); + $this->cookieFileName = $settings['retailcrm_apikey']; + + $this->auth(); + } + + private function getCookieValue($cookieName) { + $cookieFile = file_get_contents(DIR_APPLICATION . '/' . $this->cookieFileName . '.txt'); + $cookieFile = explode("\n", $cookieFile); + + $cookies = array(); + foreach($cookieFile as $line) { + if(empty($line) OR $line{0} == '#') + continue; + + $params = explode("\t", $line); + $cookies[$params[5]] = $params[6]; + } + + if(isset($cookies[$cookieName])) + return $cookies[$cookieName]; + + return false; + } + + public function request($method, $getParams, $postParams) { + $opencartStoreInfo = $this->model_setting_store->getStore($this->opencartStoreId); + + if(version_compare(VERSION, '2.1.0', '>=') && !empty($this->apiToken)) { + $getParams['token'] = $this->apiToken; + } + + $postParams['fromApi'] = true; + + if ($opencartStoreInfo) { + $url = $opencartStoreInfo['ssl']; + } else { + $url = HTTPS_CATALOG; + } + + $curl = curl_init(); + + // Set SSL if required + if (substr($url, 0, 5) == 'https') { + curl_setopt($curl, CURLOPT_PORT, 443); + } + + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLINFO_HEADER_OUT, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_FORBID_REUSE, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_URL, $url . 'index.php?route=api/' . $method . (!empty($getParams) ? '&' . http_build_query($getParams) : '')); + + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postParams)); + + curl_setopt($curl, CURLOPT_COOKIEFILE, DIR_APPLICATION . '/' . $this->cookieFileName . '.txt'); + curl_setopt($curl, CURLOPT_COOKIEJAR, DIR_APPLICATION . '/' . $this->cookieFileName . '.txt'); + + $json = json_decode(curl_exec($curl), true); + //$json = curl_exec($curl); + + //var_dump($json); + //var_dump(curl_getinfo($curl)); + + //if(isset($json['error'])) + //return false; + + curl_close($curl); + + return $json; + } + + private function auth() { + $apiUsers = $this->model_user_api->getApis(); + + $api = array(); + foreach ($apiUsers as $apiUser) { + if($apiUser['status'] == 1) { + if(version_compare(VERSION, '2.1.0', '>=')) { + $api = array( + 'api_id' => $apiUser['api_id'], + 'key' => $apiUser['key'] + ); + } else { + $api = array( + 'api_id' => $apiUser['api_id'], + 'username' => $apiUser['username'], + 'password' => $apiUser['password'] + ); + } + + break; + } + } + + if(!isset($api['api_id'])) + return false; + + if(version_compare(VERSION, '2.1.0', '>=')) { + $alreadyBinded = false; + + $innerIp = $this->getInnerIpAddr(); + $apiIps = $this->model_user_api->getApiIps($api['api_id']); + foreach($apiIps as $apiIp) { + if($apiIp['ip'] == $innerIp) + $alreadyBinded = true; + } + + if(!$alreadyBinded) { + $this->model_user_api->addApiIp($api['api_id'], $innerIp); + } + } + + $apiAnswer = $this->request('login', array(), $apiUser); + + if(version_compare(VERSION, '2.1.0', '>=')) { + $this->apiToken = $apiAnswer['token']; + } + + return $apiAnswer; + } + + public function editOrder($order_id, $data) { + $data['telephone'] = trim($data['telephone']); + $customer = array( + 'currency' => isset($data['currency']) ? $data['currency'] : '', + 'customer' => $data['customer'], + 'customer_id' => $data['customer_id'], + 'customer_group_id' => $data['customer_group_id'], + 'firstname' => $data['firstname'], + 'lastname' => $data['lastname'], + 'email' => $data['email'], + 'telephone' => !empty($data['telephone']) ? $data['telephone'] : '0000', + 'fax' => $data['fax'], + ); + $a = $this->request('customer', array(), $customer); + + $products = array(); + foreach ($data['order_product'] as $order_product) { + $products[] = array( + 'product_id' => $order_product['product_id'], + 'quantity' => $order_product['quantity'] + ); + } + $b = $this->request('cart/add', array(), array('product' => $products)); + + $payment_address = array( + 'payment_address' => $data['payment_address'], + 'firstname' => $data['payment_firstname'], + 'lastname' => $data['payment_lastname'], + 'company' => $data['payment_company'], + 'address_1'=> $data['payment_address_1'], + 'address_2' => $data['payment_address_2'], + 'city' => !empty($data['payment_city']) ? $data['payment_city'] : 'none', + 'postcode' => $data['payment_postcode'], + 'country_id' => $data['payment_country_id'], + 'zone_id' => !empty($data['payment_zone_id']) ? $data['payment_zone_id'] : 0, + ); + $c = $this->request('payment/address', array(), $payment_address); + + $this->request('payment/methods', array(), array()); + $payment_method = array( + 'payment_method' => $data['payment_code'] + ); + $d = $this->request('payment/method', array(), $payment_method); + + $shipping_address = array( + 'shipping_address' => $data['shipping_address'], + 'firstname' => $data['shipping_firstname'], + 'lastname' => $data['shipping_lastname'], + 'company' => $data['shipping_company'], + 'address_1' => $data['shipping_address_1'], + 'address_2' => $data['shipping_address_2'], + 'city' => !empty($data['shipping_city']) ? $data['shipping_city'] : 'none', + 'postcode' => $data['shipping_postcode'], + 'country_id' => $data['shipping_country_id'], + 'zone_id' => !empty($data['shipping_zone_id']) ? $data['shipping_zone_id'] : 0, + ); + $e = $this->request('shipping/address', array(), $shipping_address); + + $this->request('shipping/methods', array(), array()); + $shipping_method = array( + 'shipping_method' => $data['shipping_code'] + ); + $f = $this->request('shipping/method', array(), $shipping_method); + + $order = array( + 'shipping_method' => $data['shipping_code'], + 'payment_method' => $data['payment_code'], + 'order_status_id' => $data['order_status_id'], + 'comment' => $data['comment'], + 'affiliate_id' => $data['affiliate_id'], + ); + $g = $this->request('order/edit', array('order_id' => $order_id), $order); + + var_dump($a, $b, $c, $d, $e, $f, $g); + } + + public function addOrder($data) { + $currency = $this->getCookieValue('currency'); + if($currency) { + $a = $this->request('currency', array(), array('currency' => $currency)); + } + + $customer = array( + 'store_id' => $data['store_id'], + 'currency' => $currency != false ? $currency : '', + 'customer' => $data['customer'], + 'customer_id' => $data['customer_id'], + 'customer_group_id' => $data['customer_group_id'], + 'firstname' => $data['firstname'], + 'lastname' => $data['lastname'], + 'email' => $data['email'], + 'telephone' => $data['telephone'], + 'fax' => $data['fax'], + ); + $b = $this->request('customer', array(), $customer); + + $products = array(); + foreach($data['order_product'] as $product) { + $product = array( + 'product_id' => $product['product_id'], + 'quantity' => $product['quantity'], + ); + $products[] = $product; + } + $c = $this->request('cart/add', array(), array('product' => $products)); + + $payment_address = array( + 'payment_address' => $data['payment_address'], + 'firstname' => $data['payment_firstname'], + 'lastname' => $data['payment_lastname'], + 'company' => $data['payment_company'], + 'address_1' => $data['payment_address_1'], + 'address_2' => $data['payment_address_2'], + 'city' => $data['payment_city'], + 'postcode' => $data['payment_postcode'], + 'country_id' => $data['payment_country_id'], + 'zone_id' => $data['payment_zone_id'], + ); + $d = $this->request('payment/address', array(), $payment_address); + + $shipping_address = array( + 'shipping_address' => $data['shipping_address'], + 'firstname' => $data['shipping_firstname'], + 'lastname' => $data['shipping_lastname'], + 'company' => $data['shipping_company'], + 'address_1' => $data['shipping_address_1'], + 'address_2' => $data['shipping_address_2'], + 'city' => $data['shipping_city'], + 'postcode' => $data['shipping_postcode'], + 'country_id' => $data['shipping_country_id'], + 'zone_id' => !empty($data['shipping_zone_id']) ? $data['shipping_zone_id'] : 0, + ); + $e = $this->request('shipping/address', array(), $shipping_address); + + $this->request('shipping/methods', array(), array()); + $shipping_method = array( + 'shipping_method' => $data['shipping_code'] + ); + $f = $this->request('shipping/method', array(), $shipping_method); + + $this->request('payment/methods', array(), array()); + $payment_method = array( + 'payment_method' => $data['payment_code'] + ); + $g = $this->request('payment/method', array(), $payment_method); + + $order = array( + 'shipping_method' => $data['shipping_code'], + 'payment_method' => $data['payment_code'], + 'order_status_id' => $data['order_status_id'], + 'comment' => $data['comment'], + 'affiliate_id' => $data['affiliate_id'], + ); + $h = $this->request('order/add', array(), $order); + + var_dump($a, $b, $c, $d, $e, $f, $g, $h); + } + + private function getInnerIpAddr() { + $opencartStoreInfo = $this->model_setting_store->getStore($this->opencartStoreId); + + if ($opencartStoreInfo) { + $url = $opencartStoreInfo['ssl']; + } else { + $url = HTTPS_CATALOG; + } + + $curl = curl_init(); + + // Set SSL if required + if (substr($url, 0, 5) == 'https') { + curl_setopt($curl, CURLOPT_PORT, 443); + } + + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLINFO_HEADER_OUT, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_FORBID_REUSE, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_URL, $url . 'system/cron/getmyip.php'); + + return curl_exec($curl); + } +} \ No newline at end of file