function __construct($entity = '', $event = '', $object = null, $options = array()) { parent::__construct($entity, $event, $object, $options); $this->options['sendprivate'] = false; if (isset($options['followup_id'])) { $fup = new TicketFollowup(); if ($fup->getFromDB($options['followup_id'])) { if ($fup->fields['is_private']) { $this->options['sendprivate'] = true; } } } if (isset($options['task_id'])) { $fup = new TicketTask(); if ($fup->getFromDB($options['task_id'])) { if ($fup->fields['is_private']) { $this->options['sendprivate'] = true; } } } }
/** * Constructor * * @param $mailgateID ID of the mailgate * @param $display display messages in MessageAfterRedirect or just return error * * @return if $display = false return messages result string **/ function collect($mailgateID, $display = 0) { global $LANG, $CFG_GLPI; if ($this->getFromDB($mailgateID)) { $this->mid = -1; $this->fetch_emails = 0; //Connect to the Mail Box $this->connect(); $rejected = new NotImportedEmail(); // Clean from previous collect (from GUI, cron already truncate the table) $rejected->deleteByCriteria(array('mailcollectors_id' => $this->fields['id'])); if ($this->marubox) { // Get Total Number of Unread Email in mail box $tot = $this->getTotalMails(); //Total Mails in Inbox Return integer value $error = 0; $refused = 0; for ($i = 1; $i <= $tot && $this->fetch_emails < $this->maxfetch_emails; $i++) { $tkt = $this->buildTicket($i, array('mailgates_id' => $mailgateID, 'play_rules' => true)); //Indicates that the mail must be deleted from the mailbox $delete_mail = false; //If entity assigned, or email refused by rule, or no user associated with the email $user_condition = $CFG_GLPI["use_anonymous_helpdesk"] || isset($tkt['_users_id_requester']) && $tkt['_users_id_requester'] > 0; // Manage blacklisted emails if (isset($tkt['_blacklisted']) && $tkt['_blacklisted']) { $this->deleteMails($i); // entities_id set when new ticket / tickets_id when new followup } else { if ((isset($tkt['entities_id']) || isset($tkt['tickets_id'])) && $user_condition || isset($tkt['_refuse_email_no_response']) || isset($tkt['_refuse_email_with_response'])) { if (isset($tkt['_refuse_email_with_response'])) { $this->sendMailRefusedResponse($tkt['_head']['from'], $tkt['name']); $delete_mail = true; $refused++; } else { if (isset($tkt['_refuse_email_no_response'])) { $delete_mail = true; $refused++; } else { if (isset($tkt['entities_id']) || isset($tkt['tickets_id'])) { $tkt['_mailgate'] = $mailgateID; $result = imap_fetchheader($this->marubox, $i); // Is a mail responding of an already existgin ticket ? if (isset($tkt['tickets_id'])) { // Deletion of message with sucess if (false === is_array($result)) { $fup = new TicketFollowup(); if ($fup->add($tkt)) { $delete_mail = true; } } else { $error++; } } else { // New ticket // Deletion of message with sucess if (false === is_array($result)) { $track = new Ticket(); if ($track->add($tkt)) { $delete_mail = true; } } else { $error++; } } } else { // Case never raise $delete_mail = true; $refused++; } } } //Delete Mail from Mail box if ticket is added successfully if ($delete_mail) { $this->deleteMails($i); } } else { $input = array(); $input['mailcollectors_id'] = $mailgateID; $input['from'] = $tkt['_head']['from']; $input['to'] = $tkt['_head']['to']; if (!$tkt['_users_id_requester']) { $input['reason'] = NotImportedEmail::USER_UNKNOWN; } else { $input['reason'] = NotImportedEmail::MATCH_NO_RULE; } $input['users_id'] = $tkt['_users_id_requester']; $input['subject'] = $this->textCleaner($tkt['_head']['subject']); $input['messageid'] = $tkt['_head']['message_id']; $input['date'] = $_SESSION["glpi_currenttime"]; $rejected->add($input); } } $this->fetch_emails++; } imap_expunge($this->marubox); $this->close_mailbox(); //Close Mail Box if ($display) { if ($error == 0) { addMessageAfterRedirect($LANG['mailgate'][3] . " : " . $this->fetch_emails); } else { addMessageAfterRedirect($LANG['mailgate'][3] . " : " . $this->fetch_emails . " ({$error} " . $LANG['common'][63] . ")", false, ERROR); } } else { return "Number of messages: available={$tot}, collected=" . $this->fetch_emails . ($error > 0 ? " ({$error} error(s))" : "" . ($refused > 0 ? " ({$refused} refused)" : "")); } } else { if ($display) { addMessageAfterRedirect($LANG['log'][41], false, ERROR); } else { return "Could not connect to mailgate server"; } } } else { if ($display) { addMessageAfterRedirect($LANG['common'][54] . " : mailgate " . $mailgateID, false, ERROR); } else { return 'Could find mailgate ' . $mailgateID; } } }
/** * @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"; }
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GLPI; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -------------------------------------------------------------------------- */ // ---------------------------------------------------------------------- // Original Author of file: // Purpose of file: // ---------------------------------------------------------------------- define('GLPI_ROOT', '..'); include GLPI_ROOT . "/inc/includes.php"; //checkCentralAccess(); $fup = new TicketFollowup(); if (isset($_POST["add"])) { $fup->check(-1, 'w', $_POST); $fup->add($_POST); Event::log($fup->getField('tickets_id'), "ticket", 4, "tracking", $_SESSION["glpiname"] . " " . $LANG['log'][21]); glpi_header($_SERVER['HTTP_REFERER']); } else { if (isset($_POST['add_close']) || isset($_POST['add_reopen'])) { $ticket = new Ticket(); if ($ticket->getFromDB($_POST["tickets_id"]) && $ticket->canApprove()) { $fup->add($_POST); Event::log($fup->getField('tickets_id'), "ticket", 4, "tracking", $_SESSION["glpiname"] . " " . $LANG['log'][29]); glpi_header($_SERVER['HTTP_REFERER']); } } else { if (isset($_POST["update"])) {
static function showHistory(Ticket $ticket, $rand) { global $CFG_GLPI, $DB; //get ticket actors $ticket_users_keys = self::prepareTicketUser($ticket); $user = new User(); $followup_obj = new TicketFollowup(); $pics_url = "../plugins/talk/pics"; $timeline = self::geTimelineItems($ticket, $rand); //include lib for parsing url require GLPI_ROOT . "/plugins/talk/lib/urllinker.php"; //display timeline echo "<div class='talk_history'>"; $tmp = array_values($timeline); $first_item = array_shift($tmp); //don't display title on solution approbation if ($first_item['type'] != 'Solution' || $ticket->fields["status"] != CommonITILObject::SOLVED) { self::showHistoryHeader(); } $timeline_index = 0; foreach ($timeline as $item) { $item_i = $item['item']; // don't display empty followup (ex : solution approbation) if ($item['type'] == 'TicketFollowup' && empty($item_i['content'])) { continue; } self::addJavascriptForViewAddSubitem($ticket, $rand); $date = ""; if (isset($item_i['date'])) { $date = $item_i['date']; } if (isset($item_i['date_mod'])) { $date = $item_i['date_mod']; } // check if curent item user is assignee or requester $user_position = 'left'; if (isset($ticket_users_keys[$item_i['users_id']]) && $ticket_users_keys[$item_i['users_id']] == CommonItilActor::ASSIGN || $item['type'] == 'Assign') { $user_position = 'right'; } //display solution in middle if ($timeline_index == 0 && $item['type'] == "Solution" && $ticket->fields["status"] == CommonITILObject::SOLVED) { $user_position .= ' middle'; } echo "<div class='h_item {$user_position}'>"; echo "<div class='h_info'>"; echo "<div class='h_date'>" . Html::convDateTime($date) . "</div>"; if ($item_i['users_id'] !== false) { echo "<div class='h_user'>"; if (isset($item_i['users_id']) && $item_i['users_id'] != 0) { $user->getFromDB($item_i['users_id']); echo "<div class='tooltip_picture_border'>"; echo "<img class='user_picture' alt=\"" . __s('Picture') . "\" src='" . User::getThumbnailURLForPicture($user->fields['picture']) . "'>"; echo "</div>"; echo $user->getLink(); } else { echo __("Requester"); } echo "</div>"; } echo "</div>"; echo "<div class='h_content " . $item['type'] . (isset($item_i['status']) ? " " . $item_i['status'] : "") . "'"; if (!in_array($item['type'], array('Document_Item', 'Assign')) && $item_i['can_edit']) { echo " ondblclick='javascript:viewEditSubitem" . $ticket->fields['id'] . "{$rand}(event, \"" . $item['type'] . "\", " . $item_i['id'] . ", this)'"; } echo ">"; if (isset($item_i['requesttypes_id']) && file_exists("{$pics_url}/" . $item_i['requesttypes_id'] . ".png")) { echo "<img src='{$pics_url}/" . $item_i['requesttypes_id'] . ".png' title='' class='h_requesttype' />"; } if (isset($item_i['content'])) { $content = $item_i['content']; $content = linkUrlsInTrustedHtml($content); //$content = nl2br($content); $long_text = ""; if (substr_count($content, "<br") > 30 || strlen($content) > 2000) { $long_text = "long_text"; } echo "<div class='item_content {$long_text}'>"; echo "<p>"; echo $content; echo "</p>"; if (!empty($long_text)) { echo "<p class='read_more'>"; echo "<a class='read_more_button'>.....</a>"; echo "</p>"; } echo "</div>"; } echo "<div class='b_right'>"; if (isset($item_i['solutiontypes_id']) && !empty($item_i['solutiontypes_id'])) { echo Dropdown::getDropdownName("glpi_solutiontypes", $item_i['solutiontypes_id']) . "<br>"; } if (isset($item_i['taskcategories_id']) && !empty($item_i['taskcategories_id'])) { echo Dropdown::getDropdownName("glpi_taskcategories", $item_i['taskcategories_id']) . "<br>"; } if (isset($item_i['actiontime']) && !empty($item_i['actiontime'])) { echo "<span class='actiontime'>"; echo Html::timestampToString($item_i['actiontime'], false); echo "</span>"; } if (isset($item_i['state'])) { echo "<span class='state state_" . $item_i['state'] . "'>"; echo Planning::getState($item_i['state']); echo "</span>"; } if (isset($item_i['begin'])) { echo "<span class='planification'>"; echo Html::convDateTime($item_i["begin"]); echo " => "; echo Html::convDateTime($item_i["end"]); echo "</span>"; } if (isset($item_i['users_id_tech'])) { echo "<div class='users_id_tech'>"; $user->getFromDB($item_i['users_id_tech']); echo "<div class='tooltip_picture_border'>"; echo "<img class='user_picture' alt=\"" . __s('Picture') . "\" src='" . User::getThumbnailURLForPicture($user->fields['picture']) . "'>"; echo "</div>"; echo $user->getLink(); echo "</div>"; } // show "is_private" icon if (isset($item_i['is_private']) && $item_i['is_private']) { echo "<div class='private'>"; echo __('Private'); echo "</div>"; } echo "</div>"; if ($item['type'] == 'Document_Item') { $filename = $item_i['filename']; $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); echo "<img src='"; if (empty($filename)) { $filename = $item_i['name']; } if (file_exists(GLPI_ROOT . "/pics/icones/{$ext}-dist.png")) { echo $CFG_GLPI['root_doc'] . "/pics/icones/{$ext}-dist.png"; } else { echo "{$pics_url}/file.png"; } echo "' title='file' /> "; echo "<a href='" . $CFG_GLPI['root_doc'] . "/front/document.send.php?docid=" . $item_i['id'] . "&tickets_id=" . $ticket->getID() . "' target='_blank'>{$filename}"; if (in_array($ext, array('jpg', 'jpeg', 'png', 'bmp'))) { echo "<div class='talk_img_preview'>"; echo "<img src='" . $CFG_GLPI['root_doc'] . "/front/document.send.php?docid=" . $item_i['id'] . "&tickets_id=" . $ticket->getID() . "'/>"; echo "</div>"; } echo "</a>"; if (!empty($item_i['mime'])) { echo " (" . $item_i['mime'] . ")"; } echo "<a href='" . $CFG_GLPI['root_doc'] . "/front/document.form.php?id=" . $item_i['id'] . "' class='edit_document' title='" . _sx("button", "Update") . "'>"; echo "<img src='../plugins/talk/pics/edit.png' /></a>"; echo "<a href='" . $CFG_GLPI['root_doc'] . "/plugins/talk/front/item.form.php?delete_document&documents_id=" . $item_i['id'] . "&tickets_id=" . $ticket->getID() . "' class='delete_document' title='" . _sx("button", "Delete permanently") . "'>"; echo "<img src='../plugins/talk/pics/delete.png' /></a>"; } echo "</div>"; //end h_content echo "</div>"; //end h_item if ($timeline_index == 0 && $item['type'] == "Solution" && $ticket->fields["status"] == CommonITILObject::SOLVED) { echo "<div class='break'></div>"; echo "<div class='approbation_form'>"; $followup_obj->showApprobationForm($ticket); echo "</div>"; echo "<hr class='approbation_separator' />"; self::showHistoryHeader(); } $timeline_index++; } // end foreach timeline echo "<div class='break'></div>"; // recall ticket content echo "<div class='h_item middle'>"; echo "<div class='h_info'>"; echo "<div class='h_date'>" . Html::convDateTime($ticket->fields['date']) . "</div>"; echo "<div class='h_user'>"; $user->getFromDB($ticket->fields['users_id_recipient']); echo "<div class='tooltip_picture_border'>"; echo "<img class='user_picture' alt=\"" . __s('Picture') . "\" src='" . User::getThumbnailURLForPicture($user->fields['picture']) . "'>"; echo "</div>"; echo $user->getLink(); echo "</div>"; echo "</div>"; echo "<div class='h_content TicketContent'>"; echo "<div class='b_right'>" . __("Ticket recall", 'talk') . "</div>"; echo "<div class='ticket_title'>"; echo html_entity_decode($ticket->fields['name']); echo "</div>"; echo "<div class='ticket_description'>"; echo html_entity_decode($ticket->fields['content']); echo "</div>"; echo "</div>"; echo "</div>"; echo "<div class='break'></div>"; // end timeline echo "</div>"; echo "<script type='text/javascript'>read_more();</script>"; }
/** * Display a line for an object * * @since version 0.85 (befor in each object with differents parameters) * * @param $id Integer ID of the object * @param $options array of options * output_type : Default output type (see Search class / default Search::HTML_OUTPUT) * row_num : row num used for display * type_for_massiveaction : itemtype for massive action * id_for_massaction : default 0 means no massive action * followups : only for Tickets : show followup columns */ static function showShort($id, $options = array()) { global $CFG_GLPI, $DB; $p['output_type'] = Search::HTML_OUTPUT; $p['row_num'] = 0; $p['type_for_massiveaction'] = 0; $p['id_for_massiveaction'] = 0; $p['followups'] = false; if (count($options)) { foreach ($options as $key => $val) { $p[$key] = $val; } } $rand = mt_rand(); /// TODO to be cleaned. Get datas and clean display links // Prints a job in short form // Should be called in a <table>-segment // Print links or not in case of user view // Make new job object and fill it from database, if success, print it $item = new static(); $candelete = static::canDelete(); $canupdate = Session::haveRight(static::$rightname, UPDATE); $showprivate = Session::haveRight('followup', TicketFollowup::SEEPRIVATE); $align = "class='center"; $align_desc = "class='left"; if ($p['followups']) { $align .= " top'"; $align_desc .= " top'"; } else { $align .= "'"; $align_desc .= "'"; } if ($item->getFromDB($id)) { $item_num = 1; $bgcolor = $_SESSION["glpipriority_" . $item->fields["priority"]]; echo Search::showNewLine($p['output_type'], $p['row_num'] % 2); $check_col = ''; if (($candelete || $canupdate) && $p['output_type'] == Search::HTML_OUTPUT && $p['id_for_massiveaction']) { $check_col = Html::getMassiveActionCheckBox($p['type_for_massiveaction'], $p['id_for_massiveaction']); } echo Search::showItem($p['output_type'], $check_col, $item_num, $p['row_num'], $align); // First column $first_col = sprintf(__('%1$s: %2$s'), __('ID'), $item->fields["id"]); if ($p['output_type'] == Search::HTML_OUTPUT) { $first_col .= "<br><img src='" . static::getStatusIconURL($item->fields["status"]) . "'\n alt=\"" . static::getStatus($item->fields["status"]) . "\" title=\"" . static::getStatus($item->fields["status"]) . "\">"; } else { $first_col = sprintf(__('%1$s - %2$s'), $first_col, static::getStatus($item->fields["status"])); } echo Search::showItem($p['output_type'], $first_col, $item_num, $p['row_num'], $align); // Second column if ($item->fields['status'] == static::CLOSED) { $second_col = sprintf(__('Closed on %s'), ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($item->fields['closedate'])); } else { if ($item->fields['status'] == static::SOLVED) { $second_col = sprintf(__('Solved on %s'), ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($item->fields['solvedate'])); } else { if ($item->fields['begin_waiting_date']) { $second_col = sprintf(__('Put on hold on %s'), ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($item->fields['begin_waiting_date'])); } else { if ($item->fields['due_date']) { $second_col = sprintf(__('%1$s: %2$s'), __('Due date'), ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($item->fields['due_date'])); } else { $second_col = sprintf(__('Opened on %s'), ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($item->fields['date'])); } } } } echo Search::showItem($p['output_type'], $second_col, $item_num, $p['row_num'], $align . " width=130"); // Second BIS column $second_col = Html::convDateTime($item->fields["date_mod"]); echo Search::showItem($p['output_type'], $second_col, $item_num, $p['row_num'], $align . " width=90"); // Second TER column if (count($_SESSION["glpiactiveentities"]) > 1) { $second_col = Dropdown::getDropdownName('glpi_entities', $item->fields['entities_id']); echo Search::showItem($p['output_type'], $second_col, $item_num, $p['row_num'], $align . " width=100"); } // Third Column echo Search::showItem($p['output_type'], "<span class='b'>" . static::getPriorityName($item->fields["priority"]) . "</span>", $item_num, $p['row_num'], "{$align} bgcolor='{$bgcolor}'"); // Fourth Column $fourth_col = ""; foreach ($item->getUsers(CommonITILActor::REQUESTER) as $d) { $userdata = getUserName($d["users_id"], 2); $fourth_col .= sprintf(__('%1$s %2$s'), "<span class='b'>" . $userdata['name'] . "</span>", Html::showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false))); $fourth_col .= "<br>"; } foreach ($item->getGroups(CommonITILActor::REQUESTER) as $d) { $fourth_col .= Dropdown::getDropdownName("glpi_groups", $d["groups_id"]); $fourth_col .= "<br>"; } echo Search::showItem($p['output_type'], $fourth_col, $item_num, $p['row_num'], $align); // Fifth column $fifth_col = ""; foreach ($item->getUsers(CommonITILActor::ASSIGN) as $d) { $userdata = getUserName($d["users_id"], 2); $fifth_col .= sprintf(__('%1$s %2$s'), "<span class='b'>" . $userdata['name'] . "</span>", Html::showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false))); $fifth_col .= "<br>"; } foreach ($item->getGroups(CommonITILActor::ASSIGN) as $d) { $fifth_col .= Dropdown::getDropdownName("glpi_groups", $d["groups_id"]); $fifth_col .= "<br>"; } foreach ($item->getSuppliers(CommonITILActor::ASSIGN) as $d) { $fifth_col .= Dropdown::getDropdownName("glpi_suppliers", $d["suppliers_id"]); $fifth_col .= "<br>"; } echo Search::showItem($p['output_type'], $fifth_col, $item_num, $p['row_num'], $align); // Sixth Colum // Ticket : simple link to item $sixth_col = ""; $is_deleted = false; $item_ticket = new Item_Ticket(); $data = $item_ticket->find("`tickets_id` = " . $item->fields['id']); if ($item->getType() == 'Ticket') { if (!empty($data)) { foreach ($data as $val) { if (!empty($val["itemtype"]) && $val["items_id"] > 0) { if ($object = getItemForItemtype($val["itemtype"])) { if ($object->getFromDB($val["items_id"])) { $is_deleted = $object->isDeleted(); $sixth_col .= $object->getTypeName(); $sixth_col .= " - <span class='b'>"; if ($item->canView()) { $sixth_col .= $object->getLink(); } else { $sixth_col .= $object->getNameID(); } $sixth_col .= "</span><br>"; } } } } } else { $sixth_col = __('General'); } echo Search::showItem($p['output_type'], $sixth_col, $item_num, $p['row_num'], $is_deleted ? " class='center deleted' " : $align); } // Seventh column echo Search::showItem($p['output_type'], "<span class='b'>" . Dropdown::getDropdownName('glpi_itilcategories', $item->fields["itilcategories_id"]) . "</span>", $item_num, $p['row_num'], $align); // Eigth column $eigth_column = "<span class='b'>" . $item->getName() . "</span> "; // Add link if ($item->canViewItem()) { $eigth_column = "<a id='" . $item->getType() . $item->fields["id"] . "{$rand}' href=\"" . $item->getLinkURL() . "\">{$eigth_column}</a>"; if ($p['followups'] && $p['output_type'] == Search::HTML_OUTPUT) { $eigth_column .= TicketFollowup::showShortForTicket($item->fields["id"]); } else { if (method_exists($item, 'numberOfFollowups')) { $eigth_column = sprintf(__('%1$s (%2$s)'), $eigth_column, sprintf(__('%1$s - %2$s'), $item->numberOfFollowups($showprivate), $item->numberOfTasks($showprivate))); } else { $eigth_column = sprintf(__('%1$s (%2$s)'), $eigth_column, $item->numberOfTasks($showprivate)); } } } if ($p['output_type'] == Search::HTML_OUTPUT) { $eigth_column = sprintf(__('%1$s %2$s'), $eigth_column, Html::showToolTip(Html::clean(Html::entity_decode_deep($item->fields["content"])), array('display' => false, 'applyto' => $item->getType() . $item->fields["id"] . $rand))); } echo Search::showItem($p['output_type'], $eigth_column, $item_num, $p['row_num'], $align_desc . " width='200'"); //tenth column $tenth_column = ''; $planned_infos = ''; $tasktype = $item->getType() . "Task"; $plan = new $tasktype(); $items = array(); foreach ($DB->request($plan->getTable(), array($item->getForeignKeyField() => $item->fields['id'])) as $plan) { if (isset($plan['begin']) && $plan['begin']) { $items[$plan['id']] = $plan['id']; $planned_infos .= sprintf(__('From %s') . ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : ''), Html::convDateTime($plan['begin'])); $planned_infos .= sprintf(__('To %s') . ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : ''), Html::convDateTime($plan['end'])); if ($plan['users_id_tech']) { $planned_infos .= sprintf(__('By %s') . ($p['output_type'] == Search::HTML_OUTPUT ? '<br>' : ''), getUserName($plan['users_id_tech'])); } $planned_infos .= "<br>"; } } unset($i, $j); $tenth_column = count($items); if ($tenth_column) { $tenth_column = "<span class='pointer'\n id='" . $item->getType() . $item->fields["id"] . "planning{$rand}'>" . $tenth_column . '</span>'; $tenth_column = sprintf(__('%1$s %2$s'), $tenth_column, Html::showToolTip($planned_infos, array('display' => false, 'applyto' => $item->getType() . $item->fields["id"] . "planning" . $rand))); } echo Search::showItem($p['output_type'], $tenth_column, $item_num, $p['row_num'], $align_desc . " width='150'"); // Finish Line echo Search::showEndLine($p['output_type']); } else { echo "<tr class='tab_bg_2'>"; echo "<td colspan='6' ><i>" . __('No item in progress.') . "</i></td></tr>"; } }
/** * @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"; }
static function showShort($id, $followups, $output_type = HTML_OUTPUT, $row_num = 0) { global $CFG_GLPI, $LANG; $rand = mt_rand(); /// TODO to be cleaned. Get datas and clean display links // Prints a job in short form // Should be called in a <table>-segment // Print links or not in case of user view // Make new job object and fill it from database, if success, print it $job = new self(); $candelete = haveRight("delete_ticket", "1"); $canupdate = haveRight("update_ticket", "1"); $showprivate = haveRight("show_full_ticket", "1"); $align = "class='center"; $align_desc = "class='left"; if ($followups) { $align .= " top'"; $align_desc .= " top'"; } else { $align .= "'"; $align_desc .= "'"; } if ($job->getFromDB($id)) { $item_num = 1; $bgcolor = $_SESSION["glpipriority_" . $job->fields["priority"]]; echo Search::showNewLine($output_type, $row_num % 2); // First column $first_col = "ID : " . $job->fields["id"]; if ($output_type == HTML_OUTPUT) { $first_col .= "<br><img src='" . $CFG_GLPI["root_doc"] . "/pics/" . $job->fields["status"] . ".png'\n alt=\"" . self::getStatus($job->fields["status"]) . "\" title=\"" . self::getStatus($job->fields["status"]) . "\">"; } else { $first_col .= " - " . self::getStatus($job->fields["status"]); } if (($candelete || $canupdate) && $output_type == HTML_OUTPUT) { $sel = ""; if (isset($_GET["select"]) && $_GET["select"] == "all") { $sel = "checked"; } if (isset($_SESSION['glpimassiveactionselected'][$job->fields["id"]])) { $sel = "checked"; } $first_col .= " <input type='checkbox' name='item[" . $job->fields["id"] . "]'\n value='1' {$sel}>"; } echo Search::showItem($output_type, $first_col, $item_num, $row_num, $align); // Second column if ($job->fields['status'] == 'closed') { $second_col = $LANG['joblist'][12]; if ($output_type == HTML_OUTPUT) { $second_col .= " :<br>"; } else { $second_col .= " : "; } $second_col .= convDateTime($job->fields['closedate']); } else { if ($job->fields['status'] == 'solved') { $second_col = $LANG['joblist'][14]; if ($output_type == HTML_OUTPUT) { $second_col .= " :<br>"; } else { $second_col .= " : "; } $second_col .= convDateTime($job->fields['solvedate']); } else { if ($job->fields['begin_waiting_date']) { $second_col = $LANG['joblist'][26]; if ($output_type == HTML_OUTPUT) { $second_col .= " :<br>"; } else { $second_col .= " : "; } $second_col .= convDateTime($job->fields['begin_waiting_date']); } else { if ($job->fields['due_date']) { $second_col = $LANG['sla'][5]; if ($output_type == HTML_OUTPUT) { $second_col .= " :<br>"; } else { $second_col .= " : "; } $second_col .= convDateTime($job->fields['due_date']); } else { $second_col = $LANG['joblist'][11]; if ($output_type == HTML_OUTPUT) { $second_col .= " :<br>"; } else { $second_col .= " : "; } $second_col .= convDateTime($job->fields['date']); } } } } echo Search::showItem($output_type, $second_col, $item_num, $row_num, $align . " width=130"); // Second BIS column $second_col = convDateTime($job->fields["date_mod"]); echo Search::showItem($output_type, $second_col, $item_num, $row_num, $align . " width=90"); // Second TER column if (count($_SESSION["glpiactiveentities"]) > 1) { if ($job->fields['entities_id'] == 0) { $second_col = $LANG['entity'][2]; } else { $second_col = Dropdown::getDropdownName("glpi_entities", $job->fields['entities_id']); } echo Search::showItem($output_type, $second_col, $item_num, $row_num, $align . " width=100"); } // Third Column echo Search::showItem($output_type, "<strong>" . self::getPriorityName($job->fields["priority"]) . "</strong>", $item_num, $row_num, "{$align} bgcolor='{$bgcolor}'"); // Fourth Column $fourth_col = ""; if (isset($job->users[self::REQUESTER]) && count($job->users[self::REQUESTER])) { foreach ($job->users[self::REQUESTER] as $k => $d) { $userdata = getUserName($k, 2); $fourth_col .= "<strong>" . $userdata['name'] . "</strong> "; $fourth_col .= showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false)); $fourth_col .= "<br>"; } } if (isset($job->groups[self::REQUESTER]) && count($job->groups[self::REQUESTER])) { foreach ($job->groups[self::REQUESTER] as $k => $d) { $fourth_col .= Dropdown::getDropdownName("glpi_groups", $k); $fourth_col .= "<br>"; } } echo Search::showItem($output_type, $fourth_col, $item_num, $row_num, $align); // Fifth column $fifth_col = ""; if (isset($job->users[self::ASSIGN]) && count($job->users[self::ASSIGN])) { foreach ($job->users[self::ASSIGN] as $k => $d) { $userdata = getUserName($k, 2); $fifth_col .= "<strong>" . $userdata['name'] . "</strong> "; $fifth_col .= showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false)); $fifth_col .= "<br>"; } } if (isset($job->groups[self::ASSIGN]) && count($job->groups[self::ASSIGN])) { foreach ($job->groups[self::ASSIGN] as $k => $d) { $fourth_col .= Dropdown::getDropdownName("glpi_groups", $k); $fourth_col .= "<br>"; } } if ($job->fields["suppliers_id_assign"] > 0) { if (!empty($fifth_col)) { $fifth_col .= "<br>"; } $fifth_col .= self::getAssignName($job->fields["suppliers_id_assign"], 'Supplier', 1); } echo Search::showItem($output_type, $fifth_col, $item_num, $row_num, $align); // Sixth Colum $sixth_col = ""; $is_deleted = false; if (!empty($job->fields["itemtype"]) && $job->fields["items_id"] > 0) { if (class_exists($job->fields["itemtype"])) { $item = new $job->fields["itemtype"](); if ($item->getFromDB($job->fields["items_id"])) { $is_deleted = $item->isDeleted(); $sixth_col .= $item->getTypeName(); $sixth_col .= "<br><strong>"; if ($item->canView()) { $sixth_col .= $item->getLink($output_type == HTML_OUTPUT); } else { $sixth_col .= $item->getNameID(); } $sixth_col .= "</strong>"; } } } else { if (empty($job->fields["itemtype"])) { $sixth_col = $LANG['help'][30]; } } echo Search::showItem($output_type, $sixth_col, $item_num, $row_num, $is_deleted ? " class='center deleted' " : $align); // Seventh column echo Search::showItem($output_type, "<strong>" . Dropdown::getDropdownName('glpi_ticketcategories', $job->fields["ticketcategories_id"]) . "</strong>", $item_num, $row_num, $align); // ninth column $ninth_column = "<strong>" . $job->fields["name"] . "</strong> "; // Add link if ($job->canViewItem()) { $ninth_column = "<a id='ticket" . $job->fields["id"] . "{$rand}' href=\"" . $CFG_GLPI["root_doc"] . "/front/ticket.form.php?id=" . $job->fields["id"] . "\">{$ninth_column}</a>"; if ($followups && $output_type == HTML_OUTPUT) { $ninth_column .= TicketFollowup::showShortForTicket($job->fields["id"]); } else { $ninth_column .= " (" . $job->numberOfFollowups($showprivate) . "-" . $job->numberOfTasks($showprivate) . ")"; } } if ($output_type == HTML_OUTPUT) { $ninth_column .= " " . showToolTip($job->fields['content'], array('display' => false, 'applyto' => "ticket" . $job->fields["id"] . $rand)); } echo Search::showItem($output_type, $ninth_column, $item_num, $row_num, $align_desc . "width='300'"); // Finish Line echo Search::showEndLine($output_type); } else { echo "<tr class='tab_bg_2'><td colspan='6' ><i>" . $LANG['joblist'][16] . "</i></td></tr>"; } }
/** * @see CommonDBTM::getSpecificMassiveActions() **/ function getSpecificMassiveActions($checkitem = NULL) { $isadmin = static::canUpdate(); $actions = parent::getSpecificMassiveActions($checkitem); if ($_SESSION['glpiactiveprofile']['interface'] == 'central') { if (TicketFollowup::canCreate()) { $actions['TicketFollowup' . MassiveAction::CLASS_ACTION_SEPARATOR . 'add_followup'] = __('Add a new followup'); } if (TicketTask::canCreate()) { $actions[__CLASS__ . MassiveAction::CLASS_ACTION_SEPARATOR . 'add_task'] = __('Add a new task'); } if (TicketValidation::canCreate()) { $actions['TicketValidation' . MassiveAction::CLASS_ACTION_SEPARATOR . 'submit_validation'] = __('Approval request'); } if (Item_Ticket::canCreate()) { $actions['Item_Ticket' . MassiveAction::CLASS_ACTION_SEPARATOR . 'add_item'] = _x('button', 'Add an item'); } if (Item_Ticket::canDelete()) { $actions['Item_Ticket' . MassiveAction::CLASS_ACTION_SEPARATOR . 'delete_item'] = _x('button', 'Remove an item'); } if (Session::haveRight(self::$rightname, UPDATE)) { $actions[__CLASS__ . MassiveAction::CLASS_ACTION_SEPARATOR . 'add_actor'] = __('Add an actor'); $actions[__CLASS__ . MassiveAction::CLASS_ACTION_SEPARATOR . 'enable_notif'] = __('Set notifications for all actors'); $actions['Ticket_Ticket' . MassiveAction::CLASS_ACTION_SEPARATOR . 'add'] = _x('button', 'Link tickets'); } if (Session::haveRight(self::$rightname, UPDATE)) { MassiveAction::getAddTransferList($actions); } } return $actions; }
<?php include '../../../inc/includes.php'; Session::checkLoginUser(); //add followup if (isset($_REQUEST['ticketfollowup'])) { $fup = new TicketFollowup(); if (isset($_POST["add"])) { $fup->check(-1, 'w', $_POST); $fup->add($_POST); Event::log($fup->getField('tickets_id'), "ticket", 4, "tracking", sprintf(__('%s adds a followup'), $_SESSION["glpiname"])); } } //add task if (isset($_REQUEST['tickettask'])) { $ttask = new TicketTask(); if (isset($_POST["add"])) { $ttask->check(-1, 'w', $_POST); $ttask->add($_POST); Event::log($ttask->getField('tickets_id'), "ticket", 4, "tracking", sprintf(__('%s adds a task'), $_SESSION["glpiname"])); } } //add document if (isset($_REQUEST['filename']) && !empty($_REQUEST['filename'])) { $doc = new Document(); if (isset($_POST["add"])) { $doc->check(-1, 'w', $_POST); if ($newID = $doc->add($_POST)) { Event::log($newID, "documents", 4, "login", sprintf(__('%1$s adds the item %2$s'), $_SESSION["glpiname"], $doc->fields["name"])); } }
/** * Dropdown of actions for massive action * * @param $itemtype item type * @param $is_deleted massive action for deleted items ? * @param $extraparams array of extra parameters **/ static function showForMassiveAction($itemtype, $is_deleted = 0, $extraparams = array()) { global $LANG, $CFG_GLPI, $PLUGIN_HOOKS; /// TODO include in CommonDBTM defining only getAdditionalMassiveAction in sub classes /// for specific actions (return a array of action name and title) if (!class_exists($itemtype)) { return false; } if ($itemtype == 'NetworkPort') { echo "<select name='massiveaction' id='massiveaction'>"; echo "<option value='-1' selected>" . DROPDOWN_EMPTY_VALUE . "</option>"; echo "<option value='delete'>" . $LANG['buttons'][6] . "</option>"; echo "<option value='assign_vlan'>" . $LANG['networking'][55] . "</option>"; echo "<option value='unassign_vlan'>" . $LANG['networking'][58] . "</option>"; // Interest of this massive action ? // echo "<option value='move'>".$LANG['buttons'][20]."</option>"; echo "</select>"; $params = array('action' => '__VALUE__', 'itemtype' => $itemtype); ajaxUpdateItemOnSelectEvent("massiveaction", "show_massiveaction", $CFG_GLPI["root_doc"] . "/ajax/dropdownMassiveActionPorts.php", $params); echo "<span id='show_massiveaction'> </span>\n"; } else { $item = new $itemtype(); $infocom = new Infocom(); $isadmin = $item->canUpdate(); echo "<select name='massiveaction' id='massiveaction'>"; echo "<option value='-1' selected>" . DROPDOWN_EMPTY_VALUE . "</option>"; if (!in_array($itemtype, $CFG_GLPI["massiveaction_noupdate_types"]) && ($isadmin && $itemtype != 'Ticket' || in_array($itemtype, $CFG_GLPI["infocom_types"]) && $infocom->canUpdate() || $itemtype == 'Ticket' && haveRight('update_ticket', 1))) { echo "<option value='update'>" . $LANG['buttons'][14] . "</option>"; } if (in_array($itemtype, $CFG_GLPI["infocom_types"]) && $infocom->canCreate()) { echo "<option value='activate_infocoms'>" . $LANG['financial'][68] . "</option>"; } if ($is_deleted && !in_array($itemtype, $CFG_GLPI["massiveaction_nodelete_types"])) { if ($isadmin) { echo "<option value='purge'>" . $LANG['buttons'][22] . "</option>"; echo "<option value='restore'>" . $LANG['buttons'][21] . "</option>"; } } else { // No delete for entities and tracking of not have right if (!in_array($itemtype, $CFG_GLPI["massiveaction_nodelete_types"]) && ($isadmin && $itemtype != 'Ticket' || $itemtype == 'Ticket' && haveRight('delete_ticket', 1))) { if ($item->maybeDeleted()) { echo "<option value='delete'>" . $LANG['buttons'][6] . "</option>"; } else { echo "<option value='purge'>" . $LANG['buttons'][22] . "</option>"; } } if ($isadmin && in_array($itemtype, array('Phone', 'Printer', 'Peripheral', 'Monitor'))) { echo "<option value='connect'>" . $LANG['buttons'][9] . "</option>"; echo "<option value='disconnect'>" . $LANG['buttons'][10] . "</option>"; } if (in_array($itemtype, $CFG_GLPI["document_types"])) { $doc = new Document(); if ($doc->canView()) { echo "<option value='add_document'>" . $LANG['document'][16] . "</option>"; } } if (in_array($itemtype, $CFG_GLPI["contract_types"])) { $contract = new Contract(); if ($contract->canUpdate()) { echo "<option value='add_contract'>" . $LANG['financial'][36] . "</option>"; } } if (haveRight('transfer', 'r') && isMultiEntitiesMode() && in_array($itemtype, array('CartridgeItem', 'Computer', 'ConsumableItem', 'Contact', 'Contract', 'Supplier', 'Monitor', 'NetworkEquipment', 'Peripheral', 'Phone', 'Printer', 'Software', 'SoftwareLicense', 'Ticket', 'Document', 'Group', 'Link')) && $isadmin) { echo "<option value='add_transfer_list'>" . $LANG['buttons'][48] . "</option>"; } switch ($itemtype) { case 'Software': if ($isadmin && countElementsInTable("glpi_rules", "sub_type='RuleSoftwareCategory'") > 0) { echo "<option value='compute_software_category'>" . $LANG['rulesengine'][38] . " " . $LANG['rulesengine'][40] . "</option>"; } if (haveRight("rule_dictionnary_software", "w") && countElementsInTable("glpi_rules", "sub_type='RuleDictionnarySoftware'") > 0) { echo "<option value='replay_dictionnary'>" . $LANG['rulesengine'][76] . "</option>"; } break; case 'Computer': if ($isadmin) { echo "<option value='connect_to_computer'>" . $LANG['buttons'][9] . "</option>"; echo "<option value='install'>" . $LANG['buttons'][4] . "</option>"; if ($CFG_GLPI['use_ocs_mode']) { if (haveRight("ocsng", "w") || haveRight("sync_ocsng", "w")) { echo "<option value='force_ocsng_update'>" . $LANG['ocsng'][24] . "</option>"; } echo "<option value='unlock_ocsng_field'>" . $LANG['buttons'][38] . " " . $LANG['Menu'][33] . " - " . $LANG['ocsng'][16] . "</option>"; echo "<option value='unlock_ocsng_monitor'>" . $LANG['buttons'][38] . " " . $LANG['Menu'][33] . " - " . $LANG['ocsng'][30] . "</option>"; echo "<option value='unlock_ocsng_peripheral'>" . $LANG['buttons'][38] . " " . $LANG['Menu'][33] . " - " . $LANG['ocsng'][32] . "</option>"; echo "<option value='unlock_ocsng_printer'>" . $LANG['buttons'][38] . " " . $LANG['Menu'][33] . " - " . $LANG['ocsng'][34] . "</option>"; echo "<option value='unlock_ocsng_software'>" . $LANG['buttons'][38] . " " . $LANG['Menu'][33] . " - " . $LANG['ocsng'][52] . "</option>"; echo "<option value='unlock_ocsng_ip'>" . $LANG['buttons'][38] . " " . $LANG['Menu'][33] . " - " . $LANG['ocsng'][50] . "</option>"; echo "<option value='unlock_ocsng_disk'>" . $LANG['buttons'][38] . " " . $LANG['Menu'][33] . " - " . $LANG['ocsng'][55] . "</option>"; } } break; case 'Supplier': if ($isadmin) { echo "<option value='add_contact'>" . $LANG['financial'][24] . "</option>"; } break; case 'Calendar': echo "<option value='duplicate'>" . $LANG['buttons'][54] . "</option>"; break; case 'Contact': if ($isadmin) { echo "<option value='add_enterprise'>" . $LANG['financial'][25] . "</option>"; } break; case 'User': if ($isadmin) { echo "<option value='add_group'>" . $LANG['setup'][604] . "</option>"; echo "<option value='add_userprofile'>" . $LANG['setup'][607] . "</option>"; } if (haveRight("user_authtype", "w")) { echo "<option value='change_authtype'>" . $LANG['login'][30] . "</option>"; echo "<option value='force_user_ldap_update'>" . $LANG['ocsng'][24] . "</option>"; } break; case 'Ticket': $tmp = new TicketFollowup(); if ($tmp->canCreate()) { echo "<option value='add_followup'>" . $LANG['job'][29] . "</option>"; } $tmp = new TicketTask(); if ($tmp->canCreate()) { echo "<option value='add_task'>" . $LANG['job'][30] . "</option>"; } $tmp = new TicketValidation(); if ($tmp->canCreate()) { echo "<option value='submit_validation'>" . $LANG['validation'][26] . "</option>"; } if (haveRight("update_ticket", "1")) { echo "<option value='add_actor'>" . $LANG['job'][27] . "</option>"; echo "<option value='link_ticket'>" . $LANG['job'][56] . "</option>"; } break; case 'CronTask': echo "<option value='reset'>" . $LANG['buttons'][16] . " (" . $LANG['crontask'][40] . ")"; echo "</option>"; break; case 'NotImportedEmail': echo "<option value='delete_email'>" . $LANG['mailing'][133] . "</option>"; echo "<option value='import_email'>" . $LANG['buttons'][37] . "</option>"; break; } if ($item instanceof CommonTreeDropdown) { if ($isadmin) { echo "<option value='move_under'>" . $LANG['buttons'][20] . "</option>"; } } if ($itemtype != 'Entity' && $itemtype != 'Calendar' && $item instanceof CommonDropdown && $item->maybeRecursive()) { if ($isadmin) { echo "<option value='merge'>" . $LANG['buttons'][48] . " - " . $LANG['software'][48]; echo "</option>"; } } // Plugin Specific actions if (isset($PLUGIN_HOOKS['use_massive_action'])) { foreach ($PLUGIN_HOOKS['use_massive_action'] as $plugin => $val) { $actions = doOneHook($plugin, 'MassiveActions', $itemtype); if (count($actions)) { foreach ($actions as $key => $val) { echo "<option value = '{$key}'>{$val}</option>"; } } } } } echo "</select>"; $params = array('action' => '__VALUE__', 'is_deleted' => $is_deleted, 'itemtype' => $itemtype); if (count($extraparams)) { foreach ($extraparams as $key => $val) { $params['extra_' . $key] = $val; } } ajaxUpdateItemOnSelectEvent("massiveaction", "show_massiveaction", $CFG_GLPI["root_doc"] . "/ajax/dropdownMassiveAction.php", $params); echo "<span id='show_massiveaction'> </span>\n"; } }
/** * CLone a ticket and his relations * @param integer $tickets_id id of the ticket to clone * @return print a json response (return nothing) */ static function cloneAndLink($tickets_id) { global $DB; //get old ticket $ticket = new Ticket(); if (!$ticket->getFromDB($tickets_id)) { echo "{\"success\":false, \"message\":\"" . __("Error : get old ticket", "escalade") . "\"}"; exit; } //set fields $fields = $ticket->fields; $fields = array_map(array('Toolbox', 'addslashes_deep'), $fields); $fields['id'] = 0; $fields['_users_id_requester'] = 0; $fields['status'] = CommonITILObject::INCOMING; /*var_dump($fields); exit;*/ //create new ticket (duplicate from previous) if (!($newID = $ticket->add($fields))) { echo "{\"success\":false, \"message\":\"" . __("Error : adding new ticket", "escalade") . "\"}"; exit; } //add link between them $ticket_ticket = new Ticket_Ticket(); if (!$ticket_ticket->add(array('tickets_id_1' => $tickets_id, 'tickets_id_2' => $newID, 'link' => Ticket_Ticket::LINK_TO))) { echo "{\"success\":false, \"message\":\"" . __("Error : adding link between the two tickets", "escalade") . "\"}"; exit; } //add a followup to indicate duplication $followup = new TicketFollowup(); if (!$followup->add(array('tickets_id' => $newID, 'users_id' => Session::getLoginUserID(), 'content' => __("This ticket has been from the ticket num", "escalade") . " " . $tickets_id, 'is_private' => true, 'requesttypes_id' => 6))) { echo "{\"success\":false, \"message\":\"" . __("Error : adding followups", "escalade") . "\"}"; exit; } //add actors to the new ticket (without assign) //users $query_users = "INSERT INTO glpi_tickets_users\n SELECT '' AS id, {$newID} as tickets_id, users_id, type, use_notification, alternative_email\n FROM glpi_tickets_users\n WHERE tickets_id = {$tickets_id} AND type != 2"; if (!($res = $DB->query($query_users))) { echo "{\"success\":false, \"message\":\"" . __("Error : adding actors (user)", "escalade") . "\"}"; exit; } //groups $query_groups = "INSERT INTO glpi_groups_tickets\n SELECT '' AS id, {$newID} as tickets_id, groups_id, type\n FROM glpi_groups_tickets\n WHERE tickets_id = {$tickets_id} AND type != 2"; if (!($res = $DB->query($query_groups))) { echo "{\"success\":false, \"message\":\"" . __("Error : adding actors (group)", "escalade") . "\"}"; exit; } //add documents $query_docs = "INSERT INTO glpi_documents_items (documents_id, items_id, itemtype, entities_id, is_recursive, date_mod)\n SELECT documents_id, {$newID}, 'Ticket', entities_id, is_recursive, date_mod\n FROM glpi_documents_items\n WHERE items_id = {$tickets_id} AND itemtype = 'Ticket'"; if (!($res = $DB->query($query_docs))) { echo "{\"success\":false, \"message\":\"" . __("Error : adding documents", "escalade") . "\"}"; exit; } //add history to the new ticket $changes[0] = '0'; $changes[1] = __("This ticket has been from the ticket num", "escalade") . " " . $tickets_id; $changes[2] = ""; Log::history($newID, 'Ticket', $changes, 'Ticket'); //add message (ticket cloned) after redirect Session::addMessageAfterRedirect(__("This ticket has been from the ticket num", "escalade") . " " . $tickets_id); //all ok echo "{\"success\":true, \"newID\":{$newID}}"; }
static function finishAdd($item) { if (isset($_SESSION['plugin_escalation_ticketcopy']) && count($_SESSION['plugin_escalation_ticketcopy']) > 0) { if (isset($_SESSION['plugin_escalation_ticketcopy']['followup'])) { $ticketFollowup = new TicketFollowup(); foreach ($_SESSION['plugin_escalation_ticketcopy']['followup'] as $follows_id) { $a_followups = $ticketFollowup->find("`id`='" . $follows_id . "'"); foreach ($a_followups as $data) { unset($data['id']); $data = Toolbox::addslashes_deep($data); $data['tickets_id'] = $item->getID(); $ticketFollowup->add($data); } } } if (isset($_SESSION['plugin_escalation_ticketcopy']['task'])) { $ticketTask = new TicketTask(); foreach ($_SESSION['plugin_escalation_ticketcopy']['task'] as $tasks_id) { $a_tasks = $ticketTask->find("`id`='" . $tasks_id . "'", "`id`"); foreach ($a_tasks as $data) { unset($data['id']); $data = Toolbox::addslashes_deep($data); $data['tickets_id'] = $item->getID(); foreach ($data as $key => $value) { if ($value == '') { unset($data[$key]); } } $ticketTask->add($data); } } } unset($_SESSION['plugin_escalation_ticketcopy']); } }
/** Generate bigdump : add tickets to an item * * @param $type item type * @param $ID item ID * @param $ID_entity entity ID **/ function addTracking($type, $ID, $ID_entity) { global $percent, $DB, $MAX, $FIRST, $LAST; $current_year = date("Y"); while (mt_rand(0,100)<$percent['tracking_on_item']) { // ticket closed ? $status = CommonITILObject::CLOSED; $closedate = ""; $solvedate = ""; $opendate = time() - mt_rand(0, 365)*DAY_TIMESTAMP - mt_rand(0, 10)*HOUR_TIMESTAMP - mt_rand(0, 60)*MINUTE_TIMESTAMP - mt_rand(0, 60); if (mt_rand(0,100)<$percent['closed_tracking']) { $rtype = mt_rand(0, 100); if ($rtype<20) { $status = CommonITILObject::SOLVED; } else { $status = CommonITILObject::CLOSED; } } else { $rtype = mt_rand(0, 100); if ($rtype<20) { $status = CommonITILObject::INCOMING; } else if ($rtype<40) { $status = CommonITILObject::WAITING; } else if ($rtype<80) { $status = CommonITILObject::PLANNED; $date3 = $opendate+mt_rand(10800, 7776000); // + entre 3 heures et 3 mois $date4 = $date3+10800; // + 3 heures } else { $status = CommonITILObject::ASSIGNED; } } // Author $users[0] = mt_rand($FIRST['users_normal'], $LAST['users_postonly']); // Assign user $users[1] = 0; if ($status != CommonITILObject::INCOMING) { $users[1] = mt_rand($FIRST['users_sadmin'], $LAST['users_admin']); } $enterprise = 0; if (mt_rand(0,100)<20) { $enterprise = mt_rand($FIRST["enterprises"], $LAST['enterprises']); } $firstactiontime = mt_rand(0, 10)*DAY_TIMESTAMP+mt_rand(0, 10)*HOUR_TIMESTAMP +mt_rand(0, 60)*MINUTE_TIMESTAMP; $solvetime = 0; $closetime = 0; $actiontime = 0; $solution = ""; $solutiontype = 0; $due_date = $opendate + $firstactiontime+mt_rand(0, 10)*DAY_TIMESTAMP+ mt_rand(0, 10)*HOUR_TIMESTAMP+mt_rand(0, 60)*MINUTE_TIMESTAMP; $duedatetoadd = date("Y-m-d H:i:s", intval($due_date)); if (($status == CommonITILObject::CLOSED) || ($status == CommonITILObject::SOLVED)) { $solvetime = $firstactiontime+mt_rand(0, 10)*DAY_TIMESTAMP+mt_rand(0, 10)*HOUR_TIMESTAMP+ mt_rand(0, 60)*MINUTE_TIMESTAMP; $solvedate = $opendate+$solvetime; $closedate = $opendate+$solvetime; $actiontime = mt_rand(0, 10)*HOUR_TIMESTAMP+ mt_rand(0, 60)*MINUTE_TIMESTAMP; if ($status == CommonITILObject::CLOSED) { $closetime = $solvetime+mt_rand(0, 5)*DAY_TIMESTAMP+mt_rand(0, 10)*HOUR_TIMESTAMP+ mt_rand(0, 60)*MINUTE_TIMESTAMP; $closedate = $opendate+$closetime; } $solutiontype = mt_rand($FIRST['solutiontypes'], $LAST['solutiontypes']); $solution = "Solution '".Toolbox::getRandomString(20); } $updatedate = $opendate+max($firstactiontime, $solvetime, $closetime); $hour_cost = 100; $closedatetoadd = 'NULL'; if (!empty($closedate)) { $closedatetoadd = date("Y-m-d H:i:s", intval($closedate)); } $solvedatetoadd = 'NULL'; if (!empty($solvedate)) { $solvedatetoadd = date("Y-m-d H:i:s",intval($solvedate)); } $t = new Ticket(); $tID = $t->add(toolbox::addslashes_deep( array('entities_id' => $ID_entity, 'name' => "Title '".Toolbox::getRandomString(20), 'date' => date("Y-m-d H:i:s", intval($opendate)), 'closedate' => $closedatetoadd, 'solvedate' => $solvedatetoadd, 'date_mod' => date("Y-m-d H:i:s", intval($updatedate)), 'users_id_lastupdater' => $users[0], 'status' => $status, 'users_id_recipient' => $users[0], 'requesttypes_id' => mt_rand(0,6), '_suppliers_id_assign' => $enterprise, 'itemtype' => $type, 'items_id' => $ID, 'content' => "tracking '".Toolbox::getRandomString(15), 'urgency' => mt_rand(1,5), 'impact' => mt_rand(1,5), 'priority' => mt_rand(1,5), 'itilcategories_id' => mt_rand(0, $MAX['tracking_category']), 'type' => mt_rand(1,2), 'solutiontypes_id' => $solutiontype, 'locations_id' => mt_rand($FIRST['locations'], $LAST['locations']), 'solution' => $solution, 'actiontime' => $actiontime, 'due_date' => $duedatetoadd, 'close_delay_stat' => $closetime, 'solve_delay_stat' => $solvetime, 'takeintoaccount_delay_stat' => $firstactiontime, '_users_id_requester' => $users[0], '_users_id_assign' => $users[1], '_groups_id_assign' => mt_rand($FIRST["techgroups"], $LAST['techgroups']), '_groups_id_requester' => mt_rand($FIRST["groups"], $LAST['groups']), ))); // Add followups $i = 0; $fID = 0; $first = true; $date = 0; $tf = new TicketFollowup(); while (mt_rand(0,100)<$percent['followups']) { if ($first) { $date = $opendate+$firstactiontime; $first = false; } else { $date += mt_rand(3600, 7776000); } $tf->add(toolbox::addslashes_deep( array('tickets_id' => $tID, 'date' => date("Y-m-d H:i:s", $date), 'users_id' => $users[1], 'content' => "followup $i '".Toolbox::getRandomString(15), 'requesttypes_id' => mt_rand(0, 3)))); $i++; } $tt = new TicketTask(); while (mt_rand(0,100)<$percent['tasks']) { $doplan=false; if ($first) { $date = $opendate+$firstactiontime; $first = false; $doplan = true; } else { $date += mt_rand(3600, 7776000); } $begin = $end = 'NULL'; $assign_user = 0; $state = 1; if ($status == CommonITILObject::PLANNED && $doplan) { $endtask = date("Y-m-d H:i:s", $date4); if ($endtask < date("Y-m-d H:i:s")) { $state = 2; // done } } $params = toolbox::addslashes_deep( array('tickets_id' => $tID, 'taskcategories_id' => mt_rand($FIRST['taskcategory'], $LAST['taskcategory']), 'date' => date("Y-m-d H:i:s",$date), 'users_id' => $users[1], 'content' => "task $i '".Toolbox::getRandomString(15), 'is_private' => mt_rand(0,1), 'state' => $state, 'users_id_tech' => $users[1])); if ($status == CommonITILObject::PLANNED && $doplan) { $params['plan'] = array('begin' => date("Y-m-d H:i:s", $date3), 'end' => $endtask); } $tt->add($params); $i++; } $tc = new TicketCost(); $params = toolbox::addslashes_deep( array('tickets_id' => $tID, 'entities_id' => $ID_entity, 'begin_date' => date("Y-m-d H:i:s", intval($opendate)), 'name' => "C'ost", 'cost_time' => $hour_cost, 'actiontime' => floor($actiontime/2))); // Insert satisfaction for stats if ($status == CommonITILObject::CLOSED && mt_rand(0,100) < $percent['satisfaction']) { $answerdate = 'NULL'; if (mt_rand(0,100) < $percent['answersatisfaction']) { $answerdate = $closedatetoadd; } $ts = new TicketSatisfaction(); $ts->add(toolbox::addslashes_deep( array('tickets_id' => $tID, 'type' => mt_rand(1,2), 'date_begin' => $closedatetoadd, 'date_answer' => $answerdate, 'satisfaction' => mt_rand(0,5), 'comment' => "comment ' satisfaction $tID"))); } } }
} if (($item = getItemForItemtype($_POST['type'])) && ($parent = getItemForItemtype($_POST['parenttype']))) { if (isset($_POST[$parent->getForeignKeyField()]) && isset($_POST["id"]) && $parent->getFromDB($_POST[$parent->getForeignKeyField()])) { $ol = ObjectLock::isLocked($_POST['parenttype'], $parent->getID()); if ($ol && Session::getLoginUserID() != $ol->fields['users_id']) { ObjectLock::setReadOnlyProfile(); } Ticket::showSubForm($item, $_POST["id"], array('parent' => $parent, 'tickets_id' => $_POST["tickets_id"])); } else { _e('Access denied'); } } else { if ($_POST['type'] == "Solution") { $ticket = new Ticket(); $ticket->getFromDB($_POST["tickets_id"]); if (!isset($_REQUEST['load_kb_sol'])) { $_REQUEST['load_kb_sol'] = 0; } $ticket->showSolutionForm($_REQUEST['load_kb_sol']); // show approbation form on top when ticket is solved if ($ticket->fields["status"] == CommonITILObject::SOLVED) { echo "<div class='approbation_form'>"; $followup_obj = new TicketFollowup(); $followup_obj->showApprobationForm($ticket); echo "</div>"; } } } Html::ajaxFooter(); break; }
break; case 5: Document::showAssociated($ticket); break; case 6: Log::showForItem($ticket); break; case 7: $validation = new Ticketvalidation(); $validation->showSummary($ticket); break; case 8: $ticket->showStats(); break; case 10: // affichage uniquement si enquete déclenchée et status clos $satisfaction = new TicketSatisfaction(); if ($ticket->fields['status'] == 'closed' && $satisfaction->getFromDB($_POST["id"])) { $satisfaction->showSatisfactionForm($ticket); } else { echo "<p class='center b'>" . $LANG['satisfaction'][2] . "</p>"; } break; default: if (!Plugin::displayAction($ticket, $_REQUEST['glpi_tab'])) { $fup = new TicketFollowup(); $fup->showSummary($ticket); } } } ajaxFooter();
break; case "move_rule": echo "<select name='move_type'>"; echo "<option value='after' selected>" . $LANG['buttons'][47] . "</option>"; echo "<option value='before'>" . $LANG['buttons'][46] . "</option>"; echo "</select> "; if (isset($_POST['entity_restrict'])) { $condition = $_POST['entity_restrict']; } else { $condition = ""; } Rule::dropdown(array('sub_type' => $_POST['sub_type'], 'name' => "ranking", 'entity_restrict' => $condition)); echo "<input type='submit' name='massiveaction' class='submit' value='" . $LANG['buttons'][2] . "'>\n"; break; case "add_followup": TicketFollowup::showFormMassiveAction(); break; case "add_task": TicketTask::showFormMassiveAction(); break; case "add_actor": $types = array(0 => DROPDOWN_EMPTY_VALUE, Ticket::REQUESTER => $LANG['job'][4], Ticket::OBSERVER => $LANG['common'][104], Ticket::ASSIGN => $LANG['job'][5]); $rand = Dropdown::showFromArray('actortype', $types); $paramsmassaction = array('actortype' => '__VALUE__'); ajaxUpdateItemOnSelectEvent("dropdown_actortype{$rand}", "show_massiveaction_field", $CFG_GLPI["root_doc"] . "/ajax/dropdownMassiveActionAddActor.php", $paramsmassaction); echo "<span id='show_massiveaction_field'> </span>\n"; break; case "link_ticket": $rand = Ticket_Ticket::dropdownLinks('link'); echo " " . $LANG['job'][38] . " " . $LANG['common'][2] . " : "; echo "<input type='text' name='tickets_id_1' value='' size='10'>\n";
/** * Display a line for a ticket * * @param $id Integer ID of the ticket * @param $followups Boolean show followup columns * @param $output_type Integer type of output (default Search::HTML_OUTPUT) * @param $row_num Integer row number (default 0) * @param $id_for_massaction Integer default 0 means no massive action (default 0) * */ static function showShort($id, $followups, $output_type = Search::HTML_OUTPUT, $row_num = 0, $id_for_massaction = 0) { global $CFG_GLPI; $rand = mt_rand(); /// TODO to be cleaned. Get datas and clean display links // Prints a job in short form // Should be called in a <table>-segment // Print links or not in case of user view // Make new job object and fill it from database, if success, print it $job = new self(); $candelete = Session::haveRight("delete_ticket", "1"); $canupdate = Session::haveRight("update_ticket", "1"); $showprivate = Session::haveRight("show_full_ticket", "1"); $align = "class='center"; $align_desc = "class='left"; if ($followups) { $align .= " top'"; $align_desc .= " top'"; } else { $align .= "'"; $align_desc .= "'"; } if ($job->getFromDB($id)) { $item_num = 1; $bgcolor = $_SESSION["glpipriority_" . $job->fields["priority"]]; echo Search::showNewLine($output_type, $row_num % 2); $check_col = ''; if (($candelete || $canupdate) && $output_type == Search::HTML_OUTPUT && $id_for_massaction) { $check_col = Html::getMassiveActionCheckBox(__CLASS__, $id_for_massaction); } echo Search::showItem($output_type, $check_col, $item_num, $row_num, $align); // First column $first_col = sprintf(__('%1$s: %2$s'), __('ID'), $job->fields["id"]); if ($output_type == Search::HTML_OUTPUT) { $first_col .= "<br><img src='" . self::getStatusIconURL($job->fields["status"]) . "'\n alt=\"" . self::getStatus($job->fields["status"]) . "\" title=\"" . self::getStatus($job->fields["status"]) . "\">"; } else { $first_col = sprintf(__('%1$s - %2$s'), $first_col, self::getStatus($job->fields["status"])); } echo Search::showItem($output_type, $first_col, $item_num, $row_num, $align); // Second column if ($job->fields['status'] == self::CLOSED) { $second_col = sprintf(__('Closed on %s'), ($output_type == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($job->fields['closedate'])); } else { if ($job->fields['status'] == self::SOLVED) { $second_col = sprintf(__('Solved on %s'), ($output_type == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($job->fields['solvedate'])); } else { if ($job->fields['begin_waiting_date']) { $second_col = sprintf(__('Put on hold on %s'), ($output_type == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($job->fields['begin_waiting_date'])); } else { if ($job->fields['due_date']) { $second_col = sprintf(__('%1$s: %2$s'), __('Due date'), ($output_type == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($job->fields['due_date'])); } else { $second_col = sprintf(__('Opened on %s'), ($output_type == Search::HTML_OUTPUT ? '<br>' : '') . Html::convDateTime($job->fields['date'])); } } } } echo Search::showItem($output_type, $second_col, $item_num, $row_num, $align . " width=130"); // Second BIS column $second_col = Html::convDateTime($job->fields["date_mod"]); echo Search::showItem($output_type, $second_col, $item_num, $row_num, $align . " width=90"); // Second TER column if (count($_SESSION["glpiactiveentities"]) > 1) { $second_col = Dropdown::getDropdownName('glpi_entities', $job->fields['entities_id']); echo Search::showItem($output_type, $second_col, $item_num, $row_num, $align . " width=100"); } // Third Column echo Search::showItem($output_type, "<span class='b'>" . parent::getPriorityName($job->fields["priority"]) . "</span>", $item_num, $row_num, "{$align} bgcolor='{$bgcolor}'"); // Fourth Column $fourth_col = ""; if (isset($job->users[CommonITILActor::REQUESTER]) && count($job->users[CommonITILActor::REQUESTER])) { foreach ($job->users[CommonITILActor::REQUESTER] as $d) { $userdata = getUserName($d["users_id"], 2); $fourth_col .= sprintf(__('%1$s %2$s'), "<span class='b'>" . $userdata['name'] . "</span>", Html::showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false))); $fourth_col .= "<br>"; } } if (isset($job->groups[CommonITILActor::REQUESTER]) && count($job->groups[CommonITILActor::REQUESTER])) { foreach ($job->groups[CommonITILActor::REQUESTER] as $d) { $fourth_col .= Dropdown::getDropdownName("glpi_groups", $d["groups_id"]); $fourth_col .= "<br>"; } } echo Search::showItem($output_type, $fourth_col, $item_num, $row_num, $align); // Fifth column $fifth_col = ""; if (isset($job->users[CommonITILActor::ASSIGN]) && count($job->users[CommonITILActor::ASSIGN])) { foreach ($job->users[CommonITILActor::ASSIGN] as $d) { $userdata = getUserName($d["users_id"], 2); $fifth_col .= sprintf(__('%1$s %2$s'), "<span class='b'>" . $userdata['name'] . "</span>", Html::showToolTip($userdata["comment"], array('link' => $userdata["link"], 'display' => false))); $fifth_col .= "<br>"; } } if (isset($job->groups[CommonITILActor::ASSIGN]) && count($job->groups[CommonITILActor::ASSIGN])) { foreach ($job->groups[CommonITILActor::ASSIGN] as $d) { $fifth_col .= Dropdown::getDropdownName("glpi_groups", $d["groups_id"]); $fifth_col .= "<br>"; } } if (isset($job->suppliers[CommonITILActor::ASSIGN]) && count($job->suppliers[CommonITILActor::ASSIGN])) { foreach ($job->suppliers[CommonITILActor::ASSIGN] as $d) { $fifth_col .= Dropdown::getDropdownName("glpi_suppliers", $d["suppliers_id"]); $fifth_col .= "<br>"; } } echo Search::showItem($output_type, $fifth_col, $item_num, $row_num, $align); // Sixth Colum $sixth_col = ""; $is_deleted = false; if (!empty($job->fields["itemtype"]) && $job->fields["items_id"] > 0) { if ($item = getItemForItemtype($job->fields["itemtype"])) { if ($item->getFromDB($job->fields["items_id"])) { $is_deleted = $item->isDeleted(); $sixth_col .= $item->getTypeName(); $sixth_col .= "<br><span class='b'>"; if ($item->canView()) { $sixth_col .= $item->getLink(array('linkoption' => $output_type == Search::HTML_OUTPUT)); } else { $sixth_col .= $item->getNameID(); } $sixth_col .= "</span>"; } } } else { if (empty($job->fields["itemtype"])) { $sixth_col = __('General'); } } echo Search::showItem($output_type, $sixth_col, $item_num, $row_num, $is_deleted ? " class='center deleted' " : $align); // Seventh column echo Search::showItem($output_type, "<span class='b'>" . Dropdown::getDropdownName('glpi_itilcategories', $job->fields["itilcategories_id"]) . "</span>", $item_num, $row_num, $align); // Eigth column $eigth_column = "<span class='b'>" . $job->fields["name"] . "</span> "; // Add link if ($job->canViewItem()) { $eigth_column = "<a id='ticket" . $job->fields["id"] . "{$rand}' href=\"" . $CFG_GLPI["root_doc"] . "/front/ticket.form.php?id=" . $job->fields["id"] . "\">{$eigth_column}</a>"; if ($followups && $output_type == Search::HTML_OUTPUT) { $eigth_column .= TicketFollowup::showShortForTicket($job->fields["id"]); } else { $eigth_column = sprintf(__('%1$s (%2$s)'), $eigth_column, sprintf(__('%1$s - %2$s'), $job->numberOfFollowups($showprivate), $job->numberOfTasks($showprivate))); } } if ($output_type == Search::HTML_OUTPUT) { $eigth_column = sprintf(__('%1$s %2$s'), $eigth_column, Html::showToolTip($job->fields['content'], array('display' => false, 'applyto' => "ticket" . $job->fields["id"] . $rand))); } echo Search::showItem($output_type, $eigth_column, $item_num, $row_num, $align_desc . "width='300'"); // Finish Line echo Search::showEndLine($output_type); } else { echo "<tr class='tab_bg_2'>"; echo "<td colspan='6' ><i>" . __('No ticket in progress.') . "</i></td></tr>"; } }
case "add_transfer_list": if (!isset($_SESSION['glpitransfer_list'])) { $_SESSION['glpitransfer_list'] = array(); } if (!isset($_SESSION['glpitransfer_list'][$_POST["itemtype"]])) { $_SESSION['glpitransfer_list'][$_POST["itemtype"]] = array(); } foreach ($_POST["item"] as $key => $val) { if ($val == 1) { $_SESSION['glpitransfer_list'][$_POST["itemtype"]][$key] = $key; } } $REDIRECT = $CFG_GLPI['root_doc'] . '/front/transfer.action.php'; break; case "add_followup": $fup = new TicketFollowup(); foreach ($_POST["item"] as $key => $val) { if ($val == 1) { $input = array('tickets_id' => $key, 'is_private' => $_POST['is_private'], 'requesttypes_id' => $_POST['requesttypes_id'], 'content' => $_POST['content']); if ($fup->can(-1, 'w', $input)) { $fup->add($input); } } } break; case "submit_validation": $valid = new TicketValidation(); foreach ($_POST["item"] as $key => $val) { if ($val == 1) { $input = array('tickets_id' => $key, 'users_id_validate' => $_POST['users_id_validate'], 'comment_submission' => $_POST['comment_submission']); if ($valid->can(-1, 'w', $input)) {
/** * Constructor * * @param $mailgateID ID of the mailgate * @param $display display messages in MessageAfterRedirect or just return error (default 0=) * * @return if $display = false return messages result string **/ function collect($mailgateID, $display = 0) { global $CFG_GLPI; if ($this->getFromDB($mailgateID)) { $this->mid = -1; $this->fetch_emails = 0; //Connect to the Mail Box $this->connect(); $rejected = new NotImportedEmail(); // Clean from previous collect (from GUI, cron already truncate the table) $rejected->deleteByCriteria(array('mailcollectors_id' => $this->fields['id'])); if ($this->marubox) { // Get Total Number of Unread Email in mail box $tot = $this->getTotalMails(); //Total Mails in Inbox Return integer value $error = 0; $refused = 0; $blacklisted = 0; for ($i = 1; $i <= $tot && $this->fetch_emails < $this->maxfetch_emails; $i++) { $tkt = $this->buildTicket($i, array('mailgates_id' => $mailgateID, 'play_rules' => true)); toolbox::logdebug("tkt", $tkt); //Indicates that the mail must be deleted from the mailbox $delete_mail = false; //If entity assigned, or email refused by rule, or no user and no supplier associated with the email $user_condition = $CFG_GLPI["use_anonymous_helpdesk"] || isset($tkt['_users_id_requester']) && $tkt['_users_id_requester'] > 0 || isset($tkt['_supplier_email']) && $tkt['_supplier_email']; $rejinput = array(); $rejinput['mailcollectors_id'] = $mailgateID; if (!$tkt['_blacklisted']) { $rejinput['from'] = $tkt['_head']['from']; $rejinput['to'] = $tkt['_head']['to']; $rejinput['users_id'] = $tkt['_users_id_requester']; $rejinput['subject'] = $this->textCleaner($tkt['_head']['subject']); $rejinput['messageid'] = $tkt['_head']['message_id']; } $rejinput['date'] = $_SESSION["glpi_currenttime"]; // Manage blacklisted emails if (isset($tkt['_blacklisted']) && $tkt['_blacklisted']) { $this->deleteMails($i, self::REFUSED_FOLDER); $blacklisted++; // entities_id set when new ticket / tickets_id when new followup } else { if ((isset($tkt['entities_id']) || isset($tkt['tickets_id'])) && $user_condition || isset($tkt['_refuse_email_no_response']) || isset($tkt['_refuse_email_with_response'])) { if (isset($tkt['_refuse_email_with_response'])) { $this->sendMailRefusedResponse($tkt['_head']['from'], $tkt['name']); $delete_mail = self::REFUSED_FOLDER; $refused++; } else { if (isset($tkt['_refuse_email_no_response'])) { $delete_mail = self::REFUSED_FOLDER; $refused++; } else { if (isset($tkt['entities_id']) || isset($tkt['tickets_id'])) { // Is a mail responding of an already existing ticket ? if (isset($tkt['tickets_id'])) { $fup = new TicketFollowup(); if ($fup->add($tkt)) { $delete_mail = self::ACCEPTED_FOLDER; } else { $error++; $rejinput['reason'] = NotImportedEmail::FAILED_INSERT; $rejected->add($rejinput); } } else { // New ticket $track = new Ticket(); if ($track->add($tkt)) { $delete_mail = self::ACCEPTED_FOLDER; } else { $error++; $rejinput['reason'] = NotImportedEmail::FAILED_INSERT; $rejected->add($rejinput); } } } else { // Case never raise $delete_mail = self::REFUSED_FOLDER; $refused++; } } } //Delete Mail from Mail box if ticket is added successfully if ($delete_mail) { $this->deleteMails($i, $delete_mail); } } else { if (!$tkt['_users_id_requester']) { $rejinput['reason'] = NotImportedEmail::USER_UNKNOWN; } else { $rejinput['reason'] = NotImportedEmail::MATCH_NO_RULE; } $rejected->add($rejinput); } } $this->fetch_emails++; } imap_expunge($this->marubox); $this->close_mailbox(); //Close Mail Box //TRANS: %1$d, %2$d, %3$d, %4$d and %5$d are number of messages $msg = sprintf(__('Number of messages: available=%1$d, retrieved=%2$d, refused=%3$d, errors=%4$d, blacklisted=%5$d'), $tot, $this->fetch_emails, $refused, $error, $blacklisted); if ($display) { Session::addMessageAfterRedirect($msg, false, $error ? ERROR : INFO); } else { return $msg; } } else { $msg = __('Could not connect to mailgate server'); if ($display) { Session::addMessageAfterRedirect($msg, false, ERROR); } else { return $msg; } } } else { //TRANS: %s is the ID of the mailgate $msg = sprintf(__('Could not find mailgate %d'), $mailgateID); if ($display) { Session::addMessageAfterRedirect($msg, false, ERROR); } else { return $msg; } } }
/** * Add a followup to a existing ticket * for an authenticated user * * @param $params array of options (ticket, content) * @param $protocol * * @return array of hashtable **/ static function methodAddTicketFollowup($params, $protocol) { if (isset($params['help'])) { return array('ticket' => 'integer,mandatory', 'content' => 'string,mandatory', 'users_login' => 'string,optional', 'close' => 'bool,optional', 'reopen' => 'bool,optional', 'source' => 'string,optional', 'private' => 'bool,optional', 'help' => 'bool,optional'); } if (!Session::getLoginUserID()) { return self::Error($protocol, WEBSERVICES_ERROR_NOTAUTHENTICATED); } $ticket = new Ticket(); if (isset($params['users_login']) && is_numeric($params['users_login'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'users_login should be a string'); } if (isset($params['users_login']) && is_string($params['users_login'])) { $user = new User(); if (!($users_id = $user->getIdByName($params['users_login']))) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'unable to get users_id with the users_login'); } } if (!isset($params['ticket'])) { return self::Error($protocol, WEBSERVICES_ERROR_MISSINGPARAMETER, '', 'ticket'); } if (!is_numeric($params['ticket'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'ticket'); } if (!$ticket->can($params['ticket'], 'r')) { return self::Error($protocol, WEBSERVICES_ERROR_NOTFOUND); } if (!$ticket->canAddFollowups()) { return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED); } if (in_array($ticket->fields["status"], $ticket->getSolvedStatusArray()) && !$ticket->canApprove()) { // Logged user not allowed if (isset($users_id)) { // If we get the users id $approbationSolution = self::checkApprobationSolution($users_id, $ticket); if (!$approbationSolution) { return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED); } } else { return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED); } } if (!isset($params['content'])) { return self::Error($protocol, WEBSERVICES_ERROR_MISSINGPARAMETER, '', 'content'); } // Source of the ticket, dynamically created if (isset($params['source'])) { if (empty($params['content'])) { return self::Error($protocol, WEBSERVICES_ERROR_MISSINGPARAMETER, '', 'source'); } $source = Dropdown::importExternal('RequestType', $params['source']); } else { $source = Dropdown::importExternal('RequestType', 'WebServices'); } $private = isset($params['private']) && $params['private'] ? 1 : 0; $followup = new TicketFollowup(); $user = 0; if (isset($users_id)) { $user = $users_id; } $data = array('tickets_id' => $params['ticket'], 'requesttypes_id' => $source, 'is_private' => $private, 'users_id' => $user, 'content' => addslashes(Toolbox::clean_cross_side_scripting_deep($params["content"]))); if (isset($params['close'])) { if (isset($params['reopen'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'can\'t use both reopen and close options'); } if (in_array($ticket->fields["status"], $ticket->getSolvedStatusArray())) { $data['add_close'] = 1; if (isset($users_id)) { $data['users_id'] = $users_id; } } else { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'close for not solved ticket'); } } if (isset($params['reopen'])) { if (in_array($ticket->fields['status'], array(Ticket::SOLVED, Ticket::WAITING))) { $data['add_reopen'] = 1; if (isset($users_id)) { $data['users_id'] = $users_id; } } else { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'reopen for not solved or waiting ticket'); } } if (in_array($ticket->fields["status"], $ticket->getSolvedStatusArray()) && !isset($params['close']) && !isset($params['reopen'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'missing reopen/close option for solved ticket'); } if (in_array($ticket->fields["status"], $ticket->getClosedStatusArray())) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'cannot add to a closed ticket'); } if ($followup->add($data)) { return self::methodGetTicket(array('ticket' => $params['ticket']), $protocol); } return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', self::getDisplayError()); }
GLPI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GLPI. If not, see <http://www.gnu.org/licenses/>. -------------------------------------------------------------------------- */ /** @file * @brief */ include '../inc/includes.php'; Session::checkLoginUser(); $fup = new TicketFollowup(); if (isset($_POST["add"])) { $fup->check(-1, CREATE, $_POST); $fup->add($_POST); Event::log($fup->getField('tickets_id'), "ticket", 4, "tracking", sprintf(__('%s adds a followup'), $_SESSION["glpiname"])); Html::back(); } else { if (isset($_POST['add_close']) || isset($_POST['add_reopen'])) { $ticket = new Ticket(); if ($ticket->getFromDB($_POST["tickets_id"]) && $ticket->canApprove()) { $fup->add($_POST); Event::log($fup->getField('tickets_id'), "ticket", 4, "tracking", sprintf(__('%s approves or refuses a solution'), $_SESSION["glpiname"])); Html::back(); } } else { if (isset($_POST["update"])) {
private function manageTicket($closed = true) { global $DB, $CFG_GLPI; $DB->connect(); $_SESSION['glpiactive_entity'] = 0; $CFG_GLPI['root_doc'] = "http://127.0.0.1/fusion0.83/"; $plugin = new Plugin(); $plugin->getFromDBbyDir("timelineticket"); $plugin->activate($plugin->fields['id']); Plugin::load("timelineticket"); Session::loadLanguage("en_GB"); $ticket = new Ticket(); $group = new Group(); $group_ticket = new Group_Ticket(); $GLPIlog = new GLPIlogs(); $ticket_User = new Ticket_User(); $_SESSION['plugin_timelineticket_date'] = array(); $group->add(array('name' => 'grtech1')); $group->add(array('name' => 'grtech2')); // * 01/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate = array('1' => $_SESSION["glpi_currenttime"]); $input = array(); $input['name'] = 'Pb with the ticket'; $input['content'] = 'I have a problem with the ticket'; $tickets_id = $ticket->add($input); $GLPIlog->testSQLlogs('01/'); $GLPIlog->testPHPlogs('01/'); // * 02/ sleep(2); // * 03/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[3] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = $tickets_id; $input['_itil_assign']['_type'] = 'group'; $input['_itil_assign']['groups_id'] = 1; $ticket->update($input); $input['_itil_assign']['_type'] = 'user'; $input['_itil_assign']['users_id'] = 2; $ticket->update($input); $GLPIlog->testSQLlogs('03/'); $GLPIlog->testPHPlogs('03/'); $a_db = getAllDatasFromTable('glpi_groups_tickets'); $a_ref = array(); $a_ref[1] = array('id' => '1', 'tickets_id' => '1', 'groups_id' => '1', 'type' => '2'); $this->assertEquals($a_ref, $a_db, 'May have ticket assigned to group1'); $a_db = getAllDatasFromTable('glpi_tickets_users'); $a_ref = array(); $a_ref[1] = array('id' => '1', 'tickets_id' => '1', 'users_id' => '2', 'type' => '1', 'use_notification' => '1', 'alternative_email' => ''); $a_ref[2] = array('id' => '2', 'tickets_id' => '1', 'users_id' => '2', 'type' => '2', 'use_notification' => '1', 'alternative_email' => ''); $this->assertEquals($a_ref, $a_db, 'May have ticket assigned to user 2 (glpi)'); // * 04/ sleep(2); // * 05/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[5] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = $tickets_id; $input['status'] = Ticket::WAITING; $ticket->update($input); $GLPIlog->testSQLlogs('05/'); $GLPIlog->testPHPlogs('05/'); $ticket->getFromDB(1); $this->assertEquals('waiting', $ticket->fields['status'], 'May have status waiting'); // * 06/ sleep(1); // * 07/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[7] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = 2; $input['itickets_id'] = $tickets_id; $ticket_User->check($input['id'], 'w'); $ticket_User->delete($input); $input = array(); $input['id'] = 1; $input['itickets_id'] = $tickets_id; $group_ticket->check($input['id'], 'w'); $group_ticket->delete($input); $GLPIlog->testSQLlogs('07/'); $GLPIlog->testPHPlogs('07/'); $a_db = getAllDatasFromTable('glpi_groups_tickets'); $this->assertEquals(array(), $a_db, 'May have no group assigned'); // * 08/ sleep(1); // * 09/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[9] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = $tickets_id; $input['_itil_assign']['_type'] = 'group'; $input['_itil_assign']['groups_id'] = 2; $ticket->update($input); $GLPIlog->testSQLlogs('09/'); $GLPIlog->testPHPlogs('09/'); $a_db = getAllDatasFromTable('glpi_groups_tickets'); $a_ref = array(); $a_ref[2] = array('id' => '2', 'tickets_id' => '1', 'groups_id' => '2', 'type' => '2'); $this->assertEquals($a_ref, $a_db, 'May have ticket assigned to group2'); $ticket->getFromDB(1); $this->assertEquals('assign', $ticket->fields['status'], '(09/) Status is assign'); // * 10/ sleep(1); // * 11/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[11] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = $tickets_id; $input['status'] = Ticket::WAITING; $ticket->update($input); $input = array(); $input['id'] = $tickets_id; $input['_itil_assign']['_type'] = 'user'; $input['_itil_assign']['users_id'] = 4; $ticket->update($input); $GLPIlog->testSQLlogs('11/'); $GLPIlog->testPHPlogs('11/'); // * 12/ sleep(1); // * 13/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[13] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = $tickets_id; $input['_itil_assign']['_type'] = 'group'; $input['_itil_assign']['groups_id'] = 1; $ticket->update($input); $input['_itil_assign']['_type'] = 'user'; $input['_itil_assign']['users_id'] = 2; $ticket->update($input); $GLPIlog->testSQLlogs('13/'); $GLPIlog->testPHPlogs('13/'); $ticket->getFromDB(1); $this->assertEquals('waiting', $ticket->fields['status'], '(13/)May have always status waiting'); // * 14/ $input = array(); $input['id'] = 2; $input['itickets_id'] = $tickets_id; $group_ticket->check($input['id'], 'w'); $group_ticket->delete($input); $GLPIlog->testSQLlogs('14/'); $GLPIlog->testPHPlogs('14/'); $a_db = getAllDatasFromTable('glpi_groups_tickets'); $a_ref = array(); $a_ref[3] = array('id' => '3', 'tickets_id' => '1', 'groups_id' => '1', 'type' => '2'); $this->assertEquals($a_ref, $a_db, '(14/) May have ticket assigned to group1'); $ticket->getFromDB(1); $this->assertEquals('waiting', $ticket->fields['status'], '(14/) Status is waiting'); // * 15/ sleep(2); // * 16/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[16] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = $tickets_id; $input['status'] = Ticket::ASSIGNED; $ticket->update($input); $GLPIlog->testSQLlogs('16/'); $GLPIlog->testPHPlogs('16/'); // * 17/ sleep(1); // * 18/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[18] = $_SESSION["glpi_currenttime"]; $input = array(); $input['id'] = $tickets_id; $input['solution'] = "solution"; $ticket->update($input); $GLPIlog->testSQLlogs('18/'); $GLPIlog->testPHPlogs('18/'); $ticket->getFromDB(1); $this->assertEquals('solved', $ticket->fields['status'], '(18/) Status is solved'); if ($closed) { // * 19/ sleep(1); // * 20/ $_SESSION["glpi_currenttime"] = date("Y-m-d H:i:s"); $a_storedate[20] = $_SESSION["glpi_currenttime"]; $fup = new TicketFollowup(); $input = array(); $input['tickets_id'] = $tickets_id; $input['add_close'] = 'add_close'; $fup->add($input); $GLPIlog->testSQLlogs('20/'); $GLPIlog->testPHPlogs('20/'); $ticket->getFromDB(1); $this->assertEquals('closed', $ticket->fields['status'], '(19/) Status is closed'); } self::$storedate = $a_storedate; }