Grand Total not updated when discount code is applied

The question:

There are 2 types of Discounts (Shopping Cart Rules) Working on the Website right now:

  1. Coupon Codes – Working Absolutely Fine BUT – Subtotal does not get Updated. Ex: 10% Off on Rs. 500 and Above – When I apply the Coupon Code, it shows perfectly before Subtotal but the Grand Total still remains the same(without discount)

  2. Without Coupon Code Discount – Working Only On Checkout Page after I select a Payment Method. – Eg: ABC Product has a Coupon Attached to it giving Free Shipping on it BUT this is not Reflecting in My Basket Subtotal and is Only Visible in Checkout Page’s Subtotal upon selecting a Payment Method – NOTE: The Subtotal where Shipping Charges are currently visible used to Show a Value of ZERO when ABC Product was added.

    1. IMP NOTE. This Issue of Grandtotal related to Config because this was Non-Existent and suddenly popped up after Migration to a nginx Server. – The Server Admin has thoroughly verified and is sure of no errors on Server Side.

    2. I have cross checked all Settings and Discount Rules in Backend – No Defaults found

  3. No Tax Calculation is used on the Website

Thank You for Reading the above and I hope you, the reader would be able to contribute towards resolving this.

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

Please follow the below steps might be useful.

Path:- app/code/core/Mage/Sales/Model/Config/Ordered.php

Comment this code

    /**
     * Aggregate before/after information from all items and sort totals based on this data
     *
     * @return array
     */

   protected function _getSortedCollectorCodes()
    {
        if (Mage::app()->useCache('config')) {
            $cachedData = Mage::app()->loadCache($this->_collectorsCacheKey);
            if ($cachedData) {
                return unserialize($cachedData);
            }
        }
        $configArray = $this->_modelsConfig;
        // invoke simple sorting if the first element contains the "sort_order" key
        reset($configArray);
        $element = current($configArray);
        if (isset($element['sort_order'])) {
            uasort($configArray, array($this, '_compareSortOrder'));
        } else {
            foreach ($configArray as $code => $data) {
                foreach ($data['before'] as $beforeCode) {
                    if (!isset($configArray[$beforeCode])) {
                        continue;
                    }
                    $configArray[$code]['before'] = array_unique(array_merge(
                        $configArray[$code]['before'], $configArray[$beforeCode]['before']
                    ));
                    $configArray[$beforeCode]['after'] = array_merge(
                        $configArray[$beforeCode]['after'], array($code), $data['after']
                    );
                    $configArray[$beforeCode]['after'] = array_unique($configArray[$beforeCode]['after']);
                }
                foreach ($data['after'] as $afterCode) {
                    if (!isset($configArray[$afterCode])) {
                        continue;
                    }
                    $configArray[$code]['after'] = array_unique(array_merge(
                        $configArray[$code]['after'], $configArray[$afterCode]['after']
                    ));
                    $configArray[$afterCode]['before'] = array_merge(
                        $configArray[$afterCode]['before'], array($code), $data['before']
                    );
                    $configArray[$afterCode]['before'] = array_unique($configArray[$afterCode]['before']);
                }
            }
            uasort($configArray, array($this, '_compareTotals'));
        }
        $sortedCollectors = array_keys($configArray);
        if (Mage::app()->useCache('config')) {
            Mage::app()->saveCache(serialize($sortedCollectors), $this->_collectorsCacheKey, array(
                    Mage_Core_Model_Config::CACHE_TAG
                )
            );
        }
        return $sortedCollectors;
    }

Replace the above code with:

/****
 Note: While applying coupon code, Totals are not updating due to uasort not working in php7 then
 modified the _getSortedCollectorCodes() function as shown below. 

 ****/
