このための特別なヘルパーを作成しました(これを混合価格と呼びます)。
Catalog_Model_ProductのgetPriceおよびgetSpecialPriceを上書きする必要があります。
public function getPrice()
{
return Mage::helper('catalog/mixedprice')
->getProductPrice($this);
}
public function getSpecialPrice()
{
return Mage::helper('catalog/mixedprice')
->getProductSpecialPrice($this);
}
このヘルパーの背後にある考え方は非常に単純ですが、もっとコンテキストを提供する必要があります。私たちはお客様のソフトウェアを販売しており、物理的な製品は販売していません。B2Bクライアントの固定価格の製品と、B2Cクライアントの固定価格の製品が必要でした(最終価格は一定で、顧客の国ごとに付加価値が変更されます)。両方を同時に持つことはできません。
製品「is_vat_included」の列を追加しました。B2B修正の場合はfalseであると想定し、B2C修正の場合はtrueであると想定します。(したがって、カタログ製品を保守する人は誰でもそれを処理する必要があります)。
ご存知かもしれませんが、magentoのグローバル設定には、価格に税金が含まれているかどうかが示されています(\ Mage_Tax_Helper_Data :: priceIncludesTax)。この構成はtrueであると想定しています( "mixedprice"ヘルパーで価格を操作するときは、反対のことを想定するか、想定を行わずにこの構成を考慮することができます。
残りは非常に簡単です:*「is_vat_included」==製品の場合はtrue、特別な処理は行いません*「is_vat_included」== falseの場合は、magentoのTaxHelperから送信してVATで価格を計算します
つまり、Catalog_Model_Productのコードはおおよそ次のようになります。
public function getPrice()
{
if($this->getIsVatIncluded()) {
return parent::getPrice();
}
return Mage::helper('tax')->getPrice(
$this, // product
parent::getPrice(), // excl. VAT
true, // ask for price inclugin Tax
null, // shipping address - we sell downloadable software, you may care more about this param
$billingAddress, // you can get it from quote
null,
null,
false, // price we're passing (parent::getPrice())doesn't include tax
false, // do not round this price (it's too soon)
)
}
これは、「mixedprice」ヘルパーに引き出した一般的なロジックです(ここでは、わかりやすくするためにインライン化しました)。
注:1.正確なコードをコピーして貼り付けることはできないため、おおまかな方法です。VATを含む商品を含む一部のストアと、商品がデフォルトでVATを除外する一部のストアを管理する場合、この方法はより複雑になります。2. product :: getSpecialPriceにも同じトリックが必要です。カスタムオプションを使用している場合は、さらに多くのトリックが必要です。4.ユニットテストはあなたの味方です-私たちはクレイジーにそれを使用しました(2015年1月1日にこれを展開する必要がありましたが、うまくいきました)。
@Jeffreyの説明に感謝-彼の回答に投票してください:ビジネスクライアント向けの越境税の設定