currencyContext = $currencyContext; $this->discountUtil = $discountUtil; } public function applyResult(PurchaseState &$purchaseState, OrderDiscount $orderDiscount, array $data) { $this->messages = []; $priceLevel = new \PriceLevel(); $priceLevel->createFromDB($data['price_level']); $totalDiscountPrice = toDecimal(0); foreach ($purchaseState->getProducts() as $purchaseItem) { $product = $purchaseItem->getProduct(); $level = $priceLevel->getDiscount($product->id, null, $product->idProducer, $product); switch ($level['unit']) { case 'perc': $calcPrice = $purchaseItem->getPrice()->getPriceWithVat()->addDiscount($level['discount']); $calcPrice = new Price($calcPrice, $this->currencyContext->getActive(), 0); $discountPrice = $purchaseItem->getPrice()->getPriceWithVat()->sub($calcPrice->getPriceWithVat()); $totalDiscountPrice = $totalDiscountPrice->add($discountPrice); break; case 'price': $discountPrice = new Price(toDecimal($level['discount']), $this->currencyContext->getDefault(), $product->vat); $discountPrice = PriceCalculator::convert($discountPrice, $this->currencyContext->getActive()); $totalDiscountPrice = $totalDiscountPrice->add($discountPrice->getPriceWithVat()); break; } } if (!$totalDiscountPrice->isZero()) { $purchaseState->addDiscount( new DiscountPurchaseItem($orderDiscount->getDisplayName(), $this->discountUtil->createDiscountPrice($totalDiscountPrice), $orderDiscount->getId()) ); if ($message = $data['messages']['success'] ?? '') { $this->messages['success'] = $message; } } else { if ($message = $data['messages']['warning'] ?? '') { $this->messages['warning'] = $message; } } } protected function getVars($vars) { $vars['price_levels'] = sqlQuery('SELECT id, name FROM price_levels')->fetchAll(); return $vars; } }