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; }
/** * Assign and actor in a ticket for an authenticated user * * @param $params array of options (ticket, id2name) * @param $protocol the communication protocol used * * @return array of hashtable as glpi.getTicket **/ static function methodsetTicketAssign($params, $protocol) { global $DB, $CFG_GLPI; if (isset($params['help'])) { return array('ticket' => 'integer,mandatory', 'user' => 'integer,optional', 'supplier' => 'integer,optional', 'group' => 'integer,optional', 'user_email' => 'string,optional', 'use_email_notification' => 'bool,optional', 'help' => 'bool,optional'); } if (!Session::getLoginUserID()) { return self::Error($protocol, WEBSERVICES_ERROR_NOTAUTHENTICATED); } if (!Session::haveRight("assign_ticket", "1")) { return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED); } if (!isset($params['user']) && !isset($params['group']) && !isset($params['supplier'])) { return self::Error($protocol, WEBSERVICES_ERROR_MISSINGPARAMETER, '', 'user or group or supplier'); } $ticket = new Ticket(); 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=' . $params['ticket']); } if (!$ticket->can($params['ticket'], 'r')) { return self::Error($protocol, WEBSERVICES_ERROR_NOTFOUND); } if (!$ticket->getFromDB($params['ticket'])) { return self::Error($protocol, WEBSERVICES_ERROR_NOTFOUND, '', 'ticket'); } $ticket_user = new Ticket_User(); $user = array('tickets_id' => $params['ticket'], 'type' => CommonITILActor::ASSIGN); // technician : optionnal, default = none if (isset($params['user'])) { if (!is_numeric($params['user'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'user'); } $user['users_id'] = $params['user']; if ($ticket->getFromDB($params['ticket'])) { $entity = $ticket->getField('entities_id'); } if (!$ticket_user->can(-1, 'w', $user) || !self::checkUserRights($params['user'], "own_ticket", 1, $entity)) { return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED); } if ($ticket->isUser(CommonITILActor::ASSIGN, $user['users_id'])) { return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', 'User already assign for this ticket'); } if (isset($params['user_email'])) { if (!NotificationMail::isUserAddressValid($params['user_email'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'user_email'); } $user['alternative_email'] = $params['user_email']; $user['use_notification'] = 1; } else { if (isset($params['use_email_notification']) && $params['use_email_notification']) { $user['_additional_assigns'][] = array('users_id' => $params['user'], 'use_notification' => 1); } else { if (isset($params['use_email_notification']) && !$params['use_email_notification']) { $user['_additional_assigns'][] = array('users_id' => $params['user'], 'use_notification' => 0); } } } if (!$ticket_user->add($user)) { return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', 'user not assign'); } } // group (technicians group) : optionnal, default = none $group_ticket = new Group_Ticket(); $group = array('tickets_id' => $params['ticket'], 'type' => CommonITILActor::ASSIGN); if (isset($params['group'])) { if (!is_numeric($params['group'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'group'); } $group['groups_id'] = $params['group']; if (!$group_ticket->can(-1, 'w', $group)) { return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED); } if ($ticket->isGroup(CommonITILActor::ASSIGN, $params['group'])) { return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', 'Group already assign for this ticket'); } if (!$group_ticket->add($group)) { return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', 'group not assign'); } } // supplier to assign : optionnal, default = none $supplier_ticket = new Supplier_Ticket(); $supplier = array('tickets_id' => $params['ticket'], 'type' => CommonITILActor::ASSIGN); if (isset($params['supplier'])) { if (!is_numeric($params['supplier'])) { return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'supplier'); } $supplier['suppliers_id'] = $params['supplier']; if (!$supplier_ticket->can(-1, 'w', $supplier)) { return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED); } if ($ticket->isSupplier(CommonITILActor::ASSIGN, $params['supplier'])) { return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', 'Supplier already assign for this ticket'); } if (!$supplier_ticket->add($supplier)) { return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', 'supplier not assign'); } } return self::methodGetTicket(array('ticket' => $params['ticket']), $protocol); return self::Error($protocol, WEBSERVICES_ERROR_FAILED, '', self::getDisplayError()); }