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)
            });
        }
    }
Ejemplo n.º 2
0
            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);
            }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
    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();
        }
    }
Ejemplo n.º 5
0
        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");
            }
        }
Ejemplo n.º 6
0
    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);
        }
    }
Ejemplo n.º 7
0
        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);
                }
            }
        }
Ejemplo n.º 8
0
        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);
    }
Ejemplo n.º 10
0
    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();
        }
    }