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');
 
   80$sortfield = 
GETPOST(
'sortfield', 
'aZ09comma') ? 
GETPOST(
'sortfield', 
'aZ09comma') : 
"a.datep";
 
   81$sortorder = 
GETPOST(
'sortorder', 
'aZ09comma') ? 
GETPOST(
'sortorder', 
'aZ09comma') : 
"desc";
 
   82$search_rowid = 
GETPOST(
'search_rowid');
 
   83$search_agenda_label = 
GETPOST(
'search_agenda_label');
 
   85if (
GETPOST(
'actioncode', 
'array')) {
 
   86  $actioncode = 
GETPOST(
'actioncode', 
'array', 3);
 
   87  if (!count($actioncode)) {
 
   96$hookmanager->initHooks(array(
'ticketcard', 
'globalcard'));
 
  102$extrafields->fetch_name_optionals_label(
$object->table_element);
 
  104$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element, 
'', 
'search_');
 
  107$search_all = 
GETPOST(
"search_all", 
'alpha');
 
  109foreach (
$object->fields as $key => $val) {
 
  110  if (
GETPOST(
'search_'.$key, 
'alpha')) {
 
  111    $search[$key] = 
GETPOST(
'search_'.$key, 
'alpha');
 
  115if (empty($action) && empty($id) && empty($ref)) {
 
  120if (
GETPOST(
'modelselected', 
'alpha')) {
 
  126if ($id || $track_id || $ref) {
 
  127  $res = 
$object->fetch($id, $ref, $track_id);
 
  139$url_page_current = DOL_URL_ROOT.
'/ticket/card.php';
 
  142if ($user->socid > 0) {
 
  143  $socid = $user->socid;
 
  147$triggermodname = 
'TICKET_MODIFY';
 
  150$permissiontoread   = $user->hasRight(
'ticket', 
'read');
 
  151$permissiontoadd    = $user->hasRight(
'ticket', 
'write');
 
  152$permissiontodelete = $user->hasRight(
'ticket', 
'delete');
 
  154$upload_dir = 
$conf->ticket->dir_output;
 
  162$parameters = array();
 
  163$reshook = $hookmanager->executeHooks(
'doActions', $parameters, 
$object, $action); 
 
  169if (empty($reshook)) {
 
  171  if (
GETPOST(
'button_removefilter_x', 
'alpha') || 
GETPOST(
'button_removefilter.x', 
'alpha') || 
GETPOST(
'button_removefilter', 
'alpha')) { 
 
  173    $search_agenda_label = 
'';
 
  176  $backurlforlist = DOL_URL_ROOT . 
'/ticket/list.php';
 
  178  if (empty($backtopage) || ($cancel && empty($id))) {
 
  179    if (empty($backtopage) || ($cancel && strpos($backtopage, 
'__ID__'))) {
 
  180      if (empty($id) && (($action != 
'add' && $action != 
'create') || $cancel)) {
 
  181        $backtopage = $backurlforlist;
 
  183        $backtopage = DOL_URL_ROOT . 
'/ticket/card.php?id=' . ((!empty($id) && 
$id > 0) ? $id : 
'__ID__');
 
  189    if (!empty($backtopageforcancel)) {
 
  190      header(
"Location: " . $backtopageforcancel);
 
  192    } elseif (!empty($backtopage)) {
 
  193      header(
"Location: " . $backtopage);
 
  199  if (($action == 
'add' || ($action == 
'update' && 
$object->status < Ticket::STATUS_CLOSED)) && $permissiontoadd) {
 
  200    $ifErrorAction = ($action == 
'add' ? 
'create' : 
'edit');  
 
  201    if ($action == 
'add') {   
 
  207      'ref' => [
'check' => 
'alpha', 
'langs' => 
'Ref'],
 
  208      'type_code' => [
'check' => 
'alpha', 
'langs' => 
'TicketTypeRequest'],
 
  209      'category_code' => [
'check' => 
'alpha', 
'langs' => 
'TicketCategory'],
 
  210      'severity_code' => [
'check' => 
'alpha', 
'langs' => 
'TicketSeverity'],
 
  211      'subject' => [
'check' => 
'alphanohtml', 
'langs' => 
'Subject'],
 
  212      'message' => [
'check' => 
'restricthtml', 
'langs' => 
'Message']
 
  217    if (!empty($error)) {
 
  218      $action = $ifErrorAction;
 
  221    $ret = $extrafields->setOptionalsFromPost(
null, 
$object);
 
  225    $getRef = 
GETPOST(
'ref', 
'alpha');
 
  227    if (!empty($getRef)) {
 
  228      $isExistingRef = 
$object->checkExistingRef($action, $getRef);
 
  230      $isExistingRef = 
true;
 
  235    if ($isExistingRef) {
 
  236      if ($action == 
'update') {    
 
  240      } elseif ($action == 
'add') { 
 
  245      if (!empty($getRef)) {
 
  258      $fk_user_assign = 
GETPOSTINT(
'fk_user_assign');
 
  262      if ($fk_user_assign > 0) {
 
  263        $object->fk_user_assign = $fk_user_assign;
 
  264        $object->status = $object::STATUS_ASSIGNED;
 
  267      if ($action == 
'add') {   
 
  269        $object->type_label = $langs->trans($langs->getLabelFromKey($db, 
$object->type_code, 
'c_ticket_type', 
'code', 
'label'));
 
  270        $object->category_label = $langs->trans($langs->getLabelFromKey($db, 
$object->category_code, 
'c_ticket_category', 
'code', 
'label'));
 
  271        $object->severity_label = $langs->trans($langs->getLabelFromKey($db, 
$object->severity_code, 
'c_ticket_severity', 
'code', 
'label'));
 
  272        $object->fk_user_create = $user->id;
 
  273        $object->email_from = $user->email;
 
  275        $notifyTiers = 
GETPOST(
"notify_tiers_at_create", 
'alpha');
 
  276        $object->notify_tiers_at_create = empty($notifyTiers) ? 0 : 1;
 
  286        $action = $ifErrorAction;
 
  291        $categories = 
GETPOST(
'categories', 
'array');
 
  292        $object->setCategories($categories);
 
  295      if ($action == 
'add') {   
 
  299          $type_contact = 
GETPOST(
"type", 
'alpha');
 
  301          if ($contactid > 0 && $type_contact) {
 
  303            $result = 
$object->add_contact($contactid, $typeid, 
'external');
 
  307          if (
GETPOST(
'origin', 
'alpha') == 
'projet') {
 
  313          if ($projectid > 0) {
 
  314            $object->setProject($projectid);
 
  318          if (
getDolGlobalString(
'TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND') && $user->hasRight(
'ticket', 
'write')) {
 
  319            if (!
$object->markAsRead($user) > 0) {
 
  325          if ((empty($fk_user_assign) && 
getDolGlobalInt(
'TICKET_AUTO_ASSIGN_USER_CREATE') == 1) || (
getDolGlobalInt(
'TICKET_AUTO_ASSIGN_USER_CREATE') == 2)) {
 
  326            $result = 
$object->assignUser($user, $user->id, 1);
 
  327            $object->add_contact($user->id, 
"SUPPORTTEC", 
'internal');
 
  333          $object->copyFilesForTicket(
'');        
 
  339        if (!empty($backtopage)) {
 
  343            $url = 
'card.php?track_id=' . urlencode(
$object->track_id);
 
  346          $url = 
'card.php?track_id=' . urlencode(
$object->track_id);
 
  349        header(
"Location: " . $url);
 
  356      $action = $ifErrorAction;
 
  361  if ($action == 
"set_read" && $permissiontoadd) {
 
  364    if (
$object->markAsRead($user) > 0) {
 
  367      header(
"Location: card.php?track_id=" . 
$object->track_id);
 
  376  if ($action == 
"assign_user" && 
GETPOST(
'btn_assign_user', 
'alpha') && $permissiontoadd) {
 
  378    $useroriginassign = 
$object->fk_user_assign;
 
  388      $ret = 
$object->assignUser($user, $usertoassign);
 
  396      if ($useroriginassign > 0) {
 
  397        $internal_contacts = 
$object->listeContact(-1, 
'internal', 0, 
'SUPPORTTEC');
 
  398        foreach ($internal_contacts as $key => $contact) {
 
  399          if ($contact[
'id'] !== $usertoassign) {
 
  400            $result = 
$object->delete_contact($contact[
'rowid']);
 
  409      if ($usertoassign > 0 && $usertoassign !== $useroriginassign) {
 
  410        $result = 
$object->add_contact($usertoassign, 
"SUPPORTTEC", 
'internal', $notrigger = 0);
 
  420      $object->fetch_user($usertoassign);
 
  423      header(
"Location: card.php?track_id=" . 
$object->track_id);
 
  433  if ($action == 
'add_message' && GETPOSTISSET(
'btn_add_message') && $permissiontoread) {
 
  434    $ret = 
$object->newMessage($user, $action, (
GETPOST(
'private_message', 
'alpha') == 
"1" ? 1 : 0), 0);
 
  437      if (!empty($backtopage)) {
 
  440        $url = 
'card.php?track_id=' . urlencode(
$object->track_id);
 
  443      header(
"Location: " . $url);
 
  451  if (($action == 
"confirm_close" || $action == 
"confirm_abandon") && 
GETPOST(
'confirm', 
'alpha') == 
'yes' && $permissiontoadd) {
 
  454    if (
$object->close($user, ($action == 
"confirm_abandon" ? 1 : 0))) {
 
  457      $url = 
'card.php?track_id=' . 
GETPOST(
'track_id', 
'alpha');
 
  458      header(
"Location: " . $url);
 
  466  if ($action == 
"confirm_public_close" && 
GETPOST(
'confirm', 
'alpha') == 
'yes' && $permissiontoadd) {
 
  468    if ($_SESSION[
'email_customer'] == 
$object->origin_email || $_SESSION[
'email_customer'] == 
$object->thirdparty->email) {
 
  473      setEventMessages(
'<div class="confirm">' . $langs->trans(
'TicketMarkedAsClosed') . 
'</div>', 
null, 
'mesgs');
 
  475      $url = 
'card.php?track_id=' . 
GETPOST(
'track_id', 
'alpha');
 
  476      header(
"Location: " . $url);
 
  484  if ($action == 
'confirm_delete_ticket' && 
GETPOST(
'confirm', 
'alpha') == 
"yes" && $permissiontodelete) {
 
  486      if (
$object->delete($user) > 0) {
 
  487        setEventMessages(
'<div class="confirm">' . $langs->trans(
'TicketDeletedSuccess') . 
'</div>', 
null, 
'mesgs');
 
  488        header(
"Location: " . DOL_URL_ROOT . 
"/ticket/list.php");
 
  491        $langs->load(
"errors");
 
  492        $mesg = 
'<div class="error">' . $langs->trans(
$object->error) . 
'</div>';
 
  499  if ($action == 
'set_thirdparty' && $user->hasRight(
'ticket', 
'write')) {
 
  502      $url = $_SERVER[
"PHP_SELF"] . 
'?track_id=' . 
GETPOST(
'track_id', 
'alpha');
 
  503      header(
"Location: " . $url);
 
  509  if ($action == 
'set_progression' && $user->hasRight(
'ticket', 
'write')) {
 
  513      $url = 
'card.php?track_id=' . 
$object->track_id;
 
  514      header(
"Location: " . $url);
 
  520  if ($action == 
'set_categories' && $user->hasRight(
'ticket', 
'write')) {
 
  524      $url = 
'card.php?track_id=' . 
$object->track_id;
 
  525      header(
"Location: " . $url);
 
  531  if ($action == 
'setsubject' && $user->hasRight(
'ticket', 
'write')) {
 
  533      if ($action == 
'setsubject') {    
 
  537      if ($action == 
'setsubject' && empty(
$object->subject)) { 
 
  539        setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"Subject")), 
null, 
'errors');
 
  543        if (!
$object->update($user) >= 0) {
 
  549      header(
"Location: " . $_SERVER[
'PHP_SELF'] . 
"?track_id=" . 
$object->track_id);
 
  554  if ($action == 
'confirm_reopen' && $user->hasRight(
'ticket', 
'manage') && !
GETPOST(
'cancel')) {
 
  557      if (
$object->status == Ticket::STATUS_CLOSED || 
$object->status == Ticket::STATUS_CANCELED) {
 
  558        if (
$object->fk_user_assign != 
null) {
 
  559          $res = 
$object->setStatut(Ticket::STATUS_ASSIGNED, 
null, 
'', 
'TICKET_MODIFY');
 
  561          $res = 
$object->setStatut(Ticket::STATUS_NOT_READ, 
null, 
'', 
'TICKET_MODIFY');
 
  564          $url = 
'card.php?track_id=' . 
$object->track_id;
 
  565          header(
"Location: " . $url);
 
  573  } elseif ($action == 
'classin' && $permissiontoadd) {
 
  576      $object->setProject($projectid);
 
  577      $url = 
'card.php?track_id=' . 
$object->track_id;
 
  578      header(
"Location: " . $url);
 
  581  } elseif ($action == 
'setcontract' && $permissiontoadd) {
 
  585      $url = 
'card.php?track_id=' . 
$object->track_id;
 
  586      header(
"Location: " . $url);
 
  589  } elseif ($action == 
"set_message" && $user->hasRight(
'ticket', 
'manage')) {
 
  593      $fieldtomodify = 
GETPOST(
'message_initial', 
'restricthtml');
 
  595      $object->message = $fieldtomodify;
 
  602        setEventMessages($langs->trans(
'TicketMessageSuccesfullyUpdated'), 
null, 
'mesgs');
 
  610  } elseif ($action == 
'confirm_set_status' && $permissiontoadd && !
GETPOST(
'cancel')) {
 
  615      $res = 
$object->setStatut($new_status);
 
  617        $url = 
'card.php?track_id=' . 
$object->track_id;
 
  618        header(
"Location: " . $url);
 
  628  if ($action == 
"update_extras" && $permissiontoadd) {
 
  631    $ret = $extrafields->setOptionalsFromPost(
null, 
$object, 
GETPOST(
'attribute', 
'restricthtml'));
 
  637      $result = 
$object->insertExtraFields(empty($triggermodname) ? 
'' : $triggermodname, $user);
 
  645      $action = 
'edit_extras';
 
  652  if ($action == 
"change_property" && 
GETPOST(
'btn_update_ticket_prop', 
'alpha') && $permissiontoadd) {
 
  656    $object->severity_code = 
GETPOST(
'update_value_severity', 
'aZ09');
 
  657    $object->category_code = 
GETPOST(
'update_value_category', 
'aZ09');
 
  670  $permissiondellink = $user->hasRight(
'ticket', 
'write');
 
  671  include DOL_DOCUMENT_ROOT . 
'/core/actions_dellink.inc.php'; 
 
  674  include DOL_DOCUMENT_ROOT . 
'/core/actions_builddoc.inc.php';
 
  677  $triggersendname = 
'TICKET_SENTBYMAIL';
 
  679  $autocopy = 
'MAIN_MAIL_AUTOCOPY_TICKET_TO'; 
 
  680  $trackid = 
'tic' . 
$object->id;
 
  681  include DOL_DOCUMENT_ROOT . 
'/core/actions_sendmails.inc.php';
 
  684  if (GETPOSTISSET(
'actionbis') && $action == 
'presend') {  
 
  685    $action = 
'presend_addmessage';
 
  694$userstat = 
new User($db);
 
  695$form = 
new Form($db);
 
  698if (isModEnabled(
'project')) {
 
  702$help_url = 
'EN:Module_Ticket|FR:DocumentationModuleTicket';
 
  704$title = $actionobject->getTitle($action);
 
  706llxHeader(
'', $title, $help_url, 
'', 0, 0, 
'', 
'', 
'', 
'mod-ticket page-card');
 
  708if ($action == 
'create' || $action == 
'presend') {
 
  709  if (empty($permissiontoadd)) {
 
  717  $formticket->trackid = 
'';    
 
  718  $formticket->withfromsocid = $socid ? $socid : $user->socid;
 
  719  $formticket->withfromcontactid = $contactid ? $contactid : 
'';
 
  720  $formticket->withtitletopic = 1;
 
  721  $formticket->withnotifytiersatcreate = ($notifyTiers ? 1 : (
getDolGlobalString(
'TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION') ? 1 : 0));
 
  722  $formticket->withusercreate = 0;
 
  723  $formticket->withref = 1;
 
  724  $formticket->fk_user_create = $user->id;
 
  725  $formticket->withfile = 2;
 
  726  $formticket->withextrafields = 1;
 
  727  $formticket->param = array(
'origin' => 
GETPOST(
'origin'), 
'originid' => 
GETPOST(
'originid'));
 
  729  $formticket->withcancel = 1;
 
  732  if (
GETPOST(
"mode", 
"aZ09") == 
'init') {
 
  733    $formticket->clear_attached_files();
 
  736  $formticket->showForm(1, 
'create', 0, 
null, $action, 
$object);
 
  739} elseif ($action == 
'edit' && $user->rights->ticket->write && 
$object->status < Ticket::STATUS_CLOSED) {
 
  740  if (empty($permissiontoadd)) {
 
  750  $formticket->trackid = 
$object->track_id;        
 
  751  $formticket->withfromsocid = 
$object->socid;
 
  752  $formticket->withtitletopic = 1;
 
  754  $formticket->withnotifytiersatcreate = 0;
 
  755  $formticket->withusercreate = 0;
 
  756  $formticket->withref = 1;
 
  757  $formticket->fk_user_create = $user->id;
 
  758  $formticket->withfile = 0;
 
  759  $formticket->action = 
'update';
 
  760  $formticket->withextrafields = 1;
 
  761  $formticket->param = array(
'origin' => 
GETPOST(
'origin'), 
'originid' => 
GETPOST(
'originid'));
 
  763  $formticket->withcancel = 1;
 
  765  $formticket->showForm(0, 
'edit', 0, 
null, $action, 
$object);
 
  768} 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'])) {
 
  769  if (!empty($res) && $res > 0) {
 
  771    if (!$user->socid && (
getDolGlobalString(
'TICKET_LIMIT_VIEW_ASSIGNED_ONLY') && 
$object->fk_user_assign != $user->id) && !$user->hasRight(
'ticket', 
'manage')) {
 
  778    if ($action == 
'close') {
 
  779      $thirdparty_contacts = 
$object->getInfosTicketExternalContact(1);
 
  780      $contacts_select = array(
 
  781        '-2' => $langs->trans(
'TicketNotifyAllTiersAtClose'),
 
  782        '-3' => $langs->trans(
'TicketNotNotifyTiersAtClose')
 
  784      foreach ($thirdparty_contacts as $thirdparty_contact) {
 
  785        $contacts_select[$thirdparty_contact[
'id']] = $thirdparty_contact[
'civility'] . 
' ' . $thirdparty_contact[
'lastname'] . 
' ' . $thirdparty_contact[
'firstname'];
 
  790      $formquestion = array(
 
  792          'name' => 
'contactid',
 
  794          'label' => $langs->trans(
'NotifyThirdpartyOnTicketClosing'),
 
  795          'values' => $contacts_select,
 
  796          'default' => $default
 
  800      $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"CloseATicket"), $langs->trans(
"ConfirmCloseAticket"), 
"confirm_close", $formquestion, 
'', 1);
 
  803    if ($action == 
'abandon') {
 
  804      $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"AbandonTicket"), $langs->trans(
"ConfirmAbandonTicket"), 
"confirm_abandon", 
'', 
'', 1);
 
  807    if ($action == 
'delete') {
 
  808      $formconfirm = $form->formconfirm($url_page_current.
"?track_id=".
$object->track_id, $langs->trans(
"Delete"), $langs->trans(
"ConfirmDeleteTicket"), 
"confirm_delete_ticket", 
'', 
'', 1);
 
  811    if ($action == 
'reopen') {
 
  812      $formconfirm = $form->formconfirm($url_page_current.
'?track_id='.
$object->track_id, $langs->trans(
'ReOpen'), $langs->trans(
'ConfirmReOpenTicket'), 
'confirm_reopen', 
'', 
'', 1);
 
  815    if ($action == 
'set_status') {
 
  818      $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);
 
  822    $parameters = array(
'formConfirm' => $formconfirm);
 
  823    $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, 
$object, $action); 
 
  824    if (empty($reshook)) {
 
  825      $formconfirm .= $hookmanager->resPrint;
 
  826    } elseif ($reshook > 0) {
 
  827      $formconfirm = $hookmanager->resPrint;
 
  834    if ($projectid > 0) {
 
  835      $projectstat = 
new Project($db);
 
  836      if ($projectstat->fetch($projectid) > 0) {
 
  837        $projectstat->fetch_thirdparty();
 
  841        $userWrite = $projectstat->restrictedProjectArea($user, 
'write');
 
  847        print 
dol_get_fiche_head($head, 
'ticket', $langs->trans(
"Project"), 0, ($projectstat->public ? 
'projectpub' : 
'project'));
 
  849        print 
'<table class="border centpercent">';
 
  851        $linkback = 
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
 
  854        print 
'<tr><td width="30%">'.$langs->trans(
'Ref').
'</td><td colspan="3">';
 
  856        if (!$user->hasRight(
'projet', 
'all', 
'lire')) {
 
  857          $objectsListId = $projectstat->getProjectsAuthorizedForUser($user, $mine, 0);
 
  858          $projectstat->next_prev_filter = 
"rowid:IN:".$db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) : 
'0');
 
  860        print $form->showrefnav($projectstat, 
'ref', $linkback, 1, 
'ref', 
'ref', 
'');
 
  864        print 
'<tr><td>'.$langs->trans(
"Label").
'</td><td>'.$projectstat->title.
'</td></tr>';
 
  867        print 
"<tr><td>".$langs->trans(
"ThirdParty").
"</td>";
 
  868        print 
'<td colspan="3">';
 
  869        if ($projectstat->thirdparty->id > 0) {
 
  870          print $projectstat->thirdparty->getNomUrl(1);
 
  878        print 
'<tr><td>'.$langs->trans(
"Visibility").
'</td><td>';
 
  879        if ($projectstat->public) {
 
  880          print $langs->trans(
'SharedProject');
 
  882          print $langs->trans(
'PrivateProject');
 
  888        print 
'<tr><td>'.$langs->trans(
"Status").
'</td><td>'.$projectstat->getLibStatut(4).
'</td></tr>';
 
  894        print 
"ErrorRecordNotFound";
 
  896    } elseif ($socid > 0) {
 
  902      dol_banner_tab(
$object->thirdparty, 
'socid', 
'', ($user->socid ? 0 : 1), 
'rowid', 
'nom');
 
  908      $object->next_prev_filter = 
"te.fk_user_assign:=:".((int) $user->id);
 
  909    } elseif ($user->socid > 0) {
 
  910      $object->next_prev_filter = 
"te.fk_soc:=:".((int) $user->socid);
 
  917    $morehtmlref = 
'<div class="refidno">';
 
  919    if ($user->hasRight(
'ticket', 
'write') && !$user->socid) {
 
  920      $morehtmlref .= 
'<a class="editfielda" href="'.$url_page_current.
'?action=editsubject&token='.
newToken().
'&track_id='.
$object->track_id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetTitle'), 0).
'</a> ';
 
  922    if ($action != 
'editsubject') {
 
  925      $morehtmlref .= 
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'">';
 
  926      $morehtmlref .= 
'<input type="hidden" name="action" value="setsubject">';
 
  927      $morehtmlref .= 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
  928      $morehtmlref .= 
'<input type="hidden" name="id" value="20">';
 
  929      $morehtmlref .= 
'<input type="text" class="minwidth300" id="subject" name="subject" value="'.$object->subject.
'" autofocus="">';
 
  930      $morehtmlref .= 
'<input type="submit" class="smallpaddingimp button valignmiddle" name="modify" value="'.$langs->trans(
"Modify").
'">';
 
  931      $morehtmlref .= 
'<input type="submit" class="smallpaddingimp button button-cancel vlignmiddle" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
 
  932      $morehtmlref .= 
'</form>';
 
  937    if (
$object->fk_user_create > 0) {
 
  938      $morehtmlref .= 
'<br>'.$langs->trans(
"CreatedBy").
' : ';
 
  940      $fuser = 
new User($db);
 
  941      $fuser->fetch(
$object->fk_user_create);
 
  942      $morehtmlref .= $fuser->getNomUrl(-1);
 
  946    $createdfrompublicticket = 0;
 
  947    $createdfromemailcollector = 0;
 
  948    if (!empty(
$object->origin_email) && (empty(
$object->email_msgid) || preg_match(
'/dolibarr\-tic\d+/', 
$object->email_msgid))) {
 
  950      $createdfrompublicticket = 1;
 
  951    } elseif (!empty(
$object->email_msgid)) {
 
  953      $createdfromemailcollector = 1;
 
  957    if ($createdfrompublicticket) {
 
  958      $htmltooptip = $langs->trans(
"OriginEmail").
': '.
$object->origin_email;
 
  959      $htmltooptip .= 
'<br>'.$langs->trans(
"IP").
': '.
$object->ip;
 
  960      $morehtmlref .= ($createdbyshown ? 
' - ' : 
'<br>');
 
  961      $morehtmlref .= ($createdbyshown ? 
'' : $langs->trans(
"CreatedBy").
' : ');
 
  962      $morehtmlref .= 
img_picto(
'', 
'email', 
'class="paddingrightonly"');
 
  963      $morehtmlref .= 
dol_escape_htmltag(
$object->origin_email).
' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans(
"CreatedByPublicPortal"), $htmltooptip, 1, 
'help', 
'', 0, 3, 
'tooltip').
'</small>';
 
  964    } elseif ($createdfromemailcollector) {
 
  965      $langs->load(
"mails");
 
  966      $htmltooltip = $langs->trans(
"EmailMsgID").
': '.
$object->email_msgid;
 
  967      $htmltooltip .= 
'<br>'.$langs->trans(
"EmailDate").
': '.
dol_print_date(
$object->email_date, 
'dayhour');
 
  968      $htmltooltip .= 
'<br>'.$langs->trans(
"MailFrom").
': '.
$object->origin_email;
 
  969      $htmltooltip .= 
'<br>'.$langs->trans(
"MailReply").
': '.
$object->origin_replyto;
 
  970      $htmltooltip .= 
'<br>'.$langs->trans(
"MailReferences").
': '.
$object->origin_references;
 
  971      $morehtmlref .= ($createdbyshown ? 
' - ' : 
'<br>');
 
  972      $morehtmlref .= ($createdbyshown ? 
'' : $langs->trans(
"CreatedBy").
' : ');
 
  973      $morehtmlref .= 
img_picto(
'', 
'email', 
'class="paddingrightonly"');
 
  974      $morehtmlref .= 
dol_escape_htmltag(
$object->origin_email).
' <small class="hideonsmartphone opacitymedium">- '.$form->textwithpicto($langs->trans(
"CreatedByEmailCollector"), $htmltooltip, 1, 
'help', 
'', 0, 3, 
'tooltip').
'</small>';
 
  977    $permissiontoedit = 
$object->status < 8 && !$user->socid && $user->hasRight(
'ticket', 
'write');
 
  981    if (isModEnabled(
"societe")) {
 
  982      $morehtmlref .= 
'<br>';
 
  983      $morehtmlref .= 
img_picto($langs->trans(
"ThirdParty"), 
'company', 
'class="pictofixedwidth"');
 
  984      if ($action != 
'editcustomer' && $permissiontoedit) {
 
  985        $morehtmlref .= 
'<a class="editfielda" href="'.$url_page_current.
'?action=editcustomer&token='.
newToken().
'&track_id='.
$object->track_id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetThirdParty'), 0).
'</a> ';
 
  987      $morehtmlref .= $form->form_thirdparty($url_page_current.
'?track_id='.
$object->track_id, 
$object->socid, $action == 
'editcustomer' ? 
'editcustomer' : 
'none', 
'', 1, 0, 0, array(), 1);
 
  989        $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>';
 
  994    if (isModEnabled(
'project')) {
 
  995      $langs->load(
"projects");
 
  996      $morehtmlref .= 
'<br>';
 
  997      if ($permissiontoedit) {
 
  999        $morehtmlref .= 
img_picto($langs->trans(
"Project"), 
'project'.((is_object(
$object->project) && 
$object->project->public) ? 
'pub' : 
''), 
'class="pictofixedwidth"');
 
 1000        if ($action != 
'classify') {
 
 1001          $morehtmlref .= 
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
 
 1003        $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, 
$object->socid, 
$object->fk_project, ($action == 
'classify' ? 
'projectid' : 
'none'), 0, 0, 0, 1, 
'', 
'maxwidth300');
 
 1005        if (!empty(
$object->fk_project)) {
 
 1007          $morehtmlref .= 
$object->project->getNomUrl(1);
 
 1008          if (
$object->project->title) {
 
 1009            $morehtmlref .= 
'<span class="opacitymedium"> - '.dol_escape_htmltag(
$object->project->title).
'</span>';
 
 1018      if (isModEnabled(
'contract')) {
 
 1019        $langs->load(
'contracts');
 
 1020        $morehtmlref .= 
'<br>';
 
 1021        if ($permissiontoedit) {
 
 1022          $morehtmlref .= 
img_picto($langs->trans(
"Contract"), 
'contract', 
'class="pictofixedwidth"');
 
 1023          if ($action == 
'edit_contrat') {
 
 1025            $morehtmlref .= $formcontract->formSelectContract($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, 
$object->socid, 
$object->fk_contract, 
'contratid', 0, 1, 1, 1);
 
 1027            $morehtmlref .= 
'<a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=edit_contrat&token='.
newToken().
'&id='.
$object->id.
'">';
 
 1028            $morehtmlref .=  
img_edit($langs->trans(
'SetContract'));
 
 1029            $morehtmlref .=  
'</a>';
 
 1032          if (!empty(
$object->fk_contract)) {
 
 1033            $contratstatic = 
new Contrat($db);
 
 1034            $contratstatic->fetch(
$object->fk_contract);
 
 1036            $morehtmlref .= $contratstatic->getNomUrl(0, 0, 1);
 
 1042    $morehtmlref .= 
'</div>';
 
 1044    $linkback = 
'<a href="'.DOL_URL_ROOT.
'/ticket/list.php?restore_lastsearch_values=1"><strong>'.$langs->trans(
"BackToList").
'</strong></a> ';
 
 1046    dol_banner_tab(
$object, 
'ref', $linkback, ($user->socid ? 0 : 1), 
'ref', 
'ref', $morehtmlref);
 
 1048    print 
'<div class="fichecenter">';
 
 1049    print 
'<div class="fichehalfleft">';
 
 1050    print 
'<div class="underbanner clearboth"></div>';
 
 1052    print 
'<table class="border tableforfield centpercent">';
 
 1055    print 
'<tr><td class="titlefield">'.$langs->trans(
"TicketTrackId").
'</td><td>';
 
 1056    if (!empty(
$object->track_id)) {
 
 1059        print $form->showrefnav(
$object, 
'id', $linkback, 1, 
'rowid', 
'track_id');
 
 1064      print $langs->trans(
'None');
 
 1078    print 
'<tr><td>'.$langs->trans(
"DateCreation").
'</td><td>';
 
 1101    print 
'<tr><td>'.$langs->trans(
"TicketReadOn").
'</td><td>';
 
 1102    if (!empty(
$object->date_read)) {
 
 1110    print 
'<tr><td>'.$langs->trans(
"TicketCloseOn").
'</td><td>';
 
 1111    if (!empty(
$object->date_close)) {
 
 1118    print 
'<table class="nobordernopadding" width="100%"><tr><td class="nowrap">';
 
 1119    print $langs->trans(
"AssignedTo");
 
 1120    if (isset(
$object->status) && 
$object->status < $object::STATUS_CLOSED && 
GETPOST(
'set', 
'alpha') != 
"assign_ticket" && $user->hasRight(
'ticket', 
'manage')) {
 
 1121      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>';
 
 1123    print 
'</td></tr></table>';
 
 1125    if (
GETPOST(
'set', 
'alpha') != 
"assign_ticket" && 
$object->fk_user_assign > 0) {
 
 1126      $userstat->fetch(
$object->fk_user_assign);
 
 1127      print $userstat->getNomUrl(-1);
 
 1131    if (
GETPOST(
'set', 
'alpha') == 
"assign_ticket" && 
$object->status < 8 && !$user->socid && $user->hasRight(
'ticket', 
'write')) {
 
 1132      print 
'<form method="post" name="ticket" enctype="multipart/form-data" action="'.$url_page_current.
'">';
 
 1133      print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
 1134      print 
'<input type="hidden" name="action" value="assign_user">';
 
 1135      print 
'<input type="hidden" name="track_id" value="'.$object->track_id.
'">';
 
 1137      print $form->select_dolusers(empty(
$object->fk_user_assign) ? $user->id : 
$object->fk_user_assign, 
'fk_user_assign', 1);
 
 1138      print 
' <input type="submit" class="button smallpaddingimp" name="btn_assign_user" value="'.$langs->trans(
"Validate").
'" />';
 
 1145    print 
'<table class="nobordernopadding centpercent"><tr><td class="nowrap">';
 
 1146    print $langs->trans(
'Progression').
'</td><td class="left">';
 
 1148    if ($action != 
'progression' && isset(
$object->status) && 
$object->status < $object::STATUS_CLOSED && !$user->socid) {
 
 1149      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>';
 
 1151    print 
'</tr></table>';
 
 1153    if ($user->hasRight(
'ticket', 
'write') && $action == 
'progression') {
 
 1154      print 
'<form action="'.$url_page_current.
'" method="post">';
 
 1155      print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
 1156      print 
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
 
 1157      print 
'<input type="hidden" name="action" value="set_progression">';
 
 1158      print 
'<input type="text" class="flat width75" name="progress" value="'.$object->progress.
'">';
 
 1159      print 
' <input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
 
 1168    if (isModEnabled(
'intervention')) {
 
 1170      $num = count(
$object->linkedObjects);
 
 1174        foreach (
$object->linkedObjects as $objecttype => $objects) {
 
 1175          if ($objecttype == 
"fichinter") {
 
 1176            '@phan-var-force Fichinter[] $objects';
 
 1177            foreach ($objects as $fichinter) {
 
 1180              $timing += $fichinter->duration;
 
 1186      print $form->textwithpicto($langs->trans(
"TicketDurationAuto"), $langs->trans(
"TicketDurationAutoInfos"), 1);
 
 1193    include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
 
 1199    print 
'</div><div class="fichehalfright">';
 
 1202    print 
'<form method="post" name="formticketproperties" action="'.$url_page_current.
'">';
 
 1203    print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
 1204    print 
'<input type="hidden" name="action" value="change_property">';
 
 1205    print 
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
 
 1206    print 
'<input type="hidden" name="trackid" value="'.$trackid.
'">';
 
 1209    print 
'<div class="div-table-responsive-no-min">'; 
 
 1210    print 
'<table class="border tableforfield centpercent margintable bordertopimp">';
 
 1211    print 
'<tr class="liste_titre">';
 
 1213    print $langs->trans(
'TicketProperties');
 
 1216    if (
GETPOST(
'set', 
'alpha') == 
'properties' && $user->hasRight(
'ticket', 
'write')) {
 
 1217      print 
'<input type="submit" class="button smallpaddingimp" name="btn_update_ticket_prop" value="'.$langs->trans(
"Modify").
'" />';
 
 1220      if (isset(
$object->status) && (
$object->status < $object::STATUS_NEED_MORE_INFO || !
getDolGlobalInt(
'TICKET_DISALLOW_CLASSIFICATION_MODIFICATION_EVEN_IF_CLOSED')) && $user->hasRight(
'ticket', 
'write')) {
 
 1221        print 
' <a class="editfielda" href="card.php?track_id='.$object->track_id.
'&set=properties">'.
img_edit($langs->trans(
'Modify')).
'</a>';
 
 1227    if (
GETPOST(
'set', 
'alpha') == 
'properties' && $user->hasRight(
'ticket', 
'write')) {
 
 1230      print 
'<td class="titlefield">';
 
 1231      print $langs->trans(
'Type');
 
 1233      $formticket->selectTypesTickets(
$object->type_code, 
'update_value_type', 
'', 2);
 
 1239      print $langs->trans(
'TicketCategory');
 
 1241      $formticket->selectGroupTickets(
$object->category_code, 
'update_value_category', 
'', 2, 0, 0, 0, 
'maxwidth500 widthcentpercentminusxx');
 
 1247      print $langs->trans(
'TicketSeverity');
 
 1249      $formticket->selectSeveritiesTickets(
$object->severity_code, 
'update_value_severity', 
'', 2);
 
 1254      print 
'<tr><td class="titlefield">'.$langs->trans(
"Type").
'</td><td>';
 
 1255      if (!empty(
$object->type_code)) {
 
 1256        print $langs->getLabelFromKey($db, 
'TicketTypeShort'.
$object->type_code, 
'c_ticket_type', 
'code', 
'label', 
$object->type_code);
 
 1261      if (!empty(
$object->category_code)) {
 
 1262        $s = $langs->getLabelFromKey($db, 
'TicketCategoryShort'.
$object->category_code, 
'c_ticket_category', 
'code', 
'label', 
$object->category_code);
 
 1264      print 
'<tr><td>'.$langs->trans(
"TicketCategory").
'</td><td class="tdoverflowmax200" title="'.
dol_escape_htmltag($s).
'">';
 
 1268      print 
'<tr><td>'.$langs->trans(
"TicketSeverity").
'</td><td>';
 
 1269      if (!empty(
$object->severity_code)) {
 
 1270        print $langs->getLabelFromKey($db, 
'TicketSeverityShort'.
$object->severity_code, 
'c_ticket_severity', 
'code', 
'label', 
$object->severity_code);
 
 1280    if (isModEnabled(
'category')) {
 
 1281      print 
'<table class="border centpercent tableforfield">';
 
 1283      print 
'<td class="valignmiddle titlefield">';
 
 1284      print 
'<table class="nobordernopadding centpercent"><tr><td class="titlefield">';
 
 1285      print $langs->trans(
"Categories");
 
 1286      if ($action != 
'categories' && !$user->socid) {
 
 1287        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>';
 
 1292      if ($user->hasRight(
'ticket', 
'write') && $action == 
'categories') {
 
 1293        $cate_arbo = $form->select_all_categories(Categorie::TYPE_TICKET, 
'', 
'parent', 64, 0, 3);
 
 1294        if (is_array($cate_arbo)) {
 
 1296          print 
'<td colspan="3">';
 
 1297          print 
'<form action="'.$url_page_current.
'" method="POST">';
 
 1298          print 
'<input type="hidden" name="token" value="'.newToken().
'">';
 
 1299          print 
'<input type="hidden" name="track_id" value="'.$track_id.
'">';
 
 1300          print 
'<input type="hidden" name="action" value="set_categories">';
 
 1303          $cats = $category->containing(
$object->id, 
'ticket');
 
 1304          $arrayselected = array();
 
 1305          foreach ($cats as $cat) {
 
 1306            $arrayselected[] = $cat->id;
 
 1309          print 
img_picto(
'', 
'category', 
'class="pictofixedwidth"').$form->multiselectarray(
'categories', $cate_arbo, $arrayselected, 0, 0, 
'maxwidth500 widthcentpercentminusx', 0, 0);
 
 1310          print 
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Save').
'">';
 
 1315        print 
'<td colspan="3">';
 
 1316        print $form->showCategories(
$object->id, Categorie::TYPE_TICKET, 1);
 
 1324    $actionobject->viewTicketOriginalMessage($user, $action, 
$object);
 
 1328    print 
'<!-- navbar with status -->';
 
 1329    if (!$user->socid && $user->hasRight(
'ticket', 
'write') && isset(
$object->status) && 
$object->status < $object::STATUS_CLOSED) {
 
 1330      $actionobject->viewStatusActions(
$object);
 
 1335      print 
load_fiche_titre($langs->trans(
'Contacts'), 
'', 
'title_companies.png');
 
 1337      print 
'<div class="div-table-responsive-no-min">';
 
 1338      print 
'<div class="tagtable centpercent noborder allwidth">';
 
 1340      print 
'<div class="tagtr liste_titre">';
 
 1341      print 
'<div class="tagtd">'.$langs->trans(
"Source").
'</div> 
 1342      <div class="tagtd">' . $langs->trans(
"Company").
'</div> 
 1343      <div class="tagtd">' . $langs->trans(
"Contacts").
'</div> 
 1344      <div class="tagtd">' . $langs->trans(
"ContactType").
'</div> 
 1345      <div class="tagtd">' . $langs->trans(
"Phone").
'</div> 
 1346      <div class="tagtd center">' . $langs->trans(
"Status").
'</div>';
 
 1347      print 
'</div><!-- tagtr -->';
 
 1350      $companystatic = 
new Societe($db);
 
 1351      $contactstatic = 
new Contact($db);
 
 1352      $userstatic = 
new User($db);
 
 1354      foreach (array(
'internal', 
'external') as $source) {
 
 1356        $tab = $tmpobject->listeContact(-1, $source);
 
 1357        '@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';
 
 1358        $num = is_array($tab) ? 0 : count($tab);
 
 1360        foreach (array_keys($tab) as $i) {
 
 1362          print 
'<div class="tagtr '.($var ? 
'pair' : 
'impair').
'">';
 
 1364          print 
'<div class="tagtd left">';
 
 1365          if ($tab[$i][
'source'] == 
'internal') {
 
 1366            echo $langs->trans(
"User");
 
 1369          if ($tab[$i][
'source'] == 
'external') {
 
 1370            echo $langs->trans(
"ThirdPartyContact");
 
 1374          print 
'<div class="tagtd left">';
 
 1376          if ($tab[$i][
'socid'] > 0) {
 
 1377            $companystatic->fetch($tab[$i][
'socid']);
 
 1378            echo $companystatic->getNomUrl(-1);
 
 1380          if ($tab[$i][
'socid'] < 0) {
 
 1383          if (!$tab[$i][
'socid']) {
 
 1388          print 
'<div class="tagtd">';
 
 1389          if ($tab[$i][
'source'] == 
'internal') {
 
 1390            if ($userstatic->fetch($tab[$i][
'id'])) {
 
 1391              print $userstatic->getNomUrl(-1);
 
 1394          if ($tab[$i][
'source'] == 
'external') {
 
 1395            if ($contactstatic->fetch($tab[$i][
'id'])) {
 
 1396              print $contactstatic->getNomUrl(-1);
 
 1400          <div class="tagtd">' . $tab[$i][
'libelle'].
'</div>';
 
 1402          print 
'<div class="tagtd">';
 
 1406          if (!empty($tab[$i][
'phone_perso'])) {
 
 1408            print 
'<br>'.dol_print_phone($tab[$i][
'phone_perso'], 
'', 0, 0, 
'AC_TEL').
'<br>';
 
 1410          if (!empty($tab[$i][
'phone_mobile'])) {
 
 1412            print 
dol_print_phone($tab[$i][
'phone_mobile'], 
'', 0, 0, 
'AC_TEL').
'<br>';
 
 1416          print 
'<div class="tagtd center">';
 
 1418            echo 
'<a href="contact.php?track_id='.$object->track_id.
'&action=swapstatut&ligne='.$tab[$i][
'rowid'].
'">';
 
 1421          if ($tab[$i][
'source'] == 
'internal') {
 
 1422            $userstatic->id = $tab[$i][
'id'];
 
 1423            $userstatic->lastname = $tab[$i][
'lastname'];
 
 1424            $userstatic->firstname = $tab[$i][
'firstname'];
 
 1425            echo $userstatic->LibStatut($tab[$i][
'statuscontact'], 3);
 
 1427          if ($tab[$i][
'source'] == 
'external') {
 
 1428            $contactstatic->id = $tab[$i][
'id'];
 
 1429            $contactstatic->lastname = $tab[$i][
'lastname'];
 
 1430            $contactstatic->firstname = $tab[$i][
'firstname'];
 
 1431            echo $contactstatic->LibStatut($tab[$i][
'statuscontact'], 3);
 
 1439          print 
'</div><!-- tagtr -->';
 
 1445      print 
'</div><!-- contact list -->';
 
 1449    print 
'</div></div>';
 
 1450    print 
'<div class="clearboth"></div>';
 
 1456    if ($action != 
'presend' && $action != 
'presend_addmessage' && $action != 
'editline') {
 
 1457      print 
'<div class="tabsAction">'.
"\n";
 
 1458      $parameters = array();
 
 1459      $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, 
$object, $action); 
 
 1464      if (empty($reshook)) {
 
 1466        if (isset(
$object->status) && 
$object->status < Ticket::STATUS_CLOSED && $action != 
"presend" && $action != 
"presend_addmessage") {
 
 1467          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', 
'');
 
 1471        if (isset(
$object->status) && 
$object->status < Ticket::STATUS_CLOSED && $action != 
"presend" && $action != 
"presend_addmessage") {
 
 1472          print 
dolGetButtonAction(
'', $langs->trans(
'TicketAddPrivateMessage'), 
'default', $_SERVER[
"PHP_SELF"].
'?action=presend_addmessage&mode=init&token='.
newToken().
'&track_id='.
$object->track_id.
'#formmailbeforetitle', 
'');
 
 1478          print 
dolGetButtonAction($langs->trans(
'UnableToCreateInterIfNoSocid'), $langs->trans(
'TicketAddIntervention'), 
'default', $_SERVER[
'PHP_SELF']. 
'#', 
'', 
false);
 
 1480        if (
$object->fk_soc > 0 && isset(
$object->status) && 
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ficheinter', 
'creer')) {
 
 1481          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, 
'');
 
 1485        if (isset(
$object->status) && 
$object->status >= 0 && 
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ticket', 
'write')) {
 
 1486          print 
dolGetButtonAction(
'', $langs->trans(
'CloseTicket'), 
'default', $_SERVER[
"PHP_SELF"].
'?action=close&token='.
newToken().
'&track_id='.
$object->track_id, 
'');
 
 1490        if (isset(
$object->status) && 
$object->status > 0 && 
$object->status < Ticket::STATUS_CLOSED && $user->hasRight(
'ticket', 
'write')) {
 
 1491          print 
dolGetButtonAction(
'', $langs->trans(
'AbandonTicket'), 
'default', $_SERVER[
"PHP_SELF"].
'?action=abandon&token='.
newToken().
'&track_id='.
$object->track_id, 
'');
 
 1495        if (!$user->socid && (isset(
$object->status) && (
$object->status == Ticket::STATUS_CLOSED || 
$object->status == Ticket::STATUS_CANCELED)) && !$user->socid) {
 
 1500        if ($permissiontoedit) {
 
 1501          print 
dolGetButtonAction(
'', $langs->trans(
'Modify'), 
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=edit&token='.
newToken(), 
'', $permissiontoedit);
 
 1505        if ($user->hasRight(
'ticket', 
'delete') && !$user->socid) {
 
 1509      print 
'</div>'.
"\n";
 
 1513    if (
GETPOST(
'modelselected')) {
 
 1514      $action = 
'presend';
 
 1517    if (GETPOSTISSET(
'actionbis') && $action == 
'presend') {
 
 1518      $action = 
'presend_addmessage';
 
 1522    if ($action == 
'presend' || $action == 
'presend_addmessage') {
 
 1527      $outputlangs = $langs;
 
 1530        $newlang = 
GETPOST(
'lang_id', 
'aZ09');
 
 1532        $newlang = 
$object->thirdparty->default_lang;
 
 1534      if (!empty($newlang)) {
 
 1536        $outputlangs->setDefaultLang($newlang);
 
 1539      $arrayoffamiliestoexclude = array(
'objectamount');
 
 1541      $action = 
'add_message'; 
 
 1542      $modelmail = 
'ticket_send';
 
 1545      $morehtmlright = 
'';
 
 1549      $morehtmlright .= $form->textwithpicto(
'<span class="opacitymedium">'.$langs->trans(
"TicketMessageSubstitutionReplacedByGenericValues").
'</span>', $help, 1, 
'helpclickable', 
'', 0, 3, 
'helpsubstitution');
 
 1553      print 
'<div id="formmailbeforetitle" name="formmailbeforetitle"></div>';
 
 1555      print 
load_fiche_titre($langs->trans(
'TicketAddMessage'), $morehtmlright, 
'messages@ticket');
 
 1561      $formticket->action = $action;
 
 1562      $formticket->track_id = 
$object->track_id;
 
 1563      $formticket->ref = 
$object->ref;
 
 1564      $formticket->id = 
$object->id;
 
 1565      $formticket->trackid = 
'tic'.$object->id;
 
 1567      $formticket->withfile = 2;
 
 1568      $formticket->withcancel = 1;
 
 1569      $formticket->param = array(
'fk_user_create' => $user->id);
 
 1570      $formticket->param[
'langsmodels'] = (empty($newlang) ? $langs->defaultlang : $newlang);
 
 1573      $formticket->param[
'models'] = $modelmail;
 
 1574      $formticket->param[
'models_id'] = 
GETPOSTINT(
'modelmailselected');
 
 1576      $formticket->param[
'returnurl'] = $_SERVER[
"PHP_SELF"].
'?track_id='.
$object->track_id;
 
 1578      $formticket->withsubstit = 1;
 
 1579      $formticket->substit = $substitutionarray;
 
 1580      $formticket->backtopage = $backtopage;
 
 1582      $formticket->showMessageForm(
'100%');
 
 1588      $param = 
'&id='.$object->id;
 
 1589      if (!empty($contextpage) && $contextpage != $_SERVER[
"PHP_SELF"]) {
 
 1590        $param .= 
'&contextpage='.$contextpage;
 
 1592      if ($limit > 0 && $limit != 
$conf->liste_limit) {
 
 1593        $param .= 
'&limit='.$limit;
 
 1596        $param .= 
'&actioncode='.urlencode($actioncode);
 
 1598      if ($search_agenda_label) {
 
 1599        $param .= 
'&search_agenda_label='.urlencode($search_agenda_label);
 
 1602      $morehtmlright = 
'';
 
 1604      $messagingUrl = DOL_URL_ROOT.
'/ticket/agenda.php?track_id='.
$object->track_id;
 
 1605      $morehtmlright .= 
dolGetButtonTitle($langs->trans(
'MessageListViewType'), 
'', 
'fa fa-bars imgforviewmode', $messagingUrl, 
'', 1);
 
 1608      $btnstatus = 
$object->status < Ticket::STATUS_CLOSED && $action != 
"presend" && $action != 
"presend_addmessage" && $action != 
"add_message";
 
 1609      $url = 
'card.php?track_id='.$object->track_id.
'&action=presend_addmessage&mode=init';
 
 1610      $morehtmlright .= 
dolGetButtonTitle($langs->trans(
'TicketAddMessage'), 
'', 
'fa fa-comment-dots', $url, 
'add-new-ticket-title-button', (
int) $btnstatus);
 
 1613      $btnstatus = 
$object->status < Ticket::STATUS_CLOSED && $action != 
"presend" && $action != 
"presend_addmessage" && $action != 
"add_message";
 
 1614      $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);
 
 1615      $morehtmlright .= 
dolGetButtonTitle($langs->trans(
'AddAction'), 
'', 
'fa fa-plus-circle', $url, 
'add-new-ticket-even-button', (
int) $btnstatus);
 
 1617      print_barre_liste($langs->trans(
"ActionsOnTicket"), 0, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, 
'', 0, -1, 
'', 0, $morehtmlright, 
'', 0, 1, 1);
 
 1621      $filters[
'search_agenda_label'] = $search_agenda_label;
 
 1622      $filters[
'search_rowid'] = $search_rowid;
 
 1624      show_actions_messaging(
$conf, $langs, $db, 
$object, 
null, 0, $actioncode, 
'', $filters, $sortfield, $sortorder);
 
 1627    if ($action != 
'presend' && $action != 
'presend_addmessage' && $action != 
'add_message') {
 
 1628      print 
'<div class="fichecenter"><div class="fichehalfleft">';
 
 1629      print 
'<a name="builddoc"></a>'; 
 
 1635      $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
 
 1636      $genallowed = $permissiontoadd;
 
 1637      $delallowed = $permissiontodelete;
 
 1641        $codelang = 
$object->thirdparty->default_lang;
 
 1644      print $formfile->showdocuments(
'ticket', $filename, $filedir, $urlsource, $genallowed, $delallowed, 
$object->model_pdf, 1, 0, 0, 28, 0, 
'', 0, 
'', $codelang);
 
 1647      $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'ticket'), 1);
 
 1648      $linktoelem = $tmparray[
'linktoelem'];
 
 1649      $htmltoenteralink = $tmparray[
'htmltoenteralink'];
 
 1650      print $htmltoenteralink;
 
 1652      $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
 
 1655      print 
'<br><!-- Link to public interface -->'.
"\n";
 
 1660        print 
'<div class="fichehalfright">';
 
 1664        $morehtmlcenter = 
'<div class="nowraponall">';
 
 1665        $morehtmlcenter .= 
dolGetButtonTitle($langs->trans(
'FullConversation'), 
'', 
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/ticket/messaging.php?id='.
$object->id);
 
 1666        $morehtmlcenter .= 
dolGetButtonTitle($langs->trans(
'FullList'), 
'', 
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/ticket/agenda.php?id='.
$object->id);
 
 1667        $morehtmlcenter .= 
'</div>';
 
 1670        include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
 
 1672        $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)
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...
 
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.