00001 <?php 00002 // sla.inc.php - functions relating to SLA / Service Levels 00003 // 00004 // SiT (Support Incident Tracker) - Support call tracking system 00005 // Copyright (C) 2010-2011 The Support Incident Tracker Project 00006 // Copyright (C) 2000-2009 Salford Software Ltd. and Contributors 00007 // 00008 // This software may be used and distributed according to the terms 00009 // of the GNU General Public License, incorporated herein by reference. 00010 00011 // Prevent script from being run directly (ie. it must always be included 00012 if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) 00013 { 00014 exit; 00015 } 00016 00017 00023 function incident_sla_history($incidentid) 00024 { 00025 global $CONFIG, $dbIncidents, $dbServiceLevels, $dbUpdates; 00026 $working_day_mins = ($CONFIG['end_working_day'] - $CONFIG['start_working_day']) / 60; 00027 00028 // Not the most efficient but.. 00029 $sql = "SELECT * FROM `{$dbIncidents}` WHERE id='{$incidentid}'"; 00030 $result = mysql_query($sql); 00031 if (mysql_error()) trigger_error("MySQL Query Error ".mysql_error(), E_USER_WARNING); 00032 $incident = mysql_fetch_object($result); 00033 00034 // Get service levels 00035 $sql = "SELECT * FROM `{$dbServiceLevels}` WHERE tag='{$incident->servicelevel}' AND priority='{$incident->priority}' "; 00036 $result = mysql_query($sql); 00037 if (mysql_error()) trigger_error("MySQL Query Error ".mysql_error(), E_USER_WARNING); 00038 $level = mysql_fetch_object($result); 00039 00040 // Loop through the updates in ascending order looking for service level events 00041 $sql = "SELECT * FROM `{$dbUpdates}` WHERE type='slamet' AND incidentid='{$incidentid}' ORDER BY id ASC, timestamp ASC"; 00042 $result = mysql_query($sql); 00043 if (mysql_error()) trigger_error("MySQL Query Error ".mysql_error(), E_USER_WARNING); 00044 $prevtime = 0; 00045 $idx = 0; 00046 while ($history = mysql_fetch_object($result)) 00047 { 00048 $slahistory[$idx]['targetsla'] = $history->sla; 00049 switch ($history->sla) 00050 { 00051 case 'initialresponse': 00052 $slahistory[$idx]['targettime'] = $level->initial_response_mins; 00053 break; 00054 case 'probdef': 00055 $slahistory[$idx]['targettime'] = $level->prob_determ_mins; 00056 break; 00057 case 'actionplan': 00058 $slahistory[$idx]['targettime'] = $level->action_plan_mins; 00059 break; 00060 case 'solution': 00061 $slahistory[$idx]['targettime'] = ($level->resolution_days * $working_day_mins); 00062 break; 00063 default: 00064 $slahistory[$idx]['targettime'] = 0; 00065 } 00066 if ($prevtime > 0) 00067 { 00068 $slahistory[$idx]['actualtime'] = calculate_incident_working_time($incidentid, $prevtime, $history->timestamp); 00069 } 00070 else 00071 { 00072 $slahistory[$idx]['actualtime'] = 0; 00073 } 00074 00075 $slahistory[$idx]['timestamp'] = $history->timestamp; 00076 $slahistory[$idx]['userid'] = $history->userid; 00077 if ($slahistory[$idx]['actualtime'] <= $slahistory[$idx]['targettime']) 00078 { 00079 $slahistory[$idx]['targetmet'] = TRUE; 00080 } 00081 else 00082 { 00083 $slahistory[$idx]['targetmet'] = FALSE; 00084 } 00085 00086 $prevtime = $history->timestamp; 00087 $idx++; 00088 } 00089 // Get next target, but only if incident is still open 00090 if ($incident->status != 2 AND $incident->status != 7) 00091 { 00092 $target = incident_get_next_target($incidentid); 00093 $slahistory[$idx]['targetsla'] = $target->type; 00094 switch ($target->type) 00095 { 00096 case 'initialresponse': 00097 $slahistory[$idx]['targettime'] = $level->initial_response_mins; 00098 break; 00099 case 'probdef': 00100 $slahistory[$idx]['targettime'] = $level->prob_determ_mins; 00101 break; 00102 case 'actionplan': 00103 $slahistory[$idx]['targettime'] = $level->action_plan_mins; 00104 break; 00105 case 'solution': 00106 $slahistory[$idx]['targettime'] = ($level->resolution_days * $working_day_mins); 00107 break; 00108 default: 00109 $slahistory[$idx]['targettime'] = 0; 00110 } 00111 $slahistory[$idx]['actualtime'] = $target->since; 00112 if ($slahistory[$idx]['actualtime'] <= $slahistory[$idx]['targettime']) 00113 { 00114 $slahistory[$idx]['targetmet'] = TRUE; 00115 } 00116 else 00117 { 00118 $slahistory[$idx]['targetmet'] = FALSE; 00119 } 00120 00121 $slahistory[$idx]['timestamp'] = 0; 00122 } 00123 return $slahistory; 00124 } 00125 00126 00134 function servicelevel_drop_down($name, $id, $collapse = FALSE, $select = '') 00135 { 00136 global $dbServiceLevels; 00137 00138 if ($collapse) 00139 { 00140 $sql = "SELECT DISTINCT id, tag FROM `{$dbServiceLevels}`"; 00141 } 00142 else 00143 { 00144 $sql = "SELECT id, priority FROM `{$dbServiceLevels}`"; 00145 } 00146 $result = mysql_query($sql); 00147 00148 $html = "<select id='{$name}' name='{$name}' {$select}>\n"; 00149 // INL 30Mar06 Removed this ability to select a null service level 00150 // if ($id == 0) $html .= "<option selected='selected' value='0'></option>\n"; 00151 while ($servicelevels = mysql_fetch_object($result)) 00152 { 00153 $html .= "<option "; 00154 $html .= "value='{$servicelevels->id}' "; 00155 if ($servicelevels->id == $id) 00156 { 00157 $html .= "selected='selected'"; 00158 } 00159 00160 $html .= ">"; 00161 if ($collapse) 00162 { 00163 $html .= $servicelevels->tag; 00164 } 00165 else 00166 { 00167 $html .= "{$servicelevels->tag} ".priority_name($servicelevels->priority); 00168 } 00169 00170 $html .= "</option>\n"; 00171 } 00172 $html .= "</select>"; 00173 return $html; 00174 } 00175 00176 00177 function serviceleveltag_drop_down($name, $tag, $collapse = FALSE) 00178 { 00179 global $dbServiceLevels; 00180 00181 if ($collapse) 00182 { 00183 $sql = "SELECT DISTINCT tag FROM `{$dbServiceLevels}`"; 00184 } 00185 else 00186 { 00187 $sql = "SELECT tag, priority FROM `{$dbServiceLevels}`"; 00188 } 00189 $result = mysql_query($sql); 00190 00191 00192 $html = "<select name='$name'>\n"; 00193 if ($tag == '') 00194 { 00195 $html .= "<option selected='selected' value=''></option>\n"; 00196 } 00197 00198 while ($servicelevels = mysql_fetch_object($result)) 00199 { 00200 $html .= "<option "; 00201 $html .= "value='{$servicelevels->tag}' "; 00202 if ($servicelevels->tag == $tag) 00203 { 00204 $html .= "selected='selected'"; 00205 } 00206 00207 $html .= ">"; 00208 if ($collapse) 00209 { 00210 $html .= $servicelevels->tag; 00211 } 00212 else 00213 { 00214 $html .= "{$servicelevels->tag} ".priority_name($servicelevels->priority); 00215 } 00216 00217 $html .= "</option>\n"; 00218 } 00219 $html .= "</select>"; 00220 return $html; 00221 } 00222 00223 00224 /* Returns a string representing the name of */ 00225 /* the given servicelevel. Returns an empty string if the */ 00226 /* priority does not exist. */ 00227 function servicelevel_name($id) 00228 { 00229 global $CONFIG; 00230 00231 $servicelevel = db_read_column('tag', $GLOBALS['dbServiceLevels'], $id); 00232 00233 if ($servicelevel == '') 00234 { 00235 $servicelevel = $CONFIG['default_service_level']; 00236 } 00237 return $servicelevel; 00238 } 00239 00240 00247 function servicelevel_timed($sltag) 00248 { 00249 global $dbServiceLevels; 00250 $timed = FALSE; 00251 00252 $sql = "SELECT COUNT(tag) FROM `{$dbServiceLevels}` WHERE tag = '{$sltag}' AND timed = 'yes'"; 00253 $result = mysql_query($sql); 00254 if (mysql_error()) trigger_error(mysql_error(),E_USER_WARNING); 00255 00256 list($count) = mysql_fetch_row($result); 00257 if ($count > 0) $timed = TRUE; 00258 00259 return $timed; 00260 } 00261 00262 00269 function servicelevel_maxpriority($slatag) 00270 { 00271 global $dbServiceLevels; 00272 $priority = 0; 00273 00274 $sql = "SELECT MAX(priority) FROM `{$dbServiceLevels}` WHERE tag = '{$slatag}'"; 00275 $result = mysql_query($sql); 00276 if (mysql_error()) trigger_error(mysql_error(),E_USER_WARNING); 00277 list($priority) = mysql_fetch_row($result); 00278 return $priority; 00279 } 00280 00281 00288 function servicelevel_id2tag($id) 00289 { 00290 global $dbServiceLevels; 00291 return db_read_column('tag', $dbServiceLevels, $id); 00292 } 00293 00294 00301 function servicelevel_tag2id($sltag) 00302 { 00303 $sql = "SELECT id FROM `{$GLOBALS['dbServiceLevels']}` WHERE tag = '{$sltag}' AND priority=1"; 00304 $result = mysql_query($sql); 00305 if (mysql_error()) trigger_error(mysql_error(),E_USER_WARNING); 00306 list($id) = mysql_fetch_row($result); 00307 00308 return $id; 00309 } 00310 00311 ?>
For more help developing with SiT! see http://sitracker.org/wiki/DevelopmentHowTo