7
7
8
8
use Magento \Quote \Model \Quote \Address ;
9
9
use Magento \Quote \Model \Quote \Item \AbstractItem ;
10
+ use Magento \SalesRule \Model \Data \RuleDiscount ;
10
11
use Magento \SalesRule \Model \Quote \ChildrenValidationLocator ;
11
12
use Magento \Framework \App \ObjectManager ;
12
13
use Magento \SalesRule \Model \ResourceModel \Rule \Collection ;
13
14
use Magento \SalesRule \Model \Rule \Action \Discount \CalculatorFactory ;
15
+ use Magento \SalesRule \Model \Rule \Action \Discount \Data ;
14
16
use Magento \SalesRule \Model \Rule \Action \Discount \DataFactory ;
15
17
use Magento \SalesRule \Api \Data \RuleDiscountInterfaceFactory ;
16
18
use Magento \SalesRule \Api \Data \DiscountDataInterfaceFactory ;
@@ -108,6 +110,9 @@ public function applyRules($item, $rules, $skipValidation, $couponCode)
108
110
$ address = $ item ->getAddress ();
109
111
$ appliedRuleIds = [];
110
112
$ this ->discountAggregator = [];
113
+ if ($ item ->getExtensionAttributes ()) {
114
+ $ item ->getExtensionAttributes ()->setDiscounts (null );
115
+ }
111
116
/* @var $rule Rule */
112
117
foreach ($ rules as $ rule ) {
113
118
if (!$ this ->validatorUtility ->canProcessRule ($ rule , $ address )) {
@@ -215,7 +220,7 @@ protected function applyRule($item, $rule, $address, $couponCode)
215
220
* @param AbstractItem $item
216
221
* @param \Magento\SalesRule\Model\Rule $rule
217
222
* @param \Magento\Quote\Model\Quote\Address $address
218
- * @return \Magento\SalesRule\Model\Rule\Action\Discount\ Data
223
+ * @return Data
219
224
*/
220
225
protected function getDiscountData ($ item , $ rule , $ address )
221
226
{
@@ -241,7 +246,7 @@ protected function getDiscountData($item, $rule, $address)
241
246
/**
242
247
* Set Discount Breakdown
243
248
*
244
- * @param \Magento\SalesRule\Model\Rule\Action\Discount\ Data $discountData
249
+ * @param Data $discountData
245
250
* @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
246
251
* @param \Magento\SalesRule\Model\Rule $rule
247
252
* @param \Magento\Quote\Model\Quote\Address $address
@@ -263,18 +268,72 @@ private function setDiscountBreakdown($discountData, $item, $rule, $address)
263
268
'rule ' => $ ruleLabel ,
264
269
'rule_id ' => $ rule ->getId (),
265
270
];
266
- /** @var \Magento\SalesRule\Model\Data\ RuleDiscount $itemDiscount */
271
+ /** @var RuleDiscount $itemDiscount */
267
272
$ ruleDiscount = $ this ->discountInterfaceFactory ->create (['data ' => $ data ]);
268
273
$ this ->discountAggregator [] = $ ruleDiscount ;
269
274
$ item ->getExtensionAttributes ()->setDiscounts ($ this ->discountAggregator );
275
+ $ parentItem = $ item ->getParentItem ();
276
+
277
+ if ($ parentItem && $ parentItem ->getExtensionAttributes ()) {
278
+ $ this ->aggregateDiscountBreakdown ($ discountData , $ parentItem , $ rule , $ address );
279
+ }
270
280
}
271
281
return $ this ;
272
282
}
273
283
284
+ /**
285
+ * Add Discount Breakdown to existing discount data
286
+ *
287
+ * @param Data $discountData
288
+ * @param AbstractItem $item
289
+ * @param Rule $rule
290
+ * @param Address $address
291
+ */
292
+ private function aggregateDiscountBreakdown (
293
+ Data $ discountData ,
294
+ AbstractItem $ item ,
295
+ Rule $ rule ,
296
+ Address $ address
297
+ ): void {
298
+ $ ruleLabel = $ rule ->getStoreLabel ($ address ->getQuote ()->getStore ()) ?: __ ('Discount ' );
299
+ /** @var RuleDiscount[] $discounts */
300
+ $ discounts = [];
301
+ foreach ((array ) $ item ->getExtensionAttributes ()->getDiscounts () as $ discount ) {
302
+ $ discounts [$ discount ->getRuleID ()] = $ discount ;
303
+ }
304
+
305
+ $ data = [
306
+ 'amount ' => $ discountData ->getAmount (),
307
+ 'base_amount ' => $ discountData ->getBaseAmount (),
308
+ 'original_amount ' => $ discountData ->getOriginalAmount (),
309
+ 'base_original_amount ' => $ discountData ->getBaseOriginalAmount ()
310
+ ];
311
+
312
+ $ discount = $ discounts [$ rule ->getId ()] ?? null ;
313
+
314
+ if (isset ($ discount )) {
315
+ $ data ['amount ' ] += $ discount ->getDiscountData ()->getAmount ();
316
+ $ data ['base_amount ' ] += $ discount ->getDiscountData ()->getBaseAmount ();
317
+ $ data ['original_amount ' ] += $ discount ->getDiscountData ()->getOriginalAmount ();
318
+ $ data ['base_original_amount ' ] += $ discount ->getDiscountData ()->getBaseOriginalAmount ();
319
+ }
320
+
321
+ $ discounts [$ rule ->getId ()] = $ this ->discountInterfaceFactory ->create (
322
+ [
323
+ 'data ' => [
324
+ 'discount ' => $ this ->discountDataInterfaceFactory ->create (['data ' => $ data ]),
325
+ 'rule ' => $ ruleLabel ,
326
+ 'rule_id ' => $ rule ->getId (),
327
+ ]
328
+ ]
329
+ );
330
+ $ item ->getExtensionAttributes ()->setDiscounts (array_values ($ discounts ));
331
+ }
332
+
274
333
/**
275
334
* Set Discount data
276
335
*
277
- * @param \Magento\SalesRule\Model\Rule\Action\Discount\ Data $discountData
336
+ * @param Data $discountData
278
337
* @param AbstractItem $item
279
338
* @return $this
280
339
*/
@@ -312,14 +371,14 @@ public function maintainAddressCouponCode($address, $rule, $couponCode)
312
371
/**
313
372
* Fire event to allow overwriting of discount amounts
314
373
*
315
- * @param \Magento\SalesRule\Model\Rule\Action\Discount\ Data $discountData
374
+ * @param Data $discountData
316
375
* @param AbstractItem $item
317
376
* @param Rule $rule
318
377
* @param float $qty
319
378
* @return $this
320
379
*/
321
380
protected function eventFix (
322
- \ Magento \ SalesRule \ Model \ Rule \ Action \ Discount \ Data $ discountData ,
381
+ Data $ discountData ,
323
382
AbstractItem $ item ,
324
383
Rule $ rule ,
325
384
$ qty
0 commit comments