8

チェックアウトに追加料金を追加しましたが、税金が正しく計算されません。

$this->_calculateTax($address); を実行すると、税額が正しく加算されません。コレクト機能では税込み合計に加算されますが、私の税額は当時のままです。

$address->setAppliedTaxes($previouslyAppliedTaxes); 正しい金額が表示されます。これを 2 回ダンプします。1 回目は追加料金だけの正しい税額が表示され、2 回目は正しい合計税額が表示されます。しかし、フロントエンドでは、追加料金の税金を除いた税金が表示されます。

これが何であるかの手がかりはありますか?

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

EDIT 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 関数に追加しました。これにより総計は修正されますが、TAX の金額はまだオフです。

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

出力 - 例

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

編集 3 私の悪い、GoMage の 1 ページのチェックアウトのみが正しい総合計を提供しますが、カートは提供しません。通常の Magento onepage チェックアウトでも、間違った総計が表示されます。

4

3 に答える 3

5

回避策を見つけました。これは最善の解決策ではありませんが、機能します:)

私の住所では、税金を tax という名前の追加変数に設定し、それをオブザーバーで使用して税金を操作します。

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>
于 2012-08-13T13:47:16.230 に答える
2

以下を読んでください。これはあなたにとって非常に役立つと思います:-

下記URL参照

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

Magento 追加料金または割引注文の合計

このチュートリアルでは、magento の注文合計に新しい項目を追加する方法を説明します。これが意味することは、magento のチェックアウト プロセスの合計を注文するために、追加料金や割引、またはあらゆる種類の料金を追加する方法です。典型的な注文では、通常、注文合計は小計、送料、税金、割引で構成され、これらの値に基づいて合計注文総計が計算されます。ここで、追加のクレジット カード手数料、納得のいく無料またはアフィリエイト割引、または注文の総計に影響するその他の注文合計を追加する場合は、magento モジュールを作成する必要があります。合計に追加するこの追加料金は、

  • チェックアウトページの注文合計
  • カートページ注文合計
  • マイアカウントの注文画面
  • メールで注文する
  • 管理者 注文を見る/メール/PDF
  • 管理者 請求書表示/メール/PDF
  • 管理者のクレジット メモの表示/電子メール/PDF

上記のリストに基づいてわかるように、このモジュールは単純ではありません。このチュートリアルでは、出発点として追加の変更を加えることができる非常に基本的なモジュールのソースを添付しています。また、これを実装する方法の基本についても説明します。このチュートリアルでは、10 ドルの固定費で「料金」と呼ばれる新しい注文合計を追加します。

または試してみてください:-

チェックアウトページ 注文合計 合計 基本

合計をチェックアウト ページにのみ追加する方法を説明します。チェックアウト ページに表示されるすべての合計項目は、フォルダ Mage\Sales\Model\Quote\Address\Total にあるファイルから取得されます。注文前のmagentoでは、すべての注文データがquoteオブジェクトに保存され、注文後に注文オブジェクトに転送されます。見積もりの​​合計はコレクター パターンに従い、コレクター クラスをいくつでも追加できます。config.xml の quote オブジェクトにコレクターを追加するには、次の行を追加します。

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

ここでの 2 つの主な関数は、collect() と fetch() です。collect 関数では、注文合計に任意の金額を追加し、表示目的で fetch() を使用します。これが適切に行われると、チェックアウトとカートのページに注文合計行が表示されます。ここでは、手数料の金額を含む、fee_amount と base_fee_amount の 2 つのフィールドを使用しています。これら 2 つのフィールドをデータベースに保存する必要があるため、モジュール インストーラー ファイルにこのコードを追加します。

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;

注文ページ

これまで、記述されたすべてのコードは quote オブジェクトに対してのみ行われてきました。しかし、注文が行われた後、すべての情報を注文オブジェクトに転送する必要があります。上記で見たように、fee_amount と base_fee_amount の 2 つのフィールドを使用しているため、これら 2 つのフィールドを order テーブルにも格納する必要があります。上記のすべてを行うには、2 つのことを行う必要があります。最初に 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;

これを行った後、これら 2 つのフィールドは見積もりテーブルから注文テーブルに保存されます。

これは、注文合計に品目を追加するための基本にすぎません。残りの部分は、付属のモジュール内に多くのコードが記述されているため、詳細を理解するために詳しく調べてください。

于 2012-08-08T06:53:00.447 に答える
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>
于 2012-08-08T01:05:55.123 に答える