Magento一个订单的多个优惠券代码,无需扩展 [英] Magento Multiple coupon codes for one order without extension

查看:65
本文介绍了Magento一个订单的多个优惠券代码,无需扩展的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经工作了3天,试图在一个订单中应用多个优惠券代码.

I have been working for 3 days trying to apply multiple coupon codes in a single order.

我知道有一些可用的模块. 但是我不想花钱购买模块.我需要一些自定义代码,以便可以在一个订单中应用多个优惠券代码.

I know there are modules which are available for that. But I don't want to invest money in purchasing a module. I want some custom code so that I can apply more than 1 coupon code in the single order.

推荐答案

要添加2个优惠券代码, 我所做的就是这样:

For adding 2 coupon codes, what i did was like this:

1)在sales_flat_quote表中添加coupon_code2列

1) Add column coupon_code2 in the sales_flat_quote table

ALTER TABLE sales_flat_quote

ADD( coupon_code2 varchar(255) )";

ADD ( coupon_code2 varchar(255) )";

2)要添加新的优惠券代码2,只需将其保存在报价中:

2) To add your new coupon code 2, just save it in quote:

Mage::getSingleton('checkout/cart')->getQuote()->setCouponCode2($coupon_code)->save();

3)最后,为了计算优惠券代码,我在观察者文件中添加了该功能: /magento/app/code/core/Mage/Sales/Model/Observer.php

3) And at last to calculate that coupon code i have added the function in observer file: /magento/app/code/core/Mage/Sales/Model/Observer.php

 public function setDiscountCouponCode2(Varien_Event_Observer $observer)
{
    $couponCode2 = $observer->getEvent()->getQuote()->getCouponCode2();

    $oCoupon = Mage::getModel('salesrule/coupon')->load($couponCode2, 'code');
    $oRule = Mage::getModel('salesrule/rule')->load($oCoupon->getRuleId());
    $ruleData = $oRule->getData();
    $flag =0;
    if(isset($ruleData['product_ids'])){
        $product_ids = $ruleData['product_ids'];
        foreach(Mage::getSingleton('checkout/session')->getQuote()->getAllItems() as $_item){
                if($product_ids == $_item->getProductId()){
                        $flag = 1;
                }
        }
    }


if($flag){
        $ruleSimpleAction = $ruleData['simple_action'];
        $ruleDiscountAmount = $ruleData['discount_amount'];


        $quote=$observer->getEvent()->getQuote();
        $quoteid=$quote->getId();

        $discountAmount=$ruleDiscountAmount;
        if($quoteid) {
            if($discountAmount>0) {
                $total=$quote->getBaseSubtotal();
                $quote->setSubtotal(0);
                $quote->setBaseSubtotal(0);

                $quote->setSubtotalWithDiscount(0);
                $quote->setBaseSubtotalWithDiscount(0);

                $quote->setGrandTotal(0);
                $quote->setBaseGrandTotal(0);


                $canAddItems = $quote->isVirtual()? ('billing') : ('shipping'); 
                foreach ($quote->getAllAddresses() as $address) {

                    $address->setSubtotal(0);
                    $address->setBaseSubtotal(0);

                    $address->setGrandTotal(0);
                    $address->setBaseGrandTotal(0);

                    $address->collectTotals();

                    $quote->setSubtotal((float) $quote->getSubtotal() + $address->getSubtotal());
                    $quote->setBaseSubtotal((float) $quote->getBaseSubtotal() + $address->getBaseSubtotal());

                    $quote->setSubtotalWithDiscount(
                        (float) $quote->getSubtotalWithDiscount() + $address->getSubtotalWithDiscount()
                    );
                    $quote->setBaseSubtotalWithDiscount(
                        (float) $quote->getBaseSubtotalWithDiscount() + $address->getBaseSubtotalWithDiscount()
                    );

                    $quote->setGrandTotal((float) $quote->getGrandTotal() + $address->getGrandTotal());
                    $quote->setBaseGrandTotal((float) $quote->getBaseGrandTotal() + $address->getBaseGrandTotal());

                    $quote ->save(); 

                    $quote->setGrandTotal($quote->getBaseSubtotal()-$discountAmount)
                        ->setBaseGrandTotal($quote->getBaseSubtotal()-$discountAmount)
                        ->setSubtotalWithDiscount($quote->getBaseSubtotal()-$discountAmount)
                        ->setBaseSubtotalWithDiscount($quote->getBaseSubtotal()-$discountAmount)
                        ->save(); 

                    if($address->getAddressType()==$canAddItems) {
                        $address->setSubtotalWithDiscount((float) $address->getSubtotalWithDiscount()-$discountAmount);
                        $address->setGrandTotal((float) $address->getGrandTotal()-$discountAmount);
                        $address->setBaseSubtotalWithDiscount((float) $address->getBaseSubtotalWithDiscount()-$discountAmount);
                        $address->setBaseGrandTotal((float) $address->getBaseGrandTotal()-$discountAmount);
                        if($address->getDiscountDescription()){
                            $address->setDiscountAmount(-($address->getDiscountAmount()-$discountAmount));
                            $address->setDiscountDescription($address->getDiscountDescription().', Instant Exchange -'.$couponCode2);
                            $address->setBaseDiscountAmount(-($address->getBaseDiscountAmount()-$discountAmount));
                        }else {
                            $address->setDiscountAmount(-($discountAmount));
                            $address->setDiscountDescription('Instant Exchange -'.$couponCode2);
                            $address->setBaseDiscountAmount(-($discountAmount));
                        }
                        $address->save();
                    }
                }

                foreach($quote->getAllItems() as $item){
                    $rat=$item->getPriceInclTax()/$total;
                    $ratdisc=$discountAmount*$rat;
                    $item->setDiscountAmount(($item->getDiscountAmount()+$ratdisc) * $item->getQty());
                    $item->setBaseDiscountAmount(($item->getBaseDiscountAmount()+$ratdisc) * $item->getQty())->save();
                }
            }
        }
}else{
        Mage::getSingleton('checkout/cart')->getQuote()->setCouponCode2('')->save();
    }
}

4)最后通过更新同一文件中的setQuoteCanApplyMsrp函数来调用上述函数:

4) at last call the above function by updating the setQuoteCanApplyMsrp function in the same file:

 public function setQuoteCanApplyMsrp(Varien_Event_Observer $observer)
{
    /** @var $quote Mage_Sales_Model_Quote */
    $quote = $observer->getEvent()->getQuote();

    $canApplyMsrp = false;
    if (Mage::helper('catalog')->isMsrpEnabled()) {
        foreach ($quote->getAllAddresses() as $adddress) {
            if ($adddress->getCanApplyMsrp()) {
                $canApplyMsrp = true;
                break;
            }
        }
    }
    $this->setDiscountCouponCode2($observer);
    $quote->setCanApplyMsrp($canApplyMsrp);
}

这篇关于Magento一个订单的多个优惠券代码,无需扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