public static QualityOfServiceViewModel ToQualityOfServiceReportModel(BestInServiceReportingService service, int timezoneOffset)
        {
            //Retrieve header information
            var partner  = service.GetPartnerName();
            var instance = service.GetInstanceName();

            //Retrieve scores
            var scores = service.GetQualityOfServiceScores();

            //Take the lowest score for each category
            var userExperienceScore       = scores.Min(x => x.UserExperienceScore).GetValueOrDefault(100);
            var weeklyUserExperienceScore = scores.Min(x => x.WeeklyUserExperienceScore).GetValueOrDefault(100);
            var systemLoadScore           = scores.Min(x => x.SystemLoadScore).GetValueOrDefault(100);
            var weeklySystemLoadScore     = scores.Min(x => x.WeeklySystemLoadScore).GetValueOrDefault(100);
            var integrityScore            = scores.Min(x => x.IntegrityScore).GetValueOrDefault(100);
            var weeklyIntegrityScore      = scores.Min(x => x.WeeklyIntegrityScore).GetValueOrDefault(100);
            var uptimeScore       = scores.Min(x => x.UptimeScore).GetValueOrDefault(100);
            var weeklyUptimeScore = scores.Min(x => x.WeeklyUptimeScore).GetValueOrDefault(100);

            //Average the lowest category scores
            var overallWeeklyScore    = (weeklyUserExperienceScore + weeklySystemLoadScore + weeklyIntegrityScore + weeklyUptimeScore) / 4;
            var overallQuarterlyScore = (userExperienceScore + systemLoadScore + integrityScore + uptimeScore) / 4;

            //Retrieve grid data
            var monitoringInfo    = service.SummarizeBackupIntegrityInfo();
            var worstUptime       = service.ListWorstUptimeDays(timezoneOffset);
            var uptimePercentages = service.CalculateUptimePercentages();

            //Check DBCC monitoring configuration
            var dbccEnabled = service.IsDBCCMonitoringEnabled();

            //Construct view model
            var model = new QualityOfServiceViewModel
            {
                OverallScore   = (int)overallQuarterlyScore,
                WeeklyScore    = (int)overallWeeklyScore,
                PartnerName    = partner,
                InstanceName   = instance,
                BackupWindow   = BackupDBCCWindow,
                UserExperience = new ServerDetailCategory
                {
                    QuarterlyScore = (int)userExperienceScore,
                    WeeklyScore    = (int)weeklyUserExperienceScore,
                    Servers        = (from server in scores.OrderBy(x => x.UserExperienceScore).Take(10)
                                      select new ServerScore
                    {
                        ArtifactId = server.ServerArtifactId,
                        Name = server.ServerName.Truncate(30),
                        QuarterlyScore = (int)server.UserExperienceScore.GetValueOrDefault(100),
                        WeeklyScore = (int)server.WeeklyUserExperienceScore.GetValueOrDefault(100),
                        ServerUrl = UrlHelper.GetPageUrl(service, Names.Tab.UserExperience, "UserExperienceServer", $"Server={server.ServerArtifactId}")
                    })
                                     .ToList(),
                    PageUrl = UrlHelper.GetPageUrl(service, Names.Tab.UserExperience, "UserExperienceServer")
                },
                SystemLoad = new ServerDetailCategory
                {
                    QuarterlyScore = (int)systemLoadScore,
                    WeeklyScore    = (int)weeklySystemLoadScore,
                    Servers        = (from server in scores.OrderBy(x => x.SystemLoadScore).Take(10)
                                      select new ServerScore
                    {
                        ArtifactId = server.ServerArtifactId,
                        Name = server.ServerName.Truncate(30),
                        QuarterlyScore = (int)server.SystemLoadScore.GetValueOrDefault(100),
                        WeeklyScore = (int)server.WeeklySystemLoadScore.GetValueOrDefault(100),
                        ServerUrl = UrlHelper.GetPageUrl(service, Names.Tab.InfrastructurePerformance, "SystemLoadServer", $"Server={server.ServerArtifactId}")
                    }).ToList(),
                    PageUrl = UrlHelper.GetPageUrl(service, Names.Tab.InfrastructurePerformance, "SystemLoadServer")
                },
                Backup = new MaintenanceCategory
                {
                    Score                 = (int)integrityScore,
                    WeeklyScore           = (int)weeklyIntegrityScore,
                    BackupFrequencyScore  = monitoringInfo.BackupFrequencyScore,
                    DbccFrequencyScore    = monitoringInfo.DbccFrequencyScore,
                    BackupCoverageScore   = monitoringInfo.BackupCoverageScore,
                    DbccCoverageScore     = monitoringInfo.DbccCoverageScore,
                    MissedBackups         = monitoringInfo.MissedBackups,
                    MissedIntegrityChecks = monitoringInfo.MissedIntegrityChecks,
                    RPOScore              = monitoringInfo.RPOScore,
                    RTOScore              = monitoringInfo.RTOScore,
                    MaxDataLossMinutes    = monitoringInfo.MaxDataLossMinutes,
                    TimeToRecoverHours    = monitoringInfo.TimeToRecoverHours,
                    FailedDatabases       = monitoringInfo.FailedDatabases,
                    FailedServers         = monitoringInfo.FailedServers,
                    DBCCMonitoringEnabled = dbccEnabled,
                    PageUrl               = UrlHelper.GetPageUrl(service, Names.Tab.RecoverabilityIntegrity, "Backup")
                },
                Uptime = new AvailabilityCategory
                {
                    Score                  = (int)uptimeScore,
                    WeeklyScore            = (int)weeklyUptimeScore,
                    UptimePercentage       = uptimePercentages.QuarterlyUptimePercent,
                    WeeklyUptimePercentage = uptimePercentages.WeeklyUptimePercent,
                    DatesToReview          = (from day in worstUptime.OrderBy(x => x.ScoreDate).GroupBy(x => x.ScoreDate.Month)
                                              select new DateToReview
                    {
                        Date = day.First().ScoreDate.ToString("MMMM yyyy"),
                        HoursDown = day.Sum(x => x.HoursDown)
                    }).ToList(),
                    PageUrl = UrlHelper.GetPageUrl(service, Names.Tab.Uptime, "Uptime")
                },
            };

            return(model);
        }
        public void GetServiceIndicators_Test()
        {
            // Arrange
            var model = new QualityOfServiceViewModel
            {
                OverallScore   = 83,
                WeeklyScore    = 52,
                UserExperience = new ServerDetailCategory
                {
                    QuarterlyScore = 80,
                    WeeklyScore    = 80,
                    Servers        = new List <ServerScore>
                    {
                        new ServerScore {
                            ArtifactId     = 1,
                            Name           = "Server 1",
                            QuarterlyScore = 64,
                            WeeklyScore    = 64
                        }
                    }
                },
                SystemLoad = new ServerDetailCategory
                {
                    QuarterlyScore = 64,
                    WeeklyScore    = 64,
                    Servers        = new List <ServerScore>
                    {
                        new ServerScore {
                            ArtifactId     = 1,
                            Name           = "Server 1",
                            QuarterlyScore = 64,
                            WeeklyScore    = 64
                        }
                    }
                },
                Backup = new MaintenanceCategory
                {
                    Score = 64,
                    BackupCoverageScore   = 68,
                    BackupFrequencyScore  = 72,
                    DbccCoverageScore     = 60,
                    DbccFrequencyScore    = 72,
                    MissedBackups         = 1,
                    MissedIntegrityChecks = 1
                },
                Uptime = new AvailabilityCategory
                {
                    Score            = 79,
                    UptimePercentage = 85.0,
                    DatesToReview    = new List <DateToReview>
                    {
                        new DateToReview
                        {
                            Date      = DateTime.Now.ToShortDateString(),
                            HoursDown = 50
                        }
                    }
                }
            };

            var bis    = new Mock <BestInServiceReportingService>();
            var mapper = new Mock <BestInServiceMapper>();

            mapper.Setup(service => BestInServiceMapper.ToQualityOfServiceReportModel(bis.Object, 0)).Returns(model);


            // Act
            var serviceController = new ServiceQualityController();
            var indicators        = serviceController.GetServiceQualityIndicators();


            // Assert
            Assert.AreEqual(80, indicators.UserExperience.QuarterlyScore);
        }