dolibarr  17.0.4
peruser.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2003 Eric Seigne <erics@rycks.com>
4  * Copyright (C) 2004-2014 Laurent Destailleur <eldy@users.sourceforge.net>
5  * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
6  * Copyright (C) 2011 Juanjo Menent <jmenent@2byte.es>
7  * Copyright (C) 2014 Cedric GROSS <c.gross@kreiz-it.fr>
8  * Copyright (C) 2018-2019 Frédéric France <frederic.france@netlogic.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <https://www.gnu.org/licenses/>.
22  */
23 
24 
31 // Load Dolibarr environment
32 require '../../main.inc.php';
33 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
40 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
41 
42 
43 if (!isset($conf->global->AGENDA_MAX_EVENTS_DAY_VIEW)) {
44  $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW = 3;
45 }
46 
47 $action = GETPOST('action', 'aZ09');
48 
49 $disabledefaultvalues = GETPOST('disabledefaultvalues', 'int');
50 
51 $filter = GETPOST("search_filter", 'alpha', 3) ? GETPOST("search_filter", 'alpha', 3) : GETPOST("filter", 'alpha', 3);
52 $filtert = GETPOST("search_filtert", "int", 3) ? GETPOST("search_filtert", "int", 3) : GETPOST("filtert", "int", 3);
53 $usergroup = GETPOST("search_usergroup", "int", 3) ? GETPOST("search_usergroup", "int", 3) : GETPOST("usergroup", "int", 3);
54 //if (! ($usergroup > 0) && ! ($filtert > 0)) $filtert = $user->id;
55 //$showbirthday = empty($conf->use_javascript_ajax)?GETPOST("showbirthday","int"):1;
56 $showbirthday = 0;
57 
58 // If not choice done on calendar owner, we filter on user.
59 /*if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS))
60 {
61  $filtert = $user->id;
62 }*/
63 
64 $sortfield = GETPOST('sortfield', 'aZ09comma');
65 $sortorder = GETPOST('sortorder', 'aZ09comma');
66 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
67 if (empty($page) || $page == -1) {
68  $page = 0;
69 } // If $page is not defined, or '' or -1
70 $limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
71 $offset = $limit * $page;
72 if (!$sortorder) {
73  $sortorder = "ASC";
74 }
75 if (!$sortfield) {
76  $sortfield = "a.datec";
77 }
78 
79 $socid = GETPOST("search_socid", "int") ?GETPOST("search_socid", "int") : GETPOST("socid", "int");
80 if ($user->socid) {
81  $socid = $user->socid;
82 }
83 if ($socid < 0) {
84  $socid = '';
85 }
86 
87 $canedit = 1;
88 if (empty($user->rights->agenda->myactions->read)) {
90 }
91 if (empty($user->rights->agenda->allactions->read)) {
92  $canedit = 0;
93 }
94 if (empty($user->rights->agenda->allactions->read) || $filter == 'mine') { // If no permission to see all, we show only affected to me
95  $filtert = $user->id;
96 }
97 
98 $mode = 'show_peruser';
99 $resourceid = GETPOST("search_resourceid", "int") ?GETPOST("search_resourceid", "int") : GETPOST("resourceid", "int");
100 $year = GETPOST("year", "int") ?GETPOST("year", "int") : date("Y");
101 $month = GETPOST("month", "int") ?GETPOST("month", "int") : date("m");
102 $week = GETPOST("week", "int") ?GETPOST("week", "int") : date("W");
103 $day = GETPOST("day", "int") ?GETPOST("day", "int") : date("d");
104 $pid = GETPOSTISSET("search_projectid") ? GETPOST("search_projectid", "int", 3) : GETPOST("projectid", "int", 3);
105 $status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09'); // status may be 0, 50, 100, 'todo', 'na' or -1
106 $type = GETPOSTISSET("search_type") ? GETPOST("search_type", 'alpha') : GETPOST("type", 'alpha');
107 $maxprint = ((GETPOST("maxprint", 'int') != '') ?GETPOST("maxprint", 'int') : $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW);
108 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
109 // Set actioncode (this code must be same for setting actioncode into peruser, listacton and index)
110 if (GETPOST('search_actioncode', 'array:aZ09')) {
111  $actioncode = GETPOST('search_actioncode', 'array:aZ09', 3);
112  if (!count($actioncode)) {
113  $actioncode = '0';
114  }
115 } else {
116  $actioncode = GETPOST("search_actioncode", "alpha", 3) ?GETPOST("search_actioncode", "alpha", 3) : (GETPOST("search_actioncode", "alpha") == '0' ? '0' : ((empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE) || $disabledefaultvalues) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE));
117 }
118 
119 $dateselect = dol_mktime(0, 0, 0, GETPOST('dateselectmonth', 'int'), GETPOST('dateselectday', 'int'), GETPOST('dateselectyear', 'int'));
120 if ($dateselect > 0) {
121  $day = GETPOST('dateselectday', 'int');
122  $month = GETPOST('dateselectmonth', 'int');
123  $year = GETPOST('dateselectyear', 'int');
124 }
125 
126 $tmp = empty($conf->global->MAIN_DEFAULT_WORKING_HOURS) ? '9-18' : $conf->global->MAIN_DEFAULT_WORKING_HOURS;
127 $tmp = str_replace(' ', '', $tmp); // FIX 7533
128 $tmparray = explode('-', $tmp);
129 $begin_h = GETPOST('begin_h', 'int') != '' ? GETPOST('begin_h', 'int') : ($tmparray[0] != '' ? $tmparray[0] : 9);
130 $end_h = GETPOST('end_h', 'int') ? GETPOST('end_h', 'int') : ($tmparray[1] != '' ? $tmparray[1] : 18);
131 if ($begin_h < 0 || $begin_h > 23) {
132  $begin_h = 9;
133 }
134 if ($end_h < 1 || $end_h > 24) {
135  $end_h = 18;
136 }
137 if ($end_h <= $begin_h) {
138  $end_h = $begin_h + 1;
139 }
140 
141 $tmp = empty($conf->global->MAIN_DEFAULT_WORKING_DAYS) ? '1-5' : $conf->global->MAIN_DEFAULT_WORKING_DAYS;
142 $tmp = str_replace(' ', '', $tmp); // FIX 7533
143 $tmparray = explode('-', $tmp);
144 $begin_d = GETPOST('begin_d', 'int') ?GETPOST('begin_d', 'int') : ($tmparray[0] != '' ? $tmparray[0] : 1);
145 $end_d = GETPOST('end_d', 'int') ?GETPOST('end_d', 'int') : ($tmparray[1] != '' ? $tmparray[1] : 5);
146 if ($begin_d < 1 || $begin_d > 7) {
147  $begin_d = 1;
148 }
149 if ($end_d < 1 || $end_d > 7) {
150  $end_d = 7;
151 }
152 if ($end_d < $begin_d) {
153  $end_d = $begin_d + 1;
154 }
155 
156 if ($status == '' && !GETPOSTISSET('search_status')) {
157  $status = ((empty($conf->global->AGENDA_DEFAULT_FILTER_STATUS) || $disabledefaultvalues) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_STATUS);
158 }
159 
160 if (empty($mode) && !GETPOSTISSET('mode')) {
161  $mode = (empty($conf->global->AGENDA_DEFAULT_VIEW) ? 'show_month' : $conf->global->AGENDA_DEFAULT_VIEW);
162 }
163 
164 if (GETPOST('viewcal', 'alpha') && $mode != 'show_day' && $mode != 'show_week' && $mode != 'show_peruser') {
165  $mode = 'show_month'; $day = '';
166 } // View by month
167 if (GETPOST('viewweek', 'alpha') || $mode == 'show_week') {
168  $mode = 'show_week'; $week = ($week ? $week : date("W")); $day = ($day ? $day : date("d"));
169 } // View by week
170 if (GETPOST('viewday', 'alpha') || $mode == 'show_day') {
171  $mode = 'show_day'; $day = ($day ? $day : date("d"));
172 } // View by day
173 
174 $object = new ActionComm($db);
175 
176 // Load translation files required by the page
177 $langs->loadLangs(array('users', 'agenda', 'other', 'commercial'));
178 
179 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
180 $hookmanager->initHooks(array('agenda'));
181 
182 $result = restrictedArea($user, 'agenda', 0, '', 'myactions');
183 if ($user->socid && $socid) {
184  $result = restrictedArea($user, 'societe', $socid);
185 }
186 
187 $search_status = $status;
188 
189 
190 /*
191  * Actions
192  */
193 
194 /*
195 if ($action == 'delete_action' && $user->rights->agenda->delete) {
196  $event = new ActionComm($db);
197  $event->fetch($actionid);
198  $event->fetch_optionals();
199  $event->fetch_userassigned();
200  $event->oldcopy = dol_clone($event);
201 
202  $result = $event->delete();
203 }
204 */
205 
206 
207 /*
208  * View
209  */
210 
211 $parameters = array(
212  'socid' => $socid,
213  'status' => $status,
214  'year' => $year,
215  'month' => $month,
216  'day' => $day,
217  'type' => $type,
218  'maxprint' => $maxprint,
219  'filter' => $filter,
220  'filtert' => $filtert,
221  'showbirthday' => $showbirthday,
222  'canedit' => $canedit,
223  'optioncss' => $optioncss,
224  'actioncode' => $actioncode,
225  'pid' => $pid,
226  'resourceid' => $resourceid,
227  'usergroup' => $usergroup,
228 );
229 $reshook = $hookmanager->executeHooks('beforeAgendaPerUser', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
230 if ($reshook < 0) {
231  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
232 }
233 
234 $form = new Form($db);
235 $companystatic = new Societe($db);
236 
237 $help_url = 'EN:Module_Agenda_En|FR:Module_Agenda|ES:M&oacute;dulo_Agenda';
238 llxHeader('', $langs->trans("Agenda"), $help_url);
239 
240 $now = dol_now();
241 $nowarray = dol_getdate($now);
242 $nowyear = $nowarray['year'];
243 $nowmonth = $nowarray['mon'];
244 $nowday = $nowarray['mday'];
245 
246 
247 // Define list of all external calendars (global setup)
248 $listofextcals = array();
249 
250 $prev = dol_get_first_day_week($day, $month, $year);
251 $first_day = $prev['first_day'];
252 $first_month = $prev['first_month'];
253 $first_year = $prev['first_year'];
254 
255 $week = $prev['week'];
256 
257 $day = (int) $day;
258 $next = dol_get_next_week($day, $week, $month, $year);
259 $next_year = $next['year'];
260 $next_month = $next['month'];
261 $next_day = $next['day'];
262 
263 $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year));
264 
265 $tmpday = $first_day;
266 //print 'xx'.$prev_year.'-'.$prev_month.'-'.$prev_day;
267 //print 'xx'.$next_year.'-'.$next_month.'-'.$next_day;
268 
269 $title = $langs->trans("DoneAndToDoActions");
270 if ($status == 'done') {
271  $title = $langs->trans("DoneActions");
272 }
273 if ($status == 'todo') {
274  $title = $langs->trans("ToDoActions");
275 }
276 
277 $param = '';
278 if ($actioncode || GETPOSTISSET('search_actioncode')) {
279  if (is_array($actioncode)) {
280  foreach ($actioncode as $str_action) {
281  $param .= "&search_actioncode[]=".urlencode($str_action);
282  }
283  } else {
284  $param .= "&search_actioncode=".urlencode($actioncode);
285  }
286 }
287 if ($resourceid > 0) {
288  $param .= "&search_resourceid=".urlencode($resourceid);
289 }
290 
291 if ($status || GETPOSTISSET('status') || GETPOSTISSET('search_status')) {
292  $param .= "&search_status=".urlencode($status);
293 }
294 if ($filter) {
295  $param .= "&search_filter=".urlencode($filter);
296 }
297 if ($filtert) {
298  $param .= "&search_filtert=".urlencode($filtert);
299 }
300 if ($usergroup > 0) {
301  $param .= "&search_usergroup=".urlencode($usergroup);
302 }
303 if ($socid > 0) {
304  $param .= "&search_socid=".urlencode($socid);
305 }
306 if ($showbirthday) {
307  $param .= "&search_showbirthday=1";
308 }
309 if ($pid) {
310  $param .= "&search_projectid=".urlencode($pid);
311 }
312 if ($type) {
313  $param .= "&search_type=".urlencode($type);
314 }
315 if ($mode != 'show_peruser') {
316  $param .= '&mode='.urlencode($mode);
317 }
318 if ($begin_h != '') {
319  $param .= '&begin_h='.urlencode($begin_h);
320 }
321 if ($end_h != '') {
322  $param .= '&end_h='.urlencode($end_h);
323 }
324 if ($begin_d != '') {
325  $param .= '&begin_d='.urlencode($begin_d);
326 }
327 if ($end_d != '') {
328  $param .= '&end_d='.urlencode($end_d);
329 }
330 $param .= "&maxprint=".urlencode($maxprint);
331 
332 $paramnoactionodate = $param;
333 
334 $prev = dol_get_first_day_week($day, $month, $year);
335 //print "day=".$day." month=".$month." year=".$year;
336 //var_dump($prev); exit;
337 $prev_year = $prev['prev_year'];
338 $prev_month = $prev['prev_month'];
339 $prev_day = $prev['prev_day'];
340 $first_day = $prev['first_day'];
341 $first_month = $prev['first_month'];
342 $first_year = $prev['first_year'];
343 
344 $week = $prev['week'];
345 
346 $day = (int) $day;
347 $next = dol_get_next_week($first_day, $week, $first_month, $first_year);
348 $next_year = $next['year'];
349 $next_month = $next['month'];
350 $next_day = $next['day'];
351 
352 // Define firstdaytoshow and lastdaytoshow. Warning: lastdaytoshow is last second to show + 1
353 // $firstdaytoshow and lastdaytoshow become a gmt dates to use to search/compare because first_xxx are in tz idea and we used tzuserrel
354 $firstdaytoshow = dol_mktime(0, 0, 0, $first_month, $first_day, $first_year, 'tzuserrel');
355 $nb_weeks_to_show = (!empty($conf->global->AGENDA_NB_WEEKS_IN_VIEW_PER_USER)) ? ((int) $conf->global->AGENDA_NB_WEEKS_IN_VIEW_PER_USER * 7) : 7;
356 $lastdaytoshow = dol_time_plus_duree($firstdaytoshow, $nb_weeks_to_show, 'd');
357 //print $firstday.'-'.$first_month.'-'.$first_year;
358 //print dol_print_date($firstdaytoshow, 'dayhour', 'gmt');
359 //print dol_print_date($lastdaytoshow,'dayhour', 'gmt');
360 
361 $max_day_in_month = date("t", dol_mktime(0, 0, 0, $month, 1, $year, 'gmt'));
362 
363 $tmpday = $first_day;
364 $picto = 'calendarweek';
365 
366 $nav = "<a href=\"?year=".$prev_year."&amp;month=".$prev_month."&amp;day=".$prev_day.$param."\"><i class=\"fa fa-chevron-left\" title=\"".dol_escape_htmltag($langs->trans("Previous"))."\"></i></a> &nbsp; \n";
367 $nav .= " <span id=\"month_name\">".dol_print_date(dol_mktime(0, 0, 0, $first_month, $first_day, $first_year), "%Y").", ".$langs->trans("Week")." ".$week;
368 $nav .= " </span>\n";
369 $nav .= " &nbsp; <a href=\"?year=".$next_year."&amp;month=".$next_month."&amp;day=".$next_day.$param."\"><i class=\"fa fa-chevron-right\" title=\"".dol_escape_htmltag($langs->trans("Next"))."\"></i></a>\n";
370 if (empty($conf->dol_optimize_smallscreen)) {
371  $nav .= " &nbsp; <a href=\"?year=".$nowyear."&amp;month=".$nowmonth."&amp;day=".$nowday.$param."\">".$langs->trans("Today")."</a> ";
372 }
373 $nav .= $form->selectDate($dateselect, 'dateselect', 0, 0, 1, '', 1, 0);
374 $nav .= ' <button type="submit" class="liste_titre button_search" name="button_search_x" value="x"><span class="fa fa-search"></span></button>';
375 
376 // Must be after the nav definition
377 $param .= '&year='.urlencode($year).'&month='.urlencode($month).($day ? '&day='.urlencode($day) : '');
378 //print 'x'.$param;
379 
380 
381 $paramnoaction = preg_replace('/action=[a-z_]+/', '', $param);
382 
383 $head = calendars_prepare_head($paramnoaction);
384 
385 print '<form method="POST" id="searchFormList" class="listactionsfilter" action="'.$_SERVER["PHP_SELF"].'">'."\n";
386 
387 $showextcals = $listofextcals;
388 // Legend
389 if ($conf->use_javascript_ajax) {
390  $s = '';
391  $s .= '<script type="text/javascript">'."\n";
392  $s .= 'jQuery(document).ready(function () {'."\n";
393  $s .= 'jQuery("#check_mytasks").click(function() { jQuery(".family_mytasks").toggle(); jQuery(".family_other").toggle(); });'."\n";
394  $s .= 'jQuery("#check_birthday").click(function() { jQuery(".family_birthday").toggle(); });'."\n";
395  $s .= 'jQuery(".family_birthday").toggle();'."\n";
396  if ($mode == "show_week" || $mode == "show_month" || empty($mode)) {
397  $s .= 'jQuery( "td.sortable" ).sortable({connectWith: ".sortable",placeholder: "ui-state-highlight",items: "div:not(.unsortable)", receive: function( event, ui ) {';
398  }
399  $s .= '});'."\n";
400  $s .= '</script>'."\n";
401  if (!empty($conf->use_javascript_ajax)) {
402  $s .= '<div class="nowrap clear float"><input type="checkbox" id="check_mytasks" name="check_mytasks" checked disabled> '.$langs->trans("LocalAgenda").' &nbsp; </div>';
403  if (is_array($showextcals) && count($showextcals) > 0) {
404  foreach ($showextcals as $val) {
405  $htmlname = md5($val['name']);
406  $s .= '<script type="text/javascript">'."\n";
407  $s .= 'jQuery(document).ready(function () {'."\n";
408  $s .= ' jQuery("#check_ext'.$htmlname.'").click(function() {';
409  $s .= ' /* alert("'.$htmlname.'"); */';
410  $s .= ' jQuery(".family_ext'.$htmlname.'").toggle();';
411  $s .= ' });'."\n";
412  $s .= '});'."\n";
413  $s .= '</script>'."\n";
414  $s .= '<div class="nowrap float"><input type="checkbox" id="check_ext'.$htmlname.'" name="check_ext'.$htmlname.'" checked> '.$val ['name'].' &nbsp; </div>';
415  }
416  }
417 
418  //$s.='<div class="nowrap float"><input type="checkbox" id="check_birthday" name="check_birthday"> '.$langs->trans("AgendaShowBirthdayEvents").' &nbsp; </div>';
419 
420  // Calendars from hooks
421  $parameters = array();
422  $reshook = $hookmanager->executeHooks('addCalendarChoice', $parameters, $object, $action);
423  if (empty($reshook)) {
424  $s .= $hookmanager->resPrint;
425  } elseif ($reshook > 1) {
426  $s = $hookmanager->resPrint;
427  }
428  }
429 }
430 
431 $massactionbutton = '';
432 
433 $viewmode = '';
434 $viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&restore_lastsearch_values=1'.$paramnoactionodate.'">';
435 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
436 $viewmode .= img_picto($langs->trans("List"), 'object_calendarlist', 'class="imgforviewmode pictoactionview block"');
437 //$viewmode .= '</span>';
438 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewList").'</span></a>';
439 
440 $viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_month&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').$paramnoactionodate.'">';
441 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
442 $viewmode .= img_picto($langs->trans("ViewCal"), 'object_calendarmonth', 'class="pictoactionview block"');
443 //$viewmode .= '</span>';
444 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewCal").'</span></a>';
445 
446 $viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_week&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').$paramnoactionodate.'">';
447 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
448 $viewmode .= img_picto($langs->trans("ViewWeek"), 'object_calendarweek', 'class="pictoactionview block"');
449 //$viewmode .= '</span>';
450 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewWeek").'</span></a>';
451 
452 $viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_day&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').$paramnoactionodate.'">';
453 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
454 $viewmode .= img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="pictoactionview block"');
455 //$viewmode .= '</span>';
456 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewDay").'</span></a>';
457 
458 $viewmode .= '<a class="btnTitle btnTitleSelected reposition marginrightonly" href="'.DOL_URL_ROOT.'/comm/action/peruser.php?mode=show_peruser&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').$paramnoactionodate.'">';
459 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
460 $viewmode .= img_picto($langs->trans("ViewPerUser"), 'object_calendarperuser', 'class="pictoactionview block"');
461 //$viewmode .= '</span>';
462 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewPerUser").'</span></a>';
463 
464 $viewmode .= '<span class="marginrightonly"></span>';
465 
466 // Add more views from hooks
467 $parameters = array(); $object = null;
468 $reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
469 if (empty($reshook)) {
470  $viewmode .= $hookmanager->resPrint;
471 } elseif ($reshook > 1) {
472  $viewmode = $hookmanager->resPrint;
473 }
474 
475 
476 $newparam = '';
477 $newcardbutton = '';
478 if ($user->rights->agenda->myactions->create || $user->rights->agenda->allactions->create) {
479  $tmpforcreatebutton = dol_getdate(dol_now(), true);
480 
481  $newparam .= '&month='.urlencode(str_pad($month, 2, "0", STR_PAD_LEFT)).'&year='.urlencode($tmpforcreatebutton['year']);
482  if ($begin_h !== '') {
483  $newparam .= '&begin_h='.urlencode($begin_h);
484  }
485  if ($end_h !== '') {
486  $newparam .= '&end_h='.urlencode($end_h);
487  }
488  if ($begin_d !== '') {
489  $newparam .= '&begin_d='.urlencode($begin_d);
490  }
491  if ($end_d !== '') {
492  $newparam .= '&end_d='.urlencode($end_d);
493  }
494 
495  //$param='month='.$monthshown.'&year='.$year;
496  $hourminsec = '100000';
497  $newcardbutton .= dolGetButtonTitle($langs->trans("AddAction"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create&datep='.sprintf("%04d%02d%02d", $tmpforcreatebutton['year'], $tmpforcreatebutton['mon'], $tmpforcreatebutton['mday']).$hourminsec.'&backtopage='.urlencode($_SERVER["PHP_SELF"].($newparam ? '?'.$newparam : '')));
498 }
499 
500 $num = '';
501 
502 print_barre_liste($langs->trans("Agenda"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, -1, 'object_action', 0, $nav.'<span class="marginleftonly"></span>'.$newcardbutton, '', $limit, 1, 0, 1, $viewmode);
503 
504 $link = '';
505 //print load_fiche_titre('', $link.' &nbsp; &nbsp; '.$nav.' '.$newcardbutton, '');
506 
507 // Local calendar
508 $newtitle = '<div class="nowrap clear inline-block minheight30">';
509 $newtitle .= '<input type="checkbox" id="check_mytasks" name="check_mytasks" checked disabled> '.$langs->trans("LocalAgenda").' &nbsp; ';
510 $newtitle .= '</div>';
511 //$newtitle=$langs->trans($title);
512 
513 $s = $newtitle;
514 
515 print $s;
516 
517 print '<div class="liste_titre liste_titre_bydiv centpercent">';
518 print_actions_filter($form, $canedit, $search_status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid);
519 print '</div>';
520 
521 
522 // Get event in an array
523 $eventarray = array();
524 
525 
526 // DEFAULT CALENDAR + AUTOEVENT CALENDAR + CONFERENCEBOOTH CALENDAR
527 $sql = 'SELECT';
528 if ($usergroup > 0) {
529  $sql .= " DISTINCT";
530 }
531 $sql .= ' a.id, a.label,';
532 $sql .= ' a.datep,';
533 $sql .= ' a.datep2,';
534 $sql .= ' a.percent,';
535 $sql .= ' a.fk_user_author,a.fk_user_action,';
536 $sql .= ' a.transparency, a.priority, a.fulldayevent, a.location,';
537 $sql .= ' a.fk_soc, a.fk_contact, a.fk_element, a.elementtype, a.fk_project,';
538 $sql .= ' ca.code, ca.libelle as type_label, ca.color, ca.type as type_type, ca.picto as type_picto';
539 $sql .= ' FROM '.MAIN_DB_PREFIX.'c_actioncomm as ca, '.MAIN_DB_PREFIX."actioncomm as a";
540 if (empty($user->rights->societe->client->voir) && !$socid) {
541  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON a.fk_soc = sc.fk_soc";
542 }
543 // We must filter on resource table
544 if ($resourceid > 0) {
545  $sql .= ", ".MAIN_DB_PREFIX."element_resources as r";
546 }
547 // We must filter on assignement table
548 if ($filtert > 0 || $usergroup > 0) {
549  $sql .= ", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
550 }
551 if ($usergroup > 0) {
552  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element";
553 }
554 $sql .= ' WHERE a.fk_action = ca.id';
555 $sql .= ' AND a.entity IN ('.getEntity('agenda').')';
556 // Condition on actioncode
557 if (!empty($actioncode)) {
558  if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
559  if ($actioncode == 'AC_NON_AUTO') {
560  $sql .= " AND ca.type != 'systemauto'";
561  } elseif ($actioncode == 'AC_ALL_AUTO') {
562  $sql .= " AND ca.type = 'systemauto'";
563  } else {
564  if ($actioncode == 'AC_OTH') {
565  $sql .= " AND ca.type != 'systemauto'";
566  }
567  if ($actioncode == 'AC_OTH_AUTO') {
568  $sql .= " AND ca.type = 'systemauto'";
569  }
570  }
571  } else {
572  if ($actioncode == 'AC_NON_AUTO') {
573  $sql .= " AND ca.type != 'systemauto'";
574  } elseif ($actioncode == 'AC_ALL_AUTO') {
575  $sql .= " AND ca.type = 'systemauto'";
576  } else {
577  if (is_array($actioncode)) {
578  $sql .= " AND ca.code IN (".$db->sanitize("'".implode("','", $actioncode)."'", 1).")";
579  } else {
580  $sql .= " AND ca.code IN (".$db->sanitize("'".implode("','", explode(',', $actioncode))."'", 1).")";
581  }
582  }
583  }
584 }
585 if ($resourceid > 0) {
586  $sql .= " AND r.element_type = 'action' AND r.element_id = a.id AND r.resource_id = ".((int) $resourceid);
587 }
588 if ($pid) {
589  $sql .= " AND a.fk_project = ".((int) $pid);
590 }
591 if (empty($user->rights->societe->client->voir) && !$socid) {
592  $sql .= " AND (a.fk_soc IS NULL OR sc.fk_user = ".((int) $user->id).")";
593 }
594 if ($socid > 0) {
595  $sql .= ' AND a.fk_soc = '.((int) $socid);
596 }
597 // We must filter on assignement table
598 if ($filtert > 0 || $usergroup > 0) {
599  $sql .= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
600 }
601 if ($mode == 'show_day') {
602  $sql .= " AND (";
603  $sql .= " (a.datep BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
604  $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
605  $sql .= " OR ";
606  $sql .= " (a.datep2 BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
607  $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
608  $sql .= " OR ";
609  $sql .= " (a.datep < '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
610  $sql .= " AND a.datep2 > '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
611  $sql .= ')';
612 } else {
613  // To limit array
614  $sql .= " AND (";
615  $sql .= " (a.datep BETWEEN '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'"; // Start 2 day before $firstdaytoshow
616  $sql .= " AND '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')"; // End 2 day after $lastdaytoshow
617  $sql .= " OR ";
618  $sql .= " (a.datep2 BETWEEN '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'";
619  $sql .= " AND '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')";
620  $sql .= " OR ";
621  $sql .= " (a.datep < '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'";
622  $sql .= " AND a.datep2 > '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')";
623  $sql .= ')';
624 }
625 if ($type) {
626  $sql .= " AND ca.id = ".((int) $type);
627 }
628 if ($status == '0') {
629  $sql .= " AND a.percent = 0";
630 }
631 if ($status == 'na') {
632  // Not applicable
633  $sql .= " AND a.percent = -1";
634 }
635 if ($status == '50') {
636  // Running already started
637  $sql .= " AND (a.percent > 0 AND a.percent < 100)";
638 }
639 if ($status == 'done' || $status == '100') {
640  $sql .= " AND (a.percent = 100)";
641 }
642 if ($status == 'todo') {
643  $sql .= " AND (a.percent >= 0 AND a.percent < 100)";
644 }
645 // We must filter on assignement table
646 if ($filtert > 0 || $usergroup > 0) {
647  $sql .= " AND (";
648  if ($filtert > 0) {
649  $sql .= "ar.fk_element = ".$filtert;
650  }
651  if ($usergroup > 0) {
652  $sql .= ($filtert > 0 ? " OR " : "")." ugu.fk_usergroup = ".((int) $usergroup);
653  }
654  $sql .= ")";
655 }
656 // Sort on date
657 $sql .= ' ORDER BY fk_user_action, datep'; //fk_user_action
658 //print $sql;
659 
660 
661 dol_syslog("comm/action/peruser.php", LOG_DEBUG);
662 $resql = $db->query($sql);
663 if ($resql) {
664  $num = $db->num_rows($resql);
665 
666  $i = 0;
667  while ($i < $num) {
668  $obj = $db->fetch_object($resql);
669  //print $obj->fk_user_action.' '.$obj->id."<br>";
670 
671  // Discard auto action if option is on
672  if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO) && $obj->code == 'AC_OTH_AUTO') {
673  $i++;
674  continue;
675  }
676 
677  $datep = $db->jdate($obj->datep);
678  $datep2 = $db->jdate($obj->datep2);
679 
680 
681  // Create a new object action
682  $event = new ActionComm($db);
683  $event->id = $obj->id;
684  $event->datep = $datep; // datep and datef are GMT date
685  $event->datef = $datep2;
686  $event->type_code = $obj->code;
687  $event->type_color = $obj->color;
688  $event->label = $obj->label;
689  $event->percentage = $obj->percent;
690  $event->authorid = $obj->fk_user_author; // user id of creator
691  $event->userownerid = $obj->fk_user_action; // user id of owner
692  $event->priority = $obj->priority;
693  $event->fulldayevent = $obj->fulldayevent;
694  $event->location = $obj->location;
695  $event->transparency = $obj->transparency;
696 
697  $event->fk_project = $obj->fk_project;
698 
699  $event->socid = $obj->fk_soc;
700  $event->contact_id = $obj->fk_contact;
701 
702  $event->fk_element = $obj->fk_element;
703  $event->elementtype = $obj->elementtype;
704 
705  // Defined date_start_in_calendar and date_end_in_calendar property
706  // They are date start and end of action but modified to not be outside calendar view.
707  if ($event->percentage <= 0) {
708  $event->date_start_in_calendar = $datep;
709  if ($datep2 != '' && $datep2 >= $datep) {
710  $event->date_end_in_calendar = $datep2;
711  } else {
712  $event->date_end_in_calendar = $datep;
713  }
714  } else {
715  $event->date_start_in_calendar = $datep;
716  if ($datep2 != '' && $datep2 >= $datep) {
717  $event->date_end_in_calendar = $datep2;
718  } else {
719  $event->date_end_in_calendar = $datep;
720  }
721  }
722 
723  //print '<br>'.$i.' - eventid='.$event->id.' '.dol_print_date($event->date_start_in_calendar, 'dayhour').' '.dol_print_date($firstdaytoshow, 'dayhour').' - '.dol_print_date($event->date_end_in_calendar, 'dayhour').' '.dol_print_date($lastdaytoshow, 'dayhour').'<br>'."\n";
724 
725  // Check values
726  if ($event->date_end_in_calendar < $firstdaytoshow ||
727  $event->date_start_in_calendar >= $lastdaytoshow) {
728  // This record is out of visible range
729  unset($event);
730  } else {
731  //print $i.' - eventid='.$event->id.' '.dol_print_date($event->date_start_in_calendar, 'dayhour').' - '.dol_print_date($event->date_end_in_calendar, 'dayhour').'<br>'."\n";
732  $event->fetch_userassigned(); // This load $event->userassigned
733 
734  if ($event->date_start_in_calendar < $firstdaytoshow) {
735  $event->date_start_in_calendar = $firstdaytoshow;
736  }
737  if ($event->date_end_in_calendar >= $lastdaytoshow) {
738  $event->date_end_in_calendar = ($lastdaytoshow - 1);
739  }
740 
741  // Add an entry in actionarray for each day
742  $daycursor = $event->date_start_in_calendar;
743  $annee = dol_print_date($daycursor, '%Y', 'tzuserrel');
744  $mois = dol_print_date($daycursor, '%m', 'tzuserrel');
745  $jour = dol_print_date($daycursor, '%d', 'tzuserrel');
746  //print $daycursor.' '.dol_print_date($daycursor, 'dayhour', 'gmt').' '.$event->id.' -> '.$annee.'-'.$mois.'-'.$jour.'<br>';
747 
748  // Loop on each day covered by action to prepare an index to show on calendar
749  $loop = true; $j = 0;
750  $daykey = dol_mktime(0, 0, 0, $mois, $jour, $annee, 'gmt');
751  do {
752  //print 'Add event into eventarray for daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$event->id.' '.$event->datep.' '.$event->datef.'<br>';
753 
754  $eventarray[$daykey][] = $event;
755  $j++;
756 
757  $daykey += 60 * 60 * 24;
758  if ($daykey > $event->date_end_in_calendar) {
759  $loop = false;
760  }
761  } while ($loop);
762 
763  //print 'Event '.$i.' id='.$event->id.' (start='.dol_print_date($event->datep).'-end='.dol_print_date($event->datef);
764  //print ' startincalendar='.dol_print_date($event->date_start_in_calendar).'-endincalendar='.dol_print_date($event->date_end_in_calendar).') was added in '.$j.' different index key of array<br>';
765  }
766  $i++;
767  }
768  $db->free($resql);
769 } else {
770  dol_print_error($db);
771 }
772 
773 $maxnbofchar = 18;
774 $cachethirdparties = array();
775 $cachecontacts = array();
776 $cacheusers = array();
777 
778 // Define theme_datacolor array
779 $color_file = DOL_DOCUMENT_ROOT."/theme/".$conf->theme."/theme_vars.inc.php";
780 if (is_readable($color_file)) {
781  include $color_file;
782 }
783 if (!is_array($theme_datacolor)) {
784  $theme_datacolor = array(array(120, 130, 150), array(200, 160, 180), array(190, 190, 220));
785 }
786 
787 
788 $newparam = $param; // newparam is for birthday links
789 $newparam = preg_replace('/showbirthday=/i', 'showbirthday_=', $newparam); // To avoid replacement when replace day= is done
790 $newparam = preg_replace('/mode=show_month&?/i', '', $newparam);
791 $newparam = preg_replace('/mode=show_week&?/i', '', $newparam);
792 $newparam = preg_replace('/day=[0-9]+&?/i', '', $newparam);
793 $newparam = preg_replace('/month=[0-9]+&?/i', '', $newparam);
794 $newparam = preg_replace('/year=[0-9]+&?/i', '', $newparam);
795 $newparam = preg_replace('/viewweek=[0-9]+&?/i', '', $newparam);
796 $newparam = preg_replace('/showbirthday_=/i', 'showbirthday=', $newparam); // Restore correct parameter
797 $newparam .= '&viewweek=1';
798 
799 echo '<input type="hidden" name="actionmove" value="mupdate">';
800 echo '<input type="hidden" name="backtopage" value="'.dol_escape_htmltag($_SERVER['PHP_SELF']).'?'.dol_escape_htmltag($_SERVER['QUERY_STRING']).'">';
801 echo '<input type="hidden" name="newdate" id="newdate">';
802 
803 
804 // Line header with list of days
805 
806 //print "begin_d=".$begin_d." end_d=".$end_d;
807 
808 $currentdaytoshow = $firstdaytoshow;
809 echo '<div class="div-table-responsive">';
810 //print dol_print_date($currentdaytoshow, 'dayhour', 'gmt');
811 
812 while ($currentdaytoshow < $lastdaytoshow) {
813  echo '<table class="centpercent noborder nocellnopadd cal_month">';
814 
815  echo '<tr class="liste_titre">';
816  echo '<td class="nopaddingtopimp nopaddingbottomimp nowraponsmartphone">';
817 
818  if ($canedit && $mode == 'show_peruser') {
819  // Filter on hours
820  print img_picto('', 'clock', 'class="fawidth30 inline-block paddingleft"');
821  print '<span class="hideonsmartphone" title="'.$langs->trans("VisibleTimeRange").'">'.$langs->trans("Hours").'</span>';
822  print "\n".'<div class="ui-grid-a inline-block"><div class="ui-block-a nowraponall">';
823  print '<input type="number" class="short" name="begin_h" value="'.$begin_h.'" min="0" max="23">';
824  if (empty($conf->dol_use_jmobile)) {
825  print ' - ';
826  } else {
827  print '</div><div class="ui-block-b">';
828  }
829  print '<input type="number" class="short" name="end_h" value="'.$end_h.'" min="1" max="24">';
830  if (empty($conf->dol_use_jmobile)) {
831  print ' '.$langs->trans("H");
832  }
833  print '</div></div>';
834 
835  print '<br>';
836 
837  // Filter on days
838  print img_picto('', 'clock', 'class="fawidth30 inline-block paddingleft"');
839  print '<span class="hideonsmartphone" title="'.$langs->trans("VisibleDaysRange").'">'.$langs->trans("DaysOfWeek").'</span>';
840  print "\n".'<div class="ui-grid-a inline-block"><div class="ui-block-a nowraponall">';
841  print '<input type="number" class="short" name="begin_d" value="'.$begin_d.'" min="1" max="7">';
842  if (empty($conf->dol_use_jmobile)) {
843  print ' - ';
844  } else {
845  print '</div><div class="ui-block-b">';
846  }
847  print '<input type="number" class="short" name="end_d" value="'.$end_d.'" min="1" max="7">';
848  print '</div></div>';
849  }
850 
851  print '</td>';
852  $i = 0; // 0 = sunday,
853  while ($i < 7) {
854  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
855  $i++;
856  continue;
857  }
858  echo '<td align="center" colspan="'.($end_h - $begin_h).'">';
859  echo '<span class="bold spandayofweek">'.$langs->trans("Day".(($i + (isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : 1)) % 7)).'</span>';
860  print "<br>";
861  if ($i) {
862  print dol_print_date(dol_time_plus_duree($currentdaytoshow, $i, 'd'), 'day', 'tzuserrel');
863  } else {
864  print dol_print_date($currentdaytoshow, 'day', 'tzuserrel');
865  }
866  echo "</td>\n";
867  $i++;
868  }
869  echo "</tr>\n";
870 
871  echo '<tr class="liste_titre">';
872  echo '<td></td>';
873  $i = 0;
874  while ($i < 7) {
875  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
876  $i++;
877  continue;
878  }
879  for ($h = $begin_h; $h < $end_h; $h++) {
880  echo '<td class="center">';
881  print '<small style="font-family: courier">'.sprintf("%02d", $h).'</small>';
882  print "</td>";
883  }
884  echo "</td>\n";
885  $i++;
886  }
887  echo "</tr>\n";
888 
889 
890  // Define $usernames
891  $usernames = array(); //init
892  $usernamesid = array();
893  /* Use this to have list of users only if users have events */
894  if (!empty($conf->global->AGENDA_SHOWOWNERONLY_ONPERUSERVIEW)) {
895  foreach ($eventarray as $daykey => $notused) {
896  // Get all assigned users for each event
897  foreach ($eventarray[$daykey] as $index => $event) {
898  $event->fetch_userassigned();
899  $listofuserid = $event->userassigned;
900  foreach ($listofuserid as $userid => $tmp) {
901  if (!in_array($userid, $usernamesid)) {
902  $usernamesid[$userid] = $userid;
903  }
904  }
905  }
906  }
907  } else {
908  /* Use this list to have for all users */
909  $sql = "SELECT DISTINCT u.rowid, u.lastname as lastname, u.firstname, u.statut, u.login, u.admin, u.entity";
910  $sql .= " FROM ".MAIN_DB_PREFIX."user as u";
911  if (isModEnabled('multicompany') && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
912  $sql .= ", ".MAIN_DB_PREFIX."usergroup_user as ug";
913  $sql .= " WHERE ug.entity IN (".getEntity('usergroup').")";
914  $sql .= " AND ug.fk_user = u.rowid ";
915  } else {
916  if ($usergroup > 0) {
917  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ug ON u.rowid = ug.fk_user";
918  }
919  $sql .= " WHERE u.entity IN (".getEntity('user').")";
920  }
921  $sql .= " AND u.statut = 1";
922  if ($usergroup > 0) {
923  $sql .= " AND ug.fk_usergroup = ".((int) $usergroup);
924  }
925  if ($user->socid > 0) {
926  // External users should see only contacts of their company
927  $sql .= " AND u.fk_soc = ".((int) $user->socid);
928  }
929 
930  //print $sql;
931  $resql = $db->query($sql);
932  if ($resql) {
933  $num = $db->num_rows($resql);
934  $i = 0;
935  if ($num) {
936  while ($i < $num) {
937  $obj = $db->fetch_object($resql);
938  $usernamesid[$obj->rowid] = $obj->rowid;
939  $i++;
940  }
941  }
942  } else {
943  dol_print_error($db);
944  }
945  }
946  //var_dump($usernamesid);
947  foreach ($usernamesid as $id) {
948  $tmpuser = new User($db);
949  $result = $tmpuser->fetch($id);
950  $usernames[] = $tmpuser;
951  }
952 
953  // Load array of colors by type
954  $colorsbytype = array();
955  $labelbytype = array();
956  $sql = "SELECT code, color, libelle as label FROM ".MAIN_DB_PREFIX."c_actioncomm ORDER BY position";
957  $resql = $db->query($sql);
958  while ($obj = $db->fetch_object($resql)) {
959  $colorsbytype[$obj->code] = $obj->color;
960  $labelbytype[$obj->code] = $obj->label;
961  }
962 
963  // Loop on each user to show calendar
964  $todayarray = dol_getdate($now, 'fast');
965  $sav = $tmpday;
966  $showheader = true;
967  $var = false;
968  foreach ($usernames as $username) {
969  //if ($username->login != 'admin') continue;
970 
971  $var = !$var;
972  echo "<tr>";
973  echo '<td class="tdoverflowmax100 cal_current_month cal_peruserviewname'.($var ? ' cal_impair' : '').'">';
974  print $username->getNomUrl(-1, '', 0, 0, 20, 1, '');
975  print '</td>';
976  $tmpday = $sav;
977 
978  // Lopp on each day of week
979  $i = 0;
980  for ($iter_day = 0; $iter_day < 8; $iter_day++) {
981  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
982  $i++;
983  continue;
984  }
985 
986  // Show days of the current week
987  $curtime = dol_time_plus_duree($currentdaytoshow, $iter_day, 'd');
988  // $curtime is a gmt time, but we want the day, month, year in user TZ
989  $tmpday = dol_print_date($curtime, "%d", "tzuserrel");
990  $tmpmonth = dol_print_date($curtime, "%m", "tzuserrel");
991  $tmpyear = dol_print_date($curtime, "%Y", "tzuserrel");
992  //var_dump($curtime.' '.$tmpday.' '.$tmpmonth.' '.$tmpyear);
993 
994  $style = 'cal_current_month';
995  if ($iter_day == 6) {
996  $style .= ' cal_other_month';
997  }
998  $today = 0;
999  if ($todayarray['mday'] == $tmpday && $todayarray['mon'] == $tmpmonth && $todayarray['year'] == $tmpyear) {
1000  $today = 1;
1001  }
1002  if ($today) {
1003  $style = 'cal_today_peruser';
1004  }
1005 
1006  show_day_events2($username, $tmpday, $tmpmonth, $tmpyear, 0, $style, $eventarray, 0, $maxnbofchar, $newparam, 1, 300, $showheader, $colorsbytype, $var);
1007 
1008  $i++;
1009  }
1010  echo "</tr>\n";
1011  $showheader = false;
1012  }
1013 
1014  echo "</table>\n";
1015  echo "<br>";
1016 
1017  $currentdaytoshow = dol_time_plus_duree($currentdaytoshow, 7, 'd');
1018 }
1019 
1020 echo '</div>';
1021 
1022 if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && !empty($conf->global->AGENDA_USE_COLOR_PER_EVENT_TYPE)) {
1023  $langs->load("commercial");
1024  print '<br>'.$langs->trans("Legend").': <br>';
1025  foreach ($colorsbytype as $code => $color) {
1026  if ($color) {
1027  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div style="'.($color ? 'background: #'.$color.';' : '').'width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1028  print $langs->trans("Action".$code) != "Action".$code ? $langs->trans("Action".$code) : $labelbytype[$code];
1029  //print $code;
1030  print '</div>';
1031  }
1032  }
1033  //$color=sprintf("%02x%02x%02x",$theme_datacolor[0][0],$theme_datacolor[0][1],$theme_datacolor[0][2]);
1034  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div class="peruser_busy" style="width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1035  print $langs->trans("Other");
1036  print '</div>';
1037  /* TODO Show this if at least one cumulated event
1038  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div style="background: #222222; width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1039  print $langs->trans("SeveralEvents");
1040  print '</div>';
1041  */
1042 }
1043 
1044 print "\n".'</form>';
1045 print "\n";
1046 
1047 // Add js code to manage click on a box
1048 print '<script type="text/javascript">
1049 jQuery(document).ready(function() {
1050  jQuery(".onclickopenref").click(function() {
1051  var ref=$(this).attr(\'ref\');
1052  var res = ref.split("_");
1053  var userid = res[1];
1054  var year = res[2];
1055  var month = res[3];
1056  var day = res[4];
1057  var hour = res[5];
1058  var min = res[6];
1059  var ids = res[7];
1060  if (ids == \'none\') /* No event */
1061  {
1062  /* alert(\'no event\'); */
1063  url = "'.DOL_URL_ROOT.'/comm/action/card.php?action=create&assignedtouser="+userid+"&datep="+year+month+day+hour+min+"00&backtopage='.urlencode($_SERVER["PHP_SELF"].'?year='.$year.'&month='.$month.'&day='.$day.($begin_h !== '' ? '&begin_h='.$begin_h : '').($end_h !== '' ? '&end_h='.$end_h : '').($begin_d !== '' ? '&begin_d='.$begin_d : '').($end_d !== '' ? '&end_d='.$end_d : '')).'"
1064  window.location.href = url;
1065  }
1066  else if (ids.indexOf(",") > -1) /* There is several events */
1067  {
1068  /* alert(\'several events\'); */
1069  url = "'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&filtert="+userid+"&dateselectyear="+year+"&dateselectmonth="+month+"&dateselectday="+day;
1070  window.location.href = url;
1071  }
1072  else /* One event */
1073  {
1074  /* alert(\'one event\'); */
1075  url = "'.DOL_URL_ROOT.'/comm/action/card.php?action=view&id="+ids
1076  window.location.href = url;
1077  }
1078  });
1079 });
1080 </script>';
1081 
1082 // End of page
1083 llxFooter();
1084 $db->close();
1085 
1086 
1087 
1088 
1109 function show_day_events2($username, $day, $month, $year, $monthshown, $style, &$eventarray, $maxprint = 0, $maxnbofchar = 16, $newparam = '', $showinfo = 0, $minheight = 60, $showheader = false, $colorsbytype = array(), $var = false)
1110 {
1111  global $db;
1112  global $user, $conf, $langs, $hookmanager, $action;
1113  global $filter, $filtert, $status, $actioncode; // Filters used into search form
1114  global $theme_datacolor; // Array with a list of different we can use (come from theme)
1115  global $cachethirdparties, $cachecontacts, $cacheusers, $cacheprojects, $colorindexused;
1116  global $begin_h, $end_h;
1117 
1118  $cases1 = array(); // Color first half hour
1119  $cases2 = array(); // Color second half hour
1120 
1121  $i = 0; $numother = 0; $numbirthday = 0; $numical = 0; $numicals = array();
1122  //$ymd = sprintf("%04d", $year).sprintf("%02d", $month).sprintf("%02d", $day);
1123 
1124  $colorindexused[$user->id] = 0; // Color index for current user (user->id) is always 0
1125  $nextindextouse = count($colorindexused); // At first run this is 0, so first user has 0, next 1, ...
1126  //if ($username->id && $day==1) {
1127  //var_dump($eventarray);
1128  //}
1129  //var_dump("------ username=".$username->login." for day=".$day);
1130 
1131  // We are in a particular day for $username, now we scan all events
1132  foreach ($eventarray as $daykey => $notused) {
1133  $annee = dol_print_date($daykey, '%Y', 'tzuserrel');
1134  $mois = dol_print_date($daykey, '%m', 'tzuserrel');
1135  $jour = dol_print_date($daykey, '%d', 'tzuserrel');
1136  //var_dump("daykey=$daykey day=$day jour=$jour, month=$month mois=$mois, year=$year annee=$annee");
1137 
1138 
1139  if ($day == $jour && (int) $month == (int) $mois && $year == $annee) { // Is it the day we are looking for when calling function ?
1140  //var_dump("day=$day jour=$jour month=$month mois=$mois year=$year annee=$annee");
1141 
1142  // Scan all event for this date
1143  foreach ($eventarray[$daykey] as $index => $event) {
1144  //print 'daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$year.'-'.$month.'-'.$day.' -> This event: '.$event->id.' '.$index.' is open for this daykey '.$annee.'-'.$mois.'-'.$jour."<br>\n";
1145  //var_dump($event);
1146 
1147  $keysofuserassigned = array_keys($event->userassigned);
1148  $ponct = ($event->date_start_in_calendar == $event->date_end_in_calendar);
1149 
1150  if (!in_array($username->id, $keysofuserassigned)) {
1151  continue; // We discard record if event is from another user than user we want to show
1152  }
1153  //if ($username->id != $event->userownerid) continue; // We discard record if event is from another user than user we want to show
1154 
1155  $parameters = array();
1156  $reshook = $hookmanager->executeHooks('formatEvent', $parameters, $event, $action); // Note that $action and $object may have been modified by some hooks
1157  if ($reshook < 0) {
1158  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1159  }
1160 
1161  // Define $color (Hex string like '0088FF') and $cssclass of event
1162  $color = -1; $cssclass = ''; $colorindex = -1;
1163  if (in_array($user->id, $keysofuserassigned)) {
1164  $cssclass = 'family_mytasks';
1165 
1166  if (empty($cacheusers[$event->userownerid])) {
1167  $newuser = new User($db);
1168  $newuser->fetch($event->userownerid);
1169  $cacheusers[$event->userownerid] = $newuser;
1170  }
1171  //var_dump($cacheusers[$event->userownerid]->color);
1172 
1173  // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
1174  if (!empty($cacheusers[$event->userownerid]->color)) {
1175  $color = $cacheusers[$event->userownerid]->color;
1176  }
1177 
1178  if (!empty($conf->global->AGENDA_USE_COLOR_PER_EVENT_TYPE)) {
1179  $color = $event->type_color;
1180  }
1181  } elseif ($event->type_code == 'ICALEVENT') {
1182  $numical++;
1183  if (!empty($event->icalname)) {
1184  if (!isset($numicals[dol_string_nospecial($event->icalname)])) {
1185  $numicals[dol_string_nospecial($event->icalname)] = 0;
1186  }
1187  $numicals[dol_string_nospecial($event->icalname)]++;
1188  }
1189 
1190  $color = $event->icalcolor;
1191  $cssclass = (!empty($event->icalname) ? 'family_ext'.md5($event->icalname) : 'family_other unsortable');
1192  } elseif ($event->type_code == 'BIRTHDAY') {
1193  $numbirthday++; $colorindex = 2; $cssclass = 'family_birthday unsortable'; $color = sprintf("%02x%02x%02x", $theme_datacolor[$colorindex][0], $theme_datacolor[$colorindex][1], $theme_datacolor[$colorindex][2]);
1194  } else {
1195  $numother++;
1196  $color = ($event->icalcolor ? $event->icalcolor : -1);
1197  $cssclass = (!empty($event->icalname) ? 'family_ext'.md5($event->icalname) : 'family_other');
1198 
1199  if (empty($cacheusers[$event->userownerid])) {
1200  $newuser = new User($db);
1201  $newuser->fetch($event->userownerid);
1202  $cacheusers[$event->userownerid] = $newuser;
1203  }
1204  //var_dump($cacheusers[$event->userownerid]->color);
1205 
1206  // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
1207  if (!empty($cacheusers[$event->userownerid]->color)) {
1208  $color = $cacheusers[$event->userownerid]->color;
1209  }
1210 
1211  if (!empty($conf->global->AGENDA_USE_COLOR_PER_EVENT_TYPE)) {
1212  $color = $event->type_color;
1213  }
1214  }
1215 
1216  if ($color < 0) { // Color was not set on user card. Set color according to color index.
1217  // Define color index if not yet defined
1218  $idusertouse = ($event->userownerid ? $event->userownerid : 0);
1219  if (isset($colorindexused[$idusertouse])) {
1220  $colorindex = $colorindexused[$idusertouse]; // Color already assigned to this user
1221  } else {
1222  $colorindex = $nextindextouse;
1223  $colorindexused[$idusertouse] = $colorindex;
1224  if (!empty($theme_datacolor[$nextindextouse + 1])) {
1225  $nextindextouse++; // Prepare to use next color
1226  }
1227  }
1228  // Define color
1229  $color = sprintf("%02x%02x%02x", $theme_datacolor[$colorindex][0], $theme_datacolor[$colorindex][1], $theme_datacolor[$colorindex][2]);
1230  }
1231 
1232  // Define all rects with event (cases1 is first half hour, cases2 is second half hour)
1233  for ($h = $begin_h; $h < $end_h; $h++) {
1234  //if ($username->id == 1 && $day==1) print 'h='.$h;
1235  $newcolor = ''; //init
1236  if (empty($event->fulldayevent)) {
1237  $a = dol_mktime((int) $h, 0, 0, $month, $day, $year, 'tzuserrel', 0);
1238  $b = dol_mktime((int) $h, 30, 0, $month, $day, $year, 'tzuserrel', 0);
1239  $c = dol_mktime((int) $h + 1, 0, 0, $month, $day, $year, 'tzuserrel', 0);
1240 
1241  $dateendtouse = $event->date_end_in_calendar;
1242  if ($dateendtouse == $event->date_start_in_calendar) {
1243  $dateendtouse++;
1244  }
1245 
1246  //print dol_print_date($event->date_start_in_calendar,'dayhour').'-'.dol_print_date($a,'dayhour').'-'.dol_print_date($b,'dayhour').'<br>';
1247 
1248  if ($event->date_start_in_calendar < $b && $dateendtouse > $a) {
1249  $busy = $event->transparency;
1250  $cases1[$h][$event->id]['busy'] = $busy;
1251  $cases1[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1252  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1253  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1254  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1255  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1256  $cases1[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1257  } else {
1258  $cases1[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1259  }
1260  }
1261  if ($event->label) {
1262  $cases1[$h][$event->id]['string'] .= ' - '.$event->label;
1263  }
1264  $cases1[$h][$event->id]['typecode'] = $event->type_code;
1265  $cases1[$h][$event->id]['color'] = $color;
1266  if ($event->fk_project > 0) {
1267  if (empty($cacheprojects[$event->fk_project])) {
1268  $tmpproj = new Project($db);
1269  $tmpproj->fetch($event->fk_project);
1270  $cacheprojects[$event->fk_project] = $tmpproj;
1271  }
1272  $cases1[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1273  }
1274  if ($event->socid > 0) {
1275  if (empty($cachethirdparties[$event->socid])) {
1276  $tmpthirdparty = new Societe($db);
1277  $tmpthirdparty->fetch($event->socid);
1278  $cachethirdparties[$event->socid] = $tmpthirdparty;
1279  }
1280  $cases1[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1281  }
1282  if ($event->contact_id > 0) {
1283  if (empty($cachecontacts[$event->contact_id])) {
1284  $tmpcontact = new Contact($db);
1285  $tmpcontact->fetch($event->contact_id);
1286  $cachecontacts[$event->contact_id] = $tmpcontact;
1287  }
1288  $cases1[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1289  }
1290  }
1291  if ($event->date_start_in_calendar < $c && $dateendtouse > $b) {
1292  $busy = $event->transparency;
1293  $cases2[$h][$event->id]['busy'] = $busy;
1294  $cases2[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1295  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1296  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1297  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1298  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1299  $cases2[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1300  } else {
1301  $cases2[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1302  }
1303  }
1304  if ($event->label) {
1305  $cases2[$h][$event->id]['string'] .= ' - '.$event->label;
1306  }
1307  $cases2[$h][$event->id]['typecode'] = $event->type_code;
1308  $cases2[$h][$event->id]['color'] = $color;
1309  if ($event->fk_project > 0) {
1310  if (empty($cacheprojects[$event->fk_project])) {
1311  $tmpproj = new Project($db);
1312  $tmpproj->fetch($event->fk_project);
1313  $cacheprojects[$event->fk_project] = $tmpproj;
1314  }
1315  $cases2[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1316  }
1317  if ($event->socid > 0) {
1318  if (empty($cachethirdparties[$event->socid])) {
1319  $tmpthirdparty = new Societe($db);
1320  $tmpthirdparty->fetch($event->socid);
1321  $cachethirdparties[$event->socid] = $tmpthirdparty;
1322  }
1323  $cases2[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1324  }
1325  if ($event->contact_id > 0) {
1326  if (empty($cachecontacts[$event->contact_id])) {
1327  $tmpcontact = new Contact($db);
1328  $tmpcontact->fetch($event->contact_id);
1329  $cachecontacts[$event->contact_id] = $tmpcontact;
1330  }
1331  $cases2[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1332  }
1333  }
1334  } else {
1335  $busy = $event->transparency;
1336  $cases1[$h][$event->id]['busy'] = $busy;
1337  $cases2[$h][$event->id]['busy'] = $busy;
1338  $cases1[$h][$event->id]['string'] = $event->label;
1339  $cases2[$h][$event->id]['string'] = $event->label;
1340  $cases1[$h][$event->id]['typecode'] = $event->type_code;
1341  $cases2[$h][$event->id]['typecode'] = $event->type_code;
1342  $cases1[$h][$event->id]['color'] = $color;
1343  $cases2[$h][$event->id]['color'] = $color;
1344  }
1345  }
1346  $i++;
1347  }
1348 
1349  break; // We found the date we were looking for. No need to search anymore.
1350  }
1351  }
1352 
1353  // Now output $casesX from start hour to end hour
1354  for ($h = $begin_h; $h < $end_h; $h++) {
1355  $color1 = ''; $color2 = '';
1356  $style1 = ''; $style2 = '';
1357  $string1 = '&nbsp;'; $string2 = '&nbsp;';
1358  $title1 = ''; $title2 = '';
1359  if (isset($cases1[$h]) && $cases1[$h] != '') {
1360  //$title1.=count($cases1[$h]).' '.(count($cases1[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1361  if (count($cases1[$h]) > 1) {
1362  $title1 .= count($cases1[$h]).' '.(count($cases1[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1363  }
1364  $string1 = '&nbsp;';
1365  if (empty($conf->global->AGENDA_NO_TRANSPARENT_ON_NOT_BUSY)) {
1366  $style1 = 'peruser_notbusy';
1367  } else {
1368  $style1 = 'peruser_busy';
1369  }
1370  foreach ($cases1[$h] as $id => $ev) {
1371  if ($ev['busy']) {
1372  $style1 = 'peruser_busy';
1373  }
1374  }
1375  }
1376  if (isset($cases2[$h]) && $cases2[$h] != '') {
1377  //$title2.=count($cases2[$h]).' '.(count($cases2[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1378  if (count($cases2[$h]) > 1) {
1379  $title2 .= count($cases2[$h]).' '.(count($cases2[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1380  }
1381  $string2 = '&nbsp;';
1382  if (empty($conf->global->AGENDA_NO_TRANSPARENT_ON_NOT_BUSY)) {
1383  $style2 = 'peruser_notbusy';
1384  } else {
1385  $style2 = 'peruser_busy';
1386  }
1387  foreach ($cases2[$h] as $id => $ev) {
1388  if ($ev['busy']) {
1389  $style2 = 'peruser_busy';
1390  }
1391  }
1392  }
1393 
1394  $ids1 = '';
1395  $ids2 = '';
1396  if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) && array_keys($cases1[$h])) {
1397  $ids1 = join(', ', array_keys($cases1[$h]));
1398  }
1399  if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) && array_keys($cases2[$h])) {
1400  $ids2 = join(', ', array_keys($cases2[$h]));
1401  }
1402 
1403  if ($h == $begin_h) {
1404  echo '<td class="'.$style.'_peruserleft cal_peruser'.($var ? ' cal_impair '.$style.'_impair' : '').'">';
1405  } else {
1406  echo '<td class="'.$style.' cal_peruser'.($var ? ' cal_impair '.$style.'_impair' : '').'">';
1407  }
1408  if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) == 1) { // only 1 event
1409  $output = array_slice($cases1[$h], 0, 1);
1410  $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : '');
1411  if ($output[0]['string']) {
1412  $title1 .= ($title1 ? ' - ' : '').$output[0]['string'];
1413  }
1414  if ($output[0]['color']) {
1415  $color1 = $output[0]['color'];
1416  }
1417  } elseif (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) > 1) {
1418  $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : '');
1419  $color1 = '222222';
1420  }
1421 
1422  if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) == 1) { // only 1 event
1423  $output = array_slice($cases2[$h], 0, 1);
1424  $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : '');
1425  if ($output[0]['string']) {
1426  $title2 .= ($title2 ? ' - ' : '').$output[0]['string'];
1427  }
1428  if ($output[0]['color']) {
1429  $color2 = $output[0]['color'];
1430  }
1431  } elseif (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) > 1) {
1432  $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : '');
1433  $color2 = '222222';
1434  }
1435  print '<table class="nobordernopadding case centpercent">';
1436  print '<tr><td ';
1437  if ($style1 == 'peruser_notbusy') {
1438  print 'style="border: 1px solid #'.($color1 ? $color1 : "888").' !important" ';
1439  } elseif ($color1) {
1440  print ($color1 ? 'style="background: #'.$color1.';"' : '');
1441  }
1442  print 'class="';
1443  print ($style1 ? $style1.' ' : '');
1444  print 'onclickopenref center'.($title2 ? ' classfortooltip' : '').($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_00_'.($ids1 ? $ids1 : 'none').'"'.($title1 ? ' title="'.$title1.'"' : '').'>';
1445  print $string1;
1446  print '</td><td ';
1447  if ($style2 == 'peruser_notbusy') {
1448  print 'style="border: 1px solid #'.($color2 ? $color2 : "888").' !important" ';
1449  } elseif ($color2) {
1450  print ($color2 ? 'style="background: #'.$color2.';"' : '');
1451  }
1452  print 'class="';
1453  print ($style2 ? $style2.' ' : '');
1454  print 'onclickopenref center'.($title2 ? ' classfortooltip' : '').($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_30_'.($ids2 ? $ids2 : 'none').'"'.($title2 ? ' title="'.$title2.'"' : '').'>';
1455  print $string2;
1456  print '</td></tr>';
1457  print '</table>';
1458  print '</td>';
1459  }
1460 }
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
print_actions_filter($form, $canedit, $status, $year, $month, $day, $showbirthday, $filtera, $filtert, $filterd, $pid, $socid, $action, $showextcals=array(), $actioncode='', $usergroupid='', $excludetype='', $resourceid=0)
Show filter form in agenda view.
Definition: agenda.lib.php:51
calendars_prepare_head($param)
Define head array for tabs of agenda setup pages.
Definition: agenda.lib.php:483
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage agenda events (actions)
Class to manage contact/addresses.
Class to manage generation of HTML components Only common components must be here.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
Definition: user.class.php:47
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_get_next_week($day, $week, $month, $year)
Return next week.
Definition: date.lib.php:553
dol_get_first_day_week($day, $month, $year, $gm=false)
Return first day of week for a date.
Definition: date.lib.php:650
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition: date.lib.php:121
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='')
Clean a string from all punctuation characters to use it as a ref or login.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
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.