dolibarr  19.0.0-dev
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 
36 // load hrm libraries
37 require_once __DIR__.'/class/position.class.php';
38 
39 // for other modules
40 //dol_include_once('/othermodule/class/otherobject.class.php');
41 
42 // Load translation files required by the page
43 $langs->loadLangs(array('hrm', 'other'));
44 
45 // Get Parameters
46 $action = GETPOST('action', 'aZ09') ?GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
47 $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
48 $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
49 $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
50 $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
51 $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
52 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'positionlist'; // To manage different context of search
53 $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
54 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
55 $mode = GETPOST('mode', 'aZ');
56 
57 $id = GETPOST('id', 'int');
58 $ref = GETPOST('ref', 'alpha');
59 
60 // Load variable for pagination
61 $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit;
62 $sortfield = GETPOST('sortfield', 'aZ09comma');
63 $sortorder = GETPOST('sortorder', 'aZ09comma');
64 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
65 if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
66  // If $page is not defined, or '' or -1 or if we click on clear filters
67  $page = 0;
68 }
69 $offset = $limit * $page;
70 $pageprev = $page - 1;
71 $pagenext = $page + 1;
72 
73 // Initialize technical objects
74 $object = new Position($db);
75 $extrafields = new ExtraFields($db);
76 $userstatic = new User($db);
77 $diroutputmassaction = $conf->hrm->dir_output.'/temp/massgeneration/'.$user->id;
78 $hookmanager->initHooks(array('positionlist')); // Note that conf->hooks_modules contains array
79 
80 // Fetch optionals attributes and labels
81 $extrafields->fetch_name_optionals_label($object->table_element);
82 //$extrafields->fetch_name_optionals_label($object->table_element_line);
83 
84 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
85 
86 // Default sort order (if not yet defined by previous GETPOST)
87 if (!$sortfield) {
88  reset($object->fields); // Reset is required to avoid key() to return null.
89  $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
90 }
91 if (!$sortorder) {
92  $sortorder = "ASC";
93 }
94 
95 // Initialize array of search criterias
96 $search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
97 $search = array();
98 foreach ($object->fields as $key => $val) {
99  if (GETPOST('search_'.$key, 'alpha') !== '') {
100  $search[$key] = GETPOST('search_'.$key, 'alpha');
101  }
102  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
103  $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOST('search_'.$key.'_dtstartmonth', 'int'), GETPOST('search_'.$key.'_dtstartday', 'int'), GETPOST('search_'.$key.'_dtstartyear', 'int'));
104  $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOST('search_'.$key.'_dtendmonth', 'int'), GETPOST('search_'.$key.'_dtendday', 'int'), GETPOST('search_'.$key.'_dtendyear', 'int'));
105  }
106 }
107 
108 // List of fields to search into when doing a "search in all"
109 $fieldstosearchall = array();
110 foreach ($object->fields as $key => $val) {
111  if (!empty($val['searchall'])) {
112  $fieldstosearchall['t.'.$key] = $val['label'];
113  }
114 }
115 
116 // Definition of array of fields for columns
117 $arrayfields = array();
118 foreach ($object->fields as $key => $val) {
119  // If $val['visible']==0, then we never show the field
120  if (!empty($val['visible'])) {
121  $visible = (int) dol_eval($val['visible'], 1);
122  $arrayfields['t.'.$key] = array(
123  'label'=>$val['label'],
124  'checked'=>(($visible < 0) ? 0 : 1),
125  'enabled'=>(abs($visible) != 3 && dol_eval($val['enabled'], 1)),
126  'position'=>$val['position'],
127  'help'=> isset($val['help']) ? $val['help'] : ''
128  );
129  }
130 }
131 // Extra fields
132 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
133 
134 $object->fields = dol_sort_array($object->fields, 'position');
135 $arrayfields = dol_sort_array($arrayfields, 'position');
136 
137 // Permissions
138 $permissiontoread = $user->rights->hrm->all->read;
139 $permissiontoadd = $user->rights->hrm->all->write;
140 $permissiontodelete = $user->rights->hrm->all->delete;
141 
142 // Security check (enable the most restrictive one)
143 if ($user->socid > 0) accessforbidden();
144 //if ($user->socid > 0) accessforbidden();
145 //$socid = 0; if ($user->socid > 0) $socid = $user->socid;
146 //$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
147 //restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
148 if (!isModEnabled('hrm')) {
149  accessforbidden('Module hrm not enabled');
150 }
151 if (!$permissiontoread) accessforbidden();
152 
153 
154 
155 /*
156  * Actions
157  */
158 
159 if (GETPOST('cancel', 'alpha')) {
160  $action = 'list';
161  $massaction = '';
162 }
163 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
164  $massaction = '';
165 }
166 
167 $parameters = array();
168 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
169 if ($reshook < 0) {
170  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
171 }
172 
173 if (empty($reshook)) {
174  // Selection of new fields
175  include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
176 
177  // Purge search criteria
178  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
179  foreach ($object->fields as $key => $val) {
180  $search[$key] = '';
181  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
182  $search[$key.'_dtstart'] = '';
183  $search[$key.'_dtend'] = '';
184  }
185  }
186  $toselect = array();
187  $search_array_options = array();
188  }
189  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
190  || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
191  $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
192  }
193 
194  // Mass actions
195  $objectclass = 'Position';
196  $objectlabel = 'Position';
197  $uploaddir = $conf->hrm->dir_output;
198  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
199 }
200 
201 
202 
203 /*
204  * View
205  */
206 
207 $form = new Form($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');
224 $sql .= ',u.email, u.statut';
225 $sql .= ',j.rowid, 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_label;
624 
625  $userstatic->id = $obj->fk_user;
626  $userstatic->ref = $obj->fk_user;
627  $userstatic->firstname = $obj->firstname;
628  $userstatic->lastname = $obj->lastname;
629  $userstatic->email = $obj->email;
630  $userstatic->statut = $obj->statut;
631 
632  // output kanban
633  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
634  $selected = 0;
635  if (in_array($object->id, $arrayofselected)) {
636  $selected = 1;
637  }
638  print $object->getKanbanView('', array('user' => $userstatic->getNomUrl(1), 'selected' => in_array($object->id, $arrayofselected)));
639  }
640  if ($i == ($imaxinloop - 1)) {
641  print '</div>';
642  print '</td></tr>';
643  }
644  } else {
645  // Show here line of result
646  $j = 0;
647  print '<tr data-rowid="'.$object->id.'" class="oddeven">';
648  // Action column
649  if (!empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
650  print '<td class="nowrap center">';
651  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
652  $selected = 0;
653  if (in_array($object->id, $arrayofselected)) {
654  $selected = 1;
655  }
656  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
657  }
658  print '</td>';
659  }
660  foreach ($object->fields as $key => $val) {
661  $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
662  if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
663  $cssforfield .= ($cssforfield ? ' ' : '').'center';
664  } elseif ($key == 'status') {
665  $cssforfield .= ($cssforfield ? ' ' : '').'center';
666  }
667 
668  if (in_array($val['type'], array('timestamp'))) {
669  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
670  } elseif ($key == 'ref') {
671  $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
672  }
673 
674  if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
675  $cssforfield .= ($cssforfield ? ' ' : '').'right';
676  }
677  //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
678 
679  if (!empty($arrayfields['t.'.$key]['checked'])) {
680  print '<td'.($cssforfield ? ' class="'.$cssforfield.(preg_match('/tdoverflow/', $cssforfield) ? ' classfortooltip' : '').'"' : '');
681  if (preg_match('/tdoverflow/', $cssforfield) && !is_numeric($object->$key)) {
682  print ' title="'.dol_escape_htmltag($object->$key).'"';
683  }
684  print '>';
685  if ($key == 'status') {
686  print $object->getLibStatut(5);
687  } elseif ($key == 'rowid') {
688  print $object->showOutputField($val, $key, $object->id, '');
689  } else {
690  print $object->showOutputField($val, $key, $object->$key, '');
691  }
692  print '</td>';
693  if (!$i) {
694  $totalarray['nbfield']++;
695  }
696  if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
697  if (!$i) {
698  $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
699  }
700  if (!isset($totalarray['val'])) {
701  $totalarray['val'] = array();
702  }
703  if (!isset($totalarray['val']['t.'.$key])) {
704  $totalarray['val']['t.'.$key] = 0;
705  }
706  $totalarray['val']['t.'.$key] += $object->$key;
707  }
708  }
709  }
710  // Extra fields
711  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
712  // Fields from hook
713  $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
714  $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object); // Note that $action and $object may have been modified by hook
715  print $hookmanager->resPrint;
716  // Action column
717  if (empty($conf->global->MAIN_CHECKBOX_LEFT_COLUMN)) {
718  print '<td class="nowrap center">';
719  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
720  $selected = 0;
721  if (in_array($object->id, $arrayofselected)) {
722  $selected = 1;
723  }
724  print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
725  }
726  print '</td>';
727  }
728  if (!$i) {
729  $totalarray['nbfield']++;
730  }
731 
732  print '</tr>'."\n";
733  }
734 
735  $i++;
736 }
737 
738 // Show total line
739 include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
740 
741 // If no record found
742 if ($num == 0) {
743  $colspan = 1;
744  foreach ($arrayfields as $key => $val) {
745  if (!empty($val['checked'])) {
746  $colspan++;
747  }
748  }
749  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
750 }
751 
752 
753 $db->free($resql);
754 
755 $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
756 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
757 print $hookmanager->resPrint;
758 
759 print '</table>'."\n";
760 print '</div>'."\n";
761 
762 print '</form>'."\n";
763 
764 if (in_array('builddoc', $arrayofmassactions) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
765  $hidegeneratedfilelistifempty = 1;
766  if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
767  $hidegeneratedfilelistifempty = 0;
768  }
769 
770  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
771  $formfile = new FormFile($db);
772 
773  // Show list of available documents
774  $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
775  $urlsource .= str_replace('&amp;', '&', $param);
776 
777  $filedir = $diroutputmassaction;
778  $genallowed = $permissiontoread;
779  $delallowed = $permissiontoadd;
780 
781  print $formfile->showdocuments('massfilesarea_hrm', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
782 }
783 
784 // End of page
785 llxFooter();
786 $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 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.