Using this post you can add custom discount to your magento cart total. You can also add discount to cheapest item in cart. Like there are 5 items in your cart and you want to add 30% discount to cheapest item this post will help you. Create new module with following files in your magento. Let's see step by step how this will work.
Download Module
1. Directories and files needed for the module
2. Content of HK_Customdiscount.xml
3. etc/config.xml
4. Model/Observer.php
That's it. Hope you are enjoying this post.
Download Module
1. Directories and files needed for the module
app/code/local/HK/Customdiscount app/code/local/HK/Customdiscount/etc app/code/local/HK/Customdiscount/etc/config.xml app/code/local/HK/Customdiscount/Model app/code/local/HK/Customdiscount/Model/Observer.php app/etc/modules/HK_Customdiscount.xml
2. Content of HK_Customdiscount.xml
<?xml version="1.0"?>
<config>
<modules>
<HK_Customdiscount>
<active>true</active>
<codePool>local</codePool>
</HK_Customdiscount>
</modules>
</config>
3. etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<HK_Customdiscount>
<version>0.1.0</version>
</HK_Customdiscount>
</modules>
<global>
<events>
<sales_quote_collect_totals_after>
<observers>
<set_custom_discount>
<type>singleton</type>
<class>HK_Customdiscount_Model_Observer</class>
<method>setDiscount</method>
</set_custom_discount>
</observers>
</sales_quote_collect_totals_after>
</events>
</global>
</config>
4. Model/Observer.php
<?php
class HK_Customdiscount_Model_Observer extends Varien_Object
{
public function setDiscount($observer)
{
$priceArray;
$quote = $observer->getEvent()->getQuote();
/*Enable this code for 30% on cheapest product*/
/*foreach ($quote->getAllVisibleItems() as $item) {
$_incl = Mage::helper('checkout')->getPriceInclTax($item);
$itmQty = $item->getQty()>1?$item->getQty():1;
for($cnt=1; $cnt <= $itmQty; $cnt++){
if (Mage::helper('weee')->typeOfDisplay($item, array(0, 1, 4), 'sales') && $item->getWeeeTaxAppliedAmount()){
$priceArray[] = $_incl + Mage::helper('weee')->getWeeeTaxInclTax($item);
}else{
$priceArray[] = $_incl-$item->getWeeeTaxDisposition();
}
}
}
$percentage = 30;
$discountAmount = ($percentage / 100) * min($priceArray);*/
$discountAmount = 30;
$quoteid=$quote->getId();
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();
}
}
}
}
}
That's it. Hope you are enjoying this post.
