Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Magento:结帐时额外费用的征税错误_Php_Magento_Magento 1.6_Gomage - Fatal编程技术网

Php Magento:结帐时额外费用的征税错误

Php Magento:结帐时额外费用的征税错误,php,magento,magento-1.6,gomage,Php,Magento,Magento 1.6,Gomage,我在结帐单上加了一笔额外的费用,但税款计算不正确 如果我做$this->\u calculateTax($address),则税额加起来不正确;在collect函数中,它被加到包括税在内的总额中,但我的税额仍然是 如果是var_,则在$address->setAppliedTaxes($previouslyAppliedTaxes)行之后转储设置的已应用税;我确实看到了正确的数额。它两次抛出这个,第一次我看到的只是我额外费用的正确税额,第二次是正确的总税额。但在前端,它显示的是税,不包括我额外费

我在结帐单上加了一笔额外的费用,但税款计算不正确

如果我做$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
从上面的列表可以看出,这个模块并不简单。在本教程中,我附加了这样一个非常基本的模块的源代码,您可以使用您的起点添加额外的更改。我还将解释如何实现这一点的基础知识。在本教程中,我将添加一个名为“费用”的新订单总额,固定成本为10美元

或者试试:-

签出页面总订单总基本信息

我们将看到如何将总数仅添加到结帐页面。显示签出页面的所有总计行项目都来自文件夹Mage\Sales\Model\Quote\Address\Total中的文件。在magento中,下单之前,所有订单数据都存储在quote对象中,下单之后,所有订单数据都会传输到order对象。报价总额遵循收集器模式,我们可以添加尽可能多的收集器类。要将收集器添加到config.xml中的quote对象,需要添加以下行

<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>