Tuesday, December 20, 2011

Applying Custom discount amount in magento

Hi,

In few case you have to write a code so that custom discount as to apply to cart

either you can ave discount amount in Db or static i am showing the cod for static one

in your custom module etc/config.xml add this code in side global tag
<?xml version="1.0"?>
<config>
    <modules>
        <Sugarcode_Customdiscount>
            <version>1.0.10</version>
        </Sugarcode_Customdiscount>
    </modules>
    
    
    <global>
 
        <events>
        <!-- Création éventuelle du lien de parrainage lors de la commande -->
            <sales_quote_collect_totals_after>
                <observers>
                    <set_custom_discount_suagrcode>
                        <type>singleton</type>
                        <class>Sugarcode_Customdiscount_Model_Observer</class>
                        <method>setDiscount</method>
                    </set_custom_discount_suagrcode>
                </observers>
            </sales_quote_collect_totals_after>             
   
  </events>
        
    </global>

   
</config>

and inside model folder create file called Observer.php
(if only custom discount)

 <?php
/**
 * @category   Sugarcode
 * @package    Sugarcode_Customdiscount
 * @author     pradeep.kumarrcs67@gmail.com
 * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */
class Sugarcode_Customdiscount_Model_Observer
{

    
 public function setDiscount($observer)
    {
       $quote=$observer->getEvent()->getQuote();
       $quoteid=$quote->getId();
       $discountAmount=10;
    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) {
    //echo $address->setDiscountAmount; exit;
     $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().', Custom Discount');
     $address->setBaseDiscountAmount(-($address->getBaseDiscountAmount()-$discountAmount));
     }else {
     $address->setDiscountAmount(-($discountAmount));
     $address->setDiscountDescription('Custom Discount');
     $address->setBaseDiscountAmount(-($discountAmount));
     }
     $address->save();
    }//end: if
   } //end: foreach
   //echo $quote->getGrandTotal();
  
  foreach($quote->getAllItems() as $item){
                 //We apply discount amount based on the ratio between the GrandTotal and the RowTotal
                 $rat=$item->getPriceInclTax()/$total;
                 $ratdisc=$discountAmount*$rat;
                 $item->setDiscountAmount(($item->getDiscountAmount()+$ratdisc) * $item->getQty());
                 $item->setBaseDiscountAmount(($item->getBaseDiscountAmount()+$ratdisc) * $item->getQty())->save();
                
               }
            
                
            }
            
    }
 }

} 

1 comment:

  1. if there is any issue while you applied tax you can contact me pradeep.kumarrcs67@gmail.com

    ReplyDelete