public async Task <IList <NPSRating> > GetNPSTrends(NPSTrendFilter filter)
        {
            filter             = filter ?? new NPSTrendFilter();
            filter.TrendPeriod = filter.TrendPeriod ?? NPSTrendPeriod.Monthly;

            var dbContext = _entityFactory.Create();

            var ratings = await dbContext.RatingResults
                          .WhereIf(filter.CompanyIds?.Any() == true, x => filter.CompanyIds.Contains(x.Rating.CompanyId))
                          .WhereIf(filter.From.HasValue, x => filter.From <= x.Rating.DateRecorded)
                          .WhereIf(filter.To.HasValue, x => filter.To >= x.Rating.DateRecorded)
                          .Where(x => x.ResultType == RatingResultType.Nps)
                          .Where(x => !string.IsNullOrWhiteSpace(x.Value))
                          .Select(x => new { Rating = x.Value, RecordedOn = x.Rating.DateRecorded, CompanyId = x.Rating.CompanyId, Timezone = x.Rating.Company.Timezone })
                          .ToListAsync();

            return(ratings
                   .Where(x => int.TryParse(x.Rating, out _))
                   .Select(x => new { Rating = int.Parse(x.Rating), RecordedOn = x.RecordedOn, Timezone = x.Timezone })
                   .Select(x => new { Type = NPSConstants.GetRespondentType(x.Rating), Rating = x.Rating, RecordedOn = x.RecordedOn, Timezone = x.Timezone })
                   .GroupBy(x => GetNPSTrendBucket(x.RecordedOn, x.Timezone, filter.TrendPeriod.Value))
                   .Select(x => new NPSRating
            {
                TrendPeriod = filter.TrendPeriod.Value,
                TrendTime = x.Key,
                Score = (int)(x.Sum(y => (int)y.Type) / (decimal)x.Count() * 100)
            })
                   .OrderBy(x => x.TrendTime)
                   .ToList());
        }
예제 #2
0
        public async Task GivenGetNPSTrends_WhenProvidingInvalidCompanyIdFilter_ThenNoRatingsBeforeTo()
        {
            var filter = new NPSTrendFilter {
                CompanyIds = new [] { -1 }, TrendPeriod = NPSTrendPeriod.Daily
            };
            var ratings = await _service.GetNPSTrends(filter);

            ratings.Should().BeNullOrEmpty();
        }
예제 #3
0
        public async Task GivenGetNPSTrends_WhenProvidingCompanyIdFilter_ThenRatingsForCompany()
        {
            var filter = new NPSTrendFilter {
                CompanyIds = new [] { 1 }, TrendPeriod = NPSTrendPeriod.Daily
            };
            var ratings = await _service.GetNPSTrends(filter);

            ratings.Should().NotBeNullOrEmpty();
        }
예제 #4
0
        public async Task GivenGetNPSTrends_WhenProvidingToFilter_ThenRatingsBeforeTo()
        {
            var filter = new NPSTrendFilter {
                To = new DateTime(2018, 6, 6), TrendPeriod = NPSTrendPeriod.Daily
            };
            var ratings = await _service.GetNPSTrends(filter);

            ratings.Should().NotBeNullOrEmpty();
            ratings.Should().OnlyContain(x => x.TrendTime <= filter.To.Value.Date);
        }
예제 #5
0
        public async Task GivenGetNPSTrends_WhenProvidingFromFilter_ThenRatingsAfterFrom()
        {
            var filter = new NPSTrendFilter {
                From = new DateTime(2018, 6, 6), TrendPeriod = NPSTrendPeriod.Daily
            };
            var ratings = await _service.GetNPSTrends(filter);

            ratings.Should().NotBeNullOrEmpty();
            ratings.Should().OnlyContain(x => x.TrendTime >= filter.From.Value);
        }
예제 #6
0
        public async Task GivenGetNPSTrends_WhenProvidingPeriodFilter_ThenRatingsInProvidedBucket()
        {
            var filter = new NPSTrendFilter {
                TrendPeriod = NPSTrendPeriod.Weekly
            };
            var ratings = await _service.GetNPSTrends(filter);

            ratings.Should().NotBeNullOrEmpty();
            ratings.Should().OnlyContain(x => x.TrendPeriod == NPSTrendPeriod.Weekly);
        }
 public Task <IList <NPSRating> > GetNPSTrends([FromQuery] NPSTrendFilter filter)
 {
     return(_npsReportService.GetNPSTrends(filter));
 }