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