Magento - 在自定义报价总计字段上应用税

时间:2012-08-10 23:58:36

标签: magento totals

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

1 个答案:

答案 0 :(得分: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');
}

}