Created
May 27, 2011 14:26
-
-
Save mjakubowski/995353 to your computer and use it in GitHub Desktop.
Magento (v1.4.1.1):Fix tax calculation for tax based on different shipping countries and prices entered including tax
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Custom_Tax_Model_Calculation extends Mage_Tax_Model_Calculation | |
{ | |
/** | |
* Ermitteln, ob Steuerherkunft gefaked werden muss, um dann Steuersatz dese Ziellandes zu verwenden | |
* | |
* @param Varien_Object $request | |
* @return float | |
*/ | |
public function getStoreRate($request, $store=null) | |
{ | |
$rate = parent::getStoreRate($request, $store = null); | |
// MODIFICATION START | |
if ($newRate = $this->_getFakeOriginRate($request, $store)) { | |
$rate = $newRate; | |
} | |
// MODIFICATION END | |
return $rate; | |
} | |
/** | |
* Wenn die Steuerherkunft gefaked werden muss (s.o.) dann muss diese Methode TRUE zurückliefern, | |
* weil sonst bei der Verwendung von Warenkorbregeln falsche Beträge berechnet werden | |
* | |
* @param Varien_Object $first Steuer Request 1 | |
* @param Varien_Object $first Steuer Request 2 | |
* @return bool | |
*/ | |
public function compareRequests($first, $second) | |
{ | |
// MODIFICATION START | |
if ($this->_getFakeOriginRate($first, $first->getStore()) !== false) { | |
return true; | |
} | |
if ($this->_getFakeOriginRate($second, $second->getStore()) !== false) { | |
return true; | |
} | |
// MODIFICATION END | |
return parent::compareRequests($first, $second); | |
} | |
/** | |
* Standardmäßig versucht Magento bei Preisen, die als Brutto angelegt wurden, zuerst den Nettopreis | |
* anhand des Steuersatzes des Standard-Steuer-Standortes zurückzurechnen, um danach den Zielsteuersatz | |
* wieder aufzurechnen. | |
* | |
* Dies ist aber hier nicht gewollt, sondern: | |
* Wenn | |
* 1. Preise in Brutto gepflegt werden | |
* 2. Steuerberechnungen auf Versandadresse beruht | |
* 3. Ein Zielland in der Versandadresse gesetzt ist | |
* 4. Der ursprüngliche Steuersatz nicht "0%" ist (z.B. Schweiz) | |
* dann den Steuersatz des Ziellandes verwenden um den Nettopreis zu berechnen, um ihn dann anschließend | |
* wieder aufzurechnen. | |
* Dadurch bleiben die Bruttopreise erhalten und lediglich der enthaltene Steueranteil ändert sich. | |
* | |
* @param Varien_Object $request | |
* @param Mage_Core_Model_Store $store | |
* @return false|float Neuer Steuersatz, wenn gefaked werden muss, ansonsten false | |
*/ | |
protected function _getFakeOriginRate($request, $store=null) | |
{ | |
$basedOn = Mage::getStoreConfig(Mage_Tax_Model_Config::CONFIG_XML_PATH_BASED_ON, $store); | |
$baseOnShipping = $basedOn == 'shipping' ? true : false; | |
$shippingAddress = Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress(); | |
$shippingCountryId = $shippingAddress ? $shippingAddress->getCountryId() : null; | |
$storePriceInclTax = Mage::getSingleton('tax/config')->priceIncludesTax($store); | |
$customerInclTax = true; | |
if ($customer = $this->getCustomer()) { | |
$taxClassId = $customer->getTaxClassId(); | |
$taxClass = Mage::getModel('tax/class')->load($taxClassId); | |
if ($taxClass->getClassName() == 'exkl. Mehrwertsteuer') { | |
$customerInclTax = false; | |
} | |
} | |
if ($storePriceInclTax && $customerInclTax && $baseOnShipping && $shippingCountryId) { | |
$storeRequest = $this->getRateOriginRequest($store) | |
->setProductClassId($request->getProductClassId()) | |
->setCountryId($shippingCountryId) | |
->setRegionId('') | |
->setPostcode(''); | |
$newRate = $this->getRate($storeRequest); | |
// Nicht ändern wenn 0% damit z.B. Schweiz oder B2B in Netto angezeigt werden können | |
if ($newRate > 0) { | |
return $newRate; | |
} | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment