Ошибка округления налогов Magento

У меня возникла странная проблема с округлением НДС в Magento. Моя настройка продукта * цена продукта, включая 20% НДС, составляет 183,59

Я добавил в корзину 30 товаров, и это будет стоить 30 * 183,59 = 5507,70. Я вижу это значение в корзине/кассе, так что все в порядке. Если у меня в корзине всего 1 товар, то все в порядке.

Также окончательный НДС будет 5507,70 * 20/120 = 917,95, но я получаю 918,00

У вас есть идеи, как это исправить или где я могу посмотреть? Заранее спасибо.


person Jaro    schedule 23.11.2012    source источник


Ответы (2)


В конце концов я нашел решение. Я изменил «Система» > «НДС» > «Метод расчета налога на основе» с «Цена за единицу» на «Итог по строке», и он работает, подробнее здесь

Проблема, которую я обнаружил, связана с моделью core/store. Пришлось переписать метод roundPrice и изменить там точность округления.

public function roundPrice($price)
{
   return round($price, 4);
}
person Jaro    schedule 23.11.2012
comment
Перезапись определенно НЕ является подходящим решением! Хорошо для вас, это сработало, но это приводит к проблемам с оплатой PayPal (действительные заказы возвращаются с пометкой о подозрении на мошенничество). Будьте осторожны при использовании этой перезаписи! - person simonthesorcerer; 22.06.2013
comment
Да, я согласен. Измененное округление решило нашу проблему в одном месте, но сломало ее в другом месте. Я думаю, что в принципе невозможно найти решение, которое идеально работает во всех сценариях. - person Jaro; 24.06.2013
comment
Наконец-то мне удалось обойти некоторые проблемы с записью в официальной базе знаний: magentocommerce.com/knowledge-base/entry/ - person simonthesorcerer; 24.06.2013
comment
Точность 4 фиксирует промежуточные итоги в корзине, но при определенных обстоятельствах искажает расчет нетто/налога (нетто + налог = ожидаемая сумма + 0,01). Это также приводит к ошибкам PayPal, потому что API жалуется на неправильные значения: 'ITEMAMT' + 'TAXAMT' != 'AMT'. - person Paul Voss; 10.09.2013
comment
Эта проблема устранена в версии 1.13.1 Magento EE magentocommerce.com/knowledge-base/entry/ - person Thanu; 06.03.2014

Информация

Цена округления в Magento на основе дельты предыдущей операции округления.

приложение/код/ядро/Mage/Tax/Model/Sales/Total/Quote/Tax.php:1392 app/code/core/Mage/Tax/Model /Sales/Total/Quote/Subtotal.php:719

protected function _deltaRound($price, $rate, $direction, $type = 'regular')
{
    if ($price) {
        $rate = (string)$rate;
        $type = $type . $direction;
        // initialize the delta to a small number to avoid non-deterministic behavior with rounding of 0.5
        $delta = isset($this->_roundingDeltas[$type][$rate]) ? $this->_roundingDeltas[$type][$rate] : 0.000001;
        $price += $delta;
        $this->_roundingDeltas[$type][$rate] = $price - $this->_calculator->round($price);
        $price = $this->_calculator->round($price);
    }
    return $price;
}

Иногда это может вызвать ошибку из-за высокой ошибки вычисления дельты ($this->_calculator->round($price)). Например, по этой причине некоторые цены могут варьироваться в диапазоне ±1 цент.

Решение

Чтобы этого избежать, нужно повысить точность расчета дельты.

Изменять

$this->_roundingDeltas[$type][$rate] = $price - $this->_calculator->round($price);

to

$this->_roundingDeltas[$type][$rate] = $price - round($price, 4);

Изменения необходимо внести в оба файла:

приложение/код/ядро/Mage/Tax/Model/Sales/Total/Quote/Tax.php:1392 app/code/core/Mage/Tax/Model /Sales/Total/Quote/Subtotal.php:719

Не изменяйте и не взламывайте файлы ядра! Перепишите!

Решение тестировалось на разных версиях Magento 1.9.x, но, возможно, оно будет работать и в более ранних версиях.

P.S.

Изменение функции roundPrice, как показано ниже, может решить проблему ошибки округления, но может вызвать и другие (например, некоторые платформы требуют округления до 2 знаков после запятой).

app/ code/core/Mage/Core/Model/Store.php:995

public function roundPrice($price)
{
    return round($price, 4);
}
person Victor S.    schedule 30.01.2018