5

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.

5 Answers 5

17

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

9
  • 2
    Usefull to me thanks for the answer @NagarajuKasa Oct 18, 2017 at 9:45
  • 1
    oh great, sounds good happy diwali Oct 18, 2017 at 9:50
  • 1
    Hahahaha Same to you Oct 18, 2017 at 9:50
  • 1
    Thanks, Its works for me can you add a description why it happened. Dec 24, 2017 at 12:45
  • 1
    Thank you so much!!!
    – Team18
    Jul 13, 2019 at 13:51
6

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

1
  • 1
    This should be correct answer, not a changes in a core code.
    – Martin
    Jan 6, 2018 at 11:49
1

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. :D

0

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)

0

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.