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';
64$langs->loadLangs(array(
"companies",
"other",
"ticket"));
69$track_id =
GETPOST(
'track_id',
'alpha', 3);
73$notifyTiers =
GETPOST(
"notify_tiers_at_create",
'alpha');
75$action =
GETPOST(
'action',
'aZ09');
76$cancel =
GETPOST(
'cancel',
'alpha');
77$backtopage =
GETPOST(
'backtopage',
'alpha');
78$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
81$sortfield =
GETPOST(
'sortfield',
'aZ09comma') ?
GETPOST(
'sortfield',
'aZ09comma') :
"a.datep";
82$sortorder =
GETPOST(
'sortorder',
'aZ09comma') ?
GETPOST(
'sortorder',
'aZ09comma') :
"desc";
83$search_rowid =
GETPOST(
'search_rowid');
84$search_agenda_label =
GETPOST(
'search_agenda_label');
86if (
GETPOST(
'actioncode',
'array')) {
87 $actioncode =
GETPOST(
'actioncode',
'array', 3);
88 if (!count($actioncode)) {
97$hookmanager->initHooks(array(
'ticketcard',
'globalcard'));
103$extrafields->fetch_name_optionals_label(
$object->table_element);
105$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
108$search_all =
GETPOST(
"search_all",
'alpha');
110foreach (
$object->fields as $key => $val) {
111 if (
GETPOST(
'search_'.$key,
'alpha')) {
112 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
116if (empty($action) && empty($id) && empty($ref)) {
121if (
GETPOST(
'modelselected',
'alpha')) {
127if ($id || $track_id || $ref) {
128 $res =
$object->fetch($id, $ref, $track_id);
140$url_page_current = DOL_URL_ROOT.
'/ticket/card.php';
143if ($user->socid > 0) {
144 $socid = $user->socid;
148$triggermodname =
'TICKET_MODIFY';
151$permissiontoread = $user->hasRight(
'ticket',
'read');
152$permissiontoadd = $user->hasRight(
'ticket',
'write');
153$permissiontodelete = $user->hasRight(
'ticket',
'delete');
155$upload_dir =
$conf->ticket->dir_output;
163$parameters = array();
164$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
170if (empty($reshook)) {
172 if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
174 $search_agenda_label =
'';
177 $backurlforlist = DOL_URL_ROOT .
'/ticket/list.php';
179 if (empty($backtopage) || ($cancel && empty($id))) {
180 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
181 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
182 $backtopage = $backurlforlist;
184 $backtopage = DOL_URL_ROOT .
'/ticket/card.php?id=' . ((!empty($id) &&
$id > 0) ? $id :
'__ID__');
190 if (!empty($backtopageforcancel)) {
191 header(
"Location: " . $backtopageforcancel);
193 } elseif (!empty($backtopage)) {
194 header(
"Location: " . $backtopage);
200 if ((($action ==
'add' &&
GETPOST(
'save',
'alpha')) || ($action ==
'update' &&
$object->status < Ticket::STATUS_CLOSED)) && $permissiontoadd) {
201 $ifErrorAction = ($action ==
'add' ?
'create' :
'edit');
202 if ($action ==
'add') {
208 'ref' => [
'check' =>
'alpha',
'langs' =>
'Ref'],
209 'type_code' => [
'check' =>
'alpha',
'langs' =>
'TicketTypeRequest'],
210 'category_code' => [
'check' =>
'alpha',
'langs' =>
'TicketCategory'],
211 'severity_code' => [
'check' =>
'alpha',
'langs' =>
'TicketSeverity'],
212 'subject' => [
'check' =>
'alphanohtml',
'langs' =>
'Subject'],
213 'message' => [
'check' =>
'restricthtml',
'langs' =>
'Message']
218 if (!empty($error)) {
219 $action = $ifErrorAction;
222 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
226 $getRef =
GETPOST(
'ref',
'alpha');
228 if (!empty($getRef)) {
229 $isExistingRef =
$object->checkExistingRef($action, $getRef);
231 $isExistingRef =
true;
236 if ($isExistingRef) {
237 if ($action ==
'update') {
241 } elseif ($action ==
'add') {
246 if (!empty($getRef)) {
259 $fk_user_assign =
GETPOSTINT(
'fk_user_assign');
263 if ($fk_user_assign > 0) {
264 $object->fk_user_assign = $fk_user_assign;
265 $object->status = $object::STATUS_ASSIGNED;
268 if ($action ==
'add') {
270 $object->type_label = $langs->trans($langs->getLabelFromKey($db,
$object->type_code,
'c_ticket_type',
'code',
'label'));
271 $object->category_label = $langs->trans($langs->getLabelFromKey($db,
$object->category_code,
'c_ticket_category',
'code',
'label'));
272 $object->severity_label = $langs->trans($langs->getLabelFromKey($db,
$object->severity_code,
'c_ticket_severity',
'code',
'label'));
273 $object->fk_user_create = $user->id;
274 $object->email_from = $user->email;
276 $notifyTiers =
GETPOST(
"notify_tiers_at_create",
'alpha');
277 $object->notify_tiers_at_create = empty($notifyTiers) ? 0 : 1;
287 $action = $ifErrorAction;
292 $categories =
GETPOST(
'categories',
'array');
293 $object->setCategories($categories);
296 if ($action ==
'add') {
300 $type_contact =
GETPOST(
"type",
'alpha');
302 if ($contactid > 0 && $type_contact) {
304 $result =
$object->add_contact($contactid, $typeid,
'external');
308 if (
GETPOST(
'origin',
'alpha') ==
'projet') {
314 if ($projectid > 0) {
315 $object->setProject($projectid);
319 if (
getDolGlobalString(
'TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND') && $user->hasRight(
'ticket',
'write')) {
320 if (!
$object->markAsRead($user) > 0) {
326 if ((empty($fk_user_assign) &&
getDolGlobalInt(
'TICKET_AUTO_ASSIGN_USER_CREATE') == 1) || (
getDolGlobalInt(
'TICKET_AUTO_ASSIGN_USER_CREATE') == 2)) {
327 $result =
$object->assignUser($user, $user->id, 1);
328 $object->add_contact($user->id,
"SUPPORTTEC",
'internal');
334 $object->copyFilesForTicket(
'');
340 if (!empty($backtopage)) {
344 $url =
'card.php?track_id=' . urlencode(
$object->track_id);
347 $url =
'card.php?track_id=' . urlencode(
$object->track_id);
350 header(
"Location: " . $url);
357 $action = $ifErrorAction;
362 if ($action ==
"set_read" && $permissiontoadd) {
365 if (
$object->markAsRead($user) > 0) {
368 header(
"Location: card.php?track_id=" .
$object->track_id);
377 if ($action ==
"assign_user" &&
GETPOST(
'btn_assign_user',
'alpha') && $permissiontoadd) {
379 $useroriginassign =
$object->fk_user_assign;
389 $ret =
$object->assignUser($user, $usertoassign);
397 if ($useroriginassign > 0) {
398 $internal_contacts =
$object->listeContact(-1,
'internal', 0,
'SUPPORTTEC');
399 foreach ($internal_contacts as $key => $contact) {
400 if ($contact[
'id'] !== $usertoassign) {
401 $result =
$object->delete_contact($contact[
'rowid']);
410 if ($usertoassign > 0 && $usertoassign !== $useroriginassign) {
411 $result =
$object->add_contact($usertoassign,
"SUPPORTTEC",
'internal', $notrigger = 0);
421 $object->fetch_user($usertoassign);
424 header(
"Location: card.php?track_id=" .
$object->track_id);
434 if ($action ==
'add_message' && GETPOSTISSET(
'btn_add_message') && $permissiontoread) {
438 if (!empty($backtopage)) {
441 $url =
'card.php?track_id=' . urlencode(
$object->track_id);
444 header(
"Location: " . $url);
452 if (($action ==
"confirm_close" || $action ==
"confirm_abandon") &&
GETPOST(
'confirm',
'alpha') ==
'yes' && $permissiontoadd) {
455 if (
$object->close($user, ($action ==
"confirm_abandon" ? 1 : 0))) {
458 $url =
'card.php?track_id=' .
GETPOST(
'track_id',
'alpha');
459 header(
"Location: " . $url);
467 if ($action ==
"confirm_public_close" &&
GETPOST(
'confirm',
'alpha') ==
'yes' && $permissiontoadd) {
469 if ($_SESSION[
'email_customer'] ==
$object->origin_email || $_SESSION[
'email_customer'] ==
$object->thirdparty->email) {
474 setEventMessages(
'<div class="confirm">' . $langs->trans(
'TicketMarkedAsClosed') .
'</div>',
null,
'mesgs');
476 $url =
'card.php?track_id=' .
GETPOST(
'track_id',
'alpha');
477 header(
"Location: " . $url);
485 if ($action ==
'confirm_delete_ticket' &&
GETPOST(
'confirm',
'alpha') ==
"yes" && $permissiontodelete) {
487 if (
$object->delete($user) > 0) {
488 setEventMessages(
'<div class="confirm">' . $langs->trans(
'TicketDeletedSuccess') .
'</div>',
null,
'mesgs');
489 header(
"Location: " . DOL_URL_ROOT .
"/ticket/list.php");
492 $langs->load(
"errors");
493 $mesg =
'<div class="error">' . $langs->trans(
$object->error) .
'</div>';
500 if ($action ==
'set_thirdparty' && $user->hasRight(
'ticket',
'write')) {
503 $url = $_SERVER[
"PHP_SELF"] .
'?track_id=' .
GETPOST(
'track_id',
'alpha');
504 header(
"Location: " . $url);
510 if ($action ==
'set_progression' && $user->hasRight(
'ticket',
'write')) {
514 $url =
'card.php?track_id=' .
$object->track_id;
515 header(
"Location: " . $url);
521 if ($action ==
'set_categories' && $user->hasRight(
'ticket',
'write')) {
525 $url =
'card.php?track_id=' .
$object->track_id;
526 header(
"Location: " . $url);
532 if ($action ==
'setsubject' && $user->hasRight(
'ticket',
'write')) {
534 if ($action ==
'setsubject') {
538 if ($action ==
'setsubject' && empty(
$object->subject)) {
540 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"Subject")),
null,
'errors');
544 if (!
$object->update($user) >= 0) {
550 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?track_id=" .
$object->track_id);
555 if ($action ==
'confirm_reopen' && $user->hasRight(
'ticket',
'manage') && !
GETPOST(
'cancel')) {
558 if (
$object->status == Ticket::STATUS_CLOSED ||
$object->status == Ticket::STATUS_CANCELED) {
559 if (
$object->fk_user_assign !=
null) {
560 $res =
$object->setStatut(Ticket::STATUS_ASSIGNED,
null,
'',
'TICKET_MODIFY');
562 $res =
$object->setStatut(Ticket::STATUS_NOT_READ,
null,
'',
'TICKET_MODIFY');
565 $url =
'card.php?track_id=' .
$object->track_id;
566 header(
"Location: " . $url);
574 } elseif ($action ==
'classin' && $permissiontoadd) {
577 $object->setProject($projectid);
578 $url =
'card.php?track_id=' .
$object->track_id;
579 header(
"Location: " . $url);
582 } elseif ($action ==
'setcontract' && $permissiontoadd) {
586 $url =
'card.php?track_id=' .
$object->track_id;
587 header(
"Location: " . $url);
590 } elseif ($action ==
"set_message" && $user->hasRight(
'ticket',
'manage')) {
594 $fieldtomodify =
GETPOST(
'message_initial',
'restricthtml');
596 $object->message = $fieldtomodify;
603 setEventMessages($langs->trans(
'TicketMessageSuccesfullyUpdated'),
null,
'mesgs');
611 } elseif ($action ==
'confirm_set_status' && $permissiontoadd && !
GETPOST(
'cancel')) {
616 $res =
$object->setStatut($new_status);
618 $url =
'card.php?track_id=' .
$object->track_id;
619 header(
"Location: " . $url);
629 if ($action ==
"update_extras" && $permissiontoadd) {
632 $ret = $extrafields->setOptionalsFromPost(
null,
$object,
GETPOST(
'attribute',
'restricthtml'));
638 $result =
$object->insertExtraFields(empty($triggermodname) ?
'' : $triggermodname, $user);
646 $action =
'edit_extras';
653 if ($action ==
"change_property" &&
GETPOST(
'btn_update_ticket_prop',
'alpha') && $permissiontoadd) {
657 $object->severity_code =
GETPOST(
'update_value_severity',
'aZ09');
658 $object->category_code =
GETPOST(
'update_value_category',
'aZ09');
671 $permissiondellink = $user->hasRight(
'ticket',
'write');
672 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
675 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
678 $triggersendname =
'TICKET_SENTBYMAIL';
680 $autocopy =
'MAIN_MAIL_AUTOCOPY_TICKET_TO';
681 $trackid =
'tic' .
$object->id;
682 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
685 if (GETPOSTISSET(
'actionbis') && $action ==
'presend') {
686 $action =
'presend_addmessage';
695$userstat =
new User($db);
696$form =
new Form($db);
699if (isModEnabled(
'project')) {
703$help_url =
'EN:Module_Ticket|FR:DocumentationModuleTicket';
705$title = $actionobject->getTitle($action);
707llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-ticket page-card');
709if ($action ==
'create' || $action ==
'presend') {
710 if (empty($permissiontoadd)) {
718 $formticket->trackid =
'';
719 $formticket->withfromsocid = $socid ? $socid : $user->socid;
720 $formticket->withfromcontactid = $contactid ? $contactid :
'';
721 $formticket->withtitletopic = 1;
722 $formticket->withnotifytiersatcreate = ($notifyTiers ? 1 : (
getDolGlobalString(
'TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION') ? 1 : 0));
723 $formticket->withusercreate = 0;
724 $formticket->withref = 1;
725 $formticket->fk_user_create = $user->id;
726 $formticket->withfile = 2;
727 $formticket->withextrafields = 1;
728 $formticket->param = array(
'origin' =>
GETPOST(
'origin'),
'originid' =>
GETPOST(
'originid'));
730 $formticket->withcancel = 1;
733 if (
GETPOST(
"mode",
"aZ09") ==
'init') {
734 $formticket->clear_attached_files();
737 $formticket->showForm(1,
'create', 0,
null, $action,
$object);
740} elseif ($action ==
'edit' && $user->rights->ticket->write &&
$object->status < Ticket::STATUS_CLOSED) {
741 if (empty($permissiontoadd)) {
751 $formticket->trackid =
$object->track_id;
752 $formticket->withfromsocid =
$object->socid;
753 $formticket->withtitletopic = 1;
755 $formticket->withnotifytiersatcreate = 0;
756 $formticket->withusercreate = 0;
757 $formticket->withref = 1;
758 $formticket->fk_user_create = $user->id;
759 $formticket->withfile = 0;
760 $formticket->action =
'update';
761 $formticket->withextrafields = 1;
762 $formticket->param = array(
'origin' =>
GETPOST(
'origin'),
'originid' =>
GETPOST(
'originid'));
764 $formticket->withcancel = 1;
766 $formticket->showForm(0,
'edit', 0,
null, $action,
$object);
769} elseif (empty($action) || in_array($action, [
'builddoc',
'view',
'addlink',
'addlinkbyref',
'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'])) {
770 if (!empty($res) && $res > 0) {
772 if (!$user->socid && (
getDolGlobalString(
'TICKET_LIMIT_VIEW_ASSIGNED_ONLY') &&
$object->fk_user_assign != $user->id) && !$user->hasRight(
'ticket',
'manage')) {
779 if ($action ==
'close') {
780 $thirdparty_contacts =
$object->getInfosTicketExternalContact(1);
781 $contacts_select = array(
782 '-2' => $langs->trans(
'TicketNotifyAllTiersAtClose'),
783 '-3' => $langs->trans(
'TicketNotNotifyTiersAtClose')
785 foreach ($thirdparty_contacts as $thirdparty_contact) {
786 $contacts_select[$thirdparty_contact[
'id']] = $thirdparty_contact[
'civility'] .
' ' . $thirdparty_contact[
'lastname'] .
' ' . $thirdparty_contact[
'firstname'];
791 $formquestion = array(
793 'name' =>
'contactid',
795 'label' => $langs->trans(
'NotifyThirdpartyOnTicketClosing'),
796 'values' => $contacts_select,
797 'default' => $default
801 $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"CloseATicket"), $langs->trans(
"ConfirmCloseAticket"),
"confirm_close", $formquestion,
'', 1);
804 if ($action ==
'abandon') {
805 $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"AbandonTicket"), $langs->trans(
"ConfirmAbandonTicket"),
"confirm_abandon",
'',
'', 1);
808 if ($action ==
'delete') {
809 $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"Delete"), $langs->trans(
"ConfirmDeleteTicket"),
"confirm_delete_ticket",
'',
'', 1);
812 if ($action ==
'reopen') {
813 $formconfirm = $form->formconfirm($url_page_current.
'?track_id='.
$object->track_id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenTicket'),
'confirm_reopen',
'',
'', 1);
816 if ($action ==
'set_status') {
819 $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);
823 $parameters = array(
'formConfirm' => $formconfirm);
824 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
825 if (empty($reshook)) {
826 $formconfirm .= $hookmanager->resPrint;
827 } elseif ($reshook > 0) {
828 $formconfirm = $hookmanager->resPrint;
835 if ($projectid > 0) {
836 $projectstat =
new Project($db);
837 if ($projectstat->fetch($projectid) > 0) {
838 $projectstat->fetch_thirdparty();
842 $userWrite = $projectstat->restrictedProjectArea($user,
'write');
848 print
dol_get_fiche_head($head,
'ticket', $langs->trans(
"Project"), 0, ($projectstat->public ?
'projectpub' :
'project'));
850 print
'<table class="border centpercent">';
852 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
855 print
'<tr><td width="30%">'.$langs->trans(
'Ref').
'</td><td colspan="3">';
857 if (!$user->hasRight(
'projet',
'all',
'lire')) {
858 $objectsListId = $projectstat->getProjectsAuthorizedForUser($user, $mine, 0);
859 $projectstat->next_prev_filter =
"rowid:IN:".$db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
861 print $form->showrefnav($projectstat,
'ref', $linkback, 1,
'ref',
'ref',
'');
865 print
'<tr><td>'.$langs->trans(
"Label").
'</td><td>'.$projectstat->title.
'</td></tr>';
868 print
"<tr><td>".$langs->trans(
"ThirdParty").
"</td>";
869 print
'<td colspan="3">';
870 if ($projectstat->thirdparty->id > 0) {
871 print $projectstat->thirdparty->getNomUrl(1);
879 print
'<tr><td>'.$langs->trans(
"Visibility").
'</td><td>';
880 if ($projectstat->public) {
881 print $langs->trans(
'SharedProject');
883 print $langs->trans(
'PrivateProject');
889 print
'<tr><td>'.$langs->trans(
"Status").
'</td><td>'.$projectstat->getLibStatut(4).
'</td></tr>';
895 print
"ErrorRecordNotFound";
897 } elseif ($socid > 0) {
903 dol_banner_tab(
$object->thirdparty,
'socid',
'', ($user->socid ? 0 : 1),
'rowid',
'nom');
909 $object->next_prev_filter =
"te.fk_user_assign:=:".((int) $user->id);
910 } elseif ($user->socid > 0) {
911 $object->next_prev_filter =
"te.fk_soc:=:".((int) $user->socid);
918 $morehtmlref =
'<div class="refidno">';
920 if ($user->hasRight(
'ticket',
'write') && !$user->socid) {
921 $morehtmlref .=
'<a class="editfielda" href="'.$url_page_current.
'?action=editsubject&token='.
newToken().
'&track_id='.
$object->track_id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetTitle'), 0).
'</a> ';
923 if ($action !=
'editsubject') {
926 $morehtmlref .=
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'">';
927 $morehtmlref .=
'<input type="hidden" name="action" value="setsubject">';
928 $morehtmlref .=
'<input type="hidden" name="token" value="'.newToken().
'">';
929 $morehtmlref .=
'<input type="hidden" name="id" value="'.$object->id.
'">';
930 $morehtmlref .=
'<input type="text" class="minwidth300" id="subject" name="subject" value="'.$object->subject.
'" autofocus="">';
931 $morehtmlref .=
'<input type="submit" class="smallpaddingimp button valignmiddle" name="modify" value="'.$langs->trans(
"Modify").
'">';
932 $morehtmlref .=
'<input type="submit" class="smallpaddingimp button button-cancel vlignmiddle" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
933 $morehtmlref .=
'</form>';
938 if (
$object->fk_user_create > 0) {
939 $morehtmlref .=
'<br>'.$langs->trans(
"CreatedBy").
' : ';
941 $fuser =
new User($db);
942 $fuser->fetch(
$object->fk_user_create);
943 $morehtmlref .= $fuser->getNomUrl(-1);
947 $createdfrompublicticket = 0;
948 $createdfromemailcollector = 0;
949 if (!empty(
$object->origin_email) && (empty(
$object->email_msgid) || preg_match(
'/dolibarr\-tic\d+/',
$object->email_msgid))) {
951 $createdfrompublicticket = 1;
952 } elseif (!empty(
$object->email_msgid)) {
954 $createdfromemailcollector = 1;
958 if ($createdfrompublicticket) {
959 $htmltooptip = $langs->trans(
"OriginEmail").
': '.
$object->origin_email;
960 $htmltooptip .=
'<br>'.$langs->trans(
"IP").
': '.
$object->ip;
961 $morehtmlref .= ($createdbyshown ?
' - ' :
'<br>');
962 $morehtmlref .= ($createdbyshown ?
'' : $langs->trans(
"CreatedBy").
' : ');
963 $morehtmlref .=
img_picto(
'',
'email',
'class="paddingrightonly"');
964 $morehtmlref .=
dol_escape_htmltag(
$object->origin_email).
' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans(
"CreatedByPublicPortal"), $htmltooptip, 1,
'help',
'', 0, 3,
'tooltip').
'</small>';
965 } elseif ($createdfromemailcollector) {
966 $langs->load(
"mails");
967 $htmltooltip = $langs->trans(
"EmailMsgID").
': '.
$object->email_msgid;
968 $htmltooltip .=
'<br>'.$langs->trans(
"EmailDate").
': '.
dol_print_date(
$object->email_date,
'dayhour');
969 $htmltooltip .=
'<br>'.$langs->trans(
"MailFrom").
': '.
$object->origin_email;
970 $htmltooltip .=
'<br>'.$langs->trans(
"MailReply").
': '.
$object->origin_replyto;
971 $htmltooltip .=
'<br>'.$langs->trans(
"MailReferences").
': '.
$object->origin_references;
972 $morehtmlref .= ($createdbyshown ?
' - ' :
'<br>');
973 $morehtmlref .= ($createdbyshown ?
'' : $langs->trans(
"CreatedBy").
' : ');
974 $morehtmlref .=
img_picto(
'',
'email',
'class="paddingrightonly"');
975 $morehtmlref .=
dol_escape_htmltag(
$object->origin_email).
' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans(
"CreatedByEmailCollector"), $htmltooltip, 1,
'help',
'', 0, 3,
'tooltip').
'</small>';
978 $permissiontoedit =
$object->status < 8 && !$user->socid && $user->hasRight(
'ticket',
'write');
982 if (isModEnabled(
"societe")) {
983 $morehtmlref .=
'<br>';
984 $morehtmlref .=
img_picto($langs->trans(
"ThirdParty"),
'company',
'class="pictofixedwidth"');
985 if ($action !=
'editcustomer' && $permissiontoedit) {
986 $morehtmlref .=
'<a class="editfielda" href="'.$url_page_current.
'?action=editcustomer&token='.
newToken().
'&track_id='.
$object->track_id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetThirdParty'), 0).
'</a> ';
988 $morehtmlref .= $form->form_thirdparty($url_page_current.
'?track_id='.
$object->track_id,
$object->socid, $action ==
'editcustomer' ?
'editcustomer' :
'none',
'', 1, 0, 0, array(), 1);
990 $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>';
995 if (isModEnabled(
'project')) {
996 $langs->load(
"projects");
997 $morehtmlref .=
'<br>';
998 if ($permissiontoedit) {
1000 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project'.((is_object(
$object->project) &&
$object->project->public) ?
'pub' :
''),
'class="pictofixedwidth"');
1001 if ($action !=
'classify') {
1002 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1004 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1006 if (!empty(
$object->fk_project)) {
1008 $morehtmlref .=
$object->project->getNomUrl(1);
1009 if (
$object->project->title) {
1010 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag(
$object->project->title).
'</span>';
1019 if (isModEnabled(
'contract')) {
1020 $langs->load(
'contracts');
1021 $morehtmlref .=
'<br>';
1022 if ($permissiontoedit) {
1023 $morehtmlref .=
img_picto($langs->trans(
"Contract"),
'contract',
'class="pictofixedwidth"');
1024 if ($action ==
'edit_contrat') {
1026 $morehtmlref .= $formcontract->formSelectContract($_SERVER[
"PHP_SELF"].
'?id='.
$object->id,
$object->socid,
$object->fk_contract,
'contratid', 0, 1, 1, 1);
1028 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=edit_contrat&token='.
newToken().
'&id='.
$object->id.
'">';
1029 $morehtmlref .=
img_edit($langs->trans(
'SetContract'));
1030 $morehtmlref .=
'</a>';
1033 if (!empty(
$object->fk_contract)) {
1034 $contratstatic =
new Contrat($db);
1035 $contratstatic->fetch(
$object->fk_contract);
1037 $morehtmlref .= $contratstatic->getNomUrl(0, 0, 1);
1043 $morehtmlref .=
'</div>';
1045 $linkback =
'<a href="'.DOL_URL_ROOT.
'/ticket/list.php?restore_lastsearch_values=1"><strong>'.$langs->trans(
"BackToList").
'</strong></a> ';
1047 dol_banner_tab(
$object,
'ref', $linkback, ($user->socid ? 0 : 1),
'ref',
'ref', $morehtmlref);
1049 print
'<div class="fichecenter">';
1050 print
'<div class="fichehalfleft">';
1051 print
'<div class="underbanner clearboth"></div>';
1053 print
'<table class="border tableforfield centpercent">';
1056 print
'<tr><td class="titlefield">'.$langs->trans(
"TicketTrackId").
'</td><td>';
1057 if (!empty(
$object->track_id)) {
1060 print $form->showrefnav(
$object,
'id', $linkback, 1,
'rowid',
'track_id');
1065 print $langs->trans(
'None');
1079 print
'<tr><td>'.$langs->trans(
"DateCreation").
'</td><td>';
1102 print
'<tr><td>'.$langs->trans(
"TicketReadOn").
'</td><td>';
1103 if (!empty(
$object->date_read)) {
1111 print
'<tr><td>'.$langs->trans(
"TicketCloseOn").
'</td><td>';
1112 if (!empty(
$object->date_close)) {
1119 print
'<table class="nobordernopadding" width="100%"><tr><td class="nowrap">';
1120 print $langs->trans(
"AssignedTo");
1121 if (isset(
$object->status) &&
$object->status < $object::STATUS_CLOSED &&
GETPOST(
'set',
'alpha') !=
"assign_ticket" && $user->hasRight(
'ticket',
'manage')) {
1122 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>';
1124 print
'</td></tr></table>';
1126 if (
GETPOST(
'set',
'alpha') !=
"assign_ticket" &&
$object->fk_user_assign > 0) {
1127 $userstat->fetch(
$object->fk_user_assign);
1128 print $userstat->getNomUrl(-1);
1132 if (
GETPOST(
'set',
'alpha') ==
"assign_ticket" &&
$object->status < 8 && !$user->socid && $user->hasRight(
'ticket',
'write')) {
1133 print
'<form method="post" name="ticket" enctype="multipart/form-data" action="'.$url_page_current.
'">';
1134 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1135 print
'<input type="hidden" name="action" value="assign_user">';
1136 print
'<input type="hidden" name="track_id" value="'.$object->track_id.
'">';
1138 print $form->select_dolusers(empty(
$object->fk_user_assign) ? $user->id :
$object->fk_user_assign,
'fk_user_assign', 1);
1139 print
' <input type="submit" class="button smallpaddingimp" name="btn_assign_user" value="'.$langs->trans(
"Validate").
'" />';
1146 print
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
1147 print $langs->trans(
'Progression').
'</td><td class="left">';
1149 if ($action !=
'progression' && isset(
$object->status) &&
$object->status < $object::STATUS_CLOSED && !$user->socid) {
1150 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>';
1152 print
'</tr></table>';
1154 if ($user->hasRight(
'ticket',
'write') && $action ==
'progression') {
1155 print
'<form action="'.$url_page_current.
'" method="post">';
1156 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1157 print
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
1158 print
'<input type="hidden" name="action" value="set_progression">';
1159 print
'<input type="text" class="flat width75" name="progress" value="'.$object->progress.
'">';
1160 print
' <input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
1169 if (isModEnabled(
'intervention')) {
1171 $num = count(
$object->linkedObjects);
1175 foreach (
$object->linkedObjects as $objecttype => $objects) {
1176 if ($objecttype ==
"fichinter") {
1177 '@phan-var-force Fichinter[] $objects';
1178 foreach ($objects as $fichinter) {
1181 $timing += $fichinter->duration;
1187 print $form->textwithpicto($langs->trans(
"TicketDurationAuto"), $langs->trans(
"TicketDurationAutoInfos"), 1);
1194 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1200 print
'</div><div class="fichehalfright">';
1203 print
'<form method="post" name="formticketproperties" action="'.$url_page_current.
'">';
1204 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1205 print
'<input type="hidden" name="action" value="change_property">';
1206 print
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
1207 print
'<input type="hidden" name="trackid" value="'.$trackid.
'">';
1210 print
'<div class="div-table-responsive-no-min">';
1211 print
'<table class="border tableforfield centpercent margintable bordertopimp">';
1212 print
'<tr class="liste_titre">';
1214 print $langs->trans(
'TicketProperties');
1217 if (
GETPOST(
'set',
'alpha') ==
'properties' && $user->hasRight(
'ticket',
'write')) {
1218 print
'<input type="submit" class="button smallpaddingimp" name="btn_update_ticket_prop" value="'.$langs->trans(
"Modify").
'" />';
1221 if (isset(
$object->status) && (
$object->status < $object::STATUS_NEED_MORE_INFO || !
getDolGlobalInt(
'TICKET_DISALLOW_CLASSIFICATION_MODIFICATION_EVEN_IF_CLOSED')) && $user->hasRight(
'ticket',
'write')) {
1222 print
' <a class="editfielda" href="card.php?track_id='.$object->track_id.
'&set=properties">'.
img_edit($langs->trans(
'Modify')).
'</a>';
1228 if (
GETPOST(
'set',
'alpha') ==
'properties' && $user->hasRight(
'ticket',
'write')) {
1231 print
'<td class="titlefield">';
1232 print $langs->trans(
'Type');
1234 $formticket->selectTypesTickets(
$object->type_code,
'update_value_type',
'', 2);
1240 print $langs->trans(
'TicketCategory');
1242 $formticket->selectGroupTickets(
$object->category_code,
'update_value_category',
'', 2, 0, 0, 0,
'maxwidth500 widthcentpercentminusxx');
1248 print $langs->trans(
'TicketSeverity');
1250 $formticket->selectSeveritiesTickets(
$object->severity_code,
'update_value_severity',
'', 2);
1255 print
'<tr><td class="titlefield">'.$langs->trans(
"Type").
'</td><td>';
1256 if (!empty(
$object->type_code)) {
1257 print $langs->getLabelFromKey($db,
'TicketTypeShort'.
$object->type_code,
'c_ticket_type',
'code',
'label',
$object->type_code);
1262 if (!empty(
$object->category_code)) {
1263 $s = $langs->getLabelFromKey($db,
'TicketCategoryShort'.
$object->category_code,
'c_ticket_category',
'code',
'label',
$object->category_code);
1265 print
'<tr><td>'.$langs->trans(
"TicketCategory").
'</td><td class="tdoverflowmax200" title="'.
dol_escape_htmltag($s).
'">';
1269 print
'<tr><td>'.$langs->trans(
"TicketSeverity").
'</td><td>';
1270 if (!empty(
$object->severity_code)) {
1271 print $langs->getLabelFromKey($db,
'TicketSeverityShort'.
$object->severity_code,
'c_ticket_severity',
'code',
'label',
$object->severity_code);
1281 if (isModEnabled(
'category')) {
1282 print
'<table class="border centpercent tableforfield">';
1284 print
'<td class="valignmiddle titlefield">';
1285 print
'<table class="nobordernopadding centpercent"><tr><td class="titlefield">';
1286 print $langs->trans(
"Categories");
1287 if ($action !=
'categories' && !$user->socid) {
1288 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>';
1293 if ($user->hasRight(
'ticket',
'write') && $action ==
'categories') {
1294 $cate_arbo = $form->select_all_categories(Categorie::TYPE_TICKET,
'',
'parent', 64, 0, 3);
1295 if (is_array($cate_arbo)) {
1297 print
'<td colspan="3">';
1298 print
'<form action="'.$url_page_current.
'" method="POST">';
1299 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1300 print
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
1301 print
'<input type="hidden" name="action" value="set_categories">';
1304 $cats = $category->containing(
$object->id,
'ticket');
1305 $arrayselected = array();
1306 foreach ($cats as $cat) {
1307 $arrayselected[] = $cat->id;
1310 print
img_picto(
'',
'category',
'class="pictofixedwidth"').$form->multiselectarray(
'categories', $cate_arbo, $arrayselected, 0, 0,
'maxwidth500 widthcentpercentminusx', 0, 0);
1311 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Save').
'">';
1316 print
'<td colspan="3">';
1317 print $form->showCategories(
$object->id, Categorie::TYPE_TICKET, 1);
1325 $actionobject->viewTicketOriginalMessage($user, $action,
$object);
1329 print
'<!-- navbar with status -->';
1330 if (!$user->socid && $user->hasRight(
'ticket',
'write') && isset(
$object->status) &&
$object->status < $object::STATUS_CLOSED) {
1331 $actionobject->viewStatusActions(
$object);
1336 print
load_fiche_titre($langs->trans(
'Contacts'),
'',
'title_companies.png');
1338 print
'<div class="div-table-responsive-no-min">';
1339 print
'<div class="tagtable centpercent noborder allwidth">';
1341 print
'<div class="tagtr liste_titre">';
1342 print
'<div class="tagtd">'.$langs->trans(
"Source").
'</div>
1343 <div class="tagtd">' . $langs->trans(
"Company").
'</div>
1344 <div class="tagtd">' . $langs->trans(
"Contacts").
'</div>
1345 <div class="tagtd">' . $langs->trans(
"ContactType").
'</div>
1346 <div class="tagtd">' . $langs->trans(
"Phone").
'</div>
1347 <div class="tagtd center">' . $langs->trans(
"Status").
'</div>';
1348 print
'</div><!-- tagtr -->';
1351 $companystatic =
new Societe($db);
1352 $contactstatic =
new Contact($db);
1353 $userstatic =
new User($db);
1355 foreach (array(
'internal',
'external') as $source) {
1357 $tab = $tmpobject->listeContact(-1, $source);
1358 '@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';
1359 $num = is_array($tab) ? 0 : count($tab);
1361 foreach (array_keys($tab) as $i) {
1363 print
'<div class="tagtr '.($var ?
'pair' :
'impair').
'">';
1365 print
'<div class="tagtd left">';
1366 if ($tab[$i][
'source'] ==
'internal') {
1367 echo $langs->trans(
"User");
1370 if ($tab[$i][
'source'] ==
'external') {
1371 echo $langs->trans(
"ThirdPartyContact");
1375 print
'<div class="tagtd left">';
1377 if ($tab[$i][
'socid'] > 0) {
1378 $companystatic->fetch($tab[$i][
'socid']);
1379 echo $companystatic->getNomUrl(-1);
1381 if ($tab[$i][
'socid'] < 0) {
1384 if (!$tab[$i][
'socid']) {
1389 print
'<div class="tagtd">';
1390 if ($tab[$i][
'source'] ==
'internal') {
1391 if ($userstatic->fetch($tab[$i][
'id'])) {
1392 print $userstatic->getNomUrl(-1);
1395 if ($tab[$i][
'source'] ==
'external') {
1396 if ($contactstatic->fetch($tab[$i][
'id'])) {
1397 print $contactstatic->getNomUrl(-1);
1401 <div class="tagtd">' . $tab[$i][
'libelle'].
'</div>';
1403 print
'<div class="tagtd">';
1407 if (!empty($tab[$i][
'phone_perso'])) {
1409 print
'<br>'.dol_print_phone($tab[$i][
'phone_perso'],
'', 0, 0,
'AC_TEL').
'<br>';
1411 if (!empty($tab[$i][
'phone_mobile'])) {
1413 print
dol_print_phone($tab[$i][
'phone_mobile'],
'', 0, 0,
'AC_TEL').
'<br>';
1417 print
'<div class="tagtd center">';
1419 echo
'<a href="contact.php?track_id='.$object->track_id.
'&action=swapstatut&ligne='.$tab[$i][
'rowid'].
'">';
1422 if ($tab[$i][
'source'] ==
'internal') {
1423 $userstatic->id = $tab[$i][
'id'];
1424 $userstatic->lastname = $tab[$i][
'lastname'];
1425 $userstatic->firstname = $tab[$i][
'firstname'];
1426 echo $userstatic->LibStatut($tab[$i][
'statuscontact'], 3);
1428 if ($tab[$i][
'source'] ==
'external') {
1429 $contactstatic->id = $tab[$i][
'id'];
1430 $contactstatic->lastname = $tab[$i][
'lastname'];
1431 $contactstatic->firstname = $tab[$i][
'firstname'];
1432 echo $contactstatic->LibStatut($tab[$i][
'statuscontact'], 3);
1440 print
'</div><!-- tagtr -->';
1446 print
'</div><!-- contact list -->';
1450 print
'</div></div>';
1451 print
'<div class="clearboth"></div>';
1457 if ($action !=
'presend' && $action !=
'presend_addmessage' && $action !=
'editline') {
1458 print
'<div class="tabsAction">'.
"\n";
1459 $parameters = array();
1460 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
1465 if (empty($reshook)) {
1467 if (isset(
$object->status) &&
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage") {
1468 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',
'');
1472 if (isset(
$object->status) &&
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage") {
1473 print
dolGetButtonAction(
'', $langs->trans(
'TicketAddPrivateMessage'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend_addmessage&mode=init&token='.
newToken().
'&track_id='.
$object->track_id.
'#formmailbeforetitle',
'');
1479 print
dolGetButtonAction($langs->trans(
'UnableToCreateInterIfNoSocid'), $langs->trans(
'TicketAddIntervention'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1481 if (
$object->fk_soc > 0 && isset(
$object->status) &&
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ficheinter',
'creer')) {
1482 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,
'');
1486 if (isset(
$object->status) &&
$object->status >= 0 &&
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ticket',
'write')) {
1487 print
dolGetButtonAction(
'', $langs->trans(
'CloseTicket'),
'default', $_SERVER[
"PHP_SELF"].
'?action=close&token='.
newToken().
'&track_id='.
$object->track_id,
'');
1491 if (isset(
$object->status) &&
$object->status > 0 &&
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ticket',
'write')) {
1492 print
dolGetButtonAction(
'', $langs->trans(
'AbandonTicket'),
'default', $_SERVER[
"PHP_SELF"].
'?action=abandon&token='.
newToken().
'&track_id='.
$object->track_id,
'');
1496 if (!$user->socid && (isset(
$object->status) && (
$object->status == Ticket::STATUS_CLOSED ||
$object->status == Ticket::STATUS_CANCELED)) && !$user->socid) {
1501 if ($permissiontoedit) {
1502 print
dolGetButtonAction(
'', $langs->trans(
'Modify'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=edit&token='.
newToken(),
'', $permissiontoedit);
1506 if ($user->hasRight(
'ticket',
'delete') && !$user->socid) {
1510 print
'</div>'.
"\n";
1514 if (
GETPOST(
'modelselected')) {
1515 $action =
'presend';
1518 if (GETPOSTISSET(
'actionbis') && $action ==
'presend') {
1519 $action =
'presend_addmessage';
1523 if ($action ==
'presend' || $action ==
'presend_addmessage') {
1528 $outputlangs = $langs;
1531 $newlang =
GETPOST(
'lang_id',
'aZ09');
1533 $newlang =
$object->thirdparty->default_lang;
1535 if (!empty($newlang)) {
1537 $outputlangs->setDefaultLang($newlang);
1540 $arrayoffamiliestoexclude = array(
'objectamount');
1542 $action =
'add_message';
1543 $modelmail =
'ticket_send';
1546 $morehtmlright =
'';
1550 $morehtmlright .= $form->textwithpicto(
'<span class="opacitymedium">'.$langs->trans(
"TicketMessageSubstitutionReplacedByGenericValues").
'</span>', $help, 1,
'helpclickable',
'', 0, 3,
'helpsubstitution');
1554 print
'<div id="formmailbeforetitle" name="formmailbeforetitle"></div>';
1556 print
load_fiche_titre($langs->trans(
'TicketAddMessage'), $morehtmlright,
'messages@ticket');
1562 $formticket->action = $action;
1563 $formticket->track_id =
$object->track_id;
1564 $formticket->ref =
$object->ref;
1565 $formticket->id =
$object->id;
1566 $formticket->trackid =
'tic'.$object->id;
1568 $formticket->withfile = 2;
1569 $formticket->withcancel = 1;
1570 $formticket->param = array(
'fk_user_create' => $user->id);
1571 $formticket->param[
'langsmodels'] = (empty($newlang) ? $langs->defaultlang : $newlang);
1574 $formticket->param[
'models'] = $modelmail;
1575 $formticket->param[
'models_id'] =
GETPOSTINT(
'modelmailselected');
1577 $formticket->param[
'returnurl'] = $_SERVER[
"PHP_SELF"].
'?track_id='.
$object->track_id;
1579 $formticket->withsubstit = 1;
1580 $formticket->substit = $substitutionarray;
1581 $formticket->backtopage = $backtopage;
1583 $formticket->showMessageForm(
'100%');
1589 $param =
'&id='.$object->id;
1590 if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
1591 $param .=
'&contextpage='.$contextpage;
1593 if ($limit > 0 && $limit !=
$conf->liste_limit) {
1594 $param .=
'&limit='.$limit;
1597 $param .=
'&actioncode='.urlencode($actioncode);
1599 if ($search_agenda_label) {
1600 $param .=
'&search_agenda_label='.urlencode($search_agenda_label);
1603 $morehtmlright =
'';
1605 $messagingUrl = DOL_URL_ROOT.
'/ticket/agenda.php?track_id='.
$object->track_id;
1606 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'MessageListViewType'),
'',
'fa fa-bars imgforviewmode', $messagingUrl,
'', 1);
1609 $btnstatus =
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage" && $action !=
"add_message";
1610 $url =
'card.php?track_id='.$object->track_id.
'&action=presend_addmessage&mode=init';
1611 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'TicketAddMessage'),
'',
'fa fa-comment-dots', $url,
'add-new-ticket-title-button', (
int) $btnstatus);
1614 $btnstatus =
$object->status < Ticket::STATUS_CLOSED && $action !=
"presend" && $action !=
"presend_addmessage" && $action !=
"add_message";
1615 $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);
1616 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'AddAction'),
'',
'fa fa-plus-circle', $url,
'add-new-ticket-even-button', (
int) $btnstatus);
1618 print_barre_liste($langs->trans(
"ActionsOnTicket"), 0, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder,
'', 0, -1,
'', 0, $morehtmlright,
'', 0, 1, 1);
1622 $filters[
'search_agenda_label'] = $search_agenda_label;
1623 $filters[
'search_rowid'] = $search_rowid;
1625 show_actions_messaging(
$conf, $langs, $db,
$object,
null, 0, $actioncode,
'', $filters, $sortfield, $sortorder);
1628 if ($action !=
'presend' && $action !=
'presend_addmessage' && $action !=
'add_message') {
1629 print
'<div class="fichecenter"><div class="fichehalfleft">';
1630 print
'<a name="builddoc"></a>';
1636 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
1637 $genallowed = $permissiontoadd;
1638 $delallowed = $permissiontodelete;
1642 $codelang =
$object->thirdparty->default_lang;
1645 print $formfile->showdocuments(
'ticket', $filename, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'', 0,
'', $codelang);
1648 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'ticket'), 1);
1649 $linktoelem = $tmparray[
'linktoelem'];
1650 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
1651 print $htmltoenteralink;
1653 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
1656 print
'<br><!-- Link to public interface -->'.
"\n";
1661 print
'<div class="fichehalfright">';
1665 $morehtmlcenter =
'<div class="nowraponall">';
1666 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/ticket/messaging.php?id='.
$object->id);
1667 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullList'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/ticket/agenda.php?id='.
$object->id);
1668 $morehtmlcenter .=
'</div>';
1671 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1673 $somethingshown = $formactions->showactions(
$object,
'ticket', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
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, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
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.
dolPrintLabel($s, $escapeonlyhtmltags=0)
Return a string label (so on 1 line only and that should not contains any HTML) ready to be output on...
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.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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...
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.
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.