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