/** * Presenta una tabla ordenada segun los resultados de la manga *@param {integer} $mode 0:L 1:M 2:S 3:MS 4:LMS 5:T 6:L+M 7:S+T 8 L+M+S+T *@return {array} requested data or error */ function getResultados($mode) { $this->myLogger->enter(); $idmanga = $this->IDManga; // FASE 0: en funcion del tipo de recorrido y modo pedido // ajustamos el criterio de busqueda de la tabla de resultados $where = "(Manga={$idmanga}) AND (Pendiente=0) "; $cat = ""; switch ($mode) { case 0: /* Large */ $cat = "AND (Categoria='L')"; break; case 1: /* Medium */ $cat = "AND (Categoria='M')"; break; case 2: /* Small */ $cat = "AND (Categoria='S')"; break; case 3: /* Med+Small */ $cat = "AND ( (Categoria='M') OR (Categoria='S') )"; break; case 4: /* L+M+S */ $cat = "AND ( (Categoria='L') OR (Categoria='M') OR (Categoria='S') )"; break; case 5: /* Tiny */ $cat = "AND (Categoria='T')"; break; case 6: /* L+M */ $cat = "AND ( (Categoria='L') OR (Categoria='M') )"; break; case 7: /* S+T */ $cat = "AND ( (Categoria='S') OR (Categoria='T') )"; break; case 8: /* L+M+S+T */ break; // no check categoria // no check categoria default: return $this->error("modo de recorrido desconocido:{$mode}"); } // FASE 1: recogemos resultados ordenados por precorrido y tiempo $res = $this->__select("Dorsal,Perro,Nombre,Raza,Equipo,Licencia,Categoria,Grado,NombreGuia,NombreClub,Faltas,Tocados,Rehuses,Tiempo,Eliminado,NoPresentado,\n\t\t\t\t\t( 5*Faltas + 5*Rehuses + 5*Tocados + 100*Eliminado + 200*NoPresentado ) AS PRecorrido,\n\t\t\t\t\t0 AS PTiempo, 0 AS Penalizacion, '' AS Calificacion, 0 AS Velocidad", "Resultados", "{$where} {$cat}", " PRecorrido ASC, Tiempo ASC", ""); if (!is_array($res)) { $this->myLogger->leave(); return $this->error($this->conn->error); } $table = $res['rows']; // FASE 2: evaluamos TRS Y TRM $tdata = $this->evalTRS($mode, $table); // array( 'dist' 'obst' 'trs' 'trm', 'vel') $res['trs'] = $tdata; // store trs data into result $trs = $tdata['trs']; $trm = $tdata['trm']; // FASE 3: añadimos ptiempo, puntuacion, clasificacion y logo $clubes = new Clubes("Resultados::getResultados", $this->getDatosPrueba()->RSCE); $size = count($table); for ($idx = 0; $idx < $size; $idx++) { $table[$idx]['Puntos'] = 0; // to be re-evaluated later // importante: las asignaciones se hacen en base a $table[$idx], // pues si no solo se actualiza la copia if ($trs == 0) { // si TRS==0 no hay penalizacion por tiempo $table[$idx]['PTiempo'] = 0.0; $table[$idx]['Penalizacion'] = $table[$idx]['PRecorrido']; } else { // evaluamos penalizacion por tiempo y penalizacion final if ($table[$idx]['Tiempo'] < $trs) { // Por debajo del TRS $table[$idx]['PTiempo'] = 0.0; $table[$idx]['Penalizacion'] = $table[$idx]['PRecorrido']; } if ($table[$idx]['Tiempo'] >= $trs) { // Superado TRS $table[$idx]['PTiempo'] = $table[$idx]['Tiempo'] - $trs; $table[$idx]['Penalizacion'] = floatval($table[$idx]['PRecorrido']) + $table[$idx]['PTiempo']; } if ($table[$idx]['Tiempo'] > $trm) { // Superado TRM: eliminado $table[$idx]['Penalizacion'] = 100.0; } } // evaluamos velocidad if ($table[$idx]['Tiempo'] == 0) { $table[$idx]['Velocidad'] = 0; } else { $table[$idx]['Velocidad'] = $tdata['dist'] / $table[$idx]['Tiempo']; } // anyadimos nombre del equipo $dequipos = $this->getDatosEquipos(); $eqinfo = $dequipos[$table[$idx]['Equipo']]; $table[$idx]['NombreEquipo'] = $eqinfo['Nombre']; // anyadimos logotipo del club $table[$idx]['LogoClub'] = $clubes->getLogoName('NombreClub', $table[$idx]['NombreClub']); } // FASE 4: re-ordenamos los datos en base a la puntuacion y calculamos campo "Puesto" usort($table, function ($a, $b) { if ($a['Penalizacion'] == $b['Penalizacion']) { return $a['Tiempo'] > $b['Tiempo'] ? 1 : -1; } return $a['Penalizacion'] > $b['Penalizacion'] ? 1 : -1; }); // format output data and take care con duplicated penalizacion and time // calculamos campo "Puesto", "Calificacion" y Puntos $puestocat = array('C' => 1, 'L' => 1, 'M' => 1, 'S' => 1, 'T' => 1); // ultimo puesto por cada categoria $lastcat = array('C' => 0, 'L' => 0, 'M' => 0, 'S' => 0, 'T' => 0); // ultima puntuacion por cada categoria $countcat = array('C' => 0, 'L' => 0, 'M' => 0, 'S' => 0, 'T' => 0); // perros contabilizados de cada categoria $fed = $this->getFederation(); for ($idx = 0; $idx < $size; $idx++) { // vemos la categoria y actualizamos contadores de categoria $cat = $table[$idx]['Categoria']; $countcat['C']++; // Conjunta $countcat[$cat]++; // Por categoria // obtenemos la penalizacion del perro actual $now = 100 * $table[$idx]['Penalizacion'] + $table[$idx]['Tiempo']; // ajustamos puesto conjunto y guardamos resultado if ($lastcat['C'] != $now) { $lastcat['C'] = $now; $puestocat['C'] = $countcat['C']; } $table[$idx]['Puesto'] = $puestocat['C']; // ajustamos puesto por categoria y guardamos resultado if ($lastcat[$cat] != $now) { $lastcat[$cat] = $now; $puestocat[$cat] = $countcat[$cat]; } $table[$idx]['Pcat'] = $puestocat[$cat]; // la calificacion depende de categoria, grado y federacion $fed->evalPartialCalification($this->getDatosPrueba(), $this->getDatosJornada(), $this->getDatosManga(), $table[$idx], $puestocat); } // componemos datos del array a retornar $res['rows'] = $table; $res['manga'] = $this->getDatosManga(); $res['trs'] = $tdata; $this->myLogger->leave(); return $res; }
/** * Obtiene la lista ordenada de perros de esta jornada asociadas a la sesion, y tandas especificadas * @param {integer} $s session id. * 0: ANY sesion * 1: ANY BUT User defined sessions * -1: User defined sessions * n: Session number "n" * -n: Session number "n" PLUS User defined sessions * @param {number} $t Tanda ID. * $t=0; mira todos los perros de todas las tandas de la sesion indicada * $t>0; mira SOLO los perros de la tanda * $t<0; mira todos los perros A PARTIR DE la tanda (-$t) * @param {number} $pendientes Pendientes $p==0 -> muestra todos los perros; else muestra los $p primeros pendientes de salir */ private function getListaPerros($s = 0, $t = 0, $pendientes = 0) { $count = $pendientes; // contador de perros pendientes de listar $manga = 0; // variable para controlar manga "activa" $perrosmanga = null; // {array} lista de perros ordenada segun ordensalida de la manga $do_iterate = false; // indica si debe analizar los perros de la tanda $rows = array(); // donde iremos guardando los resultados $result = array(); // resultado a devolver en formato json // obtenemos la lista de tandas $lista_tandas = $this->getTandas($s); $club = new Clubes("Tandas::getListaPerros", $this->prueba->RSCE); // iteramos la lista de tandas foreach ($lista_tandas['rows'] as $tanda) { $this->myLogger->info("Analizando tanda \n" . json_encode($tanda)); // Comprobamos si debemos analizar la tanda if ($t > 0) { $do_iterate = $tanda['ID'] == abs($t) ? true : false; } // iterar solo la tanda if ($t < 0) { if ($tanda['ID'] == abs($t)) { $do_iterate = true; } } // iterar a partir de la tanda if ($t == 0) { $do_iterate = true; } // iterar TODAS las tandas if (!$do_iterate) { continue; } // this tanda is not the one we are looking for if ($tanda['Manga'] == 0) { continue; } // user defined tandas, has no manga associated // comprobamos ahora si hay cambio de manga if ($manga != $tanda['Manga']) { // cambio de manga $manga = $tanda['Manga']; // en cada manga cogemos los perros ordenados segun el orden de salida $os = new OrdenSalida("Tandas::getListaPerros()", $manga); $perrosmanga = $os->getData(false); // false: do not include extra team information rows } // OK ya tenemos la lista ordenada de los perros de cada manga // Ahora vamos a sacar la lista por cada tanda foreach ($perrosmanga['rows'] as &$perro) { // si el perro no pertenece a la tanda skip (comprobar categoria) if (strpos($tanda['Categoria'], $perro['Categoria']) === false) { continue; } $perro['Tanda'] = $tanda['Nombre']; $perro['ID'] = $tanda['ID']; // replace resultadoID por tandaID TODO: revise why if ($pendientes == 0) { // include all $perro['LogoClub'] = $club->getLogoName('NombreClub', $perro['NombreClub']); array_push($rows, $perro); continue; } if ($perro['Pendiente'] == 0) { continue; } // not pendiente: skip if ($count > 0) { // not yet at count: insert $count--; $perro['LogoClub'] = $club->getLogoName('NombreClub', $perro['NombreClub']); array_push($rows, $perro); continue; } // arriving here means that every requested dogs are filled $this->myLogger->debug("Tandas::getListaPerros() Already have {$pendientes} dogs"); // so return $result['rows'] = $rows; $result['total'] = count($rows); $this->myLogger->leave(); return $result; } // no more dogs in this tanda. go to next } $result['rows'] = $rows; $result['total'] = count($rows); $this->myLogger->leave(); return $result; }