40require
'../main.inc.php';
52require_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
53require_once DOL_DOCUMENT_ROOT.
'/user/class/usergroup.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
57require_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
58require_once DOL_DOCUMENT_ROOT.
'/core/lib/usergroups.lib.php';
59require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formadmin.class.php';
60require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
61require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
62require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
63require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
65 require_once DOL_DOCUMENT_ROOT.
'/core/class/ldap.class.php';
68 require_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
71 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
74 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
78$langs->loadLangs(array(
'users',
'companies',
'ldap',
'admin',
'hrm',
'stocks',
'other'));
81$action =
GETPOST(
'action',
'aZ09');
82$mode =
GETPOST(
'mode',
'alpha');
83$confirm =
GETPOST(
'confirm',
'alpha');
85$cancel =
GETPOST(
'cancel',
'alpha');
86$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'usercard';
87$backtopage =
GETPOST(
'backtopage');
88$backtopageforcancel =
GETPOST(
'backtopageforcancel');
89$forcepasswordchange =
GETPOSTINT(
'forcepasswordchange');
91if (empty($id) && $action !=
'add' && $action !=
'create') {
101$childids = $user->getAllChildIds(1);
106$extrafields->fetch_name_optionals_label(
$object->table_element);
111$hookmanager->initHooks(array(
'usercard',
'globalcard'));
118 $res =
$object->fetch($id,
'',
'', 1);
123if ($user->socid > 0) {
124 $socid = $user->socid;
130$permissiontoadd = (!empty($user->admin) || $user->hasRight(
"user",
"user",
"write")) && (empty($user->socid) || $user->socid ==
$object->socid);
131$permissiontoread = (!empty($user->admin) || $user->hasRight(
"user",
"user",
"read")) && (empty($user->socid) || $user->socid ==
$object->socid);
132$permissiontoedit = (!empty($user->admin) || $user->hasRight(
"user",
"user",
"write")) && (empty($user->socid) || $user->socid ==
$object->socid);
133$permissiontodisable = (!empty($user->admin) || $user->hasRight(
"user",
"user",
"delete")) && (empty($user->socid) || $user->socid ==
$object->socid);
134$permissiontoreadgroup = $permissiontoread;
135$permissiontoeditgroup = $permissiontoedit;
137 $permissiontoreadgroup = (!empty($user->admin) || $user->hasRight(
"user",
"group_advance",
"read")) && (empty($user->socid) || $user->socid ==
$object->socid);
138 $permissiontoeditgroup = (!empty($user->admin) || $user->hasRight(
"user",
"group_advance",
"write")) && (empty($user->socid) || $user->socid ==
$object->socid);
141$permissiontoclonesuperadmin = ($permissiontoadd && empty($user->entity));
142$permissiontocloneadmin = ($permissiontoadd && !empty($user->admin));
143$permissiontocloneuser = $permissiontoadd;
146 $permissiontoclonesuperadmin =
false;
147 $permissiontocloneadmin =
false;
148 $permissiontocloneuser =
false;
151if ($user->id != $id && !$permissiontoread) {
155$caneditpasswordandsee =
false;
156$caneditpasswordandsend =
false;
159$permissiontoeditpasswordandsee =
false;
160$permissiontoeditpasswordandsend =
false;
163 $permissiontoedit = ((($user->id ==
$id) && $user->hasRight(
"user",
"self",
"write")) || (($user->id != $id) && $user->hasRight(
"user",
"user",
"write"))) && (empty($user->socid) || $user->socid ==
$object->socid);
164 $permissiontoeditpasswordandsee = ((($user->id ==
$id) && $user->hasRight(
"user",
"self",
"password")) || (($user->id != $id) && $user->hasRight(
"user",
"user",
"password") && $user->admin))&& (empty($user->socid) || $user->socid ==
$object->socid);
165 $permissiontoeditpasswordandsend = ((($user->id ==
$id) && $user->hasRight(
"user",
"self",
"password")) || (($user->id != $id) && $user->hasRight(
"user",
"user",
"password")))&& (empty($user->socid) || $user->socid ==
$object->socid);
169$permissiontoseesalary = (empty($user->socid) && (
170 (
isModEnabled(
'salaries') && $user->hasRight(
"salaries",
"read") && (
$id == 0 || in_array($id, $childids)))
171 || (
isModEnabled(
'salaries') && $user->hasRight(
"salaries",
"readall"))
172 || (
isModEnabled(
'hrm') && $user->hasRight(
"hrm",
"employee",
"read")))
175$passwordismodified =
false;
183$parameters = array(
'id' => $id,
'socid' => $socid,
'group' => $group,
'caneditgroup' => $permissiontoeditgroup);
184$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
189if (empty($reshook)) {
190 $backurlforlist = DOL_URL_ROOT.
'/user/list.php';
192 if (empty($backtopage) || ($cancel && empty($id))) {
193 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
194 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
195 $backtopage = $backurlforlist;
197 $backtopage = DOL_URL_ROOT.
'/user/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
203 if (!empty($backtopageforcancel)) {
204 header(
"Location: ".$backtopageforcancel);
206 } elseif (!empty($backtopage)) {
207 header(
"Location: ".$backtopage);
213 if ($action ==
'confirm_disable' && $confirm ==
"yes" && $permissiontodisable) {
214 if ($id != $user->id) {
216 if (
$object->admin && empty($user->admin)) {
219 setEventMessages($langs->trans(
"OnlyAdminUsersCanDisableAdminUsers"),
null,
'errors');
222 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$id);
228 if ($action ==
'confirm_enable' && $confirm ==
"yes" && $permissiontodisable) {
231 if ($id != $user->id) {
234 if (!empty(
$conf->file->main_limit_users)) {
235 $nb =
$object->getNbOfUsers(
"active");
236 if ($nb >=
$conf->file->main_limit_users) {
238 setEventMessages($langs->trans(
"YourQuotaOfUsersIsReached"),
null,
'errors');
244 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$id);
250 if ($action ==
'confirm_delete' && $confirm ==
"yes" && $permissiontodisable) {
251 if ($id != $user->id) {
252 if (!GETPOSTISSET(
'token')) {
253 print
'Error, token required for this critical operation';
259 if (
$object->admin && empty($user->admin)) {
262 setEventMessages($langs->trans(
"OnlyAdminUsersCanDeleteAdminUsers"),
null,
'errors');
263 } elseif (
$object->admin && empty(
$object->entity) && !empty($user->entity)) {
266 setEventMessages($langs->trans(
"OnlySuperAdminUsersCanDeleteSuperAdminUsers"),
null,
'errors');
270 $result =
$object->delete($user);
272 $langs->load(
"errors");
276 header(
"Location: ".DOL_URL_ROOT.
"/user/list.php?restore_lastsearch_values=1");
284 if ($action ==
'add' && $permissiontoadd) {
298 if (!empty(
$conf->file->main_limit_users)) {
299 $nb =
$object->getNbOfUsers(
"active");
300 if ($nb >=
$conf->file->main_limit_users) {
302 setEventMessages($langs->trans(
"YourQuotaOfUsersIsReached"),
null,
'errors');
312 $object->national_registration_number =
GETPOST(
"national_registration_number",
'alphanohtml');
327 $object->socialnetworks = array();
328 foreach ($socialnetworks as $key => $value) {
329 if (
GETPOST($key,
'alphanohtml')) {
335 $object->email = preg_replace(
'/\s+/',
'',
GETPOST(
"email",
'alphanohtml'));
342 if (
$object->signature ===
'ErrorTooManyLinksIntoHTMLString') {
344 $langs->load(
"errors");
345 setEventMessages($langs->trans(
'ErrorTooManyLinksIntoHTMLString'),
null,
'errors');
348 $object->accountancy_code =
GETPOST(
"accountancy_code",
'alphanohtml');
357 if ($permissiontoseesalary) {
370 $object->color =
GETPOST(
"color",
'alphanohtml') !=
'' ? str_replace(
'#',
'', (
string)
GETPOST(
"color",
'alphanohtml')) :
'';
372 $object->dateemployment = $dateemployment;
373 $object->dateemploymentend = $dateemploymentend;
374 $object->datestartvalidity = $datestartvalidity;
375 $object->dateendvalidity = $dateendvalidity;
377 $object->force_pass_change = $forcepasswordchange;
384 $ret = $extrafields->setOptionalsFromPost(
null, $object);
398 $object->entity = ($entity ==
'' ? 1 : $entity);
402 $object->entity = ($entity ==
'' ? 1 : $entity);
413 if (
GETPOST(
'password',
'password')) {
414 $resPass =
$object->setPassword($user,
GETPOST(
'password',
'password'));
416 if (is_int($resPass) && $resPass < 0) {
417 $langs->load(
"errors");
424 $usercats =
GETPOST(
'usercats',
'array:int');
425 $object->setCategories($usercats);
429 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$id);
433 $langs->load(
"errors");
442 if (($action ==
'addgroup' || $action ==
'removegroup') && $permissiontoeditgroup) {
445 $editgroup->fetch($group);
446 $editgroup->oldcopy = clone $editgroup;
450 if ($action ==
'addgroup') {
451 $result =
$object->SetInGroup($group, $editgroup->entity);
453 if ($action ==
'removegroup') {
454 $result =
$object->RemoveFromGroup($group, $editgroup->entity);
465 if ($action ==
'update' && ($permissiontoedit || $permissiontoeditpasswordandsee)) {
466 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
468 if ($permissiontoedit) {
471 if (!
GETPOST(
"lastname",
'alpha')) {
476 if (!
GETPOST(
"login",
'alpha')) {
493 if (GETPOSTISSET(
"ref_employee")) {
497 if (GETPOSTISSET(
"national_registration_number")) {
498 $object->national_registration_number =
GETPOST(
"national_registration_number",
'alphanohtml');
501 if ($permissiontoeditpasswordandsee) {
504 if ($permissiontoeditpasswordandsee) {
507 if (!empty($user->admin) && $user->id != $id) {
512 if ($user->admin && !
$object->ldap_sid) {
525 $object->socialnetworks = array();
526 foreach ($socialnetworks as $key => $value) {
527 if (
GETPOST($key,
'alphanohtml')) {
533 $object->email = preg_replace(
'/\s+/',
'',
GETPOST(
"email",
'alphanohtml'));
540 if (
$object->signature ===
'ErrorTooManyLinksIntoHTMLString') {
542 $langs->load(
"errors");
543 setEventMessages($langs->trans(
'ErrorTooManyLinksIntoHTMLString'),
null,
'errors');
546 $object->accountancy_code =
GETPOST(
"accountancy_code",
'alphanohtml');
554 if ($permissiontoseesalary) {
567 $object->color =
GETPOST(
"color",
'alphanohtml') !=
'' ? str_replace(
'#',
'', (
string)
GETPOST(
"color",
'alphanohtml')) :
'';
568 $object->dateemployment = $dateemployment;
569 $object->dateemploymentend = $dateemploymentend;
570 $object->datestartvalidity = $datestartvalidity;
571 $object->dateendvalidity = $dateendvalidity;
573 $object->force_pass_change = $forcepasswordchange;
582 if (
isModEnabled(
'multicompany') && empty($user->entity) && !empty($user->admin)) {
596 $ret = $extrafields->setOptionalsFromPost(
null, $object,
'@GETPOSTISSET');
604 if (!empty($_FILES[
'photo'][
'name'])) {
608 if (
$object->id == $user->id) {
613 $langs->load(
"errors");
615 dol_syslog($langs->transnoentities(
"ErrorBadImageFormat"), LOG_INFO);
620 $passwordismodified = 0;
623 $passwordismodified = 1;
630 if (
$db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
631 $langs->load(
"errors");
632 setEventMessages($langs->trans(
"ErrorUpdateCanceledDueToDuplicatedUniqueValue",
$object->login),
null,
'errors');
640 if (!$error && GETPOSTISSET(
'contactid')) {
644 if ($contactid > 0) {
646 $contact->fetch($contactid);
648 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"user";
649 $sql .=
" SET fk_socpeople=".((int) $contactid);
650 if (!empty($contact->socid)) {
651 $sql .=
", fk_soc=".((int) $contact->socid);
652 } elseif ($socid > 0) {
653 $sql .=
", fk_soc = null";
654 setEventMessages($langs->trans(
"WarningUserDifferentContactSocid"),
null,
'warnings');
656 $sql .=
" WHERE rowid = ".((int)
$object->id);
657 } elseif ($socid > 0) {
658 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"user";
659 $sql .=
" SET fk_socpeople=NULL, fk_soc=".((int) $socid);
660 $sql .=
" WHERE rowid = ".((int)
$object->id);
662 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"user";
663 $sql .=
" SET fk_socpeople=NULL, fk_soc=NULL";
664 $sql .=
" WHERE rowid = ".((int)
$object->id);
667 $resql =
$db->query($sql);
674 if (!$error && !count(
$object->errors)) {
676 $fileimg =
$conf->user->dir_output.
'/'.
get_exdir(0, 0, 0, 0, $object,
'user').
'photos/'.
$object->oldcopy->photo;
679 $dirthumbs =
$conf->user->dir_output.
'/'.
get_exdir(0, 0, 0, 0, $object,
'user').
'photos/thumbs';
683 if (isset($_FILES[
'photo'][
'tmp_name']) && trim($_FILES[
'photo'][
'tmp_name'])) {
684 $dir =
$conf->user->dir_output.
'/'.
get_exdir(0, 0, 0, 1, $object,
'user').
'/photos';
691 $result =
dol_move_uploaded_file($_FILES[
'photo'][
'tmp_name'], $newfile, 1, 0, $_FILES[
'photo'][
'error']);
693 if (!($result > 0)) {
701 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
710 $langs->load(
"errors");
711 setEventMessages($langs->trans(
"ErrorFailedToCreateDir", $dir), $mesgs,
'errors');
716 if (!$error && !count(
$object->errors)) {
718 $categories =
GETPOST(
'usercats',
'array:int');
719 $object->setCategories($categories);
722 if (!$error && !count(
$object->errors)) {
726 $login = $_SESSION[
"dol_login"];
729 $langs->load(
"errors");
730 setEventMessages($langs->transnoentitiesnoconv(
"WarningYourLoginWasModifiedPleaseLogin"),
null,
'warnings');
732 if ($passwordismodified &&
$object->login == $user->login) {
734 $langs->load(
"errors");
735 setEventMessages($langs->transnoentitiesnoconv(
"WarningYourPasswordWasModifiedPleaseLogin"),
null,
'warnings');
736 header(
"Location: ".DOL_URL_ROOT.
'/user/card.php?id='.
$object->id);
744 if ($permissiontoeditpasswordandsee) {
745 dol_syslog(
"Not allowed to change fields, only password");
749 if (
GETPOST(
"password",
"password")) {
752 $ret =
$object->setPassword($user,
GETPOST(
"password",
"password"));
753 if (is_int($ret) && $ret < 0) {
762 if ((($action ==
'confirm_password' && $confirm ==
'yes' && $permissiontoeditpasswordandsee)
763 || ($action ==
'confirm_passwordsend' && $confirm ==
'yes' && $permissiontoeditpasswordandsend))
767 $newpassword =
$object->setPassword($user,
'');
768 if (is_int($newpassword) && $newpassword < 0) {
770 setEventMessages($langs->trans(
"ErrorFailedToSetNewPassword"),
null,
'errors');
773 if ($action ==
'confirm_passwordsend') {
774 if (
$object->send_password($user, $newpassword) > 0) {
780 setEventMessages($langs->trans(
"PasswordChangedTo", $newpassword),
null,
'warnings');
786 if ($action ==
'adduserldap' && $permissiontoadd) {
787 $selecteduser =
GETPOST(
'users');
789 $required_fields = array(
806 $arrayofsocialnetworks = array(
'skype',
'twitter',
'facebook',
'linkedin');
807 foreach ($arrayofsocialnetworks as $socialnetwork) {
813 $result = $ldap->connectBind();
816 $required_fields = array_unique(array_values(array_filter($required_fields,
"dol_validElement")));
821 if (is_array($ldapusers)) {
822 foreach ($ldapusers as $key => $attribute) {
834 $ldap_social = array();
837 $arrayofsocialnetworks = array(
'skype',
'twitter',
'facebook',
'linkedin');
838 foreach ($arrayofsocialnetworks as $socialnetwork) {
839 $ldap_social[$socialnetwork] = $attribute[
getDolGlobalString(
'LDAP_FIELD_'.strtoupper($socialnetwork))];
849 if ($action ==
'confirm_clone' && $confirm !=
'yes') {
852 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $permissiontocloneuser) {
856 setEventMessages($langs->trans(
'ErrorNoCloneWithoutEmail'),
null,
'errors');
864 $clone->api_key =
'';
865 $clone->admin = ($user->admin ?
$object->admin : 0);
867 $parts = explode(
' ',
GETPOST(
'clone_name'), 2);
868 $clone->firstname = $parts[0];
869 $clone->lastname = isset($parts[1]) ? $parts[1] :
'';
871 $clone->login = substr($parts[0], 0, 1).$parts[1];
874 $clone->context[
'createfromclone'] =
'createfromclone';
875 $id = $clone->create($user);
876 $refalreadyexists = 0;
879 $result = $clone->cloneRights(
$object->id, $id);
882 if (
GETPOST(
'clone_categories')) {
883 $result = $clone->cloneCategories(
$object->id, $id);
891 if ($clone->error ==
'ErrorProductAlreadyExists') {
895 $mesg = $langs->trans(
"ErrorProductAlreadyExists", $clone->ref);
896 $mesg .=
' <a href="' . $_SERVER[
"PHP_SELF"] .
'?ref=' . $clone->ref .
'">' . $langs->trans(
"ShowCardHere") .
'</a>.';
899 setEventMessages(empty($clone->error) ?
'' : $langs->trans($clone->error), $clone->errors,
'errors');
903 unset($clone->context[
'createfromclone']);
910 header(
"Location: " . $_SERVER[
"PHP_SELF"] .
"?id=" . $id);
921 $triggersendname =
'USER_SENTBYMAIL';
923 $mode =
'emailfromuser';
924 $trackid =
'use'.$id;
925 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
928 $upload_dir =
$conf->user->dir_output;
929 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
932 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
952$sql =
"SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX.
'user WHERE entity IN ('.
getEntity(
'user').
')';
953$resql =
$db->query($sql);
955 $obj =
$db->fetch_object($resql);
957 $nbofusers = $obj->nb;
965 $title = $person_name.
" - ".$langs->trans(
'Card');
968 $title = $langs->trans(
"NewEmployee");
970 $title = $langs->trans(
"NewUser");
976llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-user page-card');
978if ($action ==
'create' || $action ==
'adduserldap') {
981 print
'<span class="opacitymedium">'.$langs->trans(
"CreateInternalUserDesc", $langs->transnoentities(
"CreateExternalUser")).
"</span><br>\n";
990 $result = $ldap->connectBind();
992 $required_fields = array(
1012 $required_fields = array_unique(array_values(array_filter($required_fields,
"dol_validElement")));
1017 if (is_array($ldapusers)) {
1018 foreach ($ldapusers as $key => $ldapuser) {
1021 foreach ($required_fields as $value) {
1023 $label .= $value.
"=******* ";
1025 $label .= $value.
"=".$ldapuser[$value].
" ";
1028 $liste[$key] = $label;
1038 print
"\n\n<!-- Form liste LDAP debut -->\n";
1040 print
'<form name="add_user_ldap" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1041 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1042 print
'<table class="border centpercent"><tr>';
1043 print
'<td width="160">';
1044 print $langs->trans(
"LDAPUsers");
1047 print
'<input type="hidden" name="action" value="adduserldap">';
1048 if (is_array($liste) && count($liste)) {
1049 print $form->selectarray(
'users', $liste,
'', 1, 0, 0,
'', 0, 0, 0,
'',
'maxwidth500');
1052 print
'</td><td class="center">';
1053 print
'<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans(
'Get')).
'"'.(count($liste) ?
'' :
' disabled').
'>';
1054 print
'</td></tr></table>';
1057 print
"\n<!-- Form liste LDAP fin -->\n\n";
1062 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="POST" name="createuser">';
1063 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1064 print
'<input type="hidden" name="action" value="add">';
1065 if (!empty($ldap_sid)) {
1066 print
'<input type="hidden" name="ldap_sid" value="'.dol_escape_htmltag($ldap_sid).
'">';
1068 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'">';
1074 print
'<table class="border centpercent">';
1078 print
'<tr><td><label for="civility_code">'.$langs->trans(
"UserTitle").
'</label></td><td>';
1079 print $formcompany->select_civility(GETPOSTISSET(
"civility_code") ?
GETPOST(
"civility_code",
'aZ09') :
$object->civility_code,
'civility_code');
1085 print
'<td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans(
"Lastname").
'</span></td>';
1087 if (!empty($ldap_lastname)) {
1088 print
'<input type="hidden" id="lastname" name="lastname" value="'.dol_escape_htmltag($ldap_lastname).
'">';
1089 print $ldap_lastname;
1091 print
'<input class="minwidth100 maxwidth150onsmartphone createloginauto" type="text" id="lastname" name="lastname" value="'.dol_escape_htmltag(
GETPOST(
'lastname',
'alphanohtml')).
'">';
1096 print
'<tr><td>'.$langs->trans(
"Firstname").
'</td>';
1098 if (!empty($ldap_firstname)) {
1099 print
'<input type="hidden" name="firstname" value="'.dol_escape_htmltag($ldap_firstname).
'">';
1100 print $ldap_firstname;
1102 print
'<input id="firstname" class="minwidth100 maxwidth150onsmartphone createloginauto" type="text" name="firstname" value="'.dol_escape_htmltag(
GETPOST(
'firstname',
'alphanohtml')).
'">';
1107 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Login").
'</span></td>';
1109 if (!empty($ldap_login)) {
1110 print
'<input type="hidden" name="login" value="'.dol_escape_htmltag($ldap_login).
'">';
1112 } elseif (!empty($ldap_loginsmb)) {
1113 print
'<input type="hidden" name="login" value="'.dol_escape_htmltag($ldap_loginsmb).
'">';
1114 print $ldap_loginsmb;
1116 print
'<input id="login" class="maxwidth200 maxwidth150onsmartphone" maxsize="24" type="text" name="login" value="'.dol_escape_htmltag(
GETPOST(
'login',
'alphanohtml')).
'" spellcheck="false">';
1120 if (!empty(
$conf->use_javascript_ajax)) {
1124 $charforseparator =
getDolGlobalString(
"MAIN_USER_SEPARATOR_CHAR_FOR_GENERATED_LOGIN",
'.');
1125 if ($charforseparator ==
'none') {
1126 $charforseparator =
'';
1129 jQuery(document).ready(function() {
1130 $(".createloginauto").on("keyup", function() {
1131 console.log(".createloginauto change: We generate login when we have a lastname");
1133 lastname = $("#lastname").val().toLowerCase();
1136 print
' firstname = $("#firstname").val().toLowerCase().replace(/\s+/g, \'\').trim()[0];';
1137 $charforseparator =
'';
1139 print
' firstname = $("#firstname").val().toLowerCase().replace(/\s+/g, \'\').trim()[0];';
1141 print
' firstname = $("#firstname").val().toLowerCase().replace(/\s+/g, \'\').trim();';
1147 login = firstname + \''.
dol_escape_js($charforseparator).
'\';
1149 login += lastname.replace(/\s+/g, \
'\').trim();
1151 $(
"#login").val(login);
1157 $generated_password = '';
1158 if (empty($ldap_sid)) { // ldap_sid is for activedirectory
1159 $generated_password = getRandomPassword(false);
1161 $password = (GETPOSTISSET('password
') ? GETPOST('password
') : $generated_password);
1164 if (!empty($user->admin)) {
1165 print '<tr><td>
'.$form->textwithpicto($langs->trans("Administrator"), $langs->trans("AdministratorDesc"), 1, 'help
').'</td>
';
1167 print $form->selectyesno('admin
', GETPOST('admin
'), 1, false, 0, 1);
1169 if (isModEnabled('multicompany
') && !$user->entity) {
1170 if (!empty($conf->use_javascript_ajax)) {
1171 print '<script
type=
"text/javascript">
1173 $(
"select[name=admin]").change(
function() {
1174 if ( $(
this).val() == 0 ) {
1175 $(
"input[name=superadmin]")
1176 .prop(
"disabled",
true)
1177 .prop(
"checked",
false);
1178 $(
"select[name=entity]")
1179 .prop(
"disabled",
false);
1181 $(
"input[name=superadmin]")
1182 .prop(
"disabled",
false);
1185 $(
"input[name=superadmin]").change(
function() {
1186 if ( $(
this).is(
":checked") ) {
1187 $(
"select[name=entity]")
1188 .prop(
"disabled",
true);
1190 $(
"select[name=entity]")
1191 .prop(
"disabled",
false);
1197 $checked = (GETPOSTINT('superadmin
') ? ' checked
' : '');
1198 $disabled = (GETPOSTINT('superadmin
') ? '' : ' disabled');
1199 print '<input
type=
"checkbox" name=
"superadmin" id=
"superadmin" value=
"1"'.$checked.$disabled.' /> <label
for=
"superadmin">
'.$langs->trans("SuperAdministrator").'</span>
';
1201 print "</td></tr>\n";
1205 print '<tr><td>
'.$langs->trans("Gender").'</td>
';
1207 $arraygender = array('man
' => $langs->trans("Genderman"), 'woman
' => $langs->trans("Genderwoman"), 'other
' => $langs->trans("Genderother"));
1208 print $form->selectarray('gender
', $arraygender, GETPOST('gender
'), 1);
1212 $defaultemployee = '1
';
1214 print '<td>
'.$langs->trans('Employee
').'</td><td>
';
1215 print '<input
type=
"checkbox" name=
"employee" value=
"1"'.(GETPOST('employee
') == '1
' ? ' checked=
"checked"' : (($defaultemployee && !GETPOSTISSET('login
')) ? ' checked=
"checked"' : '')).'>
';
1216 //print $form->selectyesno("employee", (GETPOST('employee
') != '' ?GETPOST('employee
') : $defaultemployee), 1);
1220 print '<tr><td
class=
"titlefieldcreate">
'.$langs->trans("HierarchicalResponsible").'</td>
';
1222 print img_picto('', 'user', 'class=
"pictofixedwidth"').$form->select_dolusers($object->fk_user, 'fk_user
', 1, array($object->id), 0, '', '', (string) $conf->entity, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx
');
1226 // Expense report validator
1227 if (isModEnabled('expensereport
')) {
1228 print '<tr><td
class=
"titlefieldcreate">
';
1229 $text = $langs->trans("ForceUserExpenseValidator");
1230 print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help
');
1233 print img_picto('', 'user', 'class=
"pictofixedwidth"').$form->select_dolusers($object->fk_user_expense_validator, 'fk_user_expense_validator
', 1, array($object->id), 0, '', '', (string) $conf->entity, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx
');
1238 // Holiday request validator
1239 if (isModEnabled('holiday
')) {
1240 print '<tr><td
class=
"titlefieldcreate">
';
1241 $text = $langs->trans("ForceUserHolidayValidator");
1242 print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help
');
1245 print img_picto('', 'user', 'class=
"pictofixedwidth"').$form->select_dolusers($object->fk_user_holiday_validator, 'fk_user_holiday_validator
', 1, array($object->id), 0, '', '', (string) $conf->entity, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx
');
1251 print '<tr><td>
'.$langs->trans("ExternalUser").' ?</td>
';
1253 print $form->textwithpicto($langs->trans("Internal"), $langs->trans("InternalExternalDesc"), 1, 'help
', '', 0, 2);
1257 print '</
table><hr><
table class=
"border centpercent">
';
1261 print '<tr><td
class=
"titlefieldcreate">
'.$langs->trans("RangeOfLoginValidity").'</td>
';
1263 print $form->selectDate($datestartvalidity, 'datestartvalidity
', 0, 0, 1, 'formdatestartvalidity
', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("from"));
1267 print $form->selectDate($dateendvalidity, 'dateendvalidity
', 0, 0, 1, 'formdateendvalidity
', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1272 print '<tr><td
class=
"fieldrequired">
'.$langs->trans("Password").'</td>
';
1275 if (preg_match('/ldap/
', $dolibarr_main_authentication)) {
1276 $valuetoshow .= ($valuetoshow ? ' +
' : '').$langs->trans("PasswordOfUserInLDAP").' (hidden)
';
1278 if (preg_match('/http/
', $dolibarr_main_authentication)) {
1279 $valuetoshow .= ($valuetoshow ? ' +
' : '').$langs->trans("HTTPBasicPassword");
1281 if (preg_match('/dolibarr/
', $dolibarr_main_authentication) || preg_match('/forceuser/
', $dolibarr_main_authentication)) {
1282 if (!empty($ldap_pass)) { // For very old system compatibility. Now clear password can't be viewed from LDAP read
1283 $valuetoshow .= ($valuetoshow ?
' + ' :
'').
'<input type="hidden" name="password" value="'.
dol_escape_htmltag($ldap_pass).
'">';
1284 $valuetoshow .= preg_replace(
'/./i',
'*', $ldap_pass);
1287 $valuetoshow .= ($valuetoshow ?
' + '.$langs->trans(
"DolibarrPassword") :
'').
'<input class="minwidth300 maxwidth400 widthcentpercentminusx" maxlength="128" type="text" id="password" name="password" value="'.
dol_escape_htmltag($password).
'" autocomplete="new-password" spellcheck="false">';
1288 if (!empty(
$conf->use_javascript_ajax)) {
1289 $valuetoshow .=
img_picto($langs->transnoentities(
'Generate'),
'refresh',
'id="generate_password" class="linkobject paddingleft"');
1294 $parameters = array(
'valuetoshow' => $valuetoshow,
'password' => $password,
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
1295 $reshook = $hookmanager->executeHooks(
'printUserPasswordField', $parameters, $object, $action);
1297 $valuetoshow = $hookmanager->resPrint;
1299 $valuetoshow .= $hookmanager->resPrint;
1306 if ($_SESSION[
"dol_authmode"] ==
'dolibarr') {
1307 print
'<tr><td class="titlefieldcreate"></td>';
1310 $permissiontoselfeditpassword = 1;
1311 if ($permissiontoselfeditpassword) {
1312 print
'<input type="checkbox" name="forcepasswordchange" id="forcepasswordchange" value="1"'.(GETPOST(
'forcepasswordchange') ==
'1' ?
' checked="checked"' :
'').
'>';
1313 print
'<label class="opacitymedium" for="forcepasswordchange">'.$langs->trans(
"ForcePasswordChange").
'</label>';
1315 print
'<input type="checkbox" name="forcepasswordchange" value="1" class="colorgrey valignmiddle" disabled>';
1316 print $form->textwithpicto(
'<span class="opacitymedium">'.$langs->trans(
"ForcePasswordChange").
'</span>', $langs->trans(
"UserDoesNotHaveRightsToChangeHisPassword"));
1326 print
'<tr><td>'.$langs->trans(
"ApiKey").
'</td>';
1328 print
'<input class="minwidth300 maxwidth400 widthcentpercentminusx" minlength="12" maxlength="128" type="text" id="api_key" name="api_key" value="'.GETPOST(
'api_key',
'alphanohtml').
'" autocomplete="off" spellcheck="false">';
1329 if (!empty(
$conf->use_javascript_ajax)) {
1330 print
img_picto($langs->transnoentities(
'Generate'),
'refresh',
'id="generate_api_key" class="linkobject paddingleft"');
1336 print
'<input type="hidden" name="api_key" value="'.$generated_fake_api_key.
'">';
1340 print
'</table><hr><table class="border centpercent">';
1344 print
'<tr><td class="tdtop titlefieldcreate">'.$form->editfieldkey(
'Address',
'address',
'', $object, 0).
'</td>';
1345 print
'<td><textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
1347 print
'</textarea></td></tr>';
1350 print
'<tr><td>'.$form->editfieldkey(
'Zip',
'zipcode',
'', $object, 0).
'</td><td>';
1351 print $formcompany->select_ziptown(
$object->zip,
'zipcode', array(
'town',
'selectcountry_id',
'state_id'), 6);
1355 print
'<tr><td>'.$form->editfieldkey(
'Town',
'town',
'', $object, 0).
'</td><td>';
1356 print $formcompany->select_ziptown(
$object->town,
'town', array(
'zipcode',
'selectcountry_id',
'state_id'));
1360 print
'<tr><td>'.$form->editfieldkey(
'Country',
'selectcountry_id',
'', $object, 0).
'</td><td class="maxwidthonsmartphone">';
1361 print
img_picto(
'',
'country',
'class="pictofixedwidth"');
1362 print $form->select_country((
GETPOST(
'country_id') !=
'' ?
GETPOST(
'country_id') :
$object->country_id),
'country_id');
1364 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1370 print
'<tr><td>'.$form->editfieldkey(
'State',
'state_id',
'', $object, 0).
'</td><td class="maxwidthonsmartphone">';
1371 print
img_picto(
'',
'state',
'class="pictofixedwidth"');
1372 print $formcompany->select_state_ajax(
'country_id',
$object->state_id,
$object->country_id,
'state_id');
1377 print
'<tr><td>'.$langs->trans(
"PhonePro").
'</td>';
1379 print
img_picto(
'',
'object_phoning',
'class="pictofixedwidth"');
1380 if (!empty($ldap_phone)) {
1381 print
'<input type="hidden" name="office_phone" value="'.dol_escape_htmltag($ldap_phone).
'">';
1384 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="office_phone" value="'.dol_escape_htmltag(
GETPOST(
'office_phone',
'alphanohtml')).
'">';
1389 print
'<tr><td>'.$langs->trans(
"PhoneMobile").
'</td>';
1391 print
img_picto(
'',
'object_phoning_mobile',
'class="pictofixedwidth"');
1392 if (!empty($ldap_mobile)) {
1393 print
'<input type="hidden" name="user_mobile" value="'.dol_escape_htmltag($ldap_mobile).
'">';
1396 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="user_mobile" value="'.dol_escape_htmltag(
GETPOST(
'user_mobile',
'alphanohtml')).
'" spellcheck="false">';
1401 print
'<tr><td>'.$langs->trans(
"Fax").
'</td>';
1403 print
img_picto(
'',
'object_phoning_fax',
'class="pictofixedwidth"');
1404 if (!empty($ldap_fax)) {
1405 print
'<input type="hidden" name="office_fax" value="'.dol_escape_htmltag($ldap_fax).
'">';
1408 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="office_fax" value="'.dol_escape_htmltag(
GETPOST(
'office_fax',
'alphanohtml')).
'">';
1413 print
'<tr><td'.(getDolGlobalString(
'USER_MAIL_REQUIRED') ?
' class="fieldrequired"' :
'').
'>'.$langs->trans(
"EMail").
'</td>';
1415 print
img_picto(
'',
'object_email',
'class="pictofixedwidth"');
1416 if (!empty($ldap_mail)) {
1417 print
'<input type="hidden" name="email" value="'.dol_escape_htmltag($ldap_mail).
'">';
1420 print
'<input type="text" name="email" class="maxwidth500 widthcentpercentminusx" value="'.dol_escape_htmltag(
GETPOST(
'email',
'alphanohtml')).
'" spellcheck="false">';
1426 foreach ($socialnetworks as $key => $value) {
1427 if ($value[
'active']) {
1428 print
'<tr><td>'.$langs->trans($value[
'label']).
'</td>';
1430 if (!empty($value[
'icon'])) {
1431 print
'<span class="fab '.$value[
'icon'].
' pictofixedwidth"></span>';
1433 if (!empty($ldap_social[$key])) {
1434 print
'<input type="hidden" name="'.$key.
'" value="'.$ldap_social[$key].
'">';
1435 print $ldap_social[$key];
1437 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="'.$key.
'" value="'.
GETPOST($key,
'alphanohtml').
'">';
1442 if (!empty($ldap_social[$key])) {
1443 print
'<input type="hidden" name="'.$key.
'" value="'.$ldap_social[$key].
'">';
1445 print
'<input type="hidden" name="'.$key.
'" value="'.
GETPOST($key,
'alphanohtml').
'">';
1453 print
'<tr><td>'.$langs->trans(
"AccountancyCode").
'</td>';
1455 print
'<input type="text" class="maxwidthonsmartphone" name="accountancy_code" value="'.dol_escape_htmltag(
GETPOST(
'accountancy_code',
'alphanohtml')).
'">';
1461 print
'<tr><td>'.$langs->trans(
"Color").
'</td>';
1463 print $formother->selectColor(GETPOSTISSET(
'color') ?
GETPOST(
'color',
'alphanohtml') :
$object->color,
'color', null, 1, array(),
'hideifnotset');
1468 if (
isModEnabled(
'category') && $user->hasRight(
"categorie",
"read")) {
1469 print
'<tr><td>'.$form->editfieldkey(
'Categories',
'usercats',
'', $object, 0).
'</td><td>';
1470 print $form->selectCategories(Categorie::TYPE_USER,
'usercats', $object);
1476 print
'<tr><td>'.$form->editfieldkey(
'DefaultLang',
'default_lang',
'', $object, 0,
'string',
'', 0, 0,
'id', $langs->trans(
"WarningNotLangOfInterface", $langs->transnoentitiesnoconv(
"UserGUISetup"))).
'</td>';
1477 print
'<td class="maxwidthonsmartphone">'.
"\n";
1478 print
img_picto(
'',
'language',
'class="pictofixedwidth"').$formadmin->select_language(
GETPOST(
'default_lang',
'alpha') ?
GETPOST(
'default_lang',
'alpha') : (
$object->lang ?
$object->lang :
''),
'default_lang', 0, array(), 1, 0, 0,
'maxwidth300 widthcentpercentminusx');
1484 if (
isModEnabled(
'multicompany') && isset($mc) && is_object($mc)) {
1486 if (!method_exists($mc,
'formObjectOptions')) {
1487 if (!
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE') &&
$conf->entity == 1 && $user->admin && !$user->entity) {
1488 print
"<tr>".
'<td>'.$langs->trans(
"Entity").
'</td>';
1489 print
"<td>".$mc->select_entities(
$conf->entity);
1490 print
"</td></tr>\n";
1492 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'" />';
1498 $parameters = array();
1499 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
1502 print
'<tr><td class="tdtop">'.$langs->trans(
"Signature").
'</td>';
1503 print
'<td class="wordbreak">';
1504 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1506 $doleditor =
new DolEditor(
'signature',
GETPOST(
'signature',
'restricthtml'),
'', 138,
'dolibarr_notes',
'In',
true, $acceptlocallinktomedia, !
getDolGlobalString(
'FCKEDITOR_ENABLE_USERSIGN') ? 0 : 1, ROWS_4,
'90%');
1507 print $doleditor->Create(1);
1511 print
'<tr><td class="tdtop">';
1512 print $langs->trans(
"NotePublic");
1514 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1515 $doleditor =
new DolEditor(
'note_public', GETPOSTISSET(
'note_public') ?
GETPOST(
'note_public',
'restricthtml') :
'',
'', 100,
'dolibarr_notes',
'', false, true,
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC'), ROWS_3,
'90%');
1516 $doleditor->Create();
1517 print
"</td></tr>\n";
1520 print
'<tr><td class="tdtop">';
1521 print $langs->trans(
"NotePrivate");
1523 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1524 $doleditor =
new DolEditor(
'note_private', GETPOSTISSET(
'note_private') ?
GETPOST(
'note_private',
'restricthtml') :
'',
'', 100,
'dolibarr_notes',
'', false, true,
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE'), ROWS_3,
'90%');
1525 $doleditor->Create();
1526 print
"</td></tr>\n";
1528 print
'</table><hr><table class="border centpercent">';
1535 print
'<tr><td>'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
1536 print $formproduct->selectWarehouses(
$object->fk_warehouse,
'fk_warehouse',
'warehouseopen', 1);
1541 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"PostOrFunction").
'</td>';
1543 print
'<input class="maxwidth200 maxwidth150onsmartphone" type="text" name="job" value="'.dol_escape_htmltag(
GETPOST(
'job',
'alphanohtml')).
'">';
1546 if ($permissiontoseesalary) {
1547 $langs->load(
"salaries");
1551 $text = $langs->trans(
"THM");
1552 print $form->textwithpicto($text, $langs->trans(
"THMDescription"), 1,
'help',
'classthm');
1555 print
'<input size="8" type="text" name="thm" value="'.dol_escape_htmltag(
GETPOST(
'thm')).
'"> <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
1561 $text = $langs->trans(
"TJM");
1562 print $form->textwithpicto($text, $langs->trans(
"TJMDescription"), 1,
'help',
'classtjm');
1565 print
'<input size="8" type="text" name="tjm" value="'.dol_escape_htmltag(
GETPOST(
'tjm')).
'"> <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
1570 print
'<tr><td>'.$langs->trans(
"Salary").
'</td>';
1572 print
img_picto(
'',
'salary',
'class="pictofixedwidth paddingright"').
'<input class="width100" type="text" name="salary" value="'.
dol_escape_htmltag(
GETPOST(
'salary')).
'"> <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
1578 print
'<tr><td>'.$langs->trans(
"WeeklyHours").
'</td>';
1580 print
'<input size="8" type="text" name="weeklyhours" value="'.dol_escape_htmltag(
GETPOST(
'weeklyhours')).
'">';
1585 print
'<tr><td>'.$langs->trans(
"DateOfEmployment").
'</td>';
1587 print $form->selectDate($dateemployment,
'dateemployment', 0, 0, 1,
'formdateemployment', 1, 1, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"from"));
1591 print $form->selectDate($dateemploymentend,
'dateemploymentend', 0, 0, 1,
'formdateemploymentend', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"to"));
1596 print
'<tr><td>'.$langs->trans(
"DateOfBirth").
'</td>';
1598 print $form->selectDate($dateofbirth,
'dateofbirth', 0, 0, 1,
'createuser', 1, 0, 0,
'',
'',
'',
'', 1,
'',
'',
'tzserver');
1606 print $form->buttonsSaveCancel(
"CreateUser");
1612 $res =
$object->fetch($id,
'',
'', 1);
1617 $res =
$object->fetch_optionals();
1627 $passDoNotExpire = 0;
1629 $userChangePassNextLogon = 0;
1635 $result = $ldap->connectBind();
1637 $userSearchFilter =
'(' .
getDolGlobalString(
'LDAP_FILTER_CONNECTION').
'('.$ldap->getUserIdentifier().
'='.
$object->login.
'))';
1638 $entries = $ldap->fetch(
$object->login, $userSearchFilter);
1644 if (count($ldap->uacf) > 0) {
1645 foreach ($ldap->uacf as $key => $statut) {
1646 if ($key == 65536) {
1647 $passDoNotExpire = 1;
1648 $statutUACF = $statut;
1653 $statutUACF =
"ACCOUNTDISABLE";
1656 if ($ldap->pwdlastset == 0) {
1657 $userChangePassNextLogon = 1;
1663 if ($mode ==
'employee') {
1664 $title = $langs->trans(
"Employee");
1665 $linkback =
'<a href="'.DOL_URL_ROOT.
'/hrm/employee/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1667 $title = $langs->trans(
"User");
1670 if ($user->hasRight(
"user",
"user",
"read") || $user->admin) {
1671 $linkback =
'<a href="'.DOL_URL_ROOT.
'/user/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1678 if ($action ==
'password') {
1679 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"ReinitPassword"), $langs->trans(
"ConfirmReinitPassword",
$object->login),
"confirm_password",
'', 0, 1);
1683 if ($action ==
'passwordsend') {
1684 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"SendNewPassword"), $langs->trans(
"ConfirmSendNewPassword",
$object->login),
"confirm_passwordsend",
'', 0, 1);
1688 if ($action ==
'disable') {
1689 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"DisableAUser"), $langs->trans(
"ConfirmDisableUser",
$object->login),
"confirm_disable",
'', 0, 1);
1693 if ($action ==
'enable') {
1694 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"EnableAUser"), $langs->trans(
"ConfirmEnableUser",
$object->login),
"confirm_enable",
'', 0, 1);
1698 if ($action ==
'delete') {
1699 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"DeleteAUser"), $langs->trans(
"ConfirmDeleteUser",
$object->login),
"confirm_delete",
'', 0, 1);
1703 if (($action ==
'clone' && (empty(
$conf->use_javascript_ajax) || !empty(
$conf->dol_use_jmobile)))
1704 || (!empty(
$conf->use_javascript_ajax) && empty(
$conf->dol_use_jmobile))) {
1706 $formquestionclone = array(
1707 'text' => $langs->trans(
"ConfirmClone"),
1708 0 => array(
'type' =>
'text',
'name' =>
'clone_name',
'label' => $langs->trans(
"NewNameUserClone"),
'morecss' =>
'width200'),
1709 1 => array(
'type' =>
'checkbox',
'name' =>
'clone_rights',
'label' => $langs->trans(
"CloneUserRights"),
'value' => 0),
1710 2 => array(
'type' =>
'checkbox',
'name' =>
'clone_categories',
'label' => $langs->trans(
"CloneCategoriesProduct"),
'value' => 0),
1713 $newElement = array(
'type' =>
'text',
'name' =>
'new_email',
'label' => $langs->trans(
"NewEmailUserClone"),
'morecss' =>
'width200');
1714 array_splice($formquestionclone, 2, 0, array($newElement));
1716 print $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmUserClone',
$object->firstname.
' '.
$object->lastname),
'confirm_clone', $formquestionclone,
'yes',
'action-clone', 350, 600);
1721 if ($action !=
'edit') {
1722 print
dol_get_fiche_head($head,
'user', $title, -1,
'user', 0,
'',
'', 0,
'', 1);
1724 $morehtmlref =
'<a href="'.dolBuildUrl(DOL_URL_ROOT.
'/user/vcard.php', [
'id' =>
$object->id,
'output' =>
'file',
'file' =>
dol_sanitizeFileName(
$object->getFullName($langs).
'.vcf')]).
'" class="refid valignmiddle" rel="noopener">';
1725 $morehtmlref .=
img_picto($langs->trans(
"Download").
' '.$langs->trans(
"VCard").
' ('.$langs->trans(
"AddToContacts").
')',
'vcard',
'class="valignmiddle marginleftonly paddingrightonly"');
1726 $morehtmlref .=
'</a>';
1728 $urltovirtualcard =
'/user/virtualcard.php?id='.((int)
$object->id);
1729 $morehtmlref .=
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcard', $langs->transnoentitiesnoconv(
"PublicVirtualCardUrl").
' - '.
$object->getFullName($langs),
img_picto($langs->trans(
"PublicVirtualCardUrl"),
'card',
'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard,
'',
'refid valignmiddle nohover');
1731 dol_banner_tab($object,
'id', $linkback, $user->hasRight(
"user",
"user",
"read") || $user->admin,
'rowid',
'ref', $morehtmlref);
1733 print
'<div class="fichecenter">';
1734 print
'<div class="fichehalfleft">';
1736 print
'<div class="underbanner clearboth"></div>';
1737 print
'<table class="border tableforfield centpercent">';
1740 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
"Login").
'</td>';
1741 if (!empty(
$object->ldap_sid) &&
$object->status == User::STATUS_DISABLED) {
1742 print
'<td class="error">';
1743 print $langs->trans(
"LoginAccountDisableInDolibarr");
1749 $addadmin .=
img_picto($langs->trans(
"SuperAdministratorDesc"),
"superadmin",
'class="paddingleft valignmiddle"');
1750 } elseif (!empty(
$object->admin)) {
1751 $addadmin .=
img_picto($langs->trans(
"AdministratorDesc"),
"admin",
'class="paddingleft valignmiddle"');
1760 $text = $langs->trans(
"Type");
1761 print $form->textwithpicto($text, $langs->trans(
"InternalExternalDesc"));
1763 $type = $langs->trans(
"Internal");
1765 $type = $langs->trans(
"External");
1767 print
'<span class="badgeneutral">';
1770 print
' ('.$langs->trans(
"DomainUser").
')';
1773 print
'</td></tr>'.
"\n";
1776 if (
$object->ldap_sid && is_object($ldap)) {
1777 print
'<tr><td>'.$langs->trans(
"Type").
'</td><td>';
1778 print $langs->trans(
"DomainUser", $ldap->domainFQDN);
1779 print
'</td></tr>'.
"\n";
1783 print
'<tr><td>'.$langs->trans(
"Employee").
'</td><td>';
1785 print
'<input type="checkbox" disabled name="employee" value="1"'.($object->employee ?
' checked="checked"' :
'').
'>';
1789 print
'</td></tr>'.
"\n";
1792 if ($nbofusers > 1) {
1794 print
'<tr><td>'.$langs->trans(
"HierarchicalResponsible").
'</td>';
1796 if (empty(
$object->fk_user)) {
1797 print
'<span class="opacitymedium">'.$langs->trans(
"None").
'</span>';
1801 $huser->fetch(
$object->fk_user);
1802 print $huser->getNomUrl(-1);
1804 print
'<span class="opacitymedium">'.$langs->trans(
"None").
'</span>';
1813 $text = $langs->trans(
"ForceUserExpenseValidator");
1814 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
1817 if (!empty(
$object->fk_user_expense_validator)) {
1819 $evuser->fetch(
$object->fk_user_expense_validator);
1820 print $evuser->getNomUrl(-1);
1829 $text = $langs->trans(
"ForceUserHolidayValidator");
1830 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
1833 if (!empty(
$object->fk_user_holiday_validator)) {
1835 $hvuser->fetch(
$object->fk_user_holiday_validator);
1836 print $hvuser->getNomUrl(-1);
1844 print
'<tr><td>'.$langs->trans(
"PostOrFunction").
'</td>';
1845 print
'<td>'.dol_escape_htmltag(
$object->job).
'</td>';
1849 print
'<tr><td>'.$langs->trans(
"WeeklyHours").
'</td>';
1856 if ($permissiontoseesalary) {
1857 $langs->load(
"salaries");
1860 print
'<tr><td>'.$langs->trans(
"Salary").
'</td>';
1862 print(
$object->salary !=
'' ?
img_picto(
'',
'salary',
'class="pictofixedwidth paddingright"').
'<span class="amount">'.
price(
$object->salary, 0, $langs, 1, -1, -1,
$conf->currency) :
'').
'</span>';
1868 $text = $langs->trans(
"THM");
1869 print $form->textwithpicto($text, $langs->trans(
"THMDescription"), 1,
'help',
'classthm');
1872 print(
$object->thm !=
'' ?
'<span class="amount">'.price(
$object->thm, 0, $langs, 1, -1, -1,
$conf->currency).
'</span>' :
'');
1878 $text = $langs->trans(
"TJM");
1879 print $form->textwithpicto($text, $langs->trans(
"TJMDescription"), 1,
'help',
'classtjm');
1882 print(
$object->tjm !=
'' ?
'<span class="amount">'.price(
$object->tjm, 0, $langs, 1, -1, -1,
$conf->currency).
'</span>' :
'');
1888 print
'<tr><td>'.$langs->trans(
"DateOfEmployment").
'</td>';
1890 if (
$object->dateemployment) {
1891 print
'<span class="opacitymedium">'.$langs->trans(
"FromDate").
'</span> ';
1894 if (
$object->dateemploymentend) {
1895 print
'<span class="opacitymedium"> - '.$langs->trans(
"To").
'</span> ';
1902 print
'<tr><td>'.$langs->trans(
"DateOfBirth").
'</td>';
1910 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
1911 print
'<tr><td>'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
1912 if (
$object->fk_warehouse > 0) {
1914 $warehousestatic->fetch(
$object->fk_warehouse);
1915 print $warehousestatic->getNomUrl(1);
1923 print
'<div class="fichehalfright">';
1925 print
'<div class="underbanner clearboth"></div>';
1927 print
'<table class="border tableforfield centpercent">';
1931 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
"Color").
'</td>';
1933 print $formother->showColor(
$object->color,
'');
1939 if (
isModEnabled(
'category') && $user->hasRight(
"categorie",
"read")) {
1940 print
'<tr><td>'.$langs->trans(
"Categories").
'</td>';
1942 print $form->showCategories(
$object->id, Categorie::TYPE_USER, 1);
1948 $langs->load(
"languages");
1949 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
1951 print $form->textwithpicto($langs->trans(
"DefaultLang"), $langs->trans(
"WarningNotLangOfInterface", $langs->transnoentitiesnoconv(
"UserGUISetup")));
1955 $labellang = (
$object->lang ? $langs->trans(
'Language_'.
$object->lang) :
'');
1961 if (isset(
$conf->file->main_authentication) && preg_match(
'/openid/',
$conf->file->main_authentication) &&
getDolGlobalString(
'MAIN_OPENIDURL_PERUSER')) {
1962 print
'<tr><td>'.$langs->trans(
"OpenIDURL").
'</td>';
1963 print
'<td>'.$object->openid.
'</td>';
1968 if (
isModEnabled(
'multicompany') && isset($mc) && is_object($mc)) {
1970 if (!method_exists($mc,
'formObjectOptions')) {
1972 print
'<tr><td>'.$langs->trans(
"Entity").
'</td><td>';
1974 print $langs->trans(
"AllEntities");
1976 $mc->getInfo(
$object->entity);
1979 print
"</td></tr>\n";
1985 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1989 print
'<tr><td>'.$langs->trans(
"LinkToCompanyContact").
'</td>';
1994 $societe->fetch(
$object->socid);
1995 if ($societe->id > 0) {
1996 $s .= $societe->getNomUrl(1,
'');
1999 $s .=
'<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"ThisUserIsNot").
'</span>';
2001 if (!empty(
$object->contact_id)) {
2003 $contact->fetch(
$object->contact_id);
2004 if ($contact->id > 0) {
2005 if (
$object->socid > 0 && $s) {
2010 $s .= $contact->getNomUrl(1,
'');
2020 $langs->load(
"members");
2021 print
'<tr><td>'.$langs->trans(
"LinkedToDolibarrMember").
'</td>';
2025 $adh->fetch(
$object->fk_member);
2026 $adh->ref = $adh->getFullname($langs);
2027 print $adh->getNomUrl(-1);
2029 print
'<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"UserNotLinkedToMember").
'</span>';
2036 print
'<tr><td class="tdtop">'.$langs->trans(
'Signature').
'</td><td class="wordbreak">';
2038 print
"</td></tr>\n";
2049 print
'<!-- credential section -->'.
"\n";
2050 print
'<div class="div-table-responsive-no-min">';
2051 print
'<table class="noborder tableforfield centpercent">';
2054 print
'<tr class="liste_titre"><th class="liste_titre" colspan="2">';
2055 print
'<div class="centpercent display-flex">';
2056 print
'<div class="left inline-block">';
2057 print
img_picto(
'',
'security',
'class="paddingleft pictofixedwidth"').$langs->trans(
"SecurityForConnection");
2064 print
'<tr class="nooddeven"><td class="titlefieldmax45 nowraponall">'.$langs->trans(
"RangeOfLoginValidity").
'</td>';
2066 if (
$object->datestartvalidity) {
2067 print
'<span class="opacitymedium">'.$langs->trans(
"FromDate").
'</span> ';
2070 if (
$object->dateendvalidity) {
2071 print
'<span class="opacitymedium"> - '.$langs->trans(
"To").
'</span> ';
2078 if ($_SESSION[
"dol_authmode"] ==
'dolibarr') {
2079 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"PasswordToChange"), $langs->trans(
"ForcePasswordChange")).
'</td>';
2081 $permissiontoselfeditpassword =
$object->hasRight(
'user',
'self',
'password');
2082 if ($permissiontoselfeditpassword) {
2084 print
'<input type="checkbox" class="colorgrey" disabled name="forcepasswordchange" value="1"'.($object->force_pass_change ?
' checked="checked"' :
'').
'>';
2086 print
'<span class="opacitymedium">'.yn(
$object->force_pass_change).
'</span>';
2089 print
'<span class="opacitymedium">'.yn(
$object->force_pass_change).
'</span>';
2092 print
'<input type="checkbox" name="forcepasswordchange" value="1" disabled class="valignmiddle">';
2093 print
'<span class="opacitymedium" title="'.$langs->trans(
"UserDoesNotHaveRightsToChangeHisPassword").
'">'.$langs->trans(
"No").
'</span>';
2101 if (preg_match(
'/ldap/', $dolibarr_main_authentication)) {
2102 if (!empty(
$object->ldap_sid)) {
2103 if ($passDoNotExpire) {
2104 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"LdapUacf_".$statutUACF);
2105 } elseif ($userChangePassNextLogon) {
2106 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').
'<span class="warning">'.$langs->trans(
"UserMustChangePassNextLogon", $ldap->domainFQDN).
'</span>';
2107 } elseif ($userDisabled) {
2108 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').
'<span class="warning">'.$langs->trans(
"LdapUacf_".$statutUACF, $ldap->domainFQDN).
'</span>';
2110 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"PasswordOfUserInLDAP");
2113 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"PasswordOfUserInLDAP");
2116 if (preg_match(
'/http/', $dolibarr_main_authentication)) {
2117 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"HTTPBasicPassword");
2121 $parameters = array(
'valuetoshow' => $valuetoshow,
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
2122 $reshook = $hookmanager->executeHooks(
'printUserPasswordField', $parameters, $object, $action);
2124 $valuetoshow = $hookmanager->resPrint;
2126 $valuetoshow .= $hookmanager->resPrint;
2130 print
'<tr class="nooddeven"><td class="titlefieldmiddle">'.$langs->trans(
"Password").
'</td>';
2131 print
'<td class="wordbreak">';
2138 if (
getDolGlobalString(
'MAIN_SECURITY_ALLOW_TOTP') && $permissiontoeditpasswordandsee) {
2139 print
'<tr class="nooddeven"><td>'.$langs->trans(
"2FA").
'</td>';
2141 print
'<div class="centpercent display-flex">';
2142 print
'<span class="badge badge-info">999</span>';
2143 print
'<div class="left inline-block">';
2144 $s =
'<!-- MAIN_SECURITY_ALLOW_TOTP --><span class="fa fa-pen valignmiddle btnTitle-icon"></span>';
2146 print
'</span></span>';
2151 $tmparrayofauthmode = explode(
',', $dolibarr_main_authentication);
2152 foreach ($tmparrayofauthmode as $tmpauthmode) {
2153 $langs->load(
"oauth");
2155 $tmpauthmode = trim($tmpauthmode);
2156 if (preg_match(
'/oauth/', $tmpauthmode)) {
2157 $nameofservice = preg_replace(
'/oauth/',
'', $tmpauthmode);
2158 print
'<tr class="nooddeven">';
2159 print
'<td class="titlefieldmiddle">'.$langs->trans(
"OAUTH_ID");
2160 print
' '.ucfirst($nameofservice).
' ';
2163 $constoauthlogin =
'OAUTH_'.strtoupper($nameofservice).
'-Login_ID';
2164 print
'<td class="tdoverflowmax200" title="'.dolPrintHTMLForAttribute(
getDolGlobalString($constoauthlogin)).
'">';
2172 if (!empty(
$object->email_oauth2)) {
2173 print
'<tr class="nooddeven"><td class="titlefieldmiddle">'.$langs->trans(
"AlternativeEmailForOAuth2").
'</td>';
2183 if (
isModEnabled(
'api') && ($user->id == $id || $user->admin)) {
2184 print
'<tr class="nooddeven"><td>'.$langs->trans(
"ApiKey").
'</td>';
2187 print
'<div class="centpercent display-flex">';
2188 print
'<span class="badge badge-info">999</span>';
2192 print
'<div class="left inline-block">';
2193 $s =
'<!-- API_IN_TOKEN_TABLE --><span class="fa fa-pen valignmiddle btnTitle-icon"></span>';
2198 if (!empty(
$object->api_key)) {
2199 print
'<span class="opacitymedium">';
2204 print
' <span class="badge badge-info" title="'.$langs->trans(
"TotalAPICall").
'">';
2214 print
'<tr class="nooddeven"><td>'.$langs->trans(
"LastConnexion").
'</td>';
2216 if (
$object->datepreviouslogin) {
2217 print
dol_print_date(
$object->datepreviouslogin,
"dayhour",
"tzuserrel").
' <span class="opacitymedium">('.$langs->trans(
"Previous").
')</span>, ';
2220 print
dol_print_date(
$object->datelastlogin,
"dayhour",
"tzuserrel").
' <span class="opacitymedium">('.$langs->trans(
"Currently").
')</span>';
2230 $parameters = array(
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
2231 $reshook = $hookmanager->executeHooks(
'addMoreObjectBlock', $parameters, $object, $action);
2233 print $hookmanager->resPrint;
2239 print
'<div class="clearboth"></div>';
2248 print
'<div class="tabsAction">';
2250 $parameters = array();
2251 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2252 if (empty($reshook)) {
2256 'class' =>
'classfortooltip'
2260 if (empty($user->socid)) {
2261 $canSendMail =
false;
2263 $langs->load(
"mails");
2264 $canSendMail =
true;
2265 unset($params[
'attr'][
'title']);
2267 $langs->load(
"mails");
2268 $params[
'attr'][
'title'] = $langs->trans(
'NoEMail');
2270 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email',
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'presend',
'mode' =>
'init']) .
'#formmailbeforetitle',
'', $canSendMail, $params);
2275 $params[
'attr'][
'title'] = $langs->trans(
'DisabledInMonoUserMode');
2278 unset($params[
'attr'][
'title']);
2281 } elseif ($permissiontoeditpasswordandsee && !
$object->ldap_sid &&
2283 unset($params[
'attr'][
'title']);
2291 'class' =>
'classfortooltip'
2296 if ((empty(
$object->entity) && $permissiontoclonesuperadmin) || (!empty(
$object->admin) && !empty(
$object->entity) && $permissiontocloneadmin) || ($permissiontocloneuser && empty(
$object->admin) && !empty(
$object->entity))) {
2297 $cloneButtonId =
'';
2300 if (!empty(
$conf->use_javascript_ajax) && empty(
$conf->dol_use_jmobile)) {
2302 $cloneButtonId =
'action-clone';
2304 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $cloneUserUrl, $cloneButtonId, $user->hasRight(
'user',
'user',
'write'));
2308 if (
$object->status == $object::STATUS_DISABLED) {
2309 $params[
'attr'][
'title'] = $langs->trans(
'UserDisabled');
2311 } elseif (($user->id != $id && $permissiontoeditpasswordandsee) &&
$object->login && !
$object->ldap_sid &&
2313 unset($params[
'attr'][
'title']);
2314 print
dolGetButtonAction($langs->trans(
'ReinitPassword'),
'',
'default',
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'password'],
true),
'',
true, $params);
2317 if (
$object->status == $object::STATUS_DISABLED) {
2318 $params[
'attr'][
'title'] = $langs->trans(
'UserDisabled');
2319 print
dolGetButtonAction($langs->trans(
'SendNewPassword'),
'',
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false, $params);
2320 } elseif (($user->id != $id && $permissiontoeditpasswordandsend) &&
$object->login && !
$object->ldap_sid &&
2323 unset($params[
'attr'][
'title']);
2324 print
dolGetButtonAction($langs->trans(
'SendNewPassword'),
'',
'default',
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'passwordsend'],
true),
'',
true, $params);
2326 $params[
'attr'][
'title'] = $langs->trans(
'NoEMail');
2327 print
dolGetButtonAction($langs->trans(
'SendNewPassword'),
'',
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false, $params);
2332 if ($user->id != $id && $permissiontodisable &&
$object->status == User::STATUS_DISABLED &&
2334 unset($params[
'attr'][
'title']);
2338 if ($user->id != $id && $permissiontodisable &&
$object->status == User::STATUS_ENABLED &&
2340 unset($params[
'attr'][
'title']);
2341 print
dolGetButtonAction($langs->trans(
'DisableUser'),
'',
'default',
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'disable'],
true),
'',
true, $params);
2343 if ($user->id == $id) {
2344 $params[
'attr'][
'title'] = $langs->trans(
'CantDisableYourself');
2345 print
dolGetButtonAction($langs->trans(
'DisableUser'),
'',
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false, $params);
2349 if ($user->id != $id && $permissiontodisable &&
2351 if ($user->admin || !
$object->admin) {
2352 unset($params[
'attr'][
'title']);
2355 $params[
'attr'][
'title'] = $langs->trans(
'MustBeAdminToDeleteOtherAdmin');
2356 print
dolGetButtonAction($langs->trans(
'DeleteUser'),
'',
'default',
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'delete',
'id' =>
$object->id],
true),
'',
false, $params);
2366 if (
GETPOST(
'modelselected')) {
2367 $action =
'presend';
2371 $modelmail =
'user';
2372 $defaulttopic =
'Information';
2373 $diroutput =
$conf->user->dir_output;
2374 $trackid =
'use'.$object->id;
2376 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2378 if ($action !=
'presend' && $action !=
'send') {
2383 if ($permissiontoreadgroup) {
2384 print
'<!-- Group section -->'.
"\n";
2392 $groupslist = $usergroup->listGroupsForUser(
$object->id,
false);
2394 if (!empty($groupslist)) {
2395 foreach ($groupslist as $groupforuser) {
2396 $exclude[] = $groupforuser->id;
2401 $parameters = array(
'caneditgroup' => $permissiontoeditgroup,
'groupslist' => $groupslist,
'exclude' => $exclude);
2402 $reshook = $hookmanager->executeHooks(
'formAddUserToGroup', $parameters, $object, $action);
2403 print $hookmanager->resPrint;
2405 if (empty($reshook)) {
2406 if ($permissiontoeditgroup) {
2407 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$id.
'" method="POST">'.
"\n";
2408 print
'<input type="hidden" name="token" value="'.newToken().
'" />';
2409 print
'<input type="hidden" name="action" value="addgroup" />';
2410 print
'<input type="hidden" name="page_y" value="" />';
2413 print
'<!-- List of groups of the user -->'.
"\n";
2414 print
'<table class="noborder centpercent">'.
"\n";
2415 print
'<tr class="liste_titre">';
2417 print
'<th class="liste_titre right" colspan="2">';
2418 if ($permissiontoeditgroup) {
2419 print $form->select_dolgroups(0,
'group', 1, $exclude, 0,
'', array(), (
string)
$object->entity,
false,
'maxwidth150');
2421 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'" />';
2422 print
'<input type="submit" class="button buttongen button-add reposition" value="'.$langs->trans(
"Add").
'" />';
2424 print
'</th></tr>'.
"\n";
2427 if (!empty($groupslist)) {
2428 foreach ($groupslist as $group) {
2429 print
'<tr class="oddeven">';
2430 print
'<td class="tdoverflowmax200">';
2431 if ($permissiontoeditgroup) {
2432 print $group->getNomUrl(1);
2434 print
img_object($langs->trans(
"ShowGroup"),
"group").
' '.$group->name;
2437 print
'<td class="right">';
2438 if ($permissiontoeditgroup) {
2439 print
'<a class="reposition" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'removegroup',
'group' => $group->id],
true).
'">';
2440 print
img_picto($langs->trans(
"RemoveFromGroup"),
'unlink');
2445 print
"</td></tr>\n";
2448 print
'<tr class="oddeven"><td colspan="2"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td></tr>';
2453 if ($permissiontoeditgroup) {
2465 if ($action ==
'edit' && ($permissiontoedit || $permissiontoeditpasswordandsee)) {
2466 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST" name="updateuser" enctype="multipart/form-data">';
2467 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2468 print
'<input type="hidden" name="action" value="update">';
2469 print
'<input type="hidden" name="entity" value="'.$object->entity.
'">';
2473 print
'<table class="border centpercent">';
2477 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td>';
2486 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Lastname").
'</td>';
2488 if ($permissiontoedit && !
$object->ldap_sid) {
2489 print
'<input class="minwidth100" type="text" class="flat" name="lastname" value="'.$object->lastname.
'">';
2491 print
'<input type="hidden" name="lastname" value="'.$object->lastname.
'">';
2498 print
'<tr><td>'.$langs->trans(
"Firstname").
'</td>';
2500 if ($permissiontoedit && !
$object->ldap_sid) {
2501 print
'<input class="minwidth100" type="text" class="flat" name="firstname" value="'.$object->firstname.
'">';
2503 print
'<input type="hidden" name="firstname" value="'.$object->firstname.
'">';
2509 print
"<tr>".
'<td><span class="fieldrequired">'.$langs->trans(
"Login").
'</span></td>';
2511 if ($user->admin && !
$object->ldap_sid) {
2512 print
'<input maxlength="50" type="text" class="flat" name="login" value="'.$object->login.
'" spellcheck="false">';
2514 print
'<input type="hidden" name="login" value="'.$object->login.
'">';
2521 print
'<tr><td>'.$langs->trans(
"ExternalUser").
' ?</td>';
2523 if ($user->id ==
$object->id || !$user->admin) {
2525 $type = $langs->trans(
"Internal");
2527 $type = $langs->trans(
"External");
2530 print $form->textwithpicto($type, $langs->trans(
"InternalExternalDesc"));
2532 print
' ('.$langs->trans(
"DomainUser").
')';
2541 $eventsCompanyContact = array();
2542 $eventsCompanyContact[] = array(
'method' =>
'getContacts',
'url' =>
dol_buildpath(
'/core/ajax/contacts.php?showempty=1&token='.
currentToken(), 1),
'htmlname' =>
'contactid',
'params' => array(
'add-customer-contact' =>
'disabled'));
2544 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2545 print $form->select_company(
$object->socid,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2546 print
'<span class="clearbothonsmartphone"></span>';
2547 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2548 print $form->select_contact(0, 0,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2550 print
' ('.$langs->trans(
"DomainUser").
')';
2553 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2554 print $form->select_company(
$object->socid,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2555 print
'<span class="clearbothonsmartphone"></span>';
2556 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2557 print $form->select_contact(0,
$object->contact_id,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2559 print
' ('.$langs->trans(
"DomainUser").
')';
2562 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2563 print $form->select_company(0,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2564 print
'<span class="clearbothonsmartphone"></span>';
2565 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2566 print $form->select_contact(0,
$object->contact_id,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2568 print
' ('.$langs->trans(
"DomainUser").
')';
2571 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2572 print $form->select_company(0,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2573 print
'<span class="clearbothonsmartphone"></span>';
2574 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2575 print $form->select_contact(0, 0,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2581 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"Administrator"), $langs->trans(
"AdministratorDesc")).
'</td>';
2583 $langs->load(
"admin");
2585 print
'<input type="hidden" name="admin" value="'.$object->admin.
'">'.
yn(
$object->admin);
2586 print
' <span class="opacitymedium">('.$langs->trans(
"ExternalUser").
')</span>';
2590 $nbAdmin = $user->getNbOfUsers(
'active',
'', 1);
2591 $nbSuperAdmin = $user->getNbOfUsers(
'active',
'superadmin', 1);
2596 || (
isModEnabled(
'multicompany') && ((
$object->entity > 0 || ($user->entity == 0 &&
$object->entity == 0)) || $nbSuperAdmin > 1))
2599 print $form->selectyesno(
'admin',
$object->admin, 1,
false, 0, 1);
2602 if (
$conf->use_javascript_ajax) {
2603 print
'<script type="text/javascript">
2605 var admin = $("select[name=admin]").val();
2607 $("input[name=superadmin]")
2608 .prop("disabled", true)
2609 .prop("checked", false);
2611 if ($("input[name=superadmin]").is(":checked")) {
2612 $("select[name=entity]")
2613 .prop("disabled", true);
2615 $("select[name=admin]").change(function() {
2616 if ( $(this).val() == 0 ) {
2617 $("input[name=superadmin]")
2618 .prop("disabled", true)
2619 .prop("checked", false);
2620 $("select[name=entity]")
2621 .prop("disabled", false);
2623 $("input[name=superadmin]")
2624 .prop("disabled", false);
2627 $("input[name=superadmin]").change(function() {
2628 if ( $(this).is(":checked")) {
2629 $("select[name=entity]")
2630 .prop("disabled", true);
2632 $("select[name=entity]")
2633 .prop("disabled", false);
2640 $checked = ((
$object->admin && !
$object->entity) ?
' checked' :
'');
2641 print
'<input type="checkbox" name="superadmin" id="superadmin" value="1"'.$checked.
' /> <label for="superadmin">'.$langs->trans(
"SuperAdministrator").
'</span>';
2645 print
'<input type="hidden" name="admin" value="'.$object->admin.
'">';
2646 print
'<input type="hidden" name="superadmin" value="'.(empty(
$object->entity) ? 1 : 0).
'">';
2648 print $form->textwithpicto($yn, $langs->trans(
"DontDowngradeSuperAdmin"), 1,
'warning');
2658 print
'<tr><td class="titlefieldcreate"><label for="civility_code">'.$langs->trans(
"UserTitle").
'</label></td><td>';
2659 if ($permissiontoedit && !
$object->ldap_sid) {
2660 print $formcompany->select_civility(GETPOSTISSET(
"civility_code") ?
GETPOST(
"civility_code",
'aZ09') :
$object->civility_code,
'civility_code');
2661 } elseif (
$object->civility_code) {
2662 print $langs->trans(
"Civility".
$object->civility_code);
2668 print
'<tr><td>'.$langs->trans(
"Gender").
'</td>';
2670 $arraygender = array(
'man' => $langs->trans(
"Genderman"),
'woman' => $langs->trans(
"Genderwoman"),
'other' => $langs->trans(
"Genderother"));
2671 if ($permissiontoedit) {
2672 print $form->selectarray(
'gender', $arraygender, GETPOSTISSET(
'gender') ?
GETPOST(
'gender') :
$object->gender, 1);
2674 print $arraygender[
$object->gender];
2680 print
'<td>'.$form->editfieldkey(
'Employee',
'employee',
'', $object, 0).
'</td><td>';
2681 if ($permissiontoedit) {
2682 print
'<input type="checkbox" name="employee" value="1"'.($object->employee ?
' checked="checked"' :
'').
'>';
2685 print
'<input type="checkbox" name="employee" disabled value="1"'.($object->employee ?
' checked="checked"' :
'').
'>';
2694 if ($nbofusers > 1) {
2696 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"HierarchicalResponsible").
'</td>';
2698 if ($permissiontoedit) {
2699 print
img_picto(
'',
'user',
'class="pictofixedwidth"').$form->select_dolusers(GETPOSTISSET(
'fk_user') ?
GETPOSTINT(
'fk_user') :
$object->fk_user,
'fk_user', 1, array(
$object->id), 0,
'',
'', (
string)
$object->entity, 0, 0,
'', 0,
'',
'widthcentpercentminusx maxwidth300');
2701 print
'<input type="hidden" name="fk_user" value="'.$object->fk_user.
'">';
2703 $huser->fetch(
$object->fk_user);
2704 print $huser->getNomUrl(-1);
2711 print
'<tr><td class="titlefieldcreate">';
2712 $text = $langs->trans(
"ForceUserExpenseValidator");
2713 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
2716 if ($permissiontoedit) {
2717 print
img_picto(
'',
'user',
'class="pictofixedwidth"').$form->select_dolusers(
$object->fk_user_expense_validator,
'fk_user_expense_validator', 1, array(
$object->id), 0,
'',
'', (
string)
$object->entity, 0, 0,
'', 0,
'',
'widthcentpercentminusx maxwidth300');
2719 print
'<input type="hidden" name="fk_user_expense_validator" value="'.$object->fk_user_expense_validator.
'">';
2721 $evuser->fetch(
$object->fk_user_expense_validator);
2722 print $evuser->getNomUrl(-1);
2730 print
'<tr><td class="titlefieldcreate">';
2731 $text = $langs->trans(
"ForceUserHolidayValidator");
2732 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
2735 if ($permissiontoedit) {
2736 print
img_picto(
'',
'user',
'class="pictofixedwidth"').$form->select_dolusers(
$object->fk_user_holiday_validator,
'fk_user_holiday_validator', 1, array(
$object->id), 0,
'',
'', (
string)
$object->entity, 0, 0,
'', 0,
'',
'widthcentpercentminusx maxwidth300');
2738 print
'<input type="hidden" name="fk_user_holiday_validator" value="'.$object->fk_user_holiday_validator.
'">';
2740 $hvuser->fetch(
$object->fk_user_holiday_validator);
2741 print $hvuser->getNomUrl(-1);
2752 print
'<table class="border centpercent">';
2755 print
'<tr><td>'.$langs->trans(
"RangeOfLoginValidity").
'</td>';
2757 if ($permissiontoedit) {
2758 print $form->selectDate($datestartvalidity ? $datestartvalidity :
$object->datestartvalidity,
'datestartvalidity', 0, 0, 1,
'formdatestartvalidity', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"from"));
2764 if ($permissiontoedit) {
2765 print $form->selectDate($dateendvalidity ? $dateendvalidity :
$object->dateendvalidity,
'dateendvalidity', 0, 0, 1,
'formdateendvalidity', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"to"));
2774 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Password").
'</td>';
2777 if (preg_match(
'/ldap/', $dolibarr_main_authentication)) {
2778 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"PasswordOfUserInLDAP");
2780 if (preg_match(
'/http/', $dolibarr_main_authentication)) {
2781 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$form->textwithpicto((
string) $text, $langs->trans(
"DolibarrInHttpAuthenticationSoPasswordUseless", (
string) $dolibarr_main_authentication), 1,
'warning');
2783 if (preg_match(
'/dolibarr/', $dolibarr_main_authentication) || preg_match(
'/forceuser/', $dolibarr_main_authentication)) {
2784 if ($permissiontoeditpasswordandsee) {
2785 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').
'<input maxlength="128" type="password" class="minwidth300 maxwidth400 widthcentpercentminusx" id="password" name="password" value="'.
dol_escape_htmltag(
$object->pass).
'" autocomplete="new-password" spellcheck="false">';
2786 if (!empty(
$conf->use_javascript_ajax)) {
2787 $valuetoshow .=
img_picto((
getDolGlobalString(
'USER_PASSWORD_GENERATED') ===
'none' ? $langs->transnoentities(
'NoPasswordGenerationRuleConfigured') : $langs->transnoentities(
'Generate')),
'refresh',
'id="generate_password" class="paddingleft'.(
getDolGlobalString(
'USER_PASSWORD_GENERATED') ===
'none' ?
' ' :
' linkobject').
'"');
2790 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').preg_replace(
'/./i',
'*',
$object->pass);
2794 $parameters = array(
'valuetoshow' => $valuetoshow,
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
2795 $reshook = $hookmanager->executeHooks(
'printUserPasswordField', $parameters, $object, $action);
2797 $valuetoshow = $hookmanager->resPrint;
2799 $valuetoshow .= $hookmanager->resPrint;
2803 print
"</td></tr>\n";
2806 if ($_SESSION[
"dol_authmode"] ==
'dolibarr') {
2808 print
'<td></td><td>';
2809 $permissiontoselfeditpassword =
$object->hasRight(
'user',
'self',
'password');
2810 if ($permissiontoselfeditpassword) {
2811 if ($permissiontoedit) {
2812 print
'<input type="checkbox" name="forcepasswordchange" id="forcepasswordchange" value="1"'.($object->force_pass_change ?
' checked="checked"' :
'').
'>';
2813 print
'<label class="opacitylow" for="forcepasswordchange">'.$langs->trans(
"ForcePasswordChange").
'</label>';
2815 print
'<input type="checkbox" name="forcepasswordchange" class="colorgrey" disabled value="1"'.($object->force_pass_change ?
' checked="checked"' :
'').
'>';
2816 print $langs->trans(
"ForcePasswordChange");
2819 print
'<input type="checkbox" name="forcepasswordchange" value="1" class="colorgrey" disabled>';
2820 print
'<span class="opacitymedium" title="'.$langs->trans(
"UserDoesNotHaveRightsToChangeHisPassword").
'">'.$langs->trans(
"ForcePasswordChange").
'</span>';
2829 print
'<tr><td>'.$langs->trans(
"ApiKey").
'</td>';
2831 if ($permissiontoeditpasswordandsee) {
2832 print
'<input class="minwidth300 maxwidth400 widthcentpercentminusx" minlength="12" maxlength="128" type="text" id="api_key" name="api_key" value="'.$object->api_key.
'" autocomplete="off" spellcheck="false">';
2833 if (!empty(
$conf->use_javascript_ajax)) {
2834 print
img_picto($langs->transnoentities(
'Generate'),
'refresh',
'id="generate_api_key" class="linkobject paddingleft"');
2842 if (isset(
$conf->file->main_authentication) && preg_match(
'/openid/',
$conf->file->main_authentication) &&
getDolGlobalString(
'MAIN_OPENIDURL_PERUSER')) {
2843 print
"<tr>".
'<td>'.$langs->trans(
"OpenIDURL").
'</td>';
2845 if ($permissiontoedit) {
2846 print
'<input class="minwidth100" type="url" name="openid" class="flat" value="'.$object->openid.
'">';
2848 print
'<input type="hidden" name="openid" value="'.$object->openid.
'">';
2854 print
'</table><hr><table class="border centpercent">';
2858 print
'<tr><td class="tdtop titlefieldcreate">'.$form->editfieldkey(
'Address',
'address',
'', $object, 0).
'</td>';
2860 if ($permissiontoedit) {
2861 print
'<textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
2864 if ($permissiontoedit) {
2865 print
'</textarea>';
2870 print
'<tr><td>'.$form->editfieldkey(
'Zip',
'zipcode',
'', $object, 0).
'</td><td>';
2871 if ($permissiontoedit) {
2872 print $formcompany->select_ziptown((GETPOSTISSET(
'zipcode') ?
GETPOST(
'zipcode') :
$object->zip),
'zipcode', array(
'town',
'selectcountry_id',
'state_id'), 6);
2879 print
'<tr><td>'.$form->editfieldkey(
'Town',
'town',
'', $object, 0).
'</td><td>';
2880 if ($permissiontoedit) {
2881 print $formcompany->select_ziptown((GETPOSTISSET(
'town') ?
GETPOST(
'town') :
$object->town),
'town', array(
'zipcode',
'selectcountry_id',
'state_id'));
2888 print
'<tr><td>'.$form->editfieldkey(
'Country',
'selectcountry_id',
'', $object, 0).
'</td><td>';
2889 print
img_picto(
'',
'country',
'class="pictofixedwidth"');
2890 if ($permissiontoedit) {
2891 print $form->select_country((
GETPOST(
'country_id') !=
'' ?
GETPOST(
'country_id') :
$object->country_id),
'country_id');
2893 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
2897 print $countrylabel;
2903 print
'<tr><td class="tdoverflow">'.$form->editfieldkey(
'State',
'state_id',
'', $object, 0).
'</td><td>';
2904 if ($permissiontoedit) {
2905 print
img_picto(
'',
'state',
'class="pictofixedwidth"');
2906 print $formcompany->select_state_ajax(
'country_id',
$object->state_id,
$object->country_id,
'state_id');
2914 print
"<tr>".
'<td>'.$langs->trans(
"PhonePro").
'</td>';
2916 print
img_picto(
'',
'phoning',
'class="pictofixedwidth"');
2917 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2918 print
'<input type="text" name="office_phone" class="flat maxwidth200 widthcentpercentminusx" value="'.$object->office_phone.
'">';
2920 print
'<input type="hidden" name="office_phone" value="'.$object->office_phone.
'">';
2926 print
"<tr>".
'<td>'.$langs->trans(
"PhoneMobile").
'</td>';
2928 print
img_picto(
'',
'phoning_mobile',
'class="pictofixedwidth"');
2929 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2930 print
'<input type="text" name="user_mobile" class="flat maxwidth200 widthcentpercentminusx" value="'.$object->user_mobile.
'" spellcheck="false">';
2932 print
'<input type="hidden" name="user_mobile" value="'.$object->user_mobile.
'">';
2938 print
"<tr>".
'<td>'.$langs->trans(
"Fax").
'</td>';
2940 print
img_picto(
'',
'phoning_fax',
'class="pictofixedwidth"');
2941 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2942 print
'<input type="text" name="office_fax" class="flat maxwidth200 widthcentpercentminusx" value="'.$object->office_fax.
'">';
2944 print
'<input type="hidden" name="office_fax" value="'.$object->office_fax.
'">';
2950 print
"<tr>".
'<td'.(
getDolGlobalString(
'USER_MAIL_REQUIRED') ?
' class="fieldrequired"' :
'').
'>'.$langs->trans(
"EMail").
'</td>';
2952 print
img_picto(
'',
'object_email',
'class="pictofixedwidth"');
2953 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2954 print
'<input class="minwidth100 maxwidth500 widthcentpercentminusx" type="text" name="email" class="flat" value="'.$object->email.
'">';
2956 print
'<input type="hidden" name="email" value="'.$object->email.
'">';
2962 foreach ($socialnetworks as $key => $value) {
2963 if ($value[
'active']) {
2964 print
'<tr><td>'.$langs->trans($value[
'label']).
'</td>';
2966 if (!empty($value[
'icon'])) {
2967 print
'<span class="fab '.$value[
'icon'].
' pictofixedwidth"></span>';
2969 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2970 print
'<input type="text" name="'.$key.
'" class="flat maxwidth200 widthcentpercentminusx" value="'.(isset(
$object->socialnetworks[$key]) ?
$object->socialnetworks[$key] :
'').
'">';
2972 print
'<input type="hidden" name="'.$key.
'" value="'.
$object->socialnetworks[$key].
'">';
2973 print
$object->socialnetworks[$key];
2978 print
'<input type="hidden" name="'.$key.
'" value="'.(isset(
$object->socialnetworks[$key]) ?
$object->socialnetworks[$key] :
'').
'">';
2983 print
'</table><hr><table class="border centpercent">';
2987 print
'<tr><td class="titlefield">'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
2988 print $formproduct->selectWarehouses(
$object->fk_warehouse,
'fk_warehouse',
'warehouseopen', 1);
2989 print
' <a href="'.DOL_URL_ROOT.
'/product/stock/card.php?action=create&token='.
newToken().
'&backtopage='.urlencode($_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=edit&token='.
newToken()).
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddWarehouse").
'"></span></a>';
2996 print
'<td class="titlefieldcreate">'.$langs->trans(
"AccountancyCode").
'</td>';
2998 if ($permissiontoedit) {
2999 print
'<input type="text" class="flat maxwidth300" name="accountancy_code" value="'.$object->accountancy_code.
'">';
3001 print
'<input type="hidden" name="accountancy_code" value="'.$object->accountancy_code.
'">';
3002 print
$object->accountancy_code;
3010 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ColorUser").
'</td>';
3012 if ($permissiontoedit) {
3013 print $formother->selectColor(GETPOSTISSET(
'color') ?
GETPOST(
'color',
'alphanohtml') :
$object->color,
'color', null, 1, array(),
'hideifnotset');
3015 print $formother->showColor(
$object->color,
'');
3022 print
'<td class="titlefieldcreate">'.$langs->trans(
"Photo").
'</td>';
3024 print $form->showphoto(
'userphoto', $object, 60, 0, (
int) $permissiontoedit,
'photowithmargin',
'small', 1, 0,
'user', 1);
3029 if (
isModEnabled(
'category') && $user->hasRight(
"categorie",
"read")) {
3030 print
'<tr><td>'.$form->editfieldkey(
'Categories',
'usercats',
'', $object, 0).
'</td>';
3032 if ($permissiontoedit) {
3033 print $form->selectCategories(Categorie::TYPE_USER,
'usercats', $object);
3035 print $form->showCategories(
$object->id, Categorie::TYPE_USER, 1);
3042 print
'<tr><td>'.$form->editfieldkey(
'DefaultLang',
'default_lang',
'', $object, 0,
'string',
'', 0, 0,
'id', $langs->trans(
"WarningNotLangOfInterface", $langs->transnoentitiesnoconv(
"UserGUISetup"))).
'</td><td colspan="3">'.
"\n";
3043 print
img_picto(
'',
'language',
'class="pictofixedwidth"').$formadmin->select_language(
$object->lang,
'default_lang', 0, array(),
'1', 0, 0,
'widthcentpercentminusx maxwidth300');
3049 print
'<tr><td>'.$langs->trans(
"Status").
'</td>';
3051 print
$object->getLibStatut(4);
3079 $langs->load(
"members");
3080 print
'<tr><td>'.$langs->trans(
"LinkedToDolibarrMember").
'</td>';
3084 $adh->fetch(
$object->fk_member);
3085 $adh->ref = $adh->login;
3086 print $adh->getNomUrl(1);
3088 print
'<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"UserNotLinkedToMember").
'</span>';
3096 if (
isModEnabled(
'multicompany') && isset($mc) && is_object($mc)) {
3098 if (!method_exists($mc,
'formObjectOptions')) {
3099 if (empty(
$conf->multicompany->transverse_mode) &&
$conf->entity == 1 && $user->admin && !$user->entity) {
3100 print
"<tr>".
'<td>'.$langs->trans(
"Entity").
'</td>';
3101 print
"<td>".$mc->select_entities(
$object->entity,
'entity',
'',
false,
true,
false,
false,
true);
3102 print
"</td></tr>\n";
3104 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'" />';
3110 $parameters = array(
'colspan' =>
' colspan="2"');
3112 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3113 print $hookmanager->resPrint;
3114 if (empty($reshook)) {
3115 if ($permissiontoedit) {
3116 print
$object->showOptionals($extrafields,
'edit');
3118 print
$object->showOptionals($extrafields,
'view');
3123 print
'<tr><td class="tdtop">'.$langs->trans(
"Signature").
'</td>';
3125 if ($permissiontoedit) {
3126 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
3128 $doleditor =
new DolEditor(
'signature',
$object->signature,
'', 138,
'dolibarr_notes',
'In',
false, $acceptlocallinktomedia, !
getDolGlobalString(
'FCKEDITOR_ENABLE_USERSIGN') ? 0 : 1, ROWS_4,
'90%');
3129 print $doleditor->Create(1);
3141 print
'<table class="border centpercent">';
3147 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"PostOrFunction").
'</td>';
3149 if ($permissiontoedit) {
3150 print
'<input type="text" class="minwidth300 maxwidth500" name="job" value="'.dol_escape_htmltag(
$object->job).
'">';
3152 print
'<input type="hidden" name="job" value="'.dol_escape_htmltag(
$object->job).
'">';
3158 print
'<tr><td>'.$langs->trans(
"WeeklyHours").
'</td>';
3160 if ($permissiontoedit) {
3161 print
'<input size="8" type="text" name="weeklyhours" value="'.price2num(
GETPOST(
'weeklyhours') ?
GETPOST(
'weeklyhours') :
$object->weeklyhours).
'">';
3169 if ($permissiontoseesalary) {
3170 $langs->load(
"salaries");
3173 print
'<tr><td>'.$langs->trans(
"Salary").
'</td>';
3175 print
img_picto(
'',
'salary',
'class="pictofixedwidth paddingright"').
'<input size="8" type="text" name="salary" value="'.
price2num(
GETPOST(
'salary') ?
GETPOST(
'salary') :
$object->salary).
'">';
3176 print
' <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
3182 $text = $langs->trans(
"THM");
3183 print $form->textwithpicto($text, $langs->trans(
"THMDescription"), 1,
'help',
'classthm');
3186 if ($permissiontoedit) {
3187 print
'<input size="8" type="text" name="thm" value="'.price2num(
GETPOST(
'thm') ?
GETPOST(
'thm') :
$object->thm).
'">';
3188 print
' <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
3197 $text = $langs->trans(
"TJM");
3198 print $form->textwithpicto($text, $langs->trans(
"TJMDescription"), 1,
'help',
'classthm');
3201 if ($permissiontoedit) {
3202 print
'<input size="8" type="text" name="tjm" value="'.price2num(
GETPOST(
'tjm') ?
GETPOST(
'tjm') :
$object->tjm).
'">';
3203 print
' <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
3212 print
'<tr><td>'.$langs->trans(
"DateEmployment").
'</td>';
3214 if ($permissiontoedit) {
3215 print $form->selectDate($dateemployment ? $dateemployment :
$object->dateemployment,
'dateemployment', 0, 0, 1,
'formdateemployment', 1, 1, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"from"));
3220 if ($dateemployment && $dateemploymentend) {
3224 if ($permissiontoedit) {
3225 print $form->selectDate($dateemploymentend ? $dateemploymentend :
$object->dateemploymentend,
'dateemploymentend', 0, 0, 1,
'formdateemploymentend', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"to"));
3233 print
'<tr><td>'.$langs->trans(
"DateOfBirth").
'</td>';
3235 if ($permissiontoedit) {
3236 echo $form->selectDate($dateofbirth ? $dateofbirth :
$object->birth,
'dateofbirth', 0, 0, 1,
'updateuser', 1, 0, 0,
'',
'',
'',
'', 1,
'',
'',
'tzserver');
3247 print
'<div class="center">';
3248 print
'<input value="'.$langs->trans(
"Save").
'" class="button button-save" type="submit" name="save">';
3249 print
' ';
3250 print
'<input value="'.$langs->trans(
"Cancel").
'" class="button button-cancel" type="submit" name="cancel">';
3256 if ($action !=
'edit' && $action !=
'presend') {
3257 print
'<div class="fichecenter"><div class="fichehalfleft">';
3262 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3263 $genallowed = $user->hasRight(
"user",
"user",
"read");
3264 $delallowed = $user->hasRight(
"user",
"user",
"write");
3269 $societe->fetch(
$object->socid);
3274 print $formfile->showdocuments(
'user', $filename, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 0, 0, 0, 28, 0,
'',
'',
'', !is_object($societe) || empty($societe->default_lang) ?
'' : $societe->default_lang);
3275 $somethingshown = $formfile->numoffiles;
3279 $morehtmlcenter =
'<div class="nowraponall">';
3280 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/user/messaging.php?id='.
$object->id);
3281 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/user/agenda.php?id='.
$object->id);
3282 $morehtmlcenter .=
'</div>';
3284 print
'</div><div class="fichehalfright">';
3287 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3289 $somethingshown = $formactions->showactions($object,
'user', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter,
$object->id);
3291 print
'</div></div>';
3301include_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage members of a foundation.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
Class to manage LDAP features.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage user groups.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
addFileIntoDatabaseIndex($dir, $file, $fullpathorig='', $mode='uploaded', $setsharekey=0, $object=null, $forceFullTextIndexation='')
Add a file into database index.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0, $uploaderrorcode=0, $nohook=0, $keyforsourcefile='addedfile', $upload_dir='', $mode=0)
Check validity of a file upload from an GUI page, and move it to its final destination.
deleteFilesIntoDatabaseIndex($dir, $file, $mode='uploaded', $object=null)
Delete files into database index using search criteria.
acceptLocalLinktoMedia()
Check the syntax of some PHP code.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=2, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
currentToken()
Return the value of token currently saved into session with name 'token'.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
getArrayOfSocialNetworks()
Get array of social network dictionary.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
treeview li table
No Email.
div refaddress div address
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $jsonclose='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
$conf db user
Active Directory does not allow anonymous connections.
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
'integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter[:Sortfield]]]',...
$conf db name
Only used if Module[ID]Name translation string is not found.
dolJSToSetRandomPassword($htmlname, $htmlnameofbutton='generate_token', $generic=1)
Output javascript to autoset a generated password using default module into a HTML element.
getRandomPassword($generic=false, $replaceambiguouschars=null, $length=32)
Return a generated password using default module.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
dol_verifyHash($chain, $hash, $type='0')
Compute a hash and compare it to the given one For backward compatibility reasons,...
user_prepare_head(User $object)
Prepare array with list of tabs.