Magento-对自定义报价总计字段征税 [英] Magento - Apply Tax On Custom Quote Totals Field

查看:63
本文介绍了Magento-对自定义报价总计字段征税的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为Magento创建了一个附加模块,该模块将自定义总计字段添加到报价中.附加费输入含税的Magento中.我已经成功获得了将附加费添加到报价中的模块,并且总计在结帐页面上是正确的.

I have created a surcharge module for Magento which adds a custom total field to the quote. The surcharge is input into Magento including tax. I have successfully got the module adding the surcharge to the quote and the grand total is correct on the checkout page.

我的问题是在尝试对附加费征收税款时,它被包括在内并显示在结帐页面的税款字段中.目前,它仅包括产品和运输的税金.

My issue comes when trying to apply tax to the surcharge so that it gets included and displayed in the tax field on the checkout page. Currently it only includes the tax for the products and the shipping.

我设法计算了附加费的税额,但无法将税额应用到报价中,因此它显示在税额字段中,但也不认为我的方法也很正确.任何帮助将不胜感激.

I have managed to calculate the tax for the surcharge but cant't get the tax applied to the quote so that it is displayed in the tax field but also don't think my approach is quite correct either. Any help would be much appreciated.

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');
}

推荐答案

我设法使用以下代码解决了此问题.不是最好的解决方案,但是花了数小时试图做到这一点,但并没有很快得到解决. Asterix的需要更换.

I managed to solve this this using the following code. Not the best solution but spent hours trying to do it and didn't get anywhere fast. Asterix's need to be replaced.

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');
}

}

这篇关于Magento-对自定义报价总计字段征税的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