dolibarr 18.0.6
list.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-2016 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2017 Open-DSI <support@open-dsi.fr>
7 * Copyright (C) 2018-2021 Frédéric France <frederic.france@netlogic.fr>
8 * Copyright (C) 2020 Tobias Sekan <tobias.sekan@startmail.com>
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
30// Load Dolibarr environment
31require '../../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
33require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
37
38include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
39
40// Load translation files required by the page
41$langs->loadLangs(array("users", "companies", "agenda", "commercial", "other", "orders", "bills"));
42
43// Get Parameters
44$action = GETPOST('action', 'aZ09');
45$massaction = GETPOST('massaction', 'alpha');
46$confirm = GETPOST('confirm', 'alpha');
47$cancel = GETPOST('cancel', 'alpha');
48$toselect = GETPOST('toselect', 'array');
49$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'actioncommlist'; // To manage different context of search
50$optioncss = GETPOST('optioncss', 'alpha');
51
52
53$disabledefaultvalues = GETPOST('disabledefaultvalues', 'int');
54
55$mode = GETPOST('mode', 'aZ09');
56if (empty($mode) && preg_match('/show_/', $action)) {
57 $mode = $action; // For backward compatibility
58}
59$resourceid = GETPOST("search_resourceid", "int") ?GETPOST("search_resourceid", "int") : GETPOST("resourceid", "int");
60$pid = GETPOST("search_projectid", 'int', 3) ?GETPOST("search_projectid", 'int', 3) : GETPOST("projectid", 'int', 3);
61$search_status = (GETPOST("search_status", 'aZ09') != '') ? GETPOST("search_status", 'aZ09') : GETPOST("status", 'aZ09');
62$type = GETPOST('search_type', 'alphanohtml') ?GETPOST('search_type', 'alphanohtml') : GETPOST('type', 'alphanohtml');
63$year = GETPOST("year", 'int');
64$month = GETPOST("month", 'int');
65$day = GETPOST("day", 'int');
66
67// Set actioncode (this code must be same for setting actioncode into peruser, listacton and index)
68if (GETPOST('search_actioncode', 'array')) {
69 $actioncode = GETPOST('search_actioncode', 'array', 3);
70 if (!count($actioncode)) {
71 $actioncode = '0';
72 }
73} else {
74 $actioncode = GETPOST("search_actioncode", "alpha", 3) ?GETPOST("search_actioncode", "alpha", 3) : (GETPOST("search_actioncode") == '0' ? '0' : ((empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE) || $disabledefaultvalues) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_TYPE));
75}
76
77// Search Fields
78$search_id = GETPOST('search_id', 'alpha');
79$search_title = GETPOST('search_title', 'alpha');
80$search_note = GETPOST('search_note', 'alpha');
81
82$dateselect = dol_mktime(0, 0, 0, GETPOST('dateselectmonth', 'int'), GETPOST('dateselectday', 'int'), GETPOST('dateselectyear', 'int'), 'tzuserrel');
83$datestart_dtstart = dol_mktime(0, 0, 0, GETPOST('datestart_dtstartmonth', 'int'), GETPOST('datestart_dtstartday', 'int'), GETPOST('datestart_dtstartyear', 'int'), 'tzuserrel');
84$datestart_dtend = dol_mktime(23, 59, 59, GETPOST('datestart_dtendmonth', 'int'), GETPOST('datestart_dtendday', 'int'), GETPOST('datestart_dtendyear', 'int'), 'tzuserrel');
85$dateend_dtstart = dol_mktime(0, 0, 0, GETPOST('dateend_dtstartmonth', 'int'), GETPOST('dateend_dtstartday', 'int'), GETPOST('dateend_dtstartyear', 'int'), 'tzuserrel');
86$dateend_dtend = dol_mktime(23, 59, 59, GETPOST('dateend_dtendmonth', 'int'), GETPOST('dateend_dtendday', 'int'), GETPOST('dateend_dtendyear', 'int'), 'tzuserrel');
87if ($search_status == '' && !GETPOSTISSET('search_status')) {
88 $search_status = ((empty($conf->global->AGENDA_DEFAULT_FILTER_STATUS) || $disabledefaultvalues) ? '' : $conf->global->AGENDA_DEFAULT_FILTER_STATUS);
89}
90if (empty($mode) && !GETPOSTISSET('mode')) {
91 $mode = (empty($conf->global->AGENDA_DEFAULT_VIEW) ? 'show_month' : $conf->global->AGENDA_DEFAULT_VIEW);
92}
93
94$filter = GETPOST("search_filter", 'alpha', 3) ?GETPOST("search_filter", 'alpha', 3) : GETPOST("filter", 'alpha', 3);
95$filtert = GETPOST("search_filtert", "int", 3) ?GETPOST("search_filtert", "int", 3) : GETPOST("filtert", "int", 3);
96$usergroup = GETPOST("search_usergroup", "int", 3) ?GETPOST("search_usergroup", "int", 3) : GETPOST("usergroup", "int", 3);
97$showbirthday = empty($conf->use_javascript_ajax) ? (GETPOST("search_showbirthday", "int") ?GETPOST("search_showbirthday", "int") : GETPOST("showbirthday", "int")) : 1;
98
99// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
100$object = new ActionComm($db);
101$hookmanager->initHooks(array('agendalist'));
102
103$extrafields = new ExtraFields($db);
104
105// fetch optionals attributes and labels
106$extrafields->fetch_name_optionals_label($object->table_element);
107
108$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
109// If not choice done on calendar owner, we filter on user.
110if (empty($filtert) && empty($conf->global->AGENDA_ALL_CALENDARS)) {
111 $filtert = $user->id;
112}
113
114// Pagination parameters
115$limit = GETPOST('limit', 'int') ?GETPOST('limit', 'int') : $conf->liste_limit;
116$sortfield = GETPOST('sortfield', 'aZ09comma');
117$sortorder = GETPOST('sortorder', 'aZ09comma');
118$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
119if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
120 // If $page is not defined, or '' or -1 or if we click on clear filters
121 $page = 0;
122}
123$offset = $limit * $page;
124if (!$sortorder) {
125 $sortorder = "DESC,DESC";
126 if ($search_status == 'todo') {
127 $sortorder = "DESC,DESC";
128 }
129}
130if (!$sortfield) {
131 $sortfield = "a.datep,a.id";
132 if ($search_status == 'todo') {
133 $sortfield = "a.datep,a.id";
134 }
135}
136
137// Security check
138$socid = GETPOST("search_socid", 'int') ?GETPOST("search_socid", 'int') : GETPOST("socid", 'int');
139if ($user->socid) {
140 $socid = $user->socid;
141}
142if ($socid < 0) {
143 $socid = '';
144}
145
146$canedit = 1;
147if (!$user->hasRight('agenda', 'myactions', 'read')) {
149}
150if (!$user->hasRight('agenda', 'allactions', 'read')) {
151 $canedit = 0;
152}
153if (!$user->hasRight('agenda', 'allactions', 'read') || $filter == 'mine') { // If no permission to see all, we show only affected to me
154 $filtert = $user->id;
155}
156
157$arrayfields = array(
158 'a.id'=>array('label'=>"Ref", 'checked'=>1),
159 'owner'=>array('label'=>"Owner", 'checked'=>1),
160 'c.libelle'=>array('label'=>"Type", 'checked'=>1),
161 'a.label'=>array('label'=>"Title", 'checked'=>1),
162 'a.note'=>array('label'=>'Description', 'checked'=>0),
163 'a.datep'=>array('label'=>"DateStart", 'checked'=>1),
164 'a.datep2'=>array('label'=>"DateEnd", 'checked'=>1),
165 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1),
166 'a.fk_contact'=>array('label'=>"Contact", 'checked'=>0),
167 'a.fk_element'=>array('label'=>"LinkedObject", 'checked'=>1, 'enabled'=>(!empty($conf->global->AGENDA_SHOW_LINKED_OBJECT))),
168 'a.datec'=>array('label'=>'DateCreation', 'checked'=>0, 'position'=>510),
169 'a.tms'=>array('label'=>'DateModification', 'checked'=>0, 'position'=>520),
170 'a.percent'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000)
171);
172// Extra fields
173include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
174
175$object->fields = dol_sort_array($object->fields, 'position');
176$arrayfields = dol_sort_array($arrayfields, 'position');
177
178$result = restrictedArea($user, 'agenda', 0, '', 'myactions');
179if ($user->socid && $socid) {
180 $result = restrictedArea($user, 'societe', $socid);
181}
182
183
184/*
185 * Actions
186 */
187
188if (GETPOST('cancel', 'alpha')) {
189 $mode = 'list';
190 $massaction = '';
191}
192
193if (GETPOST("viewcal") || GETPOST("viewweek") || GETPOST("viewday")) {
194 $param = '';
195 if (is_array($_POST)) {
196 foreach ($_POST as $key => $val) {
197 $param .= '&'.$key.'='.urlencode($val);
198 }
199 }
200 //print $param;
201 header("Location: ".DOL_URL_ROOT.'/comm/action/index.php?'.$param);
202 exit;
203}
204
205$parameters = array('id'=>$socid);
206$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
207if ($reshook < 0) {
208 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
209}
210
211// Selection of new fields
212include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
213// Purge search criteria
214if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
215 //$actioncode='';
216 $search_id = '';
217 $search_title = '';
218 $search_note = '';
219 $datestart_dtstart = '';
220 $datestart_dtend = '';
221 $dateend_dtstart = '';
222 $dateend_dtend = '';
223 $actioncode = '';
224 $search_status = '';
225 $pid = '';
226 $socid = '';
227 $resourceid = '';
228 $filter = '';
229 $filtert = '';
230 $usergroup = '';
231 $toselect = array();
232 $search_array_options = array();
233}
234
235if (empty($reshook) && !empty($massaction)) {
236 unset($percent);
237
238 switch ($massaction) {
239 case 'set_all_events_to_todo':
240 $percent = ActionComm::EVENT_TODO;
241 break;
242
243 case 'set_all_events_to_in_progress':
245 break;
246
247 case 'set_all_events_to_finished':
249 break;
250 }
251
252 if (isset($percent)) {
253 foreach ($toselect as $toselectid) {
254 $result = $object->updatePercent($toselectid, $percent);
255 if ($result < 0) {
256 dol_print_error($db);
257 break;
258 }
259 }
260 }
261}
262
263// As mass deletion happens with a confirm step, $massaction is not use for the final step (deletion).
264if (empty($reshook)) {
265 $objectclass = 'ActionComm';
266 $objectlabel = 'Events';
267 $uploaddir = true;
268 // Only users that can delete any event can remove records.
269 $permissiontodelete = $user->rights->agenda->allactions->delete;
270 $permissiontoadd = $user->hasRight('agenda', 'myactions', 'create');
271 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
272}
273
274/*
275 * View
276 */
277
278$form = new Form($db);
279$userstatic = new User($db);
280$formactions = new FormActions($db);
281
282$actionstatic = new ActionComm($db);
283$societestatic = new Societe($db);
284$contactstatic = new Contact($db);
285
286$nav = '';
287$nav .= $form->selectDate($dateselect, 'dateselect', 0, 0, 1, '', 1, 0);
288$nav .= ' <input type="submit" name="submitdateselect" class="button" value="'.$langs->trans("Refresh").'">';
289
290$now = dol_now();
291
292$help_url = 'EN:Module_Agenda_En|FR:Module_Agenda|ES:M&omodulodulo_Agenda|DE:Modul_Terminplanung';
293$title = $langs->trans("Agenda");
294llxHeader('', $title, $help_url);
295
296// Define list of all external calendars
297$listofextcals = array();
298
299$param = '';
300if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
301 $param .= '&contextpage='.urlencode($contextpage);
302}
303if ($limit > 0 && $limit != $conf->liste_limit) {
304 $param .= '&limit='.((int) $limit);
305}
306if ($actioncode != '') {
307 if (is_array($actioncode)) {
308 foreach ($actioncode as $str_action) {
309 $param .= "&search_actioncode[]=".urlencode($str_action);
310 }
311 } else {
312 $param .= "&search_actioncode=".urlencode($actioncode);
313 }
314}
315if ($resourceid > 0) {
316 $param .= "&search_resourceid=".urlencode($resourceid);
317}
318if ($search_status != '') {
319 $param .= "&search_status=".urlencode($search_status);
320}
321if ($filter) {
322 $param .= "&search_filter=".urlencode($filter);
323}
324if ($filtert) {
325 $param .= "&search_filtert=".urlencode($filtert);
326}
327if ($usergroup > 0) {
328 $param .= "&search_usergroup=".urlencode($usergroup);
329}
330if ($socid > 0) {
331 $param .= "&search_socid=".urlencode($socid);
332}
333if ($showbirthday) {
334 $param .= "&search_showbirthday=1";
335}
336if ($pid) {
337 $param .= "&search_projectid=".urlencode($pid);
338}
339if ($type) {
340 $param .= "&search_type=".urlencode($type);
341}
342if ($search_id != '') {
343 $param .= '&search_title='.urlencode($search_id);
344}
345if ($search_title != '') {
346 $param .= '&search_title='.urlencode($search_title);
347}
348if ($search_note != '') {
349 $param .= '&search_note='.urlencode($search_note);
350}
351if (GETPOST('datestart_dtstartday', 'int')) {
352 $param .= '&datestart_dtstartday='.GETPOST('datestart_dtstartday', 'int');
353}
354if (GETPOST('datestart_dtstartmonth', 'int')) {
355 $param .= '&datestart_dtstartmonth='.GETPOST('datestart_dtstartmonth', 'int');
356}
357if (GETPOST('datestart_dtstartyear', 'int')) {
358 $param .= '&datestart_dtstartyear='.GETPOST('datestart_dtstartyear', 'int');
359}
360if (GETPOST('datestart_dtendday', 'int')) {
361 $param .= '&datestart_dtendday='.GETPOST('datestart_dtendday', 'int');
362}
363if (GETPOST('datestart_dtendmonth', 'int')) {
364 $param .= '&datestart_dtendmonth='.GETPOST('datestart_dtendmonth', 'int');
365}
366if (GETPOST('datestart_dtendyear', 'int')) {
367 $param .= '&datestart_dtendyear='.GETPOST('datestart_dtendyear', 'int');
368}
369if (GETPOST('dateend_dtstartday', 'int')) {
370 $param .= '&dateend_dtstartday='.GETPOST('dateend_dtstartday', 'int');
371}
372if (GETPOST('dateend_dtstartmonth', 'int')) {
373 $param .= '&dateend_dtstartmonth='.GETPOST('dateend_dtstartmonth', 'int');
374}
375if (GETPOST('dateend_dtstartyear', 'int')) {
376 $param .= '&dateend_dtstartyear='.GETPOST('dateend_dtstartyear', 'int');
377}
378if (GETPOST('dateend_dtendday', 'int')) {
379 $param .= '&dateend_dtendday='.GETPOST('dateend_dtendday', 'int');
380}
381if (GETPOST('dateend_dtendmonth', 'int')) {
382 $param .= '&dateend_dtendmonth='.GETPOST('dateend_dtendmonth', 'int');
383}
384if (GETPOST('dateend_dtendyear', 'int')) {
385 $param .= '&dateend_dtendyear='.GETPOST('dateend_dtendyear', 'int');
386}
387if ($optioncss != '') {
388 $param .= '&optioncss='.urlencode($optioncss);
389}
390// Add $param from extra fields
391include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
392
393$paramnoactionodate = $param;
394
395// List of mass actions available
396$arrayofmassactions = array(
397 'set_all_events_to_todo' => $langs->trans("SetAllEventsToTodo"),
398 'set_all_events_to_in_progress' => $langs->trans("SetAllEventsToInProgress"),
399 'set_all_events_to_finished' => $langs->trans("SetAllEventsToFinished"),
400);
401if ($user->rights->agenda->allactions->delete) {
402 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
403}
404if (isModEnabled('category') && $user->hasRight('agenda', 'myactions', 'create')) {
405 $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
406}
407if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete','preaffecttag'))) {
408 $arrayofmassactions = array();
409}
410$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
411
412$sql = "SELECT";
413if ($usergroup > 0) {
414 $sql .= " DISTINCT";
415}
416$sql .= " s.nom as societe, s.rowid as socid, s.client, s.email as socemail,";
417$sql .= " a.id, a.code, a.label, a.note, a.datep as dp, a.datep2 as dp2, a.fulldayevent, a.location,";
418$sql .= " a.fk_user_author, a.fk_user_action,";
419$sql .= " a.fk_contact, a.note, a.percent as percent,";
420$sql .= " a.fk_element, a.elementtype, a.datec, a.tms as datem,";
421$sql .= " c.code as type_code, c.libelle as type_label, c.color as type_color, c.type as type_type, c.picto as type_picto,";
422$sql .= " sp.lastname, sp.firstname, sp.email, sp.phone, sp.address, sp.phone as phone_pro, sp.phone_mobile, sp.phone_perso, sp.fk_pays as country_id";
423
424// Add fields from extrafields
425if (!empty($extrafields->attributes[$object->table_element]['label'])) {
426 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
427 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
428 }
429}
430
431// Add fields from hooks
432$parameters = array();
433$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
434$sql .= $hookmanager->resPrint;
435
436$sqlfields = $sql; // $sql fields to remove for count total
437
438$sql .= " FROM ".MAIN_DB_PREFIX."actioncomm as a";
439$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."actioncomm_extrafields as ef ON (a.id = ef.fk_object)";
440if (empty($user->rights->societe->client->voir) && !$socid) {
441 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON a.fk_soc = sc.fk_soc";
442}
443$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON a.fk_soc = s.rowid";
444$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON a.fk_contact = sp.rowid";
445$sql .= " INNER JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON c.id = a.fk_action";
446// We must filter on resource table
447if ($resourceid > 0) {
448 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."element_resources as r ON r.element_type = 'action' AND r.element_id = a.id";
449}
450// We must filter on assignement table
451if ($filtert > 0 || $usergroup > 0) {
452 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm_resources as ar ON ar.fk_actioncomm = a.id AND ar.element_type='user'";
453}
454if ($usergroup > 0) {
455 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ugu ON ugu.fk_user = ar.fk_element";
456}
457$sql .= " WHERE a.entity IN (".getEntity('agenda').")";
458// Condition on actioncode
459if (!empty($actioncode)) {
460 if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
461 if ($actioncode == 'AC_NON_AUTO') {
462 $sql .= " AND c.type != 'systemauto'";
463 } elseif ($actioncode == 'AC_ALL_AUTO') {
464 $sql .= " AND c.type = 'systemauto'";
465 } else {
466 if ($actioncode == 'AC_OTH') {
467 $sql .= " AND c.type != 'systemauto'";
468 }
469 if ($actioncode == 'AC_OTH_AUTO') {
470 $sql .= " AND c.type = 'systemauto'";
471 }
472 }
473 } else {
474 if ($actioncode == 'AC_NON_AUTO') {
475 $sql .= " AND c.type != 'systemauto'";
476 } elseif ($actioncode == 'AC_ALL_AUTO') {
477 $sql .= " AND c.type = 'systemauto'";
478 } else {
479 if (is_array($actioncode)) {
480 $sql .= " AND c.code IN (".$db->sanitize("'".implode("','", $actioncode)."'", 1).")";
481 } else {
482 $sql .= " AND c.code IN (".$db->sanitize("'".implode("','", explode(',', $actioncode))."'", 1).")";
483 }
484 }
485 }
486}
487if ($resourceid > 0) {
488 $sql .= " AND r.resource_id = ".((int) $resourceid);
489}
490if ($pid) {
491 $sql .= " AND a.fk_project=".((int) $pid);
492}
493if (empty($user->rights->societe->client->voir) && !$socid) {
494 $sql .= " AND (a.fk_soc IS NULL OR sc.fk_user = ".((int) $user->id).")";
495}
496if ($socid > 0) {
497 $sql .= " AND s.rowid = ".((int) $socid);
498}
499if ($type) {
500 $sql .= " AND c.id = ".((int) $type);
501}
502if ($search_status == '0') {
503 $sql .= " AND a.percent = 0";
504}
505if ($search_status == 'na') {
506 $sql .= " AND a.percent = -1";
507} // Not applicable
508if ($search_status == '50') {
509 $sql .= " AND (a.percent > 0 AND a.percent < 100)";
510} // Running already started
511if ($search_status == '100') {
512 $sql .= " AND a.percent = 100";
513}
514if ($search_status == 'done') {
515 $sql .= " AND (a.percent = 100)";
516}
517if ($search_status == 'todo') {
518 $sql .= " AND (a.percent >= 0 AND a.percent < 100)";
519}
520if ($search_id) {
521 $sql .= natural_search("a.id", $search_id, 1);
522}
523if ($search_title) {
524 $sql .= natural_search("a.label", $search_title);
525}
526if ($search_note) {
527 $sql .= natural_search('a.note', $search_note);
528}
529// We must filter on assignement table
530if ($filtert > 0 || $usergroup > 0) {
531 $sql .= " AND (";
532 if ($filtert > 0) {
533 $sql .= "(ar.fk_element = ".((int) $filtert)." OR (ar.fk_element IS NULL AND a.fk_user_action = ".((int) $filtert)."))"; // The OR is for backward compatibility
534 }
535 if ($usergroup > 0) {
536 $sql .= ($filtert > 0 ? " OR " : "")." ugu.fk_usergroup = ".((int) $usergroup);
537 }
538 $sql .= ")";
539}
540
541// The second or of next test is to take event with no end date (we suppose duration is 1 hour in such case)
542if ($dateselect > 0) {
543 $sql .= " AND ((a.datep2 >= '".$db->idate($dateselect)."' AND a.datep <= '".$db->idate($dateselect + 3600 * 24 - 1)."') OR (a.datep2 IS NULL AND a.datep > '".$db->idate($dateselect - 3600)."' AND a.datep <= '".$db->idate($dateselect + 3600 * 24 - 1)."'))";
544}
545if ($datestart_dtstart > 0) {
546 $sql .= " AND a.datep >= '".$db->idate($datestart_dtstart)."'";
547}
548if ($datestart_dtend > 0) {
549 $sql .= " AND a.datep <= '".$db->idate($datestart_dtend)."'";
550}
551if ($dateend_dtstart > 0) {
552 $sql .= " AND a.datep2 >= '".$db->idate($dateend_dtstart)."'";
553}
554if ($dateend_dtend > 0) {
555 $sql .= " AND a.datep2 <= '".$db->idate($dateend_dtend)."'";
556}
557
558// Add where from extra fields
559include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
560
561// Add where from hooks
562$parameters = array();
563$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
564$sql .= $hookmanager->resPrint;
565
566// Count total nb of records
567$nbtotalofrecords = '';
568if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
569 /* The fast and low memory method to get and count full list converts the sql into a sql count */
570 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
571 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
572
573 $resql = $db->query($sqlforcount);
574 if ($resql) {
575 $objforcount = $db->fetch_object($resql);
576 $nbtotalofrecords = $objforcount->nbtotalofrecords;
577 } else {
578 dol_print_error($db);
579 }
580
581 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
582 $page = 0;
583 $offset = 0;
584 }
585 $db->free($resql);
586}
587
588// Complete request and execute it with limit
589$sql .= $db->order($sortfield, $sortorder);
590if ($limit) {
591 $sql .= $db->plimit($limit + 1, $offset);
592}
593
594$resql = $db->query($sql);
595if (!$resql) {
596 dol_print_error($db);
597 exit;
598}
599
600$num = $db->num_rows($resql);
601
602$arrayofselected = is_array($toselect) ? $toselect : array();
603
604// Local calendar
605$newtitle = '<div class="nowrap clear inline-block minheight30">';
606$newtitle .= '<input type="checkbox" id="check_mytasks" name="check_mytasks" checked disabled> '.$langs->trans("LocalAgenda").' &nbsp; ';
607$newtitle .= '</div>';
608//$newtitle=$langs->trans($title);
609
610$tabactive = 'cardlist';
611
612$head = calendars_prepare_head($param);
613
614print '<form method="POST" id="searchFormList" class="listactionsfilter" action="'.$_SERVER["PHP_SELF"].'">'."\n";
615
616if ($optioncss != '') {
617 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
618}
619print '<input type="hidden" name="token" value="'.newToken().'">';
620print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
621print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
622print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
623print '<input type="hidden" name="type" value="'.$type.'">';
624$nav = '';
625
626if ($filter) {
627 $nav .= '<input type="hidden" name="search_filter" value="'.$filter.'">';
628}
629if ($showbirthday) {
630 $nav .= '<input type="hidden" name="search_showbirthday" value="1">';
631}
632print $nav;
633
634//print dol_get_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action');
635//print_actions_filter($form, $canedit, $search_status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid);
636//print dol_get_fiche_end();
637
638
639$s = $newtitle;
640
641// Calendars from hooks
642$parameters = array();
643$reshook = $hookmanager->executeHooks('addCalendarChoice', $parameters, $object, $action);
644if (empty($reshook)) {
645 $s .= $hookmanager->resPrint;
646} elseif ($reshook > 1) {
647 $s = $hookmanager->resPrint;
648}
649$viewyear = is_object($object) ? dol_print_date($object->datep, '%Y') : '';
650$viewmonth = is_object($object) ? dol_print_date($object->datep, '%m') : '';
651$viewday = is_object($object) ? dol_print_date($object->datep, '%d') : '';
652$viewmode = '';
653$viewmode .= '<a class="btnTitle btnTitleSelected reposition" href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&restore_lastsearch_values=1'.$paramnoactionodate.'">';
654//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
655$viewmode .= img_picto($langs->trans("List"), 'object_calendarlist', 'class="imgforviewmode pictoactionview block"');
656//$viewmode .= '</span>';
657$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewList").'</span></a>';
658
659$viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_month&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
660//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
661$viewmode .= img_picto($langs->trans("ViewCal"), 'object_calendarmonth', 'class="pictoactionview block"');
662//$viewmode .= '</span>';
663$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewCal").'</span></a>';
664
665$viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_week&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
666//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
667$viewmode .= img_picto($langs->trans("ViewWeek"), 'object_calendarweek', 'class="pictoactionview block"');
668//$viewmode .= '</span>';
669$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewWeek").'</span></a>';
670
671$viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_day&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
672//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
673$viewmode .= img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="pictoactionview block"');
674//$viewmode .= '</span>';
675$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewDay").'</span></a>';
676
677$viewmode .= '<a class="btnTitle reposition marginrightonly" href="'.DOL_URL_ROOT.'/comm/action/peruser.php?mode=show_peruser&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
678//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
679$viewmode .= img_picto($langs->trans("ViewPerUser"), 'object_calendarperuser', 'class="pictoactionview block"');
680//$viewmode .= '</span>';
681$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewPerUser").'</span></a>';
682
683$viewmode .= '<span class="marginrightonly"></span>';
684
685// Add more views from hooks
686$parameters = array();
687$reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
688if (empty($reshook)) {
689 $viewmode .= $hookmanager->resPrint;
690} elseif ($reshook > 1) {
691 $viewmode = $hookmanager->resPrint;
692}
693
694$tmpforcreatebutton = dol_getdate(dol_now(), true);
695
696$newparam = '&month='.str_pad($month, 2, "0", STR_PAD_LEFT).'&year='.$tmpforcreatebutton['year'];
697
698//$param='month='.$monthshown.'&year='.$year;
699$hourminsec = dol_print_date(dol_mktime(10, 0, 0, 1, 1, 1970, 'gmt'), '%H', 'gmt').'0000'; // Set $hourminsec to '100000' to auto set hour to 10:00 at creation
700
701$url = DOL_URL_ROOT.'/comm/action/card.php?action=create';
702$url .= '&datep='.sprintf("%04d%02d%02d", $tmpforcreatebutton['year'], $tmpforcreatebutton['mon'], $tmpforcreatebutton['mday']).$hourminsec;
703$url .= '&backtopage='.urlencode($_SERVER["PHP_SELF"].($newparam ? '?'.$newparam : ''));
704
705$newcardbutton = dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, '', $user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create'));
706
707$param .= '&mode='.$mode;
708
709print_barre_liste($langs->trans("Agenda"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, is_numeric($nbtotalofrecords) ? -1 * $nbtotalofrecords: $nbtotalofrecords, 'object_action', 0, $nav.$newcardbutton, '', $limit, 0, 0, 1, $viewmode);
710
711print $s;
712
713$objecttmp = new ActionComm($db);
714include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
715
716$moreforfilter = '';
717
718$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
719$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
720if ($massactionbutton) {
721 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
722}
723$i = 0;
724
725print '<div class="liste_titre liste_titre_bydiv centpercent">';
726print_actions_filter($form, $canedit, $search_status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid);
727print '</div>';
728
729print '<div class="div-table-responsive">';
730print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
731
732print '<tr class="liste_titre_filter">';
733// Action column
734if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
735 print '<td class="liste_titre" align="middle">';
736 $searchpicto = $form->showFilterButtons('left');
737 print $searchpicto;
738 print '</td>';
739}
740if (!empty($arrayfields['a.id']['checked'])) {
741 print '<td class="liste_titre"><input type="text" class="maxwidth50" name="search_id" value="'.$search_id.'"></td>';
742}
743if (!empty($arrayfields['owner']['checked'])) {
744 print '<td class="liste_titre"></td>';
745}
746if (!empty($arrayfields['c.libelle']['checked'])) {
747 print '<td class="liste_titre"></td>';
748}
749if (!empty($arrayfields['a.label']['checked'])) {
750 print '<td class="liste_titre"><input type="text" class="maxwidth75" name="search_title" value="'.$search_title.'"></td>';
751}
752if (!empty($arrayfields['a.note']['checked'])) {
753 print '<td class="liste_titre"><input type="text" class="maxwidth75" name="search_note" value="'.$search_note.'"></td>';
754}
755if (!empty($arrayfields['a.datep']['checked'])) {
756 print '<td class="liste_titre nowraponall" align="center">';
757 print '<div class="nowrap">';
758 print $form->selectDate($datestart_dtstart, 'datestart_dtstart', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'), 'tzuserrel');
759 print '</div>';
760 print '<div class="nowrap">';
761 print $form->selectDate($datestart_dtend, 'datestart_dtend', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('To'), 'tzuserrel');
762 print '</div>';
763 print '</td>';
764}
765if (!empty($arrayfields['a.datep2']['checked'])) {
766 print '<td class="liste_titre nowraponall" align="center">';
767 print '<div class="nowrap">';
768 print $form->selectDate($dateend_dtstart, 'dateend_dtstart', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'), 'tzuserrel');
769 print '</div>';
770 print '<div class="nowrap">';
771 print $form->selectDate($dateend_dtend, 'dateend_dtend', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('To'), 'tzuserrel');
772 print '</div>';
773 print '</td>';
774}
775if (!empty($arrayfields['s.nom']['checked'])) {
776 print '<td class="liste_titre"></td>';
777}
778if (!empty($arrayfields['a.fk_contact']['checked'])) {
779 print '<td class="liste_titre"></td>';
780}
781if (!empty($arrayfields['a.fk_element']['checked'])) {
782 print '<td class="liste_titre"></td>';
783}
784
785// Extra fields
786include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
787
788// Fields from hook
789$parameters = array('arrayfields'=>$arrayfields);
790$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
791print $hookmanager->resPrint;
792
793if (!empty($arrayfields['a.datec']['checked'])) {
794 print '<td class="liste_titre"></td>';
795}
796if (!empty($arrayfields['a.tms']['checked'])) {
797 print '<td class="liste_titre"></td>';
798}
799if (!empty($arrayfields['a.percent']['checked'])) {
800 print '<td class="liste_titre right parentonrightofpage">';
801 $formactions->form_select_status_action('formaction', $search_status, 1, 'search_status', 1, 2, 'search_status width100 onrightofpage');
802 print '</td>';
803}
804// Action column
805if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
806 print '<td class="liste_titre" align="middle">';
807 $searchpicto = $form->showFilterButtons();
808 print $searchpicto;
809 print '</td>';
810}
811print '</tr>'."\n";
812
813$totalarray = array();
814$totalarray['nbfield'] = 0;
815
816// Fields title label
817// --------------------------------------------------------------------
818print '<tr class="liste_titre">';
819if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
820 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
821}
822if (!empty($arrayfields['a.id']['checked'])) {
823 print_liste_field_titre($arrayfields['a.id']['label'], $_SERVER["PHP_SELF"], "a.id", $param, "", "", $sortfield, $sortorder);
824 $totalarray['nbfield']++;
825}
826if (!empty($arrayfields['owner']['checked'])) {
827 print_liste_field_titre($arrayfields['owner']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
828 $totalarray['nbfield']++;
829}
830if (!empty($arrayfields['c.libelle']['checked'])) {
831 print_liste_field_titre($arrayfields['c.libelle']['label'], $_SERVER["PHP_SELF"], "c.libelle", $param, "", "", $sortfield, $sortorder);
832 $totalarray['nbfield']++;
833}
834if (!empty($arrayfields['a.label']['checked'])) {
835 print_liste_field_titre($arrayfields['a.label']['label'], $_SERVER["PHP_SELF"], "a.label", $param, "", "", $sortfield, $sortorder);
836 $totalarray['nbfield']++;
837}
838if (!empty($arrayfields['a.note']['checked'])) {
839 print_liste_field_titre($arrayfields['a.note']['label'], $_SERVER["PHP_SELF"], "a.note", $param, "", "", $sortfield, $sortorder);
840 $totalarray['nbfield']++;
841}
842//if (!empty($conf->global->AGENDA_USE_EVENT_TYPE))
843if (!empty($arrayfields['a.datep']['checked'])) {
844 print_liste_field_titre($arrayfields['a.datep']['label'], $_SERVER["PHP_SELF"], "a.datep,a.id", $param, '', 'align="center"', $sortfield, $sortorder);
845 $totalarray['nbfield']++;
846}
847if (!empty($arrayfields['a.datep2']['checked'])) {
848 print_liste_field_titre($arrayfields['a.datep2']['label'], $_SERVER["PHP_SELF"], "a.datep2", $param, '', 'align="center"', $sortfield, $sortorder);
849 $totalarray['nbfield']++;
850}
851if (!empty($arrayfields['s.nom']['checked'])) {
852 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", $param, "", "", $sortfield, $sortorder);
853 $totalarray['nbfield']++;
854}
855if (!empty($arrayfields['a.fk_contact']['checked'])) {
856 print_liste_field_titre($arrayfields['a.fk_contact']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
857 $totalarray['nbfield']++;
858}
859if (!empty($arrayfields['a.fk_element']['checked'])) {
860 print_liste_field_titre($arrayfields['a.fk_element']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
861 $totalarray['nbfield']++;
862}
863// Extra fields
864include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
865// Hook fields
866$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
867$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
868print $hookmanager->resPrint;
869
870if (!empty($arrayfields['a.datec']['checked'])) {
871 print_liste_field_titre($arrayfields['a.datec']['label'], $_SERVER["PHP_SELF"], "a.datec,a.id", $param, "", 'align="center"', $sortfield, $sortorder);
872 $totalarray['nbfield']++;
873}
874if (!empty($arrayfields['a.tms']['checked'])) {
875 print_liste_field_titre($arrayfields['a.tms']['label'], $_SERVER["PHP_SELF"], "a.tms,a.id", $param, "", 'align="center"', $sortfield, $sortorder);
876 $totalarray['nbfield']++;
877}
878
879if (!empty($arrayfields['a.percent']['checked'])) {
880 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "a.percent", $param, "", 'align="center"', $sortfield, $sortorder);
881 $totalarray['nbfield']++;
882}
883if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
884 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
885}
886$totalarray['nbfield']++;
887print "</tr>\n";
888
889$now = dol_now();
890$delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
891$today_start_time = dol_mktime(0, 0, 0, date('m', $now), date('d', $now), date('Y', $now));
892
893require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
894$caction = new CActionComm($db);
895$arraylist = $caction->liste_array(1, 'code', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : 0), '', 1);
896$contactListCache = array();
897
898// Loop on record
899// --------------------------------------------------------------------
900$i = 0;
901//$savnbfield = $totalarray['nbfield'];
902//$totalarray['nbfield'] = 0;
903$imaxinloop = ($limit ? min($num, $limit) : $num);
904$cache_user_list = array();
905while ($i < $imaxinloop) {
906 $obj = $db->fetch_object($resql);
907 if (empty($obj)) {
908 break; // Should not happen
909 }
910
911 // Store properties in $object
912 $object->setVarsFromFetchObj($obj);
913
914 // Discard auto action if option is on
915 if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO) && $obj->type_code == 'AC_OTH_AUTO') {
916 $i++;
917 continue;
918 }
919
920 $actionstatic->id = $obj->id;
921 $actionstatic->ref = $obj->id;
922 $actionstatic->code = $obj->code;
923 $actionstatic->type_code = $obj->type_code;
924 $actionstatic->type_label = $obj->type_label;
925 $actionstatic->type_picto = $obj->type_picto;
926 $actionstatic->type_color = $obj->type_color;
927 $actionstatic->label = $obj->label;
928 $actionstatic->location = $obj->location;
929 $actionstatic->note_private = dol_htmlentitiesbr($obj->note);
930 $actionstatic->datep = $db->jdate($obj->dp);
931 $actionstatic->percentage = $obj->percent;
932 $actionstatic->authorid = $obj->fk_user_author;
933 $actionstatic->userownerid = $obj->fk_user_action;
934
935 // Initialize $this->userassigned && this->socpeopleassigned array && this->userownerid
936 // but only if we need it
937 if (!empty($arrayfields['a.fk_contact']['checked'])) {
938 $actionstatic->fetchResources();
939 }
940
941 // cache of user list (owners)
942 if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) {
943 $userstatic = new User($db);
944 $res = $userstatic->fetch($obj->fk_user_action);
945 if ($res > 0) {
946 $cache_user_list[$obj->fk_user_action] = $userstatic;
947 }
948 }
949
950 // get event style for user owner
951 $event_owner_style = '';
952 // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
953 if ($cache_user_list[$obj->fk_user_action]->color != '') {
954 $event_owner_style .= 'border-left: #' . $cache_user_list[$obj->fk_user_action]->color . ' 5px solid;';
955 }
956
957 // get event style for start and end date
958 $event_more_class = '';
959 $event_start_date_css = '';
960 $event_end_date_css = '';
961 $event_start_date_time = $actionstatic->datep;
962 if ($event_start_date_time > $now) {
963 // future event
964 $event_more_class = 'event-future';
965 $event_start_date_css = $event_end_date_css = $event_more_class;
966 } else {
967 if ($obj->fulldayevent == 1) {
968 $today_start_date_time = $today_start_time;
969 } else {
970 $today_start_date_time = $now;
971 }
972
973 // check event end date
974 $event_end_date_time = $db->jdate($obj->dp2);
975 if ($event_end_date_time != null && $event_end_date_time < $today_start_date_time) {
976 // past event
977 $event_more_class = 'event-past';
978 } elseif ($event_end_date_time == null && $event_start_date_time < $today_start_date_time) {
979 // past event
980 $event_more_class = 'event-past';
981 } else {
982 // current event
983 $event_more_class = 'event-current';
984 }
985 $event_start_date_css = $event_end_date_css = $event_more_class;
986 }
987 $event_start_date_css = $event_end_date_css = $event_more_class;
988
989 print '<tr class="oddeven' . ($event_more_class != '' ? ' '.$event_more_class : '') . '">';
990 // Action column
991 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
992 print '<td class="nowrap center">';
993 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
994 $selected = 0;
995 if (in_array($obj->id, $arrayofselected)) {
996 $selected = 1;
997 }
998 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
999 }
1000 print '</td>';
1001 }
1002 // Ref
1003 if (!empty($arrayfields['a.id']['checked'])) {
1004 print '<td class="nowraponall">';
1005 print $actionstatic->getNomUrl(1, -1);
1006 print '</td>';
1007 }
1008
1009 // User owner
1010 if (!empty($arrayfields['owner']['checked'])) {
1011 //print '<td class="tdoverflowmax150"' . ($event_owner_style != '' ? ' style="'.$event_owner_style.'"' : '') . '>';
1012 print '<td class="tdoverflowmax150">';
1013 if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) {
1014 $userstatic = new User($db);
1015 $res = $userstatic->fetch($obj->fk_user_action);
1016 if ($res > 0) {
1017 $cache_user_list[$obj->fk_user_action] = $userstatic;
1018 }
1019 }
1020 if (isset($cache_user_list[$obj->fk_user_action])) {
1021 print $cache_user_list[$obj->fk_user_action]->getNomUrl(-1);
1022 } else {
1023 print '&nbsp;';
1024 }
1025 print '</td>';
1026 }
1027
1028 // Type
1029 if (!empty($arrayfields['c.libelle']['checked'])) {
1030 print '<td class="nowraponall">';
1031 print $actionstatic->getTypePicto();
1032 $labeltype = $obj->type_code;
1033 if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($arraylist[$labeltype])) {
1034 $labeltype = 'AC_OTH';
1035 }
1036 if (preg_match('/^TICKET_MSG/', $actionstatic->code)) {
1037 $labeltype = $langs->trans("Message");
1038 } else {
1039 if (!empty($arraylist[$labeltype])) {
1040 $labeltype = $arraylist[$labeltype];
1041 }
1042 if ($obj->type_code == 'AC_OTH_AUTO' && ($obj->type_code != $obj->code) && $labeltype && !empty($arraylist[$obj->code])) {
1043 $labeltype .= ' - '.$arraylist[$obj->code]; // Use code in priority on type_code
1044 }
1045 }
1046 print dol_trunc($labeltype, 28);
1047 print '</td>';
1048 }
1049
1050 // Label
1051 if (!empty($arrayfields['a.label']['checked'])) {
1052 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($actionstatic->label).'">';
1053 print $actionstatic->label;
1054 print '</td>';
1055 }
1056
1057 // Description
1058 if (!empty($arrayfields['a.note']['checked'])) {
1059 print '<td class="tdoverflowonsmartphone">';
1060 $text = dolGetFirstLineOfText(dol_string_nohtmltag($actionstatic->note_private, 1));
1061 print $form->textwithtooltip(dol_trunc($text, 48), $actionstatic->note_private);
1062 print '</td>';
1063 }
1064
1065 $formatToUse = $obj->fulldayevent ? 'day' : 'dayhour';
1066
1067 // Start date
1068 if (!empty($arrayfields['a.datep']['checked'])) {
1069 print '<td class="center nowraponall'.($event_start_date_css ? ' '.$event_start_date_css : '').'"><span>';
1070 if (empty($obj->fulldayevent)) {
1071 print dol_print_date($db->jdate($obj->dp), $formatToUse, 'tzuserrel');
1072 } else {
1073 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
1074 print dol_print_date($db->jdate($obj->dp), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel'));
1075 }
1076 print '</span>';
1077 $late = 0;
1078 if ($actionstatic->hasDelay() && $actionstatic->percentage >= 0 && $actionstatic->percentage < 100 ) {
1079 $late = 1;
1080 }
1081 if ($late) {
1082 print img_warning($langs->trans("Late")).' ';
1083 }
1084 print '</td>';
1085 }
1086
1087 // End date
1088 if (!empty($arrayfields['a.datep2']['checked'])) {
1089 print '<td class="center nowraponall'.($event_end_date_css ? ' '.$event_end_date_css : '').'"><span>';
1090 if (empty($obj->fulldayevent)) {
1091 print dol_print_date($db->jdate($obj->dp2), $formatToUse, 'tzuserrel');
1092 } else {
1093 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
1094 print dol_print_date($db->jdate($obj->dp2), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel'));
1095 }
1096 print '</span>';
1097 print '</td>';
1098 }
1099
1100 // Third party
1101 if (!empty($arrayfields['s.nom']['checked'])) {
1102 print '<td class="tdoverflowmax150">';
1103 if ($obj->socid > 0) {
1104 $societestatic->id = $obj->socid;
1105 $societestatic->client = $obj->client;
1106 $societestatic->name = $obj->societe;
1107 $societestatic->email = $obj->socemail;
1108
1109 print $societestatic->getNomUrl(1, '', 28);
1110 } else {
1111 print '&nbsp;';
1112 }
1113 print '</td>';
1114 }
1115
1116 // Contact
1117 if (!empty($arrayfields['a.fk_contact']['checked'])) {
1118 print '<td class="tdoverflowmax100">';
1119
1120 if (!empty($actionstatic->socpeopleassigned)) {
1121 $contactList = array();
1122 foreach ($actionstatic->socpeopleassigned as $socpeopleassigned) {
1123 if (!isset($contactListCache[$socpeopleassigned['id']])) {
1124 // if no cache found we fetch it
1125 $contact = new Contact($db);
1126 if ($contact->fetch($socpeopleassigned['id']) > 0) {
1127 $contactListCache[$socpeopleassigned['id']] = $contact->getNomUrl(1, '', 0);
1128 $contactList[] = $contact->getNomUrl(1, '', 0);
1129 }
1130 } else {
1131 // use cache
1132 $contactList[] = $contactListCache[$socpeopleassigned['id']];
1133 }
1134 }
1135 if (!empty($contactList)) {
1136 print implode(', ', $contactList);
1137 }
1138 } elseif ($obj->fk_contact > 0) { //keep for retrocompatibility with faraway event
1139 $contactstatic->id = $obj->fk_contact;
1140 $contactstatic->email = $obj->email;
1141 $contactstatic->lastname = $obj->lastname;
1142 $contactstatic->firstname = $obj->firstname;
1143 $contactstatic->phone_pro = $obj->phone_pro;
1144 $contactstatic->phone_mobile = $obj->phone_mobile;
1145 $contactstatic->phone_perso = $obj->phone_perso;
1146 $contactstatic->country_id = $obj->country_id;
1147 print $contactstatic->getNomUrl(1, '', 0);
1148 } else {
1149 print "&nbsp;";
1150 }
1151 print '</td>';
1152 }
1153
1154 // Linked object
1155 if (!empty($arrayfields['a.fk_element']['checked'])) {
1156 print '<td class="tdoverflowmax150">';
1157 //var_dump($obj->fkelement.' '.$obj->elementtype);
1158 if ($obj->fk_element > 0 && !empty($obj->elementtype)) {
1159 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1160 print dolGetElementUrl($obj->fk_element, $obj->elementtype, 1);
1161 } else {
1162 print "&nbsp;";
1163 }
1164 print '</td>';
1165 }
1166
1167 // Extra fields
1168 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1169 // Fields from hook
1170 $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
1171 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1172 print $hookmanager->resPrint;
1173
1174 // Date creation
1175 if (!empty($arrayfields['a.datec']['checked'])) {
1176 // Status/Percent
1177 print '<td align="center" class="nowrap">'.dol_print_date($db->jdate($obj->datec), 'dayhour', 'tzuserrel').'</td>';
1178 }
1179 // Date update
1180 if (!empty($arrayfields['a.tms']['checked'])) {
1181 print '<td align="center" class="nowrap">'.dol_print_date($db->jdate($obj->datem), 'dayhour', 'tzuserrel').'</td>';
1182 }
1183 if (!empty($arrayfields['a.percent']['checked'])) {
1184 // Status/Percent
1185 $datep = $db->jdate($obj->dp);
1186 print '<td align="center" class="nowrap">'.$actionstatic->LibStatut($obj->percent, 5, 0, $datep).'</td>';
1187 }
1188 // Action column
1189 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1190 print '<td class="nowrap center">';
1191 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1192 $selected = 0;
1193 if (in_array($obj->id, $arrayofselected)) {
1194 $selected = 1;
1195 }
1196 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
1197 }
1198 print '</td>';
1199 }
1200
1201 print '</tr>'."\n";
1202
1203 $i++;
1204}
1205// If no record found
1206if ($num == 0) {
1207 print '<tr><td colspan="'.$totalarray['nbfield'].'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1208}
1209
1210
1211print '</table>'."\n";
1212print '</div>'."\n";
1213
1214print '</form>'."\n";
1215
1216$db->free($resql);
1217
1218// End of page
1219llxFooter();
1220$db->close();
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.
calendars_prepare_head($param)
Define head array for tabs of agenda setup pages.
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif( $action=='specimen') elseif($action=='setmodel') elseif( $action=='del') elseif($action=='setdoc') $formactions
View.
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)
const EVENT_FINISHED
Typical value for a event that is in a finished state.
const EVENT_IN_PROGRESS
Typical value for a event that is in a progress state.
const EVENT_TODO
Typical value for a event that is in a todo state.
Class to manage different types of events.
Class to manage contact/addresses.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to manage generation of HTML components Only common components must be here.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
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...
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
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.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.