Home > Magento > Fixing “Catalog Price Rules” cart issue in Magento 1.4.1.0

Fixing “Catalog Price Rules” cart issue in Magento 1.4.1.0

June 29th, 2010

After recently upgrading one of my stores running Magento Commerce I found out the the latest version (at this time 1.4.1.0) had a major bug. Don’t want to sound too harsh, but unfortunately Magento’s support was again awful – there have been one thread on the forum and one issue in their bug tracking system for a while now (almost two weeks if not more) and still no update, although as I said the bug has quite an impact – even tweet’ed the problem to @magento and haven’t gotten any reply (again it’s not the first time). Yes, the product is free, yes it’s open source, but I think a bit of transparency and better communication could come to their advantage.

Bug details/behavior

So, updated from 1.4.0.1 to 1.4.1.0, everything looks fine, catalog price rules are being applied in the catalog (categories and product pages), but when adding the product to the cart the quote item price was the regular price not the special one.

Solution/Fix

After a few hours playing with the rules, observer and other core elements I found the problem. A big “thank you” goes to “myself” who posted the second comment for the issue mentioned above. The problem was within the CatalogRule Observer, when fetching the ID of the Customer Group. Here’s how to fix it:

1 – create the following folders in your Magento distro: app/code/local/Mage/CatalogRule/Model
2 – copy app/code/core/Mage/CatalogRule/Model/Observer.php to app/code/local/Mage/CatalogRule/Model
3 – open the new/copied file and go to line 105. Change this code:

        if ($observer->hasCustomerGroupId()) {
            $gId = $observer->getEvent()->getCustomerGroupId();
        } elseif ($product->hasCustomerGroupId()) {
            $gId = $product->hasCustomerGroupId();
        } else {
            $gId = Mage::getSingleton('customer/session')->getCustomerGroupId();
        }

to:

        if ($observer->hasCustomerGroupId()) {
            $gId = $observer->getEvent()->getCustomerGroupId();
        } elseif ($product->hasCustomerGroupId()) {
            $gId = $product->getCustomerGroupId();
        } else {
            $gId = Mage::getSingleton('customer/session')->getCustomerGroupId();
        }

To be more precise, you have to change hasCustomerGroupId to getCustomerGroupId on line 105.

You can now enjoy your store again!

