BuyXGetY.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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 BuyXGetY 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 \Magento\SalesRule\Model\Rule\Action\Discount\Data
  14. */
  15. public function calculate($rule, $item, $qty)
  16. {
  17. /** @var \Magento\SalesRule\Model\Rule\Action\Discount\Data $discountData */
  18. $discountData = $this->discountFactory->create();
  19. $itemPrice = $this->validator->getItemPrice($item);
  20. $baseItemPrice = $this->validator->getItemBasePrice($item);
  21. $itemOriginalPrice = $this->validator->getItemOriginalPrice($item);
  22. $baseItemOriginalPrice = $this->validator->getItemBaseOriginalPrice($item);
  23. $x = $rule->getDiscountStep();
  24. $y = $rule->getDiscountAmount();
  25. if (!$x || $y > $x) {
  26. return $discountData;
  27. }
  28. $buyAndDiscountQty = $x + $y;
  29. $fullRuleQtyPeriod = floor($qty / $buyAndDiscountQty);
  30. $freeQty = $qty - $fullRuleQtyPeriod * $buyAndDiscountQty;
  31. $discountQty = $fullRuleQtyPeriod * $y;
  32. if ($freeQty > $x) {
  33. $discountQty += $freeQty - $x;
  34. }
  35. $discountData->setAmount($discountQty * $itemPrice);
  36. $discountData->setBaseAmount($discountQty * $baseItemPrice);
  37. $discountData->setOriginalAmount($discountQty * $itemOriginalPrice);
  38. $discountData->setBaseOriginalAmount($discountQty * $baseItemOriginalPrice);
  39. return $discountData;
  40. }
  41. }