Skip to content

Commit dc1d9f1

Browse files
author
Maksym Aposov
committed
MAGETWO-40789: Incorrectly calculated Regular price for simple product with Custom option of Percent type
1 parent 3759187 commit dc1d9f1

File tree

3 files changed

+73
-13
lines changed

3 files changed

+73
-13
lines changed

app/code/Magento/Catalog/Model/Product.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,19 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
117117
*/
118118
protected $_errors = [];
119119

120+
/**
121+
* Product option factory
122+
*
123+
* @var Product\OptionFactory
124+
*/
125+
protected $optionFactory;
126+
120127
/**
121128
* Product option
122129
*
123130
* @var Product\Option
124131
*/
125-
protected $_optionInstance;
132+
protected $optionInstance;
126133

127134
/**
128135
* @var array
@@ -337,7 +344,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel implements
337344
* @param Product\Link $productLink
338345
* @param Product\Configuration\Item\OptionFactory $itemOptionFactory
339346
* @param \Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory $stockItemFactory
340-
* @param Product\OptionFactory $catalogProductOption
347+
* @param Product\OptionFactory $catalogProductOptionFactory
341348
* @param Product\Visibility $catalogProductVisibility
342349
* @param Product\Attribute\Source\Status $catalogProductStatus
343350
* @param Product\Media\Config $catalogProductMediaConfig
@@ -376,7 +383,7 @@ public function __construct(
376383
Product\Link $productLink,
377384
\Magento\Catalog\Model\Product\Configuration\Item\OptionFactory $itemOptionFactory,
378385
\Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory $stockItemFactory,
379-
\Magento\Catalog\Model\Product\OptionFactory $catalogProductOption,
386+
\Magento\Catalog\Model\Product\OptionFactory $catalogProductOptionFactory,
380387
\Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
381388
\Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus,
382389
\Magento\Catalog\Model\Product\Media\Config $catalogProductMediaConfig,
@@ -405,7 +412,7 @@ public function __construct(
405412
$this->metadataService = $metadataService;
406413
$this->_itemOptionFactory = $itemOptionFactory;
407414
$this->_stockItemFactory = $stockItemFactory;
408-
$this->_optionInstance = $catalogProductOption->create()->setProduct($this);
415+
$this->optionFactory = $catalogProductOptionFactory;
409416
$this->_catalogProductVisibility = $catalogProductVisibility;
410417
$this->_catalogProductStatus = $catalogProductStatus;
411418
$this->_catalogProductMediaConfig = $catalogProductMediaConfig;
@@ -1889,7 +1896,11 @@ public function getWeight()
18891896
*/
18901897
public function getOptionInstance()
18911898
{
1892-
return $this->_optionInstance;
1899+
if (!isset($this->optionInstance)) {
1900+
$this->optionInstance = $this->optionFactory->create();
1901+
$this->optionInstance->setProduct($this);
1902+
}
1903+
return $this->optionInstance;
18931904
}
18941905

