public ActionResult ConfigurationEstudiante()
        {
            IRepositorio<Alumno> repositorioAlumno = new AlumnoRepositorio();
            int cedula = (int)Session["cedula"];
            Alumno alumno = repositorioAlumno.GetById(cedula);
            IRepositorio<Materium> repositorioMaterium = new MateriumRepositorio();

            IRepositorio<ClaseEvaluacion> repositorioHorarioClase = new HorarioClaseRepositorio();
            var listCronograma = repositorioHorarioClase.GetAll().Where(a => a.Cedula == alumno.Cedula);

            IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();
            var listActividades = repositorioActividad.GetAll().Where(a => a.Periodo.CompareTo(_periodoActual) == 0);

            var misMaterias = (from d in listCronograma
                               from c in listActividades
                               where c.Tipo.CompareTo("Clase") == 0 &&
                                     d.IdActividad == c.IdActividad
                               select c.IdMateria).Distinct();

            alumno.Materiums = new List<Materium>();

            IRepositorio<HorarioPreferencia> repositorioHorarioPreferencia = new HorarioPreferenciaRepositorio();
            var listHorariosPreferencia = repositorioHorarioPreferencia.GetAll().Where(horario => horario.Cedula == alumno.Cedula).ToList();
            alumno.HorarioPreferencia = listHorariosPreferencia;

            IRepositorio<AlumnoMaterium> repositorioAlumnoMat = new AlumnoMateriumRepositorio();
            foreach (var materia in misMaterias)
            {
                var mat = repositorioMaterium.GetById(materia);
                mat.Preferencia = repositorioAlumnoMat.GetAll().Where(aM => aM.Cedula == cedula &&
                                                                            aM.IdMateria == mat.IdMateria).First().Preferencia;
                alumno.Materiums.Add(mat);
            }

            return View("Configuration", alumno);
        }
        private void GuardarActMejorHorario(DateTime miFecha, AlumnoMaterium alumnoMaterium, int diasEstudio)
        {
            var periodoActual = Helper.CalcularPeriodoActual();
            IRepositorio<HorarioPreferencia> repositorioHorarioPreferencia = new HorarioPreferenciaRepositorio();
            IRepositorio<AlumnoMaterium> repositorioAlumnoMateria = new AlumnoMateriumRepositorio();

            IRepositorio<Materium> repositorioMaterium = new MateriumRepositorio();
            IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();

            IRepositorio<ClaseEvaluacion> repositorioClaseEvaluacion = new HorarioClaseRepositorio();
            var listMisClasesEvaluacion = repositorioClaseEvaluacion.GetAll().Where(cE => cE.Cedula == alumnoMaterium.Cedula).ToList();

            var misActividades = (from a in repositorioActividad.GetAll()
                                  where a.Cedula == alumnoMaterium.Cedula
                                  select a).ToList();

            misActividades.AddRange(listMisClasesEvaluacion.Select(claseEvaluacion => repositorioActividad.GetById(claseEvaluacion.IdActividad)));

            var horarioDisponible = repositorioHorarioPreferencia.GetAll().
                        Where(hp => hp.Cedula == alumnoMaterium.Cedula &
                                    hp.Tipo.CompareTo("Definitivo") == 0).ToList();

            var miHorarioOcupado = (from a in misActividades
                                    where a.Cedula == alumnoMaterium.Cedula &
                                          a.HoraInicio.Date == miFecha.Date
                                    select a).ToList();

            foreach (var claseEvaluacion in listMisClasesEvaluacion)
            {
                var miActClase = repositorioActividad.GetById(claseEvaluacion.IdActividad);
                if (miActClase.HoraInicio.Date == miFecha.Date)
                {
                    miHorarioOcupado.Add(miActClase);
                }
            }

            //Elimino las horas ocupadas de HOY en el arreglo de disponibles
            foreach (var actividad in miHorarioOcupado)
            {
                DateTime horaFin = actividad.HoraFin.Minute > 0 ? actividad.HoraFin.AddHours(1) : actividad.HoraFin;
                for (int i = actividad.HoraInicio.Hour; i < horaFin.Hour; i++)
                {
                    var horaOcupada = (from hora in horarioDisponible
                                       where hora.HoraInicio.Hour == i
                                       select hora);
                    if (horaOcupada.Count() != 0)
                    {
                        horarioDisponible.Remove(horaOcupada.First());
                    }
                }
            }

            //Ordeno las horas disponibles segun su prioridad
            var miHorarioDisponible = (from horario in horarioDisponible
                                       orderby horario.Preferencia descending
                                       select horario).ToList();

            //Actualizo para c/hora disponible la fecha que voy a calendarizar
            foreach (var horarioPreferencia in miHorarioDisponible)
            {
                int horaIni = horarioPreferencia.HoraInicio.Hour;
                int horaFin = horarioPreferencia.HoraFin.Hour;
                horarioPreferencia.HoraInicio = new DateTime(miFecha.Year, miFecha.Month, miFecha.Day, horaIni, 0, 0);
                horarioPreferencia.HoraFin = new DateTime(miFecha.Year, miFecha.Month, miFecha.Day, horaFin, 0, 0);
            }

            //Calculo cuantas horas se calendarizaran
            var horaDiaria = Math.Ceiling(alumnoMaterium.HorasPersonales / diasEstudio);
            var horaDiariaReal = alumnoMaterium.HorasPersonales / diasEstudio;
            //Busco el mejor horario para calendarizar la actividad
            bool flag2;
            HorarioPreferencia preferenciaAux;
            double mayorPrioridad = 0;
            do
            {
                mayorPrioridad = miHorarioDisponible[0].Preferencia;
                var mayorPreferencia = new HorarioPreferencia();
                preferenciaAux = new HorarioPreferencia { MayorPreferencia = 0 };
                foreach (var horarioD in miHorarioDisponible)
                {
                    if (horarioD.Preferencia.CompareTo(mayorPrioridad) == 0)
                    {
                        mayorPreferencia.Cedula = horarioD.Cedula;
                        mayorPreferencia.HoraInicio = horarioD.HoraInicio;
                        mayorPreferencia.HoraFin = horarioD.HoraFin;
                        mayorPreferencia.Preferencia = horarioD.Preferencia;
                        mayorPreferencia.Tipo = horarioD.Tipo;
                        mayorPreferencia.IdPreferencia = horarioD.IdPreferencia;
                        mayorPreferencia.MayorPreferencia = horarioD.Preferencia;
                        for (int i = 1; i < horaDiaria; i++)
                        {
                            var horaBuscada = (from h in horarioDisponible
                                               where
                                                   h.HoraInicio.CompareTo(horarioD.HoraInicio.AddHours(i)) == 0
                                               select h);
                            if (horaBuscada.Count() != 0)
                            {
                                mayorPreferencia.MayorPreferencia += horaBuscada.First().Preferencia;
                            }
                            else
                            {
                                mayorPreferencia = new HorarioPreferencia();
                                break;
                            }
                        }
                        if (mayorPreferencia.Cedula != 0)
                        {
                            if (mayorPreferencia.MayorPreferencia > preferenciaAux.MayorPreferencia)
                            {
                                preferenciaAux.Cedula = mayorPreferencia.Cedula;
                                preferenciaAux.HoraInicio = mayorPreferencia.HoraInicio;
                                preferenciaAux.HoraFin = mayorPreferencia.HoraFin;
                                preferenciaAux.Preferencia = mayorPreferencia.Preferencia;
                                preferenciaAux.Tipo = mayorPreferencia.Tipo;
                                preferenciaAux.IdPreferencia = mayorPreferencia.IdPreferencia;
                                preferenciaAux.MayorPreferencia = mayorPreferencia.MayorPreferencia;
                            }
                        }
                    }
                }
                if (preferenciaAux.Cedula == 0)
                {
                    flag2 = true;
                    miHorarioDisponible.RemoveAt(0);
                }
                else
                {
                    flag2 = false;
                }
            } while (flag2 && miHorarioDisponible.Count != 0);

            //Si hay horario disponible se calendariza la actividad
            if (miHorarioDisponible.Count != 0)
            {
                var act = new Actividad
                {
                    HoraInicio = preferenciaAux.HoraInicio,
                    HoraFin = preferenciaAux.HoraInicio.AddHours(horaDiariaReal),
                    IdMateria = alumnoMaterium.IdMateria,
                    Nombre =
                        "Estudiar " +
                        repositorioMaterium.GetById(alumnoMaterium.IdMateria).Nombre,
                    Tipo = "Inteligente",
                    Periodo = periodoActual,
                    Cedula = alumnoMaterium.Cedula
                };
                repositorioActividad.Save(act);
                alumnoMaterium.HorasAcumuladas += horaDiariaReal;
                repositorioAlumnoMateria.Update(alumnoMaterium);
            }
        }
        public ActionResult Configuration(Alumno alumno, FormCollection form)
        {
            int cont = 0;
            IRepositorio<AlumnoMaterium> repositorioAlumnoMateria = new AlumnoMateriumRepositorio();
            IList<AlumnoMaterium> listAlumnoMateria = repositorioAlumnoMateria.GetAll();

            IRepositorio<PromedioFactor> repositorioPromedioFactor = new PromedioFactorRepositorio();
            IList<PromedioFactor> listPromedioFactor = repositorioPromedioFactor.GetAll();

            IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();

            IRepositorio<Materium> repositorioMaterium = new MateriumRepositorio();
            IList<Materium> listMaterium = repositorioMaterium.GetAll();

            IRepositorio<HorarioPreferencia> repositorioHorarioPreferencia = new HorarioPreferenciaRepositorio();

            IRepositorio<ClaseEvaluacion> repositorioHorarioClase = new HorarioClaseRepositorio();
            var listCronograma = repositorioHorarioClase.GetAll().Where(alum => alum.Cedula == alumno.Cedula);

            var listActividades = repositorioActividad.GetAll().Where(a => a.Periodo.CompareTo(_periodoActual) == 0);

            var misMaterias = (from d in listCronograma
                               from c in listActividades
                               where c.Tipo.CompareTo("Clase") == 0 &&
                                     d.IdActividad == c.IdActividad
                               select c.IdMateria).Distinct();

            var misEvaluaciones = (from d in listCronograma
                                   from c in listActividades
                                   where c.Tipo.CompareTo("Evaluacion") == 0 &&
                                         d.IdActividad == c.IdActividad
                                   select c).ToList();

            var mayorCredito = (from mat in listMaterium
                                select mat.Creditos).Max();

            alumno.Materiums = new List<Materium>();
            foreach (var materia in misMaterias)
            {
                Materium mat = repositorioMaterium.GetById(materia);
                alumno.Materiums.Add(mat);
            }
            var strings = form.GetValues("selrate");
            if (strings != null)
            {
                if ((alumno.Materiums.Count + 15) == strings.Count())
                {
                    int contador = 0;
                    int sum = 0;
                    foreach (var value in strings)
                    {
                        if (contador > 14)
                        {
                            var alumnoMateria = (from mat in listAlumnoMateria
                                                 where mat.IdMateria == alumno.Materiums.ElementAt(cont).IdMateria &&
                                                       mat.Cedula == alumno.Cedula
                                                 select mat).First();
                            alumnoMateria.Preferencia = Convert.ToInt32(value);
                            var porcentajePref = (alumnoMateria.Preferencia * 100) / 5.0;

                            var promedio = (from prom in listPromedioFactor
                                            where
                                                prom.IdMateria == alumno.Materiums.ElementAt(cont).IdMateria &&
                                                prom.Factor.CompareTo("Promedio") == 0
                                            select prom.Promedio).First();

                            var porcentajeProm = (double)(((20 - promedio) * 100) / 20);

                            var uc = alumno.Materiums.ElementAt(cont).Creditos;

                            var porcentajeUC = (uc * 100) / mayorCredito;

                            alumnoMateria.Prioridad = (porcentajePref + porcentajeProm + porcentajeUC) / 3;

                            //Se toma en cuenta las notas obtenidas en las evaluaciones
                            foreach (var miEvaluacion in misEvaluaciones)
                            {
                                var miNota = (from cE in listCronograma
                                              where cE.IdActividad == miEvaluacion.IdActividad
                                              select cE.Nota).First();
                                if (miNota != 0.0)
                                {
                                    const int x1 = 10;
                                    const int y1 = 0;
                                    const int x2 = 20;
                                    var y2 = -alumnoMateria.Prioridad * (miEvaluacion.Ponderacion / 100.00);
                                    var pendiente1 = (y2 - y1) / (x2 - x1);
                                    var factorM = (miNota * pendiente1) - y2;
                                    alumnoMateria.Prioridad += factorM;
                                }
                            }

                            repositorioAlumnoMateria.Update(alumnoMateria);

                            cont++;
                        }
                        else
                        {
                            int hora = contador + 7;
                            var horaIni = new DateTime(2012, 01, 01, hora, 0, 0);
                            var horaFin = new DateTime(2012, 01, 01, hora + 1, 0, 0);

                            var listHorarioPref = repositorioHorarioPreferencia.GetAll();
                            var horarioPreferencia = (from hp in listHorarioPref
                                                      where hp.Cedula == alumno.Cedula &
                                                            hp.HoraInicio.CompareTo(horaIni) == 0 &
                                                            hp.HoraFin.CompareTo(horaFin) == 0 &
                                                            hp.Tipo.CompareTo("Personal") == 0
                                                      select hp);

                            int valor = Convert.ToInt32(value);

                            if (horarioPreferencia.Count() != 0)
                            {
                                var horarioPref = horarioPreferencia.First();
                                var diferenciaPref = valor - horarioPref.Preferencia;
                                horarioPref.Preferencia = valor;
                                repositorioHorarioPreferencia.Update(horarioPref);
                                var horarioPreferenciaDef = (from hp in listHorarioPref
                                                             where hp.Cedula == alumno.Cedula &
                                                                   hp.HoraInicio.CompareTo(horaIni) == 0 &
                                                                   hp.HoraFin.CompareTo(horaFin) == 0 &
                                                                   hp.Tipo.CompareTo("Definitivo") == 0
                                                             select hp).First();
                                horarioPreferenciaDef.Preferencia += diferenciaPref;
                                repositorioHorarioPreferencia.Update(horarioPreferenciaDef);
                            }
                            else
                            {
                                var horarioPref = new HorarioPreferencia
                                                        {
                                                            Cedula = alumno.Cedula,
                                                            HoraFin = horaFin,
                                                            HoraInicio = horaIni,
                                                            Preferencia = valor,
                                                            Tipo = "Personal"
                                                        };
                                repositorioHorarioPreferencia.Save(horarioPref);

                                /*OJO: Definir los parametros que influyan en este valor*/
                                int valorDefinitivo = valor;

                                horarioPref.Tipo = "Definitivo";
                                horarioPref.Preferencia = valorDefinitivo;
                                repositorioHorarioPreferencia.Save(horarioPref);
                            }
                        }
                        contador++;
                    }
                    FormsService.SignIn(alumno.Username, false /* createPersistentCookie */);
                }
                else
                {
                    ModelState.AddModelError("preferencias", "Todos las preferencias son requeridas.");
                    return View(alumno);
                }

                //Elimino todas las actividades inteligentes luego de hoy y resto las horas acumuladas
                var misActividadesIEliminar = repositorioActividad.GetAll().Where(a => a.Cedula == alumno.Cedula &&
                                                                               a.Tipo.CompareTo("Inteligente") == 0 &&
                                                                               a.HoraInicio >= DateTime.Now).ToList();
                foreach (var materia in misMaterias)
                {
                    double cantHoras = 0;
                    foreach (var actividad in misActividadesIEliminar)
                    {
                        if (actividad.IdMateria == materia)
                        {
                            cantHoras += (actividad.HoraFin.Hour + actividad.HoraFin.Minute / 60.00 + actividad.HoraFin.Second / 3600.00) -
                                         (actividad.HoraInicio.Hour + actividad.HoraInicio.Minute / 60.00 + actividad.HoraFin.Second / 3600.00);
                            repositorioActividad.Delete(actividad);
                        }
                    }
                    var mat = repositorioAlumnoMateria.GetAll().Where(aM => aM.IdMateria == materia &&
                                                                            aM.Cedula == alumno.Cedula).First();
                    mat.HorasAcumuladas -= cantHoras;
                    repositorioAlumnoMateria.Update(mat);
                }

                ActividadesInteligentes(alumno.Cedula);
            }
            else
            {
                ModelState.AddModelError("preferencias", "Todos las preferencias son requeridas.");
                return View(alumno);
            }
            return RedirectToAction("Index", "Home");
        }
        public ActionResult Nota(ClaseEvaluacion miEvaluacion)
        {
            if (ModelState.IsValid)
            {
                var miCedula = (int)Session["cedula"];
                //Actualizo la evaluacion con la nota respectiva
                IRepositorio<ClaseEvaluacion> repositorioClaseEvaluacion = new HorarioClaseRepositorio();
                repositorioClaseEvaluacion.Update(miEvaluacion);

                IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();
                var miActividad = repositorioActividad.GetById(miEvaluacion.IdActividad);

                IRepositorio<AlumnoMaterium> repositorioAlumnoMateria = new AlumnoMateriumRepositorio();

                //Elimino todas las actividades inteligentes luego de hoy y resto las horas acumuladas
                var misActividadesIEliminar = repositorioActividad.GetAll().Where(a => a.Cedula == miCedula &&
                                                                               a.Tipo.CompareTo("Inteligente") == 0 &&
                                                                               a.HoraInicio >= _fechaHoy).ToList();

                var listCronograma = repositorioClaseEvaluacion.GetAll().Where(alum => alum.Cedula == miCedula);

                var listActividades = repositorioActividad.GetAll().Where(a => a.Periodo.CompareTo(_periodoActual) == 0);

                var misMaterias = (from d in listCronograma
                                   from c in listActividades
                                   where c.Tipo.CompareTo("Clase") == 0 &&
                                         d.IdActividad == c.IdActividad
                                   select c.IdMateria).Distinct().ToList();
                foreach (var materia in misMaterias)
                {
                    double cantHoras = 0;
                    foreach (var actividad in misActividadesIEliminar.Where(a => a.IdMateria == materia).ToList())
                    {
                        cantHoras += (((actividad.HoraFin - actividad.HoraInicio).TotalSeconds) / 3600.00);
                        repositorioActividad.Delete(actividad);
                    }
                    var mat =
                        repositorioAlumnoMateria.GetAll().Where(aM => aM.IdMateria == materia && aM.Cedula == miCedula).
                            First();
                    mat.HorasAcumuladas -= cantHoras;
                    repositorioAlumnoMateria.Update(mat);
                }

                var miMateria = repositorioAlumnoMateria.GetAll().Where(aM => aM.Cedula == miCedula &&
                                                                              aM.IdMateria == miActividad.IdMateria).First();

                //HORAS DE ESTUDIO
                const int x1 = 10;
                const int y1 = 0;
                const int x2 = 20;
                var y2 = (miMateria.HorasPersonales * (miActividad.Ponderacion / 100.00)) * -1;
                var pendiente1 = (y2 - y1) / (x2 - x1);
                var factorM = (miEvaluacion.Nota * pendiente1) - y2;
                miMateria.HorasPersonales += factorM;

                //MATERIAS
                y2 = -miMateria.Prioridad * (miActividad.Ponderacion / 100.00);
                pendiente1 = (y2 - y1) / (x2 - x1);
                factorM = (miEvaluacion.Nota * pendiente1) - y2;
                miMateria.Prioridad = miMateria.Prioridad + factorM;

                repositorioAlumnoMateria.Update(miMateria);

                //BLOQUES DE ESTUDIO
                const double pendiente2 = 0.1;
                var factor = (pendiente2 * miEvaluacion.Nota - 1) * (miEvaluacion.Rating / 100.00);
                IRepositorio<HorarioPreferencia> repositorioHorarioPref = new HorarioPreferenciaRepositorio();

                var misPreferencias = repositorioHorarioPref.GetAll().Where(p => p.Cedula == miCedula &&
                                                                                 p.Tipo.CompareTo("Definitivo") == 0).ToList();

                var actividadesIAnteriores = repositorioActividad.GetAll().Where(a => a.Cedula == miCedula &&
                                                                               a.Tipo.CompareTo("Inteligente") == 0 &&
                                                                               a.IdMateria == miMateria.IdMateria &&
                                                                               a.HoraInicio < _fechaHoy).ToList();
                var misActividadesIAnteriores = new List<Actividad>();
                foreach (var actividadIAnterior in actividadesIAnteriores)
                {
                    var hI = new DateTime(2012, 01, 01, actividadIAnterior.HoraInicio.Hour, 0, 0);
                    var hF = new DateTime(2012, 01, 01, actividadIAnterior.HoraFin.Hour, 0, 0);
                    var actividad = new Actividad()
                                        {
                                            Cedula = actividadIAnterior.Cedula,
                                            FechaFinRepeticion = actividadIAnterior.FechaFinRepeticion,
                                            HoraFin = hF,
                                            HoraInicio = hI,
                                            IdActividad = actividadIAnterior.IdMateria,
                                            IdMateria = actividadIAnterior.IdMateria,
                                            IsMyComboDisabled = actividadIAnterior.IsMyComboDisabled,
                                            IsRepetible = actividadIAnterior.IsRepetible,
                                            Materia = actividadIAnterior.Materia,
                                            Nombre = actividadIAnterior.Nombre
                                        };
                    if (!misActividadesIAnteriores.Contains(actividad))
                    {
                        misActividadesIAnteriores.Add(actividad);
                    }
                }

                foreach (var actividadesIAnteriore in misActividadesIAnteriores)
                {
                    foreach (var horarioPreferencia in misPreferencias)
                    {
                        if (horarioPreferencia.HoraInicio.Hour == actividadesIAnteriore.HoraInicio.Hour)
                        {
                            var hora = horarioPreferencia.HoraInicio;
                            while (hora.Hour <= actividadesIAnteriore.HoraFin.Hour)
                            {
                                horarioPreferencia.Preferencia = horarioPreferencia.Preferencia + factor;
                                repositorioHorarioPref.Update(horarioPreferencia);
                                hora = hora.AddHours(1);
                            }
                        }
                    }
                }

                if (misActividadesIEliminar.Count > 0)
                {
                    //Calculo nuevamente las actividades inteligentes
                    var accountController = new AccountController();
                    accountController.ActividadesInteligentes(miCedula);
                }
                return RedirectToAction("Index");
            }
            return View(miEvaluacion);
        }