'; require $baseDir . '/../scripts/kampfrichter/check-user-freigaben.php'; $disciplines = db_select($mysqli, $tableGeraete, '*', '', [], 'start_index ASC'); $maxsubabt = count($disciplines); $current_year = date('Y'); // or you can set this dynamically as you want $monat = date('n'); if ($monat > 6) { $current_year = $current_year + 1; } $sortprio = ['ep', 'p1', 'p1 kader', 'p2', 'p2 kader']; $programmes = db_select($mysqli, $tableProgramme, 'programm, `id`', 'aktiv = ?', ['1']); $indexedProgrammes = array_column($programmes, 'id', 'programm'); $focus_view_admin = $_SESSION['abtViewAdmin'] ?? false; $aktabtdb = db_get_var($mysqli, "SELECT value FROM $tableVar WHERE name = ?", ['wk_panel_current_abt']); $aktabt = intval($aktabtdb); $maxvalue = db_get_var($mysqli, "SELECT name FROM $tableAbt ORDER BY name DESC LIMIT 1"); $res = $mysqli->query("SELECT * FROM $tableNotenBezeichnungen"); $notenConfig = $res->fetch_all(MYSQLI_ASSOC); $indexedNotenNames = array_column($notenConfig, 'name', 'id'); // var_dump($notenConfig); //$dbprogramme = db_select($mysqli, $tableTurnerinnen, '*', 'abteilung = ? AND (bezahlt = ? OR bezahlt = ?)', [$aktabt, '2', '5'], 'id ASC'); $stmt = $mysqli->prepare(" SELECT t.*, agg.abteilung, agg.geraete_index, agg.start_index FROM $tableTurnerinnen t LEFT JOIN ( SELECT ta.turnerin_id, GROUP_CONCAT(DISTINCT a.name SEPARATOR ', ') AS abteilung, GROUP_CONCAT(DISTINCT g.start_index SEPARATOR ', ') AS geraete_index, ta.turnerin_index AS start_index FROM $tableTurnerinnenAbt ta INNER JOIN $tableAbt a ON a.id = ta.abteilung_id LEFT JOIN $tableGeraete g ON g.id = ta.geraet_id GROUP BY ta.turnerin_id ) agg ON agg.turnerin_id = t.id WHERE (t.bezahlt = ? OR t.bezahltoverride = ?) AND agg.abteilung = ? ORDER BY t.id DESC "); $bezahlt = 2; $bezahltoverride = 5; $stmt->bind_param('sii', $bezahlt, $bezahltoverride, $aktabt); $stmt->execute(); $result = $stmt->get_result(); $dbprogramme = $result->fetch_all(MYSQLI_ASSOC); require $baseDir . '/../scripts/kampfrichter/post-handler.php'; $allprogrammeabt = []; $allprogrammeabtstr = ''; $allprogrammeabtstrcleared = ''; if ($dbprogramme){ foreach ($dbprogramme as $ind => $singledbprogramm){ $sinleprogramm = $singledbprogramm['programm']; if (!(in_array($sinleprogramm, $allprogrammeabt))){ $allprogrammeabt[] = $sinleprogramm; $allprogrammeabtstr .= $sinleprogramm. ', '; } } $pos = strrpos($allprogrammeabtstr, ' '); if ($pos !== false) { $allprogrammeabtstrcleared = substr_replace($allprogrammeabtstr, '', $pos, 1); } if (mb_strlen($allprogrammeabtstrcleared) > 1) { $allprogrammeabtstrcleared = mb_substr($allprogrammeabtstrcleared, 0, mb_strlen($allprogrammeabtstrcleared) - 1); } } $displayLogo = $_SESSION['logoDisplay'] ?? true; if ($displayLogo !== false){ require $baseDir . '/intern/scripts/wkvs/wkvs.html'; $_SESSION['logoDisplay'] = false; } echo '
'; ?>

