Skip to content

Commit 1c65707

Browse files
committed
Merge remote-tracking branch 'origin/AC-7099-v1' into spartans_pr_13062023
2 parents cb7cd87 + c942e9d commit 1c65707

File tree

4 files changed

+218
-5
lines changed

4 files changed

+218
-5
lines changed

app/code/Magento/ConfigurableProduct/Pricing/Price/ConfigurableRegularPrice.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,27 @@ public function getValue()
8787
return $this->values[$this->product->getId()];
8888
}
8989

90+
/**
91+
* Checks if all children simple products have the same price.
92+
*
93+
* @return bool
94+
*/
95+
public function isChildProductsOfEqualPrices():bool
96+
{
97+
$minPrice = $this->getMinRegularAmount()->getValue();
98+
$maxPrice = $this->getMaxRegularAmount()->getValue();
99+
foreach ($this->getUsedProducts() as $subProduct) {
100+
if ($subProduct->isAvailable() && !$subProduct->isDisabled()) {
101+
if ($specialPrice = $subProduct->getSpecialPrice()) {
102+
return !($specialPrice != $minPrice);
103+
} elseif ($subProduct->getFinalPrice() < $minPrice) {
104+
return false;
105+
}
106+
}
107+
}
108+
return !(count($this->getUsedProducts()) === 1) && $minPrice === $maxPrice;
109+
}
110+
90111
/**
91112
* @inheritdoc
92113
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="CreateConfigurableProductWithSamePriceActionGroup">
12+
<annotations>
13+
<description>Goes to the Admin Product grid page.
14+
Create a Configurable Product using the default Product Options with identical pricing.</description>
15+
</annotations>
16+
<arguments>
17+
<argument name="product" defaultValue="_defaultProduct"/>
18+
<argument name="category" defaultValue="_defaultCategory"/>
19+
</arguments>
20+
21+
<!-- fill in basic configurable product values -->
22+
<amOnPage url="{{AdminProductIndexPage.url}}" stepKey="amOnProductGridPage"/>
23+
<waitForPageLoad time="30" stepKey="wait1"/>
24+
<click selector="{{AdminProductGridActionSection.addProductToggle}}" stepKey="clickOnAddProductToggle"/>
25+
<click selector="{{AdminProductGridActionSection.addConfigurableProduct}}"
26+
stepKey="clickOnAddConfigurableProduct"/>
27+
<fillField userInput="{{product.name}}" selector="{{AdminProductFormSection.productName}}" stepKey="fillName"/>
28+
<fillField userInput="{{product.sku}}" selector="{{AdminProductFormSection.productSku}}" stepKey="fillSKU"/>
29+
<fillField userInput="{{product.price}}" selector="{{AdminProductFormSection.productPrice}}"
30+
stepKey="fillPrice"/>
31+
<fillField userInput="{{product.quantity}}" selector="{{AdminProductFormSection.productQuantity}}"
32+
stepKey="fillQuantity"/>
33+
<searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}"
34+
parameterArray="[{{category.name}}]" stepKey="fillCategory"/>
35+
<selectOption userInput="{{product.visibility}}" selector="{{AdminProductFormSection.visibility}}"
36+
stepKey="fillVisibility"/>
37+
<click selector="{{AdminProductSEOSection.sectionHeader}}" stepKey="openSeoSection"/>
38+
<fillField userInput="{{product.urlKey}}" selector="{{AdminProductSEOSection.urlKeyInput}}"
39+
stepKey="fillUrlKey"/>
40+
41+
<!-- create configurations for colors the product is available in -->
42+
<click selector="{{AdminProductFormConfigurationsSection.createConfigurations}}"
43+
stepKey="clickOnCreateConfigurations"/>
44+
<click selector="{{AdminCreateProductConfigurationsPanel.createNewAttribute}}" stepKey="clickOnNewAttribute"/>
45+
<waitForPageLoad stepKey="waitForIFrame"/>
46+
<switchToIFrame selector="{{AdminNewAttributePanel.newAttributeIFrame}}" stepKey="switchToNewAttributeIFrame"/>
47+
<fillField selector="{{AdminNewAttributePanel.defaultLabel}}"
48+
userInput="{{colorProductAttribute.default_label}}"
49+
stepKey="fillDefaultLabel"/>
50+
<click selector="{{AdminNewAttributePanel.saveAttribute}}" stepKey="clickOnNewAttributePanel"/>
51+
<waitForPageLoad stepKey="waitForSaveAttribute"/>
52+
<switchToIFrame stepKey="switchOutOfIFrame"/>
53+
<waitForPageLoad stepKey="waitForFilters"/>
54+
<click selector="{{AdminCreateProductConfigurationsPanel.filters}}" stepKey="clickOnFilters"/>
55+
<fillField userInput="{{colorProductAttribute.default_label}}"
56+
selector="{{AdminCreateProductConfigurationsPanel.attributeCode}}"
57+
stepKey="fillFilterAttributeCodeField"/>
58+
<click selector="{{AdminCreateProductConfigurationsPanel.applyFilters}}" stepKey="clickApplyFiltersButton"/>
59+
<click selector="{{AdminCreateProductConfigurationsPanel.firstCheckbox}}" stepKey="clickOnFirstCheckbox"/>
60+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton1"/>
61+
<waitForElementVisible selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}"
62+
stepKey="waitCreateNewValueAppears"/>
63+
<click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" stepKey="clickOnCreateNewValue1"/>
64+
<fillField userInput="{{colorProductAttribute1.name}}"
65+
selector="{{AdminCreateProductConfigurationsPanel.attributeName}}"
66+
stepKey="fillFieldForNewAttribute1"/>
67+
<click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" stepKey="clickOnSaveNewAttribute1"/>
68+
<click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" stepKey="clickOnCreateNewValue2"/>
69+
<fillField userInput="{{colorProductAttribute2.name}}"
70+
selector="{{AdminCreateProductConfigurationsPanel.attributeName}}"
71+
stepKey="fillFieldForNewAttribute2"/>
72+
<click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" stepKey="clickOnSaveNewAttribute2"/>
73+
<click selector="{{AdminCreateProductConfigurationsPanel.createNewValue}}" stepKey="clickOnCreateNewValue3"/>
74+
<fillField userInput="{{colorProductAttribute3.name}}"
75+
selector="{{AdminCreateProductConfigurationsPanel.attributeName}}"
76+
stepKey="fillFieldForNewAttribute3"/>
77+
<click selector="{{AdminCreateProductConfigurationsPanel.saveAttribute}}" stepKey="clickOnSaveNewAttribute3"/>
78+
<click selector="{{AdminCreateProductConfigurationsPanel.selectAll}}" stepKey="clickOnSelectAll"/>
79+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton2"/>
80+
<click selector="{{AdminCreateProductConfigurationsPanel.applyUniquePricesByAttributeToEachSku}}"
81+
stepKey="clickOnApplyUniquePricesByAttributeToEachSku"/>
82+
<selectOption selector="{{AdminCreateProductConfigurationsPanel.selectAttribute}}"
83+
userInput="{{colorProductAttribute.default_label}}" stepKey="selectAttributes"/>
84+
<fillField selector="{{AdminCreateProductConfigurationsPanel.attribute1}}"
85+
userInput="{{colorProductAttribute1.price}}" stepKey="fillAttributePrice1"/>
86+
<fillField selector="{{AdminCreateProductConfigurationsPanel.attribute2}}"
87+
userInput="{{colorProductAttribute1.price}}" stepKey="fillAttributePrice2"/>
88+
<fillField selector="{{AdminCreateProductConfigurationsPanel.attribute3}}"
89+
userInput="{{colorProductAttribute1.price}}" stepKey="fillAttributePrice3"/>
90+
<click selector="{{AdminCreateProductConfigurationsPanel.applySingleQuantityToEachSkus}}"
91+
stepKey="clickOnApplySingleQuantityToEachSku"/>
92+
<fillField selector="{{AdminCreateProductConfigurationsPanel.quantity}}"
93+
userInput="1" stepKey="enterAttributeQuantity"/>
94+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton3"/>
95+
<click selector="{{AdminCreateProductConfigurationsPanel.next}}" stepKey="clickOnNextButton4"/>
96+
<click selector="{{AdminProductFormActionSection.saveButton}}" stepKey="clickOnSaveButton2"/>
97+
<click selector="{{AdminChooseAffectedAttributeSetPopup.confirm}}" stepKey="clickOnConfirmInPopup"/>
98+
<seeElement selector="{{AdminProductMessagesSection.successMessage}}" stepKey="seeSaveProductMessage"/>
99+
<seeInTitle userInput="{{product.name}}" stepKey="seeProductNameInTitle"/>
100+
</actionGroup>
101+
</actionGroups>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10+
<test name="ConfigurableProductPriceLabelVisibilityWithoutAsLowAsTest">
11+
<annotations>
12+
<features value="ConfigurableProduct"/>
13+
<stories value="View configurable product details in storefront"/>
14+
<title value="Customer should not see As low as label for Configurable Product with identical pricing"/>
15+
<description value="Customer should not see As low as label for Configurable Product with same pricing"/>
16+
<severity value="AVERAGE"/>
17+
<testCaseId value="AC-7099"/>
18+
<group value="ConfigurableProduct"/>
19+
</annotations>
20+
21+
<before>
22+
<createData entity="ApiCategory" stepKey="createCategory"/>
23+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
24+
<!-- Create a configurable product via the UI -->
25+
<actionGroup ref="CreateConfigurableProductWithSamePriceActionGroup" stepKey="createProduct">
26+
<argument name="product" value="_defaultProduct"/>
27+
<argument name="category" value="$$createCategory$$"/>
28+
</actionGroup>
29+
</before>
30+
<after>
31+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
32+
<actionGroup ref="DeleteProductBySkuActionGroup" stepKey="deleteProduct">
33+
<argument name="sku" value="{{_defaultProduct.sku}}"/>
34+
</actionGroup>
35+
<actionGroup ref="AdminGridFilterResetActionGroup" stepKey="clearGridFiltersVirtual"/>
36+
<actionGroup ref="AdminGridFilterFillInputFieldActionGroup" stepKey="addSkuFilterVirtual">
37+
<argument name="filterInputName" value="sku"/>
38+
<argument name="filterValue" value="{{_defaultProduct.sku}}"/>
39+
</actionGroup>
40+
<actionGroup ref="AdminClickSearchInGridActionGroup" stepKey="applyGridFilterVirtual"/>
41+
<actionGroup ref="DeleteProductsIfTheyExistActionGroup" stepKey="deleteVirtualProducts">
42+
<argument name="sku" value="{{_defaultProduct.sku}}"/>
43+
</actionGroup>
44+
<actionGroup ref="ResetAdminDataGridToDefaultViewActionGroup" stepKey="clearProductsGridFilters"/>
45+
<actionGroup ref="AdminDeleteProductAttributeByLabelActionGroup" stepKey="deleteProductAttribute">
46+
<argument name="productAttributeLabel" value="{{colorProductAttribute.default_label}}"/>
47+
</actionGroup>
48+
<!-- Reindex after deleting product attribute -->
49+
<actionGroup ref="CliIndexerReindexActionGroup" stepKey="reindex">
50+
<argument name="indices" value=""/>
51+
</actionGroup>
52+
<actionGroup ref="AdminLogoutActionGroup" stepKey="adminLogout"/>
53+
</after>
54+
55+
<!-- Verify configurable product details in storefront product view -->
56+
<actionGroup ref="StorefrontOpenProductPageActionGroup" stepKey="amOnConfigurableProductPage">
57+
<argument name="productUrl" value="{{_defaultProduct.urlKey}}"/>
58+
</actionGroup>
59+
<comment userInput="Comment is added to preserve the step key for backward compatibility" stepKey="wait"/>
60+
<actionGroup ref="StorefrontAssertProductNameOnProductPageActionGroup" stepKey="seeProductName">
61+
<argument name="productName" value="{{_defaultProduct.name}}"/>
62+
</actionGroup>
63+
<actionGroup ref="StorefrontAssertProductSkuOnProductPageActionGroup" stepKey="seeProductSku">
64+
<argument name="productSku" value="{{_defaultProduct.sku}}"/>
65+
</actionGroup>
66+
<dontSee userInput="As low as" selector="{{StorefrontProductInfoMainSection.productPriceLabel}}"
67+
stepKey="seeProductPriceLabel"/>
68+
<actionGroup ref="AssertStorefrontProductStockStatusOnProductPageActionGroup" stepKey="seeProductStockStatus">
69+
<argument name="productStockStatus" value="In Stock"/>
70+
</actionGroup>
71+
<actionGroup ref="StorefrontAssertProductPriceOnProductPageActionGroup" stepKey="seeProductPrice">
72+
<argument name="productPrice" value="1.00"/>
73+
</actionGroup>
74+
<actionGroup ref="AssertStorefrontProductAttributeLabelVisibleActionGroup" stepKey="seeProductAttributeTitle">
75+
<argument name="productAttributeLabel" value="{{colorProductAttribute.default_label}}"/>
76+
</actionGroup>
77+
<comment userInput="Comment is added to preserve the step key for backward compatibility"
78+
stepKey="seeColorAttributeName1"/>
79+
<actionGroup ref="AssertStorefrontProductAttributeOptionVisibleActionGroup" stepKey="seeInDropDown1">
80+
<argument name="productAttributeOption" value="{{colorProductAttribute1.name}}"/>
81+
</actionGroup>
82+
<actionGroup ref="AssertStorefrontProductAttributeOptionVisibleActionGroup" stepKey="seeInDropDown2">
83+
<argument name="productAttributeOption" value="{{colorProductAttribute2.name}}"/>
84+
</actionGroup>
85+
<actionGroup ref="AssertStorefrontProductAttributeOptionVisibleActionGroup" stepKey="seeInDropDown3">
86+
<argument name="productAttributeOption" value="{{colorProductAttribute3.name}}"/>
87+
</actionGroup>
88+
</test>
89+
</tests>

app/code/Magento/ConfigurableProduct/view/base/templates/product/price/final_price.phtml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
$priceModel = $block->getPriceType('regular_price');
1010
/** @var \Magento\Framework\Pricing\Price\PriceInterface $finalPriceModel */
1111
$finalPriceModel = $block->getPriceType('final_price');
12+
/** @var Magento\ConfigurableProduct\Pricing\Price\ConfigurableRegularPriceInterface $regularPriceModel */
13+
$regularPriceModel = $block->getPriceType('regular_price');
1214
$idSuffix = $block->getIdSuffix() ? $block->getIdSuffix() : '';
1315
$schema = ($block->getZone() == 'item_view') ? true : false;
1416
?>
1517
<span class="normal-price">
1618
<?= /* @noEscape */ $block->renderAmount($finalPriceModel->getAmount(), [
17-
'display_label' => __('As low as'),
19+
'display_label' => $regularPriceModel->isChildProductsOfEqualPrices() ? '' : __('As low as'),
1820
'price_id' => $block->getPriceId('product-price-' . $idSuffix),
1921
'price_type' => 'finalPrice',
2022
'include_container' => true,
@@ -23,7 +25,7 @@ $schema = ($block->getZone() == 'item_view') ? true : false;
2325
?>
2426
</span>
2527

26-
<?php if (!$block->isProductList() && $block->hasSpecialPrice()) : ?>
28+
<?php if (!$block->isProductList() && $block->hasSpecialPrice()): ?>
2729
<span class="old-price sly-old-price no-display">
2830
<?= /* @noEscape */ $block->renderAmount($priceModel->getAmount(), [
2931
'display_label' => __('Regular Price'),
@@ -35,12 +37,12 @@ $schema = ($block->getZone() == 'item_view') ? true : false;
3537
</span>
3638
<?php endif; ?>
3739

38-
<?php if ($block->showMinimalPrice()) : ?>
39-
<?php if ($block->getUseLinkForAsLowAs()) :?>
40+
<?php if ($block->showMinimalPrice()): ?>
41+
<?php if ($block->getUseLinkForAsLowAs()):?>
4042
<a href="<?= $block->escapeUrl($block->getSaleableItem()->getProductUrl()) ?>" class="minimal-price-link">
4143
<?= /* @noEscape */ $block->renderAmountMinimal() ?>
4244
</a>
43-
<?php else :?>
45+
<?php else:?>
4446
<span class="minimal-price-link">
4547
<?= /* @noEscape */ $block->renderAmountMinimal() ?>
4648
</span>

0 commit comments

Comments
 (0)