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