예제 #1
1
 /**
  * @covers \Magento\SalesRule\Model\Rule\Action\Discount\CartFixed::calculate
  */
 public function testCalculate()
 {
     $this->rule->setData(['id' => 1, 'discount_amount' => 10.0]);
     $this->address->expects($this->any())->method('getCartFixedRules')->will($this->returnValue([]));
     $store = $this->getMock('Magento\\Store\\Model\\Store', [], [], '', false);
     $this->priceCurrency->expects($this->atLeastOnce())->method('convert')->will($this->returnArgument(0));
     $this->priceCurrency->expects($this->atLeastOnce())->method('round')->will($this->returnArgument(0));
     $this->quote->expects($this->any())->method('getStore')->will($this->returnValue($store));
     /** validators data */
     $this->validator->expects($this->once())->method('getItemPrice')->with($this->item)->will($this->returnValue(100));
     $this->validator->expects($this->once())->method('getItemBasePrice')->with($this->item)->will($this->returnValue(100));
     $this->validator->expects($this->once())->method('getItemOriginalPrice')->with($this->item)->will($this->returnValue(100));
     $this->validator->expects($this->once())->method('getItemBaseOriginalPrice')->with($this->item)->will($this->returnValue(100));
     $this->address->expects($this->once())->method('setCartFixedRules')->with([1 => 0.0]);
     $this->model->calculate($this->rule, $this->item, 1);
     $this->assertEquals($this->data->getAmount(), 10);
     $this->assertEquals($this->data->getBaseAmount(), 10);
     $this->assertEquals($this->data->getOriginalAmount(), 10);
     $this->assertEquals($this->data->getBaseOriginalAmount(), 100);
 }
예제 #2
0
 public function testProcessFreeShipping()
 {
     $item = $this->getMock('Magento\\Quote\\Model\\Quote\\Item', ['getAddress', '__wakeup'], [], '', false);
     $item->expects($this->once())->method('getAddress')->will($this->returnValue(true));
     $this->assertInstanceOf('Magento\\OfflineShipping\\Model\\SalesRule\\Calculator', $this->_model->processFreeShipping($item));
     return true;
 }
예제 #3
0
파일: Discount.php 프로젝트: aiesh/magento2
 /**
  * Collect address discount amount
  *
  * @param Address $address
  * @return $this
  */
 public function collect(Address $address)
 {
     parent::collect($address);
     $quote = $address->getQuote();
     $store = $this->_storeManager->getStore($quote->getStoreId());
     $this->_calculator->reset($address);
     $items = $this->_getAddressItems($address);
     if (!count($items)) {
         return $this;
     }
     $eventArgs = array('website_id' => $store->getWebsiteId(), 'customer_group_id' => $quote->getCustomerGroupId(), 'coupon_code' => $quote->getCouponCode());
     $this->_calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode());
     $this->_calculator->initTotals($items, $address);
     $address->setDiscountDescription(array());
     $items = $this->_calculator->sortItemsByPriority($items);
     foreach ($items as $item) {
         if ($item->getNoDiscount()) {
             $item->setDiscountAmount(0);
             $item->setBaseDiscountAmount(0);
             continue;
         }
         /**
          * Child item discount we calculate for parent
          */
         if ($item->getParentItemId()) {
             continue;
         }
         $eventArgs['item'] = $item;
         $this->_eventManager->dispatch('sales_quote_address_discount_item', $eventArgs);
         if ($item->getHasChildren() && $item->isChildrenCalculated()) {
             $isMatchedParent = $this->_calculator->canApplyRules($item);
             $this->_calculator->setSkipActionsValidation($isMatchedParent);
             foreach ($item->getChildren() as $child) {
                 $this->_calculator->process($child);
                 if ($isMatchedParent) {
                     $this->_recalculateChildDiscount($child);
                 }
                 $eventArgs['item'] = $child;
                 $this->_eventManager->dispatch('sales_quote_address_discount_item', $eventArgs);
                 $this->_aggregateItemDiscount($child);
             }
             $this->_calculator->setSkipActionsValidation(false);
         } else {
             $this->_calculator->process($item);
             $this->_aggregateItemDiscount($item);
         }
     }
     /**
      * Process shipping amount discount
      */
     $address->setShippingDiscountAmount(0);
     $address->setBaseShippingDiscountAmount(0);
     if ($address->getShippingAmount()) {
         $this->_calculator->processShippingAmount($address);
         $this->_addAmount(-$address->getShippingDiscountAmount());
         $this->_addBaseAmount(-$address->getBaseShippingDiscountAmount());
     }
     $this->_calculator->prepareDescription($address);
     return $this;
 }
