2012-08-03 93 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

相關問題