dolibarr 19.0.3
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
29require '../main.inc.php';
30require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
35require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
36require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
38require_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
44if ($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');
73if (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;
79if (!$sortorder) {
80 $sortorder = "DESC";
81}
82if (!$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
136include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
137
138
139// Security check
140$socid = 0;
141if ($user->socid > 0) { // Protection if external user
142 //$socid = $user->socid;
144}
145
146$permissiontoread = $user->hasRight('holiday', 'read');
147$permissiontodelete = $user->hasRight('holiday', 'delete');
148$permissiontoapprove = $user->hasRight('holiday', 'approve');
149
150if (!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
156if ($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) {
169 }
170}
171
172
173
174/*
175 * Actions
176 */
177
178if (GETPOST('cancel', 'alpha')) {
179 $action = 'list';
180 $massaction = '';
181}
182if (!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
188if ($reshook < 0) {
189 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
190}
191
192if (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
244llxHeader('', $title);
245
246$max_year = 5;
247$min_year = 10;
248
249// Get current user id
250$user_id = $user->id;
251
252if ($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
304if (!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";
318if (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
325if (!empty($sall)) {
326 $sql .= natural_search(array_keys($fieldstosearchall), $sall);
327}
328// Ref
329if (!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
339if (!empty($search_employee) && $search_employee != -1) {
340 $sql .= " AND cp.fk_user = '".$db->escape($search_employee)."'\n";
341}
342// Validator
343if (!empty($search_valideur) && $search_valideur != -1) {
344 $sql .= " AND cp.fk_validator = '".$db->escape($search_valideur)."'\n";
345}
346// Type
347if (!empty($search_type) && $search_type != -1) {
348 $sql .= ' AND cp.fk_type IN ('.$db->sanitize($db->escape($search_type)).')';
349}
350// Status
351if (!empty($search_status) && $search_status != -1) {
352 $sql .= " AND cp.statut = '".$db->escape($search_status)."'\n";
353}
354
355if (!$user->hasRight('holiday', 'readall')) {
356 $sql .= ' AND cp.fk_user IN ('.$db->sanitize(join(',', $childids)).')';
357}
358if ($id > 0) {
359 $sql .= " AND cp.fk_user IN (".$db->sanitize($id).")";
360}
361
362// Add where from extra fields
363include 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 = '';
371if (!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);
392if ($limit) {
393 $sql .= $db->plimit($limit + 1, $offset);
394}
395
396//print $sql;
397$resql = $db->query($sql);
398if (!$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 = '';
408if (!empty($mode)) {
409 $param .= '&mode='.urlencode($mode);
410}
411if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
412 $param .= '&contextpage='.urlencode($contextpage);
413}
414if ($limit > 0 && $limit != $conf->liste_limit) {
415 $param .= '&limit='.((int) $limit);
416}
417if ($optioncss != '') {
418 $param .= '&optioncss='.urlencode($optioncss);
419}
420if ($search_ref) {
421 $param .= '&search_ref='.urlencode($search_ref);
422}
423if ($search_day_create) {
424 $param .= '&search_day_create='.urlencode($search_day_create);
425}
426if ($search_month_create) {
427 $param .= '&search_month_create='.urlencode($search_month_create);
428}
429if ($search_year_create) {
430 $param .= '&search_year_create='.urlencode($search_year_create);
431}
432if ($search_day_start) {
433 $param .= '&search_day_start='.urlencode($search_day_start);
434}
435if ($search_month_start) {
436 $param .= '&search_month_start='.urlencode($search_month_start);
437}
438if ($search_year_start) {
439 $param .= '&search_year_start='.urlencode($search_year_start);
440}
441if ($search_day_end) {
442 $param .= '&search_day_end='.urlencode($search_day_end);
443}
444if ($search_month_end) {
445 $param .= '&search_month_end='.urlencode($search_month_end);
446}
447if ($search_year_end) {
448 $param .= '&search_year_end='.urlencode($search_year_end);
449}
450if ($search_employee > 0) {
451 $param .= '&search_employee='.urlencode($search_employee);
452}
453if ($search_valideur > 0) {
454 $param .= '&search_valideur='.urlencode($search_valideur);
455}
456if ($search_type > 0) {
457 $param .= '&search_type='.urlencode($search_type);
458}
459if ($search_status > 0) {
460 $param .= '&search_status='.urlencode($search_status);
461}
462// Add $param from extra fields
463include 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);
471if (!empty($permissiontodelete)) {
472 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
473}
474if (!empty($permissiontoapprove)) {
475 $arrayofmassactions['preapproveleave'] = img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Approve");
476}
477if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
478 $arrayofmassactions = array();
479}
480$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
481
482print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
483if ($optioncss != '') {
484 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
485}
486print '<input type="hidden" name="token" value="'.newToken().'">';
487print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
488print '<input type="hidden" name="action" value="'.($action == 'edit' ? 'update' : 'list').'">';
489print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
490print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
491print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
492print '<input type="hidden" name="page" value="'.$page.'">';
493print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
494print '<input type="hidden" name="page_y" value="">';
495print '<input type="hidden" name="mode" value="'.$mode.'">';
496if ($id > 0) {
497 print '<input type="hidden" name="id" value="'.$id.'">';
498}
499
500if ($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->hasRight('user', 'user', 'lire') || $user->admin);
508
509 if (!getDolGlobalString('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 ($user->hasRight('holiday', 'writeall')) {
525 $cancreate = 1;
526 }
527 if ($user->hasRight('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->hasRight('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;
553include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
554
555if ($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
569if (empty($reshook)) {
570 $moreforfilter .= $hookmanager->resPrint;
571} else {
572 $moreforfilter = $hookmanager->resPrint;
573}
574
575if (!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 = '';
589if (!$user->hasRight('holiday', 'readall')) {
590 $include = 'hierarchyme'; // Can see only its hierarchyl
591}
592
593print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
594print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
595
596// Fields title search
597// --------------------------------------------------------------------
598print '<tr class="liste_titre_filter">';
599// Action column
600if (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}
606if (!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
612if (!empty($arrayfields['cp.fk_user']['checked'])) {
613 $morefilter = '';
614 if (getDolGlobalString('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
632if (!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
650if (!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
668if (!empty($arrayfields['duration']['checked'])) {
669 print '<td class="liste_titre">&nbsp;</td>';
670}
671
672// Start date
673if (!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
681if (!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
689if (!empty($arrayfields['cp.date_valid']['checked'])) {
690 print '<td class="liste_titre center nowraponall">';
691 print '</td>';
692}
693
694// Date appoval
695if (!empty($arrayfields['cp.date_approval']['checked'])) {
696 print '<td class="liste_titre center nowraponall">';
697 print '</td>';
698}
699
700// Extra fields
701include 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
706print $hookmanager->resPrint;
707
708// Create date
709if (!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
717if (!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
725if (!empty($arrayfields['cp.statut']['checked'])) {
726 print '<td class="liste_titre center parentonrightofpage">';
727 print $object->selectStatutCP($search_status, 'search_status', 'search_status width100 onrightofpage');
728 print '</td>';
729}
730
731// Action column
732if (!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
739print '</tr>'."\n";
740
741$totalarray = array();
742$totalarray['nbfield'] = 0;
743
744// Fields title label
745// --------------------------------------------------------------------
746print '<tr class="liste_titre">';
747if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
748 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
749 $totalarray['nbfield']++;
750}
751if (!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}
755if (!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}
759if (!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}
763if (!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}
767if (!empty($arrayfields['duration']['checked'])) {
768 print_liste_field_titre($arrayfields['duration']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right maxwidth100');
769 $totalarray['nbfield']++;
770}
771if (!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}
775if (!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}
779if (!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}
783if (!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
788include 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
792print $hookmanager->resPrint;
793if (!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}
797if (!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}
801if (!empty($arrayfields['cp.statut']['checked'])) {
802 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "cp.statut", "", $param, '', $sortfield, $sortorder, 'center ');
803 $totalarray['nbfield']++;
804}
805// Action column
806if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
807 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
808 $totalarray['nbfield']++;
809}
810print '</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.
819if ($id && !$user->hasRight('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, 'nbopenedday'=>$nbopenedday);
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 print $nbopenedday;
961 //print ' '.$langs->trans('DurationDays');
962 print '</td>';
963 if (!$i) {
964 $totalarray['nbfield']++;
965 }
966 }
967 if (!empty($arrayfields['cp.date_debut']['checked'])) {
968 print '<td class="center">';
969 print dol_print_date($db->jdate($obj->date_debut), 'day');
970 print ' <span class="opacitymedium nowraponall">('.$langs->trans($listhalfday[$starthalfday]).')</span>';
971 print '</td>';
972 if (!$i) {
973 $totalarray['nbfield']++;
974 }
975 }
976 if (!empty($arrayfields['cp.date_fin']['checked'])) {
977 print '<td class="center">';
978 print dol_print_date($db->jdate($obj->date_fin), 'day');
979 print ' <span class="opacitymedium nowraponall">('.$langs->trans($listhalfday[$endhalfday]).')</span>';
980 print '</td>';
981 if (!$i) {
982 $totalarray['nbfield']++;
983 }
984 }
985 // Date validation
986 if (!empty($arrayfields['cp.date_valid']['checked'])) { // date_valid is both date_valid but also date_approval
987 print '<td class="center" title="'.dol_print_date($db->jdate($obj->date_valid), 'dayhour').'">';
988 print dol_print_date($db->jdate($obj->date_valid), 'day');
989 print '</td>';
990 if (!$i) {
991 $totalarray['nbfield']++;
992 }
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) {
1000 $totalarray['nbfield']++;
1001 }
1002 }
1003
1004 // Extra fields
1005 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1006 // Fields from hook
1007 $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
1008 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1009 print $hookmanager->resPrint;
1010
1011 // Date creation
1012 if (!empty($arrayfields['cp.date_create']['checked'])) {
1013 print '<td style="text-align: center;">'.dol_print_date($date, 'dayhour').'</td>';
1014 if (!$i) {
1015 $totalarray['nbfield']++;
1016 }
1017 }
1018 if (!empty($arrayfields['cp.tms']['checked'])) {
1019 print '<td style="text-align: center;">'.dol_print_date($date_modif, 'dayhour').'</td>';
1020 if (!$i) {
1021 $totalarray['nbfield']++;
1022 }
1023 }
1024 // Status
1025 if (!empty($arrayfields['cp.statut']['checked'])) {
1026 print '<td class="center nowrap">'.$holidaystatic->getLibStatut(5).'</td>';
1027 if (!$i) {
1028 $totalarray['nbfield']++;
1029 }
1030 }
1031
1032 // Action column
1033 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1034 print '<td class="nowrap center">';
1035 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1036 $selected = 0;
1037 if (in_array($obj->rowid, $arrayofselected)) {
1038 $selected = 1;
1039 }
1040 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1041 }
1042 print '</td>';
1043 if (!$i) {
1044 $totalarray['nbfield']++;
1045 }
1046 }
1047
1048 print '</tr>'."\n";
1049 }
1050 $i++;
1051 }
1052
1053 // Add a line for total if there is a total to show
1054 if ($mode != 'kanban' && !empty($arrayfields['duration']['checked'])) {
1055 print '<tr class="total">';
1056 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1057 print '<td></td>';
1058 }
1059 foreach ($arrayfields as $key => $val) {
1060 if (!empty($val['checked'])) {
1061 if ($key == 'duration') {
1062 print '<td class="right">'.$totalduration.' '.$langs->trans('DurationDays').'</td>';
1063 } else {
1064 print '<td></td>';
1065 }
1066 }
1067 }
1068 // status
1069 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1070 print '<td></td>';
1071 }
1072 print '</tr>';
1073 }
1074}
1075
1076// If no record found
1077if ($num == 0) {
1078 $colspan = 1;
1079 foreach ($arrayfields as $key => $val) {
1080 if (!empty($val['checked'])) {
1081 $colspan++;
1082 }
1083 }
1084 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1085}
1086
1087$db->free($resql);
1088
1089$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
1090$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1091print $hookmanager->resPrint;
1092
1093print '</table>'."\n";
1094print '</div>'."\n";
1095
1096print '</form>'."\n";
1097
1098// End of page
1099llxFooter();
1100$db->close();
1101
1102
1103
1104
1105
1113function showMyBalance($holiday, $user_id)
1114{
1115 global $langs;
1116
1117 //$alltypeleaves = $holiday->getTypes(1, -1); // To have labels
1118
1119 $out = '';
1120 $nb_holiday = 0;
1121 $typeleaves = $holiday->getTypes(1, 1);
1122 foreach ($typeleaves as $key => $val) {
1123 $nb_type = $holiday->getCPforUser($user_id, $val['rowid']);
1124 $nb_holiday += $nb_type;
1125 $out .= ' - '.$val['label'].': <strong>'.($nb_type ? price2num($nb_type) : 0).'</strong><br>';
1126 }
1127 $out = $langs->trans('SoldeCPUser', round($nb_holiday, 5)).'<br>'.$out;
1128
1129 return $out;
1130}
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
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.
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:376
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)
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 a 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.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
showMyBalance($holiday, $user_id)
Show balance of user.
Definition list.php:1113
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.