public static SurveyReponseDetailViewModel Create(IRepository repository, SurveyResponse surveyResponse)
{
Check.Require(repository != null, "Repository must be supplied");
Check.Require(surveyResponse != null);
var viewModel = new SurveyReponseDetailViewModel {SurveyResponse = surveyResponse};
//Get all the related categories that had answers.
var relatedCategoryIds = viewModel.SurveyResponse.Answers.Select(x => x.Category.Id).Distinct().ToList();
var bypassedAnswers = viewModel.SurveyResponse.Answers.Where(a => a.BypassScore);
viewModel.Scores = new List<Scores>();
foreach (var category in viewModel.SurveyResponse.Survey.Categories.Where(a => !a.DoNotUseForCalculations && relatedCategoryIds.Contains(a.Id)))
{
var score = new Scores();
score.Category = category;
var totalMax = repository.OfType<CategoryTotalMaxScore>().GetNullableById(category.Id);
if (totalMax == null) //No Questions most likely
{
continue;
}
score.MaxScore = totalMax.TotalMaxScore;
foreach (var bypassedAnswer in bypassedAnswers.Where(a => a.Category == category))
{
score.MaxScore = score.MaxScore - bypassedAnswer.Question.Responses.Where(a => a.IsActive).Max(a => a.Score);
}
//score.MaxScore = repository.OfType<CategoryTotalMaxScore>().GetNullableById(category.Id).TotalMaxScore;
score.TotalScore = viewModel.SurveyResponse.Answers.Where(a => a.Category == category).Sum(b => b.Score);
if (score.MaxScore == 0)
{
score.Percent = 100;
}
else
{
score.Percent = (score.TotalScore / score.MaxScore) * 100m;
}
score.Rank = category.Rank;
viewModel.Scores.Add(score);
}
return viewModel;
}