/// <summary> /// Closes an exam and gives the user a grade, points and notification. /// </summary> /// <param name="levelExamId">id of a levelexam</param> /// <param name="userInfoId">id of an userinfo</param> /// <returns>Points of an exam</returns> public double ReturnExam(int levelExamId, int userInfoId) { if (HasAccessToExam(levelExamId, userInfoId)) { var levelExamResult = new LevelExamResult(); levelExamResult.UserInfoId = userInfoId; levelExamResult.LevelExamId = levelExamId; var exam = GameSchoolEntities.LevelExams.Where(x => x.LevelExamId == levelExamId).Single(); var correctAnswer = exam.LevelExamQuestions.Where( x => x.LevelExamAnswers.Where(y => y.UserInfoes.Where(z => z.UserInfoId == userInfoId).Count() > 0).Where (t => t.Correct).Count() > 0); levelExamResult.Grade = ((correctAnswer.Count() * 1.0) / exam.LevelExamQuestions.Count()) * 10; GameSchoolEntities.LevelExamResults.AddObject(levelExamResult); Save(); if (ExternalNotificationContainer != null) { ExternalNotificationContainer.CreateNotification(string.Format("Þú hefur fengið {0} fyrir prófið \"{1}\"", levelExamResult.Grade, exam.Name), string.Format("/Exam/Index/{0}", exam.Level.CourseId), userInfoId); } if (ExternalPointContainer != null) { const int totalPointsPerGradeUnit = 5; int points = ExternalPointContainer.CalculatePointsByGrade(levelExamResult.Grade, totalPointsPerGradeUnit); if (points > 0) { ExternalPointContainer.AddPointsToLevel(userInfoId, exam.LevelId, points, string.Format( "Þú hefur fengið {0} stig fyrir prófið \"{1}\".", points, exam.Name)); } } return levelExamResult.Grade; } return 0; }