I have added discount from a custom module that I made.I am giving the observer's code below.Its working fine on the Cart page but tax is not getting added on Checkout Page. Getting paypal error: "PayPal gateway has rejected request. The totals of the cart item amounts do not match order amounts (#10413: Transaction refused because of an invalid argument. See additional error messages for details)." during checkout.
class Hs_Customcartdiscount_Model_Observer {
const XML_PATH_MODULE_ENABLE = 'customcartdiscount/customcartdiscount_group/enable';
const XML_PATH_DISCOUNT_AMOUNT = 'customcartdiscount/customcartdiscount_group/discount';
public function setDiscount($observer) {
if(Mage::getStoreConfig(self::XML_PATH_MODULE_ENABLE)){
$quote = $observer->getEvent()->getQuote();
$quoteid = $quote->getId();
$discountAmount =floor($quote->getBaseSubtotal()/100) * Mage::getStoreConfig(self::XML_PATH_DISCOUNT_AMOUNT);
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();
}
}
}
}
}
}
two screenshots of cart page and checkout page: cart page checkout page
Please someone help me.