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 .= " ,".MAIN_DB_PREFIX."c_actioncomm as c";
446// We must filter on resource table
447if ($resourceid > 0) {
448 $sql .= ", ".MAIN_DB_PREFIX."element_resources as r";
449}
450// We must filter on assignement table
451if ($filtert > 0 || $usergroup > 0) {
452 $sql .= ", ".MAIN_DB_PREFIX."actioncomm_resources as ar";
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 c.id = a.fk_action";
458$sql .= ' AND a.entity IN ('.getEntity('agenda').')';
459// Condition on actioncode
460if (!empty($actioncode)) {
461 if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
462 if ($actioncode == 'AC_NON_AUTO') {
463 $sql .= " AND c.type != 'systemauto'";
464 } elseif ($actioncode == 'AC_ALL_AUTO') {
465 $sql .= " AND c.type = 'systemauto'";
466 } else {
467 if ($actioncode == 'AC_OTH') {
468 $sql .= " AND c.type != 'systemauto'";
469 }
470 if ($actioncode == 'AC_OTH_AUTO') {
471 $sql .= " AND c.type = 'systemauto'";
472 }
473 }
474 } else {
475 if ($actioncode == 'AC_NON_AUTO') {
476 $sql .= " AND c.type != 'systemauto'";
477 } elseif ($actioncode == 'AC_ALL_AUTO') {
478 $sql .= " AND c.type = 'systemauto'";
479 } else {
480 if (is_array($actioncode)) {
481 $sql .= " AND c.code IN (".$db->sanitize("'".implode("','", $actioncode)."'", 1).")";
482 } else {
483 $sql .= " AND c.code IN (".$db->sanitize("'".implode("','", explode(',', $actioncode))."'", 1).")";
484 }
485 }
486 }
487}
488if ($resourceid > 0) {
489 $sql .= " AND r.element_type = 'action' AND r.element_id = a.id AND r.resource_id = ".((int) $resourceid);
490}
491if ($pid) {
492 $sql .= " AND a.fk_project=".((int) $pid);
493}
494if (empty($user->rights->societe->client->voir) && !$socid) {
495 $sql .= " AND (a.fk_soc IS NULL OR sc.fk_user = ".((int) $user->id).")";
496}
497if ($socid > 0) {
498 $sql .= " AND s.rowid = ".((int) $socid);
499}
500// We must filter on assignement table
501if ($filtert > 0 || $usergroup > 0) {
502 $sql .= " AND ar.fk_actioncomm = a.id AND ar.element_type='user'";
503}
504if ($type) {
505 $sql .= " AND c.id = ".((int) $type);
506}
507if ($search_status == '0') {
508 $sql .= " AND a.percent = 0";
509}
510if ($search_status == 'na') {
511 $sql .= " AND a.percent = -1";
512} // Not applicable
513if ($search_status == '50') {
514 $sql .= " AND (a.percent > 0 AND a.percent < 100)";
515} // Running already started
516if ($search_status == '100') {
517 $sql .= " AND a.percent = 100";
518}
519if ($search_status == 'done') {
520 $sql .= " AND (a.percent = 100)";
521}
522if ($search_status == 'todo') {
523 $sql .= " AND (a.percent >= 0 AND a.percent < 100)";
524}
525if ($search_id) {
526 $sql .= natural_search("a.id", $search_id, 1);
527}
528if ($search_title) {
529 $sql .= natural_search("a.label", $search_title);
530}
531if ($search_note) {
532 $sql .= natural_search('a.note', $search_note);
533}
534// We must filter on assignement table
535if ($filtert > 0 || $usergroup > 0) {
536 $sql .= " AND (";
537 if ($filtert > 0) {
538 $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
539 }
540 if ($usergroup > 0) {
541 $sql .= ($filtert > 0 ? " OR " : "")." ugu.fk_usergroup = ".((int) $usergroup);
542 }
543 $sql .= ")";
544}
545
546// The second or of next test is to take event with no end date (we suppose duration is 1 hour in such case)
547if ($dateselect > 0) {
548 $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)."'))";
549}
550if ($datestart_dtstart > 0) {
551 $sql .= " AND a.datep >= '".$db->idate($datestart_dtstart)."'";
552}
553if ($datestart_dtend > 0) {
554 $sql .= " AND a.datep <= '".$db->idate($datestart_dtend)."'";
555}
556if ($dateend_dtstart > 0) {
557 $sql .= " AND a.datep2 >= '".$db->idate($dateend_dtstart)."'";
558}
559if ($dateend_dtend > 0) {
560 $sql .= " AND a.datep2 <= '".$db->idate($dateend_dtend)."'";
561}
562
563// Add where from extra fields
564include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
565
566// Add where from hooks
567$parameters = array();
568$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
569$sql .= $hookmanager->resPrint;
570
571// Count total nb of records
572$nbtotalofrecords = '';
573if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
574 /* The fast and low memory method to get and count full list converts the sql into a sql count */
575 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
576 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
577
578 $resql = $db->query($sqlforcount);
579 if ($resql) {
580 $objforcount = $db->fetch_object($resql);
581 $nbtotalofrecords = $objforcount->nbtotalofrecords;
582 } else {
583 dol_print_error($db);
584 }
585
586 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
587 $page = 0;
588 $offset = 0;
589 }
590 $db->free($resql);
591}
592
593// Complete request and execute it with limit
594$sql .= $db->order($sortfield, $sortorder);
595if ($limit) {
596 $sql .= $db->plimit($limit + 1, $offset);
597}
598
599$resql = $db->query($sql);
600if (!$resql) {
601 dol_print_error($db);
602 exit;
603}
604
605$num = $db->num_rows($resql);
606
607$arrayofselected = is_array($toselect) ? $toselect : array();
608
609// Local calendar
610$newtitle = '<div class="nowrap clear inline-block minheight30">';
611$newtitle .= '<input type="checkbox" id="check_mytasks" name="check_mytasks" checked disabled> '.$langs->trans("LocalAgenda").' &nbsp; ';
612$newtitle .= '</div>';
613//$newtitle=$langs->trans($title);
614
615$tabactive = 'cardlist';
616
617$head = calendars_prepare_head($param);
618
619print '<form method="POST" id="searchFormList" class="listactionsfilter" action="'.$_SERVER["PHP_SELF"].'">'."\n";
620
621if ($optioncss != '') {
622 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
623}
624print '<input type="hidden" name="token" value="'.newToken().'">';
625print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
626print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
627print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
628print '<input type="hidden" name="type" value="'.$type.'">';
629$nav = '';
630
631if ($filter) {
632 $nav .= '<input type="hidden" name="search_filter" value="'.$filter.'">';
633}
634if ($showbirthday) {
635 $nav .= '<input type="hidden" name="search_showbirthday" value="1">';
636}
637print $nav;
638
639//print dol_get_fiche_head($head, $tabactive, $langs->trans('Agenda'), 0, 'action');
640//print_actions_filter($form, $canedit, $search_status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid);
641//print dol_get_fiche_end();
642
643
644$s = $newtitle;
645
646// Calendars from hooks
647$parameters = array();
648$reshook = $hookmanager->executeHooks('addCalendarChoice', $parameters, $object, $action);
649if (empty($reshook)) {
650 $s .= $hookmanager->resPrint;
651} elseif ($reshook > 1) {
652 $s = $hookmanager->resPrint;
653}
654$viewyear = is_object($object) ? dol_print_date($object->datep, '%Y') : '';
655$viewmonth = is_object($object) ? dol_print_date($object->datep, '%m') : '';
656$viewday = is_object($object) ? dol_print_date($object->datep, '%d') : '';
657$viewmode = '';
658$viewmode .= '<a class="btnTitle btnTitleSelected reposition" href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&restore_lastsearch_values=1'.$paramnoactionodate.'">';
659//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
660$viewmode .= img_picto($langs->trans("List"), 'object_calendarlist', 'class="imgforviewmode pictoactionview block"');
661//$viewmode .= '</span>';
662$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewList").'</span></a>';
663
664$viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_month&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
665//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
666$viewmode .= img_picto($langs->trans("ViewCal"), 'object_calendarmonth', 'class="pictoactionview block"');
667//$viewmode .= '</span>';
668$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewCal").'</span></a>';
669
670$viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_week&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
671//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
672$viewmode .= img_picto($langs->trans("ViewWeek"), 'object_calendarweek', 'class="pictoactionview block"');
673//$viewmode .= '</span>';
674$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewWeek").'</span></a>';
675
676$viewmode .= '<a class="btnTitle reposition" href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_day&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
677//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
678$viewmode .= img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="pictoactionview block"');
679//$viewmode .= '</span>';
680$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewDay").'</span></a>';
681
682$viewmode .= '<a class="btnTitle reposition marginrightonly" href="'.DOL_URL_ROOT.'/comm/action/peruser.php?mode=show_peruser&year='.$viewyear.'&month='.$viewmonth.'&day='.$viewday.$paramnoactionodate.'">';
683//$viewmode .= '<span class="fa paddingleft imgforviewmode valignmiddle btnTitle-icon">';
684$viewmode .= img_picto($langs->trans("ViewPerUser"), 'object_calendarperuser', 'class="pictoactionview block"');
685//$viewmode .= '</span>';
686$viewmode .= '<span class="valignmiddle text-plus-circle btnTitle-label hideonsmartphone">'.$langs->trans("ViewPerUser").'</span></a>';
687
688$viewmode .= '<span class="marginrightonly"></span>';
689
690// Add more views from hooks
691$parameters = array();
692$reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
693if (empty($reshook)) {
694 $viewmode .= $hookmanager->resPrint;
695} elseif ($reshook > 1) {
696 $viewmode = $hookmanager->resPrint;
697}
698
699$tmpforcreatebutton = dol_getdate(dol_now(), true);
700
701$newparam = '&month='.str_pad($month, 2, "0", STR_PAD_LEFT).'&year='.$tmpforcreatebutton['year'];
702
703//$param='month='.$monthshown.'&year='.$year;
704$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
705
706$url = DOL_URL_ROOT.'/comm/action/card.php?action=create';
707$url .= '&datep='.sprintf("%04d%02d%02d", $tmpforcreatebutton['year'], $tmpforcreatebutton['mon'], $tmpforcreatebutton['mday']).$hourminsec;
708$url .= '&backtopage='.urlencode($_SERVER["PHP_SELF"].($newparam ? '?'.$newparam : ''));
709
710$newcardbutton = dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, '', $user->rights->agenda->myactions->create || $user->hasRight('agenda', 'allactions', 'create'));
711
712$param .= '&mode='.$mode;
713
714print_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);
715
716print $s;
717
718$objecttmp = new ActionComm($db);
719include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
720
721$moreforfilter = '';
722
723$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
724$selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields
725if ($massactionbutton) {
726 $selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
727}
728$i = 0;
729
730print '<div class="liste_titre liste_titre_bydiv centpercent">';
731print_actions_filter($form, $canedit, $search_status, $year, $month, $day, $showbirthday, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid);
732print '</div>';
733
734print '<div class="div-table-responsive">';
735print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
736
737print '<tr class="liste_titre_filter">';
738// Action column
739if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
740 print '<td class="liste_titre" align="middle">';
741 $searchpicto = $form->showFilterButtons('left');
742 print $searchpicto;
743 print '</td>';
744}
745if (!empty($arrayfields['a.id']['checked'])) {
746 print '<td class="liste_titre"><input type="text" class="maxwidth50" name="search_id" value="'.$search_id.'"></td>';
747}
748if (!empty($arrayfields['owner']['checked'])) {
749 print '<td class="liste_titre"></td>';
750}
751if (!empty($arrayfields['c.libelle']['checked'])) {
752 print '<td class="liste_titre"></td>';
753}
754if (!empty($arrayfields['a.label']['checked'])) {
755 print '<td class="liste_titre"><input type="text" class="maxwidth75" name="search_title" value="'.$search_title.'"></td>';
756}
757if (!empty($arrayfields['a.note']['checked'])) {
758 print '<td class="liste_titre"><input type="text" class="maxwidth75" name="search_note" value="'.$search_note.'"></td>';
759}
760if (!empty($arrayfields['a.datep']['checked'])) {
761 print '<td class="liste_titre nowraponall" align="center">';
762 print '<div class="nowrap">';
763 print $form->selectDate($datestart_dtstart, 'datestart_dtstart', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'), 'tzuserrel');
764 print '</div>';
765 print '<div class="nowrap">';
766 print $form->selectDate($datestart_dtend, 'datestart_dtend', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('To'), 'tzuserrel');
767 print '</div>';
768 print '</td>';
769}
770if (!empty($arrayfields['a.datep2']['checked'])) {
771 print '<td class="liste_titre nowraponall" align="center">';
772 print '<div class="nowrap">';
773 print $form->selectDate($dateend_dtstart, 'dateend_dtstart', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'), 'tzuserrel');
774 print '</div>';
775 print '<div class="nowrap">';
776 print $form->selectDate($dateend_dtend, 'dateend_dtend', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('To'), 'tzuserrel');
777 print '</div>';
778 print '</td>';
779}
780if (!empty($arrayfields['s.nom']['checked'])) {
781 print '<td class="liste_titre"></td>';
782}
783if (!empty($arrayfields['a.fk_contact']['checked'])) {
784 print '<td class="liste_titre"></td>';
785}
786if (!empty($arrayfields['a.fk_element']['checked'])) {
787 print '<td class="liste_titre"></td>';
788}
789
790// Extra fields
791include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
792
793// Fields from hook
794$parameters = array('arrayfields'=>$arrayfields);
795$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
796print $hookmanager->resPrint;
797
798if (!empty($arrayfields['a.datec']['checked'])) {
799 print '<td class="liste_titre"></td>';
800}
801if (!empty($arrayfields['a.tms']['checked'])) {
802 print '<td class="liste_titre"></td>';
803}
804if (!empty($arrayfields['a.percent']['checked'])) {
805 print '<td class="liste_titre right parentonrightofpage">';
806 $formactions->form_select_status_action('formaction', $search_status, 1, 'search_status', 1, 2, 'search_status width100 onrightofpage');
807 print '</td>';
808}
809// Action column
810if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
811 print '<td class="liste_titre" align="middle">';
812 $searchpicto = $form->showFilterButtons();
813 print $searchpicto;
814 print '</td>';
815}
816print '</tr>'."\n";
817
818$totalarray = array();
819$totalarray['nbfield'] = 0;
820
821// Fields title label
822// --------------------------------------------------------------------
823print '<tr class="liste_titre">';
824if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
825 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
826}
827if (!empty($arrayfields['a.id']['checked'])) {
828 print_liste_field_titre($arrayfields['a.id']['label'], $_SERVER["PHP_SELF"], "a.id", $param, "", "", $sortfield, $sortorder);
829 $totalarray['nbfield']++;
830}
831if (!empty($arrayfields['owner']['checked'])) {
832 print_liste_field_titre($arrayfields['owner']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
833 $totalarray['nbfield']++;
834}
835if (!empty($arrayfields['c.libelle']['checked'])) {
836 print_liste_field_titre($arrayfields['c.libelle']['label'], $_SERVER["PHP_SELF"], "c.libelle", $param, "", "", $sortfield, $sortorder);
837 $totalarray['nbfield']++;
838}
839if (!empty($arrayfields['a.label']['checked'])) {
840 print_liste_field_titre($arrayfields['a.label']['label'], $_SERVER["PHP_SELF"], "a.label", $param, "", "", $sortfield, $sortorder);
841 $totalarray['nbfield']++;
842}
843if (!empty($arrayfields['a.note']['checked'])) {
844 print_liste_field_titre($arrayfields['a.note']['label'], $_SERVER["PHP_SELF"], "a.note", $param, "", "", $sortfield, $sortorder);
845 $totalarray['nbfield']++;
846}
847//if (!empty($conf->global->AGENDA_USE_EVENT_TYPE))
848if (!empty($arrayfields['a.datep']['checked'])) {
849 print_liste_field_titre($arrayfields['a.datep']['label'], $_SERVER["PHP_SELF"], "a.datep,a.id", $param, '', 'align="center"', $sortfield, $sortorder);
850 $totalarray['nbfield']++;
851}
852if (!empty($arrayfields['a.datep2']['checked'])) {
853 print_liste_field_titre($arrayfields['a.datep2']['label'], $_SERVER["PHP_SELF"], "a.datep2", $param, '', 'align="center"', $sortfield, $sortorder);
854 $totalarray['nbfield']++;
855}
856if (!empty($arrayfields['s.nom']['checked'])) {
857 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", $param, "", "", $sortfield, $sortorder);
858 $totalarray['nbfield']++;
859}
860if (!empty($arrayfields['a.fk_contact']['checked'])) {
861 print_liste_field_titre($arrayfields['a.fk_contact']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
862 $totalarray['nbfield']++;
863}
864if (!empty($arrayfields['a.fk_element']['checked'])) {
865 print_liste_field_titre($arrayfields['a.fk_element']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
866 $totalarray['nbfield']++;
867}
868// Extra fields
869include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
870// Hook fields
871$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
872$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
873print $hookmanager->resPrint;
874
875if (!empty($arrayfields['a.datec']['checked'])) {
876 print_liste_field_titre($arrayfields['a.datec']['label'], $_SERVER["PHP_SELF"], "a.datec,a.id", $param, "", 'align="center"', $sortfield, $sortorder);
877 $totalarray['nbfield']++;
878}
879if (!empty($arrayfields['a.tms']['checked'])) {
880 print_liste_field_titre($arrayfields['a.tms']['label'], $_SERVER["PHP_SELF"], "a.tms,a.id", $param, "", 'align="center"', $sortfield, $sortorder);
881 $totalarray['nbfield']++;
882}
883
884if (!empty($arrayfields['a.percent']['checked'])) {
885 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "a.percent", $param, "", 'align="center"', $sortfield, $sortorder);
886 $totalarray['nbfield']++;
887}
888if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
889 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
890}
891$totalarray['nbfield']++;
892print "</tr>\n";
893
894$now = dol_now();
895$delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
896$today_start_time = dol_mktime(0, 0, 0, date('m', $now), date('d', $now), date('Y', $now));
897
898require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
899$caction = new CActionComm($db);
900$arraylist = $caction->liste_array(1, 'code', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : 0), '', 1);
901$contactListCache = array();
902
903// Loop on record
904// --------------------------------------------------------------------
905$i = 0;
906//$savnbfield = $totalarray['nbfield'];
907//$totalarray['nbfield'] = 0;
908$imaxinloop = ($limit ? min($num, $limit) : $num);
909$cache_user_list = array();
910while ($i < $imaxinloop) {
911 $obj = $db->fetch_object($resql);
912 if (empty($obj)) {
913 break; // Should not happen
914 }
915
916 // Store properties in $object
917 $object->setVarsFromFetchObj($obj);
918
919 // Discard auto action if option is on
920 if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO) && $obj->type_code == 'AC_OTH_AUTO') {
921 $i++;
922 continue;
923 }
924
925 $actionstatic->id = $obj->id;
926 $actionstatic->ref = $obj->id;
927 $actionstatic->code = $obj->code;
928 $actionstatic->type_code = $obj->type_code;
929 $actionstatic->type_label = $obj->type_label;
930 $actionstatic->type_picto = $obj->type_picto;
931 $actionstatic->type_color = $obj->type_color;
932 $actionstatic->label = $obj->label;
933 $actionstatic->location = $obj->location;
934 $actionstatic->note_private = dol_htmlentitiesbr($obj->note);
935 $actionstatic->datep = $db->jdate($obj->dp);
936 $actionstatic->percentage = $obj->percent;
937 $actionstatic->authorid = $obj->fk_user_author;
938 $actionstatic->userownerid = $obj->fk_user_action;
939
940 // Initialize $this->userassigned && this->socpeopleassigned array && this->userownerid
941 // but only if we need it
942 if (!empty($arrayfields['a.fk_contact']['checked'])) {
943 $actionstatic->fetchResources();
944 }
945
946 // cache of user list (owners)
947 if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) {
948 $userstatic = new User($db);
949 $res = $userstatic->fetch($obj->fk_user_action);
950 if ($res > 0) {
951 $cache_user_list[$obj->fk_user_action] = $userstatic;
952 }
953 }
954
955 // get event style for user owner
956 $event_owner_style = '';
957 // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
958 if ($cache_user_list[$obj->fk_user_action]->color != '') {
959 $event_owner_style .= 'border-left: #' . $cache_user_list[$obj->fk_user_action]->color . ' 5px solid;';
960 }
961
962 // get event style for start and end date
963 $event_more_class = '';
964 $event_start_date_css = '';
965 $event_end_date_css = '';
966 $event_start_date_time = $actionstatic->datep;
967 if ($event_start_date_time > $now) {
968 // future event
969 $event_more_class = 'event-future';
970 $event_start_date_css = $event_end_date_css = $event_more_class;
971 } else {
972 if ($obj->fulldayevent == 1) {
973 $today_start_date_time = $today_start_time;
974 } else {
975 $today_start_date_time = $now;
976 }
977
978 // check event end date
979 $event_end_date_time = $db->jdate($obj->dp2);
980 if ($event_end_date_time != null && $event_end_date_time < $today_start_date_time) {
981 // past event
982 $event_more_class = 'event-past';
983 } elseif ($event_end_date_time == null && $event_start_date_time < $today_start_date_time) {
984 // past event
985 $event_more_class = 'event-past';
986 } else {
987 // current event
988 $event_more_class = 'event-current';
989 }
990 $event_start_date_css = $event_end_date_css = $event_more_class;
991 }
992 $event_start_date_css = $event_end_date_css = $event_more_class;
993
994 print '<tr class="oddeven' . ($event_more_class != '' ? ' '.$event_more_class : '') . '">';
995 // Action column
996 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
997 print '<td class="nowrap center">';
998 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
999 $selected = 0;
1000 if (in_array($obj->id, $arrayofselected)) {
1001 $selected = 1;
1002 }
1003 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
1004 }
1005 print '</td>';
1006 }
1007 // Ref
1008 if (!empty($arrayfields['a.id']['checked'])) {
1009 print '<td class="nowraponall">';
1010 print $actionstatic->getNomUrl(1, -1);
1011 print '</td>';
1012 }
1013
1014 // User owner
1015 if (!empty($arrayfields['owner']['checked'])) {
1016 //print '<td class="tdoverflowmax150"' . ($event_owner_style != '' ? ' style="'.$event_owner_style.'"' : '') . '>';
1017 print '<td class="tdoverflowmax150">';
1018 if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) {
1019 $userstatic = new User($db);
1020 $res = $userstatic->fetch($obj->fk_user_action);
1021 if ($res > 0) {
1022 $cache_user_list[$obj->fk_user_action] = $userstatic;
1023 }
1024 }
1025 if (isset($cache_user_list[$obj->fk_user_action])) {
1026 print $cache_user_list[$obj->fk_user_action]->getNomUrl(-1);
1027 } else {
1028 print '&nbsp;';
1029 }
1030 print '</td>';
1031 }
1032
1033 // Type
1034 if (!empty($arrayfields['c.libelle']['checked'])) {
1035 print '<td class="nowraponall">';
1036 print $actionstatic->getTypePicto();
1037 $labeltype = $obj->type_code;
1038 if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($arraylist[$labeltype])) {
1039 $labeltype = 'AC_OTH';
1040 }
1041 if (preg_match('/^TICKET_MSG/', $actionstatic->code)) {
1042 $labeltype = $langs->trans("Message");
1043 } else {
1044 if (!empty($arraylist[$labeltype])) {
1045 $labeltype = $arraylist[$labeltype];
1046 }
1047 if ($obj->type_code == 'AC_OTH_AUTO' && ($obj->type_code != $obj->code) && $labeltype && !empty($arraylist[$obj->code])) {
1048 $labeltype .= ' - '.$arraylist[$obj->code]; // Use code in priority on type_code
1049 }
1050 }
1051 print dol_trunc($labeltype, 28);
1052 print '</td>';
1053 }
1054
1055 // Label
1056 if (!empty($arrayfields['a.label']['checked'])) {
1057 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($actionstatic->label).'">';
1058 print $actionstatic->label;
1059 print '</td>';
1060 }
1061
1062 // Description
1063 if (!empty($arrayfields['a.note']['checked'])) {
1064 print '<td class="tdoverflowonsmartphone">';
1065 $text = dolGetFirstLineOfText(dol_string_nohtmltag($actionstatic->note_private, 1));
1066 print $form->textwithtooltip(dol_trunc($text, 48), $actionstatic->note_private);
1067 print '</td>';
1068 }
1069
1070 $formatToUse = $obj->fulldayevent ? 'day' : 'dayhour';
1071
1072 // Start date
1073 if (!empty($arrayfields['a.datep']['checked'])) {
1074 print '<td class="center nowraponall'.($event_start_date_css ? ' '.$event_start_date_css : '').'"><span>';
1075 if (empty($obj->fulldayevent)) {
1076 print dol_print_date($db->jdate($obj->dp), $formatToUse, 'tzuserrel');
1077 } else {
1078 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
1079 print dol_print_date($db->jdate($obj->dp), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel'));
1080 }
1081 print '</span>';
1082 $late = 0;
1083 if ($actionstatic->hasDelay() && $actionstatic->percentage >= 0 && $actionstatic->percentage < 100 ) {
1084 $late = 1;
1085 }
1086 if ($late) {
1087 print img_warning($langs->trans("Late")).' ';
1088 }
1089 print '</td>';
1090 }
1091
1092 // End date
1093 if (!empty($arrayfields['a.datep2']['checked'])) {
1094 print '<td class="center nowraponall'.($event_end_date_css ? ' '.$event_end_date_css : '').'"><span>';
1095 if (empty($obj->fulldayevent)) {
1096 print dol_print_date($db->jdate($obj->dp2), $formatToUse, 'tzuserrel');
1097 } else {
1098 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
1099 print dol_print_date($db->jdate($obj->dp2), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel'));
1100 }
1101 print '</span>';
1102 print '</td>';
1103 }
1104
1105 // Third party
1106 if (!empty($arrayfields['s.nom']['checked'])) {
1107 print '<td class="tdoverflowmax150">';
1108 if ($obj->socid > 0) {
1109 $societestatic->id = $obj->socid;
1110 $societestatic->client = $obj->client;
1111 $societestatic->name = $obj->societe;
1112 $societestatic->email = $obj->socemail;
1113
1114 print $societestatic->getNomUrl(1, '', 28);
1115 } else {
1116 print '&nbsp;';
1117 }
1118 print '</td>';
1119 }
1120
1121 // Contact
1122 if (!empty($arrayfields['a.fk_contact']['checked'])) {
1123 print '<td class="tdoverflowmax100">';
1124
1125 if (!empty($actionstatic->socpeopleassigned)) {
1126 $contactList = array();
1127 foreach ($actionstatic->socpeopleassigned as $socpeopleassigned) {
1128 if (!isset($contactListCache[$socpeopleassigned['id']])) {
1129 // if no cache found we fetch it
1130 $contact = new Contact($db);
1131 if ($contact->fetch($socpeopleassigned['id']) > 0) {
1132 $contactListCache[$socpeopleassigned['id']] = $contact->getNomUrl(1, '', 0);
1133 $contactList[] = $contact->getNomUrl(1, '', 0);
1134 }
1135 } else {
1136 // use cache
1137 $contactList[] = $contactListCache[$socpeopleassigned['id']];
1138 }
1139 }
1140 if (!empty($contactList)) {
1141 print implode(', ', $contactList);
1142 }
1143 } elseif ($obj->fk_contact > 0) { //keep for retrocompatibility with faraway event
1144 $contactstatic->id = $obj->fk_contact;
1145 $contactstatic->email = $obj->email;
1146 $contactstatic->lastname = $obj->lastname;
1147 $contactstatic->firstname = $obj->firstname;
1148 $contactstatic->phone_pro = $obj->phone_pro;
1149 $contactstatic->phone_mobile = $obj->phone_mobile;
1150 $contactstatic->phone_perso = $obj->phone_perso;
1151 $contactstatic->country_id = $obj->country_id;
1152 print $contactstatic->getNomUrl(1, '', 0);
1153 } else {
1154 print "&nbsp;";
1155 }
1156 print '</td>';
1157 }
1158
1159 // Linked object
1160 if (!empty($arrayfields['a.fk_element']['checked'])) {
1161 print '<td class="tdoverflowmax150">';
1162 //var_dump($obj->fkelement.' '.$obj->elementtype);
1163 if ($obj->fk_element > 0 && !empty($obj->elementtype)) {
1164 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1165 print dolGetElementUrl($obj->fk_element, $obj->elementtype, 1);
1166 } else {
1167 print "&nbsp;";
1168 }
1169 print '</td>';
1170 }
1171
1172 // Extra fields
1173 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1174 // Fields from hook
1175 $parameters = array('arrayfields'=>$arrayfields, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
1176 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1177 print $hookmanager->resPrint;
1178
1179 // Date creation
1180 if (!empty($arrayfields['a.datec']['checked'])) {
1181 // Status/Percent
1182 print '<td align="center" class="nowrap">'.dol_print_date($db->jdate($obj->datec), 'dayhour', 'tzuserrel').'</td>';
1183 }
1184 // Date update
1185 if (!empty($arrayfields['a.tms']['checked'])) {
1186 print '<td align="center" class="nowrap">'.dol_print_date($db->jdate($obj->datem), 'dayhour', 'tzuserrel').'</td>';
1187 }
1188 if (!empty($arrayfields['a.percent']['checked'])) {
1189 // Status/Percent
1190 $datep = $db->jdate($obj->dp);
1191 print '<td align="center" class="nowrap">'.$actionstatic->LibStatut($obj->percent, 5, 0, $datep).'</td>';
1192 }
1193 // Action column
1194 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1195 print '<td class="nowrap center">';
1196 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1197 $selected = 0;
1198 if (in_array($obj->id, $arrayofselected)) {
1199 $selected = 1;
1200 }
1201 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
1202 }
1203 print '</td>';
1204 }
1205
1206 print '</tr>'."\n";
1207
1208 $i++;
1209}
1210// If no record found
1211if ($num == 0) {
1212 print '<tr><td colspan="'.$totalarray['nbfield'].'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1213}
1214
1215
1216print '</table>'."\n";
1217print '</div>'."\n";
1218
1219print '</form>'."\n";
1220
1221$db->free($resql);
1222
1223// End of page
1224llxFooter();
1225$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.