Files
kupshop/bundles/KupShop/OrderDiscountBundle/Actions/NthProductAction.php
2025-08-02 16:30:27 +02:00

109 lines
4.0 KiB
PHP

<?php
namespace KupShop\OrderDiscountBundle\Actions;
use KupShop\KupShopBundle\Context\CurrencyContext;
use KupShop\KupShopBundle\Util\Contexts;
use KupShop\OrderDiscountBundle\Entity\OrderDiscount;
use KupShop\OrderingBundle\Entity\Purchase\DiscountPurchaseItem;
use KupShop\OrderingBundle\Entity\Purchase\PurchaseState;
class NthProductAction extends CheapestProductAction
{
protected static $type = 'nth_product_discount';
protected static $position = 36;
protected $adminTemplate = 'actions/nth_product_discount.tpl';
public function applyResult(PurchaseState &$purchaseState, OrderDiscount $orderDiscount, array $data)
{
$items = $this->purchaseUtil->getProductsApplicableByProductsFilter($purchaseState, $data['filter']);
if (empty($items)) {
return;
}
$n = $data['n'];
$total_count = ($data['total_count'] ?? false);
if ($total_count == 'Y') {
$totalPieces = 0;
foreach ($items as $purchaseItem) {
$totalPieces += $purchaseItem->getPieces();
}
if ($totalPieces < $n) {
$items = [];
}
} else {
foreach ($items as $key => $purchaseItem) {
if ($purchaseItem->getPieces() < $n) {
unset($items[$key]);
}
}
}
if (!empty($items)) {
$data['id'] = $orderDiscount->getId();
$discountName = $orderDiscount->getDisplayName();
$note = $this->createItemNote($data, $discountName);
$divideDiscountPrice = $this->getDivideDiscountPrice($data);
$discount_items = $items;
$totalDiscountPrice = toDecimal(0);
if ($total_count == 'Y') {
$items = $this->sortByProductPrice($items);
$m = intdiv($totalPieces, $n);
while ($m > 0) {
$cheapest = array_shift($items);
$pieces = $cheapest->getPieces();
if ($pieces <= $m) {
$m -= $pieces;
} else {
$pieces = $m;
$m = 0;
}
$discountPrice = $this->discountUtil->calculateDiscountPrice($this->getProductPrice($cheapest)->mul(toDecimal($pieces)), $data);
if ($discountPrice) {
$totalDiscountPrice = $totalDiscountPrice->add($discountPrice);
}
}
} else {
foreach ($items as $purchaseItem) {
$pieces = $purchaseItem->getPieces();
$pieces = intdiv($pieces, $n);
$discountPrice = $this->discountUtil->calculateDiscountPrice($this->getProductPrice($purchaseItem)->mul(toDecimal($pieces)), $data);
if ($discountPrice) {
$totalDiscountPrice = $totalDiscountPrice->add($discountPrice);
}
}
}
if ($divideDiscountPrice) {
$data['unit'] = Contexts::get(CurrencyContext::class)->getActiveId();
$data['discount'] = $totalDiscountPrice;
$totalDiscountPrice = $this->discountUtil->divideDiscountPrice($discount_items, $data, $discountName);
}
if (!$totalDiscountPrice->isZero()) {
$discountPurchaseItem = new DiscountPurchaseItem(
$discountName,
$this->discountUtil->createDiscountPrice($totalDiscountPrice),
$orderDiscount->getId(),
$note
);
$purchaseState->addDiscount($discountPurchaseItem);
if ($message = $data['messages']['success'] ?? '') {
$this->messages['success'] = $message;
}
}
} else {
if ($message = $data['messages']['warning'] ?? '') {
$this->messages['warning'] = $message;
}
}
}
}