public void AddOrUpdate(IAutoBookDefaultParameters autoBookDefaultParameters)
        {
            var entity = _dbContext.Query <AutoBookDefaultParametersEntity>()
                         .Include(e => e.AgBreak_AgAvals)
                         .Include(e => e.AgBreak_AgPredictions)
                         .Include(e => e.AgBreak_AgRegionalBreaks)
                         .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgDayParts).ThenInclude(e => e.AgDayPartLengths)
                         .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgDayParts).ThenInclude(e => e.AgTimeSlices)
                         .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgLengths).ThenInclude(e => e.AgMultiParts)
                         .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgParts)
                         .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgPartsLengths)
                         .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgStrikeWeights).ThenInclude(e => e.AgStrikeWeightLengths)
                         .Include(e => e.AgCampaign_AgProgrammeList).ThenInclude(e => e.CategoryOrProgramme)
                         .Include(e => e.AgCampaign_AgProgrammeList).ThenInclude(e => e.TimeBands)
                         .Include(e => e.AgHfssDemos)
                         .FirstOrDefault();

            if (entity == null)
            {
                entity = _mapper.Map <AutoBookDefaultParametersEntity>(autoBookDefaultParameters);

                _dbContext.Add(entity, post => post.MapTo(autoBookDefaultParameters), _mapper);
            }
            else
            {
                _mapper.Map(autoBookDefaultParameters, entity);

                _dbContext.Update(entity, post => post.MapTo(autoBookDefaultParameters), _mapper);
            }

            _cachedModel = autoBookDefaultParameters;
        }
示例#2
0
        public void Serialize(
            string folderName,
            IReadOnlyCollection <Programme> programs,
            IReadOnlyCollection <ProgrammeDictionary> programmeDictionaries,
            IReadOnlyCollection <ProgrammeCategoryHierarchy> programmeCategories,
            IReadOnlyCollection <SalesArea> salesAreas,
            IAutoBookDefaultParameters autoBookDefaultParameters)
        {
            RaiseInfo(
                $"Started populating {Filename}. Total programmes - {programs.Count}, Current Time - {_clock.GetCurrentInstant().ToDateTimeUtc()}");

            List <AgProgTxDetail> data = programs.SelectMany(pgm =>
            {
                int programmeNo = programmeDictionaries
                                  .FirstOrDefault(p =>
                                                  p.ExternalReference.Equals(pgm.ExternalReference, StringComparison.OrdinalIgnoreCase))?.Id ?? 0;
                int salesAreaNo = salesAreas.FirstOrDefault(s => s.Name.Equals(pgm.SalesArea))?.CustomId ?? 0;

                return(pgm.ProgrammeCategories.DefaultIfEmpty().Select(c =>
                {
                    return new AgProgTxDetail
                    {
                        ProgrammeNo = programmeNo,
                        EpisodeNo = pgm.Episode?.Number ?? autoBookDefaultParameters.AgProgTxDetail.EpisodeNo,
                        SalesAreaNo = salesAreaNo,
                        TregNo = salesAreaNo,
                        TxDate = pgm.StartDateTime.ToString(ShortDateFormat),
                        ScheduledStartTime = pgm.StartDateTime.ToString(TimeFormat),
                        ScheduledEndTime =
                            AdjustScheduledEndTime(pgm.StartDateTime.AddTicks(pgm.Duration.BclCompatibleTicks))
                            .ToString(TimeFormat),
                        ProgCategoryNo = c != null
                            ? programmeCategories.FirstOrDefault(pc => pc.Name
                                                                 .Equals(c, StringComparison.OrdinalIgnoreCase))?.Id ?? 0
                            : 0,
                        ClassCode = pgm.Classification,
                        LiveBroadcast = pgm.LiveBroadcast ? "Y" : "N"
                    };
                }));
            }).Distinct().ToList();

            new AgProgTxDetailsSerialization().MapFrom(data).Serialize(Path.Combine(folderName, Filename));

            RaiseInfo(
                $"Finished populating {Filename}. Total programmes - {programs.Count}, Current Time - {_clock.GetCurrentInstant().ToDateTimeUtc()}");
        }
        public IAutoBookDefaultParameters Get()
        {
            if (_cachedModel == null)
            {
                var entity = _dbContext.Query <AutoBookDefaultParametersEntity>()
                             .Include(e => e.AgBreak_AgAvals)
                             .Include(e => e.AgBreak_AgPredictions)
                             .Include(e => e.AgBreak_AgRegionalBreaks)
                             .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgDayParts).ThenInclude(e => e.AgDayPartLengths)
                             .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgDayParts).ThenInclude(e => e.AgTimeSlices)
                             .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgLengths).ThenInclude(e => e.AgMultiParts)
                             .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgParts)
                             .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgPartsLengths)
                             .Include(e => e.AgCampaign_AgCampaignSalesAreas).ThenInclude(e => e.AgStrikeWeights).ThenInclude(e => e.AgStrikeWeightLengths)
                             .Include(e => e.AgCampaign_AgProgrammeList).ThenInclude(e => e.CategoryOrProgramme)
                             .Include(e => e.AgCampaign_AgProgrammeList).ThenInclude(e => e.TimeBands)
                             .Include(e => e.AgHfssDemos)
                             .FirstOrDefault();

                _cachedModel = _mapper.Map <AutoBookDefaultParameters>(entity);
            }

            return(_cachedModel);
        }
