1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\SalesRule\Model\Rule\Action\Discount;
- class ByPercent extends AbstractDiscount
- {
- /**
- * @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;
- }
- /**
- * @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;
- }
- }
|