Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
 /**
  * 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());
 }