cancel
Showing results for 
Search instead for 
Did you mean: 

[SOLVED] Module for limiting Coupon code use to certain email addresses

[SOLVED] Module for limiting Coupon code use to certain email addresses

I'm posting the solution for others to use... 

 

This is the code (located in /app/code/local/NA/LimitCoupon/Module/Observer.php): 

<?php
class NA_LimitCoupon_Model_Observer 
{
    protected $_domainsAllowed = array(array('COUPON1', 'email1.com'), 
                                       array('COUPON2', 'email2.com')
                                      );

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


    public function validateRestriction(Varien_Event_Observer $observer)
    {
        $errMsg = false;
        // obtain the code being used
        $code = $observer->getEvent()->getQuote()->getCouponCode();
        // Get the current quote email
        $currentEmail = $observer->getEvent()->getQuote()->getCustomer()->getEmail();
        $explodedEmail = explode('@', $currentEmail);

        // Get the domain from the email address
        $domain = array_pop($explodedEmail);
    
        switch($code) 
        {
            case 'COUPON1':
                // check if the email address is in the EMAIL1 domain        
                if ($domain !== $this->_domainsAllowed[0][1]) 
                {
                   // Wrong domain
                   $errMsg = 'This coupon code is restricted to customers with EMAIL1';
                   // Record this error so we may notify the customer
                   $timestamp = date("m-d-Y H:i:s");
                   $msg = "Timestamp:".$timestamp."\nCode: ".$code."\nCurrentEmail: ".$currentEmail."\nDomain: ".$domain."\n";
                   $fp = fopen("/var/tmp/validateRestriction.txt", 'a');
                   fwrite($fp, $msg . "\n");
                   fclose($fp);
                }
                break;
            case 'COUPON2':
                // check if the email address is in the EMAIL2 domain        
                if ($domain !== $this->_domainsAllowed[1][1]) 
                {
                   // Wrong domain
                   $errMsg = 'This coupon code is restricted to customers with EMAIL2';
                   // Record this error so we may notify the customer
                   $timestamp = date("m-d-Y H:i:s");
                   $msg = "Timestamp:".$timestamp."\nCode: ".$code."\nCurrentEmail: ".$currentEmail."\nDomain: ".$domain."\n";
                   $fp = fopen("/var/tmp/validateRestriction.txt", 'a');
                   fwrite($fp, $msg . "\n");
                   fclose($fp);
                }
                break;
        }
        // handle errors
        if ($errMsg) 
        {
            Mage::getSingleton('checkout/session')->addError($errMsg);
            $observer->getEvent()->getQuote()->setCouponCode('');
            $observer->getEvent()->getQuote()->collectTotals()->save();
        }
    }
}

 

And the module XML file (located in /app/etc/modules/NA_LimitCoupon.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Limits coupons to certain emails using an observer
*/
-->
<config>
    <modules>
        <NA_LimitCoupon>
            <active>true</active>
            <codePool>local</codePool>
            <self_name>NA Limit Coupon</self_name>
        </NA_LimitCoupon>
    </modules>
</config>

And the config.xml (located in /app/code/local/NA/LimitCoupon/etc/config.xml):

<?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>