Magento Module issue

I took the code from a StackOverflow post to build a module to accept only certain coupons for customers with a certain email domain for Magento v 1.0.4.1 (Yes, I know it is old but we cannot upgrade due to core modifications by a contractor so do not ask)
 
This is the code (located in /app/code/local/NA/LimitCoupon/Module):
 
<?php
class NA_LimitCoupon_Model_Observer 
{
    protected $_domainsAllowed = array(array('COUPON1', 'email1.com'), 
                                        array('COUPON2', 'email2.com')
                                      );

    public function validate(Varien_Event_Observer $observer)
    {

$timestamp = date("m-d-Y H:i:s");
$msg = "Timestamp:".$timestamp;
$fp = fopen("/var/tmp/".__FUNCTION__.".txt", 'a');
fwrite($fp, $msg . "\n");
fclose($fp);

        try 
        {
            $this->validateRestriction($observer);
        }
        catch (Mage_Core_Exception $e) 
        {
            Mage::getSingleton('checkout/session')->addError($e->getMessage());
        }
        catch (Exception $e) 
        {
            Mage::getSingleton('checkout/session')->addError($this->__('Cannot apply the coupon code.'));
            Mage::logException($e);
        }
    }


    public function validateRestriction(Varien_Event_Observer $observer)
    {



        $errMsg = false;
        // Get the quote: 
        $quote = $event->getQuote();
        // obtain the code being used
        $code = $quote()->getCouponCode();
        // Get the current quote email
        $currentEmail = $quote()->getCustomer()->getEmail();
        $explodedEmail = explode('@', $currentEmail);

        // Get the domain from the email address
        $domain = array_pop($explodedEmail);

$timestamp = date("m-d-Y H:i:s");
$msg = "Timestamp:".$timestamp."\nCode: ".$code."\nCurrentEmail: ".$currentEmail."\nDomain: ".$domain;
$fp = fopen("/var/tmp/".__FUNCTION__.".txt", 'a');
fwrite($fp, $msg . "\n");
fclose($fp);

        switch($code) 
        {
            case 'COUPON1':
                // check if the email address is in the email1 domain        
                if ($domain !== $this->_domainsAllowed[$code]) 
                {
                   // Wrong domain
                   $errMsg = 'This coupon code is restricted to customers of EMAIL1';
                }
                break;
            case 'COUPON2':
                // check if the email address is in the email2 domain        
                if ($domain !== $this->_domainsAllowed[$code]) 
                {
                   // Wrong domain
                   $errMsg = 'This coupon code is restricted to customers of EMAIL2';
                }
                break;
        }
        // handle errors
        if ($errMsg) 
        {
            Mage::getSingleton('checkout/session')->addError($errMsg);
            $quote->setCouponCode('');
            $quote->collectTotals()->save();
        }
    }
 

Open in new window

And the module XML file (located in /app/etc/modules):
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <NA_LimitCoupon>
            <active>true</active>
            <codePool>local</codePool>
        </NA_LimitCoupon>
    </modules>
</config>

Open in new window

And the config.xml (located in /app/code/local/NA/LimitCoupon/etc):
 <?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <NA_LimitCoupon>
            <version>0.0.1</version>
        </NA_LimitCoupon>
    </modules>
    <global>
        <models>
            <module>
                <class>NA_LimitCoupon_Model</class>
            </module>
        </models>
        <events>
            <salesrule_validator_process>
                <observers>
                    <LimitCoupon_validate>
                        <type>singleton</type>
                        <class>module/observer</class>
                        <method>validate</method>
                    </LimitCoupon_validate>
                </observers>
            </salesrule_validator_process>
        </events>
    </global>
</config>
 

Open in new window


The issue is, it never goes into the code at all, hence the lack of anything written to the /var/tmp directory as it should be from my FWRITE commands. What am I doing wrong here?
 
Essentially, I want to limit usage of COUPON1 to customers with email1.com in their email address and usage of COUPON2 to customers with email2.com in their email address.
LVL 26
Eddie ShipmanAll-around developerAsked:
Who is Participating?
 
Eddie ShipmanConnect With a Mentor All-around developerAuthor Commented:
When I looked at the XML file again, it wasn't like I posted above, it looked like this:
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <LimitCoupon>
            <active>true</active>
            <codePool>local</codePool>
        </LimitCoupon>
    </modules>
</config>

Open in new window


I have changed it to this:
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <NA_LimitCoupon>
            <active>true</active>
            <codePool>local</codePool>
            <self_name>NA Limit Coupon</self_name>
        </NA_LimitCoupon>
    </modules>
</config>

Open in new window


And it has begun to work, except I'm getting an error:
Call to a member function getQuote() on a non-object in /app/code/local/NA/LimitCoupon/Model/Observer.php on line 82
(It's actually on line 40:
$quote = $event->getQuote();

Open in new window

0
 
Randy DownsOWNERCommented:
Getting any errors? Enough disk space?
0
 
Eddie ShipmanAll-around developerAuthor Commented:
No errors; yes, enough disk space. I believe that the issue may be in the XML files, do they look correct to you?
0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

 
Randy DownsConnect With a Mentor OWNERCommented:
XML seems OK. I added XML to your categories, maybe someone else will review.  Does it write to the file if you change this to false?

<NA_LimitCoupon>
            <active>true</active>

Open in new window

0
 
Eddie ShipmanAll-around developerAuthor Commented:
No it doesn't. For some reason, I believe that the module isn't being loaded. It doesn't show in my System->Configuration->Advanced->Advanced->Disable modules output list at all.
This means that the XML file in /app/code/etc/modules must be wrong.
0
 
Randy DownsOWNERCommented:
Maybe you can debug xml like this


error in XML (layout.xml or config.xml or any xml file) if you use below code in the controller action which is being called. The browser will display WHOLE XML code and if it encounters any error in it, simply gives where is the error in the XML tree.

header("Content-Type: text/xml");
echo Mage::app()->getConfig()->getNode()->asXml();exit;

Open in new window

0
 
Eddie ShipmanAll-around developerAuthor Commented:
I have another error in the module code that I'm tracking down now. It is running now but not logging anything.
0
 
Eddie ShipmanAll-around developerAuthor Commented:
Self answered after hint from Randy...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.