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