Aktuelle Abt.

/

Aktuelle Gruppe

'; ?>

/

$discipline) { if (isset($discipline['name']) && $discipline['name'] === $selecteduserNormalized) { $indexuser = $index; break; } } // Find mathematical 0-based array index of starting apparatus for the group $startGeraetArrayIndex = ($indexuser - $aktsubabt + 1) % $maxsubabt; if ($startGeraetArrayIndex < 0) { $startGeraetArrayIndex += $maxsubabt; } // Look up corresponding actual start_index from database $startgeindex = $disciplines[$startGeraetArrayIndex]['start_index']; $option_name1 = $aktabt . 'namekr' . $selecteduser . '1'; $option_name2 = $aktabt . 'namekr' . $selecteduser . '2'; $selectedKampfrichterDB = db_select($mysqli, $tableKrProtokoll, ['name', 'aufgabe'], 'geraet = ? AND abteilung = ?', [strtolower($selecteduser), $aktabt], 'aufgabe ASC'); $selectedKampfrichter = []; // Corrected version for ($i = 1; $i <= $anzkampfrichter; $i++) { $found = false; foreach ($selectedKampfrichterDB as $kr) { if ($kr['aufgabe'] == $i) { $selectedKampfrichter[$i] = $kr['name']; $found = true; break; // stop searching once found } } if (!$found) { $selectedKampfrichter[$i] = 'nan'; } } $kampfrichter = db_select($mysqli, $tableInternUsers, 'id, name_person, freigabe', '', [], 'name_person ASC' ); $filteredKampfrichter = []; foreach ($kampfrichter as $kr) { $freigaben = json_decode($kr['freigabe'], true) ?? []; $freigabenTypes = $freigaben['types'] ?? []; $freigabenKampfrichter = $freigaben['freigabenKampfrichter'] ?? []; $isAdmin = in_array('admin', $freigabenKampfrichter); if (in_array('kampfrichter', $freigabenTypes) && !$isAdmin) { $filteredKampfrichter[] = $kr; } } if (count($filteredKampfrichter) > 0) { //if (in_array('admin', $arrayfreigaben)) { for ($i = 1; $i <= $anzkampfrichter; $i++) { $label = ($i === 1) ? 'Name Kampfrichterin E'.$i.' Note + D-Note: ' : 'Name Kampfrichterin E'.$i.' Note'; echo ' '; } //} } } if ($selecteduser === 'admin'){ $valuetogglemodeadmin = ($focus_view_admin == true) ? 'nach Programmen sortieren (Admin)' : 'nach Abteilungen sortieren (Admin)'; $styletoggleadmin = ($focus_view_admin == true) ? 'background-color: #003;' : 'background-color: #030;'; ?>
Aktuelle Abteilung '.$aktabt.' von '.$maxvalue.' ('.htmlspecialchars(strtoupper($allprogrammeabtstrcleared)).')

CoP 2025-2028STV 2025-2028'; } ?>

Kampfrichterpanel

