private static OneTableExcelConfigurationBuilder <ScenarioCampaignFailureExportModel> CreateExcelConfigurationBuilder(string[] weekDays, DayOfWeek tenantStartDayOfWeek)
        {
            var confBuilder = new OneTableExcelConfigurationBuilder <ScenarioCampaignFailureExportModel>()
                              .SetDefaultStyles();

            return(confBuilder
                   .OrderMembersAsDescribed()
                   .IgnoreNotDescribed()
                   .ForMember(m => m.ExternalCampaignId, o => o.Width(20))
                   .ForMember(m => m.CampaignName, o => o.Width(25))
                   .ForMember(m => m.SalesAreaGroupName, o => o.Width(25))
                   .ForMember(m => m.SalesAreaName, o => o.Width(25))
                   .ForMember(m => m.DurationSecs, o => o.Width(15))
                   .ForMember(m => m.MultipartNo, o => o.Width(13))
                   .ForMember(m => m.MultipartNo, o => o.Width(13))
                   .ForMember(m => m.StrikeWeightStartDate, o => o.Formatter(ReportFormatter.ConvertToShortDate).Header("StrikeWeight Start Date").Width(25))
                   .ForMember(m => m.StrikeWeightEndDate, o => o.Formatter(ReportFormatter.ConvertToShortDate).Header("StrikeWeight End Date").Width(25))
                   .ForMember(m => m.DayPartStartTime,
                              o => o.Formatter(ReportFormatter.ConvertToTime).Header("Daypart Start Time").Width(18))
                   .ForMember(m => m.DayPartEndTime, o => o.Formatter(ReportFormatter.ConvertToTime).Header("Daypart End Time").Width(18))
                   .ForMember(m => m.DayPartDays,
                              o => o.Header("Daypart Days")
                              .Formatter(m => DaypartDayFormattingUtilities.FormatWeekDays(weekDays, ((string)m), tenantStartDayOfWeek)).Width(15))
                   .ForMember(m => m.FailureTypeName, o => o.Width(25))
                   .ForMember(m => m.FailureCount, o => o.Width(15))
                   .ForMember(m => m.PassesEncounteringFailure, o => o.Header("Pass(s) Encountering Failure").Width(30)));
        }
        public static void GivenAFirstWeekDayThenOrderedArrayOfWeekdaysReturned(
            DayOfWeek startDayOfWeek,
            string[] expectedWeek)
        {
            // Act
            var result = DaypartDayFormattingUtilities.GetWeekDaysWithCustomStart(startDayOfWeek);

            // Assert
            _ = result.Should().Equal(expectedWeek);
        }
        public static void GivenValidInputValuesThenFormattedValueOfDaypartDayReturned(
            string[] weekDays,
            string daypartDays,
            DayOfWeek startDayOfWeek,
            string expectedOutput)
        {
            // Act
            var result = DaypartDayFormattingUtilities.FormatWeekDays(weekDays, daypartDays, startDayOfWeek);

            // Assert
            _ = result.Should().Be(expectedOutput, becauseArgs: null);
        }
        public static void GivenInputValuesAreNotCompatibleThenAnExceptionIsThrown()
        {
            // Arrange
            var    weekDays    = TestWeek;
            string daypartDays = "YYYY";

            // Assert
            var ex = Assert.Throws <ArgumentException>(() =>
            {
                //Act
                var result = DaypartDayFormattingUtilities.FormatWeekDays(weekDays, daypartDays, DayOfWeek.Monday);
            });

            _ = ex.Message.Should().Contain("Length", becauseArgs: null);
        }
        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 static void GivenAnInvalidSecondInputThenAnExceptionIsThrown()
        {
            // Arrange
            var    weekDays    = TestWeek;
            string daypartDays = null;

            Type       type         = typeof(DaypartDayFormattingUtilities);
            MethodBase myMethodBase = type.GetMethod(nameof(DaypartDayFormattingUtilities.FormatWeekDays));

            ParameterInfo[] parameterArray = myMethodBase.GetParameters();

            // Assert
            var ex = Assert.Throws <ArgumentException>(() =>
            {
                //Act
                var result = DaypartDayFormattingUtilities.FormatWeekDays(weekDays, daypartDays, DayOfWeek.Monday);
            });

            _ = ex.ParamName.Should().Be(parameterArray[1].Name, becauseArgs: null);
        }
        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);
        }