4

1 回の注文で複数のクーポン コードを適用しようとして 3 日間作業を続けています。

そのために利用できるモジュールがあることは知っています。しかし、モジュールの購入にお金を投資したくありません。1 回の注文で複数のクーポン コードを適用できるように、カスタム コードが必要です。

4

1 に答える 1

2

2 つのクーポン コードを追加するには、次のようにしました。

1) sales_flat_quote テーブルに、coupon_code2 列を追加します。

ALTER TABLE sales_flat_quote

ADD ( coupon_code2varchar(255) )";

2) 新しいクーポン コード 2 を追加するには、引用符で保存します。

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

3) そして最後にそのクーポン コードを計算するために、オブザーバー ファイルに関数を追加しました: /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 関数を更新して、上記の関数を呼び出します。

 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);
}
于 2013-04-01T04:31:17.347 に答える