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