/** * Constructor * @param {integer} $prueba Prueba ID * @param {integer} $jornada Jormada ID * @param {integer} $manga Manga ID * @throws Exception */ function __construct($prueba, $jornada) { parent::__construct('Portrait', "print_equiposByJornada", $prueba, $jornada); if ($prueba <= 0 || $jornada <= 0) { $this->errormsg = "print_teamsByJornada: either prueba or jornada data are invalid"; throw new Exception($this->errormsg); } // comprobamos que estamos en una jornada por equipos $flag = intval($this->jornada->Equipos3) + intval($this->jornada->Equipos4); if ($flag == 0) { $this->errormsg = "print_teamsByJornada: Jornada {$jornada} has no Team competition declared"; throw new Exception($this->errormsg); } // Datos de equipos de la jornada $m = new Equipos("print_teamsByJornada", $prueba, $jornada); $teams = $m->getTeamsByJornada(); // reindexamos por ID y anyadimos un campo extra "Perros" con los perros del equipo $this->equipos = array(); foreach ($teams as &$equipo) { $equipo['Perros'] = $m->getPerrosByTeam($equipo['ID']); $this->equipos[$equipo['ID']] = $equipo; } // Datos de los participantes (indexados por ID de perro) $m = new DBObject("print_teamsByJornada"); $r = $m->__select("*", "Resultados", "(Jornada={$jornada})", "", ""); $this->perros = array(); foreach ($r['rows'] as $item) { $this->perros[intval($item['Perro'])] = $item; } // finalmente internacionalizamos cabeceras $this->cellHeader = array(_('Dorsal'), _('Name'), _('Breed'), _('Lic'), _('Category'), _('Handler'), $this->strClub, _('Heat'), _('Comments')); }
/** * Constructor * @param {integer} $prueba Prueba ID * @param {integer} $jornada Jormada ID * @param {integer} $manga Manga ID * @throws Exception */ function __construct($prueba, $jornada, $manga) { parent::__construct('Portrait', "print_ordenDeSalida", $prueba, $jornada); if ($prueba <= 0 || $jornada <= 0 || $manga <= 0) { $this->errormsg = "printOrdenDeSalida: either prueba/jornada/ manga/orden data are invalid"; throw new Exception($this->errormsg); } // Datos de la manga $m = new Mangas("printOrdenDeSalida", $jornada); $this->manga = $m->selectByID($manga); // Datos del orden de salida $o = new OrdenSalida("printOrdenDeSalida", $manga); $os = $o->getData(); $this->orden = $os['rows']; $this->categoria = "L"; $this->cellHeader = array(_('Order'), _('Dorsal'), _('Name'), _('Breed'), _('Lic'), _('Handler'), $this->strClub, _('Heat'), _('Comments')); // obtenemos los datos de equipos de la jornada indexados por el ID del equipo $eq = new Equipos("print_ordenDeSalida", $prueba, $jornada); $this->teams = array(); foreach ($eq->getTeamsByJornada() as $team) { $this->teams[$team['ID']] = $team; } }
/** * Evalua el resultado de una competicion por equipos * @param {array} $r1 datos de la manga 1 * @param {array} $r2 datos de la manga 2 */ function evalFinalEquipos($r1, $r2, $mindogs, $mode) { // Datos de equipos de la jornada $eobj = new Equipos("evalFinalEquipos", $this->prueba->ID, $this->jornada->ID); $tbj = $eobj->getTeamsByJornada(); // reindexamos equipos por ID y aniadimos campos para evaluar clasificacion $teams = array(); foreach ($tbj as $equipo) { if ($equipo['Nombre'] === "-- Sin asignar --") { continue; } // comprobamos la categoria. si no coincide tiramos el equipo $modes = array("L", "M", "S", "MS", "LMS", "T", "LM", "ST", "LMST"); if (!category_match($equipo['Categorias'], $modes[$mode])) { continue; } $r = array_merge($equipo, array('C1' => 0, 'C2' => 0, 'T1' => 0, 'T2' => 0, 'P1' => 0, 'P2' => 0, 'Tiempo' => 0, 'Penalizacion' => 0)); $teams[$equipo['ID']] = $r; } // procesamos manga 1. Se asume que los resultados ya vienen ordenados por puesto, // de manera que se contabilizan solo los mindogs primeros perros de cada equipo if ($r1 != null) { foreach ($r1['rows'] as $resultado) { $eq = $resultado['Equipo']; if (!array_key_exists($eq, $teams)) { $this->myLogger->notice("evalFinalEquipos(): Prueba:{$this->prueba->ID} Jornada:{$this->jornada->ID} Manga:1 Equipo:{$eq} no existe"); continue; } if ($teams[$eq]['C1'] >= $mindogs) { continue; } $teams[$eq]['C1']++; $teams[$eq]['T1'] += $resultado['Tiempo']; $teams[$eq]['P1'] += $resultado['Penalizacion']; $teams[$eq]['Tiempo'] += $resultado['Tiempo']; $teams[$eq]['Penalizacion'] += $resultado['Penalizacion']; } } // procesamos manga 2 if ($r2 != null) { foreach ($r2['rows'] as $resultado) { $eq = $resultado['Equipo']; if (!array_key_exists($eq, $teams)) { $this->myLogger->notice("evalFinalEquipos(): Prueba:{$this->prueba->ID} Jornada:{$this->jornada->ID} Manga:2 Equipo:{$eq} no existe"); continue; } if ($teams[$eq]['C2'] >= $mindogs) { continue; } $teams[$eq]['C2']++; $teams[$eq]['T2'] += $resultado['Tiempo']; $teams[$eq]['P2'] += $resultado['Penalizacion']; $teams[$eq]['Tiempo'] += $resultado['Tiempo']; $teams[$eq]['Penalizacion'] += $resultado['Penalizacion']; } } // rellenamos huecos hasta completar mindogs foreach ($teams as &$team) { // 100:Eliminado 200:NoPresentado 400:Pendiente for ($n = $team['C1']; $n < $mindogs; $n++) { $team['P1'] += 400; $team['Penalizacion'] += 400; } for ($n = $team['C2']; $n < $mindogs; $n++) { $team['P2'] += 400; $team['Penalizacion'] += 400; } } // eliminamos el indice del array $final = array_values($teams); // re-ordenamos los datos en base a la puntuacion usort($final, function ($a, $b) { if ($a['Penalizacion'] == $b['Penalizacion']) { return $a['Tiempo'] > $b['Tiempo'] ? 1 : -1; } return $a['Penalizacion'] > $b['Penalizacion'] ? 1 : -1; }); // retornamos resultado return $final; }
/** * Gestion de resultados en Equipos3/Equipos4 * Agrupa los resultados por equipos y genera una lista de equipos ordenados por resultados * @param {array} resultados de la manga ordenados por participante * @param {int} prueba PruebaID * @param {int} jornada JornadaID * @param {int} $mindogs minimun number of dogs on a team * @return {array} datos de equipos de la manga ordenados por resultados de equipo */ static function getTeamResults($resultados, $prueba, $jornada, $mindogs = 4) { // Datos de equipos de la jornada. obtenemos prueba y jornada del primer elemento del array $m = new Equipos("getTeamResults", $prueba, $jornada); $teams = $m->getTeamsByJornada(); // reindexamos por ID y anyadimos un campos extra Tiempo, penalizacion y el array de resultados del equipo $equipos = array(); foreach ($teams as &$equipo) { $equipo['Resultados'] = array(); $equipo['Tiempo'] = 0.0; $equipo['Penalizacion'] = 0.0; $equipos[$equipo['ID']] = $equipo; } // now fill team members array. // notice that $resultados is already sorted by results foreach ($resultados as &$result) { $teamid = $result['Equipo']; $equipo =& $equipos[$teamid]; array_push($equipo['Resultados'], $result); // suma el tiempo y penalizaciones de los tres/cuatro primeros if (count($equipo['Resultados']) <= $mindogs) { $equipo['Tiempo'] += floatval($result['Tiempo']); $equipo['Penalizacion'] += floatval($result['Penalizacion']); } } // rastrea los equipos con menos de $mindogs participantes y marca los que faltan // no presentados $teams = array(); foreach ($equipos as &$equipo) { switch (count($equipo['Resultados'])) { case 0: continue; // ignore team break; case 1: $equipo['Penalizacion'] += 400.0; // required team member undeclared // no break // required team member undeclared // no break case 2: if ($mindogs == 3) { $equipo['Penalizacion'] += 400.0; } // required team member undeclared // no break; // required team member undeclared // no break; case 3: if ($mindogs == 4) { $equipo['Penalizacion'] += 400.0; } // required team member undeclared // no break; // required team member undeclared // no break; case 4: array_push($teams, $equipo); // add team to result to remove unused/empty teams break; default: $myLogger = new Logger("Resultados::getTreamResults()"); $myLogger->error("Equipo {$equipo['ID']} : '{$equipo['Nombre']}' con exceso de participantes:" . count($equipo['Resultados'])); break; } } // finally sort equipos by result instead of id usort($teams, function ($a, $b) { if ($a['Penalizacion'] == $b['Penalizacion']) { return $a['Tiempo'] > $b['Tiempo'] ? 1 : -1; } return $a['Penalizacion'] > $b['Penalizacion'] ? 1 : -1; }); return $teams; }