2011-09-22 137 views
16

我已经创建了自定义订单总额,该折扣在特定情况下会给予折扣。总计总是正确的,但是销售税计算在计算时没有考虑到我的折扣(因此,如果我给予10美元的折扣,销售税额是在我的折扣之前的全部数额上计算的)。在Magento中添加自定义折扣订单总额不会更改销售税

举个例子如下:

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; 
} 

}

为了不在这里发布大量的代码,我不确定是否有必要,我可以告诉你,在上述代码中的助手只是返回迪斯科舞厅的钱数不适用于引用中的特定项目。

有人可以帮助我指出正确的方向让销售税计算正确吗?

编辑:

为了保持这个简单,我已删除了很多背后计算折扣我的逻辑,我现在想简单采取$ 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; 
} 
+0

嗯,你为什么在你折扣类别修改$地址grandtotal直接?你应该使用'$ address-> setDiscountAmount($ address-> getDiscountAmount()+ $ total_discount)'(或使用'item-> setDiscountAmount()'设置每件商品的折扣),你的折扣将用于'Mage_Sales_Model_Quote_Address_Total_Tax: :collect()'用于计算税额。 – Zyava

+0

据我所知,你不能自己修改总计。您必须自己设置折扣价格(如您已经这样做),并且Magento会在计算总计时考虑到这一点。尝试修改config.xml并让它也运行小计。在我真正理解Magento处理总计算的方式之前,我花了一些时间。 – Kenny

+0

因此,我尝试了你们两个人的说法,并且我遇到了同样的问题(由于我不应该自己修改总计,所以现在总计的总数已经减少了)。我的想法是修改其他总模块中的总数。我在折扣模块中看到,我可以设置subtotalWithDiscount和subtotalWithoutDiscount,所以我也会尝试。 –

回答

3

转到System > Configuration。从左侧导航中选择“Tax”,然后打开"Calculation Settings"组,如果它尚未。

尝试改变“Apply Customer Tax”参数设置为“After Discount

+1

我知道这个问题有点过时,但在尝试执行类似任务时碰到了它。我不相信这会起作用,主要是因为这是一个自定义的总收藏家,这在Magento眼中并不完全是“折扣”。 –