/**
  * @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));
 }