Get date based on a slt
public computeDate ( $start_date, $additional_delay ) : due | ||
$start_date | datetime start date | |
$additional_delay | integer additional delay to add or substract (for waiting time) (default 0) | |
return | due | date time (NULL if sla not exists) |
/** * Get Datas to be added for SLT add * * @param $slts_id SLT id * @param $entities_id entity ID of the ticket * @param $date begin date of the ticket * @param $type type of SLT * * @since version 9.1 (before getDatasToAddSla without type parameter) * * @return array of datas to add in ticket **/ function getDatasToAddSLT($slts_id, $entities_id, $date, $type) { list($dateField, $sltField) = SLT::getSltFieldNames($type); $calendars_id = Entity::getUsedConfig('calendars_id', $entities_id); $data = array(); $slt = new SLT(); if ($slt->getFromDB($slts_id)) { $slt->setTicketCalendar($calendars_id); if ($slt->fields['type'] == SLT::TTR) { $data["ttr_slalevels_id"] = SlaLevel::getFirstSltLevel($slts_id); } // Compute due_date $data[$dateField] = $slt->computeDate($date); $data['sla_waiting_duration'] = 0; } else { $data["ttr_slalevels_id"] = 0; $data[$sltField] = 0; $data['sla_waiting_duration'] = 0; } return $data; }
function pre_updateInDB() { // get again object to reload actors $this->loadActors(); // Setting a solution or solution type means the problem is solved if (in_array("solutiontypes_id", $this->updates) && $this->input["solutiontypes_id"] > 0 || in_array("solution", $this->updates) && !empty($this->input["solution"])) { if (!in_array('status', $this->updates)) { $this->oldvalues['status'] = $this->fields['status']; $this->updates[] = 'status'; } // Special case for Ticket : use autoclose if ($this->getType() == 'Ticket') { $autoclosedelay = Entity::getUsedConfig('autoclose_delay', $this->getEntityID(), '', Entity::CONFIG_NEVER); // 0 = immediatly if ($autoclosedelay == 0) { $this->fields['status'] = self::CLOSED; $this->input['status'] = self::CLOSED; } else { $this->fields['status'] = self::SOLVED; $this->input['status'] = self::SOLVED; } } else { $this->fields['status'] = self::SOLVED; $this->input['status'] = self::SOLVED; } } // Check dates change interval due to the fact that second are not displayed in form if (($key = array_search('date', $this->updates)) !== false && substr($this->fields["date"], 0, 16) == substr($this->oldvalues['date'], 0, 16)) { unset($this->updates[$key]); unset($this->oldvalues['date']); } if (($key = array_search('closedate', $this->updates)) !== false && substr($this->fields["closedate"], 0, 16) == substr($this->oldvalues['closedate'], 0, 16)) { unset($this->updates[$key]); unset($this->oldvalues['closedate']); } if (($key = array_search('due_date', $this->updates)) !== false && substr($this->fields["due_date"], 0, 16) == substr($this->oldvalues['due_date'], 0, 16)) { unset($this->updates[$key]); unset($this->oldvalues['due_date']); } if (($key = array_search('solvedate', $this->updates)) !== false && substr($this->fields["solvedate"], 0, 16) == substr($this->oldvalues['solvedate'], 0, 16)) { unset($this->updates[$key]); unset($this->oldvalues['solvedate']); } if (isset($this->input["status"])) { if ($this->input["status"] != self::WAITING && $this->countSuppliers(CommonITILActor::ASSIGN) == 0 && $this->countUsers(CommonITILActor::ASSIGN) == 0 && $this->countGroups(CommonITILActor::ASSIGN) == 0 && !in_array($this->fields['status'], array_merge($this->getSolvedStatusArray(), $this->getClosedStatusArray()))) { if (!in_array('status', $this->updates)) { $this->oldvalues['status'] = $this->fields['status']; $this->updates[] = 'status'; } // $this->fields['status'] = self::INCOMING; // Don't change status if it's a new status allow if (in_array($this->oldvalues['status'], $this->getNewStatusArray()) && !in_array($this->input['status'], $this->getNewStatusArray())) { $this->fields['status'] = $this->oldvalues['status']; } } if (in_array("status", $this->updates) && in_array($this->input["status"], $this->getSolvedStatusArray())) { $this->updates[] = "solvedate"; $this->oldvalues['solvedate'] = $this->fields["solvedate"]; $this->fields["solvedate"] = $_SESSION["glpi_currenttime"]; // If invalid date : set open date if ($this->fields["solvedate"] < $this->fields["date"]) { $this->fields["solvedate"] = $this->fields["date"]; } } if (in_array("status", $this->updates) && in_array($this->input["status"], $this->getClosedStatusArray())) { $this->updates[] = "closedate"; $this->oldvalues['closedate'] = $this->fields["closedate"]; $this->fields["closedate"] = $_SESSION["glpi_currenttime"]; // If invalid date : set open date if ($this->fields["closedate"] < $this->fields["date"]) { $this->fields["closedate"] = $this->fields["date"]; } // Set solvedate to closedate if (empty($this->fields["solvedate"])) { $this->updates[] = "solvedate"; $this->oldvalues['solvedate'] = $this->fields["solvedate"]; $this->fields["solvedate"] = $this->fields["closedate"]; } } } // check dates // check due_date (SLA) if ((in_array("date", $this->updates) || in_array("due_date", $this->updates)) && !is_null($this->fields["due_date"])) { // Date set if ($this->fields["due_date"] < $this->fields["date"]) { Session::addMessageAfterRedirect(__('Invalid dates. Update cancelled.'), false, ERROR); if (($key = array_search('date', $this->updates)) !== false) { unset($this->updates[$key]); unset($this->oldvalues['date']); } if (($key = array_search('due_date', $this->updates)) !== false) { unset($this->updates[$key]); unset($this->oldvalues['due_date']); } } } // Status close : check dates if (in_array($this->fields["status"], $this->getClosedStatusArray()) && (in_array("date", $this->updates) || in_array("closedate", $this->updates))) { // Invalid dates : no change // closedate must be > solvedate if ($this->fields["closedate"] < $this->fields["solvedate"]) { Session::addMessageAfterRedirect(__('Invalid dates. Update cancelled.'), false, ERROR); if (($key = array_search('closedate', $this->updates)) !== false) { unset($this->updates[$key]); unset($this->oldvalues['closedate']); } } // closedate must be > create date if ($this->fields["closedate"] < $this->fields["date"]) { Session::addMessageAfterRedirect(__('Invalid dates. Update cancelled.'), false, ERROR); if (($key = array_search('date', $this->updates)) !== false) { unset($this->updates[$key]); unset($this->oldvalues['date']); } if (($key = array_search('closedate', $this->updates)) !== false) { unset($this->updates[$key]); unset($this->oldvalues['closedate']); } } } if (($key = array_search('status', $this->updates)) !== false && $this->oldvalues['status'] == $this->fields['status']) { unset($this->updates[$key]); unset($this->oldvalues['status']); } // Status solved : check dates if (in_array($this->fields["status"], $this->getSolvedStatusArray()) && (in_array("date", $this->updates) || in_array("solvedate", $this->updates))) { // Invalid dates : no change // solvedate must be > create date if ($this->fields["solvedate"] < $this->fields["date"]) { Session::addMessageAfterRedirect(__('Invalid dates. Update cancelled.'), false, ERROR); if (($key = array_search('date', $this->updates)) !== false) { unset($this->updates[$key]); unset($this->oldvalues['date']); } if (($key = array_search('solvedate', $this->updates)) !== false) { unset($this->updates[$key]); unset($this->oldvalues['solvedate']); } } } // Manage come back to waiting state if (!is_null($this->fields['begin_waiting_date']) && ($key = array_search('status', $this->updates)) !== false && ($this->oldvalues['status'] == self::WAITING || in_array($this->oldvalues["status"], $this->getSolvedStatusArray()) && !in_array($this->fields["status"], $this->getClosedStatusArray()))) { // Compute ticket waiting time use calendar if exists $calendar = new Calendar(); $calendars_id = $this->getCalendar(); $delay_time = 0; // Compute ticket waiting time use calendar if exists // Using calendar if ($calendars_id > 0 && $calendar->getFromDB($calendars_id)) { $delay_time = $calendar->getActiveTimeBetween($this->fields['begin_waiting_date'], $_SESSION["glpi_currenttime"]); } else { // Not calendar defined $delay_time = strtotime($_SESSION["glpi_currenttime"]) - strtotime($this->fields['begin_waiting_date']); } // SLT case : compute slt_ttr duration if (isset($this->fields['slts_ttr_id']) && $this->fields['slts_ttr_id'] > 0) { $slt = new SLT(); if ($slt->getFromDB($this->fields['slts_ttr_id'])) { $slt->setTicketCalendar($calendars_id); $delay_time_sla = $slt->getActiveTimeBetween($this->fields['begin_waiting_date'], $_SESSION["glpi_currenttime"]); $this->updates[] = "sla_waiting_duration"; $this->fields["sla_waiting_duration"] += $delay_time_sla; } // Compute new due date $this->updates[] = "due_date"; $this->fields['due_date'] = $slt->computeDate($this->fields['date'], $this->fields["sla_waiting_duration"]); // Add current level to do $slt->addLevelToDo($this); } else { // Using calendar if ($calendars_id > 0 && $calendar->getFromDB($calendars_id)) { if ($this->fields['due_date'] > 0) { // compute new due date using calendar $this->updates[] = "due_date"; $this->fields['due_date'] = $calendar->computeEndDate($this->fields['due_date'], $delay_time); } } else { // Not calendar defined if ($this->fields['due_date'] > 0) { // compute new due date : no calendar so add computed delay_time $this->updates[] = "due_date"; $this->fields['due_date'] = date('Y-m-d H:i:s', $delay_time + strtotime($this->fields['due_date'])); } } } $this->updates[] = "waiting_duration"; $this->fields["waiting_duration"] += $delay_time; // Reset begin_waiting_date $this->updates[] = "begin_waiting_date"; $this->fields["begin_waiting_date"] = 'NULL'; } // Set begin waiting date if needed if (($key = array_search('status', $this->updates)) !== false && ($this->fields['status'] == self::WAITING || in_array($this->fields["status"], $this->getSolvedStatusArray()))) { $this->updates[] = "begin_waiting_date"; $this->fields["begin_waiting_date"] = $_SESSION["glpi_currenttime"]; // Specific for tickets if (isset($this->fields['slts_ttr_id']) && $this->fields['slts_ttr_id'] > 0) { SLT::deleteLevelsToDo($this); } } // solve_delay_stat : use delay between opendate and solvedate if (in_array("solvedate", $this->updates)) { $this->updates[] = "solve_delay_stat"; $this->fields['solve_delay_stat'] = $this->computeSolveDelayStat(); } // close_delay_stat : use delay between opendate and closedate if (in_array("closedate", $this->updates)) { $this->updates[] = "close_delay_stat"; $this->fields['close_delay_stat'] = $this->computeCloseDelayStat(); } // Do not take into account date_mod if no update is done if (count($this->updates) == 1 && ($key = array_search('date_mod', $this->updates)) !== false) { unset($this->updates[$key]); } }