0'; $params = [$bezahlt, $bezahltoverride]; $orderBy = 't.rang ASC'; } elseif ($selecteduser !== 'admin'){ $whereClause = '(t.bezahlt = ? OR t.bezahltoverride = ?) AND agg.abteilung = ? AND agg.startgeraet = ?'; $params = [$bezahlt, $bezahltoverride, $aktabt, $startgeindex]; $orderBy = 'agg.startIndex ASC'; } else { $whereClause = 't.bezahlt = ? OR t.bezahltoverride = ?'; $params = [$bezahlt, $bezahltoverride]; $orderBy = 't.rang ASC'; } $stmt = $mysqli->prepare(" SELECT t.*, agg.abteilung, agg.startgeraet, agg.startIndex, agg.abtId, agg.geraetId FROM $tableTurnerinnen t LEFT JOIN ( SELECT ta.turnerin_id, GROUP_CONCAT(DISTINCT a.name SEPARATOR ', ') AS abteilung, GROUP_CONCAT(DISTINCT g.start_index SEPARATOR ', ') AS startgeraet, ta.turnerin_index AS startIndex, ta.abteilung_id AS abtId, ta.geraet_id AS geraetId FROM $tableTurnerinnenAbt ta INNER JOIN $tableAbt a ON a.id = ta.abteilung_id LEFT JOIN $tableGeraete g ON g.id = ta.geraet_id GROUP BY ta.turnerin_id ) agg ON agg.turnerin_id = t.id WHERE $whereClause ORDER BY $orderBy "); $bezahlt = 2; $bezahltoverride = 5; if (!empty($params)) { $types = str_repeat("s", count($params)); // simple: treat everything as string $stmt->bind_param($types, ...$params); } $stmt->execute(); $result = $stmt->get_result(); $entries = $result->fetch_all(MYSQLI_ASSOC); // Define sort priority $sortprio = ['ep', 'p1', 'p1 kader', 'p2', 'p2 kader']; // Group entries by programm $grouped = []; if (($selecteduser !== 'admin') || ($selecteduser === 'admin' && $focus_view_admin == true)){ foreach ($entries as $entry) { $key = strtolower($entry['abteilung']); $grouped[$key][] = $entry; } ksort($grouped, SORT_STRING | SORT_FLAG_CASE); } else { foreach ($entries as $entry) { $key = strtolower($entry['programm']); $grouped[$key][] = $entry; } // Sort the grouped keys by defined priority uksort($grouped, function ($a, $b) use ($sortprio) { $a_index = array_search($a, $sortprio); $b_index = array_search($b, $sortprio); $a_index = $a_index === false ? PHP_INT_MAX : $a_index; $b_index = $b_index === false ? PHP_INT_MAX : $b_index; return $a_index <=> $b_index; }); } $disabledDNote = ''; $disabledNA = ''; if ($selecteduser !== 'admin') { $disabledDNote = ($selectedKampfrichter[1] !== $username && !in_array('admin', $arrayfreigaben)) ? 'disabled' : ''; $disabledNA = (!in_array($username, $selectedKampfrichter) && !in_array('admin', $arrayfreigaben)) ? 'disabled' : ''; } $itemsToLoop = []; if ($selecteduser === 'admin') { foreach ($disciplines as $sd) { $itemsToLoop[] = ['name' => $sd['name'], 'id' => $sd['id']]; } } else { $arrayNameMap = array_change_key_case(array_column($disciplines, 'id', 'name'), CASE_LOWER); $itemsToLoop[] = ['name' => $selecteduser, 'id' => $arrayNameMap[$selecteduser] ?? null]; } $indexedDisciplines = array_column($disciplines, 'name', 'id'); ?>
Eingabetool noch nicht freigeschalten'; } echo '

Alle Turnerinnen:

