折扣后如果总计0则需要根据自定义价格字段计算税额并在购物车页面中加入总计

时间:2015-01-16 06:58:43

标签: php magento coupon

我创建了一张带有“固定金额”的优惠券,假设为100美元,我正在向购物车添加产品,价格为100美元。现在我已经在System-> configuration-> 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然后对于假设canada-&gt; ontario我的税率是12%然后它应该计算40%的12%并且加上总计。所以如何取税,以便我可以用tax_calculation_price计算它。 ?任何帮助欣赏。

2 个答案:

答案 0 :(得分:0)

您可以使用此观察者事件

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

答案 1 :(得分:0)

最后我得到了我的问题的答案。在这里,我提供的代码是在申请优惠券后更新税,如果总零,那么它也将更新税。  在全局节点内的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/

谢谢!