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