2012-08-10 60 views
3

我为Magento创建了一个附加模块,它为报价添加了自定义总字段。 Magento收取附加费,包括税费。我已经成功地获得了该模块,为报价添加附加费,并且在结帐页面上的总额是正确的。Magento - 在自定义报价总计字段应用税

我的问题是,当试图将税款应用于附加费用,以便将其纳入并显示在结帐页面上的税收字段中时。目前它只包括产品税和运费。

我已经设法计算了附加税的税额,但不能获得适用于报价的税额,以便它在税收领域显示,但也不认为我的方法是非常正确的。任何帮助将非常感激。

class ********_Deposits_Model_Quote_Address_Total_Surcharge extends Mage_Sales_Model_Quote_Address_Total_Abstract { 

protected $_config = null; 

public function __construct() 
{ 
    $this->setCode('surcharge_price'); 
    $this->_config  = Mage::getSingleton('tax/config'); 
    $this->_store = Mage::app()->getStore(); 
} 

protected function _calculateTax(Mage_Sales_Model_Quote_Address $address) 
{ 
    $calculator  = Mage::getSingleton('tax/calculation'); 
    $inclTax  = $this->_config->priceIncludesTax($this->_store); 

    $taxRateRequest = $calculator->getRateRequest(
     $address, 
     $address->getQuote()->getBillingAddress(), 
     $address->getQuote()->getCustomerTaxClassId(), 
     $this->_store 
    ); 

    $taxRateRequest->setProductClassId(Mage::getStoreConfig('********/surcharges/tax_class', $this->_store)); 

    $rate = $calculator->getRate($taxRateRequest); 

    $baseTax = $tax = $calculator->calcTaxAmount($address->getBaseSurchargePriceAmount(), $rate, $inclTax, true); 


} 

/** 
* Collect address subtotal 
* 
* @param ********_Surcharges_Model_Quote_Address $address 
* @return ********_Surcharges_Model_Quote_Address_Total_Surcharge 
*/ 
public function collect(Mage_Sales_Model_Quote_Address $address) 
{ 

    parent::collect($address); 

    $this->_setAmount(0)->_setBaseAmount(0); 

    // If Surcharges Is Enabled Then Calculate Away :-) 
    if(Mage::getStoreConfig('********/surcharges/surcharge_enabled')) { 

     $items = $this->_getAddressItems($address); 
     if (!count($items)) { 
      return $this; 
     } 

     // Calculate Total Surcharge For Items In Quote (Base Prices!) 
     $surcharge = 0.0; 
     foreach ($items as $item) { 
     $price = $item->getData('base_surcharge_price', null); 
     if(isset($price)) { 
      $surcharge += $item->getData('base_surcharge_price') * $item->getQty(); 
     } 
     } 

    $this->_setAmount($surcharge); 
    $this->_setBaseAmount($surcharge); 

    $this->_calculateTax($address); 
    } 


    return $this; 
} 

public function fetch(Mage_Sales_Model_Quote_Address $address) 
{ 

    if(Mage::getStoreConfig('********/surcharges/surcharge_enabled')) { 
    $surcharge = $address->getSurchargePriceAmount(); 
    if(isset($surcharge) && $surcharge > 0) { 
     $address->addTotal(array(
      'code' => $this->getCode(), 
      'title' => Mage::getStoreConfig('********/surcharges/surcharge_label'), 
      'value' => $surcharge 
    )); 
    } 
    } 

    return $this; 
} 

public function getLabel() 
{ 
    return Mage::getStoreConfig('********/surcharges/surcharge_label'); 
} 
+0

阿什利嗨你设法得到这个工作? – 2012-11-21 02:04:30

+0

嗨乔纳森。我最终通过有效地重新计算地址对象的税额来做到了这一点。见下面的帖子! – Ashley 2012-11-22 12:13:21

回答

6

我设法解决这个问题,使用下面的代码。不是最好的解决方案,但花了数小时试图做到这一点,并没有得到任何快速。 Asterix的需要被替换。

class *****_Deposits_Model_Quote_Address_Total_Surcharge extends Mage_Sales_Model_Quote_Address_Total_Abstract { 

protected $_taxConfig = null; 

public function __construct() 
{ 
    $this->setCode('surcharge_price'); 
    $this->_taxConfig  = Mage::getSingleton('tax/config'); 
    $this->_store = Mage::app()->getStore(); 
} 

protected function _calculateTax(Mage_Sales_Model_Quote_Address $address) 
{ 
    $calculator  = Mage::getSingleton('tax/calculation'); 
    $calculator->setCustomer($address->getQuote()->getCustomer()); 

    $inclTax  = $this->_taxConfig->priceIncludesTax($this->_store); 

    $taxRateRequest = $calculator->getRateRequest(
     $address, 
     $address->getQuote()->getBillingAddress(), 
     $address->getQuote()->getCustomerTaxClassId(), 
     $this->_store 
    ); 

    $taxRateRequest->setProductClassId(Mage::getStoreConfig('*****/surcharges/tax_class', $this->_store)); 

    $rate = $calculator->getRate($taxRateRequest); 

    if($rate > 0.0) { 
     $baseTax = $calculator->calcTaxAmount($address->getBaseSurchargePriceAmount(), $rate, $inclTax, true); 
     $tax = $address->getQuote()->getStore()->convertPrice($baseTax, false); 

     $address->addTotalAmount('tax', $tax); 
     $address->addBaseTotalAmount('tax', $baseTax); 

     $rates = array(); 
     foreach ($address->getAppliedTaxes() as $rate) { 
     $rate['amount'] = $rate['amount'] + $tax; 
     $rate['base_amount'] = $rate['base_amount'] + $baseTax; 
     $rates[] = $rate; 
     } 

     $address->setAppliedTaxes($rates); 

     if($inclTax) { 
     $address->setGrandTotal($address->getGrandTotal() - $tax); 
     $address->setBaseGrandTotal($address->getBaseGrandTotal() - $baseTax); 
     } 
    } 

} 

/** 
* Collect address subtotal 
* 
* @param *****_Surcharges_Model_Quote_Address $address 
* @return *****_Surcharges_Model_Quote_Address_Total_Surcharge 
*/ 
public function collect(Mage_Sales_Model_Quote_Address $address) 
{ 

    parent::collect($address); 

    // Clear Cached Values As Multiple Addresses Causes Values To Be Added Twice Otherwise! 
    $this->_setAmount(0)->_setBaseAmount(0); 

    // If Surcharges Is Enabled Then Calculate Away :-) 
    if(Mage::getStoreConfig('*****/surcharges/surcharge_enabled')) { 

     $items = $this->_getAddressItems($address); 
     if (!count($items)) { 
      return $this; 
     } 

     // Calculate Total Surcharge For Items In Quote (Base Prices!) 
     $surcharge = 0.0; 
     foreach ($items as $item) { 
     $price = $item->getData('base_surcharge_price', null); 
     if(isset($price)) { 
      $surcharge += $item->getData('base_surcharge_price') * $item->getQty(); 
     } 
     } 

    $this->_setAmount($address->getQuote()->getStore()->convertPrice($surcharge, false)); 
    $this->_setBaseAmount($surcharge); 

     $this->_calculateTax($address); 
    } 


    return $this; 
} 

/** 
* Assign subtotal amount and label to address object 
* 
* @param *****_Surcharges_Model_Quote_Address $address 
* @return *****_Surcharges_Model_Quote_Address_Total_Surcharge 
*/ 
public function fetch(Mage_Sales_Model_Quote_Address $address) 
{ 

    if(Mage::getStoreConfig('*****/surcharges/surcharge_enabled')) { 
    $surcharge = $address->getSurchargePriceAmount(); 
    if(isset($surcharge) && $surcharge > 0) { 
     $address->addTotal(array(
      'code' => $this->getCode(), 
      'title' => Mage::getStoreConfig('*****/surcharges/surcharge_label'), 
      'value' => $surcharge 
    )); 
    } 
    } 

    return $this; 
} 

/** 
* Get Surcharge label 
* 
* @return string 
*/ 
public function getLabel() 
{ 
    return Mage::getStoreConfig('*****/surcharges/surcharge_label'); 
} 

}

+0

它不工作magento 1.7可以任何机构给我1.7解决方案 – 2013-08-29 11:52:46

+0

这在Magento 1.7中正常工作。这是我为它开发的。这不是完整的解决方案,只是其中的一部分。阅读完整的问题,你会得到一些关于这个模块是如何实现的。 – Ashley 2013-09-27 12:48:49

+0

+1在Magento EE 1.13.0.2上为我工作 – 2013-10-15 13:18:09

相关问题