= "' . date('Y-m-d', $from) . '") AND (`date` <= "' . date('Y-m-d', $to) . '") ORDER BY `date`'); } function get_regatta_years($mysqli) { $query = 'SELECT DISTINCT(YEAR(`date`)) as year FROM ' . BOATCLASS . DB_TABLE_SUFFIX_REGATTAS . ' ORDER BY `date`;'; $response = mysqli_query($mysqli, $query); if ($response !== false) { $result = array(); if ($response->num_rows > 0) { while ($row = $response->fetch_assoc()) { $result[] = $row['year']; } } return $result; } else { logE("functions", "get_data\nInvalid request\n" . $query . "\n" . mysqli_error($mysqli)); return false; } } function get_result_calculated($mysqli, $regatta_id) { $regatta = get_regatta($mysqli, $regatta_id); if ($regatta === false) { return false; } $results = get_result($mysqli, $regatta_id); if ($results !== false) { // *** Replace , with . foreach ($results as $key => $value) { for ($i = 1; $i <= $regatta['races']; $i ++) { $results[$key]['race' . $i] = str_replace(',', '.', $results[$key]['race' . $i]); } } // *** Calculation *** $gemeldet = count($results); $sortarray = array(); foreach ($results as $key => $value) { $results[$key]['finished'] = false; $results[$key]['values'] = array(); $results[$key]['values_all'] = array(); $results[$key]['texts'] = array(); $copy = array(); for ($i = 1; $i <= $regatta['races']; $i ++) { if (is_numeric($value['race' . $i])) { $results[$key]['values'][$i] = $value['race' . $i]; $results[$key]['texts'][$i] = $value['race' . $i]; $copy[$i] = $value['race' . $i]; $results[$key]['finished'] = true; } else { switch ($value['race' . $i]) { // Nicht gestartet case 'DNC': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Did not come case 'DNS': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Did not started // Startfehler case 'OCS': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // On course site // Muss v. Hand case 'ZFP': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Z-Flag penalty (20% nach 30.2) case 'UFD': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Uniform Flag Disqualified (disqu. nach 30.3) case 'BFD': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Black Flag Disqualified (disqu. nach 30.4) // Nicht durch Ziel gegangen case 'DNF': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Did not finish case 'RET': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; break; // Retired (Aufgegeben) case 'RAF': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Retired after finish // Disqualifizierun case 'DSQ': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; /*$results[$key]['finished'] = true;*/ break; // Disqualified case 'DNE': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = -1; /*$results[$key]['finished'] = true;*/ break; // Disqualified, not excludable (disqu. kann nach 90.3(b) nicht gestrichen werden) case 'DGM': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = -2; /*$results[$key]['finished'] = true;*/ break; // Disqualification Gross Missconduct (kann nach 69.1(b)(2) nicht gestr. werden, grobes Fehlverhalten) // Wiedergutmachung // Muss v. Hand case 'RDG': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Redress given (Wiedergutmachung gewährt) // Strafen // Muss v. Hand case 'SCP': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Wertungsstrafe nach 44.3(a) (20%) // Muss v. Hand case 'DPI': $results[$key]['values'][$i] = $gemeldet + 1; $copy[$i] = $gemeldet + 1; $results[$key]['finished'] = true; break; // Punktstrafe nach Ermessen der Jury // Unbekannt default: $results[$key]['values'][$i] = 0; $copy[$i] = 0; break; } if ($results[$key]['values'][$i] != 0) { $results[$key]['texts'][$i] = $value['race' . $i] . ' (' . $results[$key]['values'][$i] . ')'; } else { $results[$key]['texts'][$i] = $value['race' . $i] . ' (Unknown - 0)'; } } } $results[$key]['values_all'] = $results[$key]['values']; for ($s = 0; $s < $regatta['streicher']; $s ++) { $max = max($copy); for ($i = 1; $i <= $regatta['races']; $i ++) { if ($copy[$i] == $max) { $copy[$i] = 0; break; } } } $brutto = $netto = 0; for ($i = 1; $i <= $regatta['races']; $i ++) { $brutto += $results[$key]['values_all'][$i]; if ($copy[$i] == -1) { $results[$key]['values'][$i] = $gemeldet + 1; } elseif ($copy[$i] == -2) { $results[$key]['values'][$i] = $gemeldet + 1; } else { $results[$key]['values'][$i] = $copy[$i]; } if ($results[$key]['values'][$i] == 0) { $results[$key]['texts'][$i] = '[' . $results[$key]['texts'][$i] . ']'; } $netto += $results[$key]['values'][$i]; } $results[$key]['brutto'] = $brutto; $results[$key]['netto'] = $netto; if ($results[$key]['finished']) { $sortarray[$key] = 0; } else { $sortarray[$key] = 1; } $sortarray[$key] /*.*/= sprintf("%08.2f", $netto); $temp = $results[$key]['values']; sort($temp); $i = 0; foreach ($temp as $val) { if ($i < $regatta['races']) { $sortarray[$key] .= sprintf("%07.2f", $val); } $i ++; } for ($i = $regatta['races']; $i > 0; $i --) { $sortarray[$key] .= sprintf("%07.2f", $results[$key]['values_all'][$i]); } $results[$key]['sortvalue'] = $sortarray[$key]; } array_multisort($sortarray, $results); $i = 1; foreach ($results as $key => $value) { if (($i > 1) and ($sortarray[$key] == $sortarray[$lastkey])) { $results[$key]['place'] = $results[$lastkey]['place']; } else { $results[$key]['place'] = $i; } $i ++; $lastkey = $key; } unset ($sortarray); return $results; } else { return false; } } function update_result_cache($mysqli, $regatta_id) { $regatta = get_regatta($mysqli, $regatta_id); if ($regatta === false) return; $results = get_result_calculated($mysqli, $regatta['id']); if ($results === false) return; // count finished boats $fb = 0; foreach ($results as $result) { if ($result['finished']) { $fb ++; } } db_update_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_REGATTAS, ['finishedBoats' => $fb], '`id`="' . $regatta['id'] . '"', 1); foreach ($results as $result) { if ($fb == 0) { $rlp = 0; } else { $rlp = 100 * $regatta['rlf'] * (($fb + 1 - $result['place']) / $fb); } db_update_data($mysqli, BOATCLASS . DB_TABLE_SUFFIX_RESULTS, ['place' => $result['place'], 'rlp' => $rlp], '`id`="' . $result['id'] . '"', 1); } } function get_ranking($mysqli, $from, $to, $jugend = false, $jugstrict = false) { global $rankNoResults, $_CLASSES; $rankNoResults = array(); $sailors = get_sailor($mysqli); $regattas = get_regattas_range($mysqli, $from, $to); if (($sailors !== false) and ($regattas !== false)) { foreach ($sailors as $key => $sailor) { $sailors[$key]['regattas'] = array(); $sailors[$key]['tmp_rlp'] = array(); } foreach ($regattas as $regatta) { $date = strtotime($regatta['date']); // regatta has to be min. 2 days to be ranking-regatta if ($regatta['length'] < 2) { continue; } $results = get_result($mysqli, $regatta['id']); if ($results === false) { continue; } if (count($results) <= 0) { if (strtotime('+' . ($regatta['length']-1) . ' days', $date) <= time()) { if (!$regatta['canceled']) { $rankNoResults[] = $regatta; } } continue; } // in one race there must be at least 10 boats started $ok = false; for ($i = 1; $i <= $regatta['races']; $i ++) { $temp = 0; foreach ($results as $result) { if (($result['race' . $i] != 'DNC') and ($result['race' . $i] != 'DNS')) { $temp ++; } } if ($temp >= 10) { $ok = true; break; } } if (!$ok) { continue; } $fb = $regatta['finishedBoats']; // add regatta to each sailor foreach ($results as $result) { if ($result['rlp'] == 0) { continue; } // check if crew is youth //if ($jugend) { // $crew = explode(',', $result['crew']); // $okay = true; // foreach ($crew as $sailor) { // if (($sailor == '') or !isset($sailors[$sailor])) continue; // $sailor = $sailors[$sailor]; // if ((($sailor['year'] !== null) and ($sailor['year'] < (date('Y', $date) - $_CLASSES[BOATCLASS]['youth-age']))) or // (($sailor['year'] === null) and ($jugstrict))) { // $okay = false; // break; // } // } // if (!$okay) continue; //} // calc m if ($regatta['m'] > 0) { $m = $regatta['m']; } elseif ($regatta['races'] <= 4) { $m = $regatta['races']; } else { if (($regatta['length'] > 2) and ($regatta['races'] >= 6)) { $m = 5; } else { $m = 4; } } $rlp = $result['rlp']; $sailors[$result['steuermann']]['regattas'][$regatta['id']] = array( 'regatta' => $regatta['id'], 'boat' => $result['boat'], 'crew' => $result['crew'], 'place' => $result['place'], 'fb' => $fb, 'rlp' => $rlp, 'used' => 0, 'm' => $m ); for ($i = 0; $i < $m; $i ++) { array_push($sailors[$result['steuermann']]['tmp_rlp'], array($regatta['id'], $rlp)); } } } foreach ($sailors as $key => $sailor) { if ($sailor['german'] == 0) { unset($sailors[$key]); } elseif ($jugend) { if ((($sailor['year'] !== null) and ($sailor['year'] < (date('Y', $to) - $_CLASSES[BOATCLASS]['youth-age']))) or (($sailor['year'] === null) and ($jugstrict))) { unset($sailors[$key]); } } } $sortarray = array(); foreach ($sailors as $key => $sailor) { // sort rlps desc $sort = array(); foreach ($sailor['tmp_rlp'] as $key2 => $value) { $sort[$key2] = $value[1]; } array_multisort($sort, SORT_DESC, $sailors[$key]['tmp_rlp']); // calc mean. rlp $sum = 0; $cnt = 0; foreach ($sailors[$key]['tmp_rlp'] as $value) { $sum += $value[1]; $sailors[$key]['regattas'][$value[0]]['used'] ++; $cnt ++; if ($cnt >= 9) { break; } } unset($sailors[$key]['tmp_rlp']); if ($cnt > 0) { $rlp = $sum / $cnt; $sailors[$key]['rlp'] = $rlp; $sailors[$key]['m'] = $cnt; } else { unset($sailors[$key]); continue; } if ($rlp == 0) { $sortarray[$key] = $cnt; } else { $sortarray[$key] = $cnt * 1000 + $rlp; } } array_multisort($sortarray, SORT_DESC, $sailors); unset($sortarray); $i = 1; foreach ($sailors as $key => $sailor) { $sailors[$key]['rank'] = $i; $i ++; } return $sailors; } else { return false; } } function get_trim_boat($mysqli, $id = false) { return get_db_entry($mysqli, DB_TABLE_TRIM_BOATS, $id); } function get_trim_boat_users($mysqli, $id) { $result = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`boat` = "' . mysqli_real_escape_string($mysqli, $id) . '"'); if ($result === false) return false; else return $result; } function get_trim_user_boats($mysqli, $id) { $boats = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`user` = "' . mysqli_real_escape_string($mysqli, $id) . '"'); if ($boats === false) { return false; } else { $result = []; foreach ($boats as $value) { $result[$value['boat']] = get_trim_boat($mysqli, $value['boat']); } return $result; } } function trim_is_boat_user($mysqli, $user, $boat) { $res = db_get_data($mysqli, DB_TABLE_TRIM_USERS, '*', '`user` = "' . mysqli_real_escape_string($mysqli, $user) . '" AND `boat` = "' . mysqli_real_escape_string($mysqli, $boat) . '"'); return ($res !== false) and (count($res) == 1); } function get_trim_trim($mysqli, $id = false) { return get_db_entry($mysqli, DB_TABLE_TRIM_TRIMS, $id); } function get_trim_boat_trims($mysqli, $id) { $result = db_get_data($mysqli, DB_TABLE_TRIM_TRIMS, '*', '`boat` = "' . mysqli_real_escape_string($mysqli, $id) . '"'); if ($result === false) { return false; } else { return $result; } } ?>