'; $total_count = 0; if (!empty($grouped)) : // Extract all 'id' values into a flat array $ids = array_column($entries, 'id'); if (!empty($ids)) { // Create placeholders: ?,?,? $placeholders = implode(',', array_fill(0, count($ids), '?')); $sql = "SELECT `person_id`, `note_bezeichnung_id`, `geraet_id`, `run_number`, `value` FROM $tableNoten WHERE `jahr` = ? AND `person_id` IN ($placeholders)"; $stmt = $mysqli->prepare($sql); // In PHP 8.1+, you can simply pass an array to execute() // We merge the year with the IDs into one flat array $params = array_merge([$current_year], $ids); $stmt->execute($params); $noten = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); } $notenIndexed = []; foreach ($noten as $sn) { $notenIndexed[$sn['person_id']][$sn['geraet_id']][$sn['note_bezeichnung_id']][$sn['run_number']] = $sn['value']; } $stmt->close(); // Extended Disciplines, contains the 0 disc $disciplinesExtended = array_merge( [["id" => 0, "name" => "None"]], $disciplines ); foreach ($grouped as $abteilung => $entries_group) : // ... (PDF path and H3 tag) // Nur sortieren, wenn der Benutzer nicht 'Admin' ist if ($selecteduser !== 'admin') { $entries_with_calculated_index = []; // Optional: Vorab-Caching der MAX-Indices, um DB-Abfragen im Loop zu vermeiden // (Nur aktivieren, wenn $entries_group sehr groß ist und Performance-Probleme auftreten) $maxStartIndexCache = []; foreach ($entries_group as $row) { $rohstartindex = intval($row['startIndex']); $geraetId = intval($row['geraetId']); $abtId = intval($row['abtId']); // Hole maxStartIndex (mit Caching-Logik optional) if (!isset($maxStartIndexCache["$abtId-$geraetId"])) { $maxStartIndexCache["$abtId-$geraetId"] = db_get_var($mysqli, "SELECT COUNT(*) FROM `$tableTurnerinnenAbt` WHERE abteilung_id = ? AND geraet_id = ?", [$abtId, $geraetId]); } $maxstartindex = $maxStartIndexCache["$abtId-$geraetId"]; // Sicherheit: Vermeiden Sie Division durch Null oder Modulo durch 0 if ($maxstartindex < 1) { $maxstartindex = 1; } // Sicherstellen, dass $indexuser definiert ist (Falls nicht, auf 0 setzen oder Fehler werfen) if (!isset($indexuser)) { $indexuser = 0; // Fallback, sollte aber eigentlich definiert sein } // The order shift depends on the number of rotations the group has made $rotation_shift = $aktsubabt - 1; // Robuste Berechnung mit Modulo // Ziel: (rohstartindex - rotation_shift - 1) % maxstartindex + 1 // -1 wird subtrahiert, weil Modulo oft 0-basiert ist, wir aber 1-basiert arbeiten $calculedstartindex = (($rohstartindex - $rotation_shift - 1) % $maxstartindex) + 1; // Sicherstellen, dass das Ergebnis positiv ist (PHP Modulo kann negative Ergebnisse liefern) // Wenn das Ergebnis negativ ist, addieren wir maxstartindex if ($calculedstartindex <= 0) { $calculedstartindex += $maxstartindex; } // Kopie der Zeile erstellen, um Originaldaten nicht zu verändern $row['calculedstartindex'] = $calculedstartindex; $entries_with_calculated_index[] = $row; } // Sortieren nach dem berechneten Startindex usort($entries_with_calculated_index, fn($a, $b) => $a['calculedstartindex'] <=> $b['calculedstartindex']); $entries_to_display = $entries_with_calculated_index; } else { $entries_to_display = $entries_group; } // Table Header creator with run columns $arrayIndexedNoten = []; $arrayIndexedNotenHeader = []; $uidN = 0; foreach ($entries_group as $row) : foreach ($disciplinesExtended as $discipline) : // Check if the current user/admin is allowed to see this specific discipline if ($discipline['id'] === 0 || $selecteduser === strtolower($discipline['name']) || $selecteduser === 'admin') : // 2. Now iterate through the scoring configurations for this discipline foreach ($notenConfig as $snC) { $showAdmin = isAdmin() && intval($snC['zeige_in_tabelle_admin']) === 1; $showPublic = !isAdmin() && intval($snC['zeige_in_tabelle']) === 1; if (!($showAdmin || $showPublic)) { continue; } if (intval($snC['pro_geraet']) === 1 && intval($discipline['id']) === 0) { continue; } if (intval($snC['pro_geraet']) !== 1) { $allowedGeraete = !empty($snC['geraete_json']) ? json_decode($snC['geraete_json'], true) : []; if (!in_array($discipline['id'], $allowedGeraete)) { continue; } } $mobile = (intval($snC['zeige_in_tabelle_mobile']) === 1) ? "" : "notMobile"; // Logic to fetch and format the value $defaultValue = $snC['default_value'] ?? 0; $runsJSON = !empty($snC['anzahl_laeufe_json']) ? json_decode($snC['anzahl_laeufe_json'], true) : []; $runs = $runsJSON[$discipline['id']][$indexedProgrammes[$row['programm'] ?? ''] ?? ''] ?? $runsJSON["default"] ?? 1; for ($r = 1; $r <= $runs; $r++) : $note = $notenIndexed[$row['id']][$discipline['id']][$snC['id']][$r] ?? $defaultValue; $normalizedNote = number_format($note, $snC['nullstellen'] ?? 2); $arrayIndexedNoten[intval($row['id'])][intval($discipline['id'])][intval($snC['id'])][intval($r)] = ["value" => $normalizedNote, "mobile" => $mobile]; $arrayIndexedNotenHeader[intval($discipline['id'])][intval($snC['id'])][intval($r)] = ["mobile" => $mobile]; $uidN++; endfor; } endif; endforeach; endforeach; $localPath = $_SERVER['DOCUMENT_ROOT'] . "/wp-content/ergebnisse/KTBB_Ergebnisse_" . $abteilung . "_" . $current_year . ".pdf"; echo '
'; if ($selecteduser === 'admin') echo '

