예제 #1
0
파일: ByFixed.php 프로젝트: aiesh/magento2
 /**
  * @param \Magento\SalesRule\Model\Rule $rule
  * @param \Magento\Sales\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 = $item->getQuote()->getStore()->convertPrice($rule->getDiscountAmount());
     $discountData->setAmount($qty * $quoteAmount);
     $discountData->setBaseAmount($qty * $rule->getDiscountAmount());
     return $discountData;
 }
예제 #2
0
 /**
  * @param \Magento\SalesRule\Model\Rule $rule
  * @param \Magento\Sales\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 = $store->convertPrice($cartRules[$rule->getId()]);
             $baseDiscountAmount = min($baseItemPrice * $qty, $cartRules[$rule->getId()]);
         } else {
             $discountRate = $baseItemPrice * $qty / $ruleTotals['base_items_price'];
             $maximumItemDiscount = $rule->getDiscountAmount() * $discountRate;
             $quoteAmount = $store->convertPrice($maximumItemDiscount);
             $baseDiscountAmount = min($baseItemPrice * $qty, $maximumItemDiscount);
             $this->validator->decrementRuleItemTotalsCount($rule->getId());
         }
         $baseDiscountAmount = $store->roundPrice($baseDiscountAmount);
         $cartRules[$rule->getId()] -= $baseDiscountAmount;
         $discountData->setAmount($store->roundPrice(min($itemPrice * $qty, $quoteAmount)));
         $discountData->setBaseAmount($baseDiscountAmount);
         $discountData->setOriginalAmount(min($itemOriginalPrice * $qty, $quoteAmount));
         $discountData->setBaseOriginalAmount($store->roundPrice($baseItemOriginalPrice));
     }
     $address->setCartFixedRules($cartRules);
     return $discountData;
 }
예제 #3
0
파일: BuyXGetY.php 프로젝트: aiesh/magento2
 /**
  * @param \Magento\SalesRule\Model\Rule $rule
  * @param \Magento\Sales\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();
     $itemPrice = $this->validator->getItemPrice($item);
     $baseItemPrice = $this->validator->getItemBasePrice($item);
     $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
     $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
     $x = $rule->getDiscountStep();
     $y = $rule->getDiscountAmount();
     if (!$x || $y > $x) {
         return $discountData;
     }
     $buyAndDiscountQty = $x + $y;
     $fullRuleQtyPeriod = floor($qty / $buyAndDiscountQty);
     $freeQty = $qty - $fullRuleQtyPeriod * $buyAndDiscountQty;
     $discountQty = $fullRuleQtyPeriod * $y;
     if ($freeQty > $x) {
         $discountQty += $freeQty - $x;
     }
     $discountData->setAmount($discountQty * $itemPrice);
     $discountData->setBaseAmount($discountQty * $baseItemPrice);
     $discountData->setOriginalAmount($discountQty * $itemOriginalPrice);
     $discountData->setBaseOriginalAmount($discountQty * $baseItemOriginalPrice);
     return $discountData;
 }
예제 #4
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;
 }
예제 #5
0
 /**
  * @param \Magento\SalesRule\Model\Rule $rule
  * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  * @param float $qty
  * @return Data
  */
 public function calculate($rule, $item, $qty)
 {
     $rulePercent = min(100, $rule->getDiscountAmount());
     $discountData = $this->_calculate($rule, $item, $qty, $rulePercent);
     return $discountData;
 }