protected override IReadOnlyCollection <KPI> Calculate()
        {
            var spotCampaigns = _calculationContext.ActiveCampaigns.Value
                                .Where(c => c.DeliveryType == CampaignDeliveryType.Spot)
                                .ToArray();

            var ratingCampaigns = _calculationContext.ActiveCampaigns.Value
                                  .Where(c => c.DeliveryType == CampaignDeliveryType.Rating)
                                  .ToArray();

            var spotCampaignsDayParts = KPICalculationHelpers.GetCampaignsDayParts(spotCampaigns);

            var ratingCampaignsDayParts = KPICalculationHelpers.GetCampaignsDayParts(ratingCampaigns);

            var kpiValue = ratingCampaignsDayParts.Sum(d => d.BaseDemographRatings)
                           + spotCampaignsDayParts.Sum(d => d.BaseDemographRatings);

            return(new[] {
                new KPI
                {
                    Name = ScenarioKPINames.BaseDemographicRatings,
                    Displayformat = KPICalculationHelpers.DisplayFormats.LargeNumber,
                    Value = kpiValue
                }
            });
        }
        public void GetDayPartByDowAndTimeString_ShouldReturnDayPart()
        {
            //Arrange
            var expected = new DayPart
            {
                DayPartName = "2100-2359(Mon-Fri)",
                Timeslices  = new List <Timeslice>
                {
                    new Timeslice
                    {
                        DowPattern = new List <string>
                        {
                            "Mon",
                            "Tue",
                            "Wed",
                            "Thu",
                            "Fri"
                        },
                        FromTime = "21:00",
                        ToTime   = "23:59"
                    }
                }
            };

            //Act
            var result = KPICalculationHelpers.GetDayPartByDowTimeString(_dayParts,
                                                                         expected.DayPartName);

            //Assert
            Assert.IsTrue(result.DayPartName == expected.DayPartName);
        }
        public void GetDayPartByDowAndTimeStringAndOnlyOneDow_ShouldReturnDayPart()
        {
            //Arrange
            var expected = new DayPart
            {
                DayPartName = "1000-1259(Mon-Mon)",
                Timeslices  = new List <Timeslice>
                {
                    new Timeslice
                    {
                        DowPattern = new List <string>
                        {
                            "Mon"
                        },
                        FromTime = "10:00",
                        ToTime   = "12:59"
                    }
                }
            };

            //Act
            var result = KPICalculationHelpers.GetDayPartByDowTimeString(_dayParts,
                                                                         expected.DayPartName);

            //Assert
            Assert.IsTrue(result.DayPartName == expected.DayPartName);
        }
        public void GetDayPartByDowAndTimeStringAndDayPartDoesNotExist_ShouldReturnNull()
        {
            //Arrange
            var dowTimeString = "2000-2559(Mon-Tue)";

            //Act
            var result = KPICalculationHelpers.GetDayPartByDowTimeString(_dayParts,
                                                                         dowTimeString);

            //Assert
            Assert.IsNull(result);
        }
        /// <summary>
        /// Calculates analysis group campaign KPIs
        /// </summary>
        /// <param name="campaigns"></param>
        /// <param name="campaignRecommendations"></param>
        /// <returns></returns>
        public static AnalysisGroupCampaignKPI CalculateAnalysisGroupCampaignKPIs(IEnumerable <Campaign> campaigns, IEnumerable <Recommendation> campaignRecommendations)
        {
            var bookedRecommendations = campaignRecommendations
                                        .Where(r => r.Action == KPICalculationHelpers.SpotTags.Booked);

            var cancelledRecommendations = campaignRecommendations
                                           .Where(r => r.Action == KPICalculationHelpers.SpotTags.Cancelled);

            var totalCampaignActualRatings = campaigns.Sum(c => c.ActualRatings);

            var ratingsDelivery = totalCampaignActualRatings +
                                  bookedRecommendations.Sum(r => r.SpotRating) -
                                  cancelledRecommendations.Sum(r => r.SpotRating);

            var totalCampaignTargetRatings = campaigns.Sum(c => c.TargetRatings);

            var deliveryPercentage = Math.Round(
                totalCampaignTargetRatings == 0
                    ? 0
                    : ratingsDelivery / totalCampaignTargetRatings * 100,
                2,
                MidpointRounding.AwayFromZero);

            var totalRecommendationsNominalPrice = bookedRecommendations.Sum(r => r.NominalPrice) -
                                                   cancelledRecommendations.Sum(r => r.NominalPrice);

            var campaignRevenueBooked = campaigns.Sum(c => c.RevenueBooked);

            var revenueBooked = totalRecommendationsNominalPrice + campaignRevenueBooked.Value;

            var poolValue = revenueBooked - campaigns.Sum(c => c.RevenueBudget);

            var campaignDayParts = KPICalculationHelpers.GetCampaignsDayParts(campaigns);

            var spotsCount = campaignDayParts.Sum(d => d.TotalSpotCount)
                             + bookedRecommendations.Count()
                             - cancelledRecommendations.Count();

            var zeroRatedSpotsCount = campaignDayParts.Sum(d => d.ZeroRatedSpotCount)
                                      + bookedRecommendations.Count(x => x.SpotRating == 0)
                                      - cancelledRecommendations.Count(x => x.SpotRating == 0);

            return(new AnalysisGroupCampaignKPI
            {
                RatingsDelivery = (double)ratingsDelivery,
                DeliveryPercentage = (double)deliveryPercentage,
                RevenueBooked = revenueBooked,
                PoolValue = poolValue,
                Spots = spotsCount,
                ZeroRatedSpots = zeroRatedSpotsCount
            });
        }
Exemple #6
0
        protected override IReadOnlyCollection <KPI> Calculate()
        {
            var kpiValue = 0;

            foreach (var campaign in _calculationContext.SmoothCampaigns.Value)
            {
                var percentage = KPICalculationHelpers.GetSmoothCampaignRatingPercentage(campaign, _calculationContext.CampaignMetrics.Value);
                if (percentage <= 0.75m)
                {
                    kpiValue++;
                }
            }

            return(new[] {
                new KPI
                {
                    Name = ScenarioKPINames.PercentBelow75,
                    Displayformat = KPICalculationHelpers.DisplayFormats.LargeNumber,
                    Value = kpiValue
                }
            });
        }