public ActionResult Beoordeling(BeoordelingsVM vm)
        {
            int count = beoordelingsService.getTotaalAantalDeelaspecten(vm.MatrixID, vm.Rol_ID);

            if (vm.Scores != null)
            {
                if (count == vm.Scores.Count)
                {
                    vm.Matrix = beoordelingsService.GetMatrix(vm.MatrixID);
                    beoordelingsService.CreateBeoordeling(vm);


                    return(RedirectToAction("Index"));
                }
                else
                {
                    vm.Scores.Clear();
                }
            }

            vm.Matrix = beoordelingsService.GetMatrixForRol(vm.MatrixID, vm.Rol_ID);

            vm.Scores = new List <double>();
            for (int i = 0; i < count; i++)
            {
                vm.Scores.Add(0);
            }

            ViewBag.Error = "Gelieve een graad voor ieder deelaspect in te vullen";
            vm.Student    = studentService.GetStudentByID(vm.Student.ID);
            vm.Resultaten = new Resultaat();
            return(View(vm));
        }
        public ActionResult Beoordeling(string studentRol, bool cfaanwezig = false, int matrix = 0)
        {
            if (studentRol != null && !studentRol.Equals(""))
            {
                string[] parts = studentRol.Split('.');

                int studentID = 0;
                int rolID     = 0;

                if (parts.Length == 2)
                {
                    if (int.TryParse(parts[0], out studentID) && int.TryParse(parts[1], out rolID))
                    {
                        if (matrix != 0)
                        {
                            if (!((rolID == 2 && matrix == 2) || (rolID == 3 && matrix == 2)))
                            {
                                // Geen tweede lezer of kritische vriend mag tussenbeoordelingen doen

                                BeoordelingsVM vm = new BeoordelingsVM();

                                //tussentijds=2, eind=1
                                if (matrix == 1)
                                {
                                    Student temp = studentService.GetStudentByID(studentID);
                                    vm.MatrixID = beoordelingsService.GetMatrixIdByRichtingByType(false, temp.Opleiding);
                                }
                                else
                                {
                                    Student temp = studentService.GetStudentByID(studentID);
                                    vm.MatrixID = beoordelingsService.GetMatrixIdByRichtingByType(true, temp.Opleiding);
                                }

                                vm.CFaanwezig = cfaanwezig;
                                //vm.MatrixID = matrix;
                                vm.Matrix  = beoordelingsService.GetMatrixForRol(vm.MatrixID, rolID);
                                vm.Student = studentService.GetStudentByID(studentID);

                                vm.Rol_ID     = rolID;
                                vm.Resultaten = new Resultaat();

                                return(View(vm));
                            }
                        }
                    }
                }
            }

            return(RedirectToAction("Index"));
        }
        public void CreateBeoordeling(BeoordelingsVM vm)
        {
            Matrix m         = matrixRepository.GetByID(vm.MatrixID);
            int    studentid = resultaatRepository.ifExistsGetStudentId(vm.Student.ID);

            if (studentid != 0) //bestaande record aanpassen
            {
                Resultaat exist = resultaatRepository.getByStudentId(studentid);
                exist.CustomFeedback = vm.feedback;
                if (m.Tussentijds == true)
                {
                    exist.TussentijdseId = m.ID;

                    //de bestaande lijst met deelaspectresultaten updaten we met de nieuw gekozen score
                    //We hergebruiken de bestaande lijst zodat we zijn eigen ID waarde behouden zodat we de database niet overspoelen met onnodige records
                    List <DeelaspectResultaat> newdeelres = FillDeelaspectResultaten(m, vm.Scores);
                    List <DeelaspectResultaat> olddeelres = exist.DeelaspectResultaten;

                    if (olddeelres.Count != 0)
                    {
                        for (int i = 0; i < newdeelres.Count(); i++)
                        {
                            olddeelres[i].DeelaspectId = newdeelres[i].DeelaspectId;
                            olddeelres[i].Score        = newdeelres[i].Score;
                        }

                        exist.DeelaspectResultaten = olddeelres;
                    }
                    else
                    {
                        List <Deelaspect> deelasp = matrixRepository.getDeelaspectenForMatrix(vm.MatrixID);
                        for (int i = 0; i < deelasp.Count; i++)
                        {
                            newdeelres[i].DeelaspectId = deelasp[i].ID;
                        }

                        exist.DeelaspectResultaten = newdeelres;
                    }

                    List <double> scores   = GetListDeelaspectScore(exist.DeelaspectResultaten);
                    List <int>    wegingen = GetListDeelaspectWegingen(exist.DeelaspectResultaten);

                    exist.TotaalTussentijdResultaat = beoordelingsEngine.totaalScore(scores, wegingen);

                    resultaatRepository.Update(exist);
                    uow.SaveChanges();
                }
                else
                {
                    // eindscoreberekening bestaand resultaat
                    // Ultieme eindscore kan pas berekend worden eens alle rollen de beoordeling hebben voltooid
                    // totaalscores hoofdaspecten optellen en delen door (maximum te behalen punten / gewogen score)
                    // de behaalde resultaten allemaal optellen en delen door 10
                    // Math.Ceiling voor afronding

                    //hoofdaspectresultaten in de database steken !checken of ze al bestaan, zo ja, overschrijven!
                    if (exist.HoofdaspectResultaten.Any(h => h.Rol.ID == vm.Rol_ID))
                    {
                        exist.CFaanwezig = vm.CFaanwezig;
                        int hoofdaspectcounter = 0;
                        //Matrix mat = matrixRepository.GetMatrixForRol(vm.MatrixID, vm.Rol_ID);

                        List <double> hoofdaspectScore = new List <double>();
                        List <int>    weging           = new List <int>();

                        foreach (HoofdaspectResultaat h in exist.HoofdaspectResultaten)
                        {
                            if (h.Rol.ID == vm.Rol_ID)
                            {
                                for (int i = 0; i < matrixRepository.GetDeelaspectenCountForHoofdaspect(h.HoofdaspectId); i++)
                                {
                                    hoofdaspectScore.Add(vm.Scores[i]);
                                }

                                weging.Add(matrixRepository.GetWegingForHoofdaspect(h.HoofdaspectId));

                                h.Score = beoordelingsEngine.totaalScore(hoofdaspectScore, weging);

                                hoofdaspectScore.Clear();
                                weging.Clear();

                                hoofdaspectcounter++;
                            }
                        }

                        resultaatRepository.Update(exist);
                        uow.SaveChanges();
                    }
                    else //er zijn nog GEEN hoofdaspectresultaten van deze rol
                    {
                        List <HoofdaspectResultaat> hoofdreslist = new List <HoofdaspectResultaat>();

                        //Matrix mat = matrixRepository.GetMatrixForRol(m.ID, vm.Rol_ID);
                        List <Hoofdaspect> hoofdaspecten = matrixRepository.GetHoofdaspectenForMatrix(vm.MatrixID);
                        int counter = 0;

                        List <double> hoofdaspectScore = new List <double>();
                        List <int>    wegingen         = new List <int>();

                        foreach (Hoofdaspect h in hoofdaspecten)
                        {
                            if (h.Rollen.Any(r => r.ID == exist.StudentId))
                            {
                                HoofdaspectResultaat hoofdres = new HoofdaspectResultaat();
                                foreach (Deelaspect d in h.Deelaspecten)
                                {
                                    hoofdaspectScore.Add(vm.Scores[counter]);
                                    counter++;
                                }
                                hoofdres.HoofdaspectId = h.ID;
                                hoofdres.Rol           = rolRepository.GetByID(vm.Rol_ID);

                                wegingen.Add(matrixRepository.GetWegingForHoofdaspect(h.ID));

                                hoofdres.Score = beoordelingsEngine.totaalScore(hoofdaspectScore, wegingen);

                                hoofdreslist.Add(hoofdres);

                                hoofdaspectScore.Clear();
                                wegingen.Clear();
                            }
                        }
                        exist.CFaanwezig = vm.CFaanwezig;
                        exist.HoofdaspectResultaten.AddRange(hoofdreslist);

                        resultaatRepository.Update(exist);
                        uow.SaveChanges();
                    }

                    exist.EindId = m.ID;

                    //controleren of alle rollen de beoordeling hebben voltooid
                    List <string> namen = resultaatRepository.CheckIfRolesCompleted(vm.Student.ID);

                    if (vm.breekpunten == false)
                    {
                        if (namen.Count == 3 || (namen.Count == 2 && exist.CFaanwezig == false))
                        {
                            //totaalscore berekenen
                            List <double> eindscore    = new List <double>();
                            List <int>    wegingen     = new List <int>();
                            List <double> tussenscores = new List <double>();

                            List <Hoofdaspect> test = matrixRepository.GetHoofdaspectenForMatrix(vm.MatrixID);

                            foreach (Hoofdaspect h in test)
                            {
                                List <double> hoofdaspectscores = resultaatRepository.GetScoresForHoofdaspect(h.ID, vm.Student.ID);

                                double totaalaspectscore = 0;
                                foreach (double score in hoofdaspectscores)
                                {
                                    totaalaspectscore += score;
                                }

                                int aantalRollen = 0;
                                if (exist.CFaanwezig == true)
                                {
                                    aantalRollen = resultaatRepository.GetAantalRollenForHoofdaspect(h.ID, true);
                                }
                                else
                                {
                                    aantalRollen = resultaatRepository.GetAantalRollenForHoofdaspect(h.ID, false);
                                }

                                double delingfactor = h.Deelaspecten.Count() * aantalRollen * 20;
                                totaalaspectscore = totaalaspectscore / (delingfactor / h.GewogenScore);
                                tussenscores.Add(totaalaspectscore);
                            }

                            double somtotaal = 0;

                            foreach (double score in tussenscores)
                            {
                                somtotaal += score;
                            }

                            somtotaal = Math.Round(somtotaal / 10);

                            exist.TotaalEindresultaat = somtotaal;
                        }
                    }
                    else
                    {
                        exist.TotaalEindresultaat = 6;
                        stuurBreekpuntMail(studentid);
                    }
                    vm.Matrix = matrixRepository.GetByID(vm.MatrixID);

                    ApplicationUser admin = adminService.GetAdmin();
                    if (admin.MailZenden)
                    {
                        stuurMail(studentid);
                    }

                    resultaatRepository.Update(exist);
                    uow.SaveChanges();
                }
            }
            else //nieuw record in database
            {
                Resultaat newres = new Resultaat();
                newres.CustomFeedback = vm.feedback;
                newres.StudentId      = vm.Student.ID;
                if (m.Tussentijds == true)
                {
                    newres.TussentijdseId       = m.ID;
                    newres.DeelaspectResultaten = FillDeelaspectResultaten(m, vm.Scores);

                    List <double> scores   = GetListDeelaspectScore(newres.DeelaspectResultaten);
                    List <int>    wegingen = GetListDeelaspectWegingen(newres.DeelaspectResultaten);

                    if (vm.breekpunten == false)
                    {
                        newres.TotaalTussentijdResultaat = beoordelingsEngine.totaalScore(scores, wegingen);
                    }
                    else
                    {
                        newres.TotaalTussentijdResultaat = 6;
                        //mail sturen
                        stuurBreekpuntMail(studentid);
                    }

                    resultaatRepository.Insert(newres);
                    uow.SaveChanges();
                }
                else
                {
                    newres.EindId = m.ID;

                    List <HoofdaspectResultaat> hoofdreslist = new List <HoofdaspectResultaat>();

                    Matrix mat     = matrixRepository.GetByID(m.ID);
                    int    counter = 0;

                    List <double> hoofdaspectScore = new List <double>();
                    List <int>    wegingen         = new List <int>();

                    foreach (Hoofdaspect h in mat.Hoofdaspecten)
                    {
                        if (h.Rollen.Any(r => r.ID == vm.Rol_ID))
                        {
                            HoofdaspectResultaat hoofdres = new HoofdaspectResultaat();

                            foreach (Deelaspect d in h.Deelaspecten)
                            {
                                hoofdaspectScore.Add(vm.Scores[counter]);
                                counter++;
                            }

                            hoofdres.HoofdaspectId = h.ID;
                            hoofdres.Rol           = rolRepository.GetByID(vm.Rol_ID);

                            wegingen.Add(matrixRepository.GetWegingForHoofdaspect(h.ID));

                            hoofdres.Score = beoordelingsEngine.totaalScore(hoofdaspectScore, wegingen);

                            hoofdreslist.Add(hoofdres);
                            wegingen.Clear();
                        }
                    }

                    newres.HoofdaspectResultaten = hoofdreslist;
                    resultaatRepository.Insert(newres);
                    uow.SaveChanges();
                }
            }
        }