dolibarr  19.0.0-dev
list.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2011 Dimitri Mouillard <dmouillard@teclib.com>
3  * Copyright (C) 2013-2020 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2012-2016 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2018 Charlene Benke <charlie@patas-monkey.com>
6  * Copyright (C) 2019-2023 Frédéric France <frederic.france@netlogic.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 
28 // Load Dolibarr environment
29 require '../main.inc.php';
30 require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
31 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
34 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php';
39 
40 // Load translation files required by the page
41 $langs->loadLangs(array('users', 'other', 'holiday', 'hrm'));
42 
43 // Protection if external user
44 if ($user->socid > 0) {
46 }
47 
48 $action = GETPOST('action', 'aZ09'); // The action 'add', 'create', 'edit', 'update', 'view', ...
49 $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
50 $show_files = GETPOST('show_files', 'int'); // Show files area generated by bulk actions ?
51 $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
52 $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
53 $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
54 $contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'holidaylist'; // To manage different context of search
55 $mode = GETPOST('mode', 'alpha'); // for switch mode view result
56 
57 $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
58 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
59 
60 $id = GETPOST('id', 'int');
61 
62 $childids = $user->getAllChildIds(1);
63 
64 
65 $diroutputmassaction = $conf->holiday->dir_output.'/temp/massgeneration/'.$user->id;
66 
67 
68 // Load variable for pagination
69 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
70 $sortfield = GETPOST('sortfield', 'aZ09comma');
71 $sortorder = GETPOST('sortorder', 'aZ09comma');
72 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
73 if (empty($page) || $page == -1) {
74  $page = 0;
75 } // If $page is not defined, or '' or -1
76 $offset = $limit * $page;
77 $pageprev = $page - 1;
78 $pagenext = $page + 1;
79 if (!$sortorder) {
80  $sortorder = "DESC";
81 }
82 if (!$sortfield) {
83  $sortfield = "cp.ref";
84 }
85 
86 $sall = trim((GETPOST('search_all', 'alphanohtml') != '') ?GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml'));
87 $search_ref = GETPOST('search_ref', 'alphanohtml');
88 $search_day_create = GETPOST('search_day_create', 'int');
89 $search_month_create = GETPOST('search_month_create', 'int');
90 $search_year_create = GETPOST('search_year_create', 'int');
91 $search_day_start = GETPOST('search_day_start', 'int');
92 $search_month_start = GETPOST('search_month_start', 'int');
93 $search_year_start = GETPOST('search_year_start', 'int');
94 $search_day_end = GETPOST('search_day_end', 'int');
95 $search_month_end = GETPOST('search_month_end', 'int');
96 $search_year_end = GETPOST('search_year_end', 'int');
97 $search_employee = GETPOST('search_employee', 'int');
98 $search_valideur = GETPOST('search_valideur', 'int');
99 $search_status = GETPOSTISSET('search_status') ? GETPOST('search_status', 'int') : GETPOST('search_statut', 'int');
100 $search_type = GETPOST('search_type', 'int');
101 
102 // Initialize technical objects
103 $object = new Holiday($db);
104 $extrafields = new ExtraFields($db);
105 $hookmanager->initHooks(array('holidaylist')); // Note that conf->hooks_modules contains array
106 
107 // Fetch optionals attributes and labels
108 $extrafields->fetch_name_optionals_label($object->table_element);
109 
110 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
111 
112 // List of fields to search into when doing a "search in all"
113 $fieldstosearchall = array(
114  'cp.ref'=>'Ref',
115  'cp.description'=>'Description',
116  'uu.lastname'=>'EmployeeLastname',
117  'uu.firstname'=>'EmployeeFirstname',
118  'uu.login'=>'Login'
119 );
120 
121 $arrayfields = array(
122  'cp.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1),
123  'cp.fk_user'=>array('label'=>$langs->trans("Employee"), 'checked'=>1, 'position'=>20),
124  'cp.fk_validator'=>array('label'=>$langs->trans("ValidatorCP"), 'checked'=>1, 'position'=>30),
125  'cp.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1, 'position'=>35),
126  'duration'=>array('label'=>$langs->trans("NbUseDaysCPShort"), 'checked'=>1, 'position'=>38),
127  'cp.date_debut'=>array('label'=>$langs->trans("DateStart"), 'checked'=>1, 'position'=>40),
128  'cp.date_fin'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1, 'position'=>42),
129  'cp.date_valid'=>array('label'=>$langs->trans("DateValidation"), 'checked'=>1, 'position'=>60),
130  'cp.date_approval'=>array('label'=>$langs->trans("DateApprove"), 'checked'=>1, 'position'=>70),
131  'cp.date_create'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500),
132  'cp.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>501),
133  'cp.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
134 );
135 // Extra fields
136 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
137 
138 
139 // Security check
140 $socid = 0;
141 if ($user->socid > 0) { // Protection if external user
142  //$socid = $user->socid;
143  accessforbidden();
144 }
145 
146 $permissiontoread = $user->hasRight('holiday', 'read');
147 $permissiontodelete = $user->hasRight('holiday', 'delete');
148 $permissiontoapprove = $user->hasRight('holiday', 'approve');
149 
150 if (!ismodEnabled('holiday')) {
151  accessforbidden('Module holiday not enabled');
152 }
153 
154 $result = restrictedArea($user, 'holiday', '', '');
155 // If we are on the view of a specific user
156 if ($id > 0) {
157  $canread = 0;
158  if ($id == $user->id) {
159  $canread = 1;
160  }
161  if ($user->hasRight('holiday', 'readall')) {
162  $canread = 1;
163  }
164  if ($user->hasRight('holiday', 'read') && in_array($id, $childids)) {
165  $canread = 1;
166  }
167  if (!$canread) {
168  accessforbidden();
169  }
170 }
171 
172 
173 
174 /*
175  * Actions
176  */
177 
178 if (GETPOST('cancel', 'alpha')) {
179  $action = 'list';
180  $massaction = '';
181 }
182 if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
183  $massaction = '';
184 }
185 
186 $parameters = array('socid'=>$socid);
187 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
188 if ($reshook < 0) {
189  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
190 }
191 
192 if (empty($reshook)) {
193  // Selection of new fields
194  include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
195 
196  // Purge search criteria
197  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
198  $search_ref = "";
199  $search_month_create = "";
200  $search_year_create = "";
201  $search_month_start = "";
202  $search_year_start = "";
203  $search_month_end = "";
204  $search_year_end = "";
205  $search_employee = "";
206  $search_valideur = "";
207  $search_status = "";
208  $search_type = '';
209  $toselect = array();
210  $search_array_options = array();
211  }
212  if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
213  || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
214  $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
215  }
216 
217  // Mass actions
218  $objectclass = 'Holiday';
219  $objectlabel = 'Holiday';
220  $uploaddir = $conf->holiday->dir_output;
221  include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
222 }
223 
224 
225 
226 
227 /*
228  * View
229  */
230 
231 $form = new Form($db);
232 $formother = new FormOther($db);
233 $formfile = new FormFile($db);
234 
235 $fuser = new User($db);
236 $holidaystatic = new Holiday($db);
237 
238 // Update sold
239 $result = $object->updateBalance();
240 
241 $title = $langs->trans('CPTitreMenu');
242 $help_url = '';
243 
244 llxHeader('', $title);
245 
246 $max_year = 5;
247 $min_year = 10;
248 
249 // Get current user id
250 $user_id = $user->id;
251 
252 if ($id > 0) {
253  // Charge utilisateur edite
254  $fuser->fetch($id, '', '', 1);
255  $fuser->getrights();
256  $user_id = $fuser->id;
257 
258  $search_employee = $user_id;
259 }
260 
261 // Récupération des congés payés de l'utilisateur ou de tous les users de sa hierarchy
262 // Load array $object->holiday
263 
264 $sql = "SELECT";
265 $sql .= " cp.rowid,";
266 $sql .= " cp.ref,";
267 
268 $sql .= " cp.fk_user,";
269 $sql .= " cp.fk_type,";
270 $sql .= " cp.date_create,";
271 $sql .= " cp.tms as date_update,";
272 $sql .= " cp.description,";
273 $sql .= " cp.date_debut,";
274 $sql .= " cp.date_fin,";
275 $sql .= " cp.halfday,";
276 $sql .= " cp.statut as status,";
277 $sql .= " cp.fk_validator,";
278 $sql .= " cp.date_valid,";
279 $sql .= " cp.fk_user_valid,";
280 $sql .= " cp.date_approval,";
281 $sql .= " cp.fk_user_approve,";
282 $sql .= " cp.date_refuse,";
283 $sql .= " cp.fk_user_refuse,";
284 $sql .= " cp.date_cancel,";
285 $sql .= " cp.fk_user_cancel,";
286 $sql .= " cp.detail_refuse,";
287 
288 $sql .= " uu.lastname as user_lastname,";
289 $sql .= " uu.firstname as user_firstname,";
290 $sql .= " uu.admin as user_admin,";
291 $sql .= " uu.email as user_email,";
292 $sql .= " uu.login as user_login,";
293 $sql .= " uu.statut as user_status,";
294 $sql .= " uu.photo as user_photo,";
295 
296 $sql .= " ua.lastname as validator_lastname,";
297 $sql .= " ua.firstname as validator_firstname,";
298 $sql .= " ua.admin as validator_admin,";
299 $sql .= " ua.email as validator_email,";
300 $sql .= " ua.login as validator_login,";
301 $sql .= " ua.statut as validator_status,";
302 $sql .= " ua.photo as validator_photo";
303 // Add fields from extrafields
304 if (!empty($extrafields->attributes[$object->table_element]['label'])) {
305  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
306  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
307  }
308 }
309 // Add fields from hooks
310 $parameters = array();
311 $reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters); // Note that $action and $object may have been modified by hook
312 $sql .= $hookmanager->resPrint;
313 $sql = preg_replace('/,\s*$/', '', $sql);
314 
315 $sqlfields = $sql; // $sql fields to remove for count total
316 
317 $sql .= " FROM ".MAIN_DB_PREFIX."holiday as cp";
318 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
319  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (cp.rowid = ef.fk_object)";
320 }
321 $sql .= ", ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua";
322 $sql .= " WHERE cp.entity IN (".getEntity('holiday').")";
323 $sql .= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack pour la recherche sur le tableau
324 // Search all
325 if (!empty($sall)) {
326  $sql .= natural_search(array_keys($fieldstosearchall), $sall);
327 }
328 // Ref
329 if (!empty($search_ref)) {
330  $sql .= natural_search("cp.ref", $search_ref);
331 }
332 // Start date
333 $sql .= dolSqlDateFilter("cp.date_debut", $search_day_start, $search_month_start, $search_year_start);
334 // End date
335 $sql .= dolSqlDateFilter("cp.date_fin", $search_day_end, $search_month_end, $search_year_end);
336 // Create date
337 $sql .= dolSqlDateFilter("cp.date_create", $search_day_create, $search_month_create, $search_year_create);
338 // Employee
339 if (!empty($search_employee) && $search_employee != -1) {
340  $sql .= " AND cp.fk_user = '".$db->escape($search_employee)."'\n";
341 }
342 // Validator
343 if (!empty($search_valideur) && $search_valideur != -1) {
344  $sql .= " AND cp.fk_validator = '".$db->escape($search_valideur)."'\n";
345 }
346 // Type
347 if (!empty($search_type) && $search_type != -1) {
348  $sql .= ' AND cp.fk_type IN ('.$db->sanitize($db->escape($search_type)).')';
349 }
350 // Status
351 if (!empty($search_status) && $search_status != -1) {
352  $sql .= " AND cp.statut = '".$db->escape($search_status)."'\n";
353 }
354 
355 if (empty($user->rights->holiday->readall)) {
356  $sql .= ' AND cp.fk_user IN ('.$db->sanitize(join(',', $childids)).')';
357 }
358 if ($id > 0) {
359  $sql .= " AND cp.fk_user IN (".$db->sanitize($id).")";
360 }
361 
362 // Add where from extra fields
363 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
364 // Add where from hooks
365 $parameters = array();
366 $reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
367 $sql .= $hookmanager->resPrint;
368 
369 // Count total nb of records
370 $nbtotalofrecords = '';
371 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
372  /* The fast and low memory method to get and count full list converts the sql into a sql count */
373  $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
374  $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
375  $resql = $db->query($sqlforcount);
376  if ($resql) {
377  $objforcount = $db->fetch_object($resql);
378  $nbtotalofrecords = $objforcount->nbtotalofrecords;
379  } else {
380  dol_print_error($db);
381  }
382 
383  if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
384  $page = 0;
385  $offset = 0;
386  }
387  $db->free($resql);
388 }
389 
390 // Complete request and execute it with limit
391 $sql .= $db->order($sortfield, $sortorder);
392 if ($limit) {
393  $sql .= $db->plimit($limit + 1, $offset);
394 }
395 
396 //print $sql;
397 $resql = $db->query($sql);
398 if (!$resql) {
399  dol_print_error($db);
400  exit;
401 }
402 
403 $num = $db->num_rows($resql);
404 
405 $arrayofselected = is_array($toselect) ? $toselect : array();
406 
407 $param = '';
408 if (!empty($mode)) {
409  $param .= '&mode='.urlencode($mode);
410 }
411 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
412  $param .= '&contextpage='.urlencode($contextpage);
413 }
414 if ($limit > 0 && $limit != $conf->liste_limit) {
415  $param .= '&limit='.((int) $limit);
416 }
417 if ($optioncss != '') {
418  $param .= '&optioncss='.urlencode($optioncss);
419 }
420 if ($search_ref) {
421  $param .= '&search_ref='.urlencode($search_ref);
422 }
423 if ($search_day_create) {
424  $param .= '&search_day_create='.urlencode($search_day_create);
425 }
426 if ($search_month_create) {
427  $param .= '&search_month_create='.urlencode($search_month_create);
428 }
429 if ($search_year_create) {
430  $param .= '&search_year_create='.urlencode($search_year_create);
431 }
432 if ($search_day_start) {
433  $param .= '&search_day_start='.urlencode($search_day_start);
434 }
435 if ($search_month_start) {
436  $param .= '&search_month_start='.urlencode($search_month_start);
437 }
438 if ($search_year_start) {
439  $param .= '&search_year_start='.urlencode($search_year_start);
440 }
441 if ($search_day_end) {
442  $param .= '&search_day_end='.urlencode($search_day_end);
443 }
444 if ($search_month_end) {
445  $param .= '&search_month_end='.urlencode($search_month_end);
446 }
447 if ($search_year_end) {
448  $param .= '&search_year_end='.urlencode($search_year_end);
449 }
450 if ($search_employee > 0) {
451  $param .= '&search_employee='.urlencode($search_employee);
452 }
453 if ($search_valideur > 0) {
454  $param .= '&search_valideur='.urlencode($search_valideur);
455 }
456 if ($search_type > 0) {
457  $param .= '&search_type='.urlencode($search_type);
458 }
459 if ($search_status > 0) {
460  $param .= '&search_status='.urlencode($search_status);
461 }
462 // Add $param from extra fields
463 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
464 
465 // List of mass actions available
466 $arrayofmassactions = array(
467  //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
468  //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
469  //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
470 );
471 if (!empty($permissiontodelete)) {
472  $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
473 }
474 if (!empty($permissiontoapprove)) {
475  $arrayofmassactions['preapproveleave'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Approve");
476 }
477 if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
478  $arrayofmassactions = array();
479 }
480 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
481 
482 print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
483 if ($optioncss != '') {
484  print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
485 }
486 print '<input type="hidden" name="token" value="'.newToken().'">';
487 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
488 print '<input type="hidden" name="action" value="'.($action == 'edit' ? 'update' : 'list').'">';
489 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
490 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
491 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
492 print '<input type="hidden" name="page" value="'.$page.'">';
493 print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
494 print '<input type="hidden" name="page_y" value="">';
495 print '<input type="hidden" name="mode" value="'.$mode.'">';
496 if ($id > 0) {
497  print '<input type="hidden" name="id" value="'.$id.'">';
498 }
499 
500 if ($id > 0) { // For user tab
501  $title = $langs->trans("User");
502  $linkback = '<a href="'.DOL_URL_ROOT.'/user/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
503  $head = user_prepare_head($fuser);
504 
505  print dol_get_fiche_head($head, 'paidholidays', $title, -1, 'user');
506 
507  dol_banner_tab($fuser, 'id', $linkback, $user->rights->user->user->lire || $user->admin);
508 
509  if (empty($conf->global->HOLIDAY_HIDE_BALANCE)) {
510  print '<div class="underbanner clearboth"></div>';
511 
512  print '<br>';
513 
514  print showMyBalance($object, $user_id);
515  }
516 
517  print dol_get_fiche_end();
518 
519  // Buttons for actions
520 
521  print '<div class="tabsAction">';
522 
523  $cancreate = 0;
524  if (!empty($user->rights->holiday->writeall)) {
525  $cancreate = 1;
526  }
527  if (!empty($user->rights->holiday->write) && in_array($user_id, $childids)) {
528  $cancreate = 1;
529  }
530 
531  if ($cancreate) {
532  print '<a href="'.DOL_URL_ROOT.'/holiday/card.php?action=create&fuserid='.$user_id.'" class="butAction">'.$langs->trans("AddCP").'</a>';
533  }
534 
535  print '</div>';
536 } else {
537  $title = $langs->trans("ListeCP");
538 
539 
540  $newcardbutton = '';
541  $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'));
542  $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'));
543  $newcardbutton .= dolGetButtonTitleSeparator();
544  $newcardbutton .= dolGetButtonTitle($langs->trans('MenuAddCP'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/holiday/card.php?action=create', '', $user->rights->holiday->write);
545 
546  print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_hrm', 0, $newcardbutton, '', $limit, 0, 0, 1);
547 }
548 
549 $topicmail = "Information";
550 $modelmail = "leaverequest";
551 $objecttmp = new Holiday($db);
552 $trackid = 'leav'.$object->id;
553 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
554 
555 if ($sall) {
556  $setupstring = '';
557  foreach ($fieldstosearchall as $key => $val) {
558  $fieldstosearchall[$key] = $langs->trans($val);
559  $setupstring .= $key."=".$val.";";
560  }
561  print '<!-- Search done like if HOLIDAY_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
562  print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $sall).join(', ', $fieldstosearchall).'</div>';
563 }
564 
565 $moreforfilter = '';
566 
567 $parameters = array();
568 $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
569 if (empty($reshook)) {
570  $moreforfilter .= $hookmanager->resPrint;
571 } else {
572  $moreforfilter = $hookmanager->resPrint;
573 }
574 
575 if (!empty($moreforfilter)) {
576  print '<div class="liste_titre liste_titre_bydiv centpercent">';
577  print $moreforfilter;
578  $parameters = array('type'=>$type);
579  $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
580  print $hookmanager->resPrint;
581  print '</div>';
582 }
583 
584 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
585 $selectedfields = ($mode != 'kanban' ? $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN', '')) : ''); // This also change content of $arrayfields
586 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
587 
588 $include = '';
589 if (empty($user->rights->holiday->readall)) {
590  $include = 'hierarchyme'; // Can see only its hierarchyl
591 }
592 
593 print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
594 print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
595 
596 // Fields title search
597 // --------------------------------------------------------------------
598 print '<tr class="liste_titre_filter">';
599 // Action column
600 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
601  print '<td class="liste_titre center maxwidthsearch">';
602  $searchpicto = $form->showFilterButtons('left');
603  print $searchpicto;
604  print '</td>';
605 }
606 if (!empty($arrayfields['cp.ref']['checked'])) {
607  print '<td class="liste_titre">';
608  print '<input class="flat maxwidth50" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
609  print '</td>';
610 }
611 
612 if (!empty($arrayfields['cp.fk_user']['checked'])) {
613  $morefilter = '';
614  if (!empty($conf->global->HOLIDAY_HIDE_FOR_NON_SALARIES)) {
615  $morefilter = 'AND employee = 1';
616  }
617 
618  // User
619  $disabled = 0;
620  // If into the tab holiday of a user ($id is set in such a case)
621  if ($id && !GETPOSTISSET('search_employee')) {
622  $search_employee = $id;
623  $disabled = 1;
624  }
625 
626  print '<td class="liste_titre maxwidthonsmartphone left">';
627  print $form->select_dolusers($search_employee, "search_employee", 1, "", $disabled, $include, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth125');
628  print '</td>';
629 }
630 
631 // Approver
632 if (!empty($arrayfields['cp.fk_validator']['checked'])) {
633  if ($user->hasRight('holiday', 'readall')) {
634  print '<td class="liste_titre maxwidthonsmartphone left">';
635  $validator = new UserGroup($db);
636  $excludefilter = $user->admin ? '' : 'u.rowid <> '.$user->id;
637  $valideurobjects = $validator->listUsersForGroup($excludefilter, 1);
638  $valideurarray = array();
639  foreach ($valideurobjects as $val) {
640  $valideurarray[$val] = $val;
641  }
642  print $form->select_dolusers($search_valideur, "search_valideur", 1, "", 0, $valideurarray, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth125');
643  print '</td>';
644  } else {
645  print '<td class="liste_titre">&nbsp;</td>';
646  }
647 }
648 
649 // Type
650 if (!empty($arrayfields['cp.fk_type']['checked'])) {
651  print '<td class="liste_titre">';
652  if (empty($mysoc->country_id)) {
653  setEventMessages(null, array($langs->trans("ErrorSetACountryFirst"), $langs->trans("CompanyFoundation")), 'errors');
654  } else {
655  $typeleaves = $holidaystatic->getTypes(1, -1);
656  $arraytypeleaves = array();
657  foreach ($typeleaves as $key => $val) {
658  $labeltoshow = ($langs->trans($val['code']) != $val['code'] ? $langs->trans($val['code']) : $val['label']);
659  //$labeltoshow .= ($val['delay'] > 0 ? ' ('.$langs->trans("NoticePeriod").': '.$val['delay'].' '.$langs->trans("days").')':'');
660  $arraytypeleaves[$val['rowid']] = $labeltoshow;
661  }
662  print $form->selectarray('search_type', $arraytypeleaves, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100', 1);
663  }
664  print '</td>';
665 }
666 
667 // Duration
668 if (!empty($arrayfields['duration']['checked'])) {
669  print '<td class="liste_titre">&nbsp;</td>';
670 }
671 
672 // Start date
673 if (!empty($arrayfields['cp.date_debut']['checked'])) {
674  print '<td class="liste_titre center nowraponall">';
675  print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_start" value="'.dol_escape_htmltag($search_month_start).'">';
676  print $formother->selectyear($search_year_start, 'search_year_start', 1, $min_year, $max_year);
677  print '</td>';
678 }
679 
680 // End date
681 if (!empty($arrayfields['cp.date_fin']['checked'])) {
682  print '<td class="liste_titre center nowraponall">';
683  print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_end" value="'.dol_escape_htmltag($search_month_end).'">';
684  print $formother->selectyear($search_year_end, 'search_year_end', 1, $min_year, $max_year);
685  print '</td>';
686 }
687 
688 // Date validation
689 if (!empty($arrayfields['cp.date_valid']['checked'])) {
690  print '<td class="liste_titre center nowraponall">';
691  print '</td>';
692 }
693 
694 // Date appoval
695 if (!empty($arrayfields['cp.date_approval']['checked'])) {
696  print '<td class="liste_titre center nowraponall">';
697  print '</td>';
698 }
699 
700 // Extra fields
701 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
702 
703 // Fields from hook
704 $parameters = array('arrayfields'=>$arrayfields);
705 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
706 print $hookmanager->resPrint;
707 
708 // Create date
709 if (!empty($arrayfields['cp.date_create']['checked'])) {
710  print '<td class="liste_titre center width200">';
711  print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_create" value="'.dol_escape_htmltag($search_month_create).'">';
712  print $formother->selectyear($search_year_create, 'search_year_create', 1, $min_year, 0);
713  print '</td>';
714 }
715 
716 // Create date
717 if (!empty($arrayfields['cp.tms']['checked'])) {
718  print '<td class="liste_titre center width200">';
719  print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_update" value="'.dol_escape_htmltag($search_month_update).'">';
720  print $formother->selectyear($search_year_update, 'search_year_update', 1, $min_year, 0);
721  print '</td>';
722 }
723 
724 // Status
725 if (!empty($arrayfields['cp.statut']['checked'])) {
726  print '<td class="liste_titre right parentonrightofpage">';
727  print $object->selectStatutCP($search_status, 'search_status', 'search_status width100 onrightofpage');
728  print '</td>';
729 }
730 
731 // Action column
732 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
733  print '<td class="liste_titre center maxwidthsearch">';
734  $searchpicto = $form->showFilterButtons();
735  print $searchpicto;
736  print '</td>';
737 }
738 
739 print '</tr>'."\n";
740 
741 $totalarray = array();
742 $totalarray['nbfield'] = 0;
743 
744 // Fields title label
745 // --------------------------------------------------------------------
746 print '<tr class="liste_titre">';
747 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
748  print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
749  $totalarray['nbfield']++;
750 }
751 if (!empty($arrayfields['cp.ref']['checked'])) {
752  print_liste_field_titre($arrayfields['cp.ref']['label'], $_SERVER["PHP_SELF"], "cp.ref", "", $param, '', $sortfield, $sortorder);
753  $totalarray['nbfield']++;
754 }
755 if (!empty($arrayfields['cp.fk_user']['checked'])) {
756  print_liste_field_titre($arrayfields['cp.fk_user']['label'], $_SERVER["PHP_SELF"], "cp.fk_user", "", $param, '', $sortfield, $sortorder);
757  $totalarray['nbfield']++;
758 }
759 if (!empty($arrayfields['cp.fk_validator']['checked'])) {
760  print_liste_field_titre($arrayfields['cp.fk_validator']['label'], $_SERVER["PHP_SELF"], "cp.fk_validator", "", $param, '', $sortfield, $sortorder);
761  $totalarray['nbfield']++;
762 }
763 if (!empty($arrayfields['cp.fk_type']['checked'])) {
764  print_liste_field_titre($arrayfields['cp.fk_type']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
765  $totalarray['nbfield']++;
766 }
767 if (!empty($arrayfields['duration']['checked'])) {
768  print_liste_field_titre($arrayfields['duration']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right maxwidth100');
769  $totalarray['nbfield']++;
770 }
771 if (!empty($arrayfields['cp.date_debut']['checked'])) {
772  print_liste_field_titre($arrayfields['cp.date_debut']['label'], $_SERVER["PHP_SELF"], "cp.date_debut", "", $param, '', $sortfield, $sortorder, 'center ');
773  $totalarray['nbfield']++;
774 }
775 if (!empty($arrayfields['cp.date_fin']['checked'])) {
776  print_liste_field_titre($arrayfields['cp.date_fin']['label'], $_SERVER["PHP_SELF"], "cp.date_fin", "", $param, '', $sortfield, $sortorder, 'center ');
777  $totalarray['nbfield']++;
778 }
779 if (!empty($arrayfields['cp.date_valid']['checked'])) {
780  print_liste_field_titre($arrayfields['cp.date_valid']['label'], $_SERVER["PHP_SELF"], "cp.date_valid", "", $param, '', $sortfield, $sortorder, 'center ');
781  $totalarray['nbfield']++;
782 }
783 if (!empty($arrayfields['cp.date_approval']['checked'])) {
784  print_liste_field_titre($arrayfields['cp.date_approval']['label'], $_SERVER["PHP_SELF"], "cp.date_approval", "", $param, '', $sortfield, $sortorder, 'center ');
785  $totalarray['nbfield']++;
786 }
787 // Extra fields
788 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
789 // Hook fields
790 $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
791 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
792 print $hookmanager->resPrint;
793 if (!empty($arrayfields['cp.date_create']['checked'])) {
794  print_liste_field_titre($arrayfields['cp.date_create']['label'], $_SERVER["PHP_SELF"], "cp.date_create", "", $param, '', $sortfield, $sortorder, 'center ');
795  $totalarray['nbfield']++;
796 }
797 if (!empty($arrayfields['cp.tms']['checked'])) {
798  print_liste_field_titre($arrayfields['cp.tms']['label'], $_SERVER["PHP_SELF"], "cp.tms", "", $param, '', $sortfield, $sortorder, 'center ');
799  $totalarray['nbfield']++;
800 }
801 if (!empty($arrayfields['cp.statut']['checked'])) {
802  print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "cp.statut", "", $param, '', $sortfield, $sortorder, 'right ');
803  $totalarray['nbfield']++;
804 }
805 // Action column
806 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
807  print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
808  $totalarray['nbfield']++;
809 }
810 print '</tr>'."\n";
811 
812 $listhalfday = array('morning'=>$langs->trans("Morning"), "afternoon"=>$langs->trans("Afternoon"));
813 
814 
815 // Loop on record
816 // --------------------------------------------------------------------
817 
818 // If we ask a dedicated card and not allow to see it, we force on user.
819 if ($id && empty($user->rights->holiday->readall) && !in_array($id, $childids)) {
820  $langs->load("errors");
821  print '<tr class="oddeven opacitymediuem"><td colspan="10">'.$langs->trans("NotEnoughPermissions").'</td></tr>';
822  $result = 0;
823 } elseif ($num > 0 && !empty($mysoc->country_id)) {
824  // Lines
825  $userstatic = new User($db);
826  $approbatorstatic = new User($db);
827 
828  $typeleaves = $object->getTypes(1, -1);
829 
830  $i = 0;
831  $savnbfield = $totalarray['nbfield'];
832  $totalarray = array();
833  $totalarray['nbfield'] = 0;
834  $totalduration = 0;
835  $imaxinloop = ($limit ? min($num, $limit) : $num);
836  while ($i < $imaxinloop) {
837  $obj = $db->fetch_object($resql);
838  if (empty($obj)) {
839  break; // Should not happen
840  }
841 
842  // Leave request
843  $holidaystatic->id = $obj->rowid;
844  $holidaystatic->ref = ($obj->ref ? $obj->ref : $obj->rowid);
845  $holidaystatic->statut = $obj->status;
846  $holidaystatic->date_debut = $db->jdate($obj->date_debut);
847  $holidaystatic->date_fin = $db->jdate($obj->date_fin);
848 
849  // User
850  $userstatic->id = $obj->fk_user;
851  $userstatic->lastname = $obj->user_lastname;
852  $userstatic->firstname = $obj->user_firstname;
853  $userstatic->admin = $obj->user_admin;
854  $userstatic->email = $obj->user_email;
855  $userstatic->login = $obj->user_login;
856  $userstatic->statut = $obj->user_status;
857  $userstatic->photo = $obj->user_photo;
858 
859  // Validator
860  $approbatorstatic->id = $obj->fk_validator;
861  $approbatorstatic->lastname = $obj->validator_lastname;
862  $approbatorstatic->firstname = $obj->validator_firstname;
863  $approbatorstatic->admin = $obj->validator_admin;
864  $approbatorstatic->email = $obj->validator_email;
865  $approbatorstatic->login = $obj->validator_login;
866  $approbatorstatic->statut = $obj->validator_status;
867  $approbatorstatic->photo = $obj->validator_photo;
868 
869  $date = $obj->date_create;
870  $date_modif = $obj->date_update;
871 
872  $starthalfday = ($obj->halfday == -1 || $obj->halfday == 2) ? 'afternoon' : 'morning';
873  $endhalfday = ($obj->halfday == 1 || $obj->halfday == 2) ? 'morning' : 'afternoon';
874 
875  $nbopenedday = num_open_day($db->jdate($obj->date_debut, 1), $db->jdate($obj->date_fin, 1), 0, 1, $obj->halfday); // user jdate(..., 1) because num_open_day need UTC dates
876  $totalduration += $nbopenedday;
877 
878  if ($mode == 'kanban') {
879  if ($i == 0) {
880  print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
881  print '<div class="box-flex-container kanban">';
882  }
883 
884  $holidaystatic->fk_type = empty($typeleaves[$obj->fk_type]['rowid']) ? 0 : $typeleaves[$obj->fk_type]['rowid'];
885 
886  // Output Kanban
887  if ($massactionbutton || $massaction) {
888  $selected = 0;
889  if (in_array($object->id, $arrayofselected)) {
890  $selected = 1;
891  }
892  if (empty($typeleaves[$obj->fk_type])) {
893  $labeltypeleavetoshow = $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type);
894  } else {
895  $labeltypeleavetoshow = ($langs->trans($typeleaves[$obj->fk_type]['code']) != $typeleaves[$obj->fk_type]['code'] ? $langs->trans($typeleaves[$obj->fk_type]['code']) : $typeleaves[$obj->fk_type]['label']);
896  }
897 
898  $arraydata = array('user'=>$userstatic, 'labeltype'=>$labeltypeleavetoshow, 'selected'=>$selected);
899  }
900  print $holidaystatic->getKanbanView('', $arraydata);
901  if ($i == ($imaxinloop - 1)) {
902  print '</div>';
903  print '</td></tr>';
904  }
905  } else {
906  // Show here line of result
907  $j = 0;
908  print '<tr data-rowid="'.$object->id.'" class="oddeven">';
909  // Action column
910  if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
911  print '<td class="nowrap center">';
912  if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
913  $selected = 0;
914  if (in_array($obj->rowid, $arrayofselected)) {
915  $selected = 1;
916  }
917  print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
918  }
919  print '</td>';
920  if (!$i) {
921  $totalarray['nbfield']++;
922  }
923  }
924  if (!empty($arrayfields['cp.ref']['checked'])) {
925  print '<td class="nowraponall">';
926  print $holidaystatic->getNomUrl(1, 1);
927  print '</td>';
928  if (!$i) {
929  $totalarray['nbfield']++;
930  }
931  }
932  if (!empty($arrayfields['cp.fk_user']['checked'])) {
933  print '<td class="tdoverflowmax125">'.$userstatic->getNomUrl(-1, 'leave').'</td>';
934  if (!$i) {
935  $totalarray['nbfield']++;
936  }
937  }
938  if (!empty($arrayfields['cp.fk_validator']['checked'])) {
939  print '<td class="tdoverflowmax125">'.$approbatorstatic->getNomUrl(-1).'</td>';
940  if (!$i) {
941  $totalarray['nbfield']++;
942  }
943  }
944  if (!empty($arrayfields['cp.fk_type']['checked'])) {
945  if (empty($typeleaves[$obj->fk_type])) {
946  $labeltypeleavetoshow = $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type);
947  } else {
948  $labeltypeleavetoshow = ($langs->trans($typeleaves[$obj->fk_type]['code']) != $typeleaves[$obj->fk_type]['code'] ? $langs->trans($typeleaves[$obj->fk_type]['code']) : $typeleaves[$obj->fk_type]['label']);
949  }
950 
951  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labeltypeleavetoshow).'">';
952  print $labeltypeleavetoshow;
953  print '</td>';
954  if (!$i) {
955  $totalarray['nbfield']++;
956  }
957  }
958  if (!empty($arrayfields['duration']['checked'])) {
959  print '<td class="right">';
960  $nbopenedday = num_open_day($db->jdate($obj->date_debut, 1), $db->jdate($obj->date_fin, 1), 0, 1, $obj->halfday); // user jdate(..., 1) because num_open_day need UTC dates
961  $totalduration += $nbopenedday;
962  print $nbopenedday;
963  //print ' '.$langs->trans('DurationDays');
964  print '</td>';
965  if (!$i) {
966  $totalarray['nbfield']++;
967  }
968  }
969  if (!empty($arrayfields['cp.date_debut']['checked'])) {
970  print '<td class="center">';
971  print dol_print_date($db->jdate($obj->date_debut), 'day');
972  print ' <span class="opacitymedium nowraponall">('.$langs->trans($listhalfday[$starthalfday]).')</span>';
973  print '</td>';
974  if (!$i) {
975  $totalarray['nbfield']++;
976  }
977  }
978  if (!empty($arrayfields['cp.date_fin']['checked'])) {
979  print '<td class="center">';
980  print dol_print_date($db->jdate($obj->date_fin), 'day');
981  print ' <span class="opacitymedium nowraponall">('.$langs->trans($listhalfday[$endhalfday]).')</span>';
982  print '</td>';
983  if (!$i) {
984  $totalarray['nbfield']++;
985  }
986  }
987  // Date validation
988  if (!empty($arrayfields['cp.date_valid']['checked'])) { // date_valid is both date_valid but also date_approval
989  print '<td class="center" title="'.dol_print_date($db->jdate($obj->date_valid), 'dayhour').'">';
990  print dol_print_date($db->jdate($obj->date_valid), 'day');
991  print '</td>';
992  if (!$i) $totalarray['nbfield']++;
993  }
994  // Date approval
995  if (!empty($arrayfields['cp.date_approval']['checked'])) {
996  print '<td class="center" title="'.dol_print_date($db->jdate($obj->date_approval), 'dayhour').'">';
997  print dol_print_date($db->jdate($obj->date_approval), 'day');
998  print '</td>';
999  if (!$i) $totalarray['nbfield']++;
1000  }
1001 
1002  // Extra fields
1003  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1004  // Fields from hook
1005  $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
1006  $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1007  print $hookmanager->resPrint;
1008 
1009  // Date creation
1010  if (!empty($arrayfields['cp.date_create']['checked'])) {
1011  print '<td style="text-align: center;">'.dol_print_date($date, 'dayhour').'</td>';
1012  if (!$i) {
1013  $totalarray['nbfield']++;
1014  }
1015  }
1016  if (!empty($arrayfields['cp.tms']['checked'])) {
1017  print '<td style="text-align: center;">'.dol_print_date($date_modif, 'dayhour').'</td>';
1018  if (!$i) {
1019  $totalarray['nbfield']++;
1020  }
1021  }
1022  if (!empty($arrayfields['cp.statut']['checked'])) {
1023  print '<td class="right nowrap">'.$holidaystatic->getLibStatut(5).'</td>';
1024  if (!$i) {
1025  $totalarray['nbfield']++;
1026  }
1027  }
1028 
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($obj->rowid, $arrayofselected)) {
1035  $selected = 1;
1036  }
1037  print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1038  }
1039  print '</td>';
1040  if (!$i) {
1041  $totalarray['nbfield']++;
1042  }
1043  }
1044 
1045  print '</tr>'."\n";
1046  }
1047  $i++;
1048  }
1049 
1050  // Add a line for total if there is a total to show
1051  if ($mode != 'kanban' && !empty($arrayfields['duration']['checked'])) {
1052  print '<tr class="total">';
1053  if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1054  print '<td></td>';
1055  }
1056  foreach ($arrayfields as $key => $val) {
1057  if (!empty($val['checked'])) {
1058  if ($key == 'duration') {
1059  print '<td class="right">'.$totalduration.' '.$langs->trans('DurationDays').'</td>';
1060  } else {
1061  print '<td></td>';
1062  }
1063  }
1064  }
1065  // status
1066  if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1067  print '<td></td>';
1068  }
1069  print '</tr>';
1070  }
1071 }
1072 
1073 // If no record found
1074 if ($num == 0) {
1075  $colspan = 1;
1076  foreach ($arrayfields as $key => $val) {
1077  if (!empty($val['checked'])) {
1078  $colspan++;
1079  }
1080  }
1081  print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1082 }
1083 
1084 $db->free($resql);
1085 
1086 $parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
1087 $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1088 print $hookmanager->resPrint;
1089 
1090 print '</table>'."\n";
1091 print '</div>'."\n";
1092 
1093 print '</form>'."\n";
1094 
1095 // End of page
1096 llxFooter();
1097 $db->close();
1098 
1099 
1100 
1101 
1102 
1110 function showMyBalance($holiday, $user_id)
1111 {
1112  global $langs;
1113 
1114  //$alltypeleaves = $holiday->getTypes(1, -1); // To have labels
1115 
1116  $out = '';
1117  $nb_holiday = 0;
1118  $typeleaves = $holiday->getTypes(1, 1);
1119  foreach ($typeleaves as $key => $val) {
1120  $nb_type = $holiday->getCPforUser($user_id, $val['rowid']);
1121  $nb_holiday += $nb_type;
1122  $out .= ' - '.$val['label'].': <strong>'.($nb_type ?price2num($nb_type) : 0).'</strong><br>';
1123  }
1124  $out = $langs->trans('SoldeCPUser', round($nb_holiday, 5)).'<br>'.$out;
1125 
1126  return $out;
1127 }
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 offer components to list and upload files.
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 of the module paid holiday.
Class to manage user groups.
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
dolSqlDateFilter($datefield, $day_date, $month_date, $year_date, $excludefirstand=0, $gm=false)
Generate a SQL string to make a filter into a range (for second of date until last second of date).
Definition: date.lib.php:359
num_open_day($timestampStart, $timestampEnd, $inhour=0, $lastday=0, $halfday=0, $country_code='')
Function to return number of working days (and text of units) between two dates (working days)
Definition: date.lib.php:1015
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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)
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.
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.
showMyBalance($holiday, $user_id)
Show balance of user.
Definition: list.php:1110
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
user_prepare_head(User $object)
Prepare array with list of tabs.