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