diff --git a/README.md b/README.md index 941b5e8..78b7f5d 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ Add to cron: Add to cron: ``` -* */4 * * * /usr/bin/php /path/to/opencart/system/cron/export.php >> /path/to/opencart/system/logs/cronjob_export.log 2>&1 +* */4 * * * /usr/bin/php /path/to/opencart/system/cron/icml.php >> /path/to/opencart/system/logs/cronjob_icml.log 2>&1 ``` Your export file will be available by following url diff --git a/README.ru.md b/README.ru.md index b13b2fd..44a8723 100644 --- a/README.ru.md +++ b/README.ru.md @@ -89,7 +89,7 @@ if (!isset($data['fromApi'])) { Для периодической выгрузки каталога добавьте в cron следующую запись: ``` -* */4 * * * /usr/bin/php /path/to/opencart/system/cron/export.php >> /path/to/opencart/system/logs/cronjob_export.log 2>&1 +* */4 * * * /usr/bin/php /path/to/opencart/system/cron/icml.php >> /path/to/opencart/system/logs/cronjob_icml.log 2>&1 ``` В настройках CRM установите путь к файлу выгрузки diff --git a/admin/controller/module/retailcrm.php b/admin/controller/module/retailcrm.php old mode 100755 new mode 100644 index 85e4bd4..3df6c4b --- a/admin/controller/module/retailcrm.php +++ b/admin/controller/module/retailcrm.php @@ -28,23 +28,21 @@ class ControllerModuleRetailcrm extends Controller $this->model_setting_setting ->editSetting('retailcrm', array('retailcrm_status' => 1)); - if (version_compare(VERSION, '2.0.1.0', '>')) { - $this->load->model('extension/event'); + $this->load->model('extension/event'); - $this->model_extension_event - ->addEvent( - 'retailcrm', - 'post.order.add', - 'module/retailcrm/order_create' - ); + $this->model_extension_event + ->addEvent( + 'retailcrm', + version_compare(VERSION, '2.2', '>=') ? 'catalog/model/checkout/order/addOrder/after' : 'post.order.add', + 'module/retailcrm/order_create' + ); - $this->model_extension_event - ->addEvent( - 'retailcrm', - 'post.order.history.add', - 'module/retailcrm/order_edit' - ); - } + $this->model_extension_event + ->addEvent( + 'retailcrm', + version_compare(VERSION, '2.2', '>=') ? 'catalog/model/checkout/order/addOrderHistory/after' : 'post.order.history.add', + 'module/retailcrm/order_edit' + ); } /** @@ -58,10 +56,8 @@ class ControllerModuleRetailcrm extends Controller $this->model_setting_setting ->editSetting('retailcrm', array('retailcrm_status' => 0)); - if (version_compare(VERSION, '2.0.1.0', '>')) { - $this->load->model('extension/event'); - $this->model_extension_event->deleteEvent('retailcrm'); - } + $this->load->model('extension/event'); + $this->model_extension_event->deleteEvent('retailcrm'); } /** @@ -73,9 +69,7 @@ class ControllerModuleRetailcrm extends Controller { $this->load->model('setting/setting'); - if (version_compare(VERSION, '2.0.1.0', '>')) { - $this->load->model('extension/module'); - } + $this->load->model('extension/module'); $this->load->model('retailcrm/references'); $this->load->language('module/retailcrm'); $this->document->setTitle($this->language->get('heading_title')); @@ -93,11 +87,7 @@ class ControllerModuleRetailcrm extends Controller 'SSL' ); - if (version_compare(VERSION, '2.0.1.0', '<')) { - $this->redirect($redirect); - } else { - $this->response->redirect($redirect); - } + $this->response->redirect($redirect); } $text_strings = array( @@ -117,13 +107,8 @@ class ControllerModuleRetailcrm extends Controller 'retailcrm_dict_payment', ); - if (version_compare(VERSION, '2.0.1.0', '<')) { - $_data = &$this->data; - $this->load->model('setting/extension'); - } else { - $this->load->model('extension/extension'); - $_data = &$data; - } + $this->load->model('extension/extension'); + $_data = &$data; foreach ($text_strings as $text) { $_data[$text] = $this->language->get($text); @@ -225,23 +210,13 @@ class ControllerModuleRetailcrm extends Controller $this->load->model('design/layout'); $_data['layouts'] = $this->model_design_layout->getLayouts(); - if (version_compare(VERSION, '2.0.1.0', '<')) { - $this->template = 'module/retailcrm.1.x.tpl'; - $this->children = array( - 'common/header', - 'common/footer', - ); + $_data['header'] = $this->load->controller('common/header'); + $_data['column_left'] = $this->load->controller('common/column_left'); + $_data['footer'] = $this->load->controller('common/footer'); - $this->response->setOutput($this->render()); - } else { - $_data['header'] = $this->load->controller('common/header'); - $_data['column_left'] = $this->load->controller('common/column_left'); - $_data['footer'] = $this->load->controller('common/footer'); - - $this->response->setOutput( - $this->load->view('module/retailcrm.2.x.tpl', $_data) - ); - } + $this->response->setOutput( + $this->load->view('module/retailcrm.tpl', $_data) + ); } /** diff --git a/admin/model/retailcrm/history.php b/admin/model/retailcrm/history.php old mode 100755 new mode 100644 index aaed8f9..0907b06 --- a/admin/model/retailcrm/history.php +++ b/admin/model/retailcrm/history.php @@ -10,9 +10,7 @@ class ModelRetailcrmHistory extends Model { $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('user/api'); $this->load->model('sale/order'); if (version_compare(VERSION, '2.1.0.0', '>=')) { $this->load->model('customer/customer'); @@ -21,6 +19,7 @@ class ModelRetailcrmHistory extends Model } $this->load->model('retailcrm/references'); $this->load->model('catalog/product'); + $this->load->model('catalog/option'); $this->load->model('localisation/zone'); $this->load->language('module/retailcrm'); @@ -37,9 +36,7 @@ class ModelRetailcrmHistory extends Model return false; } - if(version_compare(VERSION, '2.0.0', '>=')) { - $this->opencartApiClient = new OpencartApiClient($this->registry); - } + $this->opencartApiClient = new OpencartApiClient($this->registry); $crm = new RetailcrmProxy( $settings['retailcrm_url'], @@ -193,19 +190,36 @@ class ModelRetailcrmHistory extends Model $data['order_product'] = array(); foreach ($order['items'] as $item) { - $product = $this->model_catalog_product->getProduct($item['offer']['externalId']); - $data['order_product'][] = array( - 'product_id' => $item['offer']['externalId'], - 'name' => $item['offer']['name'], - 'quantity' => $item['quantity'], - 'price' => $item['initialPrice'], - 'total' => $item['initialPrice'] * $item['quantity'], - 'model' => $product['model'], + //$product = $this->model_catalog_product->getProduct($item['offer']['externalId']); + $productId = $item['offer']['externalId']; + $options = array(); + if(mb_strpos($item['offer']['externalId'], '#') > 1) { + $offer = explode('#', $item['offer']['externalId']); + $productId = $offer[0]; + $optionsFromCRM = explode('_', $offer[1]); - // this data will not retrive from crm - 'order_product_id' => '', - 'tax' => 0, - 'reward' => 0 + foreach($optionsFromCRM as $optionFromCRM) { + $optionData = explode('-', $optionFromCRM); + $productOptionId = $optionData[0]; + $optionValueId = $optionData[1]; + + $productOptions = $this->model_catalog_product->getProductOptions($productId); + + foreach($productOptions as $productOption) { + if($productOptionId == $productOption['product_option_id']) { + foreach($productOption['product_option_value'] as $productOptionValue) { + if($productOptionValue['option_value_id'] == $optionValueId) { + $options[$productOptionId] = $productOptionValue['product_option_value_id']; + } + } + } + } + } + } + $data['order_product'][] = array( + 'product_id' => $productId, + 'quantity' => $item['quantity'], + 'option' => $options ); } @@ -247,11 +261,7 @@ class ModelRetailcrmHistory extends Model $data['order_status_id'] = $tmpOrder['order_status_id']; } - if(version_compare(VERSION, '2.0.0', '>=')) { - $this->opencartApiClient->editOrder($order['externalId'], $data); - } else { - $this->model_sale_order->editOrder($order['externalId'], $data); - } + $this->opencartApiClient->editOrder($order['externalId'], $data); } } @@ -442,11 +452,7 @@ class ModelRetailcrmHistory extends Model $data['fromApi'] = true; $data['order_status_id'] = 1; - if(version_compare(VERSION, '2.0.0', '>=')) { - $this->opencartApiClient->addOrder($data); - } else { - $this->model_sale_order->addOrder($data); - } + $this->opencartApiClient->addOrder($data); $last = $this->model_sale_order->getOrders($data = array('order' => 'DESC', 'limit' => 1, 'start' => 0)); diff --git a/admin/model/retailcrm/icml.php b/admin/model/retailcrm/icml.php old mode 100755 new mode 100644 index f60d378..2d6b5c5 --- a/admin/model/retailcrm/icml.php +++ b/admin/model/retailcrm/icml.php @@ -10,11 +10,15 @@ class ModelRetailcrmIcml extends Model protected $eCategories; protected $eOffers; + private $options; + private $optionValues; + public function generateICML() { $this->load->language('module/retailcrm'); $this->load->model('catalog/category'); $this->load->model('catalog/product'); + $this->load->model('catalog/option'); $this->load->model('catalog/manufacturer'); $string = ' @@ -95,107 +99,192 @@ class ModelRetailcrmIcml extends Model $products = $this->model_catalog_product->getProducts(array()); - foreach ($products as $offer) { - - $e = $this->eOffers->appendChild($this->dd->createElement('offer')); - $e->setAttribute('id', $offer['product_id']); - $e->setAttribute('productId', $offer['product_id']); - $e->setAttribute('quantity', $offer['quantity']); - - /** - * Offer activity - */ - $activity = $offer['status'] == 1 ? 'Y' : 'N'; - $e->appendChild( - $this->dd->createElement('productActivity') - )->appendChild( - $this->dd->createTextNode($activity) - ); - - /** - * Offer categories - */ - $categories = $this->model_catalog_product - ->getProductCategories($offer['product_id']); - - if (!empty($categories)) { - foreach ($categories as $category) { - $e->appendChild($this->dd->createElement('categoryId')) - ->appendChild( - $this->dd->createTextNode($category) - ); + foreach ($products as $product) { + // Формируем офферы отнсительно доступных опций + $options = $this->model_catalog_product->getProductOptions($product['product_id']); + $offerOptions = array('select', 'radio'); + $requiredOptions = array(); + $notRequiredOptions = array(); + // Оставляем опции связанные с вариациями товаров, сортируем по параметру обязательный или нет + foreach($options as $option) { + if(in_array($option['type'], $offerOptions)) { + if($option['required']) { + $requiredOptions[] = $option; + } else { + $notRequiredOptions[] = $option; + } } } + $offers = array(); + // Сначала совмещаем все обязательные опции + foreach($requiredOptions as $requiredOption) { + // Если первая итерация + if(empty($offers)) { + foreach($requiredOption['product_option_value'] as $optionValue) { + $offers[$requiredOption['product_option_id'].':'.$requiredOption['option_id'].'-'.$optionValue['option_value_id']] = (float)$optionValue['price']; + } + } else { + foreach($offers as $optionKey => $optionCost) { + unset($offers[$optionKey]); // Работая в контексте обязательных опций не забываем удалять прошлые обязательные опции, т.к. они должны быть скомбинированы с другими обязательными опциями + foreach($requiredOption['product_option_value'] as $optionValue) { + $offers[$optionKey.'_'.$requiredOption['product_option_id'].':'.$requiredOption['option_id'].'-'.$optionValue['option_value_id']] = $optionCost + (float)$optionValue['price']; + } + } + } + } + // Совмещаем или добавляем необязательные опции, учитывая тот факт что обязательных опций может и не быть. + foreach($notRequiredOptions as $notRequiredOption) { + // Если обязательных опцией не оказалось и первая итерация + if(empty($offers)) { + $offers['0:0-0'] = 0; // В случае работы с необязательными опциями мы должны учитывать товарное предложение без опций, поэтому создадим "пустую" опцию + foreach($notRequiredOption['product_option_value'] as $optionValue) { + $offers[$notRequiredOption['product_option_id'].':'.$notRequiredOption['option_id'].'-'.$optionValue['option_value_id']] = (float)$optionValue['price']; + } + } else { + foreach($offers as $optionKey => $optionCost) { + foreach($notRequiredOption['product_option_value'] as $optionValue) { + $offers[$optionKey.'_'.$notRequiredOption['product_option_id'].':'.$notRequiredOption['option_id'].'-'.$optionValue['option_value_id']] = $optionCost + (float)$optionValue['price']; + } + } + } + } + if(empty($offers)) { + $offers = array('0:0-0' => '0'); + } - /** - * Name & price - */ - $e->appendChild($this->dd->createElement('name')) - ->appendChild($this->dd->createTextNode($offer['name'])); - $e->appendChild($this->dd->createElement('productName')) - ->appendChild($this->dd->createTextNode($offer['name'])); - $e->appendChild($this->dd->createElement('price')) - ->appendChild($this->dd->createTextNode($offer['price'])); - - /** - * Vendor - */ - if ($offer['manufacturer_id'] != 0) { - $e->appendChild($this->dd->createElement('vendor')) + foreach($offers as $optionsString => $optionsTotalCost) { + $optionsString = explode('_', $optionsString); + $options = array(); + foreach($optionsString as $optionString) { + $option = explode('-', $optionString); + $optionIds = explode(':', $option[0]); + if($optionString != '0:0-0') { + $optionData = $this->getOptionData($optionIds[1], $option[1]); + $options[$optionIds[0]] = array( + 'name' => $optionData['optionName'], + 'value' => $optionData['optionValue'], + 'value_id' => $option[1] + ); + } + } + ksort($options); + $offerId = array(); + foreach($options as $optionKey => $optionData) { + $offerId[] = $optionKey.'-'.$optionData['value_id']; + } + $offerId = implode('_', $offerId); + $e = $this->eOffers->appendChild($this->dd->createElement('offer')); + if(!empty($offerId)) + $e->setAttribute('id', $product['product_id'].'#'.$offerId); + else + $e->setAttribute('id', $product['product_id']); + $e->setAttribute('productId', $product['product_id']); + $e->setAttribute('quantity', $product['quantity']); + /** + * Offer activity + */ + $activity = $product['status'] == 1 ? 'Y' : 'N'; + $e->appendChild( + $this->dd->createElement('productActivity') + )->appendChild( + $this->dd->createTextNode($activity) + ); + /** + * Offer categories + */ + $categories = $this->model_catalog_product + ->getProductCategories($product['product_id']); + if (!empty($categories)) { + foreach ($categories as $category) { + $e->appendChild($this->dd->createElement('categoryId')) + ->appendChild( + $this->dd->createTextNode($category) + ); + } + } + /** + * Name & price + */ + $e->appendChild($this->dd->createElement('productName')) + ->appendChild($this->dd->createTextNode($product['name'])); + if(!empty($options)) { + $optionsString = array(); + foreach($options as $option) { + $optionsString[] = $option['name'].': '.$option['value']; + } + $optionsString = ' ('.implode(', ', $optionsString).')'; + $e->appendChild($this->dd->createElement('name')) + ->appendChild($this->dd->createTextNode($product['name'].$optionsString)); + } else { + $e->appendChild($this->dd->createElement('name')) + ->appendChild($this->dd->createTextNode($product['name'])); + } + $e->appendChild($this->dd->createElement('price')) + ->appendChild($this->dd->createTextNode($product['price'] + $optionsTotalCost)); + /** + * Vendor + */ + if ($product['manufacturer_id'] != 0) { + $e->appendChild($this->dd->createElement('vendor')) + ->appendChild( + $this->dd->createTextNode( + $offerManufacturers[$product['manufacturer_id']] + ) + ); + } + /** + * Image + */ + if ($product['image']) { + $image = $this->generateImage($product['image']); + $e->appendChild($this->dd->createElement('picture')) + ->appendChild($this->dd->createTextNode($image)); + } + /** + * Url + */ + $this->url = new Url( + HTTP_CATALOG, + $this->config->get('config_secure') + ? HTTP_CATALOG + : HTTPS_CATALOG + ); + $e->appendChild($this->dd->createElement('url')) ->appendChild( $this->dd->createTextNode( - $offerManufacturers[$offer['manufacturer_id']] + $this->url->link( + 'product/product&product_id=' . $product['product_id'] + ) ) ); - } - - /** - * Image - */ - if ($offer['image']) { - $image = $this->generateImage($offer['image']); - $e->appendChild($this->dd->createElement('picture')) - ->appendChild($this->dd->createTextNode($image)); - } - - /** - * Url - */ - $this->url = new Url( - HTTP_CATALOG, - $this->config->get('config_secure') - ? HTTP_CATALOG - : HTTPS_CATALOG - ); - - $e->appendChild($this->dd->createElement('url')) - ->appendChild( - $this->dd->createTextNode( - $this->url->link( - 'product/product&product_id=' . $offer['product_id'] - ) - ) - ); - - - if ($offer['sku']) { - $sku = $this->dd->createElement('param'); - $sku->setAttribute('code', 'article'); - $sku->setAttribute('name', $this->language->get('article')); - $sku->appendChild($this->dd->createTextNode($offer['sku'])); - $e->appendChild($sku); - } - - if ($offer['weight'] != '') { - $weight = $this->dd->createElement('param'); - $weight->setAttribute('code', 'weight'); - $weight->setAttribute('name', $this->language->get('weight')); - $weightValue = (isset($offer['weight_class'])) - ? round($offer['weight'], 3) . ' ' . $offer['weight_class'] - : round($offer['weight'], 3) - ; - $weight->appendChild($this->dd->createTextNode($weightValue)); - $e->appendChild($weight); + // Options + if(!empty($options)) { + foreach($options as $optionKey => $optionData) { + $param = $this->dd->createElement('param'); + $param->setAttribute('code', $optionKey); + $param->setAttribute('name', $optionData['name']); + $param->appendChild($this->dd->createTextNode($optionData['value'])); + $e->appendChild($param); + } + } + if ($product['sku']) { + $sku = $this->dd->createElement('param'); + $sku->setAttribute('code', 'article'); + $sku->setAttribute('name', $this->language->get('article')); + $sku->appendChild($this->dd->createTextNode($product['sku'])); + $e->appendChild($sku); + } + if ($product['weight'] != '') { + $weight = $this->dd->createElement('param'); + $weight->setAttribute('code', 'weight'); + $weight->setAttribute('name', $this->language->get('weight')); + $weightValue = (isset($offer['weight_class'])) + ? round($product['weight'], 3) . ' ' . $product['weight_class'] + : round($product['weight'], 3) + ; + $weight->appendChild($this->dd->createTextNode($weightValue)); + $e->appendChild($weight); + } } } } @@ -208,10 +297,41 @@ class ModelRetailcrmIcml extends Model { $this->load->model('tool/image'); + if (version_compare(VERSION, '2.2', '>=')) { + $currentTheme = $this->config->get('config_theme'); + $width = $this->config->get($currentTheme . '_image_related_width') ? $this->config->get($currentTheme . '_image_related_width') : 200; + $height = $this->config->get($currentTheme . '_image_related_height') ? $this->config->get($currentTheme . '_image_related_height') : 200; + + return $this->model_tool_image->resize( + $image, + $width, + $height + ); + } + return $this->model_tool_image->resize( $image, $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height') ); } + + private function getOptionData($optionId, $optionValueId) { + if(!empty($this->options[$optionId])) { + $option = $this->options[$optionId]; + } else { + $option = $this->model_catalog_option->getOption($optionId); + $this->options[$optionId] = $option; + } + if(!empty($this->optionValues[$optionValueId])) { + $optionValue = $this->optionValues[$optionValueId]; + } else { + $optionValue = $this->model_catalog_option->getOptionValue($optionValueId); + $this->optionValues[$optionValueId] = $optionValue; + } + return array( + 'optionName' => $option['name'], + 'optionValue' => $optionValue['name'] + ); + } } diff --git a/admin/view/template/module/retailcrm.1.x.tpl b/admin/view/template/module/retailcrm.1.x.tpl deleted file mode 100644 index 53e4841..0000000 --- a/admin/view/template/module/retailcrm.1.x.tpl +++ /dev/null @@ -1,99 +0,0 @@ - - -
- - -
- - -
- - /admin/settings#t-main -
- - -
-
-

-
-
-
-
- - -

-
-
- -
-
-
- -
- - - - - -
- - -

- -

- $value): ?> -
- - -
- - -

- - -
- - -
- - -

- $value): ?> -
- - -
- - - - - -
-
-
-
- - - diff --git a/admin/view/template/module/retailcrm.2.x.tpl b/admin/view/template/module/retailcrm.tpl similarity index 100% rename from admin/view/template/module/retailcrm.2.x.tpl rename to admin/view/template/module/retailcrm.tpl diff --git a/catalog/controller/module/retailcrm.php b/catalog/controller/module/retailcrm.php old mode 100755 new mode 100644 index 089a74f..ba9cd45 --- a/catalog/controller/module/retailcrm.php +++ b/catalog/controller/module/retailcrm.php @@ -18,13 +18,25 @@ class ControllerModuleRetailcrm extends Controller * * @return void */ - public function order_create($order_id) + public function order_create($parameter1, $parameter2 = null) { $this->load->model('checkout/order'); $this->load->model('account/order'); + if($parameter2 != null) + $order_id = $parameter2; + else + $order_id = $parameter1; + $data = $this->model_checkout_order->getOrder($order_id); + $data['products'] = $this->model_account_order->getOrderProducts($order_id); + foreach($data['products'] as $key => $product) { + $productOptions = $this->model_account_order->getOrderOptions($order_id, $product['order_product_id']); + + if(!empty($productOptions)) + $data['products'][$key]['option'] = $productOptions; + } if (!isset($data['fromApi'])) { $this->load->model('setting/setting'); @@ -43,7 +55,12 @@ class ControllerModuleRetailcrm extends Controller } } - public function order_edit($order_id) { + public function order_edit($parameter1, $parameter2 = null, $parameter3 = null, $parameter4 = null) { + if($parameter4 != null) + $order_id = $parameter3; + else + $order_id = $parameter1; + $this->load->model('checkout/order'); $this->load->model('account/order'); @@ -53,6 +70,13 @@ class ControllerModuleRetailcrm extends Controller $data['products'] = $this->model_account_order->getOrderProducts($order_id); + foreach($data['products'] as $key => $product) { + $productOptions = $this->model_account_order->getOrderOptions($order_id, $product['order_product_id']); + + if(!empty($productOptions)) + $data['products'][$key]['option'] = $productOptions; + } + if (!isset($data['fromApi'])) { $this->load->model('setting/setting'); $status = $this->model_setting_setting->getSetting('retailcrm'); diff --git a/catalog/model/retailcrm/order.php b/catalog/model/retailcrm/order.php old mode 100755 new mode 100644 index e3fed74..0f6309e --- a/catalog/model/retailcrm/order.php +++ b/catalog/model/retailcrm/order.php @@ -10,6 +10,8 @@ class ModelRetailcrmOrder extends Model { $settings = $this->model_setting_setting->getSetting('retailcrm'); if(!empty($settings['retailcrm_url']) && !empty($settings['retailcrm_apikey'])) { + $this->load->model('catalog/product'); + require_once DIR_SYSTEM . 'library/retailcrm/bootstrap.php'; $this->retailcrm = new RetailcrmProxy( @@ -29,8 +31,10 @@ class ModelRetailcrmOrder extends Model { 100 ); - foreach($customers['customers'] as $customer) { - $order['customer']['id'] = $customer['id']; + if($customers) { + foreach ($customers['customers'] as $customer) { + $order['customer']['id'] = $customer['id']; + } } unset($customers); @@ -59,14 +63,12 @@ class ModelRetailcrmOrder extends Model { $payment_code = $order_data['payment_code']; $order['paymentType'] = $settings['retailcrm_payment'][$payment_code]; - // Совместимость с 1.5.5, когда этот метод вызывается из model/checkout/order->createOrder(), а не из controller/module/retailcrm->order_create() if(!isset($order_data['shipping_iso_code_2']) && isset($order_data['shipping_country_id'])) { $this->load->model('localisation/country'); $shipping_country = $this->model_localisation_country->getCountry($order_data['shipping_country_id']); $order_data['shipping_iso_code_2'] = $shipping_country['iso_code_2']; } - $delivery_code = $order_data['shipping_code']; $order['delivery'] = array( 'code' => !empty($delivery_code) ? $settings['retailcrm_delivery'][$delivery_code] : '', @@ -87,10 +89,40 @@ class ModelRetailcrmOrder extends Model { ); $orderProducts = isset($order_data['products']) ? $order_data['products'] : $order_data['order_product']; + $offerOptions = array('select', 'radio'); foreach ($orderProducts as $product) { + $offerId = ''; + + if(!empty($product['option'])) { + $options = array(); + + $productOptions = $this->model_catalog_product->getProductOptions($product['product_id']); + + foreach($product['option'] as $option) { + if(!in_array($option['type'], $offerOptions)) continue; + foreach($productOptions as $productOption) { + if($productOption['product_option_id'] = $option['product_option_id']) { + foreach($productOption['product_option_value'] as $productOptionValue) { + if($productOptionValue['product_option_value_id'] == $option['product_option_value_id']) { + $options[$option['product_option_id']] = $productOptionValue['option_value_id']; + } + } + } + } + } + + ksort($options); + + $offerId = array(); + foreach($options as $optionKey => $optionValue) { + $offerId[] = $optionKey.'-'.$optionValue; + } + $offerId = implode('_', $offerId); + } + $order['items'][] = array( - 'productId' => $product['product_id'], + 'productId' => !empty($offerId) ? $product['product_id'].'#'.$offerId : $product['product_id'], 'productName' => $product['name'], 'initialPrice' => $product['price'], 'quantity' => $product['quantity'], @@ -113,6 +145,8 @@ class ModelRetailcrmOrder extends Model { $settings = $this->model_setting_setting->getSetting('retailcrm'); if(!empty($settings['retailcrm_url']) && !empty($settings['retailcrm_apikey'])) { + $this->load->model('catalog/product'); + require_once DIR_SYSTEM . 'library/retailcrm/bootstrap.php'; $this->retailcrm = new RetailcrmProxy( @@ -166,10 +200,40 @@ class ModelRetailcrmOrder extends Model { ); $orderProducts = isset($order_data['products']) ? $order_data['products'] : $order_data['order_product']; + $offerOptions = array('select', 'radio'); foreach ($orderProducts as $product) { + $offerId = ''; + + if(!empty($product['option'])) { + $options = array(); + + $productOptions = $this->model_catalog_product->getProductOptions($product['product_id']); + + foreach($product['option'] as $option) { + if(!in_array($option['type'], $offerOptions)) continue; + foreach($productOptions as $productOption) { + if($productOption['product_option_id'] = $option['product_option_id']) { + foreach($productOption['product_option_value'] as $productOptionValue) { + if($productOptionValue['product_option_value_id'] == $option['product_option_value_id']) { + $options[$option['product_option_id']] = $productOptionValue['option_value_id']; + } + } + } + } + } + + ksort($options); + + $offerId = array(); + foreach($options as $optionKey => $optionValue) { + $offerId[] = $optionKey.'-'.$optionValue; + } + $offerId = implode('_', $offerId); + } + $order['items'][] = array( - 'productId' => $product['product_id'], + 'productId' => !empty($offerId) ? $product['product_id'].'#'.$offerId : $product['product_id'], 'productName' => $product['name'], 'initialPrice' => $product['price'], 'quantity' => $product['quantity'], diff --git a/system/cron/dispatch.php b/system/cron/dispatch.php old mode 100755 new mode 100644 index 4869ec5..dfd546b --- a/system/cron/dispatch.php +++ b/system/cron/dispatch.php @@ -1,5 +1,8 @@ =')) { + require_once(DIR_SYSTEM . 'library/cart/currency.php'); + require_once(DIR_SYSTEM . 'library/cart/user.php'); + require_once(DIR_SYSTEM . 'library/cart/weight.php'); + require_once(DIR_SYSTEM . 'library/cart/length.php'); +} else { + require_once(DIR_SYSTEM . 'library/currency.php'); + require_once(DIR_SYSTEM . 'library/user.php'); + require_once(DIR_SYSTEM . 'library/weight.php'); + require_once(DIR_SYSTEM . 'library/length.php'); +} // Registry $registry = new Registry(); @@ -58,7 +68,10 @@ foreach ($query->rows as $setting) { if (!$setting['serialized']) { $config->set($setting['key'], $setting['value']); } else { - $config->set($setting['key'], unserialize($setting['value'])); + if (version_compare(VERSION, '2.1', '>=')) + $config->set($setting['key'], json_decode($setting['value']), true); + else + $config->set($setting['key'], unserialize($setting['value'])); } } @@ -70,6 +83,13 @@ $registry->set('url', $url); $log = new Log($config->get('config_error_filename')); $registry->set('log', $log); + +// Event +if (version_compare(VERSION, '2.2', '>=')) { + $event = new Event($registry); + $registry->set('event', $event); +} + function error_handler($errno, $errstr, $errfile, $errline) { global $log, $config; @@ -133,10 +153,17 @@ $registry->set('language', $language); $document = new Document(); $registry->set('document', $document); -$registry->set('currency', new Currency($registry)); -$registry->set('weight', new Weight($registry)); -$registry->set('length', new Length($registry)); -$registry->set('user', new User($registry)); +if (version_compare(VERSION, '2.2', '>=')) { + $registry->set('currency', new Cart\Currency($registry)); + $registry->set('weight', new Cart\Weight($registry)); + $registry->set('length', new Cart\Length($registry)); + $registry->set('user', new Cart\User($registry)); +} else { + $registry->set('currency', new Currency($registry)); + $registry->set('weight', new Weight($registry)); + $registry->set('length', new Length($registry)); + $registry->set('user', new User($registry)); +} $controller = new Front($registry); $action = new Action($cli_action); diff --git a/system/cron/export.php b/system/cron/icml.php similarity index 100% rename from system/cron/export.php rename to system/cron/icml.php diff --git a/system/library/retailcrm/OpencartApiClient.php b/system/library/retailcrm/OpencartApiClient.php old mode 100755 new mode 100644 index 676a5fa..9d1ed37 --- a/system/library/retailcrm/OpencartApiClient.php +++ b/system/library/retailcrm/OpencartApiClient.php @@ -152,7 +152,8 @@ class OpencartApiClient { foreach ($data['order_product'] as $order_product) { $products[] = array( 'product_id' => $order_product['product_id'], - 'quantity' => $order_product['quantity'] + 'quantity' => $order_product['quantity'], + 'option' => $order_product['option'] ); } $this->request('cart/add', array(), array('product' => $products)); diff --git a/vqmod/xml/retailcrm_create_order.xml b/vqmod/xml/retailcrm_create_order.xml deleted file mode 100644 index 371345e..0000000 --- a/vqmod/xml/retailcrm_create_order.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - Send order to RetailCRM when it created - 1.5.x - 2.3.x - retailcrm.ru - - - - cart->clear()]]> - load->model('account/order'); - $this->load->model('checkout/order'); - $this->load->model('retailcrm/order'); - - $order = $this->model_checkout_order->getOrder($this->session->data['order_id']); - $order['products'] = $this->model_account_order->getOrderProducts($this->session->data['order_id']); - $order['order_total'] = $this->model_account_order->getOrderTotals($this->session->data['order_id']); - - $this->model_retailcrm_order->sendToCrm($order, $this->session->data['order_id']); - ]]> - - - - - - db->query("UPDATE `" . DB_PREFIX . "order` SET total = '" . (float)$total . "', affiliate_id = '" . (int)$affiliate_id . "', commission = '" . (float)$commission . "' WHERE order_id = '" . (int)$order_id . "'");]]> - load->model('setting/setting'); - $status = $this->model_setting_setting->getSetting('retailcrm'); - - if (!empty($data['order_status_id'])) { - $data['order_status'] = $status['retailcrm_status'][$data['order_status_id']]; - } - - $this->load->model('retailcrm/order'); - if (isset ($order_query)) { - $this->model_retailcrm_order->changeInCrm($data, $order_id); - } else { - $this->model_retailcrm_order->sendToCrm($data, $order_id); - } - } - ]]> - - -