dolibarr 18.0.9
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2016 Jean-François FERRY <hello@librethic.io>
3 * Copyright (C) 2016 Christophe Battarel <christophe@altairis.fr>
4 * Copyright (C) 2018 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2021 Frédéric France <frederic.france@netlogic.fr>
6 * Copyright (C) 2021 Alexandre Spangaro <aspangaro@open-dsi.fr>
7 * Copyright (C) 2022 Charlene Benke <charlene@patas-monkey.com>
8 * Copyright (C) 2023 Benjamin Falière <benjamin.faliere@altairis.fr>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
29// Load Dolibarr environment
30require '../main.inc.php';
31require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
37require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
38require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
39if (isModEnabled('project')) {
40 include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
41 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
42 include_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
43}
44if (isModEnabled('contrat')) {
45 include_once DOL_DOCUMENT_ROOT.'/core/lib/contract.lib.php';
46 include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
47 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formcontract.class.php';
48}
49
50// Load translation files required by the page
51$langs->loadLangs(array("companies", "other", "ticket"));
52
53// Get parameters
54$id = GETPOST('id', 'int');
55$socid = GETPOST('socid', 'int');
56$track_id = GETPOST('track_id', 'alpha', 3);
57$ref = GETPOST('ref', 'alpha');
58$projectid = GETPOST('projectid', 'int');
59$cancel = GETPOST('cancel', 'alpha');
60$action = GETPOST('action', 'aZ09');
61$backtopage = GETPOST('backtopage', 'alpha');
62$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
63$contactid = GETPOST('contactid', 'int');
64
65$notifyTiers = GETPOST("notify_tiers_at_create", 'alpha');
66
67$sortfield = GETPOST('sortfield', 'aZ09comma') ? GETPOST('sortfield', 'aZ09comma') : "a.datep";
68$sortorder = GETPOST('sortorder', 'aZ09comma') ? GETPOST('sortorder', 'aZ09comma') : "desc";
69
70if (GETPOST('actioncode', 'array')) {
71 $actioncode = GETPOST('actioncode', 'array', 3);
72 if (!count($actioncode)) {
73 $actioncode = '0';
74 }
75} else {
76 $actioncode = GETPOST("actioncode", "alpha", 3) ?GETPOST("actioncode", "alpha", 3) : (GETPOST("actioncode") == '0' ? '0' : getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT'));
77}
78$search_rowid = GETPOST('search_rowid');
79$search_agenda_label = GETPOST('search_agenda_label');
80
81// Initialize technical object to manage hooks of ticket. Note that conf->hooks_modules contains array array
82$hookmanager->initHooks(array('ticketcard', 'globalcard'));
83
84$object = new Ticket($db);
85$extrafields = new ExtraFields($db);
86
87// Fetch optionals attributes and labels
88$extrafields->fetch_name_optionals_label($object->table_element);
89
90$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
91
92// Initialize array of search criterias
93$search_all = GETPOST("search_all", 'alpha');
94$search = array();
95foreach ($object->fields as $key => $val) {
96 if (GETPOST('search_'.$key, 'alpha')) {
97 $search[$key] = GETPOST('search_'.$key, 'alpha');
98 }
99}
100
101if (empty($action) && empty($id) && empty($ref)) {
102 $action = 'view';
103}
104
105//Select mail models is same action as add_message
106if (GETPOST('modelselected', 'alpha')) {
107 $action = 'presend';
108}
109
110// Load object
111//include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals
112if ($id || $track_id || $ref) {
113 $res = $object->fetch($id, $ref, $track_id);
114 if ($res >= 0) {
115 $id = $object->id;
116 $track_id = $object->track_id;
117 }
118}
119
120$now = dol_now();
121
122$actionobject = new ActionsTicket($db);
123
124// Store current page url
125$url_page_current = DOL_URL_ROOT.'/ticket/card.php';
126
127// Security check - Protection if external user
128if ($user->socid > 0) $socid = $user->socid;
129$result = restrictedArea($user, 'ticket', $object->id);
130
131$triggermodname = 'TICKET_MODIFY';
132$permissiontoread = $user->hasRight('ticket', 'read');
133$permissiontoadd = $user->hasRight('ticket', 'write');
134$permissiontodelete = $user->hasRight('ticket', 'delete');
135
136$upload_dir = $conf->ticket->dir_output;
137
138
139
140/*
141 * Actions
142 */
143
144$parameters = array();
145$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
146if ($reshook < 0) {
147 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
148}
149
150$error = 0;
151if (empty($reshook)) {
152 // Purge search criteria
153 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All test are required to be compatible with all browsers{
154 $actioncode = '';
155 $search_agenda_label = '';
156 }
157
158 $backurlforlist = DOL_URL_ROOT.'/ticket/list.php';
159
160 if (empty($backtopage) || ($cancel && empty($id))) {
161 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
162 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
163 $backtopage = $backurlforlist;
164 } else {
165 $backtopage = DOL_URL_ROOT.'/ticket/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
166 }
167 }
168 }
169
170 if ($cancel) {
171 if (!empty($backtopageforcancel)) {
172 header("Location: ".$backtopageforcancel);
173 exit;
174 } elseif (!empty($backtopage)) {
175 header("Location: ".$backtopage);
176 exit;
177 }
178 $action = 'view';
179 }
180
181 // Action to add an action (not a message)
182 if (GETPOST('save', 'alpha') && $permissiontoadd) {
183 $error = 0;
184
185 if (!GETPOST("type_code", 'alpha')) {
186 $error++;
187 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("TicketTypeRequest")), null, 'errors');
188 $action = 'create';
189 } elseif (!GETPOST("category_code", 'alpha')) {
190 $error++;
191 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("TicketCategory")), null, 'errors');
192 $action = 'create';
193 } elseif (!GETPOST("severity_code", 'alpha')) {
194 $error++;
195 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("TicketSeverity")), null, 'errors');
196 $action = 'create';
197 } elseif (!GETPOST("subject", 'alphanohtml')) {
198 $error++;
199 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject")), null, 'errors');
200 $action = 'create';
201 } elseif (!GETPOST("message", 'restricthtml')) {
202 $error++;
203 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Message")), null, 'errors');
204 $action = 'create';
205 }
206 $ret = $extrafields->setOptionalsFromPost(null, $object);
207 if ($ret < 0) {
208 $error++;
209 }
210
211 if (!$error) {
212 $db->begin();
213
214 $getRef = GETPOST("ref", 'alphanohtml');
215 $refcheck_object = new Ticket($db);
216 if ($refcheck_object->fetch('', $getRef) > 0) {
217 $object->ref = $object->getDefaultRef();
218 $object->track_id = null;
219 setEventMessage($langs->trans('TicketRefAlreadyUsed', $getRef, $object->ref));
220 } else {
221 $object->ref = $getRef;
222 }
223
224 $object->fk_soc = GETPOST("socid", 'int') > 0 ? GETPOST("socid", 'int') : 0;
225 $object->subject = GETPOST("subject", 'alphanohtml');
226 $object->message = GETPOST("message", 'restricthtml');
227
228 $object->type_code = GETPOST("type_code", 'alpha');
229 $object->type_label = $langs->trans($langs->getLabelFromKey($db, $object->type_code, 'c_ticket_type', 'code', 'label'));
230 $object->category_code = GETPOST("category_code", 'alpha');
231 $object->category_label = $langs->trans($langs->getLabelFromKey($db, $object->category_code, 'c_ticket_category', 'code', 'label'));
232 $object->severity_code = GETPOST("severity_code", 'alpha');
233 $object->severity_label = $langs->trans($langs->getLabelFromKey($db, $object->severity_code, 'c_ticket_severity', 'code', 'label'));
234 $object->email_from = $user->email;
235 $notifyTiers = GETPOST("notify_tiers_at_create", 'alpha');
236 $object->notify_tiers_at_create = empty($notifyTiers) ? 0 : 1;
237 $fk_user_assign = GETPOST("fk_user_assign", 'int');
238 if ($fk_user_assign > 0) {
239 $object->fk_user_assign = $fk_user_assign;
240 $object->status = $object::STATUS_ASSIGNED;
241 }
242
243 $object->fk_project = $projectid;
244
245 $id = $object->create($user);
246 if ($id <= 0) {
247 $error++;
248 setEventMessages($object->error, $object->errors, 'errors');
249 $action = 'create';
250 }
251
252 if (!$error) {
253 // Add contact
254 $contactid = GETPOST('contactid', 'int');
255 $type_contact = GETPOST("type", 'alpha');
256
257 // Category association
258 $categories = GETPOST('categories', 'array');
259 $object->setCategories($categories);
260
261 if ($contactid > 0 && $type_contact) {
262 $typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
263 $result = $object->add_contact($contactid, $typeid, 'external');
264 }
265
266 // Link ticket to project
267 if (GETPOST('origin', 'alpha') == 'projet') {
268 $projectid = GETPOST('originid', 'int');
269 } else {
270 $projectid = GETPOST('projectid', 'int');
271 }
272
273 if ($projectid > 0) {
274 $object->setProject($projectid);
275 }
276
277 // Auto mark as read if created from backend
278 if (getDolGlobalString('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND') && $user->rights->ticket->write) {
279 if ( ! $object->markAsRead($user) > 0) {
280 setEventMessages($object->error, $object->errors, 'errors');
281 }
282 }
283
284 // Auto assign user
285 if (getDolGlobalString('TICKET_AUTO_ASSIGN_USER_CREATE')) {
286 $result = $object->assignUser($user, $user->id, 1);
287 $object->add_contact($user->id, "SUPPORTTEC", 'internal');
288 }
289 }
290
291 if (!$error) {
292 // File transfer
293 $object->copyFilesForTicket(''); // trackid is forced to '' because files were uploaded when no id for ticket exists yet and trackid was ''
294 }
295
296 if (!$error) {
297 $db->commit();
298
299 if (!empty($backtopage)) {
300 if (empty($id)) {
301 $url = $backtopage;
302 } else {
303 $url = 'card.php?track_id='.urlencode($object->track_id);
304 }
305 } else {
306 $url = 'card.php?track_id='.urlencode($object->track_id);
307 }
308
309 header("Location: ".$url);
310 exit;
311 } else {
312 $db->rollback();
313 setEventMessages($object->error, $object->errors, 'errors');
314 }
315 } else {
316 setEventMessages($object->error, $object->errors, 'errors');
317 $action = 'create';
318 }
319 }
320
321 if ($action == 'update' && $permissiontoadd && $object->status < Ticket::STATUS_CLOSED) {
322 $error = 0;
323
324 $ret = $object->fetch(GETPOST('id', 'int'), GETPOST('ref', 'alpha'), GETPOST('track_id', 'alpha'));
325 if ($ret < 0) {
326 $error++;
327 array_push($object->errors, $langs->trans('ErrorTicketIsNotValid'));
328 }
329
330 // check fields
331 if (!$error) {
332 if (!GETPOST('subject', 'alpha')) {
333 $error++;
334 array_push($object->errors, $langs->trans('ErrorFieldRequired', $langs->transnoentities('Subject')));
335 }
336 $ret = $extrafields->setOptionalsFromPost(null, $object);
337 if ($ret < 0) {
338 $error++;
339 }
340 }
341
342 if (!$error) {
343 $db->begin();
344
345 $object->subject = GETPOST('subject', 'alpha');
346 $object->type_code = GETPOST('type_code', 'alpha');
347 $object->category_code = GETPOST('category_code', 'alpha');
348 $object->severity_code = GETPOST('severity_code', 'alpha');
349
350 $ret = $object->update($user);
351 if ($ret > 0) {
352 // Category association
353 $categories = GETPOST('categories', 'array');
354 $object->setCategories($categories);
355 } else {
356 $error++;
357 }
358
359 if ($error) {
360 $db->rollback();
361 } else {
362 $db->commit();
363 }
364 }
365
366 if ($error) {
367 setEventMessages($object->error, $object->errors, 'errors');
368 $action = 'edit';
369 } else {
370 if (!empty($backtopage)) {
371 if (empty($id)) {
372 $url = $backtopage;
373 } else {
374 $url = 'card.php?track_id='.urlencode($object->track_id);
375 }
376 } else {
377 $url = 'card.php?track_id='.urlencode($object->track_id);
378 }
379
380 header('Location: '.$url);
381 exit();
382 }
383 }
384
385 // Mark as Read
386 if ($action == "set_read" && $permissiontoadd) {
387 $object->fetch('', '', GETPOST("track_id", 'alpha'));
388
389 if ($object->markAsRead($user) > 0) {
390 setEventMessages($langs->trans('TicketMarkedAsRead'), null, 'mesgs');
391
392 header("Location: card.php?track_id=".$object->track_id);
393 exit;
394 } else {
395 setEventMessages($object->error, $object->errors, 'errors');
396 }
397 $action = 'view';
398 }
399
400 // Assign to someone
401 if ($action == "assign_user" && GETPOST('btn_assign_user', 'alpha') && $permissiontoadd) {
402 $object->fetch('', '', GETPOST("track_id", 'alpha'));
403 $useroriginassign = $object->fk_user_assign;
404 $usertoassign = GETPOST('fk_user_assign', 'int');
405
406 /*if (! ($usertoassign > 0)) {
407 $error++;
408 array_push($object->errors, $langs->trans("ErrorFieldRequired", $langs->transnoentities("AssignedTo")));
409 $action = 'view';
410 }*/
411
412 if (!$error) {
413 $ret = $object->assignUser($user, $usertoassign);
414 if ($ret < 0) {
415 $error++;
416 }
417 }
418
419 if (!$error) { // Update list of contacts
420 // Si déjà un user assigné on le supprime des contacts
421 if ($useroriginassign > 0) {
422 $internal_contacts = $object->listeContact(-1, 'internal', 0, 'SUPPORTTEC');
423 foreach ($internal_contacts as $key => $contact) {
424 if ($contact['id'] !== $usertoassign) {
425 $result = $object->delete_contact($contact['rowid']);
426 if ($result<0) {
427 $error++;
428 setEventMessages($object->error, $object->errors, 'errors');
429 }
430 }
431 }
432 }
433
434 if ($usertoassign > 0 && $usertoassign!==$useroriginassign) {
435 $result = $object->add_contact($usertoassign, "SUPPORTTEC", 'internal', $notrigger = 0);
436 if ($result<0) {
437 $error++;
438 setEventMessages($object->error, $object->errors, 'errors');
439 }
440 }
441 }
442
443 if (!$error) {
444 // Log action in ticket logs table
445 $object->fetch_user($usertoassign);
446 //$log_action = $langs->trans('TicketLogAssignedTo', $object->user->getFullName($langs));
447
448
449 setEventMessages($langs->trans('TicketAssigned'), null, 'mesgs');
450 header("Location: card.php?track_id=".$object->track_id);
451 exit;
452 } else {
453 array_push($object->errors, $object->error);
454 }
455 $action = 'view';
456 }
457
458 // Action to add a message (private or not, with email or not).
459 // This may also send an email (concatenated with email_intro and email footer if checkbox was selected)
460 if ($action == 'add_message' && GETPOSTISSET('btn_add_message') && $permissiontoread) {
461 $ret = $object->newMessage($user, $action, GETPOSTINT('private_message'), 0);
462
463 if ($ret > 0) {
464 if (!empty($backtopage)) {
465 $url = $backtopage;
466 } else {
467 $url = 'card.php?track_id='.urlencode($object->track_id);
468 }
469
470 header("Location: ".$url);
471 exit;
472 } else {
473 setEventMessages($object->error, $object->errors, 'errors');
474 $action = 'presend';
475 }
476 }
477
478 if (($action == "confirm_close" || $action == "confirm_abandon") && GETPOST('confirm', 'alpha') == 'yes' && $permissiontoadd) {
479 $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha'));
480
481 if ($object->close($user, ($action == "confirm_abandon" ? 1 : 0))) {
482 setEventMessages($langs->trans('TicketMarkedAsClosed'), null, 'mesgs');
483
484 $url = 'card.php?track_id='.GETPOST('track_id', 'alpha');
485 header("Location: ".$url);
486 } else {
487 $action = '';
488 setEventMessages($object->error, $object->errors, 'errors');
489 }
490 }
491
492 if ($action == "confirm_public_close" && GETPOST('confirm', 'alpha') == 'yes' && $permissiontoadd) {
493 $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha'));
494 if ($_SESSION['email_customer'] == $object->origin_email || $_SESSION['email_customer'] == $object->thirdparty->email) {
495 $object->close($user);
496
497 // Log action in ticket logs table
498 //$log_action = $langs->trans('TicketLogClosedBy', $_SESSION['email_customer']);
499
500 setEventMessages('<div class="confirm">'.$langs->trans('TicketMarkedAsClosed').'</div>', null, 'mesgs');
501
502 $url = 'card.php?track_id='.GETPOST('track_id', 'alpha');
503 header("Location: ".$url);
504 } else {
505 setEventMessages($object->error, $object->errors, 'errors');
506 $action = '';
507 }
508 }
509
510 if ($action == 'confirm_delete_ticket' && GETPOST('confirm', 'alpha') == "yes" && $permissiontodelete) {
511 if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) {
512 if ($object->delete($user) > 0) {
513 setEventMessages('<div class="confirm">'.$langs->trans('TicketDeletedSuccess').'</div>', null, 'mesgs');
514 Header("Location: ".DOL_URL_ROOT."/ticket/list.php");
515 exit;
516 } else {
517 $langs->load("errors");
518 $mesg = '<div class="error">'.$langs->trans($object->error).'</div>';
519 $action = '';
520 }
521 }
522 }
523
524 // Set parent company
525 if ($action == 'set_thirdparty' && $user->rights->ticket->write) {
526 if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) {
527 $result = $object->setCustomer(GETPOST('editcustomer', 'int'));
528 $url = $_SERVER["PHP_SELF"].'?track_id='.GETPOST('track_id', 'alpha');
529 header("Location: ".$url);
530 exit();
531 }
532 }
533
534 if ($action == 'set_progression' && $user->rights->ticket->write) {
535 if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) {
536 $result = $object->setProgression(GETPOST('progress', 'alpha'));
537
538 $url = 'card.php?track_id='.$object->track_id;
539 header("Location: ".$url);
540 exit();
541 }
542 }
543
544 if ($action == 'set_categories' && $user->rights->ticket->write) {
545 if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) {
546 $result = $object->setCategories(GETPOST('categories', 'array'));
547
548 $url = 'card.php?track_id='.$object->track_id;
549 header("Location: ".$url);
550 exit();
551 }
552 }
553
554 if ($action == 'setsubject' && $user->rights->ticket->write) {
555 if ($object->fetch(GETPOST('id', 'int'))) {
556 if ($action == 'setsubject') {
557 $object->subject = GETPOST('subject', 'alphanohtml');
558 }
559
560 if ($action == 'setsubject' && empty($object->subject)) {
561 $error++;
562 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Subject")), null, 'errors');
563 }
564
565 if (!$error) {
566 if ($object->update($user) >= 0) {
567 header("Location: ".$_SERVER['PHP_SELF']."?track_id=".$object->track_id);
568 exit;
569 } else {
570 $error++;
571 setEventMessages($object->error, $object->errors, 'errors');
572 }
573 }
574 }
575 }
576
577 if ($action == 'confirm_reopen' && $user->rights->ticket->manage && !GETPOST('cancel')) {
578 if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) {
579 // prevent browser refresh from reopening ticket several times
580 if ($object->status == Ticket::STATUS_CLOSED || $object->status == Ticket::STATUS_CANCELED) {
581 $res = $object->setStatut(Ticket::STATUS_ASSIGNED, null, '', 'TICKET_MODIFY');
582 if ($res) {
583 // Log action in ticket logs table
584 //$log_action = $langs->trans('TicketLogReopen');
585
586 $url = 'card.php?track_id='.$object->track_id;
587 header("Location: ".$url);
588 exit();
589 } else {
590 $error++;
591 setEventMessages($object->error, $object->errors, 'errors');
592 }
593 }
594 }
595 } elseif ($action == 'classin' && $permissiontoadd) {
596 // Categorisation dans projet
597 if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) {
598 $object->setProject($projectid);
599 $url = 'card.php?track_id='.$object->track_id;
600 header("Location: ".$url);
601 exit();
602 }
603 } elseif ($action == 'setcontract' && $permissiontoadd) {
604 // Categorisation dans contrat
605 if ($object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha')) >= 0) {
606 $object->setContract(GETPOST('contractid', 'int'));
607 $url = 'card.php?track_id='.$object->track_id;
608 header("Location: ".$url);
609 exit();
610 }
611 } elseif ($action == "set_message" && $user->rights->ticket->manage) {
612 if (!GETPOST('cancel')) {
613 $object->fetch('', '', GETPOST('track_id', 'alpha'));
614 $oldvalue_message = $object->message;
615 $fieldtomodify = GETPOST('message_initial', 'restricthtml');
616
617 $object->message = $fieldtomodify;
618 $ret = $object->update($user);
619 if ($ret > 0) {
620 //$log_action = $langs->trans('TicketInitialMessageModified')." \n";
621 // include the Diff class
622 include_once DOL_DOCUMENT_ROOT.'/core/class/utils_diff.class.php';
623 // output the result of comparing two files as plain text
624 //$log_action .= Diff::toString(Diff::compare(strip_tags($oldvalue_message), strip_tags($object->message)));
625
626 setEventMessages($langs->trans('TicketMessageSuccesfullyUpdated'), null, 'mesgs');
627 } else {
628 $error++;
629 setEventMessages($object->error, $object->errors, 'errors');
630 }
631 }
632
633 $action = 'view';
634 } elseif ($action == 'confirm_set_status' && $permissiontoadd && !GETPOST('cancel')) {
635 // Reopen ticket
636 if ($object->fetch(GETPOST('id', 'int'), GETPOST('track_id', 'alpha')) >= 0) {
637 $new_status = GETPOST('new_status', 'int');
638 $old_status = $object->status;
639 $res = $object->setStatut($new_status, null, '', 'TICKET_MODIFY');
640 if ($res) {
641 // Log action in ticket logs table
642 $log_action = $langs->trans('TicketLogStatusChanged', $langs->transnoentities($object->statuts_short[$old_status]), $langs->transnoentities($object->statuts_short[$new_status]));
643
644 $url = 'card.php?track_id='.$object->track_id;
645 header("Location: ".$url);
646 exit();
647 } else {
648 $error++;
649 setEventMessages($object->error, $object->errors, 'errors');
650 }
651 }
652 }
653
654 // Action to update one extrafield
655 if ($action == "update_extras" && $permissiontoadd) {
656 $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha'));
657
658 $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
659 if ($ret < 0) {
660 $error++;
661 }
662
663 if (!$error) {
664 $result = $object->insertExtraFields(empty($triggermodname) ? '' : $triggermodname, $user);
665 if ($result < 0) {
666 $error++;
667 }
668 }
669
670 if ($error) {
671 setEventMessages($object->error, $object->errors, 'errors');
672 $action = 'edit_extras';
673 } else {
674 setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
675 $action = 'view';
676 }
677 }
678
679 if ($action == "change_property" && GETPOST('btn_update_ticket_prop', 'alpha') && $permissiontoadd) {
680 $object->fetch(GETPOST('id', 'int'), '', GETPOST('track_id', 'alpha'));
681
682 $object->type_code = GETPOST('update_value_type', 'aZ09');
683 $object->severity_code = GETPOST('update_value_severity', 'aZ09');
684 $object->category_code = GETPOST('update_value_category', 'aZ09');
685
686 $ret = $object->update($user);
687 if ($ret > 0) {
688 //$log_action = $langs->trans('TicketLogPropertyChanged', $oldvalue_label, $newvalue_label);
689
690 setEventMessages($langs->trans('TicketUpdated'), null, 'mesgs');
691 } else {
692 $error++;
693 setEventMessages($object->error, $object->errors, 'errors');
694 }
695 $action = 'view';
696 }
697
698
699 $permissiondellink = $user->rights->ticket->write;
700 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once
701
702 // Actions to build doc
703 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
704 //var_dump($action);exit;
705
706 // Actions to send emails
707 $triggersendname = 'TICKET_SENTBYMAIL';
708 $paramname = 'id';
709 $autocopy = 'MAIN_MAIL_AUTOCOPY_TICKET_TO'; // used to know the automatic BCC to add
710 $trackid = 'tic'.$object->id;
711 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
712
713 // Set $action to correct value for the case we used presend action to add a message
714 if (GETPOSTISSET('actionbis') && $action == 'presend') {
715 $action = 'presend_addmessage';
716 }
717}
718
719
720/*
721 * View
722 */
723
724$userstat = new User($db);
725$form = new Form($db);
726$formticket = new FormTicket($db);
727if (isModEnabled('project')) {
728 $formproject = new FormProjets($db);
729}
730
731$help_url = 'EN:Module_Ticket|FR:DocumentationModuleTicket';
732
733$title = $actionobject->getTitle($action);
734
735llxHeader('', $title, $help_url);
736
737if ($action == 'create' || $action == 'presend') {
738 $formticket = new FormTicket($db);
739
740 print load_fiche_titre($langs->trans('NewTicket'), '', 'ticket');
741
742 $formticket->trackid = ''; // TODO Use a unique key 'tic' to avoid conflict in upload file feature
743
744 if (GETPOST("mode", "aZ09") == 'init' && empty($_POST)) {
745 $formticket->clear_attached_files();
746 }
747
748 $formticket->withfromsocid = $socid ? $socid : $user->socid;
749 $formticket->withfromcontactid = $contactid ? $contactid : '';
750 $formticket->withtitletopic = 1;
751 $formticket->withnotifytiersatcreate = ($notifyTiers ? 1 : (getDolGlobalString('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION') ? 1 : 0));
752 $formticket->withusercreate = 0;
753 $formticket->withref = 1;
754 $formticket->fk_user_create = $user->id;
755 $formticket->withfile = 2;
756 $formticket->withextrafields = 1;
757 $formticket->param = array('origin' => GETPOST('origin'), 'originid' => GETPOST('originid'));
758
759 $formticket->withcancel = 1;
760
761 $formticket->showForm(1, 'create', 0, null, $action);
762 /*} elseif ($action == 'edit' && $user->rights->ticket->write && $object->status < Ticket::STATUS_CLOSED) {
763 $formticket = new FormTicket($db);
764
765 $head = ticket_prepare_head($object);
766
767 print '<form method="POST" name="form_ticket" id="form_edit_ticket" action="'.$_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'">';
768 print '<input type="hidden" name="token" value="'.newToken().'">';
769 print '<input type="hidden" name="action" value="update">';
770 print '<input type="hidden" name="tack_id" value="'.$object->track_id.'">';
771
772 print dol_get_fiche_head($head, 'card', $langs->trans('Ticket'), 0, 'ticket');
773
774 print '<div class="fichecenter2">';
775 print '<table class="border" width="100%">';
776
777 // Type
778 print '<tr><td class="titlefield"><span class="fieldrequired"><label for="selecttype_code">'.$langs->trans("TicketTypeRequest").'</span></label></td><td>';
779 $formticket->selectTypesTickets((GETPOSTISSET('type_code') ? GETPOST('type_code') : $object->type_code), 'type_code', '', '2');
780 print '</td></tr>';
781
782 // Severity
783 print '<tr><td><span class="fieldrequired"><label for="selectseverity_code">'.$langs->trans("TicketSeverity").'</span></label></td><td>';
784 $formticket->selectSeveritiesTickets((GETPOSTISSET('severity_code') ? GETPOST('severity_code') : $object->severity_code), 'severity_code', '', '2');
785 print '</td></tr>';
786
787 // Group
788 print '<tr><td><span class="fieldrequired"><label for="selectcategory_code">'.$langs->trans("TicketCategory").'</span></label></td><td>';
789 $formticket->selectGroupTickets((GETPOSTISSET('category_code') ? GETPOST('category_code') : $object->category_code), 'category_code', '', '2');
790 print '</td></tr>';
791
792 // Subject
793 print '<tr><td><label for="subject"><span class="fieldrequired">'.$langs->trans("Subject").'</span></label></td><td>';
794 print '<input class="text minwidth200" id="subject" name="subject" value="'.dol_escape_htmltag(GETPOSTISSET('subject') ? GETPOST('subject', 'alpha') : $object->subject).'" />';
795 print '</td></tr>';
796
797 // Other attributes
798 $parameters = array('colspan' => ' colspan="3"', 'colspanvalue' => '3');
799 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
800 print $hookmanager->resPrint;
801 if (empty($reshook)) {
802 print $object->showOptionals($extrafields, 'edit');
803 }
804
805 print '</table>';
806 print '</div>';
807
808 print dol_get_fiche_end();
809
810 print $form->buttonsSaveCancel();
811
812 print '</form>'; */
813} elseif (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'dellink' || $action == 'presend' || $action == 'presend_addmessage' || $action == 'close' || $action == 'abandon' || $action == 'delete' || $action == 'editcustomer' || $action == 'progression' || $action == 'categories' || $action == 'reopen'
814 || $action == 'editsubject' || $action == 'edit_extras' || $action == 'update_extras' || $action == 'edit_extrafields' || $action == 'set_extrafields' || $action == 'classify' || $action == 'sel_contract' || $action == 'edit_message_init' || $action == 'set_status' || $action == 'dellink') {
815 if ($res > 0) {
816 // or for unauthorized internals users
817 if (!$user->socid && (getDolGlobalString('TICKET_LIMIT_VIEW_ASSIGNED_ONLY') && $object->fk_user_assign != $user->id) && !$user->rights->ticket->manage) {
818 accessforbidden('', 0, 1);
819 }
820
821 // Confirmation close
822 if ($action == 'close') {
823 $thirdparty_contacts = $object->getInfosTicketExternalContact(1);
824 $contacts_select = array(
825 '-2' => $langs->trans('TicketNotifyAllTiersAtClose'),
826 '-3' => $langs->trans('TicketNotNotifyTiersAtClose')
827 );
828 foreach ($thirdparty_contacts as $thirdparty_contact) {
829 $contacts_select[$thirdparty_contact['id']] = $thirdparty_contact['civility'] . ' ' . $thirdparty_contact['lastname'] . ' ' . $thirdparty_contact['firstname'];
830 }
831
832 // Default select all or no contact
833 $default = (getDolGlobalString('TICKET_NOTIFY_AT_CLOSING') ? -2 : -3);
834 $formquestion = array(
835 array(
836 'name' => 'contactid',
837 'type' => 'select',
838 'label' => $langs->trans('NotifyThirdpartyOnTicketClosing'),
839 'values' => $contacts_select,
840 'default' => $default
841 ),
842 );
843
844 print $form->formconfirm($url_page_current."?track_id=".$object->track_id, $langs->trans("CloseATicket"), $langs->trans("ConfirmCloseAticket"), "confirm_close", $formquestion, '', 1);
845 }
846 // Confirmation abandon
847 if ($action == 'abandon') {
848 print $form->formconfirm($url_page_current."?track_id=".$object->track_id, $langs->trans("AbandonTicket"), $langs->trans("ConfirmAbandonTicket"), "confirm_abandon", '', '', 1);
849 }
850 // Confirmation delete
851 if ($action == 'delete') {
852 print $form->formconfirm($url_page_current."?track_id=".$object->track_id, $langs->trans("Delete"), $langs->trans("ConfirmDeleteTicket"), "confirm_delete_ticket", '', '', 1);
853 }
854 // Confirm reopen
855 if ($action == 'reopen') {
856 print $form->formconfirm($url_page_current.'?track_id='.$object->track_id, $langs->trans('ReOpen'), $langs->trans('ConfirmReOpenTicket'), 'confirm_reopen', '', '', 1);
857 }
858 // Confirmation status change
859 if ($action == 'set_status') {
860 $new_status = GETPOST('new_status');
861 //var_dump($url_page_current . "?track_id=" . $object->track_id);
862 print $form->formconfirm($url_page_current."?track_id=".$object->track_id."&new_status=".GETPOST('new_status'), $langs->trans("TicketChangeStatus"), $langs->trans("TicketConfirmChangeStatus", $langs->transnoentities($object->statuts_short[$new_status])), "confirm_set_status", '', '', 1);
863 }
864
865 // project info
866 if ($projectid > 0) {
867 $projectstat = new Project($db);
868 if ($projectstat->fetch($projectid) > 0) {
869 $projectstat->fetch_thirdparty();
870
871 // To verify role of users
872 //$userAccess = $object->restrictedProjectArea($user,'read');
873 $userWrite = $projectstat->restrictedProjectArea($user, 'write');
874 //$userDelete = $object->restrictedProjectArea($user,'delete');
875 //print "userAccess=".$userAccess." userWrite=".$userWrite." userDelete=".$userDelete;
876
877 $head = project_prepare_head($projectstat);
878
879 print dol_get_fiche_head($head, 'ticket', $langs->trans("Project"), 0, ($projectstat->public ? 'projectpub' : 'project'));
880
881 print '<table class="border centpercent">';
882
883 $linkback = '<a href="'.DOL_URL_ROOT.'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
884
885 // Ref
886 print '<tr><td width="30%">'.$langs->trans('Ref').'</td><td colspan="3">';
887 // Define a complementary filter for search of next/prev ref.
888 if (empty($user->rights->projet->all->lire)) {
889 $objectsListId = $projectstat->getProjectsAuthorizedForUser($user, $mine, 0);
890 $projectstat->next_prev_filter = "rowid IN (".$db->sanitize(count($objectsListId) ? join(',', array_keys($objectsListId)) : '0').")";
891 }
892 print $form->showrefnav($projectstat, 'ref', $linkback, 1, 'ref', 'ref', '');
893 print '</td></tr>';
894
895 // Label
896 print '<tr><td>'.$langs->trans("Label").'</td><td>'.$projectstat->title.'</td></tr>';
897
898 // Customer
899 print "<tr><td>".$langs->trans("ThirdParty")."</td>";
900 print '<td colspan="3">';
901 if ($projectstat->thirdparty->id > 0) {
902 print $projectstat->thirdparty->getNomUrl(1);
903 } else {
904 print '&nbsp;';
905 }
906
907 print '</td></tr>';
908
909 // Visibility
910 print '<tr><td>'.$langs->trans("Visibility").'</td><td>';
911 if ($projectstat->public) {
912 print $langs->trans('SharedProject');
913 } else {
914 print $langs->trans('PrivateProject');
915 }
916
917 print '</td></tr>';
918
919 // Statut
920 print '<tr><td>'.$langs->trans("Status").'</td><td>'.$projectstat->getLibStatut(4).'</td></tr>';
921
922 print "</table>";
923
924 print dol_get_fiche_end();
925 } else {
926 print "ErrorRecordNotFound";
927 }
928 } elseif ($socid > 0) {
929 $object->fetch_thirdparty();
930 $head = societe_prepare_head($object->thirdparty);
931
932 print dol_get_fiche_head($head, 'ticket', $langs->trans("ThirdParty"), 0, 'company');
933
934 dol_banner_tab($object->thirdparty, 'socid', '', ($user->socid ? 0 : 1), 'rowid', 'nom');
935
936 print dol_get_fiche_end();
937 }
938
939 if (!$user->socid && getDolGlobalString('TICKET_LIMIT_VIEW_ASSIGNED_ONLY')) {
940 $object->next_prev_filter = "te.fk_user_assign = ".((int) $user->id);
941 } elseif ($user->socid > 0) {
942 $object->next_prev_filter = "te.fk_soc = ".((int) $user->socid);
943 }
944
945 $head = ticket_prepare_head($object);
946
947 print dol_get_fiche_head($head, 'tabTicket', $langs->trans("Ticket"), -1, 'ticket');
948
949 $morehtmlref = '<div class="refidno">';
950 $morehtmlref .= $object->subject;
951 // Author
952 if ($object->fk_user_create > 0) {
953 $morehtmlref .= '<br>'.$langs->trans("CreatedBy").' : ';
954
955 $fuser = new User($db);
956 $fuser->fetch($object->fk_user_create);
957 $morehtmlref .= $fuser->getNomUrl(-1);
958 } elseif (!empty($object->email_msgid)) {
959 $morehtmlref .= '<br>'.$langs->trans("CreatedBy").' : ';
960 $morehtmlref .= img_picto('', 'email', 'class="paddingrightonly"');
961 $htmltooltip = $langs->trans("EmailMsgID").': '.$object->email_msgid;
962 $htmltooltip .= '<br>'.$langs->trans("EmailDate").': '.dol_print_date($object->email_date, 'dayhour');
963 $morehtmlref .= dol_escape_htmltag($object->origin_email).' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans("CreatedByEmailCollector"), $htmltooltip, 1, 'help', '', 0, 3, 'tooltip').'</small>';
964 } elseif (!empty($object->origin_email)) {
965 $morehtmlref .= '<br>'.$langs->trans("CreatedBy").' : ';
966 $morehtmlref .= img_picto('', 'email', 'class="paddingrightonly"');
967 $htmltooptip = $langs->trans("IP").': '.$object->ip;
968 $morehtmlref .= dol_escape_htmltag($object->origin_email).' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans("CreatedByPublicPortal"), $htmltooptip, 1, 'help', '', 0, 3, 'tooltip').'</small>';
969 }
970
971 $permissiontoedit = $object->status < 8 && !$user->socid && $user->rights->ticket->write;
972 //$permissiontoedit = 0;
973
974 // Thirdparty
975 if (isModEnabled("societe")) {
976 $morehtmlref .= '<br>';
977 $morehtmlref .= img_picto($langs->trans("ThirdParty"), 'company', 'class="pictofixedwidth"');
978 if ($action != 'editcustomer' && $permissiontoedit) {
979 $morehtmlref .= '<a class="editfielda" href="'.$url_page_current.'?action=editcustomer&token='.newToken().'&track_id='.$object->track_id.'">'.img_edit($langs->transnoentitiesnoconv('SetThirdParty'), 0).'</a> ';
980 }
981 $morehtmlref .= $form->form_thirdparty($url_page_current.'?track_id='.$object->track_id, $object->socid, $action == 'editcustomer' ? 'editcustomer' : 'none', '', 1, 0, 0, array(), 1);
982 if (!empty($object->socid)) {
983 $morehtmlref .= ' - <a href="'.DOL_URL_ROOT.'/ticket/list.php?socid='.$object->socid.'&sortfield=t.datec&sortorder=desc">'.img_picto($langs->trans("Tickets"), 'ticket', 'class="pictofixedwidth"').' '.$langs->trans("TicketHistory").'</a>';
984 }
985 }
986
987 // Project
988 if (isModEnabled('project')) {
989 $langs->load("projects");
990 $morehtmlref .= '<br>';
991 if ($permissiontoedit) {
992 $object->fetch_project();
993 $morehtmlref .= img_picto($langs->trans("Project"), 'project'.((is_object($object->project) && $object->project->public) ? 'pub' : ''), 'class="pictofixedwidth"');
994 if ($action != 'classify') {
995 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
996 }
997 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
998 } else {
999 if (!empty($object->fk_project)) {
1000 $object->fetch_project();
1001 $morehtmlref .= $object->project->getNomUrl(1);
1002 if ($object->project->title) {
1003 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($object->project->title).'</span>';
1004 }
1005 }
1006 }
1007 }
1008
1009 $morehtmlref .= '</div>';
1010
1011 $linkback = '<a href="'.DOL_URL_ROOT.'/ticket/list.php?restore_lastsearch_values=1"><strong>'.$langs->trans("BackToList").'</strong></a> ';
1012
1013 dol_banner_tab($object, 'ref', $linkback, ($user->socid ? 0 : 1), 'ref', 'ref', $morehtmlref);
1014
1015 print '<div class="fichecenter">';
1016 print '<div class="fichehalfleft">';
1017 print '<div class="underbanner clearboth"></div>';
1018
1019 print '<table class="border tableforfield centpercent">';
1020
1021 // Track ID
1022 print '<tr><td class="titlefield">'.$langs->trans("TicketTrackId").'</td><td>';
1023 if (!empty($object->track_id)) {
1024 if (empty($object->ref)) {
1025 $object->ref = $object->id;
1026 print $form->showrefnav($object, 'id', $linkback, 1, 'rowid', 'track_id');
1027 } else {
1028 print $object->track_id;
1029 }
1030 } else {
1031 print $langs->trans('None');
1032 }
1033 print '</td></tr>';
1034
1035 // Subject
1036 print '<tr><td>';
1037 print $form->editfieldkey("Subject", 'subject', $object->subject, $object, $user->rights->ticket->write && !$user->socid, 'string');
1038 print '</td><td>';
1039 print $form->editfieldval("Subject", 'subject', $object->subject, $object, $user->rights->ticket->write && !$user->socid, 'string');
1040 print '</td></tr>';
1041
1042 // Creation date
1043 print '<tr><td>'.$langs->trans("DateCreation").'</td><td>';
1044 print dol_print_date($object->datec, 'dayhour', 'tzuser');
1045 print '<span class="opacitymedium"> - '.$langs->trans("TimeElapsedSince").': <i>'.convertSecondToTime(roundUpToNextMultiple($now - $object->datec, 60)).'</i></span>';
1046 print '</td></tr>';
1047
1048 // Origin
1049 /*
1050 if ($object->email_msgid) {
1051 $texttoshow = $langs->trans("CreatedByEmailCollector");
1052 } elseif ($object->origin_email) {
1053 $texttoshow = $langs->trans("FromPublicEmail");
1054 }
1055 if ($texttoshow) {
1056 print '<tr><td class="titlefield fieldname_email_origin">';
1057 print $langs->trans("Origin");
1058 print '</td>';
1059 print '<td class="valuefield fieldname_email_origin">';
1060 print $texttoshow;
1061 print '</td></tr>';
1062 }
1063 */
1064
1065 // Read date
1066 print '<tr><td>'.$langs->trans("TicketReadOn").'</td><td>';
1067 if (!empty($object->date_read)) {
1068 print dol_print_date($object->date_read, 'dayhour', 'tzuser');
1069 print '<span class="opacitymedium"> - '.$langs->trans("TicketTimeElapsedBeforeSince").': <i>'.convertSecondToTime(roundUpToNextMultiple($object->date_read - $object->datec, 60)).'</i>';
1070 print ' / <i>'.convertSecondToTime(roundUpToNextMultiple($now - $object->date_read, 60)).'</i></span>';
1071 }
1072 print '</td></tr>';
1073
1074 // Close date
1075 print '<tr><td>'.$langs->trans("TicketCloseOn").'</td><td>';
1076 if (!empty($object->date_close)) {
1077 print dol_print_date($object->date_close, 'dayhour', 'tzuser');
1078 }
1079 print '</td></tr>';
1080
1081 // User assigned
1082 print '<tr><td>';
1083 print '<table class="nobordernopadding" width="100%"><tr><td class="nowrap">';
1084 print $langs->trans("AssignedTo");
1085 if (isset($object->status) && $object->status < $object::STATUS_CLOSED && GETPOST('set', 'alpha') != "assign_ticket" && $user->rights->ticket->manage) {
1086 print '</td><td class="right"><a class="editfielda" href="'.$url_page_current.'?track_id='.urlencode($object->track_id).'&set=assign_ticket">'.img_edit($langs->trans('Modify'), '').'</a>';
1087 }
1088 print '</td></tr></table>';
1089 print '</td><td>';
1090 if (GETPOST('set', 'alpha') != "assign_ticket" && $object->fk_user_assign > 0) {
1091 $userstat->fetch($object->fk_user_assign);
1092 print $userstat->getNomUrl(-1);
1093 }
1094
1095 // Show user list to assignate one if status is "read"
1096 if (GETPOST('set', 'alpha') == "assign_ticket" && $object->status < 8 && !$user->socid && $user->rights->ticket->write) {
1097 print '<form method="post" name="ticket" enctype="multipart/form-data" action="'.$url_page_current.'">';
1098 print '<input type="hidden" name="token" value="'.newToken().'">';
1099 print '<input type="hidden" name="action" value="assign_user">';
1100 print '<input type="hidden" name="track_id" value="'.$object->track_id.'">';
1101 //print '<label for="fk_user_assign">'.$langs->trans("AssignUser").'</label> ';
1102 print $form->select_dolusers(empty($object->fk_user_assign)?$user->id:$object->fk_user_assign, 'fk_user_assign', 1);
1103 print ' <input type="submit" class="button small" name="btn_assign_user" value="'.$langs->trans("Validate").'" />';
1104 print '</form>';
1105 }
1106 print '</td></tr>';
1107
1108 // Progression
1109 print '<tr><td>';
1110 print '<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
1111 print $langs->trans('Progression').'</td><td class="left">';
1112 print '</td>';
1113 if ($action != 'progression' && isset($object->status) && $object->status < $object::STATUS_CLOSED && !$user->socid) {
1114 print '<td class="right"><a class="editfielda" href="'.$url_page_current.'?action=progression&token='.newToken().'&track_id='.urlencode($object->track_id).'">'.img_edit($langs->trans('Modify')).'</a></td>';
1115 }
1116 print '</tr></table>';
1117 print '</td><td>';
1118 if ($user->rights->ticket->write && $action == 'progression') {
1119 print '<form action="'.$url_page_current.'" method="post">';
1120 print '<input type="hidden" name="token" value="'.newToken().'">';
1121 print '<input type="hidden" name="track_id" value="'.$track_id.'">';
1122 print '<input type="hidden" name="action" value="set_progression">';
1123 print '<input type="text" class="flat width75" name="progress" value="'.$object->progress.'">';
1124 print ' <input type="submit" class="button button-edit small" value="'.$langs->trans('Modify').'">';
1125 print '</form>';
1126 } else {
1127 print($object->progress > 0 ? $object->progress : '0').'%';
1128 }
1129 print '</td>';
1130 print '</tr>';
1131
1132 // Timing (Duration sum of linked fichinter)
1133 if (isModEnabled('ficheinter')) {
1134 $object->fetchObjectLinked();
1135 $num = count($object->linkedObjects);
1136 $timing = 0;
1137 $foundinter = 0;
1138 if ($num) {
1139 foreach ($object->linkedObjects as $objecttype => $objects) {
1140 if ($objecttype == "fichinter") {
1141 foreach ($objects as $fichinter) {
1142 $foundinter++;
1143 $timing += $fichinter->duration;
1144 }
1145 }
1146 }
1147 }
1148 print '<tr><td>';
1149 print $form->textwithpicto($langs->trans("TicketDurationAuto"), $langs->trans("TicketDurationAutoInfos"), 1);
1150 print '</td><td>';
1151 print $foundinter ? convertSecondToTime($timing, 'all', getDolGlobalString('MAIN_DURATION_OF_WORKDAY')) : '';
1152 print '</td></tr>';
1153 }
1154
1155 // Other attributes
1156 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1157
1158 print '</table>';
1159
1160
1161 // Fin colonne gauche et début colonne droite
1162 print '</div><div class="fichehalfright">';
1163
1164
1165 print '<form method="post" name="formticketproperties" action="'.$url_page_current.'">';
1166 print '<input type="hidden" name="token" value="'.newToken().'">';
1167 print '<input type="hidden" name="action" value="change_property">';
1168 print '<input type="hidden" name="track_id" value="'.$track_id.'">';
1169 print '<input type="hidden" name="trackid" value="'.$trackid.'">';
1170
1171 print '<div class="underbanner clearboth"></div>';
1172
1173 // Categories
1174 if (isModEnabled('categorie')) {
1175 print '<table class="border centpercent tableforfield">';
1176 print '<tr>';
1177 print '<td class="valignmiddle titlefield">';
1178 print '<table class="nobordernopadding centpercent"><tr><td class="titlefield">';
1179 print $langs->trans("Categories");
1180 if ($action != 'categories' && !$user->socid) {
1181 print '<td class="right"><a class="editfielda" href="'.$url_page_current.'?action=categories&amp;track_id='.$object->track_id.'">'.img_edit($langs->trans('Modify')).'</a></td>';
1182 }
1183 print '</table>';
1184 print '</td>';
1185
1186 if ($user->rights->ticket->write && $action == 'categories') {
1187 $cate_arbo = $form->select_all_categories(Categorie::TYPE_TICKET, '', 'parent', 64, 0, 1);
1188 if (is_array($cate_arbo)) {
1189 // Categories
1190 print '<td colspan="3">';
1191 print '<form action="'.$url_page_current.'" method="post">';
1192 print '<input type="hidden" name="token" value="'.newToken().'">';
1193 print '<input type="hidden" name="track_id" value="'.$track_id.'">';
1194 print '<input type="hidden" name="action" value="set_categories">';
1195
1196 $category = new Categorie($db);
1197 $cats = $category->containing($object->id, 'ticket');
1198 $arrayselected = array();
1199 foreach ($cats as $cat) {
1200 $arrayselected[] = $cat->id;
1201 }
1202
1203 print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('categories', $cate_arbo, $arrayselected, '', 0, 'quatrevingtpercent widthcentpercentminusx', 0, 0);
1204 print '<input type="submit" class="button button-edit small" value="'.$langs->trans('Save').'">';
1205 print '</form>';
1206 print "</td>";
1207 }
1208 } else {
1209 print '<td colspan="3">';
1210 print $form->showCategories($object->id, Categorie::TYPE_TICKET, 1);
1211 print "</td></tr>";
1212 }
1213
1214 print '</table>';
1215 }
1216
1217 // View Original message
1218 $actionobject->viewTicketOriginalMessage($user, $action, $object);
1219
1220 // Classification of ticket
1221 print '<div class="div-table-responsive-no-min">'; // You can use div-table-responsive-no-min if you dont need reserved height for your table
1222 print '<table class="noborder tableforfield centpercent margintable">';
1223 print '<tr class="liste_titre">';
1224 print '<td>';
1225 print $langs->trans('TicketProperties');
1226 print '</td>';
1227 print '<td>';
1228 if (GETPOST('set', 'alpha') == 'properties' && $user->rights->ticket->write) {
1229 print '<input type="submit" class="button small" name="btn_update_ticket_prop" value="'.$langs->trans("Modify").'" />';
1230 } else {
1231 // Button to edit Properties
1232 if (isset($object->status) && $object->status < $object::STATUS_NEED_MORE_INFO && $user->rights->ticket->write) {
1233 print ' <a class="editfielda" href="card.php?track_id='.$object->track_id.'&set=properties">'.img_edit($langs->trans('Modify')).'</a>';
1234 }
1235 }
1236 print '</td>';
1237 print '</tr>';
1238
1239 if (GETPOST('set', 'alpha') == 'properties' && $user->rights->ticket->write) {
1240 print '<tr>';
1241 // Type
1242 print '<td class="titlefield">';
1243 print $langs->trans('Type');
1244 print '</td><td>';
1245 $formticket->selectTypesTickets($object->type_code, 'update_value_type', '', 2);
1246 print '</td>';
1247 print '</tr>';
1248 // Group
1249 print '<tr>';
1250 print '<td>';
1251 print $langs->trans('TicketCategory');
1252 print '</td><td>';
1253 $formticket->selectGroupTickets($object->category_code, 'update_value_category', '', 2, 0, 0, 0, 'maxwidth500 widthcentpercentminusxx');
1254 print '</td>';
1255 print '</tr>';
1256 // Severity
1257 print '<tr>';
1258 print '<td>';
1259 print $langs->trans('TicketSeverity');
1260 print '</td><td>';
1261 $formticket->selectSeveritiesTickets($object->severity_code, 'update_value_severity', '', 2);
1262 print '</td>';
1263 print '</tr>';
1264 } else {
1265 // Type
1266 print '<tr><td class="titlefield">'.$langs->trans("Type").'</td><td>';
1267 if (!empty($object->type_code)) {
1268 print $langs->getLabelFromKey($db, 'TicketTypeShort'.$object->type_code, 'c_ticket_type', 'code', 'label', $object->type_code);
1269 }
1270 print '</td></tr>';
1271 // Group
1272 $s = '';
1273 if (!empty($object->category_code)) {
1274 $s = $langs->getLabelFromKey($db, 'TicketCategoryShort'.$object->category_code, 'c_ticket_category', 'code', 'label', $object->category_code);
1275 }
1276 print '<tr><td>'.$langs->trans("TicketCategory").'</td><td class="tdoverflowmax200" title="'.dol_escape_htmltag($s).'">';
1277 print dol_escape_htmltag($s);
1278 print '</td></tr>';
1279 // Severity
1280 print '<tr><td>'.$langs->trans("TicketSeverity").'</td><td>';
1281 if (!empty($object->severity_code)) {
1282 print $langs->getLabelFromKey($db, 'TicketSeverityShort'.$object->severity_code, 'c_ticket_severity', 'code', 'label', $object->severity_code);
1283 }
1284 print '</td></tr>';
1285 }
1286 print '</table>'; // End table actions
1287 print '</div>';
1288
1289 print '</form>';
1290
1291 // Display navbar with links to change ticket status
1292 print '<!-- navbar with status -->';
1293 if (!$user->socid && $user->rights->ticket->write && isset($object->status) && $object->status < $object::STATUS_CLOSED && GETPOST('set') !== 'properties') {
1294 $actionobject->viewStatusActions($object);
1295 }
1296
1297
1298 if (getDolGlobalString('MAIN_DISABLE_CONTACTS_TAB')) {
1299 print load_fiche_titre($langs->trans('Contacts'), '', 'title_companies.png');
1300
1301 print '<div class="div-table-responsive-no-min">';
1302 print '<div class="tagtable centpercent noborder allwidth">';
1303
1304 print '<div class="tagtr liste_titre">';
1305 print '<div class="tagtd">'.$langs->trans("Source").'</div>
1306 <div class="tagtd">' . $langs->trans("Company").'</div>
1307 <div class="tagtd">' . $langs->trans("Contacts").'</div>
1308 <div class="tagtd">' . $langs->trans("ContactType").'</div>
1309 <div class="tagtd">' . $langs->trans("Phone").'</div>
1310 <div class="tagtd center">' . $langs->trans("Status").'</div>';
1311 print '</div><!-- tagtr -->';
1312
1313 // Contact list
1314 $companystatic = new Societe($db);
1315 $contactstatic = new Contact($db);
1316 $userstatic = new User($db);
1317 $var = false;
1318 foreach (array('internal', 'external') as $source) {
1319 $tmpobject = $object;
1320 $tab = $tmpobject->listeContact(-1, $source);
1321 $num = count($tab);
1322 $i = 0;
1323 while ($i < $num) {
1324 $var = !$var;
1325 print '<div class="tagtr '.($var ? 'pair' : 'impair').'">';
1326
1327 print '<div class="tagtd left">';
1328 if ($tab[$i]['source'] == 'internal') {
1329 echo $langs->trans("User");
1330 }
1331
1332 if ($tab[$i]['source'] == 'external') {
1333 echo $langs->trans("ThirdPartyContact");
1334 }
1335
1336 print '</div>';
1337 print '<div class="tagtd left">';
1338
1339 if ($tab[$i]['socid'] > 0) {
1340 $companystatic->fetch($tab[$i]['socid']);
1341 echo $companystatic->getNomUrl(-1);
1342 }
1343 if ($tab[$i]['socid'] < 0) {
1344 echo getDolGlobalString('MAIN_INFO_SOCIETE_NOM');
1345 }
1346 if (!$tab[$i]['socid']) {
1347 echo '&nbsp;';
1348 }
1349 print '</div>';
1350
1351 print '<div class="tagtd">';
1352 if ($tab[$i]['source'] == 'internal') {
1353 if ($userstatic->fetch($tab[$i]['id'])) {
1354 print $userstatic->getNomUrl(-1);
1355 }
1356 }
1357 if ($tab[$i]['source'] == 'external') {
1358 if ($contactstatic->fetch($tab[$i]['id'])) {
1359 print $contactstatic->getNomUrl(-1);
1360 }
1361 }
1362 print ' </div>
1363 <div class="tagtd">' . $tab[$i]['libelle'].'</div>';
1364
1365 print '<div class="tagtd">';
1366
1367 print dol_print_phone($tab[$i]['phone'], '', '', '', 'AC_TEL').'<br>';
1368
1369 if (!empty($tab[$i]['phone_perso'])) {
1370 //print img_picto($langs->trans('PhonePerso'),'object_phoning.png','',0,0,0).' ';
1371 print '<br>'.dol_print_phone($tab[$i]['phone_perso'], '', '', '', 'AC_TEL').'<br>';
1372 }
1373 if (!empty($tab[$i]['phone_mobile'])) {
1374 //print img_picto($langs->trans('PhoneMobile'),'object_phoning.png','',0,0,0).' ';
1375 print dol_print_phone($tab[$i]['phone_mobile'], '', '', '', 'AC_TEL').'<br>';
1376 }
1377 print '</div>';
1378
1379 print '<div class="tagtd center">';
1380 if ($object->status >= 0) {
1381 echo '<a href="contact.php?track_id='.$object->track_id.'&amp;action=swapstatut&amp;ligne='.$tab[$i]['rowid'].'">';
1382 }
1383
1384 if ($tab[$i]['source'] == 'internal') {
1385 $userstatic->id = $tab[$i]['id'];
1386 $userstatic->lastname = $tab[$i]['lastname'];
1387 $userstatic->firstname = $tab[$i]['firstname'];
1388 echo $userstatic->LibStatut($tab[$i]['statuscontact'], 3);
1389 }
1390 if ($tab[$i]['source'] == 'external') {
1391 $contactstatic->id = $tab[$i]['id'];
1392 $contactstatic->lastname = $tab[$i]['lastname'];
1393 $contactstatic->firstname = $tab[$i]['firstname'];
1394 echo $contactstatic->LibStatut($tab[$i]['statuscontact'], 3);
1395 }
1396 if ($object->status >= 0) {
1397 echo '</a>';
1398 }
1399
1400 print '</div>';
1401
1402 print '</div><!-- tagtr -->';
1403
1404 $i++;
1405 }
1406 }
1407
1408 print '</div><!-- contact list -->';
1409 print '</div>';
1410 }
1411
1412 print '</div></div>';
1413 print '<div class="clearboth"></div>';
1414
1415 print dol_get_fiche_end();
1416
1417
1418 // Buttons for actions
1419 if ($action != 'presend' && $action != 'presend_addmessage' && $action != 'editline') {
1420 print '<div class="tabsAction">'."\n";
1421 $parameters = array();
1422 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1423 if ($reshook < 0) {
1424 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1425 }
1426
1427 if (empty($reshook)) {
1428 // Email
1429 if (isset($object->status) && $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage") {
1430 print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?action=presend_addmessage&send_email=1&private_message=0&mode=init&token='.newToken().'&track_id='.$object->track_id.'#formmailbeforetitle', '');
1431 }
1432
1433 // Show link to add a message (if read and not closed)
1434 if (isset($object->status) && $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage") {
1435 print dolGetButtonAction('', $langs->trans('TicketAddPrivateMessage'), 'default', $_SERVER["PHP_SELF"].'?action=presend_addmessage&mode=init&token='.newToken().'&track_id='.$object->track_id.'#formmailbeforetitle', '');
1436 }
1437
1438 // Link to create an intervention
1439 // socid is needed otherwise fichinter ask it and forgot origin after form submit :\
1440 if (!$object->fk_soc && $user->hasRight("ficheinter", "creer")) {
1441 print dolGetButtonAction($langs->trans('UnableToCreateInterIfNoSocid'), $langs->trans('TicketAddIntervention'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1442 }
1443 if ($object->fk_soc > 0 && isset($object->status) && $object->status < Ticket::STATUS_CLOSED && $user->hasRight('ficheinter', 'creer')) {
1444 print dolGetButtonAction('', $langs->trans('TicketAddIntervention'), 'default', DOL_URL_ROOT.'/fichinter/card.php?action=create&token='.newToken().'&socid='. $object->fk_soc.'&origin=ticket_ticket&originid='. $object->id, '');
1445 }
1446
1447 // Close ticket if statut is read
1448 if (isset($object->status) && $object->status > 0 && $object->status < Ticket::STATUS_CLOSED && $user->rights->ticket->write) {
1449 print dolGetButtonAction('', $langs->trans('CloseTicket'), 'default', $_SERVER["PHP_SELF"].'?action=close&token='.newToken().'&track_id='.$object->track_id, '');
1450 }
1451
1452 // Abadon ticket if statut is read
1453 if (isset($object->status) && $object->status > 0 && $object->status < Ticket::STATUS_CLOSED && $user->rights->ticket->write) {
1454 print dolGetButtonAction('', $langs->trans('AbandonTicket'), 'default', $_SERVER["PHP_SELF"].'?action=abandon&token='.newToken().'&track_id='.$object->track_id, '');
1455 }
1456
1457 // Re-open ticket
1458 if (!$user->socid && (isset($object->status) && ($object->status == Ticket::STATUS_CLOSED || $object->status == Ticket::STATUS_CANCELED)) && !$user->socid) {
1459 print dolGetButtonAction('', $langs->trans('ReOpen'), 'default', $_SERVER["PHP_SELF"].'?action=reopen&token='.newToken().'&track_id='.$object->track_id, '');
1460 }
1461
1462 // Delete ticket
1463 if ($user->rights->ticket->delete && !$user->socid) {
1464 print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&track_id='.$object->track_id, '');
1465 }
1466 }
1467 print '</div>'."\n";
1468 } else {
1469 //print '<br>';
1470 }
1471
1472 // Select mail models is same action as presend
1473 if (GETPOST('modelselected')) {
1474 $action = 'presend';
1475 }
1476 // Set $action to correct value for the case we used presend action to add a message
1477 if (GETPOSTISSET('actionbis') && $action == 'presend') {
1478 $action = 'presend_addmessage';
1479 }
1480
1481 // add a message
1482 if ($action == 'presend' || $action == 'presend_addmessage') {
1483 if ($object->fk_soc > 0) {
1484 $object->fetch_thirdparty();
1485 }
1486
1487 $outputlangs = $langs;
1488 $newlang = '';
1489 if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
1490 $newlang = GETPOST('lang_id', 'aZ09');
1491 } elseif (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && is_object($object->thirdparty)) {
1492 $newlang = $object->thirdparty->default_lang;
1493 }
1494 if (!empty($newlang)) {
1495 $outputlangs = new Translate("", $conf);
1496 $outputlangs->setDefaultLang($newlang);
1497 }
1498
1499 $arrayoffamiliestoexclude = array('objectamount');
1500
1501 $action = 'add_message'; // action to use to post the message
1502 $modelmail = 'ticket_send';
1503
1504 // Substitution array
1505 $morehtmlright = '';
1506 $help = "";
1507 $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, $arrayoffamiliestoexclude, $object);
1508 $morehtmlright .= $form->textwithpicto('<span class="opacitymedium">'.$langs->trans("TicketMessageSubstitutionReplacedByGenericValues").'</span>', $help, 1, 'helpclickable', '', 0, 3, 'helpsubstitution');
1509
1510 print '<div>';
1511
1512 print '<div id="formmailbeforetitle" name="formmailbeforetitle"></div>';
1513
1514 print load_fiche_titre($langs->trans('TicketAddMessage'), $morehtmlright, 'messages@ticket');
1515
1516 print '<hr>';
1517
1518 $formticket = new FormTicket($db);
1519
1520 $formticket->action = $action;
1521 $formticket->track_id = $object->track_id;
1522 $formticket->ref = $object->ref;
1523 $formticket->id = $object->id;
1524 $formticket->trackid = 'tic'.$object->id;
1525
1526 $formticket->withfile = 2;
1527 $formticket->withcancel = 1;
1528 $formticket->param = array('fk_user_create' => $user->id);
1529 $formticket->param['langsmodels'] = (empty($newlang) ? $langs->defaultlang : $newlang);
1530
1531 // Tableau des parametres complementaires du post
1532 $formticket->param['models'] = $modelmail;
1533 $formticket->param['models_id'] = GETPOST('modelmailselected', 'int');
1534 //$formticket->param['socid']=$object->fk_soc;
1535 $formticket->param['returnurl'] = $_SERVER["PHP_SELF"].'?track_id='.$object->track_id;
1536
1537 $formticket->withsubstit = 1;
1538 $formticket->substit = $substitutionarray;
1539 $formticket->backtopage = $backtopage;
1540
1541 $formticket->showMessageForm('100%');
1542 print '</div>';
1543 }
1544
1545 // Show messages on card (Note: this is a duplicate of the view Events/Agenda but on the main tab)
1546 if (getDolGlobalString('TICKET_SHOW_MESSAGES_ON_CARD')) {
1547 $param = '&id='.$object->id;
1548 if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
1549 $param .= '&contextpage='.$contextpage;
1550 }
1551 if ($limit > 0 && $limit != $conf->liste_limit) {
1552 $param .= '&limit='.$limit;
1553 }
1554 if ($actioncode) {
1555 $param .= '&actioncode='.urlencode($actioncode);
1556 }
1557 if ($search_agenda_label) {
1558 $param .= '&search_agenda_label='.urlencode($search_agenda_label);
1559 }
1560
1561 $morehtmlright = '';
1562
1563 $messagingUrl = DOL_URL_ROOT.'/ticket/agenda.php?track_id='.$object->track_id;
1564 $morehtmlright .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 1);
1565
1566 // Show link to add a message (if read and not closed)
1567 $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message";
1568 $url = 'card.php?track_id='.$object->track_id.'&action=presend_addmessage&mode=init';
1569 $morehtmlright .= dolGetButtonTitle($langs->trans('TicketAddMessage'), '', 'fa fa-comment-dots', $url, 'add-new-ticket-title-button', $btnstatus);
1570
1571 // Show link to add event (if read and not closed)
1572 $btnstatus = $object->status < Ticket::STATUS_CLOSED && $action != "presend" && $action != "presend_addmessage" && $action != "add_message";
1573 $url = dol_buildpath('/comm/action/card.php', 1).'?action=create&datep='.date('YmdHi').'&origin=ticket&originid='.$object->id.'&projectid='.$object->fk_project.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?track_id='.$object->track_id);
1574 $morehtmlright .= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', $url, 'add-new-ticket-even-button', $btnstatus);
1575
1576 print_barre_liste($langs->trans("ActionsOnTicket"), 0, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', 0, -1, '', 0, $morehtmlright, '', 0, 1, 1);
1577
1578 // List of all actions
1579 $filters = array();
1580 $filters['search_agenda_label'] = $search_agenda_label;
1581 $filters['search_rowid'] = $search_rowid;
1582
1583 show_actions_messaging($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder);
1584 }
1585
1586 if ($action != 'presend' && $action != 'presend_addmessage' && $action != 'add_message') {
1587 print '<div class="fichecenter"><div class="fichehalfleft">';
1588 print '<a name="builddoc"></a>'; // ancre
1589
1590 // Show links to link elements
1591 $linktoelem = $form->showLinkToObjectBlock($object, null, array('ticket'));
1592 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1593
1594 // Show direct link to public interface
1595 print '<br><!-- Link to public interface -->'."\n";
1596 print showDirectPublicLink($object).'<br>';
1597 print '</div>';
1598
1599 if (getDolGlobalString('TICKET_SHOW_MESSAGES_ON_CARD')) {
1600 print '<div class="fichehalfright">';
1601
1602 $MAXEVENT = 10;
1603
1604 $morehtmlcenter = '<div class="nowraponall">';
1605 $morehtmlcenter .= dolGetButtonTitle($langs->trans('FullConversation'), '', 'fa fa-comments imgforviewmode', DOL_URL_ROOT.'/ticket/messaging.php?id='.$object->id);
1606 $morehtmlcenter .= ' ';
1607 $morehtmlcenter .= dolGetButtonTitle($langs->trans('FullList'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/ticket/agenda.php?id='.$object->id);
1608 $morehtmlcenter .= '</div>';
1609
1610 // List of actions on element
1611 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1612 $formactions = new FormActions($db);
1613 $somethingshown = $formactions->showactions($object, 'ticket', $socid, 1, 'listactions', $MAXEVENT, '', $morehtmlcenter);
1614
1615 print '</div>';
1616 }
1617
1618 print '</div>';
1619 }
1620 }
1621}
1622
1623// End of page
1624llxFooter();
1625$db->close();
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif( $action=='specimen') elseif($action=='setmodel') elseif( $action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:56
llxFooter()
Empty footer.
Definition wrapper.php:70
Class Actions of the module ticket.
Class to manage categories.
Class to manage contact/addresses.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
societe_prepare_head(Societe $object)
Return array of tabs to used on pages for third parties cards.
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
Definition date.lib.php:241
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
GETPOSTINT($paramname, $method=0)
Return value of a param into GET or POST supervariable.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
roundUpToNextMultiple($n, $x=5)
Round to next multiple.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
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_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ="&nbsp;", $withpicto='', $titlealt='', $adddivfloat=0)
Format phone numbers according to country.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
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.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
show_actions_messaging($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
Show html area with actions in messaging format.
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...
Class to generate the form for creating a new ticket.
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
showDirectPublicLink($object)
Return string with full Url.
ticket_prepare_head($object)
Build tabs for a Ticket object.