예제 #4
0
 public function testCanApplyRules()
 {
     $item = $this->getQuoteItemMock();
     $quote = $item->getQuote();
     $quote->setItemsQty(2);
     $quote->setVirtualItemsQty(1);
     $this->assertTrue($this->model->canApplyRules($item));
     $quote->setItemsQty(2);
     $quote->setVirtualItemsQty(2);
     $this->assertTrue($this->model->canApplyRules($item));
 }
예제 #5
0
 public function testReset()
 {
     $this->utility->expects($this->once())->method('resetRoundingDeltas');
     $quoteMock = $this->getMockBuilder('Magento\\Sales\\Model\\Quote')->disableOriginalConstructor()->getMock();
     $addressMock = $this->getMockBuilder('Magento\\Sales\\Model\\Quote\\Address')->disableOriginalConstructor()->getMock();
     $addressMock->expects($this->once())->method('getQuote')->willReturn($quoteMock);
     $this->model->init($this->model->getWebsiteId(), $this->model->getCustomerGroupId(), $this->model->getCouponCode());
     $this->assertInstanceOf('\\Magento\\SalesRule\\Model\\Validator', $this->model->reset($addressMock));
 }
예제 #6
0
 /**
  * @param $qty
  * @param $ruleData
  * @param $itemData
  * @param $validItemData
  * @param $expectedRuleDiscountQty
  * @param $expectedDiscountData
  * @dataProvider calculateDataProvider
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function testCalculate($qty, $ruleData, $itemData, $validItemData, $expectedRuleDiscountQty, $expectedDiscountData)
 {
     $discountData = $this->getMockBuilder('Magento\\SalesRule\\Model\\Rule\\Action\\Discount\\Data')->disableOriginalConstructor()->setMethods(['setAmount', 'setBaseAmount', 'setOriginalAmount', 'setBaseOriginalAmount'])->getMock();
     $this->discountDataFactory->expects($this->once())->method('create')->will($this->returnValue($discountData));
     $rule = $this->getMockBuilder('Magento\\SalesRule\\Model\\Rule')->disableOriginalConstructor()->setMethods(['getDiscountAmount', 'getDiscountQty', '__wakeup'])->getMock();
     $item = $this->getMockBuilder('Magento\\Quote\\Model\\Quote\\Item\\AbstractItem')->disableOriginalConstructor()->setMethods(['getDiscountAmount', 'getBaseDiscountAmount', 'getDiscountPercent', 'setDiscountPercent', '__wakeup', 'getQuote', 'getAddress', 'getOptionByCode'])->getMock();
     $this->validator->expects($this->atLeastOnce())->method('getItemPrice')->with($item)->will($this->returnValue($validItemData['price']));
     $this->validator->expects($this->atLeastOnce())->method('getItemBasePrice')->with($item)->will($this->returnValue($validItemData['basePrice']));
     $this->validator->expects($this->atLeastOnce())->method('getItemOriginalPrice')->with($item)->will($this->returnValue($validItemData['originalPrice']));
     $this->validator->expects($this->atLeastOnce())->method('getItemBaseOriginalPrice')->with($item)->will($this->returnValue($validItemData['baseOriginalPrice']));
     $rule->expects($this->atLeastOnce())->method('getDiscountAmount')->will($this->returnValue($ruleData['discountAmount']));
     $rule->expects($this->atLeastOnce())->method('getDiscountQty')->will($this->returnValue($ruleData['discountQty']));
     $item->expects($this->atLeastOnce())->method('getDiscountAmount')->will($this->returnValue($itemData['discountAmount']));
     $item->expects($this->atLeastOnce())->method('getBaseDiscountAmount')->will($this->returnValue($itemData['baseDiscountAmount']));
     if (!$ruleData['discountQty'] || $ruleData['discountQty'] > $qty) {
         $item->expects($this->atLeastOnce())->method('getDiscountPercent')->will($this->returnValue($itemData['discountPercent']));
         $item->expects($this->atLeastOnce())->method('setDiscountPercent')->with($expectedRuleDiscountQty);
     }
     $discountData->expects($this->once())->method('setAmount')->with($expectedDiscountData['amount']);
     $discountData->expects($this->once())->method('setBaseAmount')->with($expectedDiscountData['baseAmount']);
     $discountData->expects($this->once())->method('setOriginalAmount')->with($expectedDiscountData['originalAmount']);
     $discountData->expects($this->once())->method('setBaseOriginalAmount')->with($expectedDiscountData['baseOriginalAmount']);
     $this->assertEquals($discountData, $this->model->calculate($rule, $item, $qty));
 }
예제 #7
0
 /**
  * Collect address discount amount
  *
  * @param \Magento\Quote\Model\Quote $quote
  * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment
  * @param \Magento\Quote\Model\Quote\Address\Total $total
  * @return $this
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  */
 public function collect(\Magento\Quote\Model\Quote $quote, \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment, \Magento\Quote\Model\Quote\Address\Total $total)
 {
     parent::collect($quote, $shippingAssignment, $total);
     $store = $this->storeManager->getStore($quote->getStoreId());
     $address = $shippingAssignment->getShipping()->getAddress();
     $this->calculator->reset($address);
     $items = $shippingAssignment->getItems();
     if (!count($items)) {
         return $this;
     }
     $eventArgs = ['website_id' => $store->getWebsiteId(), 'customer_group_id' => $quote->getCustomerGroupId(), 'coupon_code' => $quote->getCouponCode()];
     $this->calculator->init($store->getWebsiteId(), $quote->getCustomerGroupId(), $quote->getCouponCode());
     $this->calculator->initTotals($items, $address);
     $address->setDiscountDescription([]);
     $items = $this->calculator->sortItemsByPriority($items);
     /** @var \Magento\Quote\Model\Quote\Item $item */
     foreach ($items as $item) {
         if ($item->getNoDiscount() || !$this->calculator->canApplyDiscount($item)) {
             $item->setDiscountAmount(0);
             $item->setBaseDiscountAmount(0);
             // ensure my children are zeroed out
             if ($item->getHasChildren() && $item->isChildrenCalculated()) {
                 foreach ($item->getChildren() as $child) {
                     $child->setDiscountAmount(0);
                     $child->setBaseDiscountAmount(0);
                 }
             }
             continue;
         }
         // to determine the child item discount, we calculate the parent
         if ($item->getParentItem()) {
             continue;
         }
         $eventArgs['item'] = $item;
         $this->eventManager->dispatch('sales_quote_address_discount_item', $eventArgs);
         if ($item->getHasChildren() && $item->isChildrenCalculated()) {
             $this->calculator->process($item);
             $this->distributeDiscount($item);
             foreach ($item->getChildren() as $child) {
                 $eventArgs['item'] = $child;
                 $this->eventManager->dispatch('sales_quote_address_discount_item', $eventArgs);
                 $this->aggregateItemDiscount($child, $total);
             }
         } else {
             $this->calculator->process($item);
             $this->aggregateItemDiscount($item, $total);
         }
     }
     /** Process shipping amount discount */
     $address->setShippingDiscountAmount(0);
     $address->setBaseShippingDiscountAmount(0);
     if ($address->getShippingAmount()) {
         $this->calculator->processShippingAmount($address);
         $total->addTotalAmount($this->getCode(), -$address->getShippingDiscountAmount());
         $total->addBaseTotalAmount($this->getCode(), -$address->getBaseShippingDiscountAmount());
     }
     $this->calculator->prepareDescription($address);
     $total->setDiscountDescription($address->getDiscountDescription());
     $total->setSubtotalWithDiscount($total->getSubtotal() + $total->getDiscountAmount());
     $total->setBaseSubtotalWithDiscount($total->getBaseSubtotal() + $total->getBaseDiscountAmount());
     return $this;
 }