* @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class EmployeeCore extends ObjectModel { public $id; /** @var string Determine employee profile */ public $id_profile; /** @var string employee language */ public $id_lang; /** @var string Lastname */ public $lastname; /** @var string Firstname */ public $firstname; /** @var string e-mail */ public $email; /** @var string Password */ public $passwd; /** @var datetime Password */ public $last_passwd_gen; public $stats_date_from; public $stats_date_to; public $stats_compare_from; public $stats_compare_to; public $stats_compare_option = 1; public $preselect_date_range; /** @var string Display back office background in the specified color */ public $bo_color; public $default_tab; /** @var string employee's chosen theme */ public $bo_theme; /** @var string employee's chosen css file */ public $bo_css = 'admin-theme.css'; /** @var integer employee desired screen width */ public $bo_width; /** @var bool, false */ public $bo_menu = 1; /* Deprecated */ public $bo_show_screencast = false; /** @var boolean Status */ public $active = 1; /** @var boolean Optin status */ public $optin = 1; public $remote_addr; /* employee notifications */ public $id_last_order; public $id_last_customer_message; public $id_last_customer; /** * @see ObjectModel::$definition */ public static $definition = array( 'table' => 'employee', 'primary' => 'id_employee', 'fields' => array( 'lastname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 32), 'firstname' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 32), 'email' => array('type' => self::TYPE_STRING, 'validate' => 'isEmail', 'required' => true, 'size' => 128), 'id_lang' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), 'passwd' => array('type' => self::TYPE_STRING, 'validate' => 'isPasswdAdmin', 'required' => true, 'size' => 32), 'last_passwd_gen' => array('type' => self::TYPE_STRING), 'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'optin' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'id_profile' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true), 'bo_color' => array('type' => self::TYPE_STRING, 'validate' => 'isColor', 'size' => 32), 'default_tab' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), 'bo_theme' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 32), 'bo_css' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 64), 'bo_width' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'bo_menu' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'stats_date_from' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'stats_date_to' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'stats_compare_from' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'stats_compare_to' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'stats_compare_option' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'preselect_date_range' => array('type' => self::TYPE_STRING, 'size' => 32), 'id_last_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'id_last_customer_message' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'id_last_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), ), ); protected $webserviceParameters = array( 'fields' => array( 'id_lang' => array('xlink_resource' => 'languages'), 'last_passwd_gen' => array('setter' => null), 'stats_date_from' => array('setter' => null), 'stats_date_to' => array('setter' => null), 'stats_compare_from' => array('setter' => null), 'stats_compare_to' => array('setter' => null), 'passwd' => array('setter' => 'setWsPasswd'), ), ); protected $associated_shops = array(); public function __construct($id = null, $id_lang = null, $id_shop = null) { parent::__construct($id, null, $id_shop); if (!is_null($id_lang)) $this->id_lang = (int)(Language::getLanguage($id_lang) !== false) ? $id_lang : Configuration::get('PS_LANG_DEFAULT'); if ($this->id) $this->associated_shops = $this->getAssociatedShops(); $this->image_dir = _PS_EMPLOYEE_IMG_DIR_; } /** * @see ObjectModel::getFields() * @return array */ public function getFields() { if (empty($this->stats_date_from) || $this->stats_date_from == '0000-00-00') $this->stats_date_from = date('Y-m-d', strtotime("-1 month")); if (empty($this->stats_compare_from) || $this->stats_compare_from == '0000-00-00') $this->stats_compare_from = null; if (empty($this->stats_date_to) || $this->stats_date_to == '0000-00-00') $this->stats_date_to = date('Y-m-d'); if (empty($this->stats_compare_to) || $this->stats_compare_to == '0000-00-00') $this->stats_compare_to = null; return parent::getFields(); } public function add($autodate = true, $null_values = true) { $this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_BACK').'minutes')); $this->saveOptin(); $this->updateTextDirection(); return parent::add($autodate, $null_values); } public function update($null_values = false) { if (empty($this->stats_date_from) || $this->stats_date_from == '0000-00-00') $this->stats_date_from = date('Y-m-d'); if (empty($this->stats_date_to) || $this->stats_date_to == '0000-00-00') $this->stats_date_to = date('Y-m-d'); $this->saveOptin(); $this->updateTextDirection(); return parent::update($null_values); } protected function updateTextDirection() { if (!defined('_PS_ADMIN_DIR_')) return; $path = _PS_ADMIN_DIR_.DIRECTORY_SEPARATOR.'themes'.DIRECTORY_SEPARATOR.$this->bo_theme.DIRECTORY_SEPARATOR.'css'.DIRECTORY_SEPARATOR; $language = new Language($this->id_lang); if ($language->is_rtl && !strpos($this->bo_css, '_rtl')) { $bo_css = preg_replace('/^(.*)\.css$/', '$1_rtl.css', $this->bo_css); if (file_exists($path.$bo_css)) $this->bo_css = $bo_css; } elseif (!$language->is_rtl && strpos($this->bo_css, '_rtl')) { $bo_css = preg_replace('/^(.*)_rtl\.css$/', '$1.css', $this->bo_css); if (file_exists($path.$bo_css)) $this->bo_css = $bo_css; } } protected function saveOptin() { if ($this->optin && !defined('PS_INSTALLATION_IN_PROGRESS')) { $language = new Language($this->id_lang); $params = http_build_query(array( 'email' => $this->email, 'method' => 'addMemberToNewsletter', 'language' => $language->iso_code, 'visitorType' => 1, 'source' => 'backoffice' )); Tools::file_get_contents('http://www.prestashop.com/ajax/controller.php?'.$params); } } /** * Return list of employees */ public static function getEmployees() { return Db::getInstance()->executeS(' SELECT `id_employee`, `firstname`, `lastname` FROM `'._DB_PREFIX_.'employee` WHERE `active` = 1 ORDER BY `lastname` ASC '); } /** * Return employee instance from its e-mail (optionnaly check password) * * @param string $email e-mail * @param string $passwd Password is also checked if specified * @return Employee instance */ public function getByEmail($email, $passwd = null) { if (!Validate::isEmail($email) || ($passwd != null && !Validate::isPasswd($passwd))) die(Tools::displayError()); $result = Db::getInstance()->getRow(' SELECT * FROM `'._DB_PREFIX_.'employee` WHERE `active` = 1 AND `email` = \''.pSQL($email).'\' '.($passwd !== null ? 'AND `passwd` = \''.Tools::encrypt($passwd).'\'' : '')); if (!$result) return false; $this->id = $result['id_employee']; $this->id_profile = $result['id_profile']; foreach ($result as $key => $value) if (property_exists($this, $key)) $this->{$key} = $value; return $this; } public static function employeeExists($email) { if (!Validate::isEmail($email)) die (Tools::displayError()); return (bool)Db::getInstance()->getValue(' SELECT `id_employee` FROM `'._DB_PREFIX_.'employee` WHERE `email` = \''.pSQL($email).'\''); } /** * Check if employee password is the right one * * @param string $passwd Password * @return boolean result */ public static function checkPassword($id_employee, $passwd) { if (!Validate::isUnsignedId($id_employee) || !Validate::isPasswd($passwd, 8)) die (Tools::displayError()); return Db::getInstance()->getValue(' SELECT `id_employee` FROM `'._DB_PREFIX_.'employee` WHERE `id_employee` = '.(int)$id_employee.' AND `passwd` = \''.pSQL($passwd).'\' AND active = 1'); } public static function countProfile($id_profile, $active_only = false) { return Db::getInstance()->getValue(' SELECT COUNT(*) FROM `'._DB_PREFIX_.'employee` WHERE `id_profile` = '.(int)$id_profile.' '.($active_only ? ' AND `active` = 1' : '')); } public function isLastAdmin() { return ($this->isSuperAdmin() && Employee::countProfile($this->id_profile, true) == 1 && $this->active ); } public function setWsPasswd($passwd) { if ($this->id != 0) { if ($this->passwd != $passwd) $this->passwd = Tools::encrypt($passwd); } else $this->passwd = Tools::encrypt($passwd); return true; } /** * Check employee informations saved into cookie and return employee validity * * @return boolean employee validity */ public function isLoggedBack() { if (!Cache::isStored('isLoggedBack'.$this->id)) { /* Employee is valid only if it can be load and if cookie password is the same as database one */ Cache::store('isLoggedBack'.$this->id, ( $this->id && Validate::isUnsignedId($this->id) && Employee::checkPassword($this->id, Context::getContext()->cookie->passwd) && (!isset(Context::getContext()->cookie->remote_addr) || Context::getContext()->cookie->remote_addr == ip2long(Tools::getRemoteAddr()) || !Configuration::get('PS_COOKIE_CHECKIP')) )); } return Cache::retrieve('isLoggedBack'.$this->id); } /** * Logout */ public function logout() { if (isset(Context::getContext()->cookie)) { Context::getContext()->cookie->logout(); Context::getContext()->cookie->write(); } $this->id = null; } public function favoriteModulesList() { return Db::getInstance()->executeS(' SELECT module FROM `'._DB_PREFIX_.'module_preference` WHERE `id_employee` = '.(int)$this->id.' AND `favorite` = 1 AND (`interest` = 1 OR `interest` IS NULL)' ); } /** * Check if the employee is associated to a specific shop * * @since 1.5.0 * @param int $id_shop * @return bool */ public function hasAuthOnShop($id_shop) { return $this->isSuperAdmin() || in_array($id_shop, $this->associated_shops); } /** * Check if the employee is associated to a specific shop group * * @since 1.5.0 * @param int $id_shop_shop * @return bool */ public function hasAuthOnShopGroup($id_shop_group) { if ($this->isSuperAdmin()) return true; foreach ($this->associated_shops as $id_shop) if ($id_shop_group == Shop::getGroupFromShop($id_shop, true)) return true; return false; } /** * Get default id_shop with auth for current employee * * @since 1.5.0 * @return int */ public function getDefaultShopID() { if ($this->isSuperAdmin() || in_array(Configuration::get('PS_SHOP_DEFAULT'), $this->associated_shops)) return Configuration::get('PS_SHOP_DEFAULT'); return $this->associated_shops[0]; } public static function getEmployeesByProfile($id_profile, $active_only = false) { return Db::getInstance()->executeS(' SELECT * FROM `'._DB_PREFIX_.'employee` WHERE `id_profile` = '.(int)$id_profile.' '.($active_only ? ' AND `active` = 1' : '')); } /** * Check if current employee is super administrator * * @return bool */ public function isSuperAdmin() { return $this->id_profile == _PS_ADMIN_PROFILE_; } public function getImage() { if (!Validate::isLoadedObject($this)) return Tools::getAdminImageUrl('prestashop-avatar.png'); return Tools::getShopProtocol().'profile.prestashop.com/'.urlencode($this->email).'.jpg'; } public function getLastElementsForNotify($element) { $element = bqSQL($element); $max = Db::getInstance()->getValue(' SELECT MAX(`id_'.$element.'`) as `id_'.$element.'` FROM `'._DB_PREFIX_.$element.($element == 'order' ? 's': '').'`'); // if no rows in table, set max to 0 if ((int)$max < 1) $max = 0; return (int)$max; } }