コード例 #1
0
ファイル: Olimpiada.cs プロジェクト: darknut/OMIstats
        /// <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();
        }
コード例 #2
0
ファイル: Olimpiada.cs プロジェクト: darknut/OMIstats
        private void llenarDatos(DataRow datos)
        {
            numero                       = DataRowParser.ToString(datos["numero"]);
            tipoOlimpiada                = DataRowParser.ToTipoOlimpiada(datos["clase"]);
            ciudad                       = DataRowParser.ToString(datos["ciudad"]);
            pais                         = DataRowParser.ToString(datos["pais"]);
            año                          = DataRowParser.ToStrictFloat(datos["año"]);
            inicio                       = DataRowParser.ToDateTime(datos["inicio"]);
            fin                          = DataRowParser.ToDateTime(datos["fin"]);
            video                        = DataRowParser.ToString(datos["video"]);
            poster                       = DataRowParser.ToString(datos["poster"]);
            estados                      = DataRowParser.ToInt(datos["estados"]);
            participantes                = DataRowParser.ToInt(datos["participantes"]);
            datosPublicos                = DataRowParser.ToBool(datos["datospublicos"]);
            relacion                     = DataRowParser.ToString(datos["relacion"]);
            reporte                      = DataRowParser.ToString(datos["reporte"]);
            problemasDia1                = DataRowParser.ToInt(datos["problemasDia1"]);
            problemasDia2                = DataRowParser.ToInt(datos["problemasDia2"]);
            mostrarResultadosPorDia      = DataRowParser.ToBool(datos["mostrarResultadosPorDia"]);
            mostrarResultadosPorProblema = DataRowParser.ToBool(datos["mostrarResultadosPorProblema"]);
            mostrarResultadosTotales     = DataRowParser.ToBool(datos["mostrarResultadosTotales"]);
            puntosDesconocidos           = DataRowParser.ToBool(datos["puntosDesconocidos"]);
            alsoOmips                    = DataRowParser.ToBool(datos["alsoOmips"]);
            alsoOmipsOnline              = DataRowParser.ToBool(datos["alsoOmipsOnline"]);
            noMedallistasConocidos       = DataRowParser.ToBool(datos["noMedallistasConocidos"]);
            puntosDetallados             = DataRowParser.ToBool(datos["puntosDetallados"]);
            registroActivo               = DataRowParser.ToBool(datos["registroActivo"]);
            diplomasOnline               = DataRowParser.ToBool(datos["diplomasOnline"]);
            esOnline                     = DataRowParser.ToBool(datos["esOnline"]);
            registroSedes                = DataRowParser.ToBool(datos["registroSedes"]);
            ordenarPorPuntos             = DataRowParser.ToBool(datos["ordenarPorPuntos"]);

            claveEstado = DataRowParser.ToString(datos["estado"]);
            Estado estado = Estado.obtenerEstadoConClave(claveEstado);

            if (estado != null)
            {
                nombreEstado = estado.nombre;
            }

            claveEscuela = DataRowParser.ToInt(datos["escuela"]);
            Institucion institucion = Institucion.obtenerInstitucionConClave(claveEscuela);

            if (institucion != null)
            {
                nombreEscuela         = institucion.nombreCorto;
                escuelaURL            = institucion.nombreURL;
                nombreEscuelaCompleto = institucion.nombre;
            }

            if (inicio.Year > 1990)
            {
                if (inicio.Month == fin.Month)
                {
                    friendlyDate = "Del " + inicio.Day +
                                   " al " + Fechas.friendlyString(fin);
                }
                else
                {
                    friendlyDate = "Del " + Fechas.friendlyString(inicio) +
                                   " al " + Fechas.friendlyString(fin);
                }
            }

            if (Archivos.existeArchivo(Archivos.Folder.OLIMPIADAS,
                                       numero + ".png"))
            {
                logo = numero + ".png";
            }
            else
            {
                logo = Archivos.OMI_LOGO;
            }

            if (numero != TEMP_CLAVE &&
                (tipoOlimpiada == TipoOlimpiada.OMIP ||
                 tipoOlimpiada == TipoOlimpiada.OMIS ||
                 tipoOlimpiada == TipoOlimpiada.OMIPO ||
                 tipoOlimpiada == TipoOlimpiada.OMISO))
            {
                omisActualNumber = (Int32.Parse(numero) - OMIS_SIN_OMIPS).ToString();
            }

            datosGenerales = Problema.obtenerProblema(numero, tipoOlimpiada, 0, 0);
        }