/// <summary> /// TODO > use XSLT and template!! /// </summary> /// <param name="exam"></param> /// <param name="candidate"></param> /// <returns></returns> public Exam CompleteExam(Exam exam, Candidate candidate) { var message = new StringBuilder(); exam.TotalPossiblePoints = exam.Questions.Sum(x => x.ScorePoint); exam.TotalScoredPoints = exam.Questions.Where(x => x.SelectedOption != null && x.SelectedOption.IsSelected).Sum(x => x.ScorePoint); exam.TotalQuestionsAsked = exam.Questions.Count(); exam.TotalQuestionsAnswered = exam.Questions.Count(x => x.SelectedOption != null); exam.TotalQuestionsAnsweredCorrectly = exam.Questions.Count(x => x.SelectedOption != null && x.SelectedOption.IsSelected); Exam examReturend = null; using (var examRepo = new ExamRepository()) { examReturend = Mapper.Map <Exam>(examRepo.CompleteExam(exam.Id)); } exam.CompletedOn = examReturend.CompletedOn; message.Append(string.Format("<!DOCTYPE html><html lang='en'><span style='font-family:arial;'>Interview Exam Results for: {0} {1} {2}", candidate.FirstName, candidate.LastName, "<br/><br/>")); message.Append(string.Format("Candidate Email: {0}{1}", candidate.Email, "<br/><br/>")); message.Append("<hr>"); message.Append(string.Format("<b>Exam</b>{3}{3}Start: {0}{3}Finish: {1} {3}Minutes Taken: {2} {3}{3}", exam.StartedOn.GetValueOrDefault().ToString("yyyy-MMM-dd HH:mm:ss"), exam.CompletedOn.GetValueOrDefault().ToString("yyyy-MMM-dd HH:mm:ss"), (exam.CompletedOn - exam.StartedOn).Value.TotalMinutes.ToString("##.##"), "<br/>")); message.Append(string.Format("Exam Total Score: {0} / {1} Points. {2}<progress value='{0}' max='{1}'></progress> {2}", exam.TotalScoredPoints, exam.TotalPossiblePoints, "<br/><br/>")); message.Append(string.Format("Standard Questions Asked: {0}{3} Answered: {1}{3} Correct: {2} {3}{3}{4}{3}", exam.TotalQuestionsAsked, exam.TotalQuestionsAnswered, exam.TotalQuestionsAnsweredCorrectly, "<br/>", "<hr>")); var queryBonusQuestions = exam.Questions.Where(x => x.SelectedOption != null).SelectMany(x => x.SelectedOption.Questions); var bonusPossiblePoints = queryBonusQuestions.Sum(x => x.ScorePoint); var bonusScoredPoints = queryBonusQuestions.Where(x => x.SelectedOption != null && x.SelectedOption.IsSelected).Sum(x => x.ScorePoint); var bonusQuestionsAsked = queryBonusQuestions.Count(); var bonusQuestionsAnswered = queryBonusQuestions.Count(x => x.SelectedOption != null); var bonusQuestionsAnsweredCorrectly = queryBonusQuestions.Count(x => x.SelectedOption != null && x.SelectedOption.IsSelected); if (bonusPossiblePoints > 0) { message.Append(string.Format("<b>Extended Questions</b>{2}Total Score: {0} / {1} Points. {2}<progress value='{0}' max='{1}'></progress>{2}", bonusScoredPoints, bonusPossiblePoints, "<br/><br/>")); message.Append(string.Format("Extended Questions Asked: {0}{3} Answered: {1}{3} Correct: {2} {3}{3}{4}{3}", bonusQuestionsAsked, bonusQuestionsAnswered, bonusQuestionsAnsweredCorrectly, "<br/>", "<hr>")); } var categoryResults = exam.Questions.GroupBy(x => x.CategoryName).Select( x => new { CategoryName = x.Key, TotalQuestionsAsked = x.Count(), TotalQuestionsAnswered = x.Count(y => y.SelectedOption != null), TotalQuestionsAnsweredCorrectly = x.Count(y => y.SelectedOption != null && y.SelectedOption.IsSelected), TotalPossiblePoints = x.Sum(y => y.ScorePoint), TotalScoredPoints = x.Where(y => y.SelectedOption != null && y.SelectedOption.IsSelected).Sum(y => y.ScorePoint), QueryBonusQuestions = x.Where(y => y.SelectedOption != null).SelectMany(y => y.SelectedOption.Questions), } ).Select(x => new { x.CategoryName, x.TotalQuestionsAsked, x.TotalQuestionsAnswered, x.TotalQuestionsAnsweredCorrectly, x.TotalPossiblePoints, x.TotalScoredPoints, BonusQuestionsAsked = x.QueryBonusQuestions.Count(), BonusQuestionsAnswered = x.QueryBonusQuestions.Count(y => y.SelectedOption != null), BonusQuestionsAnsweredCorrectly = x.QueryBonusQuestions.Count(y => y.SelectedOption != null && y.SelectedOption.IsSelected), BonusTotalPossiblePoints = x.QueryBonusQuestions.Sum(y => y.ScorePoint), BonusTotalScoredPoints = x.QueryBonusQuestions.Where(y => y.SelectedOption != null && y.SelectedOption.IsSelected).Sum(y => y.ScorePoint) }); categoryResults.ToList().ForEach(x => { message.Append(string.Format("<b>{0}</b>{3}{3}Score: {1} / {2} Points. {3}{3}<progress value='{1}' max='{2}'></progress>{3}{3}", x.CategoryName, x.TotalScoredPoints, x.TotalPossiblePoints, "<br/>")); message.Append(string.Format("Standard Questions Asked: {0}{3}Answered: {1}{3}Correct: {2}{3}{3}", x.TotalQuestionsAsked, x.TotalQuestionsAnswered, x.TotalQuestionsAnsweredCorrectly, "<br/>")); if (x.BonusTotalPossiblePoints > 0) { message.Append(string.Format("Extended Total Score: {0} / {1} Points. {2}<progress value='{0}' max='{1}'></progress>{2}", x.BonusTotalScoredPoints, x.BonusTotalPossiblePoints, "<br/><br/>")); message.Append(string.Format("Extended Questions Asked: {0}{3}Answered: {1}{3}Correct: {2}{3}{3}", x.BonusQuestionsAsked, x.BonusQuestionsAnswered, x.BonusQuestionsAnsweredCorrectly, "<br/>")); } }); message.Append("<hr></span></html>"); SendMail(exam.Examiner, ConfigurationSettings.AppSettings["DefaultSMTPFromEmail"], "Interview exam results for: " + candidate.FirstName + " " + candidate.LastName + " Email: " + candidate.Email, message.ToString()); return(exam); }