/** * @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; }
function prepareInputForUpdate($input) { global $LANG, $CFG_GLPI; // Get ticket : need for comparison $this->getFromDB($input['id']); if (isset($input["date"]) && empty($input["date"])) { unset($input["date"]); } if (isset($input["closedate"]) && empty($input["closedate"])) { unset($input["closedate"]); } if (isset($input["solvedate"]) && empty($input["solvedate"])) { unset($input["solvedate"]); } // check mandatory fields if ($CFG_GLPI["is_ticket_title_mandatory"] && isset($input['name'])) { $title = trim($input['name']); if (empty($title)) { addMessageAfterRedirect($LANG['tracking'][6], false, ERROR); unset($input['name']); } } if ($CFG_GLPI["is_ticket_content_mandatory"] && isset($input['content'])) { $content = trim($input['content']); if (empty($content)) { addMessageAfterRedirect($LANG['tracking'][7], false, ERROR); unset($input['content']); } } // Security checks if (is_numeric(getLoginUserID(false)) && !haveRight("assign_ticket", "1")) { if (isset($input["_ticket_assign"]) && isset($input['_ticket_assign']['_type']) && $input['_ticket_assign']['_type'] == 'user') { // must own_ticket to grab a non assign ticket if ($this->countUsers(self::ASSIGN) == 0) { if (!haveRight("steal_ticket", "1") && !haveRight("own_ticket", "1") || !isset($input["_ticket_assign"]['users_id']) || $input["_ticket_assign"]['users_id'] != getLoginUserID()) { unset($input["_ticket_assign"]); } } else { // Can not steal or can steal and not assign to me if (!haveRight("steal_ticket", "1") || !isset($input["_ticket_assign"]['users_id']) || $input["_ticket_assign"]['users_id'] != getLoginUserID()) { unset($input["_ticket_assign"]); } } } // No supplier assign if (isset($input["suppliers_id_assign"])) { unset($input["suppliers_id_assign"]); } // No group if (isset($input["_ticket_assign"]) && isset($input['_ticket_assign']['_type']) && $input['_ticket_assign']['_type'] == 'group') { unset($input["_ticket_assign"]); } } if (is_numeric(getLoginUserID(false)) && !haveRight("update_ticket", "1")) { $allowed_fields = array('id'); if ($this->canApprove() && isset($input["status"])) { $allowed_fields[] = 'status'; } // for post-only with validate right $ticketval = new TicketValidation(); if (TicketValidation::canValidate($this->fields['id']) || $ticketval->canCreate()) { $allowed_fields[] = 'global_validation'; } // Manage assign and steal right if (haveRight('assign_ticket', 1) || haveRight('steal_ticket', 1)) { $allowed_fields[] = '_ticket_assign'; } if (haveRight('assign_ticket', 1)) { $allowed_fields[] = 'suppliers_id_assign'; } // Can only update initial fields if no followup or task already added if ($this->numberOfFollowups() == 0 && $this->numberOfTasks() == 0 && $this->isUser(self::REQUESTER, getLoginUserID())) { $allowed_fields[] = 'content'; $allowed_fields[] = 'urgency'; $allowed_fields[] = 'ticketcategories_id'; $allowed_fields[] = 'itemtype'; $allowed_fields[] = 'items_id'; $allowed_fields[] = 'name'; } if ($this->canSolve()) { $allowed_fields[] = 'ticketsolutiontypes_id'; $allowed_fields[] = 'solution'; } foreach ($allowed_fields as $field) { if (isset($input[$field])) { $ret[$field] = $input[$field]; } } $input = $ret; } // Manage fields from auto update : map rule actions to standard ones if (isset($input['_auto_update'])) { if (isset($input['_users_id_assign'])) { $input['_ticket_assign']['_type'] = 'user'; $input['_ticket_assign']['users_id'] = $input['_users_id_assign']; } if (isset($input['_groups_id_assign'])) { $input['_ticket_assign']['_type'] = 'group'; $input['_ticket_assign']['groups_id'] = $input['_groups_id_assign']; } if (isset($input['_users_id_requester'])) { $input['_ticket_requester']['_type'] = 'user'; $input['_ticket_requester']['users_id'] = $input['_users_id_requester']; } if (isset($input['_groups_id_requester'])) { $input['_ticket_requester']['_type'] = 'group'; $input['_ticket_requester']['groups_id'] = $input['_groups_id_requester']; } if (isset($input['_users_id_observer'])) { $input['_ticket_observer']['_type'] = 'user'; $input['_ticket_observer']['users_id'] = $input['_users_id_observer']; } if (isset($input['_groups_id_observer'])) { $input['_ticket_observer']['_type'] = 'group'; $input['_ticket_observer']['groups_id'] = $input['_groups_id_observer']; } } if (isset($input['_link'])) { $ticket_ticket = new Ticket_Ticket(); if (!empty($input['_link']['tickets_id_2']) && $ticket_ticket->can(-1, 'w', $input['_link'])) { if ($ticket_ticket->add($input['_link'])) { $input['_forcenotif'] = true; } } } if (isset($input['_ticket_requester'])) { if (isset($input['_ticket_requester']['_type'])) { $input['_ticket_requester']['type'] = self::REQUESTER; $input['_ticket_requester']['tickets_id'] = $input['id']; switch ($input['_ticket_requester']['_type']) { case "user": if (isset($input['_ticket_requester']['alternative_email']) && $input['_ticket_requester']['alternative_email'] && !NotificationMail::isUserAddressValid($input['_ticket_requester']['alternative_email'])) { addMessageAfterRedirect($LANG['mailing'][111] . ' : ' . $LANG['mailing'][110], false, ERROR); $input['_ticket_requester']['alternative_email'] = ''; } if (isset($input['_ticket_requester']['alternative_email']) && $input['_ticket_requester']['alternative_email'] || $input['_ticket_requester']['users_id'] > 0) { $ticket_user = new Ticket_User(); if ($ticket_user->can(-1, 'w', $input['_ticket_requester'])) { $ticket_user->add($input['_ticket_requester']); $input['_forcenotif'] = true; } } break; case "group": $group_ticket = new Group_Ticket(); if ($group_ticket->can(-1, 'w', $input['_ticket_requester'])) { $group_ticket->add($input['_ticket_requester']); $input['_forcenotif'] = true; } break; } } } if (isset($input['_ticket_observer'])) { if (isset($input['_ticket_observer']['_type'])) { $input['_ticket_observer']['type'] = self::OBSERVER; $input['_ticket_observer']['tickets_id'] = $input['id']; switch ($input['_ticket_observer']['_type']) { case "user": if (isset($input['_ticket_observer']['alternative_email']) && $input['_ticket_observer']['alternative_email'] && !NotificationMail::isUserAddressValid($input['_ticket_observer']['alternative_email'])) { $input['_ticket_observer']['alternative_email'] = ''; addMessageAfterRedirect($LANG['mailing'][111] . ' : ' . $LANG['mailing'][110], false, ERROR); } if (isset($input['_ticket_observer']['alternative_email']) && $input['_ticket_observer']['alternative_email'] || $input['_ticket_observer']['users_id'] > 0) { $ticket_user = new Ticket_User(); if ($ticket_user->can(-1, 'w', $input['_ticket_observer'])) { $ticket_user->add($input['_ticket_observer']); $input['_forcenotif'] = true; } } break; case "group": $group_ticket = new Group_Ticket(); if ($group_ticket->can(-1, 'w', $input['_ticket_observer'])) { $group_ticket->add($input['_ticket_observer']); $input['_forcenotif'] = true; } break; } } } if (isset($input['_ticket_assign'])) { if (isset($input['_ticket_assign']['_type'])) { $input['_ticket_assign']['type'] = self::ASSIGN; $input['_ticket_assign']['tickets_id'] = $input['id']; switch ($input['_ticket_assign']['_type']) { case "user": $ticket_user = new Ticket_User(); if ($ticket_user->can(-1, 'w', $input['_ticket_assign'])) { $ticket_user->add($input['_ticket_assign']); $input['_forcenotif'] = true; if (!isset($input['status']) && $this->fields['status'] == 'new' || isset($input['status']) && $input['status'] == 'new') { $input['status'] = 'assign'; } } break; case "group": $group_ticket = new Group_Ticket(); if ($group_ticket->can(-1, 'w', $input['_ticket_assign'])) { $group_ticket->add($input['_ticket_assign']); $input['_forcenotif'] = true; if (!isset($input['status']) && $this->fields['status'] == 'new' || isset($input['status']) && $input['status'] == 'new') { $input['status'] = 'assign'; } } break; } } } // set last updater when non auto update if (!isset($input['_auto_update']) && ($lastupdater = getLoginUserID(true))) { $input['users_id_lastupdater'] = $lastupdater; } if (isset($input["items_id"]) && $input["items_id"] >= 0 && isset($input["itemtype"])) { if (isset($this->fields['groups_id']) && $this->fields['groups_id'] == 0 && (!isset($input['groups_id']) || $input['groups_id'] == 0)) { if ($input["itemtype"] && class_exists($input["itemtype"])) { $item = new $input["itemtype"](); $item->getFromDB($input["items_id"]); if ($item->isField('groups_id')) { $input["groups_id"] = $item->getField('groups_id'); } } } } else { if (isset($input["itemtype"]) && empty($input["itemtype"])) { $input["items_id"] = 0; } else { unset($input["items_id"]); unset($input["itemtype"]); } } // Add document if needed $this->getFromDB($input["id"]); // entities_id field required if (!isset($input['_donotadddocs']) || !$input['_donotadddocs']) { $docadded = $this->addFiles($input["id"]); } /* if (count($docadded)>0) { $input["date_mod"]=$_SESSION["glpi_currenttime"]; if ($CFG_GLPI["add_followup_on_update_ticket"]) { $input['_doc_added']=$docadded; } } */ if (isset($input["document"]) && $input["document"] > 0) { $doc = new Document(); if ($doc->getFromDB($input["document"])) { $docitem = new Document_Item(); if ($docitem->add(array('documents_id' => $input["document"], 'itemtype' => $this->getType(), 'items_id' => $input["id"]))) { // Force date_mod of tracking $input["date_mod"] = $_SESSION["glpi_currenttime"]; $input['_doc_added'][] = $doc->fields["name"]; } } unset($input["document"]); } //Action for send_validation rule if (isset($input["_add_validation"]) && $input["_add_validation"] > 0) { $validation = new Ticketvalidation(); $values['tickets_id'] = $input['id']; $values['users_id_validate'] = $input["_add_validation"]; if (isset($input["_auto_update"])) { $values['_auto_update'] = true; } if ($validation->can(-1, 'w', $values)) { $validation->add($values); Event::log($this->fields['id'], "ticket", 4, "tracking", $_SESSION["glpiname"] . " " . $LANG['log'][21]); } } if (isset($input["status"]) && $input["status"] != 'solved' && $input["status"] != 'closed') { $input['solvedate'] = 'NULL'; } if (isset($input["status"]) && $input["status"] != 'closed') { $input['closedate'] = 'NULL'; } return $input; }
/** * @see CommonDBTM::getSpecificMassiveActions() **/ function getSpecificMassiveActions($checkitem = NULL) { $isadmin = static::canUpdate(); $actions = parent::getSpecificMassiveActions($checkitem); if (TicketFollowup::canCreate() && $_SESSION['glpiactiveprofile']['interface'] == 'central') { $actions['add_followup'] = __('Add a new followup'); } if (TicketTask::canCreate()) { $actions['add_task'] = __('Add a new task'); } if (TicketValidation::canCreate()) { $actions['submit_validation'] = __('Approval request'); } if (Session::haveRight("update_ticket", "1")) { $actions['add_actor'] = __('Add an actor'); $actions['link_ticket'] = _x('button', 'Link tickets'); } if (Session::haveRight('transfer', 'r') && Session::isMultiEntitiesMode() && Session::haveRight("update_ticket", "1")) { $actions['add_transfer_list'] = _x('button', 'Add to transfer list'); } return $actions; }
/** * 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"; } }