mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-12-26 19:31:31 +01:00
# Qual: Fix spelling for crypted and referer. The proper spelling is encrypted and referrer, but the code has some occurences where referer and crypted need to be maintained. To make verification easier, this spelling correction is limited to mostly these corrections and some minor translations and a only a few other corrections. crypted and referer are added as exceptions for spelling after this fix. Co-authored-by: Laurent Destailleur <eldy@destailleur.fr>
2965 lines
117 KiB
PHP
2965 lines
117 KiB
PHP
<?php
|
|
/* Copyright (C) 2002-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
|
* Copyright (C) 2002-2003 Jean-Louis Bergamo <jlb@j1b.org>
|
|
* Copyright (C) 2004-2022 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
* Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
|
|
* Copyright (C) 2005-2021 Regis Houssin <regis.houssin@inodbox.com>
|
|
* Copyright (C) 2005 Lionel Cousteix <etm_ltd@tiscali.co.uk>
|
|
* Copyright (C) 2011 Herve Prot <herve.prot@symeos.com>
|
|
* Copyright (C) 2012-2018 Juanjo Menent <jmenent@2byte.es>
|
|
* Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
|
|
* Copyright (C) 2013-2016 Alexandre Spangaro <aspangaro@open-dsi.fr>
|
|
* Copyright (C) 2015-2017 Jean-François Ferry <jfefe@aternatik.fr>
|
|
* Copyright (C) 2015 Ari Elbaz (elarifr) <github@accedinfo.com>
|
|
* Copyright (C) 2015-2018 Charlene Benke <charlie@patas-monkey.com>
|
|
* Copyright (C) 2016 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
|
|
* Copyright (C) 2018-2023 Frédéric France <frederic.france@netlogic.fr>
|
|
* Copyright (C) 2018 David Beniamine <David.Beniamine@Tetras-Libre.fr>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* \file htdocs/user/card.php
|
|
* \brief Tab of user card
|
|
*/
|
|
|
|
// Load Dolibarr environment
|
|
require '../main.inc.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
|
|
if (isModEnabled('ldap')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/ldap.class.php';
|
|
}
|
|
if (isModEnabled('adherent')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
|
|
}
|
|
if (isModEnabled('categorie')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
|
|
}
|
|
if (isModEnabled('stock')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
|
|
}
|
|
|
|
// Load translation files required by page
|
|
$langs->loadLangs(array('users', 'companies', 'ldap', 'admin', 'hrm', 'stocks', 'other'));
|
|
|
|
$id = GETPOST('id', 'int');
|
|
$action = GETPOST('action', 'aZ09');
|
|
$mode = GETPOST('mode', 'alpha');
|
|
$confirm = GETPOST('confirm', 'alpha');
|
|
$group = GETPOST("group", "int", 3);
|
|
$cancel = GETPOST('cancel', 'alpha');
|
|
$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'useracard'; // To manage different context of search
|
|
|
|
if (empty($id) && $action != 'create') {
|
|
$id = $user->id;
|
|
}
|
|
|
|
$dateemployment = dol_mktime(0, 0, 0, GETPOST('dateemploymentmonth', 'int'), GETPOST('dateemploymentday', 'int'), GETPOST('dateemploymentyear', 'int'));
|
|
$dateemploymentend = dol_mktime(0, 0, 0, GETPOST('dateemploymentendmonth', 'int'), GETPOST('dateemploymentendday', 'int'), GETPOST('dateemploymentendyear', 'int'));
|
|
$datestartvalidity = dol_mktime(0, 0, 0, GETPOST('datestartvaliditymonth', 'int'), GETPOST('datestartvalidityday', 'int'), GETPOST('datestartvalidityyear', 'int'));
|
|
$dateendvalidity = dol_mktime(0, 0, 0, GETPOST('dateendvaliditymonth', 'int'), GETPOST('dateendvalidityday', 'int'), GETPOST('dateendvalidityyear', 'int'));
|
|
$dateofbirth = dol_mktime(0, 0, 0, GETPOST('dateofbirthmonth', 'int'), GETPOST('dateofbirthday', 'int'), GETPOST('dateofbirthyear', 'int'));
|
|
|
|
$childids = $user->getAllChildIds(1); // For later, test on salary visibility
|
|
|
|
$object = new User($db);
|
|
$extrafields = new ExtraFields($db);
|
|
|
|
// fetch optionals attributes and labels
|
|
$extrafields->fetch_name_optionals_label($object->table_element);
|
|
|
|
$socialnetworks = getArrayOfSocialNetworks();
|
|
|
|
// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array
|
|
$hookmanager->initHooks(array('usercard', 'globalcard'));
|
|
|
|
$error = 0;
|
|
|
|
$acceptlocallinktomedia = (acceptLocalLinktoMedia() > 0 ? 1 : 0);
|
|
|
|
if ($id > 0) {
|
|
$res = $object->fetch($id, '', '', 1);
|
|
}
|
|
|
|
// Security check
|
|
$socid = 0;
|
|
if ($user->socid > 0) {
|
|
$socid = $user->socid;
|
|
}
|
|
$feature2 = 'user';
|
|
$result = restrictedArea($user, 'user', $id, 'user', $feature2);
|
|
|
|
// Define value to know what current user can do on users
|
|
$canadduser = (!empty($user->admin) || $user->hasRight("user", "user", "write"));
|
|
$canreaduser = (!empty($user->admin) || $user->hasRight("user", "user", "read"));
|
|
$canedituser = (!empty($user->admin) || $user->hasRight("user", "user", "write")); // edit other user
|
|
$candisableuser = (!empty($user->admin) || $user->hasRight("user", "user", "delete"));
|
|
$canreadgroup = $canreaduser;
|
|
$caneditgroup = $canedituser;
|
|
if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS')) {
|
|
$canreadgroup = (!empty($user->admin) || $user->hasRight("user", "group_advance", "read"));
|
|
$caneditgroup = (!empty($user->admin) || $user->hasRight("user", "group_advance", "write"));
|
|
}
|
|
|
|
if ($user->id != $id && !$canreaduser) {
|
|
accessforbidden();
|
|
}
|
|
|
|
// Define value to know what current user can do on properties of edited user
|
|
if ($id > 0) {
|
|
// $user is the current logged user, $id is the user we want to edit
|
|
$canedituser = (($user->id == $id) && $user->hasRight("user", "self", "write")) || (($user->id != $id) && $user->hasRight("user", "user", "write"));
|
|
$caneditfield = ((($user->id == $id) && $user->hasRight("user", "self", "write")) || (($user->id != $id) && $user->hasRight("user", "user", "write")));
|
|
$caneditpasswordandsee = ((($user->id == $id) && $user->hasRight("user", "self", "password")) || (($user->id != $id) && $user->hasRight("user", "user", "password") && $user->admin));
|
|
$caneditpasswordandsend = ((($user->id == $id) && $user->hasRight("user", "self", "password")) || (($user->id != $id) && $user->hasRight("user", "user", "password")));
|
|
}
|
|
|
|
|
|
/**
|
|
* Actions
|
|
*/
|
|
|
|
$parameters = array('id' => $id, 'socid' => $socid, 'group' => $group, 'caneditgroup' => $caneditgroup);
|
|
$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
|
|
if ($reshook < 0) {
|
|
setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
|
|
}
|
|
|
|
if (empty($reshook)) {
|
|
$backurlforlist = DOL_URL_ROOT.'/user/list.php';
|
|
|
|
if (empty($backtopage) || ($cancel && empty($id))) {
|
|
if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
|
|
if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
|
|
$backtopage = $backurlforlist;
|
|
} else {
|
|
$backtopage = DOL_URL_ROOT.'/user/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($cancel) {
|
|
if (!empty($backtopageforcancel)) {
|
|
header("Location: ".$backtopageforcancel);
|
|
exit;
|
|
} elseif (!empty($backtopage)) {
|
|
header("Location: ".$backtopage);
|
|
exit;
|
|
}
|
|
$action = '';
|
|
}
|
|
|
|
if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser) {
|
|
if ($id != $user->id) { // A user can't disable itself
|
|
$object->fetch($id);
|
|
if ($object->admin && empty($user->admin)) {
|
|
// If user to delete is an admin user and if logged user is not admin, we deny the operation.
|
|
$error++;
|
|
setEventMessages($langs->trans("OnlyAdminUsersCanDisableAdminUsers"), null, 'errors');
|
|
} else {
|
|
$object->setstatus(0);
|
|
header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser) {
|
|
$error = 0;
|
|
|
|
if ($id != $user->id) {
|
|
$object->fetch($id);
|
|
|
|
if (!empty($conf->file->main_limit_users)) {
|
|
$nb = $object->getNbOfUsers("active");
|
|
if ($nb >= $conf->file->main_limit_users) {
|
|
$error++;
|
|
setEventMessages($langs->trans("YourQuotaOfUsersIsReached"), null, 'errors');
|
|
}
|
|
}
|
|
|
|
if (!$error) {
|
|
$object->setstatus(1);
|
|
header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser) {
|
|
if ($id != $user->id) {
|
|
if (!GETPOSTISSET('token')) {
|
|
print 'Error, token required for this critical operation';
|
|
exit;
|
|
}
|
|
|
|
$object = new User($db);
|
|
$object->fetch($id);
|
|
$object->oldcopy = clone $object;
|
|
|
|
$result = $object->delete($user);
|
|
if ($result < 0) {
|
|
$langs->load("errors");
|
|
setEventMessages($langs->trans("ErrorUserCannotBeDelete"), null, 'errors');
|
|
} else {
|
|
setEventMessages($langs->trans("RecordDeleted"), null);
|
|
header("Location: ".DOL_URL_ROOT."/user/list.php?restore_lastsearch_values=1");
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Action Add user
|
|
if ($action == 'add' && $canadduser) {
|
|
$error = 0;
|
|
|
|
if (!GETPOST("lastname")) {
|
|
$error++;
|
|
setEventMessages($langs->trans("NameNotDefined"), null, 'errors');
|
|
$action = "create"; // Go back to create page
|
|
}
|
|
if (!GETPOST("login")) {
|
|
$error++;
|
|
setEventMessages($langs->trans("LoginNotDefined"), null, 'errors');
|
|
$action = "create"; // Go back to create page
|
|
}
|
|
|
|
if (!empty($conf->file->main_limit_users)) { // If option to limit users is set
|
|
$nb = $object->getNbOfUsers("active");
|
|
if ($nb >= $conf->file->main_limit_users) {
|
|
$error++;
|
|
setEventMessages($langs->trans("YourQuotaOfUsersIsReached"), null, 'errors');
|
|
$action = "create"; // Go back to create page
|
|
}
|
|
}
|
|
|
|
if (!$error) {
|
|
$object->civility_code = GETPOST("civility_code", 'aZ09');
|
|
$object->lastname = GETPOST("lastname", 'alphanohtml');
|
|
$object->firstname = GETPOST("firstname", 'alphanohtml');
|
|
$object->ref_employee = GETPOST("ref_employee", 'alphanohtml');
|
|
$object->national_registration_number = GETPOST("national_registration_number", 'alphanohtml');
|
|
$object->login = GETPOST("login", 'alphanohtml');
|
|
$object->api_key = GETPOST("api_key", 'alphanohtml');
|
|
$object->gender = GETPOST("gender", 'aZ09');
|
|
$object->admin = GETPOSTINT("admin");
|
|
$object->address = GETPOST('address', 'alphanohtml');
|
|
$object->zip = GETPOST('zipcode', 'alphanohtml');
|
|
$object->town = GETPOST('town', 'alphanohtml');
|
|
$object->country_id = GETPOSTINT('country_id');
|
|
$object->state_id = GETPOSTINT('state_id');
|
|
$object->office_phone = GETPOST("office_phone", 'alphanohtml');
|
|
$object->office_fax = GETPOST("office_fax", 'alphanohtml');
|
|
$object->user_mobile = GETPOST("user_mobile", 'alphanohtml');
|
|
|
|
if (isModEnabled('socialnetworks')) {
|
|
$object->socialnetworks = array();
|
|
foreach ($socialnetworks as $key => $value) {
|
|
if (GETPOST($key, 'alphanohtml')) {
|
|
$object->socialnetworks[$key] = GETPOST($key, 'alphanohtml');
|
|
}
|
|
}
|
|
}
|
|
|
|
$object->email = preg_replace('/\s+/', '', GETPOST("email", 'alphanohtml'));
|
|
$object->job = GETPOST("job", 'alphanohtml');
|
|
$object->signature = GETPOST("signature", 'restricthtml');
|
|
$object->accountancy_code = GETPOST("accountancy_code", 'alphanohtml');
|
|
$object->note_public = GETPOST("note_public", 'restricthtml');
|
|
$object->note_private = GETPOST("note_private", 'restricthtml');
|
|
$object->ldap_sid = GETPOST("ldap_sid", 'alphanohtml');
|
|
$object->fk_user = GETPOST("fk_user", 'int') > 0 ? GETPOST("fk_user", 'int') : 0;
|
|
$object->fk_user_expense_validator = GETPOST("fk_user_expense_validator", 'int') > 0 ? GETPOST("fk_user_expense_validator", 'int') : 0;
|
|
$object->fk_user_holiday_validator = GETPOST("fk_user_holiday_validator", 'int') > 0 ? GETPOST("fk_user_holiday_validator", 'int') : 0;
|
|
$object->employee = GETPOST('employee', 'alphanohtml');
|
|
|
|
$object->thm = GETPOST("thm", 'alphanohtml') != '' ? GETPOST("thm", 'alphanohtml') : '';
|
|
$object->thm = price2num($object->thm);
|
|
$object->tjm = GETPOST("tjm", 'alphanohtml') != '' ? GETPOST("tjm", 'alphanohtml') : '';
|
|
$object->tjm = price2num($object->tjm);
|
|
$object->salary = GETPOST("salary", 'alphanohtml') != '' ? GETPOST("salary", 'alphanohtml') : '';
|
|
$object->salary = price2num($object->salary);
|
|
$object->salaryextra = GETPOST("salaryextra", 'alphanohtml') != '' ? GETPOST("salaryextra", 'alphanohtml') : '';
|
|
$object->weeklyhours = GETPOST("weeklyhours", 'alphanohtml') != '' ? GETPOST("weeklyhours", 'alphanohtml') : '';
|
|
|
|
$object->color = GETPOST("color", 'alphanohtml') != '' ? GETPOST("color", 'alphanohtml') : '';
|
|
|
|
$object->dateemployment = $dateemployment;
|
|
$object->dateemploymentend = $dateemploymentend;
|
|
$object->datestartvalidity = $datestartvalidity;
|
|
$object->dateendvalidity = $dateendvalidity;
|
|
$object->birth = $dateofbirth;
|
|
|
|
$object->fk_warehouse = GETPOSTINT('fk_warehouse');
|
|
|
|
$object->lang = GETPOST('default_lang', 'aZ09');
|
|
|
|
// Fill array 'array_options' with data from add form
|
|
$ret = $extrafields->setOptionalsFromPost(null, $object);
|
|
if ($ret < 0) {
|
|
$error++;
|
|
}
|
|
|
|
// Set entity property
|
|
$entity = GETPOST('entity', 'int');
|
|
if (isModEnabled('multicompany')) {
|
|
if (GETPOST('superadmin', 'int')) {
|
|
$object->entity = 0;
|
|
} else {
|
|
if (getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
|
|
$object->entity = 1; // all users are forced into master entity
|
|
} else {
|
|
$object->entity = ($entity == '' ? 1 : $entity);
|
|
}
|
|
}
|
|
} else {
|
|
$object->entity = ($entity == '' ? 1 : $entity);
|
|
/*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha'))
|
|
{
|
|
}*/
|
|
}
|
|
|
|
$db->begin();
|
|
|
|
$id = $object->create($user);
|
|
if ($id > 0) {
|
|
$resPass = 0;
|
|
if (GETPOST('password', 'none')) {
|
|
$resPass = $object->setPassword($user, GETPOST('password', 'none'));
|
|
}
|
|
if (is_int($resPass) && $resPass < 0) {
|
|
$langs->load("errors");
|
|
$db->rollback();
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
$action = "create"; // Go back to create page
|
|
} else {
|
|
if (isModEnabled("categorie")) {
|
|
// Categories association
|
|
$usercats = GETPOST('usercats', 'array');
|
|
$object->setCategories($usercats);
|
|
}
|
|
$db->commit();
|
|
|
|
header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id);
|
|
exit;
|
|
}
|
|
} else {
|
|
$langs->load("errors");
|
|
$db->rollback();
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
$action = "create"; // Go back to create page
|
|
}
|
|
}
|
|
}
|
|
|
|
// Action add usergroup
|
|
if (($action == 'addgroup' || $action == 'removegroup') && $caneditgroup) {
|
|
if ($group) {
|
|
$editgroup = new UserGroup($db);
|
|
$editgroup->fetch($group);
|
|
$editgroup->oldcopy = clone $editgroup;
|
|
|
|
$object->fetch($id);
|
|
|
|
if ($action == 'addgroup') {
|
|
$result = $object->SetInGroup($group, $editgroup->entity);
|
|
}
|
|
if ($action == 'removegroup') {
|
|
$result = $object->RemoveFromGroup($group, $editgroup->entity);
|
|
}
|
|
|
|
if ($result > 0) {
|
|
$action = '';
|
|
} else {
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($action == 'update' && $canedituser) {
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
|
|
|
if ($caneditfield) { // Case we can edit all field
|
|
$error = 0;
|
|
|
|
if (!GETPOST("lastname", 'alpha')) {
|
|
setEventMessages($langs->trans("NameNotDefined"), null, 'errors');
|
|
$action = "edit"; // Go back to create page
|
|
$error++;
|
|
}
|
|
if (!GETPOST("login", 'alpha')) {
|
|
setEventMessages($langs->trans("LoginNotDefined"), null, 'errors');
|
|
$action = "edit"; // Go back to create page
|
|
$error++;
|
|
}
|
|
|
|
if (!$error) {
|
|
$object->fetch($id);
|
|
|
|
$object->oldcopy = clone $object;
|
|
|
|
$db->begin();
|
|
|
|
$object->civility_code = GETPOST("civility_code", 'aZ09');
|
|
$object->lastname = GETPOST("lastname", 'alphanohtml');
|
|
$object->firstname = GETPOST("firstname", 'alphanohtml');
|
|
// Protection against deletion of ref_employee while the field is not present in the user tab
|
|
if (GETPOSTISSET("ref_employee")) {
|
|
$object->ref_employee = GETPOST("ref_employee", 'alphanohtml');
|
|
}
|
|
// Protection against deletion of national_registration_number while the field is not present in the user tab
|
|
if (GETPOSTISSET("national_registration_number")) {
|
|
$object->national_registration_number = GETPOST("national_registration_number", 'alphanohtml');
|
|
}
|
|
$object->gender = GETPOST("gender", 'aZ09');
|
|
if ($caneditpasswordandsee) {
|
|
$object->pass = GETPOST("password", 'none'); // We can keep 'none' for password fields
|
|
}
|
|
if ($caneditpasswordandsee || $user->hasRight("api", "apikey", "generate")) {
|
|
$object->api_key = (GETPOST("api_key", 'alphanohtml')) ? GETPOST("api_key", 'alphanohtml') : $object->api_key;
|
|
}
|
|
if (!empty($user->admin) && $user->id != $id) {
|
|
// admin flag can only be set/unset by an admin user and not four ourself
|
|
// A test is also done later when forging sql request
|
|
$object->admin = GETPOST("admin", "int");
|
|
}
|
|
if ($user->admin && !$object->ldap_sid) { // same test than on edit page
|
|
$object->login = GETPOST("login", 'alphanohtml');
|
|
}
|
|
$object->address = GETPOST('address', 'alphanohtml');
|
|
$object->zip = GETPOST('zipcode', 'alphanohtml');
|
|
$object->town = GETPOST('town', 'alphanohtml');
|
|
$object->country_id = GETPOST('country_id', 'int');
|
|
$object->state_id = GETPOST('state_id', 'int');
|
|
$object->office_phone = GETPOST("office_phone", 'alphanohtml');
|
|
$object->office_fax = GETPOST("office_fax", 'alphanohtml');
|
|
$object->user_mobile = GETPOST("user_mobile", 'alphanohtml');
|
|
|
|
if (isModEnabled('socialnetworks')) {
|
|
$object->socialnetworks = array();
|
|
foreach ($socialnetworks as $key => $value) {
|
|
if (GETPOST($key, 'alphanohtml')) {
|
|
$object->socialnetworks[$key] = GETPOST($key, 'alphanohtml');
|
|
}
|
|
}
|
|
}
|
|
|
|
$object->email = preg_replace('/\s+/', '', GETPOST("email", 'alphanohtml'));
|
|
$object->job = GETPOST("job", 'alphanohtml');
|
|
$object->signature = GETPOST("signature", 'restricthtml');
|
|
$object->accountancy_code = GETPOST("accountancy_code", 'alphanohtml');
|
|
$object->openid = GETPOST("openid", 'alphanohtml');
|
|
$object->fk_user = GETPOST("fk_user", 'int') > 0 ? GETPOST("fk_user", 'int') : 0;
|
|
$object->fk_user_expense_validator = GETPOST("fk_user_expense_validator", 'int') > 0 ? GETPOST("fk_user_expense_validator", 'int') : 0;
|
|
$object->fk_user_holiday_validator = GETPOST("fk_user_holiday_validator", 'int') > 0 ? GETPOST("fk_user_holiday_validator", 'int') : 0;
|
|
$object->employee = GETPOST('employee', 'int');
|
|
|
|
$object->thm = GETPOST("thm", 'alphanohtml') != '' ? GETPOST("thm", 'alphanohtml') : '';
|
|
$object->thm = price2num($object->thm);
|
|
$object->tjm = GETPOST("tjm", 'alphanohtml') != '' ? GETPOST("tjm", 'alphanohtml') : '';
|
|
$object->tjm = price2num($object->tjm);
|
|
$object->salary = GETPOST("salary", 'alphanohtml') != '' ? GETPOST("salary", 'alphanohtml') : '';
|
|
$object->salary = price2num($object->salary);
|
|
$object->salaryextra = GETPOST("salaryextra", 'alphanohtml') != '' ? GETPOST("salaryextra", 'alphanohtml') : '';
|
|
$object->salaryextra = price2num($object->salaryextra);
|
|
$object->weeklyhours = GETPOST("weeklyhours", 'alphanohtml') != '' ? GETPOST("weeklyhours", 'alphanohtml') : '';
|
|
$object->weeklyhours = price2num($object->weeklyhours);
|
|
|
|
$object->color = GETPOST("color", 'alphanohtml') != '' ? GETPOST("color", 'alphanohtml') : '';
|
|
$object->dateemployment = $dateemployment;
|
|
$object->dateemploymentend = $dateemploymentend;
|
|
$object->datestartvalidity = $datestartvalidity;
|
|
$object->dateendvalidity = $dateendvalidity;
|
|
$object->birth = $dateofbirth;
|
|
|
|
if (isModEnabled('stock')) {
|
|
$object->fk_warehouse = GETPOST('fk_warehouse', 'int');
|
|
}
|
|
|
|
$object->lang = GETPOST('default_lang', 'aZ09');
|
|
|
|
// Do we update also ->entity ?
|
|
if (isModEnabled('multicompany') && empty($user->entity) && !empty($user->admin)) { // If multicompany is not enabled, we never update the entity of a user.
|
|
if (GETPOST('superadmin', 'int')) {
|
|
$object->entity = 0;
|
|
} else {
|
|
if (getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
|
|
$object->entity = 1; // all users are in master entity
|
|
} else {
|
|
// We try to change the entity of user
|
|
$object->entity = (GETPOSTISSET('entity') ? GETPOSTINT('entity') : $object->entity);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Fill array 'array_options' with data from add form
|
|
$ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
|
|
if ($ret < 0) {
|
|
$error++;
|
|
}
|
|
|
|
if (GETPOST('deletephoto')) {
|
|
$object->photo = '';
|
|
}
|
|
if (!empty($_FILES['photo']['name'])) {
|
|
$isimage = image_format_supported($_FILES['photo']['name']);
|
|
if ($isimage > 0) {
|
|
$object->photo = dol_sanitizeFileName($_FILES['photo']['name']);
|
|
} else {
|
|
$error++;
|
|
$langs->load("errors");
|
|
setEventMessages($langs->trans("ErrorBadImageFormat"), null, 'errors');
|
|
dol_syslog($langs->transnoentities("ErrorBadImageFormat"), LOG_INFO);
|
|
}
|
|
}
|
|
|
|
if (!$error) {
|
|
$passwordismodified = 0;
|
|
if (!empty($object->pass)) {
|
|
if ($object->pass != $object->pass_indatabase && !dol_verifyHash($object->pass, $object->pass_indatabase_crypted)) {
|
|
$passwordismodified = 1;
|
|
}
|
|
}
|
|
|
|
$ret = $object->update($user); // This may include call to setPassword if password has changed
|
|
if ($ret < 0) {
|
|
$error++;
|
|
if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
|
|
$langs->load("errors");
|
|
setEventMessages($langs->trans("ErrorLoginAlreadyExists", $object->login), null, 'errors');
|
|
} else {
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
$action = 'edit';
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$error && GETPOSTISSET('contactid')) {
|
|
$contactid = GETPOST('contactid', 'int');
|
|
$socid = GETPOST('socid', 'int');
|
|
|
|
if ($contactid > 0) { // The 'contactid' is used inpriority over the 'socid'
|
|
$contact = new Contact($db);
|
|
$contact->fetch($contactid);
|
|
|
|
$sql = "UPDATE ".MAIN_DB_PREFIX."user";
|
|
$sql .= " SET fk_socpeople=".((int) $contactid);
|
|
if (!empty($contact->socid)) {
|
|
$sql .= ", fk_soc=".((int) $contact->socid);
|
|
} elseif ($socid > 0) {
|
|
$sql .= ", fk_soc = null";
|
|
setEventMessages($langs->trans("WarningUserDifferentContactSocid"), null, 'warnings'); // Add message if post socid != $contact->socid
|
|
}
|
|
$sql .= " WHERE rowid = ".((int) $object->id);
|
|
} elseif ($socid > 0) {
|
|
$sql = "UPDATE ".MAIN_DB_PREFIX."user";
|
|
$sql .= " SET fk_socpeople=NULL, fk_soc=".((int) $socid);
|
|
$sql .= " WHERE rowid = ".((int) $object->id);
|
|
} else {
|
|
$sql = "UPDATE ".MAIN_DB_PREFIX."user";
|
|
$sql .= " SET fk_socpeople=NULL, fk_soc=NULL";
|
|
$sql .= " WHERE rowid = ".((int) $object->id);
|
|
}
|
|
dol_syslog("usercard::update", LOG_DEBUG);
|
|
$resql = $db->query($sql);
|
|
if (!$resql) {
|
|
$error++;
|
|
setEventMessages($db->lasterror(), null, 'errors');
|
|
}
|
|
}
|
|
|
|
if (!$error && !count($object->errors)) {
|
|
if (!empty($object->oldcopy->photo) && (GETPOST('deletephoto') || ($object->photo != $object->oldcopy->photo))) {
|
|
$fileimg = $conf->user->dir_output.'/'.get_exdir(0, 0, 0, 0, $object, 'user').'photos/'.$object->oldcopy->photo;
|
|
dol_delete_file($fileimg);
|
|
|
|
$dirthumbs = $conf->user->dir_output.'/'.get_exdir(0, 0, 0, 0, $object, 'user').'photos/thumbs';
|
|
dol_delete_dir_recursive($dirthumbs);
|
|
}
|
|
|
|
if (isset($_FILES['photo']['tmp_name']) && trim($_FILES['photo']['tmp_name'])) {
|
|
$dir = $conf->user->dir_output.'/'.get_exdir(0, 0, 0, 1, $object, 'user').'/photos';
|
|
|
|
dol_mkdir($dir);
|
|
|
|
if (@is_dir($dir)) {
|
|
$newfile = $dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']);
|
|
$result = dol_move_uploaded_file($_FILES['photo']['tmp_name'], $newfile, 1, 0, $_FILES['photo']['error']);
|
|
|
|
if (!($result > 0)) {
|
|
setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors');
|
|
} else {
|
|
// Create thumbs
|
|
$object->addThumbs($newfile);
|
|
}
|
|
} else {
|
|
$error++;
|
|
$langs->load("errors");
|
|
setEventMessages($langs->trans("ErrorFailedToCreateDir", $dir), $mesgs, 'errors');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$error && !count($object->errors)) {
|
|
// Then we add the associated categories
|
|
$categories = GETPOST('usercats', 'array');
|
|
$object->setCategories($categories);
|
|
}
|
|
|
|
if (!$error && !count($object->errors)) {
|
|
setEventMessages($langs->trans("UserModified"), null, 'mesgs');
|
|
$db->commit();
|
|
|
|
$login = $_SESSION["dol_login"];
|
|
if ($login && $login == $object->oldcopy->login && $object->oldcopy->login != $object->login) { // Current user has changed its login
|
|
$error++;
|
|
$langs->load("errors");
|
|
setEventMessages($langs->transnoentitiesnoconv("WarningYourLoginWasModifiedPleaseLogin"), null, 'warnings');
|
|
}
|
|
if ($passwordismodified && $object->login == $user->login) { // Current user has changed its password
|
|
$error++;
|
|
$langs->load("errors");
|
|
setEventMessages($langs->transnoentitiesnoconv("WarningYourPasswordWasModifiedPleaseLogin"), null, 'warnings');
|
|
header("Location: ".DOL_URL_ROOT.'/user/card.php?id='.$object->id);
|
|
exit;
|
|
}
|
|
} else {
|
|
$db->rollback();
|
|
}
|
|
}
|
|
} else {
|
|
if ($caneditpasswordandsee) { // Case we can edit only password
|
|
dol_syslog("Not allowed to change fields, only password");
|
|
|
|
$object->fetch($id);
|
|
|
|
if (GETPOST("password", "none")) { // If pass is empty, we do not change it.
|
|
$object->oldcopy = clone $object;
|
|
|
|
$ret = $object->setPassword($user, GETPOST("password", "none"));
|
|
if (is_int($ret) && $ret < 0) {
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Change password with a new generated one
|
|
if ((($action == 'confirm_password' && $confirm == 'yes' && $caneditpasswordandsee)
|
|
|| ($action == 'confirm_passwordsend' && $confirm == 'yes' && $caneditpasswordandsend))
|
|
) {
|
|
$object->fetch($id);
|
|
|
|
$newpassword = $object->setPassword($user, ''); // This will generate a new password
|
|
if (is_int($newpassword) && $newpassword < 0) {
|
|
// Echec
|
|
setEventMessages($langs->trans("ErrorFailedToSetNewPassword"), null, 'errors');
|
|
} else {
|
|
// Succes
|
|
if ($action == 'confirm_passwordsend' && $confirm == 'yes') {
|
|
if ($object->send_password($user, $newpassword) > 0) {
|
|
setEventMessages($langs->trans("PasswordChangedAndSentTo", $object->email), null, 'mesgs');
|
|
} else {
|
|
setEventMessages($object->error, $object->errors, 'errors');
|
|
}
|
|
} else {
|
|
setEventMessages($langs->trans("PasswordChangedTo", $newpassword), null, 'warnings');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Action to initialize data from a LDAP record
|
|
if ($action == 'adduserldap' && $canadduser) {
|
|
$selecteduser = GETPOST('users');
|
|
|
|
$required_fields = array(
|
|
getDolGlobalString('LDAP_KEY_USERS'),
|
|
getDolGlobalString('LDAP_FIELD_NAME'),
|
|
getDolGlobalString('LDAP_FIELD_FIRSTNAME'),
|
|
getDolGlobalString('LDAP_FIELD_LOGIN'),
|
|
getDolGlobalString('LDAP_FIELD_LOGIN_SAMBA'),
|
|
getDolGlobalString('LDAP_FIELD_PASSWORD'),
|
|
getDolGlobalString('LDAP_FIELD_PASSWORD_CRYPTED'),
|
|
getDolGlobalString('LDAP_FIELD_PHONE'),
|
|
getDolGlobalString('LDAP_FIELD_FAX'),
|
|
getDolGlobalString('LDAP_FIELD_MOBILE'),
|
|
getDolGlobalString('LDAP_FIELD_MAIL'),
|
|
getDolGlobalString('LDAP_FIELD_TITLE'),
|
|
getDolGlobalString('LDAP_FIELD_DESCRIPTION'),
|
|
getDolGlobalString('LDAP_FIELD_SID')
|
|
);
|
|
if (isModEnabled('socialnetworks')) {
|
|
$arrayofsocialnetworks = array('skype', 'twitter', 'facebook', 'linkedin');
|
|
foreach ($arrayofsocialnetworks as $socialnetwork) {
|
|
$required_fields[] = getDolGlobalString('LDAP_FIELD_'.strtoupper($socialnetwork));
|
|
}
|
|
}
|
|
|
|
$ldap = new Ldap();
|
|
$result = $ldap->connect_bind();
|
|
if ($result >= 0) {
|
|
// Remove from required_fields all entries not configured in LDAP (empty) and duplicated
|
|
$required_fields = array_unique(array_values(array_filter($required_fields, "dol_validElement")));
|
|
|
|
$ldapusers = $ldap->getRecords($selecteduser, $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields);
|
|
//print_r($ldapusers);
|
|
|
|
if (is_array($ldapusers)) {
|
|
foreach ($ldapusers as $key => $attribute) {
|
|
$ldap_lastname = $attribute[getDolGlobalString('LDAP_FIELD_NAME')];
|
|
$ldap_firstname = $attribute[getDolGlobalString('LDAP_FIELD_FIRSTNAME')];
|
|
$ldap_login = $attribute[getDolGlobalString('LDAP_FIELD_LOGIN')];
|
|
$ldap_loginsmb = $attribute[getDolGlobalString('LDAP_FIELD_LOGIN_SAMBA')];
|
|
$ldap_pass = $attribute[getDolGlobalString('LDAP_FIELD_PASSWORD')];
|
|
$ldap_pass_crypted = $attribute[getDolGlobalString('LDAP_FIELD_PASSWORD_CRYPTED')];
|
|
$ldap_phone = $attribute[getDolGlobalString('LDAP_FIELD_PHONE')];
|
|
$ldap_fax = $attribute[getDolGlobalString('LDAP_FIELD_FAX')];
|
|
$ldap_mobile = $attribute[getDolGlobalString('LDAP_FIELD_MOBILE')];
|
|
$ldap_mail = $attribute[getDolGlobalString('LDAP_FIELD_MAIL')];
|
|
$ldap_sid = $attribute[getDolGlobalString('LDAP_FIELD_SID')];
|
|
|
|
if (isModEnabled('socialnetworks')) {
|
|
$arrayofsocialnetworks = array('skype', 'twitter', 'facebook', 'linkedin');
|
|
foreach ($arrayofsocialnetworks as $socialnetwork) {
|
|
$ldap_social[$socialnetwork] = $attribute[getDolGlobalString('LDAP_FIELD_'.strtoupper($socialnetwork))];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
setEventMessages($ldap->error, $ldap->errors, 'errors');
|
|
}
|
|
}
|
|
|
|
// Actions to send emails
|
|
$triggersendname = 'USER_SENTBYMAIL';
|
|
$paramname = 'id'; // Name of param key to open the card
|
|
$mode = 'emailfromuser';
|
|
$trackid = 'use'.$id;
|
|
include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
|
|
|
|
// Actions to build doc
|
|
$upload_dir = $conf->user->dir_output;
|
|
$permissiontoadd = $user->hasRight("user", "user", "write");
|
|
include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
|
|
}
|
|
|
|
|
|
/*
|
|
* View
|
|
*/
|
|
|
|
$form = new Form($db);
|
|
$formother = new FormOther($db);
|
|
$formcompany = new FormCompany($db);
|
|
$formadmin = new FormAdmin($db);
|
|
$formfile = new FormFile($db);
|
|
if (isModEnabled('stock')) {
|
|
$formproduct = new FormProduct($db);
|
|
}
|
|
|
|
if ($object->id > 0) {
|
|
$person_name = !empty($object->firstname) ? $object->lastname.", ".$object->firstname : $object->lastname;
|
|
$title = $person_name." - ".$langs->trans('Card');
|
|
} else {
|
|
if (GETPOST('employee', 'alphanohtml')) {
|
|
$title = $langs->trans("NewEmployee");
|
|
} else {
|
|
$title = $langs->trans("NewUser");
|
|
}
|
|
}
|
|
$help_url = '';
|
|
|
|
llxHeader('', $title, $help_url);
|
|
|
|
|
|
if ($action == 'create' || $action == 'adduserldap') {
|
|
print load_fiche_titre($title, '', 'user');
|
|
|
|
print '<span class="opacitymedium">'.$langs->trans("CreateInternalUserDesc")."</span><br>\n";
|
|
print "<br>";
|
|
|
|
|
|
if (isModEnabled('ldap') && (isset($conf->global->LDAP_SYNCHRO_ACTIVE) && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_LDAP_TO_DOLIBARR)) {
|
|
// Show form to add an account from LDAP if sync LDAP -> Dolibarr is set
|
|
$ldap = new Ldap();
|
|
$result = $ldap->connect_bind();
|
|
if ($result >= 0) {
|
|
$required_fields = array(
|
|
$conf->global->LDAP_KEY_USERS,
|
|
$conf->global->LDAP_FIELD_FULLNAME,
|
|
$conf->global->LDAP_FIELD_NAME,
|
|
$conf->global->LDAP_FIELD_FIRSTNAME,
|
|
$conf->global->LDAP_FIELD_LOGIN,
|
|
$conf->global->LDAP_FIELD_LOGIN_SAMBA,
|
|
$conf->global->LDAP_FIELD_PASSWORD,
|
|
$conf->global->LDAP_FIELD_PASSWORD_CRYPTED,
|
|
$conf->global->LDAP_FIELD_PHONE,
|
|
$conf->global->LDAP_FIELD_FAX,
|
|
$conf->global->LDAP_FIELD_MOBILE,
|
|
$conf->global->LDAP_FIELD_SKYPE,
|
|
$conf->global->LDAP_FIELD_MAIL,
|
|
$conf->global->LDAP_FIELD_TITLE,
|
|
$conf->global->LDAP_FIELD_DESCRIPTION,
|
|
$conf->global->LDAP_FIELD_SID
|
|
);
|
|
|
|
// Remove from required_fields all entries not configured in LDAP (empty) and duplicated
|
|
$required_fields = array_unique(array_values(array_filter($required_fields, "dol_validElement")));
|
|
|
|
// Get from LDAP database an array of results
|
|
$ldapusers = $ldap->getRecords('*', $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields, 1);
|
|
|
|
if (is_array($ldapusers)) {
|
|
$liste = array();
|
|
foreach ($ldapusers as $key => $ldapuser) {
|
|
// Define the label string for this user
|
|
$label = '';
|
|
foreach ($required_fields as $value) {
|
|
if ($value === $conf->global->LDAP_FIELD_PASSWORD || $value === $conf->global->LDAP_FIELD_PASSWORD_CRYPTED) {
|
|
$label .= $value."=******* ";
|
|
} elseif ($value) {
|
|
$label .= $value."=".$ldapuser[$value]." ";
|
|
}
|
|
}
|
|
$liste[$key] = $label;
|
|
}
|
|
} else {
|
|
setEventMessages($ldap->error, $ldap->errors, 'errors');
|
|
}
|
|
} else {
|
|
setEventMessages($ldap->error, $ldap->errors, 'errors');
|
|
}
|
|
|
|
// If user list is full, we show drop-down list
|
|
print "\n\n<!-- Form liste LDAP debut -->\n";
|
|
|
|
print '<form name="add_user_ldap" action="'.$_SERVER["PHP_SELF"].'" method="post">';
|
|
print '<input type="hidden" name="token" value="'.newToken().'">';
|
|
print '<table class="border centpercent"><tr>';
|
|
print '<td width="160">';
|
|
print $langs->trans("LDAPUsers");
|
|
print '</td>';
|
|
print '<td>';
|
|
print '<input type="hidden" name="action" value="adduserldap">';
|
|
if (is_array($liste) && count($liste)) {
|
|
print $form->selectarray('users', $liste, '', 1, 0, 0, '', 0, 0, 0, '', 'maxwidth500');
|
|
print ajax_combobox('users');
|
|
}
|
|
print '</td><td class="center">';
|
|
print '<input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans('Get')).'"'.(count($liste) ? '' : ' disabled').'>';
|
|
print '</td></tr></table>';
|
|
print '</form>';
|
|
|
|
print "\n<!-- Form liste LDAP fin -->\n\n";
|
|
print '<br>';
|
|
}
|
|
|
|
|
|
print '<form action="'.$_SERVER['PHP_SELF'].'" method="POST" name="createuser">';
|
|
print '<input type="hidden" name="token" value="'.newToken().'">';
|
|
print '<input type="hidden" name="action" value="add">';
|
|
if (!empty($ldap_sid)) {
|
|
print '<input type="hidden" name="ldap_sid" value="'.dol_escape_htmltag($ldap_sid).'">';
|
|
}
|
|
print '<input type="hidden" name="entity" value="'.$conf->entity.'">';
|
|
|
|
print dol_get_fiche_head('', '', '', 0, '');
|
|
|
|
dol_set_focus('#lastname');
|
|
|
|
print '<table class="border centpercent">';
|
|
|
|
// Civility
|
|
print '<tr><td><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td>';
|
|
print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", 'aZ09') : $object->civility_code, 'civility_code');
|
|
print '</td></tr>';
|
|
|
|
// Lastname
|
|
print '<tr>';
|
|
print '<td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("Lastname").'</span></td>';
|
|
print '<td>';
|
|
if (!empty($ldap_lastname)) {
|
|
print '<input type="hidden" id="lastname" name="lastname" value="'.dol_escape_htmltag($ldap_lastname).'">';
|
|
print $ldap_lastname;
|
|
} else {
|
|
print '<input class="minwidth100 maxwidth150onsmartphone createloginauto" type="text" id="lastname" name="lastname" value="'.dol_escape_htmltag(GETPOST('lastname', 'alphanohtml')).'">';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Firstname
|
|
print '<tr><td>'.$langs->trans("Firstname").'</td>';
|
|
print '<td>';
|
|
if (!empty($ldap_firstname)) {
|
|
print '<input type="hidden" name="firstname" value="'.dol_escape_htmltag($ldap_firstname).'">';
|
|
print $ldap_firstname;
|
|
} else {
|
|
print '<input id="firstname" class="minwidth100 maxwidth150onsmartphone createloginauto" type="text" name="firstname" value="'.dol_escape_htmltag(GETPOST('firstname', 'alphanohtml')).'">';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Login
|
|
print '<tr><td><span class="fieldrequired">'.$langs->trans("Login").'</span></td>';
|
|
print '<td>';
|
|
if (!empty($ldap_login)) {
|
|
print '<input type="hidden" name="login" value="'.dol_escape_htmltag($ldap_login).'">';
|
|
print $ldap_login;
|
|
} elseif (!empty($ldap_loginsmb)) {
|
|
print '<input type="hidden" name="login" value="'.dol_escape_htmltag($ldap_loginsmb).'">';
|
|
print $ldap_loginsmb;
|
|
} else {
|
|
print '<input id="login" class="maxwidth200 maxwidth150onsmartphone" maxsize="24" type="text" name="login" value="'.dol_escape_htmltag(GETPOST('login', 'alphanohtml')).'">';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
if (!empty($conf->use_javascript_ajax)) {
|
|
print '<script>
|
|
jQuery(document).ready(function() {
|
|
$(".createloginauto").on("change", function(){
|
|
lastname = $("#lastname").val();
|
|
firstname = $("#firstname").val();
|
|
if($(this).attr("id") == "firstname"){
|
|
firstname = firstname.toLowerCase();
|
|
firstname = firstname[0];
|
|
}
|
|
lastname = lastname.toLowerCase();
|
|
console.log("We create a login from firstname and lastname");
|
|
$("#login").val(firstname+lastname);
|
|
})
|
|
});
|
|
</script>';
|
|
}
|
|
|
|
$generated_password = '';
|
|
if (empty($ldap_sid)) { // ldap_sid is for activedirectory
|
|
$generated_password = getRandomPassword(false);
|
|
}
|
|
$password = (GETPOSTISSET('password') ? GETPOST('password') : $generated_password);
|
|
|
|
// Administrator
|
|
if (!empty($user->admin)) {
|
|
print '<tr><td>'.$form->textwithpicto($langs->trans("Administrator"), $langs->trans("AdministratorDesc"), 1, 'star').'</td>';
|
|
print '<td>';
|
|
print $form->selectyesno('admin', GETPOST('admin'), 1, false, 0, 1);
|
|
|
|
if (isModEnabled('multicompany') && !$user->entity) {
|
|
if (!empty($conf->use_javascript_ajax)) {
|
|
print '<script type="text/javascript">
|
|
$(function() {
|
|
$("select[name=admin]").change(function() {
|
|
if ( $(this).val() == 0 ) {
|
|
$("input[name=superadmin]")
|
|
.prop("disabled", true)
|
|
.prop("checked", false);
|
|
$("select[name=entity]")
|
|
.prop("disabled", false);
|
|
} else {
|
|
$("input[name=superadmin]")
|
|
.prop("disabled", false);
|
|
}
|
|
});
|
|
$("input[name=superadmin]").change(function() {
|
|
if ( $(this).is(":checked") ) {
|
|
$("select[name=entity]")
|
|
.prop("disabled", true);
|
|
} else {
|
|
$("select[name=entity]")
|
|
.prop("disabled", false);
|
|
}
|
|
});
|
|
});
|
|
</script>';
|
|
}
|
|
$checked = (GETPOST('superadmin', 'int') ? ' checked' : '');
|
|
$disabled = (GETPOST('superadmin', 'int') ? '' : ' disabled');
|
|
print '<input type="checkbox" name="superadmin" id="superadmin" value="1"'.$checked.$disabled.' /> <label for="superadmin">'.$langs->trans("SuperAdministrator").'</span>';
|
|
}
|
|
print "</td></tr>\n";
|
|
}
|
|
|
|
// Gender
|
|
print '<tr><td>'.$langs->trans("Gender").'</td>';
|
|
print '<td>';
|
|
$arraygender = array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman"), 'other'=>$langs->trans("Genderother"));
|
|
print $form->selectarray('gender', $arraygender, GETPOST('gender'), 1);
|
|
print '</td></tr>';
|
|
|
|
// Employee
|
|
$defaultemployee = '1';
|
|
print '<tr>';
|
|
print '<td>'.$langs->trans('Employee').'</td><td>';
|
|
print '<input type="checkbox" name="employee" value="1"'.(GETPOST('employee') == '1' ? ' checked="checked"' : (($defaultemployee && !GETPOSTISSET('login')) ? ' checked="checked"' : '')).'>';
|
|
//print $form->selectyesno("employee", (GETPOST('employee') != '' ?GETPOST('employee') : $defaultemployee), 1);
|
|
print '</td></tr>';
|
|
|
|
// Hierarchy
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("HierarchicalResponsible").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $conf->entity, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Expense report validator
|
|
if (isModEnabled('expensereport')) {
|
|
print '<tr><td class="titlefieldcreate">';
|
|
$text = $langs->trans("ForceUserExpenseValidator");
|
|
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
|
|
print '</td>';
|
|
print '<td>';
|
|
print img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers($object->fk_user_expense_validator, 'fk_user_expense_validator', 1, array($object->id), 0, '', 0, $conf->entity, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Holiday request validator
|
|
if (isModEnabled('holiday')) {
|
|
print '<tr><td class="titlefieldcreate">';
|
|
$text = $langs->trans("ForceUserHolidayValidator");
|
|
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
|
|
print '</td>';
|
|
print '<td>';
|
|
print img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers($object->fk_user_holiday_validator, 'fk_user_holiday_validator', 1, array($object->id), 0, '', 0, $conf->entity, 0, 0, '', 0, '', 'maxwidth300 widthcentpercentminusx');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// External user
|
|
print '<tr><td>'.$langs->trans("ExternalUser").' ?</td>';
|
|
print '<td>';
|
|
print $form->textwithpicto($langs->trans("Internal"), $langs->trans("InternalExternalDesc"), 1, 'help', '', 0, 2);
|
|
print '</td></tr>';
|
|
|
|
|
|
print '</table><hr><table class="border centpercent">';
|
|
|
|
|
|
// Date validity
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("RangeOfLoginValidity").'</td>';
|
|
print '<td>';
|
|
print $form->selectDate($datestartvalidity, 'datestartvalidity', 0, 0, 1, 'formdatestartvalidity', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("from"));
|
|
|
|
print ' ';
|
|
|
|
print $form->selectDate($dateendvalidity, 'dateendvalidity', 0, 0, 1, 'formdateendvalidity', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Password
|
|
print '<tr><td class="fieldrequired">'.$langs->trans("Password").'</td>';
|
|
print '<td>';
|
|
$valuetoshow = '';
|
|
if (preg_match('/ldap/', $dolibarr_main_authentication)) {
|
|
$valuetoshow .= ($valuetoshow ? ' + ' : '').$langs->trans("PasswordOfUserInLDAP").' (hidden)';
|
|
}
|
|
if (preg_match('/http/', $dolibarr_main_authentication)) {
|
|
$valuetoshow .= ($valuetoshow ? ' + ' : '').$langs->trans("HTTPBasicPassword");
|
|
}
|
|
if (preg_match('/dolibarr/', $dolibarr_main_authentication) || preg_match('/forceuser/', $dolibarr_main_authentication)) {
|
|
if (!empty($ldap_pass)) { // For very old system comaptibilty. Now clear password can't be viewed from LDAP read
|
|
$valuetoshow .= ($valuetoshow ? ' + ' : '').'<input type="hidden" name="password" value="'.dol_escape_htmltag($ldap_pass).'">'; // Dolibarr password is preffiled with LDAP known password
|
|
$valuetoshow .= preg_replace('/./i', '*', $ldap_pass);
|
|
} else {
|
|
// We do not use a field password but a field text to show new password to use.
|
|
$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">';
|
|
if (!empty($conf->use_javascript_ajax)) {
|
|
$valuetoshow .= img_picto($langs->trans('Generate'), 'refresh', 'id="generate_password" class="linkobject paddingleft"');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Other form for user password
|
|
$parameters = array('valuetoshow' => $valuetoshow, 'password' => $password);
|
|
$reshook = $hookmanager->executeHooks('printUserPasswordField', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
if ($reshook > 0) {
|
|
$valuetoshow = $hookmanager->resPrint; // to replace
|
|
} else {
|
|
$valuetoshow .= $hookmanager->resPrint; // to add
|
|
}
|
|
|
|
print $valuetoshow;
|
|
print '</td></tr>';
|
|
|
|
if (isModEnabled('api')) {
|
|
// API key
|
|
//$generated_password = getRandomPassword(false);
|
|
print '<tr><td>'.$langs->trans("ApiKey").'</td>';
|
|
print '<td>';
|
|
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">';
|
|
if (!empty($conf->use_javascript_ajax)) {
|
|
print img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject paddingleft"');
|
|
}
|
|
print '</td></tr>';
|
|
} else {
|
|
// PARTIAL WORKAROUND
|
|
$generated_fake_api_key = getRandomPassword(false);
|
|
print '<input type="hidden" name="api_key" value="'.$generated_fake_api_key.'">';
|
|
}
|
|
|
|
|
|
print '</table><hr><table class="border centpercent">';
|
|
|
|
|
|
// Address
|
|
print '<tr><td class="tdtop titlefieldcreate">'.$form->editfieldkey('Address', 'address', '', $object, 0).'</td>';
|
|
print '<td><textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
|
|
print $object->address;
|
|
print '</textarea></td></tr>';
|
|
|
|
// Zip
|
|
print '<tr><td>'.$form->editfieldkey('Zip', 'zipcode', '', $object, 0).'</td><td>';
|
|
print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6);
|
|
print '</td></tr>';
|
|
|
|
// Town
|
|
print '<tr><td>'.$form->editfieldkey('Town', 'town', '', $object, 0).'</td><td>';
|
|
print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id'));
|
|
print '</td></tr>';
|
|
|
|
// Country
|
|
print '<tr><td>'.$form->editfieldkey('Country', 'selectcountry_id', '', $object, 0).'</td><td class="maxwidthonsmartphone">';
|
|
print img_picto('', 'country', 'class="pictofixedwidth"');
|
|
print $form->select_country((GETPOST('country_id') != '' ? GETPOST('country_id') : $object->country_id), 'country_id');
|
|
if ($user->admin) {
|
|
print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// State
|
|
if (!getDolGlobalString('USER_DISABLE_STATE')) {
|
|
print '<tr><td>'.$form->editfieldkey('State', 'state_id', '', $object, 0).'</td><td class="maxwidthonsmartphone">';
|
|
print img_picto('', 'state', 'class="pictofixedwidth"');
|
|
print $formcompany->select_state_ajax('country_id', $object->state_id, $object->country_id, 'state_id');
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Tel
|
|
print '<tr><td>'.$langs->trans("PhonePro").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'object_phoning', 'class="pictofixedwidth"');
|
|
if (!empty($ldap_phone)) {
|
|
print '<input type="hidden" name="office_phone" value="'.dol_escape_htmltag($ldap_phone).'">';
|
|
print $ldap_phone;
|
|
} else {
|
|
print '<input class="maxwidth200 widthcentpercentminusx" type="text" name="office_phone" value="'.dol_escape_htmltag(GETPOST('office_phone', 'alphanohtml')).'">';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Tel portable
|
|
print '<tr><td>'.$langs->trans("PhoneMobile").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'object_phoning_mobile', 'class="pictofixedwidth"');
|
|
if (!empty($ldap_mobile)) {
|
|
print '<input type="hidden" name="user_mobile" value="'.dol_escape_htmltag($ldap_mobile).'">';
|
|
print $ldap_mobile;
|
|
} else {
|
|
print '<input class="maxwidth200 widthcentpercentminusx" type="text" name="user_mobile" value="'.dol_escape_htmltag(GETPOST('user_mobile', 'alphanohtml')).'">';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Fax
|
|
print '<tr><td>'.$langs->trans("Fax").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"');
|
|
if (!empty($ldap_fax)) {
|
|
print '<input type="hidden" name="office_fax" value="'.dol_escape_htmltag($ldap_fax).'">';
|
|
print $ldap_fax;
|
|
} else {
|
|
print '<input class="maxwidth200 widthcentpercentminusx" type="text" name="office_fax" value="'.dol_escape_htmltag(GETPOST('office_fax', 'alphanohtml')).'">';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// EMail
|
|
print '<tr><td'.(getDolGlobalString('USER_MAIL_REQUIRED') ? ' class="fieldrequired"' : '').'>'.$langs->trans("EMail").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'object_email', 'class="pictofixedwidth"');
|
|
if (!empty($ldap_mail)) {
|
|
print '<input type="hidden" name="email" value="'.dol_escape_htmltag($ldap_mail).'">';
|
|
print $ldap_mail;
|
|
} else {
|
|
print '<input type="text" name="email" class="maxwidth500 widthcentpercentminusx" value="'.dol_escape_htmltag(GETPOST('email', 'alphanohtml')).'">';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Social networks
|
|
if (isModEnabled('socialnetworks')) {
|
|
foreach ($socialnetworks as $key => $value) {
|
|
if ($value['active']) {
|
|
print '<tr><td>'.$langs->trans($value['label']).'</td>';
|
|
print '<td>';
|
|
if (!empty($value['icon'])) {
|
|
print '<span class="fa '.$value['icon'].' pictofixedwidth"></span>';
|
|
}
|
|
if (!empty($ldap_social[$key])) {
|
|
print '<input type="hidden" name="'.$key.'" value="'.$ldap_social[$key].'">';
|
|
print $ldap_social[$key];
|
|
} else {
|
|
print '<input class="maxwidth200 widthcentpercentminusx" type="text" name="'.$key.'" value="'.GETPOST($key, 'alphanohtml').'">';
|
|
}
|
|
print '</td></tr>';
|
|
} else {
|
|
// if social network is not active but value exist we do not want to loose it
|
|
if (!empty($ldap_social[$key])) {
|
|
print '<input type="hidden" name="'.$key.'" value="'.$ldap_social[$key].'">';
|
|
} else {
|
|
print '<input type="hidden" name="'.$key.'" value="'.GETPOST($key, 'alphanohtml').'">';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Accountancy code
|
|
if (isModEnabled('accounting')) {
|
|
print '<tr><td>'.$langs->trans("AccountancyCode").'</td>';
|
|
print '<td>';
|
|
print '<input type="text" class="maxwidthonsmartphone" name="accountancy_code" value="'.dol_escape_htmltag(GETPOST('accountancy_code', 'alphanohtml')).'">';
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// User color
|
|
if (isModEnabled('agenda')) {
|
|
print '<tr><td>'.$langs->trans("ColorUser").'</td>';
|
|
print '<td>';
|
|
print $formother->selectColor(GETPOSTISSET('color') ? GETPOST('color', 'alphanohtml') : $object->color, 'color', null, 1, '', 'hideifnotset');
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Categories
|
|
if (isModEnabled('categorie') && $user->hasRight("categorie", "read")) {
|
|
print '<tr><td>'.$form->editfieldkey('Categories', 'usercats', '', $object, 0).'</td><td>';
|
|
$cate_arbo = $form->select_all_categories('user', null, 'parent', null, null, 1);
|
|
print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('usercats', $cate_arbo, GETPOST('usercats', 'array'), 0, 0, 'maxwdith300 widthcentpercentminusx', 0, '90%');
|
|
print "</td></tr>";
|
|
}
|
|
|
|
// Default language
|
|
if (getDolGlobalInt('MAIN_MULTILANGS')) {
|
|
print '<tr><td>'.$form->editfieldkey('DefaultLang', 'default_lang', '', $object, 0, 'string', '', 0, 0, 'id', $langs->trans("WarningNotLangOfInterface", $langs->transnoentitiesnoconv("UserGUISetup"))).'</td>';
|
|
print '<td class="maxwidthonsmartphone">'."\n";
|
|
print img_picto('', 'language', 'class="pictofixedwidth"').$formadmin->select_language(GETPOST('default_lang', 'alpha') ? GETPOST('default_lang', 'alpha') : ($object->lang ? $object->lang : ''), 'default_lang', 0, 0, 1, 0, 0, 'maxwidth300 widthcentpercentminusx');
|
|
print '</td>';
|
|
print '</tr>';
|
|
}
|
|
|
|
// Multicompany
|
|
if (isModEnabled('multicompany') && is_object($mc)) {
|
|
// This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module
|
|
if (!method_exists($mc, 'formObjectOptions')) {
|
|
if (!getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE') && $conf->entity == 1 && $user->admin && !$user->entity) { // condition must be same for create and edit mode
|
|
print "<tr>".'<td>'.$langs->trans("Entity").'</td>';
|
|
print "<td>".$mc->select_entities($conf->entity);
|
|
print "</td></tr>\n";
|
|
} else {
|
|
print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
|
|
}
|
|
}
|
|
}
|
|
|
|
// Other attributes
|
|
$parameters = array();
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
|
|
|
|
// Signature
|
|
print '<tr><td class="tdtop">'.$langs->trans("Signature").'</td>';
|
|
print '<td class="wordbreak">';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
|
|
|
$doleditor = new DolEditor('signature', GETPOST('signature', 'restricthtml'), '', 138, 'dolibarr_notes', 'In', true, $acceptlocallinktomedia, !getDolGlobalString('FCKEDITOR_ENABLE_USERSIGN') ? 0 : 1, ROWS_4, '90%');
|
|
print $doleditor->Create(1);
|
|
print '</td></tr>';
|
|
|
|
// Note private
|
|
print '<tr><td class="tdtop">';
|
|
print $langs->trans("NotePublic");
|
|
print '</td><td>';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
|
$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%');
|
|
$doleditor->Create();
|
|
print "</td></tr>\n";
|
|
|
|
// Note private
|
|
print '<tr><td class="tdtop">';
|
|
print $langs->trans("NotePrivate");
|
|
print '</td><td>';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
|
$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%');
|
|
$doleditor->Create();
|
|
print "</td></tr>\n";
|
|
|
|
print '</table><hr><table class="border centpercent">';
|
|
|
|
|
|
// TODO Move this into tab RH (HierarchicalResponsible must be on both tab)
|
|
|
|
// Default warehouse
|
|
if (isModEnabled('stock') && getDolGlobalString('MAIN_DEFAULT_WAREHOUSE_USER')) {
|
|
print '<tr><td>'.$langs->trans("DefaultWarehouse").'</td><td>';
|
|
print $formproduct->selectWarehouses($object->fk_warehouse, 'fk_warehouse', 'warehouseopen', 1);
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Position/Job
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("PostOrFunction").'</td>';
|
|
print '<td>';
|
|
print '<input class="maxwidth200 maxwidth150onsmartphone" type="text" name="job" value="'.dol_escape_htmltag(GETPOST('job', 'alphanohtml')).'">';
|
|
print '</td></tr>';
|
|
|
|
if ((isModEnabled('salaries') && $user->hasRight("salaries", "read") && in_array($id, $childids))
|
|
|| (isModEnabled('salaries') && $user->hasRight("salaries", "readall"))
|
|
|| (isModEnabled('hrm') && $user->hasRight("hrm", "employee", "read"))) {
|
|
$langs->load("salaries");
|
|
|
|
// THM
|
|
print '<tr><td>';
|
|
$text = $langs->trans("THM");
|
|
print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm');
|
|
print '</td>';
|
|
print '<td>';
|
|
print '<input size="8" type="text" name="thm" value="'.dol_escape_htmltag(GETPOST('thm')).'"> '.$langs->getCurrencySymbol($conf->currency);
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// TJM
|
|
print '<tr><td>';
|
|
$text = $langs->trans("TJM");
|
|
print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classtjm');
|
|
print '</td>';
|
|
print '<td>';
|
|
print '<input size="8" type="text" name="tjm" value="'.dol_escape_htmltag(GETPOST('tjm')).'"> '.$langs->getCurrencySymbol($conf->currency);
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Salary
|
|
print '<tr><td>'.$langs->trans("Salary").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'salary', 'class="pictofixedwidth paddingright"').'<input class="width100" type="text" name="salary" value="'.dol_escape_htmltag(GETPOST('salary')).'"> '.$langs->getCurrencySymbol($conf->currency);
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Weeklyhours
|
|
print '<tr><td>'.$langs->trans("WeeklyHours").'</td>';
|
|
print '<td>';
|
|
print '<input size="8" type="text" name="weeklyhours" value="'.dol_escape_htmltag(GETPOST('weeklyhours')).'">';
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Date employment
|
|
print '<tr><td>'.$langs->trans("DateOfEmployment").'</td>';
|
|
print '<td>';
|
|
print $form->selectDate($dateemployment, 'dateemployment', 0, 0, 1, 'formdateemployment', 1, 1, 0, '', '', '', '', 1, '', $langs->trans("from"));
|
|
|
|
print ' - ';
|
|
|
|
print $form->selectDate($dateemploymentend, 'dateemploymentend', 0, 0, 1, 'formdateemploymentend', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Date birth
|
|
print '<tr><td>'.$langs->trans("DateOfBirth").'</td>';
|
|
print '<td>';
|
|
print $form->selectDate($dateofbirth, 'dateofbirth', 0, 0, 1, 'createuser', 1, 0, 0, '', 0, '', '', 1, '', '', 'tzserver');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
print "</table>\n";
|
|
|
|
print dol_get_fiche_end();
|
|
|
|
print $form->buttonsSaveCancel("CreateUser");
|
|
|
|
print "</form>";
|
|
} else {
|
|
// View and edit mode
|
|
if ($id > 0) {
|
|
$res = $object->fetch($id, '', '', 1);
|
|
if ($res < 0) {
|
|
dol_print_error($db, $object->error);
|
|
exit;
|
|
}
|
|
$res = $object->fetch_optionals();
|
|
|
|
// Check if user has rights
|
|
if (!getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
|
|
$object->getrights();
|
|
if (empty($object->nb_rights) && $object->statut != 0 && empty($object->admin)) {
|
|
setEventMessages($langs->trans('UserHasNoPermissions'), null, 'warnings');
|
|
}
|
|
}
|
|
|
|
// Connexion ldap
|
|
// pour recuperer passDoNotExpire et userChangePassNextLogon
|
|
if (isModEnabled('ldap') && !empty($object->ldap_sid)) {
|
|
$ldap = new Ldap();
|
|
$result = $ldap->connect_bind();
|
|
if ($result > 0) {
|
|
$userSearchFilter = '(' . getDolGlobalString('LDAP_FILTER_CONNECTION').'('.$ldap->getUserIdentifier().'='.$object->login.'))';
|
|
$entries = $ldap->fetch($object->login, $userSearchFilter);
|
|
if (!$entries) {
|
|
setEventMessages($ldap->error, $ldap->errors, 'errors');
|
|
}
|
|
|
|
$passDoNotExpire = 0;
|
|
$userChangePassNextLogon = 0;
|
|
$userDisabled = 0;
|
|
$statutUACF = '';
|
|
|
|
// Check options of user account
|
|
if (count($ldap->uacf) > 0) {
|
|
foreach ($ldap->uacf as $key => $statut) {
|
|
if ($key == 65536) {
|
|
$passDoNotExpire = 1;
|
|
$statutUACF = $statut;
|
|
}
|
|
}
|
|
} else {
|
|
$userDisabled = 1;
|
|
$statutUACF = "ACCOUNTDISABLE";
|
|
}
|
|
|
|
if ($ldap->pwdlastset == 0) {
|
|
$userChangePassNextLogon = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Show tabs
|
|
if ($mode == 'employee') { // For HRM module development
|
|
$title = $langs->trans("Employee");
|
|
$linkback = '<a href="'.DOL_URL_ROOT.'/hrm/employee/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
|
|
} else {
|
|
$title = $langs->trans("User");
|
|
$linkback = '';
|
|
|
|
if ($user->hasRight("user", "user", "read") || $user->admin) {
|
|
$linkback = '<a href="'.DOL_URL_ROOT.'/user/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
|
|
}
|
|
}
|
|
|
|
$head = user_prepare_head($object);
|
|
|
|
/*
|
|
* Confirmation reinitialisation mot de passe
|
|
*/
|
|
if ($action == 'password') {
|
|
print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("ReinitPassword"), $langs->trans("ConfirmReinitPassword", $object->login), "confirm_password", '', 0, 1);
|
|
}
|
|
|
|
/*
|
|
* Confirmation envoi mot de passe
|
|
*/
|
|
if ($action == 'passwordsend') {
|
|
print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("SendNewPassword"), $langs->trans("ConfirmSendNewPassword", $object->login), "confirm_passwordsend", '', 0, 1);
|
|
}
|
|
|
|
/*
|
|
* Confirm deactivation
|
|
*/
|
|
if ($action == 'disable') {
|
|
print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("DisableAUser"), $langs->trans("ConfirmDisableUser", $object->login), "confirm_disable", '', 0, 1);
|
|
}
|
|
|
|
/*
|
|
* Confirm activation
|
|
*/
|
|
if ($action == 'enable') {
|
|
print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("EnableAUser"), $langs->trans("ConfirmEnableUser", $object->login), "confirm_enable", '', 0, 1);
|
|
}
|
|
|
|
/*
|
|
* Confirmation suppression
|
|
*/
|
|
if ($action == 'delete') {
|
|
print $form->formconfirm($_SERVER['PHP_SELF']."?id=$object->id", $langs->trans("DeleteAUser"), $langs->trans("ConfirmDeleteUser", $object->login), "confirm_delete", '', 0, 1);
|
|
}
|
|
|
|
/*
|
|
* View mode
|
|
*/
|
|
if ($action != 'edit') {
|
|
print dol_get_fiche_head($head, 'user', $title, -1, 'user');
|
|
|
|
$morehtmlref = '<a href="'.DOL_URL_ROOT.'/user/vcard.php?id='.$object->id.'&output=file&file='.urlencode(dol_sanitizeFileName($object->getFullName($langs).'.vcf')).'" class="refid" rel="noopener" rel="noopener">';
|
|
$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard").' ('.$langs->trans("AddToContacts").')', 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
|
|
$morehtmlref .= '</a>';
|
|
|
|
$urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id);
|
|
$morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->transnoentitiesnoconv("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover');
|
|
|
|
dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin, 'rowid', 'ref', $morehtmlref);
|
|
|
|
print '<div class="fichecenter">';
|
|
print '<div class="fichehalfleft">';
|
|
|
|
print '<div class="underbanner clearboth"></div>';
|
|
print '<table class="border tableforfield centpercent">';
|
|
|
|
// Login
|
|
print '<tr><td class="titlefieldmiddle">'.$langs->trans("Login").'</td>';
|
|
if (!empty($object->ldap_sid) && $object->statut == 0) {
|
|
print '<td class="error">';
|
|
print $langs->trans("LoginAccountDisableInDolibarr");
|
|
print '</td>';
|
|
} else {
|
|
print '<td>';
|
|
$addadmin = '';
|
|
if (property_exists($object, 'admin')) {
|
|
if (isModEnabled('multicompany') && !empty($object->admin) && empty($object->entity)) {
|
|
$addadmin .= img_picto($langs->trans("SuperAdministratorDesc"), "redstar", 'class="paddingleft"');
|
|
} elseif (!empty($object->admin)) {
|
|
$addadmin .= img_picto($langs->trans("AdministratorDesc"), "star", 'class="paddingleft"');
|
|
}
|
|
}
|
|
print showValueWithClipboardCPButton($object->login).$addadmin;
|
|
print '</td>';
|
|
}
|
|
print '</tr>'."\n";
|
|
|
|
// Type
|
|
print '<tr><td>';
|
|
$text = $langs->trans("Type");
|
|
print $form->textwithpicto($text, $langs->trans("InternalExternalDesc"));
|
|
print '</td><td>';
|
|
$type = $langs->trans("Internal");
|
|
if ($object->socid > 0) {
|
|
$type = $langs->trans("External");
|
|
}
|
|
print '<span class="badgeneutral">';
|
|
print $type;
|
|
if ($object->ldap_sid) {
|
|
print ' ('.$langs->trans("DomainUser").')';
|
|
}
|
|
print '</span>';
|
|
print '</td></tr>'."\n";
|
|
|
|
// Ldap sid
|
|
if ($object->ldap_sid) {
|
|
print '<tr><td>'.$langs->trans("Type").'</td><td>';
|
|
print $langs->trans("DomainUser", $ldap->domainFQDN);
|
|
print '</td></tr>'."\n";
|
|
}
|
|
|
|
// Employee
|
|
print '<tr><td>'.$langs->trans("Employee").'</td><td>';
|
|
print '<input type="checkbox" disabled name="employee" value="1"'.($object->employee ? ' checked="checked"' : '').'>';
|
|
//print yn($object->employee);
|
|
print '</td></tr>'."\n";
|
|
|
|
// TODO This is also available into the tab RH
|
|
|
|
// Hierarchy
|
|
print '<tr><td>'.$langs->trans("HierarchicalResponsible").'</td>';
|
|
print '<td>';
|
|
if (empty($object->fk_user)) {
|
|
print '<span class="opacitymedium">'.$langs->trans("None").'</span>';
|
|
} else {
|
|
$huser = new User($db);
|
|
if ($object->fk_user > 0) {
|
|
$huser->fetch($object->fk_user);
|
|
print $huser->getNomUrl(-1);
|
|
} else {
|
|
print '<span class="opacitymedium">'.$langs->trans("None").'</span>';
|
|
}
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Expense report validator
|
|
if (isModEnabled('expensereport')) {
|
|
print '<tr><td>';
|
|
$text = $langs->trans("ForceUserExpenseValidator");
|
|
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
|
|
print '</td>';
|
|
print '<td>';
|
|
if (!empty($object->fk_user_expense_validator)) {
|
|
$evuser = new User($db);
|
|
$evuser->fetch($object->fk_user_expense_validator);
|
|
print $evuser->getNomUrl(-1);
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Holiday request validator
|
|
if (isModEnabled('holiday')) {
|
|
print '<tr><td>';
|
|
$text = $langs->trans("ForceUserHolidayValidator");
|
|
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
|
|
print '</td>';
|
|
print '<td>';
|
|
if (!empty($object->fk_user_holiday_validator)) {
|
|
$hvuser = new User($db);
|
|
$hvuser->fetch($object->fk_user_holiday_validator);
|
|
print $hvuser->getNomUrl(-1);
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Position/Job
|
|
print '<tr><td>'.$langs->trans("PostOrFunction").'</td>';
|
|
print '<td>'.dol_escape_htmltag($object->job).'</td>';
|
|
print '</tr>'."\n";
|
|
|
|
// Weeklyhours
|
|
print '<tr><td>'.$langs->trans("WeeklyHours").'</td>';
|
|
print '<td>';
|
|
print price2num($object->weeklyhours);
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Sensitive salary/value information
|
|
if ((empty($user->socid) && in_array($id, $childids)) // A user can always see salary/value information for its subordinates
|
|
|| (isModEnabled('salaries') && $user->hasRight("salaries", "readall"))
|
|
|| (isModEnabled('hrm') && $user->hasRight("hrm", "employee", "read"))) {
|
|
$langs->load("salaries");
|
|
|
|
// Salary
|
|
print '<tr><td>'.$langs->trans("Salary").'</td>';
|
|
print '<td>';
|
|
print($object->salary != '' ? img_picto('', 'salary', 'class="pictofixedwidth paddingright"').'<span class="amount">'.price($object->salary, '', $langs, 1, -1, -1, $conf->currency) : '').'</span>';
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// THM
|
|
print '<tr><td>';
|
|
$text = $langs->trans("THM");
|
|
print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm');
|
|
print '</td>';
|
|
print '<td>';
|
|
print($object->thm != '' ? price($object->thm, '', $langs, 1, -1, -1, $conf->currency) : '');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// TJM
|
|
print '<tr><td>';
|
|
$text = $langs->trans("TJM");
|
|
print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classtjm');
|
|
print '</td>';
|
|
print '<td>';
|
|
print($object->tjm != '' ? price($object->tjm, '', $langs, 1, -1, -1, $conf->currency) : '');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Date employment
|
|
print '<tr><td>'.$langs->trans("DateOfEmployment").'</td>';
|
|
print '<td>';
|
|
if ($object->dateemployment) {
|
|
print '<span class="opacitymedium">'.$langs->trans("FromDate").'</span> ';
|
|
print dol_print_date($object->dateemployment, 'day');
|
|
}
|
|
if ($object->dateemploymentend) {
|
|
print '<span class="opacitymedium"> - '.$langs->trans("To").'</span> ';
|
|
print dol_print_date($object->dateemploymentend, 'day');
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Date of birth
|
|
print '<tr><td>'.$langs->trans("DateOfBirth").'</td>';
|
|
print '<td>';
|
|
print dol_print_date($object->birth, 'day', 'tzserver');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Default warehouse
|
|
if (isModEnabled('stock') && getDolGlobalString('MAIN_DEFAULT_WAREHOUSE_USER')) {
|
|
require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php';
|
|
print '<tr><td>'.$langs->trans("DefaultWarehouse").'</td><td>';
|
|
if ($object->fk_warehouse > 0) {
|
|
$warehousestatic = new Entrepot($db);
|
|
$warehousestatic->fetch($object->fk_warehouse);
|
|
print $warehousestatic->getNomUrl(1);
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
print '</table>';
|
|
|
|
print '</div>';
|
|
print '<div class="fichehalfright">';
|
|
|
|
print '<div class="underbanner clearboth"></div>';
|
|
|
|
print '<table class="border tableforfield centpercent">';
|
|
|
|
// Color user
|
|
if (isModEnabled('agenda')) {
|
|
print '<tr><td class="titlefield">'.$langs->trans("ColorUser").'</td>';
|
|
print '<td>';
|
|
print $formother->showColor($object->color, '');
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Categories
|
|
if (isModEnabled('categorie') && $user->hasRight("categorie", "read")) {
|
|
print '<tr><td class="titlefield">'.$langs->trans("Categories").'</td>';
|
|
print '<td colspan="3">';
|
|
print $form->showCategories($object->id, Categorie::TYPE_USER, 1);
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Default language
|
|
if (getDolGlobalInt('MAIN_MULTILANGS')) {
|
|
$langs->load("languages");
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
|
print '<tr><td class="titlefield">';
|
|
print $form->textwithpicto($langs->trans("DefaultLang"), $langs->trans("WarningNotLangOfInterface", $langs->transnoentitiesnoconv("UserGUISetup")));
|
|
print '</td><td>';
|
|
//$s=picto_from_langcode($object->default_lang);
|
|
//print ($s?$s.' ':'');
|
|
$labellang = ($object->lang ? $langs->trans('Language_'.$object->lang) : '');
|
|
print picto_from_langcode($object->lang, 'class="paddingrightonly saturatemedium opacitylow"');
|
|
print $labellang;
|
|
print '</td></tr>';
|
|
}
|
|
|
|
if (isset($conf->file->main_authentication) && preg_match('/openid/', $conf->file->main_authentication) && getDolGlobalString('MAIN_OPENIDURL_PERUSER')) {
|
|
print '<tr><td>'.$langs->trans("OpenIDURL").'</td>';
|
|
print '<td>'.$object->openid.'</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Multicompany
|
|
if (isModEnabled('multicompany') && is_object($mc)) {
|
|
// This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module
|
|
if (!method_exists($mc, 'formObjectOptions')) {
|
|
if (isModEnabled('multicompany') && !getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE') && $conf->entity == 1 && $user->admin && !$user->entity) {
|
|
print '<tr><td>'.$langs->trans("Entity").'</td><td>';
|
|
if (empty($object->entity)) {
|
|
print $langs->trans("AllEntities");
|
|
} else {
|
|
$mc->getInfo($object->entity);
|
|
print $mc->label;
|
|
}
|
|
print "</td></tr>\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
// Other attributes
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
|
|
|
|
// Company / Contact
|
|
if (isModEnabled("societe")) {
|
|
print '<tr><td>'.$langs->trans("LinkToCompanyContact").'</td>';
|
|
print '<td>';
|
|
$s = '';
|
|
if (isset($object->socid) && $object->socid > 0) {
|
|
$societe = new Societe($db);
|
|
$societe->fetch($object->socid);
|
|
if ($societe->id > 0) {
|
|
$s .= $societe->getNomUrl(1, '');
|
|
}
|
|
} else {
|
|
$s .= '<span class="opacitymedium hideonsmartphone">'.$langs->trans("ThisUserIsNot").'</span>';
|
|
}
|
|
if (!empty($object->contact_id)) {
|
|
$contact = new Contact($db);
|
|
$contact->fetch($object->contact_id);
|
|
if ($contact->id > 0) {
|
|
if ($object->socid > 0 && $s) {
|
|
$s .= ' / ';
|
|
} else {
|
|
$s .= '<br>';
|
|
}
|
|
$s .= $contact->getNomUrl(1, '');
|
|
}
|
|
}
|
|
print $s;
|
|
print '</td>';
|
|
print '</tr>'."\n";
|
|
}
|
|
|
|
// Module Adherent
|
|
if (isModEnabled('adherent')) {
|
|
$langs->load("members");
|
|
print '<tr><td>'.$langs->trans("LinkedToDolibarrMember").'</td>';
|
|
print '<td>';
|
|
if ($object->fk_member) {
|
|
$adh = new Adherent($db);
|
|
$adh->fetch($object->fk_member);
|
|
$adh->ref = $adh->getFullname($langs); // Force to show login instead of id
|
|
print $adh->getNomUrl(-1);
|
|
} else {
|
|
print '<span class="opacitymedium hideonsmartphone">'.$langs->trans("UserNotLinkedToMember").'</span>';
|
|
}
|
|
print '</td>';
|
|
print '</tr>'."\n";
|
|
}
|
|
|
|
// Signature
|
|
print '<tr><td class="tdtop">'.$langs->trans('Signature').'</td><td class="wordbreak">';
|
|
print dol_htmlentitiesbr($object->signature);
|
|
print "</td></tr>\n";
|
|
|
|
print "</table>\n";
|
|
|
|
|
|
// Credentials section
|
|
|
|
print '<br>';
|
|
print '<div class="div-table-responsive-no-min">';
|
|
print '<table class="border tableforfield centpercent">';
|
|
|
|
print '<tr class="liste_titre"><td class="liste_titre">';
|
|
print img_picto('', 'security', 'class="paddingleft pictofixedwidth"').$langs->trans("Credentials");
|
|
print '</td>';
|
|
print '<td class="liste_titre"></td>';
|
|
print '</tr>';
|
|
|
|
// Date login validity
|
|
print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("RangeOfLoginValidity").'</td>';
|
|
print '<td>';
|
|
if ($object->datestartvalidity) {
|
|
print '<span class="opacitymedium">'.$langs->trans("FromDate").'</span> ';
|
|
print dol_print_date($object->datestartvalidity, 'day');
|
|
}
|
|
if ($object->dateendvalidity) {
|
|
print '<span class="opacitymedium"> - '.$langs->trans("To").'</span> ';
|
|
print dol_print_date($object->dateendvalidity, 'day');
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Alternative email for OAUth2 login
|
|
if (!empty($object->email_oauth2) && preg_match('/googleoauth/', $dolibarr_main_authentication)) {
|
|
print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("AlternativeEmailForOAuth2").'</td>';
|
|
print '<td>';
|
|
print dol_print_email($object->email_oauth2);
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Password
|
|
$valuetoshow = '';
|
|
if (preg_match('/ldap/', $dolibarr_main_authentication)) {
|
|
if (!empty($object->ldap_sid)) {
|
|
if ($passDoNotExpire) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').$langs->trans("LdapUacf_".$statutUACF);
|
|
} elseif ($userChangePassNextLogon) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').'<span class="warning">'.$langs->trans("UserMustChangePassNextLogon", $ldap->domainFQDN).'</span>';
|
|
} elseif ($userDisabled) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').'<span class="warning">'.$langs->trans("LdapUacf_".$statutUACF, $ldap->domainFQDN).'</span>';
|
|
} else {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').$langs->trans("PasswordOfUserInLDAP");
|
|
}
|
|
} else {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').$langs->trans("PasswordOfUserInLDAP");
|
|
}
|
|
}
|
|
if (preg_match('/http/', $dolibarr_main_authentication)) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').$langs->trans("HTTPBasicPassword");
|
|
}
|
|
/*
|
|
if (preg_match('/dolibarr/', $dolibarr_main_authentication)) {
|
|
if ($object->pass) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '');
|
|
$valuetoshow .= '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
|
|
} else {
|
|
if ($user->admin && $user->id == $object->id) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '');
|
|
$valuetoshow .= '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
|
|
$valuetoshow .= '<!-- Encrypted into '.$object->pass_indatabase_crypted.' -->';
|
|
} else {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '');
|
|
$valuetoshow .= '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
// Other form for user password
|
|
$parameters = array('valuetoshow' => $valuetoshow);
|
|
$reshook = $hookmanager->executeHooks('printUserPasswordField', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
if ($reshook > 0) {
|
|
$valuetoshow = $hookmanager->resPrint; // to replace
|
|
} else {
|
|
$valuetoshow .= $hookmanager->resPrint; // to add
|
|
}
|
|
|
|
if (dol_string_nohtmltag($valuetoshow)) { // If there is a real visible content to show
|
|
print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Password").'</td>';
|
|
print '<td class="wordbreak">';
|
|
print $valuetoshow;
|
|
print "</td>";
|
|
print '</tr>'."\n";
|
|
}
|
|
|
|
// API key
|
|
if (isModEnabled('api') && ($user->id == $id || $user->admin || $user->hasRight("api", "apikey", "generate"))) {
|
|
print '<tr class="nooddeven"><td>'.$langs->trans("ApiKey").'</td>';
|
|
print '<td>';
|
|
if (!empty($object->api_key)) {
|
|
print '<span class="opacitymedium">';
|
|
print showValueWithClipboardCPButton($object->api_key, 1, $langs->trans("Hidden")); // TODO Add an option to also reveal the hash, not only copy paste
|
|
print '</span>';
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
print '<tr class="nooddeven"><td>'.$langs->trans("LastConnexion").'</td>';
|
|
print '<td>';
|
|
if ($object->datepreviouslogin) {
|
|
print dol_print_date($object->datepreviouslogin, "dayhour", "tzuserrel").' <span class="opacitymedium">('.$langs->trans("Previous").')</span>, ';
|
|
}
|
|
if ($object->datelastlogin) {
|
|
print dol_print_date($object->datelastlogin, "dayhour", "tzuserrel").' <span class="opacitymedium">('.$langs->trans("Currently").')</span>';
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
print '</table>';
|
|
print '</div>';
|
|
|
|
print '</div>';
|
|
|
|
print '</div>';
|
|
print '<div class="clearboth"></div>';
|
|
|
|
|
|
print dol_get_fiche_end();
|
|
|
|
|
|
/*
|
|
* Buttons actions
|
|
*/
|
|
print '<div class="tabsAction">';
|
|
|
|
$parameters = array();
|
|
$reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
if (empty($reshook)) {
|
|
if (empty($user->socid)) {
|
|
$canSendMail = false;
|
|
$params = array(
|
|
'attr' => array(
|
|
'title' => '',
|
|
'class' => 'classfortooltip'
|
|
)
|
|
);
|
|
if (!empty($object->email)) {
|
|
$langs->load("mails");
|
|
$canSendMail = true;
|
|
} else {
|
|
$langs->load("mails");
|
|
$params['attr']['title'] = $langs->trans('NoEMail');
|
|
}
|
|
print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=presend&mode=init#formmailbeforetitle', '', $canSendMail, $params);
|
|
}
|
|
|
|
if ($caneditfield && (!isModEnabled('multicompany') || !$user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $object->entity == 1))) {
|
|
$params = array(
|
|
'attr' => array(
|
|
'title' => '',
|
|
'class' => 'classfortooltip'
|
|
)
|
|
);
|
|
if (getDolGlobalString('MAIN_ONLY_LOGIN_ALLOWED')) {
|
|
$params['attr']['title'] = $langs->trans('DisabledInMonoUserMode');
|
|
print dolGetButtonAction($langs->trans('Modify'), '', 'default', $_SERVER['PHP_SELF'].'#', '', false, $params);
|
|
} else {
|
|
print dolGetButtonAction($langs->trans('Modify'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit&token='.newToken(), '', true, $params);
|
|
}
|
|
} elseif ($caneditpasswordandsee && !$object->ldap_sid &&
|
|
(!isModEnabled('multicompany') || !$user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $object->entity == 1))) {
|
|
$params = array(
|
|
'attr' => array(
|
|
'title' => '',
|
|
'class' => 'classfortooltip'
|
|
)
|
|
);
|
|
print dolGetButtonAction($langs->trans('Modify'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit', '', true, $params);
|
|
}
|
|
|
|
// If we have a password generator engine enabled
|
|
$params = array(
|
|
'attr' => array(
|
|
'title' => '',
|
|
'class' => 'classfortooltip'
|
|
)
|
|
);
|
|
if (getDolGlobalString('USER_PASSWORD_GENERATED') != 'none') {
|
|
if ($object->status == $object::STATUS_DISABLED) {
|
|
$params['attr']['title'] = $langs->trans('UserDisabled');
|
|
print dolGetButtonAction($langs->trans('ReinitPassword'), '', 'default', $_SERVER['PHP_SELF'].'#', '', false, $params);
|
|
} elseif (($user->id != $id && $caneditpasswordandsee) && $object->login && !$object->ldap_sid &&
|
|
((!isModEnabled('multicompany') && $object->entity == $user->entity) || !$user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $object->entity == 1))) {
|
|
print dolGetButtonAction($langs->trans('ReinitPassword'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=password&token='.newToken(), '', true, $params);
|
|
}
|
|
|
|
if ($object->status == $object::STATUS_DISABLED) {
|
|
$params['attr']['title'] = $langs->trans('UserDisabled');
|
|
print dolGetButtonAction($langs->trans('SendNewPassword'), '', 'default', $_SERVER['PHP_SELF'].'#', '', false, $params);
|
|
} elseif (($user->id != $id && $caneditpasswordandsend) && $object->login && !$object->ldap_sid &&
|
|
((!isModEnabled('multicompany') && $object->entity == $user->entity) || !$user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $object->entity == 1))) {
|
|
if ($object->email) {
|
|
print dolGetButtonAction($langs->trans('SendNewPassword'), '', 'default', $_SERVER['PHP_SELF'].'?id='.$object->id.'&action=passwordsend&token='.newToken(), '', true, $params);
|
|
} else {
|
|
$params['attr']['title'] = $langs->trans('NoEMail');
|
|
print dolGetButtonAction($langs->trans('SendNewPassword'), '', 'default', $_SERVER['PHP_SELF'].'#', '', false, $params);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Enable user
|
|
$params = array(
|
|
'attr' => array(
|
|
'title' => '',
|
|
'class' => 'classfortooltip'
|
|
)
|
|
);
|
|
if ($user->id != $id && $candisableuser && $object->statut == 0 &&
|
|
((!isModEnabled('multicompany') && $object->entity == $user->entity) || !$user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $object->entity == 1))) {
|
|
print dolGetButtonAction($langs->trans('Reactivate'), '', 'default', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=enable&token='.newToken(), '', true, $params);
|
|
}
|
|
// Disable user
|
|
if ($user->id != $id && $candisableuser && $object->statut == 1 &&
|
|
((!isModEnabled('multicompany') && $object->entity == $user->entity) || !$user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $object->entity == 1))) {
|
|
print dolGetButtonAction($langs->trans('DisableUser'), '', 'default', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=disable&token='.newToken(), '', true, $params);
|
|
} else {
|
|
if ($user->id == $id) {
|
|
$params['attr']['title'] = $langs->trans('CantDisableYourself');
|
|
print dolGetButtonAction($langs->trans('DisableUser'), '', 'default', $_SERVER['PHP_SELF'].'#', '', false, $params);
|
|
}
|
|
}
|
|
// Delete
|
|
if ($user->id != $id && $candisableuser &&
|
|
((!isModEnabled('multicompany') && $object->entity == $user->entity) || !$user->entity || ($object->entity == $conf->entity) || ($conf->global->MULTICOMPANY_TRANSVERSE_MODE && $object->entity == 1))) {
|
|
if ($user->admin || !$object->admin) { // If user edited is admin, delete is possible on for an admin
|
|
print dolGetButtonAction($langs->trans('DeleteUser'), '', 'default', $_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&id='.$object->id, '', true, $params);
|
|
} else {
|
|
$params['attr']['title'] = $langs->trans('MustBeAdminToDeleteOtherAdmin');
|
|
print dolGetButtonAction($langs->trans('DeleteUser'), '', 'default', $_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&id='.$object->id, '', false, $params);
|
|
}
|
|
}
|
|
}
|
|
|
|
print "</div>\n";
|
|
|
|
|
|
|
|
// Select mail models is same action as presend
|
|
if (GETPOST('modelselected')) {
|
|
$action = 'presend';
|
|
}
|
|
|
|
// Presend form
|
|
$modelmail = 'user';
|
|
$defaulttopic = 'Information';
|
|
$diroutput = $conf->user->dir_output;
|
|
$trackid = 'use'.$object->id;
|
|
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
|
|
|
|
if ($action != 'presend' && $action != 'send') {
|
|
/*
|
|
* List of groups of user
|
|
*/
|
|
|
|
if ($canreadgroup) {
|
|
print '<!-- Group section -->'."\n";
|
|
|
|
print load_fiche_titre($langs->trans("ListOfGroupsForUser"), '', '');
|
|
|
|
// On selectionne les groupes auquel fait parti le user
|
|
$exclude = array();
|
|
|
|
$usergroup = new UserGroup($db);
|
|
$groupslist = $usergroup->listGroupsForUser($object->id, false);
|
|
|
|
if (!empty($groupslist)) {
|
|
foreach ($groupslist as $groupforuser) {
|
|
$exclude[] = $groupforuser->id;
|
|
}
|
|
}
|
|
|
|
// Other form for add user to group
|
|
$parameters = array('caneditgroup' => $caneditgroup, 'groupslist' => $groupslist, 'exclude' => $exclude);
|
|
$reshook = $hookmanager->executeHooks('formAddUserToGroup', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
|
|
if (empty($reshook)) {
|
|
if ($caneditgroup) {
|
|
print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$id.'" method="POST">'."\n";
|
|
print '<input type="hidden" name="token" value="'.newToken().'" />';
|
|
print '<input type="hidden" name="action" value="addgroup" />';
|
|
print '<input type="hidden" name="page_y" value="" />';
|
|
}
|
|
|
|
print '<!-- List of groups of the user -->'."\n";
|
|
print '<table class="noborder centpercent">'."\n";
|
|
print '<tr class="liste_titre"><th class="liste_titre">'.$langs->trans("Groups").'</th>'."\n";
|
|
print '<th class="liste_titre right">';
|
|
if ($caneditgroup) {
|
|
print $form->select_dolgroups('', 'group', 1, $exclude, 0, '', '', $object->entity, false, 'maxwidth150');
|
|
print ' ';
|
|
print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
|
|
print '<input type="submit" class="button buttongen button-add reposition" value="'.$langs->trans("Add").'" />';
|
|
}
|
|
print '</th></tr>'."\n";
|
|
|
|
// List of groups of user
|
|
if (!empty($groupslist)) {
|
|
foreach ($groupslist as $group) {
|
|
print '<tr class="oddeven">';
|
|
print '<td class="tdoverflowmax150">';
|
|
if ($caneditgroup) {
|
|
print $group->getNomUrl(1);
|
|
} else {
|
|
print img_object($langs->trans("ShowGroup"), "group").' '.$group->name;
|
|
}
|
|
print '</td>';
|
|
print '<td class="right">';
|
|
if ($caneditgroup) {
|
|
print '<a class="reposition" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=removegroup&token='.newToken().'&group='.((int) $group->id).'">';
|
|
print img_picto($langs->trans("RemoveFromGroup"), 'unlink');
|
|
print '</a>';
|
|
} else {
|
|
print " ";
|
|
}
|
|
print "</td></tr>\n";
|
|
}
|
|
} else {
|
|
print '<tr class="oddeven"><td colspan="3"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
|
|
}
|
|
|
|
print "</table>";
|
|
|
|
if ($caneditgroup) {
|
|
print '</form>';
|
|
}
|
|
print "<br>";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Edit mode
|
|
*/
|
|
if ($action == 'edit' && ($canedituser || $caneditpasswordandsee)) {
|
|
print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="POST" name="updateuser" enctype="multipart/form-data">';
|
|
print '<input type="hidden" name="token" value="'.newToken().'">';
|
|
print '<input type="hidden" name="action" value="update">';
|
|
print '<input type="hidden" name="entity" value="'.$object->entity.'">';
|
|
|
|
print dol_get_fiche_head($head, 'user', $title, 0, 'user');
|
|
|
|
print '<table class="border centpercent">';
|
|
|
|
// Ref/ID
|
|
if (getDolGlobalString('MAIN_SHOW_TECHNICAL_ID')) {
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("Ref").'</td>';
|
|
print '<td>';
|
|
print $object->id;
|
|
print '</td>';
|
|
print '</tr>';
|
|
}
|
|
|
|
// Civility
|
|
print '<tr><td class="titlefieldcreate"><label for="civility_code">'.$langs->trans("UserTitle").'</label></td><td>';
|
|
if ($caneditfield && !$object->ldap_sid) {
|
|
print $formcompany->select_civility(GETPOSTISSET("civility_code") ? GETPOST("civility_code", 'aZ09') : $object->civility_code, 'civility_code');
|
|
} elseif ($object->civility_code) {
|
|
print $langs->trans("Civility".$object->civility_code);
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Lastname
|
|
print "<tr>";
|
|
print '<td class="titlefieldcreate fieldrequired">'.$langs->trans("Lastname").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield && !$object->ldap_sid) {
|
|
print '<input class="minwidth100" type="text" class="flat" name="lastname" value="'.$object->lastname.'">';
|
|
} else {
|
|
print '<input type="hidden" name="lastname" value="'.$object->lastname.'">';
|
|
print $object->lastname;
|
|
}
|
|
print '</td>';
|
|
print '</tr>';
|
|
|
|
// Firstname
|
|
print '<tr><td>'.$langs->trans("Firstname").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield && !$object->ldap_sid) {
|
|
print '<input class="minwidth100" type="text" class="flat" name="firstname" value="'.$object->firstname.'">';
|
|
} else {
|
|
print '<input type="hidden" name="firstname" value="'.$object->firstname.'">';
|
|
print $object->firstname;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Login
|
|
print "<tr>".'<td><span class="fieldrequired">'.$langs->trans("Login").'</span></td>';
|
|
print '<td>';
|
|
if ($user->admin && !$object->ldap_sid) {
|
|
print '<input maxlength="50" type="text" class="flat" name="login" value="'.$object->login.'">';
|
|
} else {
|
|
print '<input type="hidden" name="login" value="'.$object->login.'">';
|
|
print $object->login;
|
|
}
|
|
print '</td>';
|
|
print '</tr>';
|
|
|
|
// Administrator
|
|
print '<tr><td>'.$form->textwithpicto($langs->trans("Administrator"), $langs->trans("AdministratorDesc")).'</td>';
|
|
if ($object->socid > 0) {
|
|
$langs->load("admin");
|
|
print '<td>';
|
|
print '<input type="hidden" name="admin" value="'.$object->admin.'">'.yn($object->admin);
|
|
print ' <span class="opacitymedium">('.$langs->trans("ExternalUser").')</span>';
|
|
print '</td></tr>';
|
|
} else {
|
|
print '<td>';
|
|
$nbAdmin = $user->getNbOfUsers('active', '', 1);
|
|
$nbSuperAdmin = $user->getNbOfUsers('active', 'superadmin', 1);
|
|
//var_dump($nbAdmin);
|
|
//var_dump($nbSuperAdmin);
|
|
if ($user->admin // Need to be admin to allow downgrade of an admin
|
|
&& ($user->id != $object->id) // Don't downgrade ourself
|
|
&& (
|
|
(!isModEnabled('multicompany') && $nbAdmin >= 1)
|
|
|| (isModEnabled('multicompany') && (($object->entity > 0 || ($user->entity == 0 && $object->entity == 0)) || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone
|
|
)
|
|
) {
|
|
print $form->selectyesno('admin', $object->admin, 1, false, 0, 1);
|
|
|
|
if (isModEnabled('multicompany') && !$user->entity) {
|
|
if ($conf->use_javascript_ajax) {
|
|
print '<script type="text/javascript">
|
|
$(function() {
|
|
var admin = $("select[name=admin]").val();
|
|
if (admin == 0) {
|
|
$("input[name=superadmin]")
|
|
.prop("disabled", true)
|
|
.prop("checked", false);
|
|
}
|
|
if ($("input[name=superadmin]").is(":checked")) {
|
|
$("select[name=entity]")
|
|
.prop("disabled", true);
|
|
}
|
|
$("select[name=admin]").change(function() {
|
|
if ( $(this).val() == 0 ) {
|
|
$("input[name=superadmin]")
|
|
.prop("disabled", true)
|
|
.prop("checked", false);
|
|
$("select[name=entity]")
|
|
.prop("disabled", false);
|
|
} else {
|
|
$("input[name=superadmin]")
|
|
.prop("disabled", false);
|
|
}
|
|
});
|
|
$("input[name=superadmin]").change(function() {
|
|
if ( $(this).is(":checked")) {
|
|
$("select[name=entity]")
|
|
.prop("disabled", true);
|
|
} else {
|
|
$("select[name=entity]")
|
|
.prop("disabled", false);
|
|
}
|
|
});
|
|
});
|
|
</script>';
|
|
}
|
|
|
|
$checked = (($object->admin && !$object->entity) ? ' checked' : '');
|
|
print '<input type="checkbox" name="superadmin" id="superadmin" value="1"'.$checked.' /> <label for="superadmin">'.$langs->trans("SuperAdministrator").'</span>';
|
|
}
|
|
} else {
|
|
$yn = yn($object->admin);
|
|
print '<input type="hidden" name="admin" value="'.$object->admin.'">';
|
|
print '<input type="hidden" name="superadmin" value="'.(empty($object->entity) ? 1 : 0).'">';
|
|
if (isModEnabled('multicompany') && empty($object->entity)) {
|
|
print $form->textwithpicto($yn, $langs->trans("DontDowngradeSuperAdmin"), 1, 'warning');
|
|
} else {
|
|
print $yn;
|
|
}
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Gender
|
|
print '<tr><td>'.$langs->trans("Gender").'</td>';
|
|
print '<td>';
|
|
$arraygender = array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman"), 'other'=>$langs->trans("Genderother"));
|
|
if ($caneditfield) {
|
|
print $form->selectarray('gender', $arraygender, GETPOSTISSET('gender') ? GETPOST('gender') : $object->gender, 1);
|
|
} else {
|
|
print $arraygender[$object->gender];
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Employee
|
|
print '<tr>';
|
|
print '<td>'.$form->editfieldkey('Employee', 'employee', '', $object, 0).'</td><td>';
|
|
if ($caneditfield) {
|
|
print '<input type="checkbox" name="employee" value="1"'.($object->employee ? ' checked="checked"' : '').'>';
|
|
//print $form->selectyesno("employee", $object->employee, 1);
|
|
} else {
|
|
print '<input type="checkbox" name="employee" disabled value="1"'.($object->employee ? ' checked="checked"' : '').'>';
|
|
/*if ($object->employee) {
|
|
print $langs->trans("Yes");
|
|
} else {
|
|
print $langs->trans("No");
|
|
}*/
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Hierarchy
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("HierarchicalResponsible").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
|
|
} else {
|
|
print '<input type="hidden" name="fk_user" value="'.$object->fk_user.'">';
|
|
$huser = new User($db);
|
|
$huser->fetch($object->fk_user);
|
|
print $huser->getNomUrl(-1);
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Expense report validator
|
|
if (isModEnabled('expensereport')) {
|
|
print '<tr><td class="titlefieldcreate">';
|
|
$text = $langs->trans("ForceUserExpenseValidator");
|
|
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
|
|
print '</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers($object->fk_user_expense_validator, 'fk_user_expense_validator', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
|
|
} else {
|
|
print '<input type="hidden" name="fk_user_expense_validator" value="'.$object->fk_user_expense_validator.'">';
|
|
$evuser = new User($db);
|
|
$evuser->fetch($object->fk_user_expense_validator);
|
|
print $evuser->getNomUrl(-1);
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Holiday request validator
|
|
if (isModEnabled('holiday')) {
|
|
print '<tr><td class="titlefieldcreate">';
|
|
$text = $langs->trans("ForceUserHolidayValidator");
|
|
print $form->textwithpicto($text, $langs->trans("ValidatorIsSupervisorByDefault"), 1, 'help');
|
|
print '</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers($object->fk_user_holiday_validator, 'fk_user_holiday_validator', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'widthcentpercentminusx maxwidth300');
|
|
} else {
|
|
print '<input type="hidden" name="fk_user_holiday_validator" value="'.$object->fk_user_holiday_validator.'">';
|
|
$hvuser = new User($db);
|
|
$hvuser->fetch($object->fk_user_holiday_validator);
|
|
print $hvuser->getNomUrl(-1);
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// External user ?
|
|
print '<tr><td>'.$langs->trans("ExternalUser").' ?</td>';
|
|
print '<td>';
|
|
if ($user->id == $object->id || !$user->admin) {
|
|
// Read mode
|
|
$type = $langs->trans("Internal");
|
|
if ($object->socid) {
|
|
$type = $langs->trans("External");
|
|
}
|
|
print $form->textwithpicto($type, $langs->trans("InternalExternalDesc"));
|
|
if ($object->ldap_sid) {
|
|
print ' ('.$langs->trans("DomainUser").')';
|
|
}
|
|
} else {
|
|
// Select mode
|
|
$type = 0;
|
|
if ($object->contact_id) {
|
|
$type = $object->contact_id;
|
|
}
|
|
|
|
if ($object->socid > 0 && !($object->contact_id > 0)) { // external user but no link to a contact
|
|
print img_picto('', 'company').$form->select_company($object->socid, 'socid', '', ' ', 0, 0, null, 0, 'maxwidth300');
|
|
print img_picto('', 'contact').$form->selectcontacts(0, 0, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
|
|
if ($object->ldap_sid) {
|
|
print ' ('.$langs->trans("DomainUser").')';
|
|
}
|
|
} elseif ($object->socid > 0 && $object->contact_id > 0) { // external user with a link to a contact
|
|
print img_picto('', 'company').$form->select_company($object->socid, 'socid', '', ' ', 0, 0, null, 0, 'maxwidth300'); // We keep thirdparty empty, contact is already set
|
|
print img_picto('', 'contact').$form->selectcontacts(0, $object->contact_id, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
|
|
if ($object->ldap_sid) {
|
|
print ' ('.$langs->trans("DomainUser").')';
|
|
}
|
|
} elseif (!($object->socid > 0) && $object->contact_id > 0) { // internal user with a link to a contact
|
|
print img_picto('', 'company').$form->select_company(0, 'socid', '', ' ', 0, 0, null, 0, 'maxwidth300'); // We keep thirdparty empty, contact is already set
|
|
print img_picto('', 'contact').$form->selectcontacts(0, $object->contact_id, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
|
|
if ($object->ldap_sid) {
|
|
print ' ('.$langs->trans("DomainUser").')';
|
|
}
|
|
} else { // $object->socid is not > 0 here
|
|
print img_picto('', 'company').$form->select_company(0, 'socid', '', ' ', 0, 0, null, 0, 'maxwidth300'); // We keep thirdparty empty, contact is already set
|
|
print img_picto('', 'contact').$form->selectcontacts(0, 0, 'contactid', 1, '', '', 1, 'maxwidth300', false, 1);
|
|
}
|
|
}
|
|
print '</td></tr>';
|
|
|
|
|
|
print '</table>';
|
|
|
|
print '<hr>';
|
|
|
|
print '<table class="border centpercent">';
|
|
|
|
// Date access validity
|
|
print '<tr><td>'.$langs->trans("RangeOfLoginValidity").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print $form->selectDate($datestartvalidity ? $datestartvalidity : $object->datestartvalidity, 'datestartvalidity', 0, 0, 1, 'formdatestartvalidity', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("from"));
|
|
} else {
|
|
print dol_print_date($object->datestartvalidity, 'day');
|
|
}
|
|
print ' ';
|
|
|
|
if ($caneditfield) {
|
|
print $form->selectDate($dateendvalidity ? $dateendvalidity : $object->dateendvalidity, 'dateendvalidity', 0, 0, 1, 'formdateendvalidity', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
|
|
} else {
|
|
print dol_print_date($object->dateendvalidity, 'day');
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Pass
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("Password").'</td>';
|
|
print '<td>';
|
|
$valuetoshow = '';
|
|
if (preg_match('/ldap/', $dolibarr_main_authentication)) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').$langs->trans("PasswordOfUserInLDAP");
|
|
}
|
|
if (preg_match('/http/', $dolibarr_main_authentication)) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').$form->textwithpicto($text, $langs->trans("DolibarrInHttpAuthenticationSoPasswordUseless", $dolibarr_main_authentication), 1, 'warning');
|
|
}
|
|
if (preg_match('/dolibarr/', $dolibarr_main_authentication) || preg_match('/forceuser/', $dolibarr_main_authentication)) {
|
|
if ($caneditpasswordandsee) {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').'<input maxlength="128" type="password" class="flat" id="password" name="password" value="'.dol_escape_htmltag($object->pass).'" autocomplete="new-password">';
|
|
if (!empty($conf->use_javascript_ajax)) {
|
|
$valuetoshow .= img_picto((getDolGlobalString('USER_PASSWORD_GENERATED') === 'none' ? $langs->trans('NoPasswordGenerationRuleConfigured') : $langs->trans('Generate')), 'refresh', 'id="generate_password" class="paddingleft'.(getDolGlobalString('USER_PASSWORD_GENERATED') === 'none' ? ' opacitymedium' : ' linkobject').'"');
|
|
}
|
|
} else {
|
|
$valuetoshow .= ($valuetoshow ? (' '.$langs->trans("or").' ') : '').preg_replace('/./i', '*', $object->pass);
|
|
}
|
|
}
|
|
// Other form for user password
|
|
$parameters = array('valuetoshow' => $valuetoshow, 'caneditpasswordandsee' => $caneditpasswordandsee, 'caneditpasswordandsend' => $caneditpasswordandsend);
|
|
$reshook = $hookmanager->executeHooks('printUserPasswordField', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
if ($reshook > 0) {
|
|
$valuetoshow = $hookmanager->resPrint; // to replace
|
|
} else {
|
|
$valuetoshow .= $hookmanager->resPrint; // to add
|
|
}
|
|
|
|
print $valuetoshow;
|
|
print "</td></tr>\n";
|
|
|
|
// API key
|
|
if (isModEnabled('api')) {
|
|
print '<tr><td>'.$langs->trans("ApiKey").'</td>';
|
|
print '<td>';
|
|
if ($caneditpasswordandsee || $user->hasRight("api", "apikey", "generate")) {
|
|
print '<input class="minwidth300 maxwidth400 widthcentpercentminusx" minlength="12" maxlength="128" type="text" id="api_key" name="api_key" value="'.$object->api_key.'" autocomplete="off">';
|
|
if (!empty($conf->use_javascript_ajax)) {
|
|
print img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject paddingleft"');
|
|
}
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// OpenID url
|
|
if (isset($conf->file->main_authentication) && preg_match('/openid/', $conf->file->main_authentication) && getDolGlobalString('MAIN_OPENIDURL_PERUSER')) {
|
|
print "<tr>".'<td>'.$langs->trans("OpenIDURL").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print '<input class="minwidth100" type="url" name="openid" class="flat" value="'.$object->openid.'">';
|
|
} else {
|
|
print '<input type="hidden" name="openid" value="'.$object->openid.'">';
|
|
print $object->openid;
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
print '</table><hr><table class="border centpercent">';
|
|
|
|
|
|
// Address
|
|
print '<tr><td class="tdtop titlefieldcreate">'.$form->editfieldkey('Address', 'address', '', $object, 0).'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print '<textarea name="address" id="address" class="quatrevingtpercent" rows="3" wrap="soft">';
|
|
}
|
|
print $object->address;
|
|
if ($caneditfield) {
|
|
print '</textarea>';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Zip
|
|
print '<tr><td>'.$form->editfieldkey('Zip', 'zipcode', '', $object, 0).'</td><td>';
|
|
if ($caneditfield) {
|
|
print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6);
|
|
} else {
|
|
print $object->zip;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Town
|
|
print '<tr><td>'.$form->editfieldkey('Town', 'town', '', $object, 0).'</td><td>';
|
|
if ($caneditfield) {
|
|
print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id'));
|
|
} else {
|
|
print $object->town;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Country
|
|
print '<tr><td>'.$form->editfieldkey('Country', 'selectcounty_id', '', $object, 0).'</td><td>';
|
|
print img_picto('', 'country', 'class="pictofixedwidth"');
|
|
if ($caneditfield) {
|
|
print $form->select_country((GETPOST('country_id') != '' ? GETPOST('country_id') : $object->country_id), 'country_id');
|
|
if ($user->admin) {
|
|
print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
|
|
}
|
|
} else {
|
|
$countrylabel = getCountry($object->country_id, '0');
|
|
print $countrylabel;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// State
|
|
if (!getDolGlobalString('USER_DISABLE_STATE')) {
|
|
print '<tr><td class="tdoverflow">'.$form->editfieldkey('State', 'state_id', '', $object, 0).'</td><td>';
|
|
if ($caneditfield) {
|
|
print img_picto('', 'state', 'class="pictofixedwidth"');
|
|
print $formcompany->select_state($object->state_id, $object->country_code, 'state_id');
|
|
} else {
|
|
print $object->state;
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Tel pro
|
|
print "<tr>".'<td>'.$langs->trans("PhonePro").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'phoning', 'class="pictofixedwidth"');
|
|
if ($caneditfield && empty($object->ldap_sid)) {
|
|
print '<input type="text" name="office_phone" class="flat maxwidth200" value="'.$object->office_phone.'">';
|
|
} else {
|
|
print '<input type="hidden" name="office_phone" value="'.$object->office_phone.'">';
|
|
print $object->office_phone;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Tel mobile
|
|
print "<tr>".'<td>'.$langs->trans("PhoneMobile").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'phoning_mobile', 'class="pictofixedwidth"');
|
|
if ($caneditfield && empty($object->ldap_sid)) {
|
|
print '<input type="text" name="user_mobile" class="flat maxwidth200" value="'.$object->user_mobile.'">';
|
|
} else {
|
|
print '<input type="hidden" name="user_mobile" value="'.$object->user_mobile.'">';
|
|
print $object->user_mobile;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Fax
|
|
print "<tr>".'<td>'.$langs->trans("Fax").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'phoning_fax', 'class="pictofixedwidth"');
|
|
if ($caneditfield && empty($object->ldap_sid)) {
|
|
print '<input type="text" name="office_fax" class="flat maxwidth200" value="'.$object->office_fax.'">';
|
|
} else {
|
|
print '<input type="hidden" name="office_fax" value="'.$object->office_fax.'">';
|
|
print $object->office_fax;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// EMail
|
|
print "<tr>".'<td'.(getDolGlobalString('USER_MAIL_REQUIRED') ? ' class="fieldrequired"' : '').'>'.$langs->trans("EMail").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'object_email', 'class="pictofixedwidth"');
|
|
if ($caneditfield && empty($object->ldap_sid)) {
|
|
print '<input class="minwidth100 maxwidth500 widthcentpercentminusx" type="text" name="email" class="flat" value="'.$object->email.'">';
|
|
} else {
|
|
print '<input type="hidden" name="email" value="'.$object->email.'">';
|
|
print $object->email;
|
|
}
|
|
print '</td></tr>';
|
|
|
|
if (isModEnabled('socialnetworks')) {
|
|
foreach ($socialnetworks as $key => $value) {
|
|
if ($value['active']) {
|
|
print '<tr><td>'.$langs->trans($value['label']).'</td>';
|
|
print '<td>';
|
|
if (!empty($value['icon'])) {
|
|
print '<span class="fa '.$value['icon'].' pictofixedwidth"></span>';
|
|
}
|
|
if ($caneditfield && empty($object->ldap_sid)) {
|
|
print '<input type="text" name="'.$key.'" class="flat maxwidth200" value="'.(isset($object->socialnetworks[$key]) ? $object->socialnetworks[$key] : '').'">';
|
|
} else {
|
|
print '<input type="hidden" name="'.$key.'" value="'.$object->socialnetworks[$key].'">';
|
|
print $object->socialnetworks[$key];
|
|
}
|
|
print '</td></tr>';
|
|
} else {
|
|
// if social network is not active but value exist we do not want to loose it
|
|
print '<input type="hidden" name="'.$key.'" value="'.(isset($object->socialnetworks[$key]) ? $object->socialnetworks[$key] : '').'">';
|
|
}
|
|
}
|
|
}
|
|
|
|
print '</table><hr><table class="border centpercent">';
|
|
|
|
// Default warehouse
|
|
if (isModEnabled('stock') && getDolGlobalString('MAIN_DEFAULT_WAREHOUSE_USER')) {
|
|
print '<tr><td class="titlefield">'.$langs->trans("DefaultWarehouse").'</td><td>';
|
|
print $formproduct->selectWarehouses($object->fk_warehouse, 'fk_warehouse', 'warehouseopen', 1);
|
|
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>';
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Accountancy code
|
|
if (isModEnabled('accounting')) {
|
|
print "<tr>";
|
|
print '<td class="titlefieldcreate">'.$langs->trans("AccountancyCode").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print '<input type="text" class="flat maxwidth300" name="accountancy_code" value="'.$object->accountancy_code.'">';
|
|
} else {
|
|
print '<input type="hidden" name="accountancy_code" value="'.$object->accountancy_code.'">';
|
|
print $object->accountancy_code;
|
|
}
|
|
print '</td>';
|
|
print "</tr>";
|
|
}
|
|
|
|
// User color
|
|
if (isModEnabled('agenda')) {
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("ColorUser").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print $formother->selectColor(GETPOSTISSET('color') ? GETPOST('color', 'alphanohtml') : $object->color, 'color', null, 1, '', 'hideifnotset');
|
|
} else {
|
|
print $formother->showColor($object->color, '');
|
|
}
|
|
print '</td></tr>';
|
|
}
|
|
|
|
// Photo
|
|
print '<tr>';
|
|
print '<td class="titlefieldcreate">'.$langs->trans("Photo").'</td>';
|
|
print '<td>';
|
|
print $form->showphoto('userphoto', $object, 60, 0, $caneditfield, 'photowithmargin', 'small', 1, 0, 'user', 1);
|
|
print '</td>';
|
|
print '</tr>';
|
|
|
|
// Categories
|
|
if (isModEnabled('categorie') && $user->hasRight("categorie", "read")) {
|
|
print '<tr><td>'.$form->editfieldkey('Categories', 'usercats', '', $object, 0).'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'category', 'class="pictofixedwidth"');
|
|
$cate_arbo = $form->select_all_categories(Categorie::TYPE_USER, null, null, null, null, 1);
|
|
$c = new Categorie($db);
|
|
$cats = $c->containing($object->id, Categorie::TYPE_USER);
|
|
$arrayselected = array();
|
|
foreach ($cats as $cat) {
|
|
$arrayselected[] = $cat->id;
|
|
}
|
|
if ($caneditfield) {
|
|
print $form->multiselectarray('usercats', $cate_arbo, $arrayselected, '', 0, '', 0, '90%');
|
|
} else {
|
|
print $form->showCategories($object->id, Categorie::TYPE_USER, 1);
|
|
}
|
|
print "</td></tr>";
|
|
}
|
|
|
|
// Default language
|
|
if (getDolGlobalInt('MAIN_MULTILANGS')) {
|
|
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";
|
|
print img_picto('', 'language', 'class="pictofixedwidth"').$formadmin->select_language($object->lang, 'default_lang', 0, null, '1', 0, 0, 'widthcentpercentminusx maxwidth300');
|
|
print '</td>';
|
|
print '</tr>';
|
|
}
|
|
|
|
// Status
|
|
print '<tr><td>'.$langs->trans("Status").'</td>';
|
|
print '<td>';
|
|
print $object->getLibStatut(4);
|
|
print '</td></tr>';
|
|
|
|
// Company / Contact
|
|
if (isModEnabled("societe")) {
|
|
print '<tr><td>'.$langs->trans("LinkToCompanyContact").'</td>';
|
|
print '<td>';
|
|
if ($object->socid > 0) {
|
|
$societe = new Societe($db);
|
|
$societe->fetch($object->socid);
|
|
print $societe->getNomUrl(1, '');
|
|
if ($object->contact_id) {
|
|
$contact = new Contact($db);
|
|
$contact->fetch($object->contact_id);
|
|
print ' / <a href="'.DOL_URL_ROOT.'/contact/card.php?id='.$object->contact_id.'">'.img_object($langs->trans("ShowContact"), 'contact').' '.dol_trunc($contact->getFullName($langs), 32).'</a>';
|
|
}
|
|
} else {
|
|
print '<span class="opacitymedium hideonsmartphone">'.$langs->trans("ThisUserIsNot").'</span>';
|
|
}
|
|
print ' <span class="opacitymedium hideonsmartphone">('.$langs->trans("UseTypeFieldToChange").')</span>';
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Module Adherent
|
|
if (isModEnabled('adherent')) {
|
|
$langs->load("members");
|
|
print '<tr><td>'.$langs->trans("LinkedToDolibarrMember").'</td>';
|
|
print '<td>';
|
|
if ($object->fk_member) {
|
|
$adh = new Adherent($db);
|
|
$adh->fetch($object->fk_member);
|
|
$adh->ref = $adh->login; // Force to show login instead of id
|
|
print $adh->getNomUrl(1);
|
|
} else {
|
|
print '<span class="opacitymedium hideonsmartphone">'.$langs->trans("UserNotLinkedToMember").'</span>';
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Multicompany
|
|
// TODO check if user not linked with the current entity before change entity (thirdparty, invoice, etc.) !!
|
|
if (isModEnabled('multicompany') && is_object($mc)) {
|
|
// This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module
|
|
if (!method_exists($mc, 'formObjectOptions')) {
|
|
if (empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && !$user->entity) {
|
|
print "<tr>".'<td>'.$langs->trans("Entity").'</td>';
|
|
print "<td>".$mc->select_entities($object->entity, 'entity', '', 0, 1, false, false, 1); // last parameter 1 means, show also a choice 0=>'all entities'
|
|
print "</td></tr>\n";
|
|
} else {
|
|
print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
|
|
}
|
|
}
|
|
}
|
|
|
|
// Other attributes
|
|
$parameters = array('colspan' => ' colspan="2"');
|
|
//include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php'; // We do not use common tpl here because we need a special test on $caneditfield
|
|
$reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
|
|
print $hookmanager->resPrint;
|
|
if (empty($reshook)) {
|
|
if ($caneditfield) {
|
|
print $object->showOptionals($extrafields, 'edit');
|
|
} else {
|
|
print $object->showOptionals($extrafields, 'view');
|
|
}
|
|
}
|
|
|
|
// Signature
|
|
print '<tr><td class="tdtop">'.$langs->trans("Signature").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
|
|
|
$doleditor = new DolEditor('signature', $object->signature, '', 138, 'dolibarr_notes', 'In', false, $acceptlocallinktomedia, !getDolGlobalString('FCKEDITOR_ENABLE_USERSIGN') ? 0 : 1, ROWS_4, '90%');
|
|
print $doleditor->Create(1);
|
|
} else {
|
|
print dol_htmlentitiesbr($object->signature);
|
|
}
|
|
print '</td></tr>';
|
|
|
|
|
|
print '</table>';
|
|
|
|
print '<hr>';
|
|
|
|
|
|
print '<table class="border centpercent">';
|
|
|
|
|
|
// TODO Move this into tab RH (HierarchicalResponsible must be on both tab)
|
|
|
|
// Position/Job
|
|
print '<tr><td class="titlefieldcreate">'.$langs->trans("PostOrFunction").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print '<input type="text" class="minwidth300 maxwidth500" name="job" value="'.dol_escape_htmltag($object->job).'">';
|
|
} else {
|
|
print '<input type="hidden" name="job" value="'.dol_escape_htmltag($object->job).'">';
|
|
print dol_escape_htmltag($object->job);
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Weeklyhours
|
|
print '<tr><td>'.$langs->trans("WeeklyHours").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print '<input size="8" type="text" name="weeklyhours" value="'.price2num(GETPOST('weeklyhours') ? GETPOST('weeklyhours') : $object->weeklyhours).'">';
|
|
} else {
|
|
print price2num($object->weeklyhours);
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Sensitive salary/value information
|
|
if ((empty($user->socid) && in_array($id, $childids)) // A user can always see salary/value information for its subordinates
|
|
|| (isModEnabled('salaries') && $user->hasRight("salaries", "readall"))
|
|
|| (isModEnabled('hrm') && $user->hasRight("hrm", "employee", "read"))) {
|
|
$langs->load("salaries");
|
|
|
|
// Salary
|
|
print '<tr><td>'.$langs->trans("Salary").'</td>';
|
|
print '<td>';
|
|
print img_picto('', 'salary', 'class="pictofixedwidth paddingright"').'<input size="8" type="text" name="salary" value="'.price2num(GETPOST('salary') ? GETPOST('salary') : $object->salary).'">';
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// THM
|
|
print '<tr><td>';
|
|
$text = $langs->trans("THM");
|
|
print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm');
|
|
print '</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print '<input size="8" type="text" name="thm" value="'.price2num(GETPOST('thm') ? GETPOST('thm') : $object->thm).'">';
|
|
} else {
|
|
print($object->thm != '' ? price($object->thm, '', $langs, 1, -1, -1, $conf->currency) : '');
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// TJM
|
|
print '<tr><td>';
|
|
$text = $langs->trans("TJM");
|
|
print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classthm');
|
|
print '</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print '<input size="8" type="text" name="tjm" value="'.price2num(GETPOST('tjm') ? GETPOST('tjm') : $object->tjm).'">';
|
|
} else {
|
|
print($object->tjm != '' ? price($object->tjm, '', $langs, 1, -1, -1, $conf->currency) : '');
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
}
|
|
|
|
// Date employment
|
|
print '<tr><td>'.$langs->trans("DateEmployment").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
print $form->selectDate($dateemployment ? $dateemployment : $object->dateemployment, 'dateemployment', 0, 0, 1, 'formdateemployment', 1, 1, 0, '', '', '', '', 1, '', $langs->trans("from"));
|
|
} else {
|
|
print dol_print_date($object->dateemployment, 'day');
|
|
}
|
|
|
|
if ($dateemployment && $dateemploymentend) {
|
|
print ' - ';
|
|
}
|
|
|
|
if ($caneditfield) {
|
|
print $form->selectDate($dateemploymentend ? $dateemploymentend : $object->dateemploymentend, 'dateemploymentend', 0, 0, 1, 'formdateemploymentend', 1, 0, 0, '', '', '', '', 1, '', $langs->trans("to"));
|
|
} else {
|
|
print dol_print_date($object->dateemploymentend, 'day');
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
// Date birth
|
|
print '<tr><td>'.$langs->trans("DateOfBirth").'</td>';
|
|
print '<td>';
|
|
if ($caneditfield) {
|
|
echo $form->selectDate($dateofbirth ? $dateofbirth : $object->birth, 'dateofbirth', 0, 0, 1, 'updateuser', 1, 0, 0, '', '', '', '', 1, '', '', 'tzserver');
|
|
} else {
|
|
print dol_print_date($object->birth, 'day', 'tzserver');
|
|
}
|
|
print '</td>';
|
|
print "</tr>\n";
|
|
|
|
print '</table>';
|
|
|
|
print dol_get_fiche_end();
|
|
|
|
print '<div class="center">';
|
|
print '<input value="'.$langs->trans("Save").'" class="button button-save" type="submit" name="save">';
|
|
print ' ';
|
|
print '<input value="'.$langs->trans("Cancel").'" class="button button-cancel" type="submit" name="cancel">';
|
|
print '</div>';
|
|
|
|
print '</form>';
|
|
}
|
|
|
|
if ($action != 'edit' && $action != 'presend') {
|
|
print '<div class="fichecenter"><div class="fichehalfleft">';
|
|
|
|
// Generated documents
|
|
$filename = dol_sanitizeFileName($object->ref);
|
|
$filedir = $conf->user->dir_output."/".dol_sanitizeFileName($object->ref);
|
|
$urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
|
|
$genallowed = $user->hasRight("user", "user", "read");
|
|
$delallowed = $user->hasRight("user", "user", "write");
|
|
|
|
print $formfile->showdocuments('user', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', 0, '', empty($soc->default_lang) ? '' : $soc->default_lang);
|
|
$somethingshown = $formfile->numoffiles;
|
|
|
|
// Show links to link elements
|
|
$linktoelem = $form->showLinkToObjectBlock($object, null, null);
|
|
$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
|
|
|
|
print '</div><div class="fichehalfright">';
|
|
|
|
// List of actions on element
|
|
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
|
|
$formactions = new FormActions($db);
|
|
$somethingshown = $formactions->showactions($object, 'user', $socid, 1, 'listactions', 0, '', '', $object->id);
|
|
|
|
print '</div></div>';
|
|
}
|
|
|
|
if (isModEnabled('ldap') && !empty($object->ldap_sid)) {
|
|
$ldap->unbind();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Add button to autosuggest a key
|
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
|
|
print dolJSToSetRandomPassword('password', 'generate_password', 0);
|
|
if (isModEnabled('api')) {
|
|
print dolJSToSetRandomPassword('api_key', 'generate_api_key', 1);
|
|
}
|
|
|
|
// End of page
|
|
llxFooter();
|
|
$db->close();
|