Magento tax rounding issue

前端 未结 2 393
别跟我提以往
别跟我提以往 2020-11-29 12:07

I got strange rounding issue for VAT in Magento. My product set up is * product price incl 20% VAT is 183.59

I added 30 items into basket and it would cost 30 * 183

相关标签:
2条回答
  • 2020-11-29 12:45

    Info

    Round price in Magento based on previous rounding operation delta.

    app/code/core/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;
    }
    

    Sometimes this can cause an error due to the high delta calculation error ($this->_calculator->round($price)). For example, for this reason, some prices can vary in the range of ±1 cent.

    Solution

    To avoid this, you need to improve the accuracy of the delta calculation.

    Change

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

    to

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

    Changes need to be made in both files:

    app/code/core/Mage/Tax/Model/Sales/Total/Quote/Tax.php:1392 app/code/core/Mage/Tax/Model/Sales/Total/Quote/Subtotal.php:719

    Don't modify or hack core files! Do a rewrite!

    The solution was tested on different versions of Magento 1.9.x, but maybe this will work in earlier versions.

    P.S.

    Change roundPrice function, as shown below, can solve the rounding error problem, but it can cause others (for example, some platforms require rounding up to 2 decimal places).

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

    public function roundPrice($price)
    {
        return round($price, 4);
    }
    
    0 讨论(0)
  • 2020-11-29 12:51

    In the end I found the solution. I changed System > VAT > Tax Calculation Method Based On from Unit price to Row Total and it works, more details here

    The issue which I found is in core/store model. I had to rewrite roundPrice method and change rounding precision there.

    public function roundPrice($price)
    {
       return round($price, 4);
    }
    
    0 讨论(0)
提交回复
热议问题