2012-08-03 97 views
8

我已为结帐添加额外费用,但税款计算不正确。Magento:在结帐时额外费用的税额有误

如果我这样做$ this - > _ calculateTax($ address);在收集功能中,它被累加到包括税的总额中,但是我的税额仍然是。

如果是var_dump,那么在$ line-> setAppliedTaxes($ previouslyAppliedTaxes)之后设置应用税。我确实看到了正确的数额。它将这两次转储,第一次我看到正确的税额只是我的额外费用,第二次是正确的总税额。但是在前端它显示了我的额外费用没有税的税。

任何线索可能是什么?

class Company_Customer_Model_Quote_Address_Total_PrintPrepCosts extends Mage_Sales_Model_Quote_Address_Total_Abstract 
{ 
    public function __construct() { 
     $this->setCode('printPrepCosts'); 
     $this->_store = Mage::app()->getStore(); 
     return $this; 
    } 

public function collect(Mage_Sales_Model_Quote_Address $address) 
    { 
     parent::collect($address); 
     $address->setPrintPrepcosts(0); 
     $address->setTaxAmount(0); 
     $address->setBaseTaxAmount(0); 

     if(count($address->getAllItems()) == 0) 
     { 
      return $this; 
     } 

     $pricePrint = $this->calcTotalPrintPrepCosts(); 

     $address->setPrintPrepcosts($pricePrint); 
     $address->setBasePrintPrepcosts($pricePrint); 

     $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getPrintPrepcosts()); 
     $address->setGrandTotal($address->getGrandTotal() + $address->getPrintPrepcosts()); 

     $this->_calculateTax($address); 
     return $this; 
    } 

    protected function _calculateTax(Mage_Sales_Model_Quote_Address $address) 
    { 
     $calculator  = Mage::getSingleton('tax/calculation'); 
     $inclTax  = Mage::getStoreConfig('tax/calculation/printing_prep_includes_tax', $this->_store); 

     $taxRateRequest = $calculator->getRateRequest(
      $address, 
      $address->getQuote()->getBillingAddress(), 
      $address->getQuote()->getCustomerTaxClassId(), 
      $this->_store 
     ); 

     // TODO undef prop _store 
     $taxRateRequest->setProductClassId(Mage::getStoreConfig('tax/classes/printing_prep_tax_class', $this->_store)); 

     $rate = $calculator->getRate($taxRateRequest); 
     $baseTax = $tax = $calculator->calcTaxAmount($address->getPrepPrintcosts(), $rate, $inclTax, true); 

     $address->addTotalAmount('tax', max(0, $tax)); 
     $address->addBaseTotalAmount('tax', max(0, $baseTax)); 

     $this->_saveAppliedTaxes($address, 
      $calculator->getAppliedRates($taxRateRequest), 
      $tax, 
      $baseTax, 
      $rate 
     ); 

     // later on added - which fixes the total, lose tax amount still off 
     $address->setTaxAmount($tax); 
     $address->setBaseTaxAmount($baseTax); 

     if($inclTax) 
     { 
      $address->setBaseGrandTotal($address->getBaseGrandTotal() - $baseTax); 
      $address->setGrandTotal($address->getGrandTotal() - $tax); 
     } 
    } 

    protected function _saveAppliedTaxes(Mage_Sales_Model_Quote_Address $address, $applied, $amount, $baseAmount, $rate) 
    { 
     $previouslyAppliedTaxes = $address->getAppliedTaxes(); 
     $process = count($previouslyAppliedTaxes); 


     foreach ($applied as $row) { 
      if (!isset($previouslyAppliedTaxes[$row['id']])) { 
       $row['process'] = $process; 
       $row['amount'] = 0; 
       $row['base_amount'] = 0; 
       $previouslyAppliedTaxes[$row['id']] = $row; 
      } 

      if (!is_null($row['percent'])) { 
       $row['percent'] = $row['percent'] ? $row['percent'] : 1; 
       $rate = $rate ? $rate : 1; 

       $appliedAmount = $amount/$rate*$row['percent']; 
       $baseAppliedAmount = $baseAmount/$rate*$row['percent']; 
      } else { 
       $appliedAmount = 0; 
       $baseAppliedAmount = 0; 
       foreach ($row['rates'] as $rate) { 
        $appliedAmount += $rate['amount']; 
        $baseAppliedAmount += $rate['base_amount']; 
       } 
      } 


      if ($appliedAmount || $previouslyAppliedTaxes[$row['id']]['amount']) { 
       $previouslyAppliedTaxes[$row['id']]['amount'] += $appliedAmount; 
       $previouslyAppliedTaxes[$row['id']]['base_amount'] += $baseAppliedAmount; 
      } else { 
       unset($previouslyAppliedTaxes[$row['id']]); 
      } 
     } 
     $address->setAppliedTaxes($previouslyAppliedTaxes);   
    } 

    public function fetch(Mage_Sales_Model_Quote_Address $address) 
    { 
     $address->addTotal(array(
      'code' => $this->getCode(), 
      'title' => "Prep Print costs", 
      'value' => $address->getPrintPrepcosts(), 
     )); 
     return $this; 
    } 

