Wir haben dafür einen speziellen Helfer geschaffen (wir nennen es gemischten Preis).
Sie müssen getPrice und getSpecialPrice für Catalog_Model_Product überschreiben:
public function getPrice()
{
return Mage::helper('catalog/mixedprice')
->getProductPrice($this);
}
public function getSpecialPrice()
{
return Mage::helper('catalog/mixedprice')
->getProductSpecialPrice($this);
}
Die Idee hinter diesem Helfer ist recht einfach, aber ich muss mehr Kontext angeben. Wir verkaufen unseren Kunden Software, keine physischen Produkte. Wir brauchten einige Produkte mit festen Preisen für B2B-Kunden und einige Produkte mit festen Preisen für B2C-Kunden (der Endpreis ist konstant, die Mehrwertsteuer ändert sich für jedes Kundenland). Beides kann man natürlich nicht haben.
Wir haben eine Spalte für das Produkt 'is_vat_included' hinzugefügt. Für festes B2B erwarten wir, dass dies falsch ist, für festes B2C erwarten wir, dass dies wahr ist. (Wer also Katalogprodukte pflegt, muss sich darum kümmern).
Wie Sie vielleicht wissen: Es gibt eine globale Konfiguration für Magento, die angibt, ob die Preise mit oder ohne Steuern sind (\ Mage_Tax_Helper_Data :: priceIncludesTax). Wir haben angenommen, dass diese Konfiguration wahr sein sollte (Sie können das Gegenteil annehmen oder keine Annahmen treffen und diese Konfiguration berücksichtigen, wenn Sie die Preise im "Mixedprice" -Helfer manipulieren.
Der Rest ist ganz einfach: * Wenn 'is_vat_included' == true für das Produkt ist, tun Sie nichts Besonderes. * Wenn 'is_vat_included' == false ist, senden Sie es über den TaxHelper von magento, um den Preis mit Mehrwertsteuer zu berechnen
Der Code für Catalog_Model_Product würde also ungefähr so aussehen:
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)
)
}
Dies ist die allgemeine Logik, die wir unserem "Mixed-Price" -Helfer zugewiesen haben (ich habe sie hier der Klarheit halber eingefügt).
Bitte beachten Sie: 1. Ich kann Ihren genauen Code nicht kopieren und einfügen, daher ist dies eine grobe Idee. Wenn Sie einige Geschäfte mit Produkten einschließlich Mehrwertsteuer verwalten möchten und einige Geschäfte, in denen Produkte standardmäßig die Mehrwertsteuer ausschließen, ist diese Methode komplizierter. 2. Sie benötigen den gleichen Trick für product :: getSpecialPrice. 3. Sie benötigen noch mehr davon, wenn Sie benutzerdefinierte Optionen verwenden. 4. Unit Testing ist dein Freund - wir haben es wie verrückt benutzt (wir mussten es am 1. Januar 2015 bereitstellen, es hat funktioniert).
Vielen Dank für die Klarstellung von @ Jeffrey - bitte stimmen Sie seiner Antwort ab: Grenzüberschreitende Steuereinstellungen für Geschäftskunden