From b57c7c148dfa9cd8d4193bc8d04e4337613bc3ef Mon Sep 17 00:00:00 2001 From: Marvin Flock Date: Sun, 13 Jul 2025 23:17:00 +0200 Subject: [PATCH 1/8] fix: abort when id is null --- src/structure/components/com_sportsmanager/sportsmanager.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index e5678b5..bdc9630 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -7057,6 +7057,9 @@ function spielerstatistik(): void $query = "select bestenliste_id from #__sportsmanager_bestenliste_veranstaltung where veranstaltung_id = " . $id; $db->setQuery($query); $id = $db->loadResult(); + if (!$id) { + abortWithError("Wrong id!"); + } } $details_anzeigen = currentUserHasAccessToDetails(); $filter_saison_id = $jInput->get('filter_saison_id', 0, 'INT'); From ca4ce6060e6bc20b29f215e0685c84f3ac9e73a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 14 Jul 2025 08:23:34 +0200 Subject: [PATCH 2/8] =?UTF-8?q?=C3=9Cberpr=C3=BCfung=20Format=20Spielernum?= =?UTF-8?q?mer=20bei=20Import=20(issue=20#59)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 34 ++++++++++++------- .../views/sportsmanager/view_admin.php | 24 ++++++++----- .../de-DE/de-DE.com_sportsmanager.ini | 3 +- .../en-GB/en-GB.com_sportsmanager.ini | 3 +- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 29e8f08..f39f453 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -2677,6 +2677,22 @@ function adminImportSpielerVorschau(): void $n++; } + //check Passnummer auf gueltiges Format + $query = "SELECT nachname, vorname, spielernr, spielernr_alt" + . "\n FROM #__sportsmanager_spieler_import" + . "\n WHERE (spielernr NOT REGEXP '^[0-9]{2}-[0-9]{4,6}$' AND spielernr <> '')" + . "\n OR (spielernr_alt NOT REGEXP '^[0-9]{2}-[0-9]{4,6}$' AND spielernr_alt <> '');"; + + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $spielerfehler = $db->loadObjectList(); + if (count($spielerfehler) > 0) { + HTML_sportsmanager_admin::adminImportSpielerFehler($spielerfehler, $fehler="Passnummer"); + return; + } + $spielernr_aendern = false; if (isset($spalten["spielernr_alt"])) { $query = "SELECT nachname, vorname, spielernr, spielernr_alt" @@ -2713,9 +2729,8 @@ function adminImportSpielerVorschau(): void $spielernr_aendern = false; } } - if ($spielernr_aendern) { - $query = "SELECT nachname, vorname" + $query = "SELECT nachname, vorname, bestand.spielernr" . "\n FROM" . "\n (SELECT nachname, vorname, spielernr, spielernr_alt" . "\n FROM #__sportsmanager_spieler_import" @@ -2727,15 +2742,14 @@ function adminImportSpielerVorschau(): void . "\n ON bestand.spielernr = import.spielernr" . "\n WHERE NOT EXISTS(SELECT * FROM #__sportsmanager_spieler_import WHERE spielernr_alt = bestand.spielernr AND spielernr != spielernr_alt AND NOT ISNULL(spielernr) AND NOT ISNULL(spielernr_alt) AND spielernr != '' AND spielernr_alt != '')" . "\n ORDER BY nachname, vorname"; - $db->setQuery($query); + $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } $konflikte = $db->loadObjectList(); if (count($konflikte) > 0) { - HTML_sportsmanager_admin::adminImportSpielerFehler($konflikte); - + HTML_sportsmanager_admin::adminImportSpielerFehler($konflikte, $fehler="konflikt"); return; } } @@ -2755,7 +2769,6 @@ function adminImportSpielerVorschau(): void die($db->stderr(true)); } $spieler_import = $db->loadObjectList(); - $import_verweigern = false; if ($beschraenkter_zugriff) { foreach ($spieler_import as $s) { @@ -2785,7 +2798,7 @@ function adminImportSpielerVorschau(): void . "\n FROM #__sportsmanager_spieler_import" . "\n LEFT JOIN #__sportsmanager_spieler ON #__sportsmanager_spieler_import.spielernr != '' AND " . ($spielernr_aendern ? "IF(NOT ISNULL(#__sportsmanager_spieler_import.spielernr_alt) AND #__sportsmanager_spieler_import.spielernr_alt != '', #__sportsmanager_spieler_import.spielernr_alt = #__sportsmanager_spieler.spielernr, #__sportsmanager_spieler_import.spielernr = #__sportsmanager_spieler.spielernr)" : "#__sportsmanager_spieler_import.spielernr = #__sportsmanager_spieler.spielernr") . "\n WHERE session_id = '" . $db->escape($session_id) . "'"; - $db->setQuery($query); + $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } @@ -2804,7 +2817,6 @@ function adminImportSpielerVorschau(): void die($db->stderr(true)); } } - HTML_sportsmanager_admin::adminImportSpielerVorschau($import_verweigern, $spieler_import, $veranstalter, $session_id, $jInput->get('persoenliche_daten', 0, 'INT'), $jInput->get('lizenznr_beibehalten', 0, 'INT'), $jInput->get('spalten', '', 'RAW')); } @@ -2880,7 +2892,7 @@ function adminImportSpieler(): void * sonst Spielernr. übernehmen */ if (isset($spalten["spielernr_alt"])) { - $query = "SELECT nachname, vorname" + $query = "SELECT nachname, vorname, bestand.spielernr" . "\n FROM" . "\n (SELECT nachname, vorname, spielernr, spielernr_alt" . "\n FROM #__sportsmanager_spieler_import" @@ -2897,10 +2909,8 @@ function adminImportSpieler(): void die($db->stderr(true)); } $konflikte = $db->loadObjectList(); - if (count($konflikte) > 0) { - HTML_sportsmanager_admin::adminImportSpielerFehler($konflikte); - + HTML_sportsmanager_admin::adminImportSpielerFehler($konflikte, $fehler="konflikt"); return; } diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php index eacb8df..8c7ecc2 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -2276,23 +2276,21 @@ class HTML_sportsmanager_admin -
+
+ +
@@ -2305,12 +2303,20 @@ class HTML_sportsmanager_admin
0) { - ?> - -
+ style="width: 100%"> + +
+ + diff --git a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini index 73cf52c..acb13c1 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -404,8 +404,9 @@ COM_SPORTSMANAGER_COUNTRY_CODE="Landeskennung" COM_SPORTSMANAGER_IMPORT="Importieren" COM_SPORTSMANAGER_IMPORT_MESSAGE="Im Import sind ausschließlich Spielerdaten zum Verein %s enthalten. Soll ausschließlich der Spielerbestand des einen Vereins aktualisiert werden, muss der zugehörige Verein unten ausgewählt werden. Beinhaltet der Import den gesamten Spielerbestand einer Organisation, muss die zugehörige Organisation gewählt werden." COM_SPORTSMANAGER_CHECK="Prüfen" -COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="Im Import sind Konflikte enthalten, die im Vorfeld manuell beseitigt werden müssen." +COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="Im Import sind Fehler oder Konflikte enthalten, die im Vorfeld manuell beseitigt werden müssen." COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Versuch, Spielernr. auf eine bereits für einen anderen Spieler vergebene Spielernr. zu ändern" +COM_SPORTSMANAGER_IMPORT_WRONG_FORMAT_PLAYERNUMBER="Eine oder mehrere Spielernummer enthalten ein ungültiges Format" COM_SPORTSMANAGER_NAME2="Name" COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="Der Import wird abgebrochen, da Konflikte bei den zu importierenden Spielerdaten bestehen. Bitte kontaktiere einen Moderator und sende dabei die Importdatei mit!" COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="Es bestehen keine Konflikte bei den zu importierenden Spielerdaten." diff --git a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini index a01636b..3bb575c 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -404,8 +404,9 @@ COM_SPORTSMANAGER_COUNTRY_CODE="Country code" COM_SPORTSMANAGER_IMPORT="Import" COM_SPORTSMANAGER_IMPORT_MESSAGE="In the import there are only player information about club %s present. Shall only the members of that one club be updated, the associated club has to be selected down here. If the import contains all members of the organisation then the organisation must be selected." COM_SPORTSMANAGER_CHECK="Check" -COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="There are conflicts in the import which have to be fixed manually first." +COM_SPORTSMANAGER_IMPORT_CONFLICTS_MESSAGE="There are faults or conflicts in the import which have to be fixed manually first." COM_SPORTSMANAGER_IMPORT_DUPLICATE_MESSAGE="Attempt to change player number into one that is already assigned to another player." +COM_SPORTSMANAGER_IMPORT_WRONG_FORMAT_PLAYERNUMBER="One or more player numbers contain an invalid format" COM_SPORTSMANAGER_NAME2="Name" COM_SPORTSMANAGER_DATA_IMPORT_ABORT_MESSAGE="The import has been aborted because there are conflicts in the containing player information. Please contact a moderator and attach the import!" COM_SPORTSMANAGER_DATA_IMPORT_NO_CONFLICTS="There are conflicts in the containing player information." From 84796918245d71f4a24b211e22c43c4716dbd16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 14 Jul 2025 17:01:21 +0200 Subject: [PATCH 3/8] =?UTF-8?q?Optimierung=20Abl=C3=B6schung=20tempor?= =?UTF-8?q?=C3=A4rer=20Import-Daten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 51 ++++++++----------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index f39f453..4cc96d3 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -20,8 +20,6 @@ require_once JPATH_SITE . '/components/com_sportsmanager/database/init.php'; function UhrzeitWandlerDE($Zeitstempel): mixed { - //Jürgen Meyer 07.03.2025 - $Temp = explode(' ', $Zeitstempel); $Datum = $Temp[0]; $Uhrzeit = $Temp[1]; @@ -36,7 +34,6 @@ function UhrzeitWandlerDE($Zeitstempel): mixed function validateDate($date, $format = 'Y-m-d H:i:s'): bool { - //Jürgen Meyer 07.03.2025 $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; } @@ -2242,14 +2239,9 @@ function adminImportSpielerDetailsForm(): void $rows = $db->loadObjectList(); foreach ($rows as $row) { - $query = "DELETE FROM #__sportsmanager_spieler_import" - . "\n WHERE session_id = '$row->session_id'"; - $db->setQuery($query); - if (!$db->execute()) { - die($db->stderr(true)); - } + adminDeleteSpielerImport($row->session_id); } - + if (empty($_FILES["daten"]["tmp_name"]) || !is_uploaded_file($_FILES["daten"]["tmp_name"])) { redirectSportsManagerURL('&task=admin_spieler', Text::_('COM_SPORTSMANAGER_NO_FILE_SPECIFIED')); } @@ -2507,12 +2499,7 @@ function adminImportSpielerDetailsForm(): void die($db->stderr(true)); } - $query = "DELETE FROM #__sportsmanager_spieler_import" - . "\n WHERE session_id = '" . $db->escape($session_id) . "'"; - $db->setQuery($query); - if (!$db->execute()) { - die($db->stderr(true)); - } + adminDeleteSpielerImport($session_id); HTML_sportsmanager_admin::adminImportSpielerBericht($lizenzen_aktualisiert, array(), 0, array(), array(), array(), false, redirectSessionIdEmpty() ? null : redirectSessionIdSetzen()); @@ -2629,8 +2616,19 @@ function adminImportSpielerDetailsForm(): void HTML_sportsmanager_admin::adminImportSpielerDetails($beschraenkter_zugriff, $ansprechpartner_importieren, $veranstalter, $veranstalter_import, $veranstalter_zugehoerigkeit, $session_id, implode(",", $spalten), $verein_import, $vereine, einstellungswert("spielerimport_persoenliche_daten_vorauswahl")); } +function adminDeleteSpielerImport($session_id){ + $db = getDatabase(); + $query = "DELETE FROM #__sportsmanager_spieler_import" + . "\n WHERE session_id = '" . $db->escape($session_id) . "'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } +} + function adminImportSpielerVorschau(): void { + $db = getDatabase(); global $_FILES; $jInput = Factory::getContainer()->get(SiteApplication::class)->input; @@ -2680,8 +2678,9 @@ function adminImportSpielerVorschau(): void //check Passnummer auf gueltiges Format $query = "SELECT nachname, vorname, spielernr, spielernr_alt" . "\n FROM #__sportsmanager_spieler_import" - . "\n WHERE (spielernr NOT REGEXP '^[0-9]{2}-[0-9]{4,6}$' AND spielernr <> '')" - . "\n OR (spielernr_alt NOT REGEXP '^[0-9]{2}-[0-9]{4,6}$' AND spielernr_alt <> '');"; + . "\n WHERE session_id = '" . $db->escape($session_id) . "'" + . "\n AND ((spielernr NOT REGEXP '^[0-9]{2}-[0-9]{4,6}$' AND spielernr <> '')" + . "\n OR (spielernr_alt NOT REGEXP '^[0-9]{2}-[0-9]{4,6}$' AND spielernr_alt <> ''));"; $db->setQuery($query); if (!$db->execute()) { @@ -2689,6 +2688,7 @@ function adminImportSpielerVorschau(): void } $spielerfehler = $db->loadObjectList(); if (count($spielerfehler) > 0) { + adminDeleteSpielerImport($session_id); HTML_sportsmanager_admin::adminImportSpielerFehler($spielerfehler, $fehler="Passnummer"); return; } @@ -2749,6 +2749,7 @@ function adminImportSpielerVorschau(): void $konflikte = $db->loadObjectList(); if (count($konflikte) > 0) { + adminDeleteSpielerImport($session_id); HTML_sportsmanager_admin::adminImportSpielerFehler($konflikte, $fehler="konflikt"); return; } @@ -2810,12 +2811,7 @@ function adminImportSpielerVorschau(): void } if ($import_verweigern) { - $query = "DELETE FROM #__sportsmanager_spieler_import" - . "\n WHERE session_id = '" . $db->escape($session_id) . "'"; - $db->setQuery($query); - if (!$db->execute()) { - die($db->stderr(true)); - } + adminDeleteSpielerImport($session_id); } HTML_sportsmanager_admin::adminImportSpielerVorschau($import_verweigern, $spieler_import, $veranstalter, $session_id, $jInput->get('persoenliche_daten', 0, 'INT'), $jInput->get('lizenznr_beibehalten', 0, 'INT'), $jInput->get('spalten', '', 'RAW')); } @@ -3352,12 +3348,7 @@ function adminImportSpieler(): void } } - $query = "DELETE FROM #__sportsmanager_spieler_import" - . "\n WHERE session_id = '" . $db->escape($session_id) . "'"; - $db->setQuery($query); - if (!$db->execute()) { - die($db->stderr(true)); - } + adminDeleteSpielerImport($session_id); sort($vereineManuell); sort($ausgetreteneVereineMitAktivenMitgliedern); From 2b6563dae0c294b159cce3dc3350ac16dee4ff44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Wed, 23 Jul 2025 09:40:05 +0200 Subject: [PATCH 4/8] =?UTF-8?q?M=C3=B6glichkeit=20Direkter=20Vergleich=20i?= =?UTF-8?q?n=20Teamsport=20(issue=20#68)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 6 +- .../com_sportsmanager/database/update.php | 59 +++++ .../com_sportsmanager/sportsmanager.php | 242 ++++++++++++++---- .../views/sportsmanager/view_admin.php | 36 +++ .../de-DE/de-DE.com_sportsmanager.ini | 1 + .../en-GB/en-GB.com_sportsmanager.ini | 1 + src/structure/script.php | 3 + 7 files changed, 302 insertions(+), 46 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 29e8f08..b422b2c 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -7005,6 +7005,7 @@ function adminEditVeranstaltung(): void $modus_id = $jInput->get('modus_id', 0, 'INT'); $verschieberegel_id = $jInput->get('verschieberegel_id', 0, 'INT'); $tabellenwertung = $jInput->get('tabellenwertung', 0, 'INT'); + $direktervergleich = $jInput->get('direktervergleich', 0, 'INT'); $unterteilung = $jInput->get('unterteilung', 0, 'INT'); $elo_wertung = $jInput->get('elo_wertung', 0, 'INT'); $logo_url = $db->escape(trim($jInput->get('logo_url', '', 'RAW'))); @@ -7024,8 +7025,8 @@ function adminEditVeranstaltung(): void $elo_aktualisieren = false; $spielerstatistik_aktualisieren = false; if ($id == 0) { - $query = "INSERT INTO #__sportsmanager_veranstaltung (veranstalter_id, saison_id, bezeichnung, erster_tag " . ($letzter_tag != null ? ", letzter_tag" : "") . ", modus_id, verschieberegel_id, tabellenwertung, unterteilung, elo_wertung, logo_url, ticker_logo_url, status, reihenfolge, kategorie) VALUES - ('$veranstalterId', '$saison_id', '$bezeichnung', '$erster_tag', " . ($letzter_tag != null ? "'$letzter_tag', " : "") . "'$modus_id', '$verschieberegel_id', '$tabellenwertung', '$unterteilung', '$elo_wertung', '$logo_url', '$ticker_logo_url', '$status', '$reihenfolge', '$kategorie');"; + $query = "INSERT INTO #__sportsmanager_veranstaltung (veranstalter_id, saison_id, bezeichnung, erster_tag " . ($letzter_tag != null ? ", letzter_tag" : "") . ", modus_id, verschieberegel_id, tabellenwertung, direktervergleich, unterteilung, elo_wertung, logo_url, ticker_logo_url, status, reihenfolge, kategorie) VALUES + ('$veranstalterId', '$saison_id', '$bezeichnung', '$erster_tag', " . ($letzter_tag != null ? "'$letzter_tag', " : "") . "'$modus_id', '$verschieberegel_id', '$tabellenwertung', '$direktervergleich', '$unterteilung', '$elo_wertung', '$logo_url', '$ticker_logo_url', '$status', '$reihenfolge', '$kategorie');"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); @@ -7052,6 +7053,7 @@ function adminEditVeranstaltung(): void . "\n modus_id = '$modus_id'," . "\n verschieberegel_id = '$verschieberegel_id'," . "\n tabellenwertung = '$tabellenwertung'," + . "\n direktervergleich = '$direktervergleich'," . "\n unterteilung = '$unterteilung'," . "\n elo_wertung = '$elo_wertung'," . "\n logo_url = '$logo_url'," diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index b39b2d4..7637a7d 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5266,6 +5266,65 @@ function updateDatabase(): void } } + if ($datenbank_version < 104) { + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from('INFORMATION_SCHEMA.COLUMNS') + ->where('TABLE_NAME = ' . $db->quote($db->replacePrefix('#__sportsmanager_veranstaltung'))) + ->where('COLUMN_NAME = ' . $db->quote('direktervergleich')); + $db->setQuery($query); + $exists = (bool)$db->loadResult(); + + if (!$exists) { + $query = "ALTER TABLE #__sportsmanager_veranstaltung ADD direktervergleich INT(4) NOT NULL DEFAULT '0' AFTER tabellenwertung;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from('INFORMATION_SCHEMA.COLUMNS') + ->where('TABLE_NAME = ' . $db->quote($db->replacePrefix('#__sportsmanager_team'))) + ->where('COLUMN_NAME = ' . $db->quote('setzliste_nr')); + $db->setQuery($query); + $exists = (bool)$db->loadResult(); + + if (!$exists) { + $query = "ALTER TABLE #__sportsmanager_team ADD setzliste_nr INT(4) NULL DEFAULT NULL AFTER veranstaltung_id;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + + $query = $db->getQuery(true) + ->select('COUNT(*)') + ->from('INFORMATION_SCHEMA.COLUMNS') + ->where('TABLE_NAME = ' . $db->quote($db->replacePrefix('#__sportsmanager_begegnung'))) + ->where('COLUMN_NAME = ' . $db->quote('spiel_nr')); + $db->setQuery($query); + $exists = (bool)$db->loadResult(); + + if (!$exists) { + $query = "ALTER TABLE #__sportsmanager_begegnung ADD spiel_nr INT(4) NULL DEFAULT NULL AFTER spieltag;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + + + $query = "UPDATE #__sportsmanager_einstellungen" + . "\n SET wert = '104'" + . "\n WHERE name = 'datenbank_version'"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + } + if ($termin_aktionen_email_setzen) { $query = "SELECT aktion_user_id, termin_aktion_id" . "\n FROM #__sportsmanager_termin_aktion"; diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index e5678b5..b77dcff 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -1608,6 +1608,20 @@ function tabelle($veranstaltung, $spieltag, $alleine_angezeigt, $praesentation = $modus = $rows[0]; if ($veranstaltung->tabellenwertung > 0) { + + // Alle Spieltage ermitteln + $query = "SELECT DISTINCT spieltag" + . "\n FROM #__sportsmanager_begegnung" + . "\n INNER JOIN #__sportsmanager_team ON heim_team_id = team_id" + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id" + . "\n ORDER BY spieltag"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $spieltage = $db->loadObjectList(); + $anzahl_spieltage_komplett = count($spieltage); + // Spieltage ermitteln, an denen schon eine Begegnung ausgetragen wurde $query = "SELECT DISTINCT spieltag" . "\n FROM #__sportsmanager_begegnung" @@ -1620,54 +1634,52 @@ function tabelle($veranstaltung, $spieltag, $alleine_angezeigt, $praesentation = die($db->stderr(true)); } $spieltage = $db->loadObjectList(); + $anzahl_spieltage_gespielt = count($spieltage); $aktueller_spieltag = count($spieltage) > 0 ? $spieltage[0]->spieltag : 0; if ($spieltag == 0 || $veranstaltung->tabellenwertung >= 21) $spieltag = $aktueller_spieltag; if ($spieltag == $aktueller_spieltag) { - $query = "SELECT *" - . "\n FROM #__sportsmanager_team" - . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id" - . "\n ORDER BY platz, teamname"; + $teams = getTabelleAktuellerSpieltag($veranstaltung); } else { - $query = "SELECT verein_id, teamname, zusatzpunkte," - . "\n werte.*," - . "\n werte.siege * " . ($veranstaltung->tabellenwertung <= 3 ? "2" : ($veranstaltung->tabellenwertung <= 6 ? "3" : "1")) . ($veranstaltung->tabellenwertung <= 6 ? " + werte.unentschieden" : "") . " + COALESCE(zusatzpunkte, 0) AS gesamtpunkte," - . "\n werte.siege * " . ($veranstaltung->tabellenwertung <= 3 ? "2" : ($veranstaltung->tabellenwertung <= 6 ? "3" : "1")) . ($veranstaltung->tabellenwertung <= 6 ? " + werte.unentschieden" : "") . " AS begegnungspunkte," - . "\n werte.punkte_gewonnen - werte.punkte_verloren AS punkte_differenz," - . "\n IF(werte.punkte_verloren = 0, -1, werte.punkte_gewonnen / werte.punkte_verloren) AS punkte_quotient," - . "\n werte.spielpunkte_gewonnen - werte.spielpunkte_verloren AS spielpunkte_differenz," - . "\n IF(werte.spielpunkte_verloren = 0, -1, werte.spielpunkte_gewonnen / werte.spielpunkte_verloren) AS spielpunkte_quotient" - . "\n FROM #__sportsmanager_team" - . "\n LEFT JOIN" - . "\n (SELECT t1.team_id," - . "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND ((tt1.heim_team_id = t1.team_id AND tt1.heim_spielpunkte > tt1.gast_spielpunkte) OR (tt1.gast_team_id = t1.team_id AND tt1.gast_spielpunkte > tt1.heim_spielpunkte)) AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)) AS siege," - . "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND (tt1.heim_team_id = t1.team_id OR tt1.gast_team_id = t1.team_id) AND tt1.heim_spielpunkte = tt1.gast_spielpunkte AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)) AS unentschieden," - . "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND ((tt1.heim_team_id = t1.team_id AND tt1.heim_spielpunkte < tt1.gast_spielpunkte) OR (tt1.gast_team_id = t1.team_id AND tt1.gast_spielpunkte < tt1.heim_spielpunkte)) AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)) AS niederlagen," - . "\n (COALESCE((SELECT SUM(heim_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + (COALESCE((SELECT SUM(gast_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS punkte_gewonnen," - . "\n (COALESCE((SELECT SUM(gast_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + (COALESCE((SELECT SUM(heim_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS punkte_verloren," - . "\n (COALESCE((SELECT SUM(heim_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + (COALESCE((SELECT SUM(gast_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS spielpunkte_gewonnen," - . "\n (COALESCE((SELECT SUM(gast_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + (COALESCE((SELECT SUM(heim_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS spielpunkte_verloren" - . "\n FROM #__sportsmanager_team AS t1 WHERE veranstaltung_id = $veranstaltung->veranstaltung_id)" - . "\n AS werte USING (team_id)" - . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id"; - if ($veranstaltung->tabellenwertung == 1 || $veranstaltung->tabellenwertung == 4 || $veranstaltung->tabellenwertung == 7) - $query .= "\n ORDER BY gesamtpunkte DESC, spielpunkte_differenz DESC, punkte_differenz DESC, teamname"; - else if ($veranstaltung->tabellenwertung == 2 || $veranstaltung->tabellenwertung == 5 || $veranstaltung->tabellenwertung == 8) - $query .= "\n ORDER BY gesamtpunkte DESC, spielpunkte_quotient DESC, punkte_quotient DESC, teamname"; - else if ($veranstaltung->tabellenwertung == 10) - $query .= "\n ORDER BY spielpunkte_differenz DESC, punkte_differenz DESC, teamname"; - else if ($veranstaltung->tabellenwertung == 11) - $query .= "\n ORDER BY spielpunkte_quotient DESC, punkte_quotient DESC, teamname"; - else - $query .= "\n ORDER BY gesamtpunkte DESC, teamname"; + $teams = getTabelleSpieltag($veranstaltung,$spieltag); } - $db->setQuery($query); - if (!$db->execute()) { - die($db->stderr(true)); - } - $teams = $db->loadObjectList(); + + if ($veranstaltung->direktervergleich AND $spieltag >= $anzahl_spieltage_komplett/2){ + $Gesamtpunkte = 1000; + $Anzahl_Spiele = 1000; + $Platz = 0; + foreach($teams AS $key => $value){ + if (($Gesamtpunkte != $value->gesamtpunkte) OR ($Anzahl_Spiele != $value->anzahl_spiele)){ + $Gesamtpunkte = $value->gesamtpunkte; + $Anzahl_Spiele = $value->anzahl_spiele; + $Platz = $value->platz; + @$Punktgleiche_Mannschaften[$Platz] = $value->team_id; + } + else{ + @$Punktgleiche_Mannschaften[$Platz] .= ",".$value->team_id; + @$Korrektur[$Platz] = $Punktgleiche_Mannschaften[$Platz]; + } + } + + foreach($Korrektur AS $key => $value){ + $teams_korrektur = getTabelleSpieltag($veranstaltung,$spieltag,$value,$key-1); + foreach($teams_korrektur AS $key1 => $value1){ + foreach($teams AS $key2 => $value2){ + if ($value2->team_id == $value1->team_id){ + $value2->platz = $value1->platz; + } + } + } + } + + //Tabelle neu sortieren + usort($teams, function($a, $b) { + return $a->platz <=> $b->platz; + }); + } + if (isJson()) { return JSON_sportsmanager::tabelleAnzeigen($modus, $teams); @@ -1693,6 +1705,86 @@ function tabelle($veranstaltung, $spieltag, $alleine_angezeigt, $praesentation = return ""; } +function getTabelleAktuellerSpieltag($veranstaltung) +{ + $db = getDatabase(); + + $query = "SELECT *," + . "\n siege + unentschieden + niederlagen AS anzahl_spiele" + . "\n FROM #__sportsmanager_team" + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id" + . "\n ORDER BY platz, teamname"; + + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $teams = $db->loadObjectList(); + return $teams; +} + +function getTabelleSpieltag($veranstaltung,$spieltag,$mannschaften = "",$offset_platz = 0) +{ + $db = getDatabase(); + if ($mannschaften){ + $filter_mannschaften_begegnung = "tt1.heim_team_id IN (" . $mannschaften . ") AND tt1.gast_team_id IN (" . $mannschaften . ") AND"; + $filter_mannschaften_teams = "AND team_id IN (" . $mannschaften . ") "; + } + else{ + $filter_mannschaften_begegnung = ""; + $filter_mannschaften_teams = ""; + } + $query = "SELECT verein_id, teamname, zusatzpunkte," + . "\n werte.*," + . "\n werte.siege * " . ($veranstaltung->tabellenwertung <= 3 ? "2" : ($veranstaltung->tabellenwertung <= 6 ? "3" : "1")) . ($veranstaltung->tabellenwertung <= 6 ? " + werte.unentschieden" : "") . " + COALESCE(zusatzpunkte, 0) AS gesamtpunkte," + . "\n werte.siege * " . ($veranstaltung->tabellenwertung <= 3 ? "2" : ($veranstaltung->tabellenwertung <= 6 ? "3" : "1")) . ($veranstaltung->tabellenwertung <= 6 ? " + werte.unentschieden" : "") . " AS begegnungspunkte," + . "\n werte.punkte_gewonnen - werte.punkte_verloren AS punkte_differenz," + . "\n IF(werte.punkte_verloren = 0, -1, werte.punkte_gewonnen / werte.punkte_verloren) AS punkte_quotient," + . "\n werte.spielpunkte_gewonnen - werte.spielpunkte_verloren AS spielpunkte_differenz," + . "\n IF(werte.spielpunkte_verloren = 0, -1, werte.spielpunkte_gewonnen / werte.spielpunkte_verloren) AS spielpunkte_quotient, " + . "\n werte.siege + werte.unentschieden + werte.niederlagen AS anzahl_spiele" + . "\n FROM #__sportsmanager_team" + . "\n LEFT JOIN" + . "\n (SELECT t1.team_id," + . "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND ((tt1.heim_team_id = t1.team_id AND tt1.heim_spielpunkte > tt1.gast_spielpunkte) OR (tt1.gast_team_id = t1.team_id AND tt1.gast_spielpunkte > tt1.heim_spielpunkte)) AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)) AS siege," + . "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND (tt1.heim_team_id = t1.team_id OR tt1.gast_team_id = t1.team_id) AND tt1.heim_spielpunkte = tt1.gast_spielpunkte AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)) AS unentschieden," + . "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND ((tt1.heim_team_id = t1.team_id AND tt1.heim_spielpunkte < tt1.gast_spielpunkte) OR (tt1.gast_team_id = t1.team_id AND tt1.gast_spielpunkte < tt1.heim_spielpunkte)) AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)) AS niederlagen," + . "\n (COALESCE((SELECT SUM(heim_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + " + . "\n (COALESCE((SELECT SUM(gast_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS punkte_gewonnen," + . "\n (COALESCE((SELECT SUM(gast_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + " + . "\n (COALESCE((SELECT SUM(heim_punkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS punkte_verloren," + . "\n (COALESCE((SELECT SUM(heim_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + " + . "\n (COALESCE((SELECT SUM(gast_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS spielpunkte_gewonnen," + . "\n (COALESCE((SELECT SUM(gast_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.heim_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) + " + . "\n (COALESCE((SELECT SUM(heim_spielpunkte) FROM #__sportsmanager_begegnung AS tt1 LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis AS tt2 ON tt1.begegnung_id = tt2.begegnung_id WHERE " . $filter_mannschaften_begegnung . " ISNULL(tt2.unbestaetigtes_ergebnis_id)" . ($spieltag > 0 ? " AND tt1.spieltag <= $spieltag" : "") . " AND tt1.gast_team_id = t1.team_id AND (tt1.heim_punkte != 0 OR tt1.gast_punkte != 0)), 0)) AS spielpunkte_verloren" + . "\n FROM #__sportsmanager_team AS t1" + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id)" + . "\n AS werte USING (team_id)" + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id " . $filter_mannschaften_teams; + if ($veranstaltung->tabellenwertung == 1 || $veranstaltung->tabellenwertung == 4 || $veranstaltung->tabellenwertung == 7) + $query .= "\n ORDER BY gesamtpunkte DESC, anzahl_spiele ASC, spielpunkte_differenz DESC, punkte_differenz DESC, teamname"; + else if ($veranstaltung->tabellenwertung == 2 || $veranstaltung->tabellenwertung == 5 || $veranstaltung->tabellenwertung == 8) + $query .= "\n ORDER BY gesamtpunkte DESC, anzahl_spiele ASC, spielpunkte_quotient DESC, punkte_quotient DESC, teamname"; + else if ($veranstaltung->tabellenwertung == 10) + $query .= "\n ORDER BY spielpunkte_differenz DESC, punkte_differenz DESC, teamname"; + else if ($veranstaltung->tabellenwertung == 11) + $query .= "\n ORDER BY spielpunkte_quotient DESC, punkte_quotient DESC, teamname"; + else + $query .= "\n ORDER BY gesamtpunkte DESC, anzahl_spiele ASC, teamname"; + //echo $query; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $teams = $db->loadObjectList(); + $platz = $offset_platz; + foreach($teams AS $key => $value) + { + $value->platz = ++$platz; + } + return $teams; +} + #[NoReturn] function veranstaltungenTicker($aktuelle_saison_anzeigen = false): void { $db = getDatabase(); @@ -4841,12 +4933,12 @@ function teamstatistikAktualisieren($geaenderte_veranstaltung_id = 0, $geaendert } } - $query = "SELECT * FROM #__sportsmanager_team" + $query = "SELECT *, siege + unentschieden + niederlagen AS anzahl_spiele FROM #__sportsmanager_team" . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id"; if ($veranstaltung->tabellenwertung == 1 || $veranstaltung->tabellenwertung == 4 || $veranstaltung->tabellenwertung == 7) - $query .= "\n ORDER BY gesamtpunkte DESC, spielpunkte_differenz DESC, punkte_differenz DESC, teamname"; + $query .= "\n ORDER BY gesamtpunkte DESC, anzahl_spiele ASC, spielpunkte_differenz DESC, punkte_differenz DESC, teamname"; else if ($veranstaltung->tabellenwertung == 2 || $veranstaltung->tabellenwertung == 5 || $veranstaltung->tabellenwertung == 8) - $query .= "\n ORDER BY gesamtpunkte DESC, spielpunkte_quotient DESC, punkte_quotient DESC, teamname"; + $query .= "\n ORDER BY gesamtpunkte DESC, anzahl_spiele ASC, spielpunkte_quotient DESC, punkte_quotient DESC, teamname"; else if ($veranstaltung->tabellenwertung == 21 || $veranstaltung->tabellenwertung == 24 || $veranstaltung->tabellenwertung == 27) $query .= "\n ORDER BY gesamtpunkte DESC, buchholz1 DESC, buchholz2 DESC, spielpunkte_differenz DESC, punkte_differenz DESC, teamname"; else if ($veranstaltung->tabellenwertung == 22 || $veranstaltung->tabellenwertung == 25 || $veranstaltung->tabellenwertung == 28) @@ -4858,13 +4950,75 @@ function teamstatistikAktualisieren($geaenderte_veranstaltung_id = 0, $geaendert else if ($veranstaltung->tabellenwertung == 23 || $veranstaltung->tabellenwertung == 26 || $veranstaltung->tabellenwertung == 29) $query .= "\n ORDER BY gesamtpunkte DESC, buchholz1 DESC, buchholz2 DESC, teamname"; else // ($veranstaltung->tabellenwertung == 3, 6, 9) - $query .= "\n ORDER BY gesamtpunkte DESC, teamname"; + $query .= "\n ORDER BY gesamtpunkte DESC, anzahl_spiele ASC, teamname"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } $teams = $db->loadObjectList(); + // Alle Spieltage ermitteln + $query = "SELECT DISTINCT spieltag" + . "\n FROM #__sportsmanager_begegnung" + . "\n INNER JOIN #__sportsmanager_team ON heim_team_id = team_id" + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id" + . "\n ORDER BY spieltag"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $spieltage = $db->loadObjectList(); + $anzahl_spieltage_komplett = count($spieltage); + + // Spieltage ermitteln, an denen schon eine Begegnung ausgetragen wurde + $query = "SELECT DISTINCT spieltag" + . "\n FROM #__sportsmanager_begegnung" + . "\n LEFT JOIN #__sportsmanager_unbestaetigtes_ergebnis USING (begegnung_id)" + . "\n INNER JOIN #__sportsmanager_team ON heim_team_id = team_id" + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id AND (heim_spielpunkte != 0 OR gast_spielpunkte != 0) AND ISNULL(#__sportsmanager_unbestaetigtes_ergebnis.begegnung_id)" + . "\n ORDER BY spieltag DESC"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $spieltage = $db->loadObjectList(); + $anzahl_spieltage_gespielt = count($spieltage); + + // Direkter Vergleich, wenn mindestens die Hälfte der Spieltage gespielt sind. + if ($veranstaltung->direktervergleich AND $anzahl_spieltage_gespielt >= $anzahl_spieltage_komplett/2){ + $Gesamtpunkte = 1000; + $Anzahl_Spiele = 1000; + $Platz = 0; + foreach($teams AS $key => $value){ + if (($Gesamtpunkte != $value->gesamtpunkte) OR ($Anzahl_Spiele != $value->anzahl_spiele)){ + $Gesamtpunkte = $value->gesamtpunkte; + $Anzahl_Spiele = $value->anzahl_spiele; + $Platz = $value->platz; + @$Punktgleiche_Mannschaften[$Platz] = $value->team_id; + } + else{ + @$Punktgleiche_Mannschaften[$Platz] .= ",".$value->team_id; + @$Korrektur[$Platz] = $Punktgleiche_Mannschaften[$Platz]; + } + } + + foreach($Korrektur AS $key => $value){ + $teams_korrektur = getTabelleSpieltag($veranstaltung,999,$value,$key-1); + foreach($teams_korrektur AS $key1 => $value1){ + foreach($teams AS $key2 => $value2){ + if ($value2->team_id == $value1->team_id){ + $value2->platz = $value1->platz; + } + } + } + } + + //Tabelle neu sortieren + usort($teams, function($a, $b) { + return $a->platz <=> $b->platz; + }); + } + $platz = 1; $tatsaechlicher_platz = 0; $gesamtpunkte = 0; diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php index eacb8df..273e631 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -7204,6 +7204,22 @@ class HTML_sportsmanager_admin + + + + \n\n"; @@ -48,12 +65,12 @@ class HTML_sportsmanager_admin } return $Spalte_Nr; } - + global $params; ?>
- Sports Manager + Sports Manager
spielernr); ?> nachname . ", " . $s->vorname); ?>
+ + + +
- From 1fe9d4bc5f01bc6e770c6c9732e3598b1e9f4af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Tue, 5 Aug 2025 20:45:33 +0200 Subject: [PATCH 7/8] =?UTF-8?q?=C3=84nderung=20nach=20Review=20durchgef?= =?UTF-8?q?=C3=BChrt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/sportsmanager.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index b2dbff8..e713137 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -1610,16 +1610,14 @@ function tabelle($veranstaltung, $spieltag, $alleine_angezeigt, $praesentation = if ($veranstaltung->tabellenwertung > 0) { // Alle Spieltage ermitteln - $query = "SELECT DISTINCT spieltag" + $query = "SELECT COUNT(DISTINCT spieltag)" . "\n FROM #__sportsmanager_begegnung" . "\n INNER JOIN #__sportsmanager_team ON heim_team_id = team_id" - . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id" - . "\n ORDER BY spieltag"; + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } - $spieltage = $db->loadObjectList(); $anzahl_spieltage_komplett = $db->loadResult(); // Spieltage ermitteln, an denen schon eine Begegnung ausgetragen wurde @@ -4967,16 +4965,14 @@ function teamstatistikAktualisieren($geaenderte_veranstaltung_id = 0, $geaendert $teams = $db->loadObjectList(); // Alle Spieltage ermitteln - $query = "SELECT DISTINCT spieltag" + $query = "SELECT COUNT(DISTINCT spieltag)" . "\n FROM #__sportsmanager_begegnung" . "\n INNER JOIN #__sportsmanager_team ON heim_team_id = team_id" - . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id" - . "\n ORDER BY spieltag"; + . "\n WHERE veranstaltung_id = $veranstaltung->veranstaltung_id"; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); } - $spieltage = $db->loadObjectList(); $anzahl_spieltage_komplett = $db->loadResult(); // Spieltage ermitteln, an denen schon eine Begegnung ausgetragen wurde From ff7314cf3f6370a66ac46c67ea0c414f3136e04d Mon Sep 17 00:00:00 2001 From: Marvin Flock Date: Tue, 5 Aug 2025 21:21:11 +0200 Subject: [PATCH 8/8] chore: create version in sportsmanager from git tag --- .github/workflows/build_release.yml | 26 +++++++++---- .../com_sportsmanager/sportsmanager.php | 2 +- .../com_sportsmanager/util/version.php | 6 +++ .../views/sportsmanager/view_admin.php | 39 +++++++++++++------ 4 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 src/structure/components/com_sportsmanager/util/version.php diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index 0c9a999..4896c8f 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -6,7 +6,7 @@ name: Sportsmanager Release on: push: tags: - - 'v[0-9]+.[0-9]+.[0-9]+' # run only on version tags like v1.0.0 + - 'v[0-9]+.[0-9]+.[0-9]+' # run only on version tags like v1.0.0 jobs: build: runs-on: ubuntu-latest @@ -24,7 +24,19 @@ jobs: - name: Install npm dependencies run: npm ci - + + - name: Get version from git tag + run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + + - name: Update version.php + run: | + echo " src/structure/components/com_sportsmanager/util/version.php + echo "defined('_JEXEC') or die;" >> src/structure/components/com_sportsmanager/util/version.php + echo "return [" >> src/structure/components/com_sportsmanager/util/version.php + echo " 'version' => '${{ env.VERSION }}'," >> src/structure/components/com_sportsmanager/util/version.php + echo " 'date' => '$(date +%F)'," >> src/structure/components/com_sportsmanager/util/version.php + echo "];" >> src/structure/components/com_sportsmanager/util/version.php + - name: Generate release notes id: release_notes_extension uses: release-drafter/release-drafter@v6 @@ -37,10 +49,10 @@ jobs: - name: Save release notes to file run: | echo "${{ steps.release_notes_extension.outputs.body }}" > RELEASE_NOTES.md - + - name: Run build script run: npm run release - + - name: Generate release notes id: release_notes_github uses: release-drafter/release-drafter@v6 @@ -52,7 +64,7 @@ jobs: - name: Save release notes to file run: | echo "${{ steps.release_notes_github.outputs.body }}" > RELEASE_NOTES.md - + - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: @@ -62,7 +74,7 @@ jobs: body_path: "RELEASE_NOTES.md" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + - name: Delete draft release via API # workaround: remove leftover draft by release-drafter env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -70,7 +82,7 @@ jobs: run: | drafts=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ https://api.github.com/repos/$REPO/releases | jq '.[] | select(.draft == true)') - + if [ -n "$drafts" ]; then id=$(echo "$drafts" | jq -r '.id') curl -s -X DELETE -H "Authorization: token $GITHUB_TOKEN" \ diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 78f7976..2415dcf 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -15,7 +15,6 @@ use Joomla\CMS\Uri\Uri; use Joomla\CMS\Version; defined('_JEXEC') or die('Restricted access'); -const SPORTS_MANAGER_VERSION = "2.0.3"; function laufzeitInit(): void { @@ -56,6 +55,7 @@ else if (isset($_REQUEST['filter_saison_id'])) global $content; global $task; global $params; + $app = Factory::getContainer()->get(SiteApplication::class); $jInput = $app->input; $task = $jInput->getCmd('task'); diff --git a/src/structure/components/com_sportsmanager/util/version.php b/src/structure/components/com_sportsmanager/util/version.php new file mode 100644 index 0000000..f7c44af --- /dev/null +++ b/src/structure/components/com_sportsmanager/util/version.php @@ -0,0 +1,6 @@ + 'DEV', + 'date' => '2025-08-05', +]; diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php index eacb8df..5e4243b 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -12,7 +12,8 @@ defined('_JEXEC') or die('Restricted access'); require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_tools.php'; require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php'; -function formatTimediff( $timestamp1, $timestamp2, $verbose ) { +function formatTimediff( $timestamp1, $timestamp2, $verbose ): string +{ if (empty($timestamp1) || empty($timestamp2)) { return ""; } else { @@ -27,7 +28,8 @@ function formatTimediff( $timestamp1, $timestamp2, $verbose ) { } } -function formatTeamName( $team_name, $team_id, $highlight_team_id ) { +function formatTeamName( $team_name, $team_id, $highlight_team_id ): string +{ if ($team_id == $highlight_team_id) { return "" . htmlentities_utf8($team_name) . ""; } else { @@ -37,10 +39,25 @@ function formatTeamName( $team_name, $team_id, $highlight_team_id ) { class HTML_sportsmanager_admin { + private static $versionData = null; + + private static function loadVersionData(): void + { + if (self::$versionData === null) { + self::$versionData = include JPATH_SITE . '/components/com_sportsmanager/util/version.php'; + } + } + + public static function getVersion(): string + { + self::loadVersionData(); + return self::$versionData['version'] ?? 'DEV'; + } + static function adminUebersicht($veranstaltungen, $spielerstatistiken, $turniere, $ranglisten, $individualwettbewerbe, $statistik, $saisons, $filter_saison_id, $externe_datenbank): void { - function checkZeilenumbruch($Spalte_Nr, $max_Spalten) - { + function checkZeilenumbruch($Spalte_Nr, $max_Spalten): int + { $Spalte_Nr++; if ($Spalte_Nr >= $max_Spalten){ echo "
@@ -4925,7 +4942,7 @@ class HTML_sportsmanager_admin static function adminKategorien($kategorien): void { global $params; - + ?>
@@ -8693,11 +8710,11 @@ class HTML_sportsmanager_admin
heim_spielpunkte . " : " . $row->gast_spielpunkte; else echo "_ : _" ?>unbestaetigtes_ergebnis_id != null) echo "
" . ($row->zwischenergebnis ? "live" : "unbestätigt") . ""; ?>
- termin_spiel, $row->ergebnis_vorgeschlagen, false) + termin_spiel, $row->ergebnis_vorgeschlagen, false) . " / " - . formatTimediff($row->ergebnis_vorgeschlagen, $row->ergebnis_akzeptiert, false); - ?> + . formatTimediff($row->ergebnis_vorgeschlagen, $row->ergebnis_akzeptiert, false); + ?>