Exemplo n.º 1
0
        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("");
            }
        }
Exemplo n.º 2
0
        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());
            }
        }