Skip to content

Commit 29e5957

Browse files
committed
magento#12817: Coupon code with canceled order.
1 parent bce7fc7 commit 29e5957

File tree

8 files changed

+183
-236
lines changed

8 files changed

+183
-236
lines changed

app/code/Magento/SalesRule/Observer/SalesOrderAfterCancelObserver.php

Lines changed: 0 additions & 117 deletions
This file was deleted.

app/code/Magento/SalesRule/Observer/SalesOrderAfterPlaceObserver.php

Lines changed: 0 additions & 110 deletions
This file was deleted.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\SalesRule\Plugin;
8+
9+
use Magento\Sales\Model\Order;
10+
use Magento\SalesRule\Model\Coupon;
11+
use Magento\SalesRule\Model\ResourceModel\Coupon\Usage;
12+
use Magento\SalesRule\Model\Rule\CustomerFactory;
13+
use Magento\SalesRule\Model\RuleFactory;
14+
15+
class AbstractCouponUses
16+
{
17+
/**
18+
* @var RuleFactory
19+
*/
20+
protected $ruleFactory;
21+
22+
/**
23+
* @var RuleFactory
24+
*/
25+
protected $ruleCustomerFactory;
26+
27+
/**
28+
* @var Coupon
29+
*/
30+
protected $coupon;
31+
32+
/**
33+
* @var Usage
34+
*/
35+
protected $couponUsage;
36+
37+
/**
38+
* @param RuleFactory $ruleFactory
39+
* @param CustomerFactory $ruleCustomerFactory
40+
* @param Coupon $coupon
41+
* @param Usage $couponUsage
42+
*/
43+
public function __construct(
44+
RuleFactory $ruleFactory,
45+
CustomerFactory $ruleCustomerFactory,
46+
Coupon $coupon,
47+
Usage $couponUsage
48+
) {
49+
$this->ruleFactory = $ruleFactory;
50+
$this->ruleCustomerFactory = $ruleCustomerFactory;
51+
$this->coupon = $coupon;
52+
$this->couponUsage = $couponUsage;
53+
}
54+
55+
/**
56+
* Updates coupon uses.
57+
*
58+
* @param Order $subject
59+
* @param bool $increment
60+
* @return Order
61+
*/
62+
protected function updateCouponUses(Order $subject, bool $increment)
63+
{
64+
if (!$subject || !$subject->getAppliedRuleIds()) {
65+
return $subject;
66+
}
67+
68+
// lookup rule ids
69+
$ruleIds = explode(',', $subject->getAppliedRuleIds());
70+
$ruleIds = array_unique($ruleIds);
71+
72+
$ruleCustomer = null;
73+
$customerId = $subject->getCustomerId();
74+
75+
// use each rule (and apply to customer, if applicable)
76+
foreach ($ruleIds as $ruleId) {
77+
if (!$ruleId) {
78+
continue;
79+
}
80+
/** @var \Magento\SalesRule\Model\Rule $rule */
81+
$rule = $this->ruleFactory->create();
82+
$rule->load($ruleId);
83+
if ($rule->getId()) {
84+
$rule->loadCouponCode();
85+
if ($increment || $rule->getTimesUsed() > 0) {
86+
$rule->setTimesUsed($rule->getTimesUsed() + ($increment ? 1 : -1));
87+
$rule->save();
88+
}
89+
90+
if ($customerId) {
91+
/** @var \Magento\SalesRule\Model\Rule\Customer $ruleCustomer */
92+
$ruleCustomer = $this->ruleCustomerFactory->create();
93+
$ruleCustomer->loadByCustomerRule($customerId, $ruleId);
94+
95+
if ($ruleCustomer->getId()) {
96+
if ($increment || $ruleCustomer->getTimesUsed() > 0) {
97+
$ruleCustomer->setTimesUsed($ruleCustomer->getTimesUsed() + ($increment ? 1 : -1));
98+
}
99+
} elseif ($increment) {
100+
$ruleCustomer->setCustomerId($customerId)->setRuleId($ruleId)->setTimesUsed(1);
101+
}
102+
$ruleCustomer->save();
103+
}
104+
}
105+
}
106+
107+
$this->coupon->load($subject->getCouponCode(), 'code');
108+
if ($this->coupon->getId()) {
109+
if ($increment || $this->coupon->getTimesUsed() > 0) {
110+
$this->coupon->setTimesUsed($this->coupon->getTimesUsed() + ($increment ? 1 : -1));
111+
$this->coupon->save();
112+
}
113+
if ($customerId) {
114+
$this->couponUsage->updateCustomerCouponTimesUsed($customerId, $this->coupon->getId(), $increment);
115+
}
116+
}
117+
118+
return $subject;
119+
}
120+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\SalesRule\Plugin;
8+
9+
use Magento\Sales\Model\Order;
10+
11+
class CouponUsesDecrement extends AbstractCouponUses
12+
{
13+
/**
14+
* Decrements number of coupon uses after cancelling order.
15+
*
16+
* @param Order $subject
17+
* @param callable $proceed
18+
* @return Order
19+
*/
20+
public function aroundCancel(Order $subject, callable $proceed)
21+
{
22+
$canCancel = $subject->canCancel();
23+
$returnValue = $proceed();
24+
if ($canCancel) {
25+
$returnValue = $this->updateCouponUses($returnValue, false);
26+
}
27+
28+
return $returnValue;
29+
}
30+
}

0 commit comments

Comments
 (0)