38 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security.lib.php';
39 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
40 require_once DOL_DOCUMENT_ROOT.
'/user/class/usergroup.class.php';
41 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonpeople.class.php';
54 public $element =
'user';
59 public $table_element =
'user';
64 public $fk_element =
'fk_user';
70 public $ismultientitymanaged = 1;
75 public $isextrafieldmanaged = 1;
80 public $picto =
'user';
87 public $civility_code;
109 public $personal_email;
114 public $socialnetworks;
147 public $office_phone;
162 public $personal_mobile;
192 public $pass_indatabase;
197 public $pass_indatabase_crypted;
241 public $fk_user_expense_validator;
246 public $fk_user_holiday_validator;
256 public $clicktodial_login;
261 public $clicktodial_password;
266 public $clicktodial_poste;
271 public $clicktodial_loaded;
274 public $datelastlogin;
275 public $datepreviouslogin;
276 public $flagdelsessionsbefore;
278 public $ippreviouslogin;
279 public $datestartvalidity;
280 public $dateendvalidity;
296 public $all_permissions_are_loaded;
306 public $user_group_list;
311 private $_tab_loaded = array();
318 public $default_values;
320 public $lastsearch_values_tmp;
321 public $lastsearch_values;
323 public $users = array();
325 private $cache_childids;
327 public $accountancy_code;
341 public $dateemployment;
342 public $dateemploymentend;
344 public $default_c_exp_tax_cat;
349 public $ref_employee;
354 public $national_registration_number;
356 public $default_range;
361 public $fk_warehouse;
364 public $fields = array(
365 'rowid'=>array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>1,
'visible'=>-2,
'notnull'=>1,
'index'=>1,
'position'=>1,
'comment'=>
'Id'),
366 'lastname'=>array(
'type'=>
'varchar(50)',
'label'=>
'LastName',
'enabled'=>1,
'visible'=>1,
'notnull'=>1,
'showoncombobox'=>1,
'index'=>1,
'position'=>20,
'searchall'=>1),
367 'firstname'=>array(
'type'=>
'varchar(50)',
'label'=>
'FirstName',
'enabled'=>1,
'visible'=>1,
'notnull'=>1,
'showoncombobox'=>1,
'index'=>1,
'position'=>10,
'searchall'=>1),
368 'ref_employee'=>array(
'type'=>
'varchar(50)',
'label'=>
'RefEmployee',
'enabled'=>1,
'visible'=>1,
'notnull'=>1,
'showoncombobox'=>1,
'index'=>1,
'position'=>30,
'searchall'=>1),
369 'national_registration_number'=>array(
'type'=>
'varchar(50)',
'label'=>
'NationalRegistrationNumber',
'enabled'=>1,
'visible'=>1,
'notnull'=>1,
'showoncombobox'=>1,
'index'=>1,
'position'=>40,
'searchall'=>1)
373 const STATUS_DISABLED = 0;
374 const STATUS_ENABLED = 1;
388 $this->liste_limit = 0;
389 $this->clicktodial_loaded = 0;
392 $this->all_permissions_are_loaded = 0;
393 $this->nb_rights = 0;
399 $this->
conf =
new stdClass();
400 $this->rights =
new stdClass();
401 $this->rights->user =
new stdClass();
402 $this->rights->user->user =
new stdClass();
403 $this->rights->user->self =
new stdClass();
404 $this->rights->user->user_advance =
new stdClass();
405 $this->rights->user->self_advance =
new stdClass();
406 $this->rights->user->group_advance =
new stdClass();
422 public function fetch($id =
'', $login =
'', $sid =
'', $loadpersonalconf = 0, $entity = -1, $email =
'', $fk_socpeople = 0)
427 $login = trim($login);
430 $sql =
"SELECT u.rowid, u.lastname, u.firstname, u.employee, u.gender, u.civility as civility_code, u.birth, u.email, u.personal_email, u.job,";
431 $sql .=
" u.socialnetworks,";
432 $sql .=
" u.signature, u.office_phone, u.office_fax, u.user_mobile, u.personal_mobile,";
433 $sql .=
" u.address, u.zip, u.town, u.fk_state as state_id, u.fk_country as country_id,";
434 $sql .=
" u.admin, u.login, u.note_private, u.note_public,";
435 $sql .=
" u.pass, u.pass_crypted, u.pass_temp, u.api_key,";
436 $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,";
437 $sql .=
" u.statut as status, u.lang, u.entity,";
438 $sql .=
" u.datec as datec,";
439 $sql .=
" u.tms as datem,";
440 $sql .=
" u.datelastlogin as datel,";
441 $sql .=
" u.datepreviouslogin as datep,";
442 $sql .=
" u.flagdelsessionsbefore,";
443 $sql .=
" u.iplastlogin,";
444 $sql .=
" u.ippreviouslogin,";
445 $sql .=
" u.datelastpassvalidation,";
446 $sql .=
" u.datestartvalidity,";
447 $sql .=
" u.dateendvalidity,";
448 $sql .=
" u.photo as photo,";
449 $sql .=
" u.openid as openid,";
450 $sql .=
" u.accountancy_code,";
453 $sql .=
" u.salary,";
454 $sql .=
" u.salaryextra,";
455 $sql .=
" u.weeklyhours,";
457 $sql .=
" u.dateemployment, u.dateemploymentend,";
458 $sql .=
" u.fk_warehouse,";
459 $sql .=
" u.ref_ext,";
460 $sql .=
" u.default_range, u.default_c_exp_tax_cat,";
461 $sql .=
" u.national_registration_number,";
462 $sql .=
" u.ref_employee,";
463 $sql .=
" c.code as country_code, c.label as country,";
464 $sql .=
" d.code_departement as state_code, d.nom as state";
465 $sql .=
" FROM ".$this->db->prefix().
"user as u";
466 $sql .=
" LEFT JOIN ".$this->db->prefix().
"c_country as c ON u.fk_country = c.rowid";
467 $sql .=
" LEFT JOIN ".$this->db->prefix().
"c_departements as d ON u.fk_state = d.rowid";
470 if ((!
isModEnabled(
'multicompany') || empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) && (!empty($user->entity))) {
471 $sql .=
" WHERE u.entity IN (0, ".((int) $conf->entity).
")";
473 $sql .=
" WHERE u.entity IS NOT NULL";
477 if (
isModEnabled(
'multicompany') && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
478 $sql .=
" WHERE u.entity IS NOT NULL";
480 $sql .=
" WHERE u.entity IN (0, ".((int) (($entity !=
'' && $entity >= 0) ? $entity : $conf->entity)).
")";
486 $sql .=
" AND (u.ldap_sid = '".$this->db->escape($sid).
"' OR u.login = '".$this->db->escape($login).
"')";
488 $sql .=
" AND u.login = '".$this->db->escape($login).
"'";
490 $sql .=
" AND u.email = '".$this->db->escape($email).
"'";
491 } elseif ($fk_socpeople > 0) {
492 $sql .=
" AND u.fk_socpeople = ".((int) $fk_socpeople);
494 $sql .=
" AND u.rowid = ".((int) $id);
496 $sql .=
" ORDER BY u.entity ASC";
500 $sql .=
' '.$this->db->plimit(1);
503 $result = $this->db->query(
$sql);
505 $obj = $this->db->fetch_object($result);
507 $this->
id = $obj->rowid;
508 $this->
ref = $obj->rowid;
510 $this->ref_ext = $obj->ref_ext;
512 $this->ldap_sid = $obj->ldap_sid;
513 $this->civility_code = $obj->civility_code;
514 $this->lastname = $obj->lastname;
515 $this->firstname = $obj->firstname;
516 $this->ref_employee = $obj->ref_employee;
517 $this->national_registration_number = $obj->national_registration_number;
519 $this->employee = $obj->employee;
521 $this->login = $obj->login;
522 $this->gender = $obj->gender;
523 $this->birth = $this->db->jdate($obj->birth);
524 $this->pass_indatabase = $obj->pass;
525 $this->pass_indatabase_crypted = $obj->pass_crypted;
526 $this->pass = $obj->pass;
527 $this->pass_temp = $obj->pass_temp;
530 $this->address = $obj->address;
531 $this->zip = $obj->zip;
532 $this->town = $obj->town;
534 $this->country_id = $obj->country_id;
535 $this->country_code = $obj->country_id ? $obj->country_code :
'';
538 $this->state_id = $obj->state_id;
539 $this->state_code = $obj->state_code;
540 $this->state = ($obj->state !=
'-' ? $obj->state :
'');
542 $this->office_phone = $obj->office_phone;
543 $this->office_fax = $obj->office_fax;
544 $this->user_mobile = $obj->user_mobile;
545 $this->personal_mobile = $obj->personal_mobile;
546 $this->email = $obj->email;
547 $this->personal_email = $obj->personal_email;
548 $this->socialnetworks = ($obj->socialnetworks ? (array) json_decode($obj->socialnetworks,
true) : array());
549 $this->job = $obj->job;
550 $this->signature = $obj->signature;
551 $this->admin = $obj->admin;
552 $this->note_public = $obj->note_public;
553 $this->note_private = $obj->note_private;
554 $this->note = $obj->note_private;
556 $this->statut = $obj->status;
557 $this->status = $obj->status;
559 $this->photo = $obj->photo;
560 $this->openid = $obj->openid;
561 $this->lang = $obj->lang;
562 $this->entity = $obj->entity;
563 $this->accountancy_code = $obj->accountancy_code;
564 $this->thm = $obj->thm;
565 $this->tjm = $obj->tjm;
566 $this->salary = $obj->salary;
567 $this->salaryextra = $obj->salaryextra;
568 $this->weeklyhours = $obj->weeklyhours;
569 $this->color = $obj->color;
570 $this->dateemployment = $this->db->jdate($obj->dateemployment);
571 $this->dateemploymentend = $this->db->jdate($obj->dateemploymentend);
573 $this->datec = $this->db->jdate($obj->datec);
574 $this->datem = $this->db->jdate($obj->datem);
575 $this->datelastlogin = $this->db->jdate($obj->datel);
576 $this->datepreviouslogin = $this->db->jdate($obj->datep);
577 $this->flagdelsessionsbefore = $this->db->jdate($obj->flagdelsessionsbefore,
'gmt');
578 $this->iplastlogin = $obj->iplastlogin;
579 $this->ippreviouslogin = $obj->ippreviouslogin;
580 $this->datestartvalidity = $this->db->jdate($obj->datestartvalidity);
581 $this->dateendvalidity = $this->db->jdate($obj->dateendvalidity);
583 $this->socid = $obj->fk_soc;
584 $this->contact_id = $obj->fk_socpeople;
585 $this->fk_member = $obj->fk_member;
586 $this->fk_user = $obj->fk_user;
587 $this->fk_user_expense_validator = $obj->fk_user_expense_validator;
588 $this->fk_user_holiday_validator = $obj->fk_user_holiday_validator;
590 $this->default_range = $obj->default_range;
591 $this->default_c_exp_tax_cat = $obj->default_c_exp_tax_cat;
592 $this->fk_warehouse = $obj->fk_warehouse;
596 if (!
isModEnabled(
'multicompany') && $this->admin && $this->entity == 1) {
604 $this->db->free($result);
606 $this->
error =
"USERNOTFOUND";
607 dol_syslog(get_class($this).
"::fetch user not found", LOG_DEBUG);
609 $this->db->free($result);
613 $this->
error = $this->db->lasterror();
618 if ($loadpersonalconf) {
620 $sql =
"SELECT param, value FROM ".$this->db->prefix().
"user_param";
621 $sql .=
" WHERE fk_user = ".((int) $this->
id);
622 $sql .=
" AND entity = ".((int) $conf->entity);
624 $resql = $this->db->query(
$sql);
626 $num = $this->db->num_rows($resql);
629 $obj = $this->db->fetch_object($resql);
630 $p = (!empty($obj->param) ? $obj->param :
'');
632 $this->
conf->$p = $obj->value;
636 $this->db->free($resql);
638 $this->
error = $this->db->lasterror();
645 $this->
error = $this->db->lasterror();
661 if (!empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) {
663 require_once DOL_DOCUMENT_ROOT.
'/core/class/defaultvalues.class.php';
666 $result = $defaultValues->fetchAll(
'',
'', 0, 0, array(
't.user_id'=>array(0, $this->
id),
'entity'=>array((isset($this->entity) ? $this->entity : $conf->entity), $conf->entity)));
668 if (!is_array($result) && $result < 0) {
672 } elseif (count($result) > 0) {
673 foreach ($result as $defval) {
674 if (!empty($defval->page) && !empty($defval->type) && !empty($defval->param)) {
675 $pagewithoutquerystring = $defval->page;
678 if (preg_match(
'/^([^\?]+)\?(.*)$/', $pagewithoutquerystring, $reg)) {
679 $pagewithoutquerystring = $reg[1];
680 $pagequeries = $reg[2];
682 $this->default_values[$pagewithoutquerystring][$defval->type][$pagequeries ? $pagequeries :
'_noquery_'][$defval->param] = $defval->value;
686 if (!empty($this->default_values)) {
687 foreach ($this->default_values as $a => $b) {
688 foreach ($b as $c => $d) {
689 krsort($this->default_values[$a][$c]);
708 public function hasRight($module, $permlevel1, $permlevel2 =
'')
712 $moduletomoduletouse = array(
713 'compta' =>
'comptabilite',
714 'contract' =>
'contrat',
715 'member' =>
'adherent',
717 'order' =>
'commande',
718 'produit' =>
'product',
719 'project' =>
'projet',
720 'propale' =>
'propal',
721 'shipping' =>
'expedition',
722 'task' =>
'task@projet',
723 'fichinter' =>
'ficheinter',
724 'inventory' =>
'stock',
725 'invoice' =>
'facture',
726 'invoice_supplier' =>
'fournisseur',
727 'order_supplier' =>
'fournisseur',
728 'knowledgerecord' =>
'knowledgerecord@knowledgemanagement',
729 'skill@hrm' =>
'all@hrm',
730 'job@hrm' =>
'all@hrm',
731 'position@hrm' =>
'all@hrm',
732 'facturerec' =>
'facture',
733 'margins' =>
'margin',
736 if (!empty($moduletomoduletouse[$module])) {
737 $module = $moduletomoduletouse[$module];
740 $moduleRightsMapping = array(
741 'product' =>
'produit',
742 'margin' =>
'margins',
743 'comptabilite' =>
'compta'
746 $rightsPath = $module;
747 if (!empty($moduleRightsMapping[$rightsPath])) {
748 $rightsPath = $moduleRightsMapping[$rightsPath];
752 $tmp = explode(
'@', $rightsPath, 2);
753 if (!empty($tmp[1])) {
754 if (strpos($module,
'@') !==
false) {
757 $rightsPath = $tmp[1];
758 $permlevel2 = $permlevel1;
759 $permlevel1 = $tmp[0];
774 if ($permlevel1 ==
'propale') {
775 $permlevel1 =
'propal';
777 if ($permlevel1 ==
'member') {
778 $permlevel1 =
'adherent';
780 if ($permlevel1 ==
'recruitmentcandidature') {
781 $permlevel1 =
'recruitmentjobposition';
786 if (empty($rightsPath) || empty($this->rights) || empty($this->rights->$rightsPath) || empty($permlevel1)) {
791 if (!empty($this->rights->$rightsPath->$permlevel1)) {
792 if (!empty($this->rights->$rightsPath->$permlevel1->$permlevel2)) {
793 return $this->rights->$rightsPath->$permlevel1->$permlevel2;
797 if ($permlevel2 ==
'read' && !empty($this->rights->$rightsPath->$permlevel1->lire)) {
798 return $this->rights->$rightsPath->$permlevel1->lire;
800 if ($permlevel2 ==
'write' && !empty($this->rights->$rightsPath->$permlevel1->creer)) {
801 return $this->rights->$rightsPath->$permlevel1->creer;
803 if ($permlevel2 ==
'write' && !empty($this->rights->$rightsPath->$permlevel1->create)) {
804 return $this->rights->$rightsPath->$permlevel1->create;
806 if ($permlevel2 ==
'delete' && !empty($this->rights->$rightsPath->$permlevel1->supprimer)) {
807 return $this->rights->$rightsPath->$permlevel1->supprimer;
811 if (!empty($this->rights->$rightsPath->$permlevel1)) {
812 return $this->rights->$rightsPath->$permlevel1;
816 if ($permlevel1 ==
'read' && !empty($this->rights->$rightsPath->lire)) {
817 return $this->rights->$rightsPath->lire;
819 if ($permlevel1 ==
'write' && !empty($this->rights->$rightsPath->creer)) {
820 return $this->rights->$rightsPath->creer;
822 if ($permlevel1 ==
'write' && !empty($this->rights->$rightsPath->create)) {
823 return $this->rights->$rightsPath->create;
825 if ($permlevel1 ==
'delete' && !empty($this->rights->$rightsPath->supprimer)) {
826 return $this->rights->$rightsPath->supprimer;
844 public function addrights($rid, $allmodule =
'', $allperms =
'', $entity = 0, $notrigger = 0)
846 global $conf, $user, $langs;
848 $entity = (empty($entity) ? $conf->entity : $entity);
850 dol_syslog(get_class($this).
"::addrights $rid, $allmodule, $allperms, $entity, $notrigger for user id=".$this->
id);
852 if (empty($this->
id)) {
854 $this->
error =
'Try to call addrights on an object user with an empty id';
864 $module = $perms = $subperms =
'';
867 $sql =
"SELECT module, perms, subperms";
868 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
869 $sql .=
" WHERE id = ".((int) $rid);
870 $sql .=
" AND entity = ".((int) $entity);
872 $result = $this->db->query(
$sql);
874 $obj = $this->db->fetch_object($result);
877 $module = $obj->module;
878 $perms = $obj->perms;
879 $subperms = $obj->subperms;
887 $whereforadd =
"id=".((int) $rid);
889 if (!empty($subperms)) {
890 $whereforadd .=
" OR (module='".$this->db->escape($module).
"' AND perms='".$this->db->escape($perms).
"' AND (subperms='lire' OR subperms='read'))";
891 } elseif (!empty($perms)) {
892 $whereforadd .=
" OR (module='".$this->db->escape($module).
"' AND (perms='lire' OR perms='read') AND subperms IS NULL)";
898 if (!empty($allmodule)) {
899 if ($allmodule ==
'allmodules') {
900 $whereforadd =
'allmodules';
902 $whereforadd =
"module='".$this->db->escape($allmodule).
"'";
903 if (!empty($allperms)) {
904 $whereforadd .=
" AND perms='".$this->db->escape($allperms).
"'";
912 if (!empty($whereforadd)) {
915 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
916 $sql .=
" WHERE entity = ".((int) $entity);
917 if (!empty($whereforadd) && $whereforadd !=
'allmodules') {
918 $sql .=
" AND (".$whereforadd.
")";
921 $sqldelete =
"DELETE FROM ".$this->db->prefix().
"user_rights";
922 $sqldelete .=
" WHERE fk_user = ".((int) $this->
id).
" AND fk_id IN (";
924 $sqldelete .=
") AND entity = ".((int) $entity);
925 if (!$this->db->query($sqldelete)) {
930 $resql = $this->db->query(
$sql);
932 $num = $this->db->num_rows($resql);
935 $obj = $this->db->fetch_object($resql);
940 $sql =
"INSERT INTO ".$this->db->prefix().
"user_rights (entity, fk_user, fk_id) VALUES (".((int) $entity).
", ".((int) $this->
id).
", ".((int) $nid).
")";
941 if (!$this->db->query(
$sql)) {
955 if (!$error && !$notrigger) {
956 $langs->load(
"other");
957 $this->context = array(
'audit'=>$langs->trans(
"PermissionsAdd").($rid ?
' (id='.$rid.
')' :
''));
968 $this->db->rollback();
988 public function delrights($rid, $allmodule =
'', $allperms =
'', $entity = 0, $notrigger = 0)
990 global $conf, $user, $langs;
994 $entity = (!empty($entity) ? $entity : $conf->entity);
999 $module = $perms = $subperms =
'';
1003 $sql =
"SELECT module, perms, subperms";
1004 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
1005 $sql .=
" WHERE id = '".$this->db->escape($rid).
"'";
1006 $sql .=
" AND entity = ".((int) $entity);
1008 $result = $this->db->query(
$sql);
1010 $obj = $this->db->fetch_object($result);
1013 $module = $obj->module;
1014 $perms = $obj->perms;
1015 $subperms = $obj->subperms;
1023 $wherefordel =
"id=".((int) $rid);
1025 if ($subperms ==
'lire' || $subperms ==
'read') {
1026 $wherefordel .=
" OR (module='".$this->db->escape($module).
"' AND perms='".$this->db->escape($perms).
"' AND subperms IS NOT NULL)";
1028 if ($perms ==
'lire' || $perms ==
'read') {
1029 $wherefordel .=
" OR (module='".$this->db->escape($module).
"')";
1034 if (!empty($allmodule)) {
1035 if ($allmodule ==
'allmodules') {
1036 $wherefordel =
'allmodules';
1038 $wherefordel =
"module='".$this->db->escape($allmodule).
"'";
1039 if (!empty($allperms)) {
1040 $wherefordel .=
" AND perms='".$this->db->escape($allperms).
"'";
1047 if (!empty($wherefordel)) {
1050 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
1051 $sql .=
" WHERE entity = ".((int) $entity);
1052 if (!empty($wherefordel) && $wherefordel !=
'allmodules') {
1053 $sql .=
" AND (".$wherefordel.
")";
1057 if ($this->admin == 1) {
1058 $sql .=
" AND id NOT IN (251, 252, 253, 254, 255, 256)";
1059 $sql .=
" AND id NOT IN (341, 342, 343, 344)";
1060 $sql .=
" AND id NOT IN (351, 352, 353, 354)";
1061 $sql .=
" AND id NOT IN (358)";
1064 $sqldelete =
"DELETE FROM ".$this->db->prefix().
"user_rights";
1065 $sqldelete .=
" WHERE fk_user = ".((int) $this->
id).
" AND fk_id IN (";
1068 $sqldelete .=
" AND entity = ".((int) $entity);
1070 $resql = $this->db->query($sqldelete);
1077 if (!$error && !$notrigger) {
1078 $langs->load(
"other");
1079 $this->context = array(
'audit'=>$langs->trans(
"PermissionsDelete").($rid ?
' (id='.$rid.
')' :
''));
1090 $this->db->rollback();
1093 $this->db->commit();
1107 dol_syslog(get_class($this).
"::clearrights reset user->rights");
1108 $this->rights =
null;
1109 $this->nb_rights = 0;
1110 $this->all_permissions_are_loaded = 0;
1111 $this->_tab_loaded = array();
1123 public function getrights($moduletag =
'', $forcereload = 0)
1127 if (empty($forcereload)) {
1128 if ($moduletag && isset($this->_tab_loaded[$moduletag]) && $this->_tab_loaded[$moduletag]) {
1133 if (!empty($this->all_permissions_are_loaded)) {
1140 if (!isset($this->rights) || !is_object($this->rights)) {
1141 $this->rights =
new stdClass();
1143 if (!isset($this->rights->user) || !is_object($this->rights->user)) {
1144 $this->rights->user =
new stdClass();
1150 $sql =
"SELECT DISTINCT r.module, r.perms, r.subperms";
1151 $sql .=
" FROM ".$this->db->prefix().
"user_rights as ur,";
1152 $sql .=
" ".$this->db->prefix().
"rights_def as r";
1153 $sql .=
" WHERE r.id = ur.fk_id";
1154 if (!empty($conf->global->MULTICOMPANY_BACKWARD_COMPATIBILITY)) {
1156 $sql .=
" AND r.entity IN (0,".(isModEnabled(
'multicompany') && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE) ?
"1," :
"").$conf->entity.
")";
1160 $sql .=
" AND r.entity = ".((int) $conf->entity).
" AND ur.entity = ".((int) $conf->entity);
1162 $sql .=
" AND ur.fk_user= ".((int) $this->
id);
1163 $sql .=
" AND r.perms IS NOT NULL";
1165 $sql .=
" AND r.module = '".$this->db->escape($moduletag).
"'";
1168 $resql = $this->db->query(
$sql);
1170 $num = $this->db->num_rows($resql);
1173 $obj = $this->db->fetch_object($resql);
1176 $module = $obj->module;
1177 $perms = $obj->perms;
1178 $subperms = $obj->subperms;
1180 if (!empty($perms)) {
1181 if (!empty($module)) {
1182 if (!isset($this->rights->$module) || !is_object($this->rights->$module)) {
1183 $this->rights->$module =
new stdClass();
1185 if (!empty($subperms)) {
1186 if (!isset($this->rights->$module->$perms) || !is_object($this->rights->$module->$perms)) {
1187 $this->rights->$module->$perms =
new stdClass();
1189 if (empty($this->rights->$module->$perms->$subperms)) {
1192 $this->rights->$module->$perms->$subperms = 1;
1194 if (empty($this->rights->$module->$perms)) {
1197 $this->rights->$module->$perms = 1;
1204 $this->db->free($resql);
1208 $sql =
"SELECT DISTINCT r.module, r.perms, r.subperms";
1209 $sql .=
" FROM ".$this->db->prefix().
"usergroup_rights as gr,";
1210 $sql .=
" ".$this->db->prefix().
"usergroup_user as gu,";
1211 $sql .=
" ".$this->db->prefix().
"rights_def as r";
1212 $sql .=
" WHERE r.id = gr.fk_id";
1214 if (!empty($conf->global->MULTICOMPANY_BACKWARD_COMPATIBILITY)) {
1215 if (
isModEnabled(
'multicompany') && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1216 $sql .=
" AND gu.entity IN (0,".$conf->entity.
")";
1218 $sql .=
" AND r.entity = ".((int) $conf->entity);
1221 $sql .=
" AND gr.entity = ".((int) $conf->entity);
1225 $sql .=
" AND gu.entity IN (0,".$conf->entity.
")";
1226 $sql .=
" AND r.entity = ".((int) $conf->entity);
1229 $sql .=
" AND gr.fk_usergroup = gu.fk_usergroup";
1230 $sql .=
" AND gu.fk_user = ".((int) $this->
id);
1231 $sql .=
" AND r.perms IS NOT NULL";
1233 $sql .=
" AND r.module = '".$this->db->escape($moduletag).
"'";
1236 $resql = $this->db->query(
$sql);
1238 $num = $this->db->num_rows($resql);
1241 $obj = $this->db->fetch_object($resql);
1244 $module = $obj->module;
1245 $perms = $obj->perms;
1246 $subperms = $obj->subperms;
1248 if (!empty($perms)) {
1249 if (!empty($module)) {
1250 if (!isset($this->rights->$module) || !is_object($this->rights->$module)) {
1251 $this->rights->$module =
new stdClass();
1253 if (!empty($subperms)) {
1254 if (!isset($this->rights->$module->$perms) || !is_object($this->rights->$module->$perms)) {
1255 $this->rights->$module->$perms =
new stdClass();
1257 if (empty($this->rights->$module->$perms->$subperms)) {
1260 $this->rights->$module->$perms->$subperms = 1;
1262 if (empty($this->rights->$module->$perms)) {
1266 if (!isset($this->rights->$module->$perms) || !is_object($this->rights->$module->$perms)) {
1267 $this->rights->$module->$perms = 1;
1275 $this->db->free($resql);
1279 if (!empty($this->admin)) {
1280 if (empty($this->rights->user->user)) {
1281 $this->rights->user->user =
new stdClass();
1283 $listofpermtotest = array(
'lire',
'creer',
'password',
'supprimer',
'export');
1284 foreach ($listofpermtotest as $permtotest) {
1285 if (empty($this->rights->user->user->$permtotest)) {
1286 $this->rights->user->user->$permtotest = 1;
1290 if (empty($this->rights->user->self)) {
1291 $this->rights->user->self =
new stdClass();
1293 $listofpermtotest = array(
'creer',
'password');
1294 foreach ($listofpermtotest as $permtotest) {
1295 if (empty($this->rights->user->self->$permtotest)) {
1296 $this->rights->user->self->$permtotest = 1;
1301 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
1302 if (empty($this->rights->user->user_advance)) {
1303 $this->rights->user->user_advance =
new stdClass();
1305 $listofpermtotest = array(
'readperms',
'write');
1306 foreach ($listofpermtotest as $permtotest) {
1307 if (empty($this->rights->user->user_advance->$permtotest)) {
1308 $this->rights->user->user_advance->$permtotest = 1;
1312 if (empty($this->rights->user->self_advance)) {
1313 $this->rights->user->self_advance =
new stdClass();
1315 $listofpermtotest = array(
'readperms',
'writeperms');
1316 foreach ($listofpermtotest as $permtotest) {
1317 if (empty($this->rights->user->self_advance->$permtotest)) {
1318 $this->rights->user->self_advance->$permtotest = 1;
1322 if (empty($this->rights->user->group_advance)) {
1323 $this->rights->user->group_advance =
new stdClass();
1325 $listofpermtotest = array(
'read',
'readperms',
'write',
'delete');
1326 foreach ($listofpermtotest as $permtotest) {
1327 if (empty($this->rights->user) || empty($this->rights->user->group_advance->$permtotest)) {
1328 $this->rights->user->group_advance->$permtotest = 1;
1336 if (isset($this->rights->propale) && !isset($this->rights->propal)) {
1337 $this->rights->propal = $this->rights->propale;
1339 if (isset($this->rights->propal) && !isset($this->rights->propale)) {
1340 $this->rights->propale = $this->rights->propal;
1346 $this->all_permissions_are_loaded = 1;
1349 $this->_tab_loaded[$moduletag] = 1;
1361 global $conf, $langs, $user;
1366 if (isset($this->statut)) {
1367 if ($this->statut == $status) {
1370 } elseif (isset($this->status) && $this->status == $status) {
1377 $sql =
"UPDATE ".$this->db->prefix().
"user";
1378 $sql .=
" SET statut = ".((int) $status);
1379 $sql .=
" WHERE rowid = ".((int) $this->
id);
1380 $result = $this->db->query(
$sql);
1382 dol_syslog(get_class($this).
"::setstatus", LOG_DEBUG);
1385 $result = $this->
call_trigger(
'USER_ENABLEDISABLE', $user);
1393 $this->db->rollback();
1396 $this->status = $status;
1397 $this->statut = $status;
1398 $this->db->commit();
1415 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
1416 return parent::setCategoriesCommon($categories, Categorie::TYPE_USER);
1427 global $conf, $langs;
1433 $this->
fetch($this->
id);
1435 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1438 $sql =
"DELETE FROM ".$this->db->prefix().
"user_rights WHERE fk_user = ".((int) $this->
id);
1440 if (!$error && !$this->db->query(
$sql)) {
1442 $this->
error = $this->db->lasterror();
1446 $sql =
"DELETE FROM ".$this->db->prefix().
"usergroup_user WHERE fk_user = ".((int) $this->
id);
1447 if (!$error && !$this->db->query(
$sql)) {
1449 $this->
error = $this->db->lasterror();
1453 $sql =
"DELETE FROM ".$this->db->prefix().
"user_param WHERE fk_user = ".((int) $this->
id);
1454 if (!$error && !$this->db->query(
$sql)) {
1456 $this->
error = $this->db->lasterror();
1460 if ($this->contact_id > 0) {
1461 $sql =
"UPDATE ".$this->db->prefix().
"socpeople SET fk_user_creat = null WHERE rowid = ".((int) $this->contact_id);
1462 if (!$error && !$this->db->query(
$sql)) {
1464 $this->
error = $this->db->lasterror();
1473 dol_syslog(get_class($this).
"::delete error -4 ".$this->
error, LOG_ERR);
1479 $sql =
"DELETE FROM ".$this->db->prefix().
"user WHERE rowid = ".((int) $this->
id);
1480 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1481 if (!$this->db->query(
$sql)) {
1483 $this->
error = $this->db->lasterror();
1492 $this->db->rollback();
1497 $this->db->commit();
1500 $this->db->rollback();
1512 public function create($user, $notrigger = 0)
1514 global $conf, $langs;
1518 $this->setUpperOrLowerCase();
1520 $this->civility_code = trim((
string) $this->civility_code);
1521 $this->login = trim((
string) $this->login);
1522 if (!isset($this->entity)) {
1523 $this->entity = $conf->entity;
1526 dol_syslog(get_class($this).
"::create login=".$this->login.
", user=".(is_object($user) ? $user->id :
''), LOG_DEBUG);
1528 $badCharUnauthorizedIntoLoginName =
getDolGlobalString(
'MAIN_LOGIN_BADCHARUNAUTHORIZED',
',@<>"\'');
1531 if (!empty($conf->global->USER_MAIL_REQUIRED) && !isValidEMail($this->email)) {
1532 $langs->load(
"errors");
1533 $this->
error = $langs->trans(
"ErrorBadEMail", $this->email);
1536 if (empty($this->login)) {
1537 $langs->load(
"errors");
1538 $this->
error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Login"));
1540 } elseif (preg_match(
'/['.preg_quote($badCharUnauthorizedIntoLoginName,
'/').
']/', $this->login)) {
1541 $langs->load(
"errors");
1542 $this->
error = $langs->trans(
"ErrorBadCharIntoLoginName", $langs->transnoentitiesnoconv(
"Login"));
1553 $sqltochecklogin =
"SELECT COUNT(*) as nb FROM ".$this->db->prefix().
"user WHERE entity IN (".$this->db->sanitize((
int) $this->entity).
", 0) AND login = '".$this->db->escape($this->login).
"'";
1554 $resqltochecklogin = $this->db->query($sqltochecklogin);
1555 if ($resqltochecklogin) {
1556 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
1557 if ($objtochecklogin && $objtochecklogin->nb > 0) {
1558 $langs->load(
"errors");
1559 $this->
error = $langs->trans(
"ErrorLoginAlreadyExists", $this->login);
1561 $this->db->rollback();
1564 $this->db->free($resqltochecklogin);
1567 if (!empty($this->email)) {
1568 $sqltochecklogin =
"SELECT COUNT(*) as nb FROM ".$this->db->prefix().
"user WHERE entity IN (".$this->db->sanitize((
int) $this->entity).
", 0) AND email = '".$this->db->escape($this->email).
"'";
1569 $resqltochecklogin = $this->db->query($sqltochecklogin);
1570 if ($resqltochecklogin) {
1571 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
1572 if ($objtochecklogin && $objtochecklogin->nb > 0) {
1573 $langs->load(
"errors");
1574 $this->
error = $langs->trans(
"ErrorEmailAlreadyExists", $this->email);
1576 $this->db->rollback();
1579 $this->db->free($resqltochecklogin);
1584 $sql =
"INSERT INTO ".$this->db->prefix().
"user (datec, login, ldap_sid, entity)";
1585 $sql .=
" VALUES('".$this->db->idate($this->datec).
"', '".$this->db->escape($this->login).
"', '".$this->db->escape($this->ldap_sid).
"', ".((int) $this->entity).
")";
1586 $result = $this->db->query(
$sql);
1588 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1590 $this->
id = $this->db->last_insert_id($this->db->prefix().
"user");
1594 $this->
error =
'ErrorFailedToSetDefaultRightOfUser';
1595 $this->db->rollback();
1599 if (!empty($conf->global->MAIN_DEFAULT_WAREHOUSE_USER) && !empty($conf->global->STOCK_USERSTOCK_AUTOCREATE)) {
1600 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
1601 $langs->load(
"stocks");
1602 $entrepot =
new Entrepot($this->db);
1603 $entrepot->label = $langs->trans(
"PersonalStock", $this->getFullName($langs));
1604 $entrepot->libelle = $entrepot->label;
1605 $entrepot->description = $langs->trans(
"ThisWarehouseIsPersonalStock", $this->getFullName($langs));
1606 $entrepot->statut = 1;
1607 $entrepot->country_id = $mysoc->country_id;
1608 $warehouseid = $entrepot->create($user);
1610 $this->fk_warehouse = $warehouseid;
1614 $result = $this->
update($user, 1, 1);
1616 $this->db->rollback();
1630 $this->db->commit();
1635 $this->db->rollback();
1639 $this->
error = $this->db->lasterror();
1640 $this->db->rollback();
1658 global $conf, $user, $langs;
1664 $this->civility_code = $contact->civility_code;
1665 $this->lastname = $contact->lastname;
1666 $this->firstname = $contact->firstname;
1667 $this->gender = $contact->gender;
1668 $this->email = $contact->email;
1669 $this->socialnetworks = $contact->socialnetworks;
1670 $this->office_phone = $contact->phone_pro;
1671 $this->office_fax = $contact->fax;
1672 $this->user_mobile = $contact->phone_mobile;
1673 $this->address = $contact->address;
1674 $this->zip = $contact->zip;
1675 $this->town = $contact->town;
1676 $this->setUpperOrLowerCase();
1677 $this->state_id = $contact->state_id;
1678 $this->country_id = $contact->country_id;
1679 $this->employee = 0;
1681 if (empty($login)) {
1682 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
1683 $login =
dol_buildlogin($contact->lastname, $contact->firstname);
1685 $this->login = $login;
1690 $result = $this->
create($user, 1);
1692 $sql =
"UPDATE ".$this->db->prefix().
"user";
1693 $sql .=
" SET fk_socpeople=".((int) $contact->id);
1694 $sql .=
", civility='".$this->db->escape($contact->civility_code).
"'";
1695 if ($contact->socid > 0) {
1696 $sql .=
", fk_soc=".((int) $contact->socid);
1698 $sql .=
" WHERE rowid=".((int) $this->
id);
1700 $resql = $this->db->query(
$sql);
1702 dol_syslog(get_class($this).
"::create_from_contact", LOG_DEBUG);
1704 $this->context[
'createfromcontact'] =
'createfromcontact';
1709 $error++; $this->db->rollback();
return -1;
1713 $this->db->commit();
1716 $this->
error = $this->db->error();
1718 $this->db->rollback();
1723 dol_syslog(get_class($this).
"::create_from_contact - 0");
1725 $this->db->rollback();
1742 global $conf, $user, $langs;
1746 $this->civility_code = $member->civility_id;
1747 $this->lastname = $member->lastname;
1748 $this->firstname = $member->firstname;
1749 $this->gender = $member->gender;
1750 $this->email = $member->email;
1751 $this->fk_member = $member->id;
1752 $this->address = $member->address;
1753 $this->zip = $member->zip;
1754 $this->town = $member->town;
1755 $this->setUpperOrLowerCase();
1756 $this->state_id = $member->state_id;
1757 $this->country_id = $member->country_id;
1758 $this->socialnetworks = $member->socialnetworks;
1760 $this->pass = $member->pass;
1761 $this->pass_crypted = $member->pass_indatabase_crypted;
1763 if (empty($login)) {
1764 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
1767 $this->login = $login;
1772 $result = $this->
create($user);
1774 if (!empty($this->pass)) {
1775 $newpass = $this->
setPassword($user, $this->pass);
1776 if (is_numeric($newpass) && $newpass < 0) {
1779 } elseif (!empty($this->pass_crypted)) {
1780 $sql =
"UPDATE ".$this->db->prefix().
"user";
1781 $sql .=
" SET pass_crypted = '".$this->db->escape($this->pass_crypted).
"'";
1782 $sql .=
" WHERE rowid=".((int) $this->
id);
1784 $resql = $this->db->query(
$sql);
1790 if ($result > 0 && $member->socid) {
1791 $sql =
"UPDATE ".$this->db->prefix().
"user";
1792 $sql .=
" SET fk_soc=".((int) $member->socid);
1793 $sql .=
" WHERE rowid=".((int) $this->
id);
1795 dol_syslog(get_class($this).
"::create_from_member", LOG_DEBUG);
1796 $resql = $this->db->query(
$sql);
1798 $this->db->commit();
1801 $this->
error = $this->db->lasterror();
1803 $this->db->rollback();
1810 $this->db->commit();
1814 $this->db->rollback();
1832 $sql =
"SELECT id FROM ".$this->db->prefix().
"rights_def";
1833 $sql .=
" WHERE bydefault = 1";
1834 $sql .=
" AND entity = ".((int) $conf->entity);
1836 $resql = $this->db->query(
$sql);
1838 $num = $this->db->num_rows($resql);
1841 $row = $this->db->fetch_row($resql);
1845 $this->db->free($resql);
1849 $sql =
"DELETE FROM ".$this->db->prefix().
"user_rights WHERE fk_user = $this->id AND fk_id=$rd[$i]";
1850 $result = $this->db->query(
$sql);
1852 $sql =
"INSERT INTO ".$this->db->prefix().
"user_rights (fk_user, fk_id) VALUES ($this->id, $rd[$i])";
1853 $result = $this->db->query(
$sql);
1873 public function update($user, $notrigger = 0, $nosyncmember = 0, $nosyncmemberpass = 0, $nosynccontact = 0)
1875 global $conf, $langs;
1877 $nbrowsaffected = 0;
1880 dol_syslog(get_class($this).
"::update notrigger=".$notrigger.
", nosyncmember=".$nosyncmember.
", nosyncmemberpass=".$nosyncmemberpass);
1883 $this->civility_code = trim((
string) $this->civility_code);
1884 $this->lastname = trim((
string) $this->lastname);
1885 $this->firstname = trim((
string) $this->firstname);
1886 $this->ref_employee = trim((
string) $this->ref_employee);
1887 $this->national_registration_number = trim((
string) $this->national_registration_number);
1888 $this->employee = ($this->employee > 0 ? $this->employee : 0);
1889 $this->login = trim((
string) $this->login);
1890 $this->gender = trim((
string) $this->gender);
1892 $this->pass = trim((
string) $this->pass);
1893 $this->api_key = trim((
string) $this->api_key);
1894 $this->datestartvalidity = empty($this->datestartvalidity) ?
'' : $this->datestartvalidity;
1895 $this->dateendvalidity = empty($this->dateendvalidity) ?
'' : $this->dateendvalidity;
1897 $this->address = trim((
string) $this->address);
1898 $this->zip = trim((
string) $this->zip);
1899 $this->town = trim((
string) $this->town);
1901 $this->state_id = ($this->state_id > 0 ? $this->state_id : 0);
1902 $this->country_id = ($this->country_id > 0 ? $this->country_id : 0);
1903 $this->office_phone = trim((
string) $this->office_phone);
1904 $this->office_fax = trim((
string) $this->office_fax);
1905 $this->user_mobile = trim((
string) $this->user_mobile);
1906 $this->personal_mobile = trim((
string) $this->personal_mobile);
1907 $this->email = trim((
string) $this->email);
1908 $this->personal_email = trim((
string) $this->personal_email);
1910 $this->job = trim((
string) $this->job);
1911 $this->signature = trim((
string) $this->signature);
1912 $this->note_public = trim((
string) $this->note_public);
1913 $this->note_private = trim((
string) $this->note_private);
1914 $this->openid = trim((
string) $this->openid);
1915 $this->admin = ($this->admin > 0 ? $this->admin : 0);
1917 $this->accountancy_code = trim((
string) $this->accountancy_code);
1918 $this->color = trim((
string) $this->color);
1919 $this->dateemployment = empty($this->dateemployment) ?
'' : $this->dateemployment;
1920 $this->dateemploymentend = empty($this->dateemploymentend) ?
'' : $this->dateemploymentend;
1922 $this->birth = empty($this->birth) ?
'' : $this->birth;
1923 $this->fk_warehouse = (int) $this->fk_warehouse;
1925 $this->setUpperOrLowerCase();
1928 $badCharUnauthorizedIntoLoginName =
getDolGlobalString(
'MAIN_LOGIN_BADCHARUNAUTHORIZED',
',@<>"\'');
1930 if (!empty($conf->global->USER_MAIL_REQUIRED) && !isValidEMail($this->email)) {
1931 $langs->load(
"errors");
1932 $this->
error = $langs->trans(
"ErrorBadEMail", $this->email);
1935 if (empty($this->login)) {
1936 $langs->load(
"errors");
1937 $this->
error = $langs->trans(
"ErrorFieldRequired",
'Login');
1939 } elseif (preg_match(
'/['.preg_quote($badCharUnauthorizedIntoLoginName,
'/').
']/', $this->login)) {
1940 $langs->load(
"errors");
1941 $this->
error = $langs->trans(
"ErrorBadCharIntoLoginName", $langs->transnoentitiesnoconv(
"Login"));
1948 if (!empty($this->oldcopy) && $this->oldcopy->login != $this->login) {
1949 $sqltochecklogin =
"SELECT COUNT(*) as nb FROM ".$this->db->prefix().
"user WHERE entity IN (".$this->db->sanitize((
int) $this->entity).
", 0) AND login = '".$this->db->escape($this->login).
"'";
1950 $resqltochecklogin = $this->db->query($sqltochecklogin);
1951 if ($resqltochecklogin) {
1952 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
1953 if ($objtochecklogin && $objtochecklogin->nb > 0) {
1954 $langs->load(
"errors");
1955 $this->
error = $langs->trans(
"ErrorLoginAlreadyExists", $this->login);
1957 $this->db->rollback();
1962 if (!empty($this->oldcopy) && !empty($this->email) && $this->oldcopy->email != $this->email) {
1963 $sqltochecklogin =
"SELECT COUNT(*) as nb FROM ".$this->db->prefix().
"user WHERE entity IN (".$this->db->sanitize((
int) $this->entity).
", 0) AND email = '".$this->db->escape($this->email).
"'";
1964 $resqltochecklogin = $this->db->query($sqltochecklogin);
1965 if ($resqltochecklogin) {
1966 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
1967 if ($objtochecklogin && $objtochecklogin->nb > 0) {
1968 $langs->load(
"errors");
1969 $this->
error = $langs->trans(
"ErrorEmailAlreadyExists", $this->email);
1971 $this->db->rollback();
1978 $sql =
"UPDATE ".$this->db->prefix().
"user SET";
1979 $sql .=
" civility = '".$this->db->escape($this->civility_code).
"'";
1980 $sql .=
", lastname = '".$this->db->escape($this->lastname).
"'";
1981 $sql .=
", firstname = '".$this->db->escape($this->firstname).
"'";
1982 $sql .=
", ref_employee = '".$this->db->escape($this->ref_employee).
"'";
1983 $sql .=
", national_registration_number = '".$this->db->escape($this->national_registration_number).
"'";
1984 $sql .=
", employee = ".(int) $this->employee;
1985 $sql .=
", login = '".$this->db->escape($this->login).
"'";
1986 $sql .=
", api_key = ".($this->api_key ?
"'".$this->db->escape(
dolEncrypt($this->api_key,
'',
'',
'dolibarr')).
"'" :
"null");
1987 $sql .=
", gender = ".($this->gender != -1 ?
"'".$this->db->escape($this->gender).
"'" :
"null");
1988 $sql .=
", birth=".(strval($this->birth) !=
'' ?
"'".$this->db->idate($this->birth,
'tzserver').
"'" :
'null');
1989 if (!empty($user->admin)) {
1990 $sql .=
", admin = ".(int) $this->admin;
1992 $sql .=
", address = '".$this->db->escape($this->address).
"'";
1993 $sql .=
", zip = '".$this->db->escape($this->zip).
"'";
1994 $sql .=
", town = '".$this->db->escape($this->town).
"'";
1995 $sql .=
", fk_state = ".((!empty($this->state_id) && $this->state_id > 0) ?
"'".$this->db->escape($this->state_id).
"'" :
"null");
1996 $sql .=
", fk_country = ".((!empty($this->country_id) && $this->country_id > 0) ?
"'".$this->db->escape($this->country_id).
"'" :
"null");
1997 $sql .=
", office_phone = '".$this->db->escape($this->office_phone).
"'";
1998 $sql .=
", office_fax = '".$this->db->escape($this->office_fax).
"'";
1999 $sql .=
", user_mobile = '".$this->db->escape($this->user_mobile).
"'";
2000 $sql .=
", personal_mobile = '".$this->db->escape($this->personal_mobile).
"'";
2001 $sql .=
", email = '".$this->db->escape($this->email).
"'";
2002 $sql .=
", personal_email = '".$this->db->escape($this->personal_email).
"'";
2003 $sql .=
", socialnetworks = '".$this->db->escape(json_encode($this->socialnetworks)).
"'";
2004 $sql .=
", job = '".$this->db->escape($this->job).
"'";
2005 $sql .=
", signature = '".$this->db->escape($this->signature).
"'";
2006 $sql .=
", accountancy_code = '".$this->db->escape($this->accountancy_code).
"'";
2007 $sql .=
", color = '".$this->db->escape($this->color).
"'";
2008 $sql .=
", dateemployment=".(strval($this->dateemployment) !=
'' ?
"'".$this->db->idate($this->dateemployment).
"'" :
'null');
2009 $sql .=
", dateemploymentend=".(strval($this->dateemploymentend) !=
'' ?
"'".$this->db->idate($this->dateemploymentend).
"'" :
'null');
2010 $sql .=
", datestartvalidity=".(strval($this->datestartvalidity) !=
'' ?
"'".$this->db->idate($this->datestartvalidity).
"'" :
'null');
2011 $sql .=
", dateendvalidity=".(strval($this->dateendvalidity) !=
'' ?
"'".$this->db->idate($this->dateendvalidity).
"'" :
'null');
2012 $sql .=
", note_private = '".$this->db->escape($this->note_private).
"'";
2013 $sql .=
", note_public = '".$this->db->escape($this->note_public).
"'";
2014 $sql .=
", photo = ".($this->photo ?
"'".$this->db->escape($this->photo).
"'" :
"null");
2015 $sql .=
", openid = ".($this->openid ?
"'".$this->db->escape($this->openid).
"'" :
"null");
2016 $sql .=
", fk_user = ".($this->fk_user > 0 ?
"'".$this->db->escape($this->fk_user).
"'" :
"null");
2017 $sql .=
", fk_user_expense_validator = ".($this->fk_user_expense_validator > 0 ?
"'".$this->db->escape($this->fk_user_expense_validator).
"'" :
"null");
2018 $sql .=
", fk_user_holiday_validator = ".($this->fk_user_holiday_validator > 0 ?
"'".$this->db->escape($this->fk_user_holiday_validator).
"'" :
"null");
2019 if (isset($this->thm) || $this->thm !=
'') {
2020 $sql .=
", thm= ".($this->thm !=
'' ?
"'".$this->db->escape($this->thm).
"'" :
"null");
2022 if (isset($this->tjm) || $this->tjm !=
'') {
2023 $sql .=
", tjm= ".($this->tjm !=
'' ?
"'".$this->db->escape($this->tjm).
"'" :
"null");
2025 if (isset($this->salary) || $this->salary !=
'') {
2026 $sql .=
", salary= ".($this->salary !=
'' ?
"'".$this->db->escape($this->salary).
"'" :
"null");
2028 if (isset($this->salaryextra) || $this->salaryextra !=
'') {
2029 $sql .=
", salaryextra= ".($this->salaryextra !=
'' ?
"'".$this->db->escape($this->salaryextra).
"'" :
"null");
2031 $sql .=
", weeklyhours= ".($this->weeklyhours !=
'' ?
"'".$this->db->escape($this->weeklyhours).
"'" :
"null");
2032 if (!empty($user->admin) && empty($user->entity) && $user->id != $this->id) {
2033 $sql .=
", entity = ".((int) $this->entity);
2035 $sql .=
", default_range = ".($this->default_range > 0 ? $this->default_range :
'null');
2036 $sql .=
", default_c_exp_tax_cat = ".($this->default_c_exp_tax_cat > 0 ? $this->default_c_exp_tax_cat :
'null');
2037 $sql .=
", fk_warehouse = ".($this->fk_warehouse > 0 ? $this->fk_warehouse :
"null");
2038 $sql .=
", lang = ".($this->lang ?
"'".$this->db->escape($this->lang).
"'" :
"null");
2039 $sql .=
" WHERE rowid = ".((int) $this->
id);
2041 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
2042 $resql = $this->db->query(
$sql);
2044 $nbrowsaffected += $this->db->affected_rows($resql);
2047 if (!empty($this->pass)) {
2048 if ($this->pass != $this->pass_indatabase && !
dol_verifyHash($this->pass, $this->pass_indatabase_crypted)) {
2050 $result = $this->
setPassword($user, $this->pass, 0, $notrigger, $nosyncmemberpass, 0, 1);
2051 if (is_numeric($result) && $result < 0) {
2058 if ($this->fk_member > 0) {
2059 dol_syslog(get_class($this).
"::update remove link with member. We will recreate it later", LOG_DEBUG);
2060 $sql =
"UPDATE ".$this->db->prefix().
"user SET fk_member = NULL where fk_member = ".((int) $this->fk_member);
2061 $resql = $this->db->query(
$sql);
2063 $this->
error = $this->db->error(); $this->db->rollback();
return -5;
2067 dol_syslog(get_class($this).
"::update set link with member", LOG_DEBUG);
2068 $sql =
"UPDATE ".$this->db->prefix().
"user SET fk_member =".($this->fk_member > 0 ? ((int) $this->fk_member) :
'null').
" where rowid = ".((
int) $this->id);
2069 $resql = $this->db->query(
$sql);
2071 $this->
error = $this->db->error(); $this->db->rollback();
return -5;
2074 if ($nbrowsaffected) {
2075 if ($this->fk_member > 0 && !$nosyncmember) {
2076 dol_syslog(get_class($this).
"::update user is linked with a member. We try to update member too.", LOG_DEBUG);
2078 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
2083 $result = $adh->fetch($this->fk_member);
2086 $adh->civility_code = $this->civility_code;
2087 $adh->firstname = $this->firstname;
2088 $adh->lastname = $this->lastname;
2089 $adh->login = $this->login;
2090 $adh->gender = $this->gender;
2091 $adh->birth = $this->birth;
2093 $adh->pass = $this->pass;
2095 $adh->address = $this->address;
2096 $adh->town = $this->town;
2097 $adh->zip = $this->zip;
2098 $adh->state_id = $this->state_id;
2099 $adh->country_id = $this->country_id;
2101 $adh->email = $this->email;
2103 $adh->socialnetworks = $this->socialnetworks;
2105 $adh->phone = $this->office_phone;
2106 $adh->phone_mobile = $this->user_mobile;
2108 $adh->default_lang = $this->lang;
2110 $adh->user_id = $this->id;
2111 $adh->user_login = $this->login;
2113 $result = $adh->update($user, 0, 1, 0);
2115 $this->
error = $adh->error;
2116 $this->errors = $adh->errors;
2117 dol_syslog(get_class($this).
"::update error after calling adh->update to sync it with user: ".$this->
error, LOG_ERR);
2120 } elseif ($result < 0) {
2121 $this->
error = $adh->error;
2122 $this->errors = $adh->errors;
2127 if ($this->contact_id > 0 && !$nosynccontact) {
2128 dol_syslog(get_class($this).
"::update user is linked with a contact. We try to update contact too.", LOG_DEBUG);
2130 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
2133 $tmpobj =
new Contact($this->db);
2134 $result = $tmpobj->fetch($this->contact_id);
2137 $tmpobj->civility_code = $this->civility_code;
2138 $tmpobj->firstname = $this->firstname;
2139 $tmpobj->lastname = $this->lastname;
2140 $tmpobj->login = $this->login;
2141 $tmpobj->gender = $this->gender;
2142 $tmpobj->birth = $this->birth;
2146 $tmpobj->email = $this->email;
2148 $tmpobj->socialnetworks = $this->socialnetworks;
2150 $tmpobj->phone_pro = $this->office_phone;
2151 $tmpobj->phone_mobile = $this->user_mobile;
2152 $tmpobj->fax = $this->office_fax;
2154 $tmpobj->default_lang = $this->lang;
2156 $tmpobj->address = $this->address;
2157 $tmpobj->town = $this->town;
2158 $tmpobj->zip = $this->zip;
2159 $tmpobj->state_id = $this->state_id;
2160 $tmpobj->country_id = $this->country_id;
2162 $tmpobj->user_id = $this->id;
2163 $tmpobj->user_login = $this->login;
2165 $result = $tmpobj->update($tmpobj->id, $user, 0,
'update', 1);
2167 $this->
error = $tmpobj->error;
2168 $this->errors = $tmpobj->errors;
2169 dol_syslog(get_class($this).
"::update error after calling adh->update to sync it with user: ".$this->
error, LOG_ERR);
2173 $this->
error = $tmpobj->error;
2174 $this->errors = $tmpobj->errors;
2190 if (!$error && !$notrigger) {
2200 $this->db->commit();
2201 return $nbrowsaffected;
2204 $this->db->rollback();
2208 $this->
error = $this->db->lasterror();
2209 $this->db->rollback();
2228 $sql =
"UPDATE ".$this->db->prefix().
"user SET";
2229 $sql .=
" datepreviouslogin = datelastlogin,";
2230 $sql .=
" ippreviouslogin = iplastlogin,";
2231 $sql .=
" datelastlogin = '".$this->db->idate($now).
"',";
2232 $sql .=
" iplastlogin = '".$this->db->escape($userremoteip).
"',";
2233 $sql .=
" tms = tms";
2234 $sql .=
" WHERE rowid = ".((int) $this->
id);
2236 dol_syslog(get_class($this).
"::update_last_login_date user->id=".$this->
id.
" ".
$sql, LOG_DEBUG);
2237 $resql = $this->db->query(
$sql);
2239 $this->datepreviouslogin = $this->datelastlogin;
2240 $this->datelastlogin = $now;
2241 $this->ippreviouslogin = $this->iplastlogin;
2242 $this->iplastlogin = $userremoteip;
2245 $this->
error = $this->db->lasterror().
' sql='.
$sql;
2263 public function setPassword($user, $password =
'', $changelater = 0, $notrigger = 0, $nosyncmember = 0, $passwordalreadycrypted = 0, $flagdelsessionsbefore = 1)
2265 global $conf, $langs;
2266 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
2270 dol_syslog(get_class($this).
"::setPassword user=".$user->id.
" password=".preg_replace(
'/./i',
'*', $password).
" changelater=".$changelater.
" notrigger=".$notrigger.
" nosyncmember=".$nosyncmember, LOG_DEBUG);
2278 if (empty($passwordalreadycrypted)) {
2279 if (!empty($conf->global->USER_PASSWORD_GENERATED)) {
2281 $modGeneratePassClass =
'modGeneratePass'.ucfirst($conf->global->USER_PASSWORD_GENERATED);
2283 include_once DOL_DOCUMENT_ROOT.
'/core/modules/security/generate/'.$modGeneratePassClass.
'.class.php';
2284 if (class_exists($modGeneratePassClass)) {
2285 $modGeneratePass =
new $modGeneratePassClass($this->db, $conf, $langs, $user);
2288 $modGeneratePass->WithoutAmbi = 0;
2291 $testpassword = $modGeneratePass->validatePassword($password);
2292 if (!$testpassword) {
2293 $this->
error = $modGeneratePass->error;
2301 $password_crypted =
dol_hash($password);
2305 if (!$changelater) {
2306 if (!is_object($this->oldcopy)) {
2307 $this->oldcopy = clone $this;
2312 $sql =
"UPDATE ".$this->db->prefix().
"user";
2313 $sql .=
" SET pass_crypted = '".$this->db->escape($password_crypted).
"',";
2314 $sql .=
" pass_temp = null";
2315 if (!empty($flagdelsessionsbefore)) {
2316 $sql .=
", flagdelsessionsbefore = '".$this->db->idate(
dol_now() - 5,
'gmt').
"'";
2318 if (!empty($conf->global->DATABASE_PWD_ENCRYPTED)) {
2319 $sql .=
", pass = null";
2321 $sql .=
", pass = '".$this->db->escape($password).
"'";
2323 $sql .=
" WHERE rowid = ".((int) $this->
id);
2325 dol_syslog(get_class($this).
"::setPassword", LOG_DEBUG);
2326 $result = $this->db->query(
$sql);
2328 if ($this->db->affected_rows($result)) {
2329 $this->pass = $password;
2330 $this->pass_indatabase = $password;
2331 $this->pass_indatabase_crypted = $password_crypted;
2333 if ($this->fk_member && !$nosyncmember) {
2334 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
2339 $result = $adh->fetch($this->fk_member);
2342 $result = $adh->setPassword($user, $this->pass, (empty($conf->global->DATABASE_PWD_ENCRYPTED) ? 0 : 1), 1);
2343 if (is_numeric($result) && $result < 0) {
2344 $this->
error = $adh->error;
2349 $this->
error = $adh->error;
2354 dol_syslog(get_class($this).
"::setPassword notrigger=".$notrigger.
" error=".$error, LOG_DEBUG);
2356 if (!$error && !$notrigger) {
2358 $result = $this->
call_trigger(
'USER_NEW_PASSWORD', $user);
2360 $error++; $this->db->rollback();
return -1;
2365 $this->db->commit();
2368 $this->db->rollback();
2372 $this->db->rollback();
2379 $sql =
"UPDATE ".$this->db->prefix().
"user";
2380 $sql .=
" SET pass_temp = '".$this->db->escape($password).
"'";
2381 $sql .=
" WHERE rowid = ".((int) $this->
id);
2383 dol_syslog(get_class($this).
"::setPassword", LOG_DEBUG);
2384 $result = $this->db->query(
$sql);
2406 global $conf, $langs, $mysoc;
2407 global $dolibarr_main_url_root;
2409 require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
2416 $outputlangs =
new Translate(
"", $conf);
2418 if (isset($this->
conf->MAIN_LANG_DEFAULT)
2419 && $this->conf->MAIN_LANG_DEFAULT !=
'auto') {
2420 $outputlangs->getDefaultLang($this->
conf->MAIN_LANG_DEFAULT);
2423 if ($this->
conf->MAIN_LANG_DEFAULT) {
2424 $outputlangs->setDefaultLang($this->
conf->MAIN_LANG_DEFAULT);
2426 $outputlangs = $langs;
2430 $outputlangs->loadLangs(array(
"main",
"errors",
"users",
"other"));
2432 $appli = constant(
'DOL_APPLICATION_TITLE');
2433 if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
2434 $appli = $conf->global->MAIN_APPLICATION_TITLE;
2437 $subject =
'['.$mysoc->name.
'] '.$outputlangs->transnoentitiesnoconv(
"SubjectNewPassword", $appli);
2440 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
2441 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
2443 if (!$changelater) {
2444 $url = $urlwithroot.
'/';
2445 if (!empty($conf->global->URL_REDIRECTION_AFTER_CHANGEPASSWORD)) {
2446 $url = $conf->global->URL_REDIRECTION_AFTER_CHANGEPASSWORD;
2449 dol_syslog(get_class($this).
"::send_password changelater is off, url=".$url);
2451 $mesg .= $outputlangs->transnoentitiesnoconv(
"RequestToResetPasswordReceived").
".\n";
2452 $mesg .= $outputlangs->transnoentitiesnoconv(
"NewKeyIs").
" :\n\n";
2453 $mesg .= $outputlangs->transnoentitiesnoconv(
"Login").
" = ".$this->login.
"\n";
2454 $mesg .= $outputlangs->transnoentitiesnoconv(
"Password").
" = ".$password.
"\n\n";
2457 $mesg .= $outputlangs->transnoentitiesnoconv(
"ClickHereToGoTo", $appli).
': '.$url.
"\n\n";
2459 $mesg .= $user->getFullName($outputlangs);
2462 $url = $urlwithroot.
'/user/passwordforgotten.php?action=validatenewpassword';
2463 $url .=
'&username='.urlencode($this->login).
"&passworduidhash=".urlencode(
dol_hash($password.
'-'.$this->id.
'-'.$conf->file->instance_unique_id));
2465 $url .=
'&entity='.(!empty($this->entity) ? $this->entity : 1);
2468 dol_syslog(get_class($this).
"::send_password changelater is on, url=".$url);
2472 $mesg .= $outputlangs->transnoentitiesnoconv(
"RequestToResetPasswordReceived").
"<br>\n";
2473 $mesg .= $outputlangs->transnoentitiesnoconv(
"NewKeyWillBe").
" :<br>\n<br>\n";
2474 $mesg .=
'<strong>'.$outputlangs->transnoentitiesnoconv(
"Login").
"</strong> = ".$this->login.
"<br>\n";
2475 $mesg .=
'<strong>'.$outputlangs->transnoentitiesnoconv(
"Password").
"</strong> = ".$password.
"<br>\n<br>\n";
2477 $mesg .= $outputlangs->transnoentitiesnoconv(
"YouMustClickToChange").
" :<br>\n";
2478 $mesg .=
'<a href="'.$url.
'" rel="noopener">'.$outputlangs->transnoentitiesnoconv(
"ConfirmPasswordChange").
'</a>'.
"<br>\n<br>\n";
2479 $mesg .= $outputlangs->transnoentitiesnoconv(
"ForgetIfNothing").
"<br>\n<br>\n";
2482 $trackid =
'use'.$this->id;
2483 $sendcontext =
'password';
2488 $conf->global->MAIN_MAIL_EMAIL_FROM,
2504 if ($mailfile->sendfile()) {
2507 $langs->trans(
"errors");
2508 $this->
error = $langs->trans(
"ErrorFailedToSendPassword").
' '.$mailfile->error;
2520 return $this->error;
2533 $sql =
"SELECT url, login, pass, poste ";
2534 $sql .=
" FROM ".$this->db->prefix().
"user_clicktodial as u";
2535 $sql .=
" WHERE u.fk_user = ".((int) $this->
id);
2537 $resql = $this->db->query(
$sql);
2539 if ($this->db->num_rows($resql)) {
2540 $obj = $this->db->fetch_object($resql);
2542 $this->clicktodial_url = $obj->url;
2543 $this->clicktodial_login = $obj->login;
2544 $this->clicktodial_password = $obj->pass;
2545 $this->clicktodial_poste = $obj->poste;
2548 $this->clicktodial_loaded = 1;
2550 $this->db->free($resql);
2553 $this->
error = $this->db->error();
2569 $sql =
"DELETE FROM ".$this->db->prefix().
"user_clicktodial";
2570 $sql .=
" WHERE fk_user = ".((int) $this->
id);
2572 dol_syslog(get_class($this).
'::update_clicktodial', LOG_DEBUG);
2573 $result = $this->db->query(
$sql);
2575 $sql =
"INSERT INTO ".$this->db->prefix().
"user_clicktodial";
2576 $sql .=
" (fk_user,url,login,pass,poste)";
2577 $sql .=
" VALUES (".$this->id;
2578 $sql .=
", '".$this->db->escape($this->clicktodial_url).
"'";
2579 $sql .=
", '".$this->db->escape($this->clicktodial_login).
"'";
2580 $sql .=
", '".$this->db->escape($this->clicktodial_password).
"'";
2581 $sql .=
", '".$this->db->escape($this->clicktodial_poste).
"')";
2583 dol_syslog(get_class($this).
'::update_clicktodial', LOG_DEBUG);
2584 $result = $this->db->query(
$sql);
2586 $this->db->commit();
2589 $this->db->rollback();
2590 $this->
error = $this->db->lasterror();
2608 global $conf, $langs, $user;
2614 $sql =
"DELETE FROM ".$this->db->prefix().
"usergroup_user";
2615 $sql .=
" WHERE fk_user = ".((int) $this->
id);
2616 $sql .=
" AND fk_usergroup = ".((int) $group);
2617 $sql .=
" AND entity = ".((int) $entity);
2619 $result = $this->db->query(
$sql);
2621 $sql =
"INSERT INTO ".$this->db->prefix().
"usergroup_user (entity, fk_user, fk_usergroup)";
2622 $sql .=
" VALUES (".((int) $entity).
",".((int) $this->
id).
",".((int) $group).
")";
2624 $result = $this->db->query(
$sql);
2626 if (!$error && !$notrigger) {
2627 $this->newgroupid = $group;
2628 $this->context = array(
'audit'=>$langs->trans(
"UserSetInGroup"),
'newgroupid'=>$group);
2639 $this->db->commit();
2643 $this->db->rollback();
2647 $this->
error = $this->db->lasterror();
2648 $this->db->rollback();
2665 global $conf, $langs, $user;
2671 $sql =
"DELETE FROM ".$this->db->prefix().
"usergroup_user";
2672 $sql .=
" WHERE fk_user = ".((int) $this->
id);
2673 $sql .=
" AND fk_usergroup = ".((int) $group);
2674 if (empty($entity)) {
2675 $sql .=
" AND entity IN (0, 1)";
2677 $sql .=
" AND entity = ".((int) $entity);
2680 $result = $this->db->query(
$sql);
2682 if (!$error && !$notrigger) {
2683 $this->oldgroupid = $group;
2684 $this->context = array(
'audit'=>$langs->trans(
"UserRemovedFromGroup"),
'oldgroupid'=>$group);
2695 $this->db->commit();
2698 dol_syslog(get_class($this).
"::RemoveFromGroup ".$this->
error, LOG_ERR);
2699 $this->db->rollback();
2703 $this->
error = $this->db->lasterror();
2704 $this->db->rollback();
2718 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
2725 if ($this->datestartvalidity && $this->datestartvalidity >
dol_get_last_hour($now)) {
2747 public function getPhotoUrl($width, $height, $cssclass =
'', $imagesize =
'')
2749 $result =
'<a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$this->
id.
'">';
2750 $result .=
Form::showphoto(
'userphoto', $this, $width, $height, 0, $cssclass, $imagesize);
2765 global $conf, $langs, $menumanager;
2767 $infologin = $params[
'infologin'] ?? 0;
2768 $option = $params[
'option'] ??
'';
2771 if (!empty($this->photo)) {
2772 $photo =
'<div class="photointooltip floatright">';
2773 $photo .=
Form::showphoto(
'userphoto', $this, 0, 60, 0,
'photoref photowithmargin photologintooltip',
'small', 0, 1);
2775 $datas[
'photo'] = $photo;
2780 $datas[
'opendiv'] =
'<div class="centpercent">';
2781 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"User").
'</u> '.$this->
getLibStatut(4);
2782 $datas[
'name'] =
'<br><b>'.$langs->trans(
'Name').
':</b> '.
dol_string_nohtmltag($this->getFullName($langs,
''));
2783 if (!empty($this->login)) {
2784 $datas[
'login'] =
'<br><b>'.$langs->trans(
'Login').
':</b> '.
dol_string_nohtmltag($this->login);
2786 if (!empty($this->job)) {
2789 $datas[
'email'] =
'<br><b>'.$langs->trans(
"Email").
':</b> '.
dol_string_nohtmltag($this->email);
2790 if (!empty($this->office_phone) || !empty($this->office_fax) || !empty($this->fax)) {
2791 $phonelist = array();
2792 if ($this->office_phone) {
2793 $phonelist[] =
dol_print_phone($this->office_phone, $this->country_code, $this->
id, 0,
'',
' ',
'phone');
2795 if ($this->office_fax) {
2796 $phonelist[] =
dol_print_phone($this->office_fax, $this->country_code, $this->
id, 0,
'',
' ',
'fax');
2798 if ($this->user_mobile) {
2799 $phonelist[] =
dol_print_phone($this->user_mobile, $this->country_code, $this->
id, 0,
'',
' ',
'mobile');
2801 $datas[
'phones'] =
'<br><b>'.$langs->trans(
'Phone').
':</b> '.implode(
' ', $phonelist);
2803 if (!empty($this->admin)) {
2804 $datas[
'administrator'] =
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($this->admin);
2806 if (!empty($this->accountancy_code) || $option ==
'accountancy') {
2807 $datas[
'accountancycode'] =
'<br><b>'.$langs->trans(
"AccountancyCode").
'</b>: '.$this->accountancy_code;
2810 if (!empty($this->socid)) {
2811 $thirdpartystatic =
new Societe($this->db);
2812 $thirdpartystatic->fetch($this->socid);
2813 if (empty($hidethirdpartylogo)) {
2814 $companylink =
' '.$thirdpartystatic->getNomUrl(2, (($option ==
'nolink') ?
'nolink' :
''));
2818 $type = ($this->socid ? $langs->trans(
"ExternalUser").$company : $langs->trans(
"InternalUser"));
2819 $datas[
'type'] =
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2820 $datas[
'closediv'] =
'</div>';
2822 if ($infologin > 0) {
2823 $datas[
'newlinelogin'] =
'<br>';
2824 $datas[
'session'] =
'<br><u>'.$langs->trans(
"Session").
'</u>';
2826 if (!empty($conf->global->MAIN_MODULE_MULTICOMPANY)) {
2827 $datas[
'multicompany'] =
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (User entity '.$this->entity.
')';
2829 $datas[
'authentication'] =
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.
dol_string_nohtmltag($_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)'));
2830 $datas[
'connectedsince'] =
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($this->datelastlogin,
"dayhour",
'tzuser');
2831 $datas[
'previousconnexion'] =
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($this->datepreviouslogin,
"dayhour",
'tzuser');
2832 $datas[
'currenttheme'] =
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
dol_string_nohtmltag($conf->theme);
2833 $datas[
'currentmenumanager'] =
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.
dol_string_nohtmltag($menumanager->name);
2835 $datas[
'currentuserlang'] =
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.
dol_string_nohtmltag(($s ? $s.
' ' :
'').$langs->getDefaultLang());
2836 $datas[
'browser'] =
'<br><b>'.$langs->trans(
"Browser").
':</b> '.
dol_string_nohtmltag($conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' ('.$_SERVER[
'HTTP_USER_AGENT'].
')');
2837 $datas[
'layout'] =
'<br><b>'.$langs->trans(
"Layout").
':</b> '.
dol_string_nohtmltag($conf->browser->layout);
2838 $datas[
'screen'] =
'<br><b>'.$langs->trans(
"Screen").
':</b> '.
dol_string_nohtmltag($_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight']);
2839 if ($conf->browser->layout ==
'phone') {
2840 $datas[
'phone'] =
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2842 if (!empty($_SESSION[
"disablemodules"])) {
2843 $datas[
'disabledmodules'] =
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.
dol_string_nohtmltag(join(
', ', explode(
',', $_SESSION[
"disablemodules"])));
2865 public function getNomUrl($withpictoimg = 0, $option =
'', $infologin = 0, $notooltip = 0, $maxlen = 24, $hidethirdpartylogo = 0, $mode =
'', $morecss =
'', $save_lastsearch_value = -1)
2867 global $langs, $conf, $db, $hookmanager, $user;
2868 global $dolibarr_main_authentication, $dolibarr_main_demo;
2869 global $menumanager;
2871 if (!$user->hasRight(
'user',
'user',
'read') && $user->id != $this->id) {
2875 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && $withpictoimg) {
2882 'objecttype' => $this->element,
2883 'infologin' => $infologin,
2884 'option' => $option,
2886 $classfortooltip =
'classfortooltip';
2889 $classfortooltip =
'classforajaxtooltip';
2890 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2897 if (!empty($this->socid)) {
2898 $thirdpartystatic =
new Societe($this->db);
2899 $thirdpartystatic->fetch($this->socid);
2900 if (empty($hidethirdpartylogo)) {
2901 $companylink =
' '.$thirdpartystatic->getNomUrl(2, (($option ==
'nolink') ?
'nolink' :
''));
2905 if ($infologin < 0) {
2909 $url = DOL_URL_ROOT.
'/user/card.php?id='.$this->id;
2910 if ($option ==
'leave') {
2911 $url = DOL_URL_ROOT.
'/holiday/list.php?id='.$this->id;
2914 if ($option !=
'nolink') {
2916 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2917 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2918 $add_save_lastsearch_values = 1;
2920 if ($add_save_lastsearch_values) {
2921 $url .=
'&save_lastsearch_values=1';
2925 $linkstart =
'<a href="'.$url.
'"';
2927 if (empty($notooltip)) {
2928 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2929 $langs->load(
"users");
2930 $label = $langs->trans(
"ShowUser");
2931 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2933 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
2934 $linkclose .= $dataparams .
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
2936 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
2939 $linkstart .= $linkclose.
'>';
2943 $result .= (($option ==
'nolink') ?
'' : $linkstart);
2944 if ($withpictoimg) {
2945 $paddafterimage =
'';
2946 if (abs((
int) $withpictoimg) == 1) {
2947 $paddafterimage =
'style="margin-'.($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right').
': 3px;"';
2950 if ($withpictoimg > 0) {
2951 $picto =
'<!-- picto user --><span class="nopadding userimg'.($morecss ?
' '.$morecss :
'').
'">'.
img_object(
'',
'user', $paddafterimage.
' class="paddingright")', 0, 0, $notooltip ? 0 : 1).
'</span>';
2954 $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>';
2958 if ($withpictoimg > -2 && $withpictoimg != 2) {
2959 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2960 $result .=
'<span class="nopadding usertext'.((!isset($this->statut) || $this->statut) ?
'' :
' strikefordisabled').($morecss ?
' '.$morecss :
'').
'">';
2962 if ($mode ==
'login') {
2965 $result .=
dol_string_nohtmltag($this->getFullName($langs,
'', ($mode ==
'firstelselast' ? 3 : ($mode ==
'firstname' ? 2 : -1)), $maxlen));
2967 if (empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2968 $result .=
'</span>';
2971 $result .= (($option ==
'nolink') ?
'' : $linkend);
2974 $result .= $companylink;
2977 $hookmanager->initHooks(array(
'userdao'));
2978 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2979 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2981 $result = $hookmanager->resPrint;
2983 $result .= $hookmanager->resPrint;
2998 public function getLoginUrl($withpictoimg = 0, $option =
'', $notooltip = 0, $morecss =
'')
3000 global $langs, $user;
3004 $linkstart =
'<a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$this->
id.
'">';
3008 if ((!$user->rights->user->user->lire && $this->id != $user->id)) {
3012 if ($option ==
'xxx') {
3013 $linkstart =
'<a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$this->
id.
'">';
3017 if ($option ==
'nolink') {
3022 $result .= $linkstart;
3023 if ($withpictoimg) {
3024 $paddafterimage =
'';
3025 if (abs($withpictoimg) == 1) {
3026 $paddafterimage =
'style="margin-'.($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right').
': 3px;"';
3029 if ($withpictoimg > 0) {
3030 $picto =
'<!-- picto user --><span class="nopadding userimg'.($morecss ?
' '.$morecss :
'').
'">'.
img_object(
'',
'user', $paddafterimage.
' '.($notooltip ?
'' :
'class="paddingright classfortooltip"'), 0, 0, $notooltip ? 0 : 1).
'</span>';
3033 $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>';
3037 $result .= $this->login;
3038 $result .= $linkend;
3051 return $this->
LibStatut(isset($this->statut) ? (
int) $this->statut : (
int) $this->status, $mode);
3067 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
3070 $this->labelStatus[self::STATUS_ENABLED] = $langs->transnoentitiesnoconv(
'Enabled');
3071 $this->labelStatus[self::STATUS_DISABLED] = $langs->transnoentitiesnoconv(
'Disabled');
3072 $this->labelStatusShort[self::STATUS_ENABLED] = $langs->transnoentitiesnoconv(
'Enabled');
3073 $this->labelStatusShort[self::STATUS_DISABLED] = $langs->transnoentitiesnoconv(
'Disabled');
3076 $statusType =
'status5';
3077 if ($status == self::STATUS_ENABLED) {
3078 $statusType =
'status4';
3081 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
3094 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3096 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3097 $return .=
'<div class="info-box info-box-sm">';
3098 $return .=
'<span class="info-box-icon bg-infobox-action">';
3101 if (!empty($this->photo)) {
3103 $label .=
Form::showphoto(
'userphoto', $this, 0, 60, 0,
'photokanban photoref photowithmargin photologintooltip',
'small', 0, 1);
3112 $return .=
'</span>';
3113 $return .=
'<div class="info-box-content">';
3114 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
3115 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
3116 if (property_exists($this,
'label')) {
3117 $return .=
'<br><span class="info-box-label opacitymedium">'.$this->label.
'</span>';
3120 $return .=
'<br><span class="info-box-label opacitymedium small">'.img_picto(
'',
'email').
' '.$this->email.
'</span>';
3122 if (method_exists($this,
'getLibStatut')) {
3123 $return .=
'<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).
'</div>';
3125 $return .=
'</div>';
3126 $return .=
'</div>';
3127 $return .=
'</div>';
3150 $dn = $conf->global->LDAP_KEY_USERS.
"=".$info[$conf->global->LDAP_KEY_USERS].
",".$conf->global->LDAP_USER_DN;
3151 } elseif ($mode == 1) {
3152 $dn = $conf->global->LDAP_USER_DN;
3153 } elseif ($mode == 2) {
3154 $dn = $conf->global->LDAP_KEY_USERS.
"=".$info[$conf->global->LDAP_KEY_USERS];
3169 global $conf, $langs;
3175 $keymodified =
false;
3178 $info[
"objectclass"] = explode(
',', $conf->global->LDAP_USER_OBJECT_CLASS);
3180 $this->fullname = $this->getFullName($langs);
3184 'LDAP_FIELD_FULLNAME' =>
'fullname',
3185 'LDAP_FIELD_NAME' =>
'lastname',
3186 'LDAP_FIELD_FIRSTNAME' =>
'firstname',
3187 'LDAP_FIELD_LOGIN' =>
'login',
3188 'LDAP_FIELD_LOGIN_SAMBA'=>
'login',
3189 'LDAP_FIELD_PHONE' =>
'office_phone',
3190 'LDAP_FIELD_MOBILE' =>
'user_mobile',
3191 'LDAP_FIELD_FAX' =>
'office_fax',
3192 'LDAP_FIELD_MAIL' =>
'email',
3193 'LDAP_FIELD_SID' =>
'ldap_sid',
3197 foreach ($ldapkey as $constname => $varname) {
3198 if (!empty($this->$varname) && !empty($conf->global->$constname)) {
3199 $info[$conf->global->$constname] = $this->$varname;
3202 if (!empty($conf->global->LDAP_KEY_USERS) && $conf->global->LDAP_KEY_USERS == $conf->global->$constname) {
3203 if (!empty($this->oldcopy) && $this->$varname != $this->oldcopy->$varname) {
3204 $keymodified =
true;
3209 foreach ($socialnetworks as $key => $value) {
3210 if (!empty($this->socialnetworks[$value[
'label']]) && !empty($conf->global->{
'LDAP_FIELD_'.strtoupper($value[
'label'])})) {
3211 $info[$conf->global->{
'LDAP_FIELD_'.strtoupper($value[
'label'])}] = $this->socialnetworks[$value[
'label']];
3214 if ($this->address && !empty($conf->global->LDAP_FIELD_ADDRESS)) {
3215 $info[$conf->global->LDAP_FIELD_ADDRESS] = $this->address;
3217 if ($this->zip && !empty($conf->global->LDAP_FIELD_ZIP)) {
3218 $info[$conf->global->LDAP_FIELD_ZIP] = $this->zip;
3220 if ($this->town && !empty($conf->global->LDAP_FIELD_TOWN)) {
3221 $info[$conf->global->LDAP_FIELD_TOWN] = $this->town;
3223 if ($this->note_public && !empty($conf->global->LDAP_FIELD_DESCRIPTION)) {
3226 if ($this->socid > 0) {
3227 $soc =
new Societe($this->db);
3228 $soc->fetch($this->socid);
3230 $info[$conf->global->LDAP_FIELD_COMPANY] = $soc->name;
3231 if ($soc->client == 1) {
3232 $info[
"businessCategory"] =
"Customers";
3234 if ($soc->client == 2) {
3235 $info[
"businessCategory"] =
"Prospects";
3237 if ($soc->fournisseur == 1) {
3238 $info[
"businessCategory"] =
"Suppliers";
3243 if (!empty($this->pass)) {
3244 if (!empty($conf->global->LDAP_FIELD_PASSWORD)) {
3245 $info[$conf->global->LDAP_FIELD_PASSWORD] = $this->pass;
3247 if (!empty($conf->global->LDAP_FIELD_PASSWORD_CRYPTED)) {
3248 $info[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED] =
dol_hash($this->pass,
'openldap');
3250 } elseif ($conf->global->LDAP_SERVER_PROTOCOLVERSION !==
'3') {
3253 if (!empty($conf->global->DATABASE_PWD_ENCRYPTED)) {
3255 if (empty($conf->global->MAIN_SECURITY_HASH_ALGO)) {
3256 if ($this->pass_indatabase_crypted && !empty($conf->global->LDAP_FIELD_PASSWORD_CRYPTED)) {
3257 $info[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED] =
dolGetLdapPasswordHash($this->pass_indatabase_crypted,
'md5frommd5');
3260 } elseif (!empty($this->pass_indatabase)) {
3262 if (!empty($conf->global->LDAP_FIELD_PASSWORD)) {
3263 $info[$conf->global->LDAP_FIELD_PASSWORD] = $this->pass_indatabase;
3265 if (!empty($conf->global->LDAP_FIELD_PASSWORD_CRYPTED)) {
3266 $info[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED] =
dol_hash($this->pass_indatabase,
'openldap');
3271 if ($conf->global->LDAP_SERVER_TYPE ==
'egroupware') {
3272 $info[
"objectclass"][4] =
"phpgwContact";
3274 $info[
'uidnumber'] = $this->id;
3276 $info[
'phpgwTz'] = 0;
3277 $info[
'phpgwMailType'] =
'INTERNET';
3278 $info[
'phpgwMailHomeType'] =
'INTERNET';
3280 $info[
"phpgwContactTypeId"] =
'n';
3281 $info[
"phpgwContactCatId"] = 0;
3282 $info[
"phpgwContactAccess"] =
"public";
3285 $this->egroupware_id = 1;
3288 $info[
"phpgwContactOwner"] = $this->egroupware_id;
3291 $info[
"rfc822Mailbox"] = $this->email;
3293 if ($this->phone_mobile) {
3294 $info[
"phpgwCellTelephoneNumber"] = $this->phone_mobile;
3298 if (!empty($conf->global->LDAP_FIELD_USERID)) {
3299 $info[$conf->global->LDAP_FIELD_USERID] = $this->id;
3301 if (!empty($conf->global->LDAP_FIELD_GROUPID)) {
3303 $groupslist = $usergroup->listGroupsForUser($this->
id);
3304 $info[$conf->global->LDAP_FIELD_GROUPID] =
'65534';
3305 if (!empty($groupslist)) {
3306 foreach ($groupslist as $groupforuser) {
3307 $info[$conf->global->LDAP_FIELD_GROUPID] = $groupforuser->id;
3312 if (!empty($conf->global->LDAP_FIELD_HOMEDIRECTORY) && !empty($conf->global->LDAP_FIELD_HOMEDIRECTORYPREFIX)) {
3313 $info[$conf->global->LDAP_FIELD_HOMEDIRECTORY] =
"{$conf->global->LDAP_FIELD_HOMEDIRECTORYPREFIX}/$this->login";
3329 global $user, $langs;
3335 $this->
ref =
'SPECIMEN';
3336 $this->specimen = 1;
3338 $this->lastname =
'DOLIBARR';
3339 $this->firstname =
'SPECIMEN';
3340 $this->gender =
'man';
3341 $this->note_public =
'This is a note public';
3342 $this->note_private =
'This is a note private';
3343 $this->email =
'email@specimen.com';
3344 $this->personal_email =
'personalemail@specimen.com';
3345 $this->socialnetworks = array(
3346 'skype' =>
'skypepseudo',
3347 'twitter' =>
'twitterpseudo',
3348 'facebook' =>
'facebookpseudo',
3349 'linkedin' =>
'linkedinpseudo',
3351 $this->office_phone =
'0999999999';
3352 $this->office_fax =
'0999999998';
3353 $this->user_mobile =
'0999999997';
3354 $this->personal_mobile =
'0999999996';
3356 $this->login =
'dolibspec';
3357 $this->pass =
'dolibSpec+@123';
3360 $this->datec = $now;
3361 $this->datem = $now;
3363 $this->datelastlogin = $now;
3364 $this->iplastlogin =
'127.0.0.1';
3365 $this->datepreviouslogin = $now;
3366 $this->ippreviouslogin =
'127.0.0.1';
3382 $sql =
"SELECT u.rowid, u.login as ref, u.datec,";
3383 $sql .=
" u.tms as date_modification, u.entity";
3384 $sql .=
" FROM ".$this->db->prefix().
"user as u";
3385 $sql .=
" WHERE u.rowid = ".((int) $id);
3387 $result = $this->db->query(
$sql);
3389 if ($this->db->num_rows($result)) {
3390 $obj = $this->db->fetch_object($result);
3392 $this->
id = $obj->rowid;
3394 $this->
ref = (!$obj->ref) ? $obj->rowid : $obj->ref;
3395 $this->date_creation = $this->db->jdate($obj->datec);
3396 $this->date_modification = $this->db->jdate($obj->date_modification);
3397 $this->entity = $obj->entity;
3400 $this->db->free($result);
3414 $sql =
"SELECT count(mc.email) as nb";
3415 $sql .=
" FROM ".$this->db->prefix().
"mailing_cibles as mc";
3416 $sql .=
" WHERE mc.email = '".$this->db->escape($this->email).
"'";
3417 $sql .=
" AND mc.statut NOT IN (-1,0)";
3419 $resql = $this->db->query(
$sql);
3421 $obj = $this->db->fetch_object($resql);
3424 $this->db->free($resql);
3427 $this->error = $this->db->error();
3444 $sql =
"SELECT count(rowid) as nb";
3445 $sql .=
" FROM ".$this->db->prefix().
"user";
3446 if ($option ==
'superadmin') {
3447 $sql .=
" WHERE entity = 0";
3449 $sql .=
" WHERE entity IN (".getEntity(
'user', 0).
")";
3450 if ($limitTo ==
'active') {
3451 $sql .=
" AND statut = 1";
3455 $sql .=
" AND admin = ".(int) $admin;
3458 $resql = $this->db->query(
$sql);
3460 $obj = $this->db->fetch_object($resql);
3461 $nb = (int) $obj->nb;
3463 $this->db->free($resql);
3466 $this->error = $this->db->lasterror();
3482 global $user, $conf;
3487 $this->firstname = $ldapuser->$tmpvar;
3489 $this->lastname = $ldapuser->$tmpvar;
3491 $this->login = $ldapuser->$tmpvar;
3493 $this->pass = $ldapuser->$tmpvar;
3495 $this->pass_indatabase_crypted = $ldapuser->$tmpvar;
3498 $this->office_phone = $ldapuser->$tmpvar;
3500 $this->user_mobile = $ldapuser->$tmpvar;
3502 $this->office_fax = $ldapuser->$tmpvar;
3504 $this->email = $ldapuser->$tmpvar;
3505 foreach ($socialnetworks as $key => $value) {
3507 $this->socialnetworks[$value[
'label']] = $ldapuser->$tmpvar;
3510 $this->ldap_sid = $ldapuser->$tmpvar;
3513 $this->job = $ldapuser->$tmpvar;
3515 $this->note_public = $ldapuser->$tmpvar;
3517 $result = $this->update($user);
3519 dol_syslog(get_class($this).
"::update_ldap2dolibarr result=".$result, LOG_DEBUG);
3535 $sql =
"SELECT rowid FROM ".$this->db->prefix().
"user";
3536 $sql .=
" WHERE fk_user = ".((int) $this->
id);
3538 dol_syslog(get_class($this).
"::get_children", LOG_DEBUG);
3539 $res = $this->db->query(
$sql);
3542 while ($rec = $this->db->fetch_array($res)) {
3543 $user =
new User($this->db);
3544 $user->fetch($rec[
'rowid']);
3564 $this->parentof = array();
3567 $sql =
"SELECT fk_user as id_parent, rowid as id_son";
3568 $sql .=
" FROM ".$this->db->prefix().
"user";
3569 $sql .=
" WHERE fk_user <> 0";
3570 $sql .=
" AND entity IN (".getEntity(
'user').
")";
3572 dol_syslog(get_class($this).
"::loadParentOf", LOG_DEBUG);
3573 $resql = $this->db->query(
$sql);
3575 while ($obj = $this->db->fetch_object($resql)) {
3576 $this->parentof[$obj->id_son] = $obj->id_parent;
3602 global $conf, $user;
3603 global $hookmanager;
3606 $hookmanager->initHooks(array(
'userdao'));
3608 $this->users = array();
3611 $this->loadParentOf();
3614 $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";
3615 $sql .=
" FROM ".$this->db->prefix().
"user as u";
3617 $parameters = array();
3618 $reshook = $hookmanager->executeHooks(
'printUserListWhere', $parameters);
3620 $sql .= $hookmanager->resPrint;
3622 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
3625 $sql .=
" AND ".$filter;
3628 dol_syslog(get_class($this).
"::get_full_tree get user list", LOG_DEBUG);
3629 $resql = $this->db->query(
$sql);
3632 while ($obj = $this->db->fetch_object($resql)) {
3633 $this->users[$obj->rowid][
'rowid'] = $obj->rowid;
3634 $this->users[$obj->rowid][
'id'] = $obj->rowid;
3635 $this->users[$obj->rowid][
'fk_user'] = $obj->fk_user;
3636 $this->users[$obj->rowid][
'fk_soc'] = $obj->fk_soc;
3637 $this->users[$obj->rowid][
'firstname'] = $obj->firstname;
3638 $this->users[$obj->rowid][
'lastname'] = $obj->lastname;
3639 $this->users[$obj->rowid][
'login'] = $obj->login;
3640 $this->users[$obj->rowid][
'statut'] = $obj->statut;
3641 $this->users[$obj->rowid][
'entity'] = $obj->entity;
3642 $this->users[$obj->rowid][
'email'] = $obj->email;
3643 $this->users[$obj->rowid][
'gender'] = $obj->gender;
3644 $this->users[$obj->rowid][
'admin'] = $obj->admin;
3645 $this->users[$obj->rowid][
'photo'] = $obj->photo;
3654 dol_syslog(get_class($this).
"::get_full_tree call to build_path_from_id_user", LOG_DEBUG);
3655 foreach ($this->users as $key => $val) {
3656 $result = $this->build_path_from_id_user($key, 0);
3658 $this->error =
'ErrorLoopInHierarchy';
3664 if ($deleteafterid) {
3666 $keyfilter1 =
'^'.$deleteafterid.
'$';
3667 $keyfilter2 =
'_'.$deleteafterid.
'$';
3668 $keyfilter3 =
'^'.$deleteafterid.
'_';
3669 $keyfilter4 =
'_'.$deleteafterid.
'_';
3670 foreach ($this->users as $key => $val) {
3671 if (preg_match(
'/'.$keyfilter1.
'/', $val[
'fullpath']) || preg_match(
'/'.$keyfilter2.
'/', $val[
'fullpath'])
3672 || preg_match(
'/'.$keyfilter3.
'/', $val[
'fullpath']) || preg_match(
'/'.$keyfilter4.
'/', $val[
'fullpath'])) {
3673 unset($this->users[$key]);
3678 dol_syslog(get_class($this).
"::get_full_tree dol_sort_array", LOG_DEBUG);
3679 $this->users =
dol_sort_array($this->users,
'fullname',
'asc',
true,
false);
3683 return $this->users;
3696 $childids = array();
3698 if (isset($this->cache_childids[$this->
id])) {
3699 $childids = $this->cache_childids[$this->id];
3702 $this->get_full_tree();
3704 $idtoscan = $this->id;
3706 dol_syslog(
"Build childid for id = ".$idtoscan);
3707 foreach ($this->users as $id => $val) {
3709 if (preg_match(
'/_'.$idtoscan.
'_/', $val[
'fullpath'])) {
3710 $childids[$val[
'id']] = $val[
'id'];
3714 $this->cache_childids[$this->id] = $childids;
3716 if ($addcurrentuser) {
3717 $childids[$this->id] = $this->id;
3737 if (!empty($this->users[$id_user][
'fullpath'])) {
3739 dol_syslog(get_class($this).
"::build_path_from_id_user fullpath and fullname already defined", LOG_WARNING);
3744 $this->users[$id_user][
'fullpath'] =
'_'.$id_user;
3745 $this->users[$id_user][
'fullname'] = $this->users[$id_user][
'lastname'];
3746 $i = 0; $cursor_user = $id_user;
3748 $useridfound = array($id_user);
3749 while (!empty($this->parentof[$cursor_user]) && !empty($this->users[$this->parentof[$cursor_user]])) {
3750 if (in_array($this->parentof[$cursor_user], $useridfound)) {
3751 dol_syslog(
"The hierarchy of user has a recursive loop", LOG_WARNING);
3754 $useridfound[] = $this->parentof[$cursor_user];
3755 $this->users[$id_user][
'fullpath'] =
'_'.$this->parentof[$cursor_user].$this->users[$id_user][
'fullpath'];
3756 $this->users[$id_user][
'fullname'] = $this->users[$this->parentof[$cursor_user]][
'lastname'].
' >> '.$this->users[$id_user][
'fullname'];
3757 $i++; $cursor_user = $this->parentof[$cursor_user];
3761 $this->users[$id_user][
'level'] =
dol_strlen(preg_replace(
'/[^_]/i',
'', $this->users[$id_user][
'fullpath']));
3795 $this->nb = array();
3797 $sql =
"SELECT COUNT(DISTINCT u.rowid) as nb";
3798 $sql .=
" FROM ".$this->db->prefix().
"user as u";
3799 if (
isModEnabled(
'multicompany') && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
3800 $sql .=
", ".$this->db->prefix().
"usergroup_user as ug";
3801 $sql .=
" WHERE ug.entity IN (".getEntity(
'usergroup').
")";
3802 $sql .=
" AND ug.fk_user = u.rowid";
3804 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
3806 $sql .=
" AND u.statut > 0";
3809 $resql = $this->db->query(
$sql);
3811 while ($obj = $this->db->fetch_object($resql)) {
3812 $this->nb[
"users"] = $obj->nb;
3814 $this->db->free($resql);
3818 $this->error = $this->db->error();
3834 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3836 global $conf, $user, $langs;
3838 $langs->load(
"user");
3842 if (!empty($conf->global->USER_ADDON_PDF)) {
3843 $modele = $conf->global->USER_ADDON_PDF;
3845 $modele =
'bluesky';
3849 $modelpath =
"core/modules/user/doc/";
3851 return $this->commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
3865 $user_property =
'';
3867 if (empty($rowid)) {
3871 $sql =
"SELECT rowid, email, user_mobile, civility, lastname, firstname";
3872 $sql .=
" FROM ".$this->db->prefix().
"user";
3873 $sql .=
" WHERE rowid = ".((int) $rowid);
3875 $resql = $this->db->query(
$sql);
3877 $nump = $this->db->num_rows($resql);
3880 $obj = $this->db->fetch_object($resql);
3882 if ($mode ==
'email') {
3883 $user_property =
dolGetFirstLastname($obj->firstname, $obj->lastname).
" <".$obj->email.
">";
3884 } elseif ($mode ==
'mobile') {
3885 $user_property = $obj->user_mobile;
3888 return $user_property;
3905 global $dolibarr_main_url_root;
3908 $encodedsecurekey =
dol_hash($conf->file->instance_unique_id.
'uservirtualcard'.$this->id.
'-'.$this->login,
'md5');
3910 $entity_qr =
'&entity='.((int) $conf->entity);
3915 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
3916 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
3919 if ($typeofurl ==
'internal') {
3920 $urlwithroot = DOL_URL_ROOT;
3923 return $urlwithroot.
'/public/users/view.php?id='.$this->
id.
'&securekey='.$encodedsecurekey.$entity_qr.($mode ?
'&mode='.urlencode($mode) :
'');
3938 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter = array(), $filtermode =
'AND', $entityfilter =
false)
3940 global $conf, $user;
3942 $sql =
"SELECT t.rowid";
3943 $sql .=
' FROM '.$this->db->prefix().$this->table_element.
' as t ';
3945 if ($entityfilter) {
3946 if (!empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
3947 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
3948 $sql .=
" WHERE t.entity IS NOT NULL";
3950 $sql .=
",".$this->db->prefix().
"usergroup_user as ug";
3951 $sql .=
" WHERE ((ug.fk_user = t.rowid";
3952 $sql .=
" AND ug.entity IN (".getEntity(
'usergroup').
"))";
3953 $sql .=
" OR t.entity = 0)";
3956 $sql .=
" WHERE t.entity IN (".getEntity(
'user').
")";
3959 $sql .=
" WHERE 1 = 1";
3963 $sqlwhere = array();
3964 if (!empty($filter)) {
3965 foreach ($filter as $key => $value) {
3966 if ($key ==
't.rowid') {
3967 $sqlwhere[] = $key.
" = ".((int) $value);
3968 } elseif (isset($this->fields[$key][
'type']) && in_array($this->fields[$key][
'type'], array(
'date',
'datetime',
'timestamp'))) {
3969 $sqlwhere[] = $key.
" = '".$this->db->idate($value).
"'";
3970 } elseif ($key ==
'customsql') {
3971 $sqlwhere[] = $value;
3973 $sqlwhere[] = $key.
" LIKE '%".$this->db->escape($value).
"%'";
3977 if (count($sqlwhere) > 0) {
3978 $sql .=
' AND ('.implode(
' '.$this->db->escape($filtermode).
' ', $sqlwhere).
')';
3980 $sql .= $this->db->order($sortfield, $sortorder);
3982 $sql .= $this->db->plimit($limit + 1, $offset);
3987 $resql = $this->db->query(
$sql);
3989 $this->users = array();
3990 $num = $this->db->num_rows($resql);
3992 while ($obj = $this->db->fetch_object($resql)) {
3993 $line =
new self($this->db);
3994 $result = $line->fetch($obj->rowid);
3995 if ($result > 0 && !empty($line->id)) {
3996 $this->users[$obj->rowid] = clone $line;
3999 $this->db->free($resql);
4003 $this->errors[] = $this->db->lasterror();
4015 private $findUserIdByEmailCache;
4029 if (isset($this->findUserIdByEmailCache[$email])) {
4030 return $this->findUserIdByEmailCache[$email];
4033 $this->findUserIdByEmailCache[$email] = -1;
4037 $sql =
'SELECT rowid';
4038 $sql .=
' FROM '.$this->db->prefix().
'user';
4039 if (!empty($conf->global->AGENDA_DISABLE_EXACT_USER_EMAIL_COMPARE_FOR_EXTERNAL_CALENDAR)) {
4040 $sql .=
" WHERE email LIKE '%".$this->db->escape($email).
"%'";
4042 $sql .=
" WHERE email = '".$this->db->escape($email).
"'";
4046 $resql = $this->db->query(
$sql);
4051 $obj = $this->db->fetch_object($resql);
4056 $this->findUserIdByEmailCache[$email] = (int) $obj->rowid;
4058 return $this->findUserIdByEmailCache[$email];