From 8a823cf3ad4429e8cc7781a59a9cf63bb0799973 Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 28 Feb 2019 16:28:07 +0300 Subject: [PATCH] =?UTF-8?q?v3.2.4=20=D0=9E=D1=82=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BD=D1=83=D0=BB=D0=B5=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=86=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82?= =?UTF-8?q?=D1=81=D1=83=D1=82=D1=81=D0=B2=D1=82=D1=83=D1=8E=D1=89=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=B0=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D1=86=D0=B5=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 +- .../model/extension/retailcrm/prices.php | 142 ++++++++++++------ .../template/extension/module/retailcrm.tpl | 2 +- .../template/extension/module/retailcrm.twig | 2 +- tests/admin/ModelRetailcrmPricesAdminTest.php | 7 +- tests/opencart_sample_data.sql | 6 + 6 files changed, 109 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9c6bbc..0318268 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## v.3.2.4 -* Изменена передача типов цен с учетом групп пользователей на сайте +* Добавлена возможность передачи акционных цен для нескольких групп пользователей +* Добавлена передача нулевой цены для неустановленных акционных цен +* Убрана базовая цена retailcrm из настроек соответствия типов цен ## v.3.2.2 * Убрана генерация externalId покупателя при заказе без регистрации на сайте. diff --git a/src/upload/admin/model/extension/retailcrm/prices.php b/src/upload/admin/model/extension/retailcrm/prices.php index 36a95f2..c7b9a1e 100644 --- a/src/upload/admin/model/extension/retailcrm/prices.php +++ b/src/upload/admin/model/extension/retailcrm/prices.php @@ -45,7 +45,6 @@ class ModelExtensionRetailcrmPrices extends Model $retailcrmApiClient->storePricesUpload($priceUpload); } - return $pricesUpload; } @@ -69,71 +68,89 @@ class ModelExtensionRetailcrmPrices extends Model $specials = $this->model_catalog_product->getProductSpecials($product['product_id']); if (!$specials) { - continue; + $productPrice = $this->getEmptyPrice(); + $prices[] = $this->getPriceRequest($product, $site, $productPrice, true); } $productPrice = array(); if (is_array($specials) && count($specials)) { - $productPrice = $this->getSpecialPrice($specials); + $productPrice = ModelExtensionRetailcrmPrices::getSpecialPrice($specials); } if (empty($productPrice)) { continue; } - $offers = $this->retailcrm->getOffers($product); - - foreach ($offers as $optionsString => $optionsValues) { - $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); - $price = array(); - - foreach($productPrice as $k => $v) { - if (isset($this->settings[$this->moduleTitle . '_special_' . $k])) { - $price[] = array( - 'code' => $this->settings[$this->moduleTitle . '_special_' . $k], - 'price' => $v + $optionsValues['price'] - ); - } - } - - $prices[] = array( - 'externalId' => $offerId ? $product['product_id'] . '#' . $offerId : $product['product_id'], - 'site' => $site, - 'prices' => $price - ); - - } + $prices[] = $this->getPriceRequest($product, $site, $productPrice); } return $prices; } + /** + * Get prices for request + * + * @param $product + * @param $site + * @param $specials + * @param bool $noSpecials + * + * @return array + */ + private function getPriceRequest($product, $site, $productPrice) + { + $offers = $this->retailcrm->getOffers($product); + $pricesProduct = array(); + + foreach ($offers as $optionsString => $optionsValues) { + $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); + $price = array(); + + foreach($productPrice as $k => $v) { + if (isset($this->settings[$this->moduleTitle . '_special_' . $k])) { + $price[] = array( + 'code' => $this->settings[$this->moduleTitle . '_special_' . $k], + 'price' => $v == 0 ? $v : $v + $optionsValues['price'] + ); + } + } + + $pricesProduct = array( + 'externalId' => $offerId ? $product['product_id'] . '#' . $offerId : $product['product_id'], + 'site' => $site, + 'prices' => $price + ); + } + + return $pricesProduct; + } + /** * Get actual special * @@ -166,6 +183,31 @@ class ModelExtensionRetailcrmPrices extends Model } } + $customerGroups = $this->model_customer_customer_group->getCustomerGroups(); + + foreach ($customerGroups as $customerGroup) { + if (!isset($productPrice[$customerGroup['customer_group_id']])){ + $productPrice[$customerGroup['customer_group_id']] = 0; + } + } + + return $productPrice; + } + + /** + * Get price for no special + * + * @return array $productPrice + */ + private function getEmptyPrice() + { + $customerGroups = $this->model_customer_customer_group->getCustomerGroups(); + $productPrice = array(); + + foreach ($customerGroups as $customerGroup) { + $productPrice[$customerGroup['customer_group_id']] = 0; + } + return $productPrice; } diff --git a/src/upload/admin/view/template/extension/module/retailcrm.tpl b/src/upload/admin/view/template/extension/module/retailcrm.tpl index 6804a93..af02012 100644 --- a/src/upload/admin/view/template/extension/module/retailcrm.tpl +++ b/src/upload/admin/view/template/extension/module/retailcrm.tpl @@ -142,7 +142,7 @@
{% for priceType in priceTypes %} - {% if priceType.active == true %} + {% if priceType.active == true and priceType.default == false%} diff --git a/tests/admin/ModelRetailcrmPricesAdminTest.php b/tests/admin/ModelRetailcrmPricesAdminTest.php index b98d5ae..7a7ad01 100644 --- a/tests/admin/ModelRetailcrmPricesAdminTest.php +++ b/tests/admin/ModelRetailcrmPricesAdminTest.php @@ -30,7 +30,8 @@ class ModelRetailcrmPricesAdminTest extends OpenCartTest array( $this->retailcrm->getModuleTitle() . '_apiversion' => 'v5', $this->retailcrm->getModuleTitle() . '_special_1' => 'special1', - $this->retailcrm->getModuleTitle() . '_special_2' => 'special2' + $this->retailcrm->getModuleTitle() . '_special_2' => 'special2', + $this->retailcrm->getModuleTitle() . '_special_3' => 'special3' ) ); } @@ -58,6 +59,10 @@ class ModelRetailcrmPricesAdminTest extends OpenCartTest $this->assertArrayHasKey('site', $price); $this->assertArrayHasKey('prices', $price); $this->assertInternalType('array', $price['prices']); + $this->assertEquals('special1', $price['prices'][0]['code']); + $this->assertEquals('special2', $price['prices'][1]['code']); + $this->assertEquals('special3', $price['prices'][2]['code']); + $this->assertEquals(0, $price['prices'][2]['price']); } private function sites(){ diff --git a/tests/opencart_sample_data.sql b/tests/opencart_sample_data.sql index cb4812d..c3c3057 100644 --- a/tests/opencart_sample_data.sql +++ b/tests/opencart_sample_data.sql @@ -4,9 +4,13 @@ INSERT INTO `oc_customer` (`customer_id`, `customer_group_id`, `store_id`, `lang TRUNCATE TABLE `oc_customer_activity`; TRUNCATE TABLE `oc_customer_group`; INSERT INTO `oc_customer_group` (`customer_group_id`, `approval`, `sort_order`) VALUES ('1', '0', '1'); +INSERT INTO `oc_customer_group` (`customer_group_id`, `approval`, `sort_order`) VALUES ('2', '0', '1'); +INSERT INTO `oc_customer_group` (`customer_group_id`, `approval`, `sort_order`) VALUES ('3', '0', '0'); TRUNCATE TABLE `oc_customer_group_description`; INSERT INTO `oc_customer_group_description` (`customer_group_id`, `language_id`, `name`, `description`) VALUES ('1', '1', 'Default', 'test'); +INSERT INTO `oc_customer_group_description` (`customer_group_id`, `language_id`, `name`, `description`) VALUES ('2', '1', 'Test2', 'test2'); +INSERT INTO `oc_customer_group_description` (`customer_group_id`, `language_id`, `name`, `description`) VALUES ('3', '1', 'test3', 'test3'); TRUNCATE TABLE `oc_customer_history`; TRUNCATE TABLE `oc_customer_ip`; @@ -39,11 +43,13 @@ INSERT INTO `oc_order_product` (`order_product_id`, `order_id`, `product_id`, `n TRUNCATE TABLE `oc_order_recurring`; TRUNCATE TABLE `oc_order_recurring_transaction`; TRUNCATE TABLE `oc_order_total`; + INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('162', '1', 'shipping', 'Flat Rate', '5.0000', '3'); INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('161', '1', 'sub_total', 'Sub-Total', '101.0000', '1'); INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('164', '2', 'sub_total', 'Sub-Total', '80.0000', '1'); INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('165', '2', 'shipping', 'Flat Rate', '5.0000', '3'); INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('163', '1', 'total', 'Total', '106.0000', '9'); INSERT INTO `oc_order_total` (`order_total_id`, `order_id`, `code`, `title`, `value`, `sort_order`) VALUES ('166', '2', 'total', 'Total', '85.0000', '9'); +INSERT INTO `oc_product_special` (`product_id`, `customer_group_id`, `priority`, `price`,`date_start`, `date_end`) values ('42', '2', '1', '110.000', CURDATE(), ADDDATE(CURDATE(),INTERVAL 10 DAY)); TRUNCATE TABLE `oc_order_voucher`; \ No newline at end of file