dolibarr 19.0.3
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
24if (!defined('NOREQUIREMENU')) {
25 define('NOREQUIREMENU', '1');
26}
27// If there is no need to load and show top and left menu
28if (!defined("NOLOGIN")) {
29 define("NOLOGIN", '1');
30}
31if (!defined('NOIPCHECK')) {
32 define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
33}
34if (!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));
42if (is_numeric($entity)) {
43 define("DOLENTITY", $entity);
44}
45
46// Load Dolibarr environment
47require '../../main.inc.php';
48require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php';
49require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php';
50require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
51require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php';
52require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
53require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
54require_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
68if (GETPOST('btn_view_ticket_list')) {
69 unset($_SESSION['track_id_customer']);
70 unset($_SESSION['email_customer']);
71}
72if (isset($_SESSION['track_id_customer'])) {
73 $track_id = $_SESSION['track_id_customer'];
74}
75if (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
84if (!isModEnabled('ticket')) {
85 httponly_accessforbidden('Module Ticket not enabled');
86}
87
88
89
90/*
91 * Actions
92 */
93
94if ($cancel) {
95 $backtopage = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
96
97 header("Location: ".$backtopage);
98 exit;
99}
100
101if ($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
184if (!getDolGlobalString('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(getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', '/ticket/').'css/styles.css.php');
192
193llxHeaderTicket($langs->trans("Tickets"), "", 0, 0, $arrayofjs, $arrayofcss);
194
195
196if ($action == "view_ticketlist") {
197 print '<div class="ticketpublicarealist ticketlargemargin centpercent">';
198
199 print '<br>';
200 if ($display_ticket_list) {
201 // Filters
202 $search_fk_status = GETPOST("search_fk_status", 'alpha');
203 $search_subject = GETPOST("search_subject", 'alpha');
204 $search_type = GETPOST("search_type", 'alpha');
205 $search_category = GETPOST("search_category", 'alpha');
206 $search_severity = GETPOST("search_severity", 'alpha');
207 $search_fk_user_create = GETPOST("search_fk_user_create", 'int');
208 $search_fk_user_assign = GETPOST("search_fk_user_assign", 'int');
209
210 // Store current page url
211 $url_page_current = dol_buildpath('/public/ticket/list.php', 1);
212
213 // Do we click on purge search criteria ?
214 if (GETPOST("button_removefilter_x")) {
215 $search_fk_status = '';
216 $search_subject = '';
217 $search_type = '';
218 $search_category = '';
219 $search_severity = '';
220 $search_fk_user_create = '';
221 $search_fk_user_assign = '';
222 }
223
224 // fetch optionals attributes and labels
225 $extrafields = new ExtraFields($db);
226 $extrafields->fetch_name_optionals_label($object->table_element);
227
228 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
229
230 $filter = array();
231
232 $param = '&action=view_ticketlist';
233 if (!empty($entity) && isModEnabled('multicompany')) {
234 $param .= '&entity='.((int) $entity);
235 }
236
237 $param .= '&token='.newToken();
238
239 // Definition of fields for list
240 $arrayfields = array(
241 't.datec' => array('label' => $langs->trans("Date"), 'checked' => 1),
242 't.date_read' => array('label' => $langs->trans("TicketReadOn"), 'checked' => 0),
243 't.date_close' => array('label' => $langs->trans("TicketCloseOn"), 'checked' => 0),
244 't.ref' => array('label' => $langs->trans("Ref"), 'checked' => 1),
245 //'t.track_id' => array('label' => $langs->trans("IDTracking"), 'checked' => 0),
246 't.fk_statut' => array('label' => $langs->trans("Status"), 'checked' => 1),
247 't.subject' => array('label' => $langs->trans("Subject"), 'checked' => 1),
248 'type.code' => array('label' => $langs->trans("Type"), 'checked' => 1),
249 'category.code' => array('label' => $langs->trans("Category"), 'checked' => 1),
250 'severity.code' => array('label' => $langs->trans("Severity"), 'checked' => 1),
251 't.progress' => array('label' => $langs->trans("Progression"), 'checked' => 0),
252 //'t.fk_contract' => array('label' => $langs->trans("Contract"), 'checked' => 0),
253 't.fk_user_create' => array('label' => $langs->trans("Author"), 'checked' => 1),
254 't.fk_user_assign' => array('label' => $langs->trans("AssignedTo"), 'checked' => 0),
255
256 //'t.entity'=>array('label'=>$langs->trans("Entity"), 'checked'=>1, 'enabled'=>(isModEnabled('multicompany') && empty($conf->multicompany->transverse_mode))),
257 //'t.datec' => array('label' => $langs->trans("DateCreation"), 'checked' => 0, 'position' => 500),
258 //'t.tms' => array('label' => $langs->trans("DateModificationShort"), 'checked' => 0, 'position' => 2)
259 //'t.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000),
260 );
261
262 if (!getDolGlobalString('TICKET_SHOW_PROGRESSION')) {
263 unset($arrayfields['t.progress']);
264 }
265
266 // Extra fields
267 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
268 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
269 if ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate') {
270 $enabled = abs(dol_eval($extrafields->attributes[$object->table_element]['list'][$key], 1, 1, '2'));
271 $enabled = (($enabled == 0 || $enabled == 3) ? 0 : $enabled);
272 $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]);
273 }
274 }
275 }
276 if (!empty($search_subject)) {
277 $filter['t.subject'] = $search_subject;
278 $param .= '&search_subject='.urlencode($search_subject);
279 }
280 if (!empty($search_type)) {
281 $filter['t.type_code'] = $search_type;
282 $param .= '&search_type='.urlencode($search_type);
283 }
284 if (!empty($search_category)) {
285 $filter['t.category_code'] = $search_category;
286 $param .= '&search_category='.urlencode($search_category);
287 }
288 if (!empty($search_severity)) {
289 $filter['t.severity_code'] = $search_severity;
290 $param .= '&search_severity='.urlencode($search_severity);
291 }
292 if (!empty($search_fk_user_assign)) {
293 // -1 value = all so no filter
294 if ($search_fk_user_assign > 0) {
295 $filter['t.fk_user_assign'] = $search_fk_user_assign;
296 $param .= '&search_fk_user_assign='.urlencode($search_fk_user_assign);
297 }
298 }
299 if (!empty($search_fk_user_create)) {
300 // -1 value = all so no filter
301 if ($search_fk_user_create > 0) {
302 $filter['t.fk_user_create'] = $search_fk_user_create;
303 $param .= '&search_fk_user_create='.urlencode($search_fk_user_create);
304 }
305 }
306 if ((isset($search_fk_status) && $search_fk_status != '') && $search_fk_status != '-1' && $search_fk_status != 'non_closed') {
307 $filter['t.fk_statut'] = $search_fk_status;
308 $param .= '&search_fk_status='.urlencode($search_fk_status);
309 }
310 if (isset($search_fk_status) && $search_fk_status == 'non_closed') {
311 $filter['t.fk_statut'] = array(0, 1, 3, 4, 5, 6);
312 $param .= '&search_fk_status=non_closed';
313 }
314
315 require DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
316
317 $sortfield = GETPOST('sortfield', 'aZ09comma');
318 $sortorder = GETPOST('sortorder', 'aZ09comma');
319
320 if (!$sortfield) {
321 $sortfield = 't.datec';
322 }
323 if (!$sortorder) {
324 $sortorder = 'DESC';
325 }
326
327 $limit = $conf->liste_limit;
328
329 $page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int');
330 if (empty($page) || $page == -1) {
331 $page = 0;
332 } // If $page is not defined, or '' or -1
333 $offset = $limit * $page;
334 $pageprev = $page - 1;
335 $pagenext = $page + 1;
336
337 // Request SQL
338 $sql = "SELECT DISTINCT";
339 $sql .= " t.rowid,";
340 $sql .= " t.ref,";
341 $sql .= " t.track_id,";
342 $sql .= " t.fk_soc,";
343 $sql .= " t.fk_project,";
344 $sql .= " t.origin_email,";
345 $sql .= " t.fk_user_create, uc.lastname as user_create_lastname, uc.firstname as user_create_firstname,";
346 $sql .= " t.fk_user_assign, ua.lastname as user_assign_lastname, ua.firstname as user_assign_firstname,";
347 $sql .= " t.subject,";
348 $sql .= " t.message,";
349 $sql .= " t.fk_statut,";
350 $sql .= " t.resolution,";
351 if (getDolGlobalString('TICKET_SHOW_PROGRESSION')) {
352 $sql .= " t.progress,";
353 }
354 $sql .= " t.timing,";
355 $sql .= " t.type_code,";
356 $sql .= " t.category_code,";
357 $sql .= " t.severity_code,";
358 $sql .= " t.datec,";
359 $sql .= " t.date_read,";
360 $sql .= " t.date_close,";
361 $sql .= " t.tms,";
362 $sql .= " type.label as type_label, category.label as category_label, severity.label as severity_label";
363 // Add fields for extrafields
364 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
365 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
366 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
367 }
368 }
369 $sql .= " FROM ".MAIN_DB_PREFIX."ticket as t";
370 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_type as type ON type.code = t.type_code";
371 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_category as category ON category.code = t.category_code";
372 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_ticket_severity as severity ON severity.code = t.severity_code";
373 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc";
374 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as uc ON uc.rowid = t.fk_user_create";
375 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user as ua ON ua.rowid = t.fk_user_assign";
376 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."element_contact as ec ON ec.element_id = t.rowid";
377 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_type_contact as tc ON ec.fk_c_type_contact = tc.rowid";
378 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople sp ON ec.fk_socpeople = sp.rowid";
379 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
380 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."ticket_extrafields as ef on (t.rowid = ef.fk_object)";
381 }
382 $sql .= " WHERE t.entity IN (".getEntity('ticket').")";
383 $sql .= " AND ((tc.source = 'external'";
384 $sql .= " AND tc.element='".$db->escape($object->element)."'";
385 $sql .= " AND tc.active=1";
386 $sql .= " AND sp.email='".$db->escape($_SESSION['email_customer'])."')"; // email found into an external contact
387 $sql .= " OR s.email='".$db->escape($_SESSION['email_customer'])."'"; // or email of the linked company
388 $sql .= " OR t.origin_email='".$db->escape($_SESSION['email_customer'])."')"; // or email of the requester
389 // Manage filter
390 if (!empty($filter)) {
391 foreach ($filter as $key => $value) {
392 if (strpos($key, 'date')) { // To allow $filter['YEAR(s.dated)']=>$year
393 $sql .= " AND ".$key." = '".$db->escape($value)."'";
394 } elseif (($key == 't.fk_user_assign') || ($key == 't.type_code') || ($key == 't.category_code') || ($key == 't.severity_code')) {
395 $sql .= " AND ".$key." = '".$db->escape($value)."'";
396 } elseif ($key == 't.fk_statut') {
397 if (is_array($value) && count($value) > 0) {
398 $sql .= " AND ".$key." IN (".$db->sanitize(implode(',', $value)).")";
399 } else {
400 $sql .= " AND ".$key." = ".((int) $value);
401 }
402 } else {
403 $sql .= " AND ".$key." LIKE '%".$db->escape($value)."%'";
404 }
405 }
406 }
407 //$sql .= " GROUP BY t.track_id";
408 $sql .= $db->order($sortfield, $sortorder);
409
410 $resql = $db->query($sql);
411 if ($resql) {
412 $num_total = $db->num_rows($resql);
413 if (!empty($limit)) {
414 $sql .= $db->plimit($limit + 1, $offset);
415 }
416
417 $resql = $db->query($sql);
418 if ($resql) {
419 $num = $db->num_rows($resql);
420
421 print_barre_liste($langs->trans('TicketList'), $page, 'list.php', $param, $sortfield, $sortorder, '', $num, $num_total, 'ticket');
422
423 // Search bar
424 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'" id="searchFormList" >'."\n";
425 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
426 print '<input type="hidden" name="token" value="'.newToken().'">';
427 print '<input type="hidden" name="action" value="view_ticketlist">';
428 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
429 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
430
431 $varpage = empty($contextpage) ? $url_page_current : $contextpage;
432 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
433
434 // allow to display information before list
435 $parameters=array('arrayfields'=>$arrayfields);
436 $reshook=$hookmanager->executeHooks('printFieldListHeader', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
437 print $hookmanager->resPrint;
438
439 print '<div class="div-table-responsive">';
440 print '<table class="liste '.($moreforfilter ? "listwithfilterbefore" : "").'">';
441
442 // Filter bar
443 print '<tr class="liste_titre">';
444
445 if (!empty($arrayfields['t.datec']['checked'])) {
446 print '<td class="liste_titre"></td>';
447 }
448
449 if (!empty($arrayfields['t.date_read']['checked'])) {
450 print '<td class="liste_titre"></td>';
451 }
452 if (!empty($arrayfields['t.date_close']['checked'])) {
453 print '<td class="liste_titre"></td>';
454 }
455
456 if (!empty($arrayfields['t.ref']['checked'])) {
457 print '<td class="liste_titre"></td>';
458 }
459
460 if (!empty($arrayfields['t.subject']['checked'])) {
461 print '<td class="liste_titre">';
462 print '<input type="text" class="flat maxwidth100" name="search_subject" value="'.$search_subject.'">';
463 print '</td>';
464 }
465
466 if (!empty($arrayfields['type.code']['checked'])) {
467 print '<td class="liste_titre">';
468 $formTicket->selectTypesTickets($search_type, 'search_type', '', 2, 1, 1, 0, 'maxwidth150');
469 print '</td>';
470 }
471
472 if (!empty($arrayfields['category.code']['checked'])) {
473 print '<td class="liste_titre">';
474 $formTicket->selectGroupTickets($search_category, 'search_category', 'public=1', 2, 1, 1);
475 print '</td>';
476 }
477
478 if (!empty($arrayfields['severity.code']['checked'])) {
479 print '<td class="liste_titre">';
480 $formTicket->selectSeveritiesTickets($search_severity, 'search_severity', '', 2, 1, 1);
481 print '</td>';
482 }
483
484 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
485 print '<td class="liste_titre"></td>';
486 }
487
488 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
489 print '<td class="liste_titre"></td>';
490 }
491
492 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
493 print '<td class="liste_titre"></td>';
494 }
495
496 if (!empty($arrayfields['t.tms']['checked'])) {
497 print '<td class="liste_titre"></td>';
498 }
499
500 // Extra fields
501 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
502
503 // Fields from hook
504 $parameters = array('arrayfields'=>$arrayfields);
505 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
506 print $hookmanager->resPrint;
507
508 // Status ticket
509 if (!empty($arrayfields['t.fk_statut']['checked'])) {
510 print '<td class="liste_titre">';
511 $selected = ($search_fk_status != "non_closed" ? $search_fk_status : '');
512 //$object->printSelectStatus($selected);
513 print '</td>';
514 }
515
516 // Action column
517 print '<td class="liste_titre maxwidthsearch">';
518 $searchpicto = $form->showFilterButtons();
519 print $searchpicto;
520 print '</td>';
521 print '</tr>';
522
523 // Field title
524 print '<tr class="liste_titre">';
525 if (!empty($arrayfields['t.datec']['checked'])) {
526 print_liste_field_titre($arrayfields['t.datec']['label'], $url_page_current, 't.datec', '', $param, '', $sortfield, $sortorder);
527 }
528 if (!empty($arrayfields['t.date_read']['checked'])) {
529 print_liste_field_titre($arrayfields['t.date_read']['label'], $url_page_current, 't.date_read', '', $param, '', $sortfield, $sortorder);
530 }
531 if (!empty($arrayfields['t.date_close']['checked'])) {
532 print_liste_field_titre($arrayfields['t.date_close']['label'], $url_page_current, 't.date_close', '', $param, '', $sortfield, $sortorder);
533 }
534 if (!empty($arrayfields['t.ref']['checked'])) {
535 print_liste_field_titre($arrayfields['t.ref']['label'], $url_page_current, 't.ref', '', $param, '', $sortfield, $sortorder);
536 }
537 if (!empty($arrayfields['t.subject']['checked'])) {
538 print_liste_field_titre($arrayfields['t.subject']['label']);
539 }
540 if (!empty($arrayfields['type.code']['checked'])) {
541 print_liste_field_titre($arrayfields['type.code']['label'], $url_page_current, 'type.code', '', $param, '', $sortfield, $sortorder);
542 }
543 if (!empty($arrayfields['category.code']['checked'])) {
544 print_liste_field_titre($arrayfields['category.code']['label'], $url_page_current, 'category.code', '', $param, '', $sortfield, $sortorder);
545 }
546 if (!empty($arrayfields['severity.code']['checked'])) {
547 print_liste_field_titre($arrayfields['severity.code']['label'], $url_page_current, 'severity.code', '', $param, '', $sortfield, $sortorder);
548 }
549 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
550 print_liste_field_titre($arrayfields['t.progress']['label'], $url_page_current, 't.progress', '', $param, '', $sortfield, $sortorder);
551 }
552 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
553 print_liste_field_titre($arrayfields['t.fk_user_create']['label'], $url_page_current, 't.fk_user_create', '', $param, '', $sortfield, $sortorder);
554 }
555 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
556 print_liste_field_titre($arrayfields['t.fk_user_assign']['label'], $url_page_current, 't.fk_user_assign', '', $param, '', $sortfield, $sortorder);
557 }
558 if (!empty($arrayfields['t.tms']['checked'])) {
559 print_liste_field_titre($arrayfields['t.tms']['label'], $url_page_current, 't.tms', '', $param, '', $sortfield, $sortorder);
560 }
561
562 // Extra fields
563 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
564
565 // Hook fields
566 $parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder);
567 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
568 print $hookmanager->resPrint;
569
570 if (!empty($arrayfields['t.fk_statut']['checked'])) {
571 print_liste_field_titre($arrayfields['t.fk_statut']['label'], $url_page_current, 't.fk_statut', '', $param, '', $sortfield, $sortorder);
572 }
573 print_liste_field_titre($selectedfields, $url_page_current, "", '', '', 'align="right"', $sortfield, $sortorder, 'center maxwidthsearch ');
574 print '</tr>';
575
576 while ($obj = $db->fetch_object($resql)) {
577 print '<tr class="oddeven">';
578
579 // Date ticket
580 if (!empty($arrayfields['t.datec']['checked'])) {
581 print '<td>';
582 print dol_print_date($db->jdate($obj->datec), 'dayhour');
583 print '</td>';
584 }
585
586 // Date read
587 if (!empty($arrayfields['t.date_read']['checked'])) {
588 print '<td>';
589 print dol_print_date($db->jdate($obj->date_read), 'dayhour');
590 print '</td>';
591 }
592
593 // Date close
594 if (!empty($arrayfields['t.date_close']['checked'])) {
595 print '<td>';
596 print dol_print_date($db->jdate($obj->date_close), 'dayhour');
597 print '</td>';
598 }
599
600 // Ref
601 if (!empty($arrayfields['t.ref']['checked'])) {
602 print '<td class="nowraponall">';
603 print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
604 print img_picto('', 'ticket', 'class="paddingrightonly"');
605 print $obj->ref;
606 print '</a>';
607 print '</td>';
608 }
609
610 // Subject
611 if (!empty($arrayfields['t.subject']['checked'])) {
612 print '<td>';
613 print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
614 print $obj->subject;
615 print '</a>';
616 print '</td>';
617 }
618
619 // Type
620 if (!empty($arrayfields['type.code']['checked'])) {
621 print '<td>';
622 print $obj->type_label;
623 print '</td>';
624 }
625
626 // Category
627 if (!empty($arrayfields['category.code']['checked'])) {
628 print '<td>';
629 print $obj->category_label;
630 print '</td>';
631 }
632
633 // Severity
634 if (!empty($arrayfields['severity.code']['checked'])) {
635 print '<td>';
636 print $obj->severity_label;
637 print '</td>';
638 }
639
640 // Progression
641 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
642 print '<td>';
643 print $obj->progress;
644 print '</td>';
645 }
646
647 // Message author
648 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
649 print '<td title="'.dol_escape_htmltag($obj->origin_email).'">';
650 if ($obj->fk_user_create > 0) {
651 $user_create->firstname = (!empty($obj->user_create_firstname) ? $obj->user_create_firstname : '');
652 $user_create->name = (!empty($obj->user_create_lastname) ? $obj->user_create_lastname : '');
653 $user_create->id = (!empty($obj->fk_user_create) ? $obj->fk_user_create : '');
654 print $user_create->getFullName($langs);
655 } else {
656 print img_picto('', 'email', 'class="paddingrightonly"');
657 print $langs->trans('Email');
658 }
659 print '</td>';
660 }
661
662 // Assigned author
663 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
664 print '<td>';
665 if ($obj->fk_user_assign > 0) {
666 $user_assign->firstname = (!empty($obj->user_assign_firstname) ? $obj->user_assign_firstname : '');
667 $user_assign->lastname = (!empty($obj->user_assign_lastname) ? $obj->user_assign_lastname : '');
668 $user_assign->id = (!empty($obj->fk_user_assign) ? $obj->fk_user_assign : '');
669 print img_picto('', 'user', 'class="paddingrightonly"');
670 print $user_assign->getFullName($langs);
671 }
672 print '</td>';
673 }
674
675 if (!empty($arrayfields['t.tms']['checked'])) {
676 print '<td>'.dol_print_date($db->jdate($obj->tms), 'dayhour').'</td>';
677 }
678
679 // Extra fields
680 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
681 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
682 if (!empty($arrayfields["ef.".$key]['checked'])) {
683 print '<td';
684 $cssstring = $extrafields->getAlignFlag($key, $object->table_element);
685 if ($cssstring) {
686 print ' class="'.$cssstring.'"';
687 }
688 print '>';
689 $tmpkey = 'options_'.$key;
690 print $extrafields->showOutputField($key, $obj->$tmpkey, '', $object->table_element);
691 print '</td>';
692 }
693 }
694 }
695
696 // Statut
697 if (!empty($arrayfields['t.fk_statut']['checked'])) {
698 print '<td class="nowraponall">';
699 $object->fk_statut = $obj->fk_statut;
700 print $object->getLibStatut(2);
701 print '</td>';
702 }
703
704 print '<td></td>';
705
706 $i++;
707 print '</tr>';
708 }
709
710 print '</table>';
711 print '</div>';
712
713 print '</form>';
714
715 $url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 1));
716
717 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;">';
718 print '<input type="hidden" name="token" value="'.newToken().'">';
719 print '<input type="hidden" name="action" value="view_ticket">';
720 print '<input type="hidden" name="btn_view_ticket_list" value="1">';
721 print '<input type="hidden" name="track_id" value="">';
722 print '<input type="hidden" name="email" value="">';
723 print "</form>";
724 print '<script type="text/javascript">
725 function viewticket(ticket_id, email) {
726 var form = $("#form_view_ticket");
727 form.find("input[name=\\"track_id\\"]").val(ticket_id);
728 form.find("input[name=\\"email\\"]").val(email);
729 form.submit();
730 }
731 </script>';
732 }
733 } else {
734 dol_print_error($db);
735 }
736 } else {
737 print '<div class="error">Not Allowed<br><a href="'.$_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'">'.$langs->trans('Back').'</a></div>';
738 }
739
740 print '</div>';
741} else {
742 print '<div class="ticketpublicarea ticketlargemargin centpercent">';
743
744 print '<p class="center opacitymedium">'.$langs->trans("TicketPublicMsgViewLogIn").'</p>';
745 print '<br>';
746
747 print '<div id="form_view_ticket">';
748 print '<form method="post" name="form_view_ticketlist" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'">';
749 print '<input type="hidden" name="token" value="'.newToken().'">';
750 print '<input type="hidden" name="action" value="view_ticketlist">';
751 //print '<input type="hidden" name="search_fk_status" value="non_closed">';
752
753 print '<p><label for="track_id" style="display: inline-block; width: 30%; "><span class="fieldrequired">'.$langs->trans("OneOfTicketTrackId").'</span></label>';
754 print '<input size="30" id="track_id" name="track_id" value="'.(GETPOST('track_id', 'alpha') ? GETPOST('track_id', 'alpha') : '').'" />';
755 print '</p>';
756
757 print '<p><label for="email" style="display: inline-block; width: 30%; "><span class="fieldrequired">'.$langs->trans('Email').'</span></label>';
758 print '<input size="30" id="email" name="email" value="'.(GETPOST('email', 'alpha') ? GETPOST('email', 'alpha') : (!empty($_SESSION['customer_email']) ? $_SESSION['customer_email'] : "")).'" />';
759 print '</p>';
760
761 print '<p style="text-align: center; margin-top: 1.5em;">';
762 print '<input type="submit" class="button" name="btn_view_ticket_list" value="'.$langs->trans('ViewMyTicketList').'" />';
763 print ' &nbsp; ';
764 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
765 print "</p>\n";
766
767 print "</form>\n";
768 print "</div>\n";
769
770 print "</div>";
771}
772
773if (getDolGlobalInt('TICKET_SHOW_COMPANY_FOOTER')) {
774 // End of page
775 htmlPrintOnlineFooter($mysoc, $langs, 0, $suffix, $object);
776}
777
778llxFooter('', 'public');
779
780$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.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
ui dialog ui datepicker calendar ui widget content ui state ui datepicker calendar ui widget header ui state ui datepicker calendar ui 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:124
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.