我为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 :(得分: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');
}
}