107 lines
4.4 KiB
PHP
107 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace KupShop\OrderDiscountBundle\Actions;
|
|
|
|
use KupShop\AdminBundle\Admin\ProductsFilter;
|
|
use KupShop\KupShopBundle\Context\CurrencyContext;
|
|
use KupShop\OrderDiscountBundle\Entity\OrderDiscount;
|
|
use KupShop\OrderDiscountBundle\Util\DiscountUtil;
|
|
use KupShop\OrderingBundle\Entity\Purchase\DiscountPurchaseItem;
|
|
use KupShop\OrderingBundle\Entity\Purchase\PurchaseState;
|
|
use KupShop\OrderingBundle\Util\Purchase\PurchaseUtil;
|
|
|
|
class ProductDiscountAction extends AbstractAction
|
|
{
|
|
protected static $type = 'product_discount';
|
|
protected static $position = 30;
|
|
protected $adminTemplate = 'actions/product_discount.tpl';
|
|
|
|
private $purchaseUtil;
|
|
private $discountUtil;
|
|
private $currencyContext;
|
|
|
|
public function __construct(PurchaseUtil $purchaseUtil, DiscountUtil $discountUtil, CurrencyContext $currencyContext)
|
|
{
|
|
$this->purchaseUtil = $purchaseUtil;
|
|
$this->discountUtil = $discountUtil;
|
|
$this->currencyContext = $currencyContext;
|
|
}
|
|
|
|
public function applyResult(PurchaseState &$purchaseState, OrderDiscount $orderDiscount, array $data)
|
|
{
|
|
$items = $this->purchaseUtil->getProductsApplicableByProductsFilter($purchaseState, $data['filter']);
|
|
|
|
if (!empty($items)) {
|
|
$data['id'] = $orderDiscount->getId();
|
|
$discountName = $orderDiscount->getDisplayName();
|
|
$note = $this->createItemNote($data, $discountName);
|
|
|
|
$min_discount = toDecimal(0);
|
|
if (($data['unit'] == 'perc') && ('N' == ($data['combine'] ?? 'Y'))) {
|
|
// u slevy je nastaveno: NEsčítat se slevou u produktu => uplatní se pouze vyšší sleva, minimalne % z teto slevy
|
|
$min_discount = toDecimal($data['discount']);
|
|
}
|
|
|
|
$vatId = $data['vat'] ?? null;
|
|
$forceVatValue = null;
|
|
|
|
if ($this->getDivideDiscountPrice($data)) {
|
|
$discountPrice = $this->discountUtil->divideDiscountPrice($items, $data, $discountName, $min_discount);
|
|
} else {
|
|
if ($data['unit'] == 'perc') {
|
|
$totalDiscountPrice = toDecimal(0);
|
|
foreach ($items as $purchaseItem) {
|
|
if (!$min_discount->isZero()) {
|
|
// u slevy je nastaveno NEsčítat se slevou u produktu => uplatní se pouze vyšší sleva
|
|
$discountPerPiece = $this->discountUtil->getDiscountPerPiece($purchaseItem, $data, $min_discount);
|
|
if (is_null($discountPerPiece)) {
|
|
continue;
|
|
}
|
|
$discountPrice = $discountPerPiece->mul(toDecimal($purchaseItem->getPieces()));
|
|
} else {
|
|
$discountPrice = $this->discountUtil->calculateDiscountPrice($purchaseItem->getPrice()->getPriceWithVat(false), $data);
|
|
}
|
|
$totalDiscountPrice = $totalDiscountPrice->add($discountPrice);
|
|
}
|
|
$discountPrice = $totalDiscountPrice;
|
|
} else {
|
|
$discountPrice = $this->discountUtil->calculateDiscountPrice(\DecimalConstants::zero(), $data, $discountName);
|
|
}
|
|
|
|
if (is_null($vatId)) {
|
|
// uplatnit sazbu DPH podle produktů v objednávce
|
|
$forceVatValue = $purchaseState->getDeliveryVat();
|
|
}
|
|
}
|
|
|
|
$discountPurchaseItem = new DiscountPurchaseItem($discountName,
|
|
$this->discountUtil->createDiscountPrice($discountPrice, $vatId, $forceVatValue), $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;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected function getVars($vars): array
|
|
{
|
|
$vars = parent::getVars($vars);
|
|
|
|
$vars['vats'] = \KupShop\KupShopBundle\Context\VatContext::getAdminVats();
|
|
|
|
return $vars;
|
|
}
|
|
|
|
public function handleData($data)
|
|
{
|
|
$data = parent::handleData($data);
|
|
$data['filter'] = ProductsFilter::cleanFilter($data['filter'] ?? []);
|
|
|
|
return $data;
|
|
}
|
|
}
|