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