Magento 马根托;Paypal税收四舍五入问题

Magento 马根托;Paypal税收四舍五入问题,magento,paypal,rounding,Magento,Paypal,Rounding,我对Paypal和Magento 1.7.0.2有一些舍入问题-网站上的所有价格都包括税,税计算为20%(增值税) 我将去结帐,一切正常: 然后我会点击下订单,Paypal会像这样,这是不正确的,因为总数现在少了1便士。这似乎是由于税收的四舍五入造成的 在某些情况下,它可以正常工作,但在其他情况下,税收四舍五入错误。我已尝试在app/code/core/Mage/tax/Model/calculation.php中更改税务计算方法calcTaxAmount() 我将此添加到calcTaxAm

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

我将去结帐,一切正常:

然后我会点击下订单,Paypal会像这样,这是不正确的,因为总数现在少了1便士。这似乎是由于税收的四舍五入造成的

在某些情况下,它可以正常工作,但在其他情况下,税收四舍五入错误。我已尝试在app/code/core/Mage/tax/Model/calculation.php中更改税务计算方法calcTaxAmount()

我将此添加到calcTaxAmount方法中,该方法似乎可以解决此问题,但它会导致产品页面上的价格不正确(少1便士)

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

我很确定这是一个错误,但我没有主意。如果有人以前遇到过这个问题,并且有了解决方案,我很乐意听到。非常感谢您的帮助

编辑:这里是我在Magento中的税务设置


我想我已经找到了解决这个困扰社区的问题的办法

如果你的价格含税,那么税收计算是错误的

以下是修复中的Mage_Tax_Model_计算::calcTaxAmount():

更改条件:

if ($priceIncludeTax)...
致:

所以情况看起来像:

if ( ! $priceIncludeTax ) { 
    $amount = $price*(1-1/(1+$taxRate)); 
} else { 
    $amount = $price*$taxRate; 
}
有关详细信息,请查看我的评论:

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

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

最好将此文件复制到本地文件夹: app/code/core/Mage/Paypal/Model/Api/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中打开转移购物车行项目


如果有人知道一个更好的解决方案,那么只需覆盖发货成本,让我知道这个问题一直困扰着我(从magento社区的角度来看,这个问题已经困扰了很久),这要感谢ShopWorks朝着正确的方向努力(包括他的代码片段,谢谢你,伙计!但是如果从express checkout返回购物车,它会出错,添加了一个签入以防止出现这种情况。)对于$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'];
    }
}
$totalValue=$request['taxant']+$request['itemant'];
$finalValue=$totalValue-$request['AMT'];
如果($request['SHIPPINGAMT']>0){
$request['SHIPPINGAMT']=($request['AMT']-($request['taxant']+$request['itemant']);
$totalValue=$request['TAXAMT']+$request['ITEMAMT']+$request['SHIPPINGAMT'];
$finalValue=$totalValue-$request['AMT'];
}
如果($request['AMT']!=$totalValue){
如果($totalValue>$request['AMT'])){
$request['taxant']=$request['taxant']-$finalValue;
}elseif($totalValue<$request['AMT'])){
$request['taxant']=$request['taxant']+$finalValue;
}否则{
$request['AMT']=$request['taxant']+$request['itemant'];
}
}
此外,还需要在call()函数中放置以下内容(Nvp.php的第938行):

$totalValue=$request['taxant']+$request['itemant']+$request['SHIPPINGAMT'];
$finalValue=$totalValue-$request['AMT'];
如果($request['AMT']!=$totalValue){
如果($totalValue>$request['AMT'])){
如果($finalValue>0){
//我们最好把税额改成总额
$request['taxant']=$request['taxant']-$finalValue;
}否则{
$request['AMT']=$totalValue;
}
}elseif($totalValue<$request['AMT'])){
如果($finalValue>0){
//我们最好把税额改成总额
$request['taxant']=$request['taxant']+$finalValue;
}否则{
$request['AMT']=$totalValue;
}
}否则{
$request['AMT']=$totalValue;
}
}
我的同事目前正在测试它,但目前看来还可以,按单价设置税收计算方法也很有帮助(我们的会计师对这种安排很满意,但这是针对英国的,我不确定其他国家是否会反对这种特定的税收计算方法)

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

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

在magento模块中的Paypal上有一个“bug”(至少在我的magento 1.8.0上); 它位于
Mage\u Paypal\u Model\u Cart
类中

为了验证金额是否正确,第381行的方法
\u validate()
汇总订单中的所有项目价格,添加运费和税费,并将结果与订单总值进行比较(从订单方法
getBaseGrandTotal()
获得)

但有时,金额之间的差异为0.009999999999999(我不知道,一定是不同的取整方法造成的);因此项目无效,第146行的方法
getItems()
返回false

在我的案例中,这导致客户支付不同的金额,并在订单上显示“欺诈嫌疑”标志

我通过将比较方法(第404行)更改为:

$diff=abs(sprintf('.4F',$sum)-sprintf('.4F',$referenceAmount));
如果($diff<0.01){
$this->\u areItemsValid=true;
}
我仍然希望将来不会有超过0.00999999的差异

希望这有帮助。

我刚换了c
$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'];
    }
}
$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;
    }
}
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;
}
if ($request['TAXAMT'] > 0) {
    $request['TAXAMT'] = $request['TAXAMT'] - $finalValue;
} else {
    $request['SHIPPINGAMT'] = $request['SHIPPINGAMT'] - $finalValue;
}