Ejemplo n.º 1
0
        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>();
        }
Ejemplo n.º 2
0
        //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());
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
0
        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();
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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());
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        /// <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);
        }
Ejemplo n.º 15
0
        /// <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()}");
        }