Merge pull request #135 from sergeygw1990/master

v3.2.4
This commit is contained in:
Alex Lushpai 2019-03-01 16:25:53 +03:00 committed by GitHub
commit 03679ea62e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 481 additions and 364 deletions

View File

@ -1,3 +1,8 @@
## v.3.2.4
* Добавлена возможность передачи акционных цен для нескольких групп пользователей
* Добавлена передача нулевой цены для неустановленных акционных цен
* Убрана базовая цена retailcrm из настроек соответствия типов цен
## v.3.2.2 ## v.3.2.2
* Убрана генерация externalId покупателя при заказе без регистрации на сайте. * Убрана генерация externalId покупателя при заказе без регистрации на сайте.

View File

@ -1 +1 @@
3.2.2 3.2.4

View File

@ -119,6 +119,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
$this->load->model('setting/setting'); $this->load->model('setting/setting');
$this->load->model('extension/retailcrm/references'); $this->load->model('extension/retailcrm/references');
$this->load->model('localisation/currency'); $this->load->model('localisation/currency');
$this->load->model('customer/customer_group');
$this->load->language('extension/module/retailcrm'); $this->load->language('extension/module/retailcrm');
$this->document->setTitle($this->language->get('heading_title')); $this->document->setTitle($this->language->get('heading_title'));
$this->document->addStyle('/admin/view/stylesheet/retailcrm.css'); $this->document->addStyle('/admin/view/stylesheet/retailcrm.css');
@ -344,6 +345,7 @@ class ControllerExtensionModuleRetailcrm extends Controller
if ($apiVersion != 'v3') { if ($apiVersion != 'v3') {
$_data['priceTypes'] = $this->model_extension_retailcrm_references $_data['priceTypes'] = $this->model_extension_retailcrm_references
->getPriceTypes(); ->getPriceTypes();
$_data['customerGroups'] = $this->model_customer_customer_group->getCustomerGroups();
} }
} }

View File

@ -18,6 +18,7 @@ class ModelExtensionRetailcrmPrices extends Model
$this->load->library('retailcrm/retailcrm'); $this->load->library('retailcrm/retailcrm');
$this->load->model('catalog/option'); $this->load->model('catalog/option');
$this->load->model('setting/setting'); $this->load->model('setting/setting');
$this->load->model('customer/customer_group');
$this->moduleTitle = $this->retailcrm->getModuleTitle(); $this->moduleTitle = $this->retailcrm->getModuleTitle();
$this->settings = $this->model_setting_setting->getSetting($this->moduleTitle); $this->settings = $this->model_setting_setting->getSetting($this->moduleTitle);
@ -27,7 +28,7 @@ class ModelExtensionRetailcrmPrices extends Model
* Upload prices to CRM * Upload prices to CRM
* *
* @param array $products * @param array $products
* @param \RetailcrmProxy $retailcrmApiClient * @param RetailcrmProxy $retailcrmApiClient
* @return mixed bool | array * @return mixed bool | array
*/ */
public function uploadPrices($products, $retailcrmApiClient) public function uploadPrices($products, $retailcrmApiClient)
@ -59,9 +60,7 @@ class ModelExtensionRetailcrmPrices extends Model
$prices = array(); $prices = array();
$site = $this->getSite($retailcrmApiClient); $site = $this->getSite($retailcrmApiClient);
if (!isset($this->settings[$this->moduleTitle . '_special']) if ($this->settings[$this->moduleTitle . '_apiversion'] == 'v3') {
|| $this->settings[$this->moduleTitle . '_apiversion'] == 'v3'
) {
return false; return false;
} }
@ -69,18 +68,36 @@ class ModelExtensionRetailcrmPrices extends Model
$specials = $this->model_catalog_product->getProductSpecials($product['product_id']); $specials = $this->model_catalog_product->getProductSpecials($product['product_id']);
if (!$specials) { if (!$specials) {
$productPrice = $this->getEmptyPrice();
$prices[] = $this->getPriceRequest($product, $site, $productPrice);
continue; continue;
} }
$productPrice = array();
if (is_array($specials) && count($specials)) { if (is_array($specials) && count($specials)) {
$productPrice = $this->getSpecialPrice($specials); $productPrice = $this->getSpecialPrice($specials);
if (!$productPrice) {
continue;
}
} }
$prices[] = $this->getPriceRequest($product, $site, $productPrice);
}
return $prices;
}
/**
* Get prices for request
*
* @param $product
* @param $site
* @param $productPrice
*
* @return array
*/
private function getPriceRequest($product, $site, $productPrice)
{
$offers = $this->retailcrm->getOffers($product); $offers = $this->retailcrm->getOffers($product);
$pricesProduct = array();
foreach ($offers as $optionsString => $optionsValues) { foreach ($offers as $optionsString => $optionsValues) {
$optionsString = explode('_', $optionsString); $optionsString = explode('_', $optionsString);
@ -109,21 +126,25 @@ class ModelExtensionRetailcrmPrices extends Model
} }
$offerId = implode('_', $offerId); $offerId = implode('_', $offerId);
$price = array();
$prices[] = array( foreach($productPrice as $k => $v) {
'externalId' => $offerId ? $product['product_id'] . '#' . $offerId : $product['product_id'], if (isset($this->settings[$this->moduleTitle . '_special_' . $k])) {
'site' => $site, $price[] = array(
'prices' => array( 'code' => $this->settings[$this->moduleTitle . '_special_' . $k],
array( 'price' => $v == 0 ? $v : $v + $optionsValues['price']
'code' => $this->settings[$this->moduleTitle . '_special'],
'price' => $productPrice + $optionsValues['price']
)
)
); );
} }
} }
return $prices; $pricesProduct = array(
'externalId' => $offerId ? $product['product_id'] . '#' . $offerId : $product['product_id'],
'site' => $site,
'prices' => $price
);
}
return $pricesProduct;
} }
/** /**
@ -131,27 +152,58 @@ class ModelExtensionRetailcrmPrices extends Model
* *
* @param array $specials * @param array $specials
* *
* @return float $productPrice * @return array $productPrice
*/ */
private function getSpecialPrice($specials) private function getSpecialPrice($specials)
{ {
$date = date('Y-m-d'); $date = date('Y-m-d');
$always = '0000-00-00'; $always = '0000-00-00';
$productPrice = 0; $productPrice = array();
foreach ($specials as $special) { foreach ($specials as $special) {
if (($special['date_start'] == $always && $special['date_end'] == $always) if (($special['date_start'] == $always && $special['date_end'] == $always)
|| ($special['date_start'] <= $date && $special['date_end'] >= $date) || ($special['date_start'] <= $date && $special['date_end'] >= $date)
) { ) {
if ((isset($groupId) && $groupId == $special['customer_group_id']) || !isset($groupId)) {
if ((isset($priority) && $priority > $special['priority']) if ((isset($priority) && $priority > $special['priority'])
|| !isset($priority) || !isset($priority)
) { ) {
$productPrice = $special['price']; $productPrice[$special['customer_group_id']] = $special['price'];
$priority = $special['priority']; $priority = $special['priority'];
$groupId = $special['customer_group_id'];
}
} else {
$productPrice[$special['customer_group_id']] = $special['price'];
$groupId = $special['customer_group_id'];
} }
} }
} }
$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; return $productPrice;
} }

