SalesOrderAfterPlaceObserver.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\SalesRule\Observer;
  7. use Magento\Framework\Event\Observer as EventObserver;
  8. use Magento\Framework\Event\ObserverInterface;
  9. class SalesOrderAfterPlaceObserver implements ObserverInterface
  10. {
  11. /**
  12. * @var \Magento\SalesRule\Model\RuleFactory
  13. */
  14. protected $_ruleFactory;
  15. /**
  16. * @var \Magento\SalesRule\Model\RuleFactory
  17. */
  18. protected $_ruleCustomerFactory;
  19. /**
  20. * @var \Magento\SalesRule\Model\Coupon
  21. */
  22. protected $_coupon;
  23. /**
  24. * @var \Magento\SalesRule\Model\ResourceModel\Coupon\Usage
  25. */
  26. protected $_couponUsage;
  27. /**
  28. * @param \Magento\SalesRule\Model\RuleFactory $ruleFactory
  29. * @param \Magento\SalesRule\Model\Rule\CustomerFactory $ruleCustomerFactory
  30. * @param \Magento\SalesRule\Model\Coupon $coupon
  31. * @param \Magento\SalesRule\Model\ResourceModel\Coupon\Usage $couponUsage
  32. */
  33. public function __construct(
  34. \Magento\SalesRule\Model\RuleFactory $ruleFactory,
  35. \Magento\SalesRule\Model\Rule\CustomerFactory $ruleCustomerFactory,
  36. \Magento\SalesRule\Model\Coupon $coupon,
  37. \Magento\SalesRule\Model\ResourceModel\Coupon\Usage $couponUsage
  38. ) {
  39. $this->_ruleFactory = $ruleFactory;
  40. $this->_ruleCustomerFactory = $ruleCustomerFactory;
  41. $this->_coupon = $coupon;
  42. $this->_couponUsage = $couponUsage;
  43. }
  44. /**
  45. * @param EventObserver $observer
  46. * @return $this
  47. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  48. */
  49. public function execute(EventObserver $observer)
  50. {
  51. $order = $observer->getEvent()->getOrder();
  52. if (!$order || !$order->getAppliedRuleIds()) {
  53. return $this;
  54. }
  55. // lookup rule ids
  56. $ruleIds = explode(',', $order->getAppliedRuleIds());
  57. $ruleIds = array_unique($ruleIds);
  58. $ruleCustomer = null;
  59. $customerId = $order->getCustomerId();
  60. // use each rule (and apply to customer, if applicable)
  61. foreach ($ruleIds as $ruleId) {
  62. if (!$ruleId) {
  63. continue;
  64. }
  65. /** @var \Magento\SalesRule\Model\Rule $rule */
  66. $rule = $this->_ruleFactory->create();
  67. $rule->load($ruleId);
  68. if ($rule->getId()) {
  69. $rule->loadCouponCode();
  70. $rule->setTimesUsed($rule->getTimesUsed() + 1);
  71. $rule->save();
  72. if ($customerId) {
  73. /** @var \Magento\SalesRule\Model\Rule\Customer $ruleCustomer */
  74. $ruleCustomer = $this->_ruleCustomerFactory->create();
  75. $ruleCustomer->loadByCustomerRule($customerId, $ruleId);
  76. if ($ruleCustomer->getId()) {
  77. $ruleCustomer->setTimesUsed($ruleCustomer->getTimesUsed() + 1);
  78. } else {
  79. $ruleCustomer->setCustomerId($customerId)->setRuleId($ruleId)->setTimesUsed(1);
  80. }
  81. $ruleCustomer->save();
  82. }
  83. }
  84. }
  85. $this->_coupon->load($order->getCouponCode(), 'code');
  86. if ($this->_coupon->getId()) {
  87. $this->_coupon->setTimesUsed($this->_coupon->getTimesUsed() + 1);
  88. $this->_coupon->save();
  89. if ($customerId) {
  90. $this->_couponUsage->updateCustomerCouponTimesUsed($customerId, $this->_coupon->getId());
  91. }
  92. }
  93. return $this;
  94. }
  95. }