2004-10-20 23:15:17 +02:00
< ? php
2019-03-01 18:28:51 +01:00
/* Copyright ( c ) 2002 - 2007 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
* Copyright ( c ) 2002 - 2003 Jean - Louis Bergamo < jlb @ j1b . org >
* Copyright ( c ) 2004 - 2012 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2004 Sebastien Di Cintio < sdicintio @ ressource - toi . org >
* Copyright ( C ) 2004 Benoit Mortier < benoit . mortier @ opensides . be >
* Copyright ( C ) 2005 - 2017 Regis Houssin < regis . houssin @ inodbox . com >
* Copyright ( C ) 2005 Lionel Cousteix < etm_ltd @ tiscali . co . uk >
* Copyright ( C ) 2011 Herve Prot < herve . prot @ symeos . com >
2019-03-21 15:18:05 +01:00
* Copyright ( C ) 2013 - 2019 Philippe Grand < philippe . grand @ atoo - net . com >
2019-03-01 18:28:51 +01:00
* Copyright ( C ) 2013 - 2015 Alexandre Spangaro < aspangaro @ open - dsi . fr >
* Copyright ( C ) 2015 Marcos García < marcosgdf @ gmail . com >
* Copyright ( C ) 2018 charlene Benke < charlie @ patas - monkey . com >
* Copyright ( C ) 2018 Nicolas ZABOURI < info @ inovea - conseil . com >
* Copyright ( C ) 2019 Frédéric France < frederic . france @ netlogic . fr >
2019-09-11 23:45:02 +02:00
* Copyright ( C ) 2019 Abbes Bahfir < dolipar @ dolipar . org >
2006-11-20 03:10:47 +01:00
*
2002-04-30 12:51:35 +02:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2002-04-30 12:51:35 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2002-04-30 12:51:35 +02:00
*/
2005-03-15 18:17:58 +01:00
/**
2010-07-21 14:35:56 +02:00
* \file htdocs / user / class / user . class . php
2012-01-11 01:06:56 +01:00
* \brief File of class to manage users
2012-03-27 09:59:28 +02:00
* \ingroup core
2008-07-19 18:53:56 +02:00
*/
2004-08-07 20:47:54 +02:00
2019-11-13 19:35:39 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/user/class/usergroup.class.php' ;
2007-11-05 23:37:41 +01:00
2005-03-15 18:17:58 +01:00
/**
2012-04-01 20:31:39 +02:00
* Class to manage Dolibarr users
2008-07-19 18:53:56 +02:00
*/
2007-11-05 23:37:41 +01:00
class User extends CommonObject
2003-08-11 20:56:42 +02:00
{
2018-08-23 18:52:47 +02:00
/**
* @ var string ID to identify managed object
*/
2019-11-13 19:35:39 +01:00
public $element = 'user' ;
2018-08-31 22:34:02 +02:00
2018-08-22 19:56:24 +02:00
/**
* @ var string Name of table without prefix where object is stored
*/
2019-11-13 19:35:39 +01:00
public $table_element = 'user' ;
2018-08-31 22:34:02 +02:00
2018-10-06 12:04:17 +02:00
/**
* @ var int Field with ID of parent key if this field has a parent
*/
2019-11-13 19:35:39 +01:00
public $fk_element = 'fk_user' ;
2018-10-06 12:04:17 +02:00
2018-10-06 12:18:03 +02:00
/**
* 0 = No test on entity , 1 = Test with field entity , 2 = Test with link by societe
* @ var int
*/
public $ismultientitymanaged = 1 ;
2004-08-07 20:47:54 +02:00
2019-11-13 19:35:39 +01:00
public $id = 0 ;
2017-12-18 11:55:34 +01:00
public $statut ;
2016-12-20 21:11:50 +01:00
public $ldap_sid ;
public $search_sid ;
public $employee ;
public $gender ;
2017-10-06 12:08:01 +02:00
public $birth ;
2016-12-20 21:11:50 +01:00
public $email ;
2019-03-16 08:53:06 +01:00
public $personal_email ;
2018-10-12 11:29:47 +02:00
2019-09-12 18:04:24 +02:00
/**
* @ var array array of socialnetworks
*/
public $socialnetworks ;
/**
* Skype username
* @ var string
* @ deprecated
*/
2016-12-20 21:11:50 +01:00
public $skype ;
2019-09-12 18:04:24 +02:00
/**
* Twitter username
* @ var string
* @ deprecated
*/
2018-10-12 11:29:47 +02:00
public $twitter ;
2019-09-12 18:04:24 +02:00
/**
* Facebook username
* @ var string
* @ deprecated
*/
2018-10-12 11:29:47 +02:00
public $facebook ;
2019-09-12 18:04:24 +02:00
/**
* Linkedin username
* @ var string
* @ deprecated
*/
2019-02-25 09:07:58 +01:00
public $linkedin ;
2018-10-12 11:29:47 +02:00
2019-11-13 19:35:39 +01:00
public $job ; // job position
2016-12-20 21:11:50 +01:00
public $signature ;
2018-10-06 12:01:00 +02:00
/**
* @ var string Address
*/
2016-12-20 21:11:50 +01:00
public $address ;
2018-10-06 12:01:00 +02:00
2017-11-10 18:14:29 +01:00
public $zip ;
public $town ;
2019-11-13 19:35:39 +01:00
public $state_id ; // The state/department
2017-11-10 18:14:29 +01:00
public $state_code ;
public $state ;
2016-12-20 21:11:50 +01:00
public $office_phone ;
public $office_fax ;
public $user_mobile ;
2019-03-16 08:53:06 +01:00
public $personal_mobile ;
2016-12-20 21:11:50 +01:00
public $admin ;
public $login ;
2017-11-10 18:14:29 +01:00
public $api_key ;
2018-08-31 18:27:16 +02:00
/**
* @ var int Entity
*/
2016-12-20 21:11:50 +01:00
public $entity ;
2007-11-13 21:17:52 +01:00
2009-01-21 15:09:42 +01:00
//! Clear password in memory
2016-12-20 21:11:50 +01:00
public $pass ;
2009-01-21 15:09:42 +01:00
//! Clear password in database (defined if DATABASE_PWD_ENCRYPTED=0)
2016-12-20 21:11:50 +01:00
public $pass_indatabase ;
2009-01-21 15:09:42 +01:00
//! Encrypted password in database (always defined)
2016-12-20 21:11:50 +01:00
public $pass_indatabase_crypted ;
2007-11-13 21:17:52 +01:00
2019-03-21 15:18:05 +01:00
/**
* Date creation record ( datec )
*
* @ var integer
*/
public $datec ;
2019-03-21 20:15:19 +01:00
2019-03-21 15:18:05 +01:00
/**
* Date modification record ( tms )
*
* @ var integer
*/
public $datem ;
2012-05-23 13:09:36 +02:00
2011-09-24 01:46:14 +02:00
//! If this is defined, it is an external user
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-04-04 18:33:12 +02:00
* @ see $socid
2015-04-23 23:21:06 +02:00
*/
2016-12-20 21:11:50 +01:00
public $societe_id ;
2015-04-23 23:21:06 +02:00
/**
* @ deprecated
2019-04-04 18:33:12 +02:00
* @ see $contactid
2015-04-23 23:21:06 +02:00
*/
2016-12-20 21:11:50 +01:00
public $contact_id ;
public $socid ;
public $contactid ;
2018-10-12 12:23:45 +02:00
/**
* @ var int ID
*/
2016-12-20 21:11:50 +01:00
public $fk_member ;
2018-08-31 17:55:31 +02:00
/**
* @ var int User ID
*/
2016-12-20 21:11:50 +01:00
public $fk_user ;
2019-03-16 08:53:06 +01:00
public $fk_user_expense_validator ;
public $fk_user_holiday_validator ;
2016-12-20 21:11:50 +01:00
public $clicktodial_url ;
public $clicktodial_login ;
public $clicktodial_password ;
public $clicktodial_poste ;
public $datelastlogin ;
public $datepreviouslogin ;
public $photo ;
public $lang ;
2019-11-13 19:35:39 +01:00
public $rights ; // Array of permissions user->rights->permx
public $all_permissions_are_loaded ; // All permission are loaded
public $nb_rights ; // Number of rights granted to the user
private $_tab_loaded = array (); // Cache array of already loaded permissions
2017-06-06 07:57:03 +02:00
2019-11-13 19:35:39 +01:00
public $conf ; // To store personal config
public $default_values ; // To store default values for user
public $lastsearch_values_tmp ; // To store current search criterias for user
public $lastsearch_values ; // To store last saved search criterias for user
2017-06-06 07:57:03 +02:00
2019-11-13 19:35:39 +01:00
public $users = array (); // To store all tree of users hierarchy
public $parentof ; // To store an array of all parents for all ids.
2017-04-14 12:39:11 +02:00
private $cache_childids ;
2017-06-06 07:57:03 +02:00
2019-11-13 19:35:39 +01:00
public $accountancy_code ; // Accountancy code in prevision of the complete accountancy module
2017-03-13 15:00:44 +01:00
2019-11-13 19:35:39 +01:00
public $thm ; // Average cost of employee - Used for valuation of time spent
public $tjm ; // Average cost of employee
2017-03-13 15:00:44 +01:00
2019-11-13 19:35:39 +01:00
public $salary ; // Monthly salary - Denormalized value from llx_user_employment
public $salaryextra ; // Monthly salary extra - Denormalized value from llx_user_employment
public $weeklyhours ; // Weekly hours - Denormalized value from llx_user_employment
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
public $color ; // Define background color for user in agenda
2017-03-13 15:00:44 +01:00
2019-11-13 19:35:39 +01:00
public $dateemployment ; // Define date of employment by company
public $dateemploymentend ; // Define date of employment end by company
2008-07-19 18:53:56 +02:00
2017-06-15 11:08:53 +02:00
public $default_c_exp_tax_cat ;
public $default_range ;
2018-07-02 09:34:34 +02:00
2019-02-15 05:20:33 +01:00
public $fk_warehouse ;
2018-07-02 09:34:34 +02:00
2018-08-31 22:34:02 +02:00
public $fields = array (
2019-11-13 19:35:39 +01:00
'rowid' => array ( 'type' => 'integer' , 'label' => 'TechnicalID' , 'enabled' => 1 , 'visible' =>- 2 , 'notnull' => 1 , 'index' => 1 , 'position' => 1 , 'comment' => 'Id' ),
'lastname' => array ( 'type' => 'varchar(50)' , 'label' => 'Name' , 'enabled' => 1 , 'visible' => 1 , 'notnull' => 1 , 'showoncombobox' => 1 , 'index' => 1 , 'position' => 20 , 'searchall' => 1 , 'comment' => 'Reference of object' ),
'firstname' => array ( 'type' => 'varchar(50)' , 'label' => 'Name' , 'enabled' => 1 , 'visible' => 1 , 'notnull' => 1 , 'showoncombobox' => 1 , 'index' => 1 , 'position' => 10 , 'searchall' => 1 , 'comment' => 'Reference of object' ),
2018-08-31 22:34:02 +02:00
);
2017-03-13 15:00:44 +01:00
2019-10-31 23:29:17 +01:00
const STATUS_DISABLED = 0 ;
const STATUS_ENABLED = 1 ;
2008-07-19 18:53:56 +02:00
/**
2018-08-31 22:34:02 +02:00
* Constructor of the class
2011-09-04 20:41:19 +02:00
*
2012-01-13 18:24:25 +01:00
* @ param DoliDb $db Database handler
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function __construct ( $db )
2008-07-19 18:53:56 +02:00
{
2012-01-13 18:24:25 +01:00
$this -> db = $db ;
2008-07-19 18:53:56 +02:00
2015-10-23 15:24:47 +02:00
// User preference
2008-07-19 18:53:56 +02:00
$this -> liste_limit = 0 ;
2009-01-09 22:22:58 +01:00
$this -> clicktodial_loaded = 0 ;
2008-07-19 18:53:56 +02:00
2015-10-23 15:24:47 +02:00
// For cache usage
2008-07-19 18:53:56 +02:00
$this -> all_permissions_are_loaded = 0 ;
2016-06-04 13:25:39 +02:00
$this -> nb_rights = 0 ;
2016-03-17 09:22:12 +01:00
// Force some default values
2015-10-23 15:24:47 +02:00
$this -> admin = 0 ;
$this -> employee = 1 ;
2016-03-17 09:22:12 +01:00
2019-02-25 20:35:59 +01:00
$this -> conf = new stdClass ();
$this -> rights = new stdClass ();
$this -> rights -> user = new stdClass ();
$this -> rights -> user -> user = new stdClass ();
$this -> rights -> user -> self = new stdClass ();
2008-07-19 18:53:56 +02:00
}
2007-04-13 18:11:44 +02:00
/**
2017-10-28 16:00:07 +02:00
* Load a user from database with its id or ref ( login ) .
* This function does not load permissions , only user properties . Use getrights () for this just after the fetch .
2011-08-21 01:56:03 +02:00
*
2016-12-07 19:16:33 +01:00
* @ param int $id If defined , id to used for search
* @ param string $login If defined , login to used for search
* @ param string $sid If defined , sid to used for search
2017-04-14 12:52:32 +02:00
* @ param int $loadpersonalconf 1 = also load personal conf of user ( in $user -> conf -> xxx ), 0 = do not load personal conf .
2015-10-22 14:05:16 +02:00
* @ param int $entity If a value is >= 0 , we force the search on a specific entity . If - 1 , means search depens on default setup .
2019-10-11 18:42:07 +02:00
* @ param int $email If defined , email to used for search
2011-09-20 19:34:15 +02:00
* @ return int < 0 if KO , 0 not found , > 0 if OK
2008-07-19 18:53:56 +02:00
*/
2019-10-11 18:42:07 +02:00
public function fetch ( $id = '' , $login = '' , $sid = '' , $loadpersonalconf = 0 , $entity = - 1 , $email = '' )
2007-04-13 18:11:44 +02:00
{
2016-03-29 21:07:53 +02:00
global $conf , $user ;
2007-01-05 10:25:52 +01:00
2011-06-29 12:23:32 +02:00
// Clean parameters
2019-12-18 15:20:36 +01:00
$login = trim ( $login );
2008-07-19 18:53:56 +02:00
2011-06-29 12:23:32 +02:00
// Get user
2019-09-12 18:32:47 +02:00
$sql = " SELECT u.rowid, u.lastname, u.firstname, u.employee, u.gender, u.birth, u.email, u.personal_email, u.job, " ;
2019-12-18 15:20:36 +01:00
$sql .= " u.socialnetworks, " ;
$sql .= " u.signature, u.office_phone, u.office_fax, u.user_mobile, u.personal_mobile, " ;
$sql .= " u.address, u.zip, u.town, u.fk_state as state_id, u.fk_country as country_id, " ;
$sql .= " u.admin, u.login, u.note as note_private, u.note_public, " ;
$sql .= " u.pass, u.pass_crypted, u.pass_temp, u.api_key, " ;
$sql .= " u.fk_soc, u.fk_socpeople, u.fk_member, u.fk_user, u.ldap_sid, u.fk_user_expense_validator, u.fk_user_holiday_validator, " ;
$sql .= " u.statut, u.lang, u.entity, " ;
$sql .= " u.datec as datec, " ;
$sql .= " u.tms as datem, " ;
$sql .= " u.datelastlogin as datel, " ;
$sql .= " u.datepreviouslogin as datep, " ;
$sql .= " u.photo as photo, " ;
$sql .= " u.openid as openid, " ;
$sql .= " u.accountancy_code, " ;
$sql .= " u.thm, " ;
$sql .= " u.tjm, " ;
$sql .= " u.salary, " ;
$sql .= " u.salaryextra, " ;
$sql .= " u.weeklyhours, " ;
$sql .= " u.color, " ;
$sql .= " u.dateemployment, u.dateemploymentend, " ;
$sql .= " u.fk_warehouse, " ;
$sql .= " u.ref_int, u.ref_ext, " ;
$sql .= " u.default_range, u.default_c_exp_tax_cat, " ; // Expense report default mode
$sql .= " c.code as country_code, c.label as country, " ;
$sql .= " d.code_departement as state_code, d.nom as state " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " user as u " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_country as c ON u.fk_country = c.rowid " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " c_departements as d ON u.fk_state = d.rowid " ;
2011-08-20 18:59:14 +02:00
2015-10-22 14:05:16 +02:00
if ( $entity < 0 )
2011-08-20 00:15:22 +02:00
{
2019-12-18 15:20:36 +01:00
if (( empty ( $conf -> multicompany -> enabled ) || empty ( $conf -> global -> MULTICOMPANY_TRANSVERSE_MODE )) && ( ! empty ( $user -> entity )))
2017-10-07 13:09:31 +02:00
{
2019-12-18 15:20:36 +01:00
$sql .= " WHERE u.entity IN (0, " . $conf -> entity . " ) " ;
2017-10-07 13:09:31 +02:00
}
else
{
2019-12-18 15:20:36 +01:00
$sql .= " WHERE u.entity IS NOT NULL " ; // multicompany is on in transverse mode or user making fetch is on entity 0, so user is allowed to fetch anywhere into database
2017-10-07 13:09:31 +02:00
}
2011-08-20 00:15:22 +02:00
}
2015-10-22 14:05:16 +02:00
else // The fetch was forced on an entity
2011-08-20 00:15:22 +02:00
{
2017-06-06 07:57:03 +02:00
if ( ! empty ( $conf -> multicompany -> enabled ) && ! empty ( $conf -> global -> MULTICOMPANY_TRANSVERSE_MODE ))
2019-12-18 15:20:36 +01:00
$sql .= " WHERE u.entity IS NOT NULL " ; // multicompany is on in transverse mode or user making fetch is on entity 0, so user is allowed to fetch anywhere into database
2016-04-19 13:38:32 +02:00
else
2019-12-18 15:20:36 +01:00
$sql .= " WHERE u.entity IN (0, " . (( $entity != '' && $entity >= 0 ) ? $entity : $conf -> entity ) . " ) " ; // search in entity provided in parameter
2011-08-20 00:15:22 +02:00
}
2016-03-17 09:22:12 +01:00
2011-08-21 01:56:03 +02:00
if ( $sid ) // permet une recherche du user par son SID ActiveDirectory ou Samba
2007-06-01 22:15:30 +02:00
{
2019-12-18 15:20:36 +01:00
$sql .= " AND (u.ldap_sid = ' " . $this -> db -> escape ( $sid ) . " ' OR u.login = ' " . $this -> db -> escape ( $login ) . " ') LIMIT 1 " ;
2007-06-01 22:15:30 +02:00
}
2019-01-27 10:49:34 +01:00
elseif ( $login )
2007-04-13 18:11:44 +02:00
{
2019-12-18 15:20:36 +01:00
$sql .= " AND u.login = ' " . $this -> db -> escape ( $login ) . " ' " ;
2007-04-13 18:11:44 +02:00
}
2019-10-11 18:42:07 +02:00
elseif ( $email )
{
2019-12-18 15:20:36 +01:00
$sql .= " AND u.email = ' " . $this -> db -> escape ( $email ) . " ' " ;
2019-10-11 18:42:07 +02:00
}
2007-04-13 18:11:44 +02:00
else
{
2019-12-18 15:20:36 +01:00
$sql .= " AND u.rowid = " . $id ;
2007-04-13 18:11:44 +02:00
}
2019-12-18 15:20:36 +01:00
$sql .= " ORDER BY u.entity ASC " ; // Avoid random result when there is 2 login in 2 different entities
2017-09-11 00:02:52 +02:00
2007-04-13 18:11:44 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$obj = $this -> db -> fetch_object ( $result );
if ( $obj )
{
2019-11-13 19:35:39 +01:00
$this -> id = $obj -> rowid ;
$this -> ref = $obj -> rowid ;
2011-09-04 20:41:19 +02:00
2011-09-03 17:27:23 +02:00
$this -> ref_int = $obj -> ref_int ;
$this -> ref_ext = $obj -> ref_ext ;
2011-01-15 10:31:09 +01:00
$this -> ldap_sid = $obj -> ldap_sid ;
2013-03-09 20:34:38 +01:00
$this -> lastname = $obj -> lastname ;
2019-11-13 19:35:39 +01:00
$this -> firstname = $obj -> firstname ;
2016-03-17 09:22:12 +01:00
2015-10-09 07:30:48 +02:00
$this -> employee = $obj -> employee ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$this -> login = $obj -> login ;
2015-05-30 02:17:05 +02:00
$this -> gender = $obj -> gender ;
2017-10-06 12:08:01 +02:00
$this -> birth = $this -> db -> jdate ( $obj -> birth );
2007-04-13 18:11:44 +02:00
$this -> pass_indatabase = $obj -> pass ;
2007-04-23 00:55:32 +02:00
$this -> pass_indatabase_crypted = $obj -> pass_crypted ;
2019-11-13 19:35:39 +01:00
$this -> pass = $obj -> pass ;
2012-10-05 12:40:19 +02:00
$this -> pass_temp = $obj -> pass_temp ;
2019-11-13 19:35:39 +01:00
$this -> api_key = $obj -> api_key ;
2015-11-18 06:34:08 +01:00
2017-10-07 13:09:31 +02:00
$this -> address = $obj -> address ;
$this -> zip = $obj -> zip ;
$this -> town = $obj -> town ;
2015-11-18 06:34:08 +01:00
2019-02-25 20:35:59 +01:00
$this -> country_id = $obj -> country_id ;
2019-11-13 19:35:39 +01:00
$this -> country_code = $obj -> country_id ? $obj -> country_code : '' ;
2019-02-25 20:35:59 +01:00
//$this->country = $obj->country_id?($langs->trans('Country'.$obj->country_code)!='Country'.$obj->country_code?$langs->transnoentities('Country'.$obj->country_code):$obj->country):'';
2015-11-18 06:34:08 +01:00
2017-10-07 13:09:31 +02:00
$this -> state_id = $obj -> state_id ;
$this -> state_code = $obj -> state_code ;
2019-11-13 19:35:39 +01:00
$this -> state = ( $obj -> state != '-' ? $obj -> state : '' );
2015-11-18 06:34:08 +01:00
2012-10-05 12:40:19 +02:00
$this -> office_phone = $obj -> office_phone ;
2019-03-16 08:53:06 +01:00
$this -> office_fax = $obj -> office_fax ;
$this -> user_mobile = $obj -> user_mobile ;
$this -> personal_mobile = $obj -> personal_mobile ;
2019-12-18 15:20:36 +01:00
$this -> email = $obj -> email ;
2019-09-12 18:32:47 +02:00
$this -> personal_email = $obj -> personal_email ;
2019-10-01 19:59:49 +02:00
$this -> socialnetworks = ( array ) json_decode ( $obj -> socialnetworks , true );
2019-12-18 15:20:36 +01:00
$this -> job = $obj -> job ;
$this -> signature = $obj -> signature ;
2012-10-05 12:40:19 +02:00
$this -> admin = $obj -> admin ;
2019-12-18 15:20:36 +01:00
$this -> note_public = $obj -> note_public ;
$this -> note_private = $obj -> note_private ;
2019-11-02 12:59:38 +01:00
$this -> note = $obj -> note_private ;
2012-10-05 12:40:19 +02:00
$this -> statut = $obj -> statut ;
$this -> photo = $obj -> photo ;
$this -> openid = $obj -> openid ;
$this -> lang = $obj -> lang ;
$this -> entity = $obj -> entity ;
2019-02-25 20:35:59 +01:00
$this -> accountancy_code = $obj -> accountancy_code ;
2014-03-16 20:37:43 +01:00
$this -> thm = $obj -> thm ;
2014-09-13 17:41:26 +02:00
$this -> tjm = $obj -> tjm ;
2019-11-13 19:35:39 +01:00
$this -> salary = $obj -> salary ;
2019-02-27 14:21:15 +01:00
$this -> salaryextra = $obj -> salaryextra ;
2019-02-25 20:35:59 +01:00
$this -> weeklyhours = $obj -> weeklyhours ;
2019-02-27 14:21:15 +01:00
$this -> color = $obj -> color ;
2019-02-25 20:35:59 +01:00
$this -> dateemployment = $this -> db -> jdate ( $obj -> dateemployment );
2018-05-12 17:59:43 +02:00
$this -> dateemploymentend = $this -> db -> jdate ( $obj -> dateemploymentend );
2012-10-05 12:40:19 +02:00
$this -> datec = $this -> db -> jdate ( $obj -> datec );
$this -> datem = $this -> db -> jdate ( $obj -> datem );
2019-11-13 19:35:39 +01:00
$this -> datelastlogin = $this -> db -> jdate ( $obj -> datel );
$this -> datepreviouslogin = $this -> db -> jdate ( $obj -> datep );
2008-07-19 18:53:56 +02:00
2019-02-27 14:21:15 +01:00
$this -> societe_id = $obj -> fk_soc ; // deprecated
2019-11-13 19:35:39 +01:00
$this -> contact_id = $obj -> fk_socpeople ; // deprecated
2015-04-18 18:11:01 +02:00
$this -> socid = $obj -> fk_soc ;
2014-09-24 01:35:29 +02:00
$this -> contactid = $obj -> fk_socpeople ;
2007-10-02 15:54:34 +02:00
$this -> fk_member = $obj -> fk_member ;
2019-11-13 19:35:39 +01:00
$this -> fk_user = $obj -> fk_user ;
2019-03-16 08:53:06 +01:00
$this -> fk_user_expense_validator = $obj -> fk_user_expense_validator ;
$this -> fk_user_holiday_validator = $obj -> fk_user_holiday_validator ;
2017-09-11 00:02:52 +02:00
2019-02-25 20:35:59 +01:00
$this -> default_range = $obj -> default_range ;
$this -> default_c_exp_tax_cat = $obj -> default_c_exp_tax_cat ;
2019-02-27 14:21:15 +01:00
$this -> fk_warehouse = $obj -> fk_warehouse ;
2013-06-16 21:31:21 +02:00
2017-06-25 17:09:08 +02:00
// Protection when module multicompany was set, admin was set to first entity and then, the module was disabled,
// in such case, this admin user must be admin for ALL entities.
2016-03-17 09:22:12 +01:00
if ( empty ( $conf -> multicompany -> enabled ) && $this -> admin && $this -> entity == 1 ) $this -> entity = 0 ;
2018-02-20 19:38:18 +01:00
// Retreive all extrafield
2013-05-10 12:03:27 +02:00
// fetch optionals attributes and labels
2018-02-20 19:38:18 +01:00
$this -> fetch_optionals ();
2007-04-13 18:11:44 +02:00
$this -> db -> free ( $result );
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = " USERNOTFOUND " ;
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::fetch user not found " , LOG_DEBUG );
2007-04-13 18:11:44 +02:00
$this -> db -> free ( $result );
2007-10-02 20:16:29 +02:00
return 0 ;
2008-07-19 18:53:56 +02:00
}
2007-04-13 18:11:44 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2007-04-13 18:11:44 +02:00
return - 1 ;
}
2008-07-19 18:53:56 +02:00
2014-10-16 06:20:54 +02:00
// To get back the global configuration unique to the user
2008-08-30 01:49:53 +02:00
if ( $loadpersonalconf )
2007-04-13 18:11:44 +02:00
{
2017-10-07 13:09:31 +02:00
// Load user->conf for user
2007-04-13 18:11:44 +02:00
$sql = " SELECT param, value FROM " . MAIN_DB_PREFIX . " user_param " ;
2019-11-13 19:35:39 +01:00
$sql .= " WHERE fk_user = " . $this -> id ;
$sql .= " AND entity = " . $conf -> entity ;
2014-06-13 01:34:39 +02:00
//dol_syslog(get_class($this).'::fetch load personalized conf', LOG_DEBUG);
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2012-01-15 19:07:01 +01:00
if ( $resql )
2007-04-13 18:11:44 +02:00
{
2012-01-15 19:07:01 +01:00
$num = $this -> db -> num_rows ( $resql );
2007-04-13 18:11:44 +02:00
$i = 0 ;
while ( $i < $num )
{
2012-01-15 19:07:01 +01:00
$obj = $this -> db -> fetch_object ( $resql );
2019-11-13 19:35:39 +01:00
$p = ( ! empty ( $obj -> param ) ? $obj -> param : '' );
if ( ! empty ( $p )) $this -> conf -> $p = $obj -> value ;
2007-04-13 18:11:44 +02:00
$i ++ ;
}
2012-01-15 19:07:01 +01:00
$this -> db -> free ( $resql );
2007-04-13 18:11:44 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2008-08-30 01:49:53 +02:00
return - 2 ;
2007-04-13 18:11:44 +02:00
}
2017-06-06 07:57:03 +02:00
2018-12-15 18:11:40 +01:00
$result = $this -> loadDefaultValues ();
if ( $result < 0 )
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2018-12-15 18:11:40 +01:00
return - 3 ;
}
}
return 1 ;
}
/**
* Load default value in property -> default_values
*
* @ return int > 0 if OK , < 0 if KO
*/
2019-02-25 20:35:59 +01:00
public function loadDefaultValues ()
2018-12-15 18:11:40 +01:00
{
global $conf ;
// Load user->default_values for user. TODO Save this in memcached ?
$sql = " SELECT rowid, entity, type, page, param, value " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " default_values " ;
$sql .= " WHERE entity IN ( " . ( $this -> entity > 0 ? $this -> entity . " , " : " " ) . $conf -> entity . " ) " ; // Entity of user (if defined) + current entity
$sql .= " AND user_id IN (0 " . ( $this -> id > 0 ? " , " . $this -> id : " " ) . " ) " ; // User 0 (all) + me (if defined)
2018-12-15 18:11:40 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
while ( $obj = $this -> db -> fetch_object ( $resql ))
2017-04-14 12:39:11 +02:00
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $obj -> page ) && ! empty ( $obj -> type ) && ! empty ( $obj -> param ))
2017-10-07 13:09:31 +02:00
{
2018-12-15 18:11:40 +01:00
// $obj->page is relative URL with or without params
// $obj->type can be 'filters', 'sortorder', 'createform', ...
// $obj->param is key or param
2019-11-13 19:35:39 +01:00
$pagewithoutquerystring = $obj -> page ;
$pagequeries = '' ;
2019-12-22 13:19:14 +01:00
$reg = array ();
2018-12-15 18:11:40 +01:00
if ( preg_match ( '/^([^\?]+)\?(.*)$/' , $pagewithoutquerystring , $reg )) // There is query param
2017-10-07 13:09:31 +02:00
{
2019-11-13 19:35:39 +01:00
$pagewithoutquerystring = $reg [ 1 ];
$pagequeries = $reg [ 2 ];
2017-10-07 13:09:31 +02:00
}
2019-11-13 19:35:39 +01:00
$this -> default_values [ $pagewithoutquerystring ][ $obj -> type ][ $pagequeries ? $pagequeries : '_noquery_' ][ $obj -> param ] = $obj -> value ;
2018-12-15 18:11:40 +01:00
//if ($pagequeries) $this->default_values[$pagewithoutquerystring][$obj->type.'_queries']=$pagequeries;
2017-10-07 13:09:31 +02:00
}
2018-12-15 18:11:40 +01:00
}
// Sort by key, so _noquery_ is last
2019-11-13 19:35:39 +01:00
if ( ! empty ( $this -> default_values )) {
foreach ( $this -> default_values as $a => $b )
2018-12-15 18:11:40 +01:00
{
2019-11-13 19:35:39 +01:00
foreach ( $b as $c => $d )
2017-10-07 13:09:31 +02:00
{
2018-12-15 18:11:40 +01:00
krsort ( $this -> default_values [ $a ][ $c ]);
2017-10-07 13:09:31 +02:00
}
}
2017-04-14 12:52:32 +02:00
}
2018-12-15 18:11:40 +01:00
$this -> db -> free ( $resql );
2017-06-06 07:57:03 +02:00
2018-12-15 18:11:40 +01:00
return 1 ;
}
else
{
dol_print_error ( $this -> db );
return - 1 ;
}
2007-04-13 18:11:44 +02:00
}
2008-07-19 18:53:56 +02:00
/**
2014-10-16 06:20:54 +02:00
* Add a right to the user
2011-09-04 20:41:19 +02:00
*
2018-07-02 09:34:34 +02:00
* @ param int $rid Id of permission to add or 0 to add several permissions
2019-06-20 02:43:56 +02:00
* @ param string $allmodule Add all permissions of module $allmodule or 'allmodules' to include all modules .
* @ param string $allperms Add all permissions of module $allmodule , subperms $allperms only or '' to include all permissions .
2012-09-27 11:54:51 +02:00
* @ param int $entity Entity to use
2017-10-07 13:09:31 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = Execute triggers
2012-09-27 11:54:51 +02:00
* @ return int > 0 if OK , < 0 if KO
2019-04-08 16:04:15 +02:00
* @ see clearrights (), delrights (), getrights ()
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function addrights ( $rid , $allmodule = '' , $allperms = '' , $entity = 0 , $notrigger = 0 )
2008-07-19 18:53:56 +02:00
{
2017-02-28 11:48:46 +01:00
global $conf , $user , $langs ;
2009-05-07 01:30:49 +02:00
2019-11-13 19:35:39 +01:00
$entity = ( ! empty ( $entity ) ? $entity : $conf -> entity );
2012-09-27 11:54:51 +02:00
dol_syslog ( get_class ( $this ) . " ::addrights $rid , $allmodule , $allperms , $entity " );
2019-11-13 19:35:39 +01:00
$error = 0 ;
$whereforadd = '' ;
2008-07-19 18:53:56 +02:00
$this -> db -> begin ();
2019-11-13 19:35:39 +01:00
if ( ! empty ( $rid ))
2008-07-19 18:53:56 +02:00
{
// Si on a demande ajout d'un droit en particulier, on recupere
// les caracteristiques (module, perms et subperms) de ce droit.
$sql = " SELECT module, perms, subperms " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " rights_def " ;
$sql .= " WHERE id = ' " . $this -> db -> escape ( $rid ) . " ' " ;
$sql .= " AND entity = " . $entity ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
if ( $result ) {
$obj = $this -> db -> fetch_object ( $result );
2019-11-13 19:35:39 +01:00
$module = $obj -> module ;
$perms = $obj -> perms ;
$subperms = $obj -> subperms ;
2008-07-19 18:53:56 +02:00
}
else {
2017-02-28 11:48:46 +01:00
$error ++ ;
2009-02-20 23:53:15 +01:00
dol_print_error ( $this -> db );
2008-07-19 18:53:56 +02:00
}
// Where pour la liste des droits a ajouter
2019-11-13 19:35:39 +01:00
$whereforadd = " id= " . $this -> db -> escape ( $rid );
2008-07-19 18:53:56 +02:00
// Ajout des droits induits
2019-11-13 19:35:39 +01:00
if ( ! empty ( $subperms )) $whereforadd .= " OR (module=' $module ' AND perms=' $perms ' AND (subperms='lire' OR subperms='read')) " ;
elseif ( ! empty ( $perms )) $whereforadd .= " OR (module=' $module ' AND (perms='lire' OR perms='read') AND subperms IS NULL) " ;
2008-07-19 18:53:56 +02:00
}
else {
// On a pas demande un droit en particulier mais une liste de droits
// sur la base d'un nom de module de de perms
// Where pour la liste des droits a ajouter
2019-11-13 19:35:39 +01:00
if ( ! empty ( $allmodule ))
2017-10-22 13:05:47 +02:00
{
2018-07-03 21:46:20 +02:00
if ( $allmodule == 'allmodules' )
{
2019-11-13 19:35:39 +01:00
$whereforadd = 'allmodules' ;
2018-07-03 21:46:20 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$whereforadd = " module=' " . $this -> db -> escape ( $allmodule ) . " ' " ;
if ( ! empty ( $allperms )) $whereforadd .= " AND perms=' " . $this -> db -> escape ( $allperms ) . " ' " ;
2018-07-03 21:46:20 +02:00
}
2017-10-22 13:05:47 +02:00
}
2008-07-19 18:53:56 +02:00
}
// Ajout des droits trouves grace au critere whereforadd
2019-11-13 19:35:39 +01:00
if ( ! empty ( $whereforadd ))
2008-07-19 18:53:56 +02:00
{
//print "$module-$perms-$subperms";
$sql = " SELECT id " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " rights_def " ;
$sql .= " WHERE entity = " . $entity ;
if ( ! empty ( $whereforadd ) && $whereforadd != 'allmodules' ) {
$sql .= " AND " . $whereforadd ;
2018-07-03 21:46:20 +02:00
}
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
if ( $result )
{
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
while ( $i < $num )
{
$obj = $this -> db -> fetch_object ( $result );
$nid = $obj -> id ;
2017-06-06 07:57:03 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " user_rights WHERE fk_user = " . $this -> id . " AND fk_id= " . $nid . " AND entity = " . $entity ;
2019-11-13 19:35:39 +01:00
if ( ! $this -> db -> query ( $sql )) $error ++ ;
2017-06-06 07:57:03 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " user_rights (entity, fk_user, fk_id) VALUES ( " . $entity . " , " . $this -> id . " , " . $nid . " ) " ;
2019-11-13 19:35:39 +01:00
if ( ! $this -> db -> query ( $sql )) $error ++ ;
2008-07-19 18:53:56 +02:00
$i ++ ;
}
}
else
{
2017-02-28 11:48:46 +01:00
$error ++ ;
2009-02-20 23:53:15 +01:00
dol_print_error ( $this -> db );
2008-07-19 18:53:56 +02:00
}
}
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $notrigger )
2017-02-28 11:48:46 +01:00
{
2017-12-08 12:38:22 +01:00
$langs -> load ( " other " );
2019-11-13 19:35:39 +01:00
$this -> context = array ( 'audit' => $langs -> trans ( " PermissionsAdd " ) . ( $rid ? ' (id=' . $rid . ')' : '' ));
2017-03-13 15:00:44 +01:00
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_MODIFY' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; }
// End call triggers
2017-02-28 11:48:46 +01:00
}
2017-03-13 15:00:44 +01:00
2017-02-28 11:48:46 +01:00
if ( $error ) {
2008-07-19 18:53:56 +02:00
$this -> db -> rollback ();
2017-02-28 11:48:46 +01:00
return - $error ;
2008-07-19 18:53:56 +02:00
}
else {
$this -> db -> commit ();
return 1 ;
}
}
2004-08-07 20:47:54 +02:00
2006-11-26 20:19:46 +01:00
/**
2014-10-16 06:20:54 +02:00
* Remove a right to the user
2011-09-04 20:41:19 +02:00
*
2011-09-20 19:34:15 +02:00
* @ param int $rid Id du droit a retirer
* @ param string $allmodule Retirer tous les droits du module allmodule
* @ param string $allperms Retirer tous les droits du module allmodule , perms allperms
2017-02-28 20:55:14 +01:00
* @ param int $entity Entity to use
2017-10-07 13:09:31 +02:00
* @ param int $notrigger 1 = Does not execute triggers , 0 = Execute triggers
2012-01-11 01:06:56 +01:00
* @ return int > 0 if OK , < 0 if OK
2019-04-04 18:33:12 +02:00
* @ see clearrights (), addrights (), getrights ()
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function delrights ( $rid , $allmodule = '' , $allperms = '' , $entity = 0 , $notrigger = 0 )
2008-07-19 18:53:56 +02:00
{
2017-02-28 11:48:46 +01:00
global $conf , $user , $langs ;
2009-05-07 01:30:49 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
$wherefordel = '' ;
$entity = ( ! empty ( $entity ) ? $entity : $conf -> entity );
2008-07-19 18:53:56 +02:00
$this -> db -> begin ();
2019-11-13 19:35:39 +01:00
if ( ! empty ( $rid )) {
2008-07-19 18:53:56 +02:00
// Si on a demande supression d'un droit en particulier, on recupere
// les caracteristiques module, perms et subperms de ce droit.
$sql = " SELECT module, perms, subperms " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " rights_def " ;
$sql .= " WHERE id = ' " . $this -> db -> escape ( $rid ) . " ' " ;
$sql .= " AND entity = " . $entity ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
if ( $result ) {
$obj = $this -> db -> fetch_object ( $result );
2019-11-13 19:35:39 +01:00
$module = $obj -> module ;
$perms = $obj -> perms ;
$subperms = $obj -> subperms ;
2008-07-19 18:53:56 +02:00
}
else {
2017-02-28 11:48:46 +01:00
$error ++ ;
2009-02-20 23:53:15 +01:00
dol_print_error ( $this -> db );
2008-07-19 18:53:56 +02:00
}
// Where pour la liste des droits a supprimer
2019-11-13 19:35:39 +01:00
$wherefordel = " id= " . $this -> db -> escape ( $rid );
2008-07-19 18:53:56 +02:00
// Suppression des droits induits
2019-11-13 19:35:39 +01:00
if ( $subperms == 'lire' || $subperms == 'read' ) $wherefordel .= " OR (module=' $module ' AND perms=' $perms ' AND subperms IS NOT NULL) " ;
if ( $perms == 'lire' || $perms == 'read' ) $wherefordel .= " OR (module=' $module ') " ;
2019-02-25 20:35:59 +01:00
} else {
2008-07-19 18:53:56 +02:00
// On a demande suppression d'un droit sur la base d'un nom de module ou perms
// Where pour la liste des droits a supprimer
2019-11-13 19:35:39 +01:00
if ( ! empty ( $allmodule ))
2018-07-03 21:46:20 +02:00
{
if ( $allmodule == 'allmodules' )
{
2019-11-13 19:35:39 +01:00
$wherefordel = 'allmodules' ;
2018-07-03 21:46:20 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$wherefordel = " module=' " . $this -> db -> escape ( $allmodule ) . " ' " ;
if ( ! empty ( $allperms )) $whereforadd .= " AND perms=' " . $this -> db -> escape ( $allperms ) . " ' " ;
2018-07-03 21:46:20 +02:00
}
}
2008-07-19 18:53:56 +02:00
}
// Suppression des droits selon critere defini dans wherefordel
2019-11-13 19:35:39 +01:00
if ( ! empty ( $wherefordel ))
2008-07-19 18:53:56 +02:00
{
//print "$module-$perms-$subperms";
$sql = " SELECT id " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " rights_def " ;
$sql .= " WHERE entity = " . $entity ;
if ( ! empty ( $wherefordel ) && $wherefordel != 'allmodules' ) {
$sql .= " AND " . $wherefordel ;
2018-07-03 21:46:20 +02:00
}
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
if ( $result )
{
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
while ( $i < $num )
{
$obj = $this -> db -> fetch_object ( $result );
$nid = $obj -> id ;
2009-04-27 22:37:50 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " user_rights " ;
2019-11-13 19:35:39 +01:00
$sql .= " WHERE fk_user = " . $this -> id . " AND fk_id= " . $nid ;
$sql .= " AND entity = " . $entity ;
if ( ! $this -> db -> query ( $sql )) $error ++ ;
2008-07-19 18:53:56 +02:00
$i ++ ;
}
}
else
{
2017-02-28 11:48:46 +01:00
$error ++ ;
2009-02-20 23:53:15 +01:00
dol_print_error ( $this -> db );
2008-07-19 18:53:56 +02:00
}
}
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $notrigger )
2017-02-28 11:48:46 +01:00
{
2017-12-08 12:38:22 +01:00
$langs -> load ( " other " );
2019-11-13 19:35:39 +01:00
$this -> context = array ( 'audit' => $langs -> trans ( " PermissionsDelete " ) . ( $rid ? ' (id=' . $rid . ')' : '' ));
2017-03-13 15:00:44 +01:00
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_MODIFY' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; }
// End call triggers
2017-02-28 11:48:46 +01:00
}
2017-03-13 15:00:44 +01:00
2017-02-28 11:48:46 +01:00
if ( $error ) {
2008-07-19 18:53:56 +02:00
$this -> db -> rollback ();
2017-02-28 11:48:46 +01:00
return - $error ;
2008-07-19 18:53:56 +02:00
}
else {
$this -> db -> commit ();
return 1 ;
}
}
/**
2011-09-20 19:34:15 +02:00
* Clear all permissions array of user
*
* @ return void
2019-04-08 16:04:15 +02:00
* @ see getrights ()
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function clearrights ()
2008-07-19 18:53:56 +02:00
{
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::clearrights reset user->rights " );
2019-11-13 19:35:39 +01:00
$this -> rights = '' ;
$this -> nb_rights = 0 ;
$this -> all_permissions_are_loaded = 0 ;
$this -> _tab_loaded = array ();
2006-11-26 20:19:46 +01:00
}
2007-02-28 04:13:34 +01:00
/**
2010-12-01 22:38:00 +01:00
* Load permissions granted to user into object user
2011-09-04 20:41:19 +02:00
*
2018-07-02 09:34:34 +02:00
* @ param string $moduletag Limit permission for a particular module ( '' by default means load all permissions )
* @ param int $forcereload Force reload of permissions even if they were already loaded ( ignore cache )
2011-09-20 19:34:15 +02:00
* @ return void
2019-04-08 16:04:15 +02:00
* @ see clearrights (), delrights (), addrights ()
2009-09-10 23:47:22 +02:00
*/
2019-02-25 20:35:59 +01:00
public function getrights ( $moduletag = '' , $forcereload = 0 )
2007-02-28 04:13:34 +01:00
{
2009-04-27 22:37:50 +02:00
global $conf ;
2009-05-07 01:30:49 +02:00
2018-07-02 09:34:34 +02:00
if ( empty ( $forcereload ))
2008-07-19 18:53:56 +02:00
{
2018-07-02 09:34:34 +02:00
if ( $moduletag && isset ( $this -> _tab_loaded [ $moduletag ]) && $this -> _tab_loaded [ $moduletag ])
{
// Rights for this module are already loaded, so we leave
return ;
}
2007-02-28 04:13:34 +01:00
2019-11-13 19:35:39 +01:00
if ( ! empty ( $this -> all_permissions_are_loaded ))
2018-07-02 09:34:34 +02:00
{
// We already loaded all rights for this user, so we leave
return ;
}
2007-02-28 04:13:34 +01:00
}
2008-07-19 18:53:56 +02:00
2019-06-18 20:15:04 +02:00
// Get permission of users + Get permissions of groups
2008-07-19 18:53:56 +02:00
2019-06-18 20:15:04 +02:00
// First user permissions
2018-11-13 20:20:46 +01:00
$sql = " SELECT DISTINCT r.module, r.perms, r.subperms " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " user_rights as ur " ;
$sql .= " , " . MAIN_DB_PREFIX . " rights_def as r " ;
$sql .= " WHERE r.id = ur.fk_id " ;
if ( ! empty ( $conf -> global -> MULTICOMPANY_BACKWARD_COMPATIBILITY ))
2017-07-31 06:01:05 +02:00
{
2019-11-13 19:35:39 +01:00
$sql .= " AND r.entity IN (0, " . ( ! empty ( $conf -> multicompany -> enabled ) && ! empty ( $conf -> global -> MULTICOMPANY_TRANSVERSE_MODE ) ? " 1, " : " " ) . $conf -> entity . " ) " ;
2017-07-31 06:01:05 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$sql .= " AND ur.entity = " . $conf -> entity ;
2017-07-31 06:01:05 +02:00
}
2019-11-13 19:35:39 +01:00
$sql .= " AND ur.fk_user= " . $this -> id ;
$sql .= " AND r.perms IS NOT NULL " ;
if ( $moduletag ) $sql .= " AND r.module = ' " . $this -> db -> escape ( $moduletag ) . " ' " ;
2008-07-19 18:53:56 +02:00
2012-01-11 01:06:56 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
2007-02-28 04:13:34 +01:00
{
2012-01-11 01:06:56 +01:00
$num = $this -> db -> num_rows ( $resql );
2007-02-28 04:13:34 +01:00
$i = 0 ;
while ( $i < $num )
{
2012-01-11 01:06:56 +01:00
$obj = $this -> db -> fetch_object ( $resql );
2007-02-28 04:13:34 +01:00
2019-11-13 19:35:39 +01:00
$module = $obj -> module ;
$perms = $obj -> perms ;
$subperms = $obj -> subperms ;
2007-10-24 01:28:13 +02:00
if ( $perms )
2007-02-28 04:13:34 +01:00
{
2019-11-13 19:35:39 +01:00
if ( ! isset ( $this -> rights ) || ! is_object ( $this -> rights )) $this -> rights = new stdClass (); // For avoid error
2017-12-15 15:15:14 +01:00
if ( $module )
2007-02-28 04:13:34 +01:00
{
2019-11-13 19:35:39 +01:00
if ( ! isset ( $this -> rights -> $module ) || ! is_object ( $this -> rights -> $module )) $this -> rights -> $module = new stdClass ();
2017-12-15 15:15:14 +01:00
if ( $subperms )
{
2019-11-13 19:35:39 +01:00
if ( ! isset ( $this -> rights -> $module -> $perms ) || ! is_object ( $this -> rights -> $module -> $perms )) $this -> rights -> $module -> $perms = new stdClass ();
if ( empty ( $this -> rights -> $module -> $perms -> $subperms )) $this -> nb_rights ++ ;
2017-12-15 15:15:14 +01:00
$this -> rights -> $module -> $perms -> $subperms = 1 ;
}
else
{
2019-11-13 19:35:39 +01:00
if ( empty ( $this -> rights -> $module -> $perms )) $this -> nb_rights ++ ;
2017-12-15 15:15:14 +01:00
$this -> rights -> $module -> $perms = 1 ;
}
2007-02-28 04:13:34 +01:00
}
}
$i ++ ;
}
2012-01-11 01:06:56 +01:00
$this -> db -> free ( $resql );
2007-02-28 04:13:34 +01:00
}
2019-06-18 20:15:04 +02:00
// Now permissions of groups
2018-11-13 20:20:46 +01:00
$sql = " SELECT DISTINCT r.module, r.perms, r.subperms " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " usergroup_rights as gr, " ;
$sql .= " " . MAIN_DB_PREFIX . " usergroup_user as gu, " ;
$sql .= " " . MAIN_DB_PREFIX . " rights_def as r " ;
$sql .= " WHERE r.id = gr.fk_id " ;
if ( ! empty ( $conf -> global -> MULTICOMPANY_BACKWARD_COMPATIBILITY ))
{
if ( ! empty ( $conf -> multicompany -> enabled ) && ! empty ( $conf -> global -> MULTICOMPANY_TRANSVERSE_MODE )) {
$sql .= " AND gu.entity IN (0, " . $conf -> entity . " ) " ;
2017-07-31 06:01:05 +02:00
} else {
2019-11-13 19:35:39 +01:00
$sql .= " AND r.entity = " . $conf -> entity ;
2017-07-31 06:01:05 +02:00
}
}
else
{
2019-11-13 19:35:39 +01:00
$sql .= " AND gr.entity = " . $conf -> entity ;
2019-12-14 14:53:49 +01:00
$sql .= " AND gu.entity = " . $conf -> entity ;
2019-11-13 19:35:39 +01:00
$sql .= " AND r.entity = " . $conf -> entity ;
2017-07-31 06:01:05 +02:00
}
2019-11-13 19:35:39 +01:00
$sql .= " AND gr.fk_usergroup = gu.fk_usergroup " ;
$sql .= " AND gu.fk_user = " . $this -> id ;
$sql .= " AND r.perms IS NOT NULL " ;
if ( $moduletag ) $sql .= " AND r.module = ' " . $this -> db -> escape ( $moduletag ) . " ' " ;
2007-02-28 04:13:34 +01:00
2012-01-11 01:06:56 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
2007-02-28 04:13:34 +01:00
{
2012-01-11 01:06:56 +01:00
$num = $this -> db -> num_rows ( $resql );
2007-02-28 04:13:34 +01:00
$i = 0 ;
while ( $i < $num )
{
2012-01-11 01:06:56 +01:00
$obj = $this -> db -> fetch_object ( $resql );
2007-02-28 04:13:34 +01:00
2019-11-13 19:35:39 +01:00
$module = $obj -> module ;
$perms = $obj -> perms ;
$subperms = $obj -> subperms ;
2007-02-28 04:13:34 +01:00
2012-01-11 01:06:56 +01:00
if ( $perms )
{
2019-11-13 19:35:39 +01:00
if ( ! isset ( $this -> rights ) || ! is_object ( $this -> rights )) $this -> rights = new stdClass (); // For avoid error
if ( ! isset ( $this -> rights -> $module ) || ! is_object ( $this -> rights -> $module )) $this -> rights -> $module = new stdClass ();
2012-01-11 01:06:56 +01:00
if ( $subperms )
2007-02-28 04:13:34 +01:00
{
2019-11-13 19:35:39 +01:00
if ( ! isset ( $this -> rights -> $module -> $perms ) || ! is_object ( $this -> rights -> $module -> $perms )) $this -> rights -> $module -> $perms = new stdClass ();
if ( empty ( $this -> rights -> $module -> $perms -> $subperms )) $this -> nb_rights ++ ;
2012-01-11 01:06:56 +01:00
$this -> rights -> $module -> $perms -> $subperms = 1 ;
2007-02-28 04:13:34 +01:00
}
else
{
2019-11-13 19:35:39 +01:00
if ( empty ( $this -> rights -> $module -> $perms )) $this -> nb_rights ++ ;
2018-07-11 18:09:29 +02:00
// if we have already define a subperm like this $this->rights->$module->level1->level2 with llx_user_rights, we don't want override level1 because the level2 can be not define on user group
if ( ! is_object ( $this -> rights -> $module -> $perms )) $this -> rights -> $module -> $perms = 1 ;
2007-02-28 04:13:34 +01:00
}
}
$i ++ ;
}
2012-01-11 01:06:56 +01:00
$this -> db -> free ( $resql );
2007-02-28 04:13:34 +01:00
}
2012-04-28 17:59:08 +02:00
2012-04-06 12:14:16 +02:00
// For backward compatibility
2019-11-13 19:35:39 +01:00
if ( isset ( $this -> rights -> propale ) && ! isset ( $this -> rights -> propal )) $this -> rights -> propal = $this -> rights -> propale ;
if ( isset ( $this -> rights -> propal ) && ! isset ( $this -> rights -> propale )) $this -> rights -> propale = $this -> rights -> propal ;
2007-02-28 04:13:34 +01:00
2019-11-13 19:35:39 +01:00
if ( ! $moduletag )
2007-02-28 04:13:34 +01:00
{
2007-12-19 11:24:18 +01:00
// Si module etait non defini, alors on a tout charge, on peut donc considerer
// que les droits sont en cache (car tous charges) pour cet instance de user
2019-11-13 19:35:39 +01:00
$this -> all_permissions_are_loaded = 1 ;
2007-02-28 04:13:34 +01:00
}
else
{
2019-06-18 20:15:04 +02:00
// If module defined, we flag it as loaded into cache
2019-11-13 19:35:39 +01:00
$this -> _tab_loaded [ $moduletag ] = 1 ;
2007-02-28 04:13:34 +01:00
}
}
2003-08-11 20:56:42 +02:00
2008-07-19 18:53:56 +02:00
/**
2011-09-20 19:34:15 +02:00
* Change status of a user
2011-09-04 20:41:19 +02:00
*
2019-11-02 11:36:48 +01:00
* @ param int $status Status to set
2011-09-20 19:34:15 +02:00
* @ return int < 0 if KO , 0 if nothing is done , > 0 if OK
2008-07-19 18:53:56 +02:00
*/
2019-11-02 11:36:48 +01:00
public function setstatus ( $status )
2008-01-29 21:34:58 +01:00
{
2019-11-13 19:35:39 +01:00
global $conf , $langs , $user ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2008-07-19 18:53:56 +02:00
2008-03-20 22:22:35 +01:00
// Check parameters
2019-11-02 11:36:48 +01:00
if ( $this -> statut == $status ) return 0 ;
else $this -> statut = $status ;
2008-07-19 18:53:56 +02:00
2008-01-29 21:34:58 +01:00
$this -> db -> begin ();
2008-07-19 18:53:56 +02:00
2019-11-02 11:36:48 +01:00
// Save in database
2008-01-29 21:34:58 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user " ;
2019-11-13 19:35:39 +01:00
$sql .= " SET statut = " . $this -> statut ;
$sql .= " WHERE rowid = " . $this -> id ;
2008-01-29 21:34:58 +01:00
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::setstatus " , LOG_DEBUG );
2008-01-29 21:34:58 +01:00
if ( $result )
{
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_ENABLEDISABLE' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; }
// End call triggers
2008-01-29 21:34:58 +01:00
}
2008-07-19 18:53:56 +02:00
2008-01-29 21:34:58 +01:00
if ( $error )
{
$this -> db -> rollback ();
return - $error ;
}
else
{
$this -> db -> commit ();
return 1 ;
}
}
2008-07-19 18:53:56 +02:00
2016-02-13 10:27:12 +01:00
/**
* Sets object to supplied categories .
*
* Deletes object from existing categories not supplied .
* Adds it to non existing supplied categories .
* Existing categories are left untouch .
*
* @ param int [] | int $categories Category or categories IDs
2018-08-14 12:23:10 +02:00
* @ return void
2016-02-13 10:27:12 +01:00
*/
public function setCategories ( $categories )
{
2019-12-05 14:06:03 +01:00
require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php' ;
2019-09-27 13:28:28 +02:00
$type_categ = Categorie :: TYPE_USER ;
2016-02-13 10:27:12 +01:00
// Handle single category
if ( ! is_array ( $categories )) {
$categories = array ( $categories );
}
// Get current categories
$c = new Categorie ( $this -> db );
2019-09-27 13:28:28 +02:00
$existing = $c -> containing ( $this -> id , $type_categ , 'id' );
2016-02-13 10:27:12 +01:00
// Diff
if ( is_array ( $existing )) {
$to_del = array_diff ( $existing , $categories );
$to_add = array_diff ( $categories , $existing );
} else {
$to_del = array (); // Nothing to delete
$to_add = $categories ;
}
// Process
foreach ( $to_del as $del ) {
if ( $c -> fetch ( $del ) > 0 ) {
2019-09-27 13:28:28 +02:00
$c -> del_type ( $this , $type_categ );
2016-02-13 10:27:12 +01:00
}
}
foreach ( $to_add as $add ) {
if ( $c -> fetch ( $add ) > 0 ) {
2019-09-27 13:28:28 +02:00
$c -> add_type ( $this , $type_categ );
2016-02-13 10:27:12 +01:00
}
}
return ;
}
2008-07-19 18:53:56 +02:00
/**
2018-12-22 17:34:27 +01:00
* Delete the user
2011-09-04 20:41:19 +02:00
*
2018-12-22 17:34:27 +01:00
* @ param User $user User than delete
* @ return int < 0 if KO , > 0 if OK
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function delete ( User $user )
2008-07-19 18:53:56 +02:00
{
2019-11-13 19:35:39 +01:00
global $conf , $langs ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2012-01-07 15:01:30 +01:00
2008-07-19 18:53:56 +02:00
$this -> db -> begin ();
2010-05-05 19:36:20 +02:00
$this -> fetch ( $this -> id );
2008-07-19 18:53:56 +02:00
2014-06-13 02:28:30 +02:00
dol_syslog ( get_class ( $this ) . " ::delete " , LOG_DEBUG );
2014-10-16 06:20:54 +02:00
// Remove rights
2008-07-19 18:53:56 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " user_rights WHERE fk_user = " . $this -> id ;
2014-06-13 02:28:30 +02:00
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $this -> db -> query ( $sql ))
2008-07-19 18:53:56 +02:00
{
2012-12-02 13:51:33 +01:00
$error ++ ;
2017-10-07 13:09:31 +02:00
$this -> error = $this -> db -> lasterror ();
2010-11-10 11:53:39 +01:00
}
2010-11-15 20:08:35 +01:00
2010-11-10 11:53:39 +01:00
// Remove group
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " usergroup_user WHERE fk_user = " . $this -> id ;
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $this -> db -> query ( $sql ))
2010-11-10 11:53:39 +01:00
{
2012-12-05 11:18:45 +01:00
$error ++ ;
2017-10-07 13:09:31 +02:00
$this -> error = $this -> db -> lasterror ();
2008-07-19 18:53:56 +02:00
}
2014-10-16 06:20:54 +02:00
// If contact, remove link
2019-12-05 14:06:03 +01:00
if ( $this -> contactid > 0 || $this -> contact_id > 0 )
2008-07-19 18:53:56 +02:00
{
2019-12-05 14:06:03 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " socpeople SET fk_user_creat = null WHERE rowid = " . (( $this -> contactid > 0 ) ? $this -> contactid : $this -> contact_id );
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $this -> db -> query ( $sql ))
2008-07-19 18:53:56 +02:00
{
2012-12-02 13:51:33 +01:00
$error ++ ;
2017-10-07 13:09:31 +02:00
$this -> error = $this -> db -> lasterror ();
2008-07-19 18:53:56 +02:00
}
}
2012-12-08 19:23:13 +01:00
// Remove extrafields
2019-11-13 19:35:39 +01:00
if (( ! $error ) && ( empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED ))) // For avoid conflicts if trigger used
2017-10-07 13:09:31 +02:00
{
2019-11-13 19:35:39 +01:00
$result = $this -> deleteExtraFields ();
2019-03-01 18:28:51 +01:00
if ( $result < 0 )
{
$error ++ ;
dol_syslog ( get_class ( $this ) . " ::delete error -4 " . $this -> error , LOG_ERR );
}
2017-10-07 13:09:31 +02:00
}
2012-12-02 13:51:33 +01:00
// Remove user
2019-11-13 19:35:39 +01:00
if ( ! $error )
2017-10-07 13:09:31 +02:00
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " user WHERE rowid = " . $this -> id ;
dol_syslog ( get_class ( $this ) . " ::delete " , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
if ( ! $this -> db -> query ( $sql ))
2017-10-07 13:09:31 +02:00
{
$error ++ ;
$this -> error = $this -> db -> lasterror ();
}
}
2012-12-02 13:51:33 +01:00
2019-11-13 19:35:39 +01:00
if ( ! $error )
2008-07-19 18:53:56 +02:00
{
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_DELETE' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 )
{
$error ++ ;
$this -> db -> rollback ();
return - 1 ;
}
// End call triggers
2014-07-05 08:59:41 +02:00
2008-07-19 18:53:56 +02:00
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> db -> rollback ();
return - 1 ;
}
}
/**
2010-11-15 20:08:35 +01:00
* Create a user into database
2011-09-04 20:41:19 +02:00
*
2015-08-20 15:18:36 +02:00
* @ param User $user Objet user doing creation
* @ param int $notrigger 1 = do not execute triggers , 0 otherwise
* @ return int < 0 if KO , id of created user if OK
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function create ( $user , $notrigger = 0 )
2007-09-09 22:10:20 +02:00
{
2019-11-13 19:35:39 +01:00
global $conf , $langs ;
2012-03-11 21:45:17 +01:00
global $mysoc ;
2008-07-19 18:53:56 +02:00
2009-05-07 01:30:49 +02:00
// Clean parameters
2019-12-12 17:29:11 +01:00
2019-12-18 15:20:36 +01:00
if ( ! empty ( $conf -> global -> MAIN_FIRST_TO_UPPER )) $this -> lastname = ucwords ( $this -> lastname );
if ( ! empty ( $conf -> global -> MAIN_ALL_TO_UPPER )) $this -> lastname = strtoupper ( $this -> lastname );
if ( ! empty ( $conf -> global -> MAIN_FIRST_TO_UPPER )) $this -> firstname = ucwords ( $this -> firstname );
2019-12-12 17:29:11 +01:00
2007-09-09 22:10:20 +02:00
$this -> login = trim ( $this -> login );
2019-11-13 19:35:39 +01:00
if ( ! isset ( $this -> entity )) $this -> entity = $conf -> entity ; // If not defined, we use default value
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
dol_syslog ( get_class ( $this ) . " ::create login= " . $this -> login . " , user= " . ( is_object ( $user ) ? $user -> id : '' ), LOG_DEBUG );
2008-07-19 18:53:56 +02:00
2010-01-08 18:33:30 +01:00
// Check parameters
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> USER_MAIL_REQUIRED ) && ! isValidEMail ( $this -> email ))
2010-01-08 18:33:30 +01:00
{
$langs -> load ( " errors " );
2019-01-27 11:55:16 +01:00
$this -> error = $langs -> trans ( " ErrorBadEMail " , $this -> email );
2010-01-08 18:33:30 +01:00
return - 1 ;
}
2015-08-20 15:18:36 +02:00
if ( empty ( $this -> login ))
{
$langs -> load ( " errors " );
2019-01-27 11:55:16 +01:00
$this -> error = $langs -> trans ( " ErrorFieldRequired " , $langs -> transnoentitiesnoconv ( " Login " ));
2015-08-20 15:18:36 +02:00
return - 1 ;
}
2010-01-08 18:33:30 +01:00
2011-11-30 11:27:48 +01:00
$this -> datec = dol_now ();
2010-05-05 19:27:12 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2007-09-09 22:10:20 +02:00
$this -> db -> begin ();
2008-07-19 18:53:56 +02:00
2007-09-09 22:10:20 +02:00
$sql = " SELECT login FROM " . MAIN_DB_PREFIX . " user " ;
2019-11-13 19:35:39 +01:00
$sql .= " WHERE login =' " . $this -> db -> escape ( $this -> login ) . " ' " ;
$sql .= " AND entity IN (0, " . $this -> db -> escape ( $conf -> entity ) . " ) " ;
2017-03-13 15:00:44 +01:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2007-09-09 22:10:20 +02:00
if ( $resql )
{
$num = $this -> db -> num_rows ( $resql );
$this -> db -> free ( $resql );
2008-08-30 01:49:53 +02:00
2007-09-09 22:10:20 +02:00
if ( $num )
{
2007-12-16 21:05:55 +01:00
$this -> error = 'ErrorLoginAlreadyExists' ;
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_WARNING );
2007-12-19 11:24:18 +01:00
$this -> db -> rollback ();
2007-09-09 22:10:20 +02:00
return - 6 ;
}
else
{
2009-04-27 22:37:50 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " user (datec,login,ldap_sid,entity) " ;
2019-11-13 19:35:39 +01:00
$sql .= " VALUES(' " . $this -> db -> idate ( $this -> datec ) . " ',' " . $this -> db -> escape ( $this -> login ) . " ',' " . $this -> db -> escape ( $this -> ldap_sid ) . " ', " . $this -> db -> escape ( $this -> entity ) . " ) " ;
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2007-09-09 22:10:20 +02:00
if ( $result )
{
2010-05-17 14:43:36 +02:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " user " );
2008-08-30 01:49:53 +02:00
2007-09-09 22:10:20 +02:00
// Set default rights
if ( $this -> set_default_rights () < 0 )
{
2019-11-13 19:35:39 +01:00
$this -> error = 'ErrorFailedToSetDefaultRightOfUser' ;
2007-09-09 22:10:20 +02:00
$this -> db -> rollback ();
return - 5 ;
}
2017-03-13 15:00:44 +01:00
2007-09-09 22:10:20 +02:00
// Update minor fields
2019-01-27 11:55:16 +01:00
$result = $this -> update ( $user , 1 , 1 );
2007-10-22 01:04:06 +02:00
if ( $result < 0 )
2007-09-09 22:10:20 +02:00
{
2006-12-05 23:55:50 +01:00
$this -> db -> rollback ();
return - 4 ;
}
2007-09-09 22:10:20 +02:00
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> STOCK_USERSTOCK_AUTOCREATE ))
2007-09-09 22:10:20 +02:00
{
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php' ;
2010-06-02 00:22:09 +02:00
$langs -> load ( " stocks " );
2007-09-09 22:10:20 +02:00
$entrepot = new Entrepot ( $this -> db );
2019-11-02 12:59:38 +01:00
$entrepot -> label = $langs -> trans ( " PersonalStock " , $this -> getFullName ( $langs ));
2019-12-18 15:20:36 +01:00
$entrepot -> libelle = $entrepot -> label ; // For backward compatibility
2019-01-27 11:55:16 +01:00
$entrepot -> description = $langs -> trans ( " ThisWarehouseIsPersonalStock " , $this -> getFullName ( $langs ));
2007-09-09 22:10:20 +02:00
$entrepot -> statut = 1 ;
2012-03-11 21:45:17 +01:00
$entrepot -> country_id = $mysoc -> country_id ;
2007-09-09 22:10:20 +02:00
$entrepot -> create ( $user );
}
2017-03-13 15:00:44 +01:00
2019-11-13 19:35:39 +01:00
if ( ! $notrigger )
2007-09-09 22:10:20 +02:00
{
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_CREATE' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; }
// End call triggers
2007-07-25 19:46:47 +02:00
}
2008-08-30 01:49:53 +02:00
2019-11-13 19:35:39 +01:00
if ( ! $error )
2006-12-05 23:55:50 +01:00
{
$this -> db -> commit ();
return $this -> id ;
}
else
{
2014-07-03 14:01:01 +02:00
//$this->error=$interface->error;
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::create " . $this -> error , LOG_ERR );
2006-12-05 23:55:50 +01:00
$this -> db -> rollback ();
return - 3 ;
}
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2006-12-05 23:55:50 +01:00
$this -> db -> rollback ();
return - 2 ;
}
}
}
2006-12-04 12:31:57 +01:00
else
2006-12-05 23:55:50 +01:00
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2006-12-05 23:55:50 +01:00
$this -> db -> rollback ();
return - 1 ;
}
}
2004-08-07 20:47:54 +02:00
2005-09-26 21:37:20 +02:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2007-09-09 22:10:20 +02:00
/**
2011-09-20 19:34:15 +02:00
* Create a user from a contact object . User will be internal but if contact is linked to a third party , user will be external
2011-09-04 20:41:19 +02:00
*
2011-09-20 19:34:15 +02:00
* @ param Contact $contact Object for source contact
* @ param string $login Login to force
* @ param string $password Password to force
* @ return int < 0 if error , if OK returns id of created user
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function create_from_contact ( $contact , $login = '' , $password = '' )
2007-09-09 22:10:20 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2019-11-13 19:35:39 +01:00
global $conf , $user , $langs ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2012-01-07 15:01:30 +01:00
2015-11-18 06:34:08 +01:00
// Define parameters
2019-02-25 20:35:59 +01:00
$this -> admin = 0 ;
$this -> lastname = $contact -> lastname ;
$this -> firstname = $contact -> firstname ;
$this -> gender = $contact -> gender ;
$this -> email = $contact -> email ;
2019-10-01 19:59:49 +02:00
$this -> socialnetworks = $contact -> socialnetworks ;
2019-02-25 20:35:59 +01:00
$this -> office_phone = $contact -> phone_pro ;
$this -> office_fax = $contact -> fax ;
$this -> user_mobile = $contact -> phone_mobile ;
$this -> address = $contact -> address ;
$this -> zip = $contact -> zip ;
$this -> town = $contact -> town ;
$this -> state_id = $contact -> state_id ;
$this -> country_id = $contact -> country_id ;
$this -> employee = 0 ;
2017-03-13 15:00:44 +01:00
2019-12-18 15:20:36 +01:00
if ( empty ( $login )) $login = strtolower ( substr ( $contact -> firstname , 0 , 4 )) . strtolower ( substr ( $contact -> lastname , 0 , 4 ));
2008-12-17 19:34:47 +01:00
$this -> login = $login ;
2008-07-19 18:53:56 +02:00
$this -> db -> begin ();
2019-10-07 14:16:47 +02:00
// Create user and set $this->id. Trigger is disabled because executed later.
2019-12-18 15:20:36 +01:00
$result = $this -> create ( $user , 1 );
2008-07-19 18:53:56 +02:00
if ( $result > 0 )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " user " ;
2019-12-18 15:20:36 +01:00
$sql .= " SET fk_socpeople= " . $contact -> id ;
if ( $contact -> socid ) $sql .= " , fk_soc= " . $contact -> socid ;
$sql .= " WHERE rowid= " . $this -> id ;
$resql = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::create_from_contact " , LOG_DEBUG );
2008-07-19 18:53:56 +02:00
if ( $resql )
{
2019-12-18 15:20:36 +01:00
$this -> context [ 'createfromcontact' ] = 'createfromcontact' ;
2015-07-19 15:24:54 +02:00
2017-10-07 13:09:31 +02:00
// Call trigger
2019-12-18 15:20:36 +01:00
$result = $this -> call_trigger ( 'USER_CREATE' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; $this -> db -> rollback (); return - 1 ; }
// End call triggers
2014-07-05 08:59:41 +02:00
2008-07-19 18:53:56 +02:00
$this -> db -> commit ();
return $this -> id ;
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> error ();
2008-07-19 18:53:56 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
else
{
// $this->error deja positionne
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::create_from_contact - 0 " );
2008-07-19 18:53:56 +02:00
$this -> db -> rollback ();
return $result ;
}
}
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2008-07-19 18:53:56 +02:00
/**
2011-09-20 19:34:15 +02:00
* Create a user into database from a member object
2011-09-04 20:41:19 +02:00
*
2011-09-20 19:34:15 +02:00
* @ param Adherent $member Object member source
* @ param string $login Login to force
* @ return int < 0 if KO , if OK , return id of created account
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function create_from_member ( $member , $login = '' )
2008-07-19 18:53:56 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2019-11-13 19:35:39 +01:00
global $conf , $user , $langs ;
2008-07-19 18:53:56 +02:00
2020-01-28 21:23:05 +01:00
// Set properties on new user
2009-01-14 15:59:28 +01:00
$this -> admin = 0 ;
2013-03-23 17:40:18 +01:00
$this -> lastname = $member -> lastname ;
$this -> firstname = $member -> firstname ;
2019-11-13 19:35:39 +01:00
$this -> gender = $member -> gender ;
2013-03-23 17:40:18 +01:00
$this -> email = $member -> email ;
$this -> fk_member = $member -> id ;
2013-03-30 14:27:13 +01:00
$this -> address = $member -> address ;
$this -> zip = $member -> zip ;
$this -> town = $member -> town ;
$this -> state_id = $member -> state_id ;
$this -> country_id = $member -> country_id ;
2020-01-28 21:23:05 +01:00
$this -> socialnetworks = $member -> socialnetworks ;
$this -> pass = $member -> pass ;
$this -> pass_crypted = $member -> pass_indatabase_crypted ;
2007-04-27 00:01:10 +02:00
2019-11-13 19:35:39 +01:00
if ( empty ( $login )) $login = strtolower ( substr ( $member -> firstname , 0 , 4 )) . strtolower ( substr ( $member -> lastname , 0 , 4 ));
2009-01-14 15:59:28 +01:00
$this -> login = $login ;
2007-04-27 00:01:10 +02:00
2008-07-19 18:53:56 +02:00
$this -> db -> begin ();
2007-04-27 00:01:10 +02:00
2014-01-23 09:19:15 +01:00
// Create and set $this->id
2019-11-13 19:35:39 +01:00
$result = $this -> create ( $user );
2008-07-19 18:53:56 +02:00
if ( $result > 0 )
{
2020-02-02 19:34:09 +01:00
if ( ! empty ( $this -> pass )) { // If a clear password was received (this situation should not happen anymore now), we use it to save it into database
2020-01-28 21:23:05 +01:00
$newpass = $this -> setPassword ( $user , $this -> pass );
if ( is_numeric ( $newpass ) && $newpass < 0 ) $result = - 2 ;
2020-02-02 19:34:09 +01:00
} elseif ( ! empty ( $this -> pass_crypted )) { // If a crypted password is already known, we save it directly into database because the previous create did not save it.
2020-01-28 21:23:05 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user " ;
$sql .= " SET pass_crypted = ' " . $this -> db -> escape ( $this -> pass_crypted ) . " ' " ;
$sql .= " WHERE rowid= " . $this -> id ;
$resql = $this -> db -> query ( $sql );
2020-02-02 19:34:09 +01:00
if ( ! $resql )
2020-01-28 21:23:05 +01:00
{
$result = - 1 ;
}
}
2014-02-17 11:48:57 +01:00
2014-01-23 09:19:15 +01:00
if ( $result > 0 && $member -> fk_soc ) // If member is linked to a thirdparty
{
2013-01-12 15:16:38 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user " ;
2019-11-13 19:35:39 +01:00
$sql .= " SET fk_soc= " . $member -> fk_soc ;
$sql .= " WHERE rowid= " . $this -> id ;
2013-02-11 20:45:36 +01:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::create_from_member " , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2013-01-12 15:16:38 +01:00
if ( $resql )
{
$this -> db -> commit ();
return $this -> id ;
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2013-02-11 20:45:36 +01:00
2013-01-12 15:16:38 +01:00
$this -> db -> rollback ();
return - 1 ;
}
2008-07-19 18:53:56 +02:00
}
}
2014-01-23 09:19:15 +01:00
if ( $result > 0 )
{
$this -> db -> commit ();
return $this -> id ;
}
2008-07-19 18:53:56 +02:00
else
{
// $this->error deja positionne
$this -> db -> rollback ();
2014-01-23 09:19:15 +01:00
return - 2 ;
2008-07-19 18:53:56 +02:00
}
}
2007-04-27 00:01:10 +02:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2007-04-27 00:01:10 +02:00
/**
2014-10-16 06:20:54 +02:00
* Assign rights by default
2011-09-04 20:41:19 +02:00
*
2015-03-17 00:21:17 +01:00
* @ return integer erreur < 0 , si ok renvoi le nbre de droits par defaut positionnes
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function set_default_rights ()
2008-07-19 18:53:56 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2009-04-27 22:37:50 +02:00
global $conf ;
2009-05-07 01:30:49 +02:00
2009-04-27 22:37:50 +02:00
$sql = " SELECT id FROM " . MAIN_DB_PREFIX . " rights_def " ;
2019-11-13 19:35:39 +01:00
$sql .= " WHERE bydefault = 1 " ;
$sql .= " AND entity = " . $conf -> entity ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2010-08-14 04:44:07 +02:00
if ( $resql )
2008-07-19 18:53:56 +02:00
{
2010-08-14 04:44:07 +02:00
$num = $this -> db -> num_rows ( $resql );
2008-07-19 18:53:56 +02:00
$i = 0 ;
$rd = array ();
while ( $i < $num )
{
2010-08-14 04:44:07 +02:00
$row = $this -> db -> fetch_row ( $resql );
2008-07-19 18:53:56 +02:00
$rd [ $i ] = $row [ 0 ];
$i ++ ;
}
2010-08-14 04:44:07 +02:00
$this -> db -> free ( $resql );
2008-07-19 18:53:56 +02:00
}
$i = 0 ;
while ( $i < $num )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " user_rights WHERE fk_user = $this->id AND fk_id= $rd[$i] " ;
2019-11-13 19:35:39 +01:00
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " user_rights (fk_user, fk_id) VALUES ( $this->id , $rd[$i] ) " ;
2019-11-13 19:35:39 +01:00
$result = $this -> db -> query ( $sql );
if ( ! $result ) return - 1 ;
2008-07-19 18:53:56 +02:00
$i ++ ;
}
return $i ;
}
/**
2013-02-11 20:45:36 +01:00
* Update a user into database ( and also password if this -> pass is defined )
2011-09-04 20:41:19 +02:00
*
2011-09-20 19:34:15 +02:00
* @ param User $user User qui fait la mise a jour
* @ param int $notrigger 1 ne declenche pas les triggers , 0 sinon
* @ param int $nosyncmember 0 = Synchronize linked member ( standard info ), 1 = Do not synchronize linked member
* @ param int $nosyncmemberpass 0 = Synchronize linked member ( password ), 1 = Do not synchronize linked member
2017-12-19 16:16:31 +01:00
* @ param int $nosynccontact 0 = Synchronize linked contact , 1 = Do not synchronize linked contact
2011-09-20 19:34:15 +02:00
* @ return int < 0 si KO , >= 0 si OK
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function update ( $user , $notrigger = 0 , $nosyncmember = 0 , $nosyncmemberpass = 0 , $nosynccontact = 0 )
2008-07-19 18:53:56 +02:00
{
2017-02-28 11:20:33 +01:00
global $conf , $langs ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$nbrowsaffected = 0 ;
$error = 0 ;
2007-09-09 22:10:20 +02:00
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::update notrigger= " . $notrigger . " , nosyncmember= " . $nosyncmember . " , nosyncmemberpass= " . $nosyncmemberpass );
2008-07-19 18:53:56 +02:00
2009-05-07 01:30:49 +02:00
// Clean parameters
2019-12-12 17:29:11 +01:00
2019-12-18 15:20:36 +01:00
if ( ! empty ( $conf -> global -> MAIN_FIRST_TO_UPPER )) $this -> lastname = ucwords ( $this -> lastname );
if ( ! empty ( $conf -> global -> MAIN_ALL_TO_UPPER )) $this -> lastname = strtoupper ( $this -> lastname );
if ( ! empty ( $conf -> global -> MAIN_FIRST_TO_UPPER )) $this -> firstname = ucwords ( $this -> firstname );
2019-12-12 17:29:11 +01:00
2011-09-03 19:28:10 +02:00
$this -> lastname = trim ( $this -> lastname );
$this -> firstname = trim ( $this -> firstname );
2019-11-13 19:35:39 +01:00
$this -> employee = $this -> employee ? $this -> employee : 0 ;
2008-07-19 18:53:56 +02:00
$this -> login = trim ( $this -> login );
2015-05-30 02:17:05 +02:00
$this -> gender = trim ( $this -> gender );
2017-10-06 12:08:01 +02:00
$this -> birth = trim ( $this -> birth );
2008-07-19 18:53:56 +02:00
$this -> pass = trim ( $this -> pass );
2017-10-07 13:09:31 +02:00
$this -> api_key = trim ( $this -> api_key );
2019-11-13 19:35:39 +01:00
$this -> address = $this -> address ? trim ( $this -> address ) : trim ( $this -> address );
$this -> zip = $this -> zip ? trim ( $this -> zip ) : trim ( $this -> zip );
$this -> town = $this -> town ? trim ( $this -> town ) : trim ( $this -> town );
$this -> state_id = trim ( $this -> state_id );
$this -> country_id = ( $this -> country_id > 0 ) ? $this -> country_id : 0 ;
2008-07-19 18:53:56 +02:00
$this -> office_phone = trim ( $this -> office_phone );
$this -> office_fax = trim ( $this -> office_fax );
$this -> user_mobile = trim ( $this -> user_mobile );
2019-11-13 19:35:39 +01:00
$this -> personal_mobile = trim ( $this -> personal_mobile );
2008-07-19 18:53:56 +02:00
$this -> email = trim ( $this -> email );
2019-03-16 08:53:06 +01:00
$this -> personal_email = trim ( $this -> personal_email );
2018-10-12 11:29:47 +02:00
2019-12-18 15:20:36 +01:00
$this -> job = trim ( $this -> job );
2011-09-24 01:46:14 +02:00
$this -> signature = trim ( $this -> signature );
2019-11-02 12:59:38 +01:00
$this -> note_public = trim ( $this -> note_public );
$this -> note_private = trim ( $this -> note_private );
2019-12-18 15:20:36 +01:00
$this -> openid = trim ( empty ( $this -> openid ) ? '' : $this -> openid ); // Avoid warning
$this -> admin = $this -> admin ? $this -> admin : 0 ;
$this -> address = empty ( $this -> address ) ? '' : $this -> address ;
$this -> zip = empty ( $this -> zip ) ? '' : $this -> zip ;
$this -> town = empty ( $this -> town ) ? '' : $this -> town ;
2013-06-25 11:14:00 +02:00
$this -> accountancy_code = trim ( $this -> accountancy_code );
2019-12-18 15:20:36 +01:00
$this -> color = empty ( $this -> color ) ? '' : $this -> color ;
$this -> dateemployment = empty ( $this -> dateemployment ) ? '' : $this -> dateemployment ;
$this -> dateemploymentend = empty ( $this -> dateemploymentend ) ? '' : $this -> dateemploymentend ;
$this -> fk_warehouse = trim ( empty ( $this -> fk_warehouse ) ? '' : $this -> fk_warehouse );
2017-09-11 00:02:52 +02:00
2010-01-08 18:33:30 +01:00
// Check parameters
2019-12-18 15:20:36 +01:00
if ( ! empty ( $conf -> global -> USER_MAIL_REQUIRED ) && ! isValidEMail ( $this -> email ))
2010-01-08 18:33:30 +01:00
{
$langs -> load ( " errors " );
2019-01-27 11:55:16 +01:00
$this -> error = $langs -> trans ( " ErrorBadEMail " , $this -> email );
2010-01-08 18:33:30 +01:00
return - 1 ;
}
2015-08-20 15:18:36 +02:00
if ( empty ( $this -> login ))
{
$langs -> load ( " errors " );
2019-01-27 11:55:16 +01:00
$this -> error = $langs -> trans ( " ErrorFieldRequired " , $this -> login );
2015-08-20 15:18:36 +02:00
return - 1 ;
}
2016-03-17 09:22:12 +01:00
2008-07-19 18:53:56 +02:00
$this -> db -> begin ();
2015-05-30 02:17:05 +02:00
// Update datas
2008-07-19 18:53:56 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user SET " ;
2019-12-18 15:20:36 +01:00
$sql .= " lastname = ' " . $this -> db -> escape ( $this -> lastname ) . " ' " ;
$sql .= " , firstname = ' " . $this -> db -> escape ( $this -> firstname ) . " ' " ;
$sql .= " , employee = " . ( int ) $this -> employee ;
$sql .= " , login = ' " . $this -> db -> escape ( $this -> login ) . " ' " ;
$sql .= " , api_key = " . ( $this -> api_key ? " ' " . $this -> db -> escape ( $this -> api_key ) . " ' " : " null " );
$sql .= " , gender = " . ( $this -> gender != - 1 ? " ' " . $this -> db -> escape ( $this -> gender ) . " ' " : " null " ); // 'man' or 'woman'
$sql .= " , birth= " . ( strval ( $this -> birth ) != '' ? " ' " . $this -> db -> idate ( $this -> birth ) . " ' " : 'null' );
if ( ! empty ( $user -> admin )) $sql .= " , admin = " . ( int ) $this -> admin ; // admin flag can be set/unset only by an admin user
$sql .= " , address = ' " . $this -> db -> escape ( $this -> address ) . " ' " ;
$sql .= " , zip = ' " . $this -> db -> escape ( $this -> zip ) . " ' " ;
$sql .= " , town = ' " . $this -> db -> escape ( $this -> town ) . " ' " ;
$sql .= " , fk_state = " . (( ! empty ( $this -> state_id ) && $this -> state_id > 0 ) ? " ' " . $this -> db -> escape ( $this -> state_id ) . " ' " : " null " );
$sql .= " , fk_country = " . (( ! empty ( $this -> country_id ) && $this -> country_id > 0 ) ? " ' " . $this -> db -> escape ( $this -> country_id ) . " ' " : " null " );
$sql .= " , office_phone = ' " . $this -> db -> escape ( $this -> office_phone ) . " ' " ;
$sql .= " , office_fax = ' " . $this -> db -> escape ( $this -> office_fax ) . " ' " ;
$sql .= " , user_mobile = ' " . $this -> db -> escape ( $this -> user_mobile ) . " ' " ;
$sql .= " , personal_mobile = ' " . $this -> db -> escape ( $this -> personal_mobile ) . " ' " ;
$sql .= " , email = ' " . $this -> db -> escape ( $this -> email ) . " ' " ;
$sql .= " , personal_email = ' " . $this -> db -> escape ( $this -> personal_email ) . " ' " ;
$sql .= " , socialnetworks = ' " . $this -> db -> escape ( json_encode ( $this -> socialnetworks )) . " ' " ;
$sql .= " , job = ' " . $this -> db -> escape ( $this -> job ) . " ' " ;
$sql .= " , signature = ' " . $this -> db -> escape ( $this -> signature ) . " ' " ;
$sql .= " , accountancy_code = ' " . $this -> db -> escape ( $this -> accountancy_code ) . " ' " ;
$sql .= " , color = ' " . $this -> db -> escape ( $this -> color ) . " ' " ;
$sql .= " , dateemployment= " . ( strval ( $this -> dateemployment ) != '' ? " ' " . $this -> db -> idate ( $this -> dateemployment ) . " ' " : 'null' );
$sql .= " , dateemploymentend= " . ( strval ( $this -> dateemploymentend ) != '' ? " ' " . $this -> db -> idate ( $this -> dateemploymentend ) . " ' " : 'null' );
$sql .= " , note = ' " . $this -> db -> escape ( $this -> note_private ) . " ' " ;
$sql .= " , note_public = ' " . $this -> db -> escape ( $this -> note_public ) . " ' " ;
$sql .= " , photo = " . ( $this -> photo ? " ' " . $this -> db -> escape ( $this -> photo ) . " ' " : " null " );
$sql .= " , openid = " . ( $this -> openid ? " ' " . $this -> db -> escape ( $this -> openid ) . " ' " : " null " );
$sql .= " , fk_user = " . ( $this -> fk_user > 0 ? " ' " . $this -> db -> escape ( $this -> fk_user ) . " ' " : " null " );
$sql .= " , fk_user_expense_validator = " . ( $this -> fk_user_expense_validator > 0 ? " ' " . $this -> db -> escape ( $this -> fk_user_expense_validator ) . " ' " : " null " );
$sql .= " , fk_user_holiday_validator = " . ( $this -> fk_user_holiday_validator > 0 ? " ' " . $this -> db -> escape ( $this -> fk_user_holiday_validator ) . " ' " : " null " );
if ( isset ( $this -> thm ) || $this -> thm != '' ) $sql .= " , thm= " . ( $this -> thm != '' ? " ' " . $this -> db -> escape ( $this -> thm ) . " ' " : " null " );
if ( isset ( $this -> tjm ) || $this -> tjm != '' ) $sql .= " , tjm= " . ( $this -> tjm != '' ? " ' " . $this -> db -> escape ( $this -> tjm ) . " ' " : " null " );
if ( isset ( $this -> salary ) || $this -> salary != '' ) $sql .= " , salary= " . ( $this -> salary != '' ? " ' " . $this -> db -> escape ( $this -> salary ) . " ' " : " null " );
if ( isset ( $this -> salaryextra ) || $this -> salaryextra != '' ) $sql .= " , salaryextra= " . ( $this -> salaryextra != '' ? " ' " . $this -> db -> escape ( $this -> salaryextra ) . " ' " : " null " );
$sql .= " , weeklyhours= " . ( $this -> weeklyhours != '' ? " ' " . $this -> db -> escape ( $this -> weeklyhours ) . " ' " : " null " );
$sql .= " , entity = ' " . $this -> db -> escape ( $this -> entity ) . " ' " ;
$sql .= " , default_range = " . ( $this -> default_range > 0 ? $this -> default_range : 'null' );
$sql .= " , default_c_exp_tax_cat = " . ( $this -> default_c_exp_tax_cat > 0 ? $this -> default_c_exp_tax_cat : 'null' );
$sql .= " , fk_warehouse = " . ( $this -> fk_warehouse ? " ' " . $this -> db -> escape ( $this -> fk_warehouse ) . " ' " : " null " );
$sql .= " WHERE rowid = " . $this -> id ;
2017-03-13 15:00:44 +01:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
2008-07-19 18:53:56 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2019-12-18 15:20:36 +01:00
$nbrowsaffected += $this -> db -> affected_rows ( $resql );
2008-08-30 01:49:53 +02:00
2009-07-27 02:08:49 +02:00
// Update password
2016-03-17 09:22:12 +01:00
if ( ! empty ( $this -> pass ))
2008-07-19 18:53:56 +02:00
{
if ( $this -> pass != $this -> pass_indatabase && $this -> pass != $this -> pass_indatabase_crypted )
{
// Si mot de passe saisi et different de celui en base
2019-11-13 19:35:39 +01:00
$result = $this -> setPassword ( $user , $this -> pass , 0 , $notrigger , $nosyncmemberpass );
if ( ! $nbrowsaffected ) $nbrowsaffected ++ ;
2008-07-19 18:53:56 +02:00
}
}
2008-08-30 01:49:53 +02:00
2009-05-07 01:30:49 +02:00
// If user is linked to a member, remove old link to this member
if ( $this -> fk_member > 0 )
2007-10-21 22:40:24 +02:00
{
2016-06-25 18:48:50 +02:00
dol_syslog ( get_class ( $this ) . " ::update remove link with member. We will recreate it later " , LOG_DEBUG );
2017-10-07 13:09:31 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user SET fk_member = NULL where fk_member = " . $this -> fk_member ;
2009-05-07 01:30:49 +02:00
$resql = $this -> db -> query ( $sql );
2019-11-13 19:35:39 +01:00
if ( ! $resql ) { $this -> error = $this -> db -> error (); $this -> db -> rollback (); return - 5 ; }
2009-05-07 01:30:49 +02:00
}
// Set link to user
2016-06-25 18:48:50 +02:00
dol_syslog ( get_class ( $this ) . " ::update set link with member " , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user SET fk_member = " . ( $this -> fk_member > 0 ? $this -> fk_member : 'null' ) . " where rowid = " . $this -> id ;
2009-05-07 01:30:49 +02:00
$resql = $this -> db -> query ( $sql );
2019-11-13 19:35:39 +01:00
if ( ! $resql ) { $this -> error = $this -> db -> error (); $this -> db -> rollback (); return - 5 ; }
2009-05-07 01:30:49 +02:00
if ( $nbrowsaffected ) // If something has changed in data
{
2019-11-13 19:35:39 +01:00
if ( $this -> fk_member > 0 && ! $nosyncmember )
2007-10-21 22:40:24 +02:00
{
2017-10-07 13:09:31 +02:00
dol_syslog ( get_class ( $this ) . " ::update user is linked with a member. We try to update member too. " , LOG_DEBUG );
2017-03-13 15:00:44 +01:00
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php' ;
2008-08-30 01:49:53 +02:00
2017-12-19 16:16:31 +01:00
// This user is linked with a member, so we also update member information
2007-10-21 22:40:24 +02:00
// if this is an update.
2019-12-18 15:20:36 +01:00
$adh = new Adherent ( $this -> db );
$result = $adh -> fetch ( $this -> fk_member );
2008-08-30 01:49:53 +02:00
2019-01-31 11:53:10 +01:00
if ( $result > 0 )
2007-09-09 22:10:20 +02:00
{
2019-12-18 15:20:36 +01:00
$adh -> firstname = $this -> firstname ;
$adh -> lastname = $this -> lastname ;
$adh -> login = $this -> login ;
$adh -> gender = $this -> gender ;
$adh -> birth = $this -> birth ;
2017-03-13 15:00:44 +01:00
2019-12-18 15:20:36 +01:00
$adh -> pass = $this -> pass ;
2017-03-13 15:00:44 +01:00
2019-12-18 15:20:36 +01:00
$adh -> societe = ( empty ( $adh -> societe ) && $this -> societe_id ? $this -> societe_id : $adh -> societe );
2007-09-09 22:10:20 +02:00
2019-12-18 15:20:36 +01:00
$adh -> address = $this -> address ;
$adh -> town = $this -> town ;
$adh -> zip = $this -> zip ;
$adh -> state_id = $this -> state_id ;
$adh -> country_id = $this -> country_id ;
2018-08-31 22:34:02 +02:00
2019-12-18 15:20:36 +01:00
$adh -> email = $this -> email ;
2018-10-12 11:29:47 +02:00
2019-12-18 15:20:36 +01:00
$adh -> socialnetworks = $this -> socialnetworks ;
2018-10-12 11:29:47 +02:00
2019-12-18 15:20:36 +01:00
$adh -> phone = $this -> office_phone ;
$adh -> phone_mobile = $this -> user_mobile ;
2008-07-19 18:53:56 +02:00
2019-12-18 15:20:36 +01:00
$adh -> user_id = $this -> id ;
$adh -> user_login = $this -> login ;
2009-05-07 01:30:49 +02:00
2019-12-18 15:20:36 +01:00
$result = $adh -> update ( $user , 0 , 1 , 0 );
2017-10-07 13:09:31 +02:00
if ( $result < 0 )
2007-09-09 22:10:20 +02:00
{
2019-12-18 15:20:36 +01:00
$this -> error = $adh -> error ;
$this -> errors = $adh -> errors ;
2016-06-25 18:48:50 +02:00
dol_syslog ( get_class ( $this ) . " ::update error after calling adh->update to sync it with user: " . $this -> error , LOG_ERR );
2007-09-09 22:10:20 +02:00
$error ++ ;
}
}
2019-02-03 19:25:11 +01:00
elseif ( $result < 0 )
2007-09-07 20:25:53 +02:00
{
2019-12-18 15:20:36 +01:00
$this -> error = $adh -> error ;
$this -> errors = $adh -> errors ;
2007-09-07 20:25:53 +02:00
$error ++ ;
}
}
2017-12-19 16:16:31 +01:00
2019-12-18 15:20:36 +01:00
if ( $this -> contact_id > 0 && ! $nosynccontact )
2017-12-19 16:16:31 +01:00
{
dol_syslog ( get_class ( $this ) . " ::update user is linked with a contact. We try to update contact too. " , LOG_DEBUG );
require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php' ;
// This user is linked with a contact, so we also update contact information
// if this is an update.
2019-12-18 15:20:36 +01:00
$tmpobj = new Contact ( $this -> db );
$result = $tmpobj -> fetch ( $this -> contact_id );
2017-12-19 16:16:31 +01:00
if ( $result >= 0 )
{
2019-12-18 15:20:36 +01:00
$tmpobj -> firstname = $this -> firstname ;
$tmpobj -> lastname = $this -> lastname ;
$tmpobj -> login = $this -> login ;
$tmpobj -> gender = $this -> gender ;
$tmpobj -> birth = $this -> birth ;
2017-12-19 16:16:31 +01:00
//$tmpobj->pass=$this->pass;
//$tmpobj->societe=(empty($tmpobj->societe) && $this->societe_id ? $this->societe_id : $tmpobj->societe);
2019-12-18 15:20:36 +01:00
$tmpobj -> email = $this -> email ;
2018-10-12 11:29:47 +02:00
2019-12-18 15:20:36 +01:00
$tmpobj -> socialnetworks = $this -> socialnetworks ;
2018-10-12 11:29:47 +02:00
2019-12-18 15:20:36 +01:00
$tmpobj -> phone_pro = $this -> office_phone ;
$tmpobj -> phone_mobile = $this -> user_mobile ;
$tmpobj -> fax = $this -> office_fax ;
2017-12-19 16:16:31 +01:00
2019-12-18 15:20:36 +01:00
$tmpobj -> address = $this -> address ;
$tmpobj -> town = $this -> town ;
$tmpobj -> zip = $this -> zip ;
$tmpobj -> state_id = $this -> state_id ;
$tmpobj -> country_id = $this -> country_id ;
2017-12-19 16:16:31 +01:00
2019-12-18 15:20:36 +01:00
$tmpobj -> user_id = $this -> id ;
$tmpobj -> user_login = $this -> login ;
2017-12-19 16:16:31 +01:00
2019-12-18 15:20:36 +01:00
$result = $tmpobj -> update ( $tmpobj -> id , $user , 0 , 'update' , 1 );
2017-12-19 16:16:31 +01:00
if ( $result < 0 )
{
2019-12-18 15:20:36 +01:00
$this -> error = $tmpobj -> error ;
$this -> errors = $tmpobj -> errors ;
2017-12-19 16:16:31 +01:00
dol_syslog ( get_class ( $this ) . " ::update error after calling adh->update to sync it with user: " . $this -> error , LOG_ERR );
$error ++ ;
}
}
else
{
2019-12-18 15:20:36 +01:00
$this -> error = $tmpobj -> error ;
$this -> errors = $tmpobj -> errors ;
2017-12-19 16:16:31 +01:00
$error ++ ;
}
}
2011-09-03 18:44:34 +02:00
}
2011-09-04 20:41:19 +02:00
2019-12-18 15:20:36 +01:00
$action = 'update' ;
2014-11-15 19:04:21 +01:00
2018-04-10 12:03:01 +02:00
// Actions on extra fields
2019-12-18 15:20:36 +01:00
if ( ! $error && empty ( $conf -> global -> MAIN_EXTRAFIELDS_DISABLED ))
2012-12-02 11:03:23 +01:00
{
2019-12-18 15:20:36 +01:00
$result = $this -> insertExtraFields ();
2017-02-28 11:20:33 +01:00
if ( $result < 0 )
2012-12-02 11:03:23 +01:00
{
2017-02-28 11:20:33 +01:00
$error ++ ;
2012-12-02 11:03:23 +01:00
}
}
2012-11-30 15:55:59 +01:00
2019-12-18 15:20:36 +01:00
if ( ! $error && ! $notrigger )
2011-09-03 18:44:34 +02:00
{
2017-10-07 13:09:31 +02:00
// Call trigger
2019-12-18 15:20:36 +01:00
$result = $this -> call_trigger ( 'USER_MODIFY' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; }
// End call triggers
2008-07-19 18:53:56 +02:00
}
2007-09-07 20:25:53 +02:00
2019-12-18 15:20:36 +01:00
if ( ! $error )
2007-09-07 20:25:53 +02:00
{
$this -> db -> commit ();
2011-09-03 18:37:12 +02:00
return $nbrowsaffected ;
2007-09-07 20:25:53 +02:00
}
else
{
2019-01-27 11:55:16 +01:00
dol_syslog ( get_class ( $this ) . " ::update error= " . $this -> error , LOG_ERR );
2007-09-07 20:25:53 +02:00
$this -> db -> rollback ();
2011-09-03 18:37:12 +02:00
return - 1 ;
2007-09-07 20:25:53 +02:00
}
2008-07-19 18:53:56 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2011-09-03 18:37:12 +02:00
$this -> db -> rollback ();
return - 2 ;
2008-07-19 18:53:56 +02:00
}
2008-02-24 18:01:48 +01:00
}
2004-08-07 20:47:54 +02:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2007-09-08 11:44:26 +02:00
/**
2019-12-06 18:05:16 +01:00
* Mise a jour en base de la date de derniere connexion d ' un utilisateur
* Fonction appelee lors d ' une nouvelle connexion
2011-09-04 20:41:19 +02:00
*
2019-12-06 18:05:16 +01:00
* @ return int < 0 si echec , >= 0 si ok
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function update_last_login_date ()
2008-07-19 18:53:56 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2019-11-13 19:35:39 +01:00
$now = dol_now ();
2008-07-19 18:53:56 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user SET " ;
2019-11-13 19:35:39 +01:00
$sql .= " datepreviouslogin = datelastlogin, " ;
$sql .= " datelastlogin = ' " . $this -> db -> idate ( $now ) . " ', " ;
$sql .= " tms = tms " ; // La date de derniere modif doit changer sauf pour la mise a jour de date de derniere connexion
$sql .= " WHERE rowid = " . $this -> id ;
2009-01-30 23:18:07 +01:00
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::update_last_login_date user->id= " . $this -> id . " " . $sql , LOG_DEBUG );
2008-07-19 18:53:56 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2019-11-13 19:35:39 +01:00
$this -> datepreviouslogin = $this -> datelastlogin ;
$this -> datelastlogin = $now ;
2008-07-19 18:53:56 +02:00
return 1 ;
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror () . ' sql=' . $sql ;
2008-07-19 18:53:56 +02:00
return - 1 ;
}
}
2006-11-20 03:10:47 +01:00
2006-04-24 23:28:24 +02:00
/**
2011-01-29 18:41:26 +01:00
* Change password of a user
2011-09-04 20:41:19 +02:00
*
2011-09-20 19:34:15 +02:00
* @ param User $user Object user of user making change
* @ param string $password New password in clear text ( to generate if not provided )
* @ param int $changelater 1 = Change password only after clicking on confirm email
* @ param int $notrigger 1 = Does not launch triggers
* @ param int $nosyncmember Do not synchronize linked member
* @ return string If OK return clear password , 0 if no change , < 0 if error
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function setPassword ( $user , $password = '' , $changelater = 0 , $notrigger = 0 , $nosyncmember = 0 )
2008-07-19 18:53:56 +02:00
{
global $conf , $langs ;
2019-11-13 19:35:39 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php' ;
2011-09-20 19:19:46 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2006-11-20 03:10:47 +01:00
2019-01-27 11:55:16 +01:00
dol_syslog ( get_class ( $this ) . " ::setPassword user= " . $user -> id . " password= " . preg_replace ( '/./i' , '*' , $password ) . " changelater= " . $changelater . " notrigger= " . $notrigger . " nosyncmember= " . $nosyncmember , LOG_DEBUG );
2006-11-20 03:10:47 +01:00
2011-09-24 01:46:14 +02:00
// If new password not provided, we generate one
2019-11-13 19:35:39 +01:00
if ( ! $password )
2008-07-19 18:53:56 +02:00
{
2019-11-13 19:35:39 +01:00
$password = getRandomPassword ( false );
2008-07-19 18:53:56 +02:00
}
2016-06-25 21:28:52 +02:00
// Crypt password
2011-09-06 08:53:52 +02:00
$password_crypted = dol_hash ( $password );
2006-11-25 22:39:58 +01:00
// Mise a jour
2019-11-13 19:35:39 +01:00
if ( ! $changelater )
2007-04-23 00:55:32 +02:00
{
2019-11-13 19:35:39 +01:00
if ( ! is_object ( $this -> oldcopy )) $this -> oldcopy = clone $this ;
2011-11-02 18:05:45 +01:00
2017-10-07 13:09:31 +02:00
$this -> db -> begin ();
2014-07-05 08:59:41 +02:00
2017-10-07 13:09:31 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " user " ;
2019-11-13 19:35:39 +01:00
$sql .= " SET pass_crypted = ' " . $this -> db -> escape ( $password_crypted ) . " ', " ;
$sql .= " pass_temp = null " ;
if ( ! empty ( $conf -> global -> DATABASE_PWD_ENCRYPTED ))
2007-06-02 03:53:54 +02:00
{
2019-11-13 19:35:39 +01:00
$sql .= " , pass = null " ;
2007-06-02 03:53:54 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$sql .= " , pass = ' " . $this -> db -> escape ( $password ) . " ' " ;
2007-06-02 03:53:54 +02:00
}
2019-11-13 19:35:39 +01:00
$sql .= " WHERE rowid = " . $this -> id ;
2007-06-02 03:53:54 +02:00
2014-07-02 21:29:07 +02:00
dol_syslog ( get_class ( $this ) . " ::setPassword " , LOG_DEBUG );
2008-07-19 18:53:56 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
2007-10-21 22:40:24 +02:00
if ( $this -> db -> affected_rows ( $result ))
2008-07-19 18:53:56 +02:00
{
2019-11-13 19:35:39 +01:00
$this -> pass = $password ;
$this -> pass_indatabase = $password ;
$this -> pass_indatabase_crypted = $password_crypted ;
2007-06-02 03:53:54 +02:00
2019-11-13 19:35:39 +01:00
if ( $this -> fk_member && ! $nosyncmember )
2007-10-22 01:04:06 +02:00
{
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php' ;
2008-07-19 18:53:56 +02:00
2007-10-22 01:04:06 +02:00
// This user is linked with a member, so we also update members informations
// if this is an update.
2019-11-13 19:35:39 +01:00
$adh = new Adherent ( $this -> db );
$result = $adh -> fetch ( $this -> fk_member );
2008-07-19 18:53:56 +02:00
2007-10-22 01:04:06 +02:00
if ( $result >= 0 )
{
2019-11-13 19:35:39 +01:00
$result = $adh -> setPassword ( $user , $this -> pass , ( empty ( $conf -> global -> DATABASE_PWD_ENCRYPTED ) ? 0 : 1 ), 1 ); // Cryptage non gere dans module adherent
2007-10-22 01:04:06 +02:00
if ( $result < 0 )
{
2019-11-13 19:35:39 +01:00
$this -> error = $adh -> error ;
2019-01-27 11:55:16 +01:00
dol_syslog ( get_class ( $this ) . " ::setPassword " . $this -> error , LOG_ERR );
2007-10-22 01:04:06 +02:00
$error ++ ;
}
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $adh -> error ;
2007-10-22 01:04:06 +02:00
$error ++ ;
}
}
2011-01-12 03:43:48 +01:00
2019-01-27 11:55:16 +01:00
dol_syslog ( get_class ( $this ) . " ::setPassword notrigger= " . $notrigger . " error= " . $error , LOG_DEBUG );
2007-10-22 01:04:06 +02:00
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $notrigger )
2007-08-31 09:43:23 +02:00
{
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_NEW_PASSWORD' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; $this -> db -> rollback (); return - 1 ; }
// End call triggers
2007-08-31 09:43:23 +02:00
}
2014-07-05 08:59:41 +02:00
2014-07-03 14:01:01 +02:00
$this -> db -> commit ();
2008-07-19 18:53:56 +02:00
return $this -> pass ;
}
else
2007-10-21 22:40:24 +02:00
{
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
2008-07-19 18:53:56 +02:00
return 0 ;
}
}
else
{
2017-10-07 13:09:31 +02:00
$this -> db -> rollback ();
2009-02-20 23:53:15 +01:00
dol_print_error ( $this -> db );
2008-07-19 18:53:56 +02:00
return - 1 ;
}
2007-06-02 03:53:54 +02:00
}
else
{
// We store clear password in password temporary field.
// After receiving confirmation link, we will crypt it and store it in pass_crypted
$sql = " UPDATE " . MAIN_DB_PREFIX . " user " ;
2019-11-13 19:35:39 +01:00
$sql .= " SET pass_temp = ' " . $this -> db -> escape ( $password ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> id ;
2007-09-01 00:06:14 +02:00
2019-11-13 19:35:39 +01:00
dol_syslog ( get_class ( $this ) . " ::setPassword " , LOG_DEBUG ); // No log
2008-07-19 18:53:56 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
2007-06-02 03:53:54 +02:00
{
2008-07-19 18:53:56 +02:00
return $password ;
2007-06-02 03:53:54 +02:00
}
else
{
2009-02-20 23:53:15 +01:00
dol_print_error ( $this -> db );
2008-07-19 18:53:56 +02:00
return - 3 ;
}
2007-04-23 00:55:32 +02:00
}
2008-07-19 18:53:56 +02:00
}
2002-12-18 19:02:06 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2007-06-02 03:53:54 +02:00
/**
2015-05-12 23:47:28 +02:00
* Send new password by email
2011-09-04 20:41:19 +02:00
*
2015-05-12 23:47:28 +02:00
* @ param User $user Object user that send email
* @ param string $password New password
2019-12-11 19:11:13 +01:00
* @ param int $changelater 0 = Send clear passwod into email , 1 = Change password only after clicking on confirm email . @ todo Add method 2 = Send link to reset password
2011-09-20 19:34:15 +02:00
* @ return int < 0 si erreur , > 0 si ok
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function send_password ( $user , $password = '' , $changelater = 0 )
2008-07-19 18:53:56 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2018-09-18 17:37:08 +02:00
global $conf , $langs ;
2011-12-05 19:41:38 +01:00
global $dolibarr_main_url_root ;
2012-01-07 15:01:30 +01:00
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php' ;
2005-02-04 12:08:01 +01:00
2019-11-13 19:35:39 +01:00
$msgishtml = 0 ;
2006-11-20 03:10:47 +01:00
2007-06-02 03:53:54 +02:00
// Define $msg
2008-07-19 18:53:56 +02:00
$mesg = '' ;
2008-08-30 01:49:53 +02:00
2019-11-13 19:35:39 +01:00
$outputlangs = new Translate ( " " , $conf );
2019-05-19 02:06:37 +02:00
2008-08-30 01:49:53 +02:00
if ( isset ( $this -> conf -> MAIN_LANG_DEFAULT )
&& $this -> conf -> MAIN_LANG_DEFAULT != 'auto' )
{ // If user has defined its own language (rare because in most cases, auto is used)
$outputlangs -> getDefaultLang ( $this -> conf -> MAIN_LANG_DEFAULT );
}
2019-11-13 19:35:39 +01:00
if ( $user -> conf -> MAIN_LANG_DEFAULT ) {
2019-05-19 02:06:37 +02:00
$outputlangs -> setDefaultLang ( $user -> conf -> MAIN_LANG_DEFAULT );
}
2008-08-30 01:49:53 +02:00
else
{ // If user has not defined its own language, we used current language
2019-11-13 19:35:39 +01:00
$outputlangs = $langs ;
2008-08-30 01:49:53 +02:00
}
2009-01-09 22:22:58 +01:00
2019-05-19 02:06:37 +02:00
// Load translation files required by the page
2018-09-18 17:37:08 +02:00
$outputlangs -> loadLangs ( array ( " main " , " errors " , " users " , " other " ));
2013-08-25 06:53:59 +02:00
2019-11-13 19:35:39 +01:00
$appli = constant ( 'DOL_APPLICATION_TITLE' );
if ( ! empty ( $conf -> global -> MAIN_APPLICATION_TITLE )) $appli = $conf -> global -> MAIN_APPLICATION_TITLE ;
2017-03-13 15:00:44 +01:00
2016-11-08 23:03:58 +01:00
$subject = $outputlangs -> transnoentitiesnoconv ( " SubjectNewPassword " , $appli );
2013-08-25 06:53:59 +02:00
2012-12-12 14:46:13 +01:00
// Define $urlwithroot
2019-11-13 19:35:39 +01:00
$urlwithouturlroot = preg_replace ( '/' . preg_quote ( DOL_URL_ROOT , '/' ) . '$/i' , '' , trim ( $dolibarr_main_url_root ));
$urlwithroot = $urlwithouturlroot . DOL_URL_ROOT ; // This is to use external domain name found into config file
2012-09-26 12:06:08 +02:00
2019-11-13 19:35:39 +01:00
if ( ! $changelater )
2007-06-02 03:53:54 +02:00
{
2016-11-08 23:03:58 +01:00
$url = $urlwithroot . '/' ;
2019-11-13 19:35:39 +01:00
$mesg .= $outputlangs -> transnoentitiesnoconv ( " RequestToResetPasswordReceived " ) . " . \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " NewKeyIs " ) . " : \n \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " Login " ) . " = " . $this -> login . " \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " Password " ) . " = " . $password . " \n \n " ;
$mesg .= " \n " ;
2017-03-13 15:00:44 +01:00
2019-11-13 19:35:39 +01:00
$mesg .= $outputlangs -> transnoentitiesnoconv ( " ClickHereToGoTo " , $appli ) . ': ' . $url . " \n \n " ;
$mesg .= " -- \n " ;
$mesg .= $user -> getFullName ( $outputlangs ); // Username that make then sending
2017-03-13 15:00:44 +01:00
2016-11-08 23:03:58 +01:00
dol_syslog ( get_class ( $this ) . " ::send_password changelater is off, url= " . $url );
2007-06-02 03:53:54 +02:00
}
else
{
2019-03-21 12:06:43 +01:00
$url = $urlwithroot . '/user/passwordforgotten.php?action=validatenewpassword&username=' . urlencode ( $this -> login ) . " &passwordhash= " . dol_hash ( $password );
2017-03-13 15:00:44 +01:00
2019-11-13 19:35:39 +01:00
$mesg .= $outputlangs -> transnoentitiesnoconv ( " RequestToResetPasswordReceived " ) . " \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " NewKeyWillBe " ) . " : \n \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " Login " ) . " = " . $this -> login . " \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " Password " ) . " = " . $password . " \n \n " ;
$mesg .= " \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " YouMustClickToChange " ) . " : \n " ;
$mesg .= $url . " \n \n " ;
$mesg .= $outputlangs -> transnoentitiesnoconv ( " ForgetIfNothing " ) . " \n \n " ;
2017-03-13 15:00:44 +01:00
2016-11-08 23:03:58 +01:00
dol_syslog ( get_class ( $this ) . " ::send_password changelater is on, url= " . $url );
2007-06-02 03:53:54 +02:00
}
2016-11-08 23:03:58 +01:00
2019-02-25 20:35:59 +01:00
$mailfile = new CMailFile (
$subject ,
2017-10-07 13:09:31 +02:00
$this -> email ,
2018-01-24 15:43:55 +01:00
$conf -> global -> MAIN_MAIL_EMAIL_FROM ,
2017-10-07 13:09:31 +02:00
$mesg ,
array (),
array (),
array (),
'' ,
'' ,
0 ,
2019-02-25 20:35:59 +01:00
$msgishtml
);
2005-07-02 00:09:12 +02:00
2008-07-19 18:53:56 +02:00
if ( $mailfile -> sendfile ())
{
return 1 ;
}
else
{
2011-09-24 01:46:14 +02:00
$langs -> trans ( " errors " );
2019-11-13 19:35:39 +01:00
$this -> error = $langs -> trans ( " ErrorFailedToSendPassword " ) . ' ' . $mailfile -> error ;
2008-07-19 18:53:56 +02:00
return - 1 ;
}
}
/**
2011-09-04 20:41:19 +02:00
* Renvoie la derniere erreur fonctionnelle de manipulation de l ' objet
*
* @ return string chaine erreur
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function error ()
2008-07-19 18:53:56 +02:00
{
return $this -> error ;
}
2005-02-26 19:34:14 +01:00
2006-11-20 03:10:47 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2008-07-19 18:53:56 +02:00
/**
2019-11-14 18:40:30 +01:00
* Read clicktodial information for user
2011-09-04 20:41:19 +02:00
*
2019-11-14 18:40:30 +01:00
* @ return int < 0 if KO , > 0 if OK
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function fetch_clicktodial ()
2008-07-19 18:53:56 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2013-03-31 16:44:24 +02:00
$sql = " SELECT url, login, pass, poste " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " user_clicktodial as u " ;
$sql .= " WHERE u.fk_user = " . $this -> id ;
2006-11-20 03:10:47 +01:00
2009-01-09 22:22:58 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
2008-07-19 18:53:56 +02:00
{
2009-01-09 22:22:58 +01:00
if ( $this -> db -> num_rows ( $resql ))
{
$obj = $this -> db -> fetch_object ( $resql );
2005-01-14 15:18:45 +01:00
2013-03-31 16:44:24 +02:00
$this -> clicktodial_url = $obj -> url ;
2009-01-09 22:22:58 +01:00
$this -> clicktodial_login = $obj -> login ;
$this -> clicktodial_password = $obj -> pass ;
$this -> clicktodial_poste = $obj -> poste ;
}
2005-01-14 15:18:45 +01:00
2019-11-13 19:35:39 +01:00
$this -> clicktodial_loaded = 1 ; // Data loaded (found or not)
2009-01-14 15:59:28 +01:00
2009-01-09 22:22:58 +01:00
$this -> db -> free ( $resql );
return 1 ;
2008-07-19 18:53:56 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> error ();
2009-01-09 22:22:58 +01:00
return - 1 ;
2008-07-19 18:53:56 +02:00
}
2005-01-14 15:18:45 +01:00
}
2005-02-26 19:34:14 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2008-07-19 18:53:56 +02:00
/**
2011-09-20 19:34:15 +02:00
* Update clicktodial info
*
2019-11-14 18:40:30 +01:00
* @ return int < 0 if KO , > 0 if OK
2019-02-25 20:35:59 +01:00
*/
public function update_clicktodial ()
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2011-09-24 01:46:14 +02:00
$this -> db -> begin ();
2006-11-20 03:10:47 +01:00
2008-07-19 18:53:56 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " user_clicktodial " ;
$sql .= " WHERE fk_user = " . $this -> id ;
2002-12-18 19:02:06 +01:00
2014-06-13 01:34:39 +02:00
dol_syslog ( get_class ( $this ) . '::update_clicktodial' , LOG_DEBUG );
2008-07-19 18:53:56 +02:00
$result = $this -> db -> query ( $sql );
2005-01-14 15:18:45 +01:00
2008-07-19 18:53:56 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " user_clicktodial " ;
2013-03-31 16:44:24 +02:00
$sql .= " (fk_user,url,login,pass,poste) " ;
2008-07-19 18:53:56 +02:00
$sql .= " VALUES ( " . $this -> id ;
2019-11-13 19:35:39 +01:00
$sql .= " , ' " . $this -> db -> escape ( $this -> clicktodial_url ) . " ' " ;
$sql .= " , ' " . $this -> db -> escape ( $this -> clicktodial_login ) . " ' " ;
$sql .= " , ' " . $this -> db -> escape ( $this -> clicktodial_password ) . " ' " ;
$sql .= " , ' " . $this -> db -> escape ( $this -> clicktodial_poste ) . " ') " ;
2006-11-20 03:10:47 +01:00
2014-06-13 01:34:39 +02:00
dol_syslog ( get_class ( $this ) . '::update_clicktodial' , LOG_DEBUG );
2008-07-19 18:53:56 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
2011-09-24 01:46:14 +02:00
$this -> db -> commit ();
2013-03-31 16:44:24 +02:00
return 1 ;
2008-07-19 18:53:56 +02:00
}
else
{
2011-09-24 01:46:14 +02:00
$this -> db -> rollback ();
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2011-09-24 01:46:14 +02:00
return - 1 ;
2008-07-19 18:53:56 +02:00
}
2019-02-25 20:35:59 +01:00
}
2005-01-27 16:56:32 +01:00
2005-02-26 19:34:14 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2008-07-19 18:53:56 +02:00
/**
2011-09-20 19:34:15 +02:00
* Add user into a group
2011-09-04 20:41:19 +02:00
*
2014-12-28 20:12:32 +01:00
* @ param int $group Id of group
2011-09-20 19:34:15 +02:00
* @ param int $entity Entity
* @ param int $notrigger Disable triggers
* @ return int < 0 if KO , > 0 if OK
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function SetInGroup ( $group , $entity , $notrigger = 0 )
2008-07-19 18:53:56 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2011-06-07 17:45:01 +02:00
global $conf , $langs , $user ;
2011-06-29 12:23:32 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2011-05-28 02:16:12 +02:00
$this -> db -> begin ();
2005-01-27 16:56:32 +01:00
2008-07-19 18:53:56 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " usergroup_user " ;
2019-11-13 19:35:39 +01:00
$sql .= " WHERE fk_user = " . $this -> id ;
$sql .= " AND fk_usergroup = " . $group ;
$sql .= " AND entity = " . $entity ;
2006-11-20 03:10:47 +01:00
2008-07-19 18:53:56 +02:00
$result = $this -> db -> query ( $sql );
2005-01-27 16:56:32 +01:00
2011-05-16 17:21:54 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " usergroup_user (entity, fk_user, fk_usergroup) " ;
2019-11-13 19:35:39 +01:00
$sql .= " VALUES ( " . $entity . " , " . $this -> id . " , " . $group . " ) " ;
2006-11-20 03:10:47 +01:00
2008-07-19 18:53:56 +02:00
$result = $this -> db -> query ( $sql );
2011-06-07 17:45:01 +02:00
if ( $result )
{
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $notrigger )
2011-06-07 17:45:01 +02:00
{
2019-11-13 19:35:39 +01:00
$this -> newgroupid = $group ; // deprecated. Remove this.
2017-10-07 13:09:31 +02:00
$this -> context = array ( 'audit' => $langs -> trans ( " UserSetInGroup " ), 'newgroupid' => $group );
2017-03-13 15:00:44 +01:00
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_MODIFY' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; }
// End call triggers
2011-06-07 17:45:01 +02:00
}
2011-06-29 12:23:32 +02:00
2019-11-13 19:35:39 +01:00
if ( ! $error )
2011-06-07 17:45:01 +02:00
{
$this -> db -> commit ();
return 1 ;
}
else
{
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::SetInGroup " . $this -> error , LOG_ERR );
2011-06-07 17:45:01 +02:00
$this -> db -> rollback ();
return - 2 ;
}
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2011-06-07 17:45:01 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2008-07-19 18:53:56 +02:00
}
2005-01-27 16:56:32 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2006-08-07 04:20:57 +02:00
/**
2011-09-20 19:34:15 +02:00
* Remove a user from a group
2011-09-04 20:41:19 +02:00
*
2014-12-28 20:12:32 +01:00
* @ param int $group Id of group
2011-09-24 01:46:14 +02:00
* @ param int $entity Entity
* @ param int $notrigger Disable triggers
* @ return int < 0 if KO , > 0 if OK
2006-08-07 04:20:57 +02:00
*/
2019-02-25 20:35:59 +01:00
public function RemoveFromGroup ( $group , $entity , $notrigger = 0 )
2008-07-19 18:53:56 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2019-11-13 19:35:39 +01:00
global $conf , $langs , $user ;
2011-06-29 12:23:32 +02:00
2019-11-13 19:35:39 +01:00
$error = 0 ;
2005-01-27 16:56:32 +01:00
2011-09-24 01:46:14 +02:00
$this -> db -> begin ();
2011-05-28 02:16:12 +02:00
2011-09-24 01:46:14 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " usergroup_user " ;
2019-11-13 19:35:39 +01:00
$sql .= " WHERE fk_user = " . $this -> id ;
$sql .= " AND fk_usergroup = " . $group ;
$sql .= " AND entity = " . $entity ;
2006-11-20 03:10:47 +01:00
2008-07-19 18:53:56 +02:00
$result = $this -> db -> query ( $sql );
2011-06-07 17:45:01 +02:00
if ( $result )
{
2019-11-13 19:35:39 +01:00
if ( ! $error && ! $notrigger )
2011-06-07 17:45:01 +02:00
{
2019-11-13 19:35:39 +01:00
$this -> oldgroupid = $group ; // deprecated. Remove this.
2017-10-07 13:09:31 +02:00
$this -> context = array ( 'audit' => $langs -> trans ( " UserRemovedFromGroup " ), 'oldgroupid' => $group );
2017-03-13 15:00:44 +01:00
2017-10-07 13:09:31 +02:00
// Call trigger
2019-11-13 19:35:39 +01:00
$result = $this -> call_trigger ( 'USER_MODIFY' , $user );
2017-10-07 13:09:31 +02:00
if ( $result < 0 ) { $error ++ ; }
// End call triggers
2011-06-07 17:45:01 +02:00
}
2011-05-28 02:16:12 +02:00
2019-11-13 19:35:39 +01:00
if ( ! $error )
2011-06-07 17:45:01 +02:00
{
$this -> db -> commit ();
return 1 ;
}
else
{
2011-09-24 01:46:14 +02:00
dol_syslog ( get_class ( $this ) . " ::RemoveFromGroup " . $this -> error , LOG_ERR );
2011-06-07 17:45:01 +02:00
$this -> db -> rollback ();
return - 2 ;
}
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2011-06-07 17:45:01 +02:00
$this -> db -> rollback ();
return - 1 ;
}
2008-07-19 18:53:56 +02:00
}
2006-08-07 04:20:57 +02:00
2015-05-30 19:50:07 +02:00
/**
2015-05-31 01:06:51 +02:00
* Return a link with photo
* Use this -> id , this -> photo
2015-05-30 19:50:07 +02:00
*
2015-05-31 01:06:51 +02:00
* @ param int $width Width of image
* @ param int $height Height of image
2015-05-31 17:31:15 +02:00
* @ param string $cssclass Force a css class
2017-10-07 13:09:31 +02:00
* @ param string $imagesize 'mini' , 'small' or '' ( original )
2015-05-31 01:06:51 +02:00
* @ return string String with URL link
2015-05-30 19:50:07 +02:00
*/
2019-02-25 20:35:59 +01:00
public function getPhotoUrl ( $width , $height , $cssclass = '' , $imagesize = '' )
2015-05-30 19:50:07 +02:00
{
2019-11-13 19:35:39 +01:00
$result = '<a href="' . DOL_URL_ROOT . '/user/card.php?id=' . $this -> id . '">' ;
$result .= Form :: showphoto ( 'userphoto' , $this , $width , $height , 0 , $cssclass , $imagesize );
$result .= '</a>' ;
2015-05-30 19:50:07 +02:00
2017-10-07 13:09:31 +02:00
return $result ;
2015-05-30 19:50:07 +02:00
}
2006-08-07 04:20:57 +02:00
/**
2014-03-05 09:57:36 +01:00
* Return a link to the user card ( with optionaly the picto )
2013-02-23 15:26:39 +01:00
* Use this -> id , this -> lastname , this -> firstname
2011-09-04 20:41:19 +02:00
*
2017-10-03 16:00:52 +02:00
* @ param int $withpictoimg Include picto in link ( 0 = No picto , 1 = Include picto into link , 2 = Only picto , - 1 = Include photo into link , - 2 = Only picto photo , - 3 = Only photo very small )
2017-12-09 17:29:19 +01:00
* @ param string $option On what the link point to ( 'leave' , 'nolink' , )
2018-03-29 11:34:01 +02:00
* @ param integer $infologin 0 = Add default info tooltip , 1 = Add complete info tooltip , - 1 = No info tooltip
2017-10-07 13:09:31 +02:00
* @ param integer $notooltip 1 = Disable tooltip on picto and name
* @ param int $maxlen Max length of visible user name
* @ param int $hidethirdpartylogo Hide logo of thirdparty if user is external user
2018-12-23 01:28:36 +01:00
* @ param string $mode '' = Show firstname and lastname , 'firstname' = Show only firstname , 'firstelselast' = Show firstname or lastname if not defined , 'login' = Show login
2017-10-07 13:09:31 +02:00
* @ param string $morecss Add more css on link
* @ param int $save_lastsearch_value - 1 = Auto , 0 = No save of lastsearch_values when clicking , 1 = Save lastsearch_values whenclicking
2017-10-03 16:00:52 +02:00
* @ return string String with URL
2006-08-07 04:20:57 +02:00
*/
2019-02-25 20:35:59 +01:00
public function getNomUrl ( $withpictoimg = 0 , $option = '' , $infologin = 0 , $notooltip = 0 , $maxlen = 24 , $hidethirdpartylogo = 0 , $mode = '' , $morecss = '' , $save_lastsearch_value = - 1 )
2006-08-07 04:20:57 +02:00
{
2018-07-05 11:52:41 +02:00
global $langs , $conf , $db , $hookmanager , $user ;
2017-03-23 10:59:13 +01:00
global $dolibarr_main_authentication , $dolibarr_main_demo ;
global $menumanager ;
2015-01-25 01:20:58 +01:00
2019-12-18 15:20:36 +01:00
if ( ! $user -> rights -> user -> user -> lire && $user -> id != $this -> id ) $option = 'nolink' ;
2018-07-05 11:52:41 +02:00
2019-12-18 15:20:36 +01:00
if ( ! empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER ) && $withpictoimg ) $withpictoimg = 0 ;
2016-03-17 09:22:12 +01:00
2019-12-18 15:20:36 +01:00
$result = '' ; $label = '' ;
2017-06-06 07:57:03 +02:00
2019-12-18 15:20:36 +01:00
if ( ! empty ( $this -> photo ))
2017-03-31 14:21:51 +02:00
{
2019-12-18 15:20:36 +01:00
$label .= '<div class="photointooltip">' ;
$label .= Form :: showphoto ( 'userphoto' , $this , 0 , 60 , 0 , 'photowithmargin photologintooltip' , 'small' , 0 , 1 ); // Force height to 60 so we total height of tooltip can be calculated and collision can be managed
$label .= '</div><div style="clear: both;"></div>' ;
2017-03-31 14:21:51 +02:00
}
2017-06-06 07:57:03 +02:00
2018-03-29 11:34:01 +02:00
// Info Login
2019-12-18 15:20:36 +01:00
$label .= '<div class="centpercent">' ;
$label .= '<u>' . $langs -> trans ( " User " ) . '</u><br>' ;
$label .= '<b>' . $langs -> trans ( 'Name' ) . ':</b> ' . $this -> getFullName ( $langs , '' );
if ( ! empty ( $this -> login )) $label .= '<br><b>' . $langs -> trans ( 'Login' ) . ':</b> ' . $this -> login ;
if ( ! empty ( $this -> job )) $label .= '<br><b>' . $langs -> trans ( " Job " ) . ':</b> ' . $this -> job ;
$label .= '<br><b>' . $langs -> trans ( " Email " ) . ':</b> ' . $this -> email ;
if ( ! empty ( $this -> phone )) $label .= '<br><b>' . $langs -> trans ( " Phone " ) . ':</b> ' . $this -> phone ;
if ( ! empty ( $this -> admin ))
$label .= '<br><b>' . $langs -> trans ( " Administrator " ) . '</b>: ' . yn ( $this -> admin );
if ( ! empty ( $this -> socid )) // Add thirdparty for external users
2017-03-23 10:59:13 +01:00
{
$thirdpartystatic = new Societe ( $db );
2018-03-29 11:34:01 +02:00
$thirdpartystatic -> fetch ( $this -> socid );
2019-12-18 15:20:36 +01:00
if ( empty ( $hidethirdpartylogo )) $companylink = ' ' . $thirdpartystatic -> getNomUrl ( 2 , (( $option == 'nolink' ) ? 'nolink' : '' )); // picto only of company
$company = ' (' . $langs -> trans ( " Company " ) . ': ' . $thirdpartystatic -> name . ')' ;
2017-03-23 10:59:13 +01:00
}
2019-12-18 15:20:36 +01:00
$type = ( $this -> socid ? $langs -> trans ( " External " ) . $company : $langs -> trans ( " Internal " ));
$label .= '<br><b>' . $langs -> trans ( " Type " ) . ':</b> ' . $type ;
$label .= '<br><b>' . $langs -> trans ( " Status " ) . '</b>: ' . $this -> getLibStatut ( 0 );
$label .= '</div>' ;
2018-03-29 11:34:01 +02:00
if ( $infologin > 0 )
2017-03-23 10:59:13 +01:00
{
2019-12-18 15:20:36 +01:00
$label .= '<br>' ;
$label .= '<br><u>' . $langs -> trans ( " Session " ) . '</u>' ;
$label .= '<br><b>' . $langs -> trans ( " IPAddress " ) . '</b>: ' . $_SERVER [ " REMOTE_ADDR " ];
if ( ! empty ( $conf -> global -> MAIN_MODULE_MULTICOMPANY )) $label .= '<br><b>' . $langs -> trans ( " ConnectedOnMultiCompany " ) . ':</b> ' . $conf -> entity . ' (user entity ' . $this -> entity . ')' ;
$label .= '<br><b>' . $langs -> trans ( " AuthenticationMode " ) . ':</b> ' . $_SESSION [ " dol_authmode " ] . ( empty ( $dolibarr_main_demo ) ? '' : ' (demo)' );
$label .= '<br><b>' . $langs -> trans ( " ConnectedSince " ) . ':</b> ' . dol_print_date ( $this -> datelastlogin , " dayhour " , 'tzuser' );
$label .= '<br><b>' . $langs -> trans ( " PreviousConnexion " ) . ':</b> ' . dol_print_date ( $this -> datepreviouslogin , " dayhour " , 'tzuser' );
$label .= '<br><b>' . $langs -> trans ( " CurrentTheme " ) . ':</b> ' . $conf -> theme ;
$label .= '<br><b>' . $langs -> trans ( " CurrentMenuManager " ) . ':</b> ' . $menumanager -> name ;
$s = picto_from_langcode ( $langs -> getDefaultLang ());
$label .= '<br><b>' . $langs -> trans ( " CurrentUserLanguage " ) . ':</b> ' . ( $s ? $s . ' ' : '' ) . $langs -> getDefaultLang ();
$label .= '<br><b>' . $langs -> trans ( " Browser " ) . ':</b> ' . $conf -> browser -> name . ( $conf -> browser -> version ? ' ' . $conf -> browser -> version : '' ) . ' (' . $_SERVER [ 'HTTP_USER_AGENT' ] . ')' ;
$label .= '<br><b>' . $langs -> trans ( " Layout " ) . ':</b> ' . $conf -> browser -> layout ;
$label .= '<br><b>' . $langs -> trans ( " Screen " ) . ':</b> ' . $_SESSION [ 'dol_screenwidth' ] . ' x ' . $_SESSION [ 'dol_screenheight' ];
if ( $conf -> browser -> layout == 'phone' ) $label .= '<br><b>' . $langs -> trans ( " Phone " ) . ':</b> ' . $langs -> trans ( " Yes " );
if ( ! empty ( $_SESSION [ " disablemodules " ])) $label .= '<br><b>' . $langs -> trans ( " DisabledModules " ) . ':</b> <br>' . join ( ', ' , explode ( ',' , $_SESSION [ " disablemodules " ]));
}
if ( $infologin < 0 ) $label = '' ;
2017-03-23 10:59:13 +01:00
2017-10-06 00:26:24 +02:00
$url = DOL_URL_ROOT . '/user/card.php?id=' . $this -> id ;
if ( $option == 'leave' ) $url = DOL_URL_ROOT . '/holiday/list.php?id=' . $this -> id ;
2017-03-23 10:59:13 +01:00
2017-10-03 16:00:52 +02:00
if ( $option != 'nolink' )
{
// Add param to save lastsearch_values or not
2019-11-13 19:35:39 +01:00
$add_save_lastsearch_values = ( $save_lastsearch_value == 1 ? 1 : 0 );
if ( $save_lastsearch_value == - 1 && preg_match ( '/list\.php/' , $_SERVER [ " PHP_SELF " ])) $add_save_lastsearch_values = 1 ;
if ( $add_save_lastsearch_values ) $url .= '&save_lastsearch_values=1' ;
2017-10-03 16:00:52 +02:00
}
2017-03-23 10:59:13 +01:00
2019-11-13 19:35:39 +01:00
$linkstart = '<a href="' . $url . '"' ;
$linkclose = " " ;
2017-03-23 10:59:13 +01:00
if ( empty ( $notooltip ))
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER ))
2017-03-23 10:59:13 +01:00
{
$langs -> load ( " users " );
2019-11-13 19:35:39 +01:00
$label = $langs -> trans ( " ShowUser " );
$linkclose .= ' alt="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
2017-03-23 10:59:13 +01:00
}
2019-11-13 19:35:39 +01:00
$linkclose .= ' title="' . dol_escape_htmltag ( $label , 1 ) . '"' ;
$linkclose .= ' class="classfortooltip' . ( $morecss ? ' ' . $morecss : '' ) . '"' ;
2018-06-04 12:55:55 +02:00
/*
$hookmanager -> initHooks ( array ( 'userdao' ));
$parameters = array ( 'id' => $this -> id );
$reshook = $hookmanager -> executeHooks ( 'getnomurltooltip' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
if ( $reshook > 0 ) $linkclose = $hookmanager -> resPrint ;
*/
2017-03-23 10:59:13 +01:00
}
2016-07-16 18:05:58 +02:00
2019-11-13 19:35:39 +01:00
$linkstart .= $linkclose . '>' ;
$linkend = '</a>' ;
2006-08-07 04:20:57 +02:00
2017-10-07 13:09:31 +02:00
//if ($withpictoimg == -1) $result.='<div class="nowrap">';
2019-11-13 19:35:39 +01:00
$result .= (( $option == 'nolink' ) ? '' : $linkstart );
2017-10-07 13:09:31 +02:00
if ( $withpictoimg )
{
2019-11-13 19:35:39 +01:00
$paddafterimage = '' ;
if ( abs ( $withpictoimg ) == 1 ) $paddafterimage = 'style="margin-' . ( $langs -> trans ( " DIRECTION " ) == 'rtl' ? 'left' : 'right' ) . ': 3px;"' ;
2017-10-07 13:09:31 +02:00
// Only picto
2019-11-13 19:35:39 +01:00
if ( $withpictoimg > 0 ) $picto = '<!-- picto user --><span class="nopadding userimg' . ( $morecss ? ' ' . $morecss : '' ) . '">' . img_object ( '' , 'user' , $paddafterimage . ' ' . ( $notooltip ? '' : 'class="classfortooltip"' ), 0 , 0 , $notooltip ? 0 : 1 ) . '</span>' ;
2017-10-07 13:09:31 +02:00
// Picto must be a photo
2019-11-13 19:35:39 +01:00
else $picto = '<!-- picto photo user --><span class="nopadding userimg' . ( $morecss ? ' ' . $morecss : '' ) . '"' . ( $paddafterimage ? ' ' . $paddafterimage : '' ) . '>' . Form :: showphoto ( 'userphoto' , $this , 0 , 0 , 0 , 'userphoto' . ( $withpictoimg == - 3 ? 'small' : '' ), 'mini' , 0 , 1 ) . '</span>' ;
$result .= $picto ;
2015-10-24 13:52:35 +02:00
}
2017-04-01 00:35:05 +02:00
if ( $withpictoimg > - 2 && $withpictoimg != 2 )
2015-10-24 13:52:35 +02:00
{
2019-12-19 10:17:20 +01:00
if ( empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER )) $result .= '<span class=" nopadding usertext' . (( ! isset ( $this -> statut ) || $this -> statut ) ? '' : ' strikefordisabled' ) . ( $morecss ? ' ' . $morecss : '' ) . '">' ;
2019-11-13 19:35:39 +01:00
if ( $mode == 'login' ) $result .= dol_trunc ( $this -> login , $maxlen );
else $result .= $this -> getFullName ( $langs , '' , ( $mode == 'firstelselast' ? 3 : ( $mode == 'firstname' ? 2 : - 1 )), $maxlen );
if ( empty ( $conf -> global -> MAIN_OPTIMIZEFORTEXTBROWSER )) $result .= '</span>' ;
2006-08-07 04:20:57 +02:00
}
2019-11-13 19:35:39 +01:00
$result .= (( $option == 'nolink' ) ? '' : $linkend );
2015-10-24 19:45:41 +02:00
//if ($withpictoimg == -1) $result.='</div>';
2017-06-06 07:57:03 +02:00
2019-11-13 19:35:39 +01:00
$result .= $companylink ;
2017-06-06 07:57:03 +02:00
2018-03-15 20:46:55 +01:00
global $action ;
$hookmanager -> initHooks ( array ( 'userdao' ));
2019-11-13 19:35:39 +01:00
$parameters = array ( 'id' => $this -> id , 'getnomurl' => $result );
$reshook = $hookmanager -> executeHooks ( 'getNomUrl' , $parameters , $this , $action ); // Note that $action and $object may have been modified by some hooks
2018-03-15 20:46:55 +01:00
if ( $reshook > 0 ) $result = $hookmanager -> resPrint ;
else $result .= $hookmanager -> resPrint ;
2006-08-07 04:20:57 +02:00
return $result ;
2006-09-01 01:44:34 +02:00
}
2006-11-20 03:10:47 +01:00
2006-09-01 01:44:34 +02:00
/**
2017-11-02 15:03:09 +01:00
* Return clickable link of login ( eventualy with picto )
2011-09-04 20:41:19 +02:00
*
2015-03-15 14:04:07 +01:00
* @ param int $withpicto Include picto into link
2011-09-20 19:34:15 +02:00
* @ param string $option Sur quoi pointe le lien
* @ return string Chaine avec URL
2006-09-01 01:44:34 +02:00
*/
2019-02-25 20:35:59 +01:00
public function getLoginUrl ( $withpicto = 0 , $option = '' )
2006-09-01 01:44:34 +02:00
{
2018-07-05 11:52:41 +02:00
global $langs , $user ;
2006-11-20 03:10:47 +01:00
2019-11-13 19:35:39 +01:00
$result = '' ;
2006-11-20 03:10:47 +01:00
2017-11-02 15:03:09 +01:00
$linkstart = '<a href="' . DOL_URL_ROOT . '/user/card.php?id=' . $this -> id . '">' ;
2019-11-13 19:35:39 +01:00
$linkend = '</a>' ;
2006-09-01 01:44:34 +02:00
2019-11-28 16:16:55 +01:00
//Check user's rights to see an other user
if (( ! $user -> rights -> user -> user -> lire && $this -> id != $user -> id )) $option = 'nolink' ;
2018-08-13 17:26:32 +02:00
2006-09-01 01:44:34 +02:00
if ( $option == 'xxx' )
{
2017-11-02 15:03:09 +01:00
$linkstart = '<a href="' . DOL_URL_ROOT . '/user/card.php?id=' . $this -> id . '">' ;
2019-11-13 19:35:39 +01:00
$linkend = '</a>' ;
2006-09-01 01:44:34 +02:00
}
2018-08-13 17:26:32 +02:00
2018-09-16 13:49:22 +02:00
if ( $option == 'nolink' )
2018-07-05 11:52:41 +02:00
{
$linkstart = '' ;
2019-11-13 19:35:39 +01:00
$linkend = '' ;
2018-07-05 11:52:41 +02:00
}
2006-09-01 01:44:34 +02:00
2019-11-13 19:35:39 +01:00
$result .= $linkstart ;
if ( $withpicto ) $result .= img_object ( $langs -> trans ( " ShowUser " ), 'user' , 'class="paddingright"' );
$result .= $this -> login ;
$result .= $linkend ;
2006-09-01 01:44:34 +02:00
return $result ;
2006-09-02 03:17:50 +02:00
}
2006-11-20 03:10:47 +01:00
2006-09-02 03:17:50 +02:00
/**
2017-03-29 21:36:50 +02:00
* Return label of status of user ( active , inactive )
2011-09-04 20:41:19 +02:00
*
2013-02-20 21:16:31 +01:00
* @ param int $mode 0 = libelle long , 1 = libelle court , 2 = Picto + Libelle court , 3 = Picto , 4 = Picto + Libelle long , 5 = Libelle court + Picto
2011-09-20 19:34:15 +02:00
* @ return string Label of status
2006-09-02 03:17:50 +02:00
*/
2019-02-25 20:35:59 +01:00
public function getLibStatut ( $mode = 0 )
2006-09-02 03:17:50 +02:00
{
2019-01-27 11:55:16 +01:00
return $this -> LibStatut ( $this -> statut , $mode );
2006-09-02 03:17:50 +02:00
}
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2019-02-27 08:23:29 +01:00
/**
2019-10-31 23:29:17 +01:00
* Return label of a status of user ( active , inactive )
2019-02-27 08:23:29 +01:00
*
2019-10-31 23:29:17 +01:00
* @ param int $status Id status
* @ param int $mode 0 = long label , 1 = short label , 2 = Picto + short label , 3 = Picto , 4 = Picto + long label , 5 = Short label + Picto , 6 = Long label + Picto
2019-02-27 08:23:29 +01:00
* @ return string Label of status
*/
2019-10-31 23:29:17 +01:00
public function LibStatut ( $status , $mode = 0 )
2019-02-27 08:23:29 +01:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2006-09-02 03:17:50 +02:00
global $langs ;
2019-11-01 12:52:03 +01:00
if ( empty ( $this -> labelStatus ) || empty ( $this -> labelStatusShort ))
2006-09-02 03:17:50 +02:00
{
2019-10-31 23:29:17 +01:00
global $langs ;
//$langs->load("mymodule");
2019-11-01 12:52:03 +01:00
$this -> labelStatus [ self :: STATUS_ENABLED ] = $langs -> trans ( 'Enabled' );
$this -> labelStatus [ self :: STATUS_DISABLED ] = $langs -> trans ( 'Disabled' );
$this -> labelStatusShort [ self :: STATUS_ENABLED ] = $langs -> trans ( 'Enabled' );
$this -> labelStatusShort [ self :: STATUS_DISABLED ] = $langs -> trans ( 'Disabled' );
2006-09-02 03:17:50 +02:00
}
2019-10-31 23:29:17 +01:00
$statusType = 'status5' ;
if ( $status == self :: STATUS_ENABLED ) $statusType = 'status4' ;
2019-11-01 12:52:03 +01:00
return dolGetStatus ( $this -> labelStatus [ $status ], $this -> labelStatusShort [ $status ], '' , $statusType , $mode );
2006-11-20 03:10:47 +01:00
}
2006-11-19 17:02:53 +01:00
2019-05-10 16:12:16 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
2019-05-10 16:37:03 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2009-08-11 14:51:33 +02:00
/**
2011-05-01 12:48:43 +02:00
* Retourne chaine DN complete dans l 'annuaire LDAP pour l' objet
2011-09-04 20:41:19 +02:00
*
2014-06-20 13:07:15 +02:00
* @ param array $info Info array loaded by _load_ldap_info
2011-09-20 19:34:15 +02:00
* @ param int $mode 0 = Return full DN ( uid = qqq , ou = xxx , dc = aaa , dc = bbb )
2017-10-04 11:22:41 +02:00
* 1 = Return parent ( ou = xxx , dc = aaa , dc = bbb )
* 2 = Return key only ( RDN ) ( uid = qqq )
2011-09-20 19:34:15 +02:00
* @ return string DN
2008-07-19 18:53:56 +02:00
*/
2019-05-10 11:47:44 +02:00
public function _load_ldap_dn ( $info , $mode = 0 )
2006-11-20 02:13:13 +01:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2006-11-21 23:51:05 +01:00
global $conf ;
2019-11-13 19:35:39 +01:00
$dn = '' ;
if ( $mode == 0 ) $dn = $conf -> global -> LDAP_KEY_USERS . " = " . $info [ $conf -> global -> LDAP_KEY_USERS ] . " , " . $conf -> global -> LDAP_USER_DN ;
elseif ( $mode == 1 ) $dn = $conf -> global -> LDAP_USER_DN ;
elseif ( $mode == 2 ) $dn = $conf -> global -> LDAP_KEY_USERS . " = " . $info [ $conf -> global -> LDAP_KEY_USERS ];
2006-11-21 23:51:05 +01:00
return $dn ;
2006-11-20 02:13:13 +01:00
}
2019-05-10 16:12:16 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
2019-05-10 16:37:03 +02:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2009-08-11 22:16:58 +02:00
/**
2011-05-01 12:48:43 +02:00
* Initialize the info array ( array of LDAP values ) that will be used to call LDAP functions
2011-09-04 20:41:19 +02:00
*
2011-05-01 12:48:43 +02:00
* @ return array Tableau info des attributs
2008-07-19 18:53:56 +02:00
*/
2019-05-10 11:47:44 +02:00
public function _load_ldap_info ()
2006-11-20 02:13:13 +01:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2019-11-13 19:35:39 +01:00
global $conf , $langs ;
2006-11-20 03:10:47 +01:00
2019-11-13 19:35:39 +01:00
$info = array ();
$keymodified = false ;
2006-11-21 23:51:05 +01:00
2007-04-13 02:35:13 +02:00
// Object classes
2019-11-13 19:35:39 +01:00
$info [ " objectclass " ] = explode ( ',' , $conf -> global -> LDAP_USER_OBJECT_CLASS );
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$this -> fullname = $this -> getFullName ( $langs );
2010-07-18 12:39:07 +02:00
2017-09-30 11:51:22 +02:00
// Possible LDAP KEY (constname => varname)
$ldapkey = array (
'LDAP_FIELD_FULLNAME' => 'fullname' ,
'LDAP_FIELD_NAME' => 'lastname' ,
2017-10-02 08:43:53 +02:00
'LDAP_FIELD_FIRSTNAME' => 'firstname' ,
2017-09-30 11:51:22 +02:00
'LDAP_FIELD_LOGIN' => 'login' ,
2018-10-12 11:29:47 +02:00
'LDAP_FIELD_LOGIN_SAMBA' => 'login' ,
2017-10-02 08:43:53 +02:00
'LDAP_FIELD_PHONE' => 'office_phone' ,
'LDAP_FIELD_MOBILE' => 'user_mobile' ,
2018-10-12 11:29:47 +02:00
'LDAP_FIELD_FAX' => 'office_fax' ,
2017-09-30 11:51:22 +02:00
'LDAP_FIELD_MAIL' => 'email' ,
2018-10-12 11:29:47 +02:00
'LDAP_FIELD_SID' => 'ldap_sid' ,
'LDAP_FIELD_SKYPE' => 'skype' ,
'LDAP_FIELD_TWITTER' => 'twitter' ,
2019-02-25 09:07:58 +01:00
'LDAP_FIELD_FACEBOOK' => 'facebook' ,
'LDAP_FIELD_LINKEDIN' => 'linkedin'
2017-09-30 11:51:22 +02:00
);
2006-11-20 03:10:47 +01:00
// Champs
2017-09-30 11:51:22 +02:00
foreach ( $ldapkey as $constname => $varname )
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $this -> $varname ) && ! empty ( $conf -> global -> $constname ))
2017-09-30 11:51:22 +02:00
{
$info [ $conf -> global -> $constname ] = $this -> $varname ;
// Check if it is the LDAP key and if its value has been changed
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> LDAP_KEY_USERS ) && $conf -> global -> LDAP_KEY_USERS == $conf -> global -> $constname )
2017-09-30 11:51:22 +02:00
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $this -> oldcopy ) && $this -> $varname != $this -> oldcopy -> $varname ) $keymodified = true ; // For check if LDAP key has been modified
2017-09-30 11:51:22 +02:00
}
}
}
2019-11-13 19:35:39 +01:00
if ( $this -> address && ! empty ( $conf -> global -> LDAP_FIELD_ADDRESS )) $info [ $conf -> global -> LDAP_FIELD_ADDRESS ] = $this -> address ;
if ( $this -> zip && ! empty ( $conf -> global -> LDAP_FIELD_ZIP )) $info [ $conf -> global -> LDAP_FIELD_ZIP ] = $this -> zip ;
if ( $this -> town && ! empty ( $conf -> global -> LDAP_FIELD_TOWN )) $info [ $conf -> global -> LDAP_FIELD_TOWN ] = $this -> town ;
if ( $this -> note_public && ! empty ( $conf -> global -> LDAP_FIELD_DESCRIPTION )) $info [ $conf -> global -> LDAP_FIELD_DESCRIPTION ] = dol_string_nohtmltag ( $this -> note_public , 2 );
2017-09-30 11:51:22 +02:00
if ( $this -> socid > 0 )
2006-11-20 02:13:13 +01:00
{
$soc = new Societe ( $this -> db );
2017-09-30 11:51:22 +02:00
$soc -> fetch ( $this -> socid );
2006-11-20 03:10:47 +01:00
2017-10-02 09:00:07 +02:00
$info [ $conf -> global -> LDAP_FIELD_COMPANY ] = $soc -> name ;
2006-11-20 02:13:13 +01:00
if ( $soc -> client == 1 ) $info [ " businessCategory " ] = " Customers " ;
if ( $soc -> client == 2 ) $info [ " businessCategory " ] = " Prospects " ;
if ( $soc -> fournisseur == 1 ) $info [ " businessCategory " ] = " Suppliers " ;
}
2017-09-30 11:51:22 +02:00
// When password is modified
2019-11-13 19:35:39 +01:00
if ( ! empty ( $this -> pass ))
2017-09-30 11:51:22 +02:00
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> LDAP_FIELD_PASSWORD )) $info [ $conf -> global -> LDAP_FIELD_PASSWORD ] = $this -> pass ; // this->pass = mot de passe non crypte
if ( ! empty ( $conf -> global -> LDAP_FIELD_PASSWORD_CRYPTED )) $info [ $conf -> global -> LDAP_FIELD_PASSWORD_CRYPTED ] = dol_hash ( $this -> pass , 4 ); // Create OpenLDAP MD5 password (TODO add type of encryption)
2017-09-24 19:18:41 +02:00
}
2017-09-30 11:51:22 +02:00
// Set LDAP password if possible
2018-09-16 13:49:22 +02:00
elseif ( $conf -> global -> LDAP_SERVER_PROTOCOLVERSION !== '3' ) // If ldap key is modified and LDAPv3 we use ldap_rename function for avoid lose encrypt password
2017-09-24 19:18:41 +02:00
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> DATABASE_PWD_ENCRYPTED ))
2017-09-30 11:51:22 +02:00
{
// Just for the default MD5 !
if ( empty ( $conf -> global -> MAIN_SECURITY_HASH_ALGO ))
{
2019-11-13 19:35:39 +01:00
if ( $this -> pass_indatabase_crypted && ! empty ( $conf -> global -> LDAP_FIELD_PASSWORD_CRYPTED )) {
2017-09-30 11:51:22 +02:00
$info [ $conf -> global -> LDAP_FIELD_PASSWORD_CRYPTED ] = dol_hash ( $this -> pass_indatabase_crypted , 5 ); // Create OpenLDAP MD5 password from Dolibarr MD5 password
}
}
}
// Use $this->pass_indatabase value if exists
2019-11-13 19:35:39 +01:00
elseif ( ! empty ( $this -> pass_indatabase ))
2017-09-30 11:51:22 +02:00
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> LDAP_FIELD_PASSWORD )) $info [ $conf -> global -> LDAP_FIELD_PASSWORD ] = $this -> pass_indatabase ; // $this->pass_indatabase = mot de passe non crypte
if ( ! empty ( $conf -> global -> LDAP_FIELD_PASSWORD_CRYPTED )) $info [ $conf -> global -> LDAP_FIELD_PASSWORD_CRYPTED ] = dol_hash ( $this -> pass_indatabase , 4 ); // md5 for OpenLdap TODO add type of encryption
2017-09-24 19:18:41 +02:00
}
}
2006-11-20 03:10:47 +01:00
2006-11-20 02:13:13 +01:00
if ( $conf -> global -> LDAP_SERVER_TYPE == 'egroupware' )
{
$info [ " objectclass " ][ 4 ] = " phpgwContact " ; // compatibilite egroupware
2006-11-20 03:10:47 +01:00
2006-11-20 02:13:13 +01:00
$info [ 'uidnumber' ] = $this -> id ;
2006-11-20 03:10:47 +01:00
2019-11-13 19:35:39 +01:00
$info [ 'phpgwTz' ] = 0 ;
2006-11-20 02:13:13 +01:00
$info [ 'phpgwMailType' ] = 'INTERNET' ;
$info [ 'phpgwMailHomeType' ] = 'INTERNET' ;
2006-11-20 03:10:47 +01:00
2006-11-20 02:13:13 +01:00
$info [ " phpgwContactTypeId " ] = 'n' ;
$info [ " phpgwContactCatId " ] = 0 ;
$info [ " phpgwContactAccess " ] = " public " ;
2006-11-20 03:10:47 +01:00
2010-08-24 21:51:56 +02:00
if ( dol_strlen ( $this -> egroupware_id ) == 0 )
2006-11-20 02:13:13 +01:00
{
$this -> egroupware_id = 1 ;
}
2006-11-20 03:10:47 +01:00
2006-11-20 02:13:13 +01:00
$info [ " phpgwContactOwner " ] = $this -> egroupware_id ;
2006-11-20 03:10:47 +01:00
2006-11-20 02:13:13 +01:00
if ( $this -> email ) $info [ " rfc822Mailbox " ] = $this -> email ;
if ( $this -> phone_mobile ) $info [ " phpgwCellTelephoneNumber " ] = $this -> phone_mobile ;
}
2019-09-12 12:18:22 +02:00
if ( ! empty ( $conf -> global -> LDAP_FIELD_USERID )) $info [ $conf -> global -> LDAP_FIELD_USERID ] = $this -> id ;
2019-11-13 19:35:39 +01:00
if ( ! empty ( $info [ $conf -> global -> LDAP_FIELD_GROUPID ])) {
2019-09-12 12:18:22 +02:00
$usergroup = new UserGroup ( $this -> db );
$groupslist = $usergroup -> listGroupsForUser ( $this -> id );
$info [ $conf -> global -> LDAP_FIELD_GROUPID ] = '1' ;
2019-11-13 19:35:39 +01:00
if ( ! empty ( $groupslist )) {
2019-09-12 12:18:22 +02:00
foreach ( $groupslist as $groupforuser ) {
2019-11-13 19:35:39 +01:00
$info [ $conf -> global -> LDAP_FIELD_GROUPID ] = $groupforuser -> id ; //Select first group in list
2019-09-12 12:18:22 +02:00
break ;
}
2019-09-11 23:45:02 +02:00
}
}
2019-11-13 19:35:39 +01:00
if ( ! empty ( $this -> firstname ) && ! empty ( $conf -> global -> LDAP_FIELD_HOMEDIRECTORY ) && ! empty ( $conf -> global -> LDAP_FIELD_HOMEDIRECTORYPREFIX )) $info [ $conf -> global -> LDAP_FIELD_HOMEDIRECTORY ] = " { $conf -> global -> LDAP_FIELD_HOMEDIRECTORYPREFIX } / $this->firstname " ;
2019-09-11 23:45:02 +02:00
return $info ;
}
2008-07-19 18:53:56 +02:00
2006-11-20 03:10:47 +01:00
2006-11-19 17:41:17 +01:00
/**
2011-09-24 01:46:14 +02:00
* Initialise an instance with random values .
* Used to build previews or test instances .
* id must be 0 if object instance is a specimen .
*
* @ return void
2006-11-19 17:41:17 +01:00
*/
2019-02-25 20:35:59 +01:00
public function initAsSpecimen ()
2006-11-19 17:41:17 +01:00
{
2019-12-18 15:20:36 +01:00
global $user , $langs ;
2006-11-19 17:41:17 +01:00
2019-12-18 15:20:36 +01:00
$now = dol_now ();
2013-06-16 21:31:21 +02:00
2007-12-19 11:24:18 +01:00
// Initialise parametres
2019-12-18 15:20:36 +01:00
$this -> id = 0 ;
2006-11-19 17:41:17 +01:00
$this -> ref = 'SPECIMEN' ;
2019-12-18 15:20:36 +01:00
$this -> specimen = 1 ;
$this -> lastname = 'DOLIBARR' ;
$this -> firstname = 'SPECIMEN' ;
$this -> gender = 'man' ;
$this -> note_public = 'This is a note public' ;
$this -> note_private = 'This is a note private' ;
$this -> email = 'email@specimen.com' ;
$this -> personal_email = 'personalemail@specimen.com' ;
2019-09-12 18:12:28 +02:00
$this -> socialnetworks = array (
'skype' => 'skypepseudo' ,
'twitter' => 'twitterpseudo' ,
'facebook' => 'facebookpseudo' ,
'linkedin' => 'linkedinpseudo' ,
);
2019-12-18 15:20:36 +01:00
$this -> office_phone = '0999999999' ;
$this -> office_fax = '0999999998' ;
$this -> user_mobile = '0999999997' ;
$this -> personal_mobile = '0999999996' ;
$this -> admin = 0 ;
$this -> login = 'dolibspec' ;
$this -> pass = 'dolibspec' ;
2013-04-01 14:49:33 +02:00
//$this->pass_indatabase='dolibspec'; Set after a fetch
//$this->pass_indatabase_crypted='e80ca5a88c892b0aaaf7e154853bccab'; Set after a fetch
2019-12-18 15:20:36 +01:00
$this -> datec = $now ;
$this -> datem = $now ;
2006-11-19 17:41:17 +01:00
2019-12-18 15:20:36 +01:00
$this -> datelastlogin = $now ;
$this -> datepreviouslogin = $now ;
$this -> statut = 1 ;
2006-11-19 17:41:17 +01:00
2013-04-01 14:49:33 +02:00
//$this->societe_id = 1; For external users
//$this->contact_id = 1; For external users
$this -> entity = 1 ;
2006-11-20 03:10:47 +01:00
}
2006-12-03 20:29:41 +01:00
2008-07-19 18:53:56 +02:00
/**
2011-09-20 19:34:15 +02:00
* Load info of user object
2011-09-04 20:41:19 +02:00
*
2011-09-20 19:34:15 +02:00
* @ param int $id Id of user to load
* @ return void
2008-07-19 18:53:56 +02:00
*/
2019-02-25 20:35:59 +01:00
public function info ( $id )
2008-07-19 18:53:56 +02:00
{
2010-01-13 19:51:19 +01:00
$sql = " SELECT u.rowid, u.login as ref, u.datec, " ;
2019-11-13 19:35:39 +01:00
$sql .= " u.tms as date_modification, u.entity " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " user as u " ;
$sql .= " WHERE u.rowid = " . $id ;
2008-07-19 18:53:56 +02:00
2019-11-13 19:35:39 +01:00
$result = $this -> db -> query ( $sql );
2008-07-19 18:53:56 +02:00
if ( $result )
{
if ( $this -> db -> num_rows ( $result ))
{
$obj = $this -> db -> fetch_object ( $result );
$this -> id = $obj -> rowid ;
2019-11-13 19:35:39 +01:00
$this -> ref = ( ! $obj -> ref ) ? $obj -> rowid : $obj -> ref ;
2019-02-25 20:35:59 +01:00
$this -> date_creation = $this -> db -> jdate ( $obj -> datec );
2010-01-13 19:51:19 +01:00
$this -> date_modification = $this -> db -> jdate ( $obj -> date_modification );
2019-02-25 20:35:59 +01:00
$this -> entity = $obj -> entity ;
2008-07-19 18:53:56 +02:00
}
$this -> db -> free ( $result );
}
else
{
2009-02-20 23:53:15 +01:00
dol_print_error ( $this -> db );
2008-07-19 18:53:56 +02:00
}
}
2007-09-01 00:06:14 +02:00
2010-02-21 22:21:12 +01:00
/**
2011-05-01 12:48:43 +02:00
* Return number of mass Emailing received by this contacts with its email
2011-09-04 20:41:19 +02:00
*
2011-05-01 12:48:43 +02:00
* @ return int Number of EMailings
2010-02-21 22:21:12 +01:00
*/
2019-02-25 20:35:59 +01:00
public function getNbOfEMailings ()
2010-02-21 22:21:12 +01:00
{
$sql = " SELECT count(mc.email) as nb " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " mailing_cibles as mc " ;
$sql .= " WHERE mc.email = ' " . $this -> db -> escape ( $this -> email ) . " ' " ;
$sql .= " AND mc.statut NOT IN (-1,0) " ; // -1 erreur, 0 non envoye, 1 envoye avec succes
2018-06-06 18:18:50 +02:00
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2010-02-21 22:21:12 +01:00
if ( $resql )
{
$obj = $this -> db -> fetch_object ( $resql );
2019-11-13 19:35:39 +01:00
$nb = $obj -> nb ;
2010-02-21 22:21:12 +01:00
$this -> db -> free ( $resql );
return $nb ;
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> error ();
2010-02-21 22:21:12 +01:00
return - 1 ;
}
}
2010-06-17 18:53:26 +02:00
2010-06-07 07:11:45 +02:00
/**
2011-09-20 19:34:15 +02:00
* Return number of existing users
2011-09-04 20:41:19 +02:00
*
2015-10-05 10:04:34 +02:00
* @ param string $limitTo Limit to '' or 'active'
* @ param string $option 'superadmin' = return for entity 0 only
* @ param int $admin Filter on admin tag
2011-09-20 19:34:15 +02:00
* @ return int Number of users
2010-06-07 07:11:45 +02:00
*/
2019-02-25 20:35:59 +01:00
public function getNbOfUsers ( $limitTo , $option = '' , $admin = - 1 )
2010-06-07 07:11:45 +02:00
{
global $conf ;
2010-06-17 18:53:26 +02:00
2010-06-07 07:11:45 +02:00
$sql = " SELECT count(rowid) as nb " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " user " ;
2015-10-05 10:04:34 +02:00
if ( $option == 'superadmin' )
2011-05-16 21:56:43 +02:00
{
2019-11-13 19:35:39 +01:00
$sql .= " WHERE entity = 0 " ;
if ( $admin >= 0 ) $sql .= " AND admin = " . $admin ;
2011-05-16 21:56:43 +02:00
}
else
{
2019-11-13 19:35:39 +01:00
$sql .= " WHERE entity IN ( " . getEntity ( 'user' , 0 ) . " ) " ;
if ( $limitTo == 'active' ) $sql .= " AND statut = 1 " ;
if ( $admin >= 0 ) $sql .= " AND admin = " . $admin ;
2011-05-16 21:56:43 +02:00
}
2010-06-17 18:53:26 +02:00
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2010-06-07 07:11:45 +02:00
if ( $resql )
{
$obj = $this -> db -> fetch_object ( $resql );
2019-11-13 19:35:39 +01:00
$nb = $obj -> nb ;
2010-06-07 07:11:45 +02:00
$this -> db -> free ( $resql );
return $nb ;
}
else
{
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> lasterror ();
2010-06-07 07:11:45 +02:00
return - 1 ;
}
}
2010-02-21 22:21:12 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2013-01-30 16:50:28 +01:00
/**
2013-04-04 13:58:33 +02:00
* Update user using data from the LDAP
*
2019-04-04 18:33:12 +02:00
* @ param Object $ldapuser Ladp User
2013-04-04 13:58:33 +02:00
* @ return int < 0 if KO , > 0 if OK
2013-01-30 16:50:28 +01:00
*/
2019-02-25 20:35:59 +01:00
public function update_ldap2dolibarr ( & $ldapuser )
2013-02-11 20:45:36 +01:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2013-04-04 13:58:33 +02:00
// TODO: Voir pourquoi le update met à jour avec toutes les valeurs vide (global $user écrase ?)
2013-01-30 16:50:28 +01:00
global $user , $conf ;
2019-11-13 19:35:39 +01:00
$this -> firstname = $ldapuser -> { $conf -> global -> LDAP_FIELD_FIRSTNAME };
$this -> lastname = $ldapuser -> { $conf -> global -> LDAP_FIELD_NAME };
$this -> login = $ldapuser -> { $conf -> global -> LDAP_FIELD_LOGIN };
$this -> pass = $ldapuser -> { $conf -> global -> LDAP_FIELD_PASSWORD };
$this -> pass_indatabase_crypted = $ldapuser -> { $conf -> global -> LDAP_FIELD_PASSWORD_CRYPTED };
$this -> office_phone = $ldapuser -> { $conf -> global -> LDAP_FIELD_PHONE };
$this -> user_mobile = $ldapuser -> { $conf -> global -> LDAP_FIELD_MOBILE };
$this -> office_fax = $ldapuser -> { $conf -> global -> LDAP_FIELD_FAX };
$this -> email = $ldapuser -> { $conf -> global -> LDAP_FIELD_MAIL };
$this -> skype = $ldapuser -> { $conf -> global -> LDAP_FIELD_SKYPE };
$this -> twitter = $ldapuser -> { $conf -> global -> LDAP_FIELD_TWITTER };
$this -> facebook = $ldapuser -> { $conf -> global -> LDAP_FIELD_FACEBOOK };
$this -> linkedin = $ldapuser -> { $conf -> global -> LDAP_FIELD_LINKEDIN };
$this -> ldap_sid = $ldapuser -> { $conf -> global -> LDAP_FIELD_SID };
$this -> job = $ldapuser -> { $conf -> global -> LDAP_FIELD_TITLE };
$this -> note = $ldapuser -> { $conf -> global -> LDAP_FIELD_DESCRIPTION };
2013-02-11 20:45:36 +01:00
2013-01-30 16:50:28 +01:00
$result = $this -> update ( $user );
2013-02-11 20:45:36 +01:00
2013-01-30 16:50:28 +01:00
dol_syslog ( get_class ( $this ) . " ::update_ldap2dolibarr result= " . $result , LOG_DEBUG );
2013-02-11 20:45:36 +01:00
2013-01-30 16:50:28 +01:00
return $result ;
}
2013-02-11 20:45:36 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2013-03-30 14:27:13 +01:00
/**
2015-02-21 16:15:54 +01:00
* Return and array with all instanciated first level children users of current user
2013-03-30 14:27:13 +01:00
*
2019-11-14 18:44:18 +01:00
* @ return User [] | int
2019-04-04 18:33:12 +02:00
* @ see getAllChildIds ()
2013-03-30 14:27:13 +01:00
*/
2019-02-25 20:35:59 +01:00
public function get_children ()
2013-03-30 14:27:13 +01:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2013-03-30 14:27:13 +01:00
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " user " ;
2019-11-13 19:35:39 +01:00
$sql .= " WHERE fk_user = " . $this -> id ;
2013-03-30 14:27:13 +01:00
2019-11-14 18:47:16 +01:00
dol_syslog ( get_class ( $this ) . " ::get_children sql= " . $sql , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
$res = $this -> db -> query ( $sql );
2013-03-30 14:27:13 +01:00
if ( $res )
{
2019-11-13 19:35:39 +01:00
$users = array ();
2013-03-30 14:27:13 +01:00
while ( $rec = $this -> db -> fetch_array ( $res ))
{
$user = new User ( $this -> db );
$user -> fetch ( $rec [ 'rowid' ]);
$users [] = $user ;
}
return $users ;
}
else
{
dol_print_error ( $this -> db );
return - 1 ;
}
}
/**
2019-02-25 20:35:59 +01:00
* Load this -> parentof that is array ( id_son => id_parent , ... )
2013-03-30 14:27:13 +01:00
*
2019-02-25 20:35:59 +01:00
* @ return int < 0 if KO , > 0 if OK
2013-03-30 14:27:13 +01:00
*/
2018-09-02 09:57:19 +02:00
private function loadParentOf ()
2013-03-30 14:27:13 +01:00
{
global $conf ;
2019-11-13 19:35:39 +01:00
$this -> parentof = array ();
2013-03-30 14:27:13 +01:00
// Load array[child]=parent
$sql = " SELECT fk_user as id_parent, rowid as id_son " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " user " ;
$sql .= " WHERE fk_user <> 0 " ;
$sql .= " AND entity IN ( " . getEntity ( 'user' ) . " ) " ;
2013-03-30 14:27:13 +01:00
2018-09-02 09:57:19 +02:00
dol_syslog ( get_class ( $this ) . " ::loadParentOf " , LOG_DEBUG );
2013-03-30 14:27:13 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2019-11-13 19:35:39 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql ))
2013-03-30 14:27:13 +01:00
{
2019-11-13 19:35:39 +01:00
$this -> parentof [ $obj -> id_son ] = $obj -> id_parent ;
2013-03-30 14:27:13 +01:00
}
return 1 ;
}
else
{
dol_print_error ( $this -> db );
return - 1 ;
}
}
2019-03-01 18:28:51 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2013-03-30 14:27:13 +01:00
/**
2019-11-02 15:20:35 +01:00
* Build the hierarchy / tree of users into an array .
2014-10-30 11:16:45 +01:00
* Set and return this -> users that is an array sorted according to tree with arrays of :
* id = id user
* lastname
* firstname
2013-03-30 14:27:13 +01:00
* fullname = nom avec chemin complet du user
2014-10-30 11:16:45 +01:00
* fullpath = chemin complet compose des id : " _grandparentid_parentid_id "
2013-03-30 14:27:13 +01:00
*
2014-08-11 10:50:08 +02:00
* @ param int $deleteafterid Removed all users including the leaf $deleteafterid ( and all its child ) in user tree .
2015-06-20 20:35:57 +02:00
* @ param string $filter SQL filter on users
2014-10-30 11:16:45 +01:00
* @ return array Array of users $this -> users . Note : $this -> parentof is also set .
2013-03-30 14:27:13 +01:00
*/
2019-02-25 20:35:59 +01:00
public function get_full_tree ( $deleteafterid = 0 , $filter = '' )
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2018-03-23 10:42:36 +01:00
global $conf , $user ;
global $hookmanager ;
// Actions hooked (by external module)
$hookmanager -> initHooks ( array ( 'userdao' ));
2014-05-30 12:55:00 +02:00
2013-03-30 14:27:13 +01:00
$this -> users = array ();
// Init this->parentof that is array(id_son=>id_parent, ...)
2018-09-02 09:57:19 +02:00
$this -> loadParentOf ();
2014-09-13 17:41:26 +02:00
2013-03-30 14:27:13 +01:00
// Init $this->users array
2019-11-13 19:35:39 +01:00
$sql = " SELECT DISTINCT u.rowid, u.firstname, u.lastname, u.fk_user, u.fk_soc, u.login, u.email, u.gender, u.admin, u.statut, u.photo, u.entity " ; // Distinct reduce pb with old tables with duplicates
$sql .= " FROM " . MAIN_DB_PREFIX . " user as u " ;
2018-03-23 10:42:36 +01:00
// Add fields from hooks
2019-11-13 19:35:39 +01:00
$parameters = array ();
$reshook = $hookmanager -> executeHooks ( 'printUserListWhere' , $parameters ); // Note that $action and $object may have been modified by hook
2018-03-23 10:52:10 +01:00
if ( $reshook > 0 ) {
2019-11-13 19:35:39 +01:00
$sql .= $hookmanager -> resPrint ;
2018-03-06 19:22:59 +01:00
} else {
2019-11-13 19:35:39 +01:00
$sql .= " WHERE u.entity IN ( " . getEntity ( 'user' ) . " ) " ;
2014-05-30 12:43:07 +02:00
}
2019-11-13 19:35:39 +01:00
if ( $filter ) $sql .= " AND " . $filter ;
2015-06-20 20:35:57 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( get_class ( $this ) . " ::get_full_tree get user list " , LOG_DEBUG );
2013-03-30 14:27:13 +01:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2019-11-13 19:35:39 +01:00
$i = 0 ;
2013-03-30 14:27:13 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql ))
{
$this -> users [ $obj -> rowid ][ 'rowid' ] = $obj -> rowid ;
$this -> users [ $obj -> rowid ][ 'id' ] = $obj -> rowid ;
$this -> users [ $obj -> rowid ][ 'fk_user' ] = $obj -> fk_user ;
2015-06-16 15:08:20 +02:00
$this -> users [ $obj -> rowid ][ 'fk_soc' ] = $obj -> fk_soc ;
2013-03-30 14:27:13 +01:00
$this -> users [ $obj -> rowid ][ 'firstname' ] = $obj -> firstname ;
$this -> users [ $obj -> rowid ][ 'lastname' ] = $obj -> lastname ;
2013-02-20 21:16:31 +01:00
$this -> users [ $obj -> rowid ][ 'login' ] = $obj -> login ;
$this -> users [ $obj -> rowid ][ 'statut' ] = $obj -> statut ;
2014-05-30 12:55:00 +02:00
$this -> users [ $obj -> rowid ][ 'entity' ] = $obj -> entity ;
2015-06-16 15:08:20 +02:00
$this -> users [ $obj -> rowid ][ 'email' ] = $obj -> email ;
$this -> users [ $obj -> rowid ][ 'gender' ] = $obj -> gender ;
2015-10-05 23:53:49 +02:00
$this -> users [ $obj -> rowid ][ 'admin' ] = $obj -> admin ;
2015-10-25 19:31:13 +01:00
$this -> users [ $obj -> rowid ][ 'photo' ] = $obj -> photo ;
2013-03-30 14:27:13 +01:00
$i ++ ;
}
}
else
{
dol_print_error ( $this -> db );
return - 1 ;
}
// We add the fullpath property to each elements of first level (no parent exists)
dol_syslog ( get_class ( $this ) . " ::get_full_tree call to build_path_from_id_user " , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
foreach ( $this -> users as $key => $val )
2013-03-30 14:27:13 +01:00
{
2019-11-13 19:35:39 +01:00
$result = $this -> build_path_from_id_user ( $key , 0 ); // Process a branch from the root user key (this user has no parent)
2017-03-13 15:00:44 +01:00
if ( $result < 0 )
2017-02-21 23:52:13 +01:00
{
2019-11-13 19:35:39 +01:00
$this -> error = 'ErrorLoopInHierarchy' ;
2017-10-07 13:09:31 +02:00
return - 1 ;
2017-02-21 23:52:13 +01:00
}
2013-03-30 14:27:13 +01:00
}
2014-08-11 10:50:08 +02:00
// Exclude leaf including $deleteafterid from tree
if ( $deleteafterid )
2013-03-30 14:27:13 +01:00
{
2014-08-11 10:50:08 +02:00
//print "Look to discard user ".$deleteafterid."\n";
2019-11-13 19:35:39 +01:00
$keyfilter1 = '^' . $deleteafterid . '$' ;
$keyfilter2 = '_' . $deleteafterid . '$' ;
$keyfilter3 = '^' . $deleteafterid . '_' ;
$keyfilter4 = '_' . $deleteafterid . '_' ;
foreach ( $this -> users as $key => $val )
2013-03-30 14:27:13 +01:00
{
2019-01-27 11:55:16 +01:00
if ( preg_match ( '/' . $keyfilter1 . '/' , $val [ 'fullpath' ]) || preg_match ( '/' . $keyfilter2 . '/' , $val [ 'fullpath' ])
|| preg_match ( '/' . $keyfilter3 . '/' , $val [ 'fullpath' ]) || preg_match ( '/' . $keyfilter4 . '/' , $val [ 'fullpath' ]))
2013-03-30 14:27:13 +01:00
{
unset ( $this -> users [ $key ]);
}
}
}
dol_syslog ( get_class ( $this ) . " ::get_full_tree dol_sort_array " , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
$this -> users = dol_sort_array ( $this -> users , 'fullname' , 'asc' , true , false );
2013-03-30 14:27:13 +01:00
2014-07-05 08:59:41 +02:00
//var_dump($this->users);
2013-03-30 14:27:13 +01:00
return $this -> users ;
}
2014-10-30 11:15:13 +01:00
/**
2015-02-21 16:15:54 +01:00
* Return list of all child users id in herarchy ( all sublevels ) .
2017-01-26 23:40:16 +01:00
* Note : Calling this function also reset full list of users into $this -> users .
2014-10-30 11:15:13 +01:00
*
2017-01-26 23:36:58 +01:00
* @ param int $addcurrentuser 1 = Add also current user id to the list .
2017-01-26 23:40:16 +01:00
* @ return array Array of user id lower than user ( all levels under user ) . This overwrite this -> users .
2019-04-08 16:04:15 +02:00
* @ see get_children ()
2014-10-30 11:15:13 +01:00
*/
2019-02-25 20:35:59 +01:00
public function getAllChildIds ( $addcurrentuser = 0 )
{
2019-11-13 19:35:39 +01:00
$childids = array ();
2017-10-07 13:09:31 +02:00
if ( isset ( $this -> cache_childids [ $this -> id ]))
{
$childids = $this -> cache_childids [ $this -> id ];
}
else
{
// Init this->users
$this -> get_full_tree ();
2019-11-13 19:35:39 +01:00
$idtoscan = $this -> id ;
2017-10-07 13:09:31 +02:00
dol_syslog ( " Build childid for id = " . $idtoscan );
2019-11-13 19:35:39 +01:00
foreach ( $this -> users as $id => $val )
2017-10-07 13:09:31 +02:00
{
//var_dump($val['fullpath']);
2019-11-13 19:35:39 +01:00
if ( preg_match ( '/_' . $idtoscan . '_/' , $val [ 'fullpath' ])) $childids [ $val [ 'id' ]] = $val [ 'id' ];
2017-10-07 13:09:31 +02:00
}
}
2017-01-26 18:08:00 +01:00
$this -> cache_childids [ $this -> id ] = $childids ;
2017-03-13 15:00:44 +01:00
2019-11-13 19:35:39 +01:00
if ( $addcurrentuser ) $childids [ $this -> id ] = $this -> id ;
2017-03-13 15:00:44 +01:00
2014-10-30 11:15:13 +01:00
return $childids ;
}
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2013-03-30 14:27:13 +01:00
/**
2016-03-14 21:22:49 +01:00
* For user id_user and its childs available in this -> users , define property fullpath and fullname .
* Function called by get_full_tree () .
2013-03-30 14:27:13 +01:00
*
* @ param int $id_user id_user entry to update
2017-02-21 23:52:13 +01:00
* @ param int $protection Deep counter to avoid infinite loop ( no more required , a protection is added with array useridfound )
* @ return int < 0 if KO ( infinit loop ), >= 0 if OK
2013-03-30 14:27:13 +01:00
*/
2019-02-25 20:35:59 +01:00
public function build_path_from_id_user ( $id_user , $protection = 0 )
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2013-03-30 14:27:13 +01:00
dol_syslog ( get_class ( $this ) . " ::build_path_from_id_user id_user= " . $id_user . " protection= " . $protection , LOG_DEBUG );
2019-11-13 19:35:39 +01:00
if ( ! empty ( $this -> users [ $id_user ][ 'fullpath' ]))
2013-03-30 14:27:13 +01:00
{
// Already defined
dol_syslog ( get_class ( $this ) . " ::build_path_from_id_user fullpath and fullname already defined " , LOG_WARNING );
2017-02-21 23:52:13 +01:00
return 0 ;
2013-03-30 14:27:13 +01:00
}
// Define fullpath and fullname
$this -> users [ $id_user ][ 'fullpath' ] = '_' . $id_user ;
2014-08-07 20:11:39 +02:00
$this -> users [ $id_user ][ 'fullname' ] = $this -> users [ $id_user ][ 'lastname' ];
2019-11-13 19:35:39 +01:00
$i = 0 ; $cursor_user = $id_user ;
2013-03-30 14:27:13 +01:00
2019-11-13 19:35:39 +01:00
$useridfound = array ( $id_user );
while ( ! empty ( $this -> parentof [ $cursor_user ]))
2013-03-30 14:27:13 +01:00
{
2017-03-13 15:00:44 +01:00
if ( in_array ( $this -> parentof [ $cursor_user ], $useridfound ))
2017-02-21 23:52:13 +01:00
{
dol_syslog ( " The hierarchy of user has a recursive loop " , LOG_WARNING );
2019-11-13 19:35:39 +01:00
return - 1 ; // Should not happen. Protection against looping hierarchy
2017-02-21 23:52:13 +01:00
}
2019-11-13 19:35:39 +01:00
$useridfound [] = $this -> parentof [ $cursor_user ];
2017-10-07 13:09:31 +02:00
$this -> users [ $id_user ][ 'fullpath' ] = '_' . $this -> parentof [ $cursor_user ] . $this -> users [ $id_user ][ 'fullpath' ];
2014-08-07 20:11:39 +02:00
$this -> users [ $id_user ][ 'fullname' ] = $this -> users [ $this -> parentof [ $cursor_user ]][ 'lastname' ] . ' >> ' . $this -> users [ $id_user ][ 'fullname' ];
2019-11-13 19:35:39 +01:00
$i ++ ; $cursor_user = $this -> parentof [ $cursor_user ];
2013-03-30 14:27:13 +01:00
}
// We count number of _ to have level
2019-11-13 19:35:39 +01:00
$this -> users [ $id_user ][ 'level' ] = dol_strlen ( preg_replace ( '/[^_]/i' , '' , $this -> users [ $id_user ][ 'fullpath' ]));
2013-03-30 14:27:13 +01:00
2017-02-21 23:52:13 +01:00
return 1 ;
2013-03-30 14:27:13 +01:00
}
2015-04-18 18:11:01 +02:00
/**
* Function used to replace a thirdparty id with another one .
*
* @ param DoliDB $db Database handler
* @ param int $origin_id Old thirdparty id
* @ param int $dest_id New thirdparty id
* @ return bool
*/
public static function replaceThirdparty ( DoliDB $db , $origin_id , $dest_id )
{
$tables = array (
2018-09-16 13:49:22 +02:00
'user' ,
2015-04-18 18:11:01 +02:00
);
return CommonObject :: commonReplaceThirdparty ( $db , $origin_id , $dest_id , $tables );
}
2016-03-17 09:22:12 +01:00
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2015-12-05 19:31:32 +01:00
/**
2019-04-25 01:50:48 +02:00
* Load metrics this -> nb for dashboard
2017-10-07 13:09:31 +02:00
*
* @ return int < 0 if KO , > 0 if OK
*/
2019-02-25 20:35:59 +01:00
public function load_state_board ()
2017-10-07 13:09:31 +02:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2017-10-07 13:09:31 +02:00
2019-11-13 19:35:39 +01:00
$this -> nb = array ();
2017-10-07 13:09:31 +02:00
$sql = " SELECT count(u.rowid) as nb " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " user as u " ;
$sql .= " WHERE u.statut > 0 " ;
2017-10-07 13:09:31 +02:00
//$sql.= " AND employee != 0";
2019-11-13 19:35:39 +01:00
$sql .= " AND u.entity IN ( " . getEntity ( 'user' ) . " ) " ;
2017-10-07 13:09:31 +02:00
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2017-10-07 13:09:31 +02:00
if ( $resql )
{
2019-11-13 19:35:39 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql ))
2017-10-07 13:09:31 +02:00
{
2019-11-13 19:35:39 +01:00
$this -> nb [ " users " ] = $obj -> nb ;
2017-10-07 13:09:31 +02:00
}
$this -> db -> free ( $resql );
return 1 ;
}
else
{
dol_print_error ( $this -> db );
2019-11-13 19:35:39 +01:00
$this -> error = $this -> db -> error ();
2017-10-07 13:09:31 +02:00
return - 1 ;
}
}
2016-03-17 09:22:12 +01:00
2017-03-02 15:13:42 +01:00
/**
* Create a document onto disk according to template module .
*
* @ param string $modele Force model to use ( '' to not force )
* @ param Translate $outputlangs Object langs to use for output
* @ param int $hidedetails Hide details of lines
* @ param int $hidedesc Hide description
* @ param int $hideref Hide ref
2018-06-15 09:47:28 +02:00
* @ param null | array $moreparams Array to provide more information
2017-03-02 15:13:42 +01:00
* @ return int 0 if KO , 1 if OK
*/
2019-01-27 15:20:16 +01:00
public function generateDocument ( $modele , $outputlangs , $hidedetails = 0 , $hidedesc = 0 , $hideref = 0 , $moreparams = null )
2017-03-02 15:13:42 +01:00
{
2018-09-16 13:49:22 +02:00
global $conf , $user , $langs ;
2017-03-02 15:13:42 +01:00
$langs -> load ( " user " );
// Positionne le modele sur le nom du modele a utiliser
2019-11-13 19:35:39 +01:00
if ( ! dol_strlen ( $modele ))
2017-03-02 15:13:42 +01:00
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> USER_ADDON_PDF ))
2017-03-02 15:13:42 +01:00
{
$modele = $conf -> global -> USER_ADDON_PDF ;
}
else
{
$modele = 'bluesky' ;
}
}
$modelpath = " core/modules/user/doc/ " ;
2018-06-15 09:47:28 +02:00
return $this -> commonGenerateDocument ( $modelpath , $modele , $outputlangs , $hidedetails , $hidedesc , $hideref , $moreparams );
2017-03-02 15:13:42 +01:00
}
2019-02-25 20:35:59 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
2018-03-21 11:48:30 +01:00
/**
2018-03-21 23:03:22 +01:00
* Return property of user from its id
2018-03-21 11:48:30 +01:00
*
* @ param int $rowid id of contact
* @ param string $mode 'email' or 'mobile'
2018-03-21 23:03:22 +01:00
* @ return string Email of user with format : " Full name <email> "
2018-03-21 11:48:30 +01:00
*/
2019-02-25 20:35:59 +01:00
public function user_get_property ( $rowid , $mode )
2018-03-21 11:48:30 +01:00
{
2018-09-02 09:57:19 +02:00
// phpcs:enable
2019-11-13 19:35:39 +01:00
$user_property = '' ;
2018-03-21 11:48:30 +01:00
if ( empty ( $rowid )) return '' ;
$sql = " SELECT rowid, email, user_mobile, civility, lastname, firstname " ;
2019-11-13 19:35:39 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " user " ;
$sql .= " WHERE rowid = ' " . $rowid . " ' " ;
2018-03-21 11:48:30 +01:00
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2018-03-21 11:48:30 +01:00
if ( $resql )
{
$nump = $this -> db -> num_rows ( $resql );
if ( $nump )
{
$obj = $this -> db -> fetch_object ( $resql );
if ( $mode == 'email' ) $user_property = dolGetFirstLastname ( $obj -> firstname , $obj -> lastname ) . " < " . $obj -> email . " > " ;
2019-01-27 10:49:34 +01:00
elseif ( $mode == 'mobile' ) $user_property = $obj -> user_mobile ;
2018-03-21 11:48:30 +01:00
}
return $user_property ;
}
else
{
dol_print_error ( $this -> db );
}
}
/**
2018-03-21 23:03:22 +01:00
* Load all objects into $this -> users
2018-03-21 11:48:30 +01:00
*
2018-11-27 16:39:08 +01:00
* @ param string $sortorder sort order
* @ param string $sortfield sort field
* @ param int $limit limit page
* @ param int $offset page
* @ param array $filter Filter array . Example array ( 'field' => 'valueforlike' , 'customurl' =>... )
* @ param string $filtermode Filter mode ( AND or OR )
2019-04-24 08:17:10 +02:00
* @ param bool $entityfilter Activate entity filter
2018-11-27 16:39:08 +01:00
* @ return int < 0 if KO , > 0 if OK
2018-03-21 11:48:30 +01:00
*/
2019-04-25 01:50:48 +02:00
public function fetchAll ( $sortorder = '' , $sortfield = '' , $limit = 0 , $offset = 0 , $filter = array (), $filtermode = 'AND' , $entityfilter = false )
2019-02-25 20:35:59 +01:00
{
2019-04-25 01:50:48 +02:00
global $conf , $user ;
2018-03-21 11:48:30 +01:00
2019-11-13 19:35:39 +01:00
$sql = " SELECT t.rowid " ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . $this -> table_element . ' as t ' ;
2019-04-24 08:17:10 +02:00
if ( $entityfilter )
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $conf -> global -> MULTICOMPANY_TRANSVERSE_MODE ))
2019-04-24 08:17:10 +02:00
{
2019-11-13 19:35:39 +01:00
if ( ! empty ( $user -> admin ) && empty ( $user -> entity ) && $conf -> entity == 1 ) {
$sql .= " WHERE t.entity IS NOT NULL " ; // Show all users
2019-04-24 08:17:10 +02:00
} else {
2019-11-13 19:35:39 +01:00
$sql .= " , " . MAIN_DB_PREFIX . " usergroup_user as ug " ;
$sql .= " WHERE ((ug.fk_user = t.rowid " ;
$sql .= " AND ug.entity IN ( " . getEntity ( 'user' ) . " )) " ;
$sql .= " OR t.entity = 0) " ; // Show always superadmin
2019-04-24 08:17:10 +02:00
}
}
else
{
2019-11-13 19:35:39 +01:00
$sql .= " WHERE t.entity IN ( " . getEntity ( 'user' ) . " ) " ;
2019-04-24 08:17:10 +02:00
}
}
else
{
2019-11-13 19:35:39 +01:00
$sql .= " WHERE 1 " ;
2019-04-24 08:17:10 +02:00
}
2018-03-21 11:48:30 +01:00
2018-11-27 16:39:08 +01:00
// Manage filter
$sqlwhere = array ();
2019-11-13 19:35:39 +01:00
if ( ! empty ( $filter )) {
foreach ( $filter as $key => $value ) {
if ( $key == 't.rowid' ) {
$sqlwhere [] = $key . '=' . $value ;
2018-11-27 16:39:08 +01:00
}
2019-01-27 11:55:16 +01:00
elseif ( strpos ( $key , 'date' ) !== false ) {
2018-11-27 16:39:08 +01:00
$sqlwhere [] = $key . ' = \'' . $this -> db -> idate ( $value ) . '\'' ;
2018-03-21 11:48:30 +01:00
}
2019-11-13 19:35:39 +01:00
elseif ( $key == 'customsql' ) {
2018-11-27 16:39:08 +01:00
$sqlwhere [] = $value ;
}
else {
2019-11-13 19:35:39 +01:00
$sqlwhere [] = $key . ' LIKE \'%' . $this -> db -> escape ( $value ) . '%\'' ;
2018-03-21 11:48:30 +01:00
}
}
}
2018-11-27 16:39:08 +01:00
if ( count ( $sqlwhere ) > 0 ) {
2019-11-13 19:35:39 +01:00
$sql .= ' AND (' . implode ( ' ' . $filtermode . ' ' , $sqlwhere ) . ')' ;
2018-11-27 16:39:08 +01:00
}
2019-11-13 19:35:39 +01:00
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) $sql .= $this -> db -> plimit ( $limit + 1 , $offset );
2018-03-21 11:48:30 +01:00
2020-02-17 12:34:00 +01:00
dol_syslog ( __METHOD__ , LOG_DEBUG );
2018-03-21 11:48:30 +01:00
2019-11-13 19:35:39 +01:00
$resql = $this -> db -> query ( $sql );
2018-03-21 11:48:30 +01:00
if ( $resql )
{
2019-11-13 19:35:39 +01:00
$this -> users = array ();
2018-03-21 11:48:30 +01:00
$num = $this -> db -> num_rows ( $resql );
if ( $num )
{
while ( $obj = $this -> db -> fetch_object ( $resql ))
{
$line = new self ( $this -> db );
$result = $line -> fetch ( $obj -> rowid );
2019-11-13 19:35:39 +01:00
if ( $result > 0 && ! empty ( $line -> id )) {
2018-03-21 11:48:30 +01:00
$this -> users [ $obj -> rowid ] = clone $line ;
}
}
$this -> db -> free ( $resql );
}
return $num ;
}
else
{
2019-02-25 20:35:59 +01:00
$this -> errors [] = $this -> db -> lasterror ();
return - 1 ;
}
}
2002-04-30 12:51:35 +02:00
}