huynguyen_isobar

Untitled

Jan 5th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.72 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Copyright © 2013-2017 Magento, Inc. All rights reserved.
  4.  * See COPYING.txt for license details.
  5.  */
  6. namespace Magento\SalesRule\Model\Rule\Action\Discount;
  7.  
  8. use Magento\Framework\DataObject;
  9.  
  10. class ByPercent extends AbstractDiscount
  11. {
  12.     /**
  13.      * @var DataObject
  14.      */
  15.     protected $totalDiscountAmount;
  16.  
  17.     /**
  18.      * @inheritDoc
  19.      */
  20.     public function __construct(
  21.         \Magento\SalesRule\Model\Validator $validator,
  22.         DataFactory $discountDataFactory,
  23.         \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency,
  24.         DataObject $totalDiscountAmount
  25.     ) {
  26.         parent::__construct($validator, $discountDataFactory, $priceCurrency);
  27.         $this->totalDiscountAmount = $totalDiscountAmount;
  28.     }
  29.  
  30.  
  31.     /**
  32.      * @param \Magento\SalesRule\Model\Rule $rule
  33.      * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  34.      * @param float $qty
  35.      * @return Data
  36.      */
  37.     public function calculate($rule, $item, $qty)
  38.     {
  39.         $rulePercent = min(100, $rule->getDiscountAmount());
  40.         $discountData = $this->_calculate($rule, $item, $qty, $rulePercent);
  41.  
  42.         $totalDiscountAmountForThisRule = $this->totalDiscountAmount->getData($rule->getId) ? : 0;
  43.         $expectedDiscountAmount = $totalDiscountAmountForThisRule + $discountData->getAmount();
  44.         if ($expectedDiscountAmount >= $rule->getMaxDiscountAmount()) {
  45.             $actualDiscountAmount = $expectedDiscountAmount - $rule->getMaxDiscountAmount();
  46.             // Chinh lai discount amount
  47.             $discountData->setAmount();
  48.             $discountData->setBlaBla();
  49.  
  50.             // Chinh lai item percent
  51.             $item->setDiscountPercent();
  52.         }
  53.         $this->discountDiscountAmount->setData(
  54.             $rule->getId(),
  55.             $totalDiscountAmountForThisRule + $discountData->getAmount()
  56.         );
  57.  
  58.  
  59.         return $discountData;
  60.     }
  61.  
  62.     /**
  63.      * @param float $qty
  64.      * @param \Magento\SalesRule\Model\Rule $rule
  65.      * @return float
  66.      */
  67.     public function fixQuantity($qty, $rule)
  68.     {
  69.         $step = $rule->getDiscountStep();
  70.         if ($step) {
  71.             $qty = floor($qty / $step) * $step;
  72.         }
  73.  
  74.         return $qty;
  75.     }
  76.  
  77.     /**
  78.      * @param \Magento\SalesRule\Model\Rule $rule
  79.      * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  80.      * @param float $qty
  81.      * @param float $rulePercent
  82.      * @return Data
  83.      */
  84.     protected function _calculate($rule, $item, $qty, $rulePercent)
  85.     {
  86.         /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */
  87.         $discountData = $this->discountFactory->create();
  88.  
  89.         $itemPrice = $this->validator->getItemPrice($item);
  90.         $baseItemPrice = $this->validator->getItemBasePrice($item);
  91.         $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
  92.         $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
  93.  
  94.         $_rulePct = $rulePercent / 100;
  95.         $discountData->setAmount(($qty * $itemPrice - $item->getDiscountAmount()) * $_rulePct);
  96.         $discountData->setBaseAmount(($qty * $baseItemPrice - $item->getBaseDiscountAmount()) * $_rulePct);
  97.         $discountData->setOriginalAmount(($qty * $itemOriginalPrice - $item->getDiscountAmount()) * $_rulePct);
  98.         $discountData->setBaseOriginalAmount(
  99.             ($qty * $baseItemOriginalPrice - $item->getBaseDiscountAmount()) * $_rulePct
  100.         );
  101.  
  102.         if (!$rule->getDiscountQty() || $rule->getDiscountQty() > $qty) {
  103.             $discountPercent = min(100, $item->getDiscountPercent() + $rulePercent);
  104.             $item->setDiscountPercent($discountPercent);
  105.         }
  106.  
  107.         return $discountData;
  108.     }
  109. }
Add Comment
Please, Sign In to add comment