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