我创建了一个自定义订单总额,在某些情况下会提供折扣。总计总是正确的,但是销售税计算在计算时没有考虑我的折扣(因此,如果我提供 10 美元的折扣,则销售税金额是根据折扣前的全部金额计算的)。
以下面为例:
Subtotal: $856.49
Multi Unit Discounts: -$22.50
Shipping: $10.96
Tax: $52.05
Grand Total: $897.00
我的自定义折扣是多单位折扣。税率为6%。正如您所看到的,基于所有行项目的总计是正确的,但税额本身不正确(它基于除我的折扣之外的所有行项目)。
在我的 config.xml 文件中,我有以下内容可以让我的订单总数在系统中工作:
<sales>
<quote>
<totals>
<mud>
<class>Wpe_Multiunitdiscount_Model_Multiunitdiscount</class>
<before>tax</before>
</mud>
</totals>
</quote>
</sales>
以下是我的订单总课内容:
class Wpe_Multiunitdiscount_Model_Multiunitdiscount extends Mage_Sales_Model_Quote_Address_Total_Abstract {
public function collect(Mage_Sales_Model_Quote_Address $address) {
if ($address->getData('address_type')=='billing') return $this;
$items = $address->getAllItems();
$total_discount = 0;
foreach($items as $item) {
$product_discounts = Mage::helper("multiunitdiscount")->findDiscounts($item);
if($product_discounts > 0) {
$total_discount += $product_discounts;
}
}
$address->setMudAmount($total_discount);
$address->setGrandTotal($address->getGrandTotal() - $address->getMudAmount() );
$address->setBaseGrandTotal($address->getBaseGrandTotal() - $address->getMudAmount());
return $this;
}
public function fetch(Mage_Sales_Model_Quote_Address $address) {
if ($address->getData('address_type')=='billing') return $this;
if($address->getMudAmount() > 0) {
$address->addTotal(array(
'code' => $this->getCode(),
'title' => Mage::helper('sales')->__('Multi Unit Discounts'),
'value' => -$address->getMudAmount(),
));
}
return $this;
}
}
为了不在这里发布大量我不确定是否有必要的代码,我可以告诉您,上面代码中的帮助程序只是返回报价中该特定项目的折扣金额。
有人可以帮助我指出正确的方向以正确计算销售税吗?
EDIT:
为了保持简单,我删除了计算折扣背后的许多逻辑,现在尝试简单地从订单总额中扣除 10 美元作为折扣。正如建议的那样,我没有修改地址的总计,现在只设置折扣金额和基本折扣金额。现在销售税没有加起来,总计也关闭了。也许如果有人可以指点我一个好的教程会有帮助吗?我似乎不明白订单总数是如何相互作用的。
public function collect(Mage_Sales_Model_Quote_Address $address) {
if ($address->getData('address_type')=='billing') return $this;
$address->setMudDiscount(10);
$address->setDiscountAmount($address->getDiscountAmount() + $address->getMudDiscount());
$address->setBaseDiscountAmount($address->getBaseDiscountAmount() + $address->getMudDiscount());
return $this;
}
public function fetch(Mage_Sales_Model_Quote_Address $address) {
if ($address->getData('address_type')=='billing') return $this;
$address->addTotal(array(
'code' => $this->getCode(),
'title' => Mage::helper('sales')->__('Multi Unit Discounts'),
'value' => -$address->getMudDiscount(),
));
return $this;
}