33require
'../main.inc.php';
34require_once DOL_DOCUMENT_ROOT.
'/ticket/class/actions_ticket.class.php';
35require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formticket.class.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
37require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/lib/ticket.lib.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
44if (isModEnabled(
'project')) {
45 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
46 include_once DOL_DOCUMENT_ROOT.
'/core/lib/project.lib.php';
47 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
49if (isModEnabled(
'contract')) {
50 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcontract.class.php';
51 include_once DOL_DOCUMENT_ROOT.
'/core/lib/contract.lib.php';
52 include_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
56$langs->loadLangs(array(
"companies",
"other",
"ticket"));
61$track_id =
GETPOST(
'track_id',
'alpha', 3);
65$notifyTiers =
GETPOST(
"notify_tiers_at_create",
'alpha');
67$action =
GETPOST(
'action',
'aZ09');
68$cancel =
GETPOST(
'cancel',
'alpha');
69$backtopage =
GETPOST(
'backtopage',
'alpha');
70$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
72$sortfield =
GETPOST(
'sortfield',
'aZ09comma') ?
GETPOST(
'sortfield',
'aZ09comma') :
"a.datep";
73$sortorder =
GETPOST(
'sortorder',
'aZ09comma') ?
GETPOST(
'sortorder',
'aZ09comma') :
"desc";
74$search_rowid =
GETPOST(
'search_rowid');
75$search_agenda_label =
GETPOST(
'search_agenda_label');
77if (
GETPOST(
'actioncode',
'array')) {
78 $actioncode =
GETPOST(
'actioncode',
'array', 3);
79 if (!count($actioncode)) {
88$hookmanager->initHooks(array(
'ticketcard',
'globalcard'));
94$extrafields->fetch_name_optionals_label(
$object->table_element);
96$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
99$search_all =
GETPOST(
"search_all",
'alpha');
101foreach (
$object->fields as $key => $val) {
102 if (
GETPOST(
'search_'.$key,
'alpha')) {
103 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
107if (empty($action) && empty($id) && empty($ref)) {
112if (
GETPOST(
'modelselected',
'alpha')) {
118if ($id || $track_id || $ref) {
119 $res =
$object->fetch($id, $ref, $track_id);
131$url_page_current = DOL_URL_ROOT.
'/ticket/card.php';
134if ($user->socid > 0) {
135 $socid = $user->socid;
139$triggermodname =
'TICKET_MODIFY';
142$permissiontoread = $user->hasRight(
'ticket',
'read');
143$permissiontoadd = $user->hasRight(
'ticket',
'write');
144$permissiontodelete = $user->hasRight(
'ticket',
'delete');
146$upload_dir = $conf->ticket->dir_output;
154$parameters = array();
155$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
161if (empty($reshook)) {
163 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
165 $search_agenda_label =
'';
168 $backurlforlist = DOL_URL_ROOT .
'/ticket/list.php';
170 if (empty($backtopage) || ($cancel && empty($id))) {
171 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
172 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
173 $backtopage = $backurlforlist;
175 $backtopage = DOL_URL_ROOT .
'/ticket/card.php?id=' . ((!empty($id) &&
$id > 0) ? $id :
'__ID__');
181 if (!empty($backtopageforcancel)) {
182 header(
"Location: " . $backtopageforcancel);
184 } elseif (!empty($backtopage)) {
185 header(
"Location: " . $backtopage);
191 if (($action ==
'add' || ($action ==
'update' &&
$object->status < Ticket::STATUS_CLOSED)) && $permissiontoadd) {
192 $ifErrorAction = ($action ==
'add' ?
'create' :
'edit');
193 if ($action ==
'add') {
199 'ref' => [
'check' =>
'alpha',
'langs' =>
'Ref'],
200 'type_code' => [
'check' =>
'alpha',
'langs' =>
'TicketTypeRequest'],
201 'category_code' => [
'check' =>
'alpha',
'langs' =>
'TicketCategory'],
202 'severity_code' => [
'check' =>
'alpha',
'langs' =>
'TicketSeverity'],
203 'subject' => [
'check' =>
'alphanohtml',
'langs' =>
'Subject'],
204 'message' => [
'check' =>
'restricthtml',
'langs' =>
'Message']
209 if (!empty($error)) {
210 $action = $ifErrorAction;
213 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
217 $getRef =
GETPOST(
'ref',
'alpha');
219 if (!empty($getRef)) {
220 $isExistingRef =
$object->checkExistingRef($action, $getRef);
222 $isExistingRef =
true;
227 if ($isExistingRef) {
228 if ($action ==
'update') {
232 } elseif ($action ==
'add') {
237 if (!empty($getRef)) {
250 $fk_user_assign =
GETPOSTINT(
'fk_user_assign');
254 if ($fk_user_assign > 0) {
255 $object->fk_user_assign = $fk_user_assign;
256 $object->status = $object::STATUS_ASSIGNED;
259 if ($action ==
'add') {
261 $object->type_label = $langs->trans($langs->getLabelFromKey($db,
$object->type_code,
'c_ticket_type',
'code',
'label'));
262 $object->category_label = $langs->trans($langs->getLabelFromKey($db,
$object->category_code,
'c_ticket_category',
'code',
'label'));
263 $object->severity_label = $langs->trans($langs->getLabelFromKey($db,
$object->severity_code,
'c_ticket_severity',
'code',
'label'));
264 $object->fk_user_create = $user->id;
265 $object->email_from = $user->email;
267 $notifyTiers =
GETPOST(
"notify_tiers_at_create",
'alpha');
268 $object->notify_tiers_at_create = empty($notifyTiers) ? 0 : 1;
278 $action = $ifErrorAction;
283 $categories =
GETPOST(
'categories',
'array');
284 $object->setCategories($categories);
287 if ($action ==
'add') {
291 $type_contact =
GETPOST(
"type",
'alpha');
293 if ($contactid > 0 && $type_contact) {
295 $result =
$object->add_contact($contactid, $typeid,
'external');
299 if (
GETPOST(
'origin',
'alpha') ==
'projet') {
305 if ($projectid > 0) {
306 $object->setProject($projectid);
310 if (
getDolGlobalString(
'TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND') && $user->hasRight(
'ticket',
'write')) {
311 if (!
$object->markAsRead($user) > 0) {
317 if ((empty($fk_user_assign) &&
getDolGlobalInt(
'TICKET_AUTO_ASSIGN_USER_CREATE') == 1) || (
getDolGlobalInt(
'TICKET_AUTO_ASSIGN_USER_CREATE') == 2)) {
318 $result =
$object->assignUser($user, $user->id, 1);
319 $object->add_contact($user->id,
"SUPPORTTEC",
'internal');
325 $object->copyFilesForTicket(
'');
331 if (!empty($backtopage)) {
335 $url =
'card.php?track_id=' . urlencode(
$object->track_id);
338 $url =
'card.php?track_id=' . urlencode(
$object->track_id);
341 header(
"Location: " . $url);
348 $action = $ifErrorAction;
353 if ($action ==
"set_read" && $permissiontoadd) {
356 if (
$object->markAsRead($user) > 0) {
359 header(
"Location: card.php?track_id=" .
$object->track_id);
368 if ($action ==
"assign_user" &&
GETPOST(
'btn_assign_user',
'alpha') && $permissiontoadd) {
370 $useroriginassign =
$object->fk_user_assign;
380 $ret =
$object->assignUser($user, $usertoassign);
388 if ($useroriginassign > 0) {
389 $internal_contacts =
$object->listeContact(-1,
'internal', 0,
'SUPPORTTEC');
390 foreach ($internal_contacts as $key => $contact) {
391 if ($contact[
'id'] !== $usertoassign) {
392 $result =
$object->delete_contact($contact[
'rowid']);
401 if ($usertoassign > 0 && $usertoassign !== $useroriginassign) {
402 $result =
$object->add_contact($usertoassign,
"SUPPORTTEC",
'internal', $notrigger = 0);
412 $object->fetch_user($usertoassign);
415 header(
"Location: card.php?track_id=" .
$object->track_id);
425 if ($action ==
'add_message' && GETPOSTISSET(
'btn_add_message') && $permissiontoread) {
426 $ret =
$object->newMessage($user, $action, (
GETPOST(
'private_message',
'alpha') ==
"on" ? 1 : 0), 0);
429 if (!empty($backtopage)) {
432 $url =
'card.php?track_id=' . urlencode(
$object->track_id);
435 header(
"Location: " . $url);
443 if (($action ==
"confirm_close" || $action ==
"confirm_abandon") &&
GETPOST(
'confirm',
'alpha') ==
'yes' && $permissiontoadd) {
446 if (
$object->close($user, ($action ==
"confirm_abandon" ? 1 : 0))) {
449 $url =
'card.php?track_id=' .
GETPOST(
'track_id',
'alpha');
450 header(
"Location: " . $url);
458 if ($action ==
"confirm_public_close" &&
GETPOST(
'confirm',
'alpha') ==
'yes' && $permissiontoadd) {
460 if ($_SESSION[
'email_customer'] ==
$object->origin_email || $_SESSION[
'email_customer'] ==
$object->thirdparty->email) {
465 setEventMessages(
'<div class="confirm">' . $langs->trans(
'TicketMarkedAsClosed') .
'</div>',
null,
'mesgs');
467 $url =
'card.php?track_id=' .
GETPOST(
'track_id',
'alpha');
468 header(
"Location: " . $url);
476 if ($action ==
'confirm_delete_ticket' &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $permissiontodelete) {
478 if (
$object->delete($user) > 0) {
479 setEventMessages(
'<div class="confirm">' . $langs->trans(
'TicketDeletedSuccess') .
'</div>',
null,
'mesgs');
480 header(
"Location: " . DOL_URL_ROOT .
"/ticket/list.php");
483 $langs->load(
"errors");
484 $mesg =
'<div class="error">' . $langs->trans(
$object->error) .
'</div>';
491 if ($action ==
'set_thirdparty' && $user->hasRight(
'ticket',
'write')) {
494 $url = $_SERVER[
"PHP_SELF"] .
'?track_id=' .
GETPOST(
'track_id',
'alpha');
495 header(
"Location: " . $url);
501 if ($action ==
'set_progression' && $user->hasRight(
'ticket',
'write')) {
505 $url =
'card.php?track_id=' .
$object->track_id;
506 header(
"Location: " . $url);
512 if ($action ==
'set_categories' && $user->hasRight(
'ticket',
'write')) {
516 $url =
'card.php?track_id=' .
$object->track_id;
517 header(
"Location: " . $url);
523 if ($action ==
'setsubject' && $user->hasRight(
'ticket',
'write')) {
525 if ($action ==
'setsubject') {
529 if ($action ==
'setsubject' && empty(
$object->subject)) {
531 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"Subject")),
null,
'errors');
535 if (!
$object->update($user) >= 0) {
541 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?track_id=" .
$object->track_id);
546 if ($action ==
'confirm_reopen' && $user->hasRight(
'ticket',
'manage') && !
GETPOST(
'cancel')) {
549 if (
$object->status == Ticket::STATUS_CLOSED ||
$object->status == Ticket::STATUS_CANCELED) {
550 if (
$object->fk_user_assign !=
null) {
551 $res =
$object->setStatut(Ticket::STATUS_ASSIGNED,
null,
'',
'TICKET_MODIFY');
553 $res =
$object->setStatut(Ticket::STATUS_NOT_READ,
null,
'',
'TICKET_MODIFY');
556 $url =
'card.php?track_id=' .
$object->track_id;
557 header(
"Location: " . $url);
565 } elseif ($action ==
'classin' && $permissiontoadd) {
568 $object->setProject($projectid);
569 $url =
'card.php?track_id=' .
$object->track_id;
570 header(
"Location: " . $url);
573 } elseif ($action ==
'setcontract' && $permissiontoadd) {
577 $url =
'card.php?track_id=' .
$object->track_id;
578 header(
"Location: " . $url);
581 } elseif ($action ==
"set_message" && $user->hasRight(
'ticket',
'manage')) {
585 $fieldtomodify =
GETPOST(
'message_initial',
'restricthtml');
587 $object->message = $fieldtomodify;
594 setEventMessages($langs->trans(
'TicketMessageSuccesfullyUpdated'),
null,
'mesgs');
602 } elseif ($action ==
'confirm_set_status' && $permissiontoadd && !
GETPOST(
'cancel')) {
607 $res =
$object->setStatut($new_status);
609 $url =
'card.php?track_id=' .
$object->track_id;
610 header(
"Location: " . $url);
620 if ($action ==
"update_extras" && $permissiontoadd) {
623 $ret = $extrafields->setOptionalsFromPost(
null,
$object,
GETPOST(
'attribute',
'restricthtml'));
629 $result =
$object->insertExtraFields(empty($triggermodname) ?
'' : $triggermodname, $user);
637 $action =
'edit_extras';
644 if ($action ==
"change_property" &&
GETPOST(
'btn_update_ticket_prop',
'alpha') && $permissiontoadd) {
648 $object->severity_code =
GETPOST(
'update_value_severity',
'aZ09');
649 $object->category_code =
GETPOST(
'update_value_category',
'aZ09');
662 $permissiondellink = $user->hasRight(
'ticket',
'write');
663 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
666 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
669 $triggersendname =
'TICKET_SENTBYMAIL';
671 $autocopy =
'MAIN_MAIL_AUTOCOPY_TICKET_TO';
672 $trackid =
'tic' .
$object->id;
673 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
676 if (GETPOSTISSET(
'actionbis') && $action ==
'presend') {
677 $action =
'presend_addmessage';
686$userstat =
new User($db);
687$form =
new Form($db);
690if (isModEnabled(
'project')) {
694$help_url =
'EN:Module_Ticket|FR:DocumentationModuleTicket';
696$title = $actionobject->getTitle($action);
698llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-ticket page-card');
700if ($action ==
'create' || $action ==
'presend') {
701 if (empty($permissiontoadd)) {
709 $formticket->trackid =
'';
710 $formticket->withfromsocid = $socid ? $socid : $user->socid;
711 $formticket->withfromcontactid = $contactid ? $contactid :
'';
712 $formticket->withtitletopic = 1;
713 $formticket->withnotifytiersatcreate = ($notifyTiers ? 1 : (
getDolGlobalString(
'TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION') ? 1 : 0));
714 $formticket->withusercreate = 0;
715 $formticket->withref = 1;
716 $formticket->fk_user_create = $user->id;
717 $formticket->withfile = 2;
718 $formticket->withextrafields = 1;
719 $formticket->param = array(
'origin' =>
GETPOST(
'origin'),
'originid' =>
GETPOST(
'originid'));
721 $formticket->withcancel = 1;
724 if (
GETPOST(
"mode",
"aZ09") ==
'init') {
725 $formticket->clear_attached_files();
728 $formticket->showForm(1,
'create', 0,
null, $action,
$object);
731} elseif ($action ==
'edit' && $user->rights->ticket->write &&
$object->status < Ticket::STATUS_CLOSED) {
732 if (empty($permissiontoadd)) {
742 $formticket->trackid =
$object->track_id;
743 $formticket->withfromsocid =
$object->socid;
744 $formticket->withtitletopic = 1;
746 $formticket->withnotifytiersatcreate = 0;
747 $formticket->withusercreate = 0;
748 $formticket->withref = 1;
749 $formticket->fk_user_create = $user->id;
750 $formticket->withfile = 0;
751 $formticket->action =
'update';
752 $formticket->withextrafields = 1;
753 $formticket->param = array(
'origin' =>
GETPOST(
'origin'),
'originid' =>
GETPOST(
'originid'));
755 $formticket->withcancel = 1;
757 $formticket->showForm(0,
'edit', 0,
null, $action,
$object);
760} elseif (empty($action) || in_array($action, [
'builddoc',
'view',
'addlink',
'dellink',
'presend',
'presend_addmessage',
'close',
'abandon',
'delete',
'editcustomer',
'progression',
'categories',
'reopen',
'edit_contrat',
'editsubject',
'edit_extras',
'update_extras',
'edit_extrafields',
'set_extrafields',
'classify',
'sel_contract',
'edit_message_init',
'set_status',
'dellink'])) {
761 if (!empty($res) && $res > 0) {
763 if (!$user->socid && (
getDolGlobalString(
'TICKET_LIMIT_VIEW_ASSIGNED_ONLY') &&
$object->fk_user_assign != $user->id) && !$user->hasRight(
'ticket',
'manage')) {
770 if ($action ==
'close') {
771 $thirdparty_contacts =
$object->getInfosTicketExternalContact(1);
772 $contacts_select = array(
773 '-2' => $langs->trans(
'TicketNotifyAllTiersAtClose'),
774 '-3' => $langs->trans(
'TicketNotNotifyTiersAtClose')
776 foreach ($thirdparty_contacts as $thirdparty_contact) {
777 $contacts_select[$thirdparty_contact[
'id']] = $thirdparty_contact[
'civility'] .
' ' . $thirdparty_contact[
'lastname'] .
' ' . $thirdparty_contact[
'firstname'];
782 $formquestion = array(
784 'name' =>
'contactid',
786 'label' => $langs->trans(
'NotifyThirdpartyOnTicketClosing'),
787 'values' => $contacts_select,
788 'default' => $default
792 $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"CloseATicket"), $langs->trans(
"ConfirmCloseAticket"),
"confirm_close", $formquestion,
'', 1);
795 if ($action ==
'abandon') {
796 $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"AbandonTicket"), $langs->trans(
"ConfirmAbandonTicket"),
"confirm_abandon",
'',
'', 1);
799 if ($action ==
'delete') {
800 $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"Delete"), $langs->trans(
"ConfirmDeleteTicket"),
"confirm_delete_ticket",
'',
'', 1);
803 if ($action ==
'reopen') {
804 $formconfirm = $form->formconfirm($url_page_current.
'?track_id='.
$object->track_id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenTicket'),
'confirm_reopen',
'',
'', 1);
807 if ($action ==
'set_status') {
810 $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id.
"&new_status=".$new_status, $langs->trans(
"TicketChangeStatus"), $langs->trans(
"TicketConfirmChangeStatus", $langs->transnoentities(
$object->labelStatusShort[$new_status])),
"confirm_set_status",
'',
'', 1);
814 $parameters = array(
'formConfirm' => $formconfirm);
815 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
816 if (empty($reshook)) {
817 $formconfirm .= $hookmanager->resPrint;
818 } elseif ($reshook > 0) {
819 $formconfirm = $hookmanager->resPrint;
826 if ($projectid > 0) {
827 $projectstat =
new Project($db);
828 if ($projectstat->fetch($projectid) > 0) {
829 $projectstat->fetch_thirdparty();
833 $userWrite = $projectstat->restrictedProjectArea($user,
'write');
839 print
dol_get_fiche_head($head,
'ticket', $langs->trans(
"Project"), 0, ($projectstat->public ?
'projectpub' :
'project'));
841 print
'<table class="border centpercent">';
843 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
846 print
'<tr><td width="30%">'.$langs->trans(
'Ref').
'</td><td colspan="3">';
848 if (!$user->hasRight(
'projet',
'all',
'lire')) {
849 $objectsListId = $projectstat->getProjectsAuthorizedForUser($user, $mine, 0);
850 $projectstat->next_prev_filter =
"rowid IN (".$db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0').
")";
852 print $form->showrefnav($projectstat,
'ref', $linkback, 1,
'ref',
'ref',
'');
856 print
'<tr><td>'.$langs->trans(
"Label").
'</td><td>'.$projectstat->title.
'</td></tr>';
859 print
"<tr><td>".$langs->trans(
"ThirdParty").
"</td>";
860 print
'<td colspan="3">';
861 if ($projectstat->thirdparty->id > 0) {
862 print $projectstat->thirdparty->getNomUrl(1);
870 print
'<tr><td>'.$langs->trans(
"Visibility").
'</td><td>';
871 if ($projectstat->public) {
872 print $langs->trans(
'SharedProject');
874 print $langs->trans(
'PrivateProject');
880 print
'<tr><td>'.$langs->trans(
"Status").
'</td><td>'.$projectstat->getLibStatut(4).
'</td></tr>';
886 print
"ErrorRecordNotFound";
888 } elseif ($socid > 0) {
894 dol_banner_tab(
$object->thirdparty,
'socid',
'', ($user->socid ? 0 : 1),
'rowid',
'nom');
900 $object->next_prev_filter =
"te.fk_user_assign = ".((int) $user->id);
901 } elseif ($user->socid > 0) {
902 $object->next_prev_filter =
"te.fk_soc = ".((int) $user->socid);
909 $morehtmlref =
'<div class="refidno">';
911 if ($user->hasRight(
'ticket',
'write') && !$user->socid) {
912 $morehtmlref .=
'<a class="editfielda" href="'.$url_page_current.
'?action=editsubject&token='.
newToken().
'&track_id='.
$object->track_id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetTitle'), 0).
'</a> ';
914 if ($action !=
'editsubject') {
917 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'">';
918 $morehtmlref .=
'<input type="hidden" name="action" value="setsubject">';
919 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
920 $morehtmlref .=
'<input type="hidden" name="id" value="20">';
921 $morehtmlref .=
'<input type="text" class="minwidth300" id="subject" name="subject" value="'.$object->subject.
'" autofocus="">';
922 $morehtmlref .=
'<input type="submit" class="smallpaddingimp button valignmiddle" name="modify" value="'.$langs->trans(
"Modify").
'">';
923 $morehtmlref .=
'<input type="submit" class="smallpaddingimp button button-cancel vlignmiddle" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
924 $morehtmlref .=
'</form>';
929 if (
$object->fk_user_create > 0) {
930 $morehtmlref .=
'<br>'.$langs->trans(
"CreatedBy").
' : ';
932 $fuser =
new User($db);
933 $fuser->fetch(
$object->fk_user_create);
934 $morehtmlref .= $fuser->getNomUrl(-1);
938 $createdfrompublicticket = 0;
939 $createdfromemailcollector = 0;
940 if (!empty(
$object->origin_email) && (empty(
$object->email_msgid) || preg_match(
'/dolibarr\-tic\d+/',
$object->email_msgid))) {
942 $createdfrompublicticket = 1;
943 } elseif (!empty(
$object->email_msgid)) {
945 $createdfromemailcollector = 1;
949 if ($createdfrompublicticket) {
950 $htmltooptip = $langs->trans(
"OriginEmail").
': '.
$object->origin_email;
951 $htmltooptip .=
'<br>'.$langs->trans(
"IP").
': '.
$object->ip;
952 $morehtmlref .= ($createdbyshown ?
' - ' :
'<br>');
953 $morehtmlref .= ($createdbyshown ?
'' : $langs->trans(
"CreatedBy").
' : ');
954 $morehtmlref .=
img_picto(
'',
'email',
'class="paddingrightonly"');
955 $morehtmlref .=
dol_escape_htmltag(
$object->origin_email).
' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans(
"CreatedByPublicPortal"), $htmltooptip, 1,
'help',
'', 0, 3,
'tooltip').
'</small>';
956 } elseif ($createdfromemailcollector) {
957 $langs->load(
"mails");
958 $htmltooltip = $langs->trans(
"EmailMsgID").
': '.
$object->email_msgid;
959 $htmltooltip .=
'<br>'.$langs->trans(
"EmailDate").
': '.
dol_print_date(
$object->email_date,
'dayhour');
960 $htmltooltip .=
'<br>'.$langs->trans(
"MailFrom").
': '.
$object->origin_email;
961 $htmltooltip .=
'<br>'.$langs->trans(
"MailReply").
': '.
$object->origin_replyto;
962 $htmltooltip .=
'<br>'.$langs->trans(
"MailReferences").
': '.
$object->origin_references;
963 $morehtmlref .= ($createdbyshown ?
' - ' :
'<br>');
964 $morehtmlref .= ($createdbyshown ?
'' : $langs->trans(
"CreatedBy").
' : ');
965 $morehtmlref .=
img_picto(
'',
'email',
'class="paddingrightonly"');
966 $morehtmlref .=
dol_escape_htmltag(
$object->origin_email).
' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans(
"CreatedByEmailCollector"), $htmltooltip, 1,
'help',
'', 0, 3,
'tooltip').
'</small>';
969 $permissiontoedit =
$object->status < 8 && !$user->socid && $user->hasRight(
'ticket',
'write');
973 if (isModEnabled(
"societe")) {
974 $morehtmlref .=
'<br>';
975 $morehtmlref .=
img_picto($langs->trans(
"ThirdParty"),
'company',
'class="pictofixedwidth"');
976 if ($action !=
'editcustomer' && $permissiontoedit) {
977 $morehtmlref .=
'<a class="editfielda" href="'.$url_page_current.
'?action=editcustomer&token='.
newToken().
'&track_id='.
$object->track_id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetThirdParty'), 0).
'</a> ';
979 $morehtmlref .= $form->form_thirdparty($url_page_current.
'?track_id='.
$object->track_id,
$object->socid, $action ==
'editcustomer' ?
'editcustomer' :
'none',
'', 1, 0, 0, array(), 1);
981 $morehtmlref .=
' - <a href="'.DOL_URL_ROOT.
'/ticket/list.php?socid='.
$object->socid.
'&sortfield=t.datec&sortorder=desc'.(
getDolGlobalBool(
'TICKET_CLIENT_OTHER_TICKET_ONLY_OPEN')?
'&search_fk_statut[]=openall':
'').
'">'.
img_picto($langs->trans(
"Tickets"),
'ticket',
'class="pictofixedwidth"').
' '.$langs->trans(
"TicketHistory").
'</a>';
986 if (isModEnabled(
'project')) {
987 $langs->load(
"projects");
988 $morehtmlref .=
'<br>';
989 if ($permissiontoedit) {
991 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project'.((is_object(
$object->project) &&
$object->project->public) ?
'pub' :
''),
'class="pictofixedwidth"');
992 if ($action !=
'classify') {
993 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
995 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
997 if (!empty(
$object->fk_project)) {
999 $morehtmlref .=
$object->project->getNomUrl(1);
1000 if (
$object->project->title) {
1001 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag(
$object->project->title).
'</span>';
1010 if (isModEnabled(
'contract')) {
1011 $langs->load(
'contracts');
1012 $morehtmlref .=
'<br>';
1013 if ($permissiontoedit) {
1014 $morehtmlref .=
img_picto($langs->trans(
"Contract"),
'contract',
'class="pictofixedwidth"');
1015 if ($action ==
'edit_contrat') {
1017 $morehtmlref .= $formcontract->formSelectContract($_SERVER[
"PHP_SELF"].
'?id='.
$object->id,
$object->socid,
$object->fk_contract,
'contratid', 0, 1, 1, 1);
1019 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=edit_contrat&token='.
newToken().
'&id='.
$object->id.
'">';
1020 $morehtmlref .=
img_edit($langs->trans(
'SetContract'));
1021 $morehtmlref .=
'</a>';
1024 if (!empty(
$object->fk_contract)) {
1025 $contratstatic =
new Contrat($db);
1026 $contratstatic->fetch(
$object->fk_contract);
1028 $morehtmlref .= $contratstatic->getNomUrl(0, 0, 1);
1034 $morehtmlref .=
'</div>';
1036 $linkback =
'<a href="'.DOL_URL_ROOT.
'/ticket/list.php?restore_lastsearch_values=1"><strong>'.$langs->trans(
"BackToList").
'</strong></a> ';
1038 dol_banner_tab(
$object,
'ref', $linkback, ($user->socid ? 0 : 1),
'ref',
'ref', $morehtmlref);
1040 print
'<div class="fichecenter">';
1041 print
'<div class="fichehalfleft">';
1042 print
'<div class="underbanner clearboth"></div>';
1044 print
'<table class="border tableforfield centpercent">';
1047 print
'<tr><td class="titlefield">'.$langs->trans(
"TicketTrackId").
'</td><td>';
1048 if (!empty(
$object->track_id)) {
1051 print $form->showrefnav(
$object,
'id', $linkback, 1,
'rowid',
'track_id');
1056 print $langs->trans(
'None');
1070 print
'<tr><td>'.$langs->trans(
"DateCreation").
'</td><td>';
1093 print
'<tr><td>'.$langs->trans(
"TicketReadOn").
'</td><td>';
1094 if (!empty(
$object->date_read)) {
1102 print
'<tr><td>'.$langs->trans(
"TicketCloseOn").
'</td><td>';
1103 if (!empty(
$object->date_close)) {
1110 print
'<table class="nobordernopadding" width="100%"><tr><td class="nowrap">';
1111 print $langs->trans(
"AssignedTo");
1112 if (isset(
$object->status) &&
$object->status < $object::STATUS_CLOSED &&
GETPOST(
'set',
'alpha') !=
"assign_ticket" && $user->hasRight(
'ticket',
'manage')) {
1113 print
'</td><td class="right"><a class="editfielda" href="'.$url_page_current.
'?track_id='.urlencode(
$object->track_id).
'&set=assign_ticket">'.
img_edit($langs->trans(
'Modify')).
'</a>';
1115 print
'</td></tr></table>';
1117 if (
GETPOST(
'set',
'alpha') !=
"assign_ticket" &&
$object->fk_user_assign > 0) {
1118 $userstat->fetch(
$object->fk_user_assign);
1119 print $userstat->getNomUrl(-1);
1123 if (
GETPOST(
'set',
'alpha') ==
"assign_ticket" &&
$object->status < 8 && !$user->socid && $user->hasRight(
'ticket',
'write')) {
1124 print
'<form method="post" name="ticket" enctype="multipart/form-data" action="'.$url_page_current.
'">';
1125 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1126 print
'<input type="hidden" name="action" value="assign_user">';
1127 print
'<input type="hidden" name="track_id" value="'.$object->track_id.
'">';
1129 print $form->select_dolusers(empty(
$object->fk_user_assign) ? $user->id :
$object->fk_user_assign,
'fk_user_assign', 1);
1130 print
' <input type="submit" class="button smallpaddingimp" name="btn_assign_user" value="'.$langs->trans(
"Validate").
'" />';
1137 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
1138 print $langs->trans(
'Progression').
'</td><td class="left">';
1140 if ($action !=
'progression' && isset(
$object->status) &&
$object->status < $object::STATUS_CLOSED && !$user->socid) {
1141 print
'<td class="right"><a class="editfielda" href="'.$url_page_current.
'?action=progression&token='.
newToken().
'&track_id='.urlencode(
$object->track_id).
'">'.
img_edit($langs->trans(
'Modify')).
'</a></td>';
1143 print
'</tr></table>';
1145 if ($user->hasRight(
'ticket',
'write') && $action ==
'progression') {
1146 print
'<form action="'.$url_page_current.
'" method="post">';
1147 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1148 print
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
1149 print
'<input type="hidden" name="action" value="set_progression">';
1150 print
'<input type="text" class="flat width75" name="progress" value="'.$object->progress.
'">';
1151 print
' <input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
1160 if (isModEnabled(
'intervention')) {
1162 $num = count(
$object->linkedObjects);
1166 foreach (
$object->linkedObjects as $objecttype => $objects) {
1167 if ($objecttype ==
"fichinter") {
1168 '@phan-var-force Fichinter[] $objects';
1169 foreach ($objects as $fichinter) {
1172 $timing += $fichinter->duration;
1178 print $form->textwithpicto($langs->trans(
"TicketDurationAuto"), $langs->trans(
"TicketDurationAutoInfos"), 1);
1185 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1191 print
'</div><div class="fichehalfright">';
1194 print
'<form method="post" name="formticketproperties" action="'.$url_page_current.
'">';
1195 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1196 print
'<input type="hidden" name="action" value="change_property">';
1197 print
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
1198 print
'<input type="hidden" name="trackid" value="'.$trackid.
'">';
1201 print
'<div class="div-table-responsive-no-min">';
1202 print
'<table class="border tableforfield centpercent margintable bordertopimp">';
1203 print
'<tr class="liste_titre">';
1205 print $langs->trans(
'TicketProperties');
1208 if (
GETPOST(
'set',
'alpha') ==
'properties' && $user->hasRight(
'ticket',
'write')) {
1209 print
'<input type="submit" class="button smallpaddingimp" name="btn_update_ticket_prop" value="'.$langs->trans(
"Modify").
'" />';
1212 if (isset(
$object->status) && (
$object->status < $object::STATUS_NEED_MORE_INFO || !
getDolGlobalInt(
'TICKET_DISALLOW_CLASSIFICATION_MODIFICATION_EVEN_IF_CLOSED')) && $user->hasRight(
'ticket',
'write')) {
1213 print
' <a class="editfielda" href="card.php?track_id='.$object->track_id.
'&set=properties">'.
img_edit($langs->trans(
'Modify')).
'</a>';
1219 if (
GETPOST(
'set',
'alpha') ==
'properties' && $user->hasRight(
'ticket',
'write')) {
1222 print
'<td class="titlefield">';
1223 print $langs->trans(
'Type');
1225 $formticket->selectTypesTickets(
$object->type_code,
'update_value_type',
'', 2);
1231 print $langs->trans(
'TicketCategory');
1233 $formticket->selectGroupTickets(
$object->category_code,
'update_value_category',
'', 2, 0, 0, 0,
'maxwidth500 widthcentpercentminusxx');
1239 print $langs->trans(
'TicketSeverity');
1241 $formticket->selectSeveritiesTickets(
$object->severity_code,
'update_value_severity',
'', 2);
1246 print
'<tr><td class="titlefield">'.$langs->trans(
"Type").
'</td><td>';
1247 if (!empty(
$object->type_code)) {
1248 print $langs->getLabelFromKey($db,
'TicketTypeShort'.
$object->type_code,
'c_ticket_type',
'code',
'label',
$object->type_code);
1253 if (!empty(
$object->category_code)) {
1254 $s = $langs->getLabelFromKey($db,
'TicketCategoryShort'.
$object->category_code,
'c_ticket_category',
'code',
'label',
$object->category_code);
1256 print
'<tr><td>'.$langs->trans(
"TicketCategory").
'</td><td class="tdoverflowmax200" title="'.
dol_escape_htmltag($s).
'">';
1260 print
'<tr><td>'.$langs->trans(
"TicketSeverity").
'</td><td>';
1261 if (!empty(
$object->severity_code)) {
1262 print $langs->getLabelFromKey($db,
'TicketSeverityShort'.
$object->severity_code,
'c_ticket_severity',
'code',
'label',
$object->severity_code);
1272 if (isModEnabled(
'category')) {
1273 print
'<table class="border centpercent tableforfield">';
1275 print
'<td class="valignmiddle titlefield">';
1276 print
'<table class="nobordernopadding centpercent"><tr><td class="titlefield">';
1277 print $langs->trans(
"Categories");
1278 if ($action !=
'categories' && !$user->socid) {
1279 print
'<td class="right"><a class="editfielda" href="'.$url_page_current.
'?action=categories&track_id='.
$object->track_id.
'">'.
img_edit($langs->trans(
'Modify')).
'</a></td>';
1284 if ($user->hasRight(
'ticket',
'write') && $action ==
'categories') {
1285 $cate_arbo = $form->select_all_categories(Categorie::TYPE_TICKET,
'',
'parent', 64, 0, 3);
1286 if (is_array($cate_arbo)) {
1288 print
'<td colspan="3">';
1289 print
'<form action="'.$url_page_current.
'" method="POST">';
1290 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1291 print
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
1292 print
'<input type="hidden" name="action" value="set_categories">';
1295 $cats = $category->containing(
$object->id,
'ticket');
1296 $arrayselected = array();
1297 foreach ($cats as $cat) {
1298 $arrayselected[] = $cat->id;
1301 print
img_picto(
'',
'category',
'class="pictofixedwidth"').$form->multiselectarray(
'categories', $cate_arbo, $arrayselected, 0, 0,
'maxwidth500 widthcentpercentminusx', 0, 0);
1302 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Save').
'">';
1307 print
'<td colspan="3">';
1308 print $form->showCategories(
$object->id, Categorie::TYPE_TICKET, 1);
1316 $actionobject->viewTicketOriginalMessage($user, $action,
$object);
1320 print
'<!-- navbar with status -->';
1321 if (!$user->socid && $user->hasRight(
'ticket',
'write') && isset(
$object->status) &&
$object->status < $object::STATUS_CLOSED) {
1322 $actionobject->viewStatusActions(
$object);
1327 print
load_fiche_titre($langs->trans(
'Contacts'),
'',
'title_companies.png');
1329 print
'<div class="div-table-responsive-no-min">';
1330 print
'<div class="tagtable centpercent noborder allwidth">';
1332 print
'<div class="tagtr liste_titre">';
1333 print
'<div class="tagtd">'.$langs->trans(
"Source").
'</div>
1334 <div class="tagtd">' . $langs->trans(
"Company").
'</div>
1335 <div class="tagtd">' . $langs->trans(
"Contacts").
'</div>
1336 <div class="tagtd">' . $langs->trans(
"ContactType").
'</div>
1337 <div class="tagtd">' . $langs->trans(
"Phone").
'</div>
1338 <div class="tagtd center">' . $langs->trans(
"Status").
'</div>';
1339 print
'</div><!-- tagtr -->';
1342 $companystatic =
new Societe($db);
1343 $contactstatic =
new Contact($db);
1344 $userstatic =
new User($db);
1346 foreach (array(
'internal',
'external') as $source) {
1348 $tab = $tmpobject->listeContact(-1, $source);
1349 '@phan-var-force array<array{source:string,id:int,rowid:int,email:string,civility:string,firstname:string,lastname:string,labeltype:string,libelle:string,socid:int,code:string,status:int,statuscontact:string,fk_c_typecontact:string,phone:string,phone_mobile:string,phone_perso?:string,nom:string}> $tab';
1350 $num = is_array($tab) ? 0 : count($tab);
1352 foreach (array_keys($tab) as $i) {
1354 print
'<div class="tagtr '.($var ?
'pair' :
'impair').
'">';
1356 print
'<div class="tagtd left">';
1357 if ($tab[$i][
'source'] ==
'internal') {
1358 echo $langs->trans(
"User");
1361 if ($tab[$i][
'source'] ==
'external') {
1362 echo $langs->trans(
"ThirdPartyContact");
1366 print
'<div class="tagtd left">';
1368 if ($tab[$i][
'socid'] > 0) {
1369 $companystatic->fetch($tab[$i][
'socid']);
1370 echo $companystatic->getNomUrl(-1);
1372 if ($tab[$i][
'socid'] < 0) {
1375 if (!$tab[$i][
'socid']) {
1380 print
'<div class="tagtd">';
1381 if ($tab[$i][
'source'] ==
'internal') {
1382 if ($userstatic->fetch($tab[$i][
'id'])) {
1383 print $userstatic->getNomUrl(-1);
1386 if ($tab[$i][
'source'] ==
'external') {
1387 if ($contactstatic->fetch($tab[$i][
'id'])) {
1388 print $contactstatic->getNomUrl(-1);
1392 <div class="tagtd">' . $tab[$i][
'libelle'].
'</div>';
1394 print
'<div class="tagtd">';
1398 if (!empty($tab[$i][
'phone_perso'])) {
1400 print
'<br>'.dol_print_phone($tab[$i][
'phone_perso'],
'', 0, 0,
'AC_TEL').
'<br>';
1402 if (!empty($tab[$i][
'phone_mobile'])) {
1404 print
dol_print_phone($tab[$i][
'phone_mobile'],
'', 0, 0,
'AC_TEL').
'<br>';
1408 print
'<div class="tagtd center">';
1410 echo
'<a href="contact.php?track_id='.$object->track_id.
'&action=swapstatut&ligne='.$tab[$i][
'rowid'].
'">';
1413 if ($tab[$i][
'source'] ==
'internal') {
1414 $userstatic->id = $tab[$i][
'id'];
1415 $userstatic->lastname = $tab[$i][
'lastname'];
1416 $userstatic->firstname = $tab[$i][
'firstname'];
1417 echo $userstatic->LibStatut($tab[$i][
'statuscontact'], 3);
1419 if ($tab[$i][
'source'] ==
'external') {
1420 $contactstatic->id = $tab[$i][
'id'];
1421 $contactstatic->lastname = $tab[$i][
'lastname'];
1422 $contactstatic->firstname = $tab[$i][
'firstname'];
1423 echo $contactstatic->LibStatut($tab[$i][
'statuscontact'], 3);
1431 print
'</div><!-- tagtr -->';
1437 print
'</div><!-- contact list -->';
1441 print
'</div></div>';
1442 print
'<div class="clearboth"></div>';
1448 if ($action !=
'presend' && $action !=
'presend_addmessage' && $action !=
'editline') {
1449 print
'<div class="tabsAction">'.
"\n";
1450 $parameters = array();
1451 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
1456 if (empty($reshook)) {
1458 if (isset(
$object->status) &&
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage") {
1459 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend_addmessage&send_email=1&private_message=0&mode=init&token='.
newToken().
'&track_id='.
$object->track_id.
'#formmailbeforetitle',
'');
1463 if (isset(
$object->status) &&
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage") {
1464 print
dolGetButtonAction(
'', $langs->trans(
'TicketAddPrivateMessage'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend_addmessage&mode=init&token='.
newToken().
'&track_id='.
$object->track_id.
'#formmailbeforetitle',
'');
1470 print
dolGetButtonAction($langs->trans(
'UnableToCreateInterIfNoSocid'), $langs->trans(
'TicketAddIntervention'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1472 if (
$object->fk_soc > 0 && isset(
$object->status) &&
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ficheinter',
'creer')) {
1473 print
dolGetButtonAction(
'', $langs->trans(
'TicketAddIntervention'),
'default', DOL_URL_ROOT.
'/fichinter/card.php?action=create&token='.
newToken().
'&socid='.
$object->fk_soc.
'&origin=ticket_ticket&originid='.
$object->id,
'');
1477 if (isset(
$object->status) &&
$object->status >= 0 &&
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ticket',
'write')) {
1478 print
dolGetButtonAction(
'', $langs->trans(
'CloseTicket'),
'default', $_SERVER[
"PHP_SELF"].
'?action=close&token='.
newToken().
'&track_id='.
$object->track_id,
'');
1482 if (isset(
$object->status) &&
$object->status > 0 &&
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ticket',
'write')) {
1483 print
dolGetButtonAction(
'', $langs->trans(
'AbandonTicket'),
'default', $_SERVER[
"PHP_SELF"].
'?action=abandon&token='.
newToken().
'&track_id='.
$object->track_id,
'');
1487 if (!$user->socid && (isset(
$object->status) && (
$object->status == Ticket::STATUS_CLOSED ||
$object->status == Ticket::STATUS_CANCELED)) && !$user->socid) {
1492 if ($permissiontoedit) {
1493 print
dolGetButtonAction(
'', $langs->trans(
'Modify'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=edit&token='.
newToken(),
'', $permissiontoedit);
1497 if ($user->hasRight(
'ticket',
'delete') && !$user->socid) {
1501 print
'</div>'.
"\n";
1505 if (
GETPOST(
'modelselected')) {
1506 $action =
'presend';
1509 if (GETPOSTISSET(
'actionbis') && $action ==
'presend') {
1510 $action =
'presend_addmessage';
1514 if ($action ==
'presend' || $action ==
'presend_addmessage') {
1519 $outputlangs = $langs;
1522 $newlang =
GETPOST(
'lang_id',
'aZ09');
1524 $newlang =
$object->thirdparty->default_lang;
1526 if (!empty($newlang)) {
1527 $outputlangs =
new Translate(
"", $conf);
1528 $outputlangs->setDefaultLang($newlang);
1531 $arrayoffamiliestoexclude = array(
'objectamount');
1533 $action =
'add_message';
1534 $modelmail =
'ticket_send';
1537 $morehtmlright =
'';
1541 $morehtmlright .= $form->textwithpicto(
'<span class="opacitymedium">'.$langs->trans(
"TicketMessageSubstitutionReplacedByGenericValues").
'</span>', $help, 1,
'helpclickable',
'', 0, 3,
'helpsubstitution');
1545 print
'<div id="formmailbeforetitle" name="formmailbeforetitle"></div>';
1547 print
load_fiche_titre($langs->trans(
'TicketAddMessage'), $morehtmlright,
'messages@ticket');
1553 $formticket->action = $action;
1554 $formticket->track_id =
$object->track_id;
1555 $formticket->ref =
$object->ref;
1556 $formticket->id =
$object->id;
1557 $formticket->trackid =
'tic'.$object->id;
1559 $formticket->withfile = 2;
1560 $formticket->withcancel = 1;
1561 $formticket->param = array(
'fk_user_create' => $user->id);
1562 $formticket->param[
'langsmodels'] = (empty($newlang) ? $langs->defaultlang : $newlang);
1565 $formticket->param[
'models'] = $modelmail;
1566 $formticket->param[
'models_id'] =
GETPOSTINT(
'modelmailselected');
1568 $formticket->param[
'returnurl'] = $_SERVER[
"PHP_SELF"].
'?track_id='.
$object->track_id;
1570 $formticket->withsubstit = 1;
1571 $formticket->substit = $substitutionarray;
1572 $formticket->backtopage = $backtopage;
1574 $formticket->showMessageForm(
'100%');
1580 $param =
'&id='.$object->id;
1581 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1582 $param .=
'&contextpage='.$contextpage;
1584 if ($limit > 0 && $limit != $conf->liste_limit) {
1585 $param .=
'&limit='.$limit;
1588 $param .=
'&actioncode='.urlencode($actioncode);
1590 if ($search_agenda_label) {
1591 $param .=
'&search_agenda_label='.urlencode($search_agenda_label);
1594 $morehtmlright =
'';
1596 $messagingUrl = DOL_URL_ROOT.
'/ticket/agenda.php?track_id='.
$object->track_id;
1597 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'MessageListViewType'),
'',
'fa fa-bars imgforviewmode', $messagingUrl,
'', 1);
1600 $btnstatus =
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage" && $action !=
"add_message";
1601 $url =
'card.php?track_id='.$object->track_id.
'&action=presend_addmessage&mode=init';
1602 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'TicketAddMessage'),
'',
'fa fa-comment-dots', $url,
'add-new-ticket-title-button', (
int) $btnstatus);
1605 $btnstatus =
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage" && $action !=
"add_message";
1606 $url =
dol_buildpath(
'/comm/action/card.php', 1).
'?action=create&datep='.date(
'YmdHi').
'&origin=ticket&originid='.
$object->id.
'&projectid='.
$object->fk_project.
'&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?track_id='.
$object->track_id);
1607 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'AddAction'),
'',
'fa fa-plus-circle', $url,
'add-new-ticket-even-button', (
int) $btnstatus);
1609 print_barre_liste($langs->trans(
"ActionsOnTicket"), 0, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder,
'', 0, -1,
'', 0, $morehtmlright,
'', 0, 1, 1);
1613 $filters[
'search_agenda_label'] = $search_agenda_label;
1614 $filters[
'search_rowid'] = $search_rowid;
1616 show_actions_messaging($conf, $langs, $db,
$object,
null, 0, $actioncode,
'', $filters, $sortfield, $sortorder);
1619 if ($action !=
'presend' && $action !=
'presend_addmessage' && $action !=
'add_message') {
1620 print
'<div class="fichecenter"><div class="fichehalfleft">';
1621 print
'<a name="builddoc"></a>';
1627 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
1628 $genallowed = $permissiontoadd;
1629 $delallowed = $permissiontodelete;
1633 $codelang =
$object->thirdparty->default_lang;
1636 print $formfile->showdocuments(
'ticket', $filename, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $codelang);
1639 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'ticket'), 1);
1640 $linktoelem = $tmparray[
'linktoelem'];
1641 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
1642 print $htmltoenteralink;
1644 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
1647 print
'<br><!-- Link to public interface -->'.
"\n";
1652 print
'<div class="fichehalfright">';
1656 $morehtmlcenter =
'<div class="nowraponall">';
1657 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/ticket/messaging.php?id='.
$object->id);
1658 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullList'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/ticket/agenda.php?id='.
$object->id);
1659 $morehtmlcenter .=
'</div>';
1662 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1664 $somethingshown = $formactions->showactions(
$object,
'ticket', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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.
Class Actions of the module ticket.
Class to manage categories.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
societe_prepare_head(Societe $object)
Return array of tabs to used on pages for third parties cards.
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
show_actions_messaging($conf, $langs, $db, $filterobj, $objcon=null, $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
Show html area with actions in messaging format.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
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_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='paddingright')
Format phone numbers according to country.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
roundUpToNextMultiple($n, $x=5)
Round to next multiple.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
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.
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dolPrintLabel($s)
Return a string label (so on 1 line only and that should not contains any HTML) ready to be output on...
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
Class to generate the form for creating a new ticket.
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
showDirectPublicLink($object)
Return string with full Url.
ticket_prepare_head($object)
Build tabs for a Ticket object.