/** * @param EventObserver $observer * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function execute(EventObserver $observer) { $order = $observer->getEvent()->getOrder(); if (!$order || $order->getDiscountAmount() == 0) { return $this; } // lookup rule ids $ruleIds = explode(',', $order->getAppliedRuleIds()); $ruleIds = array_unique($ruleIds); $ruleCustomer = null; $customerId = $order->getCustomerId(); // use each rule (and apply to customer, if applicable) foreach ($ruleIds as $ruleId) { if (!$ruleId) { continue; } /** @var \Magento\SalesRule\Model\Rule $rule */ $rule = $this->_ruleFactory->create(); $rule->load($ruleId); if ($rule->getId()) { $rule->loadCouponCode(); $rule->setTimesUsed($rule->getTimesUsed() + 1); $rule->save(); if ($customerId) { /** @var \Magento\SalesRule\Model\Rule\Customer $ruleCustomer */ $ruleCustomer = $this->_ruleCustomerFactory->create(); $ruleCustomer->loadByCustomerRule($customerId, $ruleId); if ($ruleCustomer->getId()) { $ruleCustomer->setTimesUsed($ruleCustomer->getTimesUsed() + 1); } else { $ruleCustomer->setCustomerId($customerId)->setRuleId($ruleId)->setTimesUsed(1); } $ruleCustomer->save(); } } } $this->_coupon->load($order->getCouponCode(), 'code'); if ($this->_coupon->getId()) { $this->_coupon->setTimesUsed($this->_coupon->getTimesUsed() + 1); $this->_coupon->save(); if ($customerId) { $this->_couponUsage->updateCustomerCouponTimesUsed($customerId, $this->_coupon->getId()); } } return $this; }
/** * @param int|bool $ruleCustomerId * @dataProvider salesOrderAfterPlaceDataProvider */ public function testSalesOrderAfterPlace($ruleCustomerId) { $observer = $this->getMock('Magento\\Framework\\Event\\Observer', [], [], '', false); $rule = $this->getMock('Magento\\SalesRule\\Model\\Rule', [], [], '', false); $ruleCustomer = $this->getMock('Magento\\SalesRule\\Model\\Rule\\Customer', ['setCustomerId', 'loadByCustomerRule', 'getId', 'setTimesUsed', 'setRuleId', 'save', '__wakeup'], [], '', false); $order = $this->initOrderFromEvent($observer); $ruleId = 1; $couponId = 1; $customerId = 1; $discountAmount = 10; $order->expects($this->once())->method('getAppliedRuleIds')->will($this->returnValue($ruleId)); $order->expects($this->once())->method('getDiscountAmount')->will($this->returnValue($discountAmount)); $order->expects($this->once())->method('getCustomerId')->will($this->returnValue($customerId)); $this->ruleFactory->expects($this->once())->method('create')->will($this->returnValue($rule)); $rule->expects($this->once())->method('getId')->will($this->returnValue($ruleId)); $this->ruleCustomerFactory->expects($this->once())->method('create')->will($this->returnValue($ruleCustomer)); $ruleCustomer->expects($this->once())->method('getId')->will($this->returnValue($ruleCustomerId)); $ruleCustomer->expects($this->any())->method('setCustomerId')->will($this->returnSelf()); $ruleCustomer->expects($this->any())->method('setRuleId')->will($this->returnSelf()); $this->couponMock->expects($this->any())->method('getId')->will($this->returnValue($couponId)); $this->couponUsage->expects($this->once())->method('updateCustomerCouponTimesUsed')->with($customerId, $couponId); $this->assertEquals($this->model, $this->model->execute($observer)); }