Php Magento:结帐时额外费用的征税错误
我在结帐单上加了一笔额外的费用,但税款计算不正确 如果我做$this->\u calculateTax($address),则税额加起来不正确;在collect函数中,它被加到包括税在内的总额中,但我的税额仍然是 如果是var_,则在$address->setAppliedTaxes($previouslyAppliedTaxes)行之后转储设置的已应用税;我确实看到了正确的数额。它两次抛出这个,第一次我看到的只是我额外费用的正确税额,第二次是正确的总税额。但在前端,它显示的是税,不包括我额外费用的税 有关于这可能是什么的线索吗Php Magento:结帐时额外费用的征税错误,php,magento,magento-1.6,gomage,Php,Magento,Magento 1.6,Gomage,我在结帐单上加了一笔额外的费用,但税款计算不正确 如果我做$this->\u calculateTax($address),则税额加起来不正确;在collect函数中,它被加到包括税在内的总额中,但我的税额仍然是 如果是var_,则在$address->setAppliedTaxes($previouslyAppliedTaxes)行之后转储设置的已应用税;我确实看到了正确的数额。它两次抛出这个,第一次我看到的只是我额外费用的正确税额,第二次是正确的总税额。但在前端,它显示的是税,不包括我额外费
class Company_Customer_Model_Quote_Address_Total_PrintPrepCosts extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
public function __construct() {
$this->setCode('printPrepCosts');
$this->_store = Mage::app()->getStore();
return $this;
}
public function collect(Mage_Sales_Model_Quote_Address $address)
{
parent::collect($address);
$address->setPrintPrepcosts(0);
$address->setTaxAmount(0);
$address->setBaseTaxAmount(0);
if(count($address->getAllItems()) == 0)
{
return $this;
}
$pricePrint = $this->calcTotalPrintPrepCosts();
$address->setPrintPrepcosts($pricePrint);
$address->setBasePrintPrepcosts($pricePrint);
$address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getPrintPrepcosts());
$address->setGrandTotal($address->getGrandTotal() + $address->getPrintPrepcosts());
$this->_calculateTax($address);
return $this;
}
protected function _calculateTax(Mage_Sales_Model_Quote_Address $address)
{
$calculator = Mage::getSingleton('tax/calculation');
$inclTax = Mage::getStoreConfig('tax/calculation/printing_prep_includes_tax', $this->_store);
$taxRateRequest = $calculator->getRateRequest(
$address,
$address->getQuote()->getBillingAddress(),
$address->getQuote()->getCustomerTaxClassId(),
$this->_store
);
// TODO undef prop _store
$taxRateRequest->setProductClassId(Mage::getStoreConfig('tax/classes/printing_prep_tax_class', $this->_store));
$rate = $calculator->getRate($taxRateRequest);
$baseTax = $tax = $calculator->calcTaxAmount($address->getPrepPrintcosts(), $rate, $inclTax, true);
$address->addTotalAmount('tax', max(0, $tax));
$address->addBaseTotalAmount('tax', max(0, $baseTax));
$this->_saveAppliedTaxes($address,
$calculator->getAppliedRates($taxRateRequest),
$tax,
$baseTax,
$rate
);
// later on added - which fixes the total, lose tax amount still off
$address->setTaxAmount($tax);
$address->setBaseTaxAmount($baseTax);
if($inclTax)
{
$address->setBaseGrandTotal($address->getBaseGrandTotal() - $baseTax);
$address->setGrandTotal($address->getGrandTotal() - $tax);
}
}
protected function _saveAppliedTaxes(Mage_Sales_Model_Quote_Address $address, $applied, $amount, $baseAmount, $rate)
{
$previouslyAppliedTaxes = $address->getAppliedTaxes();
$process = count($previouslyAppliedTaxes);
foreach ($applied as $row) {
if (!isset($previouslyAppliedTaxes[$row['id']])) {
$row['process'] = $process;
$row['amount'] = 0;
$row['base_amount'] = 0;
$previouslyAppliedTaxes[$row['id']] = $row;
}
if (!is_null($row['percent'])) {
$row['percent'] = $row['percent'] ? $row['percent'] : 1;
$rate = $rate ? $rate : 1;
$appliedAmount = $amount/$rate*$row['percent'];
$baseAppliedAmount = $baseAmount/$rate*$row['percent'];
} else {
$appliedAmount = 0;
$baseAppliedAmount = 0;
foreach ($row['rates'] as $rate) {
$appliedAmount += $rate['amount'];
$baseAppliedAmount += $rate['base_amount'];
}
}
if ($appliedAmount || $previouslyAppliedTaxes[$row['id']]['amount']) {
$previouslyAppliedTaxes[$row['id']]['amount'] += $appliedAmount;
$previouslyAppliedTaxes[$row['id']]['base_amount'] += $baseAppliedAmount;
} else {
unset($previouslyAppliedTaxes[$row['id']]);
}
}
$address->setAppliedTaxes($previouslyAppliedTaxes);
}
public function fetch(Mage_Sales_Model_Quote_Address $address)
{
$address->addTotal(array(
'code' => $this->getCode(),
'title' => "Prep Print costs",
'value' => $address->getPrintPrepcosts(),
));
return $this;
}
编辑1
XML包含以下内容:
<sales>
<quote>
<totals>
<printPrepCosts>
<class>Company_Customer_Model_Quote_Address_Total_PrintPrepCosts</class>
<after>subtotal</after>
<before>tax</before>
</printPrepCosts>
</totals>
</quote>
</sales>
输出-示例
Subtotal € 67,50
printPrepCosts € 40,00
Shipping € 50,00
TAX € 22,33
Total € 187,43
编辑3
糟糕的是,只有GoMage onepage结账单给出了正确的总计,购物车没有。常规的Magento onepage结账也给出了错误的总计 您是要修改现有的税目还是添加新税目?能否显示整个模型的config.xml条目 如果您要添加一个新的税行项目,这应该足够了,只需针对CE 1.7进行测试即可:
class KJ_Mymodule_Model_Sales_Quote_Address_Total_Kjtest extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
public function __construct()
{
$this->setCode('kjtest');
}
public function collect(Mage_Sales_Model_Quote_Address $address)
{
parent::collect($address);
$this->_setAmount(1.01);
$this->_setBaseAmount(1.01);
return $this;
}
public function processConfigArray($config, $store) {
return $config;
}
public function fetch(Mage_Sales_Model_Quote_Address $address)
{
$address->addTotal(array(
'code' => $this->getCode(),
'title' => "Prep Print costs",
'value' => 1.01,
));
return $this;
}
}
通过充分,我的意思是,这应该是最低限度的你需要得到的税行项目显示
在config.xml中包含以下内容:
<sales>
<quote>
<totals>
<kjtest>
<class>mymodule/sales_quote_address_total_kjtest</class>
<after>tax</after>
</kjtest>
</totals>
</quote>
</sales>
我的模块/销售\报价\地址\总计\测试
税
阅读下面的内容,我认为这对您非常有帮助:-
请参见下面的url
Magento添加费用或折扣订单总额
在本教程中,我们将看到如何向magento订单总计添加新行项目。
这意味着,如何在magento结账过程中向订单总额增加额外费用或折扣,或任何形式的费用。
在典型订单中,订单总额通常包括小计、运输成本、税费、折扣,根据这些值计算订单总额。现在,如果我们想增加额外的信用卡费用,或说服免费或会员折扣或任何其他订单总额,这将影响订单总额,我们需要创建一个magento模块。我们增加到总额中的额外费用将反映在
- 签出页面订单总数
- 购物车页面订单总数
- 我的账户订单查看页面
- 订购电子邮件
- 管理订单视图/Email/PDF
- 管理员发票查看/电子邮件/PDF
- 管理员信用备忘录视图/Email/PDF
<global>
<sales>
<quote>
<totals>
<fee>
<class>fee/sales_quote_address_total_fee</class>
</fee>
</totals>
</quote>
</sales>
</global>
订单页面
到目前为止,所有编写的代码都只针对quote对象。但是下订单后,我们需要将所有信息传输到订单对象。正如您在上面所看到的,我们使用了两个字段fee_amount和base_fee_amount,现在我们还需要在订单表中存储这两个字段。要做到以上所有这些,我们需要做两件事。首先在config.xml文件中,将此代码添加到全局选项卡中
<fieldsets>
<sales_convert_quote_address>
<fee_amount><to_order>*</to_order></fee_amount>
<base_fee_amount><to_order>*</to_order></base_fee_amount>
</sales_convert_quote_address>
</fieldsets>
完成此操作后,这两个字段应该从quote表保存到order表
这只是将行项目添加到订单总额的基础。Rest附加模块中编写了大量代码,请仔细阅读以了解更多信息。我找到了一个解决方法,它不是最佳解决方案,但确实有效:) 在我的演讲中,我将把税设置为一个额外的var,称为税,并在观察者中使用它来操纵税
class Company_Client_Model_Observer
{
public function setCorrectTax ($observer)
{
$quote = $observer->getQuote();
foreach ($quote->getAllAddresses() as $address) {
$printPrepCosts = $address->getPrintPrepcosts();
if(!empty($printPrepCosts)) {
$address->setTaxAmount($address->tax);
}
}
}
}
还有XML
<events>
<sales_quote_collect_totals_after>
<observers>
<client>
<type>singleton</type>
<class>client/observer</class>
<method>setCorrectTax</method>
</client>
</observers>
</sales_quote_collect_totals_after>
</events>
独生子女
客户/观察员
税收调整
calcTotalPrepPrintCosts()的内容是什么?只不过是在结账车中循环并创建准备价格。我已经检查过了,它确实返回int或float。即使我删除函数并用硬编码值替换它,问题仍然会出现。在magento中定义函数的地方“getInvoiceTaxAmount”、“getBaseInvoiceFeeExcludedVat”我在magento中找不到这些函数。有人能解释它们是什么以及它们是如何使用的吗?我编辑了类名,使它们更加相似。我的XML看起来像:`公司\客户\模型\报价\地址\总额\打印预处理成本小计税',小计65,20欧元打印预处理成本40,00欧元运费50,00欧元税款21,89欧元谢谢。您正在尝试修改税号吗?听起来打印线的渲染很好,对吗?你可能需要把它改成税。它应该从我的成本中得到税,然后把它和其余的加起来。税后也不起作用,所以你想要
<fieldsets>
<sales_convert_quote_address>
<fee_amount><to_order>*</to_order></fee_amount>
<base_fee_amount><to_order>*</to_order></base_fee_amount>
</sales_convert_quote_address>
</fieldsets>
ALTER TABLE `".$this->getTable('sales/order')."` ADD `fee_amount` DECIMAL( 10, 2 ) NOT NULL;
ALTER TABLE `".$this->getTable('sales/order')."` ADD `base_fee_amount` DECIMAL( 10, 2 ) NOT NULL;
class Company_Client_Model_Observer
{
public function setCorrectTax ($observer)
{
$quote = $observer->getQuote();
foreach ($quote->getAllAddresses() as $address) {
$printPrepCosts = $address->getPrintPrepcosts();
if(!empty($printPrepCosts)) {
$address->setTaxAmount($address->tax);
}
}
}
}
<events>
<sales_quote_collect_totals_after>
<observers>
<client>
<type>singleton</type>
<class>client/observer</class>
<method>setCorrectTax</method>
</client>
</observers>
</sales_quote_collect_totals_after>
</events>