dolibarr  21.0.0-alpha
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  * Copyright (C) 2023 Florian HENRY <florian.henry@scopen.fr>
10  * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 3 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program. If not, see <https://www.gnu.org/licenses/>.
24  */
25 
26 
33 // Load Dolibarr environment
34 require '../../main.inc.php';
35 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
38 require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
40 require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
41 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
42 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
43 
44 
45 if (!isset($conf->global->AGENDA_MAX_EVENTS_DAY_VIEW)) {
46  $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW = 3;
47 }
48 
49 $action = GETPOST('action', 'aZ09');
50 
51 $disabledefaultvalues = GETPOSTINT('disabledefaultvalues');
52 
53 $filter = GETPOST("search_filter", 'alpha', 3) ? GETPOST("search_filter", 'alpha', 3) : GETPOST("filter", 'alpha', 3);
54 $filtert = GETPOSTINT("search_filtert", 3) ? GETPOSTINT("search_filtert", 3) : GETPOSTINT("filtert", 3);
55 $usergroup = GETPOSTINT("search_usergroup", 3) ? GETPOSTINT("search_usergroup", 3) : GETPOSTINT("usergroup", 3);
56 //if (! ($usergroup > 0) && ! ($filtert > 0)) $filtert = $user->id;
57 //$showbirthday = empty($conf->use_javascript_ajax)?GETPOST("showbirthday","int"):1;
58 $showbirthday = 0;
59 
60 // If not choice done on calendar owner, we filter on user.
61 /*if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS))
62 {
63  $filtert = $user->id;
64 }*/
65 
66 $sortfield = GETPOST('sortfield', 'aZ09comma');
67 $sortorder = GETPOST('sortorder', 'aZ09comma');
68 $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
69 if (empty($page) || $page == -1) {
70  $page = 0;
71 } // If $page is not defined, or '' or -1
72 $limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
73 $offset = $limit * $page;
74 if (!$sortorder) {
75  $sortorder = "ASC";
76 }
77 if (!$sortfield) {
78  $sortfield = "a.datec";
79 }
80 
81 $socid = GETPOSTINT("search_socid") ? GETPOSTINT("search_socid") : GETPOSTINT("socid");
82 if ($user->socid) {
83  $socid = $user->socid;
84 }
85 if ($socid < 0) {
86  $socid = '';
87 }
88 
89 $canedit = 1;
90 if (!$user->hasRight('agenda', 'myactions', 'read')) {
92 }
93 if (!$user->hasRight('agenda', 'allactions', 'read')) {
94  $canedit = 0;
95 }
96 if (!$user->hasRight('agenda', 'allactions', 'read') || $filter == 'mine') { // If no permission to see all, we show only affected to me
97  $filtert = $user->id;
98 }
99 
100 $mode = 'show_peruser';
101 $resourceid = GETPOSTINT("search_resourceid") ? GETPOSTINT("search_resourceid") : GETPOSTINT("resourceid");
102 $year = GETPOSTINT("year") ? GETPOSTINT("year") : idate("Y");
103 $month = GETPOSTINT("month") ? GETPOSTINT("month") : idate("m");
104 $week = GETPOSTINT("week") ? GETPOSTINT("week") : idate("W");
105 $day = GETPOSTINT("day") ? GETPOSTINT("day") : idate("d");
106 $pid = GETPOSTISSET("search_projectid") ? GETPOSTINT("search_projectid", 3) : GETPOSTINT("projectid", 3);
107 $status = GETPOSTISSET("search_status") ? GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09'); // status may be 0, 50, 100, 'todo', 'na' or -1
108 $type = GETPOSTISSET("search_type") ? GETPOST("search_type", 'alpha') : GETPOST("type", 'alpha');
109 $maxprint = ((GETPOSTINT("maxprint") != '') ? GETPOSTINT("maxprint") : $conf->global->AGENDA_MAX_EVENTS_DAY_VIEW);
110 $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
111 $search_categ_cus = GETPOSTINT("search_categ_cus", 3) ? GETPOSTINT("search_categ_cus", 3) : 0;
112 // Set actioncode (this code must be same for setting actioncode into peruser, listacton and index)
113 if (GETPOST('search_actioncode', 'array:aZ09')) {
114  $actioncode = GETPOST('search_actioncode', 'array:aZ09', 3);
115  if (!count($actioncode)) {
116  $actioncode = '0';
117  }
118 } else {
119  $actioncode = GETPOST("search_actioncode", "alpha", 3) ? GETPOST("search_actioncode", "alpha", 3) : (GETPOST("search_actioncode", "alpha") == '0' ? '0' : ((!getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE') || $disabledefaultvalues) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE));
120 }
121 
122 $dateselect = dol_mktime(0, 0, 0, GETPOSTINT('dateselectmonth'), GETPOSTINT('dateselectday'), GETPOSTINT('dateselectyear'));
123 if ($dateselect > 0) {
124  $day = GETPOSTINT('dateselectday');
125  $month = GETPOSTINT('dateselectmonth');
126  $year = GETPOSTINT('dateselectyear');
127 }
128 
129 $tmp = !getDolGlobalString('MAIN_DEFAULT_WORKING_HOURS') ? '9-18' : $conf->global->MAIN_DEFAULT_WORKING_HOURS;
130 $tmp = str_replace(' ', '', $tmp); // FIX 7533
131 $tmparray = explode('-', $tmp);
132 $begin_h = GETPOSTISSET('begin_h') ? GETPOSTINT('begin_h') : ($tmparray[0] != '' ? $tmparray[0] : 9);
133 $end_h = GETPOSTISSET('end_h') ? GETPOSTINT('end_h') : ($tmparray[1] != '' ? $tmparray[1] : 18);
134 if ($begin_h < 0 || $begin_h > 23) {
135  $begin_h = 9;
136 }
137 if ($end_h < 1 || $end_h > 24) {
138  $end_h = 18;
139 }
140 if ($end_h <= $begin_h) {
141  $end_h = $begin_h + 1;
142 }
143 
144 $tmp = !getDolGlobalString('MAIN_DEFAULT_WORKING_DAYS') ? '1-5' : $conf->global->MAIN_DEFAULT_WORKING_DAYS;
145 $tmp = str_replace(' ', '', $tmp); // FIX 7533
146 $tmparray = explode('-', $tmp);
147 $begin_d = GETPOSTISSET('begin_d') ? GETPOSTINT('begin_d') : ($tmparray[0] != '' ? $tmparray[0] : 1);
148 $end_d = GETPOSTISSET('end_d') ? GETPOSTINT('end_d') : ($tmparray[1] != '' ? $tmparray[1] : 5);
149 if ($begin_d < 1 || $begin_d > 7) {
150  $begin_d = 1;
151 }
152 if ($end_d < 1 || $end_d > 7) {
153  $end_d = 7;
154 }
155 if ($end_d < $begin_d) {
156  $end_d = $begin_d + 1;
157 }
158 
159 if ($status == '' && !GETPOSTISSET('search_status')) {
160  $status = ((!getDolGlobalString('AGENDA_DEFAULT_FILTER_STATUS') || $disabledefaultvalues) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_STATUS);
161 }
162 
163 if (empty($mode) && !GETPOSTISSET('mode')) {
164  $mode = (!getDolGlobalString('AGENDA_DEFAULT_VIEW') ? 'show_month' : $conf->global->AGENDA_DEFAULT_VIEW);
165 }
166 
167 if (GETPOST('viewcal', 'alpha') && $mode != 'show_day' && $mode != 'show_week' && $mode != 'show_peruser') {
168  $mode = 'show_month';
169  $day = '';
170 } // View by month
171 if (GETPOST('viewweek', 'alpha') || $mode == 'show_week') {
172  $mode = 'show_week';
173  $week = ($week ? $week : idate("W"));
174  $day = ($day ? $day : idate("d"));
175 } // View by week
176 if (GETPOST('viewday', 'alpha') || $mode == 'show_day') {
177  $mode = 'show_day';
178  $day = ($day ? $day : idate("d"));
179 } // View by day
180 
181 $object = new ActionComm($db);
182 
183 // Load translation files required by the page
184 $langs->loadLangs(array('users', 'agenda', 'other', 'commercial'));
185 
186 // Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
187 $hookmanager->initHooks(array('agenda'));
188 
189 $result = restrictedArea($user, 'agenda', 0, '', 'myactions');
190 if ($user->socid && $socid) {
191  $result = restrictedArea($user, 'societe', $socid);
192 }
193 
194 $search_status = $status;
195 
196 
197 /*
198  * Actions
199  */
200 
201 // None
202 
203 
204 /*
205  * View
206  */
207 
208 $parameters = array(
209  'socid' => $socid,
210  'status' => $status,
211  'year' => $year,
212  'month' => $month,
213  'day' => $day,
214  'type' => $type,
215  'maxprint' => $maxprint,
216  'filter' => $filter,
217  'filtert' => $filtert,
218  'showbirthday' => $showbirthday,
219  'canedit' => $canedit,
220  'optioncss' => $optioncss,
221  'actioncode' => $actioncode,
222  'pid' => $pid,
223  'resourceid' => $resourceid,
224  'usergroup' => $usergroup,
225 );
226 $reshook = $hookmanager->executeHooks('beforeAgendaPerUser', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
227 if ($reshook < 0) {
228  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
229 }
230 
231 $form = new Form($db);
232 $companystatic = new Societe($db);
233 
234 $help_url = 'EN:Module_Agenda_En|FR:Module_Agenda|ES:M&oacute;dulo_Agenda|DE:Modul_Terminplanung';
235 llxHeader('', $langs->trans("Agenda"), $help_url);
236 
237 $now = dol_now();
238 $nowarray = dol_getdate($now);
239 $nowyear = $nowarray['year'];
240 $nowmonth = $nowarray['mon'];
241 $nowday = $nowarray['mday'];
242 
243 
244 // Define list of all external calendars (global setup)
245 $listofextcals = array();
246 
247 $prev = dol_get_first_day_week($day, $month, $year);
248 $first_day = $prev['first_day'];
249 $first_month = $prev['first_month'];
250 $first_year = $prev['first_year'];
251 
252 $week = $prev['week'];
253 
254 $day = (int) $day;
255 $next = dol_get_next_week($day, $week, $month, $year);
256 $next_year = $next['year'];
257 $next_month = $next['month'];
258 $next_day = $next['day'];
259 
260 $max_day_in_month = idate("t", dol_mktime(0, 0, 0, $month, 1, $year));
261 
262 $tmpday = $first_day;
263 //print 'xx'.$prev_year.'-'.$prev_month.'-'.$prev_day;
264 //print 'xx'.$next_year.'-'.$next_month.'-'.$next_day;
265 
266 $title = $langs->trans("DoneAndToDoActions");
267 if ($status == 'done') {
268  $title = $langs->trans("DoneActions");
269 }
270 if ($status == 'todo') {
271  $title = $langs->trans("ToDoActions");
272 }
273 
274 $param = '';
275 if ($actioncode || GETPOSTISSET('search_actioncode')) {
276  if (is_array($actioncode)) {
277  foreach ($actioncode as $str_action) {
278  $param .= "&search_actioncode[]=".urlencode($str_action);
279  }
280  } else {
281  $param .= "&search_actioncode=".urlencode($actioncode);
282  }
283 }
284 if ($resourceid > 0) {
285  $param .= "&search_resourceid=".urlencode((string) ($resourceid));
286 }
287 
288 if ($status || GETPOSTISSET('status') || GETPOSTISSET('search_status')) {
289  $param .= "&search_status=".urlencode($status);
290 }
291 if ($filter) {
292  $param .= "&search_filter=".urlencode($filter);
293 }
294 if ($filtert) {
295  $param .= "&search_filtert=".urlencode($filtert);
296 }
297 if ($usergroup > 0) {
298  $param .= "&search_usergroup=".urlencode((string) ($usergroup));
299 }
300 if ($socid > 0) {
301  $param .= "&search_socid=".urlencode((string) ($socid));
302 }
303 if ($showbirthday) {
304  $param .= "&search_showbirthday=1";
305 }
306 if ($pid) {
307  $param .= "&search_projectid=".urlencode((string) ($pid));
308 }
309 if ($type) {
310  $param .= "&search_type=".urlencode($type);
311 }
312 if ($mode != 'show_peruser') {
313  $param .= '&mode='.urlencode($mode);
314 }
315 if ($begin_h != '') {
316  $param .= '&begin_h='.((int) $begin_h);
317 }
318 if ($end_h != '') {
319  $param .= '&end_h='.((int) $end_h);
320 }
321 if ($begin_d != '') {
322  $param .= '&begin_d='.((int) $begin_d);
323 }
324 if ($end_d != '') {
325  $param .= '&end_d='.((int) $end_d);
326 }
327 if ($search_categ_cus != 0) {
328  $param .= '&search_categ_cus='.urlencode((string) ($search_categ_cus));
329 }
330 $param .= "&maxprint=".urlencode((string) ($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 = (getDolGlobalString('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 = idate("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((string) ($year)).'&month='.urlencode((string) ($month)).($day ? '&day='.urlencode((string) ($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 $mode = 'show_peruser';
435 $massactionbutton = '';
436 
437 
438 $viewmode = '<div class="navmode inline-block">';
439 
440 $viewmode .= '<a class="btnTitle'.($mode == 'list' ? ' btnTitleSelected' : '').' reposition" href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&restore_lastsearch_values=1'.$paramnoactionodate.'">';
441 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
442 $viewmode .= img_picto($langs->trans("List"), 'object_calendarlist', 'class="imgforviewmode pictoactionview block"');
443 //$viewmode .= '</span>';
444 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone inline-block width75 divoverflow">'.$langs->trans("ViewList").'</span></a>';
445 
446 $viewmode .= '<a class="btnTitle'.($mode == 'show_month' ? ' btnTitleSelected' : '').' 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.'">';
447 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
448 $viewmode .= img_picto($langs->trans("ViewCal"), 'object_calendarmonth', 'class="pictoactionview block"');
449 //$viewmode .= '</span>';
450 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone inline-block width75 divoverflow">'.$langs->trans("ViewCal").'</span></a>';
451 
452 $viewmode .= '<a class="btnTitle'.($mode == 'show_week' ? ' btnTitleSelected' : '').' 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.'">';
453 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
454 $viewmode .= img_picto($langs->trans("ViewWeek"), 'object_calendarweek', 'class="pictoactionview block"');
455 //$viewmode .= '</span>';
456 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone inline-block width75 divoverflow">'.$langs->trans("ViewWeek").'</span></a>';
457 
458 $viewmode .= '<a class="btnTitle'.($mode == 'show_day' ? ' btnTitleSelected' : '').' 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.'">';
459 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
460 $viewmode .= img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="pictoactionview block"');
461 //$viewmode .= '</span>';
462 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone inline-block width75 divoverflow">'.$langs->trans("ViewDay").'</span></a>';
463 
464 $viewmode .= '<a class="btnTitle'.($mode == 'show_peruser' ? ' 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.'">';
465 //$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
466 $viewmode .= img_picto($langs->trans("ViewPerUser"), 'object_calendarperuser', 'class="pictoactionview block"');
467 //$viewmode .= '</span>';
468 $viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone inline-block width75 divoverflow" title="'.dolPrintHTML($langs->trans("ViewPerUser")).'">'.$langs->trans("ViewPerUser").'</span></a>';
469 
470 // Add more views from hooks
471 $parameters = array();
472 $object = null;
473 $reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
474 if (empty($reshook)) {
475  $viewmode .= $hookmanager->resPrint;
476 } elseif ($reshook > 1) {
477  $viewmode = $hookmanager->resPrint;
478 }
479 
480 $viewmode .= '</div>';
481 
482 $viewmode .= '<span class="marginrightonly"></span>';
483 
484 
485 $newparam = '';
486 $newcardbutton = '';
487 if ($user->hasRight('agenda', 'myactions', 'create') || $user->hasRight('agenda', 'allactions', 'create')) {
488  $tmpforcreatebutton = dol_getdate(dol_now(), true);
489 
490  $newparam .= '&month='.urlencode(str_pad((string) $month, 2, "0", STR_PAD_LEFT)).'&year='.((int) $tmpforcreatebutton['year']);
491  if ($begin_h !== '') {
492  $newparam .= '&begin_h='.((int) $begin_h);
493  }
494  if ($end_h !== '') {
495  $newparam .= '&end_h='.((int) $end_h);
496  }
497  if ($begin_d !== '') {
498  $newparam .= '&begin_d='.((int) $begin_d);
499  }
500  if ($end_d !== '') {
501  $newparam .= '&end_d='.((int) $end_d);
502  }
503 
504  $urltocreateaction = DOL_URL_ROOT.'/comm/action/card.php?action=create';
505  $urltocreateaction .= '&apyear='.$tmpforcreatebutton['year'].'&apmonth='.$tmpforcreatebutton['mon'].'&apday='.$tmpforcreatebutton['mday'].'&aphour='.$tmpforcreatebutton['hours'].'&apmin='.$tmpforcreatebutton['minutes'];
506  $urltocreateaction .= '&backtopage='.urlencode($_SERVER["PHP_SELF"].($newparam ? '?'.$newparam : ''));
507 
508  $newcardbutton .= dolGetButtonTitle($langs->trans("AddAction"), '', 'fa fa-plus-circle', $urltocreateaction);
509 }
510 
511 $num = '';
512 
513 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);
514 
515 $link = '';
516 //print load_fiche_titre('', $link.' &nbsp; &nbsp; '.$nav.' '.$newcardbutton, '');
517 
518 
519 $s .= "\n".'<!-- Div to calendars selectors -->'."\n";
520 
521 // Local calendar
522 $newtitle = '<div class="nowrap clear inline-block minheight30">';
523 $newtitle .= '<input type="checkbox" id="check_mytasks" name="check_mytasks" checked disabled> '.$langs->trans("LocalAgenda").' &nbsp; ';
524 $newtitle .= '</div>';
525 //$newtitle=$langs->trans($title);
526 
527 $s = $newtitle;
528 
529 // Calendars from hooks
530 $parameters = array();
531 $reshook = $hookmanager->executeHooks('addCalendarChoice', $parameters, $object, $action);
532 if (empty($reshook)) {
533  $s .= $hookmanager->resPrint;
534 } elseif ($reshook > 1) {
535  $s = $hookmanager->resPrint;
536 }
537 
538 $s .= "\n".'<!-- End div to calendars selectors -->'."\n";
539 
540 print $s;
541 
542 print '<div class="liste_titre liste_titre_bydiv centpercent">';
543 print_actions_filter($form, $canedit, $search_status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid, $search_categ_cus);
544 print '</div>';
545 
546 
547 // Get event in an array
548 $eventarray = array();
549 
550 
551 // DEFAULT CALENDAR + AUTOEVENT CALENDAR + CONFERENCEBOOTH CALENDAR
552 $sql = "SELECT";
553 if ($usergroup > 0) {
554  $sql .= " DISTINCT";
555 }
556 $sql .= " a.id, a.label,";
557 $sql .= " a.datep,";
558 $sql .= " a.datep2,";
559 $sql .= " a.percent,";
560 $sql .= " a.fk_user_author,a.fk_user_action,";
561 $sql .= " a.transparency, a.priority, a.fulldayevent, a.location,";
562 $sql .= " a.fk_soc, a.fk_contact, a.fk_element, a.elementtype, a.fk_project,";
563 $sql .= " ca.code, ca.libelle as type_label, ca.color, ca.type as type_type, ca.picto as type_picto";
564 $sql .= " FROM ".MAIN_DB_PREFIX."c_actioncomm as ca, ".MAIN_DB_PREFIX."actioncomm as a";
565 // We must filter on resource table
566 if ($resourceid > 0) {
567  $sql .= ", ".MAIN_DB_PREFIX."element_resources as r";
568 }
569 // We must filter on assignment table
570 if ($filtert > 0 || $usergroup > 0) {
571  $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm_resources as ar";
572  $sql .= " ON ar.fk_actioncomm = a.id AND ar.element_type='user'";
573  if ($filtert > 0) {
574  $sql .= " AND ar.fk_element = ".((int) $filtert);
575  }
576  if ($usergroup > 0) {
577  $sql .= " INNER JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element AND ugu.fk_usergroup = ".((int) $usergroup);
578  }
579 }
580 
581 $sql .= " WHERE a.fk_action = ca.id";
582 $sql .= " AND a.entity IN (".getEntity('agenda').")";
583 // Condition on actioncode
584 if (!empty($actioncode)) {
585  if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
586  if ($actioncode == 'AC_NON_AUTO') {
587  $sql .= " AND ca.type != 'systemauto'";
588  } elseif ($actioncode == 'AC_ALL_AUTO') {
589  $sql .= " AND ca.type = 'systemauto'";
590  } else {
591  if ($actioncode == 'AC_OTH') {
592  $sql .= " AND ca.type != 'systemauto'";
593  }
594  if ($actioncode == 'AC_OTH_AUTO') {
595  $sql .= " AND ca.type = 'systemauto'";
596  }
597  }
598  } else {
599  if ($actioncode == 'AC_NON_AUTO') {
600  $sql .= " AND ca.type != 'systemauto'";
601  } elseif ($actioncode == 'AC_ALL_AUTO') {
602  $sql .= " AND ca.type = 'systemauto'";
603  } else {
604  if (is_array($actioncode)) {
605  $sql .= " AND ca.code IN (".$db->sanitize("'".implode("','", $actioncode)."'", 1).")";
606  } else {
607  $sql .= " AND ca.code IN (".$db->sanitize("'".implode("','", explode(',', $actioncode))."'", 1).")";
608  }
609  }
610  }
611 }
612 if ($resourceid > 0) {
613  $sql .= " AND r.element_type = 'action' AND r.element_id = a.id AND r.resource_id = ".((int) $resourceid);
614 }
615 if ($pid) {
616  $sql .= " AND a.fk_project = ".((int) $pid);
617 }
618 // If the internal user must only see his customers, force searching by him
619 $search_sale = 0;
620 if (!$user->hasRight('societe', 'client', 'voir')) {
621  $search_sale = $user->id;
622 }
623 // Search on sale representative
624 if ($search_sale && $search_sale != '-1') {
625  if ($search_sale == -2) {
626  $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = a.fk_soc)";
627  } elseif ($search_sale > 0) {
628  $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc WHERE sc.fk_soc = a.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
629  }
630 }
631 // Search on socid
632 if ($socid) {
633  $sql .= " AND a.fk_soc = ".((int) $socid);
634 }
635 
636 if ($mode == 'show_day') {
637  $sql .= " AND (";
638  $sql .= " (a.datep BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
639  $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
640  $sql .= " OR ";
641  $sql .= " (a.datep2 BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
642  $sql .= " AND '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
643  $sql .= " OR ";
644  $sql .= " (a.datep < '".$db->idate(dol_mktime(0, 0, 0, $month, $day, $year, 'tzuserrel'))."'";
645  $sql .= " AND a.datep2 > '".$db->idate(dol_mktime(23, 59, 59, $month, $day, $year, 'tzuserrel'))."')";
646  $sql .= ")";
647 } else {
648  // To limit array
649  $sql .= " AND (";
650  $sql .= " (a.datep BETWEEN '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'"; // Start 2 day before $firstdaytoshow
651  $sql .= " AND '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')"; // End 2 day after $lastdaytoshow
652  $sql .= " OR ";
653  $sql .= " (a.datep2 BETWEEN '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'";
654  $sql .= " AND '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')";
655  $sql .= " OR ";
656  $sql .= " (a.datep < '".$db->idate($firstdaytoshow - (60 * 60 * 24 * 2))."'";
657  $sql .= " AND a.datep2 > '".$db->idate($lastdaytoshow + (60 * 60 * 24 * 2))."')";
658  $sql .= ")";
659 }
660 if ($type) {
661  $sql .= " AND ca.id = ".((int) $type);
662 }
663 if ($status == '0') {
664  $sql .= " AND a.percent = 0";
665 }
666 if ($status === 'na') {
667  // Not applicable
668  $sql .= " AND a.percent = -1";
669 }
670 if ($status == '50') {
671  // Running already started
672  $sql .= " AND (a.percent > 0 AND a.percent < 100)";
673 }
674 if ($status == 'done' || $status == '100') {
675  $sql .= " AND (a.percent = 100)";
676 }
677 if ($status == 'todo') {
678  $sql .= " AND (a.percent >= 0 AND a.percent < 100)";
679 }
680 // Search in categories, -1 is all and -2 is no categories
681 if ($search_categ_cus != -1) {
682  if ($search_categ_cus == -2) {
683  $sql .= " AND NOT EXISTS (SELECT ca.fk_actioncomm FROM ".MAIN_DB_PREFIX."categorie_actioncomm as ca WHERE ca.fk_actioncomm = a.id)";
684  } elseif ($search_categ_cus > 0) {
685  $sql .= " AND EXISTS (SELECT ca.fk_actioncomm FROM ".MAIN_DB_PREFIX."categorie_actioncomm as ca WHERE ca.fk_actioncomm = a.id AND ca.fk_categorie IN (".$db->sanitize($search_categ_cus)."))";
686  }
687 }
688 // Sort on date
689 $sql .= $db->order("fk_user_action, datep");
690 //print $sql;
691 
692 dol_syslog("comm/action/peruser.php", LOG_DEBUG);
693 $resql = $db->query($sql);
694 if ($resql) {
695  $num = $db->num_rows($resql);
696 
697  $i = 0;
698  while ($i < $num) {
699  $obj = $db->fetch_object($resql);
700  //print $obj->fk_user_action.' '.$obj->id."<br>";
701 
702  // Discard auto action if option is on
703  if (getDolGlobalString('AGENDA_ALWAYS_HIDE_AUTO') && $obj->code == 'AC_OTH_AUTO') {
704  $i++;
705  continue;
706  }
707 
708  $datep = $db->jdate($obj->datep);
709  $datep2 = $db->jdate($obj->datep2);
710 
711 
712  // Create a new object action
713  $event = new ActionComm($db);
714  $event->id = $obj->id;
715  $event->datep = $datep; // datep and datef are GMT date
716  $event->datef = $datep2;
717  $event->type_code = $obj->code;
718  $event->type_color = $obj->color;
719  $event->label = $obj->label;
720  $event->percentage = $obj->percent;
721  $event->authorid = $obj->fk_user_author; // user id of creator
722  $event->userownerid = $obj->fk_user_action; // user id of owner
723  $event->priority = $obj->priority;
724  $event->fulldayevent = $obj->fulldayevent;
725  $event->location = $obj->location;
726  $event->transparency = $obj->transparency;
727 
728  $event->fk_project = $obj->fk_project;
729 
730  $event->socid = $obj->fk_soc;
731  $event->contact_id = $obj->fk_contact;
732 
733  $event->fk_element = $obj->fk_element;
734  $event->elementtype = $obj->elementtype;
735 
736  // Defined date_start_in_calendar and date_end_in_calendar property
737  // They are date start and end of action but modified to not be outside calendar view.
738  $event->date_start_in_calendar = $datep;
739  if ($datep2 != '' && $datep2 >= $datep) {
740  $event->date_end_in_calendar = $datep2;
741  } else {
742  $event->date_end_in_calendar = $datep;
743  }
744 
745  //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";
746 
747  // Check values
748  if ($event->date_end_in_calendar < $firstdaytoshow ||
749  $event->date_start_in_calendar >= $lastdaytoshow) {
750  // This record is out of visible range
751  unset($event);
752  } else {
753  //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";
754  $event->fetch_userassigned(); // This load $event->userassigned
755 
756  if ($event->date_start_in_calendar < $firstdaytoshow) {
757  $event->date_start_in_calendar = $firstdaytoshow;
758  }
759  if ($event->date_end_in_calendar >= $lastdaytoshow) {
760  $event->date_end_in_calendar = ($lastdaytoshow - 1);
761  }
762 
763  // Add an entry in actionarray for each day
764  $daycursor = $event->date_start_in_calendar;
765  $annee = dol_print_date($daycursor, '%Y', 'tzuserrel');
766  $mois = dol_print_date($daycursor, '%m', 'tzuserrel');
767  $jour = dol_print_date($daycursor, '%d', 'tzuserrel');
768  //print $daycursor.' '.dol_print_date($daycursor, 'dayhour', 'gmt').' '.$event->id.' -> '.$annee.'-'.$mois.'-'.$jour.'<br>';
769 
770  // Loop on each day covered by action to prepare an index to show on calendar
771  $loop = true;
772  $j = 0;
773  $daykey = dol_mktime(0, 0, 0, $mois, $jour, $annee, 'gmt');
774  do {
775  //print 'Add event into eventarray for daykey='.$daykey.'='.dol_print_date($daykey, 'dayhour', 'gmt').' '.$event->id.' '.$event->datep.' '.$event->datef.'<br>';
776 
777  $eventarray[$daykey][] = $event;
778  $j++;
779 
780  $daykey += 60 * 60 * 24;
781  if ($daykey > $event->date_end_in_calendar) {
782  $loop = false;
783  }
784  } while ($loop);
785 
786  //print 'Event '.$i.' id='.$event->id.' (start='.dol_print_date($event->datep).'-end='.dol_print_date($event->datef);
787  //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>';
788  }
789  $i++;
790  }
791  $db->free($resql);
792 } else {
793  dol_print_error($db);
794 }
795 
796 $maxnbofchar = 18;
797 $cachethirdparties = array();
798 $cachecontacts = array();
799 $cacheusers = array();
800 
801 // Define theme_datacolor array
802 $color_file = DOL_DOCUMENT_ROOT."/theme/".$conf->theme."/theme_vars.inc.php";
803 if (is_readable($color_file)) {
804  include $color_file;
805 }
806 if (!is_array($theme_datacolor)) {
807  $theme_datacolor = array(array(120, 130, 150), array(200, 160, 180), array(190, 190, 220));
808 }
809 
810 
811 $newparam = $param; // newparam is for birthday links
812 $newparam = preg_replace('/showbirthday=/i', 'showbirthday_=', $newparam); // To avoid replacement when replace day= is done
813 $newparam = preg_replace('/mode=show_month&?/i', '', $newparam);
814 $newparam = preg_replace('/mode=show_week&?/i', '', $newparam);
815 $newparam = preg_replace('/day=[0-9]+&?/i', '', $newparam);
816 $newparam = preg_replace('/month=[0-9]+&?/i', '', $newparam);
817 $newparam = preg_replace('/year=[0-9]+&?/i', '', $newparam);
818 $newparam = preg_replace('/viewweek=[0-9]+&?/i', '', $newparam);
819 $newparam = preg_replace('/showbirthday_=/i', 'showbirthday=', $newparam); // Restore correct parameter
820 $newparam .= '&viewweek=1';
821 
822 echo '<input type="hidden" name="actionmove" value="mupdate">';
823 echo '<input type="hidden" name="backtopage" value="'.dol_escape_htmltag($_SERVER['PHP_SELF']).'?'.dol_escape_htmltag($_SERVER['QUERY_STRING']).'">';
824 echo '<input type="hidden" name="newdate" id="newdate">';
825 
826 
827 // Line header with list of days
828 
829 //print "begin_d=".$begin_d." end_d=".$end_d;
830 
831 $currentdaytoshow = $firstdaytoshow;
832 echo '<div class="div-table-responsive">';
833 //print dol_print_date($currentdaytoshow, 'dayhour', 'gmt');
834 
835 while ($currentdaytoshow < $lastdaytoshow) {
836  echo '<table class="centpercent noborder nocellnopadd cal_month">';
837 
838  echo '<tr class="liste_titre">';
839  echo '<td class="nopaddingtopimp nopaddingbottomimp nowraponsmartphone">';
840 
841  if ($canedit && $mode == 'show_peruser') {
842  // Filter on days
843  print '<span class="hideonsmartphone" title="'.$langs->trans("VisibleDaysRange").'">';
844  print img_picto('', 'clock', 'class="fawidth30 inline-block marginleftonly"');
845  print $langs->trans("DaysOfWeek").'</span>';
846  print "\n";
847  print '<div class="ui-grid-a inline-block"><div class="ui-block-a nowraponall">';
848  print '<input type="number" class="short" name="begin_d" value="'.$begin_d.'" min="1" max="7">';
849  if (empty($conf->dol_use_jmobile)) {
850  print ' - ';
851  } else {
852  print '</div><div class="ui-block-b">';
853  }
854  print '<input type="number" class="short" name="end_d" value="'.$end_d.'" min="1" max="7">';
855  print '</div></div>';
856  }
857 
858  print '</td>';
859  $i = 0; // 0 = sunday,
860  while ($i < 7) {
861  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
862  $i++;
863  continue;
864  }
865  echo '<td align="center" colspan="'.($end_h - $begin_h).'">';
866  echo '<span class="bold spandayofweek">'.$langs->trans("Day".(($i + (isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : 1)) % 7)).'</span>';
867  print "<br>";
868  if ($i) {
869  print dol_print_date(dol_time_plus_duree($currentdaytoshow, $i, 'd'), 'day', 'tzuserrel');
870  } else {
871  print dol_print_date($currentdaytoshow, 'day', 'tzuserrel');
872  }
873  echo "</td>\n";
874  $i++;
875  }
876  echo "</tr>\n";
877 
878  echo '<tr class="liste_titre">';
879  echo '<td>';
880 
881  // Filter on hours
882  print '<span class="hideonsmartphone" title="'.$langs->trans("VisibleTimeRange").'">';
883  print img_picto('', 'clock', 'class="fawidth30 inline-block marginleftonly"');
884  print $langs->trans("Hours").'</span>';
885  print "\n";
886  print '<div class="ui-grid-a inline-block"><div class="ui-block-a nowraponall">';
887  print '<input type="number" class="short" name="begin_h" value="'.$begin_h.'" min="0" max="23">';
888  if (empty($conf->dol_use_jmobile)) {
889  print ' - ';
890  } else {
891  print '</div><div class="ui-block-b">';
892  }
893  print '<input type="number" class="short" name="end_h" value="'.$end_h.'" min="1" max="24">';
894  if (empty($conf->dol_use_jmobile)) {
895  print ' '.$langs->trans("H");
896  }
897  print '</div></div>';
898 
899  echo '</td>';
900  $i = 0;
901  while ($i < 7) {
902  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
903  $i++;
904  continue;
905  }
906  for ($h = $begin_h; $h < $end_h; $h++) {
907  echo '<td class="center">';
908  print '<small style="font-family: courier">'.sprintf("%02d", $h).'</small>';
909  print "</td>";
910  }
911  echo "</td>\n";
912  $i++;
913  }
914  echo "</tr>\n";
915 
916 
917  // Define $usernames
918  $usernames = array(); //init
919  $usernamesid = array();
920  /* Use this to have list of users only if users have events */
921  if (getDolGlobalString('AGENDA_SHOWOWNERONLY_ONPERUSERVIEW')) {
922  foreach ($eventarray as $daykey => $notused) {
923  // Get all assigned users for each event
924  foreach ($eventarray[$daykey] as $index => $event) {
925  $event->fetch_userassigned();
926  $listofuserid = $event->userassigned;
927  foreach ($listofuserid as $userid => $tmp) {
928  if (!in_array($userid, $usernamesid)) {
929  $usernamesid[$userid] = $userid;
930  }
931  }
932  }
933  }
934  } else {
935  /* Use this list to have for all users */
936  $sql = "SELECT u.rowid, u.lastname as lastname, u.firstname, u.statut, u.login, u.admin, u.entity";
937  $sql .= " FROM ".$db->prefix()."user as u";
938  if (isModEnabled('multicompany') && getDolGlobalInt('MULTICOMPANY_TRANSVERSE_MODE')) {
939  $sql .= " WHERE u.rowid IN (";
940  $sql .= " SELECT ug.fk_user FROM ".$db->prefix()."usergroup_user as ug";
941  $sql .= " WHERE ug.entity IN (".getEntity('usergroup').")";
942  if ($usergroup > 0) {
943  $sql .= " AND ug.fk_usergroup = ".((int) $usergroup);
944  }
945  $sql .= ")";
946  } else {
947  if ($usergroup > 0) {
948  $sql .= " LEFT JOIN ".$db->prefix()."usergroup_user as ug ON u.rowid = ug.fk_user";
949  }
950  $sql .= " WHERE u.entity IN (".getEntity('user').")";
951  if ($usergroup > 0) {
952  $sql .= " AND ug.fk_usergroup = ".((int) $usergroup);
953  }
954  }
955  $sql .= " AND u.statut = 1";
956  if ($filtert > 0) {
957  $sql .= " AND u.rowid = ".((int) $filtert);
958  }
959  if ($usergroup > 0) {
960  $sql .= " AND ug.fk_usergroup = ".((int) $usergroup);
961  }
962  if ($user->socid > 0) {
963  // External users should see only contacts of their company
964  $sql .= " AND u.fk_soc = ".((int) $user->socid);
965  }
966 
967  //print $sql;
968  $resql = $db->query($sql);
969  if ($resql) {
970  $num = $db->num_rows($resql);
971  $i = 0;
972  if ($num) {
973  while ($i < $num) {
974  $obj = $db->fetch_object($resql);
975  $usernamesid[$obj->rowid] = $obj->rowid;
976  $i++;
977  }
978  }
979  } else {
980  dol_print_error($db);
981  }
982  }
983  //var_dump($usernamesid);
984  foreach ($usernamesid as $id) {
985  $tmpuser = new User($db);
986  $result = $tmpuser->fetch($id);
987  $usernames[] = $tmpuser;
988  }
989 
990  // Load array of colors by type
991  $colorsbytype = array();
992  $labelbytype = array();
993  $sql = "SELECT code, color, libelle as label FROM ".MAIN_DB_PREFIX."c_actioncomm ORDER BY position";
994  $resql = $db->query($sql);
995  while ($obj = $db->fetch_object($resql)) {
996  $colorsbytype[$obj->code] = $obj->color;
997  $labelbytype[$obj->code] = $obj->label;
998  }
999 
1000  // Loop on each user to show calendar
1001  $todayarray = dol_getdate($now, 'fast');
1002  $sav = $tmpday;
1003  $showheader = true;
1004  $var = false;
1005  foreach ($usernames as $username) {
1006  //if ($username->login != 'admin') continue;
1007 
1008  $var = !$var;
1009 
1010  echo "<tr>";
1011  echo '<td class="tdoverflowmax100 cal_current_month cal_peruserviewname'.($var ? ' cal_impair' : '').'">';
1012  print '<span class="paddingrightimp">';
1013  print $username->getNomUrl(-1, '', 0, 0, 20, 1, '', 'paddingleft');
1014  print '</span>';
1015  print '</td>';
1016  $tmpday = $sav;
1017 
1018  // Lopp on each day of week
1019  $i = 0;
1020  for ($iter_day = 0; $iter_day < 8; $iter_day++) {
1021  if (($i + 1) < $begin_d || ($i + 1) > $end_d) {
1022  $i++;
1023  continue;
1024  }
1025 
1026  // Show days of the current week
1027  $curtime = dol_time_plus_duree($currentdaytoshow, $iter_day, 'd');
1028  // $curtime is a gmt time, but we want the day, month, year in user TZ
1029  $tmpday = dol_print_date($curtime, "%d", "tzuserrel");
1030  $tmpmonth = dol_print_date($curtime, "%m", "tzuserrel");
1031  $tmpyear = dol_print_date($curtime, "%Y", "tzuserrel");
1032  //var_dump($curtime.' '.$tmpday.' '.$tmpmonth.' '.$tmpyear);
1033 
1034  $style = 'cal_current_month';
1035  if ($iter_day == 6) {
1036  $style .= ' cal_other_month';
1037  }
1038  $today = 0;
1039  if ($todayarray['mday'] == $tmpday && $todayarray['mon'] == $tmpmonth && $todayarray['year'] == $tmpyear) {
1040  $today = 1;
1041  }
1042  if ($today) {
1043  $style = 'cal_today_peruser';
1044  }
1045 
1046  show_day_events2($username, $tmpday, $tmpmonth, $tmpyear, 0, $style, $eventarray, 0, $maxnbofchar, $newparam, 1, 300, $showheader, $colorsbytype, $var);
1047 
1048  $i++;
1049  }
1050  echo "</tr>\n";
1051  $showheader = false;
1052  }
1053 
1054  echo "</table>\n";
1055  echo "<br>";
1056 
1057  $currentdaytoshow = dol_time_plus_duree($currentdaytoshow, 7, 'd');
1058 }
1059 
1060 echo '</div>';
1061 
1062 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE') && getDolGlobalString('AGENDA_USE_COLOR_PER_EVENT_TYPE')) {
1063  $langs->load("commercial");
1064  print '<br>'.$langs->trans("Legend").': <br>';
1065  foreach ($colorsbytype as $code => $color) {
1066  if ($color) {
1067  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div style="'.($color ? 'background: #'.$color.';' : '').'width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1068  print $langs->trans("Action".$code) != "Action".$code ? $langs->trans("Action".$code) : $labelbytype[$code];
1069  //print $code;
1070  print '</div>';
1071  }
1072  }
1073  //$color=sprintf("%02x%02x%02x",$theme_datacolor[0][0],$theme_datacolor[0][1],$theme_datacolor[0][2]);
1074  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div class="peruser_busy" style="width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1075  print $langs->trans("Other");
1076  print '</div>';
1077  /* TODO Show this if at least one cumulated event
1078  print '<div style="float: left; padding: 2px; margin-right: 6px;"><div style="background: #222222; width:16px; float: left; margin-right: 4px;">&nbsp;</div>';
1079  print $langs->trans("SeveralEvents");
1080  print '</div>';
1081  */
1082 }
1083 
1084 print "\n".'</form>';
1085 print "\n";
1086 
1087 // Add js code to manage click on a box
1088 print '<script type="text/javascript">
1089 jQuery(document).ready(function() {
1090  jQuery(".onclickopenref").click(function() {
1091  console.log("We click on a class onclickopenref");
1092 
1093  var ref=$(this).attr(\'ref\');
1094  var res = ref.split("_");
1095  var userid = res[1];
1096  var year = res[2];
1097  var month = res[3];
1098  var day = res[4];
1099  var hour = res[5];
1100  var min = res[6];
1101  var ids = res[7];
1102  if (ids == \'none\') /* No event */
1103  {
1104  /* alert(\'no event\'); */
1105  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 : '')).'"
1106  window.location.href = url;
1107  }
1108  else if (ids.indexOf(",") > -1) /* There is several events */
1109  {
1110  /* alert(\'several events\'); */
1111  url = "'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&search_actioncode="+jQuery("#search_actioncode").val()+"&search_status="+jQuery("#selectsearch_status").val()+"&filtert="+userid+"&dateselectyear="+year+"&dateselectmonth="+month+"&dateselectday="+day;
1112  window.location.href = url;
1113  }
1114  else /* One event */
1115  {
1116  /* alert(\'one event\'); */
1117  url = "'.DOL_URL_ROOT.'/comm/action/card.php?action=view&id="+ids
1118  window.location.href = url;
1119  }
1120  });
1121 });
1122 </script>';
1123 
1124 // End of page
1125 llxFooter();
1126 $db->close();
1127 
1128 
1129 
1130 
1151 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)
1152 {
1153  global $db;
1154  global $user, $conf, $langs, $hookmanager, $action;
1155  global $filter, $filtert, $status, $actioncode; // Filters used into search form
1156  global $theme_datacolor; // Array with a list of different we can use (come from theme)
1157  global $cachethirdparties, $cachecontacts, $cacheusers, $cacheprojects, $colorindexused;
1158  global $begin_h, $end_h;
1159 
1160  $cases1 = array(); // Color first half hour
1161  $cases2 = array(); // Color second half hour
1162  $cases3 = array(); // Color third half hour
1163  $cases4 = array(); // Color 4th half hour
1164 
1165  $i = 0;
1166  $numother = 0;
1167  $numbirthday = 0;
1168  $numical = 0;
1169  $numicals = array();
1170  //$ymd = sprintf("%04d", $year).sprintf("%02d", $month).sprintf("%02d", $day);
1171 
1172  $colorindexused[$user->id] = 0; // Color index for current user (user->id) is always 0
1173  $nextindextouse = count($colorindexused); // At first run this is 0, so first user has 0, next 1, ...
1174  //if ($username->id && $day==1) {
1175  //var_dump($eventarray);
1176  //}
1177  //var_dump("------ username=".$username->login." for day=".$day);
1178 
1179  // We are in a particular day for $username, now we scan all events
1180  foreach ($eventarray as $daykey => $notused) {
1181  $annee = dol_print_date($daykey, '%Y', 'tzuserrel');
1182  $mois = dol_print_date($daykey, '%m', 'tzuserrel');
1183  $jour = dol_print_date($daykey, '%d', 'tzuserrel');
1184  //var_dump("daykey=$daykey day=$day jour=$jour, month=$month mois=$mois, year=$year annee=$annee");
1185 
1186 
1187  if ($day == $jour && (int) $month == (int) $mois && $year == $annee) { // Is it the day we are looking for when calling function ?
1188  //var_dump("day=$day jour=$jour month=$month mois=$mois year=$year annee=$annee");
1189 
1190  // Scan all event for this date
1191  foreach ($eventarray[$daykey] as $index => $event) {
1192  //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";
1193  //var_dump($event);
1194 
1195  $keysofuserassigned = array_keys($event->userassigned);
1196  $ponct = ($event->date_start_in_calendar == $event->date_end_in_calendar);
1197 
1198  if (!in_array($username->id, $keysofuserassigned)) {
1199  continue; // We discard record if event is from another user than user we want to show
1200  }
1201  //if ($username->id != $event->userownerid) continue; // We discard record if event is from another user than user we want to show
1202 
1203  $parameters = array();
1204  $reshook = $hookmanager->executeHooks('formatEvent', $parameters, $event, $action); // Note that $action and $object may have been modified by some hooks
1205  if ($reshook < 0) {
1206  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1207  }
1208 
1209  // Define $color (Hex string like '0088FF') and $cssclass of event
1210  $color = -1;
1211  $cssclass = '';
1212  $colorindex = -1;
1213  if (in_array($user->id, $keysofuserassigned)) {
1214  $cssclass = 'family_mytasks';
1215 
1216  if (empty($cacheusers[$event->userownerid])) {
1217  $newuser = new User($db);
1218  $newuser->fetch($event->userownerid);
1219  $cacheusers[$event->userownerid] = $newuser;
1220  }
1221  //var_dump($cacheusers[$event->userownerid]->color);
1222 
1223  // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
1224  if (!empty($cacheusers[$event->userownerid]->color)) {
1225  $color = $cacheusers[$event->userownerid]->color;
1226  }
1227 
1228  if (getDolGlobalString('AGENDA_USE_COLOR_PER_EVENT_TYPE')) {
1229  $color = $event->type_color;
1230  }
1231  } elseif ($event->type_code == 'ICALEVENT') {
1232  $numical++;
1233  if (!empty($event->icalname)) {
1234  if (!isset($numicals[dol_string_nospecial($event->icalname)])) {
1235  $numicals[dol_string_nospecial($event->icalname)] = 0;
1236  }
1237  $numicals[dol_string_nospecial($event->icalname)]++;
1238  }
1239 
1240  $color = $event->icalcolor;
1241  $cssclass = (!empty($event->icalname) ? 'family_ext'.md5($event->icalname) : 'family_other unsortable');
1242  } elseif ($event->type_code == 'BIRTHDAY') {
1243  $numbirthday++;
1244  $colorindex = 2;
1245  $cssclass = 'family_birthday unsortable';
1246  $color = sprintf("%02x%02x%02x", $theme_datacolor[$colorindex][0], $theme_datacolor[$colorindex][1], $theme_datacolor[$colorindex][2]);
1247  } else {
1248  $numother++;
1249  $color = ($event->icalcolor ? $event->icalcolor : -1);
1250  $cssclass = (!empty($event->icalname) ? 'family_ext'.md5($event->icalname) : 'family_other');
1251 
1252  if (empty($cacheusers[$event->userownerid])) {
1253  $newuser = new User($db);
1254  $newuser->fetch($event->userownerid);
1255  $cacheusers[$event->userownerid] = $newuser;
1256  }
1257  //var_dump($cacheusers[$event->userownerid]->color);
1258 
1259  // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
1260  if (!empty($cacheusers[$event->userownerid]->color)) {
1261  $color = $cacheusers[$event->userownerid]->color;
1262  }
1263 
1264  if (getDolGlobalString('AGENDA_USE_COLOR_PER_EVENT_TYPE')) {
1265  $color = $event->type_color;
1266  }
1267  }
1268 
1269  if ($color < 0) { // Color was not set on user card. Set color according to color index.
1270  // Define color index if not yet defined
1271  $idusertouse = ($event->userownerid ? $event->userownerid : 0);
1272  if (isset($colorindexused[$idusertouse])) {
1273  $colorindex = $colorindexused[$idusertouse]; // Color already assigned to this user
1274  } else {
1275  $colorindex = $nextindextouse;
1276  $colorindexused[$idusertouse] = $colorindex;
1277  if (!empty($theme_datacolor[$nextindextouse + 1])) {
1278  $nextindextouse++; // Prepare to use next color
1279  }
1280  }
1281  // Define color
1282  $color = sprintf("%02x%02x%02x", $theme_datacolor[$colorindex][0], $theme_datacolor[$colorindex][1], $theme_datacolor[$colorindex][2]);
1283  }
1284 
1285  // Define all rects with event (cases1 is first quarter hour, cases2 is second quarter hour, cases3 is second thirds hour, cases4 is 4th quarter hour)
1286  for ($h = $begin_h; $h < $end_h; $h++) {
1287  //if ($username->id == 1 && $day==1) print 'h='.$h;
1288  $newcolor = ''; //init
1289  if (empty($event->fulldayevent)) {
1290  $a = dol_mktime((int) $h, 0, 0, $month, $day, $year, 'tzuserrel', 0);
1291  $b = dol_mktime((int) $h, 15, 0, $month, $day, $year, 'tzuserrel', 0);
1292  $b1 = dol_mktime((int) $h, 30, 0, $month, $day, $year, 'tzuserrel', 0);
1293  $b2 = dol_mktime((int) $h, 45, 0, $month, $day, $year, 'tzuserrel', 0);
1294  $c = dol_mktime((int) $h + 1, 0, 0, $month, $day, $year, 'tzuserrel', 0);
1295 
1296  $dateendtouse = $event->date_end_in_calendar;
1297  if ($dateendtouse == $event->date_start_in_calendar) {
1298  $dateendtouse++;
1299  }
1300 
1301  //print dol_print_date($event->date_start_in_calendar,'dayhour').'-'.dol_print_date($a,'dayhour').'-'.dol_print_date($b,'dayhour').'<br>';
1302 
1303  if ($event->date_start_in_calendar < $b && $dateendtouse > $a) {
1304  $busy = $event->transparency;
1305  $cases1[$h][$event->id]['busy'] = $busy;
1306  $cases1[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1307  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1308  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1309  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1310  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1311  $cases1[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1312  } else {
1313  $cases1[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1314  }
1315  }
1316  if ($event->label) {
1317  $cases1[$h][$event->id]['string'] .= ' - '.$event->label;
1318  }
1319  $cases1[$h][$event->id]['typecode'] = $event->type_code;
1320  $cases1[$h][$event->id]['color'] = $color;
1321  if ($event->fk_project > 0) {
1322  if (empty($cacheprojects[$event->fk_project])) {
1323  $tmpproj = new Project($db);
1324  $tmpproj->fetch($event->fk_project);
1325  $cacheprojects[$event->fk_project] = $tmpproj;
1326  }
1327  $cases1[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1328  }
1329  if ($event->socid > 0) {
1330  if (empty($cachethirdparties[$event->socid])) {
1331  $tmpthirdparty = new Societe($db);
1332  $tmpthirdparty->fetch($event->socid);
1333  $cachethirdparties[$event->socid] = $tmpthirdparty;
1334  }
1335  $cases1[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1336  }
1337  if ($event->contact_id > 0) {
1338  if (empty($cachecontacts[$event->contact_id])) {
1339  $tmpcontact = new Contact($db);
1340  $tmpcontact->fetch($event->contact_id);
1341  $cachecontacts[$event->contact_id] = $tmpcontact;
1342  }
1343  $cases1[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1344  }
1345  }
1346  if ($event->date_start_in_calendar < $b1 && $dateendtouse > $b) {
1347  $busy = $event->transparency;
1348  $cases2[$h][$event->id]['busy'] = $busy;
1349  $cases2[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1350  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1351  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1352  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1353  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1354  $cases2[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1355  } else {
1356  $cases2[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1357  }
1358  }
1359  if ($event->label) {
1360  $cases2[$h][$event->id]['string'] .= ' - '.$event->label;
1361  }
1362  $cases2[$h][$event->id]['typecode'] = $event->type_code;
1363  $cases2[$h][$event->id]['color'] = $color;
1364  if ($event->fk_project > 0) {
1365  if (empty($cacheprojects[$event->fk_project])) {
1366  $tmpproj = new Project($db);
1367  $tmpproj->fetch($event->fk_project);
1368  $cacheprojects[$event->fk_project] = $tmpproj;
1369  }
1370  $cases2[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1371  }
1372  if ($event->socid > 0) {
1373  if (empty($cachethirdparties[$event->socid])) {
1374  $tmpthirdparty = new Societe($db);
1375  $tmpthirdparty->fetch($event->socid);
1376  $cachethirdparties[$event->socid] = $tmpthirdparty;
1377  }
1378  $cases2[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1379  }
1380  if ($event->contact_id > 0) {
1381  if (empty($cachecontacts[$event->contact_id])) {
1382  $tmpcontact = new Contact($db);
1383  $tmpcontact->fetch($event->contact_id);
1384  $cachecontacts[$event->contact_id] = $tmpcontact;
1385  }
1386  $cases2[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1387  }
1388  }
1389  if ($event->date_start_in_calendar < $b2 && $dateendtouse > $b1) {
1390  $busy = $event->transparency;
1391  $cases3[$h][$event->id]['busy'] = $busy;
1392  $cases3[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1393  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1394  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1395  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1396  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1397  $cases3[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1398  } else {
1399  $cases3[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1400  }
1401  }
1402  if ($event->label) {
1403  $cases3[$h][$event->id]['string'] .= ' - '.$event->label;
1404  }
1405  $cases3[$h][$event->id]['typecode'] = $event->type_code;
1406  $cases3[$h][$event->id]['color'] = $color;
1407  if ($event->fk_project > 0) {
1408  if (empty($cacheprojects[$event->fk_project])) {
1409  $tmpproj = new Project($db);
1410  $tmpproj->fetch($event->fk_project);
1411  $cacheprojects[$event->fk_project] = $tmpproj;
1412  }
1413  $cases3[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1414  }
1415  if ($event->socid > 0) {
1416  if (empty($cachethirdparties[$event->socid])) {
1417  $tmpthirdparty = new Societe($db);
1418  $tmpthirdparty->fetch($event->socid);
1419  $cachethirdparties[$event->socid] = $tmpthirdparty;
1420  }
1421  $cases3[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1422  }
1423  if ($event->contact_id > 0) {
1424  if (empty($cachecontacts[$event->contact_id])) {
1425  $tmpcontact = new Contact($db);
1426  $tmpcontact->fetch($event->contact_id);
1427  $cachecontacts[$event->contact_id] = $tmpcontact;
1428  }
1429  $cases2[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1430  }
1431  }
1432  if ($event->date_start_in_calendar < $c && $dateendtouse > $b2) {
1433  $busy = $event->transparency;
1434  $cases4[$h][$event->id]['busy'] = $busy;
1435  $cases4[$h][$event->id]['string'] = dol_print_date($event->date_start_in_calendar, 'dayhour', 'tzuserrel');
1436  if ($event->date_end_in_calendar && $event->date_end_in_calendar != $event->date_start_in_calendar) {
1437  $tmpa = dol_getdate($event->date_start_in_calendar, true);
1438  $tmpb = dol_getdate($event->date_end_in_calendar, true);
1439  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
1440  $cases4[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'hour', 'tzuserrel');
1441  } else {
1442  $cases4[$h][$event->id]['string'] .= '-'.dol_print_date($event->date_end_in_calendar, 'dayhour', 'tzuserrel');
1443  }
1444  }
1445  if ($event->label) {
1446  $cases4[$h][$event->id]['string'] .= ' - '.$event->label;
1447  }
1448  $cases4[$h][$event->id]['typecode'] = $event->type_code;
1449  $cases4[$h][$event->id]['color'] = $color;
1450  if ($event->fk_project > 0) {
1451  if (empty($cacheprojects[$event->fk_project])) {
1452  $tmpproj = new Project($db);
1453  $tmpproj->fetch($event->fk_project);
1454  $cacheprojects[$event->fk_project] = $tmpproj;
1455  }
1456  $cases4[$h][$event->id]['string'] .= ', '.$langs->trans("Project").': '.$cacheprojects[$event->fk_project]->ref.' - '.$cacheprojects[$event->fk_project]->title;
1457  }
1458  if ($event->socid > 0) {
1459  if (empty($cachethirdparties[$event->socid])) {
1460  $tmpthirdparty = new Societe($db);
1461  $tmpthirdparty->fetch($event->socid);
1462  $cachethirdparties[$event->socid] = $tmpthirdparty;
1463  }
1464  $cases4[$h][$event->id]['string'] .= ', '.$cachethirdparties[$event->socid]->name;
1465  }
1466  if ($event->contact_id > 0) {
1467  if (empty($cachecontacts[$event->contact_id])) {
1468  $tmpcontact = new Contact($db);
1469  $tmpcontact->fetch($event->contact_id);
1470  $cachecontacts[$event->contact_id] = $tmpcontact;
1471  }
1472  $cases4[$h][$event->id]['string'] .= ', '.$cachecontacts[$event->contact_id]->getFullName($langs);
1473  }
1474  }
1475  } else {
1476  $busy = $event->transparency;
1477  $cases1[$h][$event->id]['busy'] = $busy;
1478  $cases2[$h][$event->id]['busy'] = $busy;
1479  $cases3[$h][$event->id]['busy'] = $busy;
1480  $cases4[$h][$event->id]['busy'] = $busy;
1481  $cases1[$h][$event->id]['string'] = $event->label;
1482  $cases2[$h][$event->id]['string'] = $event->label;
1483  $cases3[$h][$event->id]['string'] = $event->label;
1484  $cases4[$h][$event->id]['string'] = $event->label;
1485  $cases1[$h][$event->id]['typecode'] = $event->type_code;
1486  $cases2[$h][$event->id]['typecode'] = $event->type_code;
1487  $cases3[$h][$event->id]['typecode'] = $event->type_code;
1488  $cases4[$h][$event->id]['typecode'] = $event->type_code;
1489  $cases1[$h][$event->id]['color'] = $color;
1490  $cases2[$h][$event->id]['color'] = $color;
1491  $cases3[$h][$event->id]['color'] = $color;
1492  $cases4[$h][$event->id]['color'] = $color;
1493  }
1494  }
1495  $i++;
1496  }
1497 
1498  break; // We found the date we were looking for. No need to search anymore.
1499  }
1500  }
1501 
1502  // Now output $casesX from start hour to end hour
1503  for ($h = $begin_h; $h < $end_h; $h++) {
1504  $color1 = '';
1505  $color2 = '';
1506  $color3 = '';
1507  $color4 = '';
1508  $style1 = '';
1509  $style2 = '';
1510  $style3 = '';
1511  $style4 = '';
1512  $string1 = '&nbsp;';
1513  $string2 = '&nbsp;';
1514  $string3 = '&nbsp;';
1515  $string4 = '&nbsp;';
1516  $title1 = '';
1517  $title2 = '';
1518  $title3 = '';
1519  $title4 = '';
1520  if (isset($cases1[$h]) && $cases1[$h] != '') {
1521  //$title1.=count($cases1[$h]).' '.(count($cases1[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1522  if (count($cases1[$h]) > 1) {
1523  $title1 .= count($cases1[$h]).' '.(count($cases1[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1524  }
1525 
1526  if (!getDolGlobalString('AGENDA_NO_TRANSPARENT_ON_NOT_BUSY')) {
1527  $style1 = 'peruser_notbusy';
1528  } else {
1529  $style1 = 'peruser_busy';
1530  }
1531  foreach ($cases1[$h] as $id => $ev) {
1532  if ($ev['busy']) {
1533  $style1 = 'peruser_busy';
1534  }
1535  }
1536  }
1537  if (isset($cases2[$h]) && $cases2[$h] != '') {
1538  //$title2.=count($cases2[$h]).' '.(count($cases2[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1539  if (count($cases2[$h]) > 1) {
1540  $title2 .= count($cases2[$h]).' '.(count($cases2[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1541  }
1542 
1543  if (!getDolGlobalString('AGENDA_NO_TRANSPARENT_ON_NOT_BUSY')) {
1544  $style2 = 'peruser_notbusy';
1545  } else {
1546  $style2 = 'peruser_busy';
1547  }
1548  foreach ($cases2[$h] as $id => $ev) {
1549  if ($ev['busy']) {
1550  $style2 = 'peruser_busy';
1551  }
1552  }
1553  }
1554  if (isset($cases3[$h]) && $cases3[$h] != '') {
1555  //$title3.=count($cases3[$h]).' '.(count($cases3[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1556  if (count($cases3[$h]) > 1) {
1557  $title3 .= count($cases3[$h]).' '.(count($cases3[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1558  }
1559 
1560  if (!getDolGlobalString('AGENDA_NO_TRANSPARENT_ON_NOT_BUSY')) {
1561  $style3 = 'peruser_notbusy';
1562  } else {
1563  $style3 = 'peruser_busy';
1564  }
1565  foreach ($cases3[$h] as $id => $ev) {
1566  if ($ev['busy']) {
1567  $style3 = 'peruser_busy';
1568  }
1569  }
1570  }
1571  if (isset($cases4[$h]) && $cases4[$h] != '') {
1572  //$title4.=count($cases3[$h]).' '.(count($cases3[$h])==1?$langs->trans("Event"):$langs->trans("Events"));
1573  if (count($cases4[$h]) > 1) {
1574  $title4 .= count($cases4[$h]).' '.(count($cases4[$h]) == 1 ? $langs->trans("Event") : $langs->trans("Events"));
1575  }
1576 
1577  if (!getDolGlobalString('AGENDA_NO_TRANSPARENT_ON_NOT_BUSY')) {
1578  $style4 = 'peruser_notbusy';
1579  } else {
1580  $style4 = 'peruser_busy';
1581  }
1582  foreach ($cases4[$h] as $id => $ev) {
1583  if ($ev['busy']) {
1584  $style4 = 'peruser_busy';
1585  }
1586  }
1587  }
1588 
1589  $ids1 = '';
1590  $ids2 = '';
1591  $ids3 = '';
1592  $ids4 = '';
1593  if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) && array_keys($cases1[$h])) {
1594  $ids1 = implode(', ', array_keys($cases1[$h]));
1595  }
1596  if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) && array_keys($cases2[$h])) {
1597  $ids2 = implode(', ', array_keys($cases2[$h]));
1598  }
1599  if (!empty($cases3[$h]) && is_array($cases3[$h]) && count($cases3[$h]) && array_keys($cases3[$h])) {
1600  $ids3 = implode(',', array_keys($cases3[$h]));
1601  }
1602  if (!empty($cases4[$h]) && is_array($cases4[$h]) && count($cases4[$h]) && array_keys($cases4[$h])) {
1603  $ids4 = implode(',', array_keys($cases4[$h]));
1604  }
1605 
1606  if ($h == $begin_h) {
1607  echo '<td class="'.$style.'_peruserleft cal_peruser'.($var ? ' cal_impair '.$style.'_impair' : '').'">';
1608  } else {
1609  echo '<td class="'.$style.' cal_peruser'.($var ? ' cal_impair '.$style.'_impair' : '').'">';
1610  }
1611  // only 1 event
1612  if (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) == 1) {
1613  $output = array_slice($cases1[$h], 0, 1);
1614  $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : '');
1615  if ($output[0]['string']) {
1616  $title1 .= ($title1 ? ' - ' : '').$output[0]['string'];
1617  }
1618  if ($output[0]['color']) {
1619  $color1 = $output[0]['color'];
1620  }
1621  } elseif (!empty($cases1[$h]) && is_array($cases1[$h]) && count($cases1[$h]) > 1) {
1622  $title1 = $langs->trans("Ref").' '.$ids1.($title1 ? ' - '.$title1 : '');
1623  $color1 = '222222';
1624  }
1625 
1626  // only 1 event
1627  if (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) == 1) {
1628  $output = array_slice($cases2[$h], 0, 1);
1629  $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : '');
1630  if ($output[0]['string']) {
1631  $title2 .= ($title2 ? ' - ' : '').$output[0]['string'];
1632  }
1633  if ($output[0]['color']) {
1634  $color2 = $output[0]['color'];
1635  }
1636  } elseif (!empty($cases2[$h]) && is_array($cases2[$h]) && count($cases2[$h]) > 1) {
1637  $title2 = $langs->trans("Ref").' '.$ids2.($title2 ? ' - '.$title2 : '');
1638  $color2 = '222222';
1639  }
1640 
1641  // only 1 event
1642  if (!empty($cases3[$h]) && is_array($cases3[$h]) && count($cases3[$h]) == 1) {
1643  $output = array_slice($cases3[$h], 0, 1);
1644  $title3 = $langs->trans("Ref").' '.$ids3.($title3 ? ' - '.$title3 : '');
1645  if ($output[0]['string']) {
1646  $title3 .= ($title3 ? ' - ' : '').$output[0]['string'];
1647  }
1648  if ($output[0]['color']) {
1649  $color3 = $output[0]['color'];
1650  }
1651  } elseif (!empty($cases3[$h]) && is_array($cases3[$h]) && count($cases3[$h]) > 1) {
1652  $title3 = $langs->trans("Ref").' '.$ids3.($title3 ? ' - '.$title3 : '');
1653  $color3 = '222222';
1654  }
1655 
1656  // only 1 event
1657  if (!empty($cases4[$h]) && is_array($cases4[$h]) && count($cases4[$h]) == 1) {
1658  $output = array_slice($cases4[$h], 0, 1);
1659  $title4 = $langs->trans("Ref").' '.$ids3.($title4 ? ' - '.$title4 : '');
1660  if ($output[0]['string']) {
1661  $title4 .= ($title4 ? ' - ' : '').$output[0]['string'];
1662  }
1663  if ($output[0]['color']) {
1664  $color4 = $output[0]['color'];
1665  }
1666  } elseif (!empty($cases4[$h]) && is_array($cases4[$h]) && count($cases4[$h]) > 1) {
1667  $title4 = $langs->trans("Ref").' '.$ids4.($title4 ? ' - '.$title4 : '');
1668  $color4 = '222222';
1669  }
1670 
1671  print '<table class="nobordernopadding case centpercent">';
1672  print '<tr>';
1673  print '<td ';
1674  if ($style1 == 'peruser_notbusy') {
1675  print 'style="border: 1px solid #'.($color1 ? $color1 : "888").' !important" ';
1676  } elseif ($color1) {
1677  print($color1 ? 'style="background: #'.$color1.';"' : '');
1678  }
1679  print 'class="';
1680  print($style1 ? $style1.' ' : '');
1681  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.'"' : '').'>';
1682  print $string1;
1683  print '</td>';
1684 
1685  print '<td ';
1686  if ($style2 == 'peruser_notbusy') {
1687  print 'style="border: 1px solid #'.($color2 ? $color2 : "888").' !important" ';
1688  } elseif ($color2) {
1689  print($color2 ? 'style="background: #'.$color2.';"' : '');
1690  }
1691  print 'class="';
1692  print($style2 ? $style2.' ' : '');
1693  print 'onclickopenref center'.($title2 ? ' classfortooltip' : '').($title1 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_15_'.($ids2 ? $ids2 : 'none').'"'.($title2 ? ' title="'.$title2.'"' : '').'>';
1694  print $string2;
1695  print '</td>';
1696 
1697  print '<td ';
1698  if ($style3 == 'peruser_notbusy') {
1699  print 'style="border: 1px solid #'.($color3 ? $color3 : "888").' !important" ';
1700  } elseif ($color3) {
1701  print($color3 ? 'style="background: #'.$color3.';"' : '');
1702  }
1703  print 'class="';
1704  print($style3 ? $style3.' ' : '');
1705  print 'onclickopenref center'.($title2 ? ' classfortooltip' : '').($title3 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_30_'.($ids3 ? $ids3 : 'none').'"'.($title3 ? ' title="'.$title3.'"' : '').'>';
1706  print $string3;
1707  print '</td>';
1708 
1709  print '<td ';
1710  if ($style4 == 'peruser_notbusy') {
1711  print 'style="border: 1px solid #'.($color4 ? $color4 : "888").' !important" ';
1712  } elseif ($color4) {
1713  print($color4 ? 'style="background: #'.$color4.';"' : '');
1714  }
1715  print 'class="';
1716  print($style4 ? $style4.' ' : '');
1717  print 'onclickopenref center'.($title3 ? ' classfortooltip' : '').($title4 ? ' cursorpointer' : '').'" ref="ref_'.$username->id.'_'.sprintf("%04d", $year).'_'.sprintf("%02d", $month).'_'.sprintf("%02d", $day).'_'.sprintf("%02d", $h).'_45_'.($ids4 ? $ids4 : 'none').'"'.($title4 ? ' title="'.$title4.'"' : '').'>';
1718  print $string4;
1719  print '</td>';
1720 
1721  print '</tr>';
1722  print '</table>';
1723  print '</td>';
1724  }
1725 }
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
print_actions_filter( $form, $canedit, $status, $year, $month, $day, $showbirthday, $filtera, $filtert, $filtered, $pid, $socid, $action, $showextcals=array(), $actioncode='', $usergroupid=0, $excludetype='', $resourceid=0, $search_categ_cus=0)
Show filter form in agenda view.
Definition: agenda.lib.php:52
calendars_prepare_head($param)
Define head array for tabs of agenda setup pages.
Definition: agenda.lib.php:514
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:55
llxFooter()
Empty footer.
Definition: wrapper.php:69
Class to manage 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:50
if(isModEnabled('invoice') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&!getDolGlobalString('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') && $user->hasRight('tax', 'charges', 'lire')) if(isModEnabled('invoice') &&isModEnabled('order') && $user->hasRight("commande", "lire") &&!getDolGlobalString('WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER')) $sql
Social contributions to pay.
Definition: index.php:751
dol_get_next_week($day, $week, $month, $year)
Return next week.
Definition: date.lib.php:572
dol_get_first_day_week($day, $month, $year, $gm=false)
Return first day of week for a date.
Definition: date.lib.php:669
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition: date.lib.php:124
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
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.