View File

@ -135,12 +135,15 @@
<fieldset> <fieldset>
<legend><?php echo $special_price_settings; ?></legend> <legend><?php echo $special_price_settings; ?></legend>
<div class="form-group retailcrm_unit"> <div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label"><?php echo $special_price_settings; ?></label> <?php foreach ($customerGroups as $customerGroup) :?>
<?php $cid = $customerGroup['customer_group_id']?>
<div class="row retailcrm_unit">
<label class="col-sm-2 control-label" style="text-align:right!important;" for="opencart_customer_group_<?php echo $customerGroup['customer_group_id']; ?>"><?php echo $customerGroup['name']; ?></label>
<div class="col-md-4 col-sm-10"> <div class="col-md-4 col-sm-10">
<select id="retailcrm_special" name="retailcrm_special" class="form-control"> <select id="retailcrm_special_<?php echo $uid; ?>" name="retailcrm_special_<?php echo $uid; ?>" class="form-control">
<?php foreach ($priceTypes as $priceType) :?> <?php foreach ($priceTypes as $k => $priceType): ?>
<?php if ($priceType['active'] == true) :?> <?php if ($priceType['active'] == true and $priceType['default'] == false) :?>
<option value="<?php echo $priceType['code']; ?>" <?php if(isset($saved_settings['retailcrm_special']) && $saved_settings['retailcrm_special'] == $priceType['code']):?>selected="selected"<?php endif;?>> <option value="<?php echo $priceType['code'];?>" <?php if(isset($saved_settings['retailcrm_special_' . $cid]) && $priceType['code'] == $saved_settings['retailcrm_special_' . $cid]):?>selected="selected"<?php endif;?>>
<?php echo $priceType['name'];?> <?php echo $priceType['name'];?>
</option> </option>
<?php endif; ?> <?php endif; ?>
@ -148,6 +151,8 @@
</select> </select>
</div> </div>
</div> </div>
<?php endforeach; ?>
</div>
</fieldset> </fieldset>
<?php endif; ?> <?php endif; ?>
<fieldset> <fieldset>

View File

