dolibarr  17.0.4
list.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2013-2016 Jean-François FERRY <jfefe@aternatik.fr>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <https://www.gnu.org/licenses/>.
16  */
17 
24 if (!defined('NOREQUIREMENU')) {
25  define('NOREQUIREMENU', '1');
26 }
27 // If there is no need to load and show top and left menu
28 if (!defined("NOLOGIN")) {
29  define("NOLOGIN", '1');
30 }
31 if (!defined('NOIPCHECK')) {
32  define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
33 }
34 if (!defined('NOBROWSERNOTIF')) {
35  define('NOBROWSERNOTIF', '1');
36 }
37 // If this page is public (can be called outside logged session)
38 
39 // For MultiCompany module.
40 // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
41 $entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
42 if (is_numeric($entity)) {
43  define("DOLENTITY", $entity);
44 }
45 
46 // Load Dolibarr environment
47 require '../../main.inc.php';
48 require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php';
49 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php';
50 require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
51 require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php';
52 require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
53 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
54 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
55 
56 // Load translation files required by the page
57 $langs->loadLangs(array("companies", "other", "ticket"));
58 
59 // Get parameters
60 $action = GETPOST('action', 'aZ09');
61 $cancel = GETPOST('cancel', 'aZ09');
62 
63 $track_id = GETPOST('track_id', 'alpha');
64 $email = strtolower(GETPOST('email', 'alpha'));
65 $suffix = "";
66 $moreforfilter = "";
67 
68 if (GETPOST('btn_view_ticket_list')) {
69  unset($_SESSION['track_id_customer']);
70  unset($_SESSION['email_customer']);
71 }
72 if (isset($_SESSION['track_id_customer'])) {
73  $track_id = $_SESSION['track_id_customer'];
74 }
75 if (isset($_SESSION['email_customer'])) {
76  $email = strtolower($_SESSION['email_customer']);
77 }
78 
79 $object = new Ticket($db);
80 
81 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
82 $hookmanager->initHooks(array('ticketpubliclist', 'globalcard'));
83 
84 if (!isModEnabled('ticket')) {
85  httponly_accessforbidden('Module Ticket not enabled');
86 }
87 
88 
89 
90 /*
91  * Actions
92  */
93 
94 if ($cancel) {
95  $backtopage = DOL_URL_ROOT.'/public/ticket/index.php';
96 
97  header("Location: ".$backtopage);
98  exit;
99 }
100 
101 if ($action == "view_ticketlist") {
102  $error = 0;
103  $display_ticket_list = false;
104  if (!strlen($track_id)) {
105  $error++;
106  array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("TicketTrackId")));
107  $action = '';
108  }
109 
110  if (!strlen($email)) {
111  $error++;
112  array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Email")));
113  $action = '';
114  } else {
115  if (!isValidEmail($email)) {
116  $error++;
117  array_push($object->errors, $langs->trans("ErrorEmailOrTrackingInvalid"));
118  $action = '';
119  }
120  }
121 
122  if (!$error) {
123  $ret = $object->fetch('', '', $track_id);
124 
125  if ($ret && $object->id > 0) {
126  // vérifie si l'adresse email est bien dans les contacts du ticket
127  $contacts = $object->liste_contact(-1, 'external');
128  foreach ($contacts as $contact) {
129  if (strtolower($contact['email']) == $email) {
130  $display_ticket_list = true;
131  $_SESSION['email_customer'] = $email;
132  $_SESSION['track_id_customer'] = $track_id;
133  break;
134  } else {
135  $display_ticket_list = false;
136  }
137  }
138  if ($object->fk_soc > 0) {
139  $object->fetch_thirdparty();
140  if ($email == strtolower($object->thirdparty->email)) {
141  $display_ticket_list = true;
142  $_SESSION['email_customer'] = $email;
143  $_SESSION['track_id_customer'] = $track_id;
144  }
145  }
146  if ($object->fk_user_create > 0) {
147  $tmpuser = new User($db);
148  $tmpuser->fetch($object->fk_user_create);
149  if ($email == strtolower($tmpuser->email)) {
150  $display_ticket_list = true;
151  $_SESSION['email_customer'] = $email;
152  $_SESSION['track_id_customer'] = $track_id;
153  }
154  }
155 
156  $emailorigin = strtolower(CMailFile::getValidAddress($object->origin_email, 2));
157  if ($email == $emailorigin) {
158  $display_ticket_list = true;
159  $_SESSION['email_customer'] = $email;
160  $_SESSION['track_id_customer'] = $track_id;
161  }
162  } else {
163  $error++;
164  array_push($object->errors, $langs->trans("ErrorTicketNotFound", $track_id));
165  $action = '';
166  }
167  }
168 
169  if ($error || $errors) {
170  setEventMessages($object->error, $object->errors, 'errors');
171  $action = '';
172  }
173 }
174 
175 /*
176  * View
177  */
178 
179 $form = new Form($db);
180 $user_assign = new User($db);
181 $user_create = new User($db);
182 $formTicket = new FormTicket($db);
183 
184 if (!$conf->global->TICKET_ENABLE_PUBLIC_INTERFACE) {
185  print '<div class="error">'.$langs->trans('TicketPublicInterfaceForbidden').'</div>';
186  $db->close();
187  exit();
188 }
189 
190 $arrayofjs = array();
191 $arrayofcss = array('/ticket/css/styles.css.php');
192 
193 llxHeaderTicket($langs->trans("Tickets"), "", 0, 0, $arrayofjs, $arrayofcss);
194 
195 
196 
197 if ($action == "view_ticketlist") {
198  print '<div class="ticketpublicarealist">';
199 
200  print '<br>';
201  if ($display_ticket_list) {
202  // Filters
203  $search_fk_status = GETPOST("search_fk_status", 'alpha');
204  $search_subject = GETPOST("search_subject", 'alpha');
205  $search_type = GETPOST("search_type", 'alpha');
206  $search_category = GETPOST("search_category", 'alpha');
207  $search_severity = GETPOST("search_severity", 'alpha');
208  $search_fk_user_create = GETPOST("search_fk_user_create", 'int');
209  $search_fk_user_assign = GETPOST("search_fk_user_assign", 'int');
210 
211  // Store current page url
212  $url_page_current = dol_buildpath('/public/ticket/list.php', 1);
213 
214  // Do we click on purge search criteria ?
215  if (GETPOST("button_removefilter_x")) {
216  $search_fk_status = '';
217  $search_subject = '';
218  $search_type = '';
219  $search_category = '';
220  $search_severity = '';
221  $search_fk_user_create = '';
222  $search_fk_user_assign = '';
223  }
224 
225  // fetch optionals attributes and labels
226  $extrafields = new ExtraFields($db);
227  $extrafields->fetch_name_optionals_label($object->table_element);
228 
229  $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
230 
231  $filter = array();
232 
233  $param = '&action=view_ticketlist';
234  if (!empty($entity) && isModEnabled('multicompany')) {
235  $param .= '&entity='.((int) $entity);
236  }
237 
238  $param .= '&token='.newToken();
239 
240  // Definition of fields for list
241  $arrayfields = array(
242  't.datec' => array('label' => $langs->trans("Date"), 'checked' => 1),
243  't.date_read' => array('label' => $langs->trans("TicketReadOn"), 'checked' => 0),
244  't.date_close' => array('label' => $langs->trans("TicketCloseOn"), 'checked' => 0),
245  't.ref' => array('label' => $langs->trans("Ref"), 'checked' => 1),
246  //'t.track_id' => array('label' => $langs->trans("IDTracking"), 'checked' => 0),
247  't.fk_statut' => array('label' => $langs->trans("Status"), 'checked' => 1),
248  't.subject' => array('label' => $langs->trans("Subject"), 'checked' => 1),
249  'type.code' => array('label' => $langs->trans("Type"), 'checked' => 1),
250  'category.code' => array('label' => $langs->trans("Category"), 'checked' => 1),
251  'severity.code' => array('label' => $langs->trans("Severity"), 'checked' => 1),
252  't.progress' => array('label' => $langs->trans("Progression"), 'checked' => 0),
253  //'t.fk_contract' => array('label' => $langs->trans("Contract"), 'checked' => 0),
254  't.fk_user_create' => array('label' => $langs->trans("Author"), 'checked' => 1),
255  't.fk_user_assign' => array('label' => $langs->trans("AssignedTo"), 'checked' => 0),
256 
257  //'t.entity'=>array('label'=>$langs->trans("Entity"), 'checked'=>1, 'enabled'=>(isModEnabled('multicompany') && empty($conf->multicompany->transverse_mode))),
258  //'t.datec' => array('label' => $langs->trans("DateCreation"), 'checked' => 0, 'position' => 500),
259  //'t.tms' => array('label' => $langs->trans("DateModificationShort"), 'checked' => 0, 'position' => 2)
260  //'t.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
261  );
262 
263  // Extra fields
264  if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
265  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
266  if ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate') {
267  $enabled = abs(dol_eval($extrafields->attributes[$object->table_element]['list'][$key], 1, 1, 0));
268  $enabled = (($enabled == 0 || $enabled == 3) ? 0 : $enabled);
269  $arrayfields["ef.".$key] = array('label' => $extrafields->attributes[$object->table_element]['label'][$key], 'checked' => ($extrafields->attributes[$object->table_element]['list'][$key] < 0) ? 0 : 1, 'position' => $extrafields->attributes[$object->table_element]['pos'][$key], 'enabled' => $enabled && $extrafields->attributes[$object->table_element]['perms'][$key]);
270  }
271  }
272  }
273  if (!empty($search_subject)) {
274  $filter['t.subject'] = $search_subject;
275  $param .= '&search_subject='.urlencode($search_subject);
276  }
277  if (!empty($search_type)) {
278  $filter['t.type_code'] = $search_type;
279  $param .= '&search_type='.urlencode($search_type);
280  }
281  if (!empty($search_category)) {
282  $filter['t.category_code'] = $search_category;
283  $param .= '&search_category='.urlencode($search_category);
284  }
285  if (!empty($search_severity)) {
286  $filter['t.severity_code'] = $search_severity;
287  $param .= '&search_severity='.urlencode($search_severity);
288  }
289  if (!empty($search_fk_user_assign)) {
290  // -1 value = all so no filter
291  if ($search_fk_user_assign > 0) {
292  $filter['t.fk_user_assign'] = $search_fk_user_assign;
293  $param .= '&search_fk_user_assign='.urlencode($search_fk_user_assign);
294  }
295  }
296  if (!empty($search_fk_user_create)) {
297  // -1 value = all so no filter
298  if ($search_fk_user_create > 0) {
299  $filter['t.fk_user_create'] = $search_fk_user_create;
300  $param .= '&search_fk_user_create='.urlencode($search_fk_user_create);
301  }
302  }
303  if ((isset($search_fk_status) && $search_fk_status != '') && $search_fk_status != '-1' && $search_fk_status != 'non_closed') {
304  $filter['t.fk_statut'] = $search_fk_status;
305  $param .= '&search_fk_status='.urlencode($search_fk_status);
306  }
307  if (isset($search_fk_status) && $search_fk_status == 'non_closed') {
308  $filter['t.fk_statut'] = array(0, 1, 3, 4, 5, 6);
309  $param .= '&search_fk_status=non_closed';
310  }
311 
312  require DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
313 
314  $sortfield = GETPOST('sortfield', 'aZ09comma');
315  $sortorder = GETPOST('sortorder', 'aZ09comma');
316 
317  if (!$sortfield) {
318  $sortfield = 't.datec';
319  }
320  if (!$sortorder) {
321  $sortorder = 'DESC';
322  }
323 
324  $limit = $conf->liste_limit;
325 
326  $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
327  if (empty($page) || $page == -1) {
328  $page = 0;
329  } // If $page is not defined, or '' or -1
330  $offset = $limit * $page;
331  $pageprev = $page - 1;
332  $pagenext = $page + 1;
333 
334  // Request SQL
335  $sql = "SELECT DISTINCT";
336  $sql .= " t.rowid,";
337  $sql .= " t.ref,";
338  $sql .= " t.track_id,";
339  $sql .= " t.fk_soc,";
340  $sql .= " t.fk_project,";
341  $sql .= " t.origin_email,";
342  $sql .= " t.fk_user_create, uc.lastname as user_create_lastname, uc.firstname as user_create_firstname,";
343  $sql .= " t.fk_user_assign, ua.lastname as user_assign_lastname, ua.firstname as user_assign_firstname,";
344  $sql .= " t.subject,";
345  $sql .= " t.message,";
346  $sql .= " t.fk_statut,";
347  $sql .= " t.resolution,";
348  $sql .= " t.progress,";
349  $sql .= " t.timing,";
350  $sql .= " t.type_code,";
351  $sql .= " t.category_code,";
352  $sql .= " t.severity_code,";
353  $sql .= " t.datec,";
354  $sql .= " t.date_read,";
355  $sql .= " t.date_close,";
356  $sql .= " t.tms,";
357  $sql .= " type.label as type_label, category.label as category_label, severity.label as severity_label";
358  // Add fields for extrafields
359  if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
360  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
361  $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
362  }
363  }
364  $sql .= " FROM ".MAIN_DB_PREFIX."ticket as t";
365  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_type as type ON type.code = t.type_code";
366  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_category as category ON category.code = t.category_code";
367  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_severity as severity ON severity.code = t.severity_code";
368  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc";
369  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as uc ON uc.rowid = t.fk_user_create";
370  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as ua ON ua.rowid = t.fk_user_assign";
371  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."element_contact as ec ON ec.element_id = t.rowid";
372  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_type_contact as tc ON ec.fk_c_type_contact = tc.rowid";
373  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople sp ON ec.fk_socpeople = sp.rowid";
374  if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
375  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."ticket_extrafields as ef on (t.rowid = ef.fk_object)";
376  }
377  $sql .= " WHERE t.entity IN (".getEntity('ticket').")";
378  $sql .= " AND ((tc.source = 'external'";
379  $sql .= " AND tc.element='".$db->escape($object->element)."'";
380  $sql .= " AND tc.active=1";
381  $sql .= " AND sp.email='".$db->escape($_SESSION['email_customer'])."')"; // email found into an external contact
382  $sql .= " OR s.email='".$db->escape($_SESSION['email_customer'])."'"; // or email of the linked company
383  $sql .= " OR t.origin_email='".$db->escape($_SESSION['email_customer'])."')"; // or email of the requester
384  // Manage filter
385  if (!empty($filter)) {
386  foreach ($filter as $key => $value) {
387  if (strpos($key, 'date')) { // To allow $filter['YEAR(s.dated)']=>$year
388  $sql .= " AND ".$key." = '".$db->escape($value)."'";
389  } elseif (($key == 't.fk_user_assign') || ($key == 't.type_code') || ($key == 't.category_code') || ($key == 't.severity_code')) {
390  $sql .= " AND ".$key." = '".$db->escape($value)."'";
391  } elseif ($key == 't.fk_statut') {
392  if (is_array($value) && count($value) > 0) {
393  $sql .= " AND ".$key." IN (".$db->sanitize(implode(',', $value)).")";
394  } else {
395  $sql .= " AND ".$key." = ".((int) $value);
396  }
397  } else {
398  $sql .= " AND ".$key." LIKE '%".$db->escape($value)."%'";
399  }
400  }
401  }
402  //$sql .= " GROUP BY t.track_id";
403  $sql .= $db->order($sortfield, $sortorder);
404 
405  $resql = $db->query($sql);
406  if ($resql) {
407  $num_total = $db->num_rows($resql);
408  if (!empty($limit)) {
409  $sql .= $db->plimit($limit + 1, $offset);
410  }
411 
412  $resql = $db->query($sql);
413  if ($resql) {
414  $num = $db->num_rows($resql);
415 
416  print_barre_liste($langs->trans('TicketList'), $page, 'list.php', $param, $sortfield, $sortorder, '', $num, $num_total, 'ticket');
417 
418  // Search bar
419  print '<form method="POST" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany')?'?entity='.$entity:'').'" id="searchFormList" >'."\n";
420  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
421  print '<input type="hidden" name="token" value="'.newToken().'">';
422  print '<input type="hidden" name="action" value="view_ticketlist">';
423  print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
424  print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
425 
426  $varpage = empty($contextpage) ? $url_page_current : $contextpage;
427  $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
428 
429  // allow to display information before list
430  $parameters=array('arrayfields'=>$arrayfields);
431  $reshook=$hookmanager->executeHooks('printFieldListHeader', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
432  print $hookmanager->resPrint;
433 
434  print '<table class="liste '.($moreforfilter ? "listwithfilterbefore" : "").'">';
435 
436  // Filter bar
437  print '<tr class="liste_titre">';
438 
439  if (!empty($arrayfields['t.datec']['checked'])) {
440  print '<td class="liste_titre"></td>';
441  }
442 
443  if (!empty($arrayfields['t.date_read']['checked'])) {
444  print '<td class="liste_titre"></td>';
445  }
446  if (!empty($arrayfields['t.date_close']['checked'])) {
447  print '<td class="liste_titre"></td>';
448  }
449 
450  if (!empty($arrayfields['t.ref']['checked'])) {
451  print '<td class="liste_titre"></td>';
452  }
453 
454  if (!empty($arrayfields['t.subject']['checked'])) {
455  print '<td class="liste_titre">';
456  print '<input type="text" class="flat maxwidth100" name="search_subject" value="'.$search_subject.'">';
457  print '</td>';
458  }
459 
460  if (!empty($arrayfields['type.code']['checked'])) {
461  print '<td class="liste_titre">';
462  $formTicket->selectTypesTickets($search_type, 'search_type', '', 2, 1, 1, 0, 'maxwidth150');
463  print '</td>';
464  }
465 
466  if (!empty($arrayfields['category.code']['checked'])) {
467  print '<td class="liste_titre">';
468  $formTicket->selectGroupTickets($search_category, 'search_category', 'public=1', 2, 1, 1);
469  print '</td>';
470  }
471 
472  if (!empty($arrayfields['severity.code']['checked'])) {
473  print '<td class="liste_titre">';
474  $formTicket->selectSeveritiesTickets($search_severity, 'search_severity', '', 2, 1, 1);
475  print '</td>';
476  }
477 
478  if (!empty($arrayfields['t.progress']['checked'])) {
479  print '<td class="liste_titre"></td>';
480  }
481 
482  if (!empty($arrayfields['t.fk_user_create']['checked'])) {
483  print '<td class="liste_titre"></td>';
484  }
485 
486  if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
487  print '<td class="liste_titre"></td>';
488  }
489 
490  if (!empty($arrayfields['t.tms']['checked'])) {
491  print '<td class="liste_titre"></td>';
492  }
493 
494  // Extra fields
495  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
496 
497  // Fields from hook
498  $parameters = array('arrayfields'=>$arrayfields);
499  $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
500  print $hookmanager->resPrint;
501 
502  // Status
503  if (!empty($arrayfields['t.fk_statut']['checked'])) {
504  print '<td class="liste_titre">';
505  $selected = ($search_fk_status != "non_closed" ? $search_fk_status : '');
506  //$object->printSelectStatus($selected);
507  print '</td>';
508  }
509 
510  // Action column
511  print '<td class="liste_titre maxwidthsearch">';
512  $searchpicto = $form->showFilterButtons();
513  print $searchpicto;
514  print '</td>';
515  print '</tr>';
516 
517  // Field title
518  print '<tr class="liste_titre">';
519  if (!empty($arrayfields['t.datec']['checked'])) {
520  print_liste_field_titre($arrayfields['t.datec']['label'], $url_page_current, 't.datec', '', $param, '', $sortfield, $sortorder);
521  }
522  if (!empty($arrayfields['t.date_read']['checked'])) {
523  print_liste_field_titre($arrayfields['t.date_read']['label'], $url_page_current, 't.date_read', '', $param, '', $sortfield, $sortorder);
524  }
525  if (!empty($arrayfields['t.date_close']['checked'])) {
526  print_liste_field_titre($arrayfields['t.date_close']['label'], $url_page_current, 't.date_close', '', $param, '', $sortfield, $sortorder);
527  }
528  if (!empty($arrayfields['t.ref']['checked'])) {
529  print_liste_field_titre($arrayfields['t.ref']['label'], $url_page_current, 't.ref', '', $param, '', $sortfield, $sortorder);
530  }
531  if (!empty($arrayfields['t.subject']['checked'])) {
532  print_liste_field_titre($arrayfields['t.subject']['label']);
533  }
534  if (!empty($arrayfields['type.code']['checked'])) {
535  print_liste_field_titre($arrayfields['type.code']['label'], $url_page_current, 'type.code', '', $param, '', $sortfield, $sortorder);
536  }
537  if (!empty($arrayfields['category.code']['checked'])) {
538  print_liste_field_titre($arrayfields['category.code']['label'], $url_page_current, 'category.code', '', $param, '', $sortfield, $sortorder);
539  }
540  if (!empty($arrayfields['severity.code']['checked'])) {
541  print_liste_field_titre($arrayfields['severity.code']['label'], $url_page_current, 'severity.code', '', $param, '', $sortfield, $sortorder);
542  }
543  if (!empty($arrayfields['t.progress']['checked'])) {
544  print_liste_field_titre($arrayfields['t.progress']['label'], $url_page_current, 't.progress', '', $param, '', $sortfield, $sortorder);
545  }
546  if (!empty($arrayfields['t.fk_user_create']['checked'])) {
547  print_liste_field_titre($arrayfields['t.fk_user_create']['label'], $url_page_current, 't.fk_user_create', '', $param, '', $sortfield, $sortorder);
548  }
549  if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
550  print_liste_field_titre($arrayfields['t.fk_user_assign']['label'], $url_page_current, 't.fk_user_assign', '', $param, '', $sortfield, $sortorder);
551  }
552  if (!empty($arrayfields['t.tms']['checked'])) {
553  print_liste_field_titre($arrayfields['t.tms']['label'], $url_page_current, 't.tms', '', $param, '', $sortfield, $sortorder);
554  }
555 
556  // Extra fields
557  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
558 
559  // Hook fields
560  $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
561  $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
562  print $hookmanager->resPrint;
563 
564  if (!empty($arrayfields['t.fk_statut']['checked'])) {
565  print_liste_field_titre($arrayfields['t.fk_statut']['label'], $url_page_current, 't.fk_statut', '', $param, '', $sortfield, $sortorder);
566  }
567  print_liste_field_titre($selectedfields, $url_page_current, "", '', '', 'align="right"', $sortfield, $sortorder, 'center maxwidthsearch ');
568  print '</tr>';
569 
570  while ($obj = $db->fetch_object($resql)) {
571  print '<tr class="oddeven">';
572 
573  // Date ticket
574  if (!empty($arrayfields['t.datec']['checked'])) {
575  print '<td>';
576  print dol_print_date($db->jdate($obj->datec), 'dayhour');
577  print '</td>';
578  }
579 
580  // Date read
581  if (!empty($arrayfields['t.date_read']['checked'])) {
582  print '<td>';
583  print dol_print_date($db->jdate($obj->date_read), 'dayhour');
584  print '</td>';
585  }
586 
587  // Date close
588  if (!empty($arrayfields['t.date_close']['checked'])) {
589  print '<td>';
590  print dol_print_date($db->jdate($obj->date_close), 'dayhour');
591  print '</td>';
592  }
593 
594  // Ref
595  if (!empty($arrayfields['t.ref']['checked'])) {
596  print '<td class="nowraponall">';
597  print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
598  print img_picto('', 'ticket', 'class="paddingrightonly"');
599  print $obj->ref;
600  print '</a>';
601  print '</td>';
602  }
603 
604  // Subject
605  if (!empty($arrayfields['t.subject']['checked'])) {
606  print '<td>';
607  print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
608  print $obj->subject;
609  print '</a>';
610  print '</td>';
611  }
612 
613  // Type
614  if (!empty($arrayfields['type.code']['checked'])) {
615  print '<td>';
616  print $obj->type_label;
617  print '</td>';
618  }
619 
620  // Category
621  if (!empty($arrayfields['category.code']['checked'])) {
622  print '<td>';
623  print $obj->category_label;
624  print '</td>';
625  }
626 
627  // Severity
628  if (!empty($arrayfields['severity.code']['checked'])) {
629  print '<td>';
630  print $obj->severity_label;
631  print '</td>';
632  }
633 
634  // Progression
635  if (!empty($arrayfields['t.progress']['checked'])) {
636  print '<td>';
637  print $obj->progress;
638  print '</td>';
639  }
640 
641  // Message author
642  if (!empty($arrayfields['t.fk_user_create']['checked'])) {
643  print '<td title="'.dol_escape_htmltag($obj->origin_email).'">';
644  if ($obj->fk_user_create > 0) {
645  $user_create->firstname = (!empty($obj->user_create_firstname) ? $obj->user_create_firstname : '');
646  $user_create->name = (!empty($obj->user_create_lastname) ? $obj->user_create_lastname : '');
647  $user_create->id = (!empty($obj->fk_user_create) ? $obj->fk_user_create : '');
648  print $user_create->getFullName($langs);
649  } else {
650  print img_picto('', 'email', 'class="paddingrightonly"');
651  print $langs->trans('Email');
652  }
653  print '</td>';
654  }
655 
656  // Assigned author
657  if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
658  print '<td>';
659  if ($obj->fk_user_assign > 0) {
660  $user_assign->firstname = (!empty($obj->user_assign_firstname) ? $obj->user_assign_firstname : '');
661  $user_assign->lastname = (!empty($obj->user_assign_lastname) ? $obj->user_assign_lastname : '');
662  $user_assign->id = (!empty($obj->fk_user_assign) ? $obj->fk_user_assign : '');
663  print img_picto('', 'user', 'class="paddingrightonly"');
664  print $user_assign->getFullName($langs);
665  }
666  print '</td>';
667  }
668 
669  if (!empty($arrayfields['t.tms']['checked'])) {
670  print '<td>'.dol_print_date($db->jdate($obj->tms), 'dayhour').'</td>';
671  }
672 
673  // Extra fields
674  if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
675  foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
676  if (!empty($arrayfields["ef.".$key]['checked'])) {
677  print '<td';
678  $cssstring = $extrafields->getAlignFlag($key, $object->table_element);
679  if ($cssstring) {
680  print ' class="'.$cssstring.'"';
681  }
682  print '>';
683  $tmpkey = 'options_'.$key;
684  print $extrafields->showOutputField($key, $obj->$tmpkey, '', $object->table_element);
685  print '</td>';
686  }
687  }
688  }
689 
690  // Statut
691  if (!empty($arrayfields['t.fk_statut']['checked'])) {
692  print '<td class="nowraponall">';
693  $object->fk_statut = $obj->fk_statut;
694  print $object->getLibStatut(2);
695  print '</td>';
696  }
697 
698  print '<td></td>';
699 
700  $i++;
701  print '</tr>';
702  }
703 
704  print '</table>';
705  print '</form>';
706 
707  print '<form method="post" id="form_view_ticket" name="form_view_ticket" action="'.dol_buildpath('/public/ticket/view.php', 1).(!empty($entity) && isModEnabled('multicompany')?'?entity='.$entity:'').'" style="display:none;">';
708  print '<input type="hidden" name="token" value="'.newToken().'">';
709  print '<input type="hidden" name="action" value="view_ticket">';
710  print '<input type="hidden" name="btn_view_ticket_list" value="1">';
711  print '<input type="hidden" name="track_id" value="">';
712  print '<input type="hidden" name="email" value="">';
713  print "</form>";
714  print '<script type="text/javascript">
715  function viewticket(ticket_id, email) {
716  var form = $("#form_view_ticket");
717  form.find("input[name=\\"track_id\\"]").val(ticket_id);
718  form.find("input[name=\\"email\\"]").val(email);
719  form.submit();
720  }
721  </script>';
722  }
723  } else {
724  dol_print_error($db);
725  }
726  } else {
727  print '<div class="error">Not Allowed<br><a href="'.$_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'">'.$langs->trans('Back').'</a></div>';
728  }
729 
730  print '</div>';
731 } else {
732  print '<div class="ticketpublicarea">';
733 
734  print '<p class="center opacitymedium">'.$langs->trans("TicketPublicMsgViewLogIn").'</p>';
735  print '<br>';
736 
737  print '<div id="form_view_ticket">';
738  print '<form method="post" name="form_view_ticketlist" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany')?'?entity='.$entity:'').'">';
739  print '<input type="hidden" name="token" value="'.newToken().'">';
740  print '<input type="hidden" name="action" value="view_ticketlist">';
741  //print '<input type="hidden" name="search_fk_status" value="non_closed">';
742 
743  print '<p><label for="track_id" style="display: inline-block; width: 30%; "><span class="fieldrequired">'.$langs->trans("OneOfTicketTrackId").'</span></label>';
744  print '<input size="30" id="track_id" name="track_id" value="'.(GETPOST('track_id', 'alpha') ? GETPOST('track_id', 'alpha') : '').'" />';
745  print '</p>';
746 
747  print '<p><label for="email" style="display: inline-block; width: 30%; "><span class="fieldrequired">'.$langs->trans('Email').'</span></label>';
748  print '<input size="30" id="email" name="email" value="'.(GETPOST('email', 'alpha') ? GETPOST('email', 'alpha') : (!empty($_SESSION['customer_email']) ? $_SESSION['customer_email'] : "")).'" />';
749  print '</p>';
750 
751  print '<p style="text-align: center; margin-top: 1.5em;">';
752  print '<input type="submit" class="button" name="btn_view_ticket_list" value="'.$langs->trans('ViewMyTicketList').'" />';
753  print ' &nbsp; ';
754  print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
755  print "</p>\n";
756 
757  print "</form>\n";
758  print "</div>\n";
759 
760  print "</div>";
761 }
762 
763 // End of page
764 htmlPrintOnlinePaymentFooter($mysoc, $langs, 0, $suffix, $object);
765 
766 llxFooter('', 'public');
767 
768 $db->close();
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
Class to manage standard extra fields.
Class to manage generation of HTML components Only common components must be here.
Class to manage Dolibarr users.
Definition: user.class.php:47
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
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_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_eval($s, $returnvalue=0, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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.
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_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
isModEnabled($module)
Is Dolibarr module enabled.
table tableforfield button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
Definition: style.css.php:843
Class to generate the form for creating a new ticket.
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition: repair.php:122
httponly_accessforbidden($message=1, $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.
llxHeaderTicket($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='')
Show header for public pages.
Definition: ticket.lib.php:216