Exemplo n.º 1
0
 /**
  * @param \Magento\SalesRule\Model\Rule $rule
  * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  * @param float $qty
  * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data
  */
 public function calculate($rule, $item, $qty)
 {
     /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */
     $discountData = $this->discountFactory->create();
     $quoteAmount = $this->priceCurrency->convert($rule->getDiscountAmount(), $item->getQuote()->getStore());
     $discountData->setAmount($qty * $quoteAmount);
     $discountData->setBaseAmount($qty * $rule->getDiscountAmount());
     return $discountData;
 }
Exemplo n.º 2
0
 /**
  * @param \Magento\SalesRule\Model\Rule $rule
  * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  * @param float $qty
  * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data
  */
 public function calculate($rule, $item, $qty)
 {
     /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */
     $discountData = $this->discountFactory->create();
     $ruleTotals = $this->validator->getRuleItemTotalsInfo($rule->getId());
     $quote = $item->getQuote();
     $address = $item->getAddress();
     $itemPrice = $this->validator->getItemPrice($item);
     $baseItemPrice = $this->validator->getItemBasePrice($item);
     $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
     $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
     /**
      * prevent applying whole cart discount for every shipping order, but only for first order
      */
     if ($quote->getIsMultiShipping()) {
         $usedForAddressId = $this->getCartFixedRuleUsedForAddress($rule->getId());
         if ($usedForAddressId && $usedForAddressId != $address->getId()) {
             return $discountData;
         } else {
             $this->setCartFixedRuleUsedForAddress($rule->getId(), $address->getId());
         }
     }
     $cartRules = $address->getCartFixedRules();
     if (!isset($cartRules[$rule->getId()])) {
         $cartRules[$rule->getId()] = $rule->getDiscountAmount();
     }
     if ($cartRules[$rule->getId()] > 0) {
         $store = $quote->getStore();
         if ($ruleTotals['items_count'] <= 1) {
             $quoteAmount = $this->priceCurrency->convert($cartRules[$rule->getId()], $store);
             $baseDiscountAmount = min($baseItemPrice * $qty, $cartRules[$rule->getId()]);
         } else {
             $discountRate = $baseItemPrice * $qty / $ruleTotals['base_items_price'];
             $maximumItemDiscount = $rule->getDiscountAmount() * $discountRate;
             $quoteAmount = $this->priceCurrency->convert($maximumItemDiscount, $store);
             $baseDiscountAmount = min($baseItemPrice * $qty, $maximumItemDiscount);
             $this->validator->decrementRuleItemTotalsCount($rule->getId());
         }
         $baseDiscountAmount = $this->priceCurrency->round($baseDiscountAmount);
         $cartRules[$rule->getId()] -= $baseDiscountAmount;
         $discountData->setAmount($this->priceCurrency->round(min($itemPrice * $qty, $quoteAmount)));
         $discountData->setBaseAmount($baseDiscountAmount);
         $discountData->setOriginalAmount(min($itemOriginalPrice * $qty, $quoteAmount));
         $discountData->setBaseOriginalAmount($this->priceCurrency->round($baseItemOriginalPrice));
     }
     $address->setCartFixedRules($cartRules);
     return $discountData;
 }
Exemplo n.º 3
0
 /**
  * @param \Magento\SalesRule\Model\Rule $rule
  * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  * @param float $qty
  * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data
  */
 public function calculate($rule, $item, $qty)
 {
     /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */
     $discountData = $this->discountFactory->create();
     $store = $item->getQuote()->getStore();
     $itemPrice = $this->validator->getItemPrice($item);
     $baseItemPrice = $this->validator->getItemBasePrice($item);
     $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
     $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
     $quoteAmount = $this->priceCurrency->convert($rule->getDiscountAmount(), $store);
     $discountData->setAmount($qty * ($itemPrice - $quoteAmount));
     $discountData->setBaseAmount($qty * ($baseItemPrice - $rule->getDiscountAmount()));
     $discountData->setOriginalAmount($qty * ($itemOriginalPrice - $quoteAmount));
     $discountData->setBaseOriginalAmount($qty * ($baseItemOriginalPrice - $rule->getDiscountAmount()));
     return $discountData;
 }
Exemplo n.º 4
0
 /**
  * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  * @param int[] $appliedRuleIds
  * @return $this
  */
 public function setAppliedRuleIds(\Magento\Quote\Model\Quote\Item\AbstractItem $item, array $appliedRuleIds)
 {
     $address = $item->getAddress();
     $quote = $item->getQuote();
     $item->setAppliedRuleIds(join(',', $appliedRuleIds));
     $address->setAppliedRuleIds($this->validatorUtility->mergeIds($address->getAppliedRuleIds(), $appliedRuleIds));
     $quote->setAppliedRuleIds($this->validatorUtility->mergeIds($quote->getAppliedRuleIds(), $appliedRuleIds));
     return $this;
 }
Exemplo n.º 5
0
 /**
  * Process "delta" rounding
  *
  * @param \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData
  * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  * @return $this
  * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  */
 public function deltaRoundingFix(\Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData, \Magento\Quote\Model\Quote\Item\AbstractItem $item)
 {
     $store = $item->getQuote()->getStore();
     $discountAmount = $discountData->getAmount();
     $baseDiscountAmount = $discountData->getBaseAmount();
     //TODO Seems \Magento\Quote\Model\Quote\Item\AbstractItem::getDiscountPercent() returns float value
     //that can not be used as array index
     $percentKey = $item->getDiscountPercent();
     if ($percentKey) {
         $delta = isset($this->_roundingDeltas[$percentKey]) ? $this->_roundingDeltas[$percentKey] : 0;
         $baseDelta = isset($this->_baseRoundingDeltas[$percentKey]) ? $this->_baseRoundingDeltas[$percentKey] : 0;
         $discountAmount += $delta;
         $baseDiscountAmount += $baseDelta;
         $this->_roundingDeltas[$percentKey] = $discountAmount - $this->priceCurrency->round($discountAmount);
         $this->_baseRoundingDeltas[$percentKey] = $baseDiscountAmount - $this->priceCurrency->round($baseDiscountAmount);
     }
     $discountData->setAmount($this->priceCurrency->round($discountAmount));
     $discountData->setBaseAmount($this->priceCurrency->round($baseDiscountAmount));
     return $this;
 }