18951906
/**

app/code/Magento/Catalog/Test/Unit/Model/ProductTest.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,15 @@ public function setUp()
250250
->setMethods(['setProduct', 'saveOptions', '__wakeup', '__sleep'])
251251
->disableOriginalConstructor()->getMock();
252252

253+
$optionFactory = $this->getMock(
254+
'Magento\Catalog\Model\Product\OptionFactory',
255+
['create'],
256+
[],
257+
'',
258+
false
259+
);
260+
$optionFactory->expects($this->any())->method('create')->willReturn($this->optionInstanceMock);
261+
253262
$this->resource = $this->getMockBuilder('Magento\Catalog\Model\ResourceModel\Product')
254263
->disableOriginalConstructor()
255264
->getMock();
@@ -347,7 +356,7 @@ public function setUp()
347356
'catalogProductType' => $this->productTypeInstanceMock,
348357
'productFlatIndexerProcessor' => $this->productFlatProcessor,
349358
'productPriceIndexerProcessor' => $this->productPriceProcessor,
350-
'catalogProductOption' => $this->optionInstanceMock,
359+
'catalogProductOptionFactory' => $optionFactory,
351360
'storeManager' => $storeManager,
352361
'resource' => $this->resource,
353362
'registry' => $this->registry,
@@ -1241,6 +1250,14 @@ public function testGetOptions()
12411250
$optionInstanceMock = $this->getMockBuilder('Magento\Catalog\Model\Product\Option')
12421251
->disableOriginalConstructor()
12431252
->getMock();
1253+
$optionFactory = $this->getMock(
1254+
'Magento\Catalog\Model\Product\OptionFactory',
1255+
['create'],
1256+
[],
1257+
'',
1258+
false
1259+
);
1260+
$optionFactory->expects($this->any())->method('create')->willReturn($optionInstanceMock);
12441261
$joinProcessorMock = $this->getMockBuilder('Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface')
12451262
->disableOriginalConstructor()
12461263
->getMock();
@@ -1249,7 +1266,7 @@ public function testGetOptions()
12491266
$productModel = $this->objectManagerHelper->getObject(
12501267
'Magento\Catalog\Model\Product',
12511268
[
1252-
'catalogProductOption' => $optionInstanceMock,
1269+
'catalogProductOptionFactory' => $optionFactory,
12531270
'joinProcessor' => $joinProcessorMock
12541271
]
12551272
);

dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/PriceTest.php

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\Catalog\Model\Product\Type;
77

8+
use Magento\Catalog\Model\Product;
9+
810
/**
911
* @magentoDataFixture Magento/Catalog/_files/product_simple.php
1012
*/
@@ -29,7 +31,7 @@ public function testGetPrice()
2931

3032
public function testGetFinalPrice()
3133
{
32-
/** @var $product \Magento\Catalog\Model\Product */
34+
/** @var $product Product */
3335
$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
3436
'Magento\Catalog\Model\Product'
3537
);
@@ -42,12 +44,14 @@ public function testGetFinalPrice()
4244
$this->assertEquals(5.0, $this->_model->getFinalPrice(5, $product));
4345

4446
// with options
45-
$product->addCustomOption('option_ids', implode(',', array_keys($product->getOptions())));
47+
$buyRequest = $this->prepareBuyRequest($product);
48+
$product->getTypeInstance()->prepareForCart($buyRequest, $product);
4649

47-
foreach ($product->getOptions() as $id => $option) {
48-
$product->addCustomOption("option_{$id}", $option->getValue());
49-
}
50-
$this->assertEquals(16.0, $this->_model->getFinalPrice(1, $product));
50+
//product price + options price(10+1+2+3+3)
51+
$this->assertEquals(19.0, $this->_model->getFinalPrice(1, $product));
52+
53+
//product tier price + options price(5+1+2+3+3)
54+
$this->assertEquals(14.0, $this->_model->getFinalPrice(5, $product));
5155
}
5256

5357
public function testGetFormatedPrice()
@@ -82,4 +86,32 @@ public function testIsTierPriceFixed()
8286
{
8387
$this->assertTrue($this->_model->isTierPriceFixed());
8488
}
89+
90+
/**
91+
* Build buy request based on product custom options
92+
*
93+
* @param Product $product
94+
* @return \Magento\Framework\DataObject
95+
*/
96+
private function prepareBuyRequest(Product $product)
97+
{
98+
$options = [];
99+
/** @var $option \Magento\Catalog\Model\Product\Option */
100+
foreach ($product->getOptions() as $option) {
101+
switch ($option->getGroupByType()) {
102+
case \Magento\Catalog\Model\Product\Option::OPTION_GROUP_DATE:
103+
$value = ['year' => 2013, 'month' => 8, 'day' => 9, 'hour' => 13, 'minute' => 35];
104+
break;
105+
case \Magento\Catalog\Model\Product\Option::OPTION_GROUP_SELECT:
106+
$value = key($option->getValues());
107+
break;
108+
default:
109+
$value = 'test';
110+
break;
111+
}
112+
$options[$option->getId()] = $value;
113+
}
114+
115+
return new \Magento\Framework\DataObject(['qty' => 1, 'options' => $options]);
116+
}
85117
}

0 commit comments

Comments
 (0)