예제 #1
0
        /// <summary>
        /// Obtiene la lista de las mejores escuelas con medallas
        /// </summary>
        /// <param name="tipoOlimpiada">El tipo de olimpiada</param>
        /// <param name="estado">El estado que queremos filtrar</param>
        /// <returns>La lista de instituciones</returns>
        public static List <KeyValuePair <Institucion, Medallero> > obtenerMejoresEscuelas(string estado, TipoOlimpiada tipoOlimpiada)
        {
            List <KeyValuePair <Institucion, Medallero> > escuelas = new List <KeyValuePair <Institucion, Medallero> >();

            Acceso        db    = new Acceso();
            StringBuilder query = new StringBuilder();

            query.Append(" select * from Medallero where tipo = ");
            query.Append((int)Medallero.TipoMedallero.INSTITUCION);
            query.Append(" and clase = ");
            query.Append(Cadenas.comillas(tipoOlimpiada.ToString().ToLower()));
            if (estado == null)
            {
                query.Append(" and oro > 1 ");
            }
            else
            {
                query.Append(" and (oro + plata + bronce) > 1 ");
            }
            query.Append(" order by oro desc, plata desc, bronce desc ");

            db.EjecutarQuery(query.ToString());
            DataTable table = db.getTable();

            foreach (DataRow r in table.Rows)
            {
                Medallero m = new Medallero();
                m.llenarDatos(r);
                Institucion i = Institucion.obtenerInstitucionConClave(int.Parse(m.clave));
                i.consultarEstadosDeInstitucion(tipoOlimpiada);

                if (estado == null || i.estados.Contains(estado))
                {
                    escuelas.Add(new KeyValuePair <Institucion, Medallero>(i, m));
                }
            }

            return(escuelas);
        }
예제 #2
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();
        }