dolibarr 20.0.2
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', '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 technical object to manage hooks of page. Note that conf->hooks_modules contains 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 = '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 (!$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, 0, $filtert, 0, $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' ? ' 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, '', $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, 0, $filtert, 0, $pid, $socid, $action, -1, $actioncode, $usergroup, '', $resourceid, $search_categ_cus);
762print '</div>';
763
764print '<div class="div-table-responsive">';
765print '<table class="tagtable liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
766
767print '<tr class="liste_titre_filter">';
768// Action column
769if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
770 print '<td class="liste_titre" align="middle">';
771 $searchpicto = $form->showFilterButtons('left');
772 print $searchpicto;
773 print '</td>';
774}
775if (!empty($arrayfields['a.id']['checked'])) {
776 print '<td class="liste_titre"><input type="text" class="maxwidth50" name="search_id" value="'.$search_id.'"></td>';
777}
778if (!empty($arrayfields['owner']['checked'])) {
779 print '<td class="liste_titre"></td>';
780}
781if (!empty($arrayfields['c.libelle']['checked'])) {
782 print '<td class="liste_titre"></td>';
783}
784if (!empty($arrayfields['a.label']['checked'])) {
785 print '<td class="liste_titre"><input type="text" class="maxwidth75" name="search_title" value="'.$search_title.'"></td>';
786}
787if (!empty($arrayfields['a.note']['checked'])) {
788 print '<td class="liste_titre"><input type="text" class="maxwidth75" name="search_note" value="'.$search_note.'"></td>';
789}
790if (!empty($arrayfields['a.datep']['checked'])) {
791 print '<td class="liste_titre nowraponall" align="center">';
792 print '<div class="nowrap">';
793 print $form->selectDate($datestart_dtstart, 'datestart_dtstart', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'), 'tzuserrel');
794 print '</div>';
795 print '<div class="nowrap">';
796 print $form->selectDate($datestart_dtend, 'datestart_dtend', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('To'), 'tzuserrel');
797 print '</div>';
798 print '</td>';
799}
800if (!empty($arrayfields['a.datep2']['checked'])) {
801 print '<td class="liste_titre nowraponall" align="center">';
802 print '<div class="nowrap">';
803 print $form->selectDate($dateend_dtstart, 'dateend_dtstart', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'), 'tzuserrel');
804 print '</div>';
805 print '<div class="nowrap">';
806 print $form->selectDate($dateend_dtend, 'dateend_dtend', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('To'), 'tzuserrel');
807 print '</div>';
808 print '</td>';
809}
810if (!empty($arrayfields['s.nom']['checked'])) {
811 print '<td class="liste_titre"></td>';
812}
813if (!empty($arrayfields['a.fk_contact']['checked'])) {
814 print '<td class="liste_titre"></td>';
815}
816if (!empty($arrayfields['a.fk_element']['checked'])) {
817 print '<td class="liste_titre"></td>';
818}
819
820// Extra fields
821include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
822
823// Fields from hook
824$parameters = array('arrayfields' => $arrayfields);
825$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
826print $hookmanager->resPrint;
827
828if (!empty($arrayfields['a.datec']['checked'])) {
829 print '<td class="liste_titre"></td>';
830}
831if (!empty($arrayfields['a.tms']['checked'])) {
832 print '<td class="liste_titre"></td>';
833}
834if (!empty($arrayfields['a.percent']['checked'])) {
835 print '<td class="liste_titre center parentonrightofpage">';
836 $formactions->form_select_status_action('formaction', $search_status, 1, 'search_status', 1, 2, 'search_status width100 onrightofpage');
837 print '</td>';
838}
839// Action column
840if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
841 print '<td class="liste_titre center">';
842 $searchpicto = $form->showFilterButtons();
843 print $searchpicto;
844 print '</td>';
845}
846print '</tr>'."\n";
847
848$totalarray = array();
849$totalarray['nbfield'] = 0;
850
851// Fields title label
852// --------------------------------------------------------------------
853print '<tr class="liste_titre">';
854if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
855 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch ');
856 $totalarray['nbfield']++;
857}
858if (!empty($arrayfields['a.id']['checked'])) {
859 print_liste_field_titre($arrayfields['a.id']['label'], $_SERVER["PHP_SELF"], "a.id", $param, "", "", $sortfield, $sortorder);
860 $totalarray['nbfield']++;
861}
862if (!empty($arrayfields['owner']['checked'])) {
863 print_liste_field_titre($arrayfields['owner']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
864 $totalarray['nbfield']++;
865}
866if (!empty($arrayfields['c.libelle']['checked'])) {
867 print_liste_field_titre($arrayfields['c.libelle']['label'], $_SERVER["PHP_SELF"], "c.libelle", $param, "", "", $sortfield, $sortorder);
868 $totalarray['nbfield']++;
869}
870if (!empty($arrayfields['a.label']['checked'])) {
871 print_liste_field_titre($arrayfields['a.label']['label'], $_SERVER["PHP_SELF"], "a.label", $param, "", "", $sortfield, $sortorder);
872 $totalarray['nbfield']++;
873}
874if (!empty($arrayfields['a.note']['checked'])) {
875 print_liste_field_titre($arrayfields['a.note']['label'], $_SERVER["PHP_SELF"], "a.note", $param, "", "", $sortfield, $sortorder);
876 $totalarray['nbfield']++;
877}
878//if (!empty($conf->global->AGENDA_USE_EVENT_TYPE))
879if (!empty($arrayfields['a.datep']['checked'])) {
880 print_liste_field_titre($arrayfields['a.datep']['label'], $_SERVER["PHP_SELF"], "a.datep,a.id", $param, '', '', $sortfield, $sortorder, 'center ');
881 $totalarray['nbfield']++;
882}
883if (!empty($arrayfields['a.datep2']['checked'])) {
884 print_liste_field_titre($arrayfields['a.datep2']['label'], $_SERVER["PHP_SELF"], "a.datep2", $param, '', '', $sortfield, $sortorder, 'center ');
885 $totalarray['nbfield']++;
886}
887if (!empty($arrayfields['s.nom']['checked'])) {
888 print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"], "s.nom", $param, "", "", $sortfield, $sortorder);
889 $totalarray['nbfield']++;
890}
891if (!empty($arrayfields['a.fk_contact']['checked'])) {
892 print_liste_field_titre($arrayfields['a.fk_contact']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
893 $totalarray['nbfield']++;
894}
895if (!empty($arrayfields['a.fk_element']['checked'])) {
896 print_liste_field_titre($arrayfields['a.fk_element']['label'], $_SERVER["PHP_SELF"], "", $param, "", "", $sortfield, $sortorder);
897 $totalarray['nbfield']++;
898}
899// Extra fields
900include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
901// Hook fields
902$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
903$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
904print $hookmanager->resPrint;
905
906if (!empty($arrayfields['a.datec']['checked'])) {
907 print_liste_field_titre($arrayfields['a.datec']['label'], $_SERVER["PHP_SELF"], "a.datec,a.id", $param, "", '', $sortfield, $sortorder, 'center ');
908 $totalarray['nbfield']++;
909}
910if (!empty($arrayfields['a.tms']['checked'])) {
911 print_liste_field_titre($arrayfields['a.tms']['label'], $_SERVER["PHP_SELF"], "a.tms,a.id", $param, "", '', $sortfield, $sortorder, 'center ');
912 $totalarray['nbfield']++;
913}
914// Status
915if (!empty($arrayfields['a.percent']['checked'])) {
916 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "a.percent", $param, "", '', $sortfield, $sortorder, 'center ');
917 $totalarray['nbfield']++;
918}
919if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
920 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
921 $totalarray['nbfield']++;
922}
923print "</tr>\n";
924
925$now = dol_now();
926$delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
927$today_start_time = dol_mktime(0, 0, 0, date('m', $now), date('d', $now), date('Y', $now));
928
929require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
930$caction = new CActionComm($db);
931$arraylist = $caction->liste_array(1, 'code', '', (!getDolGlobalString('AGENDA_USE_EVENT_TYPE') ? 1 : 0), '', 1);
932$contactListCache = array();
933
934// Loop on record
935// --------------------------------------------------------------------
936$i = 0;
937//$savnbfield = $totalarray['nbfield'];
938//$totalarray['nbfield'] = 0;
939$imaxinloop = ($limit ? min($num, $limit) : $num);
940$cache_user_list = array();
941while ($i < $imaxinloop) {
942 $obj = $db->fetch_object($resql);
943 if (empty($obj)) {
944 break; // Should not happen
945 }
946
947 // Store properties in $object
948 $object->setVarsFromFetchObj($obj);
949
950 // Discard auto action if option is on
951 if (getDolGlobalString('AGENDA_ALWAYS_HIDE_AUTO') && $obj->type_code == 'AC_OTH_AUTO') {
952 $i++;
953 continue;
954 }
955
956 $actionstatic->id = $obj->id;
957 $actionstatic->ref = $obj->id;
958 $actionstatic->code = $obj->code;
959 $actionstatic->type_code = $obj->type_code;
960 $actionstatic->type_label = $obj->type_label;
961 $actionstatic->type_picto = $obj->type_picto;
962 $actionstatic->type_color = $obj->type_color;
963 $actionstatic->label = $obj->label;
964 $actionstatic->location = $obj->location;
965 $actionstatic->note_private = dol_htmlentitiesbr($obj->note);
966 $actionstatic->datep = $db->jdate($obj->dp);
967 $actionstatic->percentage = $obj->percent;
968 $actionstatic->authorid = $obj->fk_user_author;
969 $actionstatic->userownerid = $obj->fk_user_action;
970
971 // Initialize $this->userassigned && this->socpeopleassigned array && this->userownerid
972 // but only if we need it
973 if (!empty($arrayfields['a.fk_contact']['checked'])) {
974 $actionstatic->fetchResources();
975 }
976
977 // cache of user list (owners)
978 if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) {
979 $userstatic = new User($db);
980 $res = $userstatic->fetch($obj->fk_user_action);
981 if ($res > 0) {
982 $cache_user_list[$obj->fk_user_action] = $userstatic;
983 }
984 }
985
986 // get event style for user owner
987 $event_owner_style = '';
988 // We decide to choose color of owner of event (event->userownerid is user id of owner, event->userassigned contains all users assigned to event)
989 if ($obj->fk_user_action > 0 && $cache_user_list[$obj->fk_user_action]->color != '') {
990 $event_owner_style .= 'border-left: #' . $cache_user_list[$obj->fk_user_action]->color . ' 5px solid;';
991 }
992
993 // get event style for start and end date
994 $event_more_class = '';
995 $event_start_date_css = '';
996 $event_end_date_css = '';
997 $event_start_date_time = $actionstatic->datep;
998 if ($event_start_date_time > $now) {
999 // future event
1000 $event_more_class = 'event-future';
1001 $event_start_date_css = $event_end_date_css = $event_more_class;
1002 } else {
1003 if ($obj->fulldayevent == 1) {
1004 $today_start_date_time = $today_start_time;
1005 } else {
1006 $today_start_date_time = $now;
1007 }
1008
1009 // check event end date
1010 $event_end_date_time = $db->jdate($obj->dp2);
1011 if ($event_end_date_time != null && $event_end_date_time < $today_start_date_time) {
1012 // past event
1013 $event_more_class = 'event-past';
1014 } elseif ($event_end_date_time == null && $event_start_date_time < $today_start_date_time) {
1015 // past event
1016 $event_more_class = 'event-past';
1017 } else {
1018 // current event
1019 $event_more_class = 'event-current';
1020 }
1021 $event_start_date_css = $event_end_date_css = $event_more_class;
1022 }
1023 $event_start_date_css = $event_end_date_css = $event_more_class;
1024
1025 print '<tr class="oddeven' . ($event_more_class != '' ? ' '.$event_more_class : '') . '">';
1026 // Action column
1027 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1028 print '<td class="nowrap center">';
1029 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1030 $selected = 0;
1031 if (in_array($obj->id, $arrayofselected)) {
1032 $selected = 1;
1033 }
1034 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
1035 }
1036 print '</td>';
1037 }
1038 // Ref
1039 if (!empty($arrayfields['a.id']['checked'])) {
1040 print '<td class="nowraponall">';
1041 print $actionstatic->getNomUrl(1, -1);
1042 print '</td>';
1043 }
1044
1045 // User owner
1046 if (!empty($arrayfields['owner']['checked'])) {
1047 //print '<td class="tdoverflowmax150"' . ($event_owner_style != '' ? ' style="'.$event_owner_style.'"' : '') . '>';
1048 print '<td class="tdoverflowmax150">';
1049 if ($obj->fk_user_action > 0 && !isset($cache_user_list[$obj->fk_user_action])) {
1050 $userstatic = new User($db);
1051 $res = $userstatic->fetch($obj->fk_user_action);
1052 if ($res > 0) {
1053 $cache_user_list[$obj->fk_user_action] = $userstatic;
1054 }
1055 }
1056 if (isset($cache_user_list[$obj->fk_user_action])) {
1057 print $cache_user_list[$obj->fk_user_action]->getNomUrl(-1);
1058 } else {
1059 print '&nbsp;';
1060 }
1061 print '</td>';
1062 }
1063
1064 // Type
1065 if (!empty($arrayfields['c.libelle']['checked'])) {
1066 print '<td class="nowraponall">';
1067 print $actionstatic->getTypePicto();
1068 $labeltype = $obj->type_code;
1069 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
1070 $labeltype = 'AC_OTH';
1071 }
1072 if (!empty($actionstatic->code) && preg_match('/^TICKET_MSG/', $actionstatic->code)) {
1073 $labeltype = $langs->trans("Message");
1074 } else {
1075 if (!empty($arraylist[$labeltype])) {
1076 $labeltype = $arraylist[$labeltype];
1077 }
1078 if ($obj->type_code == 'AC_OTH_AUTO' && ($obj->type_code != $obj->code) && $labeltype && !empty($arraylist[$obj->code])) {
1079 $labeltype .= ' - '.$arraylist[$obj->code]; // Use code in priority on type_code
1080 }
1081 }
1082 print dol_trunc($labeltype, 28);
1083 print '</td>';
1084 }
1085
1086 // Label
1087 if (!empty($arrayfields['a.label']['checked'])) {
1088 print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($actionstatic->label).'">';
1089 print $actionstatic->label;
1090 print '</td>';
1091 }
1092
1093 // Description
1094 if (!empty($arrayfields['a.note']['checked'])) {
1095 $text = dolGetFirstLineOfText(dol_string_nohtmltag($actionstatic->note_private, 1));
1096 print '<td class="tdoverflow200" title="'.dol_escape_htmltag($text).'">';
1097 print $form->textwithtooltip(dol_trunc($text, 48), $actionstatic->note_private);
1098 print '</td>';
1099 }
1100
1101 $formatToUse = $obj->fulldayevent ? 'day' : 'dayhour';
1102
1103 // Start date
1104 if (!empty($arrayfields['a.datep']['checked'])) {
1105 print '<td class="center nowraponall'.($event_start_date_css ? ' '.$event_start_date_css : '').'"><span>';
1106 if (empty($obj->fulldayevent)) {
1107 print dol_print_date($db->jdate($obj->dp), $formatToUse, 'tzuserrel');
1108 } else {
1109 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
1110 print dol_print_date($db->jdate($obj->dp), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel'));
1111 }
1112 print '</span>';
1113 $late = 0;
1114 if ($actionstatic->hasDelay() && $actionstatic->percentage >= 0 && $actionstatic->percentage < 100) {
1115 $late = 1;
1116 }
1117 if ($late) {
1118 print img_warning($langs->trans("Late")).' ';
1119 }
1120 print '</td>';
1121 }
1122
1123 // End date
1124 if (!empty($arrayfields['a.datep2']['checked'])) {
1125 print '<td class="center nowraponall'.($event_end_date_css ? ' '.$event_end_date_css : '').'"><span>';
1126 if (empty($obj->fulldayevent)) {
1127 print dol_print_date($db->jdate($obj->dp2), $formatToUse, 'tzuserrel');
1128 } else {
1129 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
1130 print dol_print_date($db->jdate($obj->dp2), $formatToUse, ($tzforfullday ? $tzforfullday : 'tzuserrel'));
1131 }
1132 print '</span>';
1133 print '</td>';
1134 }
1135
1136 // Third party
1137 if (!empty($arrayfields['s.nom']['checked'])) {
1138 print '<td class="tdoverflowmax150">';
1139 if ($obj->socid > 0) {
1140 $societestatic->id = $obj->socid;
1141 $societestatic->client = $obj->client;
1142 $societestatic->name = $obj->societe;
1143 $societestatic->email = $obj->socemail;
1144
1145 print $societestatic->getNomUrl(1, '', 28);
1146 } else {
1147 print '&nbsp;';
1148 }
1149 print '</td>';
1150 }
1151
1152 // Contact
1153 if (!empty($arrayfields['a.fk_contact']['checked'])) {
1154 print '<td class="tdoverflowmax100">';
1155
1156 if (!empty($actionstatic->socpeopleassigned)) {
1157 $contactList = array();
1158 foreach ($actionstatic->socpeopleassigned as $socpeopleassigned) {
1159 if (!isset($contactListCache[$socpeopleassigned['id']])) {
1160 // if no cache found we fetch it
1161 $contact = new Contact($db);
1162 if ($contact->fetch($socpeopleassigned['id']) > 0) {
1163 $contactListCache[$socpeopleassigned['id']] = $contact->getNomUrl(1, '', 0);
1164 $contactList[] = $contact->getNomUrl(1, '', 0);
1165 }
1166 } else {
1167 // use cache
1168 $contactList[] = $contactListCache[$socpeopleassigned['id']];
1169 }
1170 }
1171 if (!empty($contactList)) {
1172 print implode(', ', $contactList);
1173 }
1174 } elseif ($obj->fk_contact > 0) { //keep for retrocompatibility with faraway event
1175 $contactstatic->id = $obj->fk_contact;
1176 $contactstatic->email = $obj->email;
1177 $contactstatic->lastname = $obj->lastname;
1178 $contactstatic->firstname = $obj->firstname;
1179 $contactstatic->phone_pro = $obj->phone_pro;
1180 $contactstatic->phone_mobile = $obj->phone_mobile;
1181 $contactstatic->phone_perso = $obj->phone_perso;
1182 $contactstatic->country_id = $obj->country_id;
1183 print $contactstatic->getNomUrl(1, '', 0);
1184 } else {
1185 print "&nbsp;";
1186 }
1187 print '</td>';
1188 }
1189
1190 // Linked object
1191 if (!empty($arrayfields['a.fk_element']['checked'])) {
1192 print '<td class="tdoverflowmax150">';
1193 //var_dump($obj->fkelement.' '.$obj->elementtype);
1194 if ($obj->fk_element > 0 && !empty($obj->elementtype)) {
1195 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1196 print dolGetElementUrl($obj->fk_element, $obj->elementtype, 1);
1197 } else {
1198 print "&nbsp;";
1199 }
1200 print '</td>';
1201 }
1202
1203 // Extra fields
1204 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1205 // Fields from hook
1206 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1207 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1208 print $hookmanager->resPrint;
1209
1210 // Date creation
1211 if (!empty($arrayfields['a.datec']['checked'])) {
1212 // Status/Percent
1213 print '<td align="center" class="nowrap">'.dol_print_date($db->jdate($obj->datec), 'dayhour', 'tzuserrel').'</td>';
1214 }
1215 // Date update
1216 if (!empty($arrayfields['a.tms']['checked'])) {
1217 print '<td align="center" class="nowrap">'.dol_print_date($db->jdate($obj->datem), 'dayhour', 'tzuserrel').'</td>';
1218 }
1219 if (!empty($arrayfields['a.percent']['checked'])) {
1220 // Status/Percent
1221 $datep = $db->jdate($obj->dp);
1222 print '<td align="center" class="nowrap">'.$actionstatic->LibStatut($obj->percent, 5, 0, $datep).'</td>';
1223 }
1224 // Action column
1225 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1226 print '<td class="nowrap center">';
1227 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1228 $selected = 0;
1229 if (in_array($obj->id, $arrayofselected)) {
1230 $selected = 1;
1231 }
1232 print '<input id="cb'.$obj->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->id.'"'.($selected ? ' checked="checked"' : '').'>';
1233 }
1234 print '</td>';
1235 }
1236
1237 print '</tr>'."\n";
1238
1239 $i++;
1240}
1241// If no record found
1242if ($num == 0) {
1243 print '<tr><td colspan="'.$totalarray['nbfield'].'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1244}
1245
1246
1247print '</table>'."\n";
1248print '</div>'."\n";
1249
1250print '</form>'."\n";
1251
1252$db->free($resql);
1253
1254// End of page
1255llxFooter();
1256$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()
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 contact/addresses.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to manage generation of HTML components Only common components must be here.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
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.
print_barre_liste($title, $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.
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.
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 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.