Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SalesOrderAfterPlaceObserver.php
Go to the documentation of this file.
1 <?php
7 
10 
12 {
16  protected $_ruleFactory;
17 
22 
26  protected $_coupon;
27 
31  protected $_couponUsage;
32 
39  public function __construct(
40  \Magento\SalesRule\Model\RuleFactory $ruleFactory,
41  \Magento\SalesRule\Model\Rule\CustomerFactory $ruleCustomerFactory,
42  \Magento\SalesRule\Model\Coupon $coupon,
43  \Magento\SalesRule\Model\ResourceModel\Coupon\Usage $couponUsage
44  ) {
45  $this->_ruleFactory = $ruleFactory;
46  $this->_ruleCustomerFactory = $ruleCustomerFactory;
47  $this->_coupon = $coupon;
48  $this->_couponUsage = $couponUsage;
49  }
50 
56  public function execute(EventObserver $observer)
57  {
58  $order = $observer->getEvent()->getOrder();
59 
60  if (!$order || !$order->getAppliedRuleIds()) {
61  return $this;
62  }
63 
64  // lookup rule ids
65  $ruleIds = explode(',', $order->getAppliedRuleIds());
66  $ruleIds = array_unique($ruleIds);
67 
68  $ruleCustomer = null;
69  $customerId = $order->getCustomerId();
70 
71  // use each rule (and apply to customer, if applicable)
72  foreach ($ruleIds as $ruleId) {
73  if (!$ruleId) {
74  continue;
75  }
77  $rule = $this->_ruleFactory->create();
78  $rule->load($ruleId);
79  if ($rule->getId()) {
80  $rule->loadCouponCode();
81  $rule->setTimesUsed($rule->getTimesUsed() + 1);
82  $rule->save();
83 
84  if ($customerId) {
86  $ruleCustomer = $this->_ruleCustomerFactory->create();
87  $ruleCustomer->loadByCustomerRule($customerId, $ruleId);
88 
89  if ($ruleCustomer->getId()) {
90  $ruleCustomer->setTimesUsed($ruleCustomer->getTimesUsed() + 1);
91  } else {
92  $ruleCustomer->setCustomerId($customerId)->setRuleId($ruleId)->setTimesUsed(1);
93  }
94  $ruleCustomer->save();
95  }
96  }
97  }
98 
99  $this->_coupon->load($order->getCouponCode(), 'code');
100  if ($this->_coupon->getId()) {
101  $this->_coupon->setTimesUsed($this->_coupon->getTimesUsed() + 1);
102  $this->_coupon->save();
103  if ($customerId) {
104  $this->_couponUsage->updateCustomerCouponTimesUsed($customerId, $this->_coupon->getId());
105  }
106  }
107 
108  return $this;
109  }
110 }
$coupon
__construct(\Magento\SalesRule\Model\RuleFactory $ruleFactory, \Magento\SalesRule\Model\Rule\CustomerFactory $ruleCustomerFactory, \Magento\SalesRule\Model\Coupon $coupon, \Magento\SalesRule\Model\ResourceModel\Coupon\Usage $couponUsage)
$order
Definition: order.php:55