dolibarr 20.0.0
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 (isset($_SESSION['track_id_customer'])) {
74 $track_id = $_SESSION['track_id_customer'];
75}
76if (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/*
92 * Actions
93 */
94
95if ($cancel) {
96 $backtopage = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', DOL_URL_ROOT.'/public/ticket/');
97
98 header("Location: ".$backtopage);
99 exit;
100}
101
102if ($action == "view_ticketlist") {
103 $error = 0;
104 $display_ticket_list = false;
105 if (!strlen($track_id)) {
106 $error++;
107 array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("TicketTrackId")));
108 $action = '';
109 }
110
111 if (!strlen($email)) {
112 $error++;
113 array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("Email")));
114 $action = '';
115 } else {
116 if (!isValidEmail($email)) {
117 $error++;
118 array_push($object->errors, $langs->trans("ErrorEmailOrTrackingInvalid"));
119 $action = '';
120 }
121 }
122
123 if (!$error) {
124 $ret = $object->fetch('', '', $track_id);
125
126 if ($ret && $object->id > 0) {
127 // vérifie si l'adresse email est bien dans les contacts du ticket
128 $contacts = $object->liste_contact(-1, 'external');
129 foreach ($contacts as $contact) {
130 if (strtolower($contact['email']) == $email) {
131 $display_ticket_list = true;
132 $_SESSION['email_customer'] = $email;
133 $_SESSION['track_id_customer'] = $track_id;
134 break;
135 } else {
136 $display_ticket_list = false;
137 }
138 }
139 if ($object->fk_soc > 0) {
140 $object->fetch_thirdparty();
141 if ($email == strtolower($object->thirdparty->email)) {
142 $display_ticket_list = true;
143 $_SESSION['email_customer'] = $email;
144 $_SESSION['track_id_customer'] = $track_id;
145 }
146 }
147 if ($object->fk_user_create > 0) {
148 $tmpuser = new User($db);
149 $tmpuser->fetch($object->fk_user_create);
150 if ($email == strtolower($tmpuser->email)) {
151 $display_ticket_list = true;
152 $_SESSION['email_customer'] = $email;
153 $_SESSION['track_id_customer'] = $track_id;
154 }
155 }
156
157 $emailorigin = strtolower(CMailFile::getValidAddress($object->origin_email, 2));
158 if ($email == $emailorigin) {
159 $display_ticket_list = true;
160 $_SESSION['email_customer'] = $email;
161 $_SESSION['track_id_customer'] = $track_id;
162 }
163 } else {
164 $error++;
165 array_push($object->errors, $langs->trans("ErrorTicketNotFound", $track_id));
166 $action = '';
167 }
168 }
169
170 if ($error || $errors) {
171 setEventMessages($object->error, $object->errors, 'errors');
172 $action = '';
173 }
174}
175
176/*
177 * View
178 */
179
180$form = new Form($db);
181$user_assign = new User($db);
182$user_create = new User($db);
183$formTicket = new FormTicket($db);
184
185if (!getDolGlobalString('TICKET_ENABLE_PUBLIC_INTERFACE')) {
186 print '<div class="error">'.$langs->trans('TicketPublicInterfaceForbidden').'</div>';
187 $db->close();
188 exit();
189}
190
191$arrayofjs = array();
192$arrayofcss = array(getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', '/ticket/').'css/styles.css.php');
193
194llxHeaderTicket($langs->trans("Tickets"), "", 0, 0, $arrayofjs, $arrayofcss);
195
196
197if ($action == "view_ticketlist") {
198 print '<div class="ticketpublicarealist ticketlargemargin centpercent">';
199
200 print '<br>';
201 if ($display_ticket_list) {
202 // Filters
203 $search_fk_status = GETPOST("search_fk_status", 'alpha');
204 $search_subject = GETPOST("search_subject", 'alpha');
205 $search_type = GETPOST("search_type", 'alpha');
206 $search_category = GETPOST("search_category", 'alpha');
207 $search_severity = GETPOST("search_severity", 'alpha');
208 $search_fk_user_create = GETPOST("search_fk_user_create", "intcomma");
209 $search_fk_user_assign = GETPOST("search_fk_user_assign", "intcomma");
210
211 // Store current page url
212 $url_page_current = dol_buildpath('/public/ticket/list.php', 1);
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 ".$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 $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->fk_statut = $obj->fk_statut;
705 print $object->getLibStatut(2);
706 print '</td>';
707 }
708
709 print '<td></td>';
710
711 $i++;
712 print '</tr>';
713 }
714
715 print '</table>';
716 print '</div>';
717
718 print '</form>';
719
720 $url_public_ticket = getDolGlobalString('TICKET_URL_PUBLIC_INTERFACE', dol_buildpath('/public/ticket/', 1));
721
722 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;">';
723 print '<input type="hidden" name="token" value="'.newToken().'">';
724 print '<input type="hidden" name="action" value="view_ticket">';
725 print '<input type="hidden" name="btn_view_ticket_list" value="1">';
726 print '<input type="hidden" name="track_id" value="">';
727 print '<input type="hidden" name="email" value="">';
728 print "</form>";
729 print '<script type="text/javascript">
730 function viewticket(ticket_id, email) {
731 var form = $("#form_view_ticket");
732 form.find("input[name=\\"track_id\\"]").val(ticket_id);
733 form.find("input[name=\\"email\\"]").val(email);
734 form.submit();
735 }
736 </script>';
737 }
738 } else {
739 dol_print_error($db);
740 }
741 } else {
742 print '<div class="error">Not Allowed<br><a href="'.$_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'">'.$langs->trans('Back').'</a></div>';
743 }
744
745 print '</div>';
746} else {
747 print '<div class="ticketpublicarea ticketlargemargin centpercent">';
748
749 print '<p class="center opacitymedium">'.$langs->trans("TicketPublicMsgViewLogIn").'</p>';
750 print '<br>';
751
752 print '<div id="form_view_ticket">';
753 print '<form method="POST" class="maxwidth1000 center" name="form_view_ticketlist" action="'.$_SERVER['PHP_SELF'].(!empty($entity) && isModEnabled('multicompany') ? '?entity='.$entity : '').'">';
754 print '<input type="hidden" name="token" value="'.newToken().'">';
755 print '<input type="hidden" name="action" value="view_ticketlist">';
756 //print '<input type="hidden" name="search_fk_status" value="non_closed">';
757
758 print '<p><label for="track_id" style="display: inline-block" class="titlefieldcreate left"><span class="fieldrequired">';
759 print img_picto($langs->trans("TicketTrackId"), 'generic', 'class="pictofixedwidth"');
760 print $langs->trans("OneOfTicketTrackId");
761 print '</span></label>';
762 print '<br class="showonsmartphone hidden">';
763 print '<input class="minwidth100" id="track_id" name="track_id" value="'.(GETPOST('track_id', 'alpha') ? GETPOST('track_id', 'alpha') : '').'" />';
764 print '</p>';
765
766 print '<p><label for="email" style="display: inline-block" class="titlefieldcreate left"><span class="fieldrequired">';
767 print img_picto($langs->trans("Email"), 'email', 'class="pictofixedwidth"');
768 print $langs->trans('Email').'</span></label>';
769 print '<br class="showonsmartphone hidden">';
770 print '<input class="minwidth100" id="email" name="email" value="'.(GETPOST('email', 'alpha') ? GETPOST('email', 'alpha') : (!empty($_SESSION['customer_email']) ? $_SESSION['customer_email'] : "")).'" />';
771 print '</p>';
772
773 print '<p style="text-align: center; margin-top: 1.5em;">';
774 print '<input type="submit" class="button button-select" name="btn_view_ticket_list" value="'.$langs->trans('ViewMyTicketList').'" />';
775 print ' &nbsp; ';
776 print '<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
777 print "</p>\n";
778
779 print "</form>\n";
780 print "</div>\n";
781
782 print "</div>";
783}
784
785if (getDolGlobalInt('TICKET_SHOW_COMPANY_FOOTER')) {
786 // End of page
787 htmlPrintOnlineFooter($mysoc, $langs, 0, $suffix, $object);
788}
789
790llxFooter('', 'public');
791
792$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:142
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.