static function geTimelineItems(Ticket $ticket, $rand) { global $DB, $CFG_GLPI; $timeline = array(); $user = new User(); $group = new Group(); $followup_obj = new TicketFollowup(); $task_obj = new TicketTask(); $document_item_obj = new Document_Item(); $ticket_valitation_obj = new TicketValidation(); //checks rights $showpublic = Session::haveRightsOr("followup", array(TicketFollowup::SEEPUBLIC, TicketFollowup::SEEPRIVATE)) && Session::haveRightsOr("task", array(TicketTask::SEEPUBLIC, TicketTask::SEEPRIVATE)); $restrict_fup = $restrict_task = ""; if (!Session::haveRight("ticket", TicketFollowup::SEEPRIVATE)) { $restrict_fup = " AND (`is_private` = '0'\n OR `users_id` ='" . Session::getLoginUserID() . "') "; } if (!Session::haveRight("ticket", TicketTask::SEEPRIVATE)) { $restrict_task = " AND (`is_private` = '0'\n OR `users_id` ='" . Session::getLoginUserID() . "') "; } if (!$showpublic) { $restrict = " AND 1 = 0"; } //add ticket followups to timeline $followups = $followup_obj->find("tickets_id = " . $ticket->getID() . " {$restrict_fup}", 'date DESC'); foreach ($followups as $followups_id => $followup) { $followup_obj->getFromDB($followups_id); $can_edit = $followup_obj->canUpdateItem(); $followup['can_edit'] = $can_edit; $timeline[$followup['date'] . "_followup_" . $followups_id] = array('type' => 'TicketFollowup', 'item' => $followup); } //add ticket tasks to timeline $tasks = $task_obj->find("tickets_id = " . $ticket->getID() . " {$restrict_task}", 'date DESC'); foreach ($tasks as $tasks_id => $task) { $task_obj->getFromDB($tasks_id); $can_edit = $task_obj->canUpdateItem(); $task['can_edit'] = $can_edit; $timeline[$task['date'] . "_task_" . $tasks_id] = array('type' => 'TicketTask', 'item' => $task); } //add ticket documents to timeline $document_obj = new Document(); $document_items = $document_item_obj->find("itemtype = 'Ticket' AND items_id = " . $ticket->getID()); foreach ($document_items as $document_item) { $document_obj->getFromDB($document_item['documents_id']); $timeline[$document_obj->fields['date_mod'] . "_document_" . $document_item['documents_id']] = array('type' => 'Document_Item', 'item' => $document_obj->fields); } //add assign changes /*$log_obj = new Log; $gassign_items = $log_obj->find("itemtype = 'Ticket' AND items_id = ".$ticket->getID()." AND itemtype_link = 'Group' AND linked_action = '15'"); foreach ($gassign_items as $logs_id => $gassign) { //find group $group_name = preg_replace("#(.*)\s\([0-9]*\)#", "$1", $gassign['new_value']); $groups = $group->find("name = '$group_name'"); $first_group = array_shift($groups); $group->getFromDB($first_group['id']); $content = __("Assigned to")." : ". "<img src='".$CFG_GLPI['root_doc']."/plugins/talk/pics/group.png' class='group_assign' />". " <strong>".$group->getLink()."</strong>"; //find user $user_name = preg_replace("#(.*)\s\([0-9]*\)#", "$1", $gassign['user_name']); $users = $user->find("CONCAT(firstname, ' ', realname) = '$user_name'"); $first_user = array_shift($users); if ($first_user == NULL) { $first_user['id'] = false; } $timeline[$gassign['date_mod']."_assign_".$logs_id] = array('type' => 'Assign', 'item' => array( 'date' => $gassign['date_mod'], 'content' => $content, 'can_edit' => false, 'users_id' => $first_user['id'] )); }*/ //add existing solution if (!empty($ticket->fields['solution'])) { $users_id = 0; $solution_date = $ticket->fields['solvedate']; //search date and user of last solution in glpi_logs if ($res_solution = $DB->query("SELECT date_mod AS solution_date, user_name FROM glpi_logs\n WHERE itemtype = 'Ticket' \n AND items_id = " . $ticket->getID() . "\n AND id_search_option = 24\n ORDER BY id DESC\n LIMIT 1")) { $data_solution = $DB->fetch_assoc($res_solution); if (!empty($data_solution['solution_date'])) { $solution_date = $data_solution['solution_date']; } // find user if (!empty($data_solution['user_name'])) { $users_id = addslashes(trim(preg_replace("/.*\\(([0-9]+)\\)/", "\$1", $data_solution['user_name']))); } } // fix trouble with html_entity_decode who skip accented characters (on windows browser) $solution_content = preg_replace_callback("/(&#[0-9]+;)/", function ($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); }, $ticket->fields['solution']); $timeline[$solution_date . "_solution"] = array('type' => 'Solution', 'item' => array('id' => 0, 'content' => Html::clean(html_entity_decode($solution_content)), 'date' => $solution_date, 'users_id' => $users_id, 'solutiontypes_id' => $ticket->fields['solutiontypes_id'], 'can_edit' => Ticket::canUpdate() && $ticket->canSolve())); } // add ticket validation to timeline if ($ticket->fields['type'] == Ticket::DEMAND_TYPE && (Session::haveRight('ticketvalidation', TicketValidation::VALIDATEREQUEST) || Session::haveRight('ticketvalidation', TicketValidation::CREATEREQUEST)) || $ticket->fields['type'] == Ticket::INCIDENT_TYPE && (Session::haveRight('ticketvalidation', TicketValidation::VALIDATEINCIDENT) || Session::haveRight('ticketvalidation', TicketValidation::CREATEINCIDENT))) { $ticket_validations = $ticket_valitation_obj->find('tickets_id = ' . $ticket->getID()); foreach ($ticket_validations as $validations_id => $validation) { $canedit = $ticket_valitation_obj->can($validations_id, UPDATE); $user->getFromDB($validation['users_id_validate']); $timeline[$validation['submission_date'] . "_validation_" . $validations_id] = array('type' => 'TicketValidation', 'item' => array('id' => $validations_id, 'date' => $validation['submission_date'], 'content' => __('Validation request') . " => " . $user->getlink() . "<br>" . $validation['comment_submission'], 'users_id' => $validation['users_id'], 'can_edit' => $canedit)); if (!empty($validation['validation_date'])) { $timeline[$validation['validation_date'] . "_validation_" . $validations_id] = array('type' => 'TicketValidation', 'item' => array('id' => $validations_id, 'date' => $validation['validation_date'], 'content' => __('Validation request answer') . " : " . _sx('status', ucfirst(TicketValidation::getStatus($validation['status']))) . "<br>" . $validation['comment_validation'], 'users_id' => $validation['users_id_validate'], 'status' => "status_" . $validation['status'], 'can_edit' => $canedit)); } } } //reverse sort timeline items by key (date) krsort($timeline); return $timeline; }
/** * @since version 0.90 * * @param $rand **/ function showTimelineForm($rand) { global $CFG_GLPI; //check global rights if (!Session::haveRight("ticket", Ticket::READMY) && !Session::haveRightsOr("followup", array(TicketFollowup::SEEPUBLIC, TicketFollowup::SEEPRIVATE))) { return false; } // javascript function for add and edit items echo "<script type='text/javascript' >\n"; echo "function viewAddSubitem" . $this->fields['id'] . "{$rand}(itemtype) {\n"; $params = array('action' => 'viewsubitem', 'type' => 'itemtype', 'parenttype' => 'Ticket', 'tickets_id' => $this->fields['id'], 'id' => -1); if (isset($_GET['load_kb_sol'])) { $params['load_kb_sol'] = $_GET['load_kb_sol']; } $out = Ajax::updateItemJsCode("viewitem" . $this->fields['id'] . "{$rand}", $CFG_GLPI["root_doc"] . "/ajax/timeline.php", $params, "", false); echo str_replace("\"itemtype\"", "itemtype", $out); echo "\$('#approbation_form{$rand}').remove()"; echo "};"; echo "\n\n function change_task_state(tasks_id, target) {\n \$.post('" . $CFG_GLPI["root_doc"] . "/ajax/timeline.php',\n {'action': 'change_task_state',\n 'tasks_id': tasks_id,\n 'tickets_id': " . $this->fields['id'] . "\n })\n .done(function(new_state) {\n \$(target).removeClass('state_1 state_2')\n .addClass('state_'+new_state);\n });\n }\n\n function viewEditSubitem" . $this->fields['id'] . "{$rand}(e, itemtype, items_id, o, domid) {\n domid = (typeof domid === 'undefined')\n ? 'viewitem" . $this->fields['id'] . $rand . "'\n : domid;\n var target = e.target || window.event.srcElement;\n if (target.nodeName == 'a') return;\n if (target.className == 'read_more_button') return;\n \$('#'+domid).addClass('edited');\n \$('#'+domid+' .displayed_content').hide();\n \$('#'+domid+' .cancel_edit_item_content').show()\n .click(function() {\n \$(this).hide();\n \$('#'+domid).removeClass('edited');\n \$('#'+domid+' .edit_item_content').empty().hide();\n \$('#'+domid+' .displayed_content').show();\n });\n \$('#'+domid+' .edit_item_content').show()\n .load('" . $CFG_GLPI["root_doc"] . "/ajax/timeline.php',\n {'action' : 'viewsubitem',\n 'type' : itemtype,\n 'parenttype': 'Ticket',\n 'tickets_id': " . $this->fields['id'] . ",\n 'id' : items_id\n });\n\n\n };"; if (isset($_GET['load_kb_sol'])) { echo "viewAddSubitem" . $this->fields['id'] . "{$rand}('Solution');"; } echo "</script>\n"; //check sub-items rights $tmp = array('tickets_id' => $this->getID()); $fup = new TicketFollowup(); $ttask = new TicketTask(); $doc = new Document(); $canadd_fup = $fup->can(-1, CREATE, $tmp); $canadd_task = $ttask->can(-1, CREATE, $tmp); $canadd_document = $doc->can(-1, CREATE, $tmp) && $this->canAddItem('Document'); $canadd_solution = Ticket::canUpdate() && $this->canSolve(); if (!$canadd_fup && !$canadd_task && !$canadd_document && !$canadd_solution) { return false; } //show choices echo "<h2>" . _sx('button', 'Add') . " : </h2>"; echo "<div class='timeline_form'>"; echo "<ul class='timeline_choices'>"; if ($canadd_fup) { echo "<li class='followup' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"TicketFollowup\");'>" . __("Followup") . "</li>"; } if ($canadd_task) { echo "<li class='task' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"TicketTask\");'>" . __("Task") . "</li>"; } if ($canadd_document) { echo "<li class='document' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"Document_Item\");'>" . __("Document") . "</li>"; } if ($canadd_solution) { echo "<li class='solution' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"Solution\");'>" . __("Solution") . "</li>"; } echo "</ul>"; // timeline_choices echo "<div class='clear'> </div>"; echo "</div>"; //end timeline_form echo "<div class='ajax_box' id='viewitem" . $this->fields['id'] . "{$rand}'></div>\n"; }
/** * @since version 0.90 * * @param $rand **/ function showTimelineForm($rand) { global $CFG_GLPI; //check global rights if (!Session::haveRight("ticket", Ticket::READMY) && !Session::haveRightsOr("followup", array(TicketFollowup::SEEPUBLIC, TicketFollowup::SEEPRIVATE))) { return false; } // javascript function for add and edit items echo "<script type='text/javascript' >\n"; echo "function viewAddSubitem" . $this->fields['id'] . "{$rand}(itemtype) {\n"; $params = array('type' => 'itemtype', 'parenttype' => 'Ticket', 'tickets_id' => $this->fields['id'], 'id' => -1); if (isset($_GET['load_kb_sol'])) { $params['load_kb_sol'] = $_GET['load_kb_sol']; } $out = Ajax::updateItemJsCode("viewitem" . $this->fields['id'] . "{$rand}", $CFG_GLPI["root_doc"] . "/ajax/timeline_viewsubitem.php", $params, "", false); echo str_replace("\"itemtype\"", "itemtype", $out); echo "\$('#approbation_form{$rand}').remove()"; echo "};"; $out = "function viewEditSubitem" . $this->fields['id'] . "{$rand}(e, itemtype, items_id, o) {\n\n var target = e.target || window.event.srcElement;\n if (target.nodeName == 'a') return;\n if (target.className == 'read_more_button') return;"; $params = array('type' => 'itemtype', 'parenttype' => 'Ticket', 'tickets_id' => $this->fields['id'], 'id' => 'items_id'); $out .= Ajax::updateItemJsCode("viewitem" . $this->fields['id'] . "{$rand}", $CFG_GLPI["root_doc"] . "/ajax/timeline_viewsubitem.php", $params, "", false); $out = str_replace("\"itemtype\"", "itemtype", $out); $out = str_replace("\"items_id\"", "items_id", $out); echo $out; //scroll to edit form echo "\$('body').scrollTop(0);"; echo "\$('.ui-tabs-panel').scrollTop(0);"; // add a mark to currently edited element echo "var found_active = \$('.talk_active');\n i = found_active.length;\n while(i--) {\n var classes = found_active[i].className.replace( /(?:^|\\s)talk_active(?!\\S)/ , '' );\n found_active[i].className = classes;\n }\n o.className = o.className + ' talk_active';\n\n \$('#approbation_form{$rand}').remove();\n };"; if (isset($_GET['load_kb_sol'])) { echo "viewAddSubitem" . $this->fields['id'] . "{$rand}('Solution');"; } echo "</script>\n"; //check sub-items rights $tmp = array('tickets_id' => $this->getID()); $fup = new TicketFollowup(); $ttask = new TicketTask(); $doc = new Document(); $canadd_fup = $fup->can(-1, CREATE, $tmp); $canadd_task = $ttask->can(-1, CREATE, $tmp); $canadd_document = $doc->can(-1, CREATE, $tmp) && $this->canAddItem('Document'); $canadd_solution = Ticket::canUpdate() && $this->canSolve(); if (!$canadd_fup && !$canadd_task && !$canadd_document && !$canadd_solution) { return false; } //show choices echo "<h2>" . _sx('button', 'Add') . " : </h2>"; echo "<div class='timeline_form'>"; echo "<ul class='timeline_choices'>"; if ($canadd_fup) { echo "<li class='followup' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"TicketFollowup\");'>" . __("Followup") . "</li>"; } if ($canadd_task) { echo "<li class='task' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"TicketTask\");'>" . __("Task") . "</li>"; } if ($canadd_document) { echo "<li class='document' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"Document_Item\");'>" . __("Document") . "</li>"; } if ($canadd_solution) { echo "<li class='solution' onclick='" . "javascript:viewAddSubitem" . $this->fields['id'] . "{$rand}(\"Solution\");'>" . __("Solution") . "</li>"; } echo "</ul>"; // timeline_choices echo "<div class='clear'> </div>"; echo "</div>"; //end timeline_form echo "<div class='ajax_box' id='viewitem" . $this->fields['id'] . "{$rand}'></div>\n"; }
static function showForTicket(Ticket $item) { if (!self::canView()) { return false; } $canedit = $item->canUpdate() && self::canUpdate(); echo "<form name='form' method='post' action='" . Toolbox::getItemTypeFormURL(__CLASS__) . "'>"; echo "<div align='center'><table class='tab_cadre_fixe'>"; echo "<tr><th colspan='2'>" . __('Close ticket informations', 'moreticket') . "</th></tr>"; // Writer echo "<tr class='tab_bg_1'>"; echo "<td>"; echo __('Writer'); echo "</td>"; echo "<td>"; echo getUserName(Session::getLoginUserID()); echo "<input name='requesters_id' type='hidden' value='" . Session::getLoginUserID() . "'>"; echo "</td>"; echo "</tr>"; // Date echo "<tr class='tab_bg_1'>"; echo "<td>"; echo "</td>"; echo "<td>"; Html::showDateTimeField("date", array('value' => date('Y-m-d H:i:s'))); echo "</td>"; echo "</tr>"; // Comments echo "<tr class='tab_bg_1'>"; echo "<td>"; echo __('Comments'); echo "</td>"; echo "<td>"; echo "<textarea cols='80' rows='8' name='comment'></textarea>"; echo "</td>"; echo "</tr>"; // Documents echo "<tr class='tab_bg_1'>"; echo "<td colspan='2' style='padding:10px 20px 0px 20px'>"; echo Html::file(); echo "(" . Document::getMaxUploadSize() . ") "; echo "</td>"; echo "</tr>"; if ($canedit) { echo "<tr>"; echo "<td class='tab_bg_2 center' colspan='6'>"; echo "<input type='submit' name='add' class='submit' value='" . _sx('button', 'Add') . "' >"; echo "<input type='hidden' name='tickets_id' class='submit' value='" . $item->fields['id'] . "' >"; echo "<input type='hidden' name='items_id' class='submit' value='" . $item->fields['id'] . "' >"; echo "<input type='hidden' name='itemtype' class='submit' value='Ticket' >"; echo "</td>"; echo "</tr>"; } echo "</table></div>"; Html::closeForm(); // List self::showList($item, $canedit); }