Example #1
0
        public IHttpActionResult GetPreviousSurveyQuestion(int surveyId, int questionId)
        {
            var session         = db.GetCurrentSurveySession(surveyId, UserId).SingleOrDefault();
            var questions       = db.GetSurveyQuestions(surveyId).OrderBy(x => x.QuestionOrder).ToList();
            var answers         = db.GetSurveyAnswers(surveyId, UserId, session.SessionId, null, null).OrderByDescending(x => x.AnswerDateUTC).ToList();
            var currentQuestion = questions.SingleOrDefault(x => x.QuestionId == questionId);
            var currentAnswers  = answers.Where(x => x.QuestionId == questionId).ToList();
            GetSurveyQuestions_Result question = null;

            if (answers.Count > 0)
            {
                var lastAnswer = answers[0];

                if (currentAnswers.Count > 0)
                {
                    lastAnswer = answers.FirstOrDefault(x => x.QuestionId != questionId && x.AnswerDateUTC < currentAnswers.Max(y => y.AnswerDateUTC));
                }

                var lastQuestion = questions.SingleOrDefault(x => x.QuestionId == lastAnswer.QuestionId);

                question        = lastQuestion;
                question.Answer = answers.FirstOrDefault(x => x.QuestionId == question.QuestionId);

                if (question != null && question.Answer != null)
                {
                    question.Answers = answers.Where(x => x.QuestionId == question.QuestionId && x.AnswerDateUTC == question.Answer.AnswerDateUTC).ToList();
                }

                if (question != null)
                {
                    var firstAnswer   = answers[answers.Count - 1];
                    var firstQuestion = questions.SingleOrDefault(x => x.QuestionId == firstAnswer.QuestionId);

                    if (firstQuestion != null)
                    {
                        question.IsFirstQuestion = question.QuestionId == firstQuestion.QuestionId;
                    }
                }
            }

            if (question != null)
            {
                question.QuestionText = ItemHelper.ReplacePlaceholders(question.QuestionText, UserId);
                question.Body         = ItemHelper.ReplacePlaceholders(question.Body, UserId);
                question.Options      = db.GetSurveyQuestionOptions(question.QuestionId, null).ToList();
            }

            return(Ok(question));
        }
Example #2
0
        public IHttpActionResult GetNextSurveyQuestion(int surveyId)
        {
            var  session         = db.GetCurrentSurveySession(surveyId, UserId).SingleOrDefault();
            bool isFirstQuestion = false;

            if (session == null || session.EndDateUTC.HasValue)
            {
                var dates = GetTimeZoneAdjustedDateInfo(SystemClock.Instance.GetCurrentInstant());

                session = db.AddUpdateSurveySession(null, surveyId, UserId, dates.DateUTC, dates.DateDTO, dates.DateCTZ, null, null, null)
                          .Select(x => new GetCurrentSurveySession_Result()
                {
                    SessionId    = x.SessionId,
                    SurveyId     = x.SurveyId,
                    UserId       = x.UserId,
                    StartDateUTC = x.StartDateUTC,
                    EndDateUTC   = x.EndDateUTC
                }).SingleOrDefault();
            }

            var questions = db.GetSurveyQuestions(surveyId).OrderBy(x => x.QuestionOrder).ToList();
            var answers   = db.GetSurveyAnswers(surveyId, UserId, session.SessionId, null, null).OrderByDescending(x => x.AnswerDateUTC).ToList();
            GetSurveyQuestions_Result question = null;

            if (answers.Count > 0)
            {
                var lastAnswer = answers.FirstOrDefault(x => questions.Any(y => y.QuestionId == x.QuestionId));

                if (lastAnswer != null)
                {
                    var lastQuestion = questions.SingleOrDefault(x => x.QuestionId == lastAnswer.QuestionId);
                    var logic        = db.GetSurveyQuestionLogic(lastQuestion.QuestionId).ToList();

                    question = lastQuestion;

                    foreach (var line in logic)
                    {
                        if (line.ActionId == 2)
                        {
                            if (string.IsNullOrEmpty(line.Expression) || (db.EvaluateLogic(UserId, line.Expression).SingleOrDefault() ?? false))
                            {
                                question = questions.SingleOrDefault(x => x.QuestionId == line.ActionQuestionId);
                                break;
                            }
                        }
                        else if (line.ActionId == 3)
                        {
                            if (string.IsNullOrEmpty(line.Expression) || (db.EvaluateLogic(UserId, line.Expression).SingleOrDefault() ?? false))
                            {
                                question = null;
                                break;
                            }
                        }
                    }

                    if (question != null && question.Equals(lastQuestion))
                    {
                        question = questions.FirstOrDefault(x => x.QuestionOrder > question.QuestionOrder);
                    }

                    if (question != null)
                    {
                        question.Answer = answers.FirstOrDefault(x => x.QuestionId == question.QuestionId);

                        if (question.Answer != null)
                        {
                            question.Answers = answers.Where(x => x.QuestionId == question.QuestionId && x.AnswerDateUTC == question.Answer.AnswerDateUTC).ToList();
                        }
                    }
                }
                else
                {
                    question        = questions.OrderBy(x => x.QuestionOrder).FirstOrDefault();
                    isFirstQuestion = true;
                }
            }
            else
            {
                question        = questions.OrderBy(x => x.QuestionOrder).FirstOrDefault();
                isFirstQuestion = true;
            }

            if (question != null)
            {
                var logic = db.GetSurveyQuestionLogic(question.QuestionId).ToList();

                while (logic.Any())
                {
                    var lastQuestion = question;

                    foreach (var line in logic)
                    {
                        if (line.ActionId == 1)
                        {
                            if (string.IsNullOrEmpty(line.Expression) || (db.EvaluateLogic(UserId, line.Expression).SingleOrDefault() ?? false))
                            {
                                question = questions.FirstOrDefault(x => x.QuestionOrder > question.QuestionOrder);
                                break;
                            }
                        }
                    }

                    if (question != null && !question.Equals(lastQuestion))
                    {
                        logic = db.GetSurveyQuestionLogic(question.QuestionId).ToList();
                    }
                    else
                    {
                        logic.Clear();
                    }
                }
            }

            if (question == null)
            {
                var dates = GetTimeZoneAdjustedDateInfo(SystemClock.Instance.GetCurrentInstant());

                db.AddUpdateSurveySession(session.SessionId, session.SurveyId, session.UserId, session.StartDateUTC, session.StartDateDTO,
                                          session.StartDateCTZ, dates.DateUTC, dates.DateDTO, dates.DateCTZ);
            }
            else
            {
                question.QuestionText    = ItemHelper.ReplacePlaceholders(question.QuestionText, UserId);
                question.Body            = ItemHelper.ReplacePlaceholders(question.Body, UserId);
                question.IsFirstQuestion = isFirstQuestion;
                question.Options         = db.GetSurveyQuestionOptions(question.QuestionId, null).ToList();
            }

            return(Ok(question));
        }