public async Task<ActionResult> Create(AssessmentSheetViewModel assessmentSheet)
        {
            var id = int.Parse(Session["ExamRegistrationId"].ToString());

            if (ModelState.IsValid)
            {
                switch (assessmentSheet.ExamTypeId)
                {
                    case 1:
                        SaveAssessmentSheetTheory(id, assessmentSheet);
                        break;
                    case 2:
                        SaveAssessmentSheetPolygon(id, assessmentSheet);
                        break;
                    case 3:
                        SaveAssessmentSheetCity(id, assessmentSheet);
                        break;
                }

                await db.SaveChangesAsync();
                return RedirectToAction("Index", "ExamRegistration");
            }

            var examRegistration = dbView.ViewExamRegistration.First(w => w.ExamRegistrationId == id);

            var candidate = dbView.ViewCandidates.First(w => w.CandidateId == examRegistration.CandidateId);

            ViewBag.Candidate = candidate;


            return View(assessmentSheet);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id">ExamRegistrationId</param>
        /// <returns></returns>
        public ActionResult Create(int? id)
        {
            db.Configuration.ProxyCreationEnabled = false;
            Session["ExamRegistrationId"] = id;

            var examRegistration = dbView.ViewExamRegistration.First(w => w.ExamRegistrationId == id);
            var drivingCategory = db.DrivingCategory.First(f => f.Id == examRegistration.DrivingCategoryId);
            var candidate = dbView.ViewCandidates.First(w => w.CandidateId == examRegistration.CandidateId);

            ViewBag.Candidate = candidate;

            AssessmentSheetViewModel data = new AssessmentSheetViewModel();
            data.ExamTypeId = (int)examRegistration.ExamTypeId;
            data.ExamRegistrationId = (int)id;

            data.Theory = new AssessmentSheetTheoryViewModel();
            data.Polygon = new List<AssessmentSheetPolygonCityViewModel>();
            data.City = new List<AssessmentSheetPolygonCityViewModel>();

            switch ((int)examRegistration.ExamTypeId)
            {
                case 1:
                    ViewBag.Title = "Оценувачки лист - теорија";
                    GetAssessmentSheetTheory(data, drivingCategory, examRegistration, (int)id);
                    break;
                case 2:
                    ViewBag.Title = "Оценувачки лист - полигон";
                    GetAssessmentSheetPolygon(data, drivingCategory, examRegistration, (int)id);
                    break;
                case 3:
                    ViewBag.Title = "Оценувачки лист - град";
                    GetAssessmentSheetCity(data, drivingCategory, examRegistration, (int)id);
                    break;
            }

            return View(data);
        }
        private void AppearOnTheExamCity(int id, AssessmentSheetViewModel assessmentSheet)
        {
            var examRegistrationErrors = db.ExamRegistrationError.Where(w => w.ExamRegistrationId == id);

            if (examRegistrationErrors.Any())
            {
                // Има претходни записи со грешки од испитото во базата
                var examRegistrationErrorsIds = examRegistrationErrors.Select(s => s.ErrorTypeId);

                CreateExamRegistrationError(id, assessmentSheet.City.Where(w => w.isChecked && !examRegistrationErrorsIds.Contains(w.questionId)).ToList());
                CleanExamRegistrationError(assessmentSheet.City, examRegistrationErrors);
            }
            else
            {
                //Нема претходни записи во грешки од испит во базата
                CreateExamRegistrationError(id, assessmentSheet.City.Where(w => w.isChecked).ToList());
            }

            CheckNegativePoints(id, assessmentSheet.City, assessmentSheet.AllowedNegativePoints, assessmentSheet.ExamRegistrationId);
        }
        private void AppearOnTheExamTheory(int id, AssessmentSheetViewModel assessmentSheet)
        {
            var examRegistration = db.ExamRegistration.First(f => f.Id == assessmentSheet.ExamRegistrationId);

            if (assessmentSheet.Theory.NegativePoints > assessmentSheet.AllowedNegativePoints)
            {
                //Не положил
                examRegistration.StatusId = (int)ExamRegStatusEnum.NotPassed;
                db.Entry(examRegistration).State = EntityState.Modified;

                GenerateReport(id, assessmentSheet.Theory.NegativePoints, false);
            }
            else
            {
                //Положил
                examRegistration.StatusId = (int)ExamRegStatusEnum.Passed;
                db.Entry(examRegistration).State = EntityState.Modified;

                GenerateReport(id, assessmentSheet.Theory.NegativePoints, true);
            }
        }
        private void NotAppearOnTheExam(int id, AssessmentSheetViewModel assessmentSheet)
        {
            var examRegistration = db.ExamRegistration.First(f => f.Id == assessmentSheet.ExamRegistrationId);
            examRegistration.StatusId = (int)ExamRegStatusEnum.NotAppear;
            db.Entry(examRegistration).State = EntityState.Modified;

            var examRegistrationErrors = db.ExamRegistrationError.Where(w => w.ExamRegistrationId == id);
            if (examRegistrationErrors.Any())
            {
                foreach (var e in examRegistrationErrors)
                {
                    db.ExamRegistrationError.Remove(e);
                }
            }

            RemoveReport(id);
        }
 public void SaveAssessmentSheetCity(int id, AssessmentSheetViewModel assessmentSheet)
 {
     if (assessmentSheet.NotAppearOnTheExam)
     {
         //Не се појави на испит
         NotAppearOnTheExam(id, assessmentSheet);
     }
     else
     {
         // Се појавил на испит
         AppearOnTheExamCity(id, assessmentSheet);
     }
 }
        public void GetAssessmentSheetCity(AssessmentSheetViewModel data, DrivingCategory drivingCategory, ViewExamRegistration examRegistration, int id)
        {
            data.AllowedNegativePoints = drivingCategory.AllowedNegativePracticle;
            data.NotAppearOnTheExam = examRegistration.ExamRegistrationStatusId == 4;
            data.City = new List<AssessmentSheetPolygonCityViewModel>();

            if (drivingCategory.Category.Trim().Equals("А") || drivingCategory.Category.Trim().Equals("A1"))
            {
                CreateQuestionListPolygonCity(id, "А кат", data.City);
            }
            else
            {
                CreateQuestionListPolygonCity(id, "бр2", data.City);
            }
        }
        public void GetAssessmentSheetTheory(AssessmentSheetViewModel data, DrivingCategory drivingCategory, ViewExamRegistration examRegistration, int id)
        {
            data.AllowedNegativePoints = drivingCategory.AllowedNegativeTheory;
            data.NotAppearOnTheExam = examRegistration.ExamRegistrationStatusId == 4;
            data.Theory = new AssessmentSheetTheoryViewModel();

            if (db.Report.Any(a => a.ExamRegistrationId == id))
            {
                var existingReport = db.Report.First(f => f.ExamRegistrationId == id);
                data.Theory.NegativePoints = (int)existingReport.NegativePoints;
            }
            else
            {
                data.Theory.NegativePoints = 0;
            }
        }