编辑1 XML包含此:

 <sales> 
     <quote> 
      <totals> 
       <printPrepCosts> 
        <class>Company_Customer_Model_Quote_Address_Total_PrintPrepCosts</class> 
        <after>subtotal</after> 
        <before>tax</before> 
       </printPrepCosts> 
      </totals> 
     </quote> 
    </sales> 

EDIT 2 我加入以下行我calcTax功能,这也解决了总计不过税额仍然关闭。

$address->setTaxAmount($tax); 
    $address->setBaseTaxAmount($baseTax); 

输出 - 例如

Subtotal € 67,50 
printPrepCosts € 40,00 
Shipping € 50,00 
TAX  € 22,33 
Total € 187,43 

编辑3 我的坏,只有GoMage onepage结账给出正确的总计,车没有。常规的Magento onepage结账也会给出错误的总计。

+0

什么是'calcTotalPrepPrintCosts()'的内容是什么? – B00MER 2012-08-06 20:56:40

+0

罢了然后通过结账车一个循环,并创建一个准备的价格。我检查过,这确实返回一个int或float。即使当我删除函数并将其替换为硬编码值时,问题仍然存在。其中功能在Magento“getInvoiceTaxAmount”定义 – PvdL 2012-08-07 07:25:57

+0

“getBaseInvoiceFeeExcludedVat”我找不到在Magento这些功能可以解释任何人,他们是什么以及它们是如何使用 – 2013-08-27 07:47:27

回答

5

我找到了一个解决方法,它是不是最好的解决方案,但它的工作:)

在我的地址,我将税收设置为一个额外的变种叫做税和使用,在观察者操纵税。

class Company_Client_Model_Observer 
{ 
    public function setCorrectTax ($observer) 
    { 
     $quote = $observer->getQuote(); 
     foreach ($quote->getAllAddresses() as $address) { 
      $printPrepCosts = $address->getPrintPrepcosts(); 
      if(!empty($printPrepCosts)) { 
       $address->setTaxAmount($address->tax); 
      } 
     } 
    } 
} 

和XML

<events> 
    <sales_quote_collect_totals_after> 
     <observers> 
      <client> 
       <type>singleton</type> 
       <class>client/observer</class> 
       <method>setCorrectTax</method> 
      </client> 
     </observers> 
    </sales_quote_collect_totals_after> 
    </events> 
+0

这是好想法。谢谢! – nethead 2013-02-12 20:39:38

2

您是否在尝试修改现有的税单项目或添加新项目?你能为整个模型显示你的config.xml条目吗?

如果要添加一个新的税种行项目,这应该是足够的,只是测试这对CE 1.7香草安装:

class KJ_Mymodule_Model_Sales_Quote_Address_Total_Kjtest extends Mage_Sales_Model_Quote_Address_Total_Abstract 
{ 
    public function __construct() 
    { 
     $this->setCode('kjtest'); 
    } 

    public function collect(Mage_Sales_Model_Quote_Address $address) 
    { 
     parent::collect($address); 

     $this->_setAmount(1.01); 
     $this->_setBaseAmount(1.01); 

     return $this; 
    } 

    public function processConfigArray($config, $store) { 
     return $config; 
    } 

    public function fetch(Mage_Sales_Model_Quote_Address $address) 
    { 
     $address->addTotal(array(
      'code' => $this->getCode(), 
      'title' => "Prep Print costs", 
      'value' => 1.01, 
     )); 
     return $this; 
    } 
} 

通过足够的,我的意思是,这应该是你所需要的最低限度让税单项目出现。

有了这个在你的config.xml:

<sales> 
    <quote> 
     <totals> 
      <kjtest> 
       <class>mymodule/sales_quote_address_total_kjtest</class> 
       <after>tax</after> 
      </kjtest> 
     </totals> 
    </quote>  
</sales> 
+0

我编辑的类名,使他们都比较相似。 我的XML看起来像: ' \t \t Company_Client_Model_Quote_Address_Total_PrintPrepCosts 大部 ' 这给 Subtotaal \t€65,20 printPrepCosts \t€40,00 航运\t€50,00 税\t€21,89 – PvdL 2012-08-08 08:13:31

+0

感谢。您是否在尝试修改税务行?这听起来像printPrepCosts线渲染就好,对吧?您可能需要将其更改为。 – kalenjordan 2012-08-08 15:01:27

+0

它应该只是从我的printPrepCosts获得税收和与其他添加它。税后也不起作用。 – PvdL 2012-08-09 07:45:49

2

阅读下面我想这非常有助于全给你: -

参阅网址下面

http://www.excellencemagentoblog.com/magento-add-fee-discount-order-total

Magento添加费用或折扣o总计

