// // GET: /Olimpiada/Estados/ public ActionResult Estados(string clave = null, TipoOlimpiada tipo = TipoOlimpiada.OMI) { if (tipo != TipoOlimpiada.OMI) { return(RedirectTo(Pagina.ERROR, 404)); } Olimpiada o; if (clave == null) { o = Olimpiada.obtenerMasReciente(); clave = o.numero; tipo = o.tipoOlimpiada; } else { o = Olimpiada.obtenerOlimpiadaConClave(clave, tipo); } if (o == null || o.numero == Olimpiada.TEMP_CLAVE) { return(RedirectTo(Pagina.ERROR, 404)); } Medallero medalleroGeneral; Persona p = getUsuario(); ViewBag.liveResults = o.liveResults; if (o.esOnline && OmegaUp.RunnerStarted && p != null && p.esSuperUsuario()) { ViewBag.secretScoreboard = true; ViewBag.estados = Medallero.obtenerTablaEstadosSecreta(clave, o.tipoOlimpiada); ViewBag.medalleroGeneral = null; } else { ViewBag.secretScoreboard = false; ViewBag.estados = Medallero.obtenerTablaEstados(o.tipoOlimpiada, clave, out medalleroGeneral); ViewBag.medalleroGeneral = medalleroGeneral; } ViewBag.olimpiadas = Olimpiada.obtenerOlimpiadas(tipo); ViewBag.hayPromedio = Medallero.hayPromedio(ViewBag.estados); ViewBag.hayPuntos = Medallero.hayPuntos(ViewBag.estados); return(View(o)); }
// // GET: /Escuela/ public ActionResult Index(string url = null, string clave = null, string omi = null, TipoOlimpiada tipo = TipoOlimpiada.OMI) { Institucion i = null; if (url == null && clave != null) { List <MiembroDelegacion> md = MiembroDelegacion.obtenerMiembrosConClave(omi, tipo, clave); if (md.Count == 0) { return(RedirectTo(Pagina.ERROR, 404)); } i = Institucion.obtenerInstitucionConClave(md[0].claveEscuela); url = i.nombreURL; } if (i == null) { i = Institucion.obtenerInstitucionConNombreURL(url); } if (i == null) { return(RedirectTo(Pagina.ERROR, 404)); } Medalleros m = Medallero.obtenerMedalleros(Medallero.TipoMedallero.INSTITUCION, i.clave.ToString()); tipo = m.obtenerDefault(tipo); Medallero medallero = m.medalleroDeTipo(tipo); if (medallero == null) { medallero = new Medallero(tipo); } ViewBag.sedes = i.obtenerOlimpiadasSede(); ViewBag.participantes = Resultados.obtenerAlumnosDeInstitucion(i.clave, tipo); ViewBag.medallas = medallero; ViewBag.medalleros = m; ViewBag.tipo = tipo; limpiarErroresViewBag(); return(View(i)); }
// // GET: /Estado/ public ActionResult Index(string clave, TipoOlimpiada tipo = TipoOlimpiada.OMI) { Estado e = Estado.obtenerEstadoConClave(clave); if (e == null) { return(RedirectTo(Pagina.ERROR, 404)); } Medalleros m = Medallero.obtenerMedalleros(Medallero.TipoMedallero.ESTADO, e.clave); tipo = m.obtenerDefault(tipo); limpiarErroresViewBag(); ViewBag.sedes = e.obtenerOlimpiadasSede(); ViewBag.participantes = Resultados.obtenerAlumnosDeEstado(clave, tipo); ViewBag.medallas = m.medalleroDeTipo(tipo); ViewBag.medalleros = m; ViewBag.tipo = tipo; ViewBag.estados = Estado.obtenerEstados(); return(View(e)); }
// // GET: /Estados/Lugares/ public ActionResult Lugares() { bool[] cabeceras; List <Olimpiada> olimpiadas = Olimpiada.obtenerOlimpiadas(TipoOlimpiada.OMI); ViewBag.olimpiadas = olimpiadas; ViewBag.estados = Medallero.obtenerTablaEstadosGeneral(TipoOlimpiada.OMI, out cabeceras); ViewBag.cabeceras = cabeceras; int ultimoValido = 0; for (int i = cabeceras.Length - 1; i >= 0; i--) { if (cabeceras[i] && olimpiadas[i].estados > 0) { ultimoValido = i; } } ViewBag.ultimoValido = ultimoValido; ViewBag.admin = esAdmin(); return(View(Estado.obtenerEstados())); }
// // GET: /Profile/view/ public ActionResult view(string usuario = null, string clave = null, TipoOlimpiada tipo = TipoOlimpiada.OMI, string omi = null) { Persona p = null; limpiarErroresViewBag(); // QR's de competidor vienen en la forma usuario=null;clave=CMX-3;tipo=OMI;omi='30' if (usuario == null && clave != null) { List <MiembroDelegacion> md = MiembroDelegacion.obtenerMiembrosConClave(omi, tipo, clave, aproximarClave: true); if (md.Count == 0) { return(RedirectTo(Pagina.ERROR, 404)); } if (md.Count > 1) { return(RedirectTo(Pagina.DELEGACION, omi + ":" + md[0].estado)); } p = Persona.obtenerPersonaConClave(md[0].claveUsuario); usuario = p.usuario; } if (String.IsNullOrEmpty(usuario)) { if (estaLoggeado()) { p = getUsuario(); ViewBag.tienePeticiones = p.tienePeticiones(); } else { guardarParams(Pagina.LOGIN, Pagina.VIEW_PROFILE, ""); return(RedirectTo(Pagina.LOGIN)); } } else { if (p == null) { p = Persona.obtenerPersonaDeUsuario(usuario); } if (p != null) { Persona u = getUsuario(); if (p.usuario == u.usuario) { ViewBag.tienePeticiones = p.tienePeticiones(); } } else { return(RedirectTo(Pagina.ERROR, 404)); } } // Estas variables de sesión tienen algo cuando se inicia sesión por primera vez y // se va a hacer el enlace de cuentas ViewBag.GUID = ""; if (Session[GUID_STRING] != null && Session[GUID_USER].ToString() == p.clave.ToString()) { ViewBag.GUID = Session[GUID_STRING]; } Session[GUID_STRING] = null; Session[GUID_USER] = null; if (tipo == TipoOlimpiada.OMIS || tipo == TipoOlimpiada.OMIP || TableManager.isOMIPOS(tipo)) { tipo = TipoOlimpiada.OMI; } Medalleros medalleros = Medallero.obtenerMedalleros(Medallero.TipoMedallero.PERSONA, p.clave.ToString()); ViewBag.participaciones = Resultados.obtenerParticipacionesComoCompetidorPara(p.clave, tipo); ViewBag.asistencias = MiembroDelegacion.obtenerParticipaciones(p.clave); ViewBag.medalleros = medalleros; ViewBag.tipo = tipo; return(View(p)); }
public void ordena(int timestamp, int dia) { // Ordenamos los resutlados List <Resultados> list = this.resultados.Values.ToList(); list.Sort(compara); // Si no hemos calculado los cortes, o el numero de concursantes cambió, // calculamos los cortes if (this.cortes == null || this.cortes[3] <= this.concursantes) { if (this.tipoOlimpiada == TipoOlimpiada.OMI) { // Para las OMI se siguen las reglas de los doceavos this.cortes = new int[] { (int)Math.Ceiling(this.concursantes / 12.0), (int)Math.Ceiling(this.concursantes / 4.0), (int)Math.Ceiling(this.concursantes / 2.0), this.concursantes + 1 }; } else { // Para OMIP y OMIS, se siguen las reglas de los cincos this.cortes = new int[] { 5, 10, 15, this.concursantes + 1 }; } } int lugar = 0; int lastPoints = -1; int empatados = 0; int premioActual = 0; this.reseteaMedalleroEstados(); // Asignamos lugares y medallas for (int counter = 1; counter <= list.Count; counter++) { Resultados r = list[counter - 1]; if (r == null) { break; } // Se acordó que para el calculo de medallas, los puntos se iban a redondear int currentPoints = (int)Math.Round((decimal)r.total, 0); if (currentPoints == lastPoints) { empatados++; } else { lugar = counter; empatados = 0; } r.lugar = lugar; lastPoints = currentPoints; // Si no hay puntos, no hay medallas if (currentPoints == 0) { r.medalla = Resultados.TipoMedalla.NADA; // Si no hay puntos, tienes el último lugar r.lugar = concursantes; } else { // Se verifica si hay que cambiar de premio while (this.cortes[premioActual] < counter && empatados == 0) { premioActual++; } r.medalla = medallas[premioActual]; } // Para las OMI también calculamos los estados if (tipoOlimpiada == TipoOlimpiada.OMI) { Medallero m; if (!medalleroEstados.TryGetValue(r.estado, out m)) { m = this.agregaEstado(r.estado); } m.count++; if (m.count <= 4) { m.puntos += r.total; } switch (r.medalla) { case Resultados.TipoMedalla.ORO: { m.oros++; break; } case Resultados.TipoMedalla.PLATA: { m.platas++; break; } case Resultados.TipoMedalla.BRONCE: { m.bronces++; break; } } } // Finalmente guardamos la linea en la base de datos r.guardar(detalles: true, timestamp: timestamp, dia: dia, soloDetalles: Program.HIDE); } // Para OMIPS ya terminamos los cálculos if (tipoOlimpiada != TipoOlimpiada.OMI) { return; } // Si estamos escondiendo los puntos, no hace falta continuar if (Program.HIDE) { return; } // Ordenamos también el medallero de los estados List <Medallero> sortedEstados = new List <Medallero>(medalleroEstados.Values); // Primero calculamos los promedios foreach (Medallero estado in sortedEstados) { // Arreglamos el estado sede int competidores = estado.count; if (competidores > 4) { competidores = 4; } estado.promedio = (float?)Math.Round((double)(estado.puntos / competidores), 2); } // Luego ordenamos Medallero ultimoEstado = null; sortedEstados.Sort(); lugar = 0; // Finalmente, asignamos lugares for (int i = 0; i < sortedEstados.Count; i++) { Medallero estado = sortedEstados[i]; lugar++; // Revisamos si hay empates entre estados if (ultimoEstado == null || ultimoEstado.oros != estado.oros || ultimoEstado.platas != estado.platas || ultimoEstado.bronces != estado.bronces || (int)Math.Round((double)ultimoEstado.puntos) != (int)Math.Round((double)estado.puntos)) { estado.lugar = lugar; } else { estado.lugar = ultimoEstado.lugar; } ultimoEstado = estado; estado.actualizar(); } }