示例#4
0
        public void Serialize(
            string folderName,
            Run run,
            IReadOnlyCollection <SalesArea> salesAreas,
            IReadOnlyCollection <Demographic> demographics,
            IReadOnlyCollection <ProgrammeCategoryHierarchy> programmeCategories,
            IReadOnlyCollection <Programme> scheduleProgrammes,
            IReadOnlyCollection <Campaign> campaignWithProgrammeRestrictions,
            IAutoBookDefaultParameters autoBookDefaultParameters,
            out IReadOnlyCollection <BreakWithProgramme> breaksWithProgrammes,
            out IReadOnlyCollection <ProgrammeDictionary> programmeDictionaries)
        {
            RaiseInfo(
                $"Getting breaks with programmes, "
                + $"Current Time - {_clock.GetCurrentInstant().ToDateTimeUtc()}"
                );

            breaksWithProgrammes = GetBreaksWithProgrammes(run, salesAreas);

            if (breaksWithProgrammes.Count == 0)
            {
                programmeDictionaries = Array.Empty <ProgrammeDictionary>();
                return;
            }

            var externalRefsFromBreak = breaksWithProgrammes
                                        .Where(p => !String.IsNullOrWhiteSpace(p.ProgrammeExternalreference))
                                        .Select(p => p.ProgrammeExternalreference);

            var externalRefsFromPrgm = scheduleProgrammes?.Where(p => !string.IsNullOrWhiteSpace(p.ExternalReference))
                                       .Select(p => p.ExternalReference);

            var externalRefsFromCampaigns = campaignWithProgrammeRestrictions != null && campaignWithProgrammeRestrictions.Any()
                ? campaignWithProgrammeRestrictions.SelectMany(c => c.ProgrammeRestrictions
                                                               .Where(p => p?.CategoryOrProgramme != null && p.CategoryOrProgramme.Any() &&
                                                                      p.IsCategoryOrProgramme.Equals(CategoryOrProgramme.P.ToString(),
                                                                                                     StringComparison.OrdinalIgnoreCase))
                                                               .SelectMany(p => p.CategoryOrProgramme))
                                            .ToList()
                : Enumerable.Empty <string>();

            var combinedProgramRef = externalRefsFromBreak.Union(
                externalRefsFromPrgm ?? Enumerable.Empty <string>()).Union(externalRefsFromCampaigns)
                                     .ToList();

            programmeDictionaries = combinedProgramRef.Count > 0
                ? FindProgrammeDictionaries(combinedProgramRef)
                : new List <ProgrammeDictionary>(0);

            RaiseInfo(
                $"Started populating {Filename}. Total breaks - {breaksWithProgrammes.Count}, "
                + $"Current Time - {_clock.GetCurrentInstant().ToDateTimeUtc()}"
                );

            var exactBreaksRatingsTimeMatching =
                _featureManager.IsEnabled(nameof(ProductFeature.ExactBreaksRatingsTimeMatching));
            var useBreakPositionInProgram = _featureManager.IsEnabled(nameof(ProductFeature.UseBreakPositionInProgram));

            // This grouping for identify the break position within programme
            var breakGroups = breaksWithProgrammes
                              .OrderBy(b => b.Break.ScheduledDate.Ticks)
                              .GroupBy(d => new { d.Break.SalesArea, d.Break.ScheduledDate.Date, d.PrgtNo })
                              .ToImmutableList();

            int totalCountBreaksWithPredictions    = 0;
            int totalCountBreaksWithoutPredictions = 0;
            int timeDiffInMin = 0;

            var ratingsPredictionSchedules = GetRatingsPredictionSchedules(run, salesAreas);

            if (ratingsPredictionSchedules.Count > 0)
            {
                timeDiffInMin = ratingsPredictionSchedules.First()
                                .Ratings.Select(r => r.Time.TimeOfDay)
                                .GetTimeDiffInMin();
            }

            var prgDictionaries = programmeDictionaries;

            _ = Parallel.ForEach(breakGroups, subgrp =>
            {
                var ratingsPredictionSchedulesBySalesArea = ratingsPredictionSchedules
                                                            .Where(ratingsPredictionSchedule => ratingsPredictionSchedule.SalesArea == subgrp.Key.SalesArea)
                                                            .ToList();

                int breaksWithPredictions    = 0;
                int breaksWithoutPredictions = 0;

                foreach (var breakWithProgramme in subgrp)
                {
                    var predictions = FindRatingPredictions(
                        ratingsPredictionSchedulesBySalesArea,
                        breakWithProgramme.Break.ScheduledDate,
                        exactBreaksRatingsTimeMatching,
                        timeDiffInMin);

                    breakWithProgramme.Predictions = predictions;
                    if (predictions is null || predictions.Count == 0)
                    {
                        breaksWithoutPredictions++;
                    }
示例#5
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()}");
        }