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) {
253 print
'Error, token required for this critical operation';
259 if (
$object->admin && empty($user->admin)) {
262 setEventMessages($langs->trans(
"OnlyAdminUsersCanDeleteAdminUsers"),
null,
'errors');
266 $result =
$object->delete($user);
268 $langs->load(
"errors");
272 header(
"Location: ".DOL_URL_ROOT.
"/user/list.php?restore_lastsearch_values=1");
280 if ($action ==
'add' && $permissiontoadd) {
294 if (!empty(
$conf->file->main_limit_users)) {
295 $nb =
$object->getNbOfUsers(
"active");
296 if ($nb >=
$conf->file->main_limit_users) {
298 setEventMessages($langs->trans(
"YourQuotaOfUsersIsReached"),
null,
'errors');
308 $object->national_registration_number =
GETPOST(
"national_registration_number",
'alphanohtml');
323 $object->socialnetworks = array();
324 foreach ($socialnetworks as $key => $value) {
325 if (
GETPOST($key,
'alphanohtml')) {
331 $object->email = preg_replace(
'/\s+/',
'',
GETPOST(
"email",
'alphanohtml'));
338 if (
$object->signature ===
'ErrorTooManyLinksIntoHTMLString') {
340 $langs->load(
"errors");
341 setEventMessages($langs->trans(
'ErrorTooManyLinksIntoHTMLString'),
null,
'errors');
344 $object->accountancy_code =
GETPOST(
"accountancy_code",
'alphanohtml');
353 if ($permissiontoseesalary) {
366 $object->color =
GETPOST(
"color",
'alphanohtml') !=
'' ? str_replace(
'#',
'', (
string)
GETPOST(
"color",
'alphanohtml')) :
'';
368 $object->dateemployment = $dateemployment;
369 $object->dateemploymentend = $dateemploymentend;
370 $object->datestartvalidity = $datestartvalidity;
371 $object->dateendvalidity = $dateendvalidity;
373 $object->force_pass_change = $forcepasswordchange;
380 $ret = $extrafields->setOptionalsFromPost(
null, $object);
394 $object->entity = ($entity ==
'' ? 1 : $entity);
398 $object->entity = ($entity ==
'' ? 1 : $entity);
409 if (
GETPOST(
'password',
'password')) {
410 $resPass =
$object->setPassword($user,
GETPOST(
'password',
'password'));
412 if (is_int($resPass) && $resPass < 0) {
413 $langs->load(
"errors");
420 $usercats =
GETPOST(
'usercats',
'array:int');
421 $object->setCategories($usercats);
425 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$id);
429 $langs->load(
"errors");
438 if (($action ==
'addgroup' || $action ==
'removegroup') && $permissiontoeditgroup) {
441 $editgroup->fetch($group);
442 $editgroup->oldcopy = clone $editgroup;
446 if ($action ==
'addgroup') {
447 $result =
$object->SetInGroup($group, $editgroup->entity);
449 if ($action ==
'removegroup') {
450 $result =
$object->RemoveFromGroup($group, $editgroup->entity);
461 if ($action ==
'update' && ($permissiontoedit || $permissiontoeditpasswordandsee)) {
462 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
464 if ($permissiontoedit) {
467 if (!
GETPOST(
"lastname",
'alpha')) {
472 if (!
GETPOST(
"login",
'alpha')) {
494 $object->national_registration_number =
GETPOST(
"national_registration_number",
'alphanohtml');
497 if ($permissiontoeditpasswordandsee) {
500 if ($permissiontoeditpasswordandsee || $user->hasRight(
"api",
"apikey",
"generate")) {
503 if (!empty($user->admin) && $user->id != $id) {
508 if ($user->admin && !
$object->ldap_sid) {
521 $object->socialnetworks = array();
522 foreach ($socialnetworks as $key => $value) {
523 if (
GETPOST($key,
'alphanohtml')) {
529 $object->email = preg_replace(
'/\s+/',
'',
GETPOST(
"email",
'alphanohtml'));
536 if (
$object->signature ===
'ErrorTooManyLinksIntoHTMLString') {
538 $langs->load(
"errors");
539 setEventMessages($langs->trans(
'ErrorTooManyLinksIntoHTMLString'),
null,
'errors');
542 $object->accountancy_code =
GETPOST(
"accountancy_code",
'alphanohtml');
550 if ($permissiontoseesalary) {
563 $object->color =
GETPOST(
"color",
'alphanohtml') !=
'' ? str_replace(
'#',
'', (
string)
GETPOST(
"color",
'alphanohtml')) :
'';
564 $object->dateemployment = $dateemployment;
565 $object->dateemploymentend = $dateemploymentend;
566 $object->datestartvalidity = $datestartvalidity;
567 $object->dateendvalidity = $dateendvalidity;
569 $object->force_pass_change = $forcepasswordchange;
578 if (
isModEnabled(
'multicompany') && empty($user->entity) && !empty($user->admin)) {
592 $ret = $extrafields->setOptionalsFromPost(
null, $object,
'@GETPOSTISSET');
600 if (!empty($_FILES[
'photo'][
'name'])) {
604 if (
$object->id == $user->id) {
609 $langs->load(
"errors");
611 dol_syslog($langs->transnoentities(
"ErrorBadImageFormat"), LOG_INFO);
616 $passwordismodified = 0;
619 $passwordismodified = 1;
626 if (
$db->errno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
627 $langs->load(
"errors");
628 setEventMessages($langs->trans(
"ErrorUpdateCanceledDueToDuplicatedUniqueValue",
$object->login),
null,
'errors');
640 if ($contactid > 0) {
642 $contact->fetch($contactid);
644 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"user";
645 $sql .=
" SET fk_socpeople=".((int) $contactid);
646 if (!empty($contact->socid)) {
647 $sql .=
", fk_soc=".((int) $contact->socid);
648 } elseif ($socid > 0) {
649 $sql .=
", fk_soc = null";
650 setEventMessages($langs->trans(
"WarningUserDifferentContactSocid"),
null,
'warnings');
652 $sql .=
" WHERE rowid = ".((int)
$object->id);
653 } elseif ($socid > 0) {
654 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"user";
655 $sql .=
" SET fk_socpeople=NULL, fk_soc=".((int) $socid);
656 $sql .=
" WHERE rowid = ".((int)
$object->id);
658 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"user";
659 $sql .=
" SET fk_socpeople=NULL, fk_soc=NULL";
660 $sql .=
" WHERE rowid = ".((int)
$object->id);
663 $resql =
$db->query($sql);
670 if (!$error && !count(
$object->errors)) {
672 $fileimg =
$conf->user->dir_output.
'/'.
get_exdir(0, 0, 0, 0, $object,
'user').
'photos/'.
$object->oldcopy->photo;
675 $dirthumbs =
$conf->user->dir_output.
'/'.
get_exdir(0, 0, 0, 0, $object,
'user').
'photos/thumbs';
679 if (isset($_FILES[
'photo'][
'tmp_name']) && trim($_FILES[
'photo'][
'tmp_name'])) {
680 $dir =
$conf->user->dir_output.
'/'.
get_exdir(0, 0, 0, 1, $object,
'user').
'/photos';
687 $result =
dol_move_uploaded_file($_FILES[
'photo'][
'tmp_name'], $newfile, 1, 0, $_FILES[
'photo'][
'error']);
689 if (!($result > 0)) {
697 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
706 $langs->load(
"errors");
707 setEventMessages($langs->trans(
"ErrorFailedToCreateDir", $dir), $mesgs,
'errors');
712 if (!$error && !count(
$object->errors)) {
714 $categories =
GETPOST(
'usercats',
'array:int');
715 $object->setCategories($categories);
718 if (!$error && !count(
$object->errors)) {
722 $login = $_SESSION[
"dol_login"];
725 $langs->load(
"errors");
726 setEventMessages($langs->transnoentitiesnoconv(
"WarningYourLoginWasModifiedPleaseLogin"),
null,
'warnings');
728 if ($passwordismodified &&
$object->login == $user->login) {
730 $langs->load(
"errors");
731 setEventMessages($langs->transnoentitiesnoconv(
"WarningYourPasswordWasModifiedPleaseLogin"),
null,
'warnings');
732 header(
"Location: ".DOL_URL_ROOT.
'/user/card.php?id='.
$object->id);
740 if ($permissiontoeditpasswordandsee) {
741 dol_syslog(
"Not allowed to change fields, only password");
745 if (
GETPOST(
"password",
"password")) {
748 $ret =
$object->setPassword($user,
GETPOST(
"password",
"password"));
749 if (is_int($ret) && $ret < 0) {
758 if ((($action ==
'confirm_password' && $confirm ==
'yes' && $permissiontoeditpasswordandsee)
759 || ($action ==
'confirm_passwordsend' && $confirm ==
'yes' && $permissiontoeditpasswordandsend))
763 $newpassword =
$object->setPassword($user,
'');
764 if (is_int($newpassword) && $newpassword < 0) {
766 setEventMessages($langs->trans(
"ErrorFailedToSetNewPassword"),
null,
'errors');
769 if ($action ==
'confirm_passwordsend') {
770 if (
$object->send_password($user, $newpassword) > 0) {
776 setEventMessages($langs->trans(
"PasswordChangedTo", $newpassword),
null,
'warnings');
782 if ($action ==
'adduserldap' && $permissiontoadd) {
783 $selecteduser =
GETPOST(
'users');
785 $required_fields = array(
802 $arrayofsocialnetworks = array(
'skype',
'twitter',
'facebook',
'linkedin');
803 foreach ($arrayofsocialnetworks as $socialnetwork) {
809 $result = $ldap->connectBind();
812 $required_fields = array_unique(array_values(array_filter($required_fields,
"dol_validElement")));
817 if (is_array($ldapusers)) {
818 foreach ($ldapusers as $key => $attribute) {
830 $ldap_social = array();
833 $arrayofsocialnetworks = array(
'skype',
'twitter',
'facebook',
'linkedin');
834 foreach ($arrayofsocialnetworks as $socialnetwork) {
835 $ldap_social[$socialnetwork] = $attribute[
getDolGlobalString(
'LDAP_FIELD_'.strtoupper($socialnetwork))];
845 if ($action ==
'confirm_clone' && $confirm !=
'yes') {
848 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $permissiontocloneuser) {
852 setEventMessages($langs->trans(
'ErrorNoCloneWithoutEmail'),
null,
'errors');
860 $clone->api_key =
'';
861 $clone->admin = ($user->admin ?
$object->admin : 0);
863 $parts = explode(
' ',
GETPOST(
'clone_name'), 2);
864 $clone->firstname = $parts[0];
865 $clone->lastname = isset($parts[1]) ? $parts[1] :
'';
867 $clone->login = substr($parts[0], 0, 1).$parts[1];
870 $clone->context[
'createfromclone'] =
'createfromclone';
871 $id = $clone->create($user);
872 $refalreadyexists = 0;
875 $result = $clone->cloneRights(
$object->id, $id);
878 if (
GETPOST(
'clone_categories')) {
879 $result = $clone->cloneCategories(
$object->id, $id);
887 if ($clone->error ==
'ErrorProductAlreadyExists') {
891 $mesg = $langs->trans(
"ErrorProductAlreadyExists", $clone->ref);
892 $mesg .=
' <a href="' . $_SERVER[
"PHP_SELF"] .
'?ref=' . $clone->ref .
'">' . $langs->trans(
"ShowCardHere") .
'</a>.';
895 setEventMessages(empty($clone->error) ?
'' : $langs->trans($clone->error), $clone->errors,
'errors');
899 unset($clone->context[
'createfromclone']);
906 header(
"Location: " . $_SERVER[
"PHP_SELF"] .
"?id=" . $id);
917 $triggersendname =
'USER_SENTBYMAIL';
919 $mode =
'emailfromuser';
920 $trackid =
'use'.$id;
921 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
924 $upload_dir =
$conf->user->dir_output;
925 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
928 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
948$sql =
"SELECT COUNT(rowid) as nb FROM ".MAIN_DB_PREFIX.
'user WHERE entity IN ('.
getEntity(
'user').
')';
949$resql =
$db->query($sql);
951 $obj =
$db->fetch_object($resql);
953 $nbofusers = $obj->nb;
961 $title = $person_name.
" - ".$langs->trans(
'Card');
964 $title = $langs->trans(
"NewEmployee");
966 $title = $langs->trans(
"NewUser");
972llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-user page-card');
974if ($action ==
'create' || $action ==
'adduserldap') {
977 print
'<span class="opacitymedium">'.$langs->trans(
"CreateInternalUserDesc", $langs->transnoentities(
"CreateExternalUser")).
"</span><br>\n";
986 $result = $ldap->connectBind();
988 $required_fields = array(
1008 $required_fields = array_unique(array_values(array_filter($required_fields,
"dol_validElement")));
1013 if (is_array($ldapusers)) {
1014 foreach ($ldapusers as $key => $ldapuser) {
1017 foreach ($required_fields as $value) {
1019 $label .= $value.
"=******* ";
1021 $label .= $value.
"=".$ldapuser[$value].
" ";
1024 $liste[$key] = $label;
1034 print
"\n\n<!-- Form liste LDAP debut -->\n";
1036 print
'<form name="add_user_ldap" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1037 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1038 print
'<table class="border centpercent"><tr>';
1039 print
'<td width="160">';
1040 print $langs->trans(
"LDAPUsers");
1043 print
'<input type="hidden" name="action" value="adduserldap">';
1044 if (is_array($liste) && count($liste)) {
1045 print $form->selectarray(
'users', $liste,
'', 1, 0, 0,
'', 0, 0, 0,
'',
'maxwidth500');
1048 print
'</td><td class="center">';
1049 print
'<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans(
'Get')).
'"'.(count($liste) ?
'' :
' disabled').
'>';
1050 print
'</td></tr></table>';
1053 print
"\n<!-- Form liste LDAP fin -->\n\n";
1058 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'" method="POST" name="createuser">';
1059 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1060 print
'<input type="hidden" name="action" value="add">';
1061 if (!empty($ldap_sid)) {
1062 print
'<input type="hidden" name="ldap_sid" value="'.dol_escape_htmltag($ldap_sid).
'">';
1064 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'">';
1070 print
'<table class="border centpercent">';
1074 print
'<tr><td><label for="civility_code">'.$langs->trans(
"UserTitle").
'</label></td><td>';
1075 print $formcompany->select_civility(
GETPOSTISSET(
"civility_code") ?
GETPOST(
"civility_code",
'aZ09') :
$object->civility_code,
'civility_code');
1081 print
'<td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans(
"Lastname").
'</span></td>';
1083 if (!empty($ldap_lastname)) {
1084 print
'<input type="hidden" id="lastname" name="lastname" value="'.dol_escape_htmltag($ldap_lastname).
'">';
1085 print $ldap_lastname;
1087 print
'<input class="minwidth100 maxwidth150onsmartphone createloginauto" type="text" id="lastname" name="lastname" value="'.dol_escape_htmltag(
GETPOST(
'lastname',
'alphanohtml')).
'">';
1092 print
'<tr><td>'.$langs->trans(
"Firstname").
'</td>';
1094 if (!empty($ldap_firstname)) {
1095 print
'<input type="hidden" name="firstname" value="'.dol_escape_htmltag($ldap_firstname).
'">';
1096 print $ldap_firstname;
1098 print
'<input id="firstname" class="minwidth100 maxwidth150onsmartphone createloginauto" type="text" name="firstname" value="'.dol_escape_htmltag(
GETPOST(
'firstname',
'alphanohtml')).
'">';
1103 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Login").
'</span></td>';
1105 if (!empty($ldap_login)) {
1106 print
'<input type="hidden" name="login" value="'.dol_escape_htmltag($ldap_login).
'">';
1108 } elseif (!empty($ldap_loginsmb)) {
1109 print
'<input type="hidden" name="login" value="'.dol_escape_htmltag($ldap_loginsmb).
'">';
1110 print $ldap_loginsmb;
1112 print
'<input id="login" class="maxwidth200 maxwidth150onsmartphone" maxsize="24" type="text" name="login" value="'.dol_escape_htmltag(
GETPOST(
'login',
'alphanohtml')).
'" spellcheck="false">';
1116 if (!empty(
$conf->use_javascript_ajax)) {
1120 $charforseparator =
getDolGlobalString(
"MAIN_USER_SEPARATOR_CHAR_FOR_GENERATED_LOGIN",
'.');
1121 if ($charforseparator ==
'none') {
1122 $charforseparator =
'';
1125 jQuery(document).ready(function() {
1126 $(".createloginauto").on("keyup", function() {
1127 console.log(".createloginauto change: We generate login when we have a lastname");
1129 lastname = $("#lastname").val().toLowerCase();
1132 print
' firstname = $("#firstname").val().toLowerCase().replace(/\s+/g, \'\').trim()[0];';
1133 $charforseparator =
'';
1135 print
' firstname = $("#firstname").val().toLowerCase().replace(/\s+/g, \'\').trim()[0];';
1137 print
' firstname = $("#firstname").val().toLowerCase().replace(/\s+/g, \'\').trim();';
1143 login = firstname + \''.
dol_escape_js($charforseparator).
'\';
1145 login += lastname.replace(/\s+/g, \
'\').trim();
1147 $(
"#login").val(login);
1153 $generated_password = '';
1154 if (empty($ldap_sid)) { // ldap_sid is for activedirectory
1155 $generated_password = getRandomPassword(false);
1157 $password = (GETPOSTISSET('password
') ? GETPOST('password
') : $generated_password);
1160 if (!empty($user->admin)) {
1161 print '<tr><td>
'.$form->textwithpicto($langs->trans("Administrator"), $langs->trans("AdministratorDesc"), 1, 'help
').'</td>
';
1163 print $form->selectyesno('admin
', GETPOST('admin
'), 1, false, 0, 1);
1165 if (isModEnabled('multicompany
') && !$user->entity) {
1166 if (!empty($conf->use_javascript_ajax)) {
1167 print '<script
type=
"text/javascript">
1169 $(
"select[name=admin]").change(
function() {
1170 if ( $(
this).val() == 0 ) {
1171 $(
"input[name=superadmin]")
1172 .prop(
"disabled",
true)
1173 .prop(
"checked",
false);
1174 $(
"select[name=entity]")
1175 .prop(
"disabled",
false);
1177 $(
"input[name=superadmin]")
1178 .prop(
"disabled",
false);
1181 $(
"input[name=superadmin]").change(
function() {
1182 if ( $(
this).is(
":checked") ) {
1183 $(
"select[name=entity]")
1184 .prop(
"disabled",
true);
1186 $(
"select[name=entity]")
1187 .prop(
"disabled",
false);
1193 $checked = (GETPOSTINT('superadmin
') ? ' checked
' : '');
1194 $disabled = (GETPOSTINT('superadmin
') ? '' : ' disabled');
1195 print '<input
type=
"checkbox" name=
"superadmin" id=
"superadmin" value=
"1"'.$checked.$disabled.' /> <label
for=
"superadmin">
'.$langs->trans("SuperAdministrator").'</span>
';
1197 print "</td></tr>\n";
1201 print '<tr><td>
'.$langs->trans("Gender").'</td>
';
1203 $arraygender = array('man
' => $langs->trans("Genderman"), 'woman
' => $langs->trans("Genderwoman"), 'other
' => $langs->trans("Genderother"));
1204 print $form->selectarray('gender
', $arraygender, GETPOST('gender
'), 1);
1208 $defaultemployee = '1
';
1210 print '<td>
'.$langs->trans('Employee
').'</td><td>
';
1211 print '<input
type=
"checkbox" name=
"employee" value=
"1"'.(GETPOST('employee
') == '1
' ? ' checked=
"checked"' : (($defaultemployee && !GETPOSTISSET('login
')) ? ' checked=
"checked"' : '')).'>
';
1212 //print $form->selectyesno("employee", (GETPOST('employee
') != '' ?GETPOST('employee
') : $defaultemployee), 1);
1216 print '<tr><td
class=
"titlefieldcreate">
'.$langs->trans("HierarchicalResponsible").'</td>
';
1218 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
');
1222 // Expense report validator
1223 if (isModEnabled('expensereport
')) {
1224 print '<tr><td
class=
"titlefieldcreate">
';
1225 $text = $langs->trans("ForceUserExpenseValidator");
1226 print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help
');
1229 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
');
1234 // Holiday request validator
1235 if (isModEnabled('holiday
')) {
1236 print '<tr><td
class=
"titlefieldcreate">
';
1237 $text = $langs->trans("ForceUserHolidayValidator");
1238 print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help
');
1241 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
');
1247 print '<tr><td>
'.$langs->trans("ExternalUser").' ?</td>
';
1249 print $form->textwithpicto($langs->trans("Internal"), $langs->trans("InternalExternalDesc"), 1, 'help
', '', 0, 2);
1253 print '</
table><hr><
table class=
"border centpercent">
';
1257 print '<tr><td
class=
"titlefieldcreate">
'.$langs->trans("RangeOfLoginValidity").'</td>
';
1259 print $form->selectDate($datestartvalidity, 'datestartvalidity
', 0, 0, 1, 'formdatestartvalidity
', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("from"));
1263 print $form->selectDate($dateendvalidity, 'dateendvalidity
', 0, 0, 1, 'formdateendvalidity
', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
1268 print '<tr><td
class=
"fieldrequired">
'.$langs->trans("Password").'</td>
';
1271 if (preg_match('/ldap/
', $dolibarr_main_authentication)) {
1272 $valuetoshow .= ($valuetoshow ? ' +
' : '').$langs->trans("PasswordOfUserInLDAP").' (hidden)
';
1274 if (preg_match('/http/
', $dolibarr_main_authentication)) {
1275 $valuetoshow .= ($valuetoshow ? ' +
' : '').$langs->trans("HTTPBasicPassword");
1277 if (preg_match('/dolibarr/
', $dolibarr_main_authentication) || preg_match('/forceuser/
', $dolibarr_main_authentication)) {
1278 if (!empty($ldap_pass)) { // For very old system compatibility. Now clear password can't be viewed from LDAP read
1279 $valuetoshow .= ($valuetoshow ?
' + ' :
'').
'<input type="hidden" name="password" value="'.
dol_escape_htmltag($ldap_pass).
'">';
1280 $valuetoshow .= preg_replace(
'/./i',
'*', $ldap_pass);
1283 $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">';
1284 if (!empty(
$conf->use_javascript_ajax)) {
1285 $valuetoshow .=
img_picto($langs->transnoentities(
'Generate'),
'refresh',
'id="generate_password" class="linkobject paddingleft"');
1290 $parameters = array(
'valuetoshow' => $valuetoshow,
'password' => $password,
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
1291 $reshook = $hookmanager->executeHooks(
'printUserPasswordField', $parameters, $object, $action);
1293 $valuetoshow = $hookmanager->resPrint;
1295 $valuetoshow .= $hookmanager->resPrint;
1302 if ($_SESSION[
"dol_authmode"] ==
'dolibarr') {
1303 print
'<tr><td class="titlefieldcreate"></td>';
1306 $permissiontoselfeditpassword = 1;
1307 if ($permissiontoselfeditpassword) {
1308 print
'<input type="checkbox" name="forcepasswordchange" id="forcepasswordchange" value="1"'.(GETPOST(
'forcepasswordchange') ==
'1' ?
' checked="checked"' :
'').
'>';
1309 print
'<label class="opacitymedium" for="forcepasswordchange">'.$langs->trans(
"ForcePasswordChange").
'</label>';
1311 print
'<input type="checkbox" name="forcepasswordchange" value="1" class="colorgrey valignmiddle" disabled>';
1312 print $form->textwithpicto(
'<span class="opacitymedium">'.$langs->trans(
"ForcePasswordChange").
'</span>', $langs->trans(
"UserDoesNotHaveRightsToChangeHisPassword"));
1322 print
'<tr><td>'.$langs->trans(
"ApiKey").
'</td>';
1324 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">';
1325 if (!empty(
$conf->use_javascript_ajax)) {
1326 print
img_picto($langs->transnoentities(
'Generate'),
'refresh',
'id="generate_api_key" class="linkobject paddingleft"');
1332 print
'<input type="hidden" name="api_key" value="'.$generated_fake_api_key.
'">';
1336 print
'</table><hr><table class="border centpercent">';
1340 print
'<tr><td class="tdtop titlefieldcreate">'.$form->editfieldkey(
'Address',
'address',
'', $object, 0).
'</td>';
1341 print
'<td><textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
1343 print
'</textarea></td></tr>';
1346 print
'<tr><td>'.$form->editfieldkey(
'Zip',
'zipcode',
'', $object, 0).
'</td><td>';
1347 print $formcompany->select_ziptown(
$object->zip,
'zipcode', array(
'town',
'selectcountry_id',
'state_id'), 6);
1351 print
'<tr><td>'.$form->editfieldkey(
'Town',
'town',
'', $object, 0).
'</td><td>';
1352 print $formcompany->select_ziptown(
$object->town,
'town', array(
'zipcode',
'selectcountry_id',
'state_id'));
1356 print
'<tr><td>'.$form->editfieldkey(
'Country',
'selectcountry_id',
'', $object, 0).
'</td><td class="maxwidthonsmartphone">';
1357 print
img_picto(
'',
'country',
'class="pictofixedwidth"');
1358 print $form->select_country((
GETPOST(
'country_id') !=
'' ?
GETPOST(
'country_id') :
$object->country_id),
'country_id');
1360 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1366 print
'<tr><td>'.$form->editfieldkey(
'State',
'state_id',
'', $object, 0).
'</td><td class="maxwidthonsmartphone">';
1367 print
img_picto(
'',
'state',
'class="pictofixedwidth"');
1368 print $formcompany->select_state_ajax(
'country_id',
$object->state_id,
$object->country_id,
'state_id');
1373 print
'<tr><td>'.$langs->trans(
"PhonePro").
'</td>';
1375 print
img_picto(
'',
'object_phoning',
'class="pictofixedwidth"');
1376 if (!empty($ldap_phone)) {
1377 print
'<input type="hidden" name="office_phone" value="'.dol_escape_htmltag($ldap_phone).
'">';
1380 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="office_phone" value="'.dol_escape_htmltag(
GETPOST(
'office_phone',
'alphanohtml')).
'">';
1385 print
'<tr><td>'.$langs->trans(
"PhoneMobile").
'</td>';
1387 print
img_picto(
'',
'object_phoning_mobile',
'class="pictofixedwidth"');
1388 if (!empty($ldap_mobile)) {
1389 print
'<input type="hidden" name="user_mobile" value="'.dol_escape_htmltag($ldap_mobile).
'">';
1392 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="user_mobile" value="'.dol_escape_htmltag(
GETPOST(
'user_mobile',
'alphanohtml')).
'" spellcheck="false">';
1397 print
'<tr><td>'.$langs->trans(
"Fax").
'</td>';
1399 print
img_picto(
'',
'object_phoning_fax',
'class="pictofixedwidth"');
1400 if (!empty($ldap_fax)) {
1401 print
'<input type="hidden" name="office_fax" value="'.dol_escape_htmltag($ldap_fax).
'">';
1404 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="office_fax" value="'.dol_escape_htmltag(
GETPOST(
'office_fax',
'alphanohtml')).
'">';
1409 print
'<tr><td'.(getDolGlobalString(
'USER_MAIL_REQUIRED') ?
' class="fieldrequired"' :
'').
'>'.$langs->trans(
"EMail").
'</td>';
1411 print
img_picto(
'',
'object_email',
'class="pictofixedwidth"');
1412 if (!empty($ldap_mail)) {
1413 print
'<input type="hidden" name="email" value="'.dol_escape_htmltag($ldap_mail).
'">';
1416 print
'<input type="text" name="email" class="maxwidth500 widthcentpercentminusx" value="'.dol_escape_htmltag(
GETPOST(
'email',
'alphanohtml')).
'" spellcheck="false">';
1422 foreach ($socialnetworks as $key => $value) {
1423 if ($value[
'active']) {
1424 print
'<tr><td>'.$langs->trans($value[
'label']).
'</td>';
1426 if (!empty($value[
'icon'])) {
1427 print
'<span class="fab '.$value[
'icon'].
' pictofixedwidth"></span>';
1429 if (!empty($ldap_social[$key])) {
1430 print
'<input type="hidden" name="'.$key.
'" value="'.$ldap_social[$key].
'">';
1431 print $ldap_social[$key];
1433 print
'<input class="maxwidth200 widthcentpercentminusx" type="text" name="'.$key.
'" value="'.
GETPOST($key,
'alphanohtml').
'">';
1438 if (!empty($ldap_social[$key])) {
1439 print
'<input type="hidden" name="'.$key.
'" value="'.$ldap_social[$key].
'">';
1441 print
'<input type="hidden" name="'.$key.
'" value="'.
GETPOST($key,
'alphanohtml').
'">';
1449 print
'<tr><td>'.$langs->trans(
"AccountancyCode").
'</td>';
1451 print
'<input type="text" class="maxwidthonsmartphone" name="accountancy_code" value="'.dol_escape_htmltag(
GETPOST(
'accountancy_code',
'alphanohtml')).
'">';
1457 print
'<tr><td>'.$langs->trans(
"Color").
'</td>';
1459 print $formother->selectColor(
GETPOSTISSET(
'color') ?
GETPOST(
'color',
'alphanohtml') :
$object->color,
'color', null, 1, array(),
'hideifnotset');
1464 if (
isModEnabled(
'category') && $user->hasRight(
"categorie",
"read")) {
1465 print
'<tr><td>'.$form->editfieldkey(
'Categories',
'usercats',
'', $object, 0).
'</td><td>';
1466 print $form->selectCategories(Categorie::TYPE_USER,
'usercats', $object);
1472 print
'<tr><td>'.$form->editfieldkey(
'DefaultLang',
'default_lang',
'', $object, 0,
'string',
'', 0, 0,
'id', $langs->trans(
"WarningNotLangOfInterface", $langs->transnoentitiesnoconv(
"UserGUISetup"))).
'</td>';
1473 print
'<td class="maxwidthonsmartphone">'.
"\n";
1474 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');
1480 if (
isModEnabled(
'multicompany') && isset($mc) && is_object($mc)) {
1482 if (!method_exists($mc,
'formObjectOptions')) {
1483 if (!
getDolGlobalString(
'MULTICOMPANY_TRANSVERSE_MODE') &&
$conf->entity == 1 && $user->admin && !$user->entity) {
1484 print
"<tr>".
'<td>'.$langs->trans(
"Entity").
'</td>';
1485 print
"<td>".$mc->select_entities(
$conf->entity);
1486 print
"</td></tr>\n";
1488 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'" />';
1494 $parameters = array();
1495 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
1498 print
'<tr><td class="tdtop">'.$langs->trans(
"Signature").
'</td>';
1499 print
'<td class="wordbreak">';
1500 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1502 $doleditor =
new DolEditor(
'signature',
GETPOST(
'signature',
'restricthtml'),
'', 138,
'dolibarr_notes',
'In',
true, $acceptlocallinktomedia, !
getDolGlobalString(
'FCKEDITOR_ENABLE_USERSIGN') ? 0 : 1, ROWS_4,
'90%');
1503 print $doleditor->Create(1);
1507 print
'<tr><td class="tdtop">';
1508 print $langs->trans(
"NotePublic");
1510 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1511 $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%');
1512 $doleditor->Create();
1513 print
"</td></tr>\n";
1516 print
'<tr><td class="tdtop">';
1517 print $langs->trans(
"NotePrivate");
1519 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1520 $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%');
1521 $doleditor->Create();
1522 print
"</td></tr>\n";
1524 print
'</table><hr><table class="border centpercent">';
1531 print
'<tr><td>'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
1532 print $formproduct->selectWarehouses(
$object->fk_warehouse,
'fk_warehouse',
'warehouseopen', 1);
1537 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"PostOrFunction").
'</td>';
1539 print
'<input class="maxwidth200 maxwidth150onsmartphone" type="text" name="job" value="'.dol_escape_htmltag(
GETPOST(
'job',
'alphanohtml')).
'">';
1542 if ($permissiontoseesalary) {
1543 $langs->load(
"salaries");
1547 $text = $langs->trans(
"THM");
1548 print $form->textwithpicto($text, $langs->trans(
"THMDescription"), 1,
'help',
'classthm');
1551 print
'<input size="8" type="text" name="thm" value="'.dol_escape_htmltag(
GETPOST(
'thm')).
'"> <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
1557 $text = $langs->trans(
"TJM");
1558 print $form->textwithpicto($text, $langs->trans(
"TJMDescription"), 1,
'help',
'classtjm');
1561 print
'<input size="8" type="text" name="tjm" value="'.dol_escape_htmltag(
GETPOST(
'tjm')).
'"> <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
1566 print
'<tr><td>'.$langs->trans(
"Salary").
'</td>';
1568 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>';
1574 print
'<tr><td>'.$langs->trans(
"WeeklyHours").
'</td>';
1576 print
'<input size="8" type="text" name="weeklyhours" value="'.dol_escape_htmltag(
GETPOST(
'weeklyhours')).
'">';
1581 print
'<tr><td>'.$langs->trans(
"DateOfEmployment").
'</td>';
1583 print $form->selectDate($dateemployment,
'dateemployment', 0, 0, 1,
'formdateemployment', 1, 1, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"from"));
1587 print $form->selectDate($dateemploymentend,
'dateemploymentend', 0, 0, 1,
'formdateemploymentend', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"to"));
1592 print
'<tr><td>'.$langs->trans(
"DateOfBirth").
'</td>';
1594 print $form->selectDate($dateofbirth,
'dateofbirth', 0, 0, 1,
'createuser', 1, 0, 0,
'',
'',
'',
'', 1,
'',
'',
'tzserver');
1602 print $form->buttonsSaveCancel(
"CreateUser");
1608 $res =
$object->fetch($id,
'',
'', 1);
1613 $res =
$object->fetch_optionals();
1623 $passDoNotExpire = 0;
1625 $userChangePassNextLogon = 0;
1631 $result = $ldap->connectBind();
1633 $userSearchFilter =
'(' .
getDolGlobalString(
'LDAP_FILTER_CONNECTION').
'('.$ldap->getUserIdentifier().
'='.
$object->login.
'))';
1634 $entries = $ldap->fetch(
$object->login, $userSearchFilter);
1640 if (count($ldap->uacf) > 0) {
1641 foreach ($ldap->uacf as $key => $statut) {
1642 if ($key == 65536) {
1643 $passDoNotExpire = 1;
1644 $statutUACF = $statut;
1649 $statutUACF =
"ACCOUNTDISABLE";
1652 if ($ldap->pwdlastset == 0) {
1653 $userChangePassNextLogon = 1;
1659 if ($mode ==
'employee') {
1660 $title = $langs->trans(
"Employee");
1661 $linkback =
'<a href="'.DOL_URL_ROOT.
'/hrm/employee/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1663 $title = $langs->trans(
"User");
1666 if ($user->hasRight(
"user",
"user",
"read") || $user->admin) {
1667 $linkback =
'<a href="'.DOL_URL_ROOT.
'/user/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1674 if ($action ==
'password') {
1675 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"ReinitPassword"), $langs->trans(
"ConfirmReinitPassword",
$object->login),
"confirm_password",
'', 0, 1);
1679 if ($action ==
'passwordsend') {
1680 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"SendNewPassword"), $langs->trans(
"ConfirmSendNewPassword",
$object->login),
"confirm_passwordsend",
'', 0, 1);
1684 if ($action ==
'disable') {
1685 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"DisableAUser"), $langs->trans(
"ConfirmDisableUser",
$object->login),
"confirm_disable",
'', 0, 1);
1689 if ($action ==
'enable') {
1690 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"EnableAUser"), $langs->trans(
"ConfirmEnableUser",
$object->login),
"confirm_enable",
'', 0, 1);
1694 if ($action ==
'delete') {
1695 print $form->formconfirm(
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id]), $langs->trans(
"DeleteAUser"), $langs->trans(
"ConfirmDeleteUser",
$object->login),
"confirm_delete",
'', 0, 1);
1699 if (($action ==
'clone' && (empty(
$conf->use_javascript_ajax) || !empty(
$conf->dol_use_jmobile)))
1700 || (!empty(
$conf->use_javascript_ajax) && empty(
$conf->dol_use_jmobile))) {
1702 $formquestionclone = array(
1703 'text' => $langs->trans(
"ConfirmClone"),
1704 0 => array(
'type' =>
'text',
'name' =>
'clone_name',
'label' => $langs->trans(
"NewNameUserClone"),
'morecss' =>
'width200'),
1705 1 => array(
'type' =>
'checkbox',
'name' =>
'clone_rights',
'label' => $langs->trans(
"CloneUserRights"),
'value' => 0),
1706 2 => array(
'type' =>
'checkbox',
'name' =>
'clone_categories',
'label' => $langs->trans(
"CloneCategoriesProduct"),
'value' => 0),
1709 $newElement = array(
'type' =>
'text',
'name' =>
'new_email',
'label' => $langs->trans(
"NewEmailUserClone"),
'morecss' =>
'width200');
1710 array_splice($formquestionclone, 2, 0, array($newElement));
1712 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);
1717 if ($action !=
'edit') {
1718 print
dol_get_fiche_head($head,
'user', $title, -1,
'user', 0,
'',
'', 0,
'', 1);
1720 $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">';
1721 $morehtmlref .=
img_picto($langs->trans(
"Download").
' '.$langs->trans(
"VCard").
' ('.$langs->trans(
"AddToContacts").
')',
'vcard',
'class="valignmiddle marginleftonly paddingrightonly"');
1722 $morehtmlref .=
'</a>';
1724 $urltovirtualcard =
'/user/virtualcard.php?id='.((int)
$object->id);
1725 $morehtmlref .=
dolButtonToOpenUrlInDialogPopup(
'publicvirtualcard', $langs->transnoentitiesnoconv(
"PublicVirtualCardUrl").
' - '.
$object->getFullName($langs),
img_picto($langs->trans(
"PublicVirtualCardUrl"),
'card',
'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard,
'',
'refid valignmiddle nohover');
1727 dol_banner_tab($object,
'id', $linkback, $user->hasRight(
"user",
"user",
"read") || $user->admin,
'rowid',
'ref', $morehtmlref);
1729 print
'<div class="fichecenter">';
1730 print
'<div class="fichehalfleft">';
1732 print
'<div class="underbanner clearboth"></div>';
1733 print
'<table class="border tableforfield centpercent">';
1736 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
"Login").
'</td>';
1737 if (!empty(
$object->ldap_sid) &&
$object->status == User::STATUS_DISABLED) {
1738 print
'<td class="error">';
1739 print $langs->trans(
"LoginAccountDisableInDolibarr");
1745 $addadmin .=
img_picto($langs->trans(
"SuperAdministratorDesc"),
"superadmin",
'class="paddingleft valignmiddle"');
1746 } elseif (!empty(
$object->admin)) {
1747 $addadmin .=
img_picto($langs->trans(
"AdministratorDesc"),
"admin",
'class="paddingleft valignmiddle"');
1756 $text = $langs->trans(
"Type");
1757 print $form->textwithpicto($text, $langs->trans(
"InternalExternalDesc"));
1759 $type = $langs->trans(
"Internal");
1761 $type = $langs->trans(
"External");
1763 print
'<span class="badgeneutral">';
1766 print
' ('.$langs->trans(
"DomainUser").
')';
1769 print
'</td></tr>'.
"\n";
1772 if (
$object->ldap_sid && is_object($ldap)) {
1773 print
'<tr><td>'.$langs->trans(
"Type").
'</td><td>';
1774 print $langs->trans(
"DomainUser", $ldap->domainFQDN);
1775 print
'</td></tr>'.
"\n";
1779 print
'<tr><td>'.$langs->trans(
"Employee").
'</td><td>';
1781 print
'<input type="checkbox" disabled name="employee" value="1"'.($object->employee ?
' checked="checked"' :
'').
'>';
1785 print
'</td></tr>'.
"\n";
1788 if ($nbofusers > 1) {
1790 print
'<tr><td>'.$langs->trans(
"HierarchicalResponsible").
'</td>';
1792 if (empty(
$object->fk_user)) {
1793 print
'<span class="opacitymedium">'.$langs->trans(
"None").
'</span>';
1797 $huser->fetch(
$object->fk_user);
1798 print $huser->getNomUrl(-1);
1800 print
'<span class="opacitymedium">'.$langs->trans(
"None").
'</span>';
1809 $text = $langs->trans(
"ForceUserExpenseValidator");
1810 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
1813 if (!empty(
$object->fk_user_expense_validator)) {
1815 $evuser->fetch(
$object->fk_user_expense_validator);
1816 print $evuser->getNomUrl(-1);
1825 $text = $langs->trans(
"ForceUserHolidayValidator");
1826 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
1829 if (!empty(
$object->fk_user_holiday_validator)) {
1831 $hvuser->fetch(
$object->fk_user_holiday_validator);
1832 print $hvuser->getNomUrl(-1);
1840 print
'<tr><td>'.$langs->trans(
"PostOrFunction").
'</td>';
1841 print
'<td>'.dol_escape_htmltag(
$object->job).
'</td>';
1845 print
'<tr><td>'.$langs->trans(
"WeeklyHours").
'</td>';
1852 if ($permissiontoseesalary) {
1853 $langs->load(
"salaries");
1856 print
'<tr><td>'.$langs->trans(
"Salary").
'</td>';
1858 print(
$object->salary !=
'' ?
img_picto(
'',
'salary',
'class="pictofixedwidth paddingright"').
'<span class="amount">'.
price(
$object->salary, 0, $langs, 1, -1, -1,
$conf->currency) :
'').
'</span>';
1864 $text = $langs->trans(
"THM");
1865 print $form->textwithpicto($text, $langs->trans(
"THMDescription"), 1,
'help',
'classthm');
1868 print(
$object->thm !=
'' ?
'<span class="amount">'.price(
$object->thm, 0, $langs, 1, -1, -1,
$conf->currency).
'</span>' :
'');
1874 $text = $langs->trans(
"TJM");
1875 print $form->textwithpicto($text, $langs->trans(
"TJMDescription"), 1,
'help',
'classtjm');
1878 print(
$object->tjm !=
'' ?
'<span class="amount">'.price(
$object->tjm, 0, $langs, 1, -1, -1,
$conf->currency).
'</span>' :
'');
1884 print
'<tr><td>'.$langs->trans(
"DateOfEmployment").
'</td>';
1886 if (
$object->dateemployment) {
1887 print
'<span class="opacitymedium">'.$langs->trans(
"FromDate").
'</span> ';
1890 if (
$object->dateemploymentend) {
1891 print
'<span class="opacitymedium"> - '.$langs->trans(
"To").
'</span> ';
1898 print
'<tr><td>'.$langs->trans(
"DateOfBirth").
'</td>';
1906 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
1907 print
'<tr><td>'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
1908 if (
$object->fk_warehouse > 0) {
1910 $warehousestatic->fetch(
$object->fk_warehouse);
1911 print $warehousestatic->getNomUrl(1);
1919 print
'<div class="fichehalfright">';
1921 print
'<div class="underbanner clearboth"></div>';
1923 print
'<table class="border tableforfield centpercent">';
1927 print
'<tr><td class="titlefieldmax45">'.$langs->trans(
"Color").
'</td>';
1929 print $formother->showColor(
$object->color,
'');
1935 if (
isModEnabled(
'category') && $user->hasRight(
"categorie",
"read")) {
1936 print
'<tr><td>'.$langs->trans(
"Categories").
'</td>';
1938 print $form->showCategories(
$object->id, Categorie::TYPE_USER, 1);
1944 $langs->load(
"languages");
1945 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
1947 print $form->textwithpicto($langs->trans(
"DefaultLang"), $langs->trans(
"WarningNotLangOfInterface", $langs->transnoentitiesnoconv(
"UserGUISetup")));
1951 $labellang = (
$object->lang ? $langs->trans(
'Language_'.
$object->lang) :
'');
1957 if (isset(
$conf->file->main_authentication) && preg_match(
'/openid/',
$conf->file->main_authentication) &&
getDolGlobalString(
'MAIN_OPENIDURL_PERUSER')) {
1958 print
'<tr><td>'.$langs->trans(
"OpenIDURL").
'</td>';
1959 print
'<td>'.$object->openid.
'</td>';
1964 if (
isModEnabled(
'multicompany') && isset($mc) && is_object($mc)) {
1966 if (!method_exists($mc,
'formObjectOptions')) {
1968 print
'<tr><td>'.$langs->trans(
"Entity").
'</td><td>';
1970 print $langs->trans(
"AllEntities");
1972 $mc->getInfo(
$object->entity);
1975 print
"</td></tr>\n";
1981 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1985 print
'<tr><td>'.$langs->trans(
"LinkToCompanyContact").
'</td>';
1990 $societe->fetch(
$object->socid);
1991 if ($societe->id > 0) {
1992 $s .= $societe->getNomUrl(1,
'');
1995 $s .=
'<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"ThisUserIsNot").
'</span>';
1997 if (!empty(
$object->contact_id)) {
1999 $contact->fetch(
$object->contact_id);
2000 if ($contact->id > 0) {
2001 if (
$object->socid > 0 && $s) {
2006 $s .= $contact->getNomUrl(1,
'');
2016 $langs->load(
"members");
2017 print
'<tr><td>'.$langs->trans(
"LinkedToDolibarrMember").
'</td>';
2021 $adh->fetch(
$object->fk_member);
2022 $adh->ref = $adh->getFullname($langs);
2023 print $adh->getNomUrl(-1);
2025 print
'<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"UserNotLinkedToMember").
'</span>';
2032 print
'<tr><td class="tdtop">'.$langs->trans(
'Signature').
'</td><td class="wordbreak">';
2034 print
"</td></tr>\n";
2045 print
'<!-- credential section -->'.
"\n";
2046 print
'<div class="div-table-responsive-no-min">';
2047 print
'<table class="noborder tableforfield centpercent">';
2050 print
'<tr class="liste_titre"><th class="liste_titre" colspan="2">';
2051 print
'<div class="centpercent display-flex">';
2052 print
'<div class="left inline-block">';
2053 print
img_picto(
'',
'security',
'class="paddingleft pictofixedwidth"').$langs->trans(
"SecurityForConnection");
2060 print
'<tr class="nooddeven"><td class="titlefieldmax45 nowraponall">'.$langs->trans(
"RangeOfLoginValidity").
'</td>';
2062 if (
$object->datestartvalidity) {
2063 print
'<span class="opacitymedium">'.$langs->trans(
"FromDate").
'</span> ';
2066 if (
$object->dateendvalidity) {
2067 print
'<span class="opacitymedium"> - '.$langs->trans(
"To").
'</span> ';
2074 if ($_SESSION[
"dol_authmode"] ==
'dolibarr') {
2075 print
'<tr><td class="titlefieldcreate">'.$form->textwithpicto($langs->trans(
"PasswordToChange"), $langs->trans(
"ForcePasswordChange")).
'</td>';
2077 $permissiontoselfeditpassword =
$object->hasRight(
'user',
'self',
'password');
2078 if ($permissiontoselfeditpassword) {
2080 print
'<input type="checkbox" class="colorgrey" disabled name="forcepasswordchange" value="1"'.($object->force_pass_change ?
' checked="checked"' :
'').
'>';
2082 print
'<span class="opacitymedium">'.yn(
$object->force_pass_change).
'</span>';
2085 print
'<span class="opacitymedium">'.yn(
$object->force_pass_change).
'</span>';
2088 print
'<input type="checkbox" name="forcepasswordchange" value="1" disabled class="valignmiddle">';
2089 print
'<span class="opacitymedium" title="'.$langs->trans(
"UserDoesNotHaveRightsToChangeHisPassword").
'">'.$langs->trans(
"No").
'</span>';
2097 if (preg_match(
'/ldap/', $dolibarr_main_authentication)) {
2098 if (!empty(
$object->ldap_sid)) {
2099 if ($passDoNotExpire) {
2100 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"LdapUacf_".$statutUACF);
2101 } elseif ($userChangePassNextLogon) {
2102 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').
'<span class="warning">'.$langs->trans(
"UserMustChangePassNextLogon", $ldap->domainFQDN).
'</span>';
2103 } elseif ($userDisabled) {
2104 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').
'<span class="warning">'.$langs->trans(
"LdapUacf_".$statutUACF, $ldap->domainFQDN).
'</span>';
2106 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"PasswordOfUserInLDAP");
2109 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"PasswordOfUserInLDAP");
2112 if (preg_match(
'/http/', $dolibarr_main_authentication)) {
2113 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"HTTPBasicPassword");
2117 $parameters = array(
'valuetoshow' => $valuetoshow,
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
2118 $reshook = $hookmanager->executeHooks(
'printUserPasswordField', $parameters, $object, $action);
2120 $valuetoshow = $hookmanager->resPrint;
2122 $valuetoshow .= $hookmanager->resPrint;
2126 print
'<tr class="nooddeven"><td class="titlefieldmiddle">'.$langs->trans(
"Password").
'</td>';
2127 print
'<td class="wordbreak">';
2134 if (
getDolGlobalString(
'MAIN_SECURITY_ALLOW_TOTP') && $permissiontoeditpasswordandsee) {
2135 print
'<tr class="nooddeven"><td>'.$langs->trans(
"2FA").
'</td>';
2137 print
'<div class="centpercent display-flex">';
2138 print
'<span class="badge badge-info">999</span>';
2139 print
'<div class="left inline-block">';
2140 $s =
'<!-- MAIN_SECURITY_ALLOW_TOTP --><span class="fa fa-pen valignmiddle btnTitle-icon"></span>';
2142 print
'</span></span>';
2147 $tmparrayofauthmode = explode(
',', $dolibarr_main_authentication);
2148 foreach ($tmparrayofauthmode as $tmpauthmode) {
2149 $langs->load(
"oauth");
2151 $tmpauthmode = trim($tmpauthmode);
2152 if (preg_match(
'/oauth/', $tmpauthmode)) {
2153 $nameofservice = preg_replace(
'/oauth/',
'', $tmpauthmode);
2154 print
'<tr class="nooddeven">';
2155 print
'<td class="titlefieldmiddle">'.$langs->trans(
"OAUTH_ID");
2156 print
' '.ucfirst($nameofservice).
' ';
2159 $constoauthlogin =
'OAUTH_'.strtoupper($nameofservice).
'-Login_ID';
2160 print
'<td class="tdoverflowmax200" title="'.dolPrintHTMLForAttribute(
getDolGlobalString($constoauthlogin)).
'">';
2168 if (!empty(
$object->email_oauth2)) {
2169 print
'<tr class="nooddeven"><td class="titlefieldmiddle">'.$langs->trans(
"AlternativeEmailForOAuth2").
'</td>';
2179 if (
isModEnabled(
'api') && ($user->id == $id || $user->admin || $user->hasRight(
"api",
"apikey",
"generate"))) {
2180 print
'<tr class="nooddeven"><td>'.$langs->trans(
"ApiKey").
'</td>';
2183 print
'<div class="centpercent display-flex">';
2184 print
'<span class="badge badge-info">999</span>';
2188 print
'<div class="left inline-block">';
2189 $s =
'<!-- API_IN_TOKEN_TABLE --><span class="fa fa-pen valignmiddle btnTitle-icon"></span>';
2194 if (!empty(
$object->api_key)) {
2195 print
'<span class="opacitymedium">';
2200 print
' <span class="badge badge-info" title="'.$langs->trans(
"TotalAPICall").
'">';
2210 print
'<tr class="nooddeven"><td>'.$langs->trans(
"LastConnexion").
'</td>';
2212 if (
$object->datepreviouslogin) {
2213 print
dol_print_date(
$object->datepreviouslogin,
"dayhour",
"tzuserrel").
' <span class="opacitymedium">('.$langs->trans(
"Previous").
')</span>, ';
2216 print
dol_print_date(
$object->datelastlogin,
"dayhour",
"tzuserrel").
' <span class="opacitymedium">('.$langs->trans(
"Currently").
')</span>';
2226 $parameters = array(
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
2227 $reshook = $hookmanager->executeHooks(
'addMoreObjectBlock', $parameters, $object, $action);
2229 print $hookmanager->resPrint;
2235 print
'<div class="clearboth"></div>';
2244 print
'<div class="tabsAction">';
2246 $parameters = array();
2247 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2248 if (empty($reshook)) {
2252 'class' =>
'classfortooltip'
2256 if (empty($user->socid)) {
2257 $canSendMail =
false;
2259 $langs->load(
"mails");
2260 $canSendMail =
true;
2261 unset($params[
'attr'][
'title']);
2263 $langs->load(
"mails");
2264 $params[
'attr'][
'title'] = $langs->trans(
'NoEMail');
2266 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email',
dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'presend',
'mode' =>
'init']) .
'#formmailbeforetitle',
'', $canSendMail, $params);
2271 $params[
'attr'][
'title'] = $langs->trans(
'DisabledInMonoUserMode');
2274 unset($params[
'attr'][
'title']);
2277 } elseif ($permissiontoeditpasswordandsee && !
$object->ldap_sid &&
2279 unset($params[
'attr'][
'title']);
2287 'class' =>
'classfortooltip'
2292 if ((empty(
$object->entity) && $permissiontoclonesuperadmin) || (!empty(
$object->admin) && !empty(
$object->entity) && $permissiontocloneadmin) || ($permissiontocloneuser && empty(
$object->admin) && !empty(
$object->entity))) {
2293 $cloneButtonId =
'';
2296 if (!empty(
$conf->use_javascript_ajax) && empty(
$conf->dol_use_jmobile)) {
2298 $cloneButtonId =
'action-clone';
2300 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $cloneUserUrl, $cloneButtonId, $user->hasRight(
'user',
'user',
'write'));
2304 if (
$object->status == $object::STATUS_DISABLED) {
2305 $params[
'attr'][
'title'] = $langs->trans(
'UserDisabled');
2307 } elseif (($user->id != $id && $permissiontoeditpasswordandsee) &&
$object->login && !
$object->ldap_sid &&
2309 unset($params[
'attr'][
'title']);
2310 print
dolGetButtonAction($langs->trans(
'ReinitPassword'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=password&token='.
newToken(),
'',
true, $params);
2313 if (
$object->status == $object::STATUS_DISABLED) {
2314 $params[
'attr'][
'title'] = $langs->trans(
'UserDisabled');
2315 print
dolGetButtonAction($langs->trans(
'SendNewPassword'),
'',
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false, $params);
2316 } elseif (($user->id != $id && $permissiontoeditpasswordandsend) &&
$object->login && !
$object->ldap_sid &&
2319 unset($params[
'attr'][
'title']);
2320 print
dolGetButtonAction($langs->trans(
'SendNewPassword'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=passwordsend&token='.
newToken(),
'',
true, $params);
2322 $params[
'attr'][
'title'] = $langs->trans(
'NoEMail');
2323 print
dolGetButtonAction($langs->trans(
'SendNewPassword'),
'',
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false, $params);
2328 if ($user->id != $id && $permissiontodisable &&
$object->status == User::STATUS_DISABLED &&
2330 unset($params[
'attr'][
'title']);
2331 print
dolGetButtonAction($langs->trans(
'Reactivate'),
'',
'default', $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id .
'&action=enable&token='.newToken(),
'',
true, $params);
2334 if ($user->id != $id && $permissiontodisable &&
$object->status == User::STATUS_ENABLED &&
2336 unset($params[
'attr'][
'title']);
2337 print
dolGetButtonAction($langs->trans(
'DisableUser'),
'',
'default', $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id .
'&action=disable&token='.newToken(),
'',
true, $params);
2339 if ($user->id == $id) {
2340 $params[
'attr'][
'title'] = $langs->trans(
'CantDisableYourself');
2341 print
dolGetButtonAction($langs->trans(
'DisableUser'),
'',
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false, $params);
2345 if ($user->id != $id && $permissiontodisable &&
2347 if ($user->admin || !
$object->admin) {
2348 unset($params[
'attr'][
'title']);
2349 print
dolGetButtonAction($langs->trans(
'DeleteUser'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&id='.
$object->id,
'',
true, $params);
2351 $params[
'attr'][
'title'] = $langs->trans(
'MustBeAdminToDeleteOtherAdmin');
2352 print
dolGetButtonAction($langs->trans(
'DeleteUser'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&id='.
$object->id,
'',
false, $params);
2362 if (
GETPOST(
'modelselected')) {
2363 $action =
'presend';
2367 $modelmail =
'user';
2368 $defaulttopic =
'Information';
2369 $diroutput =
$conf->user->dir_output;
2370 $trackid =
'use'.$object->id;
2372 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2374 if ($action !=
'presend' && $action !=
'send') {
2379 if ($permissiontoreadgroup) {
2380 print
'<!-- Group section -->'.
"\n";
2388 $groupslist = $usergroup->listGroupsForUser(
$object->id,
false);
2390 if (!empty($groupslist)) {
2391 foreach ($groupslist as $groupforuser) {
2392 $exclude[] = $groupforuser->id;
2397 $parameters = array(
'caneditgroup' => $permissiontoeditgroup,
'groupslist' => $groupslist,
'exclude' => $exclude);
2398 $reshook = $hookmanager->executeHooks(
'formAddUserToGroup', $parameters, $object, $action);
2399 print $hookmanager->resPrint;
2401 if (empty($reshook)) {
2402 if ($permissiontoeditgroup) {
2403 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$id.
'" method="POST">'.
"\n";
2404 print
'<input type="hidden" name="token" value="'.newToken().
'" />';
2405 print
'<input type="hidden" name="action" value="addgroup" />';
2406 print
'<input type="hidden" name="page_y" value="" />';
2409 print
'<!-- List of groups of the user -->'.
"\n";
2410 print
'<table class="noborder centpercent">'.
"\n";
2411 print
'<tr class="liste_titre">';
2413 print
'<th class="liste_titre right" colspan="2">';
2414 if ($permissiontoeditgroup) {
2415 print $form->select_dolgroups(0,
'group', 1, $exclude, 0,
'', array(), (
string)
$object->entity,
false,
'maxwidth150');
2417 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'" />';
2418 print
'<input type="submit" class="button buttongen button-add reposition" value="'.$langs->trans(
"Add").
'" />';
2420 print
'</th></tr>'.
"\n";
2423 if (!empty($groupslist)) {
2424 foreach ($groupslist as $group) {
2425 print
'<tr class="oddeven">';
2426 print
'<td class="tdoverflowmax200">';
2427 if ($permissiontoeditgroup) {
2428 print $group->getNomUrl(1);
2430 print
img_object($langs->trans(
"ShowGroup"),
"group").
' '.$group->name;
2433 print
'<td class="right">';
2434 if ($permissiontoeditgroup) {
2435 print
'<a class="reposition" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'id' =>
$object->id,
'action' =>
'removegroup',
'group' => $group->id],
true).
'">';
2436 print
img_picto($langs->trans(
"RemoveFromGroup"),
'unlink');
2441 print
"</td></tr>\n";
2444 print
'<tr class="oddeven"><td colspan="2"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td></tr>';
2449 if ($permissiontoeditgroup) {
2461 if ($action ==
'edit' && ($permissiontoedit || $permissiontoeditpasswordandsee)) {
2462 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST" name="updateuser" enctype="multipart/form-data">';
2463 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2464 print
'<input type="hidden" name="action" value="update">';
2465 print
'<input type="hidden" name="entity" value="'.$object->entity.
'">';
2469 print
'<table class="border centpercent">';
2473 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Ref").
'</td>';
2482 print
'<td class="titlefieldcreate fieldrequired">'.$langs->trans(
"Lastname").
'</td>';
2484 if ($permissiontoedit && !
$object->ldap_sid) {
2485 print
'<input class="minwidth100" type="text" class="flat" name="lastname" value="'.$object->lastname.
'">';
2487 print
'<input type="hidden" name="lastname" value="'.$object->lastname.
'">';
2494 print
'<tr><td>'.$langs->trans(
"Firstname").
'</td>';
2496 if ($permissiontoedit && !
$object->ldap_sid) {
2497 print
'<input class="minwidth100" type="text" class="flat" name="firstname" value="'.$object->firstname.
'">';
2499 print
'<input type="hidden" name="firstname" value="'.$object->firstname.
'">';
2505 print
"<tr>".
'<td><span class="fieldrequired">'.$langs->trans(
"Login").
'</span></td>';
2507 if ($user->admin && !
$object->ldap_sid) {
2508 print
'<input maxlength="50" type="text" class="flat" name="login" value="'.$object->login.
'" spellcheck="false">';
2510 print
'<input type="hidden" name="login" value="'.$object->login.
'">';
2517 print
'<tr><td>'.$langs->trans(
"ExternalUser").
' ?</td>';
2519 if ($user->id ==
$object->id || !$user->admin) {
2521 $type = $langs->trans(
"Internal");
2523 $type = $langs->trans(
"External");
2526 print $form->textwithpicto($type, $langs->trans(
"InternalExternalDesc"));
2528 print
' ('.$langs->trans(
"DomainUser").
')';
2537 $eventsCompanyContact = array();
2538 $eventsCompanyContact[] = array(
'method' =>
'getContacts',
'url' =>
dol_buildpath(
'/core/ajax/contacts.php?showempty=1&token='.
currentToken(), 1),
'htmlname' =>
'contactid',
'params' => array(
'add-customer-contact' =>
'disabled'));
2540 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2541 print $form->select_company(
$object->socid,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2542 print
'<span class="clearbothonsmartphone"></span>';
2543 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2544 print $form->select_contact(0, 0,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2546 print
' ('.$langs->trans(
"DomainUser").
')';
2549 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2550 print $form->select_company(
$object->socid,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2551 print
'<span class="clearbothonsmartphone"></span>';
2552 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2553 print $form->select_contact(0,
$object->contact_id,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2555 print
' ('.$langs->trans(
"DomainUser").
')';
2558 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2559 print $form->select_company(0,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2560 print
'<span class="clearbothonsmartphone"></span>';
2561 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2562 print $form->select_contact(0,
$object->contact_id,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2564 print
' ('.$langs->trans(
"DomainUser").
')';
2567 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
2568 print $form->select_company(0,
'socid',
'',
' ', 0, 0, $eventsCompanyContact, 0,
'widthcentpercentminusxx maxwidth300');
2569 print
'<span class="clearbothonsmartphone"></span>';
2570 print
img_picto(
'',
'contact',
'class="pictofixedwidth"');
2571 print $form->select_contact(0, 0,
'contactid', 1,
'',
'', 1,
'minwidth100imp widthcentpercentminusxx maxwidth300',
true, 1);
2577 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"Administrator"), $langs->trans(
"AdministratorDesc")).
'</td>';
2579 $langs->load(
"admin");
2581 print
'<input type="hidden" name="admin" value="'.$object->admin.
'">'.
yn(
$object->admin);
2582 print
' <span class="opacitymedium">('.$langs->trans(
"ExternalUser").
')</span>';
2586 $nbAdmin = $user->getNbOfUsers(
'active',
'', 1);
2587 $nbSuperAdmin = $user->getNbOfUsers(
'active',
'superadmin', 1);
2594 || (
isModEnabled(
'multicompany') && ((
$object->entity > 0 || ($user->entity == 0 &&
$object->entity == 0)) || $nbSuperAdmin > 1))
2597 print $form->selectyesno(
'admin',
$object->admin, 1,
false, 0, 1);
2600 if (
$conf->use_javascript_ajax) {
2601 print
'<script type="text/javascript">
2603 var admin = $("select[name=admin]").val();
2605 $("input[name=superadmin]")
2606 .prop("disabled", true)
2607 .prop("checked", false);
2609 if ($("input[name=superadmin]").is(":checked")) {
2610 $("select[name=entity]")
2611 .prop("disabled", true);
2613 $("select[name=admin]").change(function() {
2614 if ( $(this).val() == 0 ) {
2615 $("input[name=superadmin]")
2616 .prop("disabled", true)
2617 .prop("checked", false);
2618 $("select[name=entity]")
2619 .prop("disabled", false);
2621 $("input[name=superadmin]")
2622 .prop("disabled", false);
2625 $("input[name=superadmin]").change(function() {
2626 if ( $(this).is(":checked")) {
2627 $("select[name=entity]")
2628 .prop("disabled", true);
2630 $("select[name=entity]")
2631 .prop("disabled", false);
2638 $checked = ((
$object->admin && !
$object->entity) ?
' checked' :
'');
2639 print
'<input type="checkbox" name="superadmin" id="superadmin" value="1"'.$checked.
' /> <label for="superadmin">'.$langs->trans(
"SuperAdministrator").
'</span>';
2643 print
'<input type="hidden" name="admin" value="'.$object->admin.
'">';
2644 print
'<input type="hidden" name="superadmin" value="'.(empty(
$object->entity) ? 1 : 0).
'">';
2646 print $form->textwithpicto($yn, $langs->trans(
"DontDowngradeSuperAdmin"), 1,
'warning');
2656 print
'<tr><td class="titlefieldcreate"><label for="civility_code">'.$langs->trans(
"UserTitle").
'</label></td><td>';
2657 if ($permissiontoedit && !
$object->ldap_sid) {
2658 print $formcompany->select_civility(
GETPOSTISSET(
"civility_code") ?
GETPOST(
"civility_code",
'aZ09') :
$object->civility_code,
'civility_code');
2659 } elseif (
$object->civility_code) {
2660 print $langs->trans(
"Civility".
$object->civility_code);
2666 print
'<tr><td>'.$langs->trans(
"Gender").
'</td>';
2668 $arraygender = array(
'man' => $langs->trans(
"Genderman"),
'woman' => $langs->trans(
"Genderwoman"),
'other' => $langs->trans(
"Genderother"));
2669 if ($permissiontoedit) {
2672 print $arraygender[
$object->gender];
2678 print
'<td>'.$form->editfieldkey(
'Employee',
'employee',
'', $object, 0).
'</td><td>';
2679 if ($permissiontoedit) {
2680 print
'<input type="checkbox" name="employee" value="1"'.($object->employee ?
' checked="checked"' :
'').
'>';
2683 print
'<input type="checkbox" name="employee" disabled value="1"'.($object->employee ?
' checked="checked"' :
'').
'>';
2692 if ($nbofusers > 1) {
2694 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"HierarchicalResponsible").
'</td>';
2696 if ($permissiontoedit) {
2697 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');
2699 print
'<input type="hidden" name="fk_user" value="'.$object->fk_user.
'">';
2701 $huser->fetch(
$object->fk_user);
2702 print $huser->getNomUrl(-1);
2709 print
'<tr><td class="titlefieldcreate">';
2710 $text = $langs->trans(
"ForceUserExpenseValidator");
2711 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
2714 if ($permissiontoedit) {
2715 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');
2717 print
'<input type="hidden" name="fk_user_expense_validator" value="'.$object->fk_user_expense_validator.
'">';
2719 $evuser->fetch(
$object->fk_user_expense_validator);
2720 print $evuser->getNomUrl(-1);
2728 print
'<tr><td class="titlefieldcreate">';
2729 $text = $langs->trans(
"ForceUserHolidayValidator");
2730 print $form->textwithpicto($text, $langs->trans(
"ValidatorIsSupervisorByDefault"), 1,
'help');
2733 if ($permissiontoedit) {
2734 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');
2736 print
'<input type="hidden" name="fk_user_holiday_validator" value="'.$object->fk_user_holiday_validator.
'">';
2738 $hvuser->fetch(
$object->fk_user_holiday_validator);
2739 print $hvuser->getNomUrl(-1);
2750 print
'<table class="border centpercent">';
2753 print
'<tr><td>'.$langs->trans(
"RangeOfLoginValidity").
'</td>';
2755 if ($permissiontoedit) {
2756 print $form->selectDate($datestartvalidity ? $datestartvalidity :
$object->datestartvalidity,
'datestartvalidity', 0, 0, 1,
'formdatestartvalidity', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"from"));
2762 if ($permissiontoedit) {
2763 print $form->selectDate($dateendvalidity ? $dateendvalidity :
$object->dateendvalidity,
'dateendvalidity', 0, 0, 1,
'formdateendvalidity', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"to"));
2772 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"Password").
'</td>';
2775 if (preg_match(
'/ldap/', $dolibarr_main_authentication)) {
2776 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$langs->trans(
"PasswordOfUserInLDAP");
2778 if (preg_match(
'/http/', $dolibarr_main_authentication)) {
2779 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').$form->textwithpicto((
string) $text, $langs->trans(
"DolibarrInHttpAuthenticationSoPasswordUseless", (
string) $dolibarr_main_authentication), 1,
'warning');
2781 if (preg_match(
'/dolibarr/', $dolibarr_main_authentication) || preg_match(
'/forceuser/', $dolibarr_main_authentication)) {
2782 if ($permissiontoeditpasswordandsee) {
2783 $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">';
2784 if (!empty(
$conf->use_javascript_ajax)) {
2785 $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').
'"');
2788 $valuetoshow .= ($valuetoshow ? (
' '.$langs->trans(
"or").
' ') :
'').preg_replace(
'/./i',
'*',
$object->pass);
2792 $parameters = array(
'valuetoshow' => $valuetoshow,
'caneditpasswordandsee' => $permissiontoeditpasswordandsee,
'caneditpasswordandsend' => $permissiontoeditpasswordandsend);
2793 $reshook = $hookmanager->executeHooks(
'printUserPasswordField', $parameters, $object, $action);
2795 $valuetoshow = $hookmanager->resPrint;
2797 $valuetoshow .= $hookmanager->resPrint;
2801 print
"</td></tr>\n";
2804 if ($_SESSION[
"dol_authmode"] ==
'dolibarr') {
2806 print
'<td></td><td>';
2807 $permissiontoselfeditpassword =
$object->hasRight(
'user',
'self',
'password');
2808 if ($permissiontoselfeditpassword) {
2809 if ($permissiontoedit) {
2810 print
'<input type="checkbox" name="forcepasswordchange" id="forcepasswordchange" value="1"'.($object->force_pass_change ?
' checked="checked"' :
'').
'>';
2811 print
'<label class="opacitylow" for="forcepasswordchange">'.$langs->trans(
"ForcePasswordChange").
'</label>';
2813 print
'<input type="checkbox" name="forcepasswordchange" class="colorgrey" disabled value="1"'.($object->force_pass_change ?
' checked="checked"' :
'').
'>';
2814 print $langs->trans(
"ForcePasswordChange");
2817 print
'<input type="checkbox" name="forcepasswordchange" value="1" class="colorgrey" disabled>';
2818 print
'<span class="opacitymedium" title="'.$langs->trans(
"UserDoesNotHaveRightsToChangeHisPassword").
'">'.$langs->trans(
"ForcePasswordChange").
'</span>';
2827 print
'<tr><td>'.$langs->trans(
"ApiKey").
'</td>';
2829 if ($permissiontoeditpasswordandsee || $user->hasRight(
"api",
"apikey",
"generate")) {
2830 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">';
2831 if (!empty(
$conf->use_javascript_ajax)) {
2832 print
img_picto($langs->transnoentities(
'Generate'),
'refresh',
'id="generate_api_key" class="linkobject paddingleft"');
2840 if (isset(
$conf->file->main_authentication) && preg_match(
'/openid/',
$conf->file->main_authentication) &&
getDolGlobalString(
'MAIN_OPENIDURL_PERUSER')) {
2841 print
"<tr>".
'<td>'.$langs->trans(
"OpenIDURL").
'</td>';
2843 if ($permissiontoedit) {
2844 print
'<input class="minwidth100" type="url" name="openid" class="flat" value="'.$object->openid.
'">';
2846 print
'<input type="hidden" name="openid" value="'.$object->openid.
'">';
2852 print
'</table><hr><table class="border centpercent">';
2856 print
'<tr><td class="tdtop titlefieldcreate">'.$form->editfieldkey(
'Address',
'address',
'', $object, 0).
'</td>';
2858 if ($permissiontoedit) {
2859 print
'<textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
2862 if ($permissiontoedit) {
2863 print
'</textarea>';
2868 print
'<tr><td>'.$form->editfieldkey(
'Zip',
'zipcode',
'', $object, 0).
'</td><td>';
2869 if ($permissiontoedit) {
2870 print $formcompany->select_ziptown((
GETPOSTISSET(
'zipcode') ?
GETPOST(
'zipcode') :
$object->zip),
'zipcode', array(
'town',
'selectcountry_id',
'state_id'), 6);
2877 print
'<tr><td>'.$form->editfieldkey(
'Town',
'town',
'', $object, 0).
'</td><td>';
2878 if ($permissiontoedit) {
2879 print $formcompany->select_ziptown((
GETPOSTISSET(
'town') ?
GETPOST(
'town') :
$object->town),
'town', array(
'zipcode',
'selectcountry_id',
'state_id'));
2886 print
'<tr><td>'.$form->editfieldkey(
'Country',
'selectcountry_id',
'', $object, 0).
'</td><td>';
2887 print
img_picto(
'',
'country',
'class="pictofixedwidth"');
2888 if ($permissiontoedit) {
2889 print $form->select_country((
GETPOST(
'country_id') !=
'' ?
GETPOST(
'country_id') :
$object->country_id),
'country_id');
2891 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
2895 print $countrylabel;
2901 print
'<tr><td class="tdoverflow">'.$form->editfieldkey(
'State',
'state_id',
'', $object, 0).
'</td><td>';
2902 if ($permissiontoedit) {
2903 print
img_picto(
'',
'state',
'class="pictofixedwidth"');
2904 print $formcompany->select_state_ajax(
'country_id',
$object->state_id,
$object->country_id,
'state_id');
2912 print
"<tr>".
'<td>'.$langs->trans(
"PhonePro").
'</td>';
2914 print
img_picto(
'',
'phoning',
'class="pictofixedwidth"');
2915 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2916 print
'<input type="text" name="office_phone" class="flat maxwidth200 widthcentpercentminusx" value="'.$object->office_phone.
'">';
2918 print
'<input type="hidden" name="office_phone" value="'.$object->office_phone.
'">';
2924 print
"<tr>".
'<td>'.$langs->trans(
"PhoneMobile").
'</td>';
2926 print
img_picto(
'',
'phoning_mobile',
'class="pictofixedwidth"');
2927 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2928 print
'<input type="text" name="user_mobile" class="flat maxwidth200 widthcentpercentminusx" value="'.$object->user_mobile.
'" spellcheck="false">';
2930 print
'<input type="hidden" name="user_mobile" value="'.$object->user_mobile.
'">';
2936 print
"<tr>".
'<td>'.$langs->trans(
"Fax").
'</td>';
2938 print
img_picto(
'',
'phoning_fax',
'class="pictofixedwidth"');
2939 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2940 print
'<input type="text" name="office_fax" class="flat maxwidth200 widthcentpercentminusx" value="'.$object->office_fax.
'">';
2942 print
'<input type="hidden" name="office_fax" value="'.$object->office_fax.
'">';
2948 print
"<tr>".
'<td'.(
getDolGlobalString(
'USER_MAIL_REQUIRED') ?
' class="fieldrequired"' :
'').
'>'.$langs->trans(
"EMail").
'</td>';
2950 print
img_picto(
'',
'object_email',
'class="pictofixedwidth"');
2951 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2952 print
'<input class="minwidth100 maxwidth500 widthcentpercentminusx" type="text" name="email" class="flat" value="'.$object->email.
'">';
2954 print
'<input type="hidden" name="email" value="'.$object->email.
'">';
2960 foreach ($socialnetworks as $key => $value) {
2961 if ($value[
'active']) {
2962 print
'<tr><td>'.$langs->trans($value[
'label']).
'</td>';
2964 if (!empty($value[
'icon'])) {
2965 print
'<span class="fab '.$value[
'icon'].
' pictofixedwidth"></span>';
2967 if ($permissiontoedit && empty(
$object->ldap_sid)) {
2968 print
'<input type="text" name="'.$key.
'" class="flat maxwidth200 widthcentpercentminusx" value="'.(isset(
$object->socialnetworks[$key]) ?
$object->socialnetworks[$key] :
'').
'">';
2970 print
'<input type="hidden" name="'.$key.
'" value="'.
$object->socialnetworks[$key].
'">';
2971 print
$object->socialnetworks[$key];
2976 print
'<input type="hidden" name="'.$key.
'" value="'.(isset(
$object->socialnetworks[$key]) ?
$object->socialnetworks[$key] :
'').
'">';
2981 print
'</table><hr><table class="border centpercent">';
2985 print
'<tr><td class="titlefield">'.$langs->trans(
"DefaultWarehouse").
'</td><td>';
2986 print $formproduct->selectWarehouses(
$object->fk_warehouse,
'fk_warehouse',
'warehouseopen', 1);
2987 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>';
2994 print
'<td class="titlefieldcreate">'.$langs->trans(
"AccountancyCode").
'</td>';
2996 if ($permissiontoedit) {
2997 print
'<input type="text" class="flat maxwidth300" name="accountancy_code" value="'.$object->accountancy_code.
'">';
2999 print
'<input type="hidden" name="accountancy_code" value="'.$object->accountancy_code.
'">';
3000 print
$object->accountancy_code;
3008 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"ColorUser").
'</td>';
3010 if ($permissiontoedit) {
3011 print $formother->selectColor(
GETPOSTISSET(
'color') ?
GETPOST(
'color',
'alphanohtml') :
$object->color,
'color', null, 1, array(),
'hideifnotset');
3013 print $formother->showColor(
$object->color,
'');
3020 print
'<td class="titlefieldcreate">'.$langs->trans(
"Photo").
'</td>';
3022 print $form->showphoto(
'userphoto', $object, 60, 0, (
int) $permissiontoedit,
'photowithmargin',
'small', 1, 0,
'user', 1);
3027 if (
isModEnabled(
'category') && $user->hasRight(
"categorie",
"read")) {
3028 print
'<tr><td>'.$form->editfieldkey(
'Categories',
'usercats',
'', $object, 0).
'</td>';
3030 if ($permissiontoedit) {
3031 print $form->selectCategories(Categorie::TYPE_USER,
'usercats', $object);
3033 print $form->showCategories(
$object->id, Categorie::TYPE_USER, 1);
3040 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";
3041 print
img_picto(
'',
'language',
'class="pictofixedwidth"').$formadmin->select_language(
$object->lang,
'default_lang', 0, array(),
'1', 0, 0,
'widthcentpercentminusx maxwidth300');
3047 print
'<tr><td>'.$langs->trans(
"Status").
'</td>';
3049 print
$object->getLibStatut(4);
3077 $langs->load(
"members");
3078 print
'<tr><td>'.$langs->trans(
"LinkedToDolibarrMember").
'</td>';
3082 $adh->fetch(
$object->fk_member);
3083 $adh->ref = $adh->login;
3084 print $adh->getNomUrl(1);
3086 print
'<span class="opacitymedium hideonsmartphone">'.$langs->trans(
"UserNotLinkedToMember").
'</span>';
3094 if (
isModEnabled(
'multicompany') && isset($mc) && is_object($mc)) {
3096 if (!method_exists($mc,
'formObjectOptions')) {
3097 if (empty(
$conf->multicompany->transverse_mode) &&
$conf->entity == 1 && $user->admin && !$user->entity) {
3098 print
"<tr>".
'<td>'.$langs->trans(
"Entity").
'</td>';
3099 print
"<td>".$mc->select_entities(
$object->entity,
'entity',
'',
false,
true,
false,
false,
true);
3100 print
"</td></tr>\n";
3102 print
'<input type="hidden" name="entity" value="'.$conf->entity.
'" />';
3108 $parameters = array(
'colspan' =>
' colspan="2"');
3110 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3111 print $hookmanager->resPrint;
3112 if (empty($reshook)) {
3113 if ($permissiontoedit) {
3114 print
$object->showOptionals($extrafields,
'edit');
3116 print
$object->showOptionals($extrafields,
'view');
3121 print
'<tr><td class="tdtop">'.$langs->trans(
"Signature").
'</td>';
3123 if ($permissiontoedit) {
3124 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
3126 $doleditor =
new DolEditor(
'signature',
$object->signature,
'', 138,
'dolibarr_notes',
'In',
false, $acceptlocallinktomedia, !
getDolGlobalString(
'FCKEDITOR_ENABLE_USERSIGN') ? 0 : 1, ROWS_4,
'90%');
3127 print $doleditor->Create(1);
3139 print
'<table class="border centpercent">';
3145 print
'<tr><td class="titlefieldcreate">'.$langs->trans(
"PostOrFunction").
'</td>';
3147 if ($permissiontoedit) {
3148 print
'<input type="text" class="minwidth300 maxwidth500" name="job" value="'.dol_escape_htmltag(
$object->job).
'">';
3150 print
'<input type="hidden" name="job" value="'.dol_escape_htmltag(
$object->job).
'">';
3156 print
'<tr><td>'.$langs->trans(
"WeeklyHours").
'</td>';
3158 if ($permissiontoedit) {
3159 print
'<input size="8" type="text" name="weeklyhours" value="'.price2num(
GETPOST(
'weeklyhours') ?
GETPOST(
'weeklyhours') :
$object->weeklyhours).
'">';
3167 if ($permissiontoseesalary) {
3168 $langs->load(
"salaries");
3171 print
'<tr><td>'.$langs->trans(
"Salary").
'</td>';
3173 print
img_picto(
'',
'salary',
'class="pictofixedwidth paddingright"').
'<input size="8" type="text" name="salary" value="'.
price2num(
GETPOST(
'salary') ?
GETPOST(
'salary') :
$object->salary).
'">';
3174 print
' <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
3180 $text = $langs->trans(
"THM");
3181 print $form->textwithpicto($text, $langs->trans(
"THMDescription"), 1,
'help',
'classthm');
3184 if ($permissiontoedit) {
3185 print
'<input size="8" type="text" name="thm" value="'.price2num(
GETPOST(
'thm') ?
GETPOST(
'thm') :
$object->thm).
'">';
3186 print
' <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
3195 $text = $langs->trans(
"TJM");
3196 print $form->textwithpicto($text, $langs->trans(
"TJMDescription"), 1,
'help',
'classthm');
3199 if ($permissiontoedit) {
3200 print
'<input size="8" type="text" name="tjm" value="'.price2num(
GETPOST(
'tjm') ?
GETPOST(
'tjm') :
$object->tjm).
'">';
3201 print
' <span class="opacitymedium">'.$langs->getCurrencySymbol().
'</span>';
3210 print
'<tr><td>'.$langs->trans(
"DateEmployment").
'</td>';
3212 if ($permissiontoedit) {
3213 print $form->selectDate($dateemployment ? $dateemployment :
$object->dateemployment,
'dateemployment', 0, 0, 1,
'formdateemployment', 1, 1, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"from"));
3218 if ($dateemployment && $dateemploymentend) {
3222 if ($permissiontoedit) {
3223 print $form->selectDate($dateemploymentend ? $dateemploymentend :
$object->dateemploymentend,
'dateemploymentend', 0, 0, 1,
'formdateemploymentend', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
"to"));
3231 print
'<tr><td>'.$langs->trans(
"DateOfBirth").
'</td>';
3233 if ($permissiontoedit) {
3234 echo $form->selectDate($dateofbirth ? $dateofbirth :
$object->birth,
'dateofbirth', 0, 0, 1,
'updateuser', 1, 0, 0,
'',
'',
'',
'', 1,
'',
'',
'tzserver');
3245 print
'<div class="center">';
3246 print
'<input value="'.$langs->trans(
"Save").
'" class="button button-save" type="submit" name="save">';
3247 print
' ';
3248 print
'<input value="'.$langs->trans(
"Cancel").
'" class="button button-cancel" type="submit" name="cancel">';
3254 if ($action !=
'edit' && $action !=
'presend') {
3255 print
'<div class="fichecenter"><div class="fichehalfleft">';
3260 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3261 $genallowed = $user->hasRight(
"user",
"user",
"read");
3262 $delallowed = $user->hasRight(
"user",
"user",
"write");
3267 $societe->fetch(
$object->socid);
3272 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);
3273 $somethingshown = $formfile->numoffiles;
3277 $morehtmlcenter =
'<div class="nowraponall">';
3278 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/user/messaging.php?id='.
$object->id);
3279 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/user/agenda.php?id='.
$object->id);
3280 $morehtmlcenter .=
'</div>';
3282 print
'</div><div class="fichehalfright">';
3285 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3287 $somethingshown = $formactions->showactions($object,
'user', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter,
$object->id);
3289 print
'</div></div>';
3299include_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.
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)
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
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.
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 '.
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.
currentToken()
Return the value of token currently saved into session with name 'token'.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
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_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.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
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.
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.
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_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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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.
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.
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)
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...
treeview li table
No Email.
div refaddress div address
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
buildzip.php
$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.