public SalesAreaProfile() { CreateMap <Tuple <SalesArea, IReadOnlyCollection <Demographic> >, AgSalesAreaPtr>() .ForMember(ags => ags.ShortName, exp => exp.MapFrom(s => s.Item1.ShortName)) .ForMember(ags => ags.CurrencyCode, exp => exp.MapFrom(s => s.Item1.CurrencyCode)) .ForMember(ags => ags.SalesAreaNo, exp => exp.MapFrom(s => s.Item1.CustomId)) .ForMember(ags => ags.RatingSalesAreaNo, exp => exp.MapFrom(s => s.Item1.CustomId)) .ForMember(ags => ags.SalesAreaNoRequired, exp => exp.MapFrom(s => s.Item1.CustomId)) .ForMember(ags => ags.BaseDemoNo, exp => exp.MapFrom( s => (s.Item2.FirstOrDefault(m => m.ExternalRef.Equals(s.Item1.BaseDemographic1)).Id))) .ForMember(ags => ags.BaseDemoNo2, exp => exp.MapFrom( s => (s.Item2.FirstOrDefault(m => m.ExternalRef.Equals(s.Item1.BaseDemographic2)).Id))) .ForMember(ags => ags.StartTime, exp => exp.MapFrom( s => AgConversions.ToAgTimeAsHHMMSS(s.Item1.StartOffset.ToTimeSpan()))) .ForMember(ags => ags.NbrHours, exp => exp.MapFrom( s => Convert.ToInt32(s.Item1.DayDuration.BclCompatibleTicks / NodaConstants.TicksPerHour))); CreateMap <Tuple <string, List <SalesArea> >, AgSalesArea>() .ForMember(d => d.SalesArea, m => m.MapFrom(args => args.Item2.Any(s => s.Name == args.Item1) ? args.Item2.First(s => s.Name == args.Item1).CustomId : -1)); CreateMap <object, AgSalesAreaRef>().ForMember(ags => ags.SalesAreaNo, exp => exp.MapFrom(i => Convert.ToInt32(i))); CreateMap <SalesArea, SalesAreaModel>().ForMember(salesAreaModel => salesAreaModel.Uid, expression => expression.MapFrom(salesArea => salesArea.Id)); CreateMap <CreateSalesAreaModel, SalesArea>(); }
//This is temporary solution to identify DayPart by it's DOW and Time //Example of dowTimeString: "2100-2659(Mon-Fri)" //Will be removed in scope of technical debt (XGGT-16613) and DayParts will receive identifier guid public static DayPart GetDayPartByDowTimeString(List <DayPart> dayParts, string dowTimeString) { if (dayParts is null || dowTimeString is null || dowTimeString == "NotSupplied" || dowTimeString.Length < 18) { return(null); } var AgFromTime = dowTimeString.Substring(0, 4); var AgToTime = dowTimeString.Substring(5, 4); var firstDOW = dowTimeString.Substring(10, 3); var lastDOW = dowTimeString.Substring(14, 3); var fromTime = AgConversions.ParseTotalHHMMSSFormat(AgFromTime + "00", false).ToString(@"hh\:mm"); var toTime = AgConversions.ParseTotalHHMMSSFormat(AgToTime + "59", false).ToString(@"hh\:mm"); return(dayParts.Where(d => d.Timeslices.Any(t => t.FromTime == fromTime && t.ToTime == toTime && t.DowPattern.Contains(firstDOW) && t.DowPattern.Contains(lastDOW))) .FirstOrDefault()); }
/// <summary>Loads the ag time bands.</summary> /// <param name="timeBands">The time bands.</param> /// <returns></returns> /// <exception cref="ArgumentException"> /// Value {timeBand.FromTime} of 'FromTime' of {nameof(Timeslice)} cannot be parsed to {nameof(TimeSpan)} /// or /// Value {timeBand.ToTime} of 'ToTime' of {nameof(Timeslice)} cannot be parsed to {nameof(TimeSpan)} /// </exception> protected AgTimeBands LoadAgTimeBands(IEnumerable <Timeslice> timeBands) { var mapped = new AgTimeBands(); foreach (var timeBand in timeBands) { if (!TimeSpan.TryParse(timeBand.FromTime, out TimeSpan startTime)) { throw new ArgumentException( $"Value {timeBand.FromTime} of '{nameof(Timeslice.FromTime)}' of {nameof(Timeslice)} cannot be parsed to {nameof(TimeSpan)}"); } if (!TimeSpan.TryParse(timeBand.ToTime, out TimeSpan endTime)) { throw new ArgumentException( $"Value {timeBand.ToTime} of '{nameof(Timeslice.ToTime)}' of {nameof(Timeslice)} cannot be parsed to {nameof(TimeSpan)}"); } var days = timeBand.DowPattern.GetDaysOfWeek(); mapped.Add(new AgTimeBand { StartTime = startTime.ToString(TimeFormat), EndTime = endTime.ToString(TimeFormat), Days = AgConversions.ToAgDaysOfWeekAsInt(days) }); } return(mapped); }
private static void AddRestrictionForParentProgrammeCategory( Dictionary <string, ProgrammeDictionary> programmeDictionaries, DateTime runEndDate, AgRestriction agRestriction, Restriction restriction, SalesArea salesArea, List <AgRestriction> agRestrictions, string clashCode, Dictionary <string, ProgrammeCategoryHierarchy> programmeCategoriesExternalRefIndex, Dictionary <int, ProgrammeCategoryHierarchy> programmeCategoriesIdIndex, int programmeCategoryId) { if (!programmeCategoriesIdIndex.TryGetValue(programmeCategoryId, out var category) || string.IsNullOrEmpty(category.ParentExternalRef)) { return; } var parentCategoryNum = programmeCategoriesExternalRefIndex.TryGetValue(category.ParentExternalRef, out var parentCategory) ? parentCategory.Id : 0; if (parentCategoryNum == 0) { return; } var agRestrictionClone = agRestriction.Clone(); agRestrictionClone.ProductCode = restriction.ProductCode; agRestrictionClone.ClashCode = clashCode; agRestrictionClone.CopyCode = string.IsNullOrWhiteSpace(restriction.ClockNumber) ? "0" : restriction.ClockNumber; agRestrictionClone.ClearanceCode = restriction.ClearanceCode ?? ""; agRestrictionClone.SalesAreaNo = salesArea?.CustomId ?? 0; agRestrictionClone.ProgCategoryNo = parentCategoryNum; agRestrictionClone.ProgrammeNo = !string.IsNullOrWhiteSpace(restriction.ExternalProgRef) && programmeDictionaries.TryGetValue(restriction.ExternalProgRef.ToUpper(), out var programme) ? programme.Id : 0; agRestrictionClone.StartDate = restriction.StartDate.ToString("yyyyMMdd"); agRestrictionClone.EndDate = restriction.EndDate.HasValue ? restriction.EndDate?.ToString("yyyyMMdd") : runEndDate.AddYears(10).ToString("yyyyMMdd"); agRestrictionClone.IndexType = restriction.IndexType; agRestrictionClone.IndexThreshold = restriction.IndexThreshold; agRestrictionClone.PublicHolidayIndicator = AgConversions.ToAgIncludeExcludeEither(restriction.PublicHolidayIndicator); agRestrictionClone.SchoolHolidayIndicator = AgConversions.ToAgIncludeExcludeEither(restriction.SchoolHolidayIndicator); agRestrictionClone.RestrictionType = Convert.ToInt32(restriction.RestrictionType); agRestrictionClone.RestrictionDays = AgConversions.ToAgDaysAsInt(restriction.RestrictionDays); agRestrictionClone.StartTime = restriction.StartTime?.ToString("hhmmss") ?? "0"; agRestrictionClone.EndTime = restriction.EndTime?.ToString("hhmmss") ?? "995959"; agRestrictionClone.TimeToleranceMinsBefore = restriction.TimeToleranceMinsBefore; agRestrictionClone.TimeToleranceMinsAfter = restriction.TimeToleranceMinsAfter; agRestrictionClone.ProgClassCode = restriction.ProgrammeClassification ?? ""; agRestrictionClone.ProgClassFlag = restriction.ProgrammeClassificationIndicator.ToString(); agRestrictionClone.LiveBroadcastFlag = restriction.LiveProgrammeIndicator.ToString(); agRestrictions.Add(agRestrictionClone); }
public void PerformPassDefaultDataPopulation_ShouldReturnRunDateTimeValues_WhenPassDateTimeValuesIsNull() { DateTime? nulldate = null; TimeSpan? nullTimeSpan = null; const string nullString = null; //Arrange _passes[0].PassSalesAreaPriorities = _fixture.Build <PassSalesAreaPriority>() .With(r => r.EndDate, nulldate) .With(r => r.StartDate, nulldate) .With(r => r.StartTime, nullTimeSpan) .With(r => r.EndTime, nullTimeSpan) .With(r => r.DaysOfWeek, nullString) .Create(); var expected = _run; //Act var result = _passes.ToAgPassDefault(_scenario, _run, _tenantSettings); //Assert var valueToTest = expected.EndTime.Minutes == 0 && expected.EndTime.Hours == 0 && expected.EndTime.Seconds == 0 ? "995959" : AgConversions.ToAgTimeAsHHMMSS(expected.EndTime); _ = expected.EndDate.ToString("yyyyMMdd").Should().Be(result?.AgPassDefaults[0]?.EndDate, null); _ = expected.StartDate.ToString("yyyyMMdd").Should().Be(result?.AgPassDefaults[0]?.StartDate, null); _ = valueToTest.Should().Be(result?.AgPassDefaults[0]?.EndTime, null); _ = AgConversions.ToAgTimeAsHHMMSS(expected.StartTime).Should().Be(result?.AgPassDefaults[0]?.StartTime, null); _ = AgConversions.ToAgDaysAsInt(_defaultDaysOfWeek).Should().Be(result?.AgPassDefaults[0]?.DaysOfWeek, null); }
public SponsorshipProfile() { _ = CreateMap <Sponsorship, SponsorshipEntities.Sponsorship>() .ReverseMap(); _ = CreateMap <SponsorshipItem, SponsorshipEntities.SponsorshipItem>() .ReverseMap(); _ = CreateMap <AdvertiserExclusivity, SponsorshipEntities.SponsorshipAdvertiserExclusivity>() .ReverseMap(); _ = CreateMap <ClashExclusivity, SponsorshipEntities.SponsorshipClashExclusivity>() .ReverseMap(); _ = CreateMap <SponsoredItem, SponsorshipEntities.SponsoredItem>() .ReverseMap(); CreateMap <string, SponsorshipEntities.SponsorshipItemSalesArea>() .ForMember(dest => dest.SalesAreaId, opts => opts.FromEntityCache(opt => opt.Entity <SalesArea>(x => x.Id))) .ReverseMap() .FromEntityCache(x => x.SalesAreaId, opt => opt.Entity <SalesArea>(x => x.Name)); _ = CreateMap <SponsoredDayPart, SponsorshipEntities.SponsoredDayPart>() .ForMember(d => d.DaysOfWeek, opt => opt.MapFrom(s => AgConversions.ToDaysOfWeek(s.DaysOfWeek))) .ReverseMap() .ForMember(d => d.DaysOfWeek, opt => opt.MapFrom(s => s.DaysOfWeek.Select(x => x.ToString()))); CreateMap <SponsorshipRestrictionLevel, Entities.SponsorshipRestrictionLevel>() .ConvertUsing(src => (Entities.SponsorshipRestrictionLevel)src); CreateMap <Entities.SponsorshipRestrictionLevel, SponsorshipRestrictionLevel>() .ConvertUsing(src => (SponsorshipRestrictionLevel)src); CreateMap <Entities.SponsorshipRestrictionLevel, SponsorshipRestrictionLevel>() .ConvertUsing(src => (SponsorshipRestrictionLevel)src); CreateMap <SponsorshipCalculationType, Entities.SponsorshipCalculationType>() .ConvertUsing(src => (Entities.SponsorshipCalculationType)src); CreateMap <Entities.SponsorshipCalculationType, SponsorshipCalculationType>() .ConvertUsing(src => (SponsorshipCalculationType)src); CreateMap <Entities.SponsorshipCalculationType, SponsorshipCalculationType>() .ConvertUsing(src => (SponsorshipCalculationType)src); CreateMap <SponsorshipRestrictionType, Entities.SponsorshipRestrictionType>() .ConvertUsing(src => (Entities.SponsorshipRestrictionType)src); CreateMap <Entities.SponsorshipRestrictionType?, SponsorshipRestrictionType?>() .ConvertUsing(src => (SponsorshipRestrictionType?)src); CreateMap <Entities.SponsorshipRestrictionType?, SponsorshipRestrictionType?>() .ConvertUsing(src => (SponsorshipRestrictionType?)src); CreateMap <SponsorshipApplicability, Entities.SponsorshipApplicability>() .ConvertUsing(src => (Entities.SponsorshipApplicability)src); CreateMap <Entities.SponsorshipApplicability?, SponsorshipApplicability?>() .ConvertUsing(src => (SponsorshipApplicability?)src); CreateMap <Entities.SponsorshipApplicability?, SponsorshipApplicability?>() .ConvertUsing(src => (SponsorshipApplicability?)src); }
public SponsoredDayPartProfile() { CreateMap <SponsoredDayPart, AgSponsorshipDayPart>() .ForMember(d => d.StartTime, m => m.MapFrom(src => AgConversions.ToAgTimeAsHHMMSS(src.StartTime))) .ForMember(d => d.EndTime, m => m.MapFrom(src => AgConversions.ToAgTimeAsHHMMSS(src.EndTime))) .ForMember(d => d.Days, m => m.MapFrom(src => AgConversions.ToAgDaysAsInt(src.DaysOfWeek))); CreateMap <CreateSponsoredDayPartModel, SponsoredDayPart>() .ForMember(d => d.EndTime, m => m.PreCondition(src => src.EndTime.HasValue)); }
public TenantSettingsProfile() { CreateMap <TenantSettings, TenantSettingsEntity>() .ForMember(dest => dest.PeakStartTime, opt => opt.MapFrom(src => AgConversions.ParseHHMMSSFormat(src.PeakStartTime))) .ForMember(dest => dest.PeakEndTime, opt => opt.MapFrom(src => AgConversions.ParseHHMMSSFormat(src.PeakEndTime))) .ForMember(dest => dest.MidnightStartTime, opt => opt.MapFrom(src => AgConversions.ParseTotalHHMMSSFormat(src.MidnightStartTime, true))) .ForMember(dest => dest.MidnightEndTime, opt => opt.MapFrom(src => AgConversions.ParseTotalHHMMSSFormat(src.MidnightEndTime, true))) .ReverseMap() .ForMember(dest => dest.PeakStartTime, opt => opt.MapFrom(src => AgConversions.ToAgTimeAsHHMMSS(src.PeakStartTime))) .ForMember(dest => dest.PeakEndTime, opt => opt.MapFrom(src => AgConversions.ToAgTimeAsHHMMSS(src.PeakEndTime))) .ForMember(dest => dest.MidnightStartTime, opt => opt.MapFrom(src => AgConversions.ToAgTimeAsTotalHHMMSS(src.MidnightStartTime))) .ForMember(dest => dest.MidnightEndTime, opt => opt.MapFrom(src => AgConversions.ToAgTimeAsTotalHHMMSS(src.MidnightEndTime))); CreateMap <RunRestrictions, RunRestrictionsEntity>() .ReverseMap(); CreateMap <MinimumRunSizeDocumentRestriction, MinimumRunSizeDocumentRestrictionEntity>() .ReverseMap(); CreateMap <MinimumDocumentRestriction, MinimumDocumentRestrictionEntity>() .ReverseMap(); CreateMap <RunEventSettings, RunEventSettingsEntity>() .ReverseMap(); CreateMap <HTTPNotificationSettings, HTTPNotificationSettingsEntity>() .ReverseMap(); CreateMap <HTTPMethodSettings, HTTPMethodSettingsEntity>() .ReverseMap(); CreateMap <Feature, FeatureEntity>() .ForMember(dest => dest.IdValue, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.Id, opt => opt.Ignore()) .ReverseMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.IdValue)) .ForMember(dest => dest.Settings, opt => opt.MapFrom(src => src.Settings.ToDictionary(x => x.Key, x => (object)x.Value))) ; CreateMap <WebhookSettings, WebhookSettingsEntity>() .ReverseMap(); }
public void PerformPassDefaultDataPopulation_ShouldReturnPassDateTimeValues_WhenPassDateTimeValuesIsNotNull() { //Arrange var expected = _fixture.Build <PassSalesAreaPriority>() .With(r => r.EndDate, DateTime.Now.AddDays(1)) .With(r => r.StartDate, DateTime.Now) .With(r => r.StartTime, new TimeSpan(21, 30, 0)) .With(r => r.EndTime, new TimeSpan(22, 30, 0)) .With(r => r.DaysOfWeek, "1000000") .Create(); _passes[0].PassSalesAreaPriorities = expected; //Act var result = _passes.ToAgPassDefault(_scenario, _run, _tenantSettings); //Assert _ = expected?.EndDate?.ToString("yyyyMMdd").Should().Be(result?.AgPassDefaults[0]?.EndDate, null); _ = expected.StartDate?.ToString("yyyyMMdd").Should().Be(result?.AgPassDefaults[0]?.StartDate, null); _ = AgConversions.ToAgTimeAsHHMMSS((TimeSpan)expected.EndTime).Should().Be(result?.AgPassDefaults[0]?.EndTime, null); _ = AgConversions.ToAgTimeAsHHMMSS((TimeSpan)expected.StartTime).Should().Be(result?.AgPassDefaults[0]?.StartTime, null); _ = AgConversions.ToAgDaysAsInt(expected.DaysOfWeek).Should().Be(result?.AgPassDefaults[0]?.DaysOfWeek, null); }
private static AgBreak LoadAgBreak( Tuple <BreakWithProgramme, IReadOnlyCollection <SalesArea>, IReadOnlyCollection <Demographic>, List <int>, int, AgBreak> source, IMapper mapper) { var(breakModel, salesAreas, demographics, programmeCategories, uniqueId, agBreak) = source; var brk = breakModel.Break; var salesArea = salesAreas?.FirstOrDefault(s => s.Name == brk.SalesArea); var salesAreaId = salesArea?.CustomId ?? 0; var agProgCategories = new AgProgCategories(); if (programmeCategories != null) { agProgCategories.AddRange(programmeCategories); } var agBreakClone = agBreak.Clone(); agBreakClone.SalesAreaNo = salesAreaId; agBreakClone.SalesAreaId = salesAreaId; DecomposeScheduledDate(brk.ScheduledDate); void DecomposeScheduledDate(DateTime scheduledDate) { agBreakClone.ScheduledDate = scheduledDate.ToString("yyyyMMdd"); agBreakClone.NominalTime = scheduledDate.ToString("HHmmss"); agBreakClone.DayNumber = scheduledDate.DayOfWeek == 0 ? 7 : (int)scheduledDate.DayOfWeek; } agBreakClone.BroadcastDate = brk.BroadcastDate.HasValue ? brk.BroadcastDate.Value.ToString("yyyyMMdd") : "0"; agBreakClone.ClockHour = brk.ClockHour ?? 0; agBreakClone.BreakNo = brk.CustomId; agBreakClone.ExternalNo = brk.ExternalBreakRef; agBreakClone.Uid = uniqueId; agBreakClone.Duration = (int)brk.Duration.ToTimeSpan().TotalSeconds; agBreakClone.BreakPrice = brk.BreakPrice; agBreakClone.FloorRate = brk.FloorRate; agBreakClone.PositionInProg = breakModel.PositionInProgram.ToString(); agBreakClone.ProgNo = breakModel.ProgrammeNo; agBreakClone.ProgEventNo = breakModel.PrgtNo; agBreakClone.EpisNo = breakModel.EpisodeNumber.GetValueOrDefault(); agBreakClone.BreakTypeCode = brk.BreakType.Substring(0, 2).ToUpperInvariant(); agBreakClone.AgSalesAreaPtrRef = agBreak.AgSalesAreaPtrRef.Clone(); agBreakClone.AgSalesAreaPtrRef.SalesAreaNo = salesAreaId; var availInSec = (int)brk.OptimizerAvail.ToTimeSpan().TotalSeconds; agBreakClone.AgRegionalBreaks = new AgRegionalBreaks { new AgRegionalBreak { OpenAvail = availInSec, TregNo = salesAreaId } }; agBreakClone.AgAvals = new AgAvals { new AgAval { OpenAvail = availInSec, SalesAreaNo = salesAreaId, ReserveDuration = (int)brk.ReserveDuration.ToTimeSpan().TotalSeconds } }; agBreakClone.AgProgCategories = agProgCategories; agBreakClone.AgPredictions = mapper.Map <AgPredictions>( Tuple.Create(breakModel.Predictions, salesArea, demographics) ); agBreakClone.Solus = AgConversions.ToAgBooleanAsString(brk.Solus); agBreakClone.PremiumCategory = brk.PremiumCategory ?? string.Empty; agBreakClone.AllowSplit = AgConversions.ToAgBooleanAsString(brk.AllowSplit); agBreakClone.NationalRegionalSplit = AgConversions.ToAgBooleanAsString(brk.NationalRegionalSplit); agBreakClone.ExcludePackages = AgConversions.ToAgBooleanAsString(brk.ExcludePackages); agBreakClone.BonusAllowed = AgConversions.ToAgBooleanAsString(brk.BonusAllowed); agBreakClone.LongForm = AgConversions.ToAgBooleanAsString(brk.LongForm); return(agBreakClone); }
private static AgSponsorshipsSerialization ToAgSponsorships( List <Sponsorship> sponsorships, IReadOnlyCollection <Programme> programmes, IReadOnlyCollection <ProgrammeDictionary> programmeDictionaries, List <SalesArea> salesAreas, IMapper mapper) { var serialiser = new AgSponsorshipsSerialization(); if (sponsorships is null) { return(serialiser.MapFrom(new List <AgSponsorship>())); } var sponsorshipList = sponsorships .Where(sponsorship => sponsorship.SponsoredItems != null && sponsorship.SponsoredItems.Any(sponsoredItem => sponsoredItem.SponsorshipItems.Any(sponsorshipItem => sponsorship.RestrictionLevel == SponsorshipRestrictionLevel.TimeBand || (sponsorship.RestrictionLevel == SponsorshipRestrictionLevel.Programme && programmes.Any(p => p.ProgrammeName == sponsorshipItem.ProgrammeName) ) ) ) ) .ToImmutableList(); var agSponsorships = new ConcurrentBag <AgSponsorship>(); Parallel.ForEach(sponsorshipList, sponsorship => { var sponsorshipRestrictionLevel = sponsorship.RestrictionLevel; sponsorship.SponsoredItems.ForEach(sponsoredItem => { var agSponsorship = new AgSponsorship() { CalculationType = (int)sponsoredItem.CalculationType, RestrictionType = sponsoredItem.RestrictionType.HasValue ? (int)sponsoredItem.RestrictionType.Value : -1, RestrictionValue = sponsoredItem.RestrictionValue.HasValue ? sponsoredItem.RestrictionValue.Value : -1, Applicability = sponsoredItem.Applicability.HasValue ? (int)sponsoredItem.Applicability.Value : -1, SponsoredItems = new List <AgSponsoredItems>() }; agSponsorship.AdvertiserExclusivities = mapper.Map <List <AgAdvertiserExclusivity> >(sponsoredItem.AdvertiserExclusivities ?? new List <AdvertiserExclusivity>()); agSponsorship.ClashExclusivities = mapper.Map <List <AgClashExclusivity> >(sponsoredItem.ClashExclusivities ?? new List <ClashExclusivity>()); agSponsorship.ProductsCode = mapper.Map <List <AgProductCode> >(sponsoredItem.Products ?? new List <string>()); if (sponsoredItem.SponsorshipItems != null) { sponsoredItem.SponsorshipItems .Where(sponsorshipItem => sponsorshipRestrictionLevel == SponsorshipRestrictionLevel.TimeBand || (sponsorshipRestrictionLevel == SponsorshipRestrictionLevel.Programme && programmes.Any(p => p.ProgrammeName == sponsorshipItem.ProgrammeName)) ) .ToList() .ForEach(sponsorshipItem => { var programmeExternalReference = programmes.Any(p => p.ProgrammeName == sponsorshipItem.ProgrammeName) ? programmes.First(p => p.ProgrammeName == sponsorshipItem.ProgrammeName).ExternalReference : ""; var programmeNo = programmeDictionaries.FirstOrDefault(p => p.ExternalReference == programmeExternalReference)?.Id ?? 0; var agSponsoredItem = new AgSponsoredItems() { SalesAreas = new List <AgSalesArea>(), ProgramNumber = programmeNo, StartDate = AgConversions.ToAgDateYYYYMMDDAsString(sponsorshipItem.StartDate), EndDate = AgConversions.ToAgDateYYYYMMDDAsString(sponsorshipItem.EndDate), }; agSponsoredItem.DayParts = mapper.Map <List <AgSponsorshipDayPart> >(sponsorshipItem.DayParts ?? new List <SponsoredDayPart>()); if (sponsorshipItem.SalesAreas != null) { sponsorshipItem.SalesAreas .ToList() .ForEach(salesAreaName => agSponsoredItem.SalesAreas.Add(mapper.Map <AgSalesArea>(Tuple.Create(salesAreaName, salesAreas)))); } agSponsorship.SponsoredItems.Add(agSponsoredItem); }); } agSponsorship.SponsoredItemsCount = agSponsorship.SponsoredItems.Count; agSponsorships.Add(agSponsorship); }); }); return(serialiser.MapFrom(agSponsorships.ToList())); }
/// <summary>Generates the report data.</summary> /// <param name="source">The source.</param> /// <returns></returns> public IReadOnlyCollection <RecommendationExtendedModel> GenerateReportData(IReadOnlyCollection <Recommendation> source) { if ((source?.Count ?? 0) == 0) { return(Array.Empty <RecommendationExtendedModel>()); } PrepareRelatedData(source); var tenantSettings = ResolveTenantSettings(); var startDayOfWeek = tenantSettings?.StartDayOfWeek ?? DayOfWeek.Monday; var peakStartTime = AgConversions.ParseTotalHHMMSSFormat(tenantSettings?.PeakStartTime ?? DefaultTimeFormat); var peakEndTime = AgConversions.ParseTotalHHMMSSFormat(tenantSettings?.PeakEndTime ?? DefaultTimeFormat); var midnightStartTime = new TimeSpan(0, 0, 0); var midnightEndTime = new TimeSpan(6, 0, 0); return(source .AsParallel() .Select(item => { var recommendationExtendedModel = new RecommendationExtendedModel(); _ = _mapper.Map(item, recommendationExtendedModel); recommendationExtendedModel.StartDayOfWeek = startDayOfWeek.ToString(); recommendationExtendedModel.WeekCommencingDate = GetWeekCommencingDate(startDayOfWeek, item.StartDateTime); recommendationExtendedModel.DayPart = GetDayPart(item.StartDateTime, peakStartTime, peakEndTime, midnightStartTime, midnightEndTime); recommendationExtendedModel.StartDate = item.StartDateTime.Date; recommendationExtendedModel.StartTime = item.StartDateTime.TimeOfDay; recommendationExtendedModel.EndDate = item.EndDateTime.Date; recommendationExtendedModel.EndTime = item.EndDateTime.TimeOfDay; recommendationExtendedModel.SpotLengthInSec = item.SpotLength.TotalSeconds; if (String.Equals(item.Processor, SmoothProcessorName, StringComparison.OrdinalIgnoreCase)) { recommendationExtendedModel.ExternalBreakNo = String.IsNullOrEmpty(item.ExternalBreakNo) ? Globals.UnplacedBreakString : recommendationExtendedModel.ExternalBreakNo; } var campaign = ResolveCampaign(item); if (!(campaign is null)) { recommendationExtendedModel.SalesAreaGroupName = campaign.SalesAreaCampaignTarget? .Select(sact => sact.SalesAreaGroup) .FirstOrDefault(sag => sag?.SalesAreas?.Any(sa => sa.Equals(item.SalesArea)) ?? false) ?.GroupName; } if (recommendationExtendedModel.SalesAreaGroupName is null) { var salesArea = ResolveSalesArea(item); recommendationExtendedModel.SalesAreaGroupName = salesArea?.TargetAreaName; } var demographic = ResolveDemographic(item); if (!(demographic is null)) { recommendationExtendedModel.DemographicName = demographic.Name; } var product = ResolveProduct(item); if (!(product is null)) { recommendationExtendedModel.ClientName = product.AgencyName; recommendationExtendedModel.ProductName = product.Name; var childClash = ResolveClash(item); if (!(childClash is null)) { recommendationExtendedModel.ClashName = childClash.Description; var parentClash = ResolveParentClash(item); if (!(parentClash is null)) { recommendationExtendedModel.ParentClashName = parentClash.Description; } } } return recommendationExtendedModel; }).ToArray()); }
private List <AgRestriction> LoadAgRestriction(List <Restriction> restrictions, List <ProgrammeCategoryHierarchy> programmeCategories, IReadOnlyCollection <ProgrammeDictionary> programmeDictionaries, List <SalesArea> allSalesAreas, DateTime runEndDate, List <Clash> allClashes, AgRestriction agRestriction) { var agRestrictions = new List <AgRestriction>(); var salesAreaNamesIndex = allSalesAreas.ToDictionary(s => s.Name); var programmeDictionaryExternalRefsIndex = programmeDictionaries.ToDictionary(c => c.ExternalReference.ToUpper()); var programmeCategoryIdsIndex = new Dictionary <int, ProgrammeCategoryHierarchy>(); var programmeCategoryNamesIndex = new Dictionary <string, ProgrammeCategoryHierarchy>(); var programmeCategoryExternalRefsIndex = new Dictionary <string, ProgrammeCategoryHierarchy>(); var clashesExternalRefsIndex = new Dictionary <string, Clash>(); var clashesParentExternalIdentifiersIndex = new Dictionary <string, List <Clash> >(); foreach (var programmeCategory in programmeCategories) { programmeCategoryIdsIndex.Add(programmeCategory.Id, programmeCategory); programmeCategoryNamesIndex.Add(programmeCategory.Name.ToUpper(), programmeCategory); if (!string.IsNullOrWhiteSpace(programmeCategory.ExternalRef)) { programmeCategoryExternalRefsIndex.Add(programmeCategory.ExternalRef, programmeCategory); } } foreach (var clash in allClashes) { clashesExternalRefsIndex.Add(clash.Externalref, clash); if (string.IsNullOrWhiteSpace(clash.ParentExternalidentifier)) { continue; } if (!clashesParentExternalIdentifiersIndex.ContainsKey(clash.ParentExternalidentifier)) { clashesParentExternalIdentifiersIndex.Add(clash.ParentExternalidentifier, new List <Clash>()); } clashesParentExternalIdentifiersIndex[clash.ParentExternalidentifier].Add(clash); } foreach (var restriction in restrictions) { List <SalesArea> salesAreas; if (restriction.SalesAreas == null || !restriction.SalesAreas.Any()) { salesAreas = allSalesAreas; } else { salesAreas = new List <SalesArea>(); foreach (var item in restriction.SalesAreas) { if (salesAreaNamesIndex.TryGetValue(item, out SalesArea area)) { salesAreas.Add(area); } } } foreach (var salesArea in salesAreas) { if (restriction.RestrictionBasis == RestrictionBasis.Clash) { IEnumerable <Clash> clashes = Enumerable.Empty <Clash>(); if (clashesParentExternalIdentifiersIndex.TryGetValue(restriction.ClashCode, out var childClashes)) { clashes = clashes.Union(childClashes); } if (clashesExternalRefsIndex.TryGetValue(restriction.ClashCode, out var item)) { clashes = clashes.Append(item); } foreach (var clash in clashes) { var agRestrictionClone = agRestriction.Clone(); agRestrictionClone.ProductCode = restriction.ProductCode; agRestrictionClone.ClashCode = clash.Externalref; agRestrictionClone.CopyCode = string.IsNullOrWhiteSpace(restriction.ClockNumber) ? "0" : restriction.ClockNumber; agRestrictionClone.ClearanceCode = restriction.ClearanceCode ?? ""; agRestrictionClone.SalesAreaNo = salesArea?.CustomId ?? 0; agRestrictionClone.ProgCategoryNo = !string.IsNullOrWhiteSpace(restriction.ProgrammeCategory) && programmeCategoryNamesIndex.TryGetValue(restriction.ProgrammeCategory.ToUpper(), out var category) ? category.Id : 0; agRestrictionClone.ProgrammeNo = !string.IsNullOrWhiteSpace(restriction.ExternalProgRef) && programmeDictionaryExternalRefsIndex.TryGetValue(restriction.ExternalProgRef.ToUpper(), out var programme) ? programme.Id : 0; agRestrictionClone.StartDate = restriction.StartDate.ToString("yyyyMMdd"); agRestrictionClone.EndDate = restriction.EndDate.HasValue ? restriction.EndDate?.ToString("yyyyMMdd") : runEndDate.AddYears(10).ToString("yyyyMMdd"); agRestrictionClone.IndexType = restriction.IndexType; agRestrictionClone.IndexThreshold = restriction.IndexThreshold; agRestrictionClone.PublicHolidayIndicator = AgConversions.ToAgIncludeExcludeEither(restriction.PublicHolidayIndicator); agRestrictionClone.SchoolHolidayIndicator = AgConversions.ToAgIncludeExcludeEither(restriction.SchoolHolidayIndicator); agRestrictionClone.RestrictionType = Convert.ToInt32(restriction.RestrictionType); agRestrictionClone.RestrictionDays = AgConversions.ToAgDaysAsInt(restriction.RestrictionDays); agRestrictionClone.StartTime = restriction.StartTime?.ToString("hhmmss") ?? "0"; agRestrictionClone.EndTime = restriction.EndTime?.ToString("hhmmss") ?? "995959"; agRestrictionClone.TimeToleranceMinsBefore = restriction.TimeToleranceMinsBefore; agRestrictionClone.TimeToleranceMinsAfter = restriction.TimeToleranceMinsAfter; agRestrictionClone.ProgClassCode = restriction.ProgrammeClassification ?? ""; agRestrictionClone.ProgClassFlag = restriction.ProgrammeClassificationIndicator.ToString(); agRestrictionClone.LiveBroadcastFlag = restriction.LiveProgrammeIndicator.ToString(); agRestrictionClone.EpisodeNo = restriction.EpisodeNumber; agRestrictions.Add(agRestrictionClone); if (agRestrictionClone.ProgCategoryNo != 0) { var clashCode = clash.Externalref; AddRestrictionForParentProgrammeCategory( programmeDictionaryExternalRefsIndex, runEndDate, agRestriction, restriction, salesArea, agRestrictions, clashCode, programmeCategoryExternalRefsIndex, programmeCategoryIdsIndex, agRestrictionClone.ProgCategoryNo ); } } } else { var agRestrictionClone = agRestriction.Clone(); agRestrictionClone.ProductCode = restriction.ProductCode; agRestrictionClone.ClashCode = restriction.ClashCode ?? ""; agRestrictionClone.CopyCode = string.IsNullOrWhiteSpace(restriction.ClockNumber) ? "0" : restriction.ClockNumber; agRestrictionClone.ClearanceCode = restriction.ClearanceCode ?? ""; agRestrictionClone.SalesAreaNo = salesArea?.CustomId ?? 0; agRestrictionClone.ProgCategoryNo = !string.IsNullOrWhiteSpace(restriction.ProgrammeCategory) && programmeCategoryNamesIndex.TryGetValue(restriction.ProgrammeCategory, out var category) ? category.Id : 0; agRestrictionClone.ProgrammeNo = !string.IsNullOrWhiteSpace(restriction.ExternalProgRef) && programmeDictionaryExternalRefsIndex.TryGetValue(restriction.ExternalProgRef.ToUpper(), out var programme) ? programme.Id : 0; agRestrictionClone.StartDate = restriction.StartDate.ToString("yyyyMMdd"); agRestrictionClone.EndDate = restriction.EndDate.HasValue ? restriction.EndDate?.ToString("yyyyMMdd") : runEndDate.AddYears(10).ToString("yyyyMMdd"); agRestrictionClone.IndexType = restriction.IndexType; agRestrictionClone.IndexThreshold = restriction.IndexThreshold; agRestrictionClone.PublicHolidayIndicator = AgConversions.ToAgIncludeExcludeEither(restriction.PublicHolidayIndicator); agRestrictionClone.SchoolHolidayIndicator = AgConversions.ToAgIncludeExcludeEither(restriction.SchoolHolidayIndicator); agRestrictionClone.RestrictionType = Convert.ToInt32(restriction.RestrictionType); agRestrictionClone.RestrictionDays = AgConversions.ToAgDaysAsInt(restriction.RestrictionDays); agRestrictionClone.StartTime = restriction.StartTime?.ToString("hhmmss") ?? "0"; agRestrictionClone.EndTime = restriction.EndTime?.ToString("hhmmss") ?? "995959"; agRestrictionClone.TimeToleranceMinsBefore = restriction.TimeToleranceMinsBefore; agRestrictionClone.TimeToleranceMinsAfter = restriction.TimeToleranceMinsAfter; agRestrictionClone.ProgClassCode = restriction.ProgrammeClassification ?? ""; agRestrictionClone.ProgClassFlag = restriction.ProgrammeClassificationIndicator.ToString(); agRestrictionClone.LiveBroadcastFlag = restriction.LiveProgrammeIndicator.ToString(); agRestrictionClone.EpisodeNo = restriction.EpisodeNumber; agRestrictions.Add(agRestrictionClone); if (agRestrictionClone.ProgCategoryNo != 0) { var clashCode = restriction.ClashCode ?? ""; AddRestrictionForParentProgrammeCategory( programmeDictionaryExternalRefsIndex, runEndDate, agRestriction, restriction, salesArea, agRestrictions, clashCode, programmeCategoryExternalRefsIndex, programmeCategoryIdsIndex, agRestrictionClone.ProgCategoryNo ); } } } } return(agRestrictions); }
/// <summary>Loads the ag campaign sales areas.</summary> /// <param name="campaign">The campaign.</param> /// <param name="salesAreas">The sales areas.</param> /// <param name="agCampaignSalesArea">The ag campaign sales area.</param> /// <param name="dayPartNo">The day part no.</param> /// <param name="channelGroup">The channel group.</param> /// <returns></returns> protected List <AgCampaignSalesArea> LoadAgCampaignSalesAreas( Campaign campaign, IReadOnlyCollection <SalesArea> salesAreas, AgCampaignSalesArea agCampaignSalesArea, ref int dayPartNo, ref List <Tuple <int, int, SalesAreaGroup> > channelGroup) { if (campaign.SalesAreaCampaignTarget is null || campaign.SalesAreaCampaignTarget.Count == 0) { return(null); } var counter = 1; var salesAreaTargetMap = salesAreas .Where(x => x.TargetAreaName != null) .Select(x => x.TargetAreaName) .Distinct() .ToDictionary(x => x, x => counter++); var agCampaignSalesAreaList = new List <AgCampaignSalesArea>(); foreach (var salesAreaCampaignTarget in campaign.SalesAreaCampaignTarget) { int salesAreaNo; int channelGroupNo; if (_includeChannelGroup) { // In this case we use old channel group calculation logic // (assigning this value to both sales areas and channel group properties). GetCampaignChannelGroup(salesAreaCampaignTarget.SalesAreaGroup, campaign.CustomId, ref channelGroup, out salesAreaNo); channelGroupNo = salesAreaNo; } else { // In this case we use logic which is to calculate ChannelGroup "saoc_data.tgt_sare_no" value // using the SalesArea TargetAreaName property and use SalesArea CustomIds for everything else. var salesArea = salesAreas.FirstOrDefault(s => s.Name.Equals(salesAreaCampaignTarget.SalesArea)); salesAreaNo = salesArea?.CustomId ?? 0; channelGroupNo = salesArea is null || salesArea.TargetAreaName is null ? 0 : salesAreaTargetMap[salesArea.TargetAreaName]; } var totalDesiredSplit = salesAreaCampaignTarget.Multiparts?.Sum(l => l.DesiredPercentageSplit) ?? 0; var totalCurrentSplit = salesAreaCampaignTarget.Multiparts?.Sum(l => l.CurrentPercentageSplit) ?? 0; var agLengthList = salesAreaCampaignTarget.Multiparts != null ? _mapper.Map <List <AgLength> >(Tuple.Create(salesAreaCampaignTarget.Multiparts, campaign.CustomId, salesAreaNo)) : null; var agLengths = new AgLengths(); if (!(agLengthList is null)) { agLengths.AddRange(agLengthList); } var strikeWeights = salesAreaCampaignTarget.CampaignTargets ?.Where(t => t.StrikeWeights != null && t.StrikeWeights.Any()) .SelectMany(s => s.StrikeWeights).ToList(); var agStrikeWeightList = strikeWeights != null && strikeWeights.Any() ? _mapper.Map <List <AgStrikeWeight> >(Tuple.Create(strikeWeights, campaign.CustomId, salesAreaNo)) : null; var agStrikeWeights = new AgStrikeWeights(); if (!(agStrikeWeightList is null)) { agStrikeWeights.AddRange(agStrikeWeightList); } var agDayPartList = LoadAgDayParts( strikeWeights, campaign.CustomId, salesAreaNo, ref dayPartNo); var agPartList = !(agDayPartList is null) && agDayPartList.Any() ? _mapper.Map <List <AgPart> >(agDayPartList) : null; var agParts = new AgParts(); if (!(agPartList is null)) { agParts.AddRange(agPartList); } if (_mergeUniqueDayParts) { agDayPartList = MergeUniqueDayParts(agDayPartList, agParts); } var agDayParts = new AgDayParts(); if (!(agDayPartList is null)) { agDayParts.AddRange(agDayPartList); } var agDayPartLengths = agDayPartList?.Count > 0 ? agDayPartList.Select(x => x.AgDayPartLengths).ToList() : null; var agPartLengthList = _mapper.Map <List <AgPartLength> >(agDayPartLengths); var agPartLengths = new AgPartLengths(); if (!(agPartLengthList is null)) { agPartLengths.AddRange(agPartLengthList); } var agCampaignSalesAreaClone = agCampaignSalesArea.Clone(); agCampaignSalesAreaClone.SalesAreaNo = salesAreaNo; agCampaignSalesAreaClone.ChannelGroupNo = channelGroupNo; agCampaignSalesAreaClone.CampaignNo = campaign.CustomId; agCampaignSalesAreaClone.AgSalesAreaCampaignRequirement = _mapper.Map <AgRequirement>(Tuple.Create(totalDesiredSplit, totalCurrentSplit)); agCampaignSalesAreaClone.AgCampaignSalesAreaPtrRef = agCampaignSalesArea.AgCampaignSalesAreaPtrRef.Clone(); agCampaignSalesAreaClone.AgCampaignSalesAreaPtrRef.SalesAreaNo = salesAreaNo; agCampaignSalesAreaClone.AgLengths = agLengths; agCampaignSalesAreaClone.NbrAgLengths = agLengthList?.Count ?? 0; agCampaignSalesAreaClone.AgStrikeWeights = agStrikeWeights; agCampaignSalesAreaClone.NbrAgStrikeWeights = agStrikeWeightList?.Count ?? 0; agCampaignSalesAreaClone.AgDayParts = agDayParts; agCampaignSalesAreaClone.NbrAgDayParts = agDayPartList?.Count ?? 0; agCampaignSalesAreaClone.AgParts = agParts; agCampaignSalesAreaClone.NbrParts = agPartList?.Count ?? 0; agCampaignSalesAreaClone.NbrPartsLengths = agPartLengthList?.Count ?? 0; agCampaignSalesAreaClone.AgPartsLengths = agPartLengths; agCampaignSalesAreaClone.StopBooking = AgConversions.ToAgBooleanAsString(salesAreaCampaignTarget.StopBooking); agCampaignSalesAreaList.Add(agCampaignSalesAreaClone); } return(agCampaignSalesAreaList); }
/// <summary>Serializes campaigns into the specified folder.</summary> /// <param name="folderName">Name of the folder.</param> /// <param name="run">The run.</param> /// <param name="campaigns">The campaigns.</param> /// <param name="demographics">The demographics.</param> /// <param name="salesAreas">The sales areas.</param> /// <param name="programmeDictionaries">The programme dictionaries.</param> /// <param name="programmeCategories">The programme categories.</param> /// <param name="autoBookDefaultParameters">The automatic book default parameters.</param> /// <param name="channelGroups">The channel groups.</param> public void Serialize( string folderName, Run run, IReadOnlyCollection <Campaign> campaigns, IReadOnlyCollection <BusinessType> businessTypes, IReadOnlyCollection <Demographic> demographics, IReadOnlyCollection <SalesArea> salesAreas, IReadOnlyCollection <ProgrammeDictionary> programmeDictionaries, IReadOnlyCollection <ProgrammeCategoryHierarchy> programmeCategories, IAutoBookDefaultParameters autoBookDefaultParameters, out IReadOnlyCollection <Tuple <int, int, SalesAreaGroup> > channelGroups, out List <AgCampaignInclusion> campaignIncludeFunctions) { channelGroups = null; campaignIncludeFunctions = null; if (campaigns is null || campaigns.Count == 0) { return; } RaiseInfo( $"Started populating {Filename}. Total campaigns - {campaigns.Count}, Current Time - {_clock.GetCurrentInstant().ToDateTimeUtc()}"); var channelGroup = new List <Tuple <int, int, SalesAreaGroup> >(); PrepareRelatedData(campaigns); var dayPartNo = 0; var agCampaigns = campaigns.Select(campaign => { var demographicNo = demographics .FirstOrDefault(d => d.ExternalRef.Equals(campaign.DemoGraphic))?.Id ?? 0; int.TryParse(campaign.Product, out var productCode); var product = productCode != 0 ? ResolveProduct(campaign) : null; var agCampaignSalesAreaList = LoadAgCampaignSalesAreas( campaign, salesAreas, autoBookDefaultParameters.AgCampaignSalesArea, ref dayPartNo, ref channelGroup); var agCampaignSalesAreas = new AgCampaignSalesAreas(); if (!(agCampaignSalesAreaList is null)) { agCampaignSalesAreas.AddRange(agCampaignSalesAreaList); } var agCampaignProgrammeList = LoadAgCampaignProgrammes( campaign.ProgrammesList, salesAreas, programmeDictionaries, programmeCategories); var agCampaignClone = autoBookDefaultParameters.AgCampaign.Clone(); agCampaignClone.CampaignNo = campaign.CustomId; agCampaignClone.ExternalNo = campaign.ExternalId; agCampaignClone.DemographicNo = demographicNo; agCampaignClone.DealNo = campaign.CustomId; agCampaignClone.ProductCode = productCode; agCampaignClone.ClearanceCode = campaign.ExpectedClearanceCode ?? ""; agCampaignClone.RevenueBudget = Convert.ToInt32(campaign.RevenueBudget); agCampaignClone.StartDate = campaign.StartDateTime.ToString(ShortDateFormat); agCampaignClone.EndDate = campaign.EndDateTime.ToString(ShortDateFormat); agCampaignClone.RootClashCode = string.IsNullOrWhiteSpace(product?.ClashCode) ? productCode.ToString() : ResolveRootClashCode(campaign); agCampaignClone.ClashCode = string.IsNullOrWhiteSpace(product?.ClashCode) ? productCode.ToString() : product.ClashCode; agCampaignClone.AdvertiserIdentifier = product?.AdvertiserIdentifier; agCampaignClone.ClashNo = 0; agCampaignClone.BusinessType = businessTypes.FirstOrDefault(x => x.Code == campaign.BusinessType && x.IncludeConversionIndex)?.Code ?? string.Empty; agCampaignClone.AgCampaignRequirement = _mapper.Map <AgRequirement>(Tuple.Create(campaign.TargetRatings, campaign.ActualRatings)); agCampaignClone.AgCampaignSalesAreas = agCampaignSalesAreas; agCampaignClone.NbrAgCampagignSalesArea = agCampaignSalesAreaList?.Count ?? 0; agCampaignClone.MaxAgCampagignSalesArea = agCampaignSalesAreaList?.Count ?? 0; agCampaignClone.IncludeFunctions = (int)GetIncludeFunctions(run, campaign); agCampaignClone.CampaignSpotMaxRatings = campaign.CampaignSpotMaxRatings; agCampaignClone.NbrAgCampaignProgrammeList = agCampaignProgrammeList.Count; agCampaignClone.AgProgrammeList = agCampaignProgrammeList; agCampaignClone.DeliveryCurrency = (int)campaign.DeliveryCurrency; agCampaignClone.StopBooking = AgConversions.ToAgBooleanAsString(campaign.StopBooking); return(agCampaignClone); }).ToList(); new AgCampaignsSerialization().MapFrom(agCampaigns).Serialize(Path.Combine(folderName, Filename)); channelGroups = channelGroup; campaignIncludeFunctions = agCampaigns.Select(campaign => new AgCampaignInclusion() { CampaignNo = campaign.CampaignNo, IncludeFunctions = campaign.IncludeFunctions }).ToList(); RaiseInfo( $"Finished populating {Filename}. Total campaigns - {campaigns.Count}, Current Time - {_clock.GetCurrentInstant().ToDateTimeUtc()}"); }