XCEND Customizing Altiris Helpdesk for Global Time Zone and SLA Management to Fulfill ITIL Requirements
ITIL is the only consistent and comprehensive documentation of best practice for IT Service Management. Used by many hundreds of organizations around the world, a whole ITIL philosophy has grown up around the guidance contained within the ITIL books and the supporting professional qualification scheme.
Global Time Zone Implementation
Preparing the Help Desk Web Site
Installation and Implementation notes
Configuring the Working Periods
- Working Hours
- Holiday Schedule
- Associating working hours and holidays to users, departments and SLAs and how these are used
Setting up an SLA for use within the Service Desk
- Setting Target Response and Resolution Times
- Defining Hold and Close Statuses
- Defining the scope for the SLA
- Using SLAs within the Service Desk
Incident Rules, Reports and Monitoring Policies
The user defined SQL functions
Introduction
ITIL consists of a series of books giving guidance on the provision of quality IT services, and on the accommodation and environmental facilities needed to support IT. ITIL has been developed in recognition of organizations' growing dependency on IT and embodies best practices for IT Service Management.
The ethos behind the development of ITIL is the recognition that organizations are becoming increasingly dependent on IT in order to satisfy their corporate aims and meet their business needs. This leads to an increased requirement for high quality IT services.
ITIL provides a systematic and professional approach to the management of IT service provision. Adopting its guidance offers users a huge range of benefits that include:
- Reduced costs
- Improved IT services through the use of proven best practice processes
- Improved customer satisfaction through a more professional approach to service delivery
- Standards and guidance
- Improved productivity
- Improved use of skills and experience
- Improved delivery of third party services through the specification of ITIL or ISO 20000 as the standard for service delivery in services procurements.
In order to meet these needs Service Level Management has been a focus for many of XCEND's customers both Fortune 1000 and below. SLA Management is based on best practices for ensuring that agreements between IT and IT customers are specified and fulfilled. These practices ensure that IT services are maintained and improved through a cycle of agreeing, monitoring, reporting, and reviewing IT services.
The other challenge with Altiris is that Time Zones are not reflected from a user perspective when in the Altiris Help Desk edit or view screens when looking at ticketing information. Date stamps are reflected from the time zone where the Notification Server resides not where the user or worker is. XCEND and Incit Technologies addresses this issue in this white paper. This has been conducted for several customers and was highlighted in a Symantec CIO Digest article entitled "The Buddy System". The Case Study can be read here: http://www.symantec.com/ciodigest/articles/200704/the_buddy_system.html
Global Time Zone Implementation
The Time Tool is a Dynamic Link Library (DLL) developed with the .NET 1.1 framework to be compatible with Altiris Help Desk Solution version 6.0. The Time Tool was developed to address a limitation of Altiris Help Desk. Workers and users in locations beyond the time zone of the Altiris Help Desk server would be presented with times according to the server's settings instead of local time. The Time Tool is an exposed DLL that can be used with a web site to modify date/time information before it is presented to the user and again when the data is saved back to the server.
Preparing the Help Desk Web Site
When customizing Altiris Help Desk, it is highly recommended that the original files stay unmodified. This prevents problems when upgrading or patching Help Desk files. Two new files will need to be added (or modified) to the root directory of the Help Desk web (This can typically be found under: "\Program Files\Altiris\Helpdesk\AeXHD").
CUSTOM.CONFIG
Override locations for standard console pages to the new customized files. More details for customizing Help Desk pages can be found in the Altiris documentation for Help Desk.
<?xml version="1.0" encoding="utf-8" ?> <custom.configuration> <files path="~/custom/templates/"> <file id="WorkItemDelete" file="WorkItemDelete.ascx"/> <file id="WorkItemEdit" file="WorkItemEdit.ascx"/> <file id="WorkitemEditMultiple" file="WorkitemEditMultiple.ascx"/> <file id="WorkItemView" file="WorkItemView.ascx"/> <file id="WorkerReport" file="WorkerReport.ascx"/> <file id="subBulletinBoard" file="subBulletinBoard.ascx"/> </files> </custom.configuration>
GLOBAL.ASAX
Override the Session_Start method to instantiate session variables.
<%@ Application Codebehind="Global.asax.vb" Inherits="Altiris.Helpdesk.Web.Global" %>
<script language="VB" runat="server">
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
Session.Add("tzOffset", -1)
Session.Add("OffsetFound", False)
End Sub
</script>
TimeTools.dll
Copy the TimeTools.dll file to the \bin directory under the Help Desk web's root folder.
Custom Directory Structure
Create a new folder structure under Help Desk web's root. If variations are made to the recommended structure below, be sure to make the proper changes to CUSTOM.CONFIG.
\custom \custom\templates
SetTZ.ASPX
Create an answer file for Help Desk. This will allow the client's time zone to offset data before presentation to the user. Place the file under the root of the \custom directory and name it SetTZ.aspx
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Set User Time Zone</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%
Dim offset = Request.QueryString("tzo")
If offset <> "" Then
Session("tzOffset") = offset
Session("OffsetFound") = True
End If %>
<p>Session Offset: <%=Session("tzOffset")%></p>
<p>Client Offset: <%=TimeTools.TimeZone.ServerToClientTime(Now(), Session("tzOffset"))%></p>
</div>
</form>
</body>
</html>
Template Modifications
After placing copies of the files listed in the sections below (from the \templates folder) into the \custom\templates folder and the read-only flag is removed from the file attributes, modifications can be made. Note that some of the code is wrapped by virtue of the format of this document and may be difficult to read until copied to a text editor.
WorkerReport.ascx
Place this code before the DataBind() statement near line 68
' ---------------------------------- time zone shift start ------------------------------------
Dim i as integer = 0
Dim ModifyDate as DateTime
While i <= DataStore("WorkItems").Tables(0).Rows.count - 1
ModifyDate = DataStore("WorkItems").Tables(0).Rows(i).item("workitem_modified_on") DataStore("WorkItems").Tables(0).Rows(i).item("workitem_modified_on") = _
TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset"))
i += 1
End While
' ---------------------------------- time zone shift end --------------------------------------
DataBind()
WorkItemView.ascx
Place this code before the DataStore("Contact") statement near line 48
w = new WorkItemDataSet(id) DataStore("WorkItem") = w ' ---------------------------------- time zone shift start ------------------------------------ Dim i as integer = 0 Dim ModifyDate as DateTime Dim StartDate as DateTime Dim DueDate as DateTime Dim CreateDate as DateTime While i <= DataStore("WorkItem").Tables(0).Rows.count - 1 ModifyDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_modified_on") StartDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_start_on") DueDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_due_on") CreateDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_created_on"0 DataStore("WorkItem").Tables(0).Rows(i).item("workitem_modified_on") TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset") DataStore("WorkItem").Tables(0).Rows(i).item("workitem_start_on") = _ TimeTools.TimeZone.ServerToClientTime(StartDate,Session("tzOffset")) DataStore("WorkItem").Tables(0).Rows(i).item("workitem_due_on") = _ TimeTools.TimeZone.ServerToClientTime(DueDate,Session("tzOffset")) DataStore("WorkItem").Tables(0).Rows(i).item("workitem_created_on") = _ TimeTools.TimeZone.ServerToClientTime(CreateDate,Session("tzOffset")) i += 1 End While ' ---------------------------------- time zone shift end -------------------------------------- DataStore("Contact") = New ContactDataSet(w.Current("workitem_contact_id")) DataStore("Asset") = New AssetDataSet(w.Current("workitem_managed_object_id")) DataStore("Rules") = w.NotifyRules DataStore("LastQuery") = WorkItemDataSet.LastResultsList
Almost at the end of the file around line 400, place this XML code. Beware of word wrapping. If it's not indented, it was probably word wrapped in this document.
<aw:repeater id="rptHistory" runat="server" ColSpan="4" Label="sidLblHistory" DataSourceName="History" LabelPosition="top"> <ItemTemplate> <aw:Layout ID="loHistoryTemplate" Runat="server" Width="100%" RowSpacing="0"> <aw:ControlBar ID="cbHistoryHeader" Runat="server" CssClass="clsHistoryHeader" Expand="lblHistoryHeader" Width="100%"> <!-- ---------------------------------- time zone shift start --------------------- --> <aw:Label RunAt="server" Text='<%# ResourceManager.ResolveString("sidHistoryHeaderModifiedDate", False, False, Container.DataItem("workitem_version"), TimeTools.TimeZone.ServerToClientTime(Container.DataItem("workitem_modified_on"),Session("tzOffset")).ToString()) %>' CssClass="clsHistoryHeader" Wrap="False" /> <!-- ---------------------------------- time zone shift end ----------------------- --> <aw:Label ID="lblHistoryHeader" RunAt="server" ReplaceCodes="true" Text='<%# Container.DataItem("header_text") %>' CssClass="clsHistoryHeader" /> <aw:HyperLink ID="imgEditComment" RunAt="server" Command="editItemComment" ImageUrl="icnEdit" ToolTip="sidTipEditComment" Wrap="False" > <aw:Param Name="version" Value='<%# Container.DataItem("workitem_version") %>' /> <aw:Param Name="id" Value='<%# Container.DataItem("workitem_number") %>' /> </aw:HyperLink> </aw:ControlBar>
WorkitemEdit.ascx
Place this code below the DataStore("WorkItem") statement around line 274
DataStore("WorkItem") = w '
---------------------------------- time zone shift start ------------------------------------
Dim i as integer = 0
Dim ModifyDate as DateTime
Dim StartDate as DateTime
Dim DueDate as DateTime
Dim CreateDate as DateTime
While i <= DataStore("WorkItem").Tables(0).Rows.count - 1
ModifyDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_modified_on")
StartDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_start_on")
DueDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_due_on") CreateDate = DataStore("WorkItem").Tables(0).Rows(i).item("workitem_created_on")
DataStore("WorkItem").Tables(0).Rows(i).item("workitem_modified_on") =
TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset"))
DataStore("WorkItem").Tables(0).Rows(i).item("workitem_start_on") =
TimeTools.TimeZone.ServerToClientTime(StartDate,Session("tzOffset"))
DataStore("WorkItem").Tables(0).Rows(i).item("workitem_due_on") =
TimeTools.TimeZone.ServerToClientTime(DueDate,Session("tzOffset"))
DataStore("WorkItem").Tables(0).Rows(i).item("workitem_created_on") =
TimeTools.TimeZone.ServerToClientTime(CreateDate,Session("tzOffset")) i += 1
End While
' ---------------------------------- time zone shift end --------------------------------------
Place this code in the Public Overrides Sub Commit section around line 482
Public Overrides Sub Commit(ByVal ControlID As String, ByVal CurrentPageID As String) ' We always need to reversedatabind tbTimeSpent because it is being updated by client ' script. Additionally, this control lives outside of our pageviews so reversedatabinding ' the page is not sufficient. tbTimeSpent.ReverseDataBind() Select Case ControlID Case "ibSave", "ibSaveAndNew" ' ---------------------------------- time zone shift start----------------------------- Dim r as integer = 0 Dim ModifyDate as DateTime Dim StartDate as DateTime Dim DueDate as DateTime Dim CreateDate as DateTime While r <= DataStore("WorkItem").Tables(0).Rows.count - 1 ModifyDate = DataStore("WorkItem").Tables(0).Rows(r).item("workitem_modified_on") StartDate = DataStore("WorkItem").Tables(0).Rows(r).item("workitem_start_on") DueDate = DataStore("WorkItem").Tables(0).Rows(r).item("workitem_due_on") CreateDate = DataStore("WorkItem").Tables(0).Rows(r).item("workitem_created_on" DataStore("WorkItem").Tables(0).Rows(r).item("workitem_modified_on") = TimeTools.TimeZone.ClientToServerTime(ModifyDate,Session("tzOffset")) DataStore("WorkItem").Tables(0).Rows(r).item("workitem_start_on") = TimeTools.TimeZone.ClientToServerTime(StartDate,Session("tzOffset")) DataStore("WorkItem").Tables(0).Rows(r).item("workitem_due_on") = TimeTools.TimeZone.ClientToServerTime(DueDate,Session("tzOffset")) DataStore("WorkItem").Tables(0).Rows(r).item("workitem_created_on") = TimeTools.TimeZone.ClientToServerTime(CreateDate,Session("tzOffset")) r += 1 End While ' ---------------------------------- time zone shift end ------------------------------- dim w as WorkItemDataSet = DataStore("WorkItem")
WorkItemEditMultiple.ascx
Place this code before the l = DataStore("PendingItems") statement near line 80
' ---------------------------------- time zone shift start ------------------------------------
Dim i as integer = 0
Dim ModifyDate as DateTime
While i <= DataStore("WorkItems").Tables(0).Rows.count - 1
ModifyDate = DataStore("WorkItems").Tables(0).Rows(i).item("workitem_modified_on")
DataStore("WorkItems").Tables(0).Rows(i).item("workitem_modified_on") =
TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset")) i += 1
End While
' ---------------------------------- time zone shift end --------------------------------------
l= DataStore("PendingItems")
If Not l Is Nothing Then
Place this code before the cgEditList.DataBind() statement near line 190 in the "btnAdd" case of Sub Continue()
Dim idString As String = BuildListIncidentIds.ToString() DataStore("EditList") = new ListDataSet(String.Format("workitem_number IN ({0})", BuildListIncidentIds.ToString.TrimEnd(",")), , "WorkItem") DataStore("EditList").Tables(0).PrimaryKey = New DataColumn () {DataStore("EditList").Tables(0 ).Columns("workitem_number")} ' ---------------------------------- time zone shift start ------------------------------------ Dim i as integer = 0 Dim ModifyDate as DateTime While i <= DataStore("EditList").Tables(0).Rows.count - 1 ModifyDate = DataStore("EditList").Tables(0).Rows(i).item("workitem_modified_on") DataStore("EditList").Tables(0).Rows(i).item("workitem_modified_on") = TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset")) i += 1 End While ' ---------------------------------- time zone shift end -------------------------------------- cgEditList.DataBind() cgFindIncidents.SelectItems("")
WorkItemDelete.ascx
Place this code before the last ctl = wg.Pager statement in Sub FinalizeTemplate() near line 62
l = DataStore("WorkItems") wg = stDeleteWorkItems.GetControl("wgWorkItems") AddHandler wg.DetailViewRow, AddressOf OnDetailViewRow ' ---------------------------------- time zone shift start ------------------------------------ Dim i as integer = 0 Dim ModifyDate as DateTime While i <= DataStore("WorkItems").Tables(0).Rows.count - 1 ModifyDate = DataStore("WorkItems").Tables(0).Rows(i).item("workitem_modified_on") DataStore("WorkItems").Tables(0).Rows(i).item("workitem_modified_on") = TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset")) i += 1 End While ' ---------------------------------- time zone shift end -------------------------------------- ctl = wg.Pager if not ctl is nothing then if l.MaxRowsExceeded then ctl.Message = TryString("sidMaxRowsExceeded", CStr(l.MaxRowsToReturn())) else ctl.Message = "" end if end if
Place this code before the cgEditList.DataBind() statement near line 162 in the "btnAdd" case of Sub Continue()
Dim idString As String = BuildListIncidentIds.ToString() DataStore("DeleteList") = new ListDataSet(String.Format("workitem_number IN ({0})", BuildListIncidentIds.ToString.TrimEnd(",")), , "WorkItem") DataStore("DeleteList").Tables(0).PrimaryKey = New DataColumn () {DataStore("DeleteList").Tables(0 ).Columns("workitem_number")} ' ---------------------------------- time zone shift start ------------------------------------ Dim i as integer = 0 Dim ModifyDate as DateTime While i <= DataStore("EditList").Tables(0).Rows.count - 1 ModifyDate = DataStore("EditList").Tables(0).Rows(i).item("workitem_modified_on") DataStore("EditList").Tables(0).Rows(i).item("workitem_modified_on") = TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset")) i += 1 End While ' ---------------------------------- time zone shift end -------------------------------------- cgEditList.DataBind() cgFindIncidents.SelectItems("")
subBulletinBoard.ascx
Place this code as shown in the file
Protected Overrides Sub CreateChildControls() DataStore("AllowNotifyMe") = "true" If Not Attributes("AllowNotifyMe") Is Nothing AndAlso Attributes("AllowNotifyMe").ToLower = "false" Then DataStore("AllowNotifyMe") = "false" End If Dim i as integer = 0 Dim bulletinID as integer ' ---------------------------------- time zone shift start ------------------------------------ Dim ModifyDate as DateTime Dim CreateDate as DateTime ' ---------------------------------- time zone shift end -------------------------------------- While i <= DataStore("Bulletins").Tables(0).Rows.count - 1 Dim s = new SubTemplate("subEnhancedBulletin", me) bulletinID = DataStore("Bulletins").Tables(0).Rows(i).item("bulletin_id") ' ---------------------------------- time zone shift start ------------------------------------ ModifyDate = DataStore("Bulletins").Tables(0).Rows(i).item("bulletin_modified_on") CreateDate = DataStore("Bulletins").Tables(0).Rows(i).item("bulletin_created_on") DataStore("Bulletins").Tables(0).Rows(i).item("bulletin_modified_on") = TimeTools.TimeZone.ServerToClientTime(ModifyDate,Session("tzOffset")) DataStore("Bulletins").Tables(0).Rows(i).item("bulletin_created_on") = TimeTools.TimeZone.ServerToClientTime(CreateDate,Session("tzOffset")) ' ---------------------------------- time zone shift end -------------------------------------- DataStore("Bulletins").Tables(0).DefaultView.RowFilter = "bulletin_id='" & bulletinID & "'" me.controls.add(s) s.DataBind While bulletinID = DataStore("Bulletins").Tables(0).Rows(i).item("bulletin_id") i += 1 if i > DataStore("Bulletins").Tables(0).Rows.count - 1 then Exit While End While End While End Sub
Time Tools Properties and Methods
Exposed Properties
- jClientScript
- String - Read Only
- JavaScript generated by the DLL to access the client time zone settings
- isServerSet
- Boolean - Read Only
- Flag to represent knowledge of the server's time settings
- isClientSet
- Boolean - Read Only
- Flag to represent knowledge of the client's time settings
- ServerOffset
- TimeSpan - Read/Write
- Value representing the server's offset from GMT
- ClientOffset
- TimeSpan - Read/Write
- Value representing the client's offset from GMT
Exposed Methods
- SubmitServerTime (DateTime)
- Method of informing the object of the server's time settings
- SubmitClientTime(DateTime)
- Method of informing the object of the client's time settings
- SubmitClientOffset(TimeSpan | int)
- Method of informing the object of the client's time settings
- ClientToServerTime(DateTime, int)
- Returns DateTime
- Changes client time into server time
- ServerToClientTime(DateTime, int)
- Returns DateTime
- Changes server time into client time
SLA Management Implementation
The Advanced SLA module integrates and extends the SLA Contract management available within Altiris Asset Management/CMDB solution, with the Helpdesk/Service Desk, to provide SLA monitoring and reporting of work items created in the Helpdesk/Service Desk, using the contracts created in the Asset Management/CMDB solution.
Introduction
Most organizations wish to monitor the work activity they record and undertake via a Help/Service Desk against targets set by service level agreements. Generally this involves monitoring and reporting on all work items against 'internal' service level agreements - that is internally agreed target times to respond and resolve based on certain criteria - and monitoring and measuring third party supplier performance against the service levels agreed with them in service/support contracts, when work items have been assigned to a relevant third party for action.
While the Altiris Asset Management/CMDB solution has the ability to record and 'manage' SLA's and the Helpdesk/Service Desk can track and help manage work items, there is no integration between these two in which information from the SLA can be applied to specific work items, and then monitored, acted and reported on. The Advanced SLA module provides this capability.
With this module, work items in the Helpdesk/Service Desk become associated with SLAs in the Asset Management/CMDB module and based on rules and settings target response and resolution times are set, which can then be monitored and reported on, all using Notification Server's and Helpdesk/Service Desk's standard capabilities.
An important aspect of SLAs is that they nearly always include definitions of the times during which they are applicable - the working period, or hours of business. Thus all monitoring and measurement needs to be for these hours of business and not at other times i.e. night periods, weekends, public holidays and so-on all need excluding from the performance and monitoring calculations. The Advanced SLA module provides the ability to create and define as many different working periods and holiday schedules as required and associate these to workers, departments or SLAs. These can then be used to measure performance in business minutes/hours and to trigger events when thresholds are reached.
What is involved?
There are five main elements to the Advanced SLA module:
- Configuring and using Working Periods
- Configuring and using an SLA for use within the Service Desk
- How to use SLAs within the Service Desk
- How to use and modify the reports and notification policies that report and SLA performance and monitor SLAs and trigger events based on this.
- Understanding the functions that calculate times in business minutes/hours and how to use them and the additional views and fields
Installation and Implementation Notes
Supported platforms
The following are the requirements
- The Advanced SLA module uses the SLA contracts that are within the Asset Management/CMDB solution. This will need to be installed before installation even if this only on a 30 day trial license.
- 6.5 Asset/CMDB solution and Helpdesk 6.0 SP4 and SP5 are the supported versions
Installation
- Decompress the zip file (keeping the directory) on the notification server.
- Import XML files into the Altiris console (6.0 or 6.5)
Tab Tree Location Files Source Location Configuration Resource Settings\Data Classes Advanced SLA Data Classes v2.1.xml \Data Classes Configuration Resource Settings\Resource Types\Other Resources Working Hours v2.1.xml
Holiday Schedule v2.1.xml\Resource Types Configuration Resource Settings\Resource Types\Contract Types Service Level Agreement v2.1.xml \Resource Types Configuration Resource Settings\Resource Associations Advanced SLA Res Assoc v2.1.xml \Resource Associations Resources Resources Default Working Hours v2.1.xml
Default Holiday Schedule v2.1.xml
Default Service Level Agreement v2.1.xml\Base Data Reports Management\Incidents\Helpdesk\Service Level v1 SLA Reports.xml
v2 SLA Reports.xml\Reports Tasks Incident Resolution\Incidents\Helpdesk\Notification Policies SLA v1.xml
SLA v2.xml\Notification Policies - Execute the SLA_Setup_v2.2.sql script against the SQL Server database hosting the Notification Server and Service Desk information.
- Installs all the database objects required to support the advanced SLA.
- Note that the script is configured for an NS database of Altiris and a Service Desk database of Altiris_Incidents. If other names are being used then the script will need editing to replace the reference to both databases.
- Copy the two workitem web pages from either the SP4 or SP5 directory into the templates (or custom) directory where the helpdesk application and web files were installed (e.g. \Program Files\Altiris\Helpdesk\AexHD\Templates).
- It is recommended you back up the existing versions of these two files prior to copying them or override the location to a custom directory.
- In Helpdesk use the import admin data to import the HD_Rules_2.1.xml file
Configuring the Working Periods
There are two elements to the Working Period. The Working Hours, which is the normal hours of business associated with an SLA, individual, or department that will be used to calculate performance in business hours/minutes and the Holiday Schedule that gives the amended hours on specified days i.e. holidays that overrides and amends these calculations accordingly.
The Advanced SLA module provides this capability through a Working Hours resource type and a Holiday Schedule resource type. Individual working hours and holiday schedules are then associated with individuals, departments or SLAs depending on circumstances.
During installation a default Working Hours and a default Holiday Schedule are installed, which can be edited but not deleted. These are used when an association is missing that is required for a calculation, as well as being associated to the default SLA. For many organizations simply editing these defaults to their own working hours and associating them to the SLA will meet their needs.
The Working Hours and Holiday Schedule resource can be found under the 'Other Resources' branch of the resources tree, and are created and edited like any other resource. Multiple working hours and holiday schedules can be defined to account for geographical and departmental differences as well as differences with SLAs.
Working Hours
This looks and works as follows:
The working week must include all 7 days and only 7 days and must be numbered as per the default Working week - 1 being Sunday and 7 being Saturday. This is because the calculations use the day number as opposed to name in their calculations. The time format is 24 hour - so a start at 8:30am and finish at 5:30pm becomes 08:30:00 and 17:30:00. Also there must be a start and end time - a non working day being 00:00:00 to 00:00:00. A twenty four hour working day is of course 00:00:00 to 24:00:00.
As some countries operate a working day with a significant break in, it is also possible to include a break start period and break end period within the day. For periods with no break period this can be set to 00:00:00 and 00:00:00. Due to limitations within the Asset/CMDB solution these entries will be required on any new or edited working hours resource, although if you are upgrading from the previous version your existing working weeks will be upgraded and contain blank break periods, but should still work.
The time zone offset is used to specify the difference between the server's time zone and the time zone of the SLA, user or department that the working period is to be associated with. This enables users who are operating a single service desk across geographies, to accommodate the time zone differences between the servers - the times in the database always being the server's time - and those of the workitem/user, within the performance calculations/monitors. The working hours are entered in the times for the time zone in question i.e. 8:50 to 17:00, and the amount this time zone is ahead or behind the server's time zone entered in the offset field. I.e. US Eastern Time to Sydney Australia would be +15:00, as Sydney is 15 hours ahead of EST. The format if fixed to +/-XX:XX i.e. you must have the plus or minus and all four numbers divided by the colon. It is a mandatory field so even if there is no offset you still need to supply this by entering +00:00.
Additionally many countries operate their own unique and sometime variable daylight savings policies. These will change the time zone offset depending on what is in place at what time. To accommodate this the daylight savings field enables the change in hours/mins to be entered and accommodated in the calculations, when the check box is checked. One checks the box on the date that the savings come into force and uncheck it when the savings stop. It is suggested that a task server event or even a notification policy can be implemented that will automatically set these based on the geographies involved.
Holiday Schedule
This looks and works as follows:
The date is the date each for each holiday day in short date format. The start and end time are mandatory and specify the hours worked on that day. If there is no work then 00:00:00 and 00:00:00 are entered. In essence this allows for a single reduced working period to be defined on that date (some organizations provide a reduced coverage service on holidays). The description is text that helps identify the holiday. An indefinite number of holiday dates can be entered, and it assumed that the time zone/daylight savings offset from the working hours that is used in conjunction with a holiday period will apply.
Associating working hours and holidays to users, departments and SLAs and how these are used
The Advanced SLA module adds the ability to associate a working hour's record and a holiday schedule to user, department or SLA resources in the Asset/CMDB solution for users and departments this is provided on an additional tab in the edit resource page. For an SLA it is part of the Service Desk integration tab on the edit resource page.
As users become workers, the departments the workers department within the Service Desk this provides considerable flexibility in how SLA performance in business hours can be measured and monitored.
Standard practice is that within an SLA the hours for service provision are documented, and therefore normally a working hours record and holiday schedule are set up and associated to the SLA record, which are then used when calculating performance. However in a situation where everyone works to a single corporate set of SLA response and resolution times but different departments or geographies work different hours - for example a service desk for 12 hours but second tier support only 8 hours - the different working hours and holiday schedules could be associated to the department records, and then the performance calculations undertaken using either the assigned to or owned by workers department. In a situation where there is an individual who works non standard hours - say a night shift - then associating a working hour's record and holiday schedule to the individual enables these working periods to be used when undertaking the performance calculations.
Note every resource in the Asset/CMDB database has a unique identifier called a GUID. It is this that is used to reference the relevant working periods in the calculations. To find what the GUID for a particular resource is select the resource and right click and select the properties option.
Setting up an SLA for use within the Service Desk
The Advanced SLA module adds a new tab to the standard SLA available within the Asset/CMDB solution, which enables the SLA to be configured for use within the Service Desk
The SLA will only be made available for selection in the Service Desk if the 'Available to Service Desk' box is checked. This means those SLA contracts that do not contain a support element - say a software maintenance agreement - can be excluded from the SLAs available for selection within the Service Desk.
If the SLA is related to a service provided by a third party, then the Third Party SLA box should be checked. This is used to differentiate between internal and third Party SLAs in rules and reports. The 'Provider Company for SLA' field selection enables the SLA to be associated back to an appropriate provider company record in the resource database.
Setting Target Response and Resolution Times
Many organizations offer different response and resolution times based on the type of service being requested and how important the request is. The SLA Targets section enables these to be entered. Use the 'add' and 'remove' buttons to create them and remove them. The lists of type, impact, priority etc. come directly from the Helpdesk drop down lists, to which is added an 'Any' option - which basically means 'it doesn't matter what is in this field'. It is recommended that all the Service Desk drop downs are configured prior to configuring these.
The SLA response and resolution times are determined by first looking for the best match from the SLA target list, followed by looking at the response and resolution fields in the general tab of the SLA, and if neither of these produces a number a default of 2 hours to respond 8 hours to resolution is applied. In determining the best match from the SLA Target list the software prioritizes the entries in the order Type, Impact, Urgency and finally Priority. Thus not only is the order that these appear in the list not important but if two rules might apply - one based on priority and another say based on urgency, then the one based on urgency would be used in preference to the one based on priority.
All response and resolution times must be entered as numbers in minutes only. Thus a target resolution time of 8 hours is entered as 480 (minutes). It is also recommended that there is an entry in the SLA Targets section that contains any in all columns so that there is a default should none of the other rules apply.
Defining Hold and Close Statuses
As statuses within the Service Desk are user definable and can be used in many different ways it is important that the SLA software knows which code to use to determine that the workitem is closed and completed. This is achieved by selecting the close code in the Close Status Code field.
In the case of Third Party SLAs where often no specific third party closed status is used, it is recommended that the normal incident close status is entered. As configured 'out of the box' the reports and rules assume that when the SLA reverts to an internal SLA from a Third Party SLA the third party assignment is closed.
There are two main methods of measuring SLA performance. One uses a fixed target time to respond and resolve regardless of the status of the workitem. The second says there are certain status where the SLA measurement clock will stop - for example when a workitem is put on hold, or is assigned to a third party - leading to a rolling time target.
The Advanced SLA module supports both methods. If using the rolling target time the specific status' that stop the SLA clock will need to be entered into the 'Status That Stop The SLA Clock' field.
Defining the scope for the SLA
The 'Applies To' field on the Details tab of the SLA enables a collection that defines what resources the SLA applies to be selected. I.e. these are the resources covered by this SLA. The Advanced SLA module makes this information available to the Service Desk, although it doesn't currently use it.
Additionally the Advanced SLA module will only make available those SLAs that are currently between their start and end dates, if these have been entered. If these have not been entered then it assumed the SLA is permanent.
Using SLAs within the Service Desk
The Workitem edit page for workers contains a new drop down field which enables the correct SLA to be selected at any time within the lifecycle of the workitem. By default the Default Service Level Agreement is selected.
When a call is assigned to a third party, simply select the appropriate Third Party SLA, to enable third party response and resolution times to be measured. It is assumed that when an internal SLA is re-selected the third party assignment is completed, and the internal SLA that applied at the point of assignment applies throughout that assignment. I.e. the Internal SLA continues to run alongside the Third Party SLA.
It is strongly recommended that all calls are created with an internal SLA assigned to them, and that calls are not created with a Third Party SLA assignment. This is because the standard monitoring reports and policies measure on non third party SLAs specifically, while the Third Party SLA performance reports look for assignment periods between internal SLA periods.
The Workitem View page provides a link to the SLA resource edit page. The Advanced SLA module adds a number of SLA related fields to the database view that is used in the view and worker report pages. This means they can be used as columns in the worker report. The SLA Response and Resolution Time applicable to each workitem record, SLA name, SLA Guid, start and end periods are all available. While it is technically possible to have an SLA status field, the potential impact on performance in real world environments has meant this has not been included.
Currently the SLA fields are not available in the drop down lists for rule definition and workitem find, etc. To use the available fields the HDQuery or AEXQuery functions must be used.
Incident Rules, Reports and Monitoring Policies
The Advanced SLA module provides several out of the box rules, reports and notification policies that provide a starting framework for SLA implementation. Because this version of the module is designed be backwards compatible with version 1 of the software the version 1 rules, reports and policies are also supplied and updated.
Incident Rules
There are a number of incident rules that are added to demonstrate how one might use the SLA capabilities. These are as follows:
- Set SLA to 2, hours to respond, 8 hours to fix and 1 to respond and 4 to fix when SLA a.s.a.p demonstrate how at the lowest level one can set the start and due dates based on a simple SLA formula using an appropriate working week and holiday schedule. The fixed time monitors would then be applied to monitor these. The 1 hour to respond and 4 to fix changes these values when a different priority is set. In essence these are SLA measures that do not refer back to an SLA in the Asset Management software - they just set start and due times using business hours, which can be monitored using the fixed time SLA notification policies. The when rules contain checks for only doing at the workitem create point and when the incident is not scheduled which would suggest the SLA is being overwritten as it is a planned workitem.
- Set Time to fix/respond using working hours and set when changed. These 4 incident rules set the start and due times in the incident using the values for response and resolution found in the main tab of the SLA page. In other words this uses the information from the SLA to set the start and due times. Again the when rules contain checks for only doing at the workitem create point and when the incident is not scheduled which would suggest the SLA is being overwritten as it is a planned workitem. The change rules update these start and due date when the SLA is changed from one to another.
- Set response/fix times using version 2. These two incident rules use the simplified Set_SLA_Time to set the start and due times, using the SLA times calculated from Priority, urgency, type etc. settings. As these values change or the SLA so the start and due dates will change to reflect any change to the SLA. Is does not change these when Third Party SLA's are selected.
- Assigned to third party when Third Party SLA selected and Warning that assigned to third party but no third party SLA selected. These two incident rules demonstrate how one can monitor when a third party assignment has been made and ensure other fields like the status field are set accordingly. The first will set the status to an assigned to third party status if it not set that way, when a third party SLA is selected. The second puts a warning message in the notes when the assigned to third party status has been selected but an internal SLA still applies. It does this simply because not all third party SLA may be in the database so the assignment may not be possible. However the note acts as a reminder.
Reports
There are two main groups of reports installed within the Notification Server, under the Helpdesk SLA reports branch. The first are a set of reports providing performance metrics based on a Fixed Target Time SLA approach: The other set provide the same for a Rolling Target Time approach (i.e. with hold periods stopping the clock).
There are three report types:
- Current workitems where SLA has been exceeded (response and resolution). This would typically be sent to a manager when an SLA breach had occurred.
- Current workitems SLA Status (response and resolution). This is typical of the type of SLA report that might be used in a dashboard display.
- SLA Status for workitems logged in a period (response and resolution). This is typical of the type of report required by managers to understand SLA performance over a time period. I.e. in the last week, month etc, how well did we meet our SLA targets.
As Fixed Target Time SLA monitoring does not take into account Hold periods, these reports simply have an OK, Not OK status, while the Rolling Target Time reports include an 'On Hold' status.
The first two type of report contain a look ahead parameter, and therefore report not only on which workitems have exceeded their SLA targets, but potentially which workitems are in danger of exceeding their target. This look ahead value is a percentage of the current SLA target time, and is by default set to 0.9 i.e. 90%. This means that for an 8 hour resolution target the SLA will be in the warning zone from 7 hours 35 mins. This can be changed to meet specific requirements. All reports support full drill down, right down to individual workitem level.
These reports have not been protected and can be modified without needing to clone them, although it is recommended that in practice they are cloned before editing. The logic within each report is quite complex, as they need to accommodate a wide range of scenarios that can arise as a result of having the flexibility to modify SLAs at any point within the lifetime of a workitem.
Firstly the workitems latest status, comment, title etc. are used. Secondly the most recent record with an internal SLA applied is used for determining what the response and resolution time targets and working periods should be. This ensures that internal SLA measurement continues correctly for calls that have been assigned to a third party. Finally the first non internally generated record after the initial create record is used to determine the time the response was made. (I.e. the first entry made by a worker, as opposed to something like a notification policy or incident rule).
For the reports that use the Fixed Target Time approach the response and resolution times required are calculated from the start and due dates that are found within the relevant workitem record. (Note if the workitem is scheduled then it is assumed that the workitem is a planned item of work and that no SLA applies and the workitem is ignored)
For the Rolling Target Time approach the response and resolution times required are taken from the workitems SLA response and resolution target database fields for the relevant workitem record, which are calculated from the SLA rules.
All these reports use the working period associated with the SLA and if the worker or department work period approach is being used will need to be amended accordingly.
Finally there is a Third Party SLA report. This is typical of the report a manager would use in discussing a contract with the Third Party. It reports on all times within the chosen period a workitem was assigned to the relevant Third Party SLA, and reports on the first record after that assignment as being the response and the record in which the SLA reverts to an internal SLA as being the resolution event. Where no response or resolution has been found these fields will be empty. The time calculations of total time open etc. are calculated for the assignment period only, using the Third Party SLA working periods.
Notification Policies
There are four notification policies related to SLA monitoring that are installed by the Advanced SLA module, under Tasks, Incident Resolution, Incidents, Notification Policies. The version 2 policies are enabled by default.
The first pair monitor and act on SLA breaches using the Fixed Target Time SLA approach, the second for breaches using the Rolling Target Time approach.
Both use the query in the relevant SLA exceeded report as the basis for establishing whether a breach has occurred or is in danger of occurring - i.e. it includes the look ahead period. However an additional parameter is used, the minsbetweencheck parameter, which specifies the period (in minutes) between each policy check run (i.e. the schedule for the policy), so that an event is only triggered when the breach will fall between this scheduled run and the next scheduled run. In other words they are designed to trigger once per breach event only. This parameter must be the same as the schedule.
The Rolling Target Time policies are enabled by default and are set to run every 10 minutes for response and every 30 minutes for resolution.
Both types of policy have two actions configured. The first action updates the workitem and puts a breach warning comment in the comment field. This can be used to trigger appropriate rules in the service desk - for example to send an email to the assigned to worker or group. The second sends the breach report to the default email address, and should be edited so that the report gets sent to the relevant manager. Understanding the SQL functions created and database modifications made and how to use them.
The Advanced SLA module makes modifications to both the Service Desk and Notification Server Databases to enable the SLA capabilities described above to work. These modifications involve updating the tables and views within each database and adding user defined functions that are used to calculate SLA performance. The functions are called just like any normal SQL function in a SQL query.
The User Defined SQL Functions
Seven user defined SQL functions are created in the NS database that can be and are used in the SLA performance calculations.
dbo.Calc_business_minutes(Start Time, End Time, Working Hours Guid, Holiday Schedule Guid)
Calculates the elapsed time in business minutes between two date times using the Working/Holiday Periods entered. This is the equivalent of the SQL datediff() function but delivers the answer in business minutes. The parameters are:
- Start Time a date time from which to start the measurement
- End Time a date time to measure up to
- Working Hours Guid - the Guid of the Working Hours resource to use
- Holiday Schedule Guid - the Guid of the Holiday Schedule resource to use
dbo.Add_business_minutes (From Time, Minutes to Add, Working Hours Guid, Holiday Schedule Guid)
Calculates a date time that is so many minutes ahead of (or behind) an input date time in business minutes using the Working/Holiday Periods entered. This is the equivalent of the SQL dateadd() function but adds in business minutes. The parameters are:
- From Time a date time to which to add the minutes
- Minutes to Add the number of business minutes to add
- Working Hours Guid - the Guid of the Working Hours resource to use
- Holiday Schedule Guid - the Guid of the Holiday Schedule resource to use
dbo.Calc_Total_Minutes ( workitem number, first hold status number, second hold status number, close status number, date to calculate to)
Calculates the total time a workitem has been open in business time removing hold and close times. This is the first version of this function and has been superseded but has been kept within the software for backwards compatibility reasons. It only allows for two hold status. For closed workitems it calculates up to the close time, while for currently open workitems it calculates total time open up to a date time provided - normally Getdate(). I.e. it gives you the total time open up to a specific point in time, now, midnight last Friday, etc this uses the HD_workitem_detail_View and the HD_Workitm_Work_Hours_view Views in the NS database and is used in some of the V1 reports and notification policies. The hold codes can be set to 0 or left blank if required, but a close status number is required. Parameters are:
- Workitem number - The Workitem number of which to calculate total time open.
- First Hold Status number - the number that is the number of the status that represents a hold status e.g. 500
- Second Hold Status number - the number that is the number of the status that represents a hold status e.g. 500
- Close Status number - the number that is the number of the status that represents the close status e.g. 600
- Date to calculate to - for all currently open calls calculate current open time up to this date/time. Usually the SQL function getdate().
dbo.Calc_Total_Minutes_V2 ( Workitem number, Use which working period association, from workitem version number, date to calculate to)
Calculates the total time a workitem has been open in business time removing hold and close times, between the date of the workitem version and the 'date to calculate to', using the SLA type (internal or Third Party) in place for the workitem version supplied. This is the second version of this function which is not only simpler to use but more flexible and powerful. It calculates either up to the close time, and/or the time specified, which is generally some specific point you want to measure up to(Getdate (), or last Friday midnight, or the time when the SLA reverted back to an internal SLA from a Third Party SLA., etc.) This uses the HD_workitem_detail_View and the HD_Workitm_Work_Hours_view Views in the NS database and the fields that are specified for hold and close codes in the SLA. Importantly this function will only ever calculate for either internal SLA total times or Third Party SLA total times, whichever is applicable at the start time. This is keeps the calculations for internal SLAs and third party SLAs separate so that the one does not affect the results of the other. Basically if an individual workitem record moves from having one type of SLA to the other, the calculation ignores the changed to SLA hold data set and continues to use the changed from SLA data set (for hold periods etc) The parameters are:
- Workitem number - The Workitem number of which to calculate total time open.
- Use which working period association - This is in the range 1-5 where 1 uses the SLA working period, 2 the assigned workers, 3 the assigned to worker department, 4 the owners, 5 the owners department.
- From Workitem version - the version number to start calculating from. Normally this would be version 1 but for third party SLA calculations would be the version the third party SLA gets assigned on.
- Date to calculate to - for all currently open calls calculate current open time up to this date/time. Usually the SQL function getdate(), or a date you want to report up to. However this can be the workitem modified on date when a Third Party SLA reverts to an internal SLA thereby giving the start and end dates of a third party SLA assignment.
dbo.HoursMins (Minutes to convert)
This function simply converts minutes into a text string of hours:mins format. And is used for report display purposes. The parameters are:
- Minutes - The number of minutes to convert into Hours Mins format
dbo.Get_SLA_Time (Workitem Number, Type of SLA Time, Workitem version number)
This function returns the relevant SLA target time in minutes for the workitem and particular version number specified, using the SLA associated with that workitem version and the workitem version settings. It looks firstly at any SLA Target Rules that have been defined using the workitem versions priority, urgency etc. values. If nothing is returned it looks at the applicable SLA's general response and resolution ties, and if this returns nothing applies a 2 hour response and 8 hour fix. The parameters are:
- Workitem number - The Workitem number to get the SLA response/resolution target for
- Type of SLA Time - enter 1 to return the response time and 2 to return the resolution time
- Workitem Version Number - The specific version of the workitem to return the response/resolution target for.
dbo.Set_SLA_Time (Workitem Number, Type of SLA Time, Use which working period association)
This function returns the SLA target time as a date for an workitem. It simplifies the setting of the fixed SLA target time start on and due by dates through incident rules. It gets the current SLA response or resolution time for the workitem using the Get_SLA_Time function, and then adds this in business minutes to the workitem created on date, using the working period association specified, thereby returning the date/time that is the target response or resolution date/time. The parameters are:
- Workitem number - The incident number for which to determine the fixed SLA response/resolution target time.
- Type of SLA Time - enter 1 to return the response time and 2 to return the resolution time
- Use which working period association - This is in the range 1-5 where 1 uses the SLA working period, 2 the assigned workers, 3 the assigned to worker department, 4 the owners, 5 the owners department.
Database table and view changes
The Advanced SLA module makes the following changes to the Service Desk and Notification server databases:
Workitem Table - a field _SLAGuid is added which records the Guid of the SLA that is applied for each workitem record entry
Workitem_Only_view and HD_workitem equivalent. These have an additional column of workitem_SLAGuid which is the Guid of the SLA that applies to the record.
Workitem_detail_view, Workitem_current_View, and equivalent HD_workitem viewsin the NS Database. These have the following fields added
- SLA_End_Date - The date the SLA expires (Date/time)
- SLA_Start_Date - The date the SLA starts (Date/time)
- SLA_Status - the Status field from the SLA (String)
- SLA_Third_Party - Whether the SLA is Third Party or Internal (bit or Boolean) Workitem_SLA_Name - The name of the SLA (String)
- Workitem_SLAGuid - The guid of the SLA (String)
- SLA_Resolution_Time - The resolution time for the particular workitem entry using the Get_SLA_Time function
- SLA_Response_Time - The response time for the particular workitem entry using the Get_SLA_Time function
Workitem_work_times_View with a HD_workitem equivalent in the NS database. These are new views which list for each workitem entry in the database the associated working times as specified for the SLA, Assigned to worker, and Owned by worker. Where no association has been specified the default working hours and holidays schedule are listed. This view simplifies the selection of a working period to apply in a calculation or query as it does the resource association linking for you automatically.
SLA_mo_join this is a new view specific to the Service desk, which lists for each managed object any corresponding SLAs that apply based on the scope collection specified in the SLA. In other words this is a table that enables you see whether the SLA applies to the managed object/resource or not and essentially is intended to be used to ensure the list of SLAs available is always limited to those that would apply for the selected asset. SLAs that have no scope applied and which are therefore considered permanent are also listed although the object they apply to is left null. This also checks for valid start and end dates and only lists those SLAs that are current. It lists the SLA name and GUID, Managed object Name and Guid, and Collection name and Guid. Note this is asset based and not contact based.
Conclusion
With this new functionality available to customers they can truly embrace ITIL requirements around Service Level Management. XCEND and Incit-technology will continue to work together on providing Altiris customers with the best practices and customizations to meet the very unique needs of our customers. This is an Altiris supported solution that was jointly created by XCEND and Incit-technology for Altiris. Customers who need implementation support and or services around this solution can contact either XCEND or Incit-technology for services.
Download a copy of this article in PDF form and all the supporting files in the attached documents below.

















Many thanks for this but...
I am having a problem implementing this and I would be very grateful for some ideas please. Having followed step by step the SLA instructions (I do not need the timezone add-on), I am getting a problem when trying to open the Default Service Level Agreement. I get a real ugly screen with the error message (on 2 separate NS servers),
"Invalid object name 'HD_workitem_impact_lookup'."
And a Stack Trace:
[SqlException: Invalid object name 'HD_workitem_impact_lookup'.]
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) +742
System.Data.SqlClient.SqlCommand.ExecuteReader() +42
Altiris.Resource.DataClassColumnPresentation.GetNameValueListItems()
Altiris.Resource.DataClassColumnPresentation.GetDisplayList()
Altiris.Resource.UI.Controls.MultiRowDataClassControl.doDataClassPresentationExtensions()
Altiris.Resource.UI.Controls.MultiRowDataClassControl.setupDataTableColumns()
Altiris.Resource.UI.Controls.MultiRowDataClassControl.DataBind()
Altiris.Resource.UI.Controls.ResourceDetailsEditCtrl.BindControls(IDictionary controlDictionary)
[AeXException: Failed to perform bind for ResourceAssociationTypeEdit control for GUID = '6746ad43-be2d-4ed5-b00a-0bd3148aa8fd'.]
Altiris.Resource.UI.Controls.ResourceDetailsEditCtrl.BindControls(IDictionary controlDictionary)
Altiris.Resource.UI.Controls.ResourceDetailsEditCtrl.BindAllControls()
Altiris.Resource.UI.Controls.ResourceDetailsEditCtrl.DataBind()
Altiris.Resource.Web.Manager.EditCreateResource.Page_Load(Object sender, EventArgs e)
System.Web.UI.Control.OnLoad(EventArgs e) +55
System.Web.UI.Control.LoadRecursive() +27
System.Web.UI.Page.ProcessRequestMain() +750
Your missing a view
You are missing the view 'HD_workitem_impact_lookup' which should be in the Altiris database and refers to a view in the Incidents database. If you are on the most current version of the Altiris Helpdesk this script will solve your problem.
use [Altiris] go -- ------------------------------------------------------------ -- recreate all HD_ views for reading helpdesk data from NS -- ------------------------------------------------------------ begin declare views cursor local for select hd.[name] from [Altiris].sys.sysobjects ns, [Altiris_Incidents].sys.sysobjects hd where ns.[name] = 'HD_' + hd.[name] and substring(ns.[name],1,3) = 'HD_' and ns.xType = 'V' and hd.xType in('U','V') declare @cmd nvarchar(2000), @ViewName nvarchar(80) open views fetch next from views into @ViewName while @@fetch_status = 0 begin select @cmd = 'drop view dbo.[HD_' + @ViewName +']' exec(@cmd) select @cmd = 'create view dbo.[HD_' + @ViewName +'] as select * from [Altiris_Incidents].dbo.[' + @ViewName +']' exec(@cmd) fetch next from views into @ViewName end close views deallocate views end go if object_id(N'HD_workitem_work_times_view', N'V') is not null drop view dbo.HD_workitem_work_times_view go create view dbo.HD_workitem_work_times_view as select * from [Altiris_Incidents].dbo.workitem_work_times_view goThanks,
James "Scott" Hardie
Vice President of Technology Services
shardie@xcendgroup.com
http://www.xcendgroup.com
Missing view
Thanks Scott - very helpful response. I actually manually created the views in SQL - there were two missing. One was for impact and the other for urgency. Since then, all has gone well.
Thanks for placing such a useful tool at our disposal - and free of charge.
Your welcome
Glad that you got it all set. We continue to add new functionality as time allows I will try to update the article for new features and fuctionality. Looking forward to convert it over to Altiris 7 and add some workflow processes to it as well.
Thanks,
James "Scott" Hardie
Vice President of Technology Services
shardie@xcendgroup.com
http://www.xcendgroup.com
I'm missing something
Hello Scott,
First, many thanks to provide a "packaged" SLA solution.
I'm missing something that is the diference between the documentation or what you provided on the juice and the files present in the zip.
As i'm a bit lazy, I wanted to implement and play before to try to understand.
The doc is indicating the update of several templates and the zip file only provides 2 templates.
Does it mean that finally with 2 templates it's enougth or do I need to apply the changes gave in the doc.
Best Regards
Fabrice
FABEMARA Consulting the new Symantec Altiris Partner in Spain
www.fabemara.es
https://inventario.fabemara.es
Global Time Zone Implementation
Scott,
I implemented the changes specified in the Global Time Zone Implementation section as I have an implementation that is nationwide and could benefit greatly from this customization. I am testing the implementation and cannot find any difference, that is, it behaves as if I hadn't made the changes. I.e. created and modified times are displayed in server time not client time. Is there any way to verify the timezone.dll and SetTZ.ASPX files are being called etc. Any ideas would be greatly appreciated.
Thanks,
Mark
My guess is
I would need more details if this is not the case but my guess is you have not done an iisreset for the new files to take effect.
Thanks and let me know,
James "Scott" Hardie
Vice President of Technology Services
shardie@xcendgroup.com
http://www.xcendgroup.com
Error
Hi,
I'm getting the errors shown below..this seems to be something with the CUSTOM\Templates folder or Custom.config file as if i rename these, all works fine...
This happens when i open the Helpdesk console and then select Worker report
External component has thrown an exception.
Details
Exception - System.Web.HttpException: External component has thrown an exception. ---> System.Web.HttpCompileException: External component has thrown an exception.
at System.Web.Compilation.BaseCompiler.ThrowIfCompilerErrors(CompilerResults results, CodeDomProvider codeProvider, CodeCompileUnit sourceData, String sourceFile, String sourceString)
at System.Web.Compilation.BaseCompiler.GetCompiledType()
at System.Web.UI.UserControlParser.CompileIntoType()
at System.Web.UI.TemplateParser.GetParserCacheItemThroughCompilation()
--- End of inner exception stack trace ---
at System.Web.UI.TemplateParser.GetParserCacheItemInternal(Boolean fCreateIfNotFound)
at System.Web.UI.TemplateParser.GetParserCacheItemWithNewConfigPath()
at System.Web.UI.TemplateParser.GetParserCacheItem()
at System.Web.UI.TemplateControlParser.CompileAndGetParserCacheItem(String virtualPath, String inputFile, HttpContext context)
at System.Web.UI.TemplateControlParser.GetCompiledType(String virtualPath, String inputFile, HttpContext context)
at System.Web.UI.UserControlParser.GetCompiledUserControlType(String virtualPath, String inputFile, HttpContext context)
at System.Web.UI.TemplateControl.LoadControl(String virtualPath)
at Altiris.AppWeaver.TemplateModule.OnLoad(EventArgs e)
Has anyone implemented just the time zone portion?
I don't get any errors so I know I don't have any syntax errors but I also don't get any time zone adjustments. I did a little digging and it appears the client browser needs to call the setTZ.aspx page at the beginning of the session. I don't see how this is being done and would explain why I don't see any adjustments. Any ideas out there? Thanks!
Time Zone
I attempted to implement the Time Zone portion, and sent a message to Scott when I couldn't get it working. I still haven't found the problem, but here is Scott's reply:
Time Zone
Thanks Steve that's where I am as well. I do have some customizations but they are very straightforward kinds of things, hiding fields, adding fields etc. I guess I should start with a pristine SP5 system and try again. Not fun, but maybe I'll try it tonight. Thanks for the input. Anyone else out there?
I should have time in the next week or two
I will go thru it next week and see if I find something that causes the 2 problems above on 3 Helpdesks that I am updating and if I do find a problem will get it corrected. I have 1 fresh, and 1 customized one both on the latest and another customized on SP4 to check to see if I run into anything.
Thanks,
James "Scott" Hardie
Vice President of Technology Services
shardie@xcendgroup.com
http://www.xcendgroup.com