| Current Path : /home/rtorresani/www/vendor/magento/module-sales-rule/Model/Rule/Action/Discount/ |
| Current File : //home/rtorresani/www/vendor/magento/module-sales-rule/Model/Rule/Action/Discount/BuyXGetY.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\SalesRule\Model\Rule\Action\Discount;
use Magento\Quote\Model\Quote\Item\AbstractItem;
use Magento\SalesRule\Model\Rule;
class BuyXGetY extends AbstractDiscount
{
/**
* Calculate discount data for BuyXGetY action.
*
* @param Rule $rule
* @param AbstractItem $item
* @param float $qty
* @return Data
*/
public function calculate($rule, $item, $qty): Data
{
$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;
}
}