<?php /** * This file contains package_quiqqer_products_ajax_products_calcNettoPrice */ use QUI\ERP\Tax\TaxEntry; use QUI\ERP\Tax\TaxType; use QUI\ERP\Tax\Utils as TaxUtils; use QUI\System\Log; /** * Calculate the netto price * * @param integer|float $price - Price to calc (brutto price) * @param bool $formatted - output formatted? * @param integer $vat - optional * * @return float */ QUI::$Ajax->registerFunction( 'package_quiqqer_erp_ajax_calcNettoPrice', function ($price, $formatted, $vat) { $price = QUI\ERP\Money\Price::validatePrice($price); if (empty($price)) { if (isset($formatted) && $formatted) { return QUI\ERP\Defaults::getCurrency()->format(0); } return 0; } if (empty($vat) && !is_numeric($vat)) { $Area = QUI\ERP\Defaults::getArea(); try { $TaxType = TaxUtils::getTaxTypeByArea($Area); $TaxEntry = TaxUtils::getTaxEntry($TaxType, $Area); } catch (QUI\Exception $Exception) { Log::addError($Exception->getMessage(), [ 'price' => $price, 'formatted' => $formatted, 'vat' => $vat, 'ajax' => 'package_quiqqer_erp_ajax_calcNettoPrice' ]); if (isset($formatted) && $formatted) { return QUI\ERP\Defaults::getCurrency()->format($price); } return $price; } $vat = $TaxEntry->getValue(); } $vat = ($vat / 100) + 1; $netto = $price / $vat; $netto = round($netto, QUI\ERP\Defaults::getPrecision()); // gegenrechnung $precision = QUI\ERP\Defaults::getPrecision(); $bruttoInput = round($price, $precision); $decimalParts = explode('.', (string)$bruttoInput); $inputPrecision = isset($decimalParts[1]) ? strlen($decimalParts[1]) : 0; $brutto = round($netto, $precision) * $vat; $brutto = round($brutto, $inputPrecision); if ($brutto != $bruttoInput) { $netto = round($netto, $precision); $brutto = round($netto * $vat, $inputPrecision); if ($brutto != $bruttoInput) { for ($i = 0; $i < 10; $i++) { $nettoCheck = (float)substr((string)$netto, 0, -$precision); $bruttoCheck = round($nettoCheck * $vat, $inputPrecision); if ($bruttoCheck == $bruttoInput) { $netto = $nettoCheck; break; } } } } if (isset($formatted) && $formatted) { return QUI\ERP\Defaults::getCurrency()->format($netto); } //$netto = round($netto, QUI\ERP\Defaults::getPrecision()); return $netto; }, ['price', 'formatted', 'vat'] );