Skip to content

Commit a7ee62f

Browse files
committed
MC-35065: Catalog pricerules are not working with custom options as expected in Magento 2.3.0 product details page
1 parent bb78ad8 commit a7ee62f

11 files changed

+119
-100
lines changed

app/code/Magento/Catalog/Block/Product/View/Options/AbstractOptions.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ abstract class AbstractOptions extends \Magento\Framework\View\Element\Template
6060
* @param \Magento\Framework\Pricing\Helper\Data $pricingHelper
6161
* @param \Magento\Catalog\Helper\Data $catalogData
6262
* @param array $data
63-
* @param CalculateCustomOptionCatalogRule $calculateCustomOptionCatalogRule
63+
* @param CalculateCustomOptionCatalogRule|null $calculateCustomOptionCatalogRule
6464
*/
6565
public function __construct(
6666
\Magento\Framework\View\Element\Template\Context $context,
@@ -174,14 +174,15 @@ protected function _formatPrice($value, $flag = true)
174174
$priceStr = $sign;
175175

176176
$customOptionPrice = $this->getProduct()->getPriceInfo()->getPrice('custom_option_price');
177+
$isPercent = (bool) $value['is_percent'];
177178

178-
if (!$value['is_percent']) {
179+
if (!$isPercent) {
179180
$catalogPriceValue = $this->calculateCustomOptionCatalogRule->execute(
180181
$this->getProduct(),
181182
(float)$value['pricing_value'],
182-
(bool)$value['is_percent']
183+
$isPercent
183184
);
184-
if ($catalogPriceValue!==null) {
185+
if ($catalogPriceValue !== null) {
185186
$value['pricing_value'] = $catalogPriceValue;
186187
}
187188
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class Option extends AbstractExtensibleModel implements ProductCustomOptionInter
146146
* @param ProductCustomOptionValuesInterfaceFactory|null $customOptionValuesFactory
147147
* @param array $optionGroups
148148
* @param array $optionTypesToGroups
149-
* @param CalculateCustomOptionCatalogRule $calculateCustomOptionCatalogRule
149+
* @param CalculateCustomOptionCatalogRule|null $calculateCustomOptionCatalogRule
150150
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
151151
*/
152152
public function __construct(
@@ -474,19 +474,21 @@ public function afterSave()
474474
*/
475475
public function getPrice($flag = false)
476476
{
477-
if ($flag && $this->getPriceType() == self::$typePercent) {
477+
if ($flag && $this->getPriceType() === self::$typePercent) {
478478
$price = $this->calculateCustomOptionCatalogRule->execute(
479479
$this->getProduct(),
480480
(float)$this->getData(self::KEY_PRICE),
481481
$this->getPriceType() === Value::TYPE_PERCENT
482482
);
483483

484-
if ($price == null) {
484+
if ($price === null) {
485485
$basePrice = $this->getProduct()->getPriceInfo()->getPrice(BasePrice::PRICE_CODE)->getValue();
486486
$price = $basePrice * ($this->_getData(self::KEY_PRICE) / 100);
487487
}
488+
488489
return $price;
489490
}
491+
490492
return $this->_getData(self::KEY_PRICE);
491493
}
492494

app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class DefaultType extends \Magento\Framework\DataObject
7373
* @param \Magento\Checkout\Model\Session $checkoutSession
7474
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
7575
* @param array $data
76-
* @param CalculateCustomOptionCatalogRule $calculateCustomOptionCatalogRule
76+
* @param CalculateCustomOptionCatalogRule|null $calculateCustomOptionCatalogRule
7777
*/
7878
public function __construct(
7979
\Magento\Checkout\Model\Session $checkoutSession,
@@ -357,12 +357,12 @@ public function getOptionPrice($optionValue, $basePrice)
357357
(float)$option->getPrice(),
358358
$option->getPriceType() === Value::TYPE_PERCENT
359359
);
360-
if ($catalogPriceValue!==null) {
360+
if ($catalogPriceValue !== null) {
361361
return $catalogPriceValue;
362362
} else {
363363
return $this->_getChargeableOptionPrice(
364364
$option->getPrice(),
365-
$option->getPriceType() == 'percent',
365+
$option->getPriceType() === Value::TYPE_PERCENT,
366366
$basePrice
367367
);
368368
}

app/code/Magento/Catalog/Model/Product/Option/Type/Select.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Magento\Catalog\Pricing\Price\CalculateCustomOptionCatalogRule;
1111
use Magento\Framework\App\ObjectManager;
1212
use Magento\Framework\Exception\LocalizedException;
13+
use Magento\Catalog\Model\Product\Option;
1314

1415
/**
1516
* Catalog product option select type
@@ -52,7 +53,7 @@ class Select extends \Magento\Catalog\Model\Product\Option\Type\DefaultType
5253
* @param \Magento\Framework\Escaper $escaper
5354
* @param array $data
5455
* @param array $singleSelectionTypes
55-
* @param CalculateCustomOptionCatalogRule $calculateCustomOptionCatalogRule
56+
* @param CalculateCustomOptionCatalogRule|null $calculateCustomOptionCatalogRule
5657
*/
5758
public function __construct(
5859
\Magento\Checkout\Model\Session $checkoutSession,
@@ -350,24 +351,24 @@ protected function _isSingleSelection()
350351
/**
351352
* Returns calculated price of option
352353
*
353-
* @param \Magento\Catalog\Model\Product\Option $option
354-
* @param \Magento\Catalog\Model\Product\Option\Value $result
354+
* @param Option $option
355+
* @param Option\Value $result
355356
* @param float $basePrice
356-
* @return float|null
357+
* @return float
357358
*/
358-
protected function getCalculatedOptionValue($option, $result, $basePrice)
359+
protected function getCalculatedOptionValue(Option $option, Value $result, float $basePrice) : float
359360
{
360361
$catalogPriceValue = $this->calculateCustomOptionCatalogRule->execute(
361362
$option->getProduct(),
362363
(float)$result->getPrice(),
363364
$result->getPriceType() === Value::TYPE_PERCENT
364365
);
365-
if ($catalogPriceValue!==null) {
366+
if ($catalogPriceValue !== null) {
366367
$optionCalculatedValue = $catalogPriceValue;
367368
} else {
368369
$optionCalculatedValue = $this->_getChargeableOptionPrice(
369370
$result->getPrice(),
370-
$result->getPriceType() == 'percent',
371+
$result->getPriceType() === Value::TYPE_PERCENT,
371372
$basePrice
372373
);
373374
}

app/code/Magento/Catalog/Pricing/Price/CalculateCustomOptionCatalogRule.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ class CalculateCustomOptionCatalogRule
2727
private $priceModifier;
2828

2929
/**
30-
* CalculateCustomOptionCatalogRule constructor.
3130
* @param PriceCurrencyInterface $priceCurrency
3231
* @param PriceModifierInterface $priceModifier
3332
*/
@@ -51,7 +50,7 @@ public function execute(
5150
Product $product,
5251
float $optionPriceValue,
5352
bool $isPercent
54-
) {
53+
): ?float {
5554
$regularPrice = (float)$product->getPriceInfo()
5655
->getPrice(RegularPrice::PRICE_CODE)
5756
->getValue();
@@ -69,6 +68,7 @@ public function execute(
6968
$finalOptionPrice = $totalCatalogRulePrice - $catalogRulePrice;
7069
return $this->priceCurrency->convertAndRound($finalOptionPrice);
7170
}
71+
7272
return null;
7373
}
7474

app/code/Magento/Catalog/Test/Unit/Model/Product/Option/ValueTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ class ValueTest extends TestCase
3232
/**
3333
* @var CalculateCustomOptionCatalogRule|MockObject
3434
*/
35-
private $CalculateCustomOptionCatalogRule;
35+
private $calculateCustomOptionCatalogRule;
3636

3737
protected function setUp(): void
3838
{
3939
$mockedResource = $this->getMockedResource();
4040
$mockedCollectionFactory = $this->getMockedValueCollectionFactory();
4141

42-
$this->CalculateCustomOptionCatalogRule = $this->createMock(
42+
$this->calculateCustomOptionCatalogRule = $this->createMock(
4343
CalculateCustomOptionCatalogRule::class
4444
);
4545

@@ -49,7 +49,7 @@ protected function setUp(): void
4949
[
5050
'resource' => $mockedResource,
5151
'valueCollectionFactory' => $mockedCollectionFactory,
52-
'CalculateCustomOptionCatalogRule' => $this->CalculateCustomOptionCatalogRule
52+
'CalculateCustomOptionCatalogRule' => $this->calculateCustomOptionCatalogRule
5353
]
5454
);
5555
$this->model->setOption($this->getMockedOption());
@@ -77,7 +77,7 @@ public function testGetPrice()
7777
$this->assertEquals($price, $this->model->getPrice(false));
7878

7979
$percentPrice = 100.0;
80-
$this->CalculateCustomOptionCatalogRule->expects($this->atLeastOnce())
80+
$this->calculateCustomOptionCatalogRule->expects($this->atLeastOnce())
8181
->method('execute')
8282
->willReturn($percentPrice);
8383
$this->assertEquals($percentPrice, $this->model->getPrice(true));

app/code/Magento/CatalogRule/Model/Rule.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,7 @@ public function getIdentities()
898898

899899
/**
900900
* Clear price rules cache.
901+
* @return void;
901902
*/
902903
public function clearPriceRulesData(): void
903904
{

app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductAndFixedMethodTest.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
-->
88

99
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10-
<test name="ApplyCatalogRuleForSimpleProductAndFixedMethodTest" deprecated="Use ApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest instead">
10+
<test name="ApplyCatalogRuleForSimpleProductAndFixedMethodTest" deprecated="Use StorefrontApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest instead">
1111
<annotations>
1212
<features value="CatalogRule"/>
1313
<stories value="Apply catalog price rule"/>
@@ -18,7 +18,7 @@
1818
<group value="CatalogRule"/>
1919
<group value="mtf_migrated"/>
2020
<skip>
21-
<issueId value="DEPRECATED">Use ApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest instead</issueId>
21+
<issueId value="DEPRECATED">Use StorefrontApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest instead</issueId>
2222
</skip>
2323
</annotations>
2424
<before>

app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductWithCustomOptionsTest.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
-->
88

99
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10-
<test name="ApplyCatalogRuleForSimpleProductWithCustomOptionsTest" deprecated="Use ApplyCatalogRuleForSimpleProductsWithCustomOptionsTest instead">
10+
<test name="ApplyCatalogRuleForSimpleProductWithCustomOptionsTest" deprecated="Use StorefrontApplyCatalogRuleForSimpleProductsWithCustomOptionsTest instead">
1111
<annotations>
1212
<features value="CatalogRule"/>
1313
<stories value="Apply catalog price rule"/>
@@ -18,7 +18,7 @@
1818
<group value="CatalogRule"/>
1919
<group value="mtf_migrated"/>
2020
<skip>
21-
<issueId value="DEPRECATED">Use ApplyCatalogRuleForSimpleProductsWithCustomOptionsTest instead</issueId>
21+
<issueId value="DEPRECATED">Use StorefrontApplyCatalogRuleForSimpleProductsWithCustomOptionsTest instead</issueId>
2222
</skip>
2323
</annotations>
2424
<before>

app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest.xml renamed to app/code/Magento/CatalogRule/Test/Mftf/Test/StorefrontApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest.xml

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
-->
88

99
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10-
<test name="ApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest">
10+
<test name="StorefrontApplyCatalogRuleForSimpleProductWithSelectFixedMethodTest">
1111
<annotations>
1212
<features value="CatalogRule"/>
1313
<stories value="Apply catalog price rule"/>
@@ -17,6 +17,7 @@
1717
<testCaseId value="MC-14771"/>
1818
<group value="catalogRule"/>
1919
<group value="mtf_migrated"/>
20+
<group value="catalog"/>
2021
</annotations>
2122
<before>
2223
<!-- Create category -->
@@ -29,45 +30,45 @@
2930
</createData>
3031

3132
<!-- Update all products to have custom options -->
32-
<updateData createDataKey="createProduct1" entity="productWithFixedOptions" stepKey="updateProductWithOptions1"/>
33-
<actionGroup ref="CliIndexerReindexActionGroup" stepKey="reindex">
34-
<argument name="indices" value=""/>
35-
</actionGroup>
33+
<updateData createDataKey="createProduct1" entity="productWithFixedOptions" stepKey="updateFirstProductWithOptions"/>
3634

3735
<!-- Login as Admin -->
3836
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
37+
38+
<!-- Clear all catalog price rules and reindex before test -->
39+
<actionGroup ref="AdminCatalogPriceRuleDeleteAllActionGroup" stepKey="deleteAllCatalogRulesBeforeTest"/>
40+
<actionGroup ref="CliIndexerReindexActionGroup" stepKey="reindex">
41+
<argument name="indices" value=""/>
42+
</actionGroup>
3943
</before>
4044
<after>
4145
<!-- Delete products and category -->
4246
<deleteData createDataKey="createProduct1" stepKey="deleteProduct1"/>
4347
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
4448

4549
<!-- Delete the catalog price rule -->
46-
<actionGroup ref="AdminOpenCatalogPriceRulePageActionGroup" stepKey="goToPriceRulePage"/>
47-
<actionGroup ref="deleteEntitySecondaryGrid" stepKey="deletePriceRule">
48-
<argument name="name" value="{{CatalogRuleByFixed.name}}"/>
49-
<argument name="searchInput" value="{{AdminSecondaryGridSection.catalogRuleIdentifierSearch}}"/>
50-
</actionGroup>
51-
50+
<actionGroup ref="AdminCatalogPriceRuleDeleteAllActionGroup" stepKey="deleteAllCatalogRulesAfterTest"/>
5251
<!-- Logout -->
5352
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/>
5453
</after>
5554
<!-- 1. Begin creating a new catalog price rule -->
56-
<actionGroup ref="NewCatalogPriceRuleByUIWithConditionIsCategoryActionGroup" stepKey="newCatalogPriceRuleByUIWithConditionIsCategory">
57-
<argument name ="categoryId" value="$createCategory.id$"/>
58-
<argument name ="catalogRule" value="CatalogRuleByFixed"/>
55+
<actionGroup ref="AdminOpenNewCatalogPriceRuleFormPageActionGroup" stepKey="startCreatingFirstPriceRule"/>
56+
<actionGroup ref="AdminCatalogPriceRuleFillMainInfoActionGroup" stepKey="fillMainInfoForFirstPriceRule">
57+
<argument name="groups" value="'NOT LOGGED IN'"/>
5958
</actionGroup>
60-
61-
<!-- Select not logged in customer group -->
62-
<actionGroup ref="SelectNotLoggedInCustomerGroupActionGroup" stepKey="selectNotLoggedInCustomerGroup"/>
63-
64-
<!-- Save and apply the new catalog price rule -->
65-
<conditionalClick selector="{{AdminNewCatalogPriceRule.active}}" dependentSelector="{{AdminNewCatalogPriceRule.activeIsEnabled}}" visible="false" stepKey="enableActiveBtn"/>
66-
<click selector="{{AdminNewCatalogPriceRule.save}}" stepKey="clickSave"/>
67-
<waitForPageLoad stepKey="waitForSave"/>
59+
<actionGroup ref="AdminFillCatalogRuleConditionActionGroup" stepKey="createCatalogPriceRule">
60+
<argument name="conditionValue" value="$createCategory.id$"/>
61+
</actionGroup>
62+
<actionGroup ref="AdminCatalogPriceRuleFillActionsActionGroup" stepKey="fillActionsForCatalogPriceRule">
63+
<argument name="apply" value="by_fixed"/>
64+
<argument name="discountAmount" value="12.3"/>
65+
</actionGroup>
66+
<actionGroup ref="AdminCatalogPriceRuleSaveAndApplyActionGroup" stepKey="saveAndApplyCatalogPriceRule"/>
6867

6968
<!-- Navigate to category on store front -->
70-
<amOnPage url="{{StorefrontProductPage.url($createCategory.name$)}}" stepKey="goToStorefrontCategoryPage"/>
69+
<actionGroup ref="StorefrontNavigateCategoryPageActionGroup" stepKey="goToStorefrontCategoryPage">
70+
<argument name="category" value="$createCategory$"/>
71+
</actionGroup>
7172

7273
<!-- Check product 1 name on store front category page -->
7374
<actionGroup ref="AssertProductDetailsOnStorefrontActionGroup" stepKey="storefrontProduct1Name">
@@ -87,8 +88,10 @@
8788
<argument name="productNumber" value="1"/>
8889
</actionGroup>
8990

90-
<!-- Navigate to product 1 on store front -->
91-
<amOnPage url="{{StorefrontProductPage.url($createProduct1.name$)}}" stepKey="goToProductPage1"/>
91+
<!-- Navigate to product on store front -->
92+
<actionGroup ref="OpenStoreFrontProductPageActionGroup" stepKey="goToProductPage1">
93+
<argument name="productUrlKey" value="$createProduct1.custom_attributes[url_key]$"/>
94+
</actionGroup>
9295

9396
<!-- Assert regular and special price after selecting ProductOptionValueDropdown1 -->
9497
<actionGroup ref="StorefrontSelectCustomOptionRadioAndAssertPricesActionGroup" stepKey="storefrontSelectCustomOptionAndAssertPrices1">
@@ -99,8 +102,8 @@
99102
</actionGroup>
100103

101104
<!-- Add product 1 to cart -->
102-
<actionGroup ref="StorefrontAddProductToCartWithQtyActionGroup" stepKey="cartAddSimpleProduct1ToCart">
103-
<argument name="productQty" value="1"/>
105+
<actionGroup ref="AddToCartFromStorefrontProductPageActionGroup" stepKey="addToCartFromStorefrontProductPage1">
106+
<argument name="productName" value="$createProduct1.name$"/>
104107
</actionGroup>
105108

106109
<!-- Assert sub total on mini shopping cart -->

0 commit comments

Comments
 (0)