// // GET: /Registro/EliminarSede public ActionResult EliminarSede(int clave) { SedeOnline so = SedeOnline.obtenerSedeConClave(clave); Persona p = getUsuario(); Olimpiada o = null; if (so != null) { o = Olimpiada.obtenerOlimpiadaConClave(so.omi, so.tipoOlimpiada); } if (so == null || !tienePermisos(o.registroActivo || o.registroSedes, so.estado) || (!p.esSuperUsuario() && !o.registroSedes)) { return(RedirectTo(Pagina.HOME)); } List <MiembroDelegacion> miembros = MiembroDelegacion.obtenerMiembrosEnSede(clave); if (miembros.Count > 0) { return(RedirectTo(Pagina.HOME)); } so.borrar(); // Se registra la telemetria Log.add(Log.TipoLog.REGISTRO, "Usuario " + getUsuario().nombreCompleto + " elimino la sede " + so.nombre + " del estado " + so.estado); return(RedirectTo(Pagina.REGISTRO, new { omi = so.omi, estado = so.estado })); }
public void guardar() { tipoOlimpiada = obtenerTipo(tipoOlimpiada); if (clave == 0) { nuevo(); } else { update(); } // Una vez guardada la sede, tratamos de crear usuarios para los supervisores List <MiembroDelegacion> miembros = MiembroDelegacion.obtenerMiembrosDelegacion(omi, estado, TipoOlimpiada.NULL); tryGeneraUsuarioParaSupervisor(supervisor, correo, telefono, miembros); if (!String.IsNullOrEmpty(supervisor2)) { tryGeneraUsuarioParaSupervisor(supervisor2, correo2, telefono2, miembros); } if (!String.IsNullOrEmpty(supervisor3)) { tryGeneraUsuarioParaSupervisor(supervisor3, correo3, telefono3, miembros); } }
private bool puedeRegistrarOtroMas(Olimpiada o, TipoOlimpiada tipo, string estado) { int maxUsuarios = o.getMaxParticipantesDeEstado(estado); List <MiembroDelegacion> mds = MiembroDelegacion.obtenerMiembrosDelegacion(o.numero, estado, tipo, MiembroDelegacion.TipoAsistente.COMPETIDOR); return(mds.Count < maxUsuarios); }
public BuscarPersonas(Persona persona, MiembroDelegacion md) { persona.breakNombre(); nombre = persona.nombre; apellidoP = persona.apellidoPaterno; apellidoM = persona.apellidoMaterno; genero = persona.genero; nacimiento = Utilities.Fechas.dateToString(persona.nacimiento); correo = persona.correo; celular = persona.celular; telefono = persona.telefono; direccion = persona.direccion; omegaup = persona.omegaup; emergencia = persona.emergencia; telEmergencia = persona.telEmergencia; parentesco = persona.parentesco; clave = persona.clave; medicina = persona.medicina; alergias = persona.alergias; tieneFoto = persona.esFotoPersonalizada(); if (md != null) { nombreEscuela = md.nombreEscuela; claveEscuela = md.claveEscuela; nivelEscuela = md.nivelEscuela.ToString(); anioEscuela = md.añoEscuela; } }
private void tryGeneraUsuarioParaSupervisor(string nombre, string correo, string telefono, List <MiembroDelegacion> miembros) { Persona p = Persona.obtenerPersonaConNombre(nombre); if (p == null) { p = Persona.obtenerPersonaConCorreo(correo); } // Si no hay persona con ese nombre o correo, creamos una cuenta if (p == null) { p = new Persona(); p.nombre = nombre; p.breakNombre(); p.correo = correo; p.celular = telefono; p.nuevoUsuario(Archivos.FotoInicial.DOMI); p.guardarDatos(lugarGuardado: Persona.LugarGuardado.REGISTRO); } // Si la persona todavía no es parte de la delegación, la agregamos if (!miembros.Any(miembro => miembro.claveUsuario == p.clave)) { MiembroDelegacion md = new MiembroDelegacion(); md.claveUsuario = p.clave; md.estado = estado; md.tipo = MiembroDelegacion.TipoAsistente.SUPERVISOR; md.tipoOlimpiada = this.tipoOlimpiada; md.olimpiada = omi; md.nuevo(); } }
// // GET: /Registro/Delegacion public ActionResult Delegacion(string omi = null, string estado = null, TipoOlimpiada tipo = TipoOlimpiada.OMI) { if (omi == null) { omi = Olimpiada.obtenerMasReciente(yaEmpezada: false).numero; } failSafeViewBag(); Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, tipo); ViewBag.omi = o == null ? new Olimpiada() : o; if (o == null || !tienePermisos(o.registroActivo || o.registroSedes, estado)) { ViewBag.permisos = true; return(View(new List <MiembroDelegacion>())); } Persona p = getUsuario(); ViewBag.invitaciones = false; if (!p.esSuperUsuario()) { if (estado == null) { return(RedirectTo(Pagina.HOME)); } Estado e = Estado.obtenerEstadoConClave(estado); ViewBag.estado = e; ViewBag.invitaciones = Archivos.existeArchivo(Archivos.Folder.INVITACIONES, omi + "\\" + estado + "\\" + e.ISO + "-1.pdf") || Archivos.existeArchivo(Archivos.Folder.INVITACIONES, omi + "\\" + estado + "\\S-" + e.ISO + "-1.pdf") || Archivos.existeArchivo(Archivos.Folder.INVITACIONES, omi + "\\" + estado + "\\P-" + e.ISO + "-1.pdf"); } List <MiembroDelegacion> registrados = MiembroDelegacion.obtenerMiembrosDelegacion(omi, p.esSuperUsuario() ? null : estado, o.tipoOlimpiada); ViewBag.hayResultados = Resultados.hayResultadosParaOMI(o.numero); if (o.esOnline) { List <SedeOnline> sedes = SedeOnline.obtenerSedes(omi, p.esSuperUsuario() ? null : estado, tipo); Dictionary <int, List <MiembroDelegacion> > miembrosPorSede = new Dictionary <int, List <MiembroDelegacion> >(); foreach (SedeOnline sede in sedes) { List <MiembroDelegacion> miembrosEnSede = MiembroDelegacion.obtenerMiembrosEnSede(sede.clave); miembrosPorSede.Add(sede.clave, miembrosEnSede); } ViewBag.miembrosPorSede = miembrosPorSede; ViewBag.sedes = sedes; } return(View(registrados)); }
public JsonResult Buscar(string omi, TipoOlimpiada tipo, string query, string estado) { Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, tipo); if (o == null || !tienePermisos(o.registroActivo, estado)) { Json("error"); } Persona p = getUsuario(); return(Json(MiembroDelegacion.buscarParaRegistro(omi, tipo, estado, query, p.esSuperUsuario()))); }
// // GET: /Registro/GeneraInvitaciones public ActionResult GeneraInvitaciones(string omi) { Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, TipoOlimpiada.OMI); if (o == null || !esAdmin()) { return(RedirectTo(Pagina.HOME)); } ViewBag.invitaciones = MiembroDelegacion.generarInvitaciones(omi); return(View()); }
public static string participaciones(MiembroDelegacion md, TipoOlimpiada tipo) { string result = ""; int count = md.numeroParticipaciones[tipo]; switch (count) { case 1: result += "Primera"; break; case 2: result += "Segunda"; break; case 3: result += "Tercera"; break; case 4: result += "Cuarta"; break; case 5: result += "Quinta"; break; case 6: result += "Sexta"; break; case 7: result += "Séptima"; break; } result += " participación"; if (tipo != TipoOlimpiada.OMIP && (md.numeroParticipaciones.ContainsKey(TipoOlimpiada.OMIP) && md.numeroParticipaciones[TipoOlimpiada.OMIP] > 0 || md.numeroParticipaciones.ContainsKey(TipoOlimpiada.OMIS) && md.numeroParticipaciones[TipoOlimpiada.OMIS] > 0 && tipo == TipoOlimpiada.OMI)) { result += " en esta categoría"; } return(result); }
/// <summary> /// Calcula las participaciones diferente a competidor que tiene la persona /// </summary> /// <param name="tipoOlimpiada">El tipo de olimpiada</param> public List <string> consultarParticipaciones(TipoOlimpiada tipoOlimpiada = TipoOlimpiada.NULL) { List <string> tipos = new List <string>(); Acceso db = new Acceso(); StringBuilder query = new StringBuilder(); query.Append(" select distinct(tipo) from MiembroDelegacion where persona = "); query.Append(this.clave); query.Append(" and tipo != "); query.Append(Cadenas.comillas(MiembroDelegacion.TipoAsistente.COMPETIDOR.ToString().ToLower())); if (tipoOlimpiada != TipoOlimpiada.NULL) { query.Append(" and clase = "); query.Append(Cadenas.comillas(tipoOlimpiada.ToString().ToLower())); } query.Append(" and clase <> "); query.Append(Cadenas.comillas(TipoOlimpiada.OMIPO.ToString().ToLower())); query.Append(" and clase <> "); query.Append(Cadenas.comillas(TipoOlimpiada.OMISO.ToString().ToLower())); db.EjecutarQuery(query.ToString()); DataTable table = db.getTable(); tipos = new List <string>(); foreach (DataRow r in table.Rows) { MiembroDelegacion.TipoAsistente tipo = DataRowParser.ToTipoAsistente(DataRowParser.ToString(r[0])); if (tipo == MiembroDelegacion.TipoAsistente.DELELIDER) { if (!tipos.Contains(MiembroDelegacion.TipoAsistente.LIDER.ToString())) { tipos.Add(MiembroDelegacion.TipoAsistente.LIDER.ToString()); } if (!tipos.Contains(MiembroDelegacion.TipoAsistente.DELEGADO.ToString())) { tipos.Add(MiembroDelegacion.TipoAsistente.DELEGADO.ToString()); } } else { string t = MiembroDelegacion.getTipoAsistenteString(tipo); if (!tipos.Contains(t)) { tipos.Add(t); } } } return(tipos); }
// // GET: /Olimpiada/Delegacion/ public ActionResult Delegacion(string clave, string estado, TipoOlimpiada tipo = TipoOlimpiada.OMI) { if (tipo == TipoOlimpiada.OMIS || tipo == TipoOlimpiada.OMIP) { tipo = TipoOlimpiada.OMI; } Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(clave, tipo); if (o == null || o.numero == Olimpiada.TEMP_CLAVE) { return(RedirectTo(Pagina.ERROR, 404)); } Estado e = Estado.obtenerEstadoConClave(estado); if (e == null) { return(RedirectTo(Pagina.ERROR, 404)); } Dictionary <TipoOlimpiada, List <MiembroDelegacion> > delegaciones = new Dictionary <TipoOlimpiada, List <MiembroDelegacion> >(); delegaciones.Add(tipo, MiembroDelegacion.obtenerMiembrosDelegacion(clave, estado, tipo, MiembroDelegacion.TipoAsistente.COMPETIDOR, listarPorAño: o.año)); if (tipo == TipoOlimpiada.OMI && o.alsoOmips) { delegaciones.Add(TipoOlimpiada.OMIP, MiembroDelegacion.obtenerMiembrosDelegacion(clave, estado, TipoOlimpiada.OMIP, MiembroDelegacion.TipoAsistente.COMPETIDOR, listarPorAño: o.año)); delegaciones.Add(TipoOlimpiada.OMIS, MiembroDelegacion.obtenerMiembrosDelegacion(clave, estado, TipoOlimpiada.OMIS, MiembroDelegacion.TipoAsistente.COMPETIDOR, listarPorAño: o.año)); } ViewBag.liveResults = o.liveResults; ViewBag.estado = e; ViewBag.delegaciones = delegaciones; ViewBag.lideres = MiembroDelegacion.obtenerMiembrosDelegacion(clave, estado, tipo, MiembroDelegacion.TipoAsistente.LIDER); ViewBag.otros = MiembroDelegacion.obtenerMiembrosDelegacion(clave, estado, tipo, MiembroDelegacion.TipoAsistente.INVITADO); ViewBag.medallas = Medallero.obtenerMedallas(tipo, Medallero.TipoMedallero.ESTADO_POR_OMI, estado + "_" + clave); ViewBag.olimpiadas = Olimpiada.obtenerOlimpiadas(tipo); ViewBag.olimpiadasParaEstado = Olimpiada.obtenerOlimpiadasParaEstado(estado); ViewBag.tipo = tipo; ViewBag.estadosEnOlimpiada = MiembroDelegacion.obtenerEstadosEnOlimpiada(o.numero); if (delegaciones[tipo].Count == 0) { ViewBag.vinoAOlimpiada = ViewBag.estado.estadoVinoAOlimpiada(tipo, clave); } return(View(o)); }
public ActionResult Diplomas(string clave, string textoX, string textoY) { if (!esAdmin() || clave == null || textoX == null || textoY == null) { return(RedirectTo(Pagina.HOME)); } ViewBag.omi = clave; string[] X = textoX.Split(';'); string[] Y = textoY.Split(';'); string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + Request.ApplicationPath.TrimEnd('/'); ViewBag.asistentes = MiembroDelegacion.generarDiplomas(clave, X[0], baseUrl, Y); ViewBag.medallistas = Models.Resultados.generarDiplomas(clave, X[1], baseUrl); ViewBag.especiales = Models.Resultados.generarDiplomasEspeciales(clave, baseUrl); return(View()); }
// // 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: /Registro/Terminar public ActionResult Terminar(string omi, string estado, TipoOlimpiada tipo) { Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, tipo); if (o == null || !tienePermisos(o.registroActivo || o.registroSedes, estado)) { return(RedirectTo(Pagina.HOME)); } MiembroDelegacion md = MiembroDelegacion.obtenerMiembrosDelegacion(omi, estado, tipo)[0]; if (md.cerrado && !getUsuario().esSuperUsuario()) { return(RedirectTo(Pagina.HOME)); } MiembroDelegacion.cerrarOAbrirRegistro(omi, estado, !md.cerrado, tipo); return(RedirectTo(Pagina.REGISTRO, new { omi = omi, estado = estado, tipo = tipo })); }
/// <summary> /// Calcula los campos que aparecen el el footer de la tabla de resultados /// Calcula media, mediana, perfectos, ceros de cada problema, día y general /// así como número de estados y número de competidores /// </summary> public void calcularNumeros() { Problema prob; estados = Resultados.obtenerEstadosParticipantes(numero, tipoOlimpiada); participantes = MiembroDelegacion.obtenerParticipantes(numero, tipoOlimpiada); int[] problemasDia = new int[3]; // Calculamos las estadisticas por dia y por competencia y las guardamos en la base for (int i = 1; i <= 2; i++) { problemasDia[i] = Problema.obtenerCantidadDeProblemas(numero, tipoOlimpiada, i); prob = Resultados.calcularNumeros(numero, tipoOlimpiada, dia: i, totalProblemas: problemasDia[i]); prob.guardar(guardarTodo: false); List <Problema> lista = Problema.obtenerProblemasDeOMI(numero, tipoOlimpiada, i); foreach (Problema p in lista) { if (p != null) { Problema pp = Resultados.calcularNumeros(numero, tipoOlimpiada, p.dia, p.numero); p.media = pp.media; p.mediana = pp.mediana; p.perfectos = pp.perfectos; p.ceros = pp.ceros; p.guardar(guardarTodo: false); } } } problemasDia1 = problemasDia[1]; problemasDia2 = problemasDia[2]; prob = Models.Resultados.calcularNumeros(numero, tipoOlimpiada, totalProblemas: problemasDia1 + problemasDia2); prob.guardar(guardarTodo: false); // Guardar en la base this.guardarDatos(); }
private void ponFechasEnViewBag() { int maximo = MiembroDelegacion.primeraOMIPara(getUsuario()); int minimo = MiembroDelegacion.ultimaOMIComoCompetidorPara(getUsuario()); if (maximo == 0) { maximo = DateTime.Today.Year; } if (minimo == 0) { minimo = AñoMinimo; } else { minimo -= EdadMaxima; } ViewBag.maximo = maximo; ViewBag.minimo = minimo; }
/// <summary> /// Guarda en la base de datos la tabla de asistentes /// </summary> /// <param name="tabla">La nueva tabla de asistentes, un asistente por renglon /// y tabulada con comas</param> /// <returns>Los registros que ocasionaron error</returns> public string guardarTablaAsistentes(string tabla) { StringBuilder errores = new StringBuilder(); string[] lineas; lineas = tabla.Split('\n'); foreach (string linea in lineas) { int result = MiembroDelegacion.guardarLineaAdmin(numero, tipoOlimpiada, linea.Trim()); MiembroDelegacion.TipoError error = result >= Persona.PrimerClave ? MiembroDelegacion.TipoError.OK : (MiembroDelegacion.TipoError)result; if (error != MiembroDelegacion.TipoError.OK) { errores.Append(linea.Trim()); errores.Append(": "); errores.Append(error.ToString()); errores.Append("\n"); } } return(errores.ToString()); }
// // GET: /Registro/Eliminar public ActionResult Eliminar(string omi, TipoOlimpiada tipo, string estado, string clave) { Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, tipo); if (o == null || !tienePermisos(o.registroActivo, estado) || Resultados.hayResultadosParaOMI(omi)) { return(RedirectTo(Pagina.HOME)); } MiembroDelegacion md = MiembroDelegacion.obtenerMiembrosConClave(omi, tipo, clave)[0]; Persona p = getUsuario(); if (!p.esSuperUsuario() && md.estado != estado) { return(RedirectTo(Pagina.HOME)); } md.borrarMiembroDelegacion(); // Se registra la telemetria Log.add(Log.TipoLog.REGISTRO, "Usuario " + getUsuario().nombreCompleto + " elimino al asistente con clave " + md.clave + " del estado " + md.estado + " en la categoría " + md.tipoOlimpiada.ToString()); return(RedirectTo(Pagina.REGISTRO, new { omi = omi, estado = estado, tipo = tipo })); }
// // GET: /Olimpiada/Resultados/ public ActionResult Resultados(string clave = null, TipoOlimpiada tipo = TipoOlimpiada.OMI, string GUID = null) { if (GUID != null) { tryLogIn(GUID); } Olimpiada o = null; if (clave == null) { o = Olimpiada.obtenerMasReciente(); clave = o.numero; tipo = o.tipoOlimpiada; } else { o = Olimpiada.obtenerOlimpiadaConClave(clave, tipo); } if (o == null) { return(RedirectTo(Pagina.ERROR, 404)); } limpiarErroresViewBag(); ViewBag.liveResults = false; ViewBag.secretScoreboard = false; ViewBag.resultados = null; if (o.liveResults) { OmegaUp ou = o.calculateCachedResults(); if (ou != null) { Persona p = getUsuario(); if (o.esOnline && OmegaUp.RunnerStarted && p != null && p.esSuperUsuario()) { ViewBag.secretScoreboard = true; ViewBag.dia = ou.dia; ViewBag.problemasPorDia = 4; // HARDCODED BUT OH WELL.... ViewBag.resultados = Models.Resultados.cargarResultadosSecretos(clave, tipo, ou.dia); } else { ViewBag.resultados = o.resultados; if (o.resultados.Count > 0) { o.shouldReload(ou.dia); ViewBag.liveResults = true; ViewBag.RunnerStarted = OmegaUp.RunnerStarted; ViewBag.dia = ou.dia; ViewBag.problemasPorDia = ou.dia == 1 ? o.problemasDia1 : o.problemasDia2; ViewBag.lastUpdate = (DateTime.UtcNow.Ticks - ou.timestamp.Ticks) / TimeSpan.TicksPerSecond; ViewBag.ticks = ou.timestamp.Ticks; ViewBag.scoreboardName = ou.concurso; ViewBag.scoreboardToken = ou.token; ViewBag.remainingSeconds = ou.getRemainingContestTime(); } } } } if (ViewBag.resultados == null) { ViewBag.resultados = Models.Resultados.cargarResultados(clave, tipo, porLugar: !o.puntosDesconocidos && o.noMedallistasConocidos && o.datosPublicos, cargarObjetos: true); } ViewBag.problemasDia1 = Problema.obtenerProblemasDeOMI(clave, tipo, 1); ViewBag.problemasDia2 = Problema.obtenerProblemasDeOMI(clave, tipo, 2); ViewBag.claveUsuario = getUsuario().clave; ViewBag.olimpiadas = Olimpiada.obtenerOlimpiadas(TipoOlimpiada.OMI); if (o.alsoOmips) { ViewBag.omis = Olimpiada.obtenerOlimpiadas(TipoOlimpiada.OMIS); ViewBag.omip = Olimpiada.obtenerOlimpiadas(TipoOlimpiada.OMIP); } List <Problema> metadata = Problema.obetnerMetaDatadeOMI(clave, tipo); if (metadata.Count >= 3) { ViewBag.numerosDia1 = metadata[1]; ViewBag.numerosDia2 = metadata[2]; ViewBag.numerosTotal = metadata[0]; } ViewBag.extranjeros = MiembroDelegacion.obtenerEstadosExtranjerosEnOlimpiada(o.numero); return(View(o)); }
/// <summary> /// Guarda valores en la base de datos que estan directamente relacionados /// con los resultados y que no pueden escribirse a mano /// Calcula las banderas en el objeto olimpiada, el número de problemas por día, /// genera el metadata (vacio) de los problemas, asigna lugar a los competidores /// y calcula las medallas de todas las personas y escuelas /// </summary> private void precalcularValores() { // Calculamos si hay resultados para mostrar por problema y lo guardamos en la base problemasDia1 = Problema.obtenerCantidadDeProblemas(numero, tipoOlimpiada, 1); problemasDia2 = Problema.obtenerCantidadDeProblemas(numero, tipoOlimpiada, 2); mostrarResultadosPorDia = Resultados.mostrarResultadosPorDia(numero, tipoOlimpiada); if (mostrarResultadosPorDia) { mostrarResultadosPorProblema = Resultados.mostrarResultadosIndividuales(numero, tipoOlimpiada); } else { mostrarResultadosPorProblema = false; } // En caso de que solo haya un dia o solo hayamos metido un dia if (problemasDia2 == 0) { mostrarResultadosPorDia = false; } // Se guardan los bosquejos del metadata de la omi y los dias // Los cargamos de la base de datos en caso de ya existir. Problema p = Problema.obtenerProblema(this.numero, this.tipoOlimpiada, 0, 0); p.guardar(guardarTodo: false); p = Problema.obtenerProblema(this.numero, this.tipoOlimpiada, 1, 0); p.guardar(guardarTodo: false); p = Problema.obtenerProblema(this.numero, this.tipoOlimpiada, 2, 0); p.guardar(guardarTodo: false); // Calculamos el lugar de cada competidor y lo guardamos en la base List <Resultados> resultados = Resultados.cargarResultados(numero, tipoOlimpiada, cargarObjetos: false); int competidores = 0; int lugar = 0; float?puntosMaximos = resultados.Count > 0 ? resultados[0].total : 0; bool unkEnTabla = false; for (int i = 0; i < resultados.Count; i++) { resultados[i].lugar = 0; bool extranjero = false; if (resultados[i].clave.StartsWith(Resultados.CLAVE_DESCONOCIDA)) { unkEnTabla = true; } else { if (!(unkEnTabla && resultados[i].medalla == Resultados.TipoMedalla.NADA)) { // Si el competidor fue descalificado lo mandamos al fondo del lugar if (resultados[i].medalla == Resultados.TipoMedalla.DESCALIFICADO) { resultados[i].lugar = resultados.Count + 1; } else { // Si el competidor es extranjero, no se le considera Estado e = Estado.obtenerEstadoConClave(resultados[i].estado); extranjero = e.extranjero; if (extranjero || resultados[i].clave.EndsWith("I")) { if (lugar == 0) { resultados[i].lugar = 1; } else { resultados[i].lugar = lugar; } } else { competidores++; if (competidores == 1 || Math.Abs((decimal)(resultados[i - 1].total - resultados[i].total)) >= 1) { lugar = competidores; } resultados[i].lugar = lugar; } } } } resultados[i].guardarLugar(); // Se actualiza la tabla de detalles if (this.puntosDetallados && !extranjero) { DetallePuntos.actualizarUltimo(this.numero, this.tipoOlimpiada, 1, resultados[i].clave, resultados[i].dia1, resultados[i].totalDia1); if (problemasDia2 > 0) { DetallePuntos.actualizarUltimo(this.numero, this.tipoOlimpiada, 2, resultados[i].clave, resultados[i].dia2, resultados[i].totalDia2); DetalleLugar.actualizarUltimo(this.numero, this.tipoOlimpiada, 2, resultados[i].clave, resultados[i].lugar, resultados[i].medalla); } else { // Actualizar la tabla de DetalleLugar de dia 1 el día 2 requiere de muchos más cálculos que espero no sea necesario DetalleLugar.actualizarUltimo(this.numero, this.tipoOlimpiada, 1, resultados[i].clave, resultados[i].lugar, resultados[i].medalla); } } } // Si el primer lugar tiene menos de 100 puntos, entonces no tenemos los puntos mostrarResultadosTotales = puntosMaximos > PUNTOS_MINIMOS_CONOCIDOS; // Calculamos el medallero y lo guardamos en la base if (tipoOlimpiada != TipoOlimpiada.OMIPO && tipoOlimpiada != TipoOlimpiada.OMISO) { Medallero.calcularMedallas(tipoOlimpiada, numero, ordenarPorPuntos); } else { MiembroDelegacion.registrarGanadoresOMIPOS(numero, tipoOlimpiada); } // Guardamos los datos en la base guardarDatos(); }
/// <summary> /// Regresa la tabla de asistentes en un formato tabulado con comas /// para la edición manual para admins /// </summary> /// <returns>La tabla tabulada con comas</returns> public string obtenerTablaAsistentes(bool esParaRegistro = false, bool incluirCabeceras = false, bool esParaOmegaUp = false) { List <MiembroDelegacion> asistentes = MiembroDelegacion.cargarAsistentesOMI(numero, tipoOlimpiada, esParaRegistro: true); StringBuilder tabla = new StringBuilder(); if (incluirCabeceras) { // Incluimos cabeceras de datos tabla.Append("nivel omi, nombre, estado, tipo asistente, clave, fecha nacimiento, "); tabla.Append(" genero, correo, escuela, nivel escuela, año escolar, publica o privada, "); tabla.Append(" celular, telefono, direccion, omegaup, emergencia, parentesco, "); tabla.Append(" telefono emergencia, medicina, alergias"); if (this.esOnline) { tabla.Append(", sede"); } tabla.Append("\n"); } if (esParaOmegaUp) { tabla.Append("username,name,country_id,state_id,gender,school_name\n"); foreach (MiembroDelegacion asistente in asistentes) { if (asistente.tipo == MiembroDelegacion.TipoAsistente.COMPETIDOR) { Persona p = Persona.obtenerPersonaConClave(asistente.claveUsuario, completo: true, incluirDatosPrivados: true); Estado e = Estado.obtenerEstadoConClave(asistente.estado); tabla.Append(asistente.clave); tabla.Append(","); tabla.Append(p.nombreCompleto); tabla.Append(","); if (e.extranjero) { tabla.Append(e.sitio); // Guardamos el ISO necesario para el país en este campo dado que no se usa para extranjeros } else { tabla.Append("MX"); tabla.Append(","); tabla.Append(e.ISO); } tabla.Append(","); tabla.Append(p.genero == "M" ? "male" : "female"); tabla.Append(","); tabla.Append(asistente.nombreEscuela); tabla.Append("\n"); } } } else { foreach (MiembroDelegacion asistente in asistentes) { if (esParaRegistro) { tabla.Append(tipoOlimpiada); tabla.Append(","); } tabla.Append(asistente.obtenerLineaAdmin(esParaRegistro: esParaRegistro)); if (esParaRegistro) { Persona p = Persona.obtenerPersonaConClave(asistente.claveUsuario, completo: true, incluirDatosPrivados: true); tabla.Append(p.obtenerLineaAdmin()); if (this.esOnline) { tabla.Append(","); SedeOnline so = SedeOnline.obtenerSedeConClave(asistente.sede); if (so != null) { tabla.Append(Cadenas.comillas(so.nombre, "\"")); } } } tabla.Append("\n"); } } return(tabla.ToString()); }
public void actualiza(string clave, decimal?[] resultados) { Resultados res; if (!this.resultados.TryGetValue(clave, out res)) { List <MiembroDelegacion> miembros = MiembroDelegacion.obtenerMiembrosConClave(this.olimpiada, this.tipoOlimpiada, clave); if (miembros.Count != 1) { this.resultados.Add(clave, null); return; } res = new Resultados(); res.tipoOlimpiada = this.tipoOlimpiada; res.omi = this.olimpiada; res.usuario = miembros[0].claveUsuario; res.clave = clave; res.publico = true; res.estado = miembros[0].estado; concursantes++; this.resultados.Add(clave, res); } if (res == null) { return; } List <float?> arreglo; if (dia == 1) { arreglo = res.dia1; } else { arreglo = res.dia2; } float?total = 0; for (int i = 0; i < this.problemas; i++) { arreglo[i] = (float?)resultados[i]; if (arreglo[i] != null) { total += arreglo[i]; } } if (dia == 1) { res.totalDia1 = total; } else { res.totalDia2 = total; } res.total = res.totalDia1 + res.totalDia2; }
// // GET: /Registro/Asistente public ActionResult Asistente(string omi, TipoOlimpiada tipo = TipoOlimpiada.NULL, string estado = null, string clave = null) { Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, tipo == TipoOlimpiada.NULL ? TipoOlimpiada.OMI : tipo); if (o == null) { return(RedirectTo(Pagina.HOME)); } failSafeViewBag(); ViewBag.omi = o; if (!tienePermisos(o.registroActivo || o.registroSedes, estado)) { ViewBag.errorInfo = "permisos"; return(View(new Persona())); } Persona p = getUsuario(); if (!p.esSuperUsuario()) { if (estado == null || (String.IsNullOrEmpty(clave) && tipo != TipoOlimpiada.NULL && !puedeRegistrarOtroMas(o, tipo, estado))) { ViewBag.errorInfo = "limite"; return(View(new Persona())); } ViewBag.estado = Estado.obtenerEstadoConClave(estado); } MiembroDelegacion md = null; if (clave == null) { if (!p.esSuperUsuario() && tipo != TipoOlimpiada.NULL) { ViewBag.claveDisponible = MiembroDelegacion.obtenerPrimerClaveDisponible(omi, tipo, estado); } ViewBag.tipoAsistente = MiembroDelegacion.TipoAsistente.NULL; } else { var temp = MiembroDelegacion.obtenerMiembrosConClave(omi, tipo, clave); if (temp.Count == 0) { ViewBag.errorInfo = "invalido"; return(View(new Persona())); } if (temp.Count > 1) { ViewBag.errorInfo = "duplicado"; return(View(new Persona())); } md = temp[0]; if (!p.esSuperUsuario() && md.estado != estado) { ViewBag.errorInfo = "permisos"; return(View(new Persona())); } ViewBag.claveDisponible = md.clave; ViewBag.tipoAsistente = md.tipo; ViewBag.estado = Estado.obtenerEstadoConClave(md.estado); ViewBag.nombreEscuela = md.nombreEscuela; ViewBag.claveEscuela = md.claveEscuela; ViewBag.añoEscuela = md.añoEscuela; ViewBag.nivelEscuela = md.nivelEscuela.ToString(); } ViewBag.md = md; ViewBag.tipo = tipo; ViewBag.estados = Estado.obtenerEstados(); limpiarErroresViewBag(); ViewBag.resubmit = false; ViewBag.guardado = false; ViewBag.hayResultados = Resultados.hayResultadosParaOMI(o.numero); if (o.esOnline && !p.esSuperUsuario()) { ViewBag.sedes = SedeOnline.obtenerSedes(o.numero, estado, tipo); } if (md != null && md.sede > 0) { ViewBag.nombreSede = SedeOnline.obtenerSedeConClave(md.sede).nombre; } p = md == null ? new Persona() : Persona.obtenerPersonaConClave(md.claveUsuario, completo: true, incluirDatosPrivados: true); p.breakNombre(); List <Ajax.BuscarEscuelas> escuelas = null; if (md != null && md.tipo == MiembroDelegacion.TipoAsistente.COMPETIDOR) { escuelas = Institucion.obtenerEscuelasDeEstado(md.tipoOlimpiada, md.estado); } else if (estado != null) { if (tipo != TipoOlimpiada.NULL) { escuelas = Institucion.obtenerEscuelasDeEstado(tipo, estado); } } ViewBag.escuelas = escuelas; return(View(p)); }
// // GET: /Profile/Diploma/ public ActionResult Diploma(string omi, string clave, TipoOlimpiada clase = TipoOlimpiada.NULL, bool todos = false) { if (!estaLoggeado()) { return(RedirectTo(Pagina.ERROR, 401)); } Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, TipoOlimpiada.OMI); if (o == null || !o.diplomasOnline) { return(RedirectTo(Pagina.ERROR, 404)); } Persona p = getUsuario(); MiembroDelegacion md = MiembroDelegacion.obtenerMiembrosConClave(omi, clase, clave)[0]; if (md.claveUsuario != p.clave) { return(RedirectTo(Pagina.ERROR, 401)); } if (todos && (md.tipo != MiembroDelegacion.TipoAsistente.LIDER && md.tipo != MiembroDelegacion.TipoAsistente.DELEGADO && md.tipo != MiembroDelegacion.TipoAsistente.SUBLIDER && md.tipo != MiembroDelegacion.TipoAsistente.DELELIDER)) { return(RedirectTo(Pagina.ERROR, 401)); } if (md.tipo == MiembroDelegacion.TipoAsistente.COMPETIDOR) { if (clase == TipoOlimpiada.OMIP) { clave = "P-" + clave; } if (clase == TipoOlimpiada.OMIS) { clave = "S-" + clave; } } if (!todos) { int numeroDeDiplomas = Archivos.cuantosExisten (Archivos.Folder.DIPLOMAS, omi + "\\" + md.estado, clave); if (numeroDeDiplomas == 0) { return(RedirectTo(Pagina.ERROR, 404)); } if (numeroDeDiplomas == 1) { string contentFile = "application/pdf"; string url = "~/private/diplomas/" + omi + "/" + md.estado + "/" + clave + ".pdf"; string file = Server.MapPath(url); if (!System.IO.File.Exists(file)) { return(RedirectTo(Pagina.ERROR, 404)); } return(File(file, contentFile, "Diploma.pdf")); } } return(File(Archivos.comprimeArchivos( Archivos.Folder.DIPLOMAS, omi + "\\" + md.estado, todos ? null : clave), "application/zip", "Diplomas.zip")); }
// // 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 ActionResult Asistente(HttpPostedFileBase file, Persona p, string omi, string tipoOriginal, string estado, string claveSelect, int persona, string claveOriginal, int selectEscuela = 0, string nombreEscuela = null, int selectAnioEscolar = 0, Institucion.NivelInstitucion selectNivelEscolar = Institucion.NivelInstitucion.NULL, TipoOlimpiada tipo = TipoOlimpiada.NULL, bool selectPublica = true, MiembroDelegacion.TipoAsistente tipoAsistente = MiembroDelegacion.TipoAsistente.NULL, int sede = -1) { // Se valida que el usuario tenga permiso para realizar esta acción Olimpiada o = Olimpiada.obtenerOlimpiadaConClave(omi, tipo == TipoOlimpiada.NULL ? TipoOlimpiada.OMI : tipo); if (String.IsNullOrEmpty(estado) || tipo == TipoOlimpiada.NULL || tipoAsistente == MiembroDelegacion.TipoAsistente.NULL || o == null) { return(RedirectTo(Pagina.HOME)); } failSafeViewBag(); ViewBag.omi = o; if (!tienePermisos(o.registroActivo || o.registroSedes, estado)) { ViewBag.errorInfo = "permisos"; return(View(new Persona())); } bool modifyMode = !String.IsNullOrEmpty(claveOriginal); // Se valida que haya espacio para registrar otro competidor if (!esAdmin() && !modifyMode && tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR && !puedeRegistrarOtroMas(o, tipo, estado)) { ViewBag.errorInfo = "limite"; return(View(new Persona())); } // Se valida que el miembro delegacion que se está modificando (en caso de update), exista MiembroDelegacion md = null; TipoOlimpiada tipoO = TipoOlimpiada.NULL; Institucion i = null; if (modifyMode) { tipoO = DataRowParser.ToTipoOlimpiada(tipoOriginal); var temp = MiembroDelegacion.obtenerMiembrosConClave(omi, tipoO, claveOriginal); if (temp.Count == 0) { ViewBag.errorInfo = "invalido"; return(View(new Persona())); } if (temp.Count > 1) { ViewBag.errorInfo = "duplicado"; return(View(new Persona())); } md = temp[0]; if (!p.esSuperUsuario() && md.estado != estado) { ViewBag.errorInfo = "permisos"; return(View(new Persona())); } } // Se valida que la clave que se eligió sea valida para el estado Estado e = Estado.obtenerEstadoConClave(estado); if (claveSelect != null && tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR && !claveSelect.StartsWith(e.ISO)) { claveSelect = ""; } if (persona != 0) { p.clave = persona; } // Se regresan todos los valores al viewbag en caso de error ViewBag.claveDisponible = claveSelect; ViewBag.estado = e; ViewBag.md = md; ViewBag.omi = o; ViewBag.tipo = tipo; ViewBag.estados = Estado.obtenerEstados(); ViewBag.tipoAsistente = tipoAsistente; limpiarErroresViewBag(); ViewBag.resubmit = true; bool hayResultados = Resultados.hayResultadosParaOMI(o.numero); ViewBag.hayResultados = hayResultados; if (o.esOnline && !p.esSuperUsuario()) { ViewBag.sedes = SedeOnline.obtenerSedes(o.numero, estado, tipo); } if (tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR) { ViewBag.escuelas = Institucion.obtenerEscuelasDeEstado(tipo, estado); ViewBag.claveEscuela = selectEscuela; ViewBag.añoEscuela = selectAnioEscolar; ViewBag.nivelEscuela = selectNivelEscolar.ToString(); if (selectEscuela > 0) { i = Institucion.obtenerInstitucionConClave(selectEscuela); if (i == null) { ViewBag.nombreEscuela = ""; ViewBag.claveEscuela = 0; } else { ViewBag.nombreEscuela = i.nombre; } } else { ViewBag.nombreEscuela = nombreEscuela; ViewBag.publica = selectPublica; } } // Validaciones extra de la foto if (file != null) { var valida = Archivos.esImagenValida(file, Peticion.TamañoFotoMaximo); if (valida != Archivos.ResultadoImagen.VALIDA) { ViewBag.errorImagen = valida.ToString().ToLower(); return(View(p)); } } // Validaciones del modelo if (!ModelState.IsValid) { return(View(p)); } bool isOMIPOS = TableManager.isOMIPOS(tipo); if ((tipo == TipoOlimpiada.OMIP || tipo == TipoOlimpiada.OMIS || isOMIPOS) && tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR) { p.omips = true; } List <MiembroDelegacion> miembrosExistentes = MiembroDelegacion.obtenerMiembrosDelegacion(omi, estado, tipo); bool registroCerrado = false; if (miembrosExistentes.Count > 0) { registroCerrado = miembrosExistentes[0].cerrado; } // Validaciones terminadas, guardamos persona y miembro delegacion // Primero en caso de que sea un nuevo miembro de la delegación if (md == null) { // Si la persona es 0, intentamos hacer match basándonos en el nombre, y solamente en el nombre if (persona == 0) { Persona pe = Persona.obtenerPersonaConNombre(p.nombreCompleto); if (pe != null) { persona = pe.clave; } } // Nuevo asistente if (persona == 0) { // Si no hay clave de persona previa, se agrega una nueva persona p.nuevoUsuario(); } else { // Si tengo clave, se intenta conseguir Persona per = Persona.obtenerPersonaConClave(persona); if (per == null) { ViewBag.errorInfo = "persona"; return(View(new Persona())); } p.clave = per.clave; p.oculta = per.oculta; p.omips = per.omips; } if (tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR) { if (isOMIPOS) { if (persona == 0) { p.oculta = true; } } else { p.oculta = false; } } p.foto = guardaFoto(file, p.clave); p.guardarDatos(generarPeticiones: false, lugarGuardado: Persona.LugarGuardado.REGISTRO); // Se genera un nuevo miembro delegacion md = new MiembroDelegacion(); md.olimpiada = o.numero; md.tipoOlimpiada = tipo; md.estado = estado; md.clave = claveSelect; md.tipo = tipoAsistente; md.claveUsuario = p.clave; md.sede = sede; md.cerrado = registroCerrado; md.nuevo(); // Se registra la telemetria Log.add(Log.TipoLog.REGISTRO, "Usuario " + getUsuario().nombreCompleto + " registró a " + p.nombreCompleto + " en el estado " + md.estado + " con clave " + md.clave + " en la categoría " + md.tipoOlimpiada.ToString()); } else { // Si ya hay resultados no podemos cambiar la clave, estado, o tipo de OMI if (hayResultados) { tipo = md.tipoOlimpiada; claveSelect = md.clave; estado = md.estado; // Adicionalmente si es competidor, no se piuede cambiar su tipo de asistencia // ni volver a alguien mas competidor if (md.tipo == MiembroDelegacion.TipoAsistente.COMPETIDOR || tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR) { tipoAsistente = md.tipo; } } // Modificando asistente // Primero los datos de persona Persona per = Persona.obtenerPersonaConClave(md.claveUsuario); if (!modifyMode && tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR && !isOMIPOS) { per.oculta = false; } p.clave = per.clave; p.oculta = per.oculta; p.omips = per.omips; p.foto = guardaFoto(file, p.clave); p.guardarDatos(generarPeticiones: false, lugarGuardado: Persona.LugarGuardado.REGISTRO); // Luego el miembro delegacion md.tipoOlimpiada = tipo; md.estado = estado; md.clave = claveSelect; md.tipo = tipoAsistente; md.sede = sede; md.cerrado = registroCerrado; md.guardarDatos(claveOriginal, tipoO); // Se registra la telemetria Log.add(Log.TipoLog.REGISTRO, "Usuario " + getUsuario().nombreCompleto + " actualizó a " + p.nombreCompleto + " en el estado " + md.estado + " con clave " + md.clave + " en la categoría " + md.tipoOlimpiada.ToString()); } // Ahora se guarda la escuela if (tipoAsistente == MiembroDelegacion.TipoAsistente.COMPETIDOR) { // La escuela ya se consultó en la sección de viewbag, si es null, se llenó la sección de escuela nueva if (i == null) { if (!String.IsNullOrEmpty(nombreEscuela)) { // La escuela aun puede ya existir pero no la vieron y la volvieron a escribir, // aqui tratamos de ver si ya existe i = Institucion.buscarInstitucionConNombre(nombreEscuela); if (i == null) { // Se genera una nueva escuela vacía y se asignan los datos que tenemos i = new Institucion(); i.nuevaInstitucion(); i.nombre = nombreEscuela; i.publica = selectPublica; } } } // Si en este punto tenemos una escuela, actualizamos los datos de la escuela y // actualizamos el miembro delegacion if (i != null) { switch (selectNivelEscolar) { case Institucion.NivelInstitucion.PRIMARIA: i.primaria = true; break; case Institucion.NivelInstitucion.SECUNDARIA: i.secundaria = true; break; case Institucion.NivelInstitucion.PREPARATORIA: i.preparatoria = true; break; } i.guardar(generarPeticiones: false); md.claveEscuela = i.clave; md.nivelEscuela = selectNivelEscolar; md.añoEscuela = selectAnioEscolar; md.guardarDatosEscuela(); } } ViewBag.guardado = true; return(View(p)); }