Exemplo n.º 1
0
        //
        // 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 }));
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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;
            }
        }
Exemplo n.º 5
0
        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();
            }
        }
Exemplo n.º 6
0
        //
        // 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));
        }
Exemplo n.º 7
0
        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())));
        }
Exemplo n.º 8
0
        //
        // 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());
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        /// <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);
        }
Exemplo n.º 11
0
        //
        // 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));
        }
Exemplo n.º 12
0
        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());
        }
Exemplo n.º 13
0
        //
        // 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));
        }
Exemplo n.º 14
0
        //
        // 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 }));
        }
Exemplo n.º 15
0
        /// <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();
        }
Exemplo n.º 16
0
        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;
        }
Exemplo n.º 17
0
        /// <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());
        }
Exemplo n.º 18
0
        //
        // 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 }));
        }
Exemplo n.º 19
0
        //
        // 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));
        }
Exemplo n.º 20
0
        /// <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();
        }
Exemplo n.º 21
0
        /// <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());
        }
Exemplo n.º 22
0
        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;
        }
Exemplo n.º 23
0
        //
        // 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));
        }
Exemplo n.º 24
0
        //
        // 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"));
        }
Exemplo n.º 25
0
        //
        // 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));
        }
Exemplo n.º 26
0
        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));
        }