troubleshooting Question

Magento Module issue

Avatar of Eddie Shipman
Eddie ShipmanFlag for United States of America asked on
XMLE-CommerceMagentoPHP
8 Comments2 Solutions164 ViewsLast Modified:
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();
        }
    }
 
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>
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>
 

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.
ASKER CERTIFIED SOLUTION
Eddie Shipman
All-around developer

Our community of experts have been thoroughly vetted for their expertise and industry experience.

Join our community to see this answer!
Unlock 2 Answers and 8 Comments.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 2 Answers and 8 Comments.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros