dolibarr 18.0.6
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2021 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2017 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2015-2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
6 * Copyright (C) 2016 Marcos García <marcosgdf@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28// Load Dolibarr environment
29require '../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
31if (isModEnabled('categorie')) {
32 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
33}
34
35// Load translation files required by page
36$langs->loadLangs(array('users', 'companies', 'hrm', 'salaries'));
37
38$action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
39$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
40$show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
41$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
42$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
43$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
44$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userlist'; // To manage different context of search
45$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
46$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
47$mode = GETPOST("mode", 'aZ');
48
49// Security check (for external users)
50$socid = 0;
51if ($user->socid > 0) {
52 $socid = $user->socid;
53}
54
55// Load variable for pagination
56$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
57$sortfield = GETPOST('sortfield', 'aZ09comma');
58$sortorder = GETPOST('sortorder', 'aZ09comma');
59$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
60if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
61 // If $page is not defined, or '' or -1 or if we click on clear filters
62 $page = 0;
63}
64$offset = $limit * $page;
65$pageprev = $page - 1;
66$pagenext = $page + 1;
67
68// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
69$object = new User($db);
70$extrafields = new ExtraFields($db);
71$diroutputmassaction = $conf->user->dir_output.'/temp/massgeneration/'.$user->id;
72$hookmanager->initHooks(array('userlist'));
73
74// Fetch optionals attributes and labels
75$extrafields->fetch_name_optionals_label($object->table_element);
76
77$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
78
79if (!$sortfield) {
80 $sortfield = "u.login";
81}
82if (!$sortorder) {
83 $sortorder = "ASC";
84}
85
86// Initialize array of search criterias
87$search_all = GETPOST('search_all', 'alphanohtml');
88$search = array();
89foreach ($object->fields as $key => $val) {
90 if (GETPOST('search_'.$key, 'alpha') !== '') {
91 $search[$key] = GETPOST('search_'.$key, 'alpha');
92 }
93 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
94 $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
95 $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
96 }
97}
98
99$userstatic = new User($db);
100$companystatic = new Societe($db);
101$form = new Form($db);
102
103// List of fields to search into when doing a "search in all"
104$fieldstosearchall = array(
105 'u.login'=>"Login",
106 'u.lastname'=>"Lastname",
107 'u.firstname'=>"Firstname",
108 'u.accountancy_code'=>"AccountancyCode",
109 'u.office_phone'=>"PhonePro",
110 'u.user_mobile'=>"PhoneMobile",
111 'u.email'=>"EMail",
112 'u.note_public'=>"NotePublic",
113 'u.note_private'=>"NotePrivate"
114);
115if (isModEnabled('api')) {
116 $fieldstosearchall['u.api_key'] = "ApiKey";
117}
118
119$permissiontoreadhr = $user->hasRight('hrm', 'read_personal_information', 'read') || $user->hasRight('hrm', 'write_personal_information', 'write');
120$permissiontowritehr = $user->hasRight('hrm', 'write_personal_information', 'write');
121
122// Definition of fields for list
123$arrayfields = array(
124 'u.login'=>array('label'=>"Login", 'checked'=>1, 'position'=>10),
125 'u.lastname'=>array('label'=>"Lastname", 'checked'=>1, 'position'=>15),
126 'u.firstname'=>array('label'=>"Firstname", 'checked'=>1, 'position'=>20),
127 'u.entity'=>array('label'=>"Entity", 'checked'=>1, 'position'=>50, 'enabled'=>(isModEnabled('multicompany') && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE))),
128 'u.gender'=>array('label'=>"Gender", 'checked'=>0, 'position'=>22),
129 'u.employee'=>array('label'=>"Employee", 'checked'=>($contextpage == 'employeelist' ? 1 : 0), 'position'=>25),
130 'u.fk_user'=>array('label'=>"HierarchicalResponsible", 'checked'=>1, 'position'=>27, 'csslist'=>'maxwidth150'),
131 'u.accountancy_code'=>array('label'=>"AccountancyCode", 'checked'=>0, 'position'=>30),
132 'u.office_phone'=>array('label'=>"PhonePro", 'checked'=>1, 'position'=>31),
133 'u.user_mobile'=>array('label'=>"PhoneMobile", 'checked'=>1, 'position'=>32),
134 'u.email'=>array('label'=>"EMail", 'checked'=>1, 'position'=>35),
135 'u.api_key'=>array('label'=>"ApiKey", 'checked'=>0, 'position'=>40, "enabled"=>(isModEnabled('api') && $user->admin)),
136 'u.fk_soc'=>array('label'=>"Company", 'checked'=>($contextpage == 'employeelist' ? 0 : 1), 'position'=>45),
137 'u.ref_employee'=>array('label'=>"RefEmployee", 'checked'=>-1, 'position'=>50, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)),
138 'u.national_registration_number'=>array('label'=>"NationalRegistrationNumber", 'checked'=>-1, 'position'=>51, 'enabled'=>(isModEnabled('hrm') && $permissiontoreadhr)),
139 'u.job'=>array('label'=>"PostOrFunction", 'checked'=>-1, 'position'=>60),
140 'u.salary'=>array('label'=>"Salary", 'checked'=>-1, 'position'=>80, 'enabled'=>(isModEnabled('salaries') && $user->hasRight("salaries", "readall")), 'isameasure'=>1),
141 'u.datelastlogin'=>array('label'=>"LastConnexion", 'checked'=>1, 'position'=>100),
142 'u.datepreviouslogin'=>array('label'=>"PreviousConnexion", 'checked'=>0, 'position'=>110),
143 'u.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500),
144 'u.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500),
145 'u.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000),
146);
147// Extra fields
148include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_list_array_fields.tpl.php';
149
150$object->fields = dol_sort_array($object->fields, 'position');
151$arrayfields = dol_sort_array($arrayfields, 'position');
152
153// Init search fields
154$search_all = trim((GETPOST('search_all', 'alphanohtml') != '') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
155$search_user = GETPOST('search_user', 'alpha');
156$search_login = GETPOST('search_login', 'alpha');
157$search_lastname = GETPOST('search_lastname', 'alpha');
158$search_firstname = GETPOST('search_firstname', 'alpha');
159$search_gender = GETPOST('search_gender', 'alpha');
160$search_employee = GETPOST('search_employee', 'alpha');
161$search_accountancy_code = GETPOST('search_accountancy_code', 'alpha');
162$search_phonepro = GETPOST('search_phonepro', 'alpha');
163$search_phonemobile = GETPOST('search_phonemobile', 'alpha');
164$search_email = GETPOST('search_email', 'alpha');
165$search_api_key = GETPOST('search_api_key', 'alphanohtml');
166$search_statut = GETPOST('search_statut', 'intcomma');
167$search_thirdparty = GETPOST('search_thirdparty', 'alpha');
168$search_job = GETPOST('search_job', 'alpha');
169$search_warehouse = GETPOST('search_warehouse', 'alpha');
170$search_supervisor = GETPOST('search_supervisor', 'intcomma');
171$search_categ = GETPOST("search_categ", 'int');
172$searchCategoryUserOperator = 0;
173if (GETPOSTISSET('formfilteraction')) {
174 $searchCategoryUserOperator = GETPOSTINT('search_category_user_operator');
175} elseif (!empty($conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT)) {
176 $searchCategoryUserOperator = $conf->global->MAIN_SEARCH_CAT_OR_BY_DEFAULT;
177}
178$searchCategoryUserList = GETPOST('search_category_user_list', 'array');
179$catid = GETPOST('catid', 'int');
180if (!empty($catid) && empty($searchCategoryUserList)) {
181 $searchCategoryUserList = array($catid);
182}
183$catid = GETPOST('catid', 'int');
184if (!empty($catid) && empty($search_categ)) {
185 $search_categ = $catid;
186}
187
188// Default search
189if ($search_statut == '') {
190 $search_statut = '1';
191}
192if ($contextpage == 'employeelist' && !GETPOSTISSET('search_employee')) {
193 $search_employee = 1;
194}
195
196// Define value to know what current user can do on users
197$permissiontoadd = (!empty($user->admin) || $user->hasRight("user", "user", "write"));
198$canreaduser = (!empty($user->admin) || $user->hasRight("user", "user", "read"));
199$canedituser = (!empty($user->admin) || $user->hasRight("user", "user", "write"));
200$candisableuser = (!empty($user->admin) || $user->hasRight("user", "user", "delete"));
201$canreadgroup = $canreaduser;
202$caneditgroup = $canedituser;
203if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS)) {
204 $canreadgroup = (!empty($user->admin) || $user->hasRight("user", "group_advance", "read"));
205 $caneditgroup = (!empty($user->admin) || $user->hasRight("user", "group_advance", "write"));
206}
207
208$error = 0;
209
210// Permission to list
211if (isModEnabled('salaries') && $contextpage == 'employeelist' && $search_employee == 1) {
212 if (!$user->hasRight("salaries", "read")) {
214 }
215} else {
216 if (!$user->hasRight("user", "user", "read") && empty($user->admin)) {
218 }
219}
220
221$childids = $user->getAllChildIds(1);
222
223
224/*
225 * Actions
226 */
227
228if (GETPOST('cancel', 'alpha')) {
229 $action = 'list';
230 $massaction = '';
231}
232if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
233 $massaction = '';
234}
235
236$parameters = array();
237$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
238if ($reshook < 0) {
239 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
240}
241
242if (empty($reshook)) {
243 // Selection of new fields
244 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
245
246 // Purge search criteria
247 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
248 $search_user = "";
249 $search_login = "";
250 $search_lastname = "";
251 $search_firstname = "";
252 $search_gender = "";
253 $search_employee = "";
254 $search_accountancy_code = "";
255 $search_phonepro = "";
256 $search_phonemobile = "";
257 $search_email = "";
258 $search_statut = "";
259 $search_thirdparty = "";
260 $search_job = "";
261 $search_warehouse = "";
262 $search_supervisor = "";
263 $search_api_key = "";
264 $search_datelastlogin = "";
265 $search_datepreviouslogin = "";
266 $search_date_creation = "";
267 $search_date_update = "";
268 $search_categ = 0;
269 $toselect = array();
270 $search_array_options = array();
271 }
272 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
273 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
274 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
275 }
276
277 // Mass actions
278 $objectclass = 'User';
279 $objectlabel = 'User';
280 $uploaddir = $conf->user->dir_output;
281 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
282
283 // Disable or Enable records
284 if (!$error && ($massaction == 'disable' || $massaction == 'reactivate') && $permissiontoadd) {
285 $objecttmp = new User($db);
286
287 if (!$error) {
288 $db->begin();
289
290 $nbok = 0;
291 foreach ($toselect as $toselectid) {
292 if ($toselectid == $user->id) {
293 setEventMessages($langs->trans($massaction == 0 ? 'CantDisableYourself' : 'CanEnableYourself'), null, 'errors');
294 $error++;
295 break;
296 }
297
298 $result = $objecttmp->fetch($toselectid);
299 if ($result > 0) {
300 if ($objecttmp->admin) {
301 setEventMessages($langs->trans($massaction == 0 ? 'CantDisableAnAdminUserWithMassActions' : 'CantEnableAnAdminUserWithMassActions', $objecttmp->login), null, 'errors');
302 $error++;
303 break;
304 }
305
306 $result = $objecttmp->setstatus($massaction == 'disable' ? 0 : 1);
307 if ($result == 0) {
308 // Nothing is done
309 } elseif ($result < 0) {
310 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
311 $error++;
312 break;
313 } else {
314 $nbok++;
315 }
316 } else {
317 setEventMessages($objecttmp->error, $objecttmp->errors, 'errors');
318 $error++;
319 break;
320 }
321 }
322
323 if (!$error && !empty($conf->file->main_limit_users)) {
324 $nb = $object->getNbOfUsers("active");
325 if ($nb >= $conf->file->main_limit_users) {
326 $error++;
327 setEventMessages($langs->trans("YourQuotaOfUsersIsReached"), null, 'errors');
328 }
329 }
330
331 if (!$error) {
332 if ($nbok > 1) {
333 setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
334 } else {
335 setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
336 }
337 $db->commit();
338 } else {
339 $db->rollback();
340 }
341 }
342 }
343}
344
345
346/*
347 * View
348 */
349
350$formother = new FormOther($db);
351$user2 = new User($db);
352
353$now = dol_now();
354
355$help_url = 'EN:Module_Users|FR:Module_Utilisateurs|ES:M&oacute;dulo_Usuarios|DE:Modul_Benutzer';
356if ($contextpage == 'employeelist' && $search_employee == 1) {
357 $title = $langs->trans("Employees");
358} else {
359 $title = $langs->trans("Users");
360}
361$morejs = array();
362$morecss = array();
363$morehtmlright = "";
364
365// Build and execute select
366// --------------------------------------------------------------------
367$sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.admin, u.fk_soc, u.login, u.office_phone, u.user_mobile, u.email, u.api_key, u.accountancy_code, u.gender, u.employee, u.photo,";
368$sql .= " u.fk_user,";
369$sql .= " u.ref_employee, u.national_registration_number, u.job, u.salary, u.datelastlogin, u.datepreviouslogin,";
370$sql .= " u.datestartvalidity, u.dateendvalidity,";
371$sql .= " u.ldap_sid, u.statut as status, u.entity,";
372$sql .= " u.tms as date_update, u.datec as date_creation,";
373$sql .= " u2.rowid as id2, u2.login as login2, u2.firstname as firstname2, u2.lastname as lastname2, u2.admin as admin2, u2.fk_soc as fk_soc2, u2.office_phone as ofice_phone2, u2.user_mobile as user_mobile2, u2.email as email2, u2.gender as gender2, u2.photo as photo2, u2.entity as entity2, u2.statut as status2,";
374$sql .= " s.nom as name, s.canvas";
375// Add fields from extrafields
376if (!empty($extrafields->attributes[$object->table_element]['label'])) {
377 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
378 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
379 }
380}
381// Add fields from hooks
382$parameters = array();
383$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
384$sql .= $hookmanager->resPrint;
385$sql = preg_replace('/,\s*$/', '', $sql);
386
387$sqlfields = $sql; // $sql fields to remove for count total
388
389$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as u";
390if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
391 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (u.rowid = ef.fk_object)";
392}
393$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON u.fk_soc = s.rowid";
394$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as u2 ON u.fk_user = u2.rowid";
395// Add table from hooks
396$parameters = array();
397$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
398$sql .= $hookmanager->resPrint;
399if ($reshook > 0) {
400 $sql .= $hookmanager->resPrint;
401}
402$sql .= " WHERE u.entity IN (".getEntity($object->element).")";
403if ($socid > 0) {
404 $sql .= " AND u.fk_soc = ".((int) $socid);
405}
406//if ($search_user != '') $sql.=natural_search(array('u.login', 'u.lastname', 'u.firstname'), $search_user);
407if ($search_supervisor > 0) {
408 $sql .= " AND u.fk_user IN (".$db->sanitize($search_supervisor).")";
409}
410if ($search_thirdparty != '') {
411 $sql .= natural_search(array('s.nom'), $search_thirdparty);
412}
413if ($search_warehouse > 0) {
414 $sql .= natural_search(array('u.fk_warehouse'), $search_warehouse);
415}
416if ($search_login != '') {
417 $sql .= natural_search("u.login", $search_login);
418}
419if ($search_lastname != '') {
420 $sql .= natural_search("u.lastname", $search_lastname);
421}
422if ($search_firstname != '') {
423 $sql .= natural_search("u.firstname", $search_firstname);
424}
425if ($search_gender != '' && $search_gender != '-1') {
426 $sql .= " AND u.gender = '".$db->escape($search_gender)."'"; // Cannot use natural_search as looking for %man% also includes woman
427}
428if (is_numeric($search_employee) && $search_employee >= 0) {
429 $sql .= ' AND u.employee = '.(int) $search_employee;
430}
431if ($search_accountancy_code != '') {
432 $sql .= natural_search("u.accountancy_code", $search_accountancy_code);
433}
434if ($search_phonepro != '') {
435 $sql .= natural_search("u.office_phone", $search_phonepro);
436}
437if ($search_phonemobile != '') {
438 $sql .= natural_search("u.user_mobile", $search_phonemobile);
439}
440if ($search_email != '') {
441 $sql .= natural_search("u.email", $search_email);
442}
443if ($search_api_key != '') {
444 $sql .= natural_search("u.api_key", $search_api_key);
445}
446if ($search_job != '') {
447 $sql .= natural_search(array('u.job'), $search_job);
448}
449if ($search_statut != '' && $search_statut >= 0) {
450 $sql .= " AND u.statut IN (".$db->sanitize($search_statut).")";
451}
452if ($search_all) {
453 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
454}
455// Search for tag/category ($searchCategoryUserList is an array of ID)
456$searchCategoryUserList = array($search_categ);
457if (!empty($searchCategoryUserList)) {
458 $searchCategoryUserSqlList = array();
459 $listofcategoryid = '';
460 foreach ($searchCategoryUserList as $searchCategoryUser) {
461 if (intval($searchCategoryUser) == -2) {
462 $searchCategoryUserSqlList[] = "NOT EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user)";
463 } elseif (intval($searchCategoryUser) > 0) {
464 if ($searchCategoryUserOperator == 0) {
465 $searchCategoryUserSqlList[] = " EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user AND ck.fk_categorie = ".((int) $searchCategoryUser).")";
466 } else {
467 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryUser);
468 }
469 }
470 }
471 if ($listofcategoryid) {
472 $searchCategoryUserSqlList[] = " EXISTS (SELECT ck.fk_user FROM ".MAIN_DB_PREFIX."categorie_user as ck WHERE u.rowid = ck.fk_user AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
473 }
474 if ($searchCategoryUserOperator == 1) {
475 if (!empty($searchCategoryUserSqlList)) {
476 $sql .= " AND (".implode(' OR ', $searchCategoryUserSqlList).")";
477 }
478 } else {
479 if (!empty($searchCategoryUserSqlList)) {
480 $sql .= " AND (".implode(' AND ', $searchCategoryUserSqlList).")";
481 }
482 }
483}
484if ($search_warehouse > 0) {
485 $sql .= " AND u.fk_warehouse = ".((int) $search_warehouse);
486}
487if (isModEnabled('salaries') && $contextpage == 'employeelist' && !$user->hasRight("salaries", "readall")) {
488 $sql .= " AND u.rowid IN (".$db->sanitize(join(',', $childids)).")";
489}
490// Add where from extra fields
491include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
492// Add where from hooks
493$parameters = array();
494$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
495$sql .= $hookmanager->resPrint;
496
497// Count total nb of records
498$nbtotalofrecords = '';
499if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
500 /* The fast and low memory method to get and count full list converts the sql into a sql count */
501 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
502 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
503 $resql = $db->query($sqlforcount);
504 if ($resql) {
505 $objforcount = $db->fetch_object($resql);
506 $nbtotalofrecords = $objforcount->nbtotalofrecords;
507 } else {
508 dol_print_error($db);
509 }
510
511 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
512 $page = 0;
513 $offset = 0;
514 }
515 $db->free($resql);
516}
517
518// Complete request and execute it with limit
519$sql .= $db->order($sortfield, $sortorder);
520if ($limit) {
521 $sql .= $db->plimit($limit + 1, $offset);
522}
523
524$resql = $db->query($sql);
525if (!$resql) {
526 dol_print_error($db);
527 exit;
528}
529
530$num = $db->num_rows($resql);
531
532// Direct jump if only one record found
533if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
534 $obj = $db->fetch_object($resql);
535 $id = $obj->rowid;
536 header("Location: ".DOL_URL_ROOT.'/user/card.php?id='.$id);
537 exit;
538}
539
540// Output page
541// --------------------------------------------------------------------
542
543llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
544
545$arrayofselected = is_array($toselect) ? $toselect : array();
546
547$param = '';
548if (!empty($mode)) {
549 $param .= '&amp;mode='.urlencode($mode);
550}
551if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
552 $param .= '&amp;contextpage='.urlencode($contextpage);
553}
554if ($limit > 0 && $limit != $conf->liste_limit) {
555 $param .= '&amp;limit='.((int) $limit);
556}
557if ($search_all != '') {
558 $param .= '&amp;search_all='.urlencode($search_all);
559}
560if ($search_user != '') {
561 $param .= "&amp;search_user=".urlencode($search_user);
562}
563if ($search_login != '') {
564 $param .= "&amp;search_login=".urlencode($search_login);
565}
566if ($search_lastname != '') {
567 $param .= "&amp;search_lastname=".urlencode($search_lastname);
568}
569if ($search_firstname != '') {
570 $param .= "&amp;search_firstname=".urlencode($search_firstname);
571}
572if ($search_gender != '' && $search_gender != '-1') {
573 $param .= "&amp;search_gender=".urlencode($search_gender);
574}
575if ($search_employee != '' && $search_employee != '-1') {
576 $param .= "&amp;search_employee=".urlencode($search_employee);
577}
578if ($search_accountancy_code != '') {
579 $param .= "&amp;search_accountancy_code=".urlencode($search_accountancy_code);
580}
581if ($search_phonepro != '') {
582 $param .= "&amp;search_phonepro=".urlencode($search_phonepro);
583}
584if ($search_phonemobile != '') {
585 $param .= "&amp;search_phonemobile=".urlencode($search_phonemobile);
586}
587if ($search_email != '') {
588 $param .= "&amp;search_email=".urlencode($search_email);
589}
590if ($search_api_key != '') {
591 $param .= "&amp;search_api_key=".urlencode($search_api_key);
592}
593if ($search_supervisor > 0) {
594 $param .= "&amp;search_supervisor=".urlencode($search_supervisor);
595}
596if ($search_statut != '') {
597 $param .= "&amp;search_statut=".urlencode($search_statut);
598}
599if ($optioncss != '') {
600 $param .= '&amp;optioncss='.urlencode($optioncss);
601}
602if ($search_categ > 0) {
603 $param .= '&amp;search_categ='.urlencode($search_categ);
604}
605if ($search_warehouse > 0) {
606 $param .= '&amp;search_warehouse='.urlencode($search_warehouse);
607}
608// Add $param from extra fields
609include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
610
611// List of mass actions available
612$arrayofmassactions = array();
613if ($permissiontoadd) {
614 $arrayofmassactions['disable'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("DisableUser");
615}
616if ($permissiontoadd) {
617 $arrayofmassactions['reactivate'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Reactivate");
618}
619if (isModEnabled('category') && $permissiontoadd) {
620 $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
621}
622if ($permissiontoadd) {
623 $arrayofmassactions['presetsupervisor'] = img_picto('', 'user', 'class="pictofixedwidth"').$langs->trans("SetSupervisor");
624}
625//if ($permissiontodelete) $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
626
627if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete', 'preaffecttag', 'presetsupervisor'))) {
628 $arrayofmassactions = array();
629}
630$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
631
632print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
633if ($optioncss != '') {
634 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
635}
636print '<input type="hidden" name="token" value="'.newToken().'">';
637print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
638print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
639print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
640print '<input type="hidden" name="page" value="'.$page.'">';
641print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
642print '<input type="hidden" name="page_y" value="">';
643print '<input type="hidden" name="mode" value="'.$mode.'">';
644
645$url = DOL_URL_ROOT.'/user/card.php?action=create'.($contextpage == 'employeelist' ? '&search_employee=1' : '').'&leftmenu=';
646if (!empty($socid)) {
647 $url .= '&socid='.urlencode($socid);
648}
649
650$newcardbutton = '';
651$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars paddingleft imgforviewmode', DOL_URL_ROOT.'/user/list.php?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
652$newcardbutton .= dolGetButtonTitle($langs->trans('HierarchicView'), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/user/hierarchy.php?mode=hierarchy'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', (($mode == 'hierarchy') ? 2 : 1), array('morecss'=>'reposition'));
653$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition'));
654$newcardbutton .= dolGetButtonTitleSeparator();
655$newcardbutton .= dolGetButtonTitle($langs->trans('NewUser'), '', 'fa fa-plus-circle', $url, '', $permissiontoadd);
656
657/*$moreparam = array('morecss'=>'btnTitleSelected');
658$morehtmlright = dolGetButtonTitle($langs->trans("List"), '', 'fa fa-list paddingleft imgforviewmode', DOL_URL_ROOT.'/user/list.php'.(($search_statut != '' && $search_statut >= 0) ? '?search_statut='.$search_statut : ''), '', 1, $moreparam);
659$moreparam = array('morecss'=>'marginleftonly');
660$morehtmlright .= dolGetButtonTitle($langs->trans("HierarchicView"), '', 'fa fa-stream paddingleft imgforviewmode', DOL_URL_ROOT.'/user/hierarchy.php'.(($search_statut != '' && $search_statut >= 0) ? '?search_statut='.$search_statut : ''), '', 1, $moreparam);
661*/
662print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'user', 0, $morehtmlright.' '.$newcardbutton, '', $limit, 0, 0, 1);
663
664
665
666// Add code for pre mass action (confirmation or email presend form)
667$topicmail = "SendUserRef";
668$modelmail = "user";
669$objecttmp = new User($db);
670$trackid = 'use'.$object->id;
671include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
672
673if (!empty($catid)) {
674 print "<div id='ways'>";
675 $c = new Categorie($db);
676 $ways = $c->print_all_ways(' &gt; ', 'user/list.php');
677 print " &gt; ".$ways[0]."<br>\n";
678 print "</div><br>";
679}
680
681if ($search_all) {
682 foreach ($fieldstosearchall as $key => $val) {
683 $fieldstosearchall[$key] = $langs->trans($val);
684 }
685 print '<!-- Search done like if USER_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
686 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'</div>';
687}
688
689$moreforfilter = '';
690/*$moreforfilter.='<div class="divsearchfield">';
691 $moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
692 $moreforfilter.= '</div>';*/
693
694// Filter on categories
695if (isModEnabled('categorie') && $user->hasRight("categorie", "read")) {
696 $moreforfilter .= '<div class="divsearchfield">';
697 $tmptitle = $langs->trans('Category');
698 $moreforfilter .= img_picto($langs->trans("Category"), 'category', 'class="pictofixedwidth"').$formother->select_categories(Categorie::TYPE_USER, $search_categ, 'search_categ', 1, $tmptitle);
699 $moreforfilter .= '</div>';
700}
701// Filter on warehouse
702if (isModEnabled('stock') && !empty($conf->global->MAIN_DEFAULT_WAREHOUSE_USER)) {
703 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
704 $formproduct = new FormProduct($db);
705 $moreforfilter .= '<div class="divsearchfield">';
706 $tmptitle = $langs->trans('Warehouse');
707 $moreforfilter .= img_picto($tmptitle, 'stock', 'class="pictofixedwidth"').$formproduct->selectWarehouses($search_warehouse, 'search_warehouse', '', $tmptitle, 0, 0, $tmptitle);
708 $moreforfilter .= '</div>';
709}
710
711$parameters = array();
712$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
713if (empty($reshook)) {
714 $moreforfilter .= $hookmanager->resPrint;
715} else {
716 $moreforfilter = $hookmanager->resPrint;
717}
718
719if (!empty($moreforfilter)) {
720 print '<div class="liste_titre liste_titre_bydiv centpercent">';
721 print $moreforfilter;
722 print '</div>';
723}
724
725$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
726$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
727$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
728
729print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
730print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
731
732// Fields title search
733// --------------------------------------------------------------------
734print '<tr class="liste_titre_filter">';
735// Action column
736if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
737 print '<td class="liste_titre center maxwidthsearch">';
738 $searchpicto = $form->showFilterButtons('left');
739 print $searchpicto;
740 print '</td>';
741}
742if (!empty($arrayfields['u.login']['checked'])) {
743 print '<td class="liste_titre"><input type="text" name="search_login" class="maxwidth50" value="'.$search_login.'"></td>';
744}
745if (!empty($arrayfields['u.lastname']['checked'])) {
746 print '<td class="liste_titre"><input type="text" name="search_lastname" class="maxwidth50" value="'.$search_lastname.'"></td>';
747}
748if (!empty($arrayfields['u.firstname']['checked'])) {
749 print '<td class="liste_titre"><input type="text" name="search_firstname" class="maxwidth50" value="'.$search_firstname.'"></td>';
750}
751if (!empty($arrayfields['u.gender']['checked'])) {
752 print '<td class="liste_titre center">';
753 $arraygender = array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman"), 'other'=>$langs->trans("Genderother"));
754 print $form->selectarray('search_gender', $arraygender, $search_gender, 1);
755 print '</td>';
756}
757if (!empty($arrayfields['u.employee']['checked'])) {
758 print '<td class="liste_titre">';
759 print $form->selectyesno('search_employee', $search_employee, 1, false, 1);
760 print '</td>';
761}
762// Supervisor
763if (!empty($arrayfields['u.fk_user']['checked'])) {
764 print '<td class="liste_titre">';
765 print $form->select_dolusers($search_supervisor, 'search_supervisor', 1, array(), 0, '', 0, 0, 0, 0, '', 0, '', 'maxwidth125');
766 print '</td>';
767}
768if (!empty($arrayfields['u.accountancy_code']['checked'])) {
769 print '<td class="liste_titre"><input type="text" name="search_accountancy_code" class="maxwidth50" value="'.$search_accountancy_code.'"></td>';
770}
771if (!empty($arrayfields['u.office_phone']['checked'])) {
772 print '<td class="liste_titre"><input type="text" name="search_phonepro" class="maxwidth50" value="'.$search_phonepro.'"></td>';
773}
774if (!empty($arrayfields['u.user_mobile']['checked'])) {
775 print '<td class="liste_titre"><input type="text" name="search_phonemobile" class="maxwidth50" value="'.$search_phonemobile.'"></td>';
776}
777if (!empty($arrayfields['u.email']['checked'])) {
778 print '<td class="liste_titre"><input type="text" name="search_email" class="maxwidth75" value="'.$search_email.'"></td>';
779}
780if (!empty($arrayfields['u.api_key']['checked'])) {
781 print '<td class="liste_titre"><input type="text" name="search_api_key" class="maxwidth50" value="'.$search_api_key.'"></td>';
782}
783if (!empty($arrayfields['u.fk_soc']['checked'])) {
784 print '<td class="liste_titre"><input type="text" name="search_thirdparty" class="maxwidth75" value="'.$search_thirdparty.'"></td>';
785}
786if (!empty($arrayfields['u.entity']['checked'])) {
787 print '<td class="liste_titre"></td>';
788}
789if (!empty($arrayfields['u.ref_employee']['checked'])) {
790 print '<td class="liste_titre"></td>';
791}
792if (!empty($arrayfields['u.national_registration_number']['checked'])) {
793 print '<td class="liste_titre"></td>';
794}
795if (!empty($arrayfields['u.job']['checked'])) {
796 print '<td class="liste_titre"><input type="text" name="search_job" class="maxwidth75" value="'.$search_job.'"></td>';
797}
798if (!empty($arrayfields['u.salary']['checked'])) {
799 print '<td class="liste_titre"></td>';
800}
801if (!empty($arrayfields['u.datelastlogin']['checked'])) {
802 print '<td class="liste_titre"></td>';
803}
804if (!empty($arrayfields['u.datepreviouslogin']['checked'])) {
805 print '<td class="liste_titre"></td>';
806}
807// Extra fields
808include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
809// Fields from hook
810$parameters = array('arrayfields'=>$arrayfields);
811$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
812print $hookmanager->resPrint;
813if (!empty($arrayfields['u.datec']['checked'])) {
814 // Date creation
815 print '<td class="liste_titre">';
816 print '</td>';
817}
818if (!empty($arrayfields['u.tms']['checked'])) {
819 // Date modification
820 print '<td class="liste_titre">';
821 print '</td>';
822}
823if (!empty($arrayfields['u.statut']['checked'])) {
824 // Status
825 print '<td class="liste_titre center parentonrightofpage">';
826 print $form->selectarray('search_statut', array('-1'=>'', '0'=>$langs->trans('Disabled'), '1'=>$langs->trans('Enabled')), $search_statut, 0, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
827 print '</td>';
828}
829// Action column
830if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
831 print '<td class="liste_titre maxwidthsearch">';
832 $searchpicto = $form->showFilterButtons();
833 print $searchpicto;
834 print '</td>';
835}
836print '</tr>'."\n";
837
838$totalarray = array();
839$totalarray['nbfield'] = 0;
840
841// Fields title label
842// --------------------------------------------------------------------
843print '<tr class="liste_titre">';
844if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
845 print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
846 $totalarray['nbfield']++;
847}
848if (!empty($arrayfields['u.login']['checked'])) {
849 print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER['PHP_SELF'], "u.login", $param, "", "", $sortfield, $sortorder);
850 $totalarray['nbfield']++;
851}
852if (!empty($arrayfields['u.lastname']['checked'])) {
853 print_liste_field_titre("Lastname", $_SERVER['PHP_SELF'], "u.lastname", $param, "", "", $sortfield, $sortorder);
854 $totalarray['nbfield']++;
855}
856if (!empty($arrayfields['u.firstname']['checked'])) {
857 print_liste_field_titre("FirstName", $_SERVER['PHP_SELF'], "u.firstname", $param, "", "", $sortfield, $sortorder);
858 $totalarray['nbfield']++;
859}
860if (!empty($arrayfields['u.gender']['checked'])) {
861 print_liste_field_titre("Gender", $_SERVER['PHP_SELF'], "u.gender", $param, "", "", $sortfield, $sortorder, 'center ');
862 $totalarray['nbfield']++;
863}
864if (!empty($arrayfields['u.employee']['checked'])) {
865 print_liste_field_titre("Employee", $_SERVER['PHP_SELF'], "u.employee", $param, "", "", $sortfield, $sortorder, 'center ');
866 $totalarray['nbfield']++;
867}
868if (!empty($arrayfields['u.fk_user']['checked'])) {
869 print_liste_field_titre("HierarchicalResponsible", $_SERVER['PHP_SELF'], "u.fk_user", $param, "", "", $sortfield, $sortorder);
870 $totalarray['nbfield']++;
871}
872if (!empty($arrayfields['u.accountancy_code']['checked'])) {
873 print_liste_field_titre("AccountancyCode", $_SERVER['PHP_SELF'], "u.accountancy_code", $param, "", "", $sortfield, $sortorder);
874 $totalarray['nbfield']++;
875}
876if (!empty($arrayfields['u.office_phone']['checked'])) {
877 print_liste_field_titre("PhonePro", $_SERVER['PHP_SELF'], "u.office_phone", $param, "", "", $sortfield, $sortorder);
878 $totalarray['nbfield']++;
879}
880if (!empty($arrayfields['u.user_mobile']['checked'])) {
881 print_liste_field_titre("PhoneMobile", $_SERVER['PHP_SELF'], "u.user_mobile", $param, "", "", $sortfield, $sortorder);
882 $totalarray['nbfield']++;
883}
884if (!empty($arrayfields['u.email']['checked'])) {
885 print_liste_field_titre("EMail", $_SERVER['PHP_SELF'], "u.email", $param, "", "", $sortfield, $sortorder);
886 $totalarray['nbfield']++;
887}
888if (!empty($arrayfields['u.api_key']['checked'])) {
889 print_liste_field_titre("ApiKey", $_SERVER['PHP_SELF'], "u.api_key", $param, "", "", $sortfield, $sortorder);
890 $totalarray['nbfield']++;
891}
892if (!empty($arrayfields['u.fk_soc']['checked'])) {
893 print_liste_field_titre("Company", $_SERVER['PHP_SELF'], "u.fk_soc", $param, "", "", $sortfield, $sortorder);
894 $totalarray['nbfield']++;
895}
896if (!empty($arrayfields['u.entity']['checked'])) {
897 print_liste_field_titre($arrayfields['u.entity']['label'], $_SERVER['PHP_SELF'], "u.entity", $param, "", "", $sortfield, $sortorder);
898 $totalarray['nbfield']++;
899}
900if (!empty($arrayfields['u.ref_employee']['checked'])) {
901 print_liste_field_titre("RefEmployee", $_SERVER['PHP_SELF'], "u.ref_employee", $param, "", "", $sortfield, $sortorder);
902 $totalarray['nbfield']++;
903}
904if (!empty($arrayfields['u.national_registration_number']['checked'])) {
905 print_liste_field_titre("NationalRegistrationNumber", $_SERVER['PHP_SELF'], "u.national_registration_number", $param, "", "", $sortfield, $sortorder);
906 $totalarray['nbfield']++;
907}
908if (!empty($arrayfields['u.job']['checked'])) {
909 print_liste_field_titre($arrayfields['u.job']['label'], $_SERVER['PHP_SELF'], "u.job", $param, "", "", $sortfield, $sortorder);
910 $totalarray['nbfield']++;
911}
912if (!empty($arrayfields['u.salary']['checked'])) {
913 print_liste_field_titre("Salary", $_SERVER['PHP_SELF'], "u.salary", $param, "", "", $sortfield, $sortorder, 'right ');
914 $totalarray['nbfield']++;
915}
916if (!empty($arrayfields['u.datelastlogin']['checked'])) {
917 print_liste_field_titre("LastConnexion", $_SERVER['PHP_SELF'], "u.datelastlogin", $param, "", '', $sortfield, $sortorder, 'center ');
918 $totalarray['nbfield']++;
919}
920if (!empty($arrayfields['u.datepreviouslogin']['checked'])) {
921 print_liste_field_titre("PreviousConnexion", $_SERVER['PHP_SELF'], "u.datepreviouslogin", $param, "", '', $sortfield, $sortorder, 'center ');
922 $totalarray['nbfield']++;
923}
924// Extra fields
925include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
926// Hook fields
927$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
928$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
929print $hookmanager->resPrint;
930if (!empty($arrayfields['u.datec']['checked'])) {
931 print_liste_field_titre("DateCreationShort", $_SERVER["PHP_SELF"], "u.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
932 $totalarray['nbfield']++;
933}
934if (!empty($arrayfields['u.tms']['checked'])) {
935 print_liste_field_titre("DateModificationShort", $_SERVER["PHP_SELF"], "u.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
936 $totalarray['nbfield']++;
937}
938if (!empty($arrayfields['u.statut']['checked'])) {
939 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "u.statut", "", $param, '', $sortfield, $sortorder, 'center ');
940 $totalarray['nbfield']++;
941}
942// Action column
943if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
944 print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
945 $totalarray['nbfield']++;
946}
947print '</tr>'."\n";
948
949
950// Detect if we need a fetch on each output line
951$needToFetchEachLine = 0;
952if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
953 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
954 if (!is_null($val) && preg_match('/\$object/', $val)) {
955 $needToFetchEachLine++; // There is at least one compute field that use $object
956 }
957 }
958}
959
960
961// Loop on record
962// --------------------------------------------------------------------
963$i = 0;
964$savnbfield = $totalarray['nbfield'];
965$totalarray = array('val'=>array('u.salary'=>0));
966$totalarray['nbfield'] = 0;
967$imaxinloop = ($limit ? min($num, $limit) : $num);
968while ($i < $imaxinloop) {
969 $obj = $db->fetch_object($resql);
970 if (empty($obj)) {
971 break; // Should not happen
972 }
973
974 if (empty($obj->country_code)) {
975 $obj->country_code = ''; // TODO Add join in select with country table to get country_code
976 }
977
978 // Store properties in $object
979 $object->setVarsFromFetchObj($obj);
980
981 $object->id = $obj->rowid;
982 $object->admin = $obj->admin;
983 $object->ref = $obj->rowid;
984 $object->login = $obj->login;
985 $object->statut = $obj->status;
986 $object->status = $obj->status;
987 $object->office_phone = $obj->office_phone;
988 $object->user_mobile = $obj->user_mobile;
989 $object->job = $obj->job;
990 $object->email = $obj->email;
991 $object->gender = $obj->gender;
992 $object->socid = $obj->fk_soc;
993 $object->firstname = $obj->firstname;
994 $object->lastname = $obj->lastname;
995 $object->employee = $obj->employee;
996 $object->photo = $obj->photo;
997 $object->datestartvalidity = $db->jdate($obj->datestartvalidity);
998 $object->dateendvalidity = $db->jdate($obj->dateendvalidity);
999
1000 $li = $object->getNomUrl(-1, '', 0, 0, 24, 1, 'login', '', 1);
1001
1002 $canreadhrmdata = 0;
1003 if ((isModEnabled('salaries') && $user->hasRight("salaries", "read") && in_array($obj->rowid, $childids))
1004 || (isModEnabled('salaries') && $user->hasRight("salaries", "readall"))
1005 || (isModEnabled('hrm') && $user->hasRight("hrm", "employee", "read"))) {
1006 $canreadhrmdata = 1;
1007 }
1008 $canreadsecretapi = 0;
1009 if ($user->id == $obj->rowid || !empty($user->admin)) { // Current user or admin
1010 $canreadsecretapi = 1;
1011 }
1012
1013 if ($mode == 'kanban') {
1014 if ($i == 0) {
1015 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1016 print '<div class="box-flex-container kanban">';
1017 }
1018
1019 // Output Kanban
1020 print $object->getKanbanView('', array('selected' => in_array($object->id, $arrayofselected)));
1021 if ($i == ($imaxinloop - 1)) {
1022 print '</div>';
1023 print '</td></tr>';
1024 }
1025 } else {
1026 // Show here line of result
1027 $j = 0;
1028 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
1029 // Action column
1030 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1031 print '<td class="nowrap center">';
1032 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1033 $selected = 0;
1034 if (in_array($object->id, $arrayofselected)) {
1035 $selected = 1;
1036 }
1037 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
1038 }
1039 print '</td>';
1040 if (!$i) {
1041 $totalarray['nbfield']++;
1042 }
1043 }
1044 // Login
1045 if (!empty($arrayfields['u.login']['checked'])) {
1046 print '<td class="nowraponall tdoverflowmax150">';
1047 print $li;
1048 if (isModEnabled('multicompany') && $obj->admin && !$obj->entity) {
1049 print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingright paddingleft"');
1050 } elseif ($obj->admin) {
1051 print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingright paddingleft"');
1052 }
1053 print '</td>';
1054 if (!$i) {
1055 $totalarray['nbfield']++;
1056 }
1057 }
1058 if (!empty($arrayfields['u.lastname']['checked'])) {
1059 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->lastname).'">'.dol_escape_htmltag($obj->lastname).'</td>';
1060 if (!$i) {
1061 $totalarray['nbfield']++;
1062 }
1063 }
1064 if (!empty($arrayfields['u.firstname']['checked'])) {
1065 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->lastname).'">'.dol_escape_htmltag($obj->firstname).'</td>';
1066 if (!$i) {
1067 $totalarray['nbfield']++;
1068 }
1069 }
1070 if (!empty($arrayfields['u.gender']['checked'])) {
1071 print '<td class="center">';
1072 if ($obj->gender) {
1073 // Preparing gender's display if there is one
1074 $addgendertxt = '';
1075 switch ($obj->gender) {
1076 case 'man':
1077 $addgendertxt .= '<i class="fas fa-mars" title="'.dol_escape_htmltag($langs->trans("Gender".$obj->gender)).'"></i>';
1078 break;
1079 case 'woman':
1080 $addgendertxt .= '<i class="fas fa-venus" title="'.dol_escape_htmltag($langs->trans("Gender".$obj->gender)).'"></i>';
1081 break;
1082 case 'other':
1083 $addgendertxt .= '<i class="fas fa-transgender" title="'.dol_escape_htmltag($langs->trans("Gender".$obj->gender)).'"></i>';
1084 break;
1085 }
1086 print $addgendertxt;
1087 //print $langs->trans("Gender".$obj->gender);
1088 }
1089 print '</td>';
1090 if (!$i) {
1091 $totalarray['nbfield']++;
1092 }
1093 }
1094 // Employee yes/no
1095 if (!empty($arrayfields['u.employee']['checked'])) {
1096 print '<td class="center">'.yn($obj->employee).'</td>';
1097 if (!$i) {
1098 $totalarray['nbfield']++;
1099 }
1100 }
1101
1102 // Supervisor
1103 if (!empty($arrayfields['u.fk_user']['checked'])) {
1104 print '<td class="tdoverflowmax125">';
1105 if ($obj->login2) {
1106 $user2->id = $obj->id2;
1107 $user2->login = $obj->login2;
1108 $user2->lastname = $obj->lastname2;
1109 $user2->firstname = $obj->firstname2;
1110 $user2->gender = $obj->gender2;
1111 $user2->photo = $obj->photo2;
1112 $user2->admin = $obj->admin2;
1113 $user2->office_phone = $obj->office_phone;
1114 $user2->user_mobile = $obj->user_mobile;
1115 $user2->email = $obj->email2;
1116 $user2->socid = $obj->fk_soc2;
1117 $user2->statut = $obj->status2;
1118 $user2->status = $obj->status2;
1119 if (isModEnabled('multicompany') && $obj->admin2 && !$obj->entity2) {
1120 print img_picto($langs->trans("SuperAdministrator"), 'redstar', 'class="valignmiddle paddingright"');
1121 } elseif ($obj->admin2) {
1122 print img_picto($langs->trans("Administrator"), 'star', 'class="valignmiddle paddingright"');
1123 }
1124 print $user2->getNomUrl(-1, '', 0, 0, 24, 0, '', '', 1);
1125 }
1126 print '</td>';
1127 if (!$i) {
1128 $totalarray['nbfield']++;
1129 }
1130 }
1131
1132 if (!empty($arrayfields['u.accountancy_code']['checked'])) {
1133 print '<td>'.$obj->accountancy_code.'</td>';
1134 if (!$i) {
1135 $totalarray['nbfield']++;
1136 }
1137 }
1138
1139 // Phone
1140 if (!empty($arrayfields['u.office_phone']['checked'])) {
1141 print '<td class="tdoverflowmax125">'.dol_print_phone($obj->office_phone, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'phone')."</td>\n";
1142 if (!$i) {
1143 $totalarray['nbfield']++;
1144 }
1145 }
1146 if (!empty($arrayfields['u.user_mobile']['checked'])) {
1147 print '<td class="tdoverflowmax125">'.dol_print_phone($obj->user_mobile, $obj->country_code, 0, $obj->rowid, 'AC_TEL', ' ', 'mobile')."</td>\n";
1148 if (!$i) {
1149 $totalarray['nbfield']++;
1150 }
1151 }
1152 if (!empty($arrayfields['u.email']['checked'])) {
1153 print '<td class="tdoverflowmax150">'.dol_print_email($obj->email, $obj->rowid, $obj->fk_soc, 'AC_EMAIL', 0, 0, 1)."</td>\n";
1154 if (!$i) {
1155 $totalarray['nbfield']++;
1156 }
1157 }
1158 if (!empty($arrayfields['u.api_key']['checked'])) {
1159 $api_key = dolDecrypt($obj->api_key);
1160 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($api_key).'">';
1161 if ($api_key) {
1162 if ($canreadsecretapi) {
1163 print '<span class="opacitymedium">';
1164 print showValueWithClipboardCPButton($object->api_key, 1, dol_trunc($api_key, 3)); // TODO Add an option to also reveal the hash, not only copy paste
1165 print '</span>';
1166 } else {
1167 print '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
1168 }
1169 }
1170 print '</td>';
1171 if (!$i) {
1172 $totalarray['nbfield']++;
1173 }
1174 }
1175 if (!empty($arrayfields['u.fk_soc']['checked'])) {
1176 print '<td class="tdoverflowmax150">';
1177 if ($obj->fk_soc > 0) {
1178 $companystatic->id = $obj->fk_soc;
1179 $companystatic->name = $obj->name;
1180 $companystatic->canvas = $obj->canvas;
1181 print $companystatic->getNomUrl(1);
1182 } elseif ($obj->ldap_sid) {
1183 print '<span class="opacitymedium">'.$langs->trans("DomainUser").'</span>';
1184 } else {
1185 print '<span class="opacitymedium">'.$langs->trans("InternalUser").'</span>';
1186 }
1187 print '</td>';
1188 if (!$i) {
1189 $totalarray['nbfield']++;
1190 }
1191 }
1192 // Multicompany enabled
1193 if (isModEnabled('multicompany') && is_object($mc) && empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1194 if (!empty($arrayfields['u.entity']['checked'])) {
1195 if (!$obj->entity) {
1196 $labeltouse = $langs->trans("AllEntities");
1197 } else {
1198 $mc->getInfo($obj->entity);
1199 $labeltouse = $mc->label;
1200 }
1201 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labeltouse).'">';
1202 print $labeltouse;
1203 print '</td>';
1204 if (!$i) {
1205 $totalarray['nbfield']++;
1206 }
1207 }
1208 }
1209
1210 // Ref employee
1211 if (!empty($arrayfields['u.ref_employee']['checked'])) {
1212 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->ref_employee).'">';
1213 print dol_escape_htmltag($obj->ref_employee);
1214 print '</td>';
1215 if (!$i) {
1216 $totalarray['nbfield']++;
1217 }
1218 }
1219 // National number
1220 if (!empty($arrayfields['u.national_registration_number']['checked'])) {
1221 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->national_registration_number).'">';
1222 print dol_escape_htmltag($obj->national_registration_number);
1223 print '</td>';
1224 if (!$i) {
1225 $totalarray['nbfield']++;
1226 }
1227 }
1228 // Job position
1229 if (!empty($arrayfields['u.job']['checked'])) {
1230 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($obj->job).'">';
1231 print dol_escape_htmltag($obj->job);
1232 print '</td>';
1233 if (!$i) {
1234 $totalarray['nbfield']++;
1235 }
1236 }
1237
1238 // Salary
1239 if (!empty($arrayfields['u.salary']['checked'])) {
1240 print '<td class="nowraponall right amount">';
1241 if ($obj->salary) {
1242 if ($canreadhrmdata) {
1243 print price($obj->salary);
1244 } else {
1245 print '<span class="opacitymedium">'.$langs->trans("Hidden").'</span>';
1246 }
1247 }
1248 print '</td>';
1249 if (!$i) {
1250 $totalarray['nbfield']++;
1251 }
1252 if (!$i) {
1253 $totalarray['pos'][$totalarray['nbfield']] = 'u.salary';
1254 }
1255 if (!isset($totalarray['val'])) {
1256 $totalarray['val'] = array();
1257 }
1258 if (!isset($totalarray['val']['u.salary'])) {
1259 $totalarray['val']['u.salary'] = 0;
1260 }
1261 $totalarray['val']['u.salary'] += $obj->salary;
1262 }
1263
1264 // Date last login
1265 if (!empty($arrayfields['u.datelastlogin']['checked'])) {
1266 print '<td class="nowrap center">'.dol_print_date($db->jdate($obj->datelastlogin), "dayhour").'</td>';
1267 if (!$i) {
1268 $totalarray['nbfield']++;
1269 }
1270 }
1271 // Date previous login
1272 if (!empty($arrayfields['u.datepreviouslogin']['checked'])) {
1273 print '<td class="nowrap center">'.dol_print_date($db->jdate($obj->datepreviouslogin), "dayhour").'</td>';
1274 if (!$i) {
1275 $totalarray['nbfield']++;
1276 }
1277 }
1278
1279 // Extra fields
1280 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1281 // Fields from hook
1282 $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
1283 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
1284 print $hookmanager->resPrint;
1285 // Date creation
1286 if (!empty($arrayfields['u.datec']['checked'])) {
1287 print '<td class="center nowraponall">';
1288 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1289 print '</td>';
1290 if (!$i) {
1291 $totalarray['nbfield']++;
1292 }
1293 }
1294 // Date modification
1295 if (!empty($arrayfields['u.tms']['checked'])) {
1296 print '<td class="center nowraponall">';
1297 print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser');
1298 print '</td>';
1299 if (!$i) {
1300 $totalarray['nbfield']++;
1301 }
1302 }
1303 // Status
1304 if (!empty($arrayfields['u.statut']['checked'])) {
1305 print '<td class="center">'.$object->getLibStatut(5).'</td>';
1306 if (!$i) {
1307 $totalarray['nbfield']++;
1308 }
1309 }
1310 // Action column
1311 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1312 print '<td class="nowrap center">';
1313 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1314 $selected = 0;
1315 if (in_array($object->id, $arrayofselected)) {
1316 $selected = 1;
1317 }
1318 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
1319 }
1320 print '</td>';
1321 if (!$i) {
1322 $totalarray['nbfield']++;
1323 }
1324 }
1325
1326 print '</tr>'."\n";
1327 }
1328
1329 $i++;
1330}
1331
1332// Show total line
1333include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1334
1335// If no record found
1336if ($num == 0) {
1337 $colspan = 1;
1338 foreach ($arrayfields as $key => $val) {
1339 if (!empty($val['checked'])) {
1340 $colspan++;
1341 }
1342 }
1343 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1344}
1345
1346
1347$db->free($resql);
1348
1349$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
1350$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1351print $hookmanager->resPrint;
1352
1353print '</table>'."\n";
1354print '</div>'."\n";
1355
1356print '</form>'."\n";
1357
1358
1359// End of page
1360llxFooter();
1361$db->close();
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:56
llxFooter()
Empty footer.
Definition wrapper.php:70
Class to manage categories.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation de composants html autre Only common components are here.
Class with static methods for building HTML components related to products Only components common to ...
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
GETPOSTINT($paramname, $method=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
dolDecrypt($chain, $key='')
Decode a string with a symetric encryption.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.