Skip to content

Commit f659a70

Browse files
authored
LYNX-341: Multicoupon labels
1 parent 7e0fc6b commit f659a70

File tree

3 files changed

+37
-18
lines changed

3 files changed

+37
-18
lines changed

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,11 @@ public function __construct(
112112
* @param AbstractItem $item
113113
* @param array $rules
114114
* @param bool $skipValidation
115+
* @param string $couponCodes
115116
* @return array
116117
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
117118
*/
118-
public function applyRules($item, $rules, $skipValidation)
119+
public function applyRules($item, $rules, $skipValidation, array $couponCodes = [])
119120
{
120121
$address = $item->getAddress();
121122
$appliedRuleIds = [];
@@ -142,7 +143,7 @@ public function applyRules($item, $rules, $skipValidation)
142143
}
143144
}
144145

145-
$this->applyRule($item, $rule, $address);
146+
$this->applyRule($item, $rule, $address, $couponCodes);
146147
$appliedRuleIds[$rule->getRuleId()] = $rule->getRuleId();
147148
}
148149

@@ -228,18 +229,19 @@ public function addShippingDiscountDescription(
228229
*
229230
* @param AbstractItem $item
230231
* @param Rule $rule
231-
* @param \Magento\Quote\Model\Quote\Address $address
232+
* @param Address $address
233+
* @param string[] $couponCodes
232234
* @return $this
233235
*/
234-
protected function applyRule($item, $rule, $address)
236+
protected function applyRule($item, $rule, $address, array $couponCodes = [])
235237
{
236238
if ($item->getChildren() && $item->isChildrenCalculated()) {
237239
$cloneItem = clone $item;
238240

239241
$applyToChildren = false;
240242
foreach ($item->getChildren() as $childItem) {
241243
if ($rule->getActions()->validate($childItem)) {
242-
$discountData = $this->getDiscountData($childItem, $rule, $address);
244+
$discountData = $this->getDiscountData($childItem, $rule, $address, $couponCodes);
243245
$this->setDiscountData($discountData, $childItem);
244246
$applyToChildren = true;
245247
}
@@ -248,15 +250,15 @@ protected function applyRule($item, $rule, $address)
248250
* validate without children
249251
*/
250252
if (!$applyToChildren && $rule->getActions()->validate($cloneItem)) {
251-
$discountData = $this->getDiscountData($item, $rule, $address);
253+
$discountData = $this->getDiscountData($item, $rule, $address, $couponCodes);
252254
$this->setDiscountData($discountData, $item);
253255
}
254256
} else {
255-
$discountData = $this->getDiscountData($item, $rule, $address);
257+
$discountData = $this->getDiscountData($item, $rule, $address, $couponCodes);
256258
$this->setDiscountData($discountData, $item);
257259
}
258260

259-
$this->addDiscountDescription($address, $rule);
261+
$this->addDiscountDescription($address, $rule, $couponCodes);
260262
$this->maintainAddressCouponCode($address, $rule, $address->getQuote()->getCouponCode());
261263

262264
return $this;
@@ -267,10 +269,11 @@ protected function applyRule($item, $rule, $address)
267269
*
268270
* @param AbstractItem $item
269271
* @param \Magento\SalesRule\Model\Rule $rule
270-
* @param \Magento\Quote\Model\Quote\Address $address
272+
* @param Address $address
273+
* @param string[] $couponCodes
271274
* @return Data
272275
*/
273-
protected function getDiscountData($item, $rule, $address)
276+
protected function getDiscountData($item, $rule, $address, array $couponCodes = [])
274277
{
275278
$qty = $this->validatorUtility->getItemQty($item, $rule);
276279

@@ -279,7 +282,7 @@ protected function getDiscountData($item, $rule, $address)
279282
$discountData = $discountCalculator->calculate($rule, $item, $qty);
280283
$this->eventFix($discountData, $item, $rule, $qty);
281284
$this->validatorUtility->deltaRoundingFix($discountData, $item);
282-
$this->setDiscountBreakdown($discountData, $item, $rule, $address);
285+
$this->setDiscountBreakdown($discountData, $item, $rule, $address, $couponCodes);
283286

284287
/**
285288
* We can't use row total here because row total not include tax
@@ -297,10 +300,11 @@ protected function getDiscountData($item, $rule, $address)
297300
* @param Data $discountData
298301
* @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
299302
* @param \Magento\SalesRule\Model\Rule $rule
300-
* @param \Magento\Quote\Model\Quote\Address $address
303+
* @param Address $address
304+
* @param string[] $couponCodes
301305
* @return $this
302306
*/
303-
private function setDiscountBreakdown($discountData, $item, $rule, $address)
307+
private function setDiscountBreakdown($discountData, $item, $rule, $address, array $couponCodes = [])
304308
{
305309
if ($discountData->getAmount() > 0 && $item->getExtensionAttributes()) {
306310
$data = [
@@ -310,10 +314,9 @@ private function setDiscountBreakdown($discountData, $item, $rule, $address)
310314
'base_original_amount' => $discountData->getBaseOriginalAmount()
311315
];
312316
$itemDiscount = $this->discountDataInterfaceFactory->create(['data' => $data]);
313-
$ruleLabel = $rule->getStoreLabel($address->getQuote()->getStore()) ?: __('Discount');
314317
$data = [
315318
'discount' => $itemDiscount,
316-
'rule' => $ruleLabel,
319+
'rule' => $this->getRuleLabel($address, $rule, $couponCodes),
317320
'rule_id' => $rule->getId(),
318321
];
319322
/** @var RuleDiscount $itemDiscount */

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,10 +395,20 @@ public function process(AbstractItem $item, Rule $rule)
395395
return $this;
396396
}
397397

398+
$couponCodes = [];
399+
if ($this->getCouponCode()) {
400+
$couponCodes = [$this->getCouponCode()];
401+
}
402+
403+
if ($this->getCouponCodes()) {
404+
$couponCodes = $this->getCouponCodes();
405+
}
406+
398407
$appliedRuleIds = $this->rulesApplier->applyRules(
399408
$item,
400409
[$rule],
401-
$this->_skipActionsValidation
410+
$this->_skipActionsValidation,
411+
$couponCodes
402412
);
403413
$this->rulesApplier->setAppliedRuleIds($item, $appliedRuleIds);
404414

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@
1515
use Magento\Quote\Model\Quote\Item;
1616
use Magento\Quote\Model\Quote\Item\AbstractItem;
1717
use Magento\Rule\Model\Action\Collection;
18+
use Magento\SalesRule\Api\Data\DiscountDataInterfaceFactory;
19+
use Magento\SalesRule\Api\Data\RuleDiscountInterfaceFactory;
1820
use Magento\SalesRule\Model\Quote\ChildrenValidationLocator;
1921
use Magento\SalesRule\Model\Rule;
2022
use Magento\SalesRule\Model\Rule\Action\Discount\CalculatorFactory;
2123
use Magento\SalesRule\Model\Rule\Action\Discount\Data;
2224
use Magento\SalesRule\Model\Rule\Action\Discount\DataFactory;
2325
use Magento\SalesRule\Model\Rule\Action\Discount\DiscountInterface;
2426
use Magento\SalesRule\Model\RulesApplier;
27+
use Magento\SalesRule\Model\SelectRuleCoupon;
2528
use Magento\SalesRule\Model\Utility;
2629
use PHPUnit\Framework\MockObject\MockObject;
2730
use PHPUnit\Framework\TestCase;
@@ -87,7 +90,10 @@ protected function setUp(): void
8790
$this->eventManager,
8891
$this->validatorUtility,
8992
$this->childrenValidationLocator,
90-
$this->discountFactory
93+
$this->discountFactory,
94+
$this->createMock(RuleDiscountInterfaceFactory::class),
95+
$this->createMock(DiscountDataInterfaceFactory::class),
96+
$this->createMock(SelectRuleCoupon::class),
9197
);
9298
}
9399

@@ -170,7 +176,7 @@ public function testApplyRules(
170176
$this->applyRule($item, $rule);
171177
}
172178

173-
$result = $this->rulesApplier->applyRules($item, [$rule], $skipValidation, $couponCode);
179+
$result = $this->rulesApplier->applyRules($item, [$rule], $skipValidation, [$couponCode]);
174180
$this->assertEquals($appliedRuleIds, $result);
175181
}
176182

0 commit comments

Comments
 (0)