dolibarr  18.0.6
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 (!$user->hasRight('agenda', 'myactions', 'read')) {
90 }
91 if (!$user->hasRight('agenda', 'allactions', 'read')) {
92  $canedit = 0;
93 }
94 if (!$user->hasRight('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|DE:Modul_Terminplanung';
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 // Show navigation bar
367 $nav = '<div class="navselectiondate inline-block nowraponall">';
368 $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";
369 $nav .= " <span id=\"month_name\">".dol_print_date(dol_mktime(0, 0, 0, $first_month, $first_day, $first_year), "%Y").", ".$langs->trans("Week")." ".$week;
370 $nav .= " </span>\n";
371 $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";
372 if (empty($conf->dol_optimize_smallscreen)) {
373  $nav .= " &nbsp; <a href=\"?year=".$nowyear."&amp;month=".$nowmonth."&amp;day=".$nowday.$param.'" class="datenowlink">'.$langs->trans("Today").'</a> ';
374 }
375 $nav .= '</div>';
376 $nav .= $form->selectDate($dateselect, 'dateselect', 0, 0, 1, '', 1, 0);
377 $nav .= ' <button type="submit" class="liste_titre button_search" name="button_search_x" value="x"><span class="fa fa-search"></span></button>';
378 
379 // Must be after the nav definition
380 $param .= '&year='.urlencode($year).'&month='.urlencode($month).($day ? '&day='.urlencode($day) : '');
381 //print 'x'.$param;
382 
383 
384 $paramnoaction = preg_replace('/action=[a-z_]+/', '', $param);
385 
386 $head = calendars_prepare_head($paramnoaction);
387 
388 print '<form method="POST" id="searchFormList" class="listactionsfilter" action="'.$_SERVER["PHP_SELF"].'">'."\n";
389 
390 $showextcals = $listofextcals;
391 // Legend
392 if ($conf->use_javascript_ajax) {
393  $s = '';
394  $s .= '<script type="text/javascript">'."\n";
395  $s .= 'jQuery(document).ready(function () {'."\n";
396  $s .= 'jQuery("#check_mytasks").click(function() { jQuery(".family_mytasks").toggle(); jQuery(".family_other").toggle(); });'."\n";
397  $s .= 'jQuery("#check_birthday").click(function() { jQuery(".family_birthday").toggle(); });'."\n";
398  $s .= 'jQuery(".family_birthday").toggle();'."\n";
399  if ($mode == "show_week" || $mode == "show_month" || empty($mode)) {
400  $s .= 'jQuery( "td.sortable" ).sortable({connectWith: ".sortable",placeholder: "ui-state-highlight",items: "div:not(.unsortable)", receive: function( event, ui ) {';
401  }
402  $s .= '});'."\n";
403  $s .= '</script>'."\n";
404  if (!empty($conf->use_javascript_ajax)) {
405  $s .= '<div class="nowrap clear float"><input type="checkbox" id="check_mytasks" name="check_mytasks" checked disabled> '.$langs->trans("LocalAgenda").' &nbsp; </div>';
406  if (is_array($showextcals) && count($showextcals) > 0) {
407  foreach ($showextcals as $val) {
408  $htmlname = md5($val['name']);
409  $s .= '<script type="text/javascript">'."\n";
410  $s .= 'jQuery(document).ready(function () {'."\n";
411  $s .= ' jQuery("#check_ext'.$htmlname.'").click(function() {';
412  $s .= ' /* alert("'.$htmlname.'"); */';
413  $s .= ' jQuery(".family_ext'.$htmlname.'").toggle();';
414  $s .= ' });'."\n";
415  $s .= '});'."\n";
416  $s .= '</script>'."\n";
417  $s .= '<div class="nowrap float"><input type="checkbox" id="check_ext'.$htmlname.'" name="check_ext'.$htmlname.'" checked> '.$val ['name'].' &nbsp; </div>';
418  }
419  }
420 
421  //$s.='<div class="nowrap float"><input type="checkbox" id="check_birthday" name="check_birthday"> '.$langs->trans("AgendaShowBirthdayEvents").' &nbsp; </div>';
422 
423  // Calendars from hooks
424  $parameters = array();
425  $reshook = $hookmanager->executeHooks('addCalendarChoice', $parameters, $object, $action);
426  if (empty($reshook)) {
427  $s .= $hookmanager->resPrint;
428  } elseif ($reshook > 1) {
429  $s = $hookmanager->resPrint;
430  }
431  }
432 }
433 
434 $massactionbutton = '';
435 
436 $viewmode = '';
437 $viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&restore_lastsearch_values=1'.$paramnoactionodate.'">';
438 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
439 $viewmode .= img_picto($langs->trans("List"), 'object_calendarlist', 'class="imgforviewmode pictoactionview block"');
440 //$viewmode .= '</span>';
441 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewList").'</span></a>';
442 
443 $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.'">';
444 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
445 $viewmode .= img_picto($langs->trans("ViewCal"), 'object_calendarmonth', 'class="pictoactionview block"');
446 //$viewmode .= '</span>';
447 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewCal").'</span></a>';
448 
449 $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.'">';
450 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
451 $viewmode .= img_picto($langs->trans("ViewWeek"), 'object_calendarweek', 'class="pictoactionview block"');
452 //$viewmode .= '</span>';
453 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewWeek").'</span></a>';
454 
455 $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.'">';
456 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
457 $viewmode .= img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="pictoactionview block"');
458 //$viewmode .= '</span>';
459 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewDay").'</span></a>';
460 
461 $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.'">';
462 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
463 $viewmode .= img_picto($langs->trans("ViewPerUser"), 'object_calendarperuser', 'class="pictoactionview block"');
464 //$viewmode .= '</span>';
465 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewPerUser").'</span></a>';
466 
467 $viewmode .= '<span class="marginrightonly"></span>';
468 
469 // Add more views from hooks
470 $parameters = array(); $object = null;
471 $reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
472 if (empty($reshook)) {
473  $viewmode .= $hookmanager->resPrint;
474 } elseif ($reshook > 1) {
475  $viewmode = $hookmanager->resPrint;
476 }
477 
478 
479 $newparam = '';
480 $newcardbutton = '';
481 if ($user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create')) {
482  $tmpforcreatebutton = dol_getdate(dol_now(), true);
483 
484  $newparam .= '&month='.urlencode(str_pad($month, 2, "0", STR_PAD_LEFT)).'&year='.urlencode($tmpforcreatebutton['year']);
485  if ($begin_h !== '') {
486  $newparam .= '&begin_h='.urlencode($begin_h);
487  }
488  if ($end_h !== '') {
489  $newparam .= '&end_h='.urlencode($end_h);
490  }
491  if ($begin_d !== '') {
492  $newparam .= '&begin_d='.urlencode($begin_d);
493  }
494  if ($end_d !== '') {
495  $newparam .= '&end_d='.urlencode($end_d);
496  }
497 
498  //$param='month='.$monthshown.'&year='.$year;
499  $hourminsec = '100000';
500  $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 : '')));
501 }
502 
503 $num = '';
504 
505 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);
506 
507 $link = '';
508 //print load_fiche_titre('', $link.' &nbsp; &nbsp; '.$nav.' '.$newcardbutton, '');
509 
510 // Local calendar
511 $newtitle = '<div class="nowrap clear inline-block minheight30">';
512 $newtitle .= '<input type="checkbox" id="check_mytasks" name="check_mytasks" checked disabled> '.$langs->trans("LocalAgenda").' &nbsp; ';
513 $newtitle .= '</div>';
514 //$newtitle=$langs->trans($title);
515 
516 $s = $newtitle;
517 
518 print $s;
519 
520 print '<div class="liste_titre liste_titre_bydiv centpercent">';
521 print_actions_filter($form, $canedit, $search_status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid);
522 print '</div>';
523 
524 
525 // Get event in an array
526 $eventarray = array();
527 
528 
529 // DEFAULT CALENDAR + AUTOEVENT CALENDAR + CONFERENCEBOOTH CALENDAR
530 $sql = 'SELECT';
531 if ($usergroup > 0) {
532  $sql .= " DISTINCT";
533 }
534 $sql .= ' a.id, a.label,';
535 $sql .= ' a.datep,';
536 $sql .= ' a.datep2,';
537 $sql .= ' a.percent,';
538 $sql .= ' a.fk_user_author,a.fk_user_action,';
539 $sql .= ' a.transparency, a.priority, a.fulldayevent, a.location,';
540 $sql .= ' a.fk_soc, a.fk_contact, a.fk_element, a.elementtype, a.fk_project,';
541 $sql .= ' ca.code, ca.libelle as type_label, ca.color, ca.type as type_type, ca.picto as type_picto';
542 $sql .= ' FROM '.MAIN_DB_PREFIX.'c_actioncomm as ca, '.MAIN_DB_PREFIX."actioncomm as a";
543 if (empty($user->rights->societe->client->voir) && !$socid) {
544  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON a.fk_soc = sc.fk_soc";
545 }
546 // We must filter on resource table
547 if ($resourceid > 0) {
548  $sql .= ", ".MAIN_DB_PREFIX."element_resources as r";
549 }
550 // We must filter on assignement table
551 if ($filtert > 0 || $usergroup > 0) {
552  $sql .= ", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
553 }
554 if ($usergroup > 0) {
555  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element";
556 }
557 $sql .= ' WHERE a.fk_action = ca.id';
558 $sql .= ' AND a.entity IN ('.getEntity('agenda').')';
559 // Condition on actioncode
560 if (!empty($actioncode)) {
561  if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
562  if ($actioncode == 'AC_NON_AUTO') {
563  $sql .= " AND ca.type != 'systemauto'";
564  } elseif ($actioncode == 'AC_ALL_AUTO') {
565  $sql .= " AND ca.type = 'systemauto'";
566  } else {
567  if ($actioncode == 'AC_OTH') {
568  $sql .= " AND ca.type != 'systemauto'";
569  }
570  if ($actioncode == 'AC_OTH_AUTO') {
571  $sql .= " AND ca.type = 'systemauto'";
572  }
573  }
574  } else {
575  if ($actioncode == 'AC_NON_AUTO') {
576  $sql .= " AND ca.type != 'systemauto'";
577  } elseif ($actioncode == 'AC_ALL_AUTO') {
578  $sql .= " AND ca.type = 'systemauto'";
579  } else {
580  if (is_array($actioncode)) {
581  $sql .= " AND ca.code IN (".$db->sanitize("'".implode("','", $actioncode)."'", 1).")";
582  } else {
583  $sql .= " AND ca.code IN (".$db->sanitize("'".implode("','", explode(',', $actioncode))."'", 1).")";
584  }
585  }
586  }
587 }
588 if ($resourceid > 0) {
589  $sql .= " AND r.element_type = 'action' AND r.element_id = a.id AND r.resource_id = ".((int) $resourceid);
590 }
591 if ($pid) {
592  $sql .= " AND a.fk_project = ".((int) $pid);
593 }
594 if (empty($user->rights->societe->client->voir) && !$socid) {
595  $sql .= " AND (a.fk_soc IS NULL OR sc.fk_user = ".((int) $user->id).")";
596 }
597 if ($socid > 0) {
598  $sql .= ' AND a.fk_soc = '.((int) $socid);
599 }
600 // We must filter on assignement table
601 if ($filtert > 0 || $usergroup > 0) {
602  $sql .= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
603 }
604 if ($mode == 'show_day') {
605  $sql .= " AND (";
606  $sql .= " (a.datep 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.datep2 BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
610  $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
611  $sql .= " OR ";
612  $sql .= " (a.datep < '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
613  $sql .= " AND a.datep2 > '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
614  $sql .= ')';
615 } else {
616  // To limit array
617  $sql .= " AND (";
618  $sql .= " (a.datep BETWEEN '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'"; // Start 2 day before $firstdaytoshow
619  $sql .= " AND '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')"; // End 2 day after $lastdaytoshow
620  $sql .= " OR ";
621  $sql .= " (a.datep2 BETWEEN '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'";
622  $sql .= " AND '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')";
623  $sql .= " OR ";
624  $sql .= " (a.datep < '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'";
625  $sql .= " AND a.datep2 > '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')";
626  $sql .= ')';
627 }
628 if ($type) {
629  $sql .= " AND ca.id = ".((int) $type);
630 }
631 if ($status == '0') {
632  $sql .= " AND a.percent = 0";
633 }
634 if ($status === 'na') {
635  // Not applicable
636  $sql .= " AND a.percent = -1";
637 }
638 if ($status == '50') {
639  // Running already started
640  $sql .= " AND (a.percent > 0 AND a.percent < 100)";
641 }
642 if ($status == 'done' || $status == '100') {
643  $sql .= " AND (a.percent = 100)";
644 }
645 if ($status == 'todo') {
646  $sql .= " AND (a.percent >= 0 AND a.percent < 100)";
647 }
648 // We must filter on assignement table
649 if ($filtert > 0 || $usergroup > 0) {
650  $sql .= " AND (";
651  if ($filtert > 0) {
652  $sql .= "ar.fk_element = ".$filtert;
653  }
654  if ($usergroup > 0) {
655  $sql .= ($filtert > 0 ? " OR " : "")." ugu.fk_usergroup = ".((int) $usergroup);
656  }
657  $sql .= ")";
658 }
659 // Sort on date
660 $sql .= ' ORDER BY fk_user_action, datep'; //fk_user_action
661 //print $sql;
662 
663 dol_syslog("comm/action/peruser.php", LOG_DEBUG);
664 $resql = $db->query($sql);
665 if ($resql) {
666  $num = $db->num_rows($resql);
667 
668  $i = 0;
669  while ($i < $num) {
670  $obj = $db->fetch_object($resql);
671  //print $obj->fk_user_action.' '.$obj->id."<br>";
672 
673  // Discard auto action if option is on
674  if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO) && $obj->code == 'AC_OTH_AUTO') {
675  $i++;
676  continue;
677  }
678 
679  $datep = $db->jdate($obj->datep);
680  $datep2 = $db->jdate($obj->datep2);
681 
682 
683  // Create a new object action
684  $event = new ActionComm($db);
685  $event->id = $obj->id;
686  $event->datep = $datep; // datep and datef are GMT date
687  $event->datef = $datep2;
688  $event->type_code = $obj->code;
689  $event->type_color = $obj->color;
690  $event->label = $obj->label;
691  $event->percentage = $obj->percent;
692  $event->authorid = $obj->fk_user_author; // user id of creator
693  $event->userownerid = $obj->fk_user_action; // user id of owner
694  $event->priority = $obj->priority;
695  $event->fulldayevent = $obj->fulldayevent;
696  $event->location = $obj->location;
697  $event->transparency = $obj->transparency;
698 
699  $event->fk_project = $obj->fk_project;
700 
701  $event->socid = $obj->fk_soc;
702  $event->contact_id = $obj->fk_contact;
703 
704  $event->fk_element = $obj->fk_element;
705  $event->elementtype = $obj->elementtype;
706 
707  // Defined date_start_in_calendar and date_end_in_calendar property
708  // They are date start and end of action but modified to not be outside calendar view.
709  if ($event->percentage <= 0) {
710  $event->date_start_in_calendar = $datep;
711  if ($datep2 != '' && $datep2 >= $datep) {
712  $event->date_end_in_calendar = $datep2;
713  } else {
714  $event->date_end_in_calendar = $datep;
715  }
716  } else {
717  $event->date_start_in_calendar = $datep;
718  if ($datep2 != '' && $datep2 >= $datep) {
719  $event->date_end_in_calendar = $datep2;
720  } else {
721  $event->date_end_in_calendar = $datep;
722  }
723  }
724 
725  //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";
726 
727  // Check values
728  if ($event->date_end_in_calendar < $firstdaytoshow ||
729  $event->date_start_in_calendar >= $lastdaytoshow) {
730  // This record is out of visible range
731  unset($event);
732  } else {
733  //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";
734  $event->fetch_userassigned(); // This load $event->userassigned
735 
736  if ($event->date_start_in_calendar < $firstdaytoshow) {
737  $event->date_start_in_calendar = $firstdaytoshow;
738  }
739  if ($event->date_end_in_calendar >= $lastdaytoshow) {
740  $event->date_end_in_calendar = ($lastdaytoshow - 1);
741  }
742 
743  // Add an entry in actionarray for each day
744  $daycursor = $event->date_start_in_calendar;
745  $annee = dol_print_date($daycursor, '%Y', 'tzuserrel');
746  $mois = dol_print_date($daycursor, '%m', 'tzuserrel');
747  $jour = dol_print_date($daycursor, '%d', 'tzuserrel');
748  //print $daycursor.' '.dol_print_date($daycursor, 'dayhour', 'gmt').' '.$event->id.' -> '.$annee.'-'.$mois.'-'.$jour.'<br>';
749 
750  // Loop on each day covered by action to prepare an index to show on calendar
751  $loop = true; $j = 0;
752  $daykey = dol_mktime(0, 0, 0, $mois, $jour, $annee, 'gmt');
753  do {
754  //print 'Add event into eventarray for daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$event->id.' '.$event->datep.' '.$event->datef.'<br>';
755 
756  $eventarray[$daykey][] = $event;
757  $j++;
758 
759  $daykey += 60 * 60 * 24;
760  if ($daykey > $event->date_end_in_calendar) {
761  $loop = false;
762  }
763  } while ($loop);
764 
765  //print 'Event '.$i.' id='.$event->id.' (start='.dol_print_date($event->datep).'-end='.dol_print_date($event->datef);
766  //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>';
767  }
768  $i++;
769  }
770  $db->free($resql);
771 } else {
772  dol_print_error($db);
773 }
774 
775 $maxnbofchar = 18;
776 $cachethirdparties = array();
777 $cachecontacts = array();
778 $cacheusers = array();
779 
780 // Define theme_datacolor array
781 $color_file = DOL_DOCUMENT_ROOT."/theme/".$conf->theme."/theme_vars.inc.php";
782 if (is_readable($color_file)) {
783  include $color_file;
784 }
785 if (!is_array($theme_datacolor)) {
786  $theme_datacolor = array(array(120, 130, 150), array(200, 160, 180), array(190, 190, 220));
787 }
788 
789 
790 $newparam = $param; // newparam is for birthday links
791 $newparam = preg_replace('/showbirthday=/i', 'showbirthday_=', $newparam); // To avoid replacement when replace day= is done
792 $newparam = preg_replace('/mode=show_month&?/i', '', $newparam);
793 $newparam = preg_replace('/mode=show_week&?/i', '', $newparam);
794 $newparam = preg_replace('/day=[0-9]+&?/i', '', $newparam);
795 $newparam = preg_replace('/month=[0-9]+&?/i', '', $newparam);
796 $newparam = preg_replace('/year=[0-9]+&?/i', '', $newparam);
797 $newparam = preg_replace('/viewweek=[0-9]+&?/i', '', $newparam);
798 $newparam = preg_replace('/showbirthday_=/i', 'showbirthday=', $newparam); // Restore correct parameter
799 $newparam .= '&viewweek=1';
800 
801 echo '<input type="hidden" name="actionmove" value="mupdate">';
802 echo '<input type="hidden" name="backtopage" value="'.dol_escape_htmltag($_SERVER['PHP_SELF']).'?'.dol_escape_htmltag($_SERVER['QUERY_STRING']).'">';
803 echo '<input type="hidden" name="newdate" id="newdate">';
804 
805 
806 // Line header with list of days
807 
808 //print "begin_d=".$begin_d." end_d=".$end_d;
809 
810 $currentdaytoshow = $firstdaytoshow;
811 echo '<div class="div-table-responsive">';
812 //print dol_print_date($currentdaytoshow, 'dayhour', 'gmt');
813 
814 while ($currentdaytoshow < $lastdaytoshow) {
815  echo '<table class="centpercent noborder nocellnopadd cal_month">';
816 
817  echo '<tr class="liste_titre">';
818  echo '<td class="nopaddingtopimp nopaddingbottomimp nowraponsmartphone">';
819 
820  if ($canedit && $mode == 'show_peruser') {
821  // Filter on hours
822  print img_picto('', 'clock', 'class="fawidth30 inline-block paddingleft"');
823  print '<span class="hideonsmartphone" title="'.$langs->trans("VisibleTimeRange").'">'.$langs->trans("Hours").'</span>';
824  print "\n".'<div class="ui-grid-a inline-block"><div class="ui-block-a nowraponall">';
825  print '<input type="number" class="short" name="begin_h" value="'.$begin_h.'" min="0" max="23">';
826  if (empty($conf->dol_use_jmobile)) {
827  print ' - ';
828  } else {
829  print '</div><div class="ui-block-b">';
830  }
831  print '<input type="number" class="short" name="end_h" value="'.$end_h.'" min="1" max="24">';
832  if (empty($conf->dol_use_jmobile)) {
833  print ' '.$langs->trans("H");
834  }
835  print '</div></div>';
836 
837  print '<br>';
838 
839  // Filter on days
840  print img_picto('', 'clock', 'class="fawidth30 inline-block paddingleft"');
841  print '<span class="hideonsmartphone" title="'.$langs->trans("VisibleDaysRange").'">'.$langs->trans("DaysOfWeek").'</span>';
842  print "\n".'<div class="ui-grid-a inline-block"><div class="ui-block-a nowraponall">';
843  print '<input type="number" class="short" name="begin_d" value="'.$begin_d.'" min="1" max="7">';
844  if (empty($conf->dol_use_jmobile)) {
845  print ' - ';
846  } else {
847  print '</div><div class="ui-block-b">';
848  }
849  print '<input type="number" class="short" name="end_d" value="'.$end_d.'" min="1" max="7">';
850  print '</div></div>';
851  }
852 
853  print '</td>';
854  $i = 0; // 0 = sunday,
855  while ($i < 7) {
856  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
857  $i++;
858  continue;
859  }
860  echo '<td align="center" colspan="'.($end_h - $begin_h).'">';
861  echo '<span class="bold spandayofweek">'.$langs->trans("Day".(($i + (isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : 1)) % 7)).'</span>';
862  print "<br>";
863  if ($i) {
864  print dol_print_date(dol_time_plus_duree($currentdaytoshow, $i, 'd'), 'day', 'tzuserrel');
865  } else {
866  print dol_print_date($currentdaytoshow, 'day', 'tzuserrel');
867  }
868  echo "</td>\n";
869  $i++;
870  }
871  echo "</tr>\n";
872 
873  echo '<tr class="liste_titre">';
874  echo '<td></td>';
875  $i = 0;
876  while ($i < 7) {
877  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
878  $i++;
879  continue;
880  }
881  for ($h = $begin_h; $h < $end_h; $h++) {
882  echo '<td class="center">';
883  print '<small style="font-family: courier">'.sprintf("%02d", $h).'</small>';
884  print "</td>";
885  }
886  echo "</td>\n";
887  $i++;
888  }
889  echo "</tr>\n";
890 
891 
892  // Define $usernames
893  $usernames = array(); //init
894  $usernamesid = array();
895  /* Use this to have list of users only if users have events */
896  if (!empty($conf->global->AGENDA_SHOWOWNERONLY_ONPERUSERVIEW)) {
897  foreach ($eventarray as $daykey => $notused) {
898  // Get all assigned users for each event
899  foreach ($eventarray[$daykey] as $index => $event) {
900  $event->fetch_userassigned();
901  $listofuserid = $event->userassigned;
902  foreach ($listofuserid as $userid => $tmp) {
903  if (!in_array($userid, $usernamesid)) {
904  $usernamesid[$userid] = $userid;
905  }
906  }
907  }
908  }
909  } else {
910  /* Use this list to have for all users */
911  $sql = "SELECT DISTINCT u.rowid, u.lastname as lastname, u.firstname, u.statut, u.login, u.admin, u.entity";
912  $sql .= " FROM ".MAIN_DB_PREFIX."user as u";
913  if (isModEnabled('multicompany') && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
914  $sql .= ", ".MAIN_DB_PREFIX."usergroup_user as ug";
915  $sql .= " WHERE ug.entity IN (".getEntity('usergroup').")";
916  $sql .= " AND ug.fk_user = u.rowid ";
917  } else {
918  if ($usergroup > 0) {
919  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ug ON u.rowid = ug.fk_user";
920  }
921  $sql .= " WHERE u.entity IN (".getEntity('user').")";
922  }
923  $sql .= " AND u.statut = 1";
924  if ($filtert > 0) {
925  $sql .= " AND u.rowid = ".((int) $filtert);
926  }
927  if ($usergroup > 0) {
928  $sql .= " AND ug.fk_usergroup = ".((int) $usergroup);
929  }
930  if ($user->socid > 0) {
931  // External users should see only contacts of their company
932  $sql .= " AND u.fk_soc = ".((int) $user->socid);
933  }
934 
935  //print $sql;
936  $resql = $db->query($sql);
937  if ($resql) {
938  $num = $db->num_rows($resql);
939  $i = 0;
940  if ($num) {
941  while ($i < $num) {
942  $obj = $db->fetch_object($resql);
943  $usernamesid[$obj->rowid] = $obj->rowid;
944  $i++;
945  }
946  }
947  } else {
948  dol_print_error($db);
949  }
950  }
951  //var_dump($usernamesid);
952  foreach ($usernamesid as $id) {
953  $tmpuser = new User($db);
954  $result = $tmpuser->fetch($id);
955  $usernames[] = $tmpuser;
956  }
957 
958  // Load array of colors by type
959  $colorsbytype = array();
960  $labelbytype = array();
961  $sql = "SELECT code, color, libelle as label FROM ".MAIN_DB_PREFIX."c_actioncomm ORDER BY position";
962  $resql = $db->query($sql);
963  while ($obj = $db->fetch_object($resql)) {
964  $colorsbytype[$obj->code] = $obj->color;
965  $labelbytype[$obj->code] = $obj->label;
966  }
967 
968  // Loop on each user to show calendar
969  $todayarray = dol_getdate($now, 'fast');
970  $sav = $tmpday;
971  $showheader = true;
972  $var = false;
973  foreach ($usernames as $username) {
974  //if ($username->login != 'admin') continue;
975 
976  $var = !$var;
977  echo "<tr>";
978  echo '<td class="tdoverflowmax100 cal_current_month cal_peruserviewname'.($var ? ' cal_impair' : '').'">';
979  print $username->getNomUrl(-1, '', 0, 0, 20, 1, '', 'paddingleft');
980  print '</td>';
981  $tmpday = $sav;
982 
983  // Lopp on each day of week
984  $i = 0;
985  for ($iter_day = 0; $iter_day < 8; $iter_day++) {
986  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
987  $i++;
988  continue;
989  }
990 
991  // Show days of the current week
992  $curtime = dol_time_plus_duree($currentdaytoshow, $iter_day, 'd');
993  // $curtime is a gmt time, but we want the day, month, year in user TZ
994  $tmpday = dol_print_date($curtime, "%d", "tzuserrel");
995  $tmpmonth = dol_print_date($curtime, "%m", "tzuserrel");
996  $tmpyear = dol_print_date($curtime, "%Y", "tzuserrel");
997  //var_dump($curtime.' '.$tmpday.' '.$tmpmonth.' '.$tmpyear);
998 
999  $style = 'cal_current_month';
1000  if ($iter_day == 6) {
1001  $style .= ' cal_other_month';
1002  }
1003  $today = 0;
1004  if ($todayarray['mday'] == $tmpday && $todayarray['mon'] == $tmpmonth && $todayarray['year'] == $tmpyear) {
1005  $today = 1;
1006  }
1007  if ($today) {
1008  $style = 'cal_today_peruser';
1009  }
1010 
1011  show_day_events2($username, $tmpday, $tmpmonth, $tmpyear, 0, $style, $eventarray, 0, $maxnbofchar, $newparam, 1, 300, $showheader, $colorsbytype, $var);
1012 
1013  $i++;
1014  }
1015  echo "</tr>\n";
1016  $showheader = false;
1017  }
1018 
1019  echo "</table>\n";
1020  echo "<br>";
1021 
1022  $currentdaytoshow = dol_time_plus_duree($currentdaytoshow, 7, 'd');
1023 }
1024 
1025 echo '</div>';
1026 
1027 if (!empty($conf->global->AGENDA_USE_EVENT_TYPE) && !empty($conf->global->AGENDA_USE_COLOR_PER_EVENT_TYPE)) {
1028  $langs->load("commercial");
1029  print '<br>'.$langs->trans("Legend").': <br>';
1030  foreach ($colorsbytype as $code => $color) {
1031  if ($color) {
1032  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div style="'.($color ? 'background: #'.$color.';' : '').'width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1033  print $langs->trans("Action".$code) != "Action".$code ? $langs->trans("Action".$code) : $labelbytype[$code];
1034  //print $code;
1035  print '</div>';
1036  }
1037  }
1038  //$color=sprintf("%02x%02x%02x",$theme_datacolor[0][0],$theme_datacolor[0][1],$theme_datacolor[0][2]);
1039  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div class="peruser_busy" style="width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1040  print $langs->trans("Other");
1041  print '</div>';
1042  /* TODO Show this if at least one cumulated event
1043  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div style="background: #222222; width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1044  print $langs->trans("SeveralEvents");
1045  print '</div>';
1046  */
1047 }
1048 
1049 print "\n".'</form>';
1050 print "\n";
1051 
1052 // Add js code to manage click on a box
1053 print '<script type="text/javascript">
1054 jQuery(document).ready(function() {
1055  jQuery(".onclickopenref").click(function() {
1056  var ref=$(this).attr(\'ref\');
1057  var res = ref.split("_");
1058  var userid = res[1];
1059  var year = res[2];
1060  var month = res[3];
1061  var day = res[4];
1062  var hour = res[5];
1063  var min = res[6];
1064  var ids = res[7];
1065  if (ids == \'none\') /* No event */
1066  {
1067  /* alert(\'no event\'); */
1068  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 : '')).'"
1069  window.location.href = url;
1070  }
1071  else if (ids.indexOf(",") > -1) /* There is several events */
1072  {
1073  /* alert(\'several events\'); */
1074  url = "'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&filtert="+userid+"&dateselectyear="+year+"&dateselectmonth="+month+"&dateselectday="+day;
1075  window.location.href = url;
1076  }
1077  else /* One event */
1078  {
1079  /* alert(\'one event\'); */
1080  url = "'.DOL_URL_ROOT.'/comm/action/card.php?action=view&id="+ids
1081  window.location.href = url;
1082  }
1083  });
1084 });
1085 </script>';
1086 
1087 // End of page
1088 llxFooter();
1089 $db->close();
1090 
1091 
1092 
1093 
1114 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)
1115 {
1116  global $db;
1117  global $user, $conf, $langs, $hookmanager, $action;
1118  global $filter, $filtert, $status, $actioncode; // Filters used into search form
1119  global $theme_datacolor; // Array with a list of different we can use (come from theme)
1120  global $cachethirdparties, $cachecontacts, $cacheusers, $cacheprojects, $colorindexused;
1121  global $begin_h, $end_h;
1122 
1123  $cases1 = array(); // Color first half hour
1124  $cases2 = array(); // Color second half hour
1125 
1126  $i = 0; $numother = 0; $numbirthday = 0; $numical = 0; $numicals = array();
1127  //$ymd = sprintf("%04d", $year).sprintf("%02d", $month).sprintf("%02d", $day);
1128 
1129  $colorindexused[$user->id] = 0; // Color index for current user (user->id) is always 0
1130  $nextindextouse = count($colorindexused); // At first run this is 0, so first user has 0, next 1, ...
1131  //if ($username->id && $day==1) {
1132  //var_dump($eventarray);
1133  //}
1134  //var_dump("------ username=".$username->login." for day=".$day);
1135 
1136  // We are in a particular day for $username, now we scan all events
1137  foreach ($eventarray as $daykey => $notused) {
1138  $annee = dol_print_date($daykey, '%Y', 'tzuserrel');
1139  $mois = dol_print_date($daykey, '%m', 'tzuserrel');
1140  $jour = dol_print_date($daykey, '%d', 'tzuserrel');
1141  //var_dump("daykey=$daykey day=$day jour=$jour, month=$month mois=$mois, year=$year annee=$annee");
1142 
1143 
1144  if ($day == $jour && (int) $month == (int) $mois && $year == $annee) { // Is it the day we are looking for when calling function ?
1145  //var_dump("day=$day jour=$jour month=$month mois=$mois year=$year annee=$annee");
1146 
1147  // Scan all event for this date
1148  foreach ($eventarray[$daykey] as $index => $event) {
1149  //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";
1150  //var_dump($event);
1151 
1152  $keysofuserassigned = array_keys($event->userassigned);
1153  $ponct = ($event->date_start_in_calendar == $event->date_end_in_calendar);
1154 
1155  if (!in_array($username->id, $keysofuserassigned)) {
1156  continue; // We discard record if event is from another user than user we want to show
1157  }
1158  //if ($username->id != $event->userownerid) continue; // We discard record if event is from another user than user we want to show
1159 
1160  $parameters = array();
1161  $reshook = $hookmanager->executeHooks('formatEvent', $parameters, $event, $action); // Note that $action and $object may have been modified by some hooks
1162  if ($reshook < 0) {
1163  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1164  }
1165 
1166  // Define $color (Hex string like '0088FF') and $cssclass of event
1167  $color = -1; $cssclass = ''; $colorindex = -1;
1168  if (in_array($user->id, $keysofuserassigned)) {
1169  $cssclass = 'family_mytasks';
1170 
1171  if (empty($cacheusers[$event->userownerid])) {
1172  $newuser = new User($db);
1173  $newuser->fetch($event->userownerid);
1174  $cacheusers[$event->userownerid] = $newuser;
1175  }
1176  //var_dump($cacheusers[$event->userownerid]->color);
1177 
1178  // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
1179  if (!empty($cacheusers[$event->userownerid]->color)) {
1180  $color = $cacheusers[$event->userownerid]->color;
1181  }
1182 
1183  if (!empty($conf->global->AGENDA_USE_COLOR_PER_EVENT_TYPE)) {
1184  $color = $event->type_color;
1185  }
1186  } elseif ($event->type_code == 'ICALEVENT') {
1187  $numical++;
1188  if (!empty($event->icalname)) {
1189  if (!isset($numicals[dol_string_nospecial($event->icalname)])) {
1190  $numicals[dol_string_nospecial($event->icalname)] = 0;
1191  }
1192  $numicals[dol_string_nospecial($event->icalname)]++;
1193  }
1194 
1195  $color = $event->icalcolor;
1196  $cssclass = (!empty($event->icalname) ? 'family_ext'.md5($event->icalname) : 'family_other unsortable');
1197  } elseif ($event->type_code == 'BIRTHDAY') {
1198  $numbirthday++; $colorindex = 2; $cssclass = 'family_birthday unsortable'; $color = sprintf("%02x%02x%02x", $theme_datacolor[$colorindex][0], $theme_datacolor[$colorindex][1], $theme_datacolor[$colorindex][2]);
1199  } else {
1200  $numother++;
1201  $color = ($event->icalcolor ? $event->icalcolor : -1);
1202  $cssclass = (!empty($event->icalname) ? 'family_ext'.md5($event->icalname) : 'family_other');
1203 
1204  if (empty($cacheusers[$event->userownerid])) {
1205  $newuser = new User($db);
1206  $newuser->fetch($event->userownerid);
1207  $cacheusers[$event->userownerid] = $newuser;
1208  }
1209  //var_dump($cacheusers[$event->userownerid]->color);
1210 
1211  // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
1212  if (!empty($cacheusers[$event->userownerid]->color)) {
1213  $color = $cacheusers[$event->userownerid]->color;
1214  }
1215 
1216  if (!empty($conf->global->AGENDA_USE_COLOR_PER_EVENT_TYPE)) {
1217  $color = $event->type_color;
1218  }
1219  }
1220 
1221  if ($color < 0) { // Color was not set on user card. Set color according to color index.
1222  // Define color index if not yet defined
1223  $idusertouse = ($event->userownerid ? $event->userownerid : 0);
1224  if (isset($colorindexused[$idusertouse])) {
1225  $colorindex = $colorindexused[$idusertouse]; // Color already assigned to this user
1226  } else {
1227  $colorindex = $nextindextouse;
1228  $colorindexused[$idusertouse] = $colorindex;
1229  if (!empty($theme_datacolor[$nextindextouse + 1])) {
1230  $nextindextouse++; // Prepare to use next color
1231  }
1232  }
1233  // Define color
1234  $color = sprintf("%02x%02x%02x", $theme_datacolor[$colorindex][0], $theme_datacolor[$colorindex][1], $theme_datacolor[$colorindex][2]);
1235  }
1236 
1237  // Define all rects with event (cases1 is first half hour, cases2 is second half hour)
1238  for ($h = $begin_h; $h < $end_h; $h++) {
1239  //if ($username->id == 1 && $day==1) print 'h='.$h;
1240  $newcolor = ''; //init
1241  if (empty($event->fulldayevent)) {
1242  $a = dol_mktime((int) $h, 0, 0, $month, $day, $year, 'tzuserrel', 0);
1243  $b = dol_mktime((int) $h, 30, 0, $month, $day, $year, 'tzuserrel', 0);
1244  $c = dol_mktime((int) $h + 1, 0, 0, $month, $day, $year, 'tzuserrel', 0);
1245 
1246  $dateendtouse = $event->date_end_in_calendar;
1247  if ($dateendtouse == $event->date_start_in_calendar) {
1248  $dateendtouse++;
1249  }
1250 
1251  //print dol_print_date($event->date_start_in_calendar,'dayhour').'-'.dol_print_date($a,'dayhour').'-'.dol_print_date($b,'dayhour').'<br>';
1252 
1253  if ($event->date_start_in_calendar < $b && $dateendtouse > $a) {
1254  $busy = $event->transparency;
1255  $cases1[$h][$event->id]['busy'] = $busy;
1256  $cases1[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1257  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1258  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1259  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1260  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1261  $cases1[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1262  } else {
1263  $cases1[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1264  }
1265  }
1266  if ($event->label) {
1267  $cases1[$h][$event->id]['string'] .= ' - '.$event->label;
1268  }
1269  $cases1[$h][$event->id]['typecode'] = $event->type_code;
1270  $cases1[$h][$event->id]['color'] = $color;
1271  if ($event->fk_project > 0) {
1272  if (empty($cacheprojects[$event->fk_project])) {
1273  $tmpproj = new Project($db);
1274  $tmpproj->fetch($event->fk_project);
1275  $cacheprojects[$event->fk_project] = $tmpproj;
1276  }
1277  $cases1[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1278  }
1279  if ($event->socid > 0) {
1280  if (empty($cachethirdparties[$event->socid])) {
1281  $tmpthirdparty = new Societe($db);
1282  $tmpthirdparty->fetch($event->socid);
1283  $cachethirdparties[$event->socid] = $tmpthirdparty;
1284  }
1285  $cases1[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1286  }
1287  if ($event->contact_id > 0) {
1288  if (empty($cachecontacts[$event->contact_id])) {
1289  $tmpcontact = new Contact($db);
1290  $tmpcontact->fetch($event->contact_id);
1291  $cachecontacts[$event->contact_id] = $tmpcontact;
1292  }
1293  $cases1[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1294  }
1295  }
1296  if ($event->date_start_in_calendar < $c && $dateendtouse > $b) {
1297  $busy = $event->transparency;
1298  $cases2[$h][$event->id]['busy'] = $busy;
1299  $cases2[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1300  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1301  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1302  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1303  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1304  $cases2[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1305  } else {
1306  $cases2[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1307  }
1308  }
1309  if ($event->label) {
1310  $cases2[$h][$event->id]['string'] .= ' - '.$event->label;
1311  }
1312  $cases2[$h][$event->id]['typecode'] = $event->type_code;
1313  $cases2[$h][$event->id]['color'] = $color;
1314  if ($event->fk_project > 0) {
1315  if (empty($cacheprojects[$event->fk_project])) {
1316  $tmpproj = new Project($db);
1317  $tmpproj->fetch($event->fk_project);
1318  $cacheprojects[$event->fk_project] = $tmpproj;
1319  }
1320  $cases2[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1321  }
1322  if ($event->socid > 0) {
1323  if (empty($cachethirdparties[$event->socid])) {
1324  $tmpthirdparty = new Societe($db);
1325  $tmpthirdparty->fetch($event->socid);
1326  $cachethirdparties[$event->socid] = $tmpthirdparty;
1327  }
1328  $cases2[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1329  }
1330  if ($event->contact_id > 0) {
1331  if (empty($cachecontacts[$event->contact_id])) {
1332  $tmpcontact = new Contact($db);
1333  $tmpcontact->fetch($event->contact_id);
1334  $cachecontacts[$event->contact_id] = $tmpcontact;
1335  }
1336  $cases2[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1337  }
1338  }
1339  } else {
1340  $busy = $event->transparency;
1341  $cases1[$h][$event->id]['busy'] = $busy;
1342  $cases2[$h][$event->id]['busy'] = $busy;
1343  $cases1[$h][$event->id]['string'] = $event->label;
1344  $cases2[$h][$event->id]['string'] = $event->label;
1345  $cases1[$h][$event->id]['typecode'] = $event->type_code;
1346  $cases2[$h][$event->id]['typecode'] = $event->type_code;
1347  $cases1[$h][$event->id]['color'] = $color;
1348  $cases2[$h][$event->id]['color'] = $color;
1349  }
1350  }
1351  $i++;
1352  }
1353 
1354  break; // We found the date we were looking for. No need to search anymore.
1355  }
1356  }
1357 
1358  // Now output $casesX from start hour to end hour
1359  for ($h = $begin_h; $h < $end_h; $h++) {
1360  $color1 = ''; $color2 = '';
1361  $style1 = ''; $style2 = '';
1362  $string1 = '&nbsp;'; $string2 = '&nbsp;';
1363  $title1 = ''; $title2 = '';
1364  if (isset($cases1[$h]) && $cases1[$h] != '') {
1365  //$title1.=count($cases1[$h]).' '.(count($cases1[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1366  if (count($cases1[$h]) > 1) {
1367  $title1 .= count($cases1[$h]).' '.(count($cases1[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1368  }
1369  $string1 = '&nbsp;';
1370  if (empty($conf->global->AGENDA_NO_TRANSPARENT_ON_NOT_BUSY)) {
1371  $style1 = 'peruser_notbusy';
1372  } else {
1373  $style1 = 'peruser_busy';
1374  }
1375  foreach ($cases1[$h] as $id => $ev) {
1376  if ($ev['busy']) {
1377  $style1 = 'peruser_busy';
1378  }
1379  }
1380  }
1381  if (isset($cases2[$h]) && $cases2[$h] != '') {
1382  //$title2.=count($cases2[$h]).' '.(count($cases2[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1383  if (count($cases2[$h]) > 1) {
1384  $title2 .= count($cases2[$h]).' '.(count($cases2[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1385  }
1386  $string2 = '&nbsp;';
1387  if (empty($conf->global->AGENDA_NO_TRANSPARENT_ON_NOT_BUSY)) {
1388  $style2 = 'peruser_notbusy';
1389  } else {
1390  $style2 = 'peruser_busy';
1391  }
1392  foreach ($cases2[$h] as $id => $ev) {
1393  if ($ev['busy']) {
1394  $style2 = 'peruser_busy';
1395  }
1396  }
1397  }
1398 
1399  $ids1 = '';
1400  $ids2 = '';
1401  if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) && array_keys($cases1[$h])) {
1402  $ids1 = join(', ', array_keys($cases1[$h]));
1403  }
1404  if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) && array_keys($cases2[$h])) {
1405  $ids2 = join(', ', array_keys($cases2[$h]));
1406  }
1407 
1408  if ($h == $begin_h) {
1409  echo '<td class="'.$style.'_peruserleft cal_peruser'.($var ? ' cal_impair '.$style.'_impair' : '').'">';
1410  } else {
1411  echo '<td class="'.$style.' cal_peruser'.($var ? ' cal_impair '.$style.'_impair' : '').'">';
1412  }
1413  if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) == 1) { // only 1 event
1414  $output = array_slice($cases1[$h], 0, 1);
1415  $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : '');
1416  if ($output[0]['string']) {
1417  $title1 .= ($title1 ? ' - ' : '').$output[0]['string'];
1418  }
1419  if ($output[0]['color']) {
1420  $color1 = $output[0]['color'];
1421  }
1422  } elseif (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) > 1) {
1423  $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : '');
1424  $color1 = '222222';
1425  }
1426 
1427  if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) == 1) { // only 1 event
1428  $output = array_slice($cases2[$h], 0, 1);
1429  $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : '');
1430  if ($output[0]['string']) {
1431  $title2 .= ($title2 ? ' - ' : '').$output[0]['string'];
1432  }
1433  if ($output[0]['color']) {
1434  $color2 = $output[0]['color'];
1435  }
1436  } elseif (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) > 1) {
1437  $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : '');
1438  $color2 = '222222';
1439  }
1440  print '<table class="nobordernopadding case centpercent">';
1441  print '<tr><td ';
1442  if ($style1 == 'peruser_notbusy') {
1443  print 'style="border: 1px solid #'.($color1 ? $color1 : "888").' !important" ';
1444  } elseif ($color1) {
1445  print ($color1 ? 'style="background: #'.$color1.';"' : '');
1446  }
1447  print 'class="';
1448  print ($style1 ? $style1.' ' : '');
1449  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.'"' : '').'>';
1450  print $string1;
1451  print '</td><td ';
1452  if ($style2 == 'peruser_notbusy') {
1453  print 'style="border: 1px solid #'.($color2 ? $color2 : "888").' !important" ';
1454  } elseif ($color2) {
1455  print ($color2 ? 'style="background: #'.$color2.';"' : '');
1456  }
1457  print 'class="';
1458  print ($style2 ? $style2.' ' : '');
1459  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.'"' : '').'>';
1460  print $string2;
1461  print '</td></tr>';
1462  print '</table>';
1463  print '</td>';
1464  }
1465 }
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:48
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
Definition: index.php:746
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_get_next_week($day, $week, $month, $year)
Return next week.
Definition: date.lib.php:555
dol_get_first_day_week($day, $month, $year, $gm=false)
Return first day of week for a date.
Definition: date.lib.php:652
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition: date.lib.php:122
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_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='', $keepspaces=0)
Clean a string from all punctuation characters to use it as a ref or login.
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)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.