* @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ if (!defined('_PS_VERSION_')) exit; class ReferralProgramModule extends ObjectModel { public $id_sponsor; public $email; public $lastname; public $firstname; public $id_customer; public $id_cart_rule; public $id_cart_rule_sponsor; public $date_add; public $date_upd; /** * @see ObjectModel::$definition */ public static $definition = array( 'table' => 'referralprogram', 'primary' => 'id_referralprogram', 'fields' => array( 'id_sponsor' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'email' => array('type' => self::TYPE_STRING, 'validate' => 'isEmail', 'required' => true, 'size' => 255), 'lastname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 128), 'firstname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 128), 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_cart_rule' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_cart_rule_sponsor' =>array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), ), ); public static function getDiscountPrefix() { return 'SP'; } public function registerDiscountForSponsor($id_currency) { if ((int)$this->id_cart_rule_sponsor > 0) return false; return $this->registerDiscount((int)$this->id_sponsor, 'sponsor', (int)$id_currency); } public function registerDiscountForSponsored($id_currency) { if (!(int)$this->id_customer OR (int)$this->id_cart_rule > 0) return false; return $this->registerDiscount((int)$this->id_customer, 'sponsored', (int)$id_currency); } public function registerDiscount($id_customer, $register = false, $id_currency = 0) { $configurations = Configuration::getMultiple(array('REFERRAL_DISCOUNT_TYPE', 'REFERRAL_PERCENTAGE', 'REFERRAL_DISCOUNT_VALUE_'.(int)$id_currency)); $cartRule = new CartRule(); if ($configurations['REFERRAL_DISCOUNT_TYPE'] == Discount::PERCENT) $cartRule->reduction_percent = (float)$configurations['REFERRAL_PERCENTAGE']; elseif ($configurations['REFERRAL_DISCOUNT_TYPE'] == Discount::AMOUNT AND isset($configurations['REFERRAL_DISCOUNT_VALUE_'.(int)$id_currency])) $cartRule->reduction_amount = (float)$configurations['REFERRAL_DISCOUNT_VALUE_'.(int)$id_currency]; $cartRule->reduction_tax = 1; $cartRule->quantity = 1; $cartRule->quantity_per_user = 1; $cartRule->cart_rule_restriction = 0; $cartRule->date_from = date('Y-m-d H:i:s', time()); $cartRule->date_to = date('Y-m-d H:i:s', time() + 31536000); // + 1 year $cartRule->code = $this->getDiscountPrefix().Tools::passwdGen(6); $cartRule->name = Configuration::getInt('REFERRAL_DISCOUNT_DESCRIPTION'); if (empty($cartRule->name)) $cartRule->name = 'Referral reward'; $cartRule->id_customer = (int)$id_customer; $cartRule->reduction_currency = (int)$id_currency; if ($cartRule->add()) { /* Add all cart rule to avoid compatibility */ $existing_rules = Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'cart_rule_combination` WHERE `id_cart_rule_1` = '.(int) $cartRule->id.' OR `id_cart_rule_2` = '.(int) $cartRule->id); /* END Add all cart rule to avoid compatibility */ if ($register != false) { if ($register == 'sponsor') $this->id_cart_rule_sponsor = (int)$cartRule->id; elseif ($register == 'sponsored') $this->id_cart_rule = (int)$cartRule->id; return $this->save(); } return true; } return false; } /** * Return sponsored friends * * @return array Sponsor */ public static function getSponsorFriend($id_customer, $restriction = false) { if (!(int)($id_customer)) return array(); $query = ' SELECT s.* FROM `'._DB_PREFIX_.'referralprogram` s WHERE s.`id_sponsor` = '.(int)$id_customer; if ($restriction) { if ($restriction == 'pending') $query.= ' AND s.`id_customer` = 0'; elseif ($restriction == 'subscribed') $query.= ' AND s.`id_customer` != 0'; } return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query); } /** * Return if a customer is sponsorised * * @return boolean */ public static function isSponsorised($id_customer, $getId=false) { $result = Db::getInstance()->getRow(' SELECT s.`id_referralprogram` FROM `'._DB_PREFIX_.'referralprogram` s LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = s.`id_customer`) WHERE c.`id_customer` IS NOT NULL AND s.`id_customer` = '.(int)$id_customer); if (isset($result['id_referralprogram']) AND $getId === true) return (int)$result['id_referralprogram']; return isset($result['id_referralprogram']); } public static function isSponsorFriend($id_sponsor, $id_friend) { if (!(int)($id_sponsor) OR !(int)($id_friend)) return false; $result = Db::getInstance()->getRow(' SELECT s.`id_referralprogram` FROM `'._DB_PREFIX_.'referralprogram` s WHERE s.`id_sponsor` = '.(int)($id_sponsor).' AND s.`id_referralprogram` = '.(int)($id_friend)); return isset($result['id_referralprogram']); } /** * Return if an email is already register * * @return boolean OR int idReferralProgram */ public static function isEmailExists($email, $getId = false, $checkCustomer = true) { if (empty($email) OR !Validate::isEmail($email)) die (Tools::displayError('The email address is invalid.')); if ($checkCustomer === true AND Customer::customerExists($email)) return false; $result = Db::getInstance()->getRow(' SELECT s.`id_referralprogram` FROM `'._DB_PREFIX_.'referralprogram` s WHERE s.`email` = \''.pSQL($email).'\''); if ($getId) return (int)$result['id_referralprogram']; return isset($result['id_referralprogram']); } /** * @Override * Get customer unique share link * @param int $id_customer Customer ID */ public static function getCustomerShareLink($id_customer){ $customer = new Customer((int)$id_customer); if (!Validate::isLoadedObject($customer)) return false; return strrev(base64_encode($customer->id.'|'.$customer->email)); } /** * @Override * Get customer email from share link * @param String $link Customer unique share link */ public static function getCustomerFromLink($link){ $str = base64_decode(strrev($link)); $str = explode('|', $str); if (isset($str[1])) return $str[1]; return false; } }