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