public static void GivenAFirstWeekDayThenOrderedArrayOfWeekdaysReturned(
            DayOfWeek startDayOfWeek,
            string[] expectedWeek)
        {
            // Act
            var result = DaypartDayFormattingUtilities.GetWeekDaysWithCustomStart(startDayOfWeek);

            // Assert
            _ = result.Should().Equal(expectedWeek);
        }
        public Stream GenerateReport <T>(IReadOnlyCollection <ScenarioCampaignFailure> data, T snapshot, DayOfWeek tenantStartDayOfWeek)
            where T : IFaultTypesHolder, ICampaignsHolder
        {
            var results  = GenerateReportData(data, snapshot);
            var weekDays = DaypartDayFormattingUtilities.GetWeekDaysWithCustomStart(tenantStartDayOfWeek);

            var sheetName          = SheetName;
            var sheetConfiguration = CreateExcelConfigurationBuilder(weekDays, tenantStartDayOfWeek).BuildConfiguration();

            var stream = new MemoryStream();

            using (var reportBuilder = new OneTableExcelReportBuilder(new ExcelStyleApplier())
                                       .PredefineStyles(GamePlanReportStyles.AllPredefineStyles))
            {
                if (results.Count == 0)
                {
                    _ = reportBuilder.Sheet(sheetName, sheetBuilder =>
                    {
                        sheetBuilder.DataContent(results, sheetConfiguration);
                    });
                }
                else
                {
                    for (int i = 0, page = 1; i < results.Count; i += PageSize, page++)
                    {
                        // copy for lambda
                        int j = i;
                        _ = reportBuilder.Sheet(sheetName, sheetBuilder =>
                        {
                            sheetBuilder.DataContent(results.Skip(j).Take(PageSize).ToArray(), sheetConfiguration);
                        });

                        sheetName = $"{SheetName} ({page})";
                    }
                }

                reportBuilder.SaveAs(stream);
            }

            _ = stream.Seek(0, SeekOrigin.Begin);

            return(stream);
        }
        public List <ScenarioCampaignFailureModel> ExtendScenarioCampaignFailureModel(List <ScenarioCampaignFailure> scenarioCampaignFailures)
        {
            var scenarioCampaignFailureModelList = new List <ScenarioCampaignFailureModel>();

            if (scenarioCampaignFailures is null || !scenarioCampaignFailures.Any())
            {
                return(scenarioCampaignFailureModelList);
            }
            var campaigns    = new Dictionary <string, Campaign>();
            var failureTypes = new Dictionary <int, FaultType>();

            var failureTypeIds = scenarioCampaignFailures
                                 .Select(r => r.FailureType)
                                 .Distinct();
            var campaignIds = scenarioCampaignFailures
                              .Select(r => r.ExternalCampaignId)
                              .Distinct();

            var tenantStartDayOfWeek = _tenantSettingsRepository.GetStartDayOfWeek();
            var weekDays             = DaypartDayFormattingUtilities.GetWeekDaysWithCustomStart(tenantStartDayOfWeek);

            failureTypes = _functionalAreaRepository
                           .FindFaultTypes(failureTypeIds.ToList())
                           .ToDictionary(r => r.Id);
            campaigns = _campaignRepository
                        .FindByRefs(campaignIds.ToList())
                        .ToDictionary(r => r.ExternalId);

            foreach (var item in scenarioCampaignFailures)
            {
                var scenarioCampaignResultModel = new ScenarioCampaignFailureModel()
                {
                    Id = item.Id,
                    ExternalCampaignId        = item.ExternalCampaignId,
                    SalesAreaGroupName        = item.SalesAreaGroup,
                    SalesAreaName             = item.SalesArea,
                    DurationSecs              = (int)item.Length.ToTimeSpan().TotalSeconds,
                    MultipartNo               = item.MultipartNo,
                    StrikeWeightStartDate     = item.StrikeWeightStartDate.ToUniversalTime(),
                    StrikeWeightEndDate       = item.StrikeWeightEndDate.ToUniversalTime(),
                    DayPartStartTime          = item.DayPartStartTime,
                    DayPartEndTime            = item.DayPartEndTime,
                    DayPartDays               = DaypartDayFormattingUtilities.FormatWeekDays(weekDays, item.DayPartDays, tenantStartDayOfWeek),
                    FailureType               = item.FailureType,
                    FailureCount              = item.FailureCount,
                    PassesEncounteringFailure = item.PassesEncounteringFailure
                };
                if (item.ExternalCampaignId != null &&
                    campaigns.TryGetValue(item.ExternalCampaignId, out Campaign campaign))
                {
                    scenarioCampaignResultModel.CampaignName = campaign.Name;
                }
                if (item.FailureType != null &&
                    failureTypes.TryGetValue(item.FailureType, out FaultType faultType))
                {
                    scenarioCampaignResultModel.FailureTypeName
                        = faultType.Description?.FirstOrDefault(e => e.Key == "ENG").Value;
                }
                scenarioCampaignFailureModelList.Add(scenarioCampaignResultModel);
            }
            return(scenarioCampaignFailureModelList);
        }