31require_once DOL_DOCUMENT_ROOT .
'/core/class/html.form.class.php';
32require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formmail.class.php';
33require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
35if (!class_exists(
'FormCompany')) {
36 include DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
67 public $fk_user_create;
104 public $withfilereadonly;
119 public $withtitletopic;
123 public $withtopicreadonly;
136 public $withfromsocid;
140 public $withfromcontactid;
144 public $withnotifytiersatcreate;
148 public $withusercreate;
152 public $withcreatereadonly;
157 public $withextrafields;
175 public $category_code;
179 public $severity_code;
186 public $substit = array();
190 public $param = array();
199 public $errors = array();
213 $this->action =
'add';
215 $this->withcompany = (int) (!
getDolGlobalInt(
"TICKETS_NO_COMPANY_ON_FORM") && isModEnabled(
"societe"));
216 $this->withfromsocid = 0;
217 $this->withfromcontactid = 0;
218 $this->withreadid = 0;
220 $this->withnotifytiersatcreate = 0;
221 $this->withusercreate = 1;
222 $this->withcreatereadonly = 1;
223 $this->withemail = 0;
225 $this->withextrafields = 0;
241 foreach ($fields as $field => $type) {
242 if (!
GETPOST($field, $type[
'check'])) {
244 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities($type[
'langs'])),
null,
'errors');
260 public function showForm($withdolfichehead = 0, $mode =
'edit', $public = 0, $with_contact =
null, $action =
'',
$object =
null)
262 global
$conf, $langs, $user, $hookmanager;
265 $langs->loadLangs(array(
'other',
'mails',
'ticket'));
267 if ($mode ==
'create') {
268 $ref = GETPOSTISSET(
"ref") ?
GETPOST(
"ref",
'alpha') :
'';
269 $type_code = GETPOSTISSET(
'type_code') ?
GETPOST(
'type_code',
'alpha') :
'';
270 $category_code = GETPOSTISSET(
'category_code') ?
GETPOST(
'category_code',
'alpha') :
'';
271 $severity_code = GETPOSTISSET(
'severity_code') ?
GETPOST(
'severity_code',
'alpha') :
'';
272 $subject = GETPOSTISSET(
'subject') ?
GETPOST(
'subject',
'alpha') :
'';
273 $email = GETPOSTISSET(
'email') ?
GETPOST(
'email',
'alpha') :
'';
274 $msg = GETPOSTISSET(
'message') ?
GETPOST(
'message',
'restricthtml') :
'';
275 $projectid = GETPOSTISSET(
'projectid') ?
GETPOST(
'projectid',
'int') :
'';
276 $user_assign = GETPOSTISSET(
'fk_user_assign') ?
GETPOSTINT(
'fk_user_assign') : $this->fk_user_create;
279 $type_code = GETPOSTISSET(
'type_code') ?
GETPOST(
'type_code',
'alpha') :
$object->type_code;
280 $category_code = GETPOSTISSET(
'category_code') ?
GETPOST(
'category_code',
'alpha') :
$object->category_code;
281 $severity_code = GETPOSTISSET(
'severity_code') ?
GETPOST(
'severity_code',
'alpha') :
$object->severity_code;
282 $subject = GETPOSTISSET(
'subject') ?
GETPOST(
'subject',
'alpha') :
$object->subject;
283 $email = GETPOSTISSET(
'email') ?
GETPOST(
'email',
'alpha') :
$object->email_from;
284 $msg = GETPOSTISSET(
'message') ?
GETPOST(
'message',
'restricthtml') :
$object->message;
285 $projectid = GETPOSTISSET(
'projectid') ?
GETPOST(
'projectid',
'int') :
$object->fk_project;
286 $user_assign = GETPOSTISSET(
'fk_user_assign') ?
GETPOSTINT(
'fk_user_assign') :
$object->fk_user_assign;
289 $form =
new Form($this->db);
291 $ticketstatic =
new Ticket($this->db);
294 if (!empty($this->withfromsocid) && $this->withfromsocid > 0) {
295 $soc->fetch($this->withfromsocid);
298 $ticketstat =
new Ticket($this->db);
301 $extrafields->fetch_name_optionals_label($ticketstat->table_element);
303 print
"\n<!-- Begin form TICKET -->\n";
305 if ($withdolfichehead) {
309 print
'<form method="POST" '.($withdolfichehead ?
'' :
'style="margin-bottom: 30px;" ').
'name="ticket" id="form_create_ticket" enctype="multipart/form-data" action="'.(!empty($this->param[
"returnurl"]) ? $this->param[
"returnurl"] : $_SERVER[
'PHP_SELF']).
'">';
310 print
'<input type="hidden" name="token" value="'.newToken().
'">';
311 print
'<input type="hidden" name="action" value="'.$this->action.
'">';
313 print
'<input type="hidden" name="id" value="'.
$object->id .
'">';
315 print
'<input type="hidden" name="trackid" value="'.$this->trackid.
'">';
316 foreach ($this->param as $key => $value) {
317 print
'<input type="hidden" name="'.$key.
'" value="'.$value.
'">';
319 print
'<input type="hidden" name="fk_user_create" value="'.$this->fk_user_create.
'">';
321 print
'<table class="border centpercent">';
324 if ($this->withref) {
325 $defaultref = $ticketstat->getDefaultRef();
327 if ($mode ==
'edit') {
330 print
'<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans(
"Ref").
'</span></td><td>';
331 print
'<input type="text" name="ref" value="'.dol_escape_htmltag($defaultref).
'">';
336 if ($this->withemail) {
337 print
'<tr><td class="titlefield"><label for="email"><span class="fieldrequired">'.$langs->trans(
"Email").
'</span></label></td><td>';
338 print
'<input class="text minwidth200" id="email" name="email" value="'.$email.
'" autofocus>';
343 $html_contact_search =
'';
344 $html_contact_search .=
'<tr id="contact_search_line">';
345 $html_contact_search .=
'<td class="titlefield">';
346 $html_contact_search .=
'<label for="contact"><span class="fieldrequired">' . $langs->trans(
'Contact') .
'</span></label>';
347 $html_contact_search .=
'<input type="hidden" id="contact_id" name="contact_id" value="" />';
348 $html_contact_search .=
'</td>';
349 $html_contact_search .=
'<td id="contact_search_result"></td>';
350 $html_contact_search .=
'</tr>';
351 print $html_contact_search;
353 $html_contact_lastname =
'';
354 $html_contact_lastname .=
'<tr id="contact_lastname_line" class="contact_field"><td class="titlefield"><label for="contact_lastname"><span class="fieldrequired">' . $langs->trans(
'Lastname') .
'</span></label></td><td>';
355 $html_contact_lastname .=
'<input type="text" id="contact_lastname" name="contact_lastname" value="' .
dol_escape_htmltag(GETPOSTISSET(
'contact_lastname') ?
GETPOST(
'contact_lastname',
'alphanohtml') :
'') .
'" />';
356 $html_contact_lastname .=
'</td></tr>';
357 print $html_contact_lastname;
359 $html_contact_firstname =
'';
360 $html_contact_firstname .=
'<tr id="contact_firstname_line" class="contact_field"><td class="titlefield"><label for="contact_firstname"><span class="fieldrequired">' . $langs->trans(
'Firstname') .
'</span></label></td><td>';
361 $html_contact_firstname .=
'<input type="text" id="contact_firstname" name="contact_firstname" value="' .
dol_escape_htmltag(GETPOSTISSET(
'contact_firstname') ?
GETPOST(
'contact_firstname',
'alphanohtml') :
'') .
'" />';
362 $html_contact_firstname .=
'</td></tr>';
363 print $html_contact_firstname;
365 $html_company_name =
'';
366 $html_company_name .=
'<tr id="contact_company_name_line" class="contact_field"><td><label for="company_name"><span>' . $langs->trans(
'Company') .
'</span></label></td><td>';
367 $html_company_name .=
'<input type="text" id="company_name" name="company_name" value="' .
dol_escape_htmltag(GETPOSTISSET(
'company_name') ?
GETPOST(
'company_name',
'alphanohtml') :
'') .
'" />';
368 $html_company_name .=
'</td></tr>';
369 print $html_company_name;
371 $html_contact_phone =
'';
372 $html_contact_phone .=
'<tr id="contact_phone_line" class="contact_field"><td><label for="contact_phone"><span>' . $langs->trans(
'Phone') .
'</span></label></td><td>';
373 $html_contact_phone .=
'<input type="text" id="contact_phone" name="contact_phone" value="' .
dol_escape_htmltag(GETPOSTISSET(
'contact_phone') ?
GETPOST(
'contact_phone',
'alphanohtml') :
'') .
'" />';
374 $html_contact_phone .=
'</td></tr>';
375 print $html_contact_phone;
378 $langs->load(
'errors');
379 print
'<script nonce="'.getNonce().
'" type="text/javascript">
380 jQuery(document).ready(function() {
381 var contact = jQuery.parseJSON("'.
dol_escape_js(json_encode($with_contact), 2).
'");
382 jQuery("#contact_search_line").hide();
384 if (contact.id > 0) {
385 jQuery("#contact_search_line").show();
386 jQuery("#contact_id").val(contact.id);
387 jQuery("#contact_search_result").html(contact.firstname+" "+contact.lastname);
388 jQuery(".contact_field").hide();
390 jQuery(".contact_field").show();
394 jQuery("#email").change(function() {
395 jQuery("#contact_search_line").show();
396 jQuery("#contact_search_result").html("'.
dol_escape_js($langs->trans(
'Select2SearchInProgress')).
'");
397 jQuery("#contact_id").val("");
398 jQuery("#contact_lastname").val("");
399 jQuery("#contact_firstname").val("");
400 jQuery("#company_name").val("");
401 jQuery("#contact_phone").val("");
406 action: "getContacts",
407 email: jQuery("#email").val()
410 if (response.error) {
411 jQuery("#contact_search_result").html("<span class=\"error\">"+response.error+"</span>");
413 var contact_list = response.contacts;
414 if (contact_list.length == 1) {
415 var contact = contact_list[0];
416 jQuery("#contact_id").val(contact.id);
417 jQuery("#contact_search_result").html(contact.firstname+" "+contact.lastname);
418 jQuery(".contact_field").hide();
419 } else if (contact_list.length <= 0) {
420 jQuery("#contact_search_line").hide();
421 jQuery(".contact_field").show();
425 ).fail(function(jqxhr, textStatus, error) {
426 var error_msg = "'.
dol_escape_js($langs->trans(
'ErrorAjaxRequestFailed')).
'"+" ["+textStatus+"] : "+error;
427 jQuery("#contact_search_result").html("<span class=\"error\">"+error_msg+"</span>");
437 if (isset($this->param[
'origin']) && $this->param[
'originid'] > 0) {
439 $element = $subelement = $this->param[
'origin'];
441 if (preg_match(
'/^([^_]+)_([^_]+)/i', $this->param[
'origin'], $regs)) {
443 $subelement = $regs[2];
447 $classname = ucfirst($subelement);
448 $objectsrc =
new $classname($this->db);
449 '@phan-var-force CommonObject $objectsrc';
452 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
453 $objectsrc->fetch_lines();
456 $objectsrc->fetch_thirdparty();
457 $newclassname = $classname;
458 print
'<tr><td>'.$langs->trans($newclassname).
'</td><td colspan="2"><input name="'.$subelement.
'id" value="'.
GETPOST(
'originid').
'" type="hidden" />'.$objectsrc->getNomUrl(1).
'</td></tr>';
462 print
'<tr><td class="titlefield"><span class="fieldrequired"><label for="selecttype_code">'.$langs->trans(
"TicketTypeRequest").
'</span></label></td><td>';
463 $this->
selectTypesTickets($type_code,
'type_code',
'', 2,
'ifone', 0, 0,
'minwidth200 maxwidth500');
467 print
'<tr><td><span class="fieldrequired"><label for="selectcategory_code">'.$langs->trans(
"TicketCategory").
'</span></label></td><td>';
470 $filter =
'(public:=:1)';
472 $this->
selectGroupTickets($category_code,
'category_code', $filter, 2,
'ifone', 0, 0,
'minwidth200 maxwidth500');
476 print
'<tr><td><span class="fieldrequired"><label for="selectseverity_code">'.$langs->trans(
"TicketSeverity").
'</span></label></td><td>';
477 $this->
selectSeveritiesTickets($severity_code,
'severity_code',
'', 2,
'ifone', 0, 0,
'minwidth200 maxwidth500');
480 if (isModEnabled(
'knowledgemanagement')) {
482 print
'<tr id="KWwithajax" class="hidden"><td></td></tr>';
483 print
'<!-- Script to manage change of ticket group -->
484 <script nonce="'.getNonce().
'">
485 jQuery(document).ready(function() {
486 function groupticketchange() {
487 console.log("We called groupticketchange, so we try to load list KM linked to event");
488 $("#KWwithajax").html("");
489 idgroupticket = $("#selectcategory_code").val();
491 console.log("We have selected id="+idgroupticket);
493 if (idgroupticket != "") {
494 $.ajax({ url: \''.DOL_URL_ROOT.
'/core/ajax/fetchKnowledgeRecord.php\',
495 data: { action: \'getKnowledgeRecord\', idticketgroup: idgroupticket, token: \''.
newToken().
'\', lang:\
''.$langs->defaultlang.
'\',
public:
'.($public).' },
497 success: function(response) {
499 console.log("We received response "+response);
500 if (typeof response == "object") {
501 console.log("response is already type object, no need to parse it");
503 console.log("response is type "+(typeof response));
504 response = JSON.parse(response);
506 for (key in response) {
507 answer = response[key].answer;
508 urllist += \'<li><a href="#" title="\'+response[key].title+\'" class="button_KMpopup" data-html="\'+answer+\'">\' +response[key].title+\'</a></li>\';
511 $("#KWwithajax").html(\'<td>'.$langs->trans(
"KMFoundForTicketGroup").
'</td><td><ul>\'+urllist+\'</ul></td>\');
512 $("#KWwithajax").show();
513 $(".button_KMpopup").on("click",function(){
514 console.log("Open popup with jQuery(...).dialog() with KM article")
515 var $dialog = $("<div></div>").html($(this).attr("data-html"))
519 height: (window.innerHeight - 150),
521 title: $(this).attr("title"),
523 $dialog.dialog("open");
524 console.log($dialog);
528 error : function(output) {
529 console.error("Error on Fetch of KM articles");
534 $("#selectcategory_code").on("change",function() { groupticketchange(); });
535 if ($("#selectcategory_code").val() != "") {
543 if ($this->withtitletopic) {
544 print
'<tr><td><label for="subject"><span class="fieldrequired">'.$langs->trans(
"Subject").
'</span></label></td><td>';
546 if ($this->withtopicreadonly) {
547 print $langs->trans(
'SubjectAnswerToTicket').
' '.$this->topic_title;
549 if (isset($this->withreadid) && $this->withreadid > 0) {
550 $subject = $langs->trans(
'SubjectAnswerToTicket').
' '.$this->withreadid.
' : '.$this->topic_title;
552 print
'<input class="text minwidth500" id="subject" name="subject" value="'.$subject.
'"'.(empty($this->withemail) ?
' autofocus' :
'').
' />';
558 print
'<tr><td><label for="message"><span class="fieldrequired">'.$langs->trans(
"Message").
'</span></label></td><td>';
561 $toolbarname =
'dolibarr_notes';
562 if ($this->ispublic) {
563 $toolbarname =
'dolibarr_details';
564 print
'<div class="warning hideonsmartphone">'.(getDolGlobalString(
"TICKET_PUBLIC_TEXT_HELP_MESSAGE", $langs->trans(
'TicketPublicPleaseBeAccuratelyDescribe'))).
'</div>';
566 include_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
567 $uselocalbrowser =
true;
568 $doleditor =
new DolEditor(
'message', $msg,
'100%', 230, $toolbarname,
'In',
true, $uselocalbrowser,
getDolGlobalInt(
'FCKEDITOR_ENABLE_TICKET'), ROWS_8,
'90%');
569 $doleditor->Create();
573 if (isModEnabled(
'category') && !$public) {
574 include_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
575 $cate_arbo = $form->select_all_categories(Categorie::TYPE_TICKET,
'',
'parent', 64, 0, 3);
577 if (count($cate_arbo)) {
579 print
'<tr><td class="wordbreak"></td><td>';
580 print
img_picto(
'',
'category',
'class="pictofixedwidth"').$form->multiselectarray(
'categories', $cate_arbo,
GETPOST(
'categories',
'array'), 0, 0,
'quatrevingtpercent widthcentpercentminusx', 0, 0,
'',
'', $langs->transnoentitiesnoconv(
"Categories"));
586 if (!empty($this->withfile)) {
588 $listofpaths = array();
589 $listofnames = array();
590 $listofmimes = array();
591 if (!empty($_SESSION[
"listofpaths"])) {
592 $listofpaths = explode(
';', $_SESSION[
"listofpaths"]);
595 if (!empty($_SESSION[
"listofnames"])) {
596 $listofnames = explode(
';', $_SESSION[
"listofnames"]);
599 if (!empty($_SESSION[
"listofmimes"])) {
600 $listofmimes = explode(
';', $_SESSION[
"listofmimes"]);
607 $out .=
'<input type="hidden" class="removedfilehidden" name="removedfile" value="">'.
"\n";
608 $out .=
'<script nonce="'.getNonce().
'" type="text/javascript">';
609 $out .=
'jQuery(document).ready(function () {';
610 $out .=
' jQuery(".removedfile").click(function() {';
611 $out .=
' jQuery(".removedfilehidden").val(jQuery(this).val());';
614 $out .=
'</script>'.
"\n";
615 if (count($listofpaths)) {
616 foreach ($listofpaths as $key => $val) {
617 $out .=
'<div id="attachfile_'.$key.
'">';
618 $out .=
img_mime($listofnames[$key]).
' '.$listofnames[$key];
619 if (!$this->withfilereadonly) {
620 $out .=
' <input type="image" style="border: 0px;" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/img/delete.png" value="'.($key + 1).
'" class="removedfile" id="removedfile_'.$key.
'" name="removedfile_'.$key.
'" />';
622 $out .=
'<br></div>';
625 if ($this->withfile == 2) {
627 $maxmin = $maxfilesizearray[
'maxmin'];
629 $out .=
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
631 $out .=
'<input type="file" class="flat" id="addedfile" name="addedfile" value="'.$langs->trans(
"Upload").
'" />';
633 $out .=
'<input type="submit" class="button smallpaddingimp reposition" id="addfile" name="addfile" value="'.$langs->trans(
"MailingAddFile").
'" />';
635 $out .=
"</td></tr>\n";
641 if ($this->withusercreate > 0 && $this->fk_user_create) {
642 print
'<tr><td class="titlefield">'.$langs->trans(
"CreatedBy").
'</td><td>';
643 $langs->load(
"users");
644 $fuser =
new User($this->db);
646 if ($this->withcreatereadonly) {
647 if ($res = $fuser->fetch($this->fk_user_create)) {
648 print $fuser->getNomUrl(1);
652 print
"</td></tr>\n";
656 if ($this->withcompany) {
658 if (empty($user->socid)) {
660 print
'<tr><td class="titlefield">'.$langs->trans(
"ThirdParty").
'</td><td>';
662 $events[] = array(
'method' =>
'getContacts',
'url' =>
dol_buildpath(
'/core/ajax/contacts.php', 1),
'htmlname' =>
'contactid',
'params' => array(
'add-customer-contact' =>
'disabled'));
663 print
img_picto(
'',
'company',
'class="paddingright"');
664 print $form->select_company($this->withfromsocid,
'socid',
'', 1, 1, 0, $events, 0,
'minwidth200');
668 print
'<script nonce="'.getNonce().
'" type="text/javascript">
669 $(document).ready(function () {
670 jQuery("#'.$htmlname.
'").change(function () {
671 var obj = '.json_encode($events).
';
672 $.each(obj, function(key,values) {
673 if (values.method.length) {
674 runJsCodeForEvent'.$htmlname.
'(values);
679 function runJsCodeForEvent'.$htmlname.
'(obj) {
680 console.log("Run runJsCodeForEvent'.$htmlname.
'");
681 var id = $("#'.$htmlname.
'").val();
682 var method = obj.method;
684 var htmlname = obj.htmlname;
685 var showempty = obj.showempty;
694 $.each(obj.params, function(key,action) {
696 var num = response.num;
698 $("#" + key).removeAttr(action);
700 $("#" + key).attr(action, action);
704 $("select#" + htmlname).html(response.value);
706 var selecthtml_str = response.value;
707 var selecthtml_dom=$.parseHTML(selecthtml_str);
708 if (typeof(selecthtml_dom[0][0]) !== \'undefined\') {
709 $("#inputautocomplete"+htmlname).val(selecthtml_dom[0][0].innerHTML);
712 $("#inputautocomplete"+htmlname).val("");
714 $("select#" + htmlname).change(); /* Trigger event change */
721 if ($mode ==
'create') {
723 print
'<tr><td>'.$langs->trans(
"Contact").
'</td><td>';
725 $selectedCompany = ($this->withfromsocid > 0) ? $this->withfromsocid : -1;
726 print
img_picto(
'',
'contact',
'class="paddingright"');
728 print $form->select_contact($selectedCompany, $this->withfromcontactid,
'contactid', 3,
'',
'', 1,
'maxwidth300 widthcentpercentminusx',
true);
731 $formcompany->selectTypeContact($ticketstatic,
'',
'type',
'external',
'', 0,
'maginleftonly');
735 print
'<tr><td class="titlefield"><input type="hidden" name="socid" value="'.$user->socid.
'"/></td>';
736 print
'<td><input type="hidden" name="contactid" value="'.$user->contact_id.
'"/></td>';
737 print
'<td><input type="hidden" name="type" value="Z"/></td></tr>';
741 if (empty($this->ispublic) && $action ==
'create') {
742 print
'<tr><td><label for="notify_tiers_at_create">'.$langs->trans(
"TicketNotifyTiersAtCreation").
'</label></td><td>';
743 print
'<input type="checkbox" id="notify_tiers_at_create" name="notify_tiers_at_create"'.($this->withnotifytiersatcreate ?
' checked="checked"' :
'').
'>';
749 print $langs->trans(
"AssignedTo");
751 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
752 print $form->select_dolusers($user_assign,
'fk_user_assign', 1);
757 if ($subelement !=
'project') {
758 if (isModEnabled(
'project') && !$this->ispublic) {
760 print
'<tr><td><label for="project"><span class="">'.$langs->trans(
"Project").
'</span></label></td><td>';
761 print
img_picto(
'',
'project',
'class="pictofixedwidth"').$formproject->select_projects(-1, $projectid,
'projectid', 0, 0, 1, 1, 0, 0, 0,
'', 1, 0,
'maxwidth500');
766 if ($subelement !=
'contract' && $subelement !=
'contrat') {
767 if (isModEnabled(
'contract') && !$this->ispublic) {
768 $langs->load(
'contracts');
770 print
'<tr><td><label for="contract"><span class="">'.$langs->trans(
"Contract").
'</span></label></td><td>';
771 print
img_picto(
'',
'contract',
'class="pictofixedwidth"');
773 print $formcontract->select_contract($user->socid ?? -1,
GETPOSTINT(
'contactid'),
'contractid', 0, 1, 1, 1);
779 $parameters = array();
780 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $ticketstat, $action);
781 if (empty($reshook)) {
782 if ($mode ==
'create') {
783 print
$object->showOptionals($extrafields,
'create');
785 print
$object->showOptionals($extrafields,
'edit');
792 print
'<tr><td class="titlefield"></td><td><br>';
794 require_once DOL_DOCUMENT_ROOT.
'/core/lib/security2.lib.php';
798 $dirModCaptcha = array_merge(array(
'main' =>
'/core/modules/security/captcha/'), is_array(
$conf->modules_parts[
'captcha']) ?
$conf->modules_parts[
'captcha'] : array());
800 $fullpathclassfile =
'';
801 foreach ($dirModCaptcha as $dir) {
802 $fullpathclassfile =
dol_buildpath($dir.
"modCaptcha".ucfirst($captcha).
'.class.php', 0, 2);
803 if ($fullpathclassfile) {
808 if ($fullpathclassfile) {
809 include_once $fullpathclassfile;
813 $classname =
"modCaptcha".ucfirst($captcha);
814 if (class_exists($classname)) {
816 $captchaobj =
new $classname($this->db,
$conf, $langs, $user);
817 '@phan-var-force ModeleCaptcha $captchaobj';
819 if (is_object($captchaobj) && method_exists($captchaobj,
'getCaptchaCodeForForm')) {
820 print $captchaobj->getCaptchaCodeForForm(
'');
822 print
'Error, the captcha handler '.get_class($captchaobj).
' does not have any method getCaptchaCodeForForm()';
825 print
'Error, the captcha handler class '.$classname.
' was not found after the include';
828 print
'Error, the captcha handler '.$captcha.
' has no class file found modCaptcha'.ucfirst($captcha);
831 print
'<br></td></tr>';
836 if ($withdolfichehead) {
842 if ($mode ==
'create') {
843 print $form->buttonsSaveCancel(((isset($this->withreadid) && $this->withreadid > 0) ?
"SendResponse" :
"CreateTicket"), ($this->withcancel ?
"Cancel" :
""));
845 print $form->buttonsSaveCancel(((isset($this->withreadid) && $this->withreadid > 0) ?
"SendResponse" :
"Save"), ($this->withcancel ?
"Cancel" :
""));
860 print
'<input type="hidden" name="page_y">'.
"\n";
863 print
"<!-- End form TICKET -->\n";
880 public function selectTypesTickets($selected =
'', $htmlname =
'tickettype', $filtertype =
'', $format = 0, $empty = 0, $noadmininfo = 0, $maxlength = 0, $morecss =
'', $multiselect = 0)
882 global $langs, $user;
884 $selected = is_array($selected) ? $selected : (!empty($selected) ? explode(
',', $selected) : array());
885 $ticketstat =
new Ticket($this->db);
887 dol_syslog(get_class($this) .
"::select_types_tickets " . implode(
';', $selected) .
", " . $htmlname .
", " . $filtertype .
", " . $format .
", " . $multiselect, LOG_DEBUG);
889 $filterarray = array();
891 if ($filtertype !=
'' && $filtertype !=
'-1') {
892 $filterarray = explode(
',', $filtertype);
895 $ticketstat->loadCacheTypesTickets();
897 print
'<select id="select'.$htmlname.
'" class="flat minwidth100'.($morecss ?
' '.$morecss :
'').
'" name="'.$htmlname.($multiselect ?
'[]' :
'').
'"'.($multiselect ?
' multiple' :
'').
'>';
899 print
'<option value="">'.((is_numeric($empty) || $empty ==
'ifone') ?
' ' : $empty).
'</option>';
902 if (is_array($ticketstat->cache_types_tickets) && count($ticketstat->cache_types_tickets)) {
903 foreach ($ticketstat->cache_types_tickets as
$id => $arraytypes) {
905 if (count($filterarray) && !in_array($arraytypes[
'type'], $filterarray)) {
910 if ($empty && empty($arraytypes[
'code'])) {
915 print
'<option value="'.$id.
'"';
919 print
'<option value="'.$arraytypes[
'code'].
'"';
923 print
'<option value="'.$arraytypes[
'code'].
'"';
927 print
'<option value="'.$id.
'"';
931 if (in_array($arraytypes[
'code'], $selected)) {
932 print
' selected="selected"';
933 } elseif (in_array(
$id, $selected)) {
934 print
' selected="selected"';
935 } elseif ($arraytypes[
'use_default'] ==
"1" && empty($selected)) {
936 print
' selected="selected"';
937 } elseif (count($ticketstat->cache_types_tickets) == 1 && (!$empty || $empty ==
'ifone')) {
938 print
' selected="selected"';
945 $value = ($maxlength ?
dol_trunc($arraytypes[
'label'], $maxlength) : $arraytypes[
'label']);
946 } elseif ($format == 1) {
947 $value = $arraytypes[
'code'];
948 } elseif ($format == 2) {
949 $value = ($maxlength ?
dol_trunc($arraytypes[
'label'], $maxlength) : $arraytypes[
'label']);
950 } elseif ($format == 3) {
951 $value = $arraytypes[
'code'];
954 print $value ? $value :
' ';
959 if (isset($user->admin) && $user->admin && !$noadmininfo) {
960 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
981 public function selectGroupTickets($selected =
'', $htmlname =
'ticketcategory', $filtertype =
'', $format = 0, $empty = 0, $noadmininfo = 0, $maxlength = 0, $morecss =
'', $use_multilevel = 0, $outputlangs =
null)
983 global
$conf, $langs, $user;
985 dol_syslog(get_class($this).
"::selectCategoryTickets ".$selected.
", ".$htmlname.
", ".$filtertype.
", ".$format, LOG_DEBUG);
987 if (is_null($outputlangs) || !is_object($outputlangs)) {
988 $outputlangs = $langs;
990 $outputlangs->load(
"ticket");
992 $publicgroups = ($filtertype ==
'public=1' || $filtertype ==
'(public:=:1)');
994 $ticketstat =
new Ticket($this->db);
995 $ticketstat->loadCacheCategoriesTickets($publicgroups ? 1 : -1);
997 if ($use_multilevel <= 0) {
998 print
'<select id="select'.$htmlname.
'" class="flat minwidth100'.($morecss ?
' '.$morecss :
'').
'" name="'.$htmlname.
'">';
1000 print
'<option value="">'.((is_numeric($empty) || $empty ==
'ifone') ?
' ' : $empty).
'</option>';
1003 if (is_array($ticketstat->cache_category_tickets) && count($ticketstat->cache_category_tickets)) {
1004 foreach ($ticketstat->cache_category_tickets as
$id => $arraycategories) {
1006 if ($publicgroups) {
1007 if (empty($arraycategories[
'public'])) {
1013 if ($empty && empty($arraycategories[
'code'])) {
1017 $label = ($arraycategories[
'label'] !=
'-' ? $arraycategories[
'label'] :
'');
1018 if ($outputlangs->trans(
"TicketCategoryShort".$arraycategories[
'code']) !=
"TicketCategoryShort".$arraycategories[
'code']) {
1019 $label = $outputlangs->trans(
"TicketCategoryShort".$arraycategories[
'code']);
1020 } elseif ($outputlangs->trans($arraycategories[
'code']) != $arraycategories[
'code']) {
1021 $label = $outputlangs->trans($arraycategories[
'code']);
1025 print
'<option value="'.$id.
'"';
1029 print
'<option value="'.$arraycategories[
'code'].
'"';
1033 print
'<option value="'.$arraycategories[
'code'].
'"';
1037 print
'<option value="'.$id.
'"';
1041 if (isset($selected) && preg_match(
'/[a-z]/i', $selected) && $selected == $arraycategories[
'code']) {
1042 print
' selected="selected"';
1043 } elseif (isset($selected) && $selected ==
$id) {
1044 print
' selected="selected"';
1045 } elseif ($arraycategories[
'use_default'] ==
"1" && empty($selected)) {
1046 print
' selected="selected"';
1047 } elseif (count($ticketstat->cache_category_tickets) == 1 && (!$empty || $empty ==
'ifone')) {
1048 print
' selected="selected"';
1055 $value = ($maxlength ?
dol_trunc($label, $maxlength) : $label);
1059 $value = $arraycategories[
'code'];
1063 $value = ($maxlength ?
dol_trunc($label, $maxlength) : $label);
1067 $value = $arraycategories[
'code'];
1070 print $value ? $value :
' ';
1075 if (isset($user->admin) && $user->admin && !$noadmininfo) {
1076 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1080 } elseif ($htmlname !=
'') {
1081 $selectedgroups = array();
1083 $groupticket =
GETPOST($htmlname,
'aZ09');
1084 $child_id =
GETPOST($htmlname.
'_child_id',
'aZ09') ?
GETPOST($htmlname.
'_child_id',
'aZ09') : 0;
1085 if (!empty($groupticket)) {
1086 $tmpgroupticket = $groupticket;
1087 $sql =
"SELECT ctc.rowid, ctc.fk_parent, ctc.code";
1088 $sql .=
" FROM ".$this->db->prefix().
"c_ticket_category as ctc WHERE ctc.code = '".$this->db->escape($tmpgroupticket).
"'";
1089 $resql = $this->db->query($sql);
1091 $obj = $this->db->fetch_object($resql);
1092 $selectedgroups[] = $obj->code;
1093 while ($obj->fk_parent > 0) {
1094 $sql =
"SELECT ctc.rowid, ctc.fk_parent, ctc.code FROM ".$this->db->prefix().
"c_ticket_category as ctc WHERE ctc.rowid ='".$this->db->escape($obj->fk_parent).
"'";
1095 $resql = $this->db->query($sql);
1097 $obj = $this->db->fetch_object($resql);
1098 $selectedgroups[] = $obj->code;
1104 $arrayidused = array();
1105 $arrayidusedconcat = array();
1106 $arraycodenotparent = array();
1107 $arraycodenotparent[] =
"";
1109 $stringtoprint =
'<span class="supportemailfield bold">'.$langs->trans(
"GroupOfTicket").
'</span> ';
1110 $stringtoprint .=
'<select id="'.$htmlname.
'" class="minwidth500" child_id="0">';
1111 $stringtoprint .=
'<option value=""> </option>';
1113 $sql =
"SELECT ctc.rowid, ctc.code, ctc.label, ctc.fk_parent, ctc.public, ";
1114 $sql .= $this->db->ifsql(
"ctc.rowid NOT IN (SELECT ctcfather.rowid FROM ".MAIN_DB_PREFIX.
"c_ticket_category as ctcfather JOIN ".MAIN_DB_PREFIX.
"c_ticket_category as ctcjoin ON ctcfather.rowid = ctcjoin.fk_parent WHERE ctcjoin.active > 0)",
"'NOTPARENT'",
"'PARENT'").
" as isparent";
1115 $sql .=
" FROM ".$this->db->prefix().
"c_ticket_category as ctc";
1116 $sql .=
" WHERE ctc.active > 0 AND ctc.entity = ".((int)
$conf->entity);
1117 $public = ($filtertype ==
'public=1' || $filtertype ==
'(public:=:1)');
1119 $sql .=
" AND ctc.public = 1";
1121 $sql .=
" AND ctc.fk_parent = 0";
1122 $sql .= $this->db->order(
'ctc.pos',
'ASC');
1124 $resql = $this->db->query($sql);
1126 $num_rows_level0 = $this->db->num_rows($resql);
1128 while ($i < $num_rows_level0) {
1129 $obj = $this->db->fetch_object($resql);
1131 $label = ($obj->label !=
'-' ? $obj->label :
'');
1132 if ($outputlangs->trans(
"TicketCategoryShort".$obj->code) !=
"TicketCategoryShort".$obj->code) {
1133 $label = $outputlangs->trans(
"TicketCategoryShort".$obj->code);
1134 } elseif ($outputlangs->trans($obj->code) != $obj->code) {
1135 $label = $outputlangs->trans($obj->code);
1138 $grouprowid = $obj->rowid;
1139 $groupvalue = $obj->code;
1140 $grouplabel = $label;
1142 $isparent = $obj->isparent;
1143 if (is_array($selectedgroups)) {
1144 $iselected = in_array($obj->code, $selectedgroups) ?
'selected' :
'';
1146 $iselected = $groupticket == $obj->code ?
'selected' :
'';
1149 if ($isparent ==
'NOTPARENT') {
1150 $arraycodenotparent[] = $groupvalue;
1152 $arrayidused[] = $grouprowid;
1153 $arrayidusedconcat[] = $grouprowid;
1160 if (count($arrayidused) == 1) {
1161 return '<input type="hidden" name="'.$htmlname.
'" id="'.$htmlname.
'" value="'.
dol_escape_htmltag($groupvalue).
'">';
1163 $stringtoprint .=
'<input type="hidden" name="'.$htmlname.
'" id="'.$htmlname.
'_select" class="maxwidth500 minwidth400" value="'.
GETPOST($htmlname).
'">';
1164 $stringtoprint .=
'<input type="hidden" name="'.$htmlname.
'_child_id" id="'.$htmlname.
'_select_child_id" class="maxwidth500 minwidth400" '.
GETPOST($htmlname).
' value="'.
GETPOST($htmlname.
"_child_id").
'">';
1166 $stringtoprint .=
'</select> ';
1169 while ($levelid <= $use_multilevel) {
1170 $tabscript = array();
1171 $stringtoprint .=
'<select id="'.$htmlname.
'_child_'.$levelid.
'" class="maxwidth500 minwidth400 groupticketchild" child_id="'.$levelid.
'">';
1172 $stringtoprint .=
'<option value=""> </option>';
1174 $sql =
"SELECT ctc.rowid, ctc.code, ctc.label, ctc.fk_parent, ctc.public, ctcjoin.code as codefather";
1175 $sql .=
" FROM ".$this->db->prefix().
"c_ticket_category as ctc";
1176 $sql .=
" JOIN ".$this->db->prefix().
"c_ticket_category as ctcjoin ON ctc.fk_parent = ctcjoin.rowid";
1177 $sql .=
" WHERE ctc.active > 0 AND ctc.entity = ".((int)
$conf->entity);
1178 $sql .=
" AND ctc.rowid NOT IN (".$this->db->sanitize(implode(
',', $arrayidusedconcat)).
")";
1180 $public = ($filtertype ==
'public=1' || $filtertype ==
'(public:=:1)');
1182 $sql .=
" AND ctc.public = 1";
1185 if (!empty($arrayidused)) {
1186 $sql .=
" AND ctc.fk_parent IN ( ";
1187 foreach ($arrayidused as $idused) {
1188 $sql .= $idused.
", ";
1190 $sql = substr($sql, 0, -2);
1193 $sql .= $this->db->order(
'ctc.pos',
'ASC');
1195 $resql = $this->db->query($sql);
1197 $num_rows = $this->db->num_rows($resql);
1199 $arrayidused = array();
1200 while ($i < $num_rows) {
1201 $obj = $this->db->fetch_object($resql);
1203 $label = ($obj->label !=
'-' ? $obj->label :
'');
1204 if ($outputlangs->trans(
"TicketCategoryShort".$obj->code) !=
"TicketCategoryShort".$obj->code) {
1205 $label = $outputlangs->trans(
"TicketCategoryShort".$obj->code);
1206 } elseif ($outputlangs->trans($obj->code) != $obj->code) {
1207 $label = $outputlangs->trans($obj->code);
1210 $grouprowid = $obj->rowid;
1211 $groupvalue = $obj->code;
1212 $grouplabel = $label;
1213 $isparent = $obj->isparent;
1214 $fatherid = $obj->fk_parent;
1215 $arrayidused[] = $grouprowid;
1216 $arrayidusedconcat[] = $grouprowid;
1217 $groupcodefather = $obj->codefather;
1218 if ($isparent ==
'NOTPARENT') {
1219 $arraycodenotparent[] = $groupvalue;
1221 if (is_array($selectedgroups)) {
1222 $iselected = in_array($obj->code, $selectedgroups) ?
'selected' :
'';
1224 $iselected = $groupticket == $obj->code ?
'selected' :
'';
1227 if (empty($tabscript[$groupcodefather])) {
1228 $tabscript[$groupcodefather] =
'if ($("#'.$htmlname.($levelid > 1 ?
'_child_'.($levelid - 1) :
'').
'").val() == "'.
dol_escape_js($groupcodefather).
'"){
1230 console.log("We show child tickets of '.$groupcodefather.
' group ticket")
1233 console.log("We hide child tickets of '.$groupcodefather.
' group ticket")
1242 $stringtoprint .=
'</select>';
1244 $stringtoprint .=
'<script nonce="'.getNonce().
'">';
1245 $stringtoprint .=
'arraynotparents = '.json_encode($arraycodenotparent).
';';
1246 $stringtoprint .=
'if (arraynotparents.includes($("#'.$htmlname.($levelid > 1 ?
'_child_'.($levelid - 1) :
'').
'").val())){
1247 console.log("'.$htmlname.
'_child_'.$levelid.
'")
1248 if($("#'.$htmlname.
'_child_'.$levelid.
'").val() == "" && ($("#'.$htmlname.
'_child_'.$levelid.
'").attr("child_id")>'.$child_id.
')){
1249 $("#'.$htmlname.
'_child_'.$levelid.
'").hide();
1250 console.log("We hide '.$htmlname.
'_child_'.$levelid.
' input")
1252 if(arraynotparents.includes("'.$groupticket.
'") && '.$child_id.
' == 0){
1253 $("#ticketcategory_select_child_id").val($("#'.$htmlname.
'").attr("child_id"))
1254 $("#ticketcategory_select").val($("#'.$htmlname.
'").val()) ;
1255 console.log("We choose '.$htmlname.
' input and reload hidden input");
1258 $("#'.$htmlname.($levelid > 1 ?
'_child_'.($levelid - 1) :
'').
'").change(function() {
1259 child_id = $("#'.$htmlname.($levelid > 1 ?
'_child_'.$levelid :
'').
'").attr("child_id");
1261 /* Change of value to select this value*/
1262 if (arraynotparents.includes($(this).val()) || $(this).attr("child_id") == '.$use_multilevel.
') {
1263 $("#ticketcategory_select").val($(this).val());
1264 $("#ticketcategory_select_child_id").val($(this).attr("child_id")) ;
1265 console.log("We choose to select "+ $(this).val());
1267 if ($("#'.$htmlname.
'_child_'.$levelid.
' option").length <= 1) {
1268 $("#ticketcategory_select").val($(this).val());
1269 $("#ticketcategory_select_child_id").val($(this).attr("child_id"));
1270 console.log("We choose to select "+ $(this).val() + " and next combo has no item, so we keep this selection");
1272 console.log("We choose to select "+ $(this).val() + " but next combo has some item, so we clean selected item");
1273 $("#ticketcategory_select").val("");
1274 $("#ticketcategory_select_child_id").val("");
1278 console.log("We select a new value into combo child_id="+child_id);
1280 // Hide all selected box that are child of the one modified
1281 $(".groupticketchild").each(function(){
1282 if ($(this).attr("child_id") > child_id) {
1283 console.log("hide child_id="+$(this).attr("child_id"));
1289 // Now we enable the next combo
1290 $("#'.$htmlname.
'_child_'.$levelid.
'").val("");
1291 if (!arraynotparents.includes($(this).val()) && $("#'.$htmlname.
'_child_'.$levelid.
' option").length > 1) {
1292 console.log($("#'.$htmlname.
'_child_'.$levelid.
' option").length);
1293 $("#'.$htmlname.
'_child_'.$levelid.
'").show()
1295 $("#'.$htmlname.
'_child_'.$levelid.
'").hide()
1299 foreach ($tabscript as $script) {
1300 $stringtoprint .= $script;
1302 $stringtoprint .=
'})';
1303 $stringtoprint .=
'</script>';
1305 $stringtoprint .=
'<script nonce="'.getNonce().
'">';
1306 $stringtoprint .=
'$("#'.$htmlname.
'_child_'.$use_multilevel.
'").change(function() {
1307 $("#ticketcategory_select").val($(this).val());
1308 $("#ticketcategory_select_child_id").val($(this).attr("child_id"));
1309 tmpvalselect = $("#ticketcategory_select").val();
1310 if(tmpvalselect == "" && $("#ticketcategory_select_child_id").val() >= 1){
1311 $("#ticketcategory_select_child_id").val($(this).attr("child_id")-1);
1313 console.log($("#ticketcategory_select").val());
1315 $stringtoprint .=
'</script>';
1318 return $stringtoprint;
1335 public function selectSeveritiesTickets($selected =
'', $htmlname =
'ticketseverity', $filtertype =
'', $format = 0, $empty = 0, $noadmininfo = 0, $maxlength = 0, $morecss =
'')
1337 global
$conf, $langs, $user;
1339 $ticketstat =
new Ticket($this->db);
1341 dol_syslog(get_class($this).
"::selectSeveritiesTickets ".$selected.
", ".$htmlname.
", ".$filtertype.
", ".$format, LOG_DEBUG);
1343 $filterarray = array();
1345 if ($filtertype !=
'' && $filtertype !=
'-1') {
1346 $filterarray = explode(
',', $filtertype);
1349 $ticketstat->loadCacheSeveritiesTickets();
1351 print
'<select id="select'.$htmlname.
'" class="flat minwidth100'.($morecss ?
' '.$morecss :
'').
'" name="'.$htmlname.
'">';
1353 print
'<option value="">'.((is_numeric($empty) || $empty ==
'ifone') ?
' ' : $empty).
'</option>';
1356 if (is_array(
$conf->cache[
'severity_tickets']) && count(
$conf->cache[
'severity_tickets'])) {
1357 foreach (
$conf->cache[
'severity_tickets'] as
$id => $arrayseverities) {
1359 if (count($filterarray) && !in_array($arrayseverities[
'type'], $filterarray)) {
1364 if ($empty && empty($arrayseverities[
'code'])) {
1369 print
'<option value="'.$id.
'"';
1373 print
'<option value="'.$arrayseverities[
'code'].
'"';
1377 print
'<option value="'.$arrayseverities[
'code'].
'"';
1381 print
'<option value="'.$id.
'"';
1385 if (isset($selected) && preg_match(
'/[a-z]/i', $selected) && $selected == $arrayseverities[
'code']) {
1386 print
' selected="selected"';
1387 } elseif (isset($selected) && $selected ==
$id) {
1388 print
' selected="selected"';
1389 } elseif ($arrayseverities[
'use_default'] ==
"1" && empty($selected)) {
1390 print
' selected="selected"';
1391 } elseif (count(
$conf->cache[
'severity_tickets']) == 1 && (!$empty || $empty ==
'ifone')) {
1392 print
' selected="selected"';
1399 $value = ($maxlength ?
dol_trunc($arrayseverities[
'label'], $maxlength) : $arrayseverities[
'label']);
1403 $value = $arrayseverities[
'code'];
1407 $value = ($maxlength ?
dol_trunc($arrayseverities[
'label'], $maxlength) : $arrayseverities[
'label']);
1411 $value = $arrayseverities[
'code'];
1414 print $value ? $value :
' ';
1419 if (isset($user->admin) && $user->admin && !$noadmininfo) {
1420 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1435 global
$conf, $user;
1436 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1439 $vardir =
$conf->user->dir_output.
"/".$user->id;
1440 $upload_dir = $vardir.
'/temp/';
1441 if (is_dir($upload_dir)) {
1445 if (!empty($this->trackid)) {
1446 $keytoavoidconflict =
'-'.$this->trackid;
1448 $keytoavoidconflict = empty($this->track_id) ?
'' :
'-'.$this->track_id;
1450 unset($_SESSION[
"listofpaths".$keytoavoidconflict]);
1451 unset($_SESSION[
"listofnames".$keytoavoidconflict]);
1452 unset($_SESSION[
"listofmimes".$keytoavoidconflict]);
1463 global
$conf, $langs, $user, $hookmanager, $form, $mysoc;
1465 $formmail =
new FormMail($this->db);
1466 $addfileaction =
'addfile';
1468 if (!is_object($form)) {
1469 $form =
new Form($this->db);
1473 $langs->loadLangs(array(
'other',
'mails',
'ticket'));
1476 if (
GETPOST(
'mode',
'alpha') ==
'init' || (
GETPOST(
'modelselected') &&
GETPOST(
'modelmailselected',
'alpha') &&
GETPOST(
'modelmailselected',
'alpha') !=
'-1')) {
1477 $this->clear_attached_files();
1481 $outputlangs = $langs;
1483 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && isset($this->param[
'langsmodels'])) {
1484 $newlang = $this->param[
'langsmodels'];
1486 if (!empty($newlang)) {
1488 $outputlangs->setDefaultLang($newlang);
1489 $outputlangs->load(
'other');
1493 $arraydefaultmessage = -1;
1494 if (isset($this->param[
'models']) && $this->param[
'models'] !=
'none') {
1496 if (array_key_exists(
'models_id', $this->param)) {
1497 $model_id = (int) $this->param[
"models_id"];
1500 $arraydefaultmessage = $formmail->getEMailTemplate($this->db, $this->param[
"models"], $user, $outputlangs, $model_id);
1504 $listofpaths = array();
1505 $listofnames = array();
1506 $listofmimes = array();
1508 if (!empty($this->trackid)) {
1509 $keytoavoidconflict =
'-'.$this->trackid;
1511 $keytoavoidconflict = empty($this->track_id) ?
'' :
'-'.$this->track_id;
1514 if (
GETPOST(
'mode',
'alpha') ==
'init' || (
GETPOST(
'modelselected') &&
GETPOST(
'modelmailselected',
'alpha') &&
GETPOST(
'modelmailselected',
'alpha') !=
'-1')) {
1515 if (!empty($arraydefaultmessage->joinfiles) && !empty($this->param[
'fileinit']) && is_array($this->param[
'fileinit'])) {
1516 foreach ($this->param[
'fileinit'] as $path) {
1517 $formmail->add_attached_files($path, basename($path),
dol_mimetype($path));
1523 if (!empty($_SESSION[
"listofpaths".$keytoavoidconflict])) {
1524 $listofpaths = explode(
';', $_SESSION[
"listofpaths".$keytoavoidconflict]);
1526 if (!empty($_SESSION[
"listofnames".$keytoavoidconflict])) {
1527 $listofnames = explode(
';', $_SESSION[
"listofnames".$keytoavoidconflict]);
1529 if (!empty($_SESSION[
"listofmimes".$keytoavoidconflict])) {
1530 $listofmimes = explode(
';', $_SESSION[
"listofmimes".$keytoavoidconflict]);
1534 $outputlangs = $langs;
1536 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && empty($newlang) && isset($this->param[
'langsmodels'])) {
1537 $newlang = $this->param[
'langsmodels'];
1539 if (!empty($newlang)) {
1541 $outputlangs->setDefaultLang($newlang);
1542 $outputlangs->load(
'other');
1545 print
"\n<!-- Begin message_form TICKET -->\n";
1550 print
'<script nonce="'.getNonce().
'" type="text/javascript">
1551 jQuery(document).ready(function() {
1552 send_email=' . $send_email.
';
1554 if (!jQuery("#send_msg_email").is(":checked")) {
1555 jQuery("#send_msg_email").prop("checked", true).trigger("change");
1557 jQuery(".email_line").show();
1559 if (!jQuery("#private_message").is(":checked")) {
1560 jQuery("#private_message").prop("checked", true).trigger("change");
1562 jQuery(".email_line").hide();
1568 print
'jQuery("#send_msg_email").click(function() {
1569 console.log("Click send_msg_email");
1570 if(jQuery(this).is(":checked")) {
1571 if (jQuery("#private_message").is(":checked")) {
1572 jQuery("#private_message").prop("checked", false).trigger("change");
1574 jQuery(".email_line").show();
1577 jQuery(".email_line").hide();
1581 jQuery("#private_message").click(function() {
1582 console.log("Click private_message");
1583 if (jQuery(this).is(":checked")) {
1584 if (jQuery("#send_msg_email").is(":checked")) {
1585 jQuery("#send_msg_email").prop("checked", false).trigger("change");
1587 jQuery(".email_line").hide();
1596 print
'<form method="post" name="ticket" id="ticket" enctype="multipart/form-data" action="'.$this->param[
"returnurl"].
'">';
1597 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1598 print
'<input type="hidden" name="action" value="'.$this->action.
'">';
1599 print
'<input type="hidden" name="actionbis" value="add_message">';
1600 print
'<input type="hidden" name="backtopage" value="'.$this->backtopage.
'">';
1601 if (!empty($this->trackid)) {
1602 print
'<input type="hidden" name="trackid" value="'.$this->trackid.
'">';
1604 print
'<input type="hidden" name="trackid" value="'.(empty($this->track_id) ?
'' : $this->track_id).
'">';
1605 $keytoavoidconflict = empty($this->track_id) ?
'' :
'-'.$this->track_id;
1607 foreach ($this->param as $key => $value) {
1608 print
'<input type="hidden" name="'.$key.
'" value="'.$value.
'">';
1613 if (array_key_exists(
'models_id', $this->param)) {
1614 $model_id = $this->param[
"models_id"];
1615 $arraydefaultmessage = $formmail->getEMailTemplate($this->db, $this->param[
"models"], $user, $outputlangs, $model_id);
1618 $result = $formmail->fetchAllEMailTemplate(!empty($this->param[
"models"]) ? $this->param[
"models"] :
"", $user, $outputlangs);
1622 $modelmail_array = array();
1623 foreach ($formmail->lines_model as $line) {
1624 $modelmail_array[$line->id] = $line->label;
1627 print
'<table class="border" width="'.$width.
'">';
1630 if ($user->hasRight(
"ticket",
"write") && !$user->socid) {
1631 $ticketstat =
new Ticket($this->db);
1632 $res = $ticketstat->fetch(0,
'', $this->track_id);
1634 print
'<tr><td></td><td>';
1635 $checkbox_selected = (
GETPOST(
'send_email') ==
"1" ?
' checked' : (
getDolGlobalInt(
'TICKETS_MESSAGE_FORCE_MAIL') ?
'checked' :
''));
1636 print
'<input type="checkbox" name="send_email" value="1" id="send_msg_email" '.$checkbox_selected.
'/> ';
1637 print
'<label for="send_msg_email">'.$langs->trans(
'SendMessageByEmail').
'</label>';
1638 $texttooltip = $langs->trans(
"TicketMessageSendEmailHelp");
1640 $texttooltip .=
' '.$langs->trans(
"TicketMessageSendEmailHelp2b");
1642 $texttooltip .=
' '.$langs->trans(
"TicketMessageSendEmailHelp2a",
'{s1}');
1644 $texttooltip = str_replace(
'{s1}', $langs->trans(
'MarkMessageAsPrivate'), $texttooltip);
1645 print
' '.$form->textwithpicto(
'', $texttooltip, 1,
'help');
1649 if (!$user->socid) {
1650 print
'<tr><td></td><td>';
1651 $checkbox_selected = (
GETPOST(
'private_message',
'alpha') ==
"1" ?
' checked' :
'');
1652 print
'<input type="checkbox" name="private_message" value="1" id="private_message" '.$checkbox_selected.
'/> ';
1653 print
'<label for="private_message">'.$langs->trans(
'MarkMessageAsPrivate').
'</label>';
1654 print
' '.$form->textwithpicto(
'', $langs->trans(
"TicketMessagePrivateHelp"), 1,
'help');
1659 if (count($modelmail_array) > 0) {
1660 print
'<tr class="email_line"><td></td><td colspan="2"><div style="padding: 3px 0 3px 0">'.
"\n";
1661 print $langs->trans(
'SelectMailModel').
': '.$formmail->selectarray(
'modelmailselected', $modelmail_array, $this->param[
'models_id'], 1, 0, 0,
"", 0, 0, 0,
'',
'minwidth200');
1663 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1666 print
'<input type="submit" class="button" value="'.$langs->trans(
'Apply').
'" name="modelselected" id="modelselected">';
1667 print
'</div></td>';
1672 print
'<tr class="email_line"><td><span class="">'.$langs->trans(
"MailFrom").
'</span></td>';
1673 print
'<td><span class="">'.img_picto(
'',
'email',
'class="pictofixedwidth"').$from.
'</span></td></tr>';
1677 foreach ($formmail->lines_model as $line) {
1678 if (!empty($this->substit) && $this->param[
'models_id'] == $line->id) {
1683 print
'<tr class="email_line"><td>'.$langs->trans(
'Subject').
'</td>';
1684 if (empty($topic)) {
1685 print
'<td><input type="text" class="text minwidth500" name="subject" value="['.getDolGlobalString(
'MAIN_INFO_SOCIETE_NOM').
' - '.$langs->trans(
"Ticket").
' '.$ticketstat->ref.
'] '. $ticketstat->subject .
'" />';
1687 print
'<td><input type="text" class="text minwidth500" name="subject" value="'.make_substitutions($topic, $this->substit).
'" />';
1692 print
'<tr class="email_line"><td>'.$langs->trans(
'MailRecipients');
1693 print
' '.$form->textwithpicto(
'', $langs->trans(
"TicketMessageRecipientsHelp"), 1,
'help');
1697 $contacts = $ticketstat->getInfosTicketInternalContact(1);
1698 $contacts = array_merge($contacts, $ticketstat->getInfosTicketExternalContact(1));
1703 if (is_array($contacts) && count($contacts) > 0) {
1704 foreach ($contacts as $key => $info_sendto) {
1705 if ($info_sendto[
'email'] !=
'') {
1706 $sendto[] =
dol_escape_htmltag(trim($info_sendto[
'firstname'].
" ".$info_sendto[
'lastname']).
" <".$info_sendto[
'email'].
">").
' <small class="opacitymedium">('.
dol_escape_htmltag($info_sendto[
'libelle']).
")</small>";
1711 if (!empty($ticketstat->origin_replyto) && !in_array($ticketstat->origin_replyto, $sendto)) {
1712 $sendto[] =
dol_escape_htmltag($ticketstat->origin_replyto).
' <small class="opacitymedium">('.$langs->trans(
"TicketEmailOriginIssuer").
")</small>";
1713 } elseif ($ticketstat->origin_email && !in_array($ticketstat->origin_email, $sendto)) {
1714 $sendto[] =
dol_escape_htmltag($ticketstat->origin_email).
' <small class="opacitymedium">('.$langs->trans(
"TicketEmailOriginIssuer").
")</small>";
1717 if ($ticketstat->fk_soc > 0) {
1718 $ticketstat->socid = $ticketstat->fk_soc;
1719 $ticketstat->fetch_thirdparty();
1721 if (!empty($ticketstat->thirdparty->email) && !in_array($ticketstat->thirdparty->email, $sendto)) {
1722 $sendto[] = $ticketstat->thirdparty->email.
' <small class="opacitymedium">('.$langs->trans(
'Customer').
')</small>';
1727 $sendto[] =
getDolGlobalString(
'TICKET_NOTIFICATION_EMAIL_TO').
' <small class="opacitymedium">(generic email)</small>';
1731 if (is_array($sendto) && count($sendto) > 0) {
1732 print
img_picto(
'',
'email',
'class="pictofixedwidth"');
1733 print implode(
', ', $sendto);
1735 print
'<div class="warning">'.$langs->trans(
'WarningNoEMailsAdded').
' '.$langs->trans(
'TicketGoIntoContactTab').
'</div>';
1741 $uselocalbrowser =
false;
1763 if (!empty($this->withfile)) {
1765 $out .=
'<td>'.$langs->trans(
"MailFile").
'</td>';
1768 $out .=
'<input type="hidden" class="removedfilehidden" name="removedfile" value="">'.
"\n";
1769 $out .=
'<script nonce="'.getNonce().
'" type="text/javascript">';
1770 $out .=
'jQuery(document).ready(function () {';
1771 $out .=
' jQuery("#'.$addfileaction.
'").prop("disabled", true);';
1772 $out .=
' jQuery("#addedfile").on("change", function() {';
1773 $out .=
' if (jQuery(this).val().length) {';
1774 $out .=
' jQuery("#'.$addfileaction.
'").prop("disabled", false);';
1775 $out .=
' } else {';
1776 $out .=
' jQuery("#'.$addfileaction.
'").prop("disabled", true);';
1779 $out .=
' jQuery(".removedfile").click(function() {';
1780 $out .=
' jQuery(".removedfilehidden").val(jQuery(this).val());';
1783 $out .=
'</script>'.
"\n";
1785 if (count($listofpaths)) {
1786 foreach ($listofpaths as $key => $val) {
1787 $out .=
'<div id="attachfile_'.$key.
'">';
1788 $out .=
img_mime($listofnames[$key]).
' '.$listofnames[$key];
1789 if (!$this->withfilereadonly) {
1790 $out .=
' <input type="image" style="border: 0px;" src="'.DOL_URL_ROOT.
'/theme/'.
$conf->theme.
'/img/delete.png" value="'.($key + 1).
'" class="removedfile reposition" id="removedfile_'.$key.
'" name="removedfile_'.$key.
'" />';
1792 $out .=
'<br></div>';
1797 if ($this->withfile == 2) {
1798 $out .=
'<input type="file" class="flat" id="addedfile" name="addedfile" value="'.$langs->trans(
"Upload").
'" />';
1800 $out .=
'<input type="submit" class="button smallpaddingimp reposition" id="'.$addfileaction.
'" name="'.$addfileaction.
'" value="'.$langs->trans(
"MailingAddFile").
'" />';
1802 $out .=
"</td></tr>\n";
1809 $defaultmessage =
"";
1810 if (is_object($arraydefaultmessage) && $arraydefaultmessage->content) {
1811 $defaultmessage = $arraydefaultmessage->content;
1813 $defaultmessage = str_replace(
'\n',
"\n", $defaultmessage);
1817 $this->substit[
'__USER_SIGNATURE__'] =
dol_nl2br($this->substit[
'__USER_SIGNATURE__']);
1818 } elseif (!
dol_textishtml($defaultmessage) && isset($this->substit[
'__USER_SIGNATURE__']) &&
dol_textishtml($this->substit[
'__USER_SIGNATURE__'])) {
1819 $defaultmessage =
dol_nl2br($defaultmessage);
1821 if (GETPOSTISSET(
"message") && !
GETPOST(
'modelselected')) {
1822 $defaultmessage =
GETPOST(
'message',
'restricthtml');
1826 $defaultmessage = preg_replace(
"/^(<br>)+/",
"", $defaultmessage);
1827 $defaultmessage = preg_replace(
"/^\n+/",
"", $defaultmessage);
1830 print
'<tr><td colspan="2"><label for="message"><span class="fieldrequired">'.$langs->trans(
"Message").
'</span>';
1831 if ($user->hasRight(
"ticket",
"write") && !$user->socid) {
1832 $texttooltip = $langs->trans(
"TicketMessageHelp");
1834 $texttooltip .=
'<br><br>'.$langs->trans(
"ForEmailMessageWillBeCompletedWith").
'...';
1838 print
'<input type="hidden" name="mail_intro" value="'.$mail_intro.
'">';
1839 $texttooltip .=
'<br><u>'.$langs->trans(
"TicketMessageMailIntro").
'</u><br>'.$mail_intro;
1843 print
'<input type="hidden" name="mail_signature" value="'.$mail_signature.
'">';
1844 $texttooltip .=
'<br><br><u>'.$langs->trans(
"TicketMessageMailFooter").
'</u><br>'.$mail_signature;
1846 print $form->textwithpicto(
'', $texttooltip, 1,
'help');
1848 print
'</label></td></tr>';
1851 print
'<tr><td colspan="2">';
1853 $toolbarname =
'dolibarr_notes';
1854 include_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1855 $doleditor =
new DolEditor(
'message', $defaultmessage,
'100%', 200, $toolbarname,
'',
false, $uselocalbrowser,
getDolGlobalInt(
'FCKEDITOR_ENABLE_TICKET'), ROWS_5,
'90%');
1856 $doleditor->Create();
1875 print
'<br><center>';
1876 print
'<input type="submit" class="button" name="btn_add_message" value="'.$langs->trans(
"Add").
'"';
1878 if ($this->withfile == 2 && !empty(
$conf->use_javascript_ajax)) {
1879 print
' onClick="if (document.ticket.addedfile.value != \'\') { alert(\''.dol_escape_js($langs->trans(
"FileWasNotUploaded")).
'\');
return false; }
else {
return true; }
"';
1882 if (!empty($this->withcancel)) {
1883 print "
";
1884 print '<input class="button button-cancel
" type="submit
" name="cancel
" value="'.$langs->trans("Cancel").'">';
1886 print "</center>\n
";
1888 print '<input type="hidden
" name="page_y
">'."\n
";
1890 print "</form><br>\n
";
1892 // Disable enter key if option MAIN_MAILFORM_DISABLE_ENTERKEY is set
1893 if (getDolGlobalString('MAIN_MAILFORM_DISABLE_ENTERKEY')) {
1894 print '<script type="text/javascript
">';
1895 print 'jQuery(document).ready(function () {';
1896 print ' $(document).on("keypress
", \'#ticket\', function (e) { /* Note this is called at every key pressed ! */
1897 var code = e.keyCode || e.which;
1899 console.log("Enter was intercepted and blocked
");
1908 print "<!-- End form TICKET -->\n
";
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Class to manage a WYSIWYG editor.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
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_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
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_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...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Class to generate the form for creating a new ticket.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
getMaxFileSizeArray()
Return the max allowed for file upload.