@ -134,12 +134,15 @@
<fieldset> <fieldset>
<legend>{{ special_price_settings }}</legend> <legend>{{ special_price_settings }}</legend>
<div class="form-group retailcrm_unit"> <div class="form-group retailcrm_unit">
<label class="col-sm-2 control-label">{{ special_price_settings }}</label> {% for customerGroup in customerGroups %}
{% set cud = customerGroup.customer_group_id %}
<div class="row retailcrm_unit">
<label class="col-sm-2 control-label" for="opencart_customer_group_{{ cud }}">{{ customerGroup.name }}</label>
<div class="col-md-4 col-sm-10"> <div class="col-md-4 col-sm-10">
<select id="module_retailcrm_special" name="module_retailcrm_special" class="form-control"> <select id="module_retailcrm_special_{{ cud }}" name="module_retailcrm_special_{{ cud }}" class="form-control">
{% for priceType in priceTypes %} {% for priceType in priceTypes %}
{% if priceType.active == true %} {% if priceType.active == true and priceType.default == false%}
<option value="{{priceType.code }}" {% if saved_settings.module_retailcrm_special is defined and saved_settings.module_retailcrm_special == priceType.code %} selected="selected" {% endif %}> <option value ="{{ priceType.code }}" {% if saved_settings['module_retailcrm_special_'~cud] is defined and priceType.code == saved_settings['module_retailcrm_special_'~cud] %} selected="selected" {% endif %}>
{{ priceType.name }} {{ priceType.name }}
</option> </option>
{% endif %} {% endif %}
@ -147,6 +150,8 @@
</select> </select>
</div> </div>
</div> </div>
{% endfor %}
</div>
</fieldset> </fieldset>
{% endif %} {% endif %}
<fieldset> <fieldset>

View File

@ -17,7 +17,8 @@ class ModelRetailcrmPricesAdminTest extends OpenCartTest
->disableOriginalConstructor() ->disableOriginalConstructor()
->setMethods(array( ->setMethods(array(
'storePricesUpload', 'storePricesUpload',
'sitesList' 'sitesList',
'isSuccessful'
)) ))
->getMock(); ->getMock();
@ -28,13 +29,24 @@ class ModelRetailcrmPricesAdminTest extends OpenCartTest
$this->retailcrm->getModuleTitle(), $this->retailcrm->getModuleTitle(),
array( array(
$this->retailcrm->getModuleTitle() . '_apiversion' => 'v5', $this->retailcrm->getModuleTitle() . '_apiversion' => 'v5',
$this->retailcrm->getModuleTitle() . '_special' => 'special' $this->retailcrm->getModuleTitle() . '_special_1' => 'special1',
$this->retailcrm->getModuleTitle() . '_special_2' => 'special2',
$this->retailcrm->getModuleTitle() . '_special_3' => 'special3'
) )
); );
} }
public function testUploadPrices() public function testUploadPrices()
{ {
$response = new \RetailcrmApiResponse(
201,
json_encode(
$this->sites()
)
);
$this->apiClientMock->expects($this->any())->method('sitesList')->willReturn($response);
$productModel = $this->loadModel('catalog/product'); $productModel = $this->loadModel('catalog/product');
$products = $productModel->getProducts(); $products = $productModel->getProducts();
$prices = $this->pricesModel->uploadPrices($products, $this->apiClientMock); $prices = $this->pricesModel->uploadPrices($products, $this->apiClientMock);
@ -47,5 +59,35 @@ class ModelRetailcrmPricesAdminTest extends OpenCartTest
$this->assertArrayHasKey('site', $price); $this->assertArrayHasKey('site', $price);
$this->assertArrayHasKey('prices', $price); $this->assertArrayHasKey('prices', $price);
$this->assertInternalType('array', $price['prices']); $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(){
return array(
"success"=> true,
"sites"=> array(
"BitrixMod"=> array(
"name"=> "site",
"url"=> "http://site.ru",
"code"=> "site",
"defaultForCrm"=> false,
"ymlUrl"=> "http://site.ru/retailcrm.xml",
"loadFromYml"=> false,
"catalogUpdatedAt"=> "2019-02-08 13:30:37",
"catalogLoadingAt"=> "2019-02-11 09:12:18",
"contragent"=> array(
"contragentType"=> "legal-entity",
"legalName"=> "code",
"code"=> "code",
"countryIso"=> "RU",
"vatRate"=> "",
),
"countryIso"=> "",
)
),
);
} }
} }

View File

@ -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_activity`;
TRUNCATE TABLE `oc_customer_group`; 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 ('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`; 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 ('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_history`;
TRUNCATE TABLE `oc_customer_ip`; 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`;
TRUNCATE TABLE `oc_order_recurring_transaction`; TRUNCATE TABLE `oc_order_recurring_transaction`;
TRUNCATE TABLE `oc_order_total`; 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 ('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 ('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 ('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 ('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 ('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_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`; TRUNCATE TABLE `oc_order_voucher`;