dolibarr 24.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-2025 MDW <mdeweerd@users.noreply.github.com>
7 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
8 * Copyright (C) 2024-2025 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 (getDolGlobalString('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 = "Email of user allowed to send ticket replies 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', getDolGlobalString('MAIN_MAIL_EMAIL_FROM'), 'chaine', 0, $notification_email_description, $conf->entity);
206 }
207 if (!($res > 0)) {
208 $error++;
209 }
210
211 $notification_email_replyto = GETPOST('TICKET_NOTIFICATION_EMAIL_REPLYTO', 'alpha');
212 $notification_email_replyto_description = "Email that must appears as the sender of ticket replies sent from Dolibarr";
213 if (!empty($notification_email)) {
214 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_REPLYTO', $notification_email_replyto, 'chaine', 0, $notification_email_replyto_description, $conf->entity);
215 } else {
216 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_REPLYTO', getDolGlobalString('MAIN_MAIL_EMAIL_FROM'), 'chaine', 0, $notification_email_replyto_description, $conf->entity);
217 }
218 if (!($res > 0)) {
219 $error++;
220 }
221
222 // altairis : differentiate notification email FROM and TO
223 $notification_email_to = GETPOST('TICKET_NOTIFICATION_EMAIL_TO', 'alpha');
224 $notification_email_to_description = "Notified e-mail for ticket replies sent from Dolibarr";
225 if (!empty($notification_email_to)) {
226 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_TO', $notification_email_to, 'chaine', 0, $notification_email_to_description, $conf->entity);
227 } else {
228 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_TO', '', 'chaine', 0, $notification_email_to_description, $conf->entity);
229 }
230 if (!($res > 0)) {
231 $error++;
232 }
233
234 $notification_email_template = GETPOST('TICKET_NOTIFICATION_EMAIL_TEMPLATE', 'alpha');
235 $notification_email_template_description = 'Template email for ticket create notification';
236 if (!empty($notification_email_to)) {
237 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_TEMPLATE', $notification_email_template, 'chaine', 0, $notification_email_template_description, $conf->entity);
238 } else {
239 $res = dolibarr_set_const($db, 'TICKET_NOTIFICATION_EMAIL_TEMPLATE', '', 'chaine', 0, $notification_email_template_description, $conf->entity);
240 }
241 if (!($res > 0)) {
242 $error++;
243 }
244
245 $mail_intro = GETPOST('TICKET_MESSAGE_MAIL_INTRO', 'restricthtml');
246 $mail_intro_description = "Introduction text of ticket replies sent from Dolibarr";
247 if (!empty($mail_intro)) {
248 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_INTRO', $mail_intro, 'chaine', 0, $mail_intro_description, $conf->entity);
249 } else {
250 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_INTRO', '', 'chaine', 0, $mail_intro_description, $conf->entity);
251 }
252 if (!($res > 0)) {
253 $error++;
254 }
255
256 $mail_signature = GETPOST('TICKET_MESSAGE_MAIL_SIGNATURE', 'restricthtml');
257 $signature_description = "Signature of ticket replies sent from Dolibarr";
258 if (!empty($mail_signature)) {
259 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_SIGNATURE', $mail_signature, 'chaine', 0, $signature_description, $conf->entity);
260 } else {
261 $res = dolibarr_set_const($db, 'TICKET_MESSAGE_MAIL_SIGNATURE', '', 'chaine', 0, $signature_description, $conf->entity);
262 }
263 if (!($res > 0)) {
264 $error++;
265 }
266
267 $res = dolibarr_set_const($db, "TICKET_SEND_INTERNAL_CC", GETPOST("TICKET_SEND_INTERNAL_CC"), 'chaine', 0, '', $conf->entity);
268 if (!($res > 0)) {
269 $error++;
270 }
271}
272
273
274/*
275 * View
276 */
277
278$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
279
280$formcategory = new FormCategory($db);
281$form = new Form($db);
282
283// Page Header
284$help_url = 'EN:Module_Ticket|FR:Module_Ticket_FR';
285$page_name = 'TicketSetup';
286llxHeader('', $langs->trans($page_name), $help_url, '', 0, 0, '', '', '', 'mod-admin page-ticket');
287
288// Subheader
289$linkback = '<a href="'.dolBuildUrl(DOL_URL_ROOT.'/admin/modules.php', ['restore_lastsearch_values' => 1]).'">'.img_picto($langs->trans("BackToModuleList"), 'back', 'class="pictofixedwidth"').'<span class="hideonsmartphone">'.$langs->trans("BackToModuleList").'</span></a>';
290
291print load_fiche_titre($langs->trans($page_name), $linkback, 'title_setup');
292
293// Configuration header
294$head = ticketAdminPrepareHead();
295
296print dol_get_fiche_head($head, 'settings', $langs->trans("Module56000Name"), -1, "ticket");
297
298print '<span class="opacitymedium">'.$langs->trans("TicketSetupDictionaries").'</span> : <a href="'.DOL_URL_ROOT.'/admin/dict.php">'.$langs->trans("ClickHereToGoTo", $langs->transnoentitiesnoconv("DictionarySetup")).'</a><br>';
299
300print dol_get_fiche_end();
301
302
303/*
304 * Tickets numbering model
305 */
306
307print load_fiche_titre($langs->trans("TicketNumberingModules"), '', '');
308
309print '<div class="div-table-responsive-no-min">';
310print '<table class="noborder centpercent">';
311print '<tr class="liste_titre">';
312print '<td width="100">'.$langs->trans("Name").'</td>';
313print '<td>'.$langs->trans("Description").'</td>';
314print '<td>'.$langs->trans("Example").'</td>';
315print '<td align="center" width="60">'.$langs->trans("Activated").'</td>';
316print '<td align="center" width="40">'.$langs->trans("ShortInfo").'</td>';
317print "</tr>\n";
318
319clearstatcache();
320
321foreach ($dirmodels as $reldir) {
322 $dir = dol_buildpath($reldir."core/modules/ticket");
323
324 if (is_dir($dir)) {
325 $handle = opendir($dir);
326 if (is_resource($handle)) {
327 while (($file = readdir($handle)) !== false) {
328 if (preg_match('/^(mod_.*)\.php$/i', $file, $reg)) {
329 $file = $reg[1];
330 $classname = substr($file, 4);
331
332 include_once $dir.'/'.$file.'.php';
333
334 $module = new $file();
335 '@phan-var-force ModeleNumRefTicket $module';
338 // Show modules according to features level
339 if ($module->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) {
340 continue;
341 }
342
343 if ($module->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) {
344 continue;
345 }
346
347 if ($module->isEnabled()) {
348 print '<tr class="oddeven"><td>'.$module->name."</td><td>\n";
349 print $module->info($langs);
350 print '</td>';
351
352 // Show example of numbering model
353 print '<td class="nowrap">';
354 $tmp = $module->getExample();
355 if (preg_match('/^Error/', $tmp)) {
356 $langs->load("errors");
357 print '<div class="error">'.$langs->trans($tmp).'</div>';
358 } elseif ($tmp == 'NotConfigured') {
359 print '<span class="opacitymedium">'.$langs->trans($tmp).'</span>';
360 } else {
361 print $tmp;
362 }
363
364 print '</td>'."\n";
365
366 print '<td class="center">';
367 if (getDolGlobalString('TICKET_ADDON') == 'mod_'.$classname) {
368 print img_picto($langs->trans("Activated"), 'switch_on');
369 } else {
370 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>';
371 }
372 print '</td>';
373
374 $ticket = new Ticket($db);
375 $ticket->initAsSpecimen();
376
377 // Info
378 $htmltooltip = '';
379 $htmltooltip .= ''.$langs->trans("Version").': <b>'.$module->getVersion().'</b><br>';
380 $nextval = $module->getNextValue($mysoc, $ticket);
381 if ("$nextval" != $langs->trans("NotAvailable")) { // Keep " on nextval
382 $htmltooltip .= ''.$langs->trans("NextValue").': ';
383 if ($nextval) {
384 $htmltooltip .= $nextval.'<br>';
385 } else {
386 $htmltooltip .= $langs->trans($module->error).'<br>';
387 }
388 }
389
390 print '<td class="center">';
391 print $formcategory->textwithpicto('', $htmltooltip, 1, '0');
392 print '</td>';
393
394 print '</tr>';
395 }
396 }
397 }
398 closedir($handle);
399 }
400 }
401}
402
403print '</table>';
404print '</div>';
405print '<br>';
406
407
408
409/*
410 * Document templates generators
411 */
412
413print load_fiche_titre($langs->trans("TicketsModelModule"), '', '');
414
415// Load array def with activated templates
416$def = array();
417$sql = "SELECT nom";
418$sql .= " FROM ".MAIN_DB_PREFIX."document_model";
419$sql .= " WHERE type = '".$db->escape($type)."'";
420$sql .= " AND entity = ".((int) $conf->entity);
421$resql = $db->query($sql);
422if ($resql) {
423 $i = 0;
424 $num_rows = $db->num_rows($resql);
425 while ($i < $num_rows) {
426 $array = $db->fetch_array($resql);
427 if (is_array($array)) {
428 array_push($def, $array[0]);
429 }
430 $i++;
431 }
432} else {
434}
435
436
437print '<div class="div-table-responsive-no-min">';
438print '<table class="noborder cenpercent">'."\n";
439print '<tr class="liste_titre">'."\n";
440print '<td>'.$langs->trans("Name").'</td>';
441print '<td>'.$langs->trans("Description").'</td>';
442print '<td class="center" width="60">'.$langs->trans("Status")."</td>\n";
443print '<td class="center" width="60">'.$langs->trans("Default")."</td>\n";
444print '<td class="center" width="50">'.$langs->trans("Preview").'</td>';
445print '<td class="center" width="40">'.$langs->trans("ShortInfo").'</td>';
446print "</tr>\n";
447
448clearstatcache();
449
450foreach ($dirmodels as $reldir) {
451 foreach (array('', '/doc') as $valdir) {
452 $realpath = $reldir."core/modules/ticket".$valdir;
453 $dir = dol_buildpath($realpath);
454
455 if (is_dir($dir)) {
456 $handle = opendir($dir);
457 if (is_resource($handle)) {
458 $filelist = array();
459 while (($file = readdir($handle)) !== false) {
460 $filelist[] = $file;
461 }
462 closedir($handle);
463 arsort($filelist);
464
465 foreach ($filelist as $file) {
466 if (preg_match('/\.modules\.php$/i', $file) && preg_match('/^(pdf_|doc_)/', $file)) {
467 if (file_exists($dir.'/'.$file)) {
468 $name = substr($file, 4, dol_strlen($file) - 16);
469 $classname = substr($file, 0, dol_strlen($file) - 12);
470
471 require_once $dir.'/'.$file;
472 $module = new $classname($db);
473 '@phan-var-force ModelePDFTicket $module';
474
475 $modulequalified = 1;
476 if ($module->version == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) {
477 $modulequalified = 0;
478 }
479 if ($module->version == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) {
480 $modulequalified = 0;
481 }
482
483 if ($modulequalified) {
484 print '<tr class="oddeven"><td width="100">';
485 print(empty($module->name) ? $name : $module->name);
486 print "</td><td>\n";
487 if (method_exists($module, 'info')) {
488 print $module->info($langs); // @phan-suppress-current-line PhanUndeclaredMethod
489 } else {
490 print $module->description;
491 }
492 print '</td>';
493
494 // Active / Status
495 if (in_array($name, $def)) {
496 print '<td class="center">'."\n";
497 print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=del&token='.newToken().'&value='.urlencode($name).'">';
498 print img_picto($langs->trans("Enabled"), 'switch_on');
499 print '</a>';
500 print '</td>';
501 } else {
502 print '<td class="center">'."\n";
503 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>';
504 print "</td>";
505 }
506
507 // Default Template
508 print '<td class="center">';
509 if (getDolGlobalString("TICKET_ADDON_PDF") == $name) {
510 print img_picto($langs->trans("Default"), 'on');
511 } else {
512 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>';
513 }
514 print '</td>';
515
516 // Preview
517 print '<td class="center">';
518 if ($module->type == 'pdf') {
519 print '<a href="'.$_SERVER["PHP_SELF"].'?action=specimen&module='.urlencode($name).'">'.img_object($langs->trans("Preview"), 'pdf').'</a>';
520 } else {
521 print img_object($langs->transnoentitiesnoconv("PreviewNotAvailable"), 'generic');
522 }
523 print '</td>';
524
525 // Info
526 $htmltooltip = ''.$langs->trans("Name").': '.$module->name;
527 $htmltooltip .= '<br>'.$langs->trans("Type").': '.($module->type ? $module->type : $langs->trans("Unknown"));
528 if ($module->type == 'pdf') {
529 $htmltooltip .= '<br>'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur;
530 }
531 $htmltooltip .= '<br>'.$langs->trans("Path").': '.preg_replace('/^\//', '', $realpath).'/'.$file;
532
533 $htmltooltip .= '<br><br><u>'.$langs->trans("FeaturesSupported").':</u>';
534 $htmltooltip .= '<br>'.$langs->trans("Logo").': '.yn($module->option_logo, 1, 1);
535 $htmltooltip .= '<br>'.$langs->trans("MultiLanguage").': '.yn($module->option_multilang, 1, 1);
536 //$htmltooltip .= '<br>'.$langs->trans("Discounts").': '.yn($module->option_escompte,1,1);
537 //$htmltooltip .= '<br>'.$langs->trans("CreditNote").': '.yn($module->option_credit_note,1,1);
538 //$htmltooltip .= '<br>'.$langs->trans("WatermarkOnDraftOrders").': '.yn($module->option_draft_watermark, 1, 1);
539
540
541 print '<td class="center">';
542 print $formcategory->textwithpicto('', $htmltooltip, 1, '0');
543 print '</td>';
544
545 print "</tr>\n";
546 }
547 }
548 }
549 }
550 }
551 }
552 }
553}
554
555print '</table>';
556print '</div><br>';
557
558
559print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" enctype="multipart/form-data" >';
560print '<input type="hidden" name="token" value="'.newToken().'">';
561print '<input type="hidden" name="action" value="setvarworkflow">';
562print '<input type="hidden" name="page_y" value="">';
563
564/*
565 * Other Parameters
566 */
567
568print load_fiche_titre($langs->trans("Other"), '', '');
569print '<div class="div-table-responsive-no-min">';
570print '<table class="noborder centpercent">';
571
572print '<tr class="liste_titre">';
573print '<td class="titlefieldmiddle">'.$langs->trans("Parameter").'</td>';
574print '<td></td>'."\n";
575print '<td class="center" width="40"></td>';
576print "</tr>\n";
577
578// Auto mark ticket as read when created from backoffice
579print '<tr class="oddeven"><td>'.$langs->trans("TicketsAutoReadTicket").'</td>';
580print '<td class="left">';
581if ($conf->use_javascript_ajax) {
582 print ajax_constantonoff('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND');
583} else {
584 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
585 print $formcategory->selectarray("TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND", $arrval, getDolGlobalString('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND'));
586}
587print '</td>';
588print '<td class="center">';
589print $formcategory->textwithpicto('', $langs->trans("TicketsAutoReadTicketHelp"), 1, 'help');
590print '</td>';
591print '</tr>';
592
593// Auto mark ticket as read when assign someone
594print '<tr class="oddeven"><td>'.$langs->trans("TicketsAutoReadTicketWhenAssign").'</td>';
595print '<td class="left">';
596if ($conf->use_javascript_ajax) {
597 print ajax_constantonoff('TICKET_AUTO_READ_WHEN_ASSIGN');
598} else {
599 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
600 print $formcategory->selectarray("TICKET_AUTO_READ_WHEN_ASSIGN", $arrval, getDolGlobalString('TICKET_AUTO_READ_WHEN_ASSIGN'));
601}
602print '</td>';
603print '<td class="center">';
604print $formcategory->textwithpicto('', $langs->trans("TicketsAutoReadTicketWhenAssignHelp"), 1, 'help');
605print '</td>';
606print '</tr>';
607
608
609// Auto assign ticket to user who created it
610print '<tr class="oddeven">';
611print '<td><label for="TICKET_AUTO_ASSIGN_USER_CREATE" class="block">'.$langs->trans("TicketsAutoAssignTicket").'</label></td>';
612print '<td class="left">';
613print '<input class="maxwidth50" type="text" id="TICKET_AUTO_ASSIGN_USER_CREATE" name="TICKET_AUTO_ASSIGN_USER_CREATE" value="'.getDolGlobalInt('TICKET_AUTO_ASSIGN_USER_CREATE').'">';
614print '</td>';
615print '<td class="center">';
616print $formcategory->textwithpicto('', $langs->trans("TicketsAutoAssignTicketHelp"), 1, 'help');
617print '</td>';
618print '</tr>';
619
620// Automatically define status on answering a ticket
621print '<tr class="oddeven"><td>'.$langs->trans("TicketAutoChangeStatusOnAnswer").'</td>';
622print '<td class="left">';
623print $formcategory->selectarray("TICKET_SET_STATUS_ON_ANSWER", $statuslist, getDolGlobalString('TICKET_SET_STATUS_ON_ANSWER'), 1);
624print '</td>';
625print '<td class="center">';
626print $formcategory->textwithpicto('', $langs->trans("TicketAutoChangeStatusOnAnswerHelp"), 1, 'help');
627print '</td>';
628print '</tr>';
629
630print '<tr class="oddeven">';
631print '<td><label for="delay_first_response" class="block">'.$langs->trans("TicketsDelayBeforeFirstAnswer")."</label></td>";
632print '<td class="left">
633 <input type="number" value="'.getDolGlobalString('TICKET_DELAY_BEFORE_FIRST_RESPONSE').'" id="delay_first_response" name="delay_first_response" class="width50">
634 </td>';
635print '<td class="center">';
636print $formcategory->textwithpicto('', $langs->trans("TicketsDelayBeforeFirstAnswerHelp"), 1, 'help');
637print '</td>';
638print '</tr>';
639
640print '<tr class="oddeven">';
641print '<td><label for="delay_between_responses" class="block">'.$langs->trans("TicketsDelayBetweenAnswers")."</label></td>";
642print '<td class="left">
643 <input type="number" value="'.getDolGlobalString('TICKET_DELAY_SINCE_LAST_RESPONSE').'" id="delay_between_responses" name="delay_between_responses" class="width50">
644 </td>';
645print '<td class="center">';
646print $formcategory->textwithpicto('', $langs->trans("TicketsDelayBetweenAnswersHelp"), 1, 'help');
647print '</td>';
648print '</tr>';
649
650print '</table>';
651
652print $formcategory->buttonsSaveCancel("Save", '', array(), 0, 'reposition');
653
654print '</form>';
655
656print '<br>';
657
658
659// TODO Use the notification module
660
661/*
662 * Notifications
663 */
664
665print load_fiche_titre($langs->trans("Notifications"), '', '');
666
667print '<table class="noborder centpercent">';
668
669print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'" enctype="multipart/form-data" >';
670print '<input type="hidden" name="token" value="'.newToken().'">';
671print '<input type="hidden" name="action" value="setvar">';
672print '<input type="hidden" name="page_y" value="">';
673
674print '<tr class="liste_titre">';
675print '<td>'.$langs->trans("Parameter").'</td>';
676print '<td></td>';
677print '<td class="center" width="40"></td>';
678print "</tr>\n";
679
680if (!getDolGlobalString('FCKEDITOR_ENABLE_MAIL')) {
681 print '<tr>';
682 print '<td colspan="2"><div class="info">'.$langs->trans("TicketCkEditorEmailNotActivated").'</div></td>';
683 print '<td class="center" width="40"></td>';
684 print "</tr>\n";
685}
686
687// Email of sender allowed to send technical notifications
688print '<tr class="oddeven"><td><label for="TICKET_NOTIFICATION_EMAIL_FROM" class="block">'.$langs->trans("TicketEmailNotificationFrom").'</label></td>';
689print '<td class="left">';
690print img_picto('', 'email', 'class="pictofixedwidth"');
691print '<input type="text" class="minwidth200" id="TICKET_NOTIFICATION_EMAIL_FROM" name="TICKET_NOTIFICATION_EMAIL_FROM" value="' . getDolGlobalString('TICKET_NOTIFICATION_EMAIL_FROM').'"></td>';
692print '<td class="center">';
693print $formcategory->textwithpicto('', $langs->trans("TicketEmailNotificationFromHelp"), 1, 'help');
694print '</td>';
695print '</tr>';
696
697// Email that must appears as the sender of email notifications
698print '<tr class="oddeven"><td><label for="TICKET_NOTIFICATION_EMAIL_REPLYTO" class="block">'.$langs->trans("TicketEmailNotificationReplyTo").'</label></td>';
699print '<td class="left">';
700print img_picto('', 'email', 'class="pictofixedwidth"');
701print '<input type="text" class="minwidth200" id="TICKET_NOTIFICATION_EMAIL_REPLYTO" name="TICKET_NOTIFICATION_EMAIL_REPLYTO" value="' . getDolGlobalString('TICKET_NOTIFICATION_EMAIL_REPLYTO').'"></td>';
702print '<td class="center">';
703print $formcategory->textwithpicto('', $langs->trans("TicketEmailNotificationReplyToHelp"), 1, 'help');
704print '</td>';
705print '</tr>';
706
707print '<tr class="oddeven"><td class="titlefieldmiddle"><label for="TICKET_SEND_INTERNAL_CC" class="block">';
708print $form->textwithpicto($langs->trans("TicketSendToInternalCC"), $langs->trans("TicketSendToInternalCCHelp")).'</label></td>';
709print '<td>';
710print img_picto('', 'email', 'class="pictofixedwidth"');
711print '<input class="minwidth200" name="TICKET_SEND_INTERNAL_CC" value="'.getDolGlobalString('TICKET_SEND_INTERNAL_CC').'">';
712print '</td>';
713print '<td></td>';
714print '</tr>';
715
716
717// TODO Use module notification instead...
718
719// Email for notification of TICKET_CREATE
720print '<tr class="oddeven"><td><label for="TICKET_NOTIFICATION_EMAIL_TO" class="block">'.$langs->trans("TicketEmailNotificationTo").'</label></td>';
721print '<td class="left">';
722print img_picto('', 'email', 'class="pictofixedwidth"');
723print '<input type="text" class="minwidth200" id="TICKET_NOTIFICATION_EMAIL_TO" name="TICKET_NOTIFICATION_EMAIL_TO" value="'.getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TO').'"></td>';
724print '<td class="center">';
725print $formcategory->textwithpicto('', $langs->trans("TicketEmailNotificationToHelp"), 1, 'help');
726print '</td>';
727print '</tr>';
728
729include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
730$formmail = new FormMail($db);
731
732$formmail->fetchAllEMailTemplate('ticket_send', $user, null, -1); // We set lang=null to get in priority record with no lang
733$arrayofmessagename = array();
734if (is_array($formmail->lines_model)) {
735 foreach ($formmail->lines_model as $modelmail) {
736 //var_dump($modelmail);
737 $moreonlabel = '';
738 if (!empty($arrayofmessagename[$modelmail->label])) {
739 $moreonlabel = ' <span class="opacitymedium">('.$langs->trans("SeveralLangugeVariatFound").')</span>';
740 }
741 // The 'label' is the key that is unique if we exclude the language
742 $arrayofmessagename[$modelmail->label.':ticket_send'] = $langs->trans(preg_replace('/\‍(|\‍)/', '', $modelmail->label)).$moreonlabel;
743 }
744}
745
746// Email template for notification of TICKET_CREATE
747print '<tr class="oddeven"><td><label for="TICKET_NOTIFICATION_EMAIL_TEMPLATE" class="block">'.$langs->trans('TicketEmailNotificationTemplate').'</label></td>';
748print '<td class="left">';
749print $form->selectarray('TICKET_NOTIFICATION_EMAIL_TEMPLATE', $arrayofmessagename, getDolGlobalString('TICKET_NOTIFICATION_EMAIL_TEMPLATE'), 'None', 0, 0, '', 0, 0, 0, '', '', 1);
750print '<td class="center">';
751print $formcategory->textwithpicto('', $langs->trans('TicketEmailNotificationTemplateHelp'), 1, 'help');
752print '</td>';
753print '</tr>';
754
755// Check "Notify thirdparty" by default on ticket creation
756print '<tr class="oddeven"><td>'.$langs->trans("TicketAutoCheckNotifyThirdParty").'</td>';
757print '<td class="left">';
758if ($conf->use_javascript_ajax) {
759 print ajax_constantonoff('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION');
760} else {
761 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
762 print $formcategory->selectarray("TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION", $arrval, getDolGlobalString('TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION'));
763}
764print '</td>';
765print '<td class="center">';
766print $formcategory->textwithpicto('', $langs->trans("TicketAutoCheckNotifyThirdPartyHelp"), 1, 'help');
767print '</td>';
768print '</tr>';
769
770// Auto notify contacts when closing the ticket
771print '<tr class="oddeven"><td>'.$langs->trans("TicketsAutoNotifyClose").'</td>';
772print '<td class="left">';
773if ($conf->use_javascript_ajax) {
774 print ajax_constantonoff('TICKET_NOTIFY_AT_CLOSING');
775} else {
776 $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
777 print $formcategory->selectarray("TICKET_NOTIFY_AT_CLOSING", $arrval, getDolGlobalString('TICKET_NOTIFY_AT_CLOSING'));
778}
779print '</td>';
780print '<td class="center">';
781print $formcategory->textwithpicto('', $langs->trans("TicketsAutoNotifyCloseHelp"), 1, 'help');
782print '</td>';
783print '</tr>';
784
785// Message header
786$mail_intro = getDolGlobalString('TICKET_MESSAGE_MAIL_INTRO', '');
787print '<tr class="oddeven"><td>'.$langs->trans("TicketMessageMailIntro");
788print '</td><td>';
789require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
790$doleditor = new DolEditor('TICKET_MESSAGE_MAIL_INTRO', $mail_intro, '100%', 90, 'dolibarr_mailings', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAIL'), ROWS_2, '70');
791$doleditor->Create();
792print '</td>';
793print '<td class="center">';
794print $formcategory->textwithpicto('', $langs->trans("TicketMessageMailIntroHelpAdmin"), 1, 'help');
795print '</td></tr>';
796
797// Message footer
798$mail_signature = getDolGlobalString('TICKET_MESSAGE_MAIL_SIGNATURE');
799print '<tr class="oddeven"><td>'.$langs->trans("TicketMessageMailFooter").'</label>';
800print '</td><td>';
801require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
802$doleditor = new DolEditor('TICKET_MESSAGE_MAIL_SIGNATURE', $mail_signature, '100%', 90, 'dolibarr_mailings', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_MAIL'), ROWS_2, '70');
803$doleditor->Create();
804print '</td>';
805print '<td class="center">';
806print $formcategory->textwithpicto('', $langs->trans("TicketMessageMailFooterHelpAdmin"), 1, 'help');
807print '</td></tr>';
808
809print '</table>';
810
811print $formcategory->buttonsSaveCancel("Save", '', array(), 0, 'reposition');
812
813print '</form>';
814
815// End of page
816llxFooter();
817$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.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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:73
Class to manage a WYSIWYG editor.
Class to manage forms for categories.
Class to manage generation of HTML components Only common components must be here.
Class to manage a HTML form to send a unitary email Usage: $formail = new FormMail($db) $formmail->pr...
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
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, $allowothertags=array())
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, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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:133
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.