資格のある顧客にカートの小計の3%の割引を与えるために、カスタムの合計コレクターを作成しました。私のコレクターのコードは次のようになります。
class My_Module_Model_DiscountCollector
extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
// ...
public function collect(Mage_Sales_Model_Quote_Address $address)
{
if($this->userIsQualified())
{
parent::collect($address);
// $this->_inclTax tells the collector to either calculate the actual discount amount
// based on the subtotal including or excluding tax
$baseCalcValue = ($this->_inclTax) ? $address->getBaseSubtotalTotalInclTax() : $address->getBaseSubtotal();
$calcValue = ($this->_inclTax) ? $address->getSubtotalInclTax() : $address->getSubtotal();
$baseDiscountAmount = $baseCalcValue * 0.03;
$discountAmount = $calcValue * 0.03;
$this->_setBaseAmount(-$baseDiscountAmount);
$this->_setAmount(-$discountAmount);
}
return $this;
}
public function fetch(Mage_Sales_Model_Quote_Address $address)
{
if($this->userIsQualified())
{
$discountAmount = (($this->_inclTax) ? $address->getSubtotalInclTax() : $address->getSubtotal()) * 0.03;
$address->addTotal(
array(
"code" => $this->getCode(),
"title" => "My Discount (3%)",
"value" => -$discountAmount
)
);
}
return $this;
}
// ...
}
私の問題は、合計リストの合計の順序を変更することです(たとえば、カートを表示する場合)。現在の注文は「小計、送料、送料、...、総計」ですが、「小計、送料、送料、...」の方がいいと思います。現在、私のconfig.xmlは次のようになっています。
<config>
<!-- ... --->
<global>
<!-- ... -->
<sales>
<quote>
<totals>
<my_discount>
<class>My_Module_Model_DiscountCollector</class
<after>shipping</after>
<!--<before>grand_total</before>-->
<!--<after>shipping</after>-->
<!--<before>shipping</before>-->
</my_discount>
</totals>
</quote>
</sales>
<!-- ... -->
</global>
</config>
「before」要素と「after」要素に異なる設定を試しましたが、合計がリストされる順序には影響せず、grand_totalの計算にのみ影響しました。奇妙ですが、私の合計は、上記の設定でのgrand_totalの計算にのみ含まれています。たとえば、「after」を「subtotal」に設定した場合、または「before」を「grand_total」に設定した場合、合計はgrand_totalの計算にまったく影響しません。多分誰かが私にそれを説明することができます。
では、合計の順序を変更するにはどうすればよいですか?「after」を「shipping」以外に設定すると、なぜ結果がそれほど奇妙になるのですか?これらの2つの構成要素の機能を誤解しましたか?