40require_once DOL_DOCUMENT_ROOT.
'/core/lib/security.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/user/class/usergroup.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/class/commonpeople.class.php';
56 public $element =
'user';
61 public $table_element =
'user';
66 public $fk_element =
'fk_user';
71 public $picto =
'user';
97 public $civility_code;
119 public $email_oauth2;
124 public $personal_email;
129 public $socialnetworks;
144 public $office_phone;
159 public $personal_mobile;
189 public $pass_crypted;
194 public $pass_indatabase;
199 public $pass_indatabase_crypted;
243 public $fk_user_expense_validator;
248 public $fk_user_holiday_validator;
258 public $clicktodial_login;
263 public $clicktodial_password;
268 public $clicktodial_poste;
273 public $clicktodial_loaded;
276 public $datelastlogin;
277 public $datepreviouslogin;
278 public $flagdelsessionsbefore;
280 public $ippreviouslogin;
281 public $datestartvalidity;
282 public $dateendvalidity;
302 public $all_permissions_are_loaded;
312 public $user_group_list;
317 private $_tab_loaded = array();
324 public $default_values;
326 public $lastsearch_values_tmp;
327 public $lastsearch_values;
332 public $users = array();
334 private $cache_childids;
336 public $accountancy_code;
350 public $dateemployment;
351 public $dateemploymentend;
353 public $default_c_exp_tax_cat;
358 public $ref_employee;
363 public $national_registration_number;
365 public $default_range;
370 public $fk_warehouse;
375 public $fk_establishment;
380 public $label_establishment;
391 public $usergroup_entity;
393 public $fields = array(
394 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'index' => 1,
'position' => 1,
'comment' =>
'Id'),
395 'lastname' => array(
'type' =>
'varchar(50)',
'label' =>
'Lastname',
'enabled' => 1,
'visible' => 1,
'notnull' => 1,
'showoncombobox' => 1,
'index' => 1,
'position' => 20,
'searchall' => 1),
396 'firstname' => array(
'type' =>
'varchar(50)',
'label' =>
'Firstname',
'enabled' => 1,
'visible' => 1,
'notnull' => 1,
'showoncombobox' => 1,
'index' => 1,
'position' => 10,
'searchall' => 1),
397 'ref_employee' => array(
'type' =>
'varchar(50)',
'label' =>
'RefEmployee',
'enabled' => 1,
'visible' => 1,
'notnull' => 1,
'showoncombobox' => 1,
'index' => 1,
'position' => 30,
'searchall' => 1),
398 'national_registration_number' => array(
'type' =>
'varchar(50)',
'label' =>
'NationalRegistrationNumber',
'enabled' => 1,
'visible' => 1,
'notnull' => 1,
'showoncombobox' => 1,
'index' => 1,
'position' => 40,
'searchall' => 1)
401 const STATUS_DISABLED = 0;
402 const STATUS_ENABLED = 1;
413 $this->ismultientitymanaged = 1;
414 $this->isextrafieldmanaged = 1;
416 $this->clicktodial_loaded = 0;
419 $this->all_permissions_are_loaded = 0;
420 $this->nb_rights = 0;
428 $this->rights->user =
new stdClass();
429 $this->rights->user->user =
new stdClass();
430 $this->rights->user->self =
new stdClass();
431 $this->rights->user->user_advance =
new stdClass();
432 $this->rights->user->self_advance =
new stdClass();
433 $this->rights->user->group_advance =
new stdClass();
450 public function fetch($id = 0, $login =
'', $sid =
'', $loadpersonalconf = 0, $entity = -1, $email =
'', $fk_socpeople = 0, $use_email_oauth2 = 0)
455 $login = trim($login);
458 $sql =
"SELECT u.rowid, u.lastname, u.firstname, u.employee, u.gender, u.civility as civility_code, u.birth, u.job,";
459 $sql .=
" u.email, u.email_oauth2, u.personal_email,";
460 $sql .=
" u.socialnetworks,";
461 $sql .=
" u.signature, u.office_phone, u.office_fax, u.user_mobile, u.personal_mobile,";
462 $sql .=
" u.address, u.zip, u.town, u.fk_state as state_id, u.fk_country as country_id,";
463 $sql .=
" u.admin, u.login, u.note_private, u.note_public,";
464 $sql .=
" u.pass, u.pass_crypted, u.pass_temp, u.api_key,";
465 $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,";
466 $sql .=
" u.statut as status, u.lang, u.entity,";
467 $sql .=
" u.datec as datec,";
468 $sql .=
" u.tms as datem,";
469 $sql .=
" u.datelastlogin as datel,";
470 $sql .=
" u.datepreviouslogin as datep,";
471 $sql .=
" u.flagdelsessionsbefore,";
472 $sql .=
" u.iplastlogin,";
473 $sql .=
" u.ippreviouslogin,";
474 $sql .=
" u.datelastpassvalidation,";
475 $sql .=
" u.datestartvalidity,";
476 $sql .=
" u.dateendvalidity,";
477 $sql .=
" u.photo as photo,";
478 $sql .=
" u.openid as openid,";
479 $sql .=
" u.accountancy_code,";
482 $sql .=
" u.salary,";
483 $sql .=
" u.salaryextra,";
484 $sql .=
" u.weeklyhours,";
486 $sql .=
" u.dateemployment, u.dateemploymentend,";
487 $sql .=
" u.fk_warehouse,";
488 $sql .=
" u.ref_ext,";
489 $sql .=
" u.default_range, u.default_c_exp_tax_cat,";
490 $sql .=
" u.national_registration_number,";
491 $sql .=
" u.ref_employee,";
492 $sql .=
" c.code as country_code, c.label as country,";
493 $sql .=
" d.code_departement as state_code, d.nom as state,";
494 $sql .=
" s.label as label_establishment, u.fk_establishment";
495 $sql .=
" FROM ".$this->db->prefix().
"user as u";
496 $sql .=
" LEFT JOIN ".$this->db->prefix().
"c_country as c ON u.fk_country = c.rowid";
497 $sql .=
" LEFT JOIN ".$this->db->prefix().
"c_departements as d ON u.fk_state = d.rowid";
498 $sql .=
" LEFT JOIN ".$this->db->prefix().
"establishment as s ON u.fk_establishment = s.rowid";
501 if ((!isModEnabled(
'multicompany') || !
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) && (!empty($user->entity))) {
502 $sql .=
" WHERE u.entity IN (0, ".((int) $conf->entity).
")";
504 $sql .=
" WHERE u.entity IS NOT NULL";
508 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
509 $sql .=
" WHERE u.entity IS NOT NULL";
511 $sql .=
" WHERE u.entity IN (0, ".((int) (($entity !=
'' && $entity >= 0) ? $entity : $conf->entity)).
")";
517 $sql .=
" AND (u.ldap_sid = '".$this->db->escape($sid).
"' OR u.login = '".$this->db->escape($login).
"')";
519 $sql .=
" AND u.login = '".$this->db->escape($login).
"'";
521 $sql .=
" AND (u.email = '".$this->db->escape($email).
"'";
522 if ($use_email_oauth2) {
523 $sql .=
" OR u.email_oauth2 = '".$this->db->escape($email).
"'";
526 } elseif ($fk_socpeople > 0) {
527 $sql .=
" AND u.fk_socpeople = ".((int) $fk_socpeople);
529 $sql .=
" AND u.rowid = ".((int) $id);
531 $sql .=
" ORDER BY u.entity ASC";
535 $sql .=
' '.$this->db->plimit(1);
538 $resql = $this->db->query($sql);
540 $num = $this->db->num_rows($resql);
542 $this->
error =
"USERDUPLICATEFOUND";
543 dol_syslog(get_class($this).
"::fetch more than 1 user found", LOG_WARNING);
545 $this->db->free($resql);
549 $obj = $this->db->fetch_object($resql);
551 $this->
id = $obj->rowid;
552 $this->
ref = $obj->rowid;
554 $this->ref_ext = $obj->ref_ext;
556 $this->ldap_sid = $obj->ldap_sid;
557 $this->civility_code = $obj->civility_code;
558 $this->lastname = $obj->lastname;
559 $this->firstname = $obj->firstname;
560 $this->ref_employee = $obj->ref_employee;
561 $this->national_registration_number = $obj->national_registration_number;
563 $this->employee = $obj->employee;
565 $this->login = $obj->login;
566 $this->gender = $obj->gender;
567 $this->birth = $this->db->jdate($obj->birth);
568 $this->pass_indatabase = $obj->pass;
569 $this->pass_indatabase_crypted = $obj->pass_crypted;
570 $this->pass = $obj->pass;
571 $this->pass_temp = $obj->pass_temp;
574 $this->address = $obj->address;
575 $this->zip = $obj->zip;
576 $this->town = $obj->town;
578 $this->country_id = $obj->country_id;
579 $this->country_code = $obj->country_id ? $obj->country_code :
'';
582 $this->state_id = $obj->state_id;
583 $this->state_code = $obj->state_code;
584 $this->state = ($obj->state !=
'-' ? $obj->state :
'');
586 $this->office_phone = $obj->office_phone;
587 $this->office_fax = $obj->office_fax;
588 $this->user_mobile = $obj->user_mobile;
589 $this->personal_mobile = $obj->personal_mobile;
590 $this->email = $obj->email;
591 $this->email_oauth2 = $obj->email_oauth2;
592 $this->personal_email = $obj->personal_email;
593 $this->socialnetworks = ($obj->socialnetworks ? (array) json_decode($obj->socialnetworks,
true) : array());
594 $this->job = $obj->job;
595 $this->signature = $obj->signature;
596 $this->admin = $obj->admin;
597 $this->note_public = $obj->note_public;
598 $this->note_private = $obj->note_private;
600 $this->
statut = $obj->status;
601 $this->
status = $obj->status;
603 $this->photo = $obj->photo;
604 $this->openid = $obj->openid;
605 $this->lang = $obj->lang;
606 $this->entity = $obj->entity;
607 $this->accountancy_code = $obj->accountancy_code;
608 $this->thm = $obj->thm;
609 $this->tjm = $obj->tjm;
610 $this->salary = $obj->salary;
611 $this->salaryextra = $obj->salaryextra;
612 $this->weeklyhours = $obj->weeklyhours;
613 $this->color = $obj->color;
614 $this->dateemployment = $this->db->jdate($obj->dateemployment);
615 $this->dateemploymentend = $this->db->jdate($obj->dateemploymentend);
617 $this->datec = $this->db->jdate($obj->datec);
618 $this->datem = $this->db->jdate($obj->datem);
619 $this->datelastlogin = $this->db->jdate($obj->datel);
620 $this->datepreviouslogin = $this->db->jdate($obj->datep);
621 $this->flagdelsessionsbefore = $this->db->jdate($obj->flagdelsessionsbefore,
'gmt');
622 $this->iplastlogin = $obj->iplastlogin;
623 $this->ippreviouslogin = $obj->ippreviouslogin;
624 $this->datestartvalidity = $this->db->jdate($obj->datestartvalidity);
625 $this->dateendvalidity = $this->db->jdate($obj->dateendvalidity);
627 $this->socid = $obj->fk_soc;
628 $this->contact_id = $obj->fk_socpeople;
629 $this->fk_member = $obj->fk_member;
630 $this->fk_user = $obj->fk_user;
631 $this->fk_user_expense_validator = $obj->fk_user_expense_validator;
632 $this->fk_user_holiday_validator = $obj->fk_user_holiday_validator;
634 $this->default_range = $obj->default_range;
635 $this->default_c_exp_tax_cat = $obj->default_c_exp_tax_cat;
636 $this->fk_warehouse = $obj->fk_warehouse;
637 $this->fk_establishment = $obj->fk_establishment;
638 $this->label_establishment = $obj->label_establishment;
642 if (!isModEnabled(
'multicompany') && $this->admin && $this->entity == 1) {
650 $this->db->free($resql);
652 $this->
error =
"USERNOTFOUND";
653 dol_syslog(get_class($this).
"::fetch user not found", LOG_DEBUG);
655 $this->db->free($resql);
659 $this->
error = $this->db->lasterror();
664 if ($loadpersonalconf) {
670 $this->
error = $this->db->lasterror();
689 $sql =
"SELECT param, value FROM ".$this->db->prefix().
"user_param";
690 $sql .=
" WHERE fk_user = ".((int) $this->
id);
691 $sql .=
" AND entity = ".((int) $conf->entity);
693 $resql = $this->db->query($sql);
695 $num = $this->db->num_rows($resql);
698 $obj = $this->db->fetch_object($resql);
699 $p = (!empty($obj->param) ? $obj->param :
'');
701 $this->
conf->$p = $obj->value;
705 $this->db->free($resql);
709 $this->
error = $this->db->lasterror();
726 require_once DOL_DOCUMENT_ROOT.
'/core/class/defaultvalues.class.php';
729 $result = $defaultValues->fetchAll(
'',
'', 0, 0,
'(t.user_id:in:0,'.$this->
id.
') AND (entity:in:'.(isset($this->entity) ? $this->entity : $conf->entity).
','.$conf->entity.
')');
732 if (!is_array($result) && $result < 0) {
736 } elseif (count($result) > 0) {
737 foreach ($result as $defval) {
738 if (!empty($defval->page) && !empty($defval->type) && !empty($defval->param)) {
739 $pagewithoutquerystring = $defval->page;
742 if (preg_match(
'/^([^\?]+)\?(.*)$/', $pagewithoutquerystring, $reg)) {
743 $pagewithoutquerystring = $reg[1];
744 $pagequeries = $reg[2];
746 $this->default_values[$pagewithoutquerystring][$defval->type][$pagequeries ? $pagequeries :
'_noquery_'][$defval->param] = $defval->value;
750 if (!empty($this->default_values)) {
751 foreach ($this->default_values as $a => $b) {
752 foreach ($b as $c => $d) {
753 krsort($this->default_values[$a][$c]);
772 public function hasRight($module, $permlevel1, $permlevel2 =
'')
775 $moduletomoduletouse = array(
776 'compta' =>
'comptabilite',
777 'contract' =>
'contrat',
778 'member' =>
'adherent',
780 'order' =>
'commande',
781 'produit' =>
'product',
782 'project' =>
'projet',
783 'propale' =>
'propal',
784 'shipping' =>
'expedition',
785 'task' =>
'task@projet',
786 'fichinter' =>
'ficheinter',
787 'inventory' =>
'stock',
788 'invoice' =>
'facture',
789 'invoice_supplier' =>
'fournisseur',
790 'order_supplier' =>
'fournisseur',
791 'knowledgerecord' =>
'knowledgerecord@knowledgemanagement',
792 'skill@hrm' =>
'all@hrm',
793 'job@hrm' =>
'all@hrm',
794 'position@hrm' =>
'all@hrm',
795 'facturerec' =>
'facture',
796 'margins' =>
'margin',
799 if (!empty($moduletomoduletouse[$module])) {
800 $module = $moduletomoduletouse[$module];
803 $moduleRightsMapping = array(
804 'product' =>
'produit',
805 'margin' =>
'margins',
806 'comptabilite' =>
'compta'
809 $rightsPath = $module;
810 if (!empty($moduleRightsMapping[$rightsPath])) {
811 $rightsPath = $moduleRightsMapping[$rightsPath];
815 $tmp = explode(
'@', $rightsPath, 2);
816 if (!empty($tmp[1])) {
817 if (strpos($module,
'@') !==
false) {
820 if ($tmp[0] != $tmp[1]) {
822 $rightsPath = $tmp[1];
823 $permlevel2 = $permlevel1;
824 $permlevel1 = $tmp[0];
827 $rightsPath = $tmp[1];
836 if (!isModEnabled($module)) {
841 if (!empty($this->socid)) {
842 if ($module ==
'societe' && ($permlevel1 ==
'creer' || $permlevel1 ==
'write')) {
845 if ($module ==
'societe' && $permlevel1 ==
'client' && $permlevel2 ==
'voir') {
848 if ($module ==
'societe' && $permlevel1 ==
'export') {
851 if ($module ==
'societe' && ($permlevel1 ==
'supprimer' || $permlevel1 ==
'delete')) {
857 if ($permlevel1 ==
'propale') {
858 $permlevel1 =
'propal';
860 if ($permlevel1 ==
'member') {
861 $permlevel1 =
'adherent';
863 if ($permlevel1 ==
'recruitmentcandidature') {
864 $permlevel1 =
'recruitmentjobposition';
869 if (empty($rightsPath) || empty($this->rights) || empty($this->rights->$rightsPath) || empty($permlevel1)) {
874 if (!empty($this->rights->$rightsPath->$permlevel1)) {
875 if (!empty($this->rights->$rightsPath->$permlevel1->$permlevel2)) {
876 return $this->rights->$rightsPath->$permlevel1->$permlevel2;
880 if ($permlevel2 ==
'read' && !empty($this->rights->$rightsPath->$permlevel1->lire)) {
881 return $this->rights->$rightsPath->$permlevel1->lire;
883 if ($permlevel2 ==
'write' && !empty($this->rights->$rightsPath->$permlevel1->creer)) {
884 return $this->rights->$rightsPath->$permlevel1->creer;
886 if ($permlevel2 ==
'write' && !empty($this->rights->$rightsPath->$permlevel1->create)) {
887 return $this->rights->$rightsPath->$permlevel1->create;
889 if ($permlevel2 ==
'delete' && !empty($this->rights->$rightsPath->$permlevel1->supprimer)) {
890 return $this->rights->$rightsPath->$permlevel1->supprimer;
894 if (!empty($this->rights->$rightsPath->$permlevel1)) {
895 return $this->rights->$rightsPath->$permlevel1;
899 if ($permlevel1 ==
'read' && !empty($this->rights->$rightsPath->lire)) {
900 return $this->rights->$rightsPath->lire;
902 if ($permlevel1 ==
'write' && !empty($this->rights->$rightsPath->creer)) {
903 return $this->rights->$rightsPath->creer;
905 if ($permlevel1 ==
'write' && !empty($this->rights->$rightsPath->create)) {
906 return $this->rights->$rightsPath->create;
908 if ($permlevel1 ==
'delete' && !empty($this->rights->$rightsPath->supprimer)) {
909 return $this->rights->$rightsPath->supprimer;
927 public function addrights($rid, $allmodule =
'', $allperms =
'', $entity = 0, $notrigger = 0)
929 global $conf, $user, $langs;
931 $entity = (empty($entity) ? $conf->entity : $entity);
933 dol_syslog(get_class($this).
"::addrights $rid, $allmodule, $allperms, $entity, $notrigger for user id=".$this->
id);
935 if (empty($this->
id)) {
936 $this->
error =
'Try to call addrights on an object user with an empty id';
946 $module = $perms = $subperms =
'';
949 $sql =
"SELECT module, perms, subperms";
950 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
951 $sql .=
" WHERE id = ".((int) $rid);
952 $sql .=
" AND entity = ".((int) $entity);
954 $result = $this->db->query($sql);
956 $obj = $this->db->fetch_object($result);
959 $module = $obj->module;
960 $perms = $obj->perms;
961 $subperms = $obj->subperms;
969 $whereforadd =
"id=".((int) $rid);
971 if (!empty($subperms)) {
972 $whereforadd .=
" OR (module='".$this->db->escape($module).
"' AND perms='".$this->db->escape($perms).
"' AND (subperms='lire' OR subperms='read'))";
973 } elseif (!empty($perms)) {
974 $whereforadd .=
" OR (module='".$this->db->escape($module).
"' AND (perms='lire' OR perms='read') AND subperms IS NULL)";
980 if (!empty($allmodule)) {
981 if ($allmodule ==
'allmodules') {
982 $whereforadd =
'allmodules';
984 $whereforadd =
"module='".$this->db->escape($allmodule).
"'";
985 if (!empty($allperms)) {
986 $whereforadd .=
" AND perms='".$this->db->escape($allperms).
"'";
994 if (!empty($whereforadd)) {
997 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
998 $sql .=
" WHERE entity = ".((int) $entity);
999 if (!empty($whereforadd) && $whereforadd !=
'allmodules') {
1000 $sql .=
" AND (".$whereforadd.
")";
1003 $sqldelete =
"DELETE FROM ".$this->db->prefix().
"user_rights";
1004 $sqldelete .=
" WHERE fk_user = ".((int) $this->
id).
" AND fk_id IN (";
1006 $sqldelete .=
") AND entity = ".((int) $entity);
1007 if (!$this->db->query($sqldelete)) {
1012 $resql = $this->db->query($sql);
1014 $num = $this->db->num_rows($resql);
1017 $obj = $this->db->fetch_object($resql);
1022 $sql =
"INSERT INTO ".$this->db->prefix().
"user_rights (entity, fk_user, fk_id) VALUES (".((int) $entity).
", ".((int) $this->
id).
", ".((int) $nid).
")";
1023 if (!$this->db->query($sql)) {
1037 if (!$error && !$notrigger) {
1038 $langs->load(
"other");
1039 $this->context = array(
'audit' => $langs->trans(
"PermissionsAdd").($rid ?
' (id='.$rid.
')' :
''));
1050 $this->db->rollback();
1053 $this->db->commit();
1070 public function delrights($rid, $allmodule =
'', $allperms =
'', $entity = 0, $notrigger = 0)
1072 global $conf, $user, $langs;
1076 $entity = (!empty($entity) ? $entity : $conf->entity);
1081 $module = $perms = $subperms =
'';
1085 $sql =
"SELECT module, perms, subperms";
1086 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
1087 $sql .=
" WHERE id = '".$this->db->escape($rid).
"'";
1088 $sql .=
" AND entity IN (".$this->db->sanitize($entity, 0, 0, 0, 0).
")";
1090 $result = $this->db->query($sql);
1092 $obj = $this->db->fetch_object($result);
1095 $module = $obj->module;
1096 $perms = $obj->perms;
1097 $subperms = $obj->subperms;
1105 $wherefordel =
"id=".((int) $rid);
1107 if ($subperms ==
'lire' || $subperms ==
'read') {
1108 $wherefordel .=
" OR (module='".$this->db->escape($module).
"' AND perms='".$this->db->escape($perms).
"' AND subperms IS NOT NULL)";
1110 if ($perms ==
'lire' || $perms ==
'read') {
1111 $wherefordel .=
" OR (module='".$this->db->escape($module).
"')";
1117 if (!empty($allmodule)) {
1118 if ($allmodule ==
'allmodules') {
1119 $wherefordel =
'allmodules';
1121 $wherefordel =
"module='".$this->db->escape($allmodule).
"'";
1122 if (!empty($allperms)) {
1123 $wherefordel .=
" AND perms='".$this->db->escape($allperms).
"'";
1130 if (!empty($wherefordel)) {
1133 $sql .=
" FROM ".$this->db->prefix().
"rights_def";
1134 $sql .=
" WHERE entity IN (".$this->db->sanitize($entity, 0, 0, 0, 0).
")";
1135 if (!empty($wherefordel) && $wherefordel !=
'allmodules') {
1136 $sql .=
" AND (".$wherefordel.
")";
1140 if ($this->admin == 1) {
1141 $sql .=
" AND id NOT IN (251, 252, 253, 254, 255, 256)";
1142 $sql .=
" AND id NOT IN (341, 342, 343, 344)";
1143 $sql .=
" AND id NOT IN (351, 352, 353, 354)";
1144 $sql .=
" AND id NOT IN (358)";
1147 $sqldelete =
"DELETE FROM ".$this->db->prefix().
"user_rights";
1148 $sqldelete .=
" WHERE fk_user = ".((int) $this->
id).
" AND fk_id IN (";
1151 $sqldelete .=
" AND entity IN (".$this->db->sanitize($entity, 0, 0, 0, 0).
")";
1153 $resql = $this->db->query($sqldelete);
1160 if (!$error && !$notrigger) {
1161 $langs->load(
"other");
1162 $this->context = array(
'audit' => $langs->trans(
"PermissionsDelete").($rid ?
' (id='.$rid.
')' :
''));
1173 $this->db->rollback();
1176 $this->db->commit();
1190 dol_syslog(get_class($this).
"::clearrights reset user->rights");
1192 $this->nb_rights = 0;
1193 $this->all_permissions_are_loaded = 0;
1194 $this->_tab_loaded = array();
1210 $alreadyloaded =
false;
1212 if (empty($forcereload)) {
1213 if ($moduletag && isset($this->_tab_loaded[$moduletag]) && $this->_tab_loaded[$moduletag]) {
1215 $alreadyloaded =
true;
1218 if (!empty($this->all_permissions_are_loaded)) {
1220 $alreadyloaded =
true;
1225 if (!isset($this->rights) || !is_object($this->rights)) {
1228 if (!isset($this->rights->user) || !is_object($this->rights->user)) {
1229 $this->rights->user =
new stdClass();
1234 if (!$alreadyloaded) {
1236 $sql =
"SELECT DISTINCT r.module, r.perms, r.subperms";
1237 $sql .=
" FROM ".$this->db->prefix().
"user_rights as ur,";
1238 $sql .=
" ".$this->db->prefix().
"rights_def as r";
1239 $sql .=
" WHERE r.id = ur.fk_id";
1242 $sql .=
" AND r.entity IN (0,".(isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE') ?
"1," :
"").$conf->entity.
")";
1246 $sql .=
" AND r.entity = ".((int) $conf->entity).
" AND ur.entity = ".((int) $conf->entity);
1248 $sql .=
" AND ur.fk_user= ".((int) $this->
id);
1249 $sql .=
" AND r.perms IS NOT NULL";
1251 $sql .=
" AND r.perms NOT LIKE '%_advance'";
1254 $sql .=
" AND r.module = '".$this->db->escape($moduletag).
"'";
1257 $resql = $this->db->query($sql);
1259 $num = $this->db->num_rows($resql);
1262 $obj = $this->db->fetch_object($resql);
1265 $module = $obj->module;
1266 $perms = $obj->perms;
1267 $subperms = $obj->subperms;
1269 if (!empty($perms)) {
1270 if (!empty($module)) {
1271 if (!isset($this->rights->$module) || !is_object($this->rights->$module)) {
1272 $this->rights->$module =
new stdClass();
1274 if (!empty($subperms)) {
1275 if (!isset($this->rights->$module->$perms) || !is_object($this->rights->$module->$perms)) {
1276 $this->rights->$module->$perms =
new stdClass();
1278 if (empty($this->rights->$module->$perms->$subperms)) {
1281 $this->rights->$module->$perms->$subperms = 1;
1283 if (empty($this->rights->$module->$perms)) {
1286 $this->rights->$module->$perms = 1;
1293 $this->db->free($resql);
1297 $sql =
"SELECT DISTINCT r.module, r.perms, r.subperms, r.entity";
1298 $sql .=
" FROM ".$this->db->prefix().
"usergroup_rights as gr,";
1299 $sql .=
" ".$this->db->prefix().
"usergroup_user as gu,";
1300 $sql .=
" ".$this->db->prefix().
"rights_def as r";
1301 $sql .=
" WHERE r.id = gr.fk_id";
1304 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
1305 $sql .=
" AND gu.entity IN (0,".$conf->entity.
")";
1307 $sql .=
" AND r.entity = ".((int) $conf->entity);
1310 $sql .=
" AND gr.entity = ".((int) $conf->entity);
1314 $sql .=
" AND gu.entity IN (0,".$conf->entity.
")";
1315 $sql .=
" AND r.entity = ".((int) $conf->entity);
1318 $sql .=
" AND gr.fk_usergroup = gu.fk_usergroup";
1319 $sql .=
" AND gu.fk_user = ".((int) $this->
id);
1320 $sql .=
" AND r.perms IS NOT NULL";
1322 $sql .=
" AND r.module = '".$this->db->escape($moduletag).
"'";
1325 $resql = $this->db->query($sql);
1327 $num = $this->db->num_rows($resql);
1330 $obj = $this->db->fetch_object($resql);
1333 $module = $obj->module;
1334 $perms = $obj->perms;
1335 $subperms = $obj->subperms;
1337 if (!empty($perms)) {
1338 if (!empty($module)) {
1339 if (!isset($this->rights->$module) || !is_object($this->rights->$module)) {
1340 $this->rights->$module =
new stdClass();
1342 if (!empty($subperms)) {
1343 if (!isset($this->rights->$module->$perms) || !is_object($this->rights->$module->$perms)) {
1344 $this->rights->$module->$perms =
new stdClass();
1346 if (empty($this->rights->$module->$perms->$subperms)) {
1349 $this->rights->$module->$perms->$subperms = 1;
1351 if (empty($this->rights->$module->$perms)) {
1355 if (!isset($this->rights->$module->$perms) || !is_object($this->rights->$module->$perms)) {
1356 $this->rights->$module->$perms = 1;
1364 $this->db->free($resql);
1368 if (!empty($this->admin)) {
1369 if (empty($this->rights->user->user)) {
1370 $this->rights->user->user =
new stdClass();
1372 $listofpermtotest = array(
'lire',
'creer',
'password',
'supprimer',
'export');
1373 foreach ($listofpermtotest as $permtotest) {
1374 if (empty($this->rights->user->user->$permtotest)) {
1375 $this->rights->user->user->$permtotest = 1;
1379 if (empty($this->rights->user->self)) {
1380 $this->rights->user->self =
new stdClass();
1382 $listofpermtotest = array(
'creer',
'password');
1383 foreach ($listofpermtotest as $permtotest) {
1384 if (empty($this->rights->user->self->$permtotest)) {
1385 $this->rights->user->self->$permtotest = 1;
1391 if (empty($this->rights->user->user_advance)) {
1392 $this->rights->user->user_advance =
new stdClass();
1394 $listofpermtotest = array(
'readperms',
'write');
1395 foreach ($listofpermtotest as $permtotest) {
1396 if (empty($this->rights->user->user_advance->$permtotest)) {
1397 $this->rights->user->user_advance->$permtotest = 1;
1401 if (empty($this->rights->user->self_advance)) {
1402 $this->rights->user->self_advance =
new stdClass();
1404 $listofpermtotest = array(
'readperms',
'writeperms');
1405 foreach ($listofpermtotest as $permtotest) {
1406 if (empty($this->rights->user->self_advance->$permtotest)) {
1407 $this->rights->user->self_advance->$permtotest = 1;
1411 if (empty($this->rights->user->group_advance)) {
1412 $this->rights->user->group_advance =
new stdClass();
1414 $listofpermtotest = array(
'read',
'readperms',
'write',
'delete');
1415 foreach ($listofpermtotest as $permtotest) {
1416 if (empty($this->rights->user) || empty($this->rights->user->group_advance->$permtotest)) {
1417 $this->rights->user->group_advance->$permtotest = 1;
1425 if (isset($this->rights->propale) && !isset($this->rights->propal)) {
1426 $this->rights->propal = $this->rights->propale;
1428 if (isset($this->rights->propal) && !isset($this->rights->propale)) {
1429 $this->rights->propale = $this->rights->propal;
1436 $this->all_permissions_are_loaded = 1;
1439 $this->_tab_loaded[$moduletag] = 1;
1455 public function getrights($moduletag =
'', $forcereload = 0)
1468 global $conf, $langs, $user;
1473 if (isset($this->
statut)) {
1474 if ($this->
statut == $status) {
1477 } elseif (isset($this->
status) && $this->
status == $status) {
1484 $sql =
"UPDATE ".$this->db->prefix().
"user";
1485 $sql .=
" SET statut = ".((int) $status);
1486 $sql .=
" WHERE rowid = ".((int) $this->
id);
1487 $result = $this->db->query($sql);
1489 dol_syslog(get_class($this).
"::setstatus", LOG_DEBUG);
1492 $this->context[
'actionmsg'] =
'User '.$this->login.
' disabled';
1494 $this->context[
'actionmsg'] =
'User '.$this->login.
' enabled';
1497 $result = $this->
call_trigger(
'USER_ENABLEDISABLE', $user);
1505 $this->db->rollback();
1510 $this->db->commit();
1527 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
1528 return parent::setCategoriesCommon($categories, Categorie::TYPE_USER);
1539 global $conf, $langs;
1545 $this->
fetch($this->
id);
1547 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1550 $sql =
"DELETE FROM ".$this->db->prefix().
"user_rights WHERE fk_user = ".((int) $this->
id);
1552 if (!$error && !$this->db->query($sql)) {
1554 $this->
error = $this->db->lasterror();
1558 $sql =
"DELETE FROM ".$this->db->prefix().
"usergroup_user WHERE fk_user = ".((int) $this->
id);
1559 if (!$error && !$this->db->query($sql)) {
1561 $this->
error = $this->db->lasterror();
1565 $sql =
"DELETE FROM ".$this->db->prefix().
"user_param WHERE fk_user = ".((int) $this->
id);
1566 if (!$error && !$this->db->query($sql)) {
1568 $this->
error = $this->db->lasterror();
1572 if ($this->contact_id > 0) {
1573 $sql =
"UPDATE ".$this->db->prefix().
"socpeople SET fk_user_creat = null WHERE rowid = ".((int) $this->contact_id);
1574 if (!$error && !$this->db->query($sql)) {
1576 $this->
error = $this->db->lasterror();
1585 dol_syslog(get_class($this).
"::delete error -4 ".$this->
error, LOG_ERR);
1591 $sql =
"DELETE FROM ".$this->db->prefix().
"user WHERE rowid = ".((int) $this->
id);
1592 dol_syslog(get_class($this).
"::delete", LOG_DEBUG);
1593 if (!$this->db->query($sql)) {
1595 $this->
error = $this->db->lasterror();
1604 $this->db->rollback();
1609 $this->db->commit();
1612 $this->db->rollback();
1624 public function create($user, $notrigger = 0)
1626 global $conf, $langs;
1632 $this->civility_code = trim((
string) $this->civility_code);
1633 $this->login = trim((
string) $this->login);
1634 if (!isset($this->entity)) {
1635 $this->entity = $conf->entity;
1638 dol_syslog(get_class($this).
"::create login=".$this->login.
", user=".(is_object($user) ? $user->id :
''), LOG_DEBUG);
1640 $badCharUnauthorizedIntoLoginName =
getDolGlobalString(
'MAIN_LOGIN_BADCHARUNAUTHORIZED',
',@<>"\'');
1644 $langs->load(
"errors");
1645 $this->
error = $langs->trans(
"ErrorBadEMail", $this->email);
1648 if (empty($this->login)) {
1649 $langs->load(
"errors");
1650 $this->
error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Login"));
1652 } elseif (preg_match(
'/['.preg_quote($badCharUnauthorizedIntoLoginName,
'/').
']/', $this->login)) {
1653 $langs->load(
"errors");
1654 $this->
error = $langs->trans(
"ErrorBadCharIntoLoginName", $langs->transnoentitiesnoconv(
"Login"));
1665 $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).
"'";
1666 $resqltochecklogin = $this->db->query($sqltochecklogin);
1667 if ($resqltochecklogin) {
1668 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
1669 if ($objtochecklogin && $objtochecklogin->nb > 0) {
1670 $langs->load(
"errors");
1671 $this->
error = $langs->trans(
"ErrorLoginAlreadyExists", $this->login);
1673 $this->db->rollback();
1676 $this->db->free($resqltochecklogin);
1679 if (!empty($this->email)) {
1680 $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).
"'";
1681 $resqltochecklogin = $this->db->query($sqltochecklogin);
1682 if ($resqltochecklogin) {
1683 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
1684 if ($objtochecklogin && $objtochecklogin->nb > 0) {
1685 $langs->load(
"errors");
1686 $this->
error = $langs->trans(
"ErrorEmailAlreadyExists", $this->email);
1688 $this->db->rollback();
1691 $this->db->free($resqltochecklogin);
1696 $sql =
"INSERT INTO ".$this->db->prefix().
"user (datec, login, ldap_sid, entity)";
1697 $sql .=
" VALUES('".$this->db->idate($this->datec).
"', '".$this->db->escape($this->login).
"', '".$this->db->escape($this->ldap_sid).
"', ".((int) $this->entity).
")";
1698 $result = $this->db->query($sql);
1700 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1702 $this->
id = $this->db->last_insert_id($this->db->prefix().
"user");
1706 $this->
error =
'ErrorFailedToSetDefaultRightOfUser';
1707 $this->db->rollback();
1712 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
1713 $langs->load(
"stocks");
1715 $entrepot =
new Entrepot($this->db);
1716 $entrepot->label = $langs->trans(
"PersonalStock", $this->
getFullName($langs));
1717 $entrepot->libelle = $entrepot->label;
1718 $entrepot->description = $langs->trans(
"ThisWarehouseIsPersonalStock", $this->
getFullName($langs));
1719 $entrepot->statut = 1;
1720 $entrepot->country_id = $mysoc->country_id;
1722 $warehouseid = $entrepot->create($user);
1724 $this->fk_warehouse = $warehouseid;
1728 $result = $this->
update($user, 1, 1);
1730 $this->db->rollback();
1744 $this->db->commit();
1749 $this->db->rollback();
1753 $this->
error = $this->db->lasterror();
1754 $this->db->rollback();
1772 global $conf, $user, $langs;
1778 $this->civility_code = $contact->civility_code;
1779 $this->lastname = $contact->lastname;
1780 $this->firstname = $contact->firstname;
1782 $this->email = $contact->email;
1783 $this->socialnetworks = $contact->socialnetworks;
1784 $this->office_phone = $contact->phone_pro;
1785 $this->office_fax = $contact->fax;
1786 $this->user_mobile = $contact->phone_mobile;
1787 $this->address = $contact->address;
1788 $this->zip = $contact->zip;
1789 $this->town = $contact->town;
1791 $this->state_id = $contact->state_id;
1792 $this->country_id = $contact->country_id;
1793 $this->employee = 0;
1795 if (empty($login)) {
1796 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
1797 $login =
dol_buildlogin($contact->lastname, $contact->firstname);
1799 $this->login = $login;
1804 $result = $this->
create($user, 1);
1806 $sql =
"UPDATE ".$this->db->prefix().
"user";
1807 $sql .=
" SET fk_socpeople=".((int) $contact->id);
1808 $sql .=
", civility='".$this->db->escape($contact->civility_code).
"'";
1809 if ($contact->socid > 0) {
1810 $sql .=
", fk_soc=".((int) $contact->socid);
1812 $sql .=
" WHERE rowid=".((int) $this->
id);
1814 $resql = $this->db->query($sql);
1816 dol_syslog(get_class($this).
"::create_from_contact", LOG_DEBUG);
1818 $this->context[
'createfromcontact'] =
'createfromcontact';
1824 $this->db->rollback();
1829 $this->db->commit();
1832 $this->
error = $this->db->error();
1834 $this->db->rollback();
1839 dol_syslog(get_class($this).
"::create_from_contact - 0");
1841 $this->db->rollback();
1862 $this->civility_code = $member->civility_code;
1863 $this->lastname = $member->lastname;
1864 $this->firstname = $member->firstname;
1865 $this->gender = $member->gender;
1866 $this->email = $member->email;
1867 $this->fk_member = $member->id;
1868 $this->address = $member->address;
1869 $this->zip = $member->zip;
1870 $this->town = $member->town;
1872 $this->state_id = $member->state_id;
1873 $this->country_id = $member->country_id;
1874 $this->socialnetworks = $member->socialnetworks;
1876 $this->pass = $member->pass;
1877 $this->pass_crypted = $member->pass_indatabase_crypted;
1879 if (empty($login)) {
1880 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
1883 $this->login = $login;
1888 $result = $this->
create($user);
1890 if (!empty($this->pass)) {
1891 $newpass = $this->
setPassword($user, $this->pass);
1892 if (is_int($newpass) && $newpass < 0) {
1895 } elseif (!empty($this->pass_crypted)) {
1896 $sql =
"UPDATE ".$this->db->prefix().
"user";
1897 $sql .=
" SET pass_crypted = '".$this->db->escape($this->pass_crypted).
"'";
1898 $sql .=
" WHERE rowid=".((int) $this->
id);
1900 $resql = $this->db->query($sql);
1906 if ($result > 0 && $member->socid) {
1907 $sql =
"UPDATE ".$this->db->prefix().
"user";
1908 $sql .=
" SET fk_soc=".((int) $member->socid);
1909 $sql .=
" WHERE rowid=".((int) $this->
id);
1911 dol_syslog(get_class($this).
"::create_from_member", LOG_DEBUG);
1912 $resql = $this->db->query($sql);
1914 $this->db->commit();
1917 $this->
error = $this->db->lasterror();
1919 $this->db->rollback();
1926 $this->db->commit();
1930 $this->db->rollback();
1948 $sql =
"SELECT id FROM ".$this->db->prefix().
"rights_def";
1949 $sql .=
" WHERE bydefault = 1";
1950 $sql .=
" AND entity = ".((int) $conf->entity);
1952 $resql = $this->db->query($sql);
1954 $num = $this->db->num_rows($resql);
1957 $row = $this->db->fetch_row($resql);
1961 $this->db->free($resql);
1965 $sql =
"DELETE FROM ".$this->db->prefix().
"user_rights WHERE fk_user = $this->id AND fk_id=$rd[$i]";
1966 $result = $this->db->query($sql);
1968 $sql =
"INSERT INTO ".$this->db->prefix().
"user_rights (fk_user, fk_id) VALUES ($this->id, $rd[$i])";
1969 $result = $this->db->query($sql);
1989 public function update($user, $notrigger = 0, $nosyncmember = 0, $nosyncmemberpass = 0, $nosynccontact = 0)
1991 global $conf, $langs;
1993 $nbrowsaffected = 0;
1996 dol_syslog(get_class($this).
"::update notrigger=".$notrigger.
", nosyncmember=".$nosyncmember.
", nosyncmemberpass=".$nosyncmemberpass);
1999 $this->civility_code = trim((
string) $this->civility_code);
2000 $this->lastname = trim((
string) $this->lastname);
2001 $this->firstname = trim((
string) $this->firstname);
2002 $this->ref_employee = trim((
string) $this->ref_employee);
2003 $this->national_registration_number = trim((
string) $this->national_registration_number);
2004 $this->employee = ($this->employee > 0 ? $this->employee : 0);
2005 $this->login = trim((
string) $this->login);
2006 $this->gender = trim((
string) $this->gender);
2008 $this->pass = trim((
string) $this->pass);
2009 $this->api_key = trim((
string) $this->api_key);
2010 $this->datestartvalidity = empty($this->datestartvalidity) ?
'' : $this->datestartvalidity;
2011 $this->dateendvalidity = empty($this->dateendvalidity) ?
'' : $this->dateendvalidity;
2013 $this->address = trim((
string) $this->address);
2014 $this->zip = trim((
string) $this->zip);
2015 $this->town = trim((
string) $this->town);
2017 $this->state_id = ($this->state_id > 0 ? $this->state_id : 0);
2018 $this->country_id = ($this->country_id > 0 ? $this->country_id : 0);
2019 $this->office_phone = trim((
string) $this->office_phone);
2020 $this->office_fax = trim((
string) $this->office_fax);
2021 $this->user_mobile = trim((
string) $this->user_mobile);
2022 $this->personal_mobile = trim((
string) $this->personal_mobile);
2023 $this->email = trim((
string) $this->email);
2024 $this->personal_email = trim((
string) $this->personal_email);
2026 $this->job = trim((
string) $this->job);
2027 $this->signature = trim((
string) $this->signature);
2028 $this->note_public = trim((
string) $this->note_public);
2029 $this->note_private = trim((
string) $this->note_private);
2030 $this->openid = trim((
string) $this->openid);
2031 $this->admin = ($this->admin > 0 ? $this->admin : 0);
2033 $this->accountancy_code = trim((
string) $this->accountancy_code);
2034 $this->color = trim((
string) $this->color);
2035 $this->dateemployment = empty($this->dateemployment) ?
'' : $this->dateemployment;
2036 $this->dateemploymentend = empty($this->dateemploymentend) ?
'' : $this->dateemploymentend;
2038 $this->birth = empty($this->birth) ?
'' : $this->birth;
2039 $this->fk_warehouse = (int) $this->fk_warehouse;
2040 $this->fk_establishment = (int) $this->fk_establishment;
2045 $badCharUnauthorizedIntoLoginName =
getDolGlobalString(
'MAIN_LOGIN_BADCHARUNAUTHORIZED',
',@<>"\'');
2048 $langs->load(
"errors");
2049 $this->
error = $langs->trans(
"ErrorBadEMail", $this->email);
2052 if (empty($this->login)) {
2053 $langs->load(
"errors");
2054 $this->
error = $langs->trans(
"ErrorFieldRequired",
'Login');
2056 } elseif (preg_match(
'/['.preg_quote($badCharUnauthorizedIntoLoginName,
'/').
']/', $this->login)) {
2057 $langs->load(
"errors");
2058 $this->
error = $langs->trans(
"ErrorBadCharIntoLoginName", $langs->transnoentitiesnoconv(
"Login"));
2065 if (is_object($this->oldcopy) && !$this->oldcopy->isEmpty() && $this->oldcopy->login != $this->login) {
2066 $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).
"'";
2067 $resqltochecklogin = $this->db->query($sqltochecklogin);
2068 if ($resqltochecklogin) {
2069 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
2070 if ($objtochecklogin && $objtochecklogin->nb > 0) {
2071 $langs->load(
"errors");
2072 $this->
error = $langs->trans(
"ErrorLoginAlreadyExists", $this->login);
2074 $this->db->rollback();
2079 if (is_object($this->oldcopy) && !$this->oldcopy->isEmpty() && !empty($this->email) && $this->oldcopy->email != $this->email) {
2080 $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).
"'";
2081 $resqltochecklogin = $this->db->query($sqltochecklogin);
2082 if ($resqltochecklogin) {
2083 $objtochecklogin = $this->db->fetch_object($resqltochecklogin);
2084 if ($objtochecklogin && $objtochecklogin->nb > 0) {
2085 $langs->load(
"errors");
2086 $this->
error = $langs->trans(
"ErrorEmailAlreadyExists", $this->email);
2088 $this->db->rollback();
2095 $sql =
"UPDATE ".$this->db->prefix().
"user SET";
2096 $sql .=
" civility = '".$this->db->escape($this->civility_code).
"'";
2097 $sql .=
", lastname = '".$this->db->escape($this->lastname).
"'";
2098 $sql .=
", firstname = '".$this->db->escape($this->firstname).
"'";
2099 $sql .=
", ref_employee = '".$this->db->escape($this->ref_employee).
"'";
2100 $sql .=
", national_registration_number = '".$this->db->escape($this->national_registration_number).
"'";
2101 $sql .=
", employee = ".(int) $this->employee;
2102 $sql .=
", login = '".$this->db->escape($this->login).
"'";
2103 $sql .=
", api_key = ".($this->api_key ?
"'".$this->db->escape(
dolEncrypt($this->api_key,
'',
'',
'dolibarr')).
"'" :
"null");
2104 $sql .=
", gender = ".($this->gender != -1 ?
"'".$this->db->escape($this->gender).
"'" :
"null");
2105 $sql .=
", birth=".(strval($this->birth) !=
'' ?
"'".$this->db->idate($this->birth,
'tzserver').
"'" :
'null');
2106 if (!empty($user->admin)) {
2107 $sql .=
", admin = ".(int) $this->admin;
2109 $sql .=
", address = '".$this->db->escape($this->address).
"'";
2110 $sql .=
", zip = '".$this->db->escape($this->zip).
"'";
2111 $sql .=
", town = '".$this->db->escape($this->town).
"'";
2112 $sql .=
", fk_state = ".((!empty($this->state_id) && $this->state_id > 0) ?
"'".$this->db->escape($this->state_id).
"'" :
"null");
2113 $sql .=
", fk_country = ".((!empty($this->country_id) && $this->country_id > 0) ?
"'".$this->db->escape($this->country_id).
"'" :
"null");
2114 $sql .=
", office_phone = '".$this->db->escape($this->office_phone).
"'";
2115 $sql .=
", office_fax = '".$this->db->escape($this->office_fax).
"'";
2116 $sql .=
", user_mobile = '".$this->db->escape($this->user_mobile).
"'";
2117 $sql .=
", personal_mobile = '".$this->db->escape($this->personal_mobile).
"'";
2118 $sql .=
", email = '".$this->db->escape($this->email).
"'";
2119 $sql .=
", personal_email = '".$this->db->escape($this->personal_email).
"'";
2120 $sql .=
", socialnetworks = '".$this->db->escape(json_encode($this->socialnetworks)).
"'";
2121 $sql .=
", job = '".$this->db->escape($this->job).
"'";
2122 $sql .=
", signature = '".$this->db->escape($this->signature).
"'";
2123 $sql .=
", accountancy_code = '".$this->db->escape($this->accountancy_code).
"'";
2124 $sql .=
", color = '".$this->db->escape($this->color).
"'";
2125 $sql .=
", dateemployment=".(strval($this->dateemployment) !=
'' ?
"'".$this->db->idate($this->dateemployment).
"'" :
'null');
2126 $sql .=
", dateemploymentend=".(strval($this->dateemploymentend) !=
'' ?
"'".$this->db->idate($this->dateemploymentend).
"'" :
'null');
2127 $sql .=
", datestartvalidity=".(strval($this->datestartvalidity) !=
'' ?
"'".$this->db->idate($this->datestartvalidity).
"'" :
'null');
2128 $sql .=
", dateendvalidity=".(strval($this->dateendvalidity) !=
'' ?
"'".$this->db->idate($this->dateendvalidity).
"'" :
'null');
2129 $sql .=
", note_private = '".$this->db->escape($this->note_private).
"'";
2130 $sql .=
", note_public = '".$this->db->escape($this->note_public).
"'";
2131 $sql .=
", photo = ".($this->photo ?
"'".$this->db->escape($this->photo).
"'" :
"null");
2132 $sql .=
", openid = ".($this->openid ?
"'".$this->db->escape($this->openid).
"'" :
"null");
2133 $sql .=
", fk_user = ".($this->fk_user > 0 ?
"'".$this->db->escape($this->fk_user).
"'" :
"null");
2134 $sql .=
", fk_user_expense_validator = ".($this->fk_user_expense_validator > 0 ?
"'".$this->db->escape($this->fk_user_expense_validator).
"'" :
"null");
2135 $sql .=
", fk_user_holiday_validator = ".($this->fk_user_holiday_validator > 0 ?
"'".$this->db->escape($this->fk_user_holiday_validator).
"'" :
"null");
2136 if (isset($this->thm) || $this->thm !=
'') {
2137 $sql .=
", thm= ".($this->thm !=
'' ?
"'".$this->db->escape($this->thm).
"'" :
"null");
2139 if (isset($this->tjm) || $this->tjm !=
'') {
2140 $sql .=
", tjm= ".($this->tjm !=
'' ?
"'".$this->db->escape($this->tjm).
"'" :
"null");
2142 if (isset($this->salary) || $this->salary !=
'') {
2143 $sql .=
", salary= ".($this->salary !=
'' ?
"'".$this->db->escape($this->salary).
"'" :
"null");
2145 if (isset($this->salaryextra) || $this->salaryextra !=
'') {
2146 $sql .=
", salaryextra= ".($this->salaryextra !=
'' ?
"'".$this->db->escape($this->salaryextra).
"'" :
"null");
2148 $sql .=
", weeklyhours= ".($this->weeklyhours !=
'' ?
"'".$this->db->escape($this->weeklyhours).
"'" :
"null");
2149 if (!empty($user->admin) && empty($user->entity) && $user->id != $this->id) {
2150 $sql .=
", entity = ".((int) $this->entity);
2152 $sql .=
", default_range = ".($this->default_range > 0 ? $this->default_range :
'null');
2153 $sql .=
", default_c_exp_tax_cat = ".($this->default_c_exp_tax_cat > 0 ? $this->default_c_exp_tax_cat :
'null');
2154 $sql .=
", fk_warehouse = ".($this->fk_warehouse > 0 ? $this->fk_warehouse :
"null");
2155 $sql .=
", fk_establishment = ".($this->fk_establishment > 0 ? $this->fk_establishment :
"null");
2156 $sql .=
", lang = ".($this->lang ?
"'".$this->db->escape($this->lang).
"'" :
"null");
2157 $sql .=
" WHERE rowid = ".((int) $this->
id);
2159 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
2160 $resql = $this->db->query($sql);
2162 $nbrowsaffected += $this->db->affected_rows($resql);
2165 if (!empty($this->pass)) {
2166 if ($this->pass != $this->pass_indatabase && !
dol_verifyHash($this->pass, $this->pass_indatabase_crypted)) {
2168 $result = $this->
setPassword($user, $this->pass, 0, $notrigger, $nosyncmemberpass, 0, 1);
2169 if (is_int($result) && $result < 0) {
2176 if ($this->fk_member > 0) {
2177 dol_syslog(get_class($this).
"::update remove link with member. We will recreate it later", LOG_DEBUG);
2178 $sql =
"UPDATE ".$this->db->prefix().
"user SET fk_member = NULL where fk_member = ".((int) $this->fk_member);
2179 $resql = $this->db->query($sql);
2181 $this->
error = $this->db->error();
2182 $this->db->rollback();
2187 dol_syslog(get_class($this).
"::update set link with member", LOG_DEBUG);
2188 $sql =
"UPDATE ".$this->db->prefix().
"user SET fk_member =".($this->fk_member > 0 ? ((int) $this->fk_member) :
'null').
" where rowid = ".((
int) $this->id);
2189 $resql = $this->db->query($sql);
2191 $this->
error = $this->db->error();
2192 $this->db->rollback();
2196 if ($nbrowsaffected) {
2197 if ($this->fk_member > 0 && !$nosyncmember) {
2198 dol_syslog(get_class($this).
"::update user is linked with a member. We try to update member too.", LOG_DEBUG);
2200 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
2205 $result = $adh->fetch($this->fk_member);
2208 $adh->civility_code = $this->civility_code;
2209 $adh->firstname = $this->firstname;
2210 $adh->lastname = $this->lastname;
2211 $adh->login = $this->login;
2212 $adh->gender = $this->gender;
2213 $adh->birth = $this->birth;
2215 $adh->pass = $this->pass;
2217 $adh->address = $this->address;
2218 $adh->town = $this->town;
2219 $adh->zip = $this->zip;
2220 $adh->state_id = $this->state_id;
2221 $adh->country_id = $this->country_id;
2223 $adh->email = $this->email;
2225 $adh->socialnetworks = $this->socialnetworks;
2227 $adh->phone = $this->office_phone;
2228 $adh->phone_mobile = $this->user_mobile;
2230 $adh->default_lang = $this->lang;
2232 $adh->user_id = $this->id;
2233 $adh->user_login = $this->login;
2235 $result = $adh->update($user, 0, 1, 0);
2237 $this->
error = $adh->error;
2238 $this->errors = $adh->errors;
2239 dol_syslog(get_class($this).
"::update error after calling adh->update to sync it with user: ".$this->
error, LOG_ERR);
2242 } elseif ($result < 0) {
2243 $this->
error = $adh->error;
2244 $this->errors = $adh->errors;
2249 if ($this->contact_id > 0 && !$nosynccontact) {
2250 dol_syslog(get_class($this).
"::update user is linked with a contact. We try to update contact too.", LOG_DEBUG);
2252 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
2255 $tmpobj =
new Contact($this->db);
2256 $result = $tmpobj->fetch($this->contact_id);
2259 $tmpobj->civility_code = $this->civility_code;
2260 $tmpobj->firstname = $this->firstname;
2261 $tmpobj->lastname = $this->lastname;
2262 $tmpobj->login = $this->login;
2263 $tmpobj->gender = $this->gender;
2264 $tmpobj->birth = $this->birth;
2268 $tmpobj->email = $this->email;
2270 $tmpobj->socialnetworks = $this->socialnetworks;
2272 $tmpobj->phone_pro = $this->office_phone;
2273 $tmpobj->phone_mobile = $this->user_mobile;
2274 $tmpobj->fax = $this->office_fax;
2276 $tmpobj->default_lang = $this->lang;
2278 $tmpobj->address = $this->address;
2279 $tmpobj->town = $this->town;
2280 $tmpobj->zip = $this->zip;
2281 $tmpobj->state_id = $this->state_id;
2282 $tmpobj->country_id = $this->country_id;
2284 $tmpobj->user_id = $this->id;
2285 $tmpobj->user_login = $this->login;
2287 $result = $tmpobj->update($tmpobj->id, $user, 0,
'update', 1);
2289 $this->
error = $tmpobj->error;
2290 $this->errors = $tmpobj->errors;
2291 dol_syslog(get_class($this).
"::update error after calling adh->update to sync it with user: ".$this->
error, LOG_ERR);
2295 $this->
error = $tmpobj->error;
2296 $this->errors = $tmpobj->errors;
2312 if (!$error && !$notrigger) {
2322 $this->db->commit();
2323 return $nbrowsaffected;
2326 $this->db->rollback();
2330 $this->
error = $this->db->lasterror();
2331 $this->db->rollback();
2350 $sql =
"UPDATE ".$this->db->prefix().
"user SET";
2351 $sql .=
" datepreviouslogin = datelastlogin,";
2352 $sql .=
" ippreviouslogin = iplastlogin,";
2353 $sql .=
" datelastlogin = '".$this->db->idate($now).
"',";
2354 $sql .=
" iplastlogin = '".$this->db->escape($userremoteip).
"',";
2355 $sql .=
" tms = tms";
2356 $sql .=
" WHERE rowid = ".((int) $this->
id);
2358 dol_syslog(get_class($this).
"::update_last_login_date user->id=".$this->
id.
" ".$sql, LOG_DEBUG);
2359 $resql = $this->db->query($sql);
2361 $this->datepreviouslogin = $this->datelastlogin;
2362 $this->datelastlogin = $now;
2363 $this->ippreviouslogin = $this->iplastlogin;
2364 $this->iplastlogin = $userremoteip;
2367 $this->
error = $this->db->lasterror().
' sql='.$sql;
2385 public function setPassword($user, $password =
'', $changelater = 0, $notrigger = 0, $nosyncmember = 0, $passwordalreadycrypted = 0, $flagdelsessionsbefore = 1)
2387 global $conf, $langs;
2388 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
2392 dol_syslog(get_class($this).
"::setPassword user=".$user->id.
" password=".preg_replace(
'/./i',
'*', $password).
" changelater=".$changelater.
" notrigger=".$notrigger.
" nosyncmember=".$nosyncmember, LOG_DEBUG);
2400 if (empty($passwordalreadycrypted)) {
2403 $modGeneratePassClass =
'modGeneratePass'.ucfirst($conf->global->USER_PASSWORD_GENERATED);
2405 include_once DOL_DOCUMENT_ROOT.
'/core/modules/security/generate/'.$modGeneratePassClass.
'.class.php';
2406 if (class_exists($modGeneratePassClass)) {
2407 $modGeneratePass =
new $modGeneratePassClass($this->db, $conf, $langs, $user);
2410 $modGeneratePass->WithoutAmbi = 0;
2413 $testpassword = $modGeneratePass->validatePassword($password);
2414 if (!$testpassword) {
2415 $this->
error = $modGeneratePass->error;
2423 $password_crypted =
dol_hash($password);
2427 if (!$changelater) {
2428 if (!is_object($this->oldcopy)) {
2429 $this->oldcopy = clone $this;
2434 $sql =
"UPDATE ".$this->db->prefix().
"user";
2435 $sql .=
" SET pass_crypted = '".$this->db->escape($password_crypted).
"',";
2436 $sql .=
" pass_temp = null";
2437 if (!empty($flagdelsessionsbefore)) {
2438 $sql .=
", flagdelsessionsbefore = '".$this->db->idate(
dol_now() - 5,
'gmt').
"'";
2441 $sql .=
", pass = null";
2443 $sql .=
", pass = '".$this->db->escape($password).
"'";
2445 $sql .=
" WHERE rowid = ".((int) $this->
id);
2447 dol_syslog(get_class($this).
"::setPassword", LOG_DEBUG);
2448 $result = $this->db->query($sql);
2450 if ($this->db->affected_rows($result)) {
2451 $this->pass = $password;
2452 $this->pass_indatabase = $password;
2453 $this->pass_indatabase_crypted = $password_crypted;
2455 if ($this->fk_member && !$nosyncmember) {
2456 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
2461 $result = $adh->fetch($this->fk_member);
2464 $result = $adh->setPassword($user, $this->pass, (!
getDolGlobalString(
'DATABASE_PWD_ENCRYPTED') ? 0 : 1), 1);
2465 if (is_int($result) && $result < 0) {
2466 $this->
error = $adh->error;
2471 $this->
error = $adh->error;
2476 dol_syslog(get_class($this).
"::setPassword notrigger=".$notrigger.
" error=".$error, LOG_DEBUG);
2478 if (!$error && !$notrigger) {
2480 $result = $this->
call_trigger(
'USER_NEW_PASSWORD', $user);
2483 $this->db->rollback();
2489 $this->db->commit();
2492 $this->db->rollback();
2496 $this->db->rollback();
2503 $sql =
"UPDATE ".$this->db->prefix().
"user";
2504 $sql .=
" SET pass_temp = '".$this->db->escape($password).
"'";
2505 $sql .=
" WHERE rowid = ".((int) $this->
id);
2507 dol_syslog(get_class($this).
"::setPassword", LOG_DEBUG);
2508 $result = $this->db->query($sql);
2530 global $conf, $langs, $mysoc;
2531 global $dolibarr_main_url_root;
2533 require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
2540 $outputlangs =
new Translate(
"", $conf);
2542 if (isset($this->
conf->MAIN_LANG_DEFAULT)
2543 && $this->conf->MAIN_LANG_DEFAULT !=
'auto') {
2544 $outputlangs->getDefaultLang($this->
conf->MAIN_LANG_DEFAULT);
2547 if ($this->
conf->MAIN_LANG_DEFAULT) {
2548 $outputlangs->setDefaultLang($this->
conf->MAIN_LANG_DEFAULT);
2550 $outputlangs = $langs;
2554 $outputlangs->loadLangs(array(
"main",
"errors",
"users",
"other"));
2556 $appli =
getDolGlobalString(
'MAIN_APPLICATION_TITLE', constant(
'DOL_APPLICATION_TITLE'));
2558 $subject =
'['.$appli.
'] '.$outputlangs->transnoentitiesnoconv(
"SubjectNewPassword", $appli);
2561 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
2562 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
2564 if (!$changelater) {
2565 $url = $urlwithroot.
'/';
2570 dol_syslog(get_class($this).
"::send_password changelater is off, url=".$url);
2572 $mesg .= $outputlangs->transnoentitiesnoconv(
"RequestToResetPasswordReceived").
".\n";
2573 $mesg .= $outputlangs->transnoentitiesnoconv(
"NewKeyIs").
" :\n\n";
2574 $mesg .= $outputlangs->transnoentitiesnoconv(
"Login").
" = ".$this->login.
"\n";
2575 $mesg .= $outputlangs->transnoentitiesnoconv(
"Password").
" = ".$password.
"\n\n";
2578 $mesg .= $outputlangs->transnoentitiesnoconv(
"ClickHereToGoTo", $appli).
': '.$url.
"\n\n";
2580 $mesg .= $user->getFullName($outputlangs);
2583 $url = $urlwithroot.
'/user/passwordforgotten.php?action=validatenewpassword';
2584 $url .=
'&username='.urlencode($this->login).
"&passworduidhash=".urlencode(
dol_hash($password.
'-'.$this->id.
'-'.$conf->file->instance_unique_id));
2585 if (isModEnabled(
'multicompany')) {
2586 $url .=
'&entity='.(!empty($this->entity) ? $this->entity : 1);
2589 dol_syslog(get_class($this).
"::send_password changelater is on, url=".$url);
2593 $mesg .= $outputlangs->transnoentitiesnoconv(
"RequestToResetPasswordReceived").
"<br>\n";
2594 $mesg .= $outputlangs->transnoentitiesnoconv(
"NewKeyWillBe").
" :<br>\n<br>\n";
2595 $mesg .=
'<strong>'.$outputlangs->transnoentitiesnoconv(
"Login").
"</strong> = ".$this->login.
"<br>\n";
2596 $mesg .=
'<strong>'.$outputlangs->transnoentitiesnoconv(
"Password").
"</strong> = ".$password.
"<br>\n<br>\n";
2598 $mesg .= $outputlangs->transnoentitiesnoconv(
"YouMustClickToChange").
" :<br>\n";
2599 $mesg .=
'<a href="'.$url.
'" rel="noopener">'.$outputlangs->transnoentitiesnoconv(
"ConfirmPasswordChange").
'</a>'.
"<br>\n<br>\n";
2600 $mesg .= $outputlangs->transnoentitiesnoconv(
"ForgetIfNothing").
"<br>\n<br>\n";
2603 $trackid =
'use'.$this->id;
2604 $sendcontext =
'password';
2609 $conf->global->MAIN_MAIL_EMAIL_FROM,
2625 if ($mailfile->sendfile()) {
2628 $langs->trans(
"errors");
2629 $this->
error = $langs->trans(
"ErrorFailedToSendPassword").
' '.$mailfile->error;
2641 return $this->error;
2654 $sql =
"SELECT url, login, pass, poste ";
2655 $sql .=
" FROM ".$this->db->prefix().
"user_clicktodial as u";
2656 $sql .=
" WHERE u.fk_user = ".((int) $this->
id);
2658 $resql = $this->db->query($sql);
2660 if ($this->db->num_rows($resql)) {
2661 $obj = $this->db->fetch_object($resql);
2663 $this->clicktodial_url = $obj->url;
2664 $this->clicktodial_login = $obj->login;
2665 $this->clicktodial_password = $obj->pass;
2666 $this->clicktodial_poste = $obj->poste;
2669 $this->clicktodial_loaded = 1;
2671 $this->db->free($resql);
2674 $this->
error = $this->db->error();
2690 $sql =
"DELETE FROM ".$this->db->prefix().
"user_clicktodial";
2691 $sql .=
" WHERE fk_user = ".((int) $this->
id);
2693 dol_syslog(get_class($this).
'::update_clicktodial', LOG_DEBUG);
2694 $result = $this->db->query($sql);
2696 $sql =
"INSERT INTO ".$this->db->prefix().
"user_clicktodial";
2697 $sql .=
" (fk_user,url,login,pass,poste)";
2698 $sql .=
" VALUES (".$this->id;
2699 $sql .=
", '".$this->db->escape($this->clicktodial_url).
"'";
2700 $sql .=
", '".$this->db->escape($this->clicktodial_login).
"'";
2701 $sql .=
", '".$this->db->escape($this->clicktodial_password).
"'";
2702 $sql .=
", '".$this->db->escape($this->clicktodial_poste).
"')";
2704 dol_syslog(get_class($this).
'::update_clicktodial', LOG_DEBUG);
2705 $result = $this->db->query($sql);
2707 $this->db->commit();
2710 $this->db->rollback();
2711 $this->
error = $this->db->lasterror();
2729 global $conf, $langs, $user;
2735 $sql =
"DELETE FROM ".$this->db->prefix().
"usergroup_user";
2736 $sql .=
" WHERE fk_user = ".((int) $this->
id);
2737 $sql .=
" AND fk_usergroup = ".((int) $group);
2738 $sql .=
" AND entity = ".((int) $entity);
2740 $result = $this->db->query($sql);
2742 $sql =
"INSERT INTO ".$this->db->prefix().
"usergroup_user (entity, fk_user, fk_usergroup)";
2743 $sql .=
" VALUES (".((int) $entity).
",".((int) $this->
id).
",".((int) $group).
")";
2745 $result = $this->db->query($sql);
2747 if (!$error && !$notrigger) {
2748 $this->context = array(
'audit' => $langs->trans(
"UserSetInGroup"),
'newgroupid' => $group);
2759 $this->db->commit();
2763 $this->db->rollback();
2767 $this->
error = $this->db->lasterror();
2768 $this->db->rollback();
2785 global $conf, $langs, $user;
2791 $sql =
"DELETE FROM ".$this->db->prefix().
"usergroup_user";
2792 $sql .=
" WHERE fk_user = ".((int) $this->
id);
2793 $sql .=
" AND fk_usergroup = ".((int) $group);
2794 if (empty($entity)) {
2795 $sql .=
" AND entity IN (0, 1)";
2797 $sql .=
" AND entity = ".((int) $entity);
2800 $result = $this->db->query($sql);
2802 if (!$error && !$notrigger) {
2803 $this->context = array(
'audit' => $langs->trans(
"UserRemovedFromGroup"),
'oldgroupid' => $group);
2814 $this->db->commit();
2817 dol_syslog(get_class($this).
"::RemoveFromGroup ".$this->
error, LOG_ERR);
2818 $this->db->rollback();
2822 $this->
error = $this->db->lasterror();
2823 $this->db->rollback();
2837 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
2844 if ($this->datestartvalidity && $this->datestartvalidity >
dol_get_last_hour($now)) {
2867 public function getPhotoUrl($width, $height, $cssclass =
'', $imagesize =
'')
2869 $result =
'<a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$this->
id.
'">';
2870 $result .=
Form::showphoto(
'userphoto', $this, $width, $height, 0, $cssclass, $imagesize);
2885 global $conf, $langs, $menumanager;
2886 global $dolibarr_main_demo;
2888 $infologin = $params[
'infologin'] ?? 0;
2889 $option = $params[
'option'] ??
'';
2892 if (!empty($this->photo)) {
2893 $photo =
'<div class="photointooltip floatright">';
2894 $photo .=
Form::showphoto(
'userphoto', $this, 0, 60, 0,
'photoref photowithmargin photologintooltip',
'small', 0, 1);
2896 $data[
'photo'] = $photo;
2901 $data[
'opendiv'] =
'<div class="centpercent divtooltip">';
2902 $data[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"User").
'</u> '.$this->
getLibStatut(4);
2904 if (!empty($this->login)) {
2907 if (!empty($this->job)) {
2911 if (!empty($this->office_phone) || !empty($this->office_fax) || !empty($this->fax)) {
2912 $phonelist = array();
2913 if ($this->office_phone) {
2914 $phonelist[] =
dol_print_phone($this->office_phone, $this->country_code, $this->
id, 0,
'',
' ',
'phone');
2916 if ($this->office_fax) {
2917 $phonelist[] =
dol_print_phone($this->office_fax, $this->country_code, $this->
id, 0,
'',
' ',
'fax');
2919 if ($this->user_mobile) {
2920 $phonelist[] =
dol_print_phone($this->user_mobile, $this->country_code, $this->
id, 0,
'',
' ',
'mobile');
2922 $data[
'phones'] =
'<br><b>'.$langs->trans(
'Phone').
':</b> '.implode(
' ', $phonelist);
2924 if (!empty($this->admin)) {
2925 $data[
'administrator'] =
'<br><b>'.$langs->trans(
"Administrator").
'</b>: '.
yn($this->admin);
2927 if (!empty($this->accountancy_code) || $option ==
'accountancy') {
2928 $langs->load(
"companies");
2929 $data[
'accountancycode'] =
'<br><b>'.$langs->trans(
"AccountancyCode").
'</b>: '.$this->accountancy_code;
2932 if (!empty($this->socid)) {
2933 $thirdpartystatic =
new Societe($this->db);
2934 $thirdpartystatic->fetch($this->socid);
2936 if (empty($params[
'hidethirdpartylogo'])) {
2937 $companyimg =
' '.$thirdpartystatic->getNomUrl(2, (($option ==
'nolink') ?
'nolink' :
''));
2939 $company =
' ('.$langs->trans(
"Company").
': '.($companyimg ? $companyimg :
img_picto(
'',
'company')).
' '.
dol_string_nohtmltag($thirdpartystatic->name).
')';
2941 $type = ($this->socid ? $langs->trans(
"ExternalUser").$company : $langs->trans(
"InternalUser"));
2942 $data[
'type'] =
'<br><b>'.$langs->trans(
"Type").
':</b> '.$type;
2943 $data[
'closediv'] =
'</div>';
2945 if ($infologin > 0) {
2946 $data[
'newlinelogin'] =
'<br>';
2947 $data[
'session'] =
'<br><u>'.$langs->trans(
"Session").
'</u>';
2950 $data[
'multicompany'] =
'<br><b>'.$langs->trans(
"ConnectedOnMultiCompany").
':</b> '.$conf->entity.
' (User entity '.$this->entity.
')';
2952 $data[
'authentication'] =
'<br><b>'.$langs->trans(
"AuthenticationMode").
':</b> '.
dol_string_nohtmltag($_SESSION[
"dol_authmode"].(empty($dolibarr_main_demo) ?
'' :
' (demo)'));
2953 $data[
'connectedsince'] =
'<br><b>'.$langs->trans(
"ConnectedSince").
':</b> '.
dol_print_date($this->datelastlogin,
"dayhour",
'tzuser');
2954 $data[
'previousconnexion'] =
'<br><b>'.$langs->trans(
"PreviousConnexion").
':</b> '.
dol_print_date($this->datepreviouslogin,
"dayhour",
'tzuser');
2955 $data[
'currenttheme'] =
'<br><b>'.$langs->trans(
"CurrentTheme").
':</b> '.
dol_string_nohtmltag($conf->theme);
2956 $data[
'currentmenumanager'] =
'<br><b>'.$langs->trans(
"CurrentMenuManager").
':</b> '.
dol_string_nohtmltag($menumanager->name);
2958 $data[
'currentuserlang'] =
'<br><b>'.$langs->trans(
"CurrentUserLanguage").
':</b> '.
dol_string_nohtmltag(($s ? $s.
' ' :
'').$langs->getDefaultLang());
2959 $data[
'browser'] =
'<br><b>'.$langs->trans(
"Browser").
':</b> '.
dol_string_nohtmltag($conf->browser->name.($conf->browser->version ?
' '.$conf->browser->version :
'').
' ('.$_SERVER[
'HTTP_USER_AGENT'].
')');
2960 $data[
'layout'] =
'<br><b>'.$langs->trans(
"Layout").
':</b> '.
dol_string_nohtmltag($conf->browser->layout);
2961 $data[
'screen'] =
'<br><b>'.$langs->trans(
"Screen").
':</b> '.
dol_string_nohtmltag($_SESSION[
'dol_screenwidth'].
' x '.$_SESSION[
'dol_screenheight']);
2962 if ($conf->browser->layout ==
'phone') {
2963 $data[
'phone'] =
'<br><b>'.$langs->trans(
"Phone").
':</b> '.$langs->trans(
"Yes");
2965 if (!empty($_SESSION[
"disablemodules"])) {
2966 $data[
'disabledmodules'] =
'<br><b>'.$langs->trans(
"DisabledModules").
':</b> <br>'.
dol_string_nohtmltag(implode(
', ', explode(
',', $_SESSION[
"disablemodules"])));
2988 public function getNomUrl($withpictoimg = 0, $option =
'', $infologin = 0, $notooltip = 0, $maxlen = 24, $hidethirdpartylogo = 0, $mode =
'', $morecss =
'', $save_lastsearch_value = -1)
2990 global $langs, $conf, $db, $hookmanager, $user;
2991 global $dolibarr_main_authentication, $dolibarr_main_demo;
2993 if (!$user->hasRight(
'user',
'user',
'read') && $user->id != $this->id) {
3004 'objecttype' => $this->element,
3005 'infologin' => $infologin,
3006 'option' => $option,
3007 'hidethirdpartylogo' => $hidethirdpartylogo,
3009 $classfortooltip =
'classfortooltip';
3012 $classfortooltip =
'classforajaxtooltip';
3013 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3020 if (!empty($this->socid)) {
3021 $thirdpartystatic =
new Societe($this->db);
3022 $thirdpartystatic->fetch($this->socid);
3023 if (empty($hidethirdpartylogo)) {
3024 $companylink =
' '.$thirdpartystatic->getNomUrl(2, (($option ==
'nolink') ?
'nolink' :
''));
3028 if ($infologin < 0) {
3032 $url = DOL_URL_ROOT.
'/user/card.php?id='.$this->id;
3033 if ($option ==
'leave') {
3034 $url = DOL_URL_ROOT.
'/holiday/list.php?id='.$this->id;
3037 if ($option !=
'nolink') {
3039 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3040 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3041 $add_save_lastsearch_values = 1;
3043 if ($add_save_lastsearch_values) {
3044 $url .=
'&save_lastsearch_values=1';
3048 $linkstart =
'<a href="'.$url.
'"';
3050 if (empty($notooltip)) {
3052 $langs->load(
"users");
3053 $label = $langs->trans(
"ShowUser");
3054 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
3056 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
3057 $linkclose .= $dataparams .
' class="'.$classfortooltip.($morecss ?
' '.$morecss :
'').
'"';
3059 $linkclose = ($morecss ?
' class="'.$morecss.
'"' :
'');
3062 $linkstart .= $linkclose.
'>';
3066 $result .= (($option ==
'nolink') ?
'' : $linkstart);
3067 if ($withpictoimg) {
3068 $paddafterimage =
'';
3069 if (abs((
int) $withpictoimg) == 1) {
3070 $paddafterimage =
'style="margin-'.($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right').
': 3px;"';
3073 if ($withpictoimg > 0) {
3074 $picto =
'<!-- picto user --><span class="nopadding userimg'.($morecss ?
' '.$morecss :
'').
'"><div class="valignmiddle userphoto inline-block center marginrightonlyshort"'.($paddafterimage ?
' '.$paddafterimage :
'').
'>'.
img_object(
'',
'user',
'class=""', 0, 0, $notooltip ? 0 : 1).
'</div></span>';
3077 $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>';
3081 if ($withpictoimg > -2 && $withpictoimg != 2) {
3083 $result .=
'<span class="nopadding usertext'.((!isset($this->
status) || $this->status) ?
'' :
' strikefordisabled').($morecss ?
' '.$morecss :
'').
'">';
3085 if ($mode ==
'login') {
3091 $result .=
'</span>';
3094 $result .= (($option ==
'nolink') ?
'' : $linkend);
3097 $result .= $companylink;
3100 $hookmanager->initHooks(array(
'userdao'));
3101 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
3102 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
3104 $result = $hookmanager->resPrint;
3106 $result .= $hookmanager->resPrint;
3121 public function getLoginUrl($withpictoimg = 0, $option =
'', $notooltip = 0, $morecss =
'')
3123 global $langs, $user;
3127 $linkstart =
'<a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$this->
id.
'">';
3131 if ((!$user->hasRight(
'user',
'user',
'lire') && $this->id != $user->id)) {
3135 if ($option ==
'xxx') {
3136 $linkstart =
'<a href="'.DOL_URL_ROOT.
'/user/card.php?id='.$this->
id.
'">';
3140 if ($option ==
'nolink') {
3145 $result .= $linkstart;
3146 if ($withpictoimg) {
3147 $paddafterimage =
'';
3148 if (abs($withpictoimg) == 1) {
3149 $paddafterimage =
'style="margin-'.($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right').
': 3px;"';
3152 if ($withpictoimg > 0) {
3153 $picto =
'<!-- picto user --><span class="nopadding userimg'.($morecss ?
' '.$morecss :
'').
'">'.
img_object(
'',
'user', $paddafterimage.
' '.($notooltip ?
'' :
'class="paddingright classfortooltip"'), 0, 0, $notooltip ? 0 : 1).
'</span>';
3156 $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>';
3160 $result .= $this->login;
3161 $result .= $linkend;
3190 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
3193 $this->labelStatus[self::STATUS_ENABLED] = $langs->transnoentitiesnoconv(
'Enabled');
3194 $this->labelStatus[self::STATUS_DISABLED] = $langs->transnoentitiesnoconv(
'Disabled');
3195 $this->labelStatusShort[self::STATUS_ENABLED] = $langs->transnoentitiesnoconv(
'Enabled');
3196 $this->labelStatusShort[self::STATUS_DISABLED] = $langs->transnoentitiesnoconv(
'Disabled');
3199 $statusType =
'status5';
3200 if ($status == self::STATUS_ENABLED) {
3201 $statusType =
'status4';
3204 $label = $this->labelStatus[$status];
3205 $labelshort = $this->labelStatusShort[$status];
3208 if (!empty($this->datestartvalidity) && $now < $this->datestartvalidity) {
3209 $statusType =
'status3';
3210 $label .=
' ('.$langs->trans(
"UserNotYetValid").
')';
3212 if (!empty($this->dateendvalidity) && $now > ($this->dateendvalidity + 24 * 3600 - 1)) {
3213 $statusType =
'status2';
3214 $label .=
' ('.$langs->trans(
"UserExpired").
')';
3217 return dolGetStatus($label, $labelshort,
'', $statusType, $mode);
3232 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3234 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3235 $return .=
'<div class="info-box info-box-sm">';
3236 $return .=
'<span class="info-box-icon bg-infobox-action">';
3239 if (!empty($this->photo)) {
3241 $label .=
Form::showphoto(
'userphoto', $this, 0, 60, 0,
'photokanban photoref photowithmargin photologintooltip',
'small', 0, 1);
3250 $return .=
'</span>';
3251 $return .=
'<div class="info-box-content">';
3252 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl(0,
'', 0, 0, 24, 0,
'',
'valignmiddle') : $this->ref);
3253 if (isModEnabled(
'multicompany') && $this->admin && !$this->entity) {
3254 $return .=
img_picto($langs->trans(
"SuperAdministratorDesc"),
'redstar',
'class="valignmiddle paddingright paddingleft"');
3255 } elseif ($this->admin) {
3256 $return .=
img_picto($langs->trans(
"AdministratorDesc"),
'star',
'class="valignmiddle paddingright paddingleft"');
3258 $return .=
'</span>';
3259 if ($selected >= 0) {
3260 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
3262 if (property_exists($this,
'label')) {
3263 $return .=
'<br><span class="info-box-label opacitymedium">'.$this->label.
'</span>';
3266 $return .=
'<br><span class="info-box-label opacitymedium small">'.img_picto(
'',
'email').
' '.$this->email.
'</span>';
3268 if (method_exists($this,
'getLibStatut')) {
3269 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
3271 $return .=
'</div>';
3272 $return .=
'</div>';
3273 $return .=
'</div>';
3297 } elseif ($mode == 1) {
3299 } elseif ($mode == 2) {
3315 global $conf, $langs;
3321 $keymodified =
false;
3330 'LDAP_FIELD_FULLNAME' =>
'fullname',
3331 'LDAP_FIELD_NAME' =>
'lastname',
3332 'LDAP_FIELD_FIRSTNAME' =>
'firstname',
3333 'LDAP_FIELD_LOGIN' =>
'login',
3334 'LDAP_FIELD_LOGIN_SAMBA' =>
'login',
3335 'LDAP_FIELD_PHONE' =>
'office_phone',
3336 'LDAP_FIELD_MOBILE' =>
'user_mobile',
3337 'LDAP_FIELD_FAX' =>
'office_fax',
3338 'LDAP_FIELD_MAIL' =>
'email',
3339 'LDAP_FIELD_SID' =>
'ldap_sid',
3343 foreach ($ldapkey as $constname => $varname) {
3349 if (is_object($this->oldcopy) && !$this->oldcopy->isEmpty() && $this->$varname != $this->oldcopy->$varname) {
3350 $keymodified =
true;
3355 foreach ($socialnetworks as $key => $value) {
3356 if (!empty($this->socialnetworks[$value[
'label']]) &&
getDolGlobalString(
'LDAP_FIELD_'.strtoupper($value[
'label']))) {
3357 $info[
getDolGlobalString(
'LDAP_FIELD_'.strtoupper($value[
'label']))] = $this->socialnetworks[$value[
'label']];
3372 if ($this->socid > 0) {
3373 $soc =
new Societe($this->db);
3374 $soc->fetch($this->socid);
3377 if ($soc->client == 1) {
3378 $info[
"businessCategory"] =
"Customers";
3380 if ($soc->client == 2) {
3381 $info[
"businessCategory"] =
"Prospects";
3383 if ($soc->fournisseur == 1) {
3384 $info[
"businessCategory"] =
"Suppliers";
3389 if (!empty($this->pass)) {
3402 if ($this->pass_indatabase_crypted &&
getDolGlobalString(
'LDAP_FIELD_PASSWORD_CRYPTED')) {
3406 } elseif (!empty($this->pass_indatabase)) {
3418 $info[
"objectclass"][4] =
"phpgwContact";
3420 $info[
'uidnumber'] = $this->id;
3422 $info[
'phpgwTz'] = 0;
3423 $info[
'phpgwMailType'] =
'INTERNET';
3424 $info[
'phpgwMailHomeType'] =
'INTERNET';
3426 $info[
"phpgwContactTypeId"] =
'n';
3427 $info[
"phpgwContactCatId"] = 0;
3428 $info[
"phpgwContactAccess"] =
"public";
3436 $info[
"phpgwContactOwner"] = 1;
3439 $info[
"rfc822Mailbox"] = $this->email;
3441 if ($this->user_mobile) {
3442 $info[
"phpgwCellTelephoneNumber"] = $this->user_mobile;
3451 $groupslist = $usergroup->listGroupsForUser($this->
id);
3453 if (!empty($groupslist)) {
3454 foreach ($groupslist as $groupforuser) {
3461 $info[
getDolGlobalString(
'LDAP_FIELD_HOMEDIRECTORY')] =
"{$conf->global->LDAP_FIELD_HOMEDIRECTORYPREFIX}/$this->login";
3477 global $user, $langs;
3483 $this->
ref =
'SPECIMEN';
3484 $this->specimen = 1;
3486 $this->lastname =
'DOLIBARR';
3487 $this->firstname =
'SPECIMEN';
3488 $this->gender =
'man';
3489 $this->note_public =
'This is a note public';
3490 $this->note_private =
'This is a note private';
3491 $this->email =
'email@specimen.com';
3492 $this->personal_email =
'personalemail@specimen.com';
3493 $this->socialnetworks = array(
3494 'skype' =>
'skypepseudo',
3495 'twitter' =>
'twitterpseudo',
3496 'facebook' =>
'facebookpseudo',
3497 'linkedin' =>
'linkedinpseudo',
3499 $this->office_phone =
'0999999999';
3500 $this->office_fax =
'0999999998';
3501 $this->user_mobile =
'0999999997';
3502 $this->personal_mobile =
'0999999996';
3504 $this->login =
'dolibspec';
3505 $this->pass =
'dolibSpec+@123';
3508 $this->datec = $now;
3509 $this->datem = $now;
3511 $this->datelastlogin = $now;
3512 $this->iplastlogin =
'127.0.0.1';
3513 $this->datepreviouslogin = $now;
3514 $this->ippreviouslogin =
'127.0.0.1';
3531 $sql =
"SELECT u.rowid, u.login as ref, u.datec,";
3532 $sql .=
" u.tms as date_modification, u.entity";
3533 $sql .=
" FROM ".$this->db->prefix().
"user as u";
3534 $sql .=
" WHERE u.rowid = ".((int) $id);
3536 $result = $this->db->query($sql);
3538 if ($this->db->num_rows($result)) {
3539 $obj = $this->db->fetch_object($result);
3541 $this->
id = $obj->rowid;
3543 $this->
ref = (!$obj->ref) ? $obj->rowid : $obj->ref;
3544 $this->date_creation = $this->db->jdate($obj->datec);
3545 $this->date_modification = $this->db->jdate($obj->date_modification);
3546 $this->entity = $obj->entity;
3549 $this->db->free($result);
3563 $sql =
"SELECT count(mc.email) as nb";
3564 $sql .=
" FROM ".$this->db->prefix().
"mailing_cibles as mc";
3565 $sql .=
" WHERE mc.email = '".$this->db->escape($this->email).
"'";
3566 $sql .=
" AND mc.statut NOT IN (-1,0)";
3568 $resql = $this->db->query($sql);
3570 $obj = $this->db->fetch_object($resql);
3573 $this->db->free($resql);
3576 $this->
error = $this->db->error();
3593 $sql =
"SELECT count(rowid) as nb";
3594 $sql .=
" FROM ".$this->db->prefix().
"user";
3595 if ($option ==
'superadmin') {
3596 $sql .=
" WHERE entity = 0";
3598 $sql .=
" WHERE entity IN (".getEntity(
'user', 0).
")";
3599 if ($limitTo ==
'active') {
3600 $sql .=
" AND statut = 1";
3604 $sql .=
" AND admin = ".(int) $admin;
3607 $resql = $this->db->query($sql);
3609 $obj = $this->db->fetch_object($resql);
3610 $nb = (int) $obj->nb;
3612 $this->db->free($resql);
3615 $this->
error = $this->db->lasterror();
3631 global $user, $conf;
3636 $this->firstname = $ldapuser->$tmpvar;
3638 $this->lastname = $ldapuser->$tmpvar;
3640 $this->login = $ldapuser->$tmpvar;
3642 $this->pass = $ldapuser->$tmpvar;
3644 $this->pass_indatabase_crypted = $ldapuser->$tmpvar;
3647 $this->office_phone = $ldapuser->$tmpvar;
3649 $this->user_mobile = $ldapuser->$tmpvar;
3651 $this->office_fax = $ldapuser->$tmpvar;
3653 $this->email = $ldapuser->$tmpvar;
3654 foreach ($socialnetworks as $key => $value) {
3656 $this->socialnetworks[$value[
'label']] = $ldapuser->$tmpvar;
3659 $this->ldap_sid = $ldapuser->$tmpvar;
3662 $this->job = $ldapuser->$tmpvar;
3664 $this->note_public = $ldapuser->$tmpvar;
3666 $result = $this->
update($user);
3668 dol_syslog(get_class($this).
"::update_ldap2dolibarr result=".$result, LOG_DEBUG);
3684 $sql =
"SELECT rowid FROM ".$this->db->prefix().
"user";
3685 $sql .=
" WHERE fk_user = ".((int) $this->
id);
3687 dol_syslog(get_class($this).
"::get_children", LOG_DEBUG);
3688 $res = $this->db->query($sql);
3691 while ($rec = $this->db->fetch_array($res)) {
3692 $user =
new User($this->db);
3693 $user->fetch($rec[
'rowid']);
3713 $this->parentof = array();
3716 $sql =
"SELECT fk_user as id_parent, rowid as id_son";
3717 $sql .=
" FROM ".$this->db->prefix().
"user";
3718 $sql .=
" WHERE fk_user <> 0";
3719 $sql .=
" AND entity IN (".getEntity(
'user').
")";
3721 dol_syslog(get_class($this).
"::loadParentOf", LOG_DEBUG);
3722 $resql = $this->db->query($sql);
3724 while ($obj = $this->db->fetch_object($resql)) {
3725 $this->parentof[$obj->id_son] = $obj->id_parent;
3751 global $conf, $user;
3752 global $hookmanager;
3755 $hookmanager->initHooks(array(
'userdao'));
3757 $this->users = array();
3763 $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";
3764 $sql .=
" FROM ".$this->db->prefix().
"user as u";
3766 $parameters = array();
3767 $reshook = $hookmanager->executeHooks(
'printUserListWhere', $parameters);
3769 $sql .= $hookmanager->resPrint;
3771 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
3774 $sql .=
" AND ".$filter;
3777 dol_syslog(get_class($this).
"::get_full_tree get user list", LOG_DEBUG);
3778 $resql = $this->db->query($sql);
3781 while ($obj = $this->db->fetch_object($resql)) {
3782 $this->users[$obj->rowid][
'rowid'] = $obj->rowid;
3783 $this->users[$obj->rowid][
'id'] = $obj->rowid;
3784 $this->users[$obj->rowid][
'fk_user'] = $obj->fk_user;
3785 $this->users[$obj->rowid][
'fk_soc'] = $obj->fk_soc;
3786 $this->users[$obj->rowid][
'firstname'] = $obj->firstname;
3787 $this->users[$obj->rowid][
'lastname'] = $obj->lastname;
3788 $this->users[$obj->rowid][
'login'] = $obj->login;
3789 $this->users[$obj->rowid][
'statut'] = $obj->statut;
3790 $this->users[$obj->rowid][
'entity'] = $obj->entity;
3791 $this->users[$obj->rowid][
'email'] = $obj->email;
3792 $this->users[$obj->rowid][
'gender'] = $obj->gender;
3793 $this->users[$obj->rowid][
'admin'] = $obj->admin;
3794 $this->users[$obj->rowid][
'photo'] = $obj->photo;
3796 $this->users[$obj->rowid][
'fullpath'] =
'';
3797 $this->users[$obj->rowid][
'fullname'] =
'';
3798 $this->users[$obj->rowid][
'level'] = 0;
3807 dol_syslog(get_class($this).
"::get_full_tree call to build_path_from_id_user", LOG_DEBUG);
3808 foreach ($this->users as $key => $val) {
3811 $this->
error =
'ErrorLoopInHierarchy';
3817 if ($deleteafterid) {
3819 $keyfilter1 =
'^'.$deleteafterid.
'$';
3820 $keyfilter2 =
'_'.$deleteafterid.
'$';
3821 $keyfilter3 =
'^'.$deleteafterid.
'_';
3822 $keyfilter4 =
'_'.$deleteafterid.
'_';
3823 foreach (array_keys($this->users) as $key) {
3824 $fullpath = (string) $this->users[$key][
'fullpath'];
3825 if (preg_match(
'/'.$keyfilter1.
'/', $fullpath) || preg_match(
'/'.$keyfilter2.
'/', $fullpath)
3826 || preg_match(
'/'.$keyfilter3.
'/', $fullpath) || preg_match(
'/'.$keyfilter4.
'/', $fullpath)) {
3827 unset($this->users[$key]);
3832 dol_syslog(get_class($this).
"::get_full_tree dol_sort_array", LOG_DEBUG);
3833 $this->users =
dol_sort_array($this->users,
'fullname',
'asc', 1, 0, 1);
3837 return $this->users;
3850 $childids = array();
3852 if (isset($this->cache_childids[$this->
id])) {
3853 $childids = $this->cache_childids[$this->id];
3858 $idtoscan = $this->id;
3860 dol_syslog(
"Build childid for id = ".$idtoscan);
3861 foreach ($this->users as $id => $val) {
3863 if (preg_match(
'/_'.$idtoscan.
'_/', $val[
'fullpath'])) {
3864 $childids[$val[
'id']] = $val[
'id'];
3868 $this->cache_childids[$this->id] = $childids;
3870 if ($addcurrentuser) {
3871 $childids[$this->id] = $this->id;
3891 if (!empty($this->users[$id_user][
'fullpath'])) {
3893 dol_syslog(get_class($this).
"::build_path_from_id_user fullpath and fullname already defined", LOG_WARNING);
3898 $this->users[$id_user][
'fullpath'] =
'_'.$id_user;
3899 $this->users[$id_user][
'fullname'] = $this->users[$id_user][
'lastname'];
3901 $cursor_user = $id_user;
3903 $useridfound = array($id_user);
3904 while (!empty($this->parentof[$cursor_user]) && !empty($this->users[$this->parentof[$cursor_user]])) {
3905 if (in_array($this->parentof[$cursor_user], $useridfound)) {
3906 dol_syslog(
"The hierarchy of user has a recursive loop", LOG_WARNING);
3909 $useridfound[] = $this->parentof[$cursor_user];
3910 $this->users[$id_user][
'fullpath'] =
'_'.$this->parentof[$cursor_user].$this->users[$id_user][
'fullpath'];
3911 $this->users[$id_user][
'fullname'] = $this->users[$this->parentof[$cursor_user]][
'lastname'].
' >> '.$this->users[$id_user][
'fullname'];
3913 $cursor_user = $this->parentof[$cursor_user];
3917 $this->users[$id_user][
'level'] =
dol_strlen(preg_replace(
'/[^_]/i',
'', $this->users[$id_user][
'fullpath']));
3949 $this->nb = array();
3951 $sql =
"SELECT COUNT(DISTINCT u.rowid) as nb";
3952 $sql .=
" FROM ".$this->db->prefix().
"user as u";
3953 if (isModEnabled(
'multicompany') &&
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE')) {
3954 $sql .=
", ".$this->db->prefix().
"usergroup_user as ug";
3955 $sql .=
" WHERE ug.entity IN (".getEntity(
'usergroup').
")";
3956 $sql .=
" AND ug.fk_user = u.rowid";
3958 $sql .=
" WHERE u.entity IN (".getEntity(
'user').
")";
3960 $sql .=
" AND u.statut > 0";
3963 $resql = $this->db->query($sql);
3965 while ($obj = $this->db->fetch_object($resql)) {
3966 $this->nb[
"users"] = $obj->nb;
3968 $this->db->free($resql);
3972 $this->
error = $this->db->error();
3988 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3990 global $conf, $user, $langs;
3992 $langs->load(
"user");
3999 $modele =
'bluesky';
4003 $modelpath =
"core/modules/user/doc/";
4005 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4019 $user_property =
'';
4021 if (empty($rowid)) {
4025 $sql =
"SELECT rowid, email, user_mobile, civility, lastname, firstname";
4026 $sql .=
" FROM ".$this->db->prefix().
"user";
4027 $sql .=
" WHERE rowid = ".((int) $rowid);
4029 $resql = $this->db->query($sql);
4031 $nump = $this->db->num_rows($resql);
4034 $obj = $this->db->fetch_object($resql);
4036 if ($mode ==
'email') {
4037 $user_property =
dolGetFirstLastname($obj->firstname, $obj->lastname).
" <".$obj->email.
">";
4038 } elseif ($mode ==
'mobile') {
4039 $user_property = $obj->user_mobile;
4040 } elseif ($mode ==
'name') {
4044 return $user_property;
4061 global $dolibarr_main_url_root;
4064 $encodedsecurekey =
dol_hash($conf->file->instance_unique_id.
'uservirtualcard'.$this->id.
'-'.$this->login,
'md5');
4065 if (isModEnabled(
'multicompany')) {
4066 $entity_qr =
'&entity='.((int) $conf->entity);
4071 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
4072 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
4075 if ($typeofurl ==
'internal') {
4076 $urlwithroot = DOL_URL_ROOT;
4079 return $urlwithroot.
'/public/users/view.php?id='.$this->
id.
'&securekey='.$encodedsecurekey.$entity_qr.($mode ?
'&mode='.urlencode($mode) :
'');
4095 public function fetchAll($sortorder =
'', $sortfield =
'', $limit = 0, $offset = 0, $filter =
'', $filtermode =
'AND', $entityfilter =
false)
4097 global $conf, $user;
4099 $sql =
"SELECT t.rowid";
4100 $sql .=
' FROM '.$this->db->prefix().$this->table_element.
' as t ';
4102 if ($entityfilter) {
4104 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
4105 $sql .=
" WHERE t.entity IS NOT NULL";
4107 $sql .=
",".$this->db->prefix().
"usergroup_user as ug";
4108 $sql .=
" WHERE ((ug.fk_user = t.rowid";
4109 $sql .=
" AND ug.entity IN (".getEntity(
'usergroup').
"))";
4110 $sql .=
" OR t.entity = 0)";
4113 $sql .=
" WHERE t.entity IN (".getEntity(
'user').
")";
4116 $sql .=
" WHERE 1 = 1";
4122 if ($errormessage) {
4123 $this->errors[] = $errormessage;
4124 dol_syslog(__METHOD__.
' '.implode(
',', $this->errors), LOG_ERR);
4128 $sql .= $this->db->order($sortfield, $sortorder);
4130 $sql .= $this->db->plimit($limit + 1, $offset);
4135 $resql = $this->db->query($sql);
4137 $this->users = array();
4138 $num = $this->db->num_rows($resql);
4140 while ($obj = $this->db->fetch_object($resql)) {
4141 $line =
new self($this->db);
4142 $result = $line->fetch($obj->rowid);
4143 if ($result > 0 && !empty($line->id)) {
4144 $this->users[$obj->rowid] = clone $line;
4147 $this->db->free($resql);
4151 $this->errors[] = $this->db->lasterror();
4163 private $findUserIdByEmailCache;
4177 if (isset($this->findUserIdByEmailCache[$email])) {
4178 return $this->findUserIdByEmailCache[$email];
4181 $this->findUserIdByEmailCache[$email] = -1;
4183 $sql =
'SELECT rowid';
4184 $sql .=
' FROM '.$this->db->prefix().
'user';
4185 if (
getDolGlobalString(
'AGENDA_DISABLE_EXACT_USER_EMAIL_COMPARE_FOR_EXTERNAL_CALENDAR')) {
4186 $sql .=
" WHERE email LIKE '%".$this->db->escape($this->db->escapeforlike($email)).
"%'";
4188 $sql .=
" WHERE email = '".$this->db->escape($email).
"'";
4192 $resql = $this->db->query($sql);
4197 $obj = $this->db->fetch_object($resql);
4202 $this->findUserIdByEmailCache[$email] = (int) $obj->rowid;
4204 return $this->findUserIdByEmailCache[$email];
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Class to manage members of a foundation.
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage Dolibarr database access.
Class to manage warehouses.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage user groups.
Class to manage Dolibarr users.
fetch($id=0, $login='', $sid='', $loadpersonalconf=0, $entity=-1, $email='', $fk_socpeople=0, $use_email_oauth2=0)
Load a user from database with its id or ref (login).
SetInGroup($group, $entity, $notrigger=0)
Add user into a group.
LibStatut($status, $mode=0)
Return the label of a status of user (active, inactive)
loadRights($moduletag='', $forcereload=0)
Load permissions granted to a user->id into object user->rights.
get_children()
Return and array with all instantiated first level children users of current user.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
loadStateBoard()
Load metrics this->nb for dashboard.
hasRight($module, $permlevel1, $permlevel2='')
Return if a user has a permission.
info($id)
Load info of user object.
create_from_contact($contact, $login='', $password='')
Create a user from a contact object.
setstatus($status)
Change status of a user.
get_full_tree($deleteafterid=0, $filter='')
Build the hierarchy/tree of users into an array.
_load_ldap_info()
Initialize the info array (array of LDAP values) that will be used to call LDAP functions.
delrights($rid, $allmodule='', $allperms='', $entity=0, $notrigger=0)
Remove a right to the user.
update_last_login_date()
Update the user's last login date in the database.
__construct($db)
Constructor of the class.
RemoveFromGroup($group, $entity, $notrigger=0)
Remove a user from a group.
isNotIntoValidityDateRange()
Return a link with photo Use this->id,this->photo.
getNbOfUsers($limitTo, $option='', $admin=-1)
Return number of existing users.
set_default_rights()
Assign rights by default.
fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, $filter='', $filtermode='AND', $entityfilter=false)
Load all objects into $this->users.
getOnlineVirtualCardUrl($mode='', $typeofurl='external')
Return string with full Url to virtual card.
update($user, $notrigger=0, $nosyncmember=0, $nosyncmemberpass=0, $nosynccontact=0)
Update a user into database (and also password if this->pass is defined)
getLoginUrl($withpictoimg=0, $option='', $notooltip=0, $morecss='')
Return clickable link of login (optionally with picto)
setCategories($categories)
Sets object to supplied categories.
loadParentOf()
Load this->parentof that is array(id_son=>id_parent, ...)
fetch_clicktodial()
Read clicktodial information for user.
build_path_from_id_user($id_user, $protection=0)
For user id_user and its children available in this->users, define property fullpath and fullname.
error()
Renvoie la derniere erreur fonctionnelle de manipulation de l'objet.
getAllChildIds($addcurrentuser=0)
Return list of all child user ids in hierarchy (all sublevels).
initAsSpecimen()
Initialise an instance with random values.
setPassword($user, $password='', $changelater=0, $notrigger=0, $nosyncmember=0, $passwordalreadycrypted=0, $flagdelsessionsbefore=1)
Change password of a user.
getNomUrl($withpictoimg=0, $option='', $infologin=0, $notooltip=0, $maxlen=24, $hidethirdpartylogo=0, $mode='', $morecss='', $save_lastsearch_value=-1)
Return a HTML link to the user card (with optionally the picto) Use this->id,this->lastname,...
clearrights()
Clear all permissions array of user.
update_clicktodial()
Update clicktodial info.
getLibStatut($mode=0)
Return the label of the status of user (active, inactive)
create_from_member($member, $login='')
Create a user into database from a member object.
loadPersonalConf()
Load const values from database table user_param and set it into user->conf->XXX.
_load_ldap_dn($info, $mode=0)
Retourne chaine DN complete dans l'annuaire LDAP pour l'objet.
$clicktodial_url
@string clicktodial url
loadDefaultValues()
Load default values from database table into property ->default_values.
getPhotoUrl($width, $height, $cssclass='', $imagesize='')
Return a link with photo Use this->id,this->photo.
update_ldap2dolibarr(&$ldapuser)
Update user using data from the LDAP.
getrights($moduletag='', $forcereload=0)
Load permissions granted to a user->id into object user->rights TODO Remove this method.
user_get_property($rowid, $mode)
Return property of user from its id.
send_password($user, $password='', $changelater=0)
Send a new password (or instructions to reset it) by email.
getKanbanView($option='', $arraydata=null)
Return clicable link of object (optionally with picto)
getNbOfEMailings()
Return number of mass Emailing received by this contacts with its email.
addrights($rid, $allmodule='', $allperms='', $entity=0, $notrigger=0)
Add a right to the user.
create($user, $notrigger=0)
Create a user into database.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
findUserIdByEmail($email)
Find a user by the given e-mail and return it's user id when found.
getTooltipContentArray($params)
Return array of data to show into tooltips.
trait CommonPeople
Support class for thirdparties, contacts, members, users or resources.
getFullName($langs, $option=0, $nameorder=-1, $maxlen=0)
Return full name (civility+' '+name+' '+lastname)
setUpperOrLowerCase()
Set to upper or ucwords/lower if needed.
dol_get_first_hour($date, $gm='tzserver')
Return GMT time for first hour of a given GMT date (it removes hours, min and second part)
dol_get_last_hour($date, $gm='tzserver')
Return GMT time for last hour of a given GMT date (it replaces hours, min and second part to 23:59:59...
dol_buildlogin($lastname, $firstname)
Build a login from lastname, firstname.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='')
Format phone numbers according to country.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
getArrayOfSocialNetworks()
Get array of social network dictionary.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
getUserRemoteIP()
Return the IP of remote user.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
conf($dolibarr_main_document_root)
Load conf file (file must exists)
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
dolEncrypt($chain, $key='', $ciphering='AES-256-CTR', $forceseed='')
Encode a string with a symmetric encryption.
dol_verifyHash($chain, $hash, $type='0')
Compute a hash and compare it to the given one For backward compatibility reasons,...
dolGetLdapPasswordHash($password, $type='md5')
Returns a specific ldap hash of a password.
dolDecrypt($chain, $key='')
Decode a string with a symmetric encryption.
dol_hash($chain, $type='0', $nosalt=0)
Returns a hash (non reversible encryption) of a string.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut