dolibarr 20.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// Because 2 entities can have the same ref.
42$entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
43if (is_numeric($entity)) {
44 define("DOLENTITY", $entity);
45}
46
47// Load Dolibarr environment
48require '../../main.inc.php';
49require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php';
50require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php';
51require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
52require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php';
53require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
54require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
55require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
56
57// Load translation files required by the page
58$langs->loadLangs(array("companies", "other", "ticket"));
59
60// Get parameters
61$action = GETPOST('action', 'aZ09');
62$cancel = GETPOST('cancel', 'aZ09');
63
64$track_id = GETPOST('track_id', 'alpha');
65$email = strtolower(GETPOST('email', 'alpha'));
66$suffix = "";
67$moreforfilter = "";
68
69if (GETPOST('btn_view_ticket_list')) {
70 unset($_SESSION['track_id_customer']);
71 unset($_SESSION['email_customer']);
72}
73if (empty($track_id) && isset($_SESSION['track_id_customer'])) {
74 $track_id = $_SESSION['track_id_customer'];
75}
76if (empty($email) && isset($_SESSION['email_customer'])) {
77 $email = strtolower($_SESSION['email_customer']);
78}
79
80$object = new Ticket($db);
81
82// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
83$hookmanager->initHooks(array('ticketpubliclist', 'globalcard'));
84
85if (!isModEnabled('ticket')) {
86 httponly_accessforbidden('Module Ticket not enabled');
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", "intcomma");
208 $search_fk_user_assign = GETPOST("search_fk_user_assign", "intcomma");
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((string) ($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((string) ($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') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
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 ".$db->sanitize($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 ".$db->sanitize($key)." = '".$db->escape($value)."'";
397 } elseif ($key == 't.fk_statut') {
398 if (is_array($value) && count($value) > 0) {
399 $sql .= " AND ".$db->sanitize($key)." IN (".$db->sanitize(implode(',', $value)).")";
400 } else {
401 $sql .= " AND ".$db->sanitize($key)." = ".((int) $value);
402 }
403 } else {
404 $sql .= " AND ".$db->sanitize($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 $baseurl = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
423
424 $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>';
425
426 print_barre_liste($langs->trans('TicketList'), $page, 'list.php', $param, $sortfield, $sortorder, '', $num, $num_total, 'ticket', 0, $newcardbutton);
427
428 // Search bar
429 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'" id="searchFormList" >'."\n";
430 print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
431 print '<input type="hidden" name="token" value="'.newToken().'">';
432 print '<input type="hidden" name="action" value="view_ticketlist">';
433 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
434 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
435
436 $varpage = empty($contextpage) ? $url_page_current : $contextpage;
437 $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
438
439 // allow to display information before list
440 $parameters = array('arrayfields' => $arrayfields);
441 $reshook = $hookmanager->executeHooks('printFieldListHeader', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
442 print $hookmanager->resPrint;
443
444 print '<div class="div-table-responsive">';
445 print '<table class="liste '.($moreforfilter ? "listwithfilterbefore" : "").'">';
446
447 // Filter bar
448 print '<tr class="liste_titre">';
449
450 if (!empty($arrayfields['t.datec']['checked'])) {
451 print '<td class="liste_titre"></td>';
452 }
453
454 if (!empty($arrayfields['t.date_read']['checked'])) {
455 print '<td class="liste_titre"></td>';
456 }
457 if (!empty($arrayfields['t.date_close']['checked'])) {
458 print '<td class="liste_titre"></td>';
459 }
460
461 if (!empty($arrayfields['t.ref']['checked'])) {
462 print '<td class="liste_titre"></td>';
463 }
464
465 if (!empty($arrayfields['t.subject']['checked'])) {
466 print '<td class="liste_titre">';
467 print '<input type="text" class="flat maxwidth100" name="search_subject" value="'.$search_subject.'">';
468 print '</td>';
469 }
470
471 if (!empty($arrayfields['type.code']['checked'])) {
472 print '<td class="liste_titre">';
473 $formTicket->selectTypesTickets($search_type, 'search_type', '', 2, 1, 1, 0, 'maxwidth150');
474 print '</td>';
475 }
476
477 if (!empty($arrayfields['category.code']['checked'])) {
478 print '<td class="liste_titre">';
479 $formTicket->selectGroupTickets($search_category, 'search_category', '(public:=:1)', 2, 1, 1, 0, 'maxwidth150');
480 print '</td>';
481 }
482
483 if (!empty($arrayfields['severity.code']['checked'])) {
484 print '<td class="liste_titre">';
485 $formTicket->selectSeveritiesTickets($search_severity, 'search_severity', '', 2, 1, 1, 0, 'maxwidth150');
486 print '</td>';
487 }
488
489 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
490 print '<td class="liste_titre"></td>';
491 }
492
493 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
494 print '<td class="liste_titre"></td>';
495 }
496
497 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
498 print '<td class="liste_titre"></td>';
499 }
500
501 if (!empty($arrayfields['t.tms']['checked'])) {
502 print '<td class="liste_titre"></td>';
503 }
504
505 // Extra fields
506 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
507
508 // Fields from hook
509 $parameters = array('arrayfields' => $arrayfields);
510 $reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook
511 print $hookmanager->resPrint;
512
513 // Status ticket
514 if (!empty($arrayfields['t.fk_statut']['checked'])) {
515 print '<td class="liste_titre">';
516 $selected = ($search_fk_status != "non_closed" ? $search_fk_status : '');
517 //$object->printSelectStatus($selected);
518 print '</td>';
519 }
520
521 // Action column
522 print '<td class="liste_titre maxwidthsearch">';
523 $searchpicto = $form->showFilterButtons();
524 print $searchpicto;
525 print '</td>';
526 print '</tr>';
527
528 // Field title
529 print '<tr class="liste_titre">';
530 if (!empty($arrayfields['t.datec']['checked'])) {
531 print_liste_field_titre($arrayfields['t.datec']['label'], $url_page_current, 't.datec', '', $param, '', $sortfield, $sortorder);
532 }
533 if (!empty($arrayfields['t.date_read']['checked'])) {
534 print_liste_field_titre($arrayfields['t.date_read']['label'], $url_page_current, 't.date_read', '', $param, '', $sortfield, $sortorder);
535 }
536 if (!empty($arrayfields['t.date_close']['checked'])) {
537 print_liste_field_titre($arrayfields['t.date_close']['label'], $url_page_current, 't.date_close', '', $param, '', $sortfield, $sortorder);
538 }
539 if (!empty($arrayfields['t.ref']['checked'])) {
540 print_liste_field_titre($arrayfields['t.ref']['label'], $url_page_current, 't.ref', '', $param, '', $sortfield, $sortorder);
541 }
542 if (!empty($arrayfields['t.subject']['checked'])) {
543 print_liste_field_titre($arrayfields['t.subject']['label']);
544 }
545 if (!empty($arrayfields['type.code']['checked'])) {
546 print_liste_field_titre($arrayfields['type.code']['label'], $url_page_current, 'type.code', '', $param, '', $sortfield, $sortorder);
547 }
548 if (!empty($arrayfields['category.code']['checked'])) {
549 print_liste_field_titre($arrayfields['category.code']['label'], $url_page_current, 'category.code', '', $param, '', $sortfield, $sortorder);
550 }
551 if (!empty($arrayfields['severity.code']['checked'])) {
552 print_liste_field_titre($arrayfields['severity.code']['label'], $url_page_current, 'severity.code', '', $param, '', $sortfield, $sortorder);
553 }
554 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
555 print_liste_field_titre($arrayfields['t.progress']['label'], $url_page_current, 't.progress', '', $param, '', $sortfield, $sortorder);
556 }
557 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
558 print_liste_field_titre($arrayfields['t.fk_user_create']['label'], $url_page_current, 't.fk_user_create', '', $param, '', $sortfield, $sortorder);
559 }
560 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
561 print_liste_field_titre($arrayfields['t.fk_user_assign']['label'], $url_page_current, 't.fk_user_assign', '', $param, '', $sortfield, $sortorder);
562 }
563 if (!empty($arrayfields['t.tms']['checked'])) {
564 print_liste_field_titre($arrayfields['t.tms']['label'], $url_page_current, 't.tms', '', $param, '', $sortfield, $sortorder);
565 }
566
567 // Extra fields
568 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
569
570 // Hook fields
571 $parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
572 $reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object); // Note that $action and $object may have been modified by hook
573 print $hookmanager->resPrint;
574
575 if (!empty($arrayfields['t.fk_statut']['checked'])) {
576 print_liste_field_titre($arrayfields['t.fk_statut']['label'], $url_page_current, 't.fk_statut', '', $param, '', $sortfield, $sortorder);
577 }
578 print_liste_field_titre($selectedfields, $url_page_current, "", '', '', 'align="right"', $sortfield, $sortorder, 'center maxwidthsearch ');
579 print '</tr>';
580
581 while ($obj = $db->fetch_object($resql)) {
582 print '<tr class="oddeven">';
583
584 // Date ticket
585 if (!empty($arrayfields['t.datec']['checked'])) {
586 print '<td>';
587 print dol_print_date($db->jdate($obj->datec), 'dayhour', 'tzuserrel');
588 print '</td>';
589 }
590
591 // Date read
592 if (!empty($arrayfields['t.date_read']['checked'])) {
593 print '<td>';
594 print dol_print_date($db->jdate($obj->date_read), 'dayhour', 'tzuserrel');
595 print '</td>';
596 }
597
598 // Date close
599 if (!empty($arrayfields['t.date_close']['checked'])) {
600 print '<td>';
601 print dol_print_date($db->jdate($obj->date_close), 'dayhour', 'tzuserrel');
602 print '</td>';
603 }
604
605 // Ref
606 if (!empty($arrayfields['t.ref']['checked'])) {
607 print '<td class="nowraponall">';
608 print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
609 print img_picto('', 'ticket', 'class="paddingrightonly"');
610 print $obj->ref;
611 print '</a>';
612 print '</td>';
613 }
614
615 // Subject
616 if (!empty($arrayfields['t.subject']['checked'])) {
617 print '<td>';
618 print '<a rel="nofollow" href="javascript:viewticket(\''.dol_escape_js($obj->track_id).'\',\''.dol_escape_js($_SESSION['email_customer']).'\');">';
619 print $obj->subject;
620 print '</a>';
621 print '</td>';
622 }
623
624 // Type
625 if (!empty($arrayfields['type.code']['checked'])) {
626 print '<td>';
627 print $obj->type_label;
628 print '</td>';
629 }
630
631 // Category
632 if (!empty($arrayfields['category.code']['checked'])) {
633 print '<td>';
634 print $obj->category_label;
635 print '</td>';
636 }
637
638 // Severity
639 if (!empty($arrayfields['severity.code']['checked'])) {
640 print '<td>';
641 print $obj->severity_label;
642 print '</td>';
643 }
644
645 // Progression
646 if (getDolGlobalString('TICKET_SHOW_PROGRESSION') && !empty($arrayfields['t.progress']['checked'])) {
647 print '<td>';
648 print $obj->progress;
649 print '</td>';
650 }
651
652 // Message author
653 if (!empty($arrayfields['t.fk_user_create']['checked'])) {
654 print '<td title="'.dol_escape_htmltag($obj->origin_email).'">';
655 if ($obj->fk_user_create > 0) {
656 $user_create->firstname = (!empty($obj->user_create_firstname) ? $obj->user_create_firstname : '');
657 $user_create->name = (!empty($obj->user_create_lastname) ? $obj->user_create_lastname : '');
658 $user_create->id = (!empty($obj->fk_user_create) ? $obj->fk_user_create : '');
659 print $user_create->getFullName($langs);
660 } else {
661 print img_picto('', 'email', 'class="paddingrightonly"');
662 print $langs->trans('Email');
663 }
664 print '</td>';
665 }
666
667 // Assigned author
668 if (!empty($arrayfields['t.fk_user_assign']['checked'])) {
669 print '<td>';
670 if ($obj->fk_user_assign > 0) {
671 $user_assign->firstname = (!empty($obj->user_assign_firstname) ? $obj->user_assign_firstname : '');
672 $user_assign->lastname = (!empty($obj->user_assign_lastname) ? $obj->user_assign_lastname : '');
673 $user_assign->id = (!empty($obj->fk_user_assign) ? $obj->fk_user_assign : '');
674 print img_picto('', 'user', 'class="paddingrightonly"');
675 print $user_assign->getFullName($langs);
676 }
677 print '</td>';
678 }
679
680 if (!empty($arrayfields['t.tms']['checked'])) {
681 print '<td>'.dol_print_date($db->jdate($obj->tms), 'dayhour').'</td>';
682 }
683
684 // Extra fields
685 if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
686 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
687 if (!empty($arrayfields["ef.".$key]['checked'])) {
688 print '<td';
689 $cssstring = $extrafields->getAlignFlag($key, $object->table_element);
690 if ($cssstring) {
691 print ' class="'.$cssstring.'"';
692 }
693 print '>';
694 $tmpkey = 'options_'.$key;
695 print $extrafields->showOutputField($key, $obj->$tmpkey, '', $object->table_element);
696 print '</td>';
697 }
698 }
699 }
700
701 // Statut
702 if (!empty($arrayfields['t.fk_statut']['checked'])) {
703 print '<td class="nowraponall">';
704 $object->status = $obj->fk_statut;
705 if (getDolGlobalString('TICKET_SHOW_PROGRESSION')) {
706 $object->progress = $obj->progress;
707 }
708 print $object->getLibStatut(2);
709 print '</td>';
710 }
711
712 print '<td></td>';
713
714 $i++;
715 print '</tr>';
716 }
717
718 print '</table>';
719 print '</div>';
720
721 print '</form>';
722
723 $url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 1));
724
725 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;">';
726 print '<input type="hidden" name="token" value="'.newToken().'">';
727 print '<input type="hidden" name="action" value="view_ticket">';
728 print '<input type="hidden" name="btn_view_ticket_list" value="1">';
729 print '<input type="hidden" name="track_id" value="">';
730 print '<input type="hidden" name="email" value="">';
731 print "</form>";
732 print '<script type="text/javascript">
733 function viewticket(ticket_id, email) {
734 var form = $("#form_view_ticket");
735 form.find("input[name=\\"track_id\\"]").val(ticket_id);
736 form.find("input[name=\\"email\\"]").val(email);
737 form.submit();
738 }
739 </script>';
740 }
741 } else {
742 dol_print_error($db);
743 }
744 } else {
745 print '<div class="error">Not Allowed<br><a href="'.$_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'">'.$langs->trans('Back').'</a></div>';
746 }
747
748 print '</div>';
749} else {
750 print '<div class="ticketpublicarea ticketlargemargin centpercent">';
751
752 print '<p class="center opacitymedium">'.$langs->trans("TicketPublicMsgViewLogIn").'</p>';
753 print '<br>';
754
755 print '<div id="form_view_ticket">';
756 print '<form method="POST" class="maxwidth1000 center" name="form_view_ticketlist" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'">';
757 print '<input type="hidden" name="token" value="'.newToken().'">';
758 print '<input type="hidden" name="action" value="view_ticketlist">';
759 //print '<input type="hidden" name="search_fk_status" value="non_closed">';
760
761 print '<p><label for="track_id" style="display: inline-block" class="titlefieldcreate left"><span class="fieldrequired">';
762 print img_picto($langs->trans("TicketTrackId"), 'generic', 'class="pictofixedwidth"');
763 print $langs->trans("OneOfTicketTrackId");
764 print '</span></label>';
765 print '<br class="showonsmartphone hidden">';
766 print '<input class="minwidth100" id="track_id" name="track_id" value="'.(GETPOST('track_id', 'alpha') ? GETPOST('track_id', 'alpha') : '').'" />';
767 print '</p>';
768
769 print '<p><label for="email" style="display: inline-block" class="titlefieldcreate left"><span class="fieldrequired">';
770 print img_picto($langs->trans("Email"), 'email', 'class="pictofixedwidth"');
771 print $langs->trans('Email').'</span></label>';
772 print '<br class="showonsmartphone hidden">';
773 print '<input class="minwidth100" id="email" name="email" value="'.(GETPOST('email', 'alpha') ? GETPOST('email', 'alpha') : (!empty($_SESSION['customer_email']) ? $_SESSION['customer_email'] : "")).'" />';
774 print '</p>';
775
776 print '<p style="text-align: center; margin-top: 1.5em;">';
777 print '<input type="submit" class="button button-select" name="btn_view_ticket_list" value="'.$langs->trans('ViewMyTicketList').'" />';
778 print ' &nbsp; ';
779 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
780 print "</p>\n";
781
782 print "</form>\n";
783 print "</div>\n";
784
785 print "</div>";
786}
787
788if (getDolGlobalInt('TICKET_SHOW_COMPANY_FOOTER')) {
789 // End of page
790 htmlPrintOnlineFooter($mysoc, $langs, 0, $suffix, $object);
791}
792
793llxFooter('', 'public');
794
795$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $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, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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.
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.
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...
ui state ui widget content ui state ui widget header ui state a 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:140
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.