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; }
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); }
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++; }
/// <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()}"); }