protected function _getSortedCollectorCodes()
{
    if (Mage::app()->useCache('config')) {
        $cachedData = Mage::app()->loadCache($this->_collectorsCacheKey);
        if ($cachedData) {
            return unserialize($cachedData);
        }
    }
    $configArray = $this->_modelsConfig;
    // invoke simple sorting if the first element contains the "sort_order" key
    reset($configArray);
    $element = current($configArray);
    Mage::log(var_export($element,true));
    if (isset($element['sort_order'])) {
        uasort($configArray, array($this, '_compareSortOrder'));
    } else {
        foreach ($configArray as $code => $data) {
            foreach ($data['before'] as $beforeCode) {
                if (!isset($configArray[$beforeCode])) {
                    continue;
                }
                $configArray[$code]['before'] = array_unique(array_merge(
                    $configArray[$code]['before'], $configArray[$beforeCode]['before']
                ));
                $configArray[$beforeCode]['after'] = array_merge(
                    $configArray[$beforeCode]['after'], array($code), $data['after']
                );
                $configArray[$beforeCode]['after'] = array_unique($configArray[$beforeCode]['after']);
            }
            foreach ($data['after'] as $afterCode) {
                if (!isset($configArray[$afterCode])) {
                    continue;
                }
                $configArray[$code]['after'] = array_unique(array_merge(
                    $configArray[$code]['after'], $configArray[$afterCode]['after']
                ));
                $configArray[$afterCode]['before'] = array_merge(
                    $configArray[$afterCode]['before'], array($code), $data['before']
                );
                $configArray[$afterCode]['before'] = array_unique($configArray[$afterCode]['before']);
            }
        }
        foreach ($configArray as $code => $data) {
           $largest_small = $smallest_large = 0;
           foreach ($data['after'] as $afterCode) {
              if(isset($configArray[$afterCode]['sort_order']) && $largest_small < $configArray[$afterCode]['sort_order'])
                 $largest_small = $configArray[$afterCode]['sort_order'];
           }
           foreach ($data['before'] as $beforeCode) {
              if(isset($configArray[$beforeCode]['sort_order']) && ($smallest_large == 0 || $configArray[$beforeCode]['sort_order'] < $smallest_large)) 
                 $smallest_large = $configArray[$beforeCode]['sort_order'];
           }
           if($smallest_large <= $largest_small+1){
              $add = $largest_small+1-$largest_small;
              if($smallest_large == 0) $smallest_large = $largest_small+1;
              foreach ($configArray as $code1 => $data1) {
                 if(!isset($data1['sort_order'])) break;
                 if($smallest_large <= $data1['sort_order'])
                    $configArray[$code1]['sort_order'] += $add;
               }
           }
           $configArray[$code]['sort_order'] = $largest_small+1;
        }
        uasort($configArray, array($this, '_compareSortOrder'));
    }
    $sortedCollectors = array_keys($configArray);
    if (Mage::app()->useCache('config')) {
        Mage::app()->saveCache(serialize($sortedCollectors), $this->_collectorsCacheKey, array(
                Mage_Core_Model_Config::CACHE_TAG
            )
        );
    }
    return $sortedCollectors;
}

Please check now. i hope it will useful for you. thanks

Method 2

Had this same exact problem (#1) on CE 1.9 running PHP 7, applying the Inchoo “PHP 7 compatibility extension for Magento 1” solved the issue!

https://github.com/Inchoo/Inchoo_PHP7

Method 3

I have the same issue with Magento 1.9.3.2 and I just downgraded my PHP from version 7.0 to 5.6 and it fixed the problem instantly. 😀

Method 4

Seems like it is an issue with PHP 7 / uasort function. In another ticket it you told that you have switched server to nginx and most probably you have also updated php.

You can see more detailed answer why it’s happening here – https://stackoverflow.com/questions/34281113/the-different-behavior-of-the-function-uasort-in-php-5-5-and-php-7-0

And you can find parth how to solve this problem here – https://stackoverflow.com/questions/9194281/sort-algorithm-magento-checkout-totals-sorted-wrongly-causing-wrong-shipping-ta (Answer by Alex)

Method 5

If you upgrade your server to php 7 then this issue arise.

This module fixed things up for me: https://github.com/hartmut-co-uk/magento-php7-totals-fix


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment