123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\SalesRule\Model\Rule\Action\Discount;
- class BuyXGetY extends AbstractDiscount
- {
- /**
- * @param \Magento\SalesRule\Model\Rule $rule
- * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item
- * @param float $qty
- * @return \Magento\SalesRule\Model\Rule\Action\Discount\Data
- */
- public function calculate($rule, $item, $qty)
- {
- /** @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);
- $x = $rule->getDiscountStep();
- $y = $rule->getDiscountAmount();
- if (!$x || $y > $x) {
- return $discountData;
- }
- $buyAndDiscountQty = $x + $y;
- $fullRuleQtyPeriod = floor($qty / $buyAndDiscountQty);
- $freeQty = $qty - $fullRuleQtyPeriod * $buyAndDiscountQty;
- $discountQty = $fullRuleQtyPeriod * $y;
- if ($freeQty > $x) {
- $discountQty += $freeQty - $x;
- }
- $discountData->setAmount($discountQty * $itemPrice);
- $discountData->setBaseAmount($discountQty * $baseItemPrice);
- $discountData->setOriginalAmount($discountQty * $itemOriginalPrice);
- $discountData->setBaseOriginalAmount($discountQty * $baseItemOriginalPrice);
- return $discountData;
- }
- }
|