/// <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(); }
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); }