예제 #1
0
 public Resultaat GetResultaatByStudentId(int id)
 {
     return(resultaatRepository.getByStudentId(id));
 }
        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();
                }
            }
        }