2013-02-28 39 views
4

我一直工作3天,試圖以單一訂單申請多個優惠券代碼。Magento一張訂單不含延期的多個優惠券代碼

我知道那裏有可用的模塊。 但我不想投資購買模塊。我想要一些自定義代碼,以便我可以在單一訂單中應用多於一個的優惠券代碼。

+0

看看@ http://www.magentocommerce.com/boards/viewthread/33532/ – 2013-02-28 14:46:30

+0

Sry基因RS但它無濟於事。你有任何其他解決方案嗎? – djmak 2013-02-28 15:03:29

+0

對不起,目前沒有其他解決方案。我也需要購買/創建一個,所以讓我知道你找到了什麼。 – 2013-02-28 15:14:15

回答

2

對於加入2個優惠券代碼, 我所做的是這樣的:

1)添加列coupon_code2在sales_flat_quote表

ALTER TABLE sales_flat_quote 

ADD( coupon_code2 VARCHAR(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); 
} 
+0

嗨@djmak,我發現了一個應稅產品的問題。爲了逝去的是確定的,但在發票貼現量由適當增加由於稅收EG 小計\t $ 134.99 折扣\t $ 25.84 稅\t $ 11.31 總計\t $ 120.46 但優惠額度只有25 $,爲什麼呢? – MagentoDiary 2013-04-03 11:21:45