ByPercent.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\SalesRule\Model\Rule\Action\Discount;
  7. class ByPercent extends AbstractDiscount
  8. {
  9. /**
  10. * @param \Magento\SalesRule\Model\Rule $rule
  11. * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  12. * @param float $qty
  13. * @return Data
  14. */
  15. public function calculate($rule, $item, $qty)
  16. {
  17. $rulePercent = min(100, $rule->getDiscountAmount());
  18. $discountData = $this->_calculate($rule, $item, $qty, $rulePercent);
  19. return $discountData;
  20. }
  21. /**
  22. * @param float $qty
  23. * @param \Magento\SalesRule\Model\Rule $rule
  24. * @return float
  25. */
  26. public function fixQuantity($qty, $rule)
  27. {
  28. $step = $rule->getDiscountStep();
  29. if ($step) {
  30. $qty = floor($qty / $step) * $step;
  31. }
  32. return $qty;
  33. }
  34. /**
  35. * @param \Magento\SalesRule\Model\Rule $rule
  36. * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
  37. * @param float $qty
  38. * @param float $rulePercent
  39. * @return Data
  40. */
  41. protected function _calculate($rule, $item, $qty, $rulePercent)
  42. {
  43. /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */
  44. $discountData = $this->discountFactory->create();
  45. $itemPrice = $this->validator->getItemPrice($item);
  46. $baseItemPrice = $this->validator->getItemBasePrice($item);
  47. $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
  48. $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
  49. $_rulePct = $rulePercent / 100;
  50. $discountData->setAmount(($qty * $itemPrice - $item->getDiscountAmount()) * $_rulePct);
  51. $discountData->setBaseAmount(($qty * $baseItemPrice - $item->getBaseDiscountAmount()) * $_rulePct);
  52. $discountData->setOriginalAmount(($qty * $itemOriginalPrice - $item->getDiscountAmount()) * $_rulePct);
  53. $discountData->setBaseOriginalAmount(
  54. ($qty * $baseItemOriginalPrice - $item->getBaseDiscountAmount()) * $_rulePct
  55. );
  56. if (!$rule->getDiscountQty() || $rule->getDiscountQty() > $qty) {
  57. $discountPercent = min(100, $item->getDiscountPercent() + $rulePercent);
  58. $item->setDiscountPercent($discountPercent);
  59. }
  60. return $discountData;
  61. }
  62. }