折扣后如果总计为 0,则需要根据自定义价格字段计算税款并添加到购物车页面的总计中

Posted

技术标签:

【中文标题】折扣后如果总计为 0,则需要根据自定义价格字段计算税款并添加到购物车页面的总计中【英文标题】:after discount if grand total 0 then need calculate tax based on custom price field and add into grand total in cart page 【发布时间】:2015-03-14 18:03:11 【问题描述】:

我创建了一张“固定金额”的优惠券,假设为 100 美元,我将产品添加到购物车,价格为 100 美元。现在我在后台选择了 System->configuration->tax->calculation 设置“Apply Customer Tax is After Discount”和“Apply Discount on price is Excluding tax”。

下面是场景: 1)当我将产品添加到购物车并应用优惠券时,总计变为 0。(因为优惠券价值 100 和产品价格为 100 所以它变为 0)现在如果我按下结帐按钮,在结帐页面价格显示 $ 0 和税也显示 $0。

如果我申请优惠券,我想申请一次税款,我的税款应该根据某个金额计算,例如 40 美元。如果我创建了金额为 10% 的州税规则,那么我的税款应按 40 美元*10/100 = 4 美元计算,在点击结帐按钮之前应将税款加到总额中。

有谁知道我需要在哪个观察者中查找以添加这些条件。

我尝试了以下方法: 我正在观察以下观察者:

        <checkout_cart_save_after>
            <observers>
                <NamespaceModulename>
                    <type>singleton</type>
                    <class>Namespace_Modulename_Model_Observer</class>
                    <method>updateTaxAfterDiscountApplied</method>
                </NamespaceModulename>
            </observers>
        </checkout_cart_save_after>

以下是我的方法代码:

public function updateTaxAfterDiscountApplied()

    $quote = Mage::getModel('checkout/cart')->getQuote();
    $coupon_code = $quote->getCouponCode();

    if($coupon_code)
    
        $coupon_rule_id = $quote->getAppliedRuleIds();
        echo 'rule id'.$coupon_rule_id;
        echo $coupon_code.'couponcode';
   
   if($coupon_rule_id)
        $con = Mage::getSingleton('core/resource')->getConnection('core_read');
        $sale_rule_result = $con->fetchAll("SELECT * FROM salesrule where rule_id=".$coupon_rule_id);
        foreach($sale_rule_result as $rule)
            echo 'tax price'.$rule['tax_calculation_price'];
        
    

在上述方法中,“tax_calculation_price”是我应用优惠券时使用的自定义字段,我的总计为零。然后我有这个字段,用于根据税收计算计算税收。例如 tax_calculation_price = 40 然后假设加拿大->安大略我的税率是 12% 那么它应该计算 40 的 12% 并添加到总计中。那么如何取税,以便我可以用 tax_calculation_price 计算它。 ?任何帮助表示感谢。

【问题讨论】:

【参考方案1】:

你可以使用这个观察者事件

<global>
<events>
    <salesrule_validator_process>
        <observers>
            <Test_Mymodule_Hook>
                <type>singleton</type>
                <class>Test_Mymodule_Model_Observer</class>
                <method>specialpricediscount</method>
            </Test_Mymodule_Hook>
        </observers>
    </salesrule_validator_process>
</events>
</global> 

【讨论】:

我的方法中需要写什么样的代码。 ?感谢 Emipro 抽出宝贵时间。【参考方案2】:

我终于得到了我的问题的答案。在这里,我在应用您的优惠券后提供更新税的代码,如果总计为零,那么它也会更新税。 在全局节点内的 config.xml 中编写以下代码。

    <events>
         <sales_quote_collect_totals_after>
            <observers>
                <NamespaceModulename>
                    <type>singleton</type>
                    <class>Namespace_Modulename_Model_Observer</class>
                    <method>updateTaxAfterDiscountApplied</method>
                </NamespaceModulename>
            </observers>
        </sales_quote_collect_totals_after> 
    </events>

创建observer.php并添加以下方法:

//Apply tax after discount even if grand total 0.
public function updateTaxAfterDiscountApplied()
   
    $billing_data = Mage::app()->getRequest()->getPost('billing', array());
    $shipping_data = Mage::app()->getRequest()->getPost('shipping', array());

    $quote = Mage::getModel('checkout/cart')->getQuote();
    $coupon_code = $quote->getCouponCode();

    if($coupon_code)
    
        $coupon_rule_id = $quote->getAppliedRuleIds();          
        if($coupon_rule_id)
            $con = Mage::getSingleton('core/resource')->getConnection('core_read'); // fetching custom amount value to calculate with tax
            $sale_rule_result = $con->fetchAll("SELECT * FROM salesrule where rule_id=".$coupon_rule_id);
            foreach($sale_rule_result as $rule)
                $tax_calculation_based_on_price = $rule['tax_calculation_price'];               
            
               
        $country = $billing_data['country_id'];
        $region_id = $billing_data['region_id'];
        $TaxRequest  = new Varien_Object();
        $TaxRequest->setCountryId( $country );
        $TaxRequest->setRegionId( $region_id );
        //$TaxRequest->setPostcode( $postcode );
        $TaxRequest->setStore( Mage::app()->getStore() );
        $TaxRequest->setCustomerClassId(3);
        $TaxRequest->setProductClassId(5);  

        $taxCalculationModel = Mage::getSingleton('tax/calculation');
        $rate = $taxCalculationModel->getRate($TaxRequest);
        $tax_percentage = (($tax_calculation_based_on_price * $rate)/100);
        $q=$quote;
        $f=0;
        foreach ($q->getAllAddresses() as $address) 
        if($f)continue;
            $address->setTaxAmount($tax_percentage);
            $address->setBaseTaxAmount($tax_percentage);
            Mage::log('ww'.$address->getTaxAmount(),null,'billing.log');
            Mage::log('pw'.$q->getTaxAmount(),null,'billing.log');
            $address->setGrandTotal($address->getGrandTotal() + $address->getTaxAmount());
            $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseTaxAmount());
                $f=1;
                       
     
 

有关 Magento Events 备忘单的更多信息,请点击以下链接: https://www.nicksays.co.uk/magento-events-cheat-sheet-1-8/

谢谢!

【讨论】:

以上是关于折扣后如果总计为 0,则需要根据自定义价格字段计算税款并添加到购物车页面的总计中的主要内容,如果未能解决你的问题,请参考以下文章

有参无返回值方法-计算商品折扣后价格并打印

Jira scriptrunner脚本字段:在自定义字段上,计算其他自定义字段的值并显示总计

课堂练习---最低价格买书

基于 Woocommerce 3 中的 2 个自定义字段的产品正常价格计算

PowerQuery处理透视表总计行不能自定义计算

Flutter Dart:模型类字段内的动态关系