Newer
Older
<?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)) {

Henning Leutz
committed
$Area = QUI\ERP\Defaults::getArea();
try {
$TaxType = TaxUtils::getTaxTypeByArea($Area);
$TaxEntry = TaxUtils::getTaxEntry($TaxType, $Area);

Henning Leutz
committed
} catch (QUI\Exception $Exception) {
Log::addError($Exception->getMessage(), [
'price' => $price,
'formatted' => $formatted,
'vat' => $vat,
'ajax' => 'package_quiqqer_erp_ajax_calcNettoPrice'
]);

Henning Leutz
committed
if (isset($formatted) && $formatted) {
return QUI\ERP\Defaults::getCurrency()->format($price);
}
return $price;
}
$vat = $TaxEntry->getValue();
}
$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;
}
}
}
}
return QUI\ERP\Defaults::getCurrency()->format($netto);
//$netto = round($netto, QUI\ERP\Defaults::getPrecision());