mirror of
https://github.com/pandorafms/pandorafms.git
synced 2025-07-28 16:24:54 +02:00
Modified SLA to work only in working time properly. TICKETS #3370
Graphs are modified to show without having consideration of working time
This commit is contained in:
parent
9a22c0ed2a
commit
38e7a4277f
@ -2108,7 +2108,7 @@ function graph_sla_slicebar ($id, $period, $sla_min, $sla_max, $date, $daysWeek
|
|||||||
// If the data is not provided, we got it
|
// If the data is not provided, we got it
|
||||||
if ($data === false) {
|
if ($data === false) {
|
||||||
$data = reporting_get_agentmodule_sla_array ($id, $period,
|
$data = reporting_get_agentmodule_sla_array ($id, $period,
|
||||||
$sla_min, $sla_max, $date, $daysWeek, $time_from, $time_to);
|
$sla_min, $sla_max, $date, $daysWeek, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
$col_planned_downtime = '#20973F';
|
$col_planned_downtime = '#20973F';
|
||||||
|
@ -7741,7 +7741,15 @@ function reporting_get_agentmodule_sla_day ($id_agent_module, $period = 0, $min_
|
|||||||
// Limit date to start searching data
|
// Limit date to start searching data
|
||||||
$datelimit = $date - $period;
|
$datelimit = $date - $period;
|
||||||
|
|
||||||
|
// Substract the not working time
|
||||||
|
// Initialize the working time status machine ($wt_status)
|
||||||
|
// Search the first data at worktime start
|
||||||
|
list ($period_reduced, $wt_status, $datelimit_increased) = reporting_get_agentmodule_sla_day_period ($period, $date, $timeFrom, $timeTo);
|
||||||
|
if ($period_reduced <= 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$wt_points = reporting_get_agentmodule_sla_working_timestamp ($period, $date, $timeFrom, $timeTo);
|
||||||
|
|
||||||
$search_in_history_db = db_search_in_history_db($datelimit);
|
$search_in_history_db = db_search_in_history_db($datelimit);
|
||||||
|
|
||||||
@ -7784,7 +7792,7 @@ function reporting_get_agentmodule_sla_day ($id_agent_module, $period = 0, $min_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The not working time consideration is now doing in foreach loop above
|
||||||
switch ($config["dbtype"]) {
|
switch ($config["dbtype"]) {
|
||||||
case "mysql":
|
case "mysql":
|
||||||
case "postgresql":
|
case "postgresql":
|
||||||
@ -7801,6 +7809,7 @@ function reporting_get_agentmodule_sla_day ($id_agent_module, $period = 0, $min_
|
|||||||
case "oracle":
|
case "oracle":
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
* */
|
||||||
|
|
||||||
|
|
||||||
$sql .= ' ORDER BY utimestamp ASC';
|
$sql .= ' ORDER BY utimestamp ASC';
|
||||||
@ -7815,11 +7824,17 @@ function reporting_get_agentmodule_sla_day ($id_agent_module, $period = 0, $min_
|
|||||||
reporting_get_planned_downtimes_intervals($id_agent_module, $datelimit, $date);
|
reporting_get_planned_downtimes_intervals($id_agent_module, $datelimit, $date);
|
||||||
|
|
||||||
// Get previous data
|
// Get previous data
|
||||||
$previous_data = modules_get_previous_data($id_agent_module, $datelimit);
|
$previous_data = modules_get_previous_data($id_agent_module, $datelimit + $datelimit_increased);
|
||||||
|
|
||||||
if ($previous_data !== false) {
|
if ($previous_data !== false) {
|
||||||
$previous_data['utimestamp'] = $datelimit;
|
$previous_data['utimestamp'] = $datelimit + $datelimit_increased;
|
||||||
array_unshift ($interval_data, $previous_data);
|
array_unshift ($interval_data, $previous_data);
|
||||||
|
} else if (count ($interval_data) > 0) {
|
||||||
|
// Propagate undefined status to first time point
|
||||||
|
$first_interval_time = array_shift ($interval_data);
|
||||||
|
html_debug ($first_interval_time);
|
||||||
|
$period_reduced -= $first_interval_time['utimestamp'] - $datelimit + $datelimit_increased;
|
||||||
|
array_unshift ($interval_data, $first_interval_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get next data
|
// Get next data
|
||||||
@ -7868,8 +7883,18 @@ function reporting_get_agentmodule_sla_day ($id_agent_module, $period = 0, $min_
|
|||||||
|
|
||||||
|
|
||||||
foreach ($interval_data as $data) {
|
foreach ($interval_data as $data) {
|
||||||
// Previous status was critical
|
// Test if working time is changed
|
||||||
if ($previous_status == 1) {
|
while ($wt_points[0] <= $data['utimestamp']) {
|
||||||
|
$intermediate_point = array_shift($wt_points);
|
||||||
|
if ($wt_status && ($previous_status == 1)) {
|
||||||
|
$bad_period += $intermediate_point - $previous_utimestamp;
|
||||||
|
}
|
||||||
|
$previous_utimestamp = $intermediate_point;
|
||||||
|
$wt_status = !$wt_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increses bad_period only if it is working time
|
||||||
|
if ($wt_status && ($previous_status == 1)) {
|
||||||
$bad_period += $data['utimestamp'] - $previous_utimestamp;
|
$bad_period += $data['utimestamp'] - $previous_utimestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7895,7 +7920,7 @@ function reporting_get_agentmodule_sla_day ($id_agent_module, $period = 0, $min_
|
|||||||
|
|
||||||
|
|
||||||
// Return the percentage of SLA compliance
|
// Return the percentage of SLA compliance
|
||||||
return (float) (100 - ($bad_period / $period) * 100);
|
return (float) (100 - ($bad_period / $period_reduced) * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -8505,4 +8530,184 @@ function reporting_format_planned_downtime_dates ($planned_downtime) {
|
|||||||
return $dates;
|
return $dates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get real period in SLA subtracting worktime period.
|
||||||
|
* Get if is working in the first point
|
||||||
|
* Get time between first point and
|
||||||
|
*
|
||||||
|
* @param int Period to check the SLA compliance.
|
||||||
|
* @param int Date_end date end the sla compliace interval
|
||||||
|
* @param int Working Time start
|
||||||
|
* @param int Working Time end
|
||||||
|
*
|
||||||
|
* @return array (int fixed SLA period, bool inside working time)
|
||||||
|
* found
|
||||||
|
*/
|
||||||
|
function reporting_get_agentmodule_sla_day_period ($period, $date_end, $wt_start = "00:00:00", $wt_end = "23:59:59") {
|
||||||
|
|
||||||
|
$date_start = $date_end - $period;
|
||||||
|
// Converts to timestamp
|
||||||
|
$human_date_end = date ('H:i:s', $date_end);
|
||||||
|
$human_date_start = date ('H:i:s', $date_start);
|
||||||
|
// Store into an array the points
|
||||||
|
// "s" start SLA interval point
|
||||||
|
// "e" end SLA interval point
|
||||||
|
// "f" start worktime interval point (from)
|
||||||
|
// "t" end worktime interval point (to)
|
||||||
|
$tp = array (
|
||||||
|
"s" => strtotime($human_date_start),
|
||||||
|
"e" => strtotime($human_date_end),
|
||||||
|
"f" => strtotime($wt_start),
|
||||||
|
"t" => strtotime($wt_end)
|
||||||
|
);
|
||||||
|
|
||||||
|
asort ($tp);
|
||||||
|
$order = "";
|
||||||
|
foreach ($tp as $type => $time) {
|
||||||
|
$order .= $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
$period_reduced = $period;
|
||||||
|
$start_working = true;
|
||||||
|
$datelimit_increased = 0;
|
||||||
|
|
||||||
|
//Special case. If $order = "seft" and start time == end time it should be treated like "esft"
|
||||||
|
if (($period > 0) and ($human_date_end == $human_date_start) and ($order == "seft")) {
|
||||||
|
$order = "esft";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Discriminates the cases depends what time point is higher than other
|
||||||
|
switch ($order) {
|
||||||
|
|
||||||
|
case "setf":
|
||||||
|
case "etfs":
|
||||||
|
case "tfse":
|
||||||
|
case "fset":
|
||||||
|
// Default $period_reduced
|
||||||
|
// Default $start_working
|
||||||
|
// Default $datelimit_increased
|
||||||
|
break;
|
||||||
|
case "stef":
|
||||||
|
case "tefs":
|
||||||
|
case "fste":
|
||||||
|
$period_reduced = $period - ($tp["e"] - $tp["t"]);
|
||||||
|
// Default $start_working
|
||||||
|
// Default $datelimit_increased
|
||||||
|
break;
|
||||||
|
case "stfe":
|
||||||
|
case "estf":
|
||||||
|
case "tfes":
|
||||||
|
$period_reduced = $period - ($tp["f"] -$tp["t"]);
|
||||||
|
// Default $start_working
|
||||||
|
// Default $datelimit_increased
|
||||||
|
break;
|
||||||
|
case "tsef":
|
||||||
|
case "seft":
|
||||||
|
case "ftse":
|
||||||
|
case "efts":
|
||||||
|
$period_reduced = -1;
|
||||||
|
$start_working = false;
|
||||||
|
// Default $datelimit_increased
|
||||||
|
break;
|
||||||
|
case "tsfe":
|
||||||
|
case "etsf":
|
||||||
|
case "sfet":
|
||||||
|
$period_reduced = $period - ($tp["f"] - $tp["s"]);
|
||||||
|
$start_working = false;
|
||||||
|
$datelimit_increased = $tp["f"] - $tp["s"];
|
||||||
|
break;
|
||||||
|
case "efst":
|
||||||
|
$period_reduced = $tp["t"] - $tp["s"];
|
||||||
|
// Default $start_working
|
||||||
|
// Default $datelimit_increased
|
||||||
|
break;
|
||||||
|
case "fest":
|
||||||
|
$period_reduced = ($tp["t"] - $tp["s"]) + ($tp["e"] - $tp["f"]);
|
||||||
|
// Default $start_working
|
||||||
|
// Default $datelimit_increased
|
||||||
|
break;
|
||||||
|
case "tesf":
|
||||||
|
$period_reduced = SECONDS_1DAY - ($tp["f"] - $tp["t"]);
|
||||||
|
$start_working = false;
|
||||||
|
$datelimit_increased = $tp["f"] - $tp["s"];
|
||||||
|
break;
|
||||||
|
case "sfte":
|
||||||
|
case "esft":
|
||||||
|
$period_reduced = $tp["t"] - $tp["f"];
|
||||||
|
$start_working = false;
|
||||||
|
$datelimit_increased = $tp["f"] - $tp["s"];
|
||||||
|
break;
|
||||||
|
case "ftes":
|
||||||
|
$period_reduced = $tp["t"] - $tp["f"];
|
||||||
|
$start_working = false;
|
||||||
|
$datelimit_increased = $tp["f"] + SECONDS_1DAY - $tp["s"];
|
||||||
|
break;
|
||||||
|
case "fets":
|
||||||
|
$period_reduced = $tp["e"] - $tp["f"];
|
||||||
|
$start_working = false;
|
||||||
|
$datelimit_increased = $tp["f"] + SECONDS_1DAY - $tp["s"];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Default $period_reduced
|
||||||
|
// Default $start_working
|
||||||
|
// Default $datelimit_increased
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return array ($period_reduced, $start_working, $datelimit_increased);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get working time SLA in timestamp form. Get all items and discard previous not necessaries
|
||||||
|
*
|
||||||
|
* @param int Period to check the SLA compliance.
|
||||||
|
* @param int Date_end date end the sla compliace interval
|
||||||
|
* @param int Working Time start
|
||||||
|
* @param int Working Time end
|
||||||
|
*
|
||||||
|
* @return array work time points
|
||||||
|
* found
|
||||||
|
*/
|
||||||
|
function reporting_get_agentmodule_sla_working_timestamp ($period, $date_end, $wt_start = "00:00:00", $wt_end = "23:59:59") {
|
||||||
|
|
||||||
|
$date_previous_day = $date_end - SECONDS_1DAY;
|
||||||
|
$wt = array ();
|
||||||
|
|
||||||
|
// Calculate posibles data points
|
||||||
|
$relative_date_end = strtotime (date ('H:i:s', $date_end));
|
||||||
|
$relative_00_00_00 = strtotime ("00:00:00");
|
||||||
|
$relative_wt_start = strtotime($wt_start) - $relative_00_00_00;
|
||||||
|
$relative_wt_end = strtotime($wt_end) - $relative_00_00_00;
|
||||||
|
|
||||||
|
$absolute_previous_00_00_00 = $date_previous_day - ($relative_date_end - $relative_00_00_00);
|
||||||
|
$absolute_00_00_00 = $date_end - ($relative_date_end - $relative_00_00_00);
|
||||||
|
array_push ($wt, $absolute_previous_00_00_00);
|
||||||
|
if ($relative_wt_start < $relative_wt_end) {
|
||||||
|
array_push ($wt, $absolute_previous_00_00_00 + $relative_wt_start);
|
||||||
|
array_push ($wt, $absolute_previous_00_00_00 + $relative_wt_end);
|
||||||
|
array_push ($wt, $absolute_00_00_00 + $relative_wt_start);
|
||||||
|
array_push ($wt, $absolute_00_00_00 + $relative_wt_end);
|
||||||
|
} else {
|
||||||
|
array_push ($wt, $absolute_previous_00_00_00 + $relative_wt_end);
|
||||||
|
array_push ($wt, $absolute_previous_00_00_00 + $relative_wt_start);
|
||||||
|
array_push ($wt, $absolute_00_00_00 + $relative_wt_end);
|
||||||
|
array_push ($wt, $absolute_00_00_00 + $relative_wt_start);
|
||||||
|
}
|
||||||
|
array_push ($wt, $absolute_00_00_00 + SECONDS_1DAY);
|
||||||
|
|
||||||
|
//Discard outside period time points
|
||||||
|
$date_start = $date_end - $period;
|
||||||
|
|
||||||
|
$first_time = array_shift ($wt);
|
||||||
|
while ($first_time < $date_start) {
|
||||||
|
if (empty ($wt)) {
|
||||||
|
return $wt;
|
||||||
|
}
|
||||||
|
$first_time = array_shift ($wt);
|
||||||
|
}
|
||||||
|
array_unshift ($wt, $first_time);
|
||||||
|
|
||||||
|
return $wt;
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
Loading…
x
Reference in New Issue
Block a user