在本教程中,我们将看到如何将新的订单项添加到magento订单总计。 这是什么意思是,如何添加额外的费用或折扣,或任何类型的费用,以订购总数的magento结帐过程。 按典型订单,订单总计通常包括小计,运费,税金,折扣,根据这些值计算总订单总额。现在,如果我们想要添加额外的信用卡费用或免费或联盟折扣或任何其他订单总额,这将影响订单总额,我们需要创建一个magento模块。我们要添加到总这额外的费用将反映在

  • 结帐页面订单总额
  • 车页面订单总额
  • 我的帐户订单查看页面
  • 订单EMails
  • 管理员订单查看/电子邮件/ PDF
  • 管理员发票查看/电子邮件/ PDF
  • 管理员贷项通知单查看/电子邮件/ PDF

您可以根据上面的列表上看到这个模块是不是很简单。在本教程中,我附加了这样一个非常基本的模块的源代码,您可以使用它的起点来添加额外的更改。我还会解释如何实现这一点的基础知识。在本教程中,我将添加一个名为'费'的新订单总额,固定成本为10美元。

或者试试吧: -

结帐页共订单总额基础

我们将看到怎样的总数仅添加到结帐页面。显示结帐页面的总计行项目来自位于文件夹Mage \ Sales \ Model \ Quote \ Address \ Total的文件。在放置订单之前,所有订单数据都存储在报价对象中,并且在下订单后它将被传输到订单对象。引用总数遵循收集器模式,我们可以添加收集器作为许多收集器类。要在我们的config.xml中添加收藏家报价对象,我们添加了线

<global> 
     <sales> 
      <quote> 
       <totals> 
        <fee> 
         <class>fee/sales_quote_address_total_fee</class> 
        </fee> 
       </totals> 
      </quote> 
     </sales> 
</global> 

这意味着每当合计均针对报价计算,它也将调用这个类。所有收集器都从报价模型中的collectTotals()函数中调用。 在我们收集类我们把代码

<?php 
    class Excellence_Fee_Model_Sales_Quote_Address_Total_Fee extends Mage_Sales_Model_Quote_Address_Total_Abstract{ 
    protected $_code = 'fee'; 

    public function collect(Mage_Sales_Model_Quote_Address $address) 
    { 
     parent::collect($address); 

     $this->_setAmount(0); 
     $this->_setBaseAmount(0); 

     $items = $this->_getAddressItems($address); 
     if (!count($items)) { 
      return $this; //this makes only address type shipping to come through 
     } 


     $quote = $address->getQuote(); 

     if(Excellence_Fee_Model_Fee::canApply($address)){ //your business logic 
      $exist_amount = $quote->getFeeAmount(); 
      $fee = Excellence_Fee_Model_Fee::getFee(); 
      $balance = $fee - $exist_amount; 
      $address->setFeeAmount($balance); 
      $address->setBaseFeeAmount($balance); 

      $quote->setFeeAmount($balance); 

      $address->setGrandTotal($address->getGrandTotal() + $address->getFeeAmount()); 
      $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseFeeAmount()); 
     } 
    } 

    public function fetch(Mage_Sales_Model_Quote_Address $address) 
    { 
     $amt = $address->getFeeAmount(); 
     $address->addTotal(array(
       'code'=>$this->getCode(), 
       'title'=>Mage::helper('fee')->__('Fee'), 
       'value'=> $amt 
     )); 
     return $this; 
    } 
} 

两个主要的功能在这里是收集()并取得()。在收集功能中,您可以将任意数量的数据添加到订单总计中,而fetch()用于显示目的。如果正确完成,您应该在结帐和购物车页面中看到您的订单总计行。 这里我们使用两个字段fee_amount和base_fee_amount,其中包含我们的费用金额。我们必须看到这两个字段保存到数据库中,所以在我们的模块的安装文件,我们添加以下代码

ALTER TABLE `".$this->getTable('sales/quote_address')."` ADD `fee_amount` DECIMAL(10, 2) NOT NULL; 
ALTER TABLE `".$this->getTable('sales/quote_address')."` ADD `base_fee_amount` DECIMAL(10, 2) NOT NULL; 

订购页面

到目前为止,编写的所有代码已经只是做了报价目的。但是,在下订单后,我们需要将所有信息传递给订单对象。正如您在上面看到的,我们使用两个字段fee_amount和base_fee_amount,现在我们需要将这两个字段存储在订单表中。要做到以上所有,我们需要做两件事。首先在config.xml文件中添加以下代码全局选项卡中,

<fieldsets> 
     <sales_convert_quote_address> 
      <fee_amount><to_order>*</to_order></fee_amount> 
      <base_fee_amount><to_order>*</to_order></base_fee_amount> 
     </sales_convert_quote_address> 
    </fieldsets> 

和我们的模块在安装文件

ALTER TABLE `".$this->getTable('sales/order')."` ADD `fee_amount` DECIMAL(10, 2) NOT NULL; 
ALTER TABLE `".$this->getTable('sales/order')."` ADD `base_fee_amount` DECIMAL(10, 2) NOT NULL; 

这样做了以后,这两个领域应该得到保存到顺序表报价表。

这是添加一行项目订购总共只有基本知识。其余的部分代码写在附加的模块中,请详细了解更多。

+1

我已经看到了这个页面,并没有任何运气跟着它 – PvdL 2012-08-08 08:18:30