'. strtoupper($abteilung); if ($selecteduser === 'admin' && file_exists($localPath)) { ?> - Rangliste Online

je Programm'; echo ''; } if (!isAdmin() || $focus_view_admin == true){ echo ''; }?> Jg.'; } ?> $aNtypes) : foreach ($aNtypes as $nType => $aRuns) : $displayRunType = count($aRuns) > 1; foreach ($aRuns as $run => $cArray) : $displayRunString = $displayRunType ? '' . $run . '' : ''; $displayDisciplinesString = isset($indexedDisciplines[$dis]) ? ' ' . $indexedDisciplines[$dis] : ''; ?> '; } ?> ' . (new DateTime($row['geburtsdatum']))->format("Y") . ''; } ?> '; $music = $row['bodenmusik']; if ($music ==! '0'){ echo' '; } else { echo $svgnichtbezahlt; } echo ''; } $disabledNotenFieldsEditAdmin = ($selecteduser !== 'admin' || $selecteduser === 'admin' && !$is_editing_this_row) ? 'readonly' : ''; $notMobileNotAdmin = ($selecteduser !== 'admin') ? 'notMobile' : ''; foreach ($arrayIndexedNotenHeader as $dis => $aNtypes) : foreach ($aNtypes as $nType => $aRuns) : foreach ($aRuns as $run => $cArray) : if (isset($arrayIndexedNoten[intval($row['id'])][intval($dis)][intval($nType)][intval($run)])) : ?> '; }*/ ?>
'.$textheadingrang.'RFName Verein Programm Musik Boden "> Edit
, changebleValue" data-field-type-id="" data-geraet-id="" data-person-id="" data-run=""> "> ---
1) { echo '

' . $count . ' Turnerinnen

'; } else { echo '

' . $count . ' Turnerin

'; }} if ($selecteduser === 'admin') { echo '
'; if ($focus_view_admin == false) { echo ''; echo ''; echo ''; $disabled = !file_exists($localPath) ? 'laden' : 'updaten'; echo ''; echo '
'; echo ''; ?> '; } else { echo ''; } echo '
'; } echo '
'; endforeach; $mehrzahl = $total_count > 1 ? 'Turnerinnen':'Turnerin'; if ($selecteduser === 'admin'){ echo '

Gesamt: '.$total_count.' '.$mehrzahl.'

'; } ?>

Keine Kampfrichterinnen ausgewählt

Noch keine Datensätze vorhanden.

Live Synchronsation:

'; ?> '; } ?> displayMsg(1, "'.$form_message.'");'; } ?>