public virtual bool Equals(ClaseEvaluacion obj)
        {
            if (obj == null) return false;

            if (Equals(IdActividad, obj.IdActividad) == false)
                return false;

            if (Equals(Cedula, obj.Cedula) == false)
                return false;

            if (Equals(Nota, obj.Nota) == false)
                return false;

            return true;
        }
        private void LeerCronogramas(Materium materia)
        {
            IRepositorio<Actividad> repositorioActividad = new ActividadRepositorio();
            var miCedula = (Int32)Session["cedula"];
            var wordApplication = new Microsoft.Office.Interop.Word.Application { Visible = false };
            var nameAndLocation = "~/UploadedFiles/" + Path.GetFileName(materia.File.FileName);
            materia.File.SaveAs(Server.MapPath(nameAndLocation));

            object filePath = Server.MapPath(nameAndLocation);

            object missing = Missing.Value;
            object readOnly = false;
            object isVisible = false;
            Document reportDoc = wordApplication.Documents.Open(
                ref filePath,
                ref missing,
                readOnly,
                ref missing,
                ref missing,
                ref missing,
                ref missing,
                ref missing,
                ref missing,
                ref missing,
                ref missing,
                ref isVisible);

            IRepositorio<ClaseEvaluacion> repositorioClaseEvaluacion = new HorarioClaseRepositorio();
            var listActividad = repositorioActividad.GetAll().Where(a => a.Tipo.CompareTo("Clase") == 0).ToList();
            var listActividades = (from a in listActividad
                                   where a.Periodo.CompareTo(_periodoActual) == 0 &&
                                         a.Seccion.CompareTo(materia.Seccion) == 0 &&
                                         a.Profesor == miCedula
                                   select a).ToList();

            reportDoc.Activate();
            for (int j = 1; j <= reportDoc.Tables.Count; j++)
            {
                Table tbl = reportDoc.Tables[j];
                if (tbl.Rows[1].Cells[1].Range.Text.Contains("Actividad Evaluativa") &&
                    tbl.Rows[1].Cells[2].Range.Text.Contains("Porcentaje") &&
                    tbl.Rows[1].Cells[3].Range.Text.Contains("Fecha"))
                {
                    for (int i = 2; i <= tbl.Rows.Count; i++)
                    {
                        var actividadEvaluativa = tbl.Rows[i].Cells[1].Range.Text;
                        var porcentaje = tbl.Rows[i].Cells[2].Range.Text;
                        var fecha = tbl.Rows[i].Cells[3].Range.Text;
                        var f = Convert.ToDateTime(fecha.Substring(0, fecha.Length - 2));
                        var actividad = new Actividad
                        {
                            Nombre = actividadEvaluativa.Substring(0, actividadEvaluativa.Length - 2),
                            IdMateria = materia.IdMateria,
                            Periodo = _periodoActual,
                            Ponderacion = Convert.ToInt32(porcentaje.Substring(0, porcentaje.Length - 2)),
                            Profesor = miCedula,
                            Seccion = materia.Seccion,
                            Tipo = "Evaluacion"
                        };
                        var act = (from a in listActividad
                                   where a.Periodo.CompareTo(_periodoActual) == 0 &
                                         a.HoraFin.Date.CompareTo(f.Date) == 0 &
                                         a.IdMateria == materia.IdMateria &&
                                         a.Profesor == miCedula
                                   select a).ToList();
                        if (act.Count() != 0)
                        {
                            var acti = act.First();
                            actividad.HoraInicio = acti.HoraInicio;
                            actividad.HoraFin = acti.HoraFin;
                        }
                        else
                        {
                            actividad.HoraInicio = new DateTime(f.Year, f.Month, f.Day, 7, 0, 0);
                            actividad.HoraFin = new DateTime(f.Year, f.Month, f.Day, 9, 0, 0);
                        }
                        repositorioActividad.Save(actividad);

                        if (listActividades.Count() > 0)
                        {
                            var alumnosInscritos =
                                repositorioClaseEvaluacion.GetAll().Where(
                                    cE => cE.IdActividad == listActividades.First().IdActividad).ToList();

                            foreach (var alumnosInscrito in alumnosInscritos)
                            {
                                var claseEvaluacion = new ClaseEvaluacion
                                                          {
                                                              Cedula = alumnosInscrito.Cedula,
                                                              IdActividad = actividad.IdActividad
                                                          };
                                repositorioClaseEvaluacion.Save(claseEvaluacion);
                            }
                        }
                    }
                }
            }
            reportDoc.Close();
            wordApplication.Quit();
        }
        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);
        }