Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Copyright © 2013-2017 Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\SalesRule\Model\Rule\Action\Discount;
- use Magento\Framework\DataObject;
- class ByPercent extends AbstractDiscount
- {
- /**
- * @var DataObject
- */
- protected $totalDiscountAmount;
- /**
- * @inheritDoc
- */
- public function __construct(
- \Magento\SalesRule\Model\Validator $validator,
- DataFactory $discountDataFactory,
- \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency,
- DataObject $totalDiscountAmount
- ) {
- parent::__construct($validator, $discountDataFactory, $priceCurrency);
- $this->totalDiscountAmount = $totalDiscountAmount;
- }
- /**
- * @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);
- $totalDiscountAmountForThisRule = $this->totalDiscountAmount->getData($rule->getId) ? : 0;
- $expectedDiscountAmount = $totalDiscountAmountForThisRule + $discountData->getAmount();
- if ($expectedDiscountAmount >= $rule->getMaxDiscountAmount()) {
- $actualDiscountAmount = $expectedDiscountAmount - $rule->getMaxDiscountAmount();
- // Chinh lai discount amount
- $discountData->setAmount();
- $discountData->setBlaBla();
- // Chinh lai item percent
- $item->setDiscountPercent();
- }
- $this->discountDiscountAmount->setData(
- $rule->getId(),
- $totalDiscountAmountForThisRule + $discountData->getAmount()
- );
- return $discountData;
- }
- /**
- * @param float $qty
- * @param \Magento\SalesRule\Model\Rule $rule
- * @return float
- */
- public function fixQuantity($qty, $rule)
- {
- $step = $rule->getDiscountStep();
- if ($step) {
- $qty = floor($qty / $step) * $step;
- }
- return $qty;
- }
- /**
- * @param \Magento\SalesRule\Model\Rule $rule
- * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
- * @param float $qty
- * @param float $rulePercent
- * @return Data
- */
- protected function _calculate($rule, $item, $qty, $rulePercent)
- {
- /** @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);
- $_rulePct = $rulePercent / 100;
- $discountData->setAmount(($qty * $itemPrice - $item->getDiscountAmount()) * $_rulePct);
- $discountData->setBaseAmount(($qty * $baseItemPrice - $item->getBaseDiscountAmount()) * $_rulePct);
- $discountData->setOriginalAmount(($qty * $itemOriginalPrice - $item->getDiscountAmount()) * $_rulePct);
- $discountData->setBaseOriginalAmount(
- ($qty * $baseItemOriginalPrice - $item->getBaseDiscountAmount()) * $_rulePct
- );
- if (!$rule->getDiscountQty() || $rule->getDiscountQty() > $qty) {
- $discountPercent = min(100, $item->getDiscountPercent() + $rulePercent);
- $item->setDiscountPercent($discountPercent);
- }
- return $discountData;
- }
- }
Add Comment
Please, Sign In to add comment