dolibarr 24.0.0-beta
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-2025 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 // vérifie si l'adresse email est bien dans les contacts du ticket
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";
385 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
386 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."ticket_extrafields as ef on (t.rowid = ef.fk_object)";
387 }
388 $sql .= " WHERE t.entity IN (".getEntity('ticket').")";
389 $sql .= " AND ((tc.source = 'external'";
390 $sql .= " AND tc.element = '".$db->escape($object->element)."'";
391 $sql .= " AND tc.active = 1";
392 $sql .= " AND sp.email = '".$db->escape($_SESSION['email_customer'])."')"; // email found into an external contact
393 $sql .= " OR s.email = '".$db->escape($_SESSION['email_customer'])."'"; // or email of the linked company
394 $sql .= " OR t.origin_email = '".$db->escape($_SESSION['email_customer'])."')"; // or email of the requester
395 // Manage filter
396 if (!empty($filter)) {
397 foreach ($filter as $key => $value) {
398 if (strpos($key, 'date')) { // To allow $filter['YEAR(s.dated)']=>$year
399 $sql .= " AND ".$db->sanitize($key)." = '".$db->escape($value)."'";
400 } elseif (($key == 't.fk_user_assign') || ($key == 't.type_code') || ($key == 't.category_code') || ($key == 't.severity_code')) {
401 $sql .= " AND ".$db->sanitize($key)." = '".$db->escape($value)."'";
402 } elseif ($key == 't.fk_statut') {
403 if (is_array($value) && count($value) > 0) {
404 $sql .= " AND ".$db->sanitize($key)." IN (".$db->sanitize(implode(',', $value)).")";
405 } else {
406 $sql .= " AND ".$db->sanitize($key)." = ".((int) $value);
407 }
408 } else {
409 $sql .= " AND ".$db->sanitize($key)." LIKE '%".$db->escape($value)."%'";
410 }
411 }
412 }
413 //$sql .= " GROUP BY t.track_id";
414 $sql .= $db->order($sortfield, $sortorder);
415
416 $resql = $db->query($sql);
417 if ($resql) {
418 $num_total = $db->num_rows($resql);
419 if (!empty($limit)) {
420 $sql .= $db->plimit($limit + 1, $offset);
421 }
422
423 $resql = $db->query($sql);
424 if ($resql) {
425 $num = $db->num_rows($resql);
426
427 $baseurl = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
428
429 $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>';
430
431 print_barre_liste($langs->trans('TicketList'), $page, 'list.php', $param, $sortfield, $sortorder, '', $num, $num_total, 'ticket', 0, $newcardbutton);
432
433 // Search bar
434 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'" id="searchFormList" >'."\n";
435 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
436 print '<input type="hidden" name="token" value="'.newToken().'">';
437 print '<input type="hidden" name="action" value="view_ticketlist">';
438 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
439 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
440
441 $varpage = empty($contextpage) ? $url_page_current : $contextpage;
442 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
443
444 // allow to display information before list
445 $parameters = array('arrayfields' => $arrayfields);
446 $reshook = $hookmanager->executeHooks('printFieldListHeader', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
447 print $hookmanager->resPrint;
448
449 print '<div class="div-table-responsive">';
450 print '<table class="liste '.($moreforfilter ? "listwithfilterbefore" : "").'">';
451
452 // Filter bar
453 print '<tr class="liste_titre">';
454
455 if (!empty($arrayfields['t.datec']['checked'])) {
456 print '<td class="liste_titre"></td>';
457 }
458
459 if (!empty($arrayfields['t.date_read']['checked'])) {
460 print '<td class="liste_titre"></td>';
461 }
462 if (!empty($arrayfields['t.date_close']['checked'])) {
463 print '<td class="liste_titre"></td>';
464 }
465
466 if (!empty($arrayfields['t.ref']['checked'])) {
467 print '<td class="liste_titre"></td>';
468 }
469
470 if (!empty($arrayfields['t.subject']['checked'])) {
471 print '<td class="liste_titre">';
472 print '<input type="text" class="flat maxwidth100" name="search_subject" value="'.$search_subject.'">';
473 print '</td>';
474 }
475
476 if (!empty($arrayfields['type.code']['checked'])) {
477 print '<td class="liste_titre">';
478 $formTicket->selectTypesTickets($search_type, 'search_type', '', 2, 1, 1, 0, 'maxwidth150', 0, 1);
479 print '</td>';
480 }
481
482 if (!empty($arrayfields['category.code']['checked'])) {
483 print '<td class="liste_titre">';
484 $formTicket->selectGroupTickets($search_category, 'search_category', '(public:=:1)', 2, 1, 1, 0, 'maxwidth150');
485 print '</td>';
486 }
487
488 if (!empty($arrayfields['severity.code']['checked'])) {
489 print '<td class="liste_titre">';
490 $formTicket->selectSeveritiesTickets($search_severity, 'search_severity', '', 2, 1, 1, 0, 'maxwidth150');
491 print '</td>';
492 }
493
494 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
495 print '<td class="liste_titre"></td>';
496 }
497
498 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
499 print '<td class="liste_titre"></td>';
500 }
501
502 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
503 print '<td class="liste_titre"></td>';
504 }
505
506 if (!empty($arrayfields['t.tms']['checked'])) {
507 print '<td class="liste_titre"></td>';
508 }
509
510 // Extra fields
511 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
512
513 // Fields from hook
514 $parameters = array('arrayfields' => $arrayfields);
515 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
516 print $hookmanager->resPrint;
517
518 // Status ticket
519 if (!empty($arrayfields['t.fk_statut']['checked'])) {
520 print '<td class="liste_titre">';
521 $selected = ($search_fk_status != "non_closed" ? $search_fk_status : '');
522 //$object->printSelectStatus($selected);
523 print '</td>';
524 }
525
526 // Action column
527 print '<td class="liste_titre maxwidthsearch">';
528 $searchpicto = $form->showFilterButtons();
529 print $searchpicto;
530 print '</td>';
531 print '</tr>';
532
533 // Field title
534 print '<tr class="liste_titre">';
535 if (!empty($arrayfields['t.datec']['checked'])) {
536 print_liste_field_titre($arrayfields['t.datec']['label'], $url_page_current, 't.datec', '', $param, '', $sortfield, $sortorder);
537 }
538 if (!empty($arrayfields['t.date_read']['checked'])) {
539 print_liste_field_titre($arrayfields['t.date_read']['label'], $url_page_current, 't.date_read', '', $param, '', $sortfield, $sortorder);
540 }
541 if (!empty($arrayfields['t.date_close']['checked'])) {
542 print_liste_field_titre($arrayfields['t.date_close']['label'], $url_page_current, 't.date_close', '', $param, '', $sortfield, $sortorder);
543 }
544 if (!empty($arrayfields['t.ref']['checked'])) {
545 print_liste_field_titre($arrayfields['t.ref']['label'], $url_page_current, 't.ref', '', $param, '', $sortfield, $sortorder);
546 }
547 if (!empty($arrayfields['t.subject']['checked'])) {
548 print_liste_field_titre($arrayfields['t.subject']['label']);
549 }
550 if (!empty($arrayfields['type.code']['checked'])) {
551 print_liste_field_titre($arrayfields['type.code']['label'], $url_page_current, 'type.code', '', $param, '', $sortfield, $sortorder);
552 }
553 if (!empty($arrayfields['category.code']['checked'])) {
554 print_liste_field_titre($arrayfields['category.code']['label'], $url_page_current, 'category.code', '', $param, '', $sortfield, $sortorder);
555 }
556 if (!empty($arrayfields['severity.code']['checked'])) {
557 print_liste_field_titre($arrayfields['severity.code']['label'], $url_page_current, 'severity.code', '', $param, '', $sortfield, $sortorder);
558 }
559 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
560 print_liste_field_titre($arrayfields['t.progress']['label'], $url_page_current, 't.progress', '', $param, '', $sortfield, $sortorder);
561 }
562 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
563 print_liste_field_titre($arrayfields['t.fk_user_create']['label'], $url_page_current, 't.fk_user_create', '', $param, '', $sortfield, $sortorder);
564 }
565 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
566 print_liste_field_titre($arrayfields['t.fk_user_assign']['label'], $url_page_current, 't.fk_user_assign', '', $param, '', $sortfield, $sortorder);
567 }
568 if (!empty($arrayfields['t.tms']['checked'])) {
569 print_liste_field_titre($arrayfields['t.tms']['label'], $url_page_current, 't.tms', '', $param, '', $sortfield, $sortorder);
570 }
571
572 // Extra fields
573 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
574
575 // Hook fields
576 $parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
577 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
578 print $hookmanager->resPrint;
579
580 if (!empty($arrayfields['t.fk_statut']['checked'])) {
581 print_liste_field_titre($arrayfields['t.fk_statut']['label'], $url_page_current, 't.fk_statut', '', $param, '', $sortfield, $sortorder);
582 }
583 print_liste_field_titre($selectedfields, $url_page_current, "", '', '', 'align="right"', $sortfield, $sortorder, 'center maxwidthsearch ');
584 print '</tr>';
585
586 $i = 0;
587 while ($obj = $db->fetch_object($resql)) {
588 print '<tr class="oddeven">';
589
590 // Date ticket
591 if (!empty($arrayfields['t.datec']['checked'])) {
592 print '<td>';
593 print dol_print_date($db->jdate($obj->datec), 'dayhour', 'tzuserrel');
594 print '</td>';
595 }
596
597 // Date read
598 if (!empty($arrayfields['t.date_read']['checked'])) {
599 print '<td>';
600 print dol_print_date($db->jdate($obj->date_read), 'dayhour', 'tzuserrel');
601 print '</td>';
602 }
603
604 // Date close
605 if (!empty($arrayfields['t.date_close']['checked'])) {
606 print '<td>';
607 print dol_print_date($db->jdate($obj->date_close), 'dayhour', 'tzuserrel');
608 print '</td>';
609 }
610
611 // Ref
612 if (!empty($arrayfields['t.ref']['checked'])) {
613 print '<td class="nowraponall">';
614 print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
615 print img_picto('', 'ticket', 'class="paddingrightonly"');
616 print $obj->ref;
617 print '</a>';
618 print '</td>';
619 }
620
621 // Subject
622 if (!empty($arrayfields['t.subject']['checked'])) {
623 print '<td>';
624 print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
625 print $obj->subject;
626 print '</a>';
627 print '</td>';
628 }
629
630 // Type
631 if (!empty($arrayfields['type.code']['checked'])) {
632 print '<td>';
633 print $obj->type_label;
634 print '</td>';
635 }
636
637 // Category
638 if (!empty($arrayfields['category.code']['checked'])) {
639 print '<td>';
640 print $obj->category_label;
641 print '</td>';
642 }
643
644 // Severity
645 if (!empty($arrayfields['severity.code']['checked'])) {
646 print '<td>';
647 print $obj->severity_label;
648 print '</td>';
649 }
650
651 // Progression
652 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
653 print '<td>';
654 print $obj->progress;
655 print '</td>';
656 }
657
658 // Message author
659 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
660 print '<td title="'.dol_escape_htmltag($obj->origin_email).'">';
661 if ($obj->fk_user_create > 0) {
662 $user_create->firstname = (!empty($obj->user_create_firstname) ? $obj->user_create_firstname : '');
663 $user_create->name = (!empty($obj->user_create_lastname) ? $obj->user_create_lastname : '');
664 $user_create->id = (!empty($obj->fk_user_create) ? $obj->fk_user_create : '');
665 print $user_create->getFullName($langs);
666 } else {
667 print img_picto('', 'email', 'class="paddingrightonly"');
668 print $langs->trans('Email');
669 }
670 print '</td>';
671 }
672
673 // Assigned author
674 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
675 print '<td>';
676 if ($obj->fk_user_assign > 0) {
677 $user_assign->firstname = (!empty($obj->user_assign_firstname) ? $obj->user_assign_firstname : '');
678 $user_assign->lastname = (!empty($obj->user_assign_lastname) ? $obj->user_assign_lastname : '');
679 $user_assign->id = (!empty($obj->fk_user_assign) ? $obj->fk_user_assign : '');
680 print img_picto('', 'user', 'class="paddingrightonly"');
681 print $user_assign->getFullName($langs);
682 }
683 print '</td>';
684 }
685
686 if (!empty($arrayfields['t.tms']['checked'])) {
687 print '<td>'.dol_print_date($db->jdate($obj->tms), 'dayhour').'</td>';
688 }
689
690 // Extra fields
691 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
692 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
693 if (!empty($arrayfields["ef.".$key]['checked'])) {
694 print '<td';
695 $cssstring = $extrafields->getCSSClass($key, $object->table_element, 'csslist');
696 if ($cssstring) {
697 print ' class="'.$cssstring.'"';
698 }
699 print '>';
700 $tmpkey = 'options_'.$key;
701 print $extrafields->showOutputField($key, $obj->$tmpkey, '', $object->table_element);
702 print '</td>';
703 }
704 }
705 }
706
707 // Statut
708 if (!empty($arrayfields['t.fk_statut']['checked'])) {
709 print '<td class="nowraponall">';
710 $object->status = $obj->fk_statut;
711 if (getDolGlobalString('TICKET_SHOW_PROGRESSION')) {
712 $object->progress = $obj->progress;
713 }
714 print $object->getLibStatut(2);
715 print '</td>';
716 }
717
718 print '<td></td>';
719
720 $i++;
721 print '</tr>';
722 }
723
724 if ($i == 0) {
725 print '<tr><td colspan="9">';
726 print '<span class="opacitymedium">'.$langs->trans("None").'</span>';
727 print '</td></tr>';
728 }
729
730 print '</table>';
731 print '</div>';
732
733 print '</form>';
734
735 $url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 1));
736
737 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;">';
738 print '<input type="hidden" name="token" value="'.newToken().'">';
739 print '<input type="hidden" name="action" value="view_ticket">';
740 print '<input type="hidden" name="btn_view_ticket_list" value="1">';
741 print '<input type="hidden" name="track_id" value="">';
742 print '<input type="hidden" name="email" value="">';
743 print "</form>";
744 print '<script type="text/javascript">
745 function viewticket(ticket_id, email) {
746 var form = $("#form_view_ticket");
747 form.find("input[name=\\"track_id\\"]").val(ticket_id);
748 form.find("input[name=\\"email\\"]").val(email);
749 form.submit();
750 }
751 </script>';
752 }
753 } else {
754 dol_print_error($db);
755 }
756 } else {
757 print '<div class="error">Not Allowed<br><a href="'.$_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'">'.$langs->trans("GoBack").'</a></div>';
758 }
759
760 print '</div>';
761} else {
762 print '<div class="ticketpublicarea ticketlargemargin">';
763
764 print '<p class="center opacitymedium">'.$langs->trans("TicketPublicMsgViewLogIn").'</p>';
765 print '<br>';
766
767 print '<div id="form_view_ticket">';
768 print '<form method="POST" class="maxwidth1000 center" name="form_view_ticketlist" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'">';
769 print '<input type="hidden" name="token" value="'.newToken().'">';
770 print '<input type="hidden" name="action" value="view_ticketlist">';
771 //print '<input type="hidden" name="search_fk_status" value="non_closed">';
772
773 print '<p><label for="track_id" style="display: inline-block" class="titlefieldcreate left"><span class="fieldrequired">';
774 print img_picto($langs->trans("TicketTrackId"), 'generic', 'class="pictofixedwidth"');
775 print $langs->trans("OneOfTicketTrackId");
776 print '</span></label>';
777 print '<br class="showonsmartphone hidden">';
778 print '<input class="minwidth100" id="track_id" name="track_id" value="'.(GETPOST('track_id', 'alpha') ? GETPOST('track_id', 'alpha') : '').'" />';
779 print '</p>';
780
781 print '<p><label for="email" style="display: inline-block" class="titlefieldcreate left"><span class="fieldrequired">';
782 print img_picto($langs->trans("Email"), 'email', 'class="pictofixedwidth"');
783 print $langs->trans('Email').'</span></label>';
784 print '<br class="showonsmartphone hidden">';
785 print '<input class="minwidth100" id="email" name="email" value="'.(GETPOST('email', 'alpha') ? GETPOST('email', 'alpha') : (!empty($_SESSION['customer_email']) ? $_SESSION['customer_email'] : "")).'" />';
786 print '</p>';
787
788 print '<p style="text-align: center; margin-top: 1.5em;">';
789 print '<input type="submit" class="button button-select" name="btn_view_ticket_list" value="'.$langs->trans('ViewMyTicketList').'" />';
790 print ' &nbsp; ';
791 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
792 print "</p>\n";
793
794 print "</form>\n";
795 print "</div>\n";
796
797 print "</div>";
798}
799
800if (getDolGlobalInt('TICKET_SHOW_COMPANY_FOOTER')) {
801 // End of page
802 htmlPrintOnlineFooter($mysoc, $langs, 0, $suffix, $object);
803}
804
805llxFooter('', 'public');
806
807$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.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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).
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.