private void LoadTrigger(SlaTrigger trigger) { SetTimes(trigger.WarningTime, trigger.TimeInitialResponse, trigger.TimeLastAction, trigger.TimeToClose); cbGroupViolations.Checked = trigger.NotifyGroupOnViolation; cbGroupWarnings.Checked = trigger.NotifyGroupOnWarning; cbUserViolations.Checked = trigger.NotifyUserOnViolation; cbUserWarnings.Checked = trigger.NotifyUserOnWarning; rbNoBusinessHours.Checked = trigger.NoBusinessHours; rbBusinessHours.Checked = trigger.UseBusinessHours; timeSLAStart.SelectedDate = (trigger.DayStartUtc != null ? TimeZoneInfo.ConvertTimeFromUtc(trigger.DayStartUtc.Value, TimeZoneInfo.FindSystemTimeZoneById(trigger.TimeZone)) : new DateTime?()); timeSLAEnd.SelectedDate = (trigger.DayEndUtc != null ? TimeZoneInfo.ConvertTimeFromUtc(trigger.DayEndUtc.Value, TimeZoneInfo.FindSystemTimeZoneById(trigger.TimeZone)) : new DateTime?()); cbTimeZones.SelectedValue = trigger.TimeZone; cbSLASunday.Checked = ((int)trigger.Weekdays & (int)Math.Pow(2, (int)DayOfWeek.Sunday)) > 0; cbSLAMonday.Checked = ((int)trigger.Weekdays & (int)Math.Pow(2, (int)DayOfWeek.Monday)) > 0; cbSLATuesday.Checked = ((int)trigger.Weekdays & (int)Math.Pow(2, (int)DayOfWeek.Tuesday)) > 0; cbSLAWednesday.Checked = ((int)trigger.Weekdays & (int)Math.Pow(2, (int)DayOfWeek.Wednesday)) > 0; cbSLAThursday.Checked = ((int)trigger.Weekdays & (int)Math.Pow(2, (int)DayOfWeek.Thursday)) > 0; cbSLAFriday.Checked = ((int)trigger.Weekdays & (int)Math.Pow(2, (int)DayOfWeek.Friday)) > 0; cbSLASaturday.Checked = ((int)trigger.Weekdays & (int)Math.Pow(2, (int)DayOfWeek.Saturday)) > 0; DisableEnableCustomBusinessHours(trigger.UseBusinessHours, trigger.NoBusinessHours); cbPauseOnOrganizationHolidays.Checked = trigger.PauseOnHoliday; List <DateTime> daysToPause = SlaTriggers.GetSpecificDaysToPause(trigger.SlaTriggerID); DaysToPauseHidden.Value = string.Join(",", daysToPause.Select(p => DataUtils.DateToLocal(UserSession.LoginUser, p).ToString("d"))); LoginUser loginUser = TSAuthentication.GetLoginUser(); foreach (DateTime dayToPause in daysToPause.OrderBy(p => p)) { daysToPauseList.Items.Add(new ListItem { Value = DataUtils.DateToLocal(UserSession.LoginUser, dayToPause).ToString("d"), Text = DataUtils.DateToLocal(UserSession.LoginUser, dayToPause).ToString("d", loginUser.CultureInfo) }); } }
public bool IsSlaPaused(int triggerId, int organizationId) { bool isPaused = false; TicketStatuses statuses = new TicketStatuses(_loginUser); statuses.LoadByStatusIDs(organizationId, new int[] { TicketStatusId }); if (statuses != null && statuses.Any()) { isPaused = statuses[0].PauseSLA; } //check if "Pause on Specific Dates" if (!isPaused) { List <DateTime> daysToPause = SlaTriggers.GetSpecificDaysToPause(triggerId); isPaused = daysToPause.Where(p => DateTime.Compare(p.Date, DateTime.UtcNow.Date) == 0).Any(); } //If Pause on Company Holidays is selected SlaTrigger slaTrigger = SlaTriggers.GetSlaTrigger(_loginUser, triggerId); if (!isPaused && slaTrigger.PauseOnHoliday) { isPaused = SlaTriggers.IsOrganizationHoliday(organizationId, DateTime.UtcNow); } return(isPaused); }
public static string GetSlaTrigger(RestCommand command, int slaTriggerID) { SlaTrigger slaTrigger = SlaTriggers.GetSlaTrigger(command.LoginUser, slaTriggerID); if (slaTrigger.OrganizationID != command.Organization.OrganizationID) { throw new RestException(HttpStatusCode.Unauthorized); } return(slaTrigger.GetXml("SlaTrigger", true)); }
public static void DeleteTrigger(int slaTriggerID) { SlaTrigger trigger = SlaTriggers.GetSlaTrigger(UserSession.LoginUser, slaTriggerID); SlaLevel level = SlaLevels.GetSlaLevel(UserSession.LoginUser, trigger.SlaLevelID); if (trigger != null && level.OrganizationID == UserSession.LoginUser.OrganizationID && UserSession.CurrentUser.IsSystemAdmin) { trigger.Delete(); trigger.Collection.Save(); } }
public static string GetSlaTriggers(RestCommand command) { SlaTriggers slaTriggers = new SlaTriggers(command.LoginUser); slaTriggers.LoadByOrganizationID(command.Organization.OrganizationID); if (command.Format == RestFormat.XML) { return(slaTriggers.GetXml("SlaTriggers", "SlaTrigger", true, command.Filters)); } else { throw new RestException(HttpStatusCode.BadRequest, "Invalid data format"); } }
protected void Page_Load(object sender, EventArgs e) { if (Request["TicketID"] == null) { EndResponse("Invalid Ticket"); } LoginUser loginUser = TSAuthentication.GetLoginUser(); int ticketID = int.Parse(Request["TicketID"]); Ticket ticket = Tickets.GetTicket(loginUser, ticketID); if (ticket == null) { EndResponse("Invalid Ticket"); } tipNumber.InnerText = "Ticket #" + ticket.TicketNumber.ToString(); tipNumber.Attributes.Add("onclick", "top.Ts.MainPage.openTicket(" + ticket.TicketNumber + "); return false;"); tipName.InnerHtml = ticket.Name; bool isStatusPaused = false; SlaTicket slaTicket = SlaTickets.GetSlaTicket(loginUser, ticket.TicketID); if (slaTicket != null) { SlaTrigger slaTrigger = SlaTriggers.GetSlaTrigger(loginUser, slaTicket.SlaTriggerId); if (slaTrigger != null) { isStatusPaused = ticket.IsSlaStatusPaused(); string slaName = new SlaLevels(TSAuthentication.GetLoginUser()).GetSlaveLevelName(slaTicket.SlaTriggerId); wslaName.InnerText = slaName; } else { ticket.SlaViolationInitialResponse = null; ticket.SlaViolationTimeClosed = null; ticket.SlaViolationLastAction = null; ticket.SlaWarningInitialResponse = null; ticket.SlaWarningTimeClosed = null; ticket.SlaWarningLastAction = null; ticket.Collection.Save(); } } if (isStatusPaused) { wClose.InnerText = "Paused"; vClose.InnerText = "Paused"; wLast.InnerText = "Paused"; vLast.InnerText = "Paused"; wInit.InnerText = "Paused"; vInit.InnerText = "Paused"; wNext.InnerText = "Paused"; vNext.InnerText = "Paused"; } else { DateTime?nextViolation = GetUtcDate(ticket, "SlaViolationInitialResponse"); nextViolation = GetMinDate(loginUser, nextViolation, GetUtcDate(ticket, "SlaViolationLastAction")); nextViolation = GetMinDate(loginUser, nextViolation, GetUtcDate(ticket, "SlaViolationTimeClosed")); DateTime?nextWarning = GetUtcDate(ticket, "SlaWarningInitialResponse"); nextWarning = GetMinDate(loginUser, nextWarning, GetUtcDate(ticket, "SlaWarningLastAction")); nextWarning = GetMinDate(loginUser, nextWarning, GetUtcDate(ticket, "SlaWarningTimeClosed")); if (nextViolation != null && nextViolation < DateTime.UtcNow) { tipSla.Attributes.Add("class", "ts-icon ts-icon-sla-bad"); } else if (nextWarning != null && nextWarning < DateTime.UtcNow) { tipSla.Attributes.Add("class", "ts-icon ts-icon-sla-warning"); } else { tipSla.Attributes.Add("class", "ts-icon ts-icon-sla-good"); } wClose.InnerText = GetDateString(loginUser, GetUtcDate(ticket, "SlaWarningTimeClosed")); vClose.InnerText = GetDateString(loginUser, GetUtcDate(ticket, "SlaViolationTimeClosed")); wLast.InnerText = GetDateString(loginUser, GetUtcDate(ticket, "SlaWarningLastAction")); vLast.InnerText = GetDateString(loginUser, GetUtcDate(ticket, "SlaViolationLastAction")); wInit.InnerText = GetDateString(loginUser, GetUtcDate(ticket, "SlaWarningInitialResponse")); vInit.InnerText = GetDateString(loginUser, GetUtcDate(ticket, "SlaViolationInitialResponse")); wNext.InnerText = GetDateString(loginUser, nextWarning); vNext.InnerText = GetDateString(loginUser, nextViolation); } }
private void NotifyViolation(int ticketID, bool useUser, bool useGroup, bool isWarning, SlaViolationType slaViolationType, SlaNotification notification, int?triggerId) { Users users = new Users(LoginUser); User user = null; Logs.WriteLine(); Logs.WriteEvent("***** Processing TicketID: " + ticketID.ToString()); TicketsViewItem ticket = TicketsView.GetTicketsViewItem(LoginUser, ticketID); if (ticket == null) { Logs.WriteEvent("Ticket is NULL, exiting"); return; } //Since we are already re-loading the Ticket information we will check again if the SLAs still apply at this point string violationType = ""; bool slaNotApplyAnymore = false; switch (slaViolationType) { case SlaViolationType.InitialResponse: violationType = "Initial Response"; slaNotApplyAnymore = ticket.SlaWarningInitialResponse == null; break; case SlaViolationType.LastAction: violationType = "Last Action"; slaNotApplyAnymore = ticket.SlaViolationLastAction == null; break; case SlaViolationType.TimeClosed: violationType = "Time to Close"; slaNotApplyAnymore = ticket.SlaViolationTimeClosed == null; break; default: break; } if (slaNotApplyAnymore) { Logs.WriteEvent($"The {((isWarning) ? "warning" : "violation")} for {violationType} does not apply anymore because the Ticket has been updated to satisfy this SLA while it was in process for the notification."); } else { if (!isWarning) { SlaViolationHistoryItem history = (new SlaViolationHistory(LoginUser)).AddNewSlaViolationHistoryItem(); history.DateViolated = DateTime.UtcNow; history.GroupID = ticket.GroupID; history.UserID = ticket.UserID; history.ViolationType = slaViolationType; history.TicketID = ticket.TicketID; history.SlaTriggerId = triggerId; history.Collection.Save(); } Actions actions = new Actions(LoginUser); actions.LoadLatestByTicket(ticket.TicketID, false); ActionLogs.AddActionLog(LoginUser, ActionLogType.Update, ReferenceType.Tickets, ticket.TicketID, violationType + " SLA " + (isWarning ? "warning" : "violation") + " occurred"); MailMessage message = EmailTemplates.GetSlaEmail(LoginUser, ticket, violationType, isWarning); if (ticket.GroupID != null && useGroup) { users.LoadByGroupID((int)ticket.GroupID); } if (ticket.UserID != null && useUser && users.FindByUserID((int)ticket.UserID) == null) { user = Users.GetUser(LoginUser, (int)ticket.UserID); } foreach (User item in users) { if (Emails.IsEmailDisabled(LoginUser, item.UserID, "SLA")) { continue; } message.To.Add(new MailAddress(item.Email, item.FirstLastName)); } if (user != null) { if (!Emails.IsEmailDisabled(LoginUser, user.UserID, "SLA")) { message.To.Add(new MailAddress(user.Email, user.FirstLastName)); Logs.WriteEvent(string.Format("Adding Main User, Name:{0} Email:{1} UserID:{2}", user.FirstLastName, user.Email, user.UserID.ToString())); } } if (message.To.Count > 0) { Email email = Emails.AddEmail(LoginUser, ticket.OrganizationID, null, "Sla Message", message); Logs.WriteEvent("Email Added (EmailID: " + email.EmailID.ToString() + ")", true); } try { TimeZoneInfo tz = null; Organization org = Organizations.GetOrganization(LoginUser, ticket.OrganizationID); if (org.TimeZoneID != null) { tz = System.TimeZoneInfo.FindSystemTimeZoneById(org.TimeZoneID); } if (tz == null) { Logs.WriteEvent("Timezone is null, using system's"); tz = System.TimeZoneInfo.Local; } Logs.WriteEvent(tz.DisplayName); Logs.WriteEvent("Supports DLS: " + tz.SupportsDaylightSavingTime.ToString()); Logs.WriteEvent("Is DLS: " + tz.IsDaylightSavingTime(DateTime.UtcNow).ToString()); Logs.WriteEvent("UTC: " + DateTime.UtcNow.ToString()); Logs.WriteEvent(string.Format("NOTIFYING TicketID:{0} TicketNumber:{1} OrganizationID:{2} ", ticket.TicketID.ToString(), ticket.TicketNumber.ToString(), ticket.OrganizationID.ToString())); Logs.WriteEvent(string.Format("User:{1} Group:{2} IsWarning:{3} NoficationType:{4}", ticketID.ToString(), useUser.ToString(), useGroup.ToString(), isWarning.ToString(), slaViolationType)); Logs.WriteEvent("Ticket Data:"); Logs.WriteData(ticket.Row); Logs.WriteEvent("Notification Data:"); Logs.WriteData(notification.Row); Logs.WriteEvent("Organization Data:"); Logs.WriteData(org.Row); Organizations customers = new Organizations(LoginUser); customers.LoadByTicketID(ticket.TicketID); foreach (Organization customer in customers) { Logs.WriteEvent("-- Customer: " + customer.Name); if (customer.SlaLevelID != null) { SlaLevel level = SlaLevels.GetSlaLevel(LoginUser, (int)customer.SlaLevelID); Logs.WriteEvent("SLA Level: " + level.Name); SlaTriggers triggers = new SlaTriggers(LoginUser); triggers.LoadByTicketTypeAndSeverity(level.SlaLevelID, ticket.TicketTypeID, ticket.TicketSeverityID); foreach (SlaTrigger trigger in triggers) { Logs.WriteData(trigger.Row); } } else { Logs.WriteEvent("No SLA Level Assigned to " + customer.Name); } } if (org.InternalSlaLevelID != null) { Logs.WriteEvent("Internal SLA:"); SlaTriggers triggers = new SlaTriggers(LoginUser); triggers.LoadByTicketTypeAndSeverity((int)org.InternalSlaLevelID, ticket.TicketTypeID, ticket.TicketSeverityID); foreach (SlaTrigger trigger in triggers) { Logs.WriteData(trigger.Row); } } else { Logs.WriteEvent("No Internal SLA"); } } catch (Exception ex) { Logs.WriteEvent("Logging Exception:"); Logs.WriteException(ex); } } }
public override void Run() { try { SlaTickets slaTickets = new SlaTickets(LoginUser); slaTickets.LoadPending(); if (slaTickets != null && slaTickets.Count > 0) { Logs.WriteEvent(string.Format("{0} pending tickets to calculate the SLA values for.", slaTickets.Count)); } foreach (SlaTicket slaTicket in slaTickets) { if (IsStopped) { break; } UpdateHealth(); try { Ticket ticket = Tickets.GetTicket(LoginUser, slaTicket.TicketId); if (ticket != null) { bool isStatusPaused = ticket.IsSlaStatusPaused(); bool isClosed = ticket.DateClosed != null; DateTime?newSlaViolationTimeClosed = null; DateTime?newSlaWarningTimeClosed = null; DateTime?newSlaViolationLastAction = null; DateTime?newSlaWarningLastAction = null; DateTime?newSlaViolationInitialResponse = null; DateTime?newSlaWarningInitialResponse = null; if (!isClosed && !isStatusPaused) { DateTime?lastActionDateCreated = Actions.GetLastActionDateCreated(LoginUser, ticket.TicketID); int totalActions = Actions.TotalActionsForSla(LoginUser, ticket.TicketID, ticket.OrganizationID); Organization organization = Organizations.GetOrganization(LoginUser, ticket.OrganizationID); SlaTrigger slaTrigger = SlaTriggers.GetSlaTrigger(LoginUser, slaTicket.SlaTriggerId); if (slaTrigger == null) { Logs.WriteEventFormat("Trigger {0} not found.", slaTicket.SlaTriggerId); } SlaTickets.BusinessHours businessHours = new SlaTickets.BusinessHours() { DayStartUtc = organization.BusinessDayStartUtc, DayEndUtc = organization.BusinessDayEndUtc, BusinessDays = organization.BusinessDays }; //Check if we should use SLA's business hours instead of Account's if (!slaTrigger.UseBusinessHours && !slaTrigger.NoBusinessHours && slaTrigger.DayStartUtc.HasValue && slaTrigger.DayEndUtc.HasValue) { businessHours.DayStartUtc = slaTrigger.DayStartUtc.Value; businessHours.DayEndUtc = slaTrigger.DayEndUtc.Value; businessHours.BusinessDays = slaTrigger.Weekdays; } else if (!slaTrigger.UseBusinessHours && !slaTrigger.NoBusinessHours) { Logs.WriteEventFormat("Using Account's business hours {0} to {1} because while the trigger is set to use sla's business hours one of them has no value. Sla DayStartUtc {2}, Sla DayEndUtc {3}", organization.BusinessDayStartUtc.ToShortTimeString(), organization.BusinessDayEndUtc.ToShortTimeString(), slaTrigger.DayStartUtc.HasValue ? slaTrigger.DayStartUtc.Value.ToShortTimeString() : "NULL", slaTrigger.DayEndUtc.HasValue ? slaTrigger.DayEndUtc.Value.ToShortTimeString() : "NULL"); } Logs.WriteEvent(string.Format("Ticket #{0} id {1}. LastAction: {2}, TotalActions: {3}, Org({4}) {5}, SlaTriggerId {6}.", ticket.TicketNumber, ticket.TicketID, lastActionDateCreated == null ? "none" : lastActionDateCreated.Value.ToString(), totalActions, organization.OrganizationID, organization.Name, slaTrigger.SlaTriggerID)); List <DateTime> daysToPause = SlaTriggers.GetSpecificDaysToPause(slaTrigger.SlaTriggerID); bool pauseOnHoliday = slaTrigger.PauseOnHoliday; CalendarEvents holidays = new CalendarEvents(LoginUser); if (pauseOnHoliday) { holidays.LoadHolidays(organization.OrganizationID); } Dictionary <int, double> businessPausedTimes = new Dictionary <int, double>(); //We need to have two calculations for the paused time, one for the Time To Close and Initial Response which should count the paused time since the Ticket creation //and another one for Last Action where it should only count starting from the last action added TimeSpan totalPausedTimeSpan = SlaTickets.CalculatePausedTime(ticket.TicketID, organization, businessHours, slaTrigger, daysToPause, holidays, LoginUser, businessPausedTimes, Logs); Logs.WriteEventFormat("Total Paused Time: {0}", totalPausedTimeSpan.ToString()); UpdateBusinessPausedTimes(LoginUser, businessPausedTimes); newSlaViolationTimeClosed = SlaTickets.CalculateSLA(ticket.DateCreatedUtc, businessHours, slaTrigger, slaTrigger.TimeToClose, totalPausedTimeSpan, daysToPause, holidays); if (newSlaViolationTimeClosed != null) { newSlaWarningTimeClosed = SlaTickets.CalculateSLAWarning(newSlaViolationTimeClosed.Value, businessHours, slaTrigger.NoBusinessHours, slaTrigger.TimeToClose, slaTrigger.WarningTime, daysToPause, holidays); } TimeSpan pausedTimeSpanSinceLastAction = SlaTickets.CalculatePausedTime(ticket.TicketID, organization, businessHours, slaTrigger, daysToPause, holidays, LoginUser, businessPausedTimes, Logs, false, lastActionDateCreated.HasValue ? lastActionDateCreated.Value : (DateTime?)null); Logs.WriteEventFormat("Total Paused Time: {0}", pausedTimeSpanSinceLastAction.ToString()); if (lastActionDateCreated == null) { newSlaViolationLastAction = null; newSlaWarningLastAction = null; } else { newSlaViolationLastAction = SlaTickets.CalculateSLA(lastActionDateCreated.Value, businessHours, slaTrigger, slaTrigger.TimeLastAction, pausedTimeSpanSinceLastAction, daysToPause, holidays); if (newSlaViolationLastAction != null) { newSlaWarningLastAction = SlaTickets.CalculateSLAWarning((DateTime)newSlaViolationLastAction.Value, businessHours, slaTrigger.NoBusinessHours, slaTrigger.TimeLastAction, slaTrigger.WarningTime, daysToPause, holidays); } } if (slaTrigger.TimeInitialResponse < 1 || totalActions > 0) { newSlaViolationInitialResponse = null; newSlaWarningInitialResponse = null; } else { newSlaViolationInitialResponse = SlaTickets.CalculateSLA(ticket.DateCreatedUtc, businessHours, slaTrigger, slaTrigger.TimeInitialResponse, totalPausedTimeSpan, daysToPause, holidays); if (newSlaViolationInitialResponse != null) { newSlaWarningInitialResponse = SlaTickets.CalculateSLAWarning((DateTime)newSlaViolationInitialResponse.Value, businessHours, slaTrigger.NoBusinessHours, slaTrigger.TimeInitialResponse, slaTrigger.WarningTime, daysToPause, holidays); } } } else { Logs.WriteEventFormat("Ticket is {0}, clearing its SLA values.", isClosed ? "Closed" : "Status Paused"); } if (HasAnySlaChanges(ticket, newSlaViolationTimeClosed, newSlaWarningTimeClosed, newSlaViolationLastAction, newSlaWarningLastAction, newSlaViolationInitialResponse, newSlaWarningInitialResponse)) { ticket.SlaViolationTimeClosed = newSlaViolationTimeClosed; ticket.SlaWarningTimeClosed = newSlaWarningTimeClosed; ticket.SlaViolationLastAction = newSlaViolationLastAction; ticket.SlaWarningLastAction = newSlaWarningLastAction; ticket.SlaViolationInitialResponse = newSlaViolationInitialResponse; ticket.SlaWarningInitialResponse = newSlaWarningInitialResponse; Tickets.UpdateTicketSla(LoginUser, ticket.TicketID, newSlaViolationInitialResponse, newSlaViolationLastAction, newSlaViolationTimeClosed, newSlaWarningInitialResponse, newSlaWarningLastAction, newSlaWarningTimeClosed); Logs.WriteEvent("Ticket SLA calculation completed."); string signalRUrl = Settings.ReadString("SignalRUrl"); if (!string.IsNullOrEmpty(signalRUrl)) { //Dictionary<string, string> queryStringData = new Dictionary<string, string>(); //queryStringData.Add("userID", "-1"); //queryStringData.Add("organizationID", ticket.OrganizationID.ToString()); //HubConnection connection = new HubConnection(signalRUrl, queryStringData); //IHubProxy signalRConnection = connection.CreateHubProxy("TicketSocket"); //try //{ // connection.Start().Wait(); // signalRConnection.Invoke("RefreshSLA", ticket.TicketNumber); //} //catch (Exception ex) //{ // Logs.WriteEvent("Could not send signalR to refresh the SLA. Message: " + ex.Message); //} } } else { Logs.WriteEvent("Ticket SLA calculation completed. SLA values did not change, ticket was not updated."); } slaTicket.IsPending = false; slaTicket.Collection.Save(); } else { SlaPausedTimes slaPausedTimes = new SlaPausedTimes(LoginUser); slaPausedTimes.LoadByTicketId(slaTicket.TicketId); slaPausedTimes.DeleteAll(); slaPausedTimes.Save(); slaTicket.Delete(); slaTicket.Collection.Save(); Logs.WriteEventFormat("Ticket id {0} does not exist anymore, deleted from SlaTickets.", slaTicket.TicketId); } System.Threading.Thread.Sleep(100); } catch (System.Data.SqlClient.SqlException sqlEx) { //Handle the deadlock exception, any other bubble up. if (sqlEx.Number == 1205 || sqlEx.Message.Contains("deadlocked")) { ExceptionLogs.LogException(LoginUser, sqlEx, "SLA Calculator", "Sync"); Logs.WriteEventFormat("Exception. Message {0}{1}StackTrace {2}", sqlEx.Message, Environment.NewLine, sqlEx.StackTrace); slaTicket.IsPending = true; slaTicket.Collection.Save(); Logs.WriteEventFormat("SlaTicket: TicketId {0} TriggerId {1} still pending.", slaTicket.TicketId, slaTicket.SlaTriggerId); } else { throw; } } catch (Exception ex) { ExceptionLogs.LogException(LoginUser, ex, "SLA Calculator", "Sync"); Logs.WriteEventFormat("Exception. Message {0}{1}StackTrace {2}", ex.Message, Environment.NewLine, ex.StackTrace); slaTicket.IsPending = false; slaTicket.Collection.Save(); Logs.WriteEventFormat("SlaTicket: TicketId {0} TriggerId {1} set to not pending.", slaTicket.TicketId, slaTicket.SlaTriggerId); } } if (slaTickets != null && slaTickets.Count > 0) { Logs.WriteEvent(string.Format("Completed processing the {0} pending tickets to calculate the SLA values for.", slaTickets.Count)); } } catch (Exception ex) { ExceptionLogs.LogException(LoginUser, ex, "SLA Calculator", "Sync"); Logs.WriteEvent(string.Format("Exception. Message {0}{1}StackTrace {2}", ex.Message, Environment.NewLine, ex.StackTrace)); } }
public override bool Save() { if (rbCustomBusinessHours.Checked && (timeSLAStart.SelectedDate == null || timeSLAEnd.SelectedDate == null)) { string script = "alert('Please select both the SLA Day Start and End.');"; string name = "ValidationAlert"; ScriptManager.RegisterClientScriptBlock(this, typeof(Page), name + "_function", "function " + name + "(){" + script + "Sys.Application.remove_load(" + name + ");}", true); ScriptManager.RegisterStartupScript(this, typeof(Page), name, "Sys.Application.add_load(" + name + ");", true); DialogResult = ""; return(false); } SlaTrigger trigger; SlaTriggers triggers = new SlaTriggers(UserSession.LoginUser); if (_slaTriggerID < 0) { trigger = triggers.AddNewSlaTrigger(); trigger.SlaLevelID = _slaLevelID; trigger.TicketTypeID = _ticketTypeID; } else { trigger = SlaTriggers.GetSlaTrigger(UserSession.LoginUser, _slaTriggerID); if (trigger == null) { return(false); } } trigger.TicketSeverityID = int.Parse(cmbSeverities.SelectedValue); trigger.NotifyGroupOnViolation = cbGroupViolations.Checked; trigger.NotifyGroupOnWarning = cbGroupWarnings.Checked; trigger.NotifyUserOnViolation = cbUserViolations.Checked; trigger.NotifyUserOnWarning = cbUserWarnings.Checked; trigger.NoBusinessHours = rbNoBusinessHours.Checked; trigger.UseBusinessHours = rbBusinessHours.Checked; trigger.PauseOnHoliday = cbPauseOnOrganizationHolidays.Checked; trigger.DayStart = null; trigger.DayEnd = null; trigger.TimeZone = cbTimeZones.SelectedValue; UserSession.LoginUser.TimeZoneInfo = null; try { TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(trigger.TimeZone); if (timeSLAStart.SelectedDate != null) { trigger.DayStart = TimeZoneInfo.ConvertTimeToUtc((DateTime)timeSLAStart.SelectedDate, timeZoneInfo); } if (timeSLAEnd.SelectedDate != null) { trigger.DayEnd = TimeZoneInfo.ConvertTimeToUtc((DateTime)timeSLAEnd.SelectedDate, timeZoneInfo); } } catch (Exception ex) { } int weekdays = 0; AddSLADay(ref weekdays, DayOfWeek.Sunday, cbSLASunday.Checked); AddSLADay(ref weekdays, DayOfWeek.Monday, cbSLAMonday.Checked); AddSLADay(ref weekdays, DayOfWeek.Tuesday, cbSLATuesday.Checked); AddSLADay(ref weekdays, DayOfWeek.Wednesday, cbSLAWednesday.Checked); AddSLADay(ref weekdays, DayOfWeek.Thursday, cbSLAThursday.Checked); AddSLADay(ref weekdays, DayOfWeek.Friday, cbSLAFriday.Checked); AddSLADay(ref weekdays, DayOfWeek.Saturday, cbSLASaturday.Checked); trigger.Weekdays = weekdays; List <string> daysToPause = new List <string>(); if (!String.IsNullOrEmpty(DaysToPauseHidden.Value)) { daysToPause = DaysToPauseHidden.Value.Split(',').Distinct().Where(p => !string.IsNullOrEmpty(p)).ToList(); } SlaPausedDays slaPausedDays = new SlaPausedDays(UserSession.LoginUser); if (_slaTriggerID > 0) { slaPausedDays.LoadByTriggerID(trigger.SlaTriggerID); if (slaPausedDays != null && slaPausedDays.Any()) { slaPausedDays.DeleteAll(); slaPausedDays.Save(); } slaPausedDays = new SlaPausedDays(UserSession.LoginUser); } int value = numWarning.Value == null ? 0 : (int)numWarning.Value; if (rbWarningDay.Checked) { trigger.WarningTime = value * 24 * 60; } else if (rbWarningHour.Checked) { trigger.WarningTime = value * 60; } else { trigger.WarningTime = value; } value = numInitial.Value == null ? 0 : (int)numInitial.Value; if (rbInitialDay.Checked) { trigger.TimeInitialResponse = value * 24 * 60; } else if (rbInitialHour.Checked) { trigger.TimeInitialResponse = value * 60; } else { trigger.TimeInitialResponse = value; } value = numAction.Value == null ? 0 : (int)numAction.Value; if (rbActionDay.Checked) { trigger.TimeLastAction = value * 24 * 60; } else if (rbActionHour.Checked) { trigger.TimeLastAction = value * 60; } else { trigger.TimeLastAction = value; } value = numClosed.Value == null ? 0 : (int)numClosed.Value; if (rbClosedDay.Checked) { trigger.TimeToClose = value * 24 * 60; } else if (rbClosedHour.Checked) { trigger.TimeToClose = value * 60; } else { trigger.TimeToClose = value; } try { trigger.Collection.Save(); foreach (string day in daysToPause) { string decodedDay = System.Net.WebUtility.HtmlDecode(day); decodedDay = System.Text.RegularExpressions.Regex.Replace(decodedDay, @"[^\u0000-\u007F]+", string.Empty); decodedDay = System.Text.RegularExpressions.Regex.Replace(decodedDay, "[^.0-9/\\s]", ""); DateTime dayToPause = new DateTime(); Settings.UserDB.WriteString("SlaTriggerDayToPauseDebug", day + " => " + decodedDay); if (DateTime.TryParse(decodedDay, new CultureInfo("en-US"), DateTimeStyles.None, out dayToPause)) { SlaPausedDay slaPausedDay = slaPausedDays.AddNewSlaPausedDay(); slaPausedDay.SlaTriggerId = trigger.SlaTriggerID; slaPausedDay.DateToPause = dayToPause.ToUniversalTime(); slaPausedDay.Collection.Save(); Settings.UserDB.WriteString("SlaTriggerDayToPauseParseDebug", "us-US: " + dayToPause.ToShortDateString()); } else if (DateTime.TryParse(decodedDay, TSAuthentication.GetLoginUser().CultureInfo, DateTimeStyles.None, out dayToPause)) { SlaPausedDay slaPausedDay = slaPausedDays.AddNewSlaPausedDay(); slaPausedDay.SlaTriggerId = trigger.SlaTriggerID; slaPausedDay.DateToPause = dayToPause.ToUniversalTime(); slaPausedDay.Collection.Save(); Settings.UserDB.WriteString("SlaTriggerDayToPauseParseDebug", TSAuthentication.GetLoginUser().CultureInfo + ": " + dayToPause.ToShortDateString()); } else { Settings.UserDB.WriteString("SlaTriggerDayToPauseParseDebug", "none"); } } Settings.UserDB.WriteInt("SlaTriggerWarningTime", trigger.WarningTime); Settings.UserDB.WriteInt("SlaTriggerInitialResponseTime", trigger.TimeInitialResponse); Settings.UserDB.WriteInt("SlaTriggerLastActionTime", trigger.TimeLastAction); Settings.UserDB.WriteInt("SlaTriggerClosedTime", trigger.TimeToClose); Settings.UserDB.WriteBool("SlaTriggerGroupViolations", cbGroupViolations.Checked); Settings.UserDB.WriteBool("SlaTriggerGroupWarnings", cbGroupWarnings.Checked); Settings.UserDB.WriteBool("SlaTriggerUserViolations", cbUserViolations.Checked); Settings.UserDB.WriteBool("SlaTriggerUserWarnings", cbUserWarnings.Checked); Settings.UserDB.WriteBool("SlaTriggerNoBusinessHours", rbNoBusinessHours.Checked); Settings.UserDB.WriteBool("SlaTriggerUseBusinessHours", rbBusinessHours.Checked); Settings.UserDB.WriteBool("SlaTriggerPauseOnOrganizationHolidays", cbPauseOnOrganizationHolidays.Checked); DialogResult = trigger.SlaTriggerID.ToString(); } catch (System.Data.SqlClient.SqlException sqlEx) { if (sqlEx.Message.Contains("duplicate key") && sqlEx.Message.Contains("SlaTriggers")) { ExceptionLogs.LogException(TSAuthentication.GetLoginUser(), sqlEx, "SlaTrigger.Save"); } else { throw sqlEx; } } return(true); }
protected override void OnLoad(EventArgs e) { if (!UserSession.CurrentUser.IsSystemAdmin) { Response.Write("Invalid Request"); Response.End(); return; } base.OnLoad(e); if (Request["SlaTriggerID"] != null) { _slaTriggerID = int.Parse(Request["SlaTriggerID"]); } if (Request["SlaLevelID"] != null) { _slaLevelID = int.Parse(Request["SlaLevelID"]); } if (Request["TicketTypeID"] != null) { _ticketTypeID = int.Parse(Request["TicketTypeID"]); } if (!IsPostBack) { LoadTimeZones(); SetTimes(Settings.UserDB.ReadInt("SlaTriggerWarningTime", 1440), Settings.UserDB.ReadInt("SlaTriggerInitialResponseTime", 60), Settings.UserDB.ReadInt("SlaTriggerLastActionTime", 60), Settings.UserDB.ReadInt("SlaTriggerClosedTime", 60)); cbGroupViolations.Checked = Settings.UserDB.ReadBool("SlaTriggerGroupViolations", true); cbGroupWarnings.Checked = Settings.UserDB.ReadBool("SlaTriggerGroupWarnings", true); cbUserViolations.Checked = Settings.UserDB.ReadBool("SlaTriggerUserViolations", true); cbUserWarnings.Checked = Settings.UserDB.ReadBool("SlaTriggerUserWarnings", true); rbBusinessHours.Checked = Settings.UserDB.ReadBool("SlaTriggerUseBusinessHours", true); rbCustomBusinessHours.Checked = !rbBusinessHours.Checked; cbPauseOnOrganizationHolidays.Checked = Settings.UserDB.ReadBool("SlaTriggerPauseOnOrganizationHolidays", true); daysToPauseList.Attributes.Add("onkeydown", "DeleteSelectedItems(event);"); } if (_slaTriggerID > -1) { _trigger = SlaTriggers.GetSlaTrigger(UserSession.LoginUser, _slaTriggerID); if (_trigger == null || SlaLevels.GetSlaLevel(UserSession.LoginUser, _trigger.SlaLevelID).OrganizationID != UserSession.LoginUser.OrganizationID) { Response.Write("Invalid Request"); Response.End(); return; } _slaLevelID = _trigger.SlaLevelID; _ticketTypeID = _trigger.TicketTypeID; if (!IsPostBack) { LoadTrigger(_trigger); } } else { DisableEnableCustomBusinessHours(rbBusinessHours.Checked, rbNoBusinessHours.Checked); } SlaLevel level = SlaLevels.GetSlaLevel(UserSession.LoginUser, _slaLevelID); TicketType type = TicketTypes.GetTicketType(UserSession.LoginUser, _ticketTypeID); if (level == null || type == null || level.OrganizationID != UserSession.LoginUser.OrganizationID || type.OrganizationID != UserSession.LoginUser.OrganizationID) { Response.Write("Invalid Request"); Response.End(); return; } lblSla.Text = level.Name; lblTicketType.Text = type.Name; if (!IsPostBack) { LoadSeverities(); } }