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