Skip to content

Commit 54e8398

Browse files
authored
Merge pull request #7492 from magento-trigger/AC-2518
[AC-2518] salesrule percentage amount bug [AC-2519] admin config state option
2 parents e1bd4b6 + 22085d3 commit 54e8398

File tree

5 files changed

+64
-32
lines changed

5 files changed

+64
-32
lines changed

app/code/Magento/Directory/Helper/Data.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,36 +33,36 @@ class Data extends AbstractHelper
3333
/**
3434
* Config value that lists ISO2 country codes which have optional Zip/Postal pre-configured
3535
*/
36-
const OPTIONAL_ZIP_COUNTRIES_CONFIG_PATH = 'general/country/optional_zip_countries';
36+
public const OPTIONAL_ZIP_COUNTRIES_CONFIG_PATH = 'general/country/optional_zip_countries';
3737

38-
/*
38+
/**
3939
* Path to config value, which lists countries, for which state is required.
4040
*/
41-
const XML_PATH_STATES_REQUIRED = 'general/region/state_required';
41+
public const XML_PATH_STATES_REQUIRED = 'general/region/state_required';
4242

43-
/*
43+
/**
4444
* Path to config value, which detects whether or not display the state for the country, if it is not required
4545
*/
46-
const XML_PATH_DISPLAY_ALL_STATES = 'general/region/display_all';
46+
public const XML_PATH_DISPLAY_ALL_STATES = 'general/region/display_all';
4747

4848
/**#@+
4949
* Path to config value, which is default country
5050
*/
51-
const XML_PATH_DEFAULT_COUNTRY = 'general/country/default';
52-
const XML_PATH_DEFAULT_LOCALE = 'general/locale/code';
53-
const XML_PATH_DEFAULT_TIMEZONE = 'general/locale/timezone';
51+
public const XML_PATH_DEFAULT_COUNTRY = 'general/country/default';
52+
public const XML_PATH_DEFAULT_LOCALE = 'general/locale/code';
53+
public const XML_PATH_DEFAULT_TIMEZONE = 'general/locale/timezone';
5454
/**#@-*/
5555

5656
/**
5757
* Path to config value that contains codes of the most used countries.
5858
* Such countries can be shown on the top of the country list.
5959
*/
60-
const XML_PATH_TOP_COUNTRIES = 'general/country/destinations';
60+
public const XML_PATH_TOP_COUNTRIES = 'general/country/destinations';
6161

6262
/**
6363
* Path to config value that contains weight unit
6464
*/
65-
const XML_PATH_WEIGHT_UNIT = 'general/locale/weight_unit';
65+
public const XML_PATH_WEIGHT_UNIT = 'general/locale/weight_unit';
6666

6767
/**
6868
* @var Collection
@@ -234,7 +234,7 @@ public function getCountriesWithOptionalZip($asJson = false)
234234
{
235235
if (null === $this->_optZipCountries) {
236236
$value = trim(
237-
$this->scopeConfig->getValue(
237+
(string)$this->scopeConfig->getValue(
238238
self::OPTIONAL_ZIP_COUNTRIES_CONFIG_PATH,
239239
ScopeInterface::SCOPE_STORE
240240
)
@@ -268,7 +268,7 @@ public function isZipCodeOptional($countryCode)
268268
public function getCountriesWithStatesRequired($asJson = false)
269269
{
270270
$value = trim(
271-
$this->scopeConfig->getValue(
271+
(string)$this->scopeConfig->getValue(
272272
self::XML_PATH_STATES_REQUIRED,
273273
ScopeInterface::SCOPE_STORE
274274
)

app/code/Magento/Directory/Test/Unit/Helper/DataTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ public static function countriesCommaListDataProvider()
226226
{
227227
return [
228228
'empty_list' => ['', []],
229+
'null_list' => [null, []],
229230
'normal_list' => ['Country1,Country2', ['Country1', 'Country2']]
230231
];
231232
}

app/code/Magento/SalesRule/Model/Utility.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,7 @@ public function deltaRoundingFix(
189189
$rowTotalInclTax = $item->getRowTotalInclTax();
190190
$baseRowTotalInclTax = $item->getBaseRowTotalInclTax();
191191

192-
//TODO Seems \Magento\Quote\Model\Quote\Item\AbstractItem::getDiscountPercent() returns float value
193-
//that can not be used as array index
194-
$percentKey = $item->getDiscountPercent();
192+
$percentKey = (string)$item->getDiscountPercent();
195193
$rowTotal = $item->getRowTotal();
196194
if ($percentKey && $rowTotal > 0) {
197195
$delta = isset($this->_roundingDeltas[$percentKey]) ? $this->_roundingDeltas[$percentKey] : 0;
@@ -209,7 +207,7 @@ public function deltaRoundingFix(
209207
* When we have 100% discount check if totals will not be negative
210208
*/
211209

212-
if ($percentKey == 100) {
210+
if ($item->getDiscountPercent() == 100) {
213211
$discountDelta = $rowTotalInclTax - $discountAmount;
214212
$baseDiscountDelta = $baseRowTotalInclTax - $baseDiscountAmount;
215213

app/code/Magento/SalesRule/Test/Unit/Model/UtilityTest.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -496,14 +496,15 @@ protected function getItemBasePrice(): int
496496
}
497497

498498
/**
499+
* @dataProvider deltaRoundingFixDataProvider
500+
* @param $discountAmount
501+
* @param $baseDiscountAmount
502+
* @param $percent
503+
* @param $rowTotal
499504
* @return void
500505
*/
501-
public function testDeltaRoundignFix(): void
506+
public function testDeltaRoundignFix($discountAmount, $baseDiscountAmount, $percent, $rowTotal): void
502507
{
503-
$discountAmount = 10.003;
504-
$baseDiscountAmount = 12.465;
505-
$percent = 15;
506-
$rowTotal = 100;
507508
$roundedDiscount = round($discountAmount, 2);
508509
$roundedBaseDiscount = round($baseDiscountAmount, 2);
509510
$delta = $discountAmount - $roundedDiscount;
@@ -546,7 +547,14 @@ public function testDeltaRoundignFix(): void
546547
->willReturnOnConsecutiveCalls($baseDiscountAmount, $baseDiscountAmount);
547548

548549
$this->assertEquals($this->utility, $this->utility->deltaRoundingFix($discountData, $this->item));
549-
$this->assertEquals($this->utility, $this->utility->deltaRoundingFix($discountData, $this->item));
550+
}
551+
552+
public function deltaRoundingFixDataProvider()
553+
{
554+
return [
555+
['discountAmount' => 10.003, 'baseDiscountAmount' => 12.465, 'percent' => 15, 'rowTotal' => 100],
556+
['discountAmount' => 5.0015, 'baseDiscountAmount' => 6.2325, 'percent' => 7.5, 'rowTotal' => 100],
557+
];
550558
}
551559

552560
/**

dev/tests/integration/testsuite/Magento/SalesRule/Model/Rule/Action/Discount/CartFixedTest.php

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -498,31 +498,56 @@ public function multishippingDataProvider(): array
498498
* @magentoDataFixture Magento/SalesRule/_files/cart_rule_50_percent_off_no_condition.php
499499
* @magentoDataFixture Magento/SalesRule/_files/cart_fixed_10_discount.php
500500
* @magentoDataFixture Magento/Checkout/_files/quote_with_simple_products.php
501+
* @dataProvider discountByPercentDataProvider
501502
* @return void
502503
*/
503-
public function testDiscountsWhenByPercentRuleAppliedFirstAndCartFixedRuleSecond(): void
504-
{
505-
$totalDiscount = -20.99;
506-
$discounts = [
507-
'simple1' => 5.72,
508-
'simple2' => 15.27,
509-
];
504+
public function testDiscountsWhenByPercentRuleAppliedFirstAndCartFixedRuleSecond(
505+
$percentDiscount,
506+
$expectedDiscounts
507+
): void {
508+
//Update rule discount
509+
/** @var \Magento\SalesRule\Model\Rule $rule */
510+
$rule = $this->getRule('50% off - July 4');
511+
$rule->setDiscountAmount($percentDiscount);
512+
$this->saveRule($rule);
510513
$quote = $this->getQuote('test_quote_with_simple_products');
511514
$quote->setCouponCode('2?ds5!2d');
512515
$quote->collectTotals();
513516
$this->quoteRepository->save($quote);
514517
$this->assertEquals(21.98, $quote->getBaseSubtotal());
515-
$this->assertEquals($totalDiscount, $quote->getShippingAddress()->getDiscountAmount());
518+
$this->assertEquals($expectedDiscounts['totalDiscount'], $quote->getShippingAddress()->getDiscountAmount());
516519
$items = $quote->getAllItems();
517520
$this->assertCount(2, $items);
518521
$item = array_shift($items);
519522
$this->assertEquals('simple1', $item->getSku());
520523
$this->assertEquals(5.99, $item->getPrice());
521-
$this->assertEquals($discounts[$item->getSku()], $item->getDiscountAmount());
524+
$this->assertEquals($expectedDiscounts[$item->getSku()], $item->getDiscountAmount());
522525
$item = array_shift($items);
523526
$this->assertEquals('simple2', $item->getSku());
524527
$this->assertEquals(15.99, $item->getPrice());
525-
$this->assertEquals($discounts[$item->getSku()], $item->getDiscountAmount());
528+
$this->assertEquals($expectedDiscounts[$item->getSku()], $item->getDiscountAmount());
529+
}
530+
531+
public function discountByPercentDataProvider()
532+
{
533+
return [
534+
[
535+
'percentDiscount' => 0,
536+
'expectedDiscounts' => ['simple1' => 2.73, 'simple2' => 7.27, 'totalDiscount' => -10]
537+
],
538+
[
539+
'percentDiscount' => 15.5,
540+
'expectedDiscounts' => ['simple1' => 3.65, 'simple2' => 9.76, 'totalDiscount' => -13.41]
541+
],
542+
[
543+
'percentDiscount' => 50,
544+
'expectedDiscounts' => ['simple1' => 5.72, 'simple2' => 15.27, 'totalDiscount' => -20.99]
545+
],
546+
[
547+
'percentDiscount' => 100,
548+
'expectedDiscounts' => ['simple1' => 5.99, 'simple2' => 15.99, 'totalDiscount' => -21.98]
549+
],
550+
];
526551
}
527552

528553
/**

0 commit comments

Comments
 (0)