* @copyright PrestaShop * @license http://www.opensource.org/licenses/osl-3.0.php Open-source licence 3.0 * @version 1.3 * */ class Customer extends ObjectModel { public $id; /** @var string Secure key */ public $secure_key; /** @var integer Gender ID */ public $id_gender = 9; /** @var integer Default group ID */ public $id_default_group; /** @var string Lastname */ public $lastname; /** @var string Firstname */ public $firstname; /** @var string Birthday (yyyy-mm-dd) */ public $birthday = NULL; /** @var string e-mail */ public $email; /** @var string dni */ public $dni; /** @var boolean Newsletter subscription */ public $newsletter; /** @var string Newsletter ip registration */ public $ip_registration_newsletter; /** @var string Newsletter ip registration */ public $newsletter_date_add; /** @var boolean Opt-in subscription */ public $optin; /** @var integer Password */ public $passwd; /** @var datetime Password */ public $last_passwd_gen; /** @var boolean Status */ public $active = true; /** @var boolean True if carrier has been deleted (staying in database as deleted) */ public $deleted = 0; /** @var string Object creation date */ public $date_add; /** @var string Object last modification date */ public $date_upd; public $years; public $days; public $months; protected $tables = array ('customer'); protected $fieldsRequired = array('lastname', 'passwd', 'firstname', 'email'); protected $fieldsSize = array('lastname' => 32, 'passwd' => 32, 'firstname' => 32, 'email' => 128, 'dni' => 16); protected $fieldsValidate = array('secure_key' => 'isMd5', 'lastname' => 'isName', 'firstname' => 'isName', 'email' => 'isEmail', 'passwd' => 'isPasswd', 'id_gender' => 'isUnsignedId', 'birthday' => 'isBirthDate', 'newsletter' => 'isBool', 'optin' => 'isBool', 'active' => 'isBool', 'dni' => 'isDni'); protected $table = 'customer'; protected $identifier = 'id_customer'; public function getFields() { parent::validateFields(); if (isset($this->id)) $fields['id_customer'] = intval($this->id); $fields['secure_key'] = pSQL($this->secure_key); $fields['id_gender'] = intval($this->id_gender); $fields['id_default_group'] = intval($this->id_default_group); $fields['lastname'] = pSQL($this->lastname); $fields['firstname'] = pSQL($this->firstname); $fields['birthday'] = pSQL($this->birthday); $fields['email'] = pSQL($this->email); $fields['dni'] = pSQL($this->dni); $fields['newsletter'] = intval($this->newsletter); $fields['newsletter_date_add'] = pSQL($this->newsletter_date_add); $fields['ip_registration_newsletter'] = pSQL($this->ip_registration_newsletter); $fields['optin'] = intval($this->optin); $fields['passwd'] = pSQL($this->passwd); $fields['last_passwd_gen'] = pSQL($this->last_passwd_gen); $fields['active'] = intval($this->active); $fields['date_add'] = pSQL($this->date_add); $fields['date_upd'] = pSQL($this->date_upd); $fields['deleted'] = intval($this->deleted); return $fields; } public function add($autodate = true, $nullValues = true) { $this->birthday = (empty($this->years) ? $this->birthday : intval($this->years).'-'.intval($this->months).'-'.intval($this->days)); $this->secure_key = md5(uniqid(rand(), true)); $this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_FRONT').'minutes')); $this->id_default_group = 1; $res = parent::add($autodate, $nullValues); if (!$res) return false; $row = array('id_customer' => intval($this->id), 'id_group' => 1); return Db::getInstance()->AutoExecute(_DB_PREFIX_.'customer_group', $row, 'INSERT'); } public function update($nullValues = false) { $this->birthday = (empty($this->years) ? $this->birthday : intval($this->years).'-'.intval($this->months).'-'.intval($this->days)); if ($this->newsletter AND !$this->newsletter_date_add) $this->newsletter_date_add = date('Y-m-d H:i:s'); if ($this->dni === 0) $this->dni = NULL; return parent::update(true); } public function delete() { $addresses = $this->getAddresses(intval(Configuration::get('PS_LANG_DEFAULT'))); foreach ($addresses AS $address) { $obj = new Address(intval($address['id_address'])); $obj->delete(); } return parent::delete(); } /** * Return customers list * * @return array Customers */ static public function getCustomers() { return Db::getInstance()->ExecuteS(' SELECT `id_customer`, `email`, `firstname`, `lastname` FROM `'._DB_PREFIX_.'customer` ORDER BY `id_customer` ASC'); } /** * Return customer instance from its e-mail (optionnaly check password) * * @param string $email e-mail * @param string $passwd Password is also checked if specified * @return Customer instance */ public function getByEmail($email, $passwd = NULL) { if (!Validate::isEmail($email) OR ($passwd AND !Validate::isPasswd($passwd))) die (Tools::displayError()); $result = Db::getInstance()->GetRow(' SELECT * FROM `'._DB_PREFIX_ .'customer` WHERE `active` = 1 AND `email` = \''.pSQL($email).'\' '.(isset($passwd) ? 'AND `passwd` = \''.md5(pSQL(_COOKIE_KEY_.$passwd)).'\'' : '').' AND `deleted` = 0'); if (!$result) return false; $this->id = $result['id_customer']; foreach ($result AS $key => $value) if (key_exists($key, $this)) $this->{$key} = $value; return $this; } /** * Check id the customer is active or not * * @return boolean customer validity */ public static function isBanned($id_customer) { if (!Validate::isUnsignedId($id_customer)) return true; $result = Db::getInstance()->getRow(' SELECT `id_customer` FROM `'._DB_PREFIX_.'customer` WHERE `id_customer` = \''.intval($id_customer).'\' AND active = 1 AND `deleted` = 0'); if (isset($result['id_customer'])) return false; return true; } /** * Check if e-mail is already registered in database * * @param string $email e-mail * @param $return_id boolean * @return Customer ID if found, false otherwise */ static public function customerExists($email, $return_id = false) { if (!Validate::isEmail($email)) die (Tools::displayError()); $result = Db::getInstance()->getRow(' SELECT `id_customer` FROM `'._DB_PREFIX_.'customer` WHERE `email` = \''.pSQL($email).'\''); if ($return_id) return intval($result['id_customer']); else return isset($result['id_customer']); } /** * Check if, except current customer, someone else registered this e-email * * @return integer Number of customers who have also this e-mail */ public function cantChangeemail() { if (!Validate::isEmail($this->email)) die (Tools::displayError()); $result = Db::getInstance()->getRow(' SELECT COUNT(`id_customer`) AS total FROM `'._DB_PREFIX_.'customer` WHERE `email` = \''.pSQL($this->email).'\' AND `id_customer` != '.intval($this->id)); return $result['total']; } /** * Check if an address is owned by a customer * * @param integer $id_customer Customer ID * @param integer $id_address Address ID * @return boolean result */ static public function customerHasAddress($id_customer, $id_address) { $result = Db::getInstance()->getRow(' SELECT COUNT(`id_address`) AS ok FROM `'._DB_PREFIX_.'address` WHERE `id_customer` = '.intval($id_customer).' AND `id_address` = '.intval($id_address).' AND `deleted` = 0'); return $result['ok']; } /** * Return customer addresses * * @param integer $id_lang Language ID * @return array Addresses */ public function getAddresses($id_lang) { return Db::getInstance()->ExecuteS(' SELECT a.*, cl.`name` AS country, s.name AS state FROM `'._DB_PREFIX_.'address` a LEFT JOIN `'._DB_PREFIX_.'country` c ON (a.`id_country` = c.`id_country`) LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country`) LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = a.`id_state`) WHERE `id_lang` = '.intval($id_lang).' AND `id_customer` = '.intval($this->id).' AND a.`deleted` = 0'); } /** * Returns customer last connections * * @param integer $nb Number of connections wanted * @return array Connections */ public function getConnections($nb = 10) { return Db::getInstance()->ExecuteS(' SELECT `ip_address`, `date` FROM `'._DB_PREFIX_.'connections` WHERE `id_customer` = '.intval($this->id).' ORDER BY `date` DESC LIMIT 0,'.intval($nb)); } /** * Count the number of addresses for a customer * * @param integer $id_customer Customer ID * @return integer Number of addresses */ public static function getAddressesTotalById($id_customer) { $result = Db::getInstance()->getRow(' SELECT COUNT(a.`id_address`) AS total FROM `'._DB_PREFIX_.'address` a WHERE a.`id_customer` = '.intval($id_customer).' AND a.`deleted` = 0'); return $result['total']; } /** * Check if customer password is the right one * * @param string $passwd Password * @return boolean result */ static public function checkPassword($id_customer, $passwd) { if (!Validate::isUnsignedId($id_customer) OR !Validate::isMd5($passwd)) die (Tools::displayError()); $result = Db::getInstance()->getRow(' SELECT `id_customer` FROM `'._DB_PREFIX_.'customer` WHERE `id_customer` = '.intval($id_customer).' AND `passwd` = \''.pSQL($passwd).'\''); return isset($result['id_customer']) ? $result['id_customer'] : false; } /** * Return customers who have subscribed to the newsletter * * @return array Customers */ public static function getNewsletteremails() { return Db::getInstance()->ExecuteS(' SELECT `email`, `firstname`, `lastname`, `newsletter`, `ip_registration_newsletter`, `newsletter_date_add` FROM `'._DB_PREFIX_.'customer` WHERE `newsletter` = 1 AND `active` = 1'); } /** * Return the number of customers who registered today * * @return integer number of customers who registered today */ public static function getTodaysRegistration() { $result = Db::getInstance()->getRow(' SELECT COUNT(`id_customer`) as nb FROM `'._DB_PREFIX_.'customer` WHERE DAYOFYEAR(`date_add`) = DAYOFYEAR(NOW()) AND YEAR(`date_add`) = YEAR(NOW())'); if (!$result['nb']) return '0'; return $result['nb']; } /** * Light back office search for customers * * @param string $query Searched string * @return array Corresponding customers */ public static function searchByName($query) { return Db::getInstance()->ExecuteS(' SELECT c.* FROM `'._DB_PREFIX_.'customer` c WHERE c.`email` LIKE \'%'.pSQL($query).'%\' OR c.`id_customer` LIKE \'%'.pSQL($query).'%\' OR c.`lastname` LIKE \'%'.pSQL($query).'%\' OR c.`firstname` LIKE \'%'.pSQL($query).'%\''); } /** * Return several useful statistics about customer * * @return array Stats */ public function getStats() { $result = Db::getInstance()->getRow(' SELECT COUNT(`id_order`) AS nb_orders, SUM(`total_paid` / c.`conversion_rate`) AS total_orders FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'currency` c ON (o.`id_currency` = c.`id_currency`) WHERE o.`id_customer` = '.intval($this->id).' AND o.valid = 1'); $result2 = Db::getInstance()->getRow(' SELECT MAX(c.`date_add`) AS last_visit FROM `'._DB_PREFIX_.'guest` g LEFT JOIN `'._DB_PREFIX_.'connections` c ON c.id_guest = g.id_guest WHERE g.`id_customer` = '.intval($this->id)); $result3 = Db::getInstance()->getRow(' SELECT (YEAR(CURRENT_DATE)-YEAR(c.`birthday`)) - (RIGHT(CURRENT_DATE, 5)ExecuteS(' SELECT c.date_add, COUNT(cp.id_page) AS pages, TIMEDIFF(MAX(cp.time_end), c.date_add) as time, http_referer,INET_NTOA(ip_address) as ipaddress FROM `'._DB_PREFIX_.'guest` g LEFT JOIN `'._DB_PREFIX_.'connections` c ON c.id_guest = g.id_guest LEFT JOIN `'._DB_PREFIX_.'connections_page` cp ON c.id_connections = cp.id_connections WHERE g.`id_customer` = '.intval($this->id).' GROUP BY c.`id_connections` ORDER BY c.date_add DESC LIMIT 10'); } /** * Return last cart ID for this customer * * @return integer Cart ID */ public function getLastCart() { $result = Db::getInstance()->getRow(' SELECT MAX(c.`id_cart`) AS id_cart FROM `'._DB_PREFIX_.'cart` c WHERE c.`id_customer` = '.intval($this->id)); if (isset($result['id_cart'])) return $result['id_cart']; return false; } /* * Specify if a customer already in base * * @param $id_customer Customer id * @return boolean */ public function customerIdExists($id_customer) { $row = Db::getInstance()->getRow(' SELECT `id_customer` FROM '._DB_PREFIX_.'customer c WHERE c.`id_customer` = '.intval($id_customer)); return isset($row['id_customer']); } public function cleanGroups() { Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customer_group` WHERE `id_customer` = '.intval($this->id)); } public function addGroups($groups) { foreach ($groups as $group) { $row = array('id_customer' => intval($this->id), 'id_group' => intval($group)); Db::getInstance()->AutoExecute(_DB_PREFIX_.'customer_group', $row, 'INSERT'); } } public function getGroups() { $groups = array(); $result = Db::getInstance()->ExecuteS(' SELECT cg.`id_group` FROM '._DB_PREFIX_.'customer_group cg WHERE cg.`id_customer` = '.intval($this->id)); foreach ($result AS $group) $groups[] = intval($group['id_group']); return $groups; } public function isUsed() { return false; } public function isMemberOfGroup($id_group) { $result = Db::getInstance()->getRow(' SELECT count(cg.`id_group`) as nb FROM '._DB_PREFIX_.'customer_group cg WHERE cg.`id_customer` = '.intval($this->id).' AND cg.`id_group` = '.intval($id_group)); return $result['nb']; } public function getBoughtProducts() { return Db::getInstance()->ExecuteS(' SELECT * FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order WHERE o.valid = 1 AND o.`id_customer` = '.intval($this->id)); } public function getNeedDNI() { $countries = Db::getInstance()->ExecuteS(' SELECT `id_country` FROM `'._DB_PREFIX_.'address` WHERE `id_customer` = '.intval($this->id).' AND `deleted` = 0 '); foreach($countries AS $country) if (Country::getNeedIdentifcationNumber(intval($country['id_country']))) return true; return false; } } ?>