这个问题一直困扰着我(从外观上看,magento 社区已经很久了),这要归功于 ShopWorks 朝着正确的方向推进(包括他的代码片段,谢谢队友!但是,如果从 express 回到购物车,它会出错结帐,添加了一个签入以防止这种情况发生。)$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;
}
}
这是一个 hack,并这样对待它。我的同事目前正在测试,但目前似乎还可以,按单价设置计税方法也很有帮助(我们的会计师对这种安排很满意,但这是针对英国的,我不确定是否其他国家会不赞成这种特定的税收计算方法)。
我操作 $request['AMT'] 的原因是因为有时 $finalValue 变量的计算会产生一个 -0.9999 重复整数,这对任何人都没有用,我的数学很烂,所以如果有人想改进这个,请这样做!
一如既往不要覆盖核心目录中的 nvp.php,创建一个单独的重写模块或在 app/local/mage 中执行此操作。首选首选!:-)