dolibarr 20.0.0
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-2024 Frédéric France <frederic.france@free.fr>
7 * Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
29// Load Dolibarr environment
30require '../main.inc.php';
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
36require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
37require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php';
40
41// Load translation files required by the page
42$langs->loadLangs(array('users', 'other', 'holiday', 'hrm'));
43
44// Protection if external user
45if ($user->socid > 0) {
47}
48
49$action = GETPOST('action', 'aZ09'); // The action 'add', 'create', 'edit', 'update', 'view', ...
50$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
51$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
52$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
53$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
54$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
55$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'holidaylist'; // To manage different context of search
56$mode = GETPOST('mode', 'alpha'); // for switch mode view result
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 = GETPOSTINT('id');
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 = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
70$sortfield = GETPOST('sortfield', 'aZ09comma');
71$sortorder = GETPOST('sortorder', 'aZ09comma');
72$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
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$search_all = 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', 'intcomma');
98$search_valideur = GETPOST('search_valideur', 'intcomma');
99$search_status = GETPOST('search_status', 'intcomma');
100$search_type = GETPOST('search_type', 'intcomma');
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, 'arrayfields' => &$arrayfields);
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, $help_url, '', 0, 0, '', '', '', 'bodyforlist');
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_modification,";
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($search_all)) {
326 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
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(implode(',', $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((string) ($search_valideur));
455}
456if ($search_type > 0) {
457 $param .= '&search_type='.urlencode((string) ($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 (GETPOSTINT('nomassaction') || 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 ($search_all) {
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", $search_all).implode(', ', $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$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
586$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
587$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
588
589$include = '';
590if (!$user->hasRight('holiday', 'readall')) {
591 $include = 'hierarchyme'; // Can see only its hierarchyl
592}
593
594print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
595print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
596
597// Fields title search
598// --------------------------------------------------------------------
599print '<tr class="liste_titre_filter">';
600// Action column
601if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
602 print '<td class="liste_titre center maxwidthsearch">';
603 $searchpicto = $form->showFilterButtons('left');
604 print $searchpicto;
605 print '</td>';
606}
607if (!empty($arrayfields['cp.ref']['checked'])) {
608 print '<td class="liste_titre">';
609 print '<input class="flat maxwidth50" type="text" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
610 print '</td>';
611}
612
613if (!empty($arrayfields['cp.fk_user']['checked'])) {
614 $morefilter = '';
615 if (getDolGlobalString('HOLIDAY_HIDE_FOR_NON_SALARIES')) {
616 $morefilter = 'AND employee = 1';
617 }
618
619 // User
620 $disabled = 0;
621 // If into the tab holiday of a user ($id is set in such a case)
622 if ($id && !GETPOSTISSET('search_employee')) {
623 $search_employee = $id;
624 $disabled = 1;
625 }
626
627 print '<td class="liste_titre maxwidthonsmartphone left">';
628 print $form->select_dolusers($search_employee, "search_employee", 1, "", $disabled, $include, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth125');
629 print '</td>';
630}
631
632// Approver
633if (!empty($arrayfields['cp.fk_validator']['checked'])) {
634 if ($user->hasRight('holiday', 'readall')) {
635 print '<td class="liste_titre maxwidthonsmartphone left">';
636 $validator = new UserGroup($db);
637 $excludefilter = $user->admin ? '' : 'u.rowid <> '.((int) $user->id);
638 $valideurobjects = $validator->listUsersForGroup($excludefilter, 1);
639 $valideurarray = array();
640 foreach ($valideurobjects as $val) {
641 $valideurarray[$val] = $val;
642 }
643 print $form->select_dolusers($search_valideur, "search_valideur", 1, "", 0, $valideurarray, '', 0, 0, 0, $morefilter, 0, '', 'maxwidth125');
644 print '</td>';
645 } else {
646 print '<td class="liste_titre">&nbsp;</td>';
647 }
648}
649
650// Type
651if (!empty($arrayfields['cp.fk_type']['checked'])) {
652 print '<td class="liste_titre">';
653 if (empty($mysoc->country_id)) {
654 setEventMessages(null, array($langs->trans("ErrorSetACountryFirst"), $langs->trans("CompanyFoundation")), 'errors');
655 } else {
656 $typeleaves = $holidaystatic->getTypes(1, -1);
657 $arraytypeleaves = array();
658 foreach ($typeleaves as $key => $val) {
659 $labeltoshow = ($langs->trans($val['code']) != $val['code'] ? $langs->trans($val['code']) : $val['label']);
660 //$labeltoshow .= ($val['delay'] > 0 ? ' ('.$langs->trans("NoticePeriod").': '.$val['delay'].' '.$langs->trans("days").')':'');
661 $arraytypeleaves[$val['rowid']] = $labeltoshow;
662 }
663 print $form->selectarray('search_type', $arraytypeleaves, $search_type, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100', 1);
664 }
665 print '</td>';
666}
667
668// Duration
669if (!empty($arrayfields['duration']['checked'])) {
670 print '<td class="liste_titre">&nbsp;</td>';
671}
672
673// Start date
674if (!empty($arrayfields['cp.date_debut']['checked'])) {
675 print '<td class="liste_titre center nowraponall">';
676 print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_start" value="'.dol_escape_htmltag($search_month_start).'">';
677 print $formother->selectyear($search_year_start, 'search_year_start', 1, $min_year, $max_year);
678 print '</td>';
679}
680
681// End date
682if (!empty($arrayfields['cp.date_fin']['checked'])) {
683 print '<td class="liste_titre center nowraponall">';
684 print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_end" value="'.dol_escape_htmltag($search_month_end).'">';
685 print $formother->selectyear($search_year_end, 'search_year_end', 1, $min_year, $max_year);
686 print '</td>';
687}
688
689// Date validation
690if (!empty($arrayfields['cp.date_valid']['checked'])) {
691 print '<td class="liste_titre center nowraponall">';
692 print '</td>';
693}
694
695// Date approval
696if (!empty($arrayfields['cp.date_approval']['checked'])) {
697 print '<td class="liste_titre center nowraponall">';
698 print '</td>';
699}
700
701// Extra fields
702include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
703
704// Fields from hook
705$parameters = array('arrayfields' => $arrayfields);
706$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
707print $hookmanager->resPrint;
708
709// Create date
710if (!empty($arrayfields['cp.date_create']['checked'])) {
711 print '<td class="liste_titre center width200">';
712 print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_create" value="'.dol_escape_htmltag($search_month_create).'">';
713 print $formother->selectyear($search_year_create, 'search_year_create', 1, $min_year, 0);
714 print '</td>';
715}
716
717// Create date
718if (!empty($arrayfields['cp.tms']['checked'])) {
719 print '<td class="liste_titre center width200">';
720 print '<input class="flat valignmiddle maxwidth25" type="text" maxlength="2" name="search_month_update" value="'.dol_escape_htmltag($search_month_update).'">';
721 print $formother->selectyear($search_year_update, 'search_year_update', 1, $min_year, 0);
722 print '</td>';
723}
724
725// Status
726if (!empty($arrayfields['cp.statut']['checked'])) {
727 print '<td class="liste_titre center parentonrightofpage">';
728 print $object->selectStatutCP($search_status, 'search_status', 'search_status width100 onrightofpage');
729 print '</td>';
730}
731
732// Action column
733if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
734 print '<td class="liste_titre center maxwidthsearch">';
735 $searchpicto = $form->showFilterButtons();
736 print $searchpicto;
737 print '</td>';
738}
739
740print '</tr>'."\n";
741
742$totalarray = array();
743$totalarray['nbfield'] = 0;
744
745// Fields title label
746// --------------------------------------------------------------------
747print '<tr class="liste_titre">';
748if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
749 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
750 $totalarray['nbfield']++;
751}
752if (!empty($arrayfields['cp.ref']['checked'])) {
753 print_liste_field_titre($arrayfields['cp.ref']['label'], $_SERVER["PHP_SELF"], "cp.ref", "", $param, '', $sortfield, $sortorder);
754 $totalarray['nbfield']++;
755}
756if (!empty($arrayfields['cp.fk_user']['checked'])) {
757 print_liste_field_titre($arrayfields['cp.fk_user']['label'], $_SERVER["PHP_SELF"], "cp.fk_user", "", $param, '', $sortfield, $sortorder);
758 $totalarray['nbfield']++;
759}
760if (!empty($arrayfields['cp.fk_validator']['checked'])) {
761 print_liste_field_titre($arrayfields['cp.fk_validator']['label'], $_SERVER["PHP_SELF"], "cp.fk_validator", "", $param, '', $sortfield, $sortorder);
762 $totalarray['nbfield']++;
763}
764if (!empty($arrayfields['cp.fk_type']['checked'])) {
765 print_liste_field_titre($arrayfields['cp.fk_type']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder);
766 $totalarray['nbfield']++;
767}
768if (!empty($arrayfields['duration']['checked'])) {
769 print_liste_field_titre($arrayfields['duration']['label'], $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder, 'right maxwidth100');
770 $totalarray['nbfield']++;
771}
772if (!empty($arrayfields['cp.date_debut']['checked'])) {
773 print_liste_field_titre($arrayfields['cp.date_debut']['label'], $_SERVER["PHP_SELF"], "cp.date_debut", "", $param, '', $sortfield, $sortorder, 'center ');
774 $totalarray['nbfield']++;
775}
776if (!empty($arrayfields['cp.date_fin']['checked'])) {
777 print_liste_field_titre($arrayfields['cp.date_fin']['label'], $_SERVER["PHP_SELF"], "cp.date_fin", "", $param, '', $sortfield, $sortorder, 'center ');
778 $totalarray['nbfield']++;
779}
780if (!empty($arrayfields['cp.date_valid']['checked'])) {
781 print_liste_field_titre($arrayfields['cp.date_valid']['label'], $_SERVER["PHP_SELF"], "cp.date_valid", "", $param, '', $sortfield, $sortorder, 'center ');
782 $totalarray['nbfield']++;
783}
784if (!empty($arrayfields['cp.date_approval']['checked'])) {
785 print_liste_field_titre($arrayfields['cp.date_approval']['label'], $_SERVER["PHP_SELF"], "cp.date_approval", "", $param, '', $sortfield, $sortorder, 'center ');
786 $totalarray['nbfield']++;
787}
788// Extra fields
789include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
790// Hook fields
791$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
792$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
793print $hookmanager->resPrint;
794if (!empty($arrayfields['cp.date_create']['checked'])) {
795 print_liste_field_titre($arrayfields['cp.date_create']['label'], $_SERVER["PHP_SELF"], "cp.date_create", "", $param, '', $sortfield, $sortorder, 'center ');
796 $totalarray['nbfield']++;
797}
798if (!empty($arrayfields['cp.tms']['checked'])) {
799 print_liste_field_titre($arrayfields['cp.tms']['label'], $_SERVER["PHP_SELF"], "cp.tms", "", $param, '', $sortfield, $sortorder, 'center ');
800 $totalarray['nbfield']++;
801}
802if (!empty($arrayfields['cp.statut']['checked'])) {
803 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "cp.statut", "", $param, '', $sortfield, $sortorder, 'center ');
804 $totalarray['nbfield']++;
805}
806// Action column
807if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
808 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
809 $totalarray['nbfield']++;
810}
811print '</tr>'."\n";
812
813$listhalfday = array('morning' => $langs->trans("Morning"), "afternoon" => $langs->trans("Afternoon"));
814
815
816// Loop on record
817// --------------------------------------------------------------------
818
819// If we ask a dedicated card and not allow to see it, we force on user.
820if ($id && !$user->hasRight('holiday', 'readall') && !in_array($id, $childids)) {
821 $langs->load("errors");
822 print '<tr class="oddeven opacitymediuem"><td colspan="10">'.$langs->trans("NotEnoughPermissions").'</td></tr>';
823 $result = 0;
824} elseif ($num > 0 && !empty($mysoc->country_id)) {
825 // Lines
826 $userstatic = new User($db);
827 $approbatorstatic = new User($db);
828
829 $typeleaves = $object->getTypes(1, -1);
830
831 $i = 0;
832 $savnbfield = $totalarray['nbfield'];
833 $totalarray = array();
834 $totalarray['nbfield'] = 0;
835 $totalduration = 0;
836 $imaxinloop = ($limit ? min($num, $limit) : $num);
837 while ($i < $imaxinloop) {
838 $obj = $db->fetch_object($resql);
839 if (empty($obj)) {
840 break; // Should not happen
841 }
842
843 // Leave request
844 $holidaystatic->id = $obj->rowid;
845 $holidaystatic->ref = ($obj->ref ? $obj->ref : $obj->rowid);
846 $holidaystatic->status = $obj->status;
847 $holidaystatic->date_debut = $db->jdate($obj->date_debut);
848 $holidaystatic->date_fin = $db->jdate($obj->date_fin);
849
850 // User
851 $userstatic->id = $obj->fk_user;
852 $userstatic->lastname = $obj->user_lastname;
853 $userstatic->firstname = $obj->user_firstname;
854 $userstatic->admin = $obj->user_admin;
855 $userstatic->email = $obj->user_email;
856 $userstatic->login = $obj->user_login;
857 $userstatic->status = $obj->user_status;
858 $userstatic->photo = $obj->user_photo;
859
860 // Validator
861 $approbatorstatic->id = $obj->fk_validator;
862 $approbatorstatic->lastname = $obj->validator_lastname;
863 $approbatorstatic->firstname = $obj->validator_firstname;
864 $approbatorstatic->admin = $obj->validator_admin;
865 $approbatorstatic->email = $obj->validator_email;
866 $approbatorstatic->login = $obj->validator_login;
867 $approbatorstatic->status = $obj->validator_status;
868 $approbatorstatic->photo = $obj->validator_photo;
869
870 $date = $obj->date_create;
871 $date_modif = $obj->date_modification;
872
873 $starthalfday = ($obj->halfday == -1 || $obj->halfday == 2) ? 'afternoon' : 'morning';
874 $endhalfday = ($obj->halfday == 1 || $obj->halfday == 2) ? 'morning' : 'afternoon';
875
876 $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
877 $totalduration += $nbopenedday;
878
879 if ($mode == 'kanban') {
880 if ($i == 0) {
881 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
882 print '<div class="box-flex-container kanban">';
883 }
884
885 $holidaystatic->fk_type = empty($typeleaves[$obj->fk_type]['rowid']) ? 0 : $typeleaves[$obj->fk_type]['rowid'];
886
887 // Output Kanban
888 if ($massactionbutton || $massaction) {
889 $selected = 0;
890 if (in_array($object->id, $arrayofselected)) {
891 $selected = 1;
892 }
893 if (empty($typeleaves[$obj->fk_type])) {
894 $labeltypeleavetoshow = $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type);
895 } else {
896 $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']);
897 }
898
899 $arraydata = array('user' => $userstatic, 'labeltype' => $labeltypeleavetoshow, 'selected' => $selected, 'nbopenedday' => $nbopenedday);
900 }
901 print $holidaystatic->getKanbanView('', $arraydata);
902 if ($i == ($imaxinloop - 1)) {
903 print '</div>';
904 print '</td></tr>';
905 }
906 } else {
907 // Show here line of result
908 $j = 0;
909 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
910 // Action column
911 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
912 print '<td class="nowrap center">';
913 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
914 $selected = 0;
915 if (in_array($obj->rowid, $arrayofselected)) {
916 $selected = 1;
917 }
918 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
919 }
920 print '</td>';
921 if (!$i) {
922 $totalarray['nbfield']++;
923 }
924 }
925 if (!empty($arrayfields['cp.ref']['checked'])) {
926 print '<td class="nowraponall">';
927 print $holidaystatic->getNomUrl(1, 1);
928 print '</td>';
929 if (!$i) {
930 $totalarray['nbfield']++;
931 }
932 }
933 if (!empty($arrayfields['cp.fk_user']['checked'])) {
934 print '<td class="tdoverflowmax125">'.$userstatic->getNomUrl(-1, 'leave').'</td>';
935 if (!$i) {
936 $totalarray['nbfield']++;
937 }
938 }
939 if (!empty($arrayfields['cp.fk_validator']['checked'])) {
940 print '<td class="tdoverflowmax125">'.$approbatorstatic->getNomUrl(-1).'</td>';
941 if (!$i) {
942 $totalarray['nbfield']++;
943 }
944 }
945 if (!empty($arrayfields['cp.fk_type']['checked'])) {
946 if (empty($typeleaves[$obj->fk_type])) {
947 $labeltypeleavetoshow = $langs->trans("TypeWasDisabledOrRemoved", $obj->fk_type);
948 } else {
949 $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']);
950 }
951
952 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labeltypeleavetoshow).'">';
953 print $labeltypeleavetoshow;
954 print '</td>';
955 if (!$i) {
956 $totalarray['nbfield']++;
957 }
958 }
959 if (!empty($arrayfields['duration']['checked'])) {
960 print '<td class="right">';
961 print $nbopenedday;
962 //print ' '.$langs->trans('DurationDays');
963 print '</td>';
964 if (!$i) {
965 $totalarray['nbfield']++;
966 }
967 }
968 if (!empty($arrayfields['cp.date_debut']['checked'])) {
969 print '<td class="center">';
970 print dol_print_date($db->jdate($obj->date_debut), 'day');
971 print ' <span class="opacitymedium nowraponall">('.$langs->trans($listhalfday[$starthalfday]).')</span>';
972 print '</td>';
973 if (!$i) {
974 $totalarray['nbfield']++;
975 }
976 }
977 if (!empty($arrayfields['cp.date_fin']['checked'])) {
978 print '<td class="center">';
979 print dol_print_date($db->jdate($obj->date_fin), 'day');
980 print ' <span class="opacitymedium nowraponall">('.$langs->trans($listhalfday[$endhalfday]).')</span>';
981 print '</td>';
982 if (!$i) {
983 $totalarray['nbfield']++;
984 }
985 }
986 // Date validation
987 if (!empty($arrayfields['cp.date_valid']['checked'])) { // date_valid is both date_valid but also date_approval
988 print '<td class="center" title="'.dol_print_date($db->jdate($obj->date_valid), 'dayhour').'">';
989 print dol_print_date($db->jdate($obj->date_valid), 'day');
990 print '</td>';
991 if (!$i) {
992 $totalarray['nbfield']++;
993 }
994 }
995 // Date approval
996 if (!empty($arrayfields['cp.date_approval']['checked'])) {
997 print '<td class="center" title="'.dol_print_date($db->jdate($obj->date_approval), 'dayhour').'">';
998 print dol_print_date($db->jdate($obj->date_approval), 'day');
999 print '</td>';
1000 if (!$i) {
1001 $totalarray['nbfield']++;
1002 }
1003 }
1004
1005 // Extra fields
1006 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1007 // Fields from hook
1008 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1009 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1010 print $hookmanager->resPrint;
1011
1012 // Date creation
1013 if (!empty($arrayfields['cp.date_create']['checked'])) {
1014 print '<td style="text-align: center;">'.dol_print_date($date, 'dayhour').'</td>';
1015 if (!$i) {
1016 $totalarray['nbfield']++;
1017 }
1018 }
1019 if (!empty($arrayfields['cp.tms']['checked'])) {
1020 print '<td style="text-align: center;">'.dol_print_date($date_modif, 'dayhour').'</td>';
1021 if (!$i) {
1022 $totalarray['nbfield']++;
1023 }
1024 }
1025 // Status
1026 if (!empty($arrayfields['cp.statut']['checked'])) {
1027 print '<td class="center nowrap">'.$holidaystatic->getLibStatut(5).'</td>';
1028 if (!$i) {
1029 $totalarray['nbfield']++;
1030 }
1031 }
1032
1033 // Action column
1034 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1035 print '<td class="nowrap center">';
1036 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1037 $selected = 0;
1038 if (in_array($obj->rowid, $arrayofselected)) {
1039 $selected = 1;
1040 }
1041 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1042 }
1043 print '</td>';
1044 if (!$i) {
1045 $totalarray['nbfield']++;
1046 }
1047 }
1048
1049 print '</tr>'."\n";
1050 }
1051 $i++;
1052 }
1053
1054 // Add a line for total if there is a total to show
1055 if ($mode != 'kanban' && !empty($arrayfields['duration']['checked'])) {
1056 print '<tr class="total">';
1057 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1058 print '<td></td>';
1059 }
1060 foreach ($arrayfields as $key => $val) {
1061 if (!empty($val['checked'])) {
1062 if ($key == 'duration') {
1063 print '<td class="right">'.$totalduration.' '.$langs->trans('DurationDays').'</td>';
1064 } else {
1065 print '<td></td>';
1066 }
1067 }
1068 }
1069 // status
1070 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1071 print '<td></td>';
1072 }
1073 print '</tr>';
1074 }
1075}
1076
1077// If no record found
1078if ($num == 0) {
1079 $colspan = 1;
1080 foreach ($arrayfields as $key => $val) {
1081 if (!empty($val['checked'])) {
1082 $colspan++;
1083 }
1084 }
1085 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1086}
1087
1088$db->free($resql);
1089
1090$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1091$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1092print $hookmanager->resPrint;
1093
1094print '</table>'."\n";
1095print '</div>'."\n";
1096
1097print '</form>'."\n";
1098
1099// End of page
1100llxFooter();
1101$db->close();
1102
1103
1104
1105
1106
1114function showMyBalance($holiday, $user_id)
1115{
1116 global $langs;
1117
1118 //$alltypeleaves = $holiday->getTypes(1, -1); // To have labels
1119
1120 $out = '';
1121 $nb_holiday = 0;
1122 $typeleaves = $holiday->getTypes(1, 1);
1123 foreach ($typeleaves as $key => $val) {
1124 $nb_type = $holiday->getCPforUser($user_id, $val['rowid']);
1125 $nb_holiday += $nb_type;
1126 $out .= ' - '.$val['label'].': <strong>'.($nb_type ? price2num($nb_type) : 0).'</strong><br>';
1127 }
1128 $out = $langs->trans('SoldeCPUser', round($nb_holiday, 5)).'<br>'.$out;
1129
1130 return $out;
1131}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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.
Class 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:377
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)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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 '.
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...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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.
print_barre_liste($title, $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.
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.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
showMyBalance($holiday, $user_id)
Show balance of user.
Definition list.php:1114
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.