public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ValidateUser(model.UserName, model.Password))
                {
                    FormsService.SignIn(model.UserName, model.RememberMe);
                    var roleEstudiante = Roles.GetUsersInRole("Estudiante");
                    bool flag = false;
                    foreach (var rol in roleEstudiante)
                    {
                        if (rol.CompareTo(model.UserName) == 0)
                        {
                            flag = true;
                        }
                    }
                    if (flag)
                    {
                        IRepositorio<Alumno> repoAlumno = new AlumnoRepositorio();
                        var miAlumno = repoAlumno.GetByUniqueAtribute(model.UserName);
                        if (miAlumno != null)
                        {
                            Session["cedula"] = miAlumno.Cedula;

                            /*
                             * Si no tengo actividades de clase
                             * invoco al trigger de Alumno
                             */
                            IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();
                            var misActividades = new List<Actividad>();

                            IRepositorio<ClaseEvaluacion> repositorioClaseE = new HorarioClaseRepositorio();
                            var listClaseEvaluacion = repositorioClaseE.GetAll().Where(cE => cE.Cedula == miAlumno.Cedula).ToList();

                            foreach (var claseEvaluacion in listClaseEvaluacion)
                            {
                                var actividad = repositorioActividad.GetById(claseEvaluacion.IdActividad);
                                if (actividad.Tipo.CompareTo("Clase") == 0 &&
                                    actividad.Periodo.CompareTo((_periodoActual)) == 0)
                                {
                                    misActividades.Add(actividad);
                                }
                            }
                            if (misActividades.Count == 0)
                            {
                                repoAlumno.Update(miAlumno);
                            }
                            /*
                             * Si no tengo actividades inteligentes
                             * en el periodo actual, se calculan
                             */
                            var actInteligentes =
                                repositorioActividad.GetAll().Where(a => a.Cedula == miAlumno.Cedula &&
                                                                         a.Tipo.CompareTo("Inteligente") == 0 &&
                                                                         a.Periodo.CompareTo(_periodoActual) == 0).ToList();
                            if (actInteligentes.Count() == 0)
                            {
                                IRepositorio<ClaseEvaluacion> repositorioHorarioClase = new HorarioClaseRepositorio();
                                var listCronograma = repositorioHorarioClase.GetAll().Where(alum => alum.Cedula == miAlumno.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();

                                HorasPersonales(misMaterias, miAlumno);

                                IRepositorio<Materium> repositorioMateria = new MateriumRepositorio();
                                IRepositorio<AlumnoMaterium> repositorioAlumnoMat = new AlumnoMateriumRepositorio();
                                IRepositorio<PromedioFactor> repositorioPromedioFactor = new PromedioFactorRepositorio();
                                IList<PromedioFactor> listPromedioFactor = repositorioPromedioFactor.GetAll();

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

                                foreach (var miMateria in misMaterias)
                                {
                                    var alumnoMateria =
                                        repositorioAlumnoMat.GetAll().Where(aM => aM.IdMateria == miMateria &&
                                                                                  aM.Cedula == miAlumno.Cedula).First();
                                    if (alumnoMateria.Preferencia != 0.00)
                                    {
                                        var promedio = (from prom in listPromedioFactor
                                                        where prom.IdMateria == miMateria &&
                                                              prom.Factor.CompareTo("Promedio") == 0
                                                        select prom.Promedio).First();

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

                                        var materia = repositorioMateria.GetById(miMateria);

                                        var uc = materia.Creditos;

                                        var porcentajeUC = (uc * 100) / mayorCredito;

                                        var porcentajePref = (alumnoMateria.Preferencia * 100) / 5.0;

                                        alumnoMateria.Prioridad = (porcentajePref + porcentajeProm + porcentajeUC) / 3;
                                    }
                                    else
                                    {
                                        var promedio = (from prom in listPromedioFactor
                                                        where prom.IdMateria == miMateria &&
                                                              prom.Factor.CompareTo("Promedio") == 0
                                                        select prom.Promedio).First();

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

                                        var materia = repositorioMateria.GetById(miMateria);

                                        var uc = materia.Creditos;

                                        var porcentajeUC = (uc * 100) / mayorCredito;

                                        alumnoMateria.Prioridad = (porcentajeProm + porcentajeUC) / 2;
                                    }

                                    //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;
                                        }
                                    }

                                    repositorioAlumnoMat.Update(alumnoMateria);
                                }
                                ActividadesInteligentes(miAlumno.Cedula);
                            }
                            if (!String.IsNullOrEmpty(returnUrl))
                            {
                                return Redirect(returnUrl);
                            }
                            return RedirectToAction("Index", "Home");
                        }
                    }
                    else
                    {
                        var roleProfesor = Roles.GetUsersInRole("Profesor");
                        flag = false;
                        foreach (var rol in roleProfesor)
                        {
                            if (rol.CompareTo(model.UserName) == 0)
                            {
                                flag = true;
                            }
                        }
                        if (flag)
                        {
                            IRepositorio<Profesor> repoProfesor = new ProfesorRepositorio();
                            var miProfesor = repoProfesor.GetByUniqueAtribute(model.UserName);
                            if (miProfesor != null)
                            {
                                Session["cedula"] = miProfesor.Cedula;
                                repoProfesor.Update(miProfesor);
                                if (!String.IsNullOrEmpty(returnUrl))
                                {
                                    return Redirect(returnUrl);
                                }
                                return RedirectToAction("IndexProfesor", "Home");
                            }
                        }
                    }
                }
                ModelState.AddModelError("NCIncorrecto", "El nombre de usuario o la contraseña especificados son incorrectos.");
            }
            // Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
            return View(model);
        }
        public ActionResult RegisterProfesor(Profesor profesor)
        {
            if (ModelState.IsValid)
            {
                if (profesor.Password == profesor.ConfirmPassword)
                {
                    IRepositorio<Profesor> repositorioProfesor = new ProfesorRepositorio();
                    var miProfesor = repositorioProfesor.GetByUniqueAtribute(profesor.Username);

                    IRepositorio<Alumno> repositorioAlumno = new AlumnoRepositorio();
                    var miAlumno = repositorioAlumno.GetByUniqueAtribute(profesor.Username);

                    if (miProfesor == null && miAlumno == null)
                    {
                        MembershipCreateStatus createStatus = MembershipService.CreateUser(profesor.Username,
                                                                                           profesor.Password,
                                                                                           profesor.Nombre.Substring(0, 1) + profesor.Apellido + "@ucab.edu.ve");
                        if (createStatus == MembershipCreateStatus.Success)
                        {
                            if (Roles.RoleExists("Profesor"))
                            {
                                Roles.AddUserToRole(profesor.Username, "Profesor");
                            }
                            else
                            {
                                Roles.CreateRole("Profesor");
                                Roles.AddUserToRole(profesor.Username, "Profesor");
                            }
                            profesor.CreationDate = DateTime.Today;
                            var prof = repositorioProfesor.GetById(profesor.Cedula);
                            var flag = prof == null ? repositorioProfesor.Save(profesor) : repositorioProfesor.Update(profesor);

                            if (flag.CompareTo("true") == 0)
                            {
                                Session["cedula"] = profesor.Cedula;
                                IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();
                                var listActividades =
                                    repositorioActividad.GetAll().Where(a => a.Profesor == profesor.Cedula &&
                                                                             a.Periodo.CompareTo(_periodoActual) == 0 &&
                                                                             a.Tipo.CompareTo("Clase") == 0).ToList();
                                var misMaterias = new List<Materium>();
                                IRepositorio<Materium> repositorioMateria = new MateriumRepositorio();
                                foreach (var actividad in listActividades)
                                {
                                    var materia = repositorioMateria.GetById(actividad.IdMateria);
                                    materia.Seccion = actividad.Seccion;
                                    if (!misMaterias.Contains(materia))
                                    {
                                        misMaterias.Add(materia);
                                    }
                                }
                                profesor.Materiums = misMaterias;
                                FormsService.SignIn(profesor.Username, false /* createPersistentCookie */);
                                return View("ConfigurationProfesor", profesor);
                            }
                            else
                            {
                                ModelState.AddModelError("saveAlumno", "Oops! Ha ocurrido un error inesperado, vuelva a intentarlo.");
                            }
                        }
                        else
                        {
                            ModelState.AddModelError("passOrUsername", AccountValidation.ErrorCodeToString(createStatus));
                        }
                    }
                    else
                    {
                        ModelState.AddModelError("passOrUsername", "Oops!! El nombre de usuario ya existe, por favor intente con otro.");
                    }
                }
                else
                {
                    ModelState.AddModelError("contrasenia", "Las contraseñas no coinciden.");
                }
            }
            return View(profesor);
        }
        protected void ActualizarAlumno(int miCedula)
        {
            var fechaActual = DateTime.Now;
            var semestre2 = new DateTime(fechaActual.Year, 03, 01);
            var verano1 = new DateTime(fechaActual.Year, 07, 01);
            var verano2 = new DateTime(fechaActual.Year, 10, 01);
            string periodoActual;
            if (fechaActual < semestre2)
            {
                periodoActual = (fechaActual.Year - 1) + "22";
            }
            else if (fechaActual > verano1 && fechaActual < verano2)
            {
                periodoActual = (fechaActual.Year - 1) + "23";
            }
            else
            {
                periodoActual = (fechaActual.Year - 1) + "21";
            }

            IRepositorio<Materium> repositorioMateria = new MateriumRepositorio();
            var listMaterias = repositorioMateria.GetAll();

            IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();
            var listActividades = new List<Actividad>();

            IRepositorio<ClaseEvaluacion> repositorioClaseE = new HorarioClaseRepositorio();
            var listClaseEvaluacion = repositorioClaseE.GetAll().Where(cE => cE.Cedula == miCedula).ToList();

            foreach (var claseEvaluacion in listClaseEvaluacion)
            {
                var actividad = repositorioActividad.GetById(claseEvaluacion.IdActividad);
                if (actividad.Tipo.CompareTo("Clase") == 0 &&
                    actividad.Periodo.CompareTo((periodoActual)) == 0 &&
                    actividad.HoraInicio >= fechaActual)
                {
                    listActividades.Add(actividad);
                }
            }

            foreach (var actividad in listActividades)
            {
                var materia = (from mat in listMaterias
                               where mat.IdMateria == actividad.IdMateria
                               select mat).First();
                actividad.Materia = materia;
            }

            IRepositorio<Profesor> repositorioProfesor = new ProfesorRepositorio();

            IRepositorio<SlMaterium> repositorioSlMateria = new SlMateriumRepositorio();
            var listSlMaterias = repositorioSlMateria.GetAll();

            IRepositorio<SlSeccion> repositorioSlSeccion = new SlSeccionRepositorio();
            var listSlSecciones = repositorioSlSeccion.GetAll();

            IRepositorio<SlClase> repositorioSlClase = new SlClaseRepositorio();
            var listSlClase = repositorioSlClase.GetAll();

            IRepositorio<SlProfesor> repositorioSlProfesor = new SlProfesorRepositorio();
            var listSlProfesor = repositorioSlProfesor.GetAll();
            foreach (var actividad in listActividades)
            {
                var flag = false;
                var slMateria = (from mat in listSlMaterias
                                 where mat.Nombre.CompareTo(actividad.Materia.Nombre) == 0
                                 select mat).First();
                if (slMateria.HorasLab != actividad.Materia.HorasLab)
                {
                    actividad.Materia.HorasLab = slMateria.HorasLab;
                    flag = true;
                    Trace.Write("Se encontro un cambio en las horas de laboratorio de la materia " +
                                actividad.Materia.Nombre);
                }
                if (slMateria.HorasPractica != actividad.Materia.HorasPractica)
                {
                    actividad.Materia.HorasPractica = slMateria.HorasPractica;
                    flag = true;
                    Trace.Write("Se encontro un cambio en las horas de practica de la materia " +
                                actividad.Materia.Nombre);
                }
                if (slMateria.HorasTeoria != actividad.Materia.HorasTeoria)
                {
                    actividad.Materia.HorasTeoria = slMateria.HorasTeoria;
                    flag = true;
                    Trace.Write("Se encontro un cambio en las horas de teoria de la materia " +
                                actividad.Materia.Nombre);
                }
                if (slMateria.Creditos != actividad.Materia.Creditos)
                {
                    actividad.Materia.Creditos = slMateria.Creditos;
                    flag = true;
                    Trace.Write("Se encontro un cambio en los creditos de la materia " + actividad.Materia.Nombre);
                }
                if (actividad.Materia.Descripcion != null)
                {
                    if (slMateria.Descripcion.CompareTo(actividad.Materia.Descripcion) != 0)
                    {
                        actividad.Materia.Descripcion = slMateria.Descripcion;
                        flag = true;
                        Trace.Write("Se encontro un cambio en la descripcion de la materia " +
                                    actividad.Materia.Nombre);
                    }
                }
                if (flag)
                {
                    Trace.WriteIf(repositorioMateria.Update(actividad.Materia).CompareTo("true") == 0,
                                  "Se actualizo la materia " + actividad.Materia.Nombre);
                }

                flag = false;
                var slSeccion = (from sec in listSlSecciones
                                 where sec.IdMateria == slMateria.IdMateria
                                 select sec).First();

                if (slSeccion.Seccion.CompareTo(actividad.Seccion) != 0)
                {
                    actividad.Seccion = slSeccion.Seccion;
                    flag = true;
                    Trace.Write("Se encontro un cambio de seccion en la materia " + actividad.Materia.Nombre);
                }
                if (flag)
                {
                    Trace.WriteIf(repositorioActividad.Update(actividad).CompareTo("true") == 0,
                                  "Se actualizo la actividad de la materia " + actividad.Materia.Nombre);
                }

                //var listMisSlClase = (from clase in listSlClase
                //               where clase.IdSeccion == slSeccion.IdSeccion
                //               select clase).ToList();
                //foreach (var slClase in listMisSlClase)
                //{
                //    var actividades = listActividades.Where(a => a.IdMateria == actividad.IdMateria &&
                //                                                 a.Seccion == slSeccion.Seccion).ToList();
                //    foreach (var act in actividades)
                //    {
                //        flag = false;
                //        if (slClase.HoraInicio.Hour.CompareTo(act.HoraInicio.Hour) != 0)
                //        {
                //            act.HoraInicio = new DateTime(act.HoraInicio.Year, act.HoraInicio.Month, act.HoraInicio.Day,
                //                                          slClase.HoraInicio.Hour, act.HoraInicio.Minute, 0);
                //            flag = true;
                //            Trace.Write("Se encontro un cambio en la hora inicio de la materia " +
                //                        actividad.Materia.Nombre);
                //        }
                //        if (slClase.HoraInicio.Minute.CompareTo(act.HoraInicio.Minute) != 0)
                //        {
                //            act.HoraInicio = new DateTime(act.HoraInicio.Year, act.HoraInicio.Month, act.HoraInicio.Day,
                //                                          act.HoraInicio.Minute, slClase.HoraInicio.Minute , 0);
                //            flag = true;
                //            Trace.Write("Se encontro un cambio en la hora inicio de la materia " +
                //                        actividad.Materia.Nombre);
                //        }
                //        if (slClase.HoraFin.Hour.CompareTo(act.HoraFin.Hour) != 0)
                //        {
                //            act.HoraFin = new DateTime(act.HoraFin.Year, act.HoraFin.Month, act.HoraFin.Day,
                //                                       slClase.HoraFin.Hour, act.HoraFin.Minute, 0);
                //            flag = true;
                //            Trace.Write("Se encontro un cambio en la hora inicio de la materia " +
                //                        actividad.Materia.Nombre);
                //        }
                //        if (slClase.HoraFin.Minute.CompareTo(act.HoraFin.Minute) != 0)
                //        {
                //            act.HoraFin = new DateTime(act.HoraFin.Year, act.HoraFin.Month, act.HoraFin.Day,
                //                                       act.HoraFin.Hour, slClase.HoraFin.Minute, 0);
                //            flag = true;
                //            Trace.Write("Se encontro un cambio en la hora inicio de la materia " +
                //                        actividad.Materia.Nombre);
                //        }
                //        if (flag)
                //        {
                //            Trace.WriteIf(repositorioActividad.Update(act).CompareTo("true") == 0,
                //                          "Se actualizo la actividad de la materia " + actividad.Materia.Nombre);
                //        }
                //    }
                //}

                flag = false;
                var slProfesor = (from p in listSlProfesor
                                  where p.Cedula == slSeccion.Profesor
                                  select p).First();
                var profesor = repositorioProfesor.GetAll().Where(p => p.Cedula == actividad.Profesor).First();
                if (slProfesor.Cedula.CompareTo(profesor.Cedula) != 0)
                {
                    profesor.Cedula = slProfesor.Cedula;
                    flag = true;
                    Trace.Write("Se encontro un cambio del profesor de la materia " + actividad.Materia.Nombre);
                }
                if (slProfesor.Nombre.CompareTo(profesor.Nombre) != 0)
                {
                    profesor.Nombre = slProfesor.Nombre;
                    flag = true;
                    Trace.Write("Se encontro un cambio en el nombre del profesor de la materia " +
                                actividad.Materia.Nombre);
                }
                if (slProfesor.Apellido.CompareTo(profesor.Apellido) != 0)
                {
                    profesor.Apellido = slProfesor.Apellido;
                    flag = true;
                    Trace.Write("Se encontro un cambio en el apellido del profesor de la materia " +
                                actividad.Materia.Nombre);
                }
                if (flag)
                {
                    Trace.WriteIf(repositorioProfesor.Update(profesor).CompareTo("true") == 0,
                                  "Se actualizo el profesor " + profesor.Nombre + " " + profesor.Apellido);
                }
            }
        }