Magento& Paypal税收四舍五入问题

时间:2012-08-08 16:29:07

标签: magento paypal rounding

我对Paypal和Magento 1.7.0.2有一些舍入问题 - 网站上的所有价格都含税,税率为20%(增值税)。

我会去结帐,一切都是正确的:

enter image description here

然后我会点击下订单,而Paypal就是这样,这是不正确的,因为总计现在少了1便士。这似乎是税收四舍五入的原因。

enter image description here

在某些情况下,它运作正常,但在其他情况下,税收不正确。我尝试在app / code / core / Mage / Tax / Model / Calculation.php中更改税收计算方法 calcTaxAmount()

我将此添加到calcTaxAmount方法中,似乎解决了这个问题,但它会导致产品页面上的价格不正确(少1个小时)。

$amount = $this->roundUp($amount);

我很确定这是一个错误,但我没有想法。如果有人之前遇到过这个并且有解决方案,我会很高兴听到它。任何帮助非常感谢。

编辑:以下是我在Magento中的税务设置

enter image description here

6 个答案:

答案 0 :(得分:2)

我认为我已经找到了解决这个问题的解决方案。

如果您的价格包含税,则税收计算错误。

这是修复 - 在Mage_Tax_Model_Calculation :: calcTaxAmount()中:

改变条件:

if ($priceIncludeTax)...

为:

if ( ! $priceIncludeTax ) ...

所以条件如下:

if ( ! $priceIncludeTax ) { 
    $amount = $price*(1-1/(1+$taxRate)); 
} else { 
    $amount = $price*$taxRate; 
}

有关详细信息,请查看我的评论:http://www.magentocommerce.com/boards/viewthread/247201/P45/

请记住不要修改核心文件 - 在本地创建副本

答案 1 :(得分:2)

我今天为我的客户“修复”了这个,但对解决方案并不满意。但它确实有效。

最好将此文件复制到本地文件夹: 应用程序/代码/核心/法师/贝宝/型号/原料药/ Nvp.php

我在第606行添加了此代码(仅用于快速结账),因此它看起来像这样。

$request['SHIPPINGAMT'] = ($request['AMT'] - ($request['TAXAMT'] + $request['ITEMAMT']));

$response = $this->call(self::SET_EXPRESS_CHECKOUT, $request);
$this->_importFromResponse($this->_setExpressCheckoutResponse, $response);

你需要在后端转换paypal moule中的转移购物车行项目

如果有人知道更好的解决方案,那么只需覆盖运费即可让我知道

答案 2 :(得分:1)

这个问题一直困扰着我(并且看起来像magento社区已经很久了),感谢ShopWorks向正确的方向推进(包括他的代码片段,感谢伙伴!但是如果回到来自快速结账的购物车,添加了一个检查以防止这个。)$ request参数我提出了以下修复(/ hack):

在Nvp.php的第606行,放置以下内容:

$totalValue = $request['TAXAMT'] + $request['ITEMAMT'];
$finalValue = $totalValue - $request['AMT'];

if($request['SHIPPINGAMT'] > 0) {
    $request['SHIPPINGAMT'] = ($request['AMT'] - ($request['TAXAMT'] + $request['ITEMAMT']));
    $totalValue = $request['TAXAMT'] + $request['ITEMAMT'] + $request['SHIPPINGAMT'];
    $finalValue = $totalValue - $request['AMT'];
}

if($request['AMT'] != $totalValue) {
    if($totalValue > $request['AMT']) {
        $request['TAXAMT'] = $request['TAXAMT'] - $finalValue;
    } elseif($totalValue < $request['AMT']) {
        $request['TAXAMT'] = $request['TAXAMT'] + $finalValue;
    } else {
        $request['AMT'] = $request['TAXAMT'] + $request['ITEMAMT'];
    }
}

此外,还需要在call()函数中放置以下内容(Nvp.php的第938行):

$totalValue = $request['TAXAMT'] + $request['ITEMAMT'] + $request['SHIPPINGAMT'];
$finalValue = $totalValue - $request['AMT'];

if($request['AMT'] != $totalValue) {
    if($totalValue > $request['AMT']) {
        if($finalValue > 0) {
            // its preferable that we change the tax amount over the grand total amount
            $request['TAXAMT'] = $request['TAXAMT'] - $finalValue;
        } else {
            $request['AMT'] = $totalValue;
        }
    } elseif($totalValue < $request['AMT']) {
        if($finalValue > 0) {
            // its preferable that we change the tax amount over the grand total amount
            $request['TAXAMT'] = $request['TAXAMT'] + $finalValue;
        } else {
            $request['AMT'] = $totalValue;
        }
    } else {
        $request['AMT'] = $totalValue;
    }
}

这是一个黑客,并将其视为这样。我的同事目前正在对其进行测试,但目前似乎还行,按单价设置税收计算方法也很有帮助(我们的会计师对此安排感到满意,但这是针对英国的,我不确定是否其他国家会对这种特定的税收计算方法不满意。)

我操作$ request ['AMT']的原因是因为偶尔计算$ finalValue变量会产生-0.9999重复整数,这对任何人都没用,我的数学很糟糕,所以如果有人想改进的话在此,请这样做!

一如既往不要覆盖核心目录中的nvp.php,创建一个单独的重写模块或在app / local / mage中执行此操作。第一个选择最好! : - )

答案 3 :(得分:1)

有一个&#34; bug&#34;在magento模块中的Paypal(至少在我的Magento 1.8.0上); 它位于Mage_Paypal_Model_Cart类。

要验证金额是否正确,第381行的方法_validate()汇总订单中的所有商品价格,添加运费和税金,并将结果与​​订单总价值进行比较(来自订购方法getBaseGrandTotal()

但有时,金额之间有0.009999999999999999的差异(它必须来自不同的舍入方法,我不知道);所以这些项目无效,第146行的方法getItems()返回false。

在我的情况下,这导致客户支付不同金额和欺诈怀疑&#34;在他们的订单上标记。

我通过改变比较方法(第404行)来修复它:

if (sprintf('%.4F', $sum) == sprintf('%.4F', $referenceAmount)) {
    $this->_areItemsValid = true;
}

$diff = abs(sprintf('%.4F', $sum) - sprintf('%.4F', $referenceAmount));

if ($diff < 0.01) {
     $this->_areItemsValid = true;
}

我仍然希望将来不会有超过0.009999999的差异......

希望这有帮助。

答案 4 :(得分:0)

我使用CE1.7.0.2并且已经坚持这个问题好几天,尝试了几个解决方案,最后登陆了Adam Hall的修复/黑客。理想对我来说是合理的,所以我在我的网站上应用它,一切顺利到今天早上,我意识到税额调整对我们的情况不起作用。

我们在加利福尼亚州并在全州销售商品,加州的客户将被征收销售税,而其他人则不会。因此,当税额为零并且必须减去差额时,它将产生负税额,显然将被paypal拒绝。因此,当从税额减去差额时,我添加了一个条件语句

if ($request['TAXAMT'] > 0) {
    $request['TAXAMT'] = $request['TAXAMT'] - $finalValue;
} else {
    $request['SHIPPINGAMT'] = $request['SHIPPINGAMT'] - $finalValue;
}

如果税额为零,我将调整运费金额而不是税额。 (当然,如果税收和运费都是免费的,这将无效,但我认为这不会在实际业务中发生。)希望这可以帮助那些与我们有同样问题的人。

答案 5 :(得分:-1)

我刚刚将转运购物车订单项更改为“否”,没有上述代码更改..并且它有效。

Magento 1.9.0.1

仅供参考 - 测试它是否适合您。

德米特罗