Пример #1
0
        private void AtualizaCalendarioProfessor(List <Professor> profs, List <CalendarioProfessor> calendario_prof, int codCalendario)
        {
            foreach (Professor prof in profs)
            {
                BD.DiminuiCargaHoraria(_cargaHorariaDiminuir, codCalendario, prof.Codigo);

                CalendarioProfessor cp = calendario_prof.Where(p => p.Professor_Codigo == prof.Codigo).FirstOrDefault();
                if (cp != null)
                {
                    cp.Carga_Horaria_Disponivel -= _cargaHorariaDiminuir;
                }
            }
        }
Пример #2
0
        public List <CalendarioProva> GerarEscalacao(Calendario c)
        {
            List <DataProva>           listDataProva    = BD.RetornaDatasPorCalendario(c.Codigo);
            List <Professor>           listProfessores  = BD.RetornaTodosProfessores();                                            //PEGA TODOS OS PROFESSORES
            List <Professor>           profsNaoMesarios = listProfessores.Where(p => !p.Mesario && p.Carga_Horaria >= 2).ToList(); //pegar pela carga horaria disponivel
            List <Disponibilidade>     disponibilidades = BD.RetornaDisponibilidade();                                             //retorna toda disponibilidade
            List <ProfessorDisciplina> prof_disciplina  = BD.RetornaProfessorDisciplina();
            List <Turma> todasTurmas = BD.RetornaTurmas();
            List <Curso> todosCursos = BD.RetornaCurso();
            List <CalendarioProfessor> calendario_prof = BD.RetornaCalendarioProfessor();

            int      cProva = 0;
            int      segTotal = 0;
            DateTime dtInicial, dtFim;

            foreach (DataProva dp in listDataProva)
            {
                if (dp.Data.Day == 1 && dp.Data.Month == 11)
                {
                    continue;
                }

                foreach (HoraProva h in dp.Horas)
                {
                    List <Professor> profReservaMoocaEng  = new List <Professor>();
                    List <Professor> profReservaMooca     = new List <Professor>();
                    List <Professor> profReservaButataEng = new List <Professor>();
                    List <Professor> profReservaButata    = new List <Professor>();

                    //pega todos os profs na disponibilidade, ignorando o Campus
                    List <Professor> listProfessorN = RetornaListaProfsDisponiveis(disponibilidades, h, dp, profsNaoMesarios);

                    ZeraPontos(listProfessorN);
                    List <Prova>     provasEscaladasAtualizar = new List <Prova>();
                    List <Professor> professorAtualizar       = new List <Professor>();

                    foreach (Prova prova in h.Provas)
                    {
                        dtInicial = DateTime.Now;
                        cProva++;

                        //se ja tem professor escalado, pula pra não escalar dnv
                        if (prova.Professor_Codigo > 0)
                        {
                            continue;
                        }

                        //Se for prova especial, pega professor que da aula praquela disciplina e escala ele, saindo do loop
                        if (prova.Especial)
                        {
                            Professor profL = RetornaProfQueLecionaDisciplinaHorario(prof_disciplina, prova.Disciplina_Codigo, prova.Data, prova.Hora.Hours, c.Ano, prova.Unidade, disponibilidades, listProfessorN, prova.Regime);
                            if (profL != null)
                            {
                                if (profL != null)
                                {
                                    prova.Professor_Codigo = profL.Codigo;

                                    //Escala prova e atualiza carga_horaria_disponível a cada horario

                                    //Pega o Professor pra diminuir a carga horaria disponível do professor que vai aplicar a prova
                                    professorAtualizar.Add(profL);

                                    //Pega prova pra atualizar
                                    provasEscaladasAtualizar.Add(new Prova().Preenche(prova));

                                    //Remove professor da lista, pois o mesmo não pode mais ser escalado nesse horário
                                    listProfessorN.Remove(profL);

                                    Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Escalou DP");
                                }
                                else
                                {
                                    Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Não Escalou DP");
                                }
                            }


                            continue;
                        }

                        //valida se alguma prova daquele horario é na mesma sala, se for já coloca o aplicador igual
                        List <Prova> provaMesmaSala = h.Provas.Where(p => p.Sala_Codigo == prova.Sala_Codigo).ToList();
                        provaMesmaSala.Remove(prova);
                        bool saiLoop = false;

                        foreach (Prova prv in provaMesmaSala)
                        {
                            if (prv.Professor_Codigo > 0)
                            {
                                prova.Professor_Codigo = prv.Professor_Codigo;
                                professorAtualizar.Add(profsNaoMesarios.Where(p => p.Codigo == prv.Professor_Codigo).FirstOrDefault());
                                provasEscaladasAtualizar.Add(prova);

                                Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Escalou prova mesma sala");

                                saiLoop = true;
                            }
                        }

                        if (saiLoop)
                        {
                            continue;
                        }


                        List <Professor> profElegivel = new List <Professor>();
                        bool?            ehEngenharia = RetornaSeCursoEhEngenharia(todasTurmas, todosCursos, prova.Turma_Codigo);

                        if (ehEngenharia == null)
                        {
                            //não tem como escalar professor se não sabe se naquele horario ele da aula pra engenharia ou outros.
                            continue;
                        }

                        List <Prova> todasProvasDoDia = dp.RetornaProvasPorDia();
                        //pega a lista de professores disponiveis naquele dia/horario semestral ou anual de acordo com a prova
                        foreach (Professor prof in listProfessorN)
                        {
                            //valida se professor é responsavel
                            if (ProfessorEResponsavel(prof_disciplina, prof, prova))
                            {
                                continue;
                            }


                            //valida se professor tem carga horaria disponível pra aplicar a prova
                            CalendarioProfessor cp = calendario_prof.Where(p => p.Professor_Codigo == prof.Codigo).FirstOrDefault();
                            if (cp != null && cp.Carga_Horaria_Disponivel < 2)
                            {
                                continue;
                            }
                            prof.Carga_Horaria_Disponivel = cp.Carga_Horaria_Disponivel;

                            if (ProfessorPodeAplicarAProva(prof, todasTurmas, todosCursos, ehEngenharia.GetValueOrDefault(), prova.Turma_Codigo, dp.Data, h.Hora.Hours, c.Ano, prova.Unidade, disponibilidades, prova.Regime))
                            {
                                prof.Pontos += RetornaPontosProfLecionaDisciplina(prof, prova, prof_disciplina);
                                prof.Pontos += RetornaPontosProfAplicouProvaPrimeiroHorario(prof, todasProvasDoDia);
                                List <Prova> provasDiaAnterior = RetornaProvaDiaAnterior(listDataProva, dp);
                                prof.Pontos += RetornaPontosProfAplicouProvaDiaAnterior(prof, provasDiaAnterior, dp.Data);
                                prof.Pontos += RetornaPontosProfResponsavelProvaDiaAnterior(prof, provasDiaAnterior, dp.Data, prof_disciplina);
                                profElegivel.Add(prof);
                            }
                        }

                        if (profElegivel.Count > 0)
                        {
                            profElegivel = profElegivel.OrderBy(p => p.Pontos).ThenByDescending(p => p.Carga_Horaria_Disponivel).ToList();
                            Professor profSelecionado = profElegivel.FirstOrDefault();

                            if (profSelecionado != null)
                            {
                                prova.Professor_Codigo = profSelecionado.Codigo;

                                //Escala prova e atualiza carga_horaria_disponível a cada horario
                                //Pega o Professor pra diminuir a carga horaria disponível do professor que vai aplicar a prova
                                professorAtualizar.Add(profSelecionado);
                                //Pega prova pra atualizar
                                provasEscaladasAtualizar.Add(new Prova().Preenche(prova));

                                //Remove professor da lista, pois o mesmo não pode mais ser escalado nesse horário
                                listProfessorN.Remove(profSelecionado);
                                profElegivel.Remove(profSelecionado);


                                if (prova.Unidade == Unidade.Mooca && ehEngenharia == true)
                                {
                                    profReservaMoocaEng.AddRange(profElegivel);
                                }
                                else if (prova.Unidade == Unidade.Mooca)
                                {
                                    profReservaMooca.AddRange(profElegivel);
                                }
                                else if (prova.Unidade == Unidade.Butata && ehEngenharia == true)
                                {
                                    profReservaButataEng.AddRange(profElegivel);
                                }
                                else if (prova.Unidade == Unidade.Butata)
                                {
                                    profReservaButata.AddRange(profElegivel);
                                }


                                Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Escalou");
                            }
                            else
                            {
                                Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Não Escalou");
                            }
                        }
                        else
                        {
                            Console.WriteLine(prova.Codigo + " - " + DateTime.Now + " - Não Escalou");
                        }

                        dtFim     = DateTime.Now;
                        segTotal += (int)(dtFim - dtInicial).TotalSeconds;
                        Console.WriteLine("Segundos: " + (int)(dtFim - dtInicial).TotalSeconds + ". Média: " + (segTotal / cProva) + ". Provas: " + cProva);
                    }

                    //Atualiza Provas, Calendario_has_Professor e adiciona fila reserva no BD
                    AtualizaProvas(provasEscaladasAtualizar);
                    AtualizaCalendarioProfessor(professorAtualizar, calendario_prof, c.Codigo);
                    //GeraListaReservaHorario(h.Provas, calendario_prof, disponibilidades, listProfessorN, c, todasTurmas, todosCursos);
                    GeraListaReservasHorario(h.Provas, profReservaMoocaEng, profReservaMooca, profReservaButataEng, profReservaButata, c, dp.Data, h.Hora);
                }
            }

            Console.WriteLine("Média em seg por prova: " + (segTotal / cProva));

            return(BD.RetornaCalendarioProva());
        }