dolibarr  18.0.6
position_list.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2007-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
4  * Copyright (C) 2021 Greg Rastklan <greg.rastklan@atm-consulting.fr>
5  * Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
6  * Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
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 
29 // Load Dolibarr environment
30 require '../main.inc.php';
31 
32 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
35 require_once DOL_DOCUMENT_ROOT.'/hrm/class/job.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/hrm/class/position.class.php';
37 
38 // for other modules
39 //dol_include_once('/othermodule/class/otherobject.class.php');
40 
41 // Load translation files required by the page
42 $langs->loadLangs(array('hrm', 'other'));
43 
44 // Get Parameters
45 $action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
46 $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
47 $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
48 $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
49 $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
50 $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
51 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'positionlist'; // To manage different context of search
52 $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
53 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
54 $mode = GETPOST('mode', 'aZ');
55 
56 $id = GETPOST('id', 'int');
57 $ref = GETPOST('ref', 'alpha');
58 
59 // Load variable for pagination
60 $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
61 $sortfield = GETPOST('sortfield', 'aZ09comma');
62 $sortorder = GETPOST('sortorder', 'aZ09comma');
63 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
64 if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
65  // If $page is not defined, or '' or -1 or if we click on clear filters
66  $page = 0;
67 }
68 $offset = $limit * $page;
69 $pageprev = $page - 1;
70 $pagenext = $page + 1;
71 
72 // Initialize technical objects
73 $object = new Position($db);
74 $extrafields = new ExtraFields($db);
75 $userstatic = new User($db);
76 $diroutputmassaction = $conf->hrm->dir_output.'/temp/massgeneration/'.$user->id;
77 $hookmanager->initHooks(array('positionlist')); // Note that conf->hooks_modules contains array
78 
79 // Fetch optionals attributes and labels
80 $extrafields->fetch_name_optionals_label($object->table_element);
81 //$extrafields->fetch_name_optionals_label($object->table_element_line);
82 
83 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
84 
85 // Default sort order (if not yet defined by previous GETPOST)
86 if (!$sortfield) {
87  reset($object->fields); // Reset is required to avoid key() to return null.
88  $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
89 }
90 if (!$sortorder) {
91  $sortorder = "ASC";
92 }
93 
94 // Initialize array of search criterias
95 $search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
96 $search = array();
97 foreach ($object->fields as $key => $val) {
98  if (GETPOST('search_'.$key, 'alpha') !== '') {
99  $search[$key] = GETPOST('search_'.$key, 'alpha');
100  }
101  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
102  $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
103  $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
104  }
105 }
106 
107 // List of fields to search into when doing a "search in all"
108 $fieldstosearchall = array();
109 foreach ($object->fields as $key => $val) {
110  if (!empty($val['searchall'])) {
111  $fieldstosearchall['t.'.$key] = $val['label'];
112  }
113 }
114 
115 // Definition of array of fields for columns
116 $arrayfields = array();
117 foreach ($object->fields as $key => $val) {
118  // If $val['visible']==0, then we never show the field
119  if (!empty($val['visible'])) {
120  $visible = (int) dol_eval($val['visible'], 1);
121  $arrayfields['t.'.$key] = array(
122  'label'=>$val['label'],
123  'checked'=>(($visible < 0) ? 0 : 1),
124  'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)),
125  'position'=>$val['position'],
126  'help'=> isset($val['help']) ? $val['help'] : ''
127  );
128  }
129 }
130 // Extra fields
131 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
132 
133 $object->fields = dol_sort_array($object->fields, 'position');
134 $arrayfields = dol_sort_array($arrayfields, 'position');
135 
136 // Permissions
137 $permissiontoread = $user->rights->hrm->all->read;
138 $permissiontoadd = $user->rights->hrm->all->write;
139 $permissiontodelete = $user->rights->hrm->all->delete;
140 
141 // Security check (enable the most restrictive one)
142 if ($user->socid > 0) accessforbidden();
143 //if ($user->socid > 0) accessforbidden();
144 //$socid = 0; if ($user->socid > 0) $socid = $user->socid;
145 //$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
146 //restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
147 if (!isModEnabled('hrm')) {
148  accessforbidden('Module hrm not enabled');
149 }
150 if (!$permissiontoread) accessforbidden();
151 
152 
153 
154 /*
155  * Actions
156  */
157 
158 if (GETPOST('cancel', 'alpha')) {
159  $action = 'list';
160  $massaction = '';
161 }
162 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
163  $massaction = '';
164 }
165 
166 $parameters = array();
167 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
168 if ($reshook < 0) {
169  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
170 }
171 
172 if (empty($reshook)) {
173  // Selection of new fields
174  include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
175 
176  // Purge search criteria
177  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
178  foreach ($object->fields as $key => $val) {
179  $search[$key] = '';
180  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
181  $search[$key.'_dtstart'] = '';
182  $search[$key.'_dtend'] = '';
183  }
184  }
185  $toselect = array();
186  $search_array_options = array();
187  }
188  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
189  || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
190  $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
191  }
192 
193  // Mass actions
194  $objectclass = 'Position';
195  $objectlabel = 'Position';
196  $uploaddir = $conf->hrm->dir_output;
197  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
198 }
199 
200 
201 
202 /*
203  * View
204  */
205 
206 $form = new Form($db);
207 $jobstatic = new Job($db);
208 
209 $now = dol_now();
210 
211 //$help_url="EN:Module_Position|FR:Module_Position_FR|ES:Módulo_Position";
212 $help_url = '';
213 $title = $langs->trans('EmployeePositions');
214 $morejs = array();
215 $morecss = array();
216 
217 
218 // Build and execute select
219 // --------------------------------------------------------------------
220 $sql = 'SELECT ';
221 $sql .= $object->getFieldList('t');
222 $sql .= ',';
223 $sql .= $userstatic->getFieldList('u', array('rowid'));
224 $sql .= ', u.email, u.statut, u.photo, u.login'; // Add more field not yet into the user->fields
225 $sql .= ', j.rowid as job_id, j.label as job_label';
226 // Add fields from extrafields
227 if (!empty($extrafields->attributes[$object->table_element]['label'])) {
228  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
229  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
230  }
231 }
232 // Add fields from hooks
233 $parameters = array();
234 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object); // Note that $action and $object may have been modified by hook
235 $sql .= $hookmanager->resPrint;
236 $sql = preg_replace('/,\s*$/', '', $sql);
237 $sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t LEFT JOIN ".MAIN_DB_PREFIX.$userstatic->table_element." as u on t.fk_user = u.rowid, ".MAIN_DB_PREFIX."hrm_job as j";
238 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
239  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
240 }
241 // Add table from hooks
242 $parameters = array();
243 $reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
244 $sql .= $hookmanager->resPrint;
245 if ($object->ismultientitymanaged == 1) {
246  $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
247 } else {
248  $sql .= " WHERE 1 = 1";
249 }
250 $sql .= " AND t.fk_job = j.rowid";
251 foreach ($search as $key => $val) {
252  if (array_key_exists($key, $object->fields)) {
253  if ($key == 'status' && $search[$key] == -1) {
254  continue;
255  }
256  $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
257  if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
258  if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
259  $search[$key] = '';
260  }
261  $mode_search = 2;
262  }
263  if ($search[$key] != '') {
264  $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
265  }
266  } else {
267  if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
268  $columnName=preg_replace('/(_dtstart|_dtend)$/', '', $key);
269  if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
270  if (preg_match('/_dtstart$/', $key)) {
271  $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
272  }
273  if (preg_match('/_dtend$/', $key)) {
274  $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
275  }
276  }
277  }
278  }
279 }
280 $vacant = GETPOST('search_fk_uservacant', 'alphanohtml') === 'on';
281 if ($vacant) {
282  $sql .= ' AND t.fk_user = 0';
283 }
284 if ($search_all) {
285  $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
286 }
287 //$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
288 // Add where from extra fields
289 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
290 // Add where from hooks
291 $parameters = array();
292 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object); // Note that $action and $object may have been modified by hook
293 $sql .= $hookmanager->resPrint;
294 
295 /* If a group by is required
296 $sql .= " GROUP BY ";
297 foreach($object->fields as $key => $val) {
298  $sql .= "t.".$db->escape($key).", ";
299 }
300 // Add fields from extrafields
301 if (!empty($extrafields->attributes[$object->table_element]['label'])) {
302  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
303  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
304  }
305 }
306 // Add where from hooks
307 $parameters = array();
308 $reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
309 $sql .= $hookmanager->resPrint;
310 $sql = preg_replace('/,\s*$/', '', $sql);
311 */
312 
313 // Count total nb of records
314 $nbtotalofrecords = '';
315 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
316  $resql = $db->query($sql);
317  $nbtotalofrecords = $db->num_rows($resql);
318  if (($page * $limit) > $nbtotalofrecords) { // if total of record found is smaller than page * limit, goto and load page 0
319  $page = 0;
320  $offset = 0;
321  }
322  $db->free($resql);
323 }
324 
325 // Complete request and execute it with limit
326 $sql .= $db->order($sortfield, $sortorder);
327 if ($limit) {
328  $sql .= $db->plimit($limit + 1, $offset);
329 }
330 
331 $resql = $db->query($sql);
332 if (!$resql) {
333  dol_print_error($db);
334  exit;
335 }
336 
337 $num = $db->num_rows($resql);
338 
339 
340 // Direct jump if only one record found
341 if ($num == 1 && !empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all && !$page) {
342  $obj = $db->fetch_object($resql);
343  $id = $obj->rowid;
344  header("Location: ".dol_buildpath('/hrm/position.php', 1).'?id='.$id);
345  exit;
346 }
347 
348 
349 // Output page
350 // --------------------------------------------------------------------
351 
352 llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', '');
353 
354 // Example : Adding jquery code
355 // print '<script type="text/javascript" language="javascript">
356 // jQuery(document).ready(function() {
357 // function init_myfunc()
358 // {
359 // jQuery("#myid").removeAttr(\'disabled\');
360 // jQuery("#myid").attr(\'disabled\',\'disabled\');
361 // }
362 // init_myfunc();
363 // jQuery("#mybutton").click(function() {
364 // init_myfunc();
365 // });
366 // });
367 // </script>';
368 
369 $arrayofselected = is_array($toselect) ? $toselect : array();
370 
371 $param = '';
372 if (!empty($mode)) {
373  $param .= '&mode='.urlencode($mode);
374 }
375 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
376  $param .= '&contextpage='.urlencode($contextpage);
377 }
378 if ($limit > 0 && $limit != $conf->liste_limit) {
379  $param .= '&limit='.((int) $limit);
380 }
381 
382 foreach ($search as $key => $val) {
383  if (is_array($search[$key])) {
384  foreach ($search[$key] as $skey) {
385  if ($skey != '') {
386  $param .= '&search_'.$key.'[]='.urlencode($skey);
387  }
388  }
389  } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
390  $param .= '&search_'.$key.'month='.((int) GETPOST('search_'.$key.'month', 'int'));
391  $param .= '&search_'.$key.'day='.((int) GETPOST('search_'.$key.'day', 'int'));
392  $param .= '&search_'.$key.'year='.((int) GETPOST('search_'.$key.'year', 'int'));
393  } elseif ($search[$key] != '') {
394  $param .= '&search_'.$key.'='.urlencode($search[$key]);
395  }
396 }
397 if ($optioncss != '') {
398  $param .= '&optioncss='.urlencode($optioncss);
399 }
400 // Add $param from extra fields
401 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
402 // Add $param from hooks
403 $parameters = array();
404 $reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
405 $param .= $hookmanager->resPrint;
406 
407 // List of mass actions available
408 $arrayofmassactions = array(
409  //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
410  //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
411  //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
412  //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
413 );
414 if (!empty($permissiontodelete)) {
415  $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
416 }
417 if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
418  $arrayofmassactions = array();
419 }
420 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
421 
422 print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
423 if ($optioncss != '') {
424  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
425 }
426 print '<input type="hidden" name="token" value="'.newToken().'">';
427 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
428 print '<input type="hidden" name="action" value="list">';
429 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
430 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
431 print '<input type="hidden" name="page" value="'.$page.'">';
432 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
433 print '<input type="hidden" name="mode" value="'.$mode.'">';
434 
435 $newcardbutton = '';
436 $newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
437 $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'));
438 $newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/position.php', 1).'?action=create', '', $permissiontoadd);
439 
440 print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
441 
442 // Add code for pre mass action (confirmation or email presend form)
443 $topicmail = "SendPositionRef";
444 $modelmail = "position";
445 $objecttmp = new Position($db);
446 $trackid = 'xxxx'.$object->id;
447 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
448 
449 if ($search_all) {
450  $setupstring = '';
451  foreach ($fieldstosearchall as $key => $val) {
452  $fieldstosearchall[$key] = $langs->trans($val);
453  $setupstring .= $key."=".$val.";";
454  }
455  print '<!-- Search done like if JOBPOSITION_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
456  print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).join(', ', $fieldstosearchall).'</div>';
457 }
458 
459 $moreforfilter = '';
460 /*$moreforfilter.='<div class="divsearchfield">';
461 $moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
462 $moreforfilter.= '</div>';*/
463 
464 $parameters = array();
465 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
466 if (empty($reshook)) {
467  $moreforfilter .= $hookmanager->resPrint;
468 } else {
469  $moreforfilter = $hookmanager->resPrint;
470 }
471 
472 if (!empty($moreforfilter)) {
473  print '<div class="liste_titre liste_titre_bydiv centpercent">';
474  print $moreforfilter;
475  print '</div>';
476 }
477 
478 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
479 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')); // This also change content of $arrayfields
480 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
481 
482 print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
483 print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
484 
485 
486 // Fields title search
487 // --------------------------------------------------------------------
488 print '<tr class="liste_titre">';
489 // Action column
490 if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
491  print '<td class="liste_titre maxwidthsearch">';
492  $searchpicto = $form->showFilterButtons('left');
493  print $searchpicto;
494  print '</td>';
495 }
496 foreach ($object->fields as $key => $val) {
497  $searchkey = empty($search[$key]) ? '' : $search[$key];
498  $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
499  if ($key == 'status') {
500  $cssforfield .= ($cssforfield ? ' ' : '').'center';
501  } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
502  $cssforfield .= ($cssforfield ? ' ' : '').'center';
503  } elseif (in_array($val['type'], array('timestamp'))) {
504  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
505  } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
506  $cssforfield .= ($cssforfield ? ' ' : '').'right';
507  }
508  if (!empty($arrayfields['t.'.$key]['checked'])) {
509  print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').'">';
510  if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
511  print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100', 1);
512  } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
513  print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
514  } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
515  print '<div class="nowrap">';
516  print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
517  print '</div>';
518  print '<div class="nowrap">';
519  print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
520  print '</div>';
521  } elseif ($key == 'lang') {
522  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
523  $formadmin = new FormAdmin($db);
524  print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth150 maxwidth200', 2);
525  } else {
526  print '<input type="text" class="flat maxwidth75" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
527  }
528  print '</td>';
529  }
530 }
531 // Extra fields
532 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
533 
534 // Fields from hook
535 $parameters = array('arrayfields'=>$arrayfields);
536 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
537 print $hookmanager->resPrint;
538 // Action column
539 if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
540  print '<td class="liste_titre maxwidthsearch">';
541  $searchpicto = $form->showFilterButtons();
542  print $searchpicto;
543  print '</td>';
544 }
545 print '</tr>'."\n";
546 
547 $totalarray = array();
548 $totalarray['nbfield'] = 0;
549 
550 // Fields title label
551 // --------------------------------------------------------------------
552 print '<tr class="liste_titre">';
553 if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
554  print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
555 }
556 foreach ($object->fields as $key => $val) {
557  $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
558  if ($key == 'status') {
559  $cssforfield .= ($cssforfield ? ' ' : '').'center';
560  } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
561  $cssforfield .= ($cssforfield ? ' ' : '').'center';
562  } elseif (in_array($val['type'], array('timestamp'))) {
563  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
564  } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
565  $cssforfield .= ($cssforfield ? ' ' : '').'right';
566  }
567  $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
568  if (!empty($arrayfields['t.'.$key]['checked'])) {
569  print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''))."\n";
570  $totalarray['nbfield']++;
571  }
572 }
573 // Extra fields
574 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
575 // Hook fields
576 $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
577 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
578 print $hookmanager->resPrint;
579 // Action column
580 if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
581  print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
582 }
583 $totalarray['nbfield']++;
584 print '</tr>'."\n";
585 
586 
587 // Detect if we need a fetch on each output line
588 $needToFetchEachLine = 0;
589 if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
590  foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
591  if (!is_null($val) && preg_match('/\$object/', $val)) {
592  $needToFetchEachLine++; // There is at least one compute field that use $object
593  }
594  }
595 }
596 
597 
598 // Loop on record
599 // --------------------------------------------------------------------
600 $i = 0;
601 $savnbfield = $totalarray['nbfield'];
602 $totalarray = array();
603 $totalarray['nbfield'] = 0;
604 $imaxinloop = ($limit ? min($num, $limit) : $num);
605 while ($i < $imaxinloop) {
606  $obj = $db->fetch_object($resql);
607  if (empty($obj)) {
608  break; // Should not happen
609  }
610 
611  // Store properties in $object
612  $object->setVarsFromFetchObj($obj);
613 
614 
615  if ($mode == 'kanban') {
616  if ($i == 0) {
617  print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
618  print '<div class="box-flex-container kanban">';
619  }
620  // get info needed
621  $object->date_start = $obj->date_start;
622  $object->date_end = $obj->date_end;
623  $object->fk_job = $obj->job_id;
624 
625  $jobstatic->id = $obj->job_id;
626  $jobstatic->label = $obj->job_label;
627  $jobstatic->status = $obj->job_status;
628 
629  $userstatic->id = $obj->fk_user;
630  $userstatic->ref = $obj->fk_user;
631  $userstatic->firstname = $obj->firstname;
632  $userstatic->lastname = $obj->lastname;
633  $userstatic->email = $obj->email;
634  $userstatic->statut = $obj->statut;
635  $userstatic->status = $obj->statut;
636  $userstatic->login = $obj->login;
637  $userstatic->photo = $obj->photo;
638 
639  // output kanban
640  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
641  $selected = 0;
642  if (in_array($object->id, $arrayofselected)) {
643  $selected = 1;
644  }
645  print $object->getKanbanView('', array('user' => $userstatic->getNomUrl(-1), 'job'=> $jobstatic->getNomUrl(1), 'selected' => in_array($object->id, $arrayofselected)));
646  }
647  if ($i == ($imaxinloop - 1)) {
648  print '</div>';
649  print '</td></tr>';
650  }
651  } else {
652  // Show here line of result
653  $j = 0;
654  print '<tr data-rowid="'.$object->id.'" class="oddeven">';
655  // Action column
656  if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
657  print '<td class="nowrap center">';
658  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
659  $selected = 0;
660  if (in_array($object->id, $arrayofselected)) {
661  $selected = 1;
662  }
663  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
664  }
665  print '</td>';
666  }
667  foreach ($object->fields as $key => $val) {
668  $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
669  if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
670  $cssforfield .= ($cssforfield ? ' ' : '').'center';
671  } elseif ($key == 'status') {
672  $cssforfield .= ($cssforfield ? ' ' : '').'center';
673  }
674 
675  if (in_array($val['type'], array('timestamp'))) {
676  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
677  } elseif ($key == 'ref') {
678  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
679  }
680 
681  if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
682  $cssforfield .= ($cssforfield ? ' ' : '').'right';
683  }
684  //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
685 
686  if (!empty($arrayfields['t.'.$key]['checked'])) {
687  print '<td'.($cssforfield ? ' class="'.$cssforfield.(preg_match('/tdoverflow/', $cssforfield) ? ' classfortooltip' : '').'"' : '');
688  if (preg_match('/tdoverflow/', $cssforfield) && !is_numeric($object->$key)) {
689  print ' title="'.dol_escape_htmltag($object->$key).'"';
690  }
691  print '>';
692  if ($key == 'status') {
693  print $object->getLibStatut(5);
694  } elseif ($key == 'rowid') {
695  print $object->showOutputField($val, $key, $object->id, '');
696  } else {
697  print $object->showOutputField($val, $key, $object->$key, '');
698  }
699  print '</td>';
700  if (!$i) {
701  $totalarray['nbfield']++;
702  }
703  if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
704  if (!$i) {
705  $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
706  }
707  if (!isset($totalarray['val'])) {
708  $totalarray['val'] = array();
709  }
710  if (!isset($totalarray['val']['t.'.$key])) {
711  $totalarray['val']['t.'.$key] = 0;
712  }
713  $totalarray['val']['t.'.$key] += $object->$key;
714  }
715  }
716  }
717  // Extra fields
718  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
719  // Fields from hook
720  $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
721  $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
722  print $hookmanager->resPrint;
723  // Action column
724  if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
725  print '<td class="nowrap center">';
726  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
727  $selected = 0;
728  if (in_array($object->id, $arrayofselected)) {
729  $selected = 1;
730  }
731  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
732  }
733  print '</td>';
734  }
735  if (!$i) {
736  $totalarray['nbfield']++;
737  }
738 
739  print '</tr>'."\n";
740  }
741 
742  $i++;
743 }
744 
745 // Show total line
746 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
747 
748 // If no record found
749 if ($num == 0) {
750  $colspan = 1;
751  foreach ($arrayfields as $key => $val) {
752  if (!empty($val['checked'])) {
753  $colspan++;
754  }
755  }
756  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
757 }
758 
759 
760 $db->free($resql);
761 
762 $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
763 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
764 print $hookmanager->resPrint;
765 
766 print '</table>'."\n";
767 print '</div>'."\n";
768 
769 print '</form>'."\n";
770 
771 if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
772  $hidegeneratedfilelistifempty = 1;
773  if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
774  $hidegeneratedfilelistifempty = 0;
775  }
776 
777  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
778  $formfile = new FormFile($db);
779 
780  // Show list of available documents
781  $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
782  $urlsource .= str_replace('&amp;', '&', $param);
783 
784  $filedir = $diroutputmassaction;
785  $genallowed = $permissiontoread;
786  $delallowed = $permissiontoadd;
787 
788  print $formfile->showdocuments('massfilesarea_hrm', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
789 }
790 
791 // End of page
792 llxFooter();
793 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
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 standard extra fields.
Class to generate html code for admin pages.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class for Job.
Definition: job.class.php:37
Class for Position.
Class to manage Dolibarr users.
Definition: user.class.php:48
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
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...
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...
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...
dol_eval($s, $returnvalue=0, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
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_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.