public string UpdateRespondentQS(string token, long respondentId, QuestionnaireChoices passedQuestionnaire) { if (!_userValidation.ValidateToken(token)) { throw new AddressAccessDeniedException(); } _log.Information($"{GetCurrentMethod()} called."); try { //lock (_locker) { var scope = _questionnaireRepository.FindQuestionnaireById(passedQuestionnaire.ScopeId); scope.Passed++; _questionnaireRepository.Upsert(scope); var res = _outcomeComputer.ComputeOutcomes(passedQuestionnaire, scope); var permanent = new PermanentResults { OutcomeHeader = scope.OutcomeHeader, ScopeId = passedQuestionnaire.ScopeId, Outcomes = res.ToList() }; var permatoken = _respondentsRepository.StorePermanentResults(permanent); var target = _respondentsRepository.FindById(respondentId); target.Activity.Add(new ActivityData { Code = ActivityCode.PassedQuestionaire, RelatedScopeId = passedQuestionnaire.ScopeId }); var extended = new ExtendedQuestionnaireChoices { AnswerIds = passedQuestionnaire.AnswerIds, ScopeId = passedQuestionnaire.ScopeId, PublicToken = permatoken }; target.AttendedQuestionnairies.Add(extended); _respondentsRepository.Save(target); return(permatoken); } } catch (Exception ex) { _log.Error(ex, ex.Message); return(""); } }
public List <QuestionnaireOutcome> ComputeOutcomes(QuestionnaireChoices passedQuestionnaire, QuestionnaireScope scope) { if (passedQuestionnaire == null) { return(new List <QuestionnaireOutcome>()); } if (passedQuestionnaire.AnswerIds == null) { return(new List <QuestionnaireOutcome>()); } if (passedQuestionnaire.AnswerIds.Count == 0) { return(new List <QuestionnaireOutcome>()); } if (passedQuestionnaire.ScopeId != scope.Id) { return(new List <QuestionnaireOutcome>()); } _log.Information($"Respondent results:{passedQuestionnaire}"); var mappings = scope.Entries .SelectMany(z => z.Answers) .Where(z => passedQuestionnaire.AnswerIds.Contains(z.Id)) .SelectMany(z => z.Mappings) .GroupBy(z => z.OutcomeIndex) .Select(z => new { O = z.Key, W = z.Sum(x => x.Weight) }) .OrderBy(z => - z.W) .ToArray(); var res = new List <QuestionnaireOutcome>(); foreach (var map in mappings) { if (map.W > 0) { var outc = scope.Outcomes.Where(z => z.Index == map.O && Match(z, map.W)); if (outc.Any()) { res.AddRange(outc); } } } if (!res.Any()) { var cand = scope.Outcomes.FirstOrDefault(z => z.WeightMin != z.WeightMax && z.WeightMin == 0); if (cand != null) { _log.Information($"Return default outcome {cand}"); return(new List <QuestionnaireOutcome> { cand }); } } _log.Information($"Oucomes: {string.Join("; ", res)}"); if (scope.OutcomeLimit == 0) { return(res.ToList()); } else { return(res.Take(scope.OutcomeLimit).ToList()); } }