Skip to content

Instantly share code, notes, and snippets.

@mjakubowski
Created May 27, 2011 14:26
Show Gist options
  • Save mjakubowski/995353 to your computer and use it in GitHub Desktop.
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
<?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