Magento

  1. February 6th, 2011 at 15:16 | #1

    I think I may have found a bit of a ‘hacky’ solution to this in your local observer.php file, find line 118 and replace…

    This:

    $product->setFinalPrice($finalPrice);

    With this:

    // Check if the user is logged in before applying discount
    $session = Mage::getSingleton(‘customer/session’, array(‘name’=>’frontend’));
    if ($session->isLoggedIn()) {
    $product->setFinalPrice($finalPrice);
    }

    It’s just an if statement which will only apply all rules to only logged in customers. I guess it’s only ok if you don’t care about adding any other catalog price rules.

  2. Cristi
    February 7th, 2011 at 09:42 | #2

    Adam, if I remember correctly there was a problem with Logged in/Non-logged in users and catalog price rules. Not sure if I’m right, but I think the non-logged in group ID was 0 and that was not being tested properly somewhere in the code – there was a !condition, instead of checking for null or false, which made !0 to evaluate as true as well – or something like that :)

  3. February 10th, 2011 at 00:06 | #3

    Excellent, thank you!

  4. Attila F.
    February 15th, 2011 at 12:21 | #4

    Hi!

    It’s is working on my site!
    Magento ver. 1.4.1.1

    Thank you;)

    You saved me many time!

    Regards

  5. February 22nd, 2011 at 18:10 | #5

    Perfect! Thanks!

  6. February 26th, 2011 at 07:13 | #6

    Okay, I found the issue. In the upgrade from 1.4.0.1 to 1.4.1.1 the shopping cart price rule adds a new dropdown box for selecting No Coupoon or Specific Coupon. This was missing from the admin page, so any coupon added was defaulting to No Coupon. So any coupon code entered was applied to all orders.

    If you have this issue go to \app\code\core\Mage\Adminhtml\Block\Promo\Quote\Edit\Tab\Main.php insert this about line 166 before the -

    $fieldset->addField(’coupon_code’, ‘text’, array(

    $fieldset->addField(’coupon_type’, ‘select’, array(
    ‘name’ => ‘coupon_type’,
    ‘label’ => Mage::helper(’salesrule’)->__(’Coupon’),
    ‘required’ => true,
    ‘options’ => Mage::getModel(’salesrule/rule’)->getCouponTypes(),
    ));

  7. March 2nd, 2011 at 14:28 | #7

    Hi,

    I know this isnt the same issue but as its in the same area I thought you may have come across it, basically when I try to add shopping cart price rules in the backend, I get as far as adding conditions but then it always kicks me back to the dashboard when I try selecting the condition. This happens in IE, FF and Safari. Im on V1.4.2

    Have you come across this issue and do you have any suggestions?

    Thanks

  8. Cristi
    March 2nd, 2011 at 23:17 | #8

    Mark, that never happened to me and I think I’ve got 2 or 3 1.4.2′s. try a fresh install of magento 1.4.2 to test this. if it persist, it might a problem with their interface/javascripts. however, i really doubt that.

  9. Marcel
    March 7th, 2011 at 16:06 | #9

    @Mark
    I think you shoud ask your hosting if mod_security is enabled on your server, also check error_log for what kind of error you get

  10. March 16th, 2011 at 11:56 | #10

    Thanks Cristi for this bugfix! It works fine

  11. March 16th, 2011 at 21:46 | #11

    Thanks that fixed my checkout problem!
    I’ve got a similar problem (related problem?) where the price rule price shows up fine in the product page and the checkout (now) but in the list page (or category page) it only shows regular price (or with a sale price if one is set for that product).

  12. Marc
    March 23rd, 2011 at 14:59 | #12

    @Cristi

    Hi Cristi,

    To avoid the “after a couple of days set back wrong again”, how do i have to set my cron? Can it be changed into the /app/code/core/Mage/CatalogRule/etc/config.xml file?

    0 1 * * *

  13. Cristi
    March 23rd, 2011 at 17:18 | #13

    not sure I really understand the question, but yes, you can change the cron schedule in that file. the only inconvenience would be that it might get overwritten on the next upgrade, so you might want to add the same structure to one of your own local extensions:
    crontab / jobs / catalogrule_apply_all / schedule / cron_expr = 0 1 * * * Haven’t tested this but it should overwrite the settings in /app/code/core/Mage/CatalogRule/etc/config.xml

  14. Marc
    March 24th, 2011 at 11:09 | #14

    @Cristi

    Well your solution works, but when i read peoples comments then it seems, after about 3 days, it stops working. Then after reindex it works again. By changing the cronjob this can be fixed?

    I’m expecting no updates for the shop, but what do i need to change the cron into? Im not really into cronjobs.

    On line 150 of config.xml: schedule cron_expr 0 1 * * * /cron_expr /schedule

    Or do i need to set the cronjob on the server by using Direct Admin?
    If so, exactly how do I need to do this?

  15. Cristi
    March 24th, 2011 at 12:20 | #15

    Well, first of all Magento needs the cron to run every 5 minutes, regardless of the catalog rules. So you DO have to set that up on your server. You can either ask support or do it yourself, the idea is that it has to run every 5 minutes. More about this here: http://www.magentocommerce.com/wiki/groups/227/setting_up_magento_in_cron and here http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/how_to_setup_a_cron_job

    Regarding the “after 3 days it stops working” comments, I honestly don’t take them as general truths. If something works for a day or two, I don’t see any reason why it could fail exactly on the 3rd day – unless you run our of memory, disk space or who knows what else. For instance, I have quite a few Magneto installations, and I never ever had a single problem like this. Ok, catalog rules stopped working on the 1.4.1.0 upgrade, but with the fix in this post everything was back to normal. So, my advice is to setup magento properly, install the cronjon on the server, apply this patch if you’re on 1.4.1.0, and keep an eye on things. If you experience problems with catalog rules not being applied after midnight, until 1 AM (usually orders that are placed during 12 and 1 AM will have the regular prices and not the discounted/special prices), try changing the line you mentioned in /app/code/core/Mage/CatalogRule/etc/config.xml to 0 0 * * * which would make the cron run at midnight instead of 1 AM.

  16. Marc
    March 24th, 2011 at 12:58 | #16

    Okee, thanks allot, I will keep an eye on the test I have done and see if it works for at least 3 days lol. Else i will try out the cronjob. Never noticed it was into the root.

    Thanks again for ur time.

    Cheers Marc

  17. March 24th, 2011 at 13:41 | #17

    @Marc
    Hi! I think I have the same problem Marc has. I keep resetting the catalog price rules, and it seems to work. But after a while (I have not timed yet) it goes wrong again. The correct prices are displayed, but when a customer adds it to his cart the original price is displayed. So I think Marc is right about this.

    Marc, you mentioned reindexing, what index are we talking about: Product Prices?

  18. Cristi
    March 24th, 2011 at 14:24 | #18

    Menno, is your cronjob setup properly and running? If it is, then you have a problem.

  19. jaumepc
    May 9th, 2011 at 15:14 | #19

    thank you! works fine!!

  20. May 12th, 2011 at 12:14 | #20

    You are awesome. This fixed the stupid thing for me straight away. Magento is really starting to bug me.

  21. May 14th, 2011 at 17:23 | #21

    Hello all, thanks for your informative comments.
    1.4.1.0 here, and my catalog price is showing ok on the listing page (list or grid) but the detail page shows no special price. Moreover, if I click on “add to cart” either from detail page or from listing page the product is listed in my shopping cart without its special price…I have tried everything even a cron that runs every 8 hours…it works for 24 to 36 hours then special price is losted on the detail page. Thanks for your input.

  22. May 14th, 2011 at 18:26 | #22

    For 1.4.1.0 I found out that this code does not work, but creating a cron to reindex and also another cron to run config.xml solved the issue. Info on how to create a cron to reindex your website can be found at http://www.yireo.com/tutorials/magento/magento-administration/663-magento-14-cronjobs

  23. May 16th, 2011 at 17:51 | #23

    NOPE!!! TWO days after applying the fixes and running the cron the issue is back on 1.4.1.0 Any ideas on how to fix this issue? It was working just fine for months! Perhaps some of the new extensions I installed is creating this issue. The last to install were:
    Finz_it_Social_Promotion_Tools
    Beecoder_Beeshopy
    Auguria_Sponsorship
    I will research further…

  24. May 16th, 2011 at 18:52 | #24

    While I wait for two days to confirm whether the issue is fixed I also applied the following suggestion: http://magentoexpert.co.uk/tag/catalog-price-rules/

  25. May 16th, 2011 at 18:54 | #25

    so far everything looks great at http://www.kerainfusion.com I manually re-applied the catalog prices and are waiting for the next two days window which is the time it take to delete my special prices from the product list….

  26. Joy
    June 20th, 2011 at 23:30 | #26

    Please HELP!!! I cannot get the discounted prices to display in my shopping cart. I am using version 1.4.2.0 & the code in app/code/core/Mage/CatalogRule/Model/Observer.php is:

    if ($observer->hasCustomerGroupId()) {
    $gId = $observer->getEvent()->getCustomerGroupId();
    } elseif ($product->hasCustomerGroupId()) {
    $gId = $product->getCustomerGroupId();
    } else {
    $gId = Mage::getSingleton(‘customer/session’)->getCustomerGroupId();
    }
    So it should not need changing

  27. Cristi
    June 21st, 2011 at 09:43 | #27

    1.4.2.0 doesn’t have this problem, thus it doesn’t need the fix explained in this post. however, make sure the cronjob is running properly and that the catalog rule is valid – the conditions actually generate a set of products.

  28. August 5th, 2011 at 12:20 | #28

    We run the website on Magento 1.5.0.1,
    and application of catalog price rules are a real nightmare, it is completely random, sometimes we apply the rule ten times and it still doesn’t work, and finally works the day after, sometimes it never works at all, sometimes the price is correct on the product card, but when getting to the checkout, the price comes back to regular!! And finally sometimes, we have a sale rate up to 70% when we applied only 50%.

    Does somebody have the same kind of problem?

  29. Rikki
    September 6th, 2011 at 08:31 | #29

    @Biof
    I’m having the same problem on 1.5.1.0 – the discount just doesn’t get displayed in the checkout review step, where in the cart is says it’s applied fine. Seems to only occur with Specific Coupon promotions.

  30. Cristi
    September 6th, 2011 at 11:12 | #30

    Biof & Rikki, as the title of the post says, this patch is only for Mage 1.4.1.0. This has been fixed in 1.4.2. If your cart rules don’t get displayed, you’re probably doing something wrong – also, please note that bundle products and cart rules are quite messy.

  31. Heather
    December 20th, 2011 at 11:18 | #31

    Thank you!

  32. January 9th, 2012 at 12:03 | #32

    We found that the catalog price rules in 1.5.1.0 are getting “lost” after some time, meaning they are not applied any more (thoogh the backend is saying they are applied).

    It looks like the catalog price index is causing this. You just have to push the “apply rules” button again and then it’s working until the next index.

    We’ve now set the price index to manual change and will observe it.

  33. Jordi
    January 16th, 2012 at 11:13 | #33

    Hi, I have this problem but I lose the rule in the product view.
    I have applied a 50% discount in all the catalog but, suddenly, once per two days the price in the list is the special one but in the product view I can’t see it!

    I have done your solution but the problem is not fixed!!

  34. Steve
    January 31st, 2012 at 03:12 | #34

    @Jordi
    We have the same issue. Running 1.5, and Catalogue Price Rules drop off every 24 hours. We have set up cron jobs, edited cron.php, and attempted to source solutions with absolutely no luck.

Comment pages
  1. No trackbacks yet.