dolibarr 21.0.0-beta
ticket.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2013-2018 Jean-François FERRY <hello@librethic.io>
3 * Copyright (C) 2016 Christophe Battarel <christophe@altairis.fr>
4 * Copyright (C) 2022-2023 Udo Tamm <dev@dolibit.de>
5 * Copyright (C) 2023 Alexandre Spangaro <aspangaro@easya.solutions>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2024 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
30// Load Dolibarr environment
31require '../main.inc.php';
32require_once DOL_DOCUMENT_ROOT."/core/class/html.formcategory.class.php";
33require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php";
34require_once DOL_DOCUMENT_ROOT."/core/lib/ticket.lib.php";
35require_once DOL_DOCUMENT_ROOT."/ticket/class/ticket.class.php";
36
46// Load translation files required by the page
47$langs->loadLangs(array("admin", "ticket"));
48
49// Access control
50if (!$user->admin) {
52}
53
54// Parameters
55$value = GETPOST('value', 'alpha');
56$action = GETPOST('action', 'aZ09');
57$modulepart = GETPOST('modulepart', 'aZ09'); // Used by actions_setmoduleoptions.inc.php
58
59$label = GETPOST('label', 'alpha');
60$scandir = GETPOST('scan_dir', 'alpha');
61$type = 'ticket';
62
63$error = 0;
64$reg = array();
65
66// Initiate status list
67$statuslist = array(
68 Ticket::STATUS_IN_PROGRESS => $langs->trans("InProgress"),
69 Ticket::STATUS_NOT_READ => $langs->trans("NotRead"),
70 Ticket::STATUS_READ => $langs->trans("Read"),
71 Ticket::STATUS_ASSIGNED => $langs->trans("Assigned"),
72 Ticket::STATUS_NEED_MORE_INFO => $langs->trans("NeedMoreInformationShort"),
73 Ticket::STATUS_WAITING => $langs->trans("Waiting"),
74 Ticket::STATUS_CLOSED => $langs->trans("SolvedClosed")
75);
76
77/*
78 * Actions
79 */
80
81include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
82
83if (GETPOSTISSET('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION')) { // only for no js case
84 $param_disable_email = GETPOST('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION', 'alpha');
85 $res = dolibarr_set_const($db, 'TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION', $param_disable_email, 'chaine', 0, '', $conf->entity);
86 if (!($res > 0)) {
87 $error++;
88 setEventMessages($db->lasterror(), null, 'errors');
89 }
90}
91
92if ($action == 'updateMask') {
93 $maskconstticket = GETPOST('maskconstticket', 'aZ09');
94 $maskticket = GETPOST('maskticket', 'alpha');
95
96 $res = 0;
97
98 if ($maskconstticket && preg_match('/_MASK$/', $maskconstticket)) {
99 $res = dolibarr_set_const($db, $maskconstticket, $maskticket, 'chaine', 0, '', $conf->entity);
100 }
101
102 if (!($res > 0)) {
103 $error++;
104 }
105
106 if (!$error) {
107 setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
108 } else {
109 setEventMessages($langs->trans("Error"), null, 'errors');
110 }
111} elseif ($action == 'set') {
112 // Activate a model
113 $ret = addDocumentModel($value, $type, $label, $scandir);
114} elseif ($action == 'del') {
115 $ret = delDocumentModel($value, $type);
116 if ($ret > 0) {
117 if ($conf->global->TICKET_ADDON_PDF == "$value") {
118 dolibarr_del_const($db, 'TICKET_ADDON_PDF', $conf->entity);
119 }
120 }
121} elseif (preg_match('/set_(.*)/', $action, $reg)) {
122 $code = $reg[1];
123 $value = GETPOSTISSET($code) ? GETPOSTINT($code) : 1;
124 $res = dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity);
125 if (!($res > 0)) {
126 $error++;
127 }
128} elseif (preg_match('/del_(.*)/', $action, $reg)) {
129 $code = $reg[1];
130 $res = dolibarr_del_const($db, $code, $conf->entity);
131 if (!($res > 0)) {
132 $error++;
133 }
134} elseif ($action == 'setdoc') {
135 // Set default model
136 if (dolibarr_set_const($db, "TICKET_ADDON_PDF", $value, 'chaine', 0, '', $conf->entity)) {
137 // The constant that was read before the new set
138 // We therefore requires a variable to have a coherent view
139 $conf->global->TICKET_ADDON_PDF = $value;
140 }
141
142 // Activate the model
143 $ret = delDocumentModel($value, $type);
144 if ($ret > 0) {
145 $ret = addDocumentModel($value, $type, $label, $scandir);
146 }
147} elseif ($action == 'setmod') {
148 // TODO check if the chosen numbering module can be activated
149 // by calling the canBeActivated method
150
151 dolibarr_set_const($db, "TICKET_ADDON", $value, 'chaine', 0, '', $conf->entity);
152} elseif ($action == 'setvarworkflow') {
153 // For compatibility when javascript is not enabled
154 if (empty($conf->use_javascript_ajax)) {
155 $param_auto_read = GETPOST('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND', 'alpha');
156 $res = dolibarr_set_const($db, 'TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND', $param_auto_read, 'chaine', 0, '', $conf->entity);
157 if (!($res > 0)) {
158 $error++;
159 }
160
161 $param_auto_assign = GETPOST('TICKET_AUTO_ASSIGN_USER_CREATE', 'alpha');
162 $res = dolibarr_set_const($db, 'TICKET_AUTO_ASSIGN_USER_CREATE', $param_auto_assign, 'chaine', 0, '', $conf->entity);
163 if (!($res > 0)) {
164 $error++;
165 }
166
167 $param_auto_notify_close = GETPOST('TICKET_NOTIFY_AT_CLOSING', 'alpha');
168 $res = dolibarr_set_const($db, 'TICKET_NOTIFY_AT_CLOSING', $param_auto_notify_close, 'chaine', 0, '', $conf->entity);
169 if (!($res > 0)) {
170 $error++;
171 }
172 }
173
174 $param_limit_view = GETPOST('TICKET_LIMIT_VIEW_ASSIGNED_ONLY', 'alpha');
175 $res = dolibarr_set_const($db, 'TICKET_LIMIT_VIEW_ASSIGNED_ONLY', $param_limit_view, 'chaine', 0, '', $conf->entity);
176 if (!($res > 0)) {
177 $error++;
178 }
179
180 $param_status = GETPOST('TICKET_SET_STATUS_ON_ANSWER');
181 $res = dolibarr_set_const($db, 'TICKET_SET_STATUS_ON_ANSWER', $param_status, 'chaine', 0, '', $conf->entity);
182 if (!($res > 0)) {
183 $error++;
184 }
185
186 $param_delay_first_response = GETPOSTINT('delay_first_response');
187 $res = dolibarr_set_const($db, 'TICKET_DELAY_BEFORE_FIRST_RESPONSE', $param_delay_first_response, 'chaine', 0, '', $conf->entity);
188 if (!($res > 0)) {
189 $error++;
190 }
191
192 $param_delay_between_responses = GETPOSTINT('delay_between_responses');
193 $res = dolibarr_set_const($db, 'TICKET_DELAY_SINCE_LAST_RESPONSE', $param_delay_between_responses, 'chaine', 0, '', $conf->entity);
194 if (!($res > 0)) {
195 $error++;
196 }
197} elseif ($action == 'setvar') {
198 include_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
199
200 $notification_email = GETPOST('TICKET_NOTIFICATION_EMAIL_FROM', 'alpha');
201 $notification_email_description = "Sender of ticket replies sent from Dolibarr";
202 if (!empty($notification_email)) {
203 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_FROM', $notification_email, 'chaine', 0, $notification_email_description, $conf->entity);
204 } else { // If an empty e-mail address is providen, use the global "FROM" since an empty field will cause other issues
205 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_FROM', $conf->global->MAIN_MAIL_EMAIL_FROM, 'chaine', 0, $notification_email_description, $conf->entity);
206 }
207 if (!($res > 0)) {
208 $error++;
209 }
210
211 // altairis : differentiate notification email FROM and TO
212 $notification_email_to = GETPOST('TICKET_NOTIFICATION_EMAIL_TO', 'alpha');
213 $notification_email_to_description = "Notified e-mail for ticket replies sent from Dolibarr";
214 if (!empty($notification_email_to)) {
215 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_TO', $notification_email_to, 'chaine', 0, $notification_email_to_description, $conf->entity);
216 } else {
217 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_TO', '', 'chaine', 0, $notification_email_to_description, $conf->entity);
218 }
219 if (!($res > 0)) {
220 $error++;
221 }
222
223 $mail_intro = GETPOST('TICKET_MESSAGE_MAIL_INTRO', 'restricthtml');
224 $mail_intro_description = "Introduction text of ticket replies sent from Dolibarr";
225 if (!empty($mail_intro)) {
226 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_INTRO', $mail_intro, 'chaine', 0, $mail_intro_description, $conf->entity);
227 } else {
228 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_INTRO', '', 'chaine', 0, $mail_intro_description, $conf->entity);
229 }
230 if (!($res > 0)) {
231 $error++;
232 }
233
234 $mail_signature = GETPOST('TICKET_MESSAGE_MAIL_SIGNATURE', 'restricthtml');
235 $signature_description = "Signature of ticket replies sent from Dolibarr";
236 if (!empty($mail_signature)) {
237 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_SIGNATURE', $mail_signature, 'chaine', 0, $signature_description, $conf->entity);
238 } else {
239 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_SIGNATURE', '', 'chaine', 0, $signature_description, $conf->entity);
240 }
241 if (!($res > 0)) {
242 $error++;
243 }
244}
245
246
247/*
248 * View
249 */
250
251$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
252
253$formcategory = new FormCategory($db);
254
255// Page Header
256$help_url = 'EN:Module_Ticket|FR:Module_Ticket_FR';
257$page_name = 'TicketSetup';
258llxHeader('', $langs->trans($page_name), $help_url, '', 0, 0, '', '', '', 'mod-admin page-ticket');
259
260// Subheader
261$linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
262
263print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
264
265// Configuration header
266$head = ticketAdminPrepareHead();
267
268print dol_get_fiche_head($head, 'settings', $langs->trans("Module56000Name"), -1, "ticket");
269
270print '<span class="opacitymedium">'.$langs->trans("TicketSetupDictionaries").'</span> : <a href="'.DOL_URL_ROOT.'/admin/dict.php">'.$langs->trans("ClickHereToGoTo", $langs->transnoentitiesnoconv("DictionarySetup")).'</a><br>';
271
272print dol_get_fiche_end();
273
274
275/*
276 * Tickets numbering model
277 */
278
279print load_fiche_titre($langs->trans("TicketNumberingModules"), '', '');
280
281print '<div class="div-table-responsive-no-min">';
282print '<table class="noborder centpercent">';
283print '<tr class="liste_titre">';
284print '<td width="100">'.$langs->trans("Name").'</td>';
285print '<td>'.$langs->trans("Description").'</td>';
286print '<td>'.$langs->trans("Example").'</td>';
287print '<td align="center" width="60">'.$langs->trans("Activated").'</td>';
288print '<td align="center" width="40">'.$langs->trans("ShortInfo").'</td>';
289print "</tr>\n";
290
291clearstatcache();
292
293foreach ($dirmodels as $reldir) {
294 $dir = dol_buildpath($reldir."core/modules/ticket");
295
296 if (is_dir($dir)) {
297 $handle = opendir($dir);
298 if (is_resource($handle)) {
299 while (($file = readdir($handle)) !== false) {
300 if (preg_match('/^(mod_.*)\.php$/i', $file, $reg)) {
301 $file = $reg[1];
302 $classname = substr($file, 4);
303
304 include_once $dir.'/'.$file.'.php';
305
306 $module = new $file();
307 '@phan-var-force ModeleNumRefTicket $module';
308
309 // Show modules according to features level
310 if ($module->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) {
311 continue;
312 }
313
314 if ($module->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) {
315 continue;
316 }
317
318 if ($module->isEnabled()) {
319 print '<tr class="oddeven"><td>'.$module->name."</td><td>\n";
320 print $module->info($langs);
321 print '</td>';
322
323 // Show example of numbering model
324 print '<td class="nowrap">';
325 $tmp = $module->getExample();
326 if (preg_match('/^Error/', $tmp)) {
327 $langs->load("errors");
328 print '<div class="error">'.$langs->trans($tmp).'</div>';
329 } elseif ($tmp == 'NotConfigured') {
330 print '<span class="opacitymedium">'.$langs->trans($tmp).'</span>';
331 } else {
332 print $tmp;
333 }
334
335 print '</td>'."\n";
336
337 print '<td class="center">';
338 if ($conf->global->TICKET_ADDON == 'mod_'.$classname) {
339 print img_picto($langs->trans("Activated"), 'switch_on');
340 } else {
341 print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=setmod&amp;token='.newToken().'&amp;value=mod_'.$classname.'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'switch_off').'</a>';
342 }
343 print '</td>';
344
345 $ticket = new Ticket($db);
346 $ticket->initAsSpecimen();
347
348 // Info
349 $htmltooltip = '';
350 $htmltooltip .= ''.$langs->trans("Version").': <b>'.$module->getVersion().'</b><br>';
351 $nextval = $module->getNextValue($mysoc, $ticket);
352 if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval
353 $htmltooltip .= ''.$langs->trans("NextValue").': ';
354 if ($nextval) {
355 $htmltooltip .= $nextval.'<br>';
356 } else {
357 $htmltooltip .= $langs->trans($module->error).'<br>';
358 }
359 }
360
361 print '<td class="center">';
362 print $formcategory->textwithpicto('', $htmltooltip, 1, 0);
363 print '</td>';
364
365 print '</tr>';
366 }
367 }
368 }
369 closedir($handle);
370 }
371 }
372}
373
374print '</table>';
375print '</div>';
376print '<br>';
377
378
379
380/*
381 * Document templates generators
382 */
383
384print load_fiche_titre($langs->trans("TicketsModelModule"), '', '');
385
386// Load array def with activated templates
387$def = array();
388$sql = "SELECT nom";
389$sql .= " FROM ".MAIN_DB_PREFIX."document_model";
390$sql .= " WHERE type = '".$db->escape($type)."'";
391$sql .= " AND entity = ".$conf->entity;
392$resql = $db->query($sql);
393if ($resql) {
394 $i = 0;
395 $num_rows = $db->num_rows($resql);
396 while ($i < $num_rows) {
397 $array = $db->fetch_array($resql);
398 if (is_array($array)) {
399 array_push($def, $array[0]);
400 }
401 $i++;
402 }
403} else {
404 dol_print_error($db);
405}
406
407
408print '<div class="div-table-responsive-no-min">';
409print '<table class="noborder cenpercent">'."\n";
410print '<tr class="liste_titre">'."\n";
411print '<td>'.$langs->trans("Name").'</td>';
412print '<td>'.$langs->trans("Description").'</td>';
413print '<td class="center" width="60">'.$langs->trans("Status")."</td>\n";
414print '<td class="center" width="60">'.$langs->trans("Default")."</td>\n";
415print '<td class="center" width="50">'.$langs->trans("Preview").'</td>';
416print '<td class="center" width="40">'.$langs->trans("ShortInfo").'</td>';
417print "</tr>\n";
418
419clearstatcache();
420
421foreach ($dirmodels as $reldir) {
422 foreach (array('', '/doc') as $valdir) {
423 $realpath = $reldir."core/modules/ticket".$valdir;
424 $dir = dol_buildpath($realpath);
425
426 if (is_dir($dir)) {
427 $handle = opendir($dir);
428 if (is_resource($handle)) {
429 $filelist = array();
430 while (($file = readdir($handle)) !== false) {
431 $filelist[] = $file;
432 }
433 closedir($handle);
434 arsort($filelist);
435
436 foreach ($filelist as $file) {
437 if (preg_match('/\.modules\.php$/i', $file) && preg_match('/^(pdf_|doc_)/', $file)) {
438 if (file_exists($dir.'/'.$file)) {
439 $name = substr($file, 4, dol_strlen($file) - 16);
440 $classname = substr($file, 0, dol_strlen($file) - 12);
441
442 require_once $dir.'/'.$file;
443 $module = new $classname($db);
444 '@phan-var-force ModelePDFTicket $module';
445
446 $modulequalified = 1;
447 if ($module->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) {
448 $modulequalified = 0;
449 }
450 if ($module->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) {
451 $modulequalified = 0;
452 }
453
454 if ($modulequalified) {
455 print '<tr class="oddeven"><td width="100">';
456 print(empty($module->name) ? $name : $module->name);
457 print "</td><td>\n";
458 if (method_exists($module, 'info')) {
459 print $module->info($langs); // @phan-suppress-current-line PhanUndeclaredMethod
460 } else {
461 print $module->description;
462 }
463 print '</td>';
464
465 // Active / Status
466 if (in_array($name, $def)) {
467 print '<td class="center">'."\n";
468 print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=del&token='.newToken().'&value='.urlencode($name).'">';
469 print img_picto($langs->trans("Enabled"), 'switch_on');
470 print '</a>';
471 print '</td>';
472 } else {
473 print '<td class="center">'."\n";
474 print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=set&token='.newToken().'&value='.urlencode($name).'&scan_dir='.urlencode($module->scandir).'&label='.urlencode($module->name).'">'.img_picto($langs->trans("Disabled"), 'switch_off').'</a>';
475 print "</td>";
476 }
477
478 // Default Template
479 print '<td class="center">';
480 if (getDolGlobalString("TICKET_ADDON_PDF") == $name) {
481 print img_picto($langs->trans("Default"), 'on');
482 } else {
483 print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=setdoc&amp;token='.newToken().'&amp;value='.$name.'&amp;scan_dir='.$module->scandir.'&amp;label='.urlencode($module->name).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').'</a>';
484 }
485 print '</td>';
486
487 // Preview
488 print '<td class="center">';
489 if ($module->type == 'pdf') {
490 print '<a href="'.$_SERVER["PHP_SELF"].'?action=specimen&module='.urlencode($name).'">'.img_object($langs->trans("Preview"), 'pdf').'</a>';
491 } else {
492 print img_object($langs->trans("PreviewNotAvailable"), 'generic');
493 }
494 print '</td>';
495
496 // Info
497 $htmltooltip = ''.$langs->trans("Name").': '.$module->name;
498 $htmltooltip .= '<br>'.$langs->trans("Type").': '.($module->type ? $module->type : $langs->trans("Unknown"));
499 if ($module->type == 'pdf') {
500 $htmltooltip .= '<br>'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur;
501 }
502 $htmltooltip .= '<br>'.$langs->trans("Path").': '.preg_replace('/^\//', '', $realpath).'/'.$file;
503
504 $htmltooltip .= '<br><br><u>'.$langs->trans("FeaturesSupported").':</u>';
505 $htmltooltip .= '<br>'.$langs->trans("Logo").': '.yn($module->option_logo, 1, 1);
506 $htmltooltip .= '<br>'.$langs->trans("MultiLanguage").': '.yn($module->option_multilang, 1, 1);
507 //$htmltooltip .= '<br>'.$langs->trans("Discounts").': '.yn($module->option_escompte,1,1);
508 //$htmltooltip .= '<br>'.$langs->trans("CreditNote").': '.yn($module->option_credit_note,1,1);
509 //$htmltooltip .= '<br>'.$langs->trans("WatermarkOnDraftOrders").': '.yn($module->option_draft_watermark, 1, 1);
510
511
512 print '<td class="center">';
513 print $formcategory->textwithpicto('', $htmltooltip, 1, 0);
514 print '</td>';
515
516 print "</tr>\n";
517 }
518 }
519 }
520 }
521 }
522 }
523 }
524}
525
526print '</table>';
527print '</div><br>';
528
529
530print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" enctype="multipart/form-data" >';
531print '<input type="hidden" name="token" value="'.newToken().'">';
532print '<input type="hidden" name="action" value="setvarworkflow">';
533print '<input type="hidden" name="page_y" value="">';
534
535/*
536 * Other Parameters
537 */
538
539print load_fiche_titre($langs->trans("Other"), '', '');
540print '<div class="div-table-responsive-no-min">';
541print '<table class="noborder centpercent">';
542
543print '<tr class="liste_titre">';
544print '<td>'.$langs->trans("Parameter").'</td>';
545print '<td>'.$langs->trans("Status")."</td>\n";
546print '<td class="center" width="40">'.$langs->trans("ShortInfo").'</td>';
547print "</tr>\n";
548
549// Auto mark ticket as read when created from backoffice
550print '<tr class="oddeven"><td>'.$langs->trans("TicketsAutoReadTicket").'</td>';
551print '<td class="left">';
552if ($conf->use_javascript_ajax) {
553 print ajax_constantonoff('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND');
554} else {
555 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
556 print $formcategory->selectarray("TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND", $arrval, getDolGlobalString('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND'));
557}
558print '</td>';
559print '<td class="center">';
560print $formcategory->textwithpicto('', $langs->trans("TicketsAutoReadTicketHelp"), 1, 'help');
561print '</td>';
562print '</tr>';
563
564// Auto assign ticket to user who created it
565print '<tr class="oddeven">';
566print '<td>'.$langs->trans("TicketsAutoAssignTicket").'</td>';
567print '<td class="left">';
568print '<input class="minwidth100" type="text" id="TICKET_AUTO_ASSIGN_USER_CREATE" name="TICKET_AUTO_ASSIGN_USER_CREATE" value="'.getDolGlobalString('TICKET_AUTO_ASSIGN_USER_CREATE').'">';
569print '</td>';
570print '<td class="center">';
571print $formcategory->textwithpicto('', $langs->trans("TicketsAutoAssignTicketHelp"), 1, 'help');
572print '</td>';
573print '</tr>';
574
575// Auto notify contacts when closing the ticket
576print '<tr class="oddeven"><td>'.$langs->trans("TicketsAutoNotifyClose").'</td>';
577print '<td class="left">';
578if ($conf->use_javascript_ajax) {
579 print ajax_constantonoff('TICKET_NOTIFY_AT_CLOSING');
580} else {
581 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
582 print $formcategory->selectarray("TICKET_NOTIFY_AT_CLOSING", $arrval, getDolGlobalString('TICKET_NOTIFY_AT_CLOSING'));
583}
584print '</td>';
585print '<td class="center">';
586print $formcategory->textwithpicto('', $langs->trans("TicketsAutoNotifyCloseHelp"), 1, 'help');
587print '</td>';
588print '</tr>';
589
590// Automatically define status on answering a ticket
591print '<tr class="oddeven"><td>'.$langs->trans("TicketAutoChangeStatusOnAnswer").'</td>';
592print '<td class="left">';
593print $formcategory->selectarray("TICKET_SET_STATUS_ON_ANSWER", $statuslist, getDolGlobalString('TICKET_SET_STATUS_ON_ANSWER'));
594print '</td>';
595print '<td class="center">';
596print $formcategory->textwithpicto('', $langs->trans("TicketAutoChangeStatusOnAnswerHelp"), 1, 'help');
597print '</td>';
598print '</tr>';
599
600print '<tr class="oddeven">';
601print '<td>'.$langs->trans("TicketsDelayBeforeFirstAnswer")."</td>";
602print '<td class="left">
603 <input type="number" value="'.getDolGlobalString('TICKET_DELAY_BEFORE_FIRST_RESPONSE').'" name="delay_first_response" class="width50">
604 </td>';
605print '<td class="center">';
606print $formcategory->textwithpicto('', $langs->trans("TicketsDelayBeforeFirstAnswerHelp"), 1, 'help');
607print '</td>';
608print '</tr>';
609
610print '<tr class="oddeven">';
611print '<td>'.$langs->trans("TicketsDelayBetweenAnswers")."</td>";
612print '<td class="left">
613 <input type="number" value="'.getDolGlobalString('TICKET_DELAY_SINCE_LAST_RESPONSE').'" name="delay_between_responses" class="width50">
614 </td>';
615print '<td class="center">';
616print $formcategory->textwithpicto('', $langs->trans("TicketsDelayBetweenAnswersHelp"), 1, 'help');
617print '</td>';
618print '</tr>';
619
620print '</table>';
621
622print $formcategory->buttonsSaveCancel("Save", '', array(), 0, 'reposition');
623
624print '</form>';
625
626print '<br>';
627
628/*
629 * Emails
630 */
631
632// Admin var of module
633print load_fiche_titre($langs->trans("Emails"), '', '');
634
635print '<table class="noborder centpercent">';
636
637print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" enctype="multipart/form-data" >';
638print '<input type="hidden" name="token" value="'.newToken().'">';
639print '<input type="hidden" name="action" value="setvar">';
640print '<input type="hidden" name="page_y" value="">';
641
642print '<tr class="liste_titre">';
643print '<td>'.$langs->trans("Parameter").'</td>';
644print '<td></td>';
645print '<td class="center" width="40">'.$langs->trans("ShortInfo").'</td>';
646print "</tr>\n";
647
648if (!getDolGlobalString('FCKEDITOR_ENABLE_MAIL')) {
649 print '<tr>';
650 print '<td colspan="2"><div class="info">'.$langs->trans("TicketCkEditorEmailNotActivated").'</div></td>';
651 print '<td class="center" width="40">'.$langs->trans("ShortInfo").'</td>';
652 print "</tr>\n";
653}
654
655// TODO Use module notification instead...
656
657// Email to send notifications
658print '<tr class="oddeven"><td>'.$langs->trans("TicketEmailNotificationFrom").'</td>';
659print '<td class="left">';
660print '<input type="text" class="minwidth200" name="TICKET_NOTIFICATION_EMAIL_FROM" value="' . getDolGlobalString('TICKET_NOTIFICATION_EMAIL_FROM').'"></td>';
661print '<td class="center">';
662print $formcategory->textwithpicto('', $langs->trans("TicketEmailNotificationFromHelp"), 1, 'help');
663print '</td>';
664print '</tr>';
665
666// Email for notification of TICKET_CREATE
667print '<tr class="oddeven"><td>'.$langs->trans("TicketEmailNotificationTo").'</td>';
668print '<td class="left">';
669print '<input type="text" class="minwidth200" name="TICKET_NOTIFICATION_EMAIL_TO" value="'.getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO').'"></td>';
670print '<td class="center">';
671print $formcategory->textwithpicto('', $langs->trans("TicketEmailNotificationToHelp"), 1, 'help');
672print '</td>';
673print '</tr>';
674
675// Check "Notify thirdparty" on ticket creation
676print '<tr class="oddeven"><td>'.$langs->trans("TicketAutoCheckNotifyThirdParty").'</td>';
677print '<td class="left">';
678if ($conf->use_javascript_ajax) {
679 print ajax_constantonoff('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION');
680} else {
681 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
682 print $formcategory->selectarray("TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION", $arrval, getDolGlobalString('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION'));
683}
684print '</td>';
685print '<td class="center">';
686print $formcategory->textwithpicto('', $langs->trans("TicketAutoCheckNotifyThirdPartyHelp"), 1, 'help');
687print '</td>';
688print '</tr>';
689
690// Message header
691$mail_intro = getDolGlobalString('TICKET_MESSAGE_MAIL_INTRO', '');
692print '<tr class="oddeven"><td>'.$langs->trans("TicketMessageMailIntro");
693print '</td><td>';
694require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
695$doleditor = new DolEditor('TICKET_MESSAGE_MAIL_INTRO', $mail_intro, '100%', 90, 'dolibarr_mailings', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAIL'), ROWS_2, '70');
696$doleditor->Create();
697print '</td>';
698print '<td class="center">';
699print $formcategory->textwithpicto('', $langs->trans("TicketMessageMailIntroHelpAdmin"), 1, 'help');
700print '</td></tr>';
701
702// Message footer
703$mail_signature = getDolGlobalString('TICKET_MESSAGE_MAIL_SIGNATURE');
704print '<tr class="oddeven"><td>'.$langs->trans("TicketMessageMailFooter").'</label>';
705print '</td><td>';
706require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
707$doleditor = new DolEditor('TICKET_MESSAGE_MAIL_SIGNATURE', $mail_signature, '100%', 90, 'dolibarr_mailings', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAIL'), ROWS_2, '70');
708$doleditor->Create();
709print '</td>';
710print '<td class="center">';
711print $formcategory->textwithpicto('', $langs->trans("TicketMessageMailFooterHelpAdmin"), 1, 'help');
712print '</td></tr>';
713
714print '</table>';
715
716print $formcategory->buttonsSaveCancel("Save", '', array(), 0, 'reposition');
717
718print '</form>';
719
720// End of page
721llxFooter();
722$db->close();
addDocumentModel($name, $type, $label='', $description='')
Add document model used by doc generator.
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
dolibarr_del_const($db, $name, $entity=1)
Delete a constant.
delDocumentModel($name, $type)
Delete document model used by doc generator.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:71
Class to manage a WYSIWYG editor.
Class to manage forms for categories.
llxFooter()
Footer empty.
Definition document.php:107
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
yn($yesno, $format=1, $color=0)
Return yes or no in current language.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
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:152
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
ticketAdminPrepareHead()
Build tabs for admin page.