dolibarr 18.0.6
actions_ticket.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2015 Jean-François FERRY <hello@librethic.io>
3 * Copyright (C) 2016 Christophe Battarel <christophe@altairis.fr>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
26require_once DOL_DOCUMENT_ROOT.'/ticket/class/ticket.class.php';
27require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
28require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
29require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
30require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
31require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
32
33
38{
42 public $db;
43
47 public $dao;
48
49 public $mesg;
50
54 public $error;
55
59 public $errors = array();
60
62 public $errno = 0;
63
64 public $template_dir;
65 public $template;
66
70 public $label;
71
75 public $description;
76
80 public $fk_statut;
81
85 public $fk_soc;
86
92 public function __construct($db)
93 {
94 $this->db = $db;
95 }
96
102 public function getInstanceDao()
103 {
104 if (!is_object($this->dao)) {
105 $this->dao = new Ticket($this->db);
106 }
107 }
108
117 public function fetch($id = 0, $ref = '', $track_id = '')
118 {
119 $this->getInstanceDao();
120 return $this->dao->fetch($id, $ref, $track_id);
121 }
122
129 public function getLibStatut($mode = 0)
130 {
131 $this->getInstanceDao();
132 $this->dao->fk_statut = $this->fk_statut;
133 return $this->dao->getLibStatut($mode);
134 }
135
142 public function getInfo($id)
143 {
144 $this->getInstanceDao();
145 $this->dao->fetch($id, '', $track_id);
146
147 $this->label = $this->dao->label;
148 $this->description = $this->dao->description;
149 }
150
157 public function getTitle($action = '')
158 {
159 global $langs;
160
161 if ($action == 'create') {
162 return $langs->trans("CreateTicket");
163 } elseif ($action == 'edit') {
164 return $langs->trans("EditTicket");
165 } elseif ($action == 'view') {
166 return $langs->trans("TicketCard");
167 } elseif ($action == 'add_message') {
168 return $langs->trans("TicketAddMessage");
169 } else {
170 return $langs->trans("TicketsManagement");
171 }
172 }
173
182 public function viewTicketOriginalMessage($user, $action, $object)
183 {
184 global $conf, $langs;
185
186 print '<!-- initial message of ticket -->'."\n";
187 if (!empty($user->rights->ticket->manage) && $action == 'edit_message_init') {
188 // MESSAGE
189
190 print '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
191 print '<input type="hidden" name="token" value="'.newToken().'">';
192 print '<input type="hidden" name="track_id" value="'.$object->track_id.'">';
193 print '<input type="hidden" name="action" value="set_message">';
194 }
195
196 // Initial message
197 print '<div class="underbanner clearboth"></div>';
198 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
199 print '<table class="noborder centpercent margintable margintablenotop">';
200 print '<tr class="liste_titre trforfield"><td class="nowrap titlefield">';
201 print $langs->trans("InitialMessage");
202 print '</td><td>';
203 if ($user->hasRight("ticket", "manage")) {
204 print '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=edit_message_init&token='.newToken().'&track_id='.$object->track_id.'">'.img_edit($langs->trans('Modify')).'</a>';
205 }
206 print '</td></tr>';
207
208 print '<tr>';
209 print '<td colspan="2">';
210 if ($user->hasRight('ticket', 'manage') && $action == 'edit_message_init') {
211 // MESSAGE
212 $msg = GETPOSTISSET('message_initial') ? GETPOST('message_initial', 'restricthtml') : $object->message;
213 include_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
214 $uselocalbrowser = true;
215 $ckeditorenabledforticket = getDolGlobalString('FCKEDITOR_ENABLE_TICKET');
216 $doleditor = new DolEditor('message_initial', $msg, '100%', 250, 'dolibarr_details', 'In', true, $uselocalbrowser, $ckeditorenabledforticket, ROWS_9, '95%');
217 $doleditor->Create();
218 } else {
219 // Deal with format differences (text / HTML)
220 if (dol_textishtml($object->message)) {
221 print '<div class="longmessagecut">';
222 print dol_htmlwithnojs($object->message);
223 print '</div>';
224 /*print '<div class="clear center">';
225 print $langs->trans("More").'...';
226 print '</div>';*/
227 } else {
228 print '<div class="longmessagecut">';
229 print dol_nl2br($object->message);
230 print '</div>';
231 /*print '<div class="clear center">';
232 print $langs->trans("More").'...';
233 print '</div>';*/
234 }
235
236 //print '<div>' . $object->message . '</div>';
237 }
238 if (!empty($user->rights->ticket->manage) && $action == 'edit_message_init') {
239 print '<div class="center">';
240 print ' <input type="submit" class="button button-edit" value="'.$langs->trans('Modify').'">';
241 print ' <input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
242 print '</div>';
243 }
244 print '</td>';
245 print '</tr>';
246 print '</table>';
247 print '</div>';
248
249 if (!empty($user->rights->ticket->manage) && $action == 'edit_message_init') {
250 // MESSAGE
251 print '</form>';
252 }
253 }
254
263 public function viewTicketMessages($show_private, $show_user, $object)
264 {
265 global $conf, $langs, $user;
266
267 // Load logs in cache
268 $ret = $this->dao->loadCacheMsgsTicket();
269 if ($ret < 0) {
270 dol_print_error($this->dao->db);
271 }
272
273 $action = GETPOST('action', 'aZ09');
274
275 $this->viewTicketOriginalMessage($user, $action, $object);
276
277 if (is_array($this->dao->cache_msgs_ticket) && count($this->dao->cache_msgs_ticket) > 0) {
278 print '<table class="border" style="width:100%;">';
279
280 print '<tr class="liste_titre">';
281
282 print '<td>';
283 print $langs->trans('TicketMessagesList');
284 print '</td>';
285
286 if ($show_user) {
287 print '<td>';
288 print $langs->trans('User');
289 print '</td>';
290 }
291 print '</tr>';
292
293 foreach ($this->dao->cache_msgs_ticket as $id => $arraymsgs) {
294 if (!$arraymsgs['private']
295 || ($arraymsgs['private'] == "1" && $show_private)
296 ) {
297 //print '<tr>';
298 print '<tr class="oddeven">';
299 print '<td><strong>';
300 print img_picto('', 'object_action', 'class="paddingright"').dol_print_date($arraymsgs['datep'], 'dayhour');
301 print '<strong></td>';
302 if ($show_user) {
303 print '<td>';
304 if ($arraymsgs['fk_user_author'] > 0) {
305 $userstat = new User($this->db);
306 $res = $userstat->fetch($arraymsgs['fk_user_author']);
307 if ($res) {
308 print $userstat->getNomUrl(0);
309 }
310 } elseif (isset($arraymsgs['fk_contact_author'])) {
311 $contactstat = new Contact($this->db);
312 $res = $contactstat->fetch(0, null, '', $arraymsgs['fk_contact_author']);
313 if ($res) {
314 print $contactstat->getNomUrl(0, 'nolink');
315 } else {
316 print $arraymsgs['fk_contact_author'];
317 }
318 } else {
319 print $langs->trans('Customer');
320 }
321 print '</td>';
322 }
323 print '</td>';
324 print '<tr class="oddeven">';
325 print '<td colspan="2">';
326 print $arraymsgs['message'];
327 print '</td>';
328 print '</tr>';
329 }
330 }
331
332 print '</table>';
333 } else {
334 print '<div class="info">'.$langs->trans('NoMsgForThisTicket').'</div>';
335 }
336 }
337
346 public function viewTicketTimelineMessages($show_private, $show_user, Ticket $object)
347 {
348 global $conf, $langs, $user;
349
350 // Load logs in cache
351 $ret = $object->loadCacheMsgsTicket();
352 $action = GETPOST('action');
353
354 if (is_array($object->cache_msgs_ticket) && count($object->cache_msgs_ticket) > 0) {
355 print '<section id="cd-timeline">';
356
357 foreach ($object->cache_msgs_ticket as $id => $arraymsgs) {
358 if (!$arraymsgs['private']
359 || ($arraymsgs['private'] == "1" && $show_private)
360 ) {
361 print '<div class="cd-timeline-block">';
362 print '<div class="cd-timeline-img">';
363 print '<img src="img/messages.png" alt="">';
364 print '</div> <!-- cd-timeline-img -->';
365
366 print '<div class="cd-timeline-content">';
367 print $arraymsgs['message'];
368
369 print '<span class="cd-date">';
370 print dol_print_date($arraymsgs['datec'], 'dayhour');
371
372 if ($show_user) {
373 if ($arraymsgs['fk_user_action'] > 0) {
374 $userstat = new User($this->db);
375 $res = $userstat->fetch($arraymsgs['fk_user_action']);
376 if ($res) {
377 print '<br>';
378 print $userstat->getNomUrl(1);
379 }
380 } else {
381 print '<br>';
382 print $langs->trans('Customer');
383 }
384 }
385 print '</span>';
386 print '</div> <!-- cd-timeline-content -->';
387 print '</div> <!-- cd-timeline-block -->';
388 }
389 }
390 print '</section>';
391 } else {
392 print '<div class="info">'.$langs->trans('NoMsgForThisTicket').'</div>';
393 }
394 }
395
402 public function viewStatusActions(Ticket $object)
403 {
404 global $langs;
405
406 print '<div class="div-table-responsive-no-min margintoponly navBarForStatus">';
407 print '<div class="centpercent right">';
408 // Exclude status which requires specific method
409 $exclude_status = array(Ticket::STATUS_CLOSED, Ticket::STATUS_CANCELED);
410 // Exclude actual status
411 $exclude_status = array_merge($exclude_status, array(intval($object->fk_statut)));
412
413 // Sort results to be similar to status object list
414 //sort($exclude_status);
415
416 foreach ($object->statuts_short as $status => $status_label) {
417 if (!in_array($status, $exclude_status)) {
418 print '<div class="inline-block center marginbottomonly">';
419
420 if ($status == 1) {
421 $urlforbutton = $_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'&action=set_read&token='.newToken(); // To set as read, we use a dedicated action
422 } else {
423 $urlforbutton = $_SERVER['PHP_SELF'].'?track_id='.$object->track_id.'&action=confirm_set_status&token='.newToken().'&new_status='.((int) $status);
424 }
425
426 print '<a class="butAction butStatus marginbottomonly" href="'.$urlforbutton.'">';
427 print $object->LibStatut($status, 3, 1).' ';
428 //print img_picto($langs->trans($object->statuts_short[$status]), 'statut'.$status.'.png@ticket', '', false, 0, 0, '', 'valignmiddle').' ';
429 print $langs->trans($object->statuts_short[$status]);
430 print '</a>';
431 print '</div>';
432 }
433 }
434 print '</div>';
435 print '</div>';
436 print '<br>';
437 }
438
448 public function emailElementlist($parameters, &$object, &$action, $hookmanager)
449 {
450 global $langs;
451
452 $error = 0;
453
454 if (in_array('admin', explode(':', $parameters['context']))) {
455 $this->results = array('ticket_send' => $langs->trans('MailToSendTicketMessage'));
456 }
457
458 if (!$error) {
459 return 0; // or return 1 to replace standard code
460 } else {
461 $this->errors[] = 'Error message';
462 return -1;
463 }
464 }
465}
Class Actions of the module ticket.
viewTicketMessages($show_private, $show_user, $object)
View html list of message for ticket.
getTitle($action='')
Get action title.
__construct($db)
Constructor.
emailElementlist($parameters, &$object, &$action, $hookmanager)
Hook to add email element template.
$errno
Numero de l'erreur.
fetch($id=0, $ref='', $track_id='')
Fetch object.
viewTicketOriginalMessage($user, $action, $object)
Show ticket original message.
viewTicketTimelineMessages($show_private, $show_user, Ticket $object)
View list of message for ticket with timeline display.
getInstanceDao()
Instantiation of DAO class.
getLibStatut($mode=0)
Print statut.
viewStatusActions(Ticket $object)
Print html navbar with link to set ticket status.
getInfo($id)
Get ticket info.
Class to manage contact/addresses.
Class to manage a WYSIWYG editor.
Class to manage Dolibarr users.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_textishtml($msg, $option=0)
Return if a text is a html content.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox=0, $check='restricthtml')
Sanitize a HTML to remove js and dangerous content.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
Class to generate the form for creating a new ticket.