From 54965f9ef26ad1252868ebb2189a3a3f1f2ab95a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Fri, 6 Mar 2026 10:43:46 +0100 Subject: [PATCH 01/14] Scrollbalken bei Ordnungsstrafen, Verbandsorgane und Hall of Fame --- .../views/sportsmanager/view.html.php | 9 ++++++++- .../views/sportsmanager/view_admin.php | 20 ++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php index 6e54938..6b2fe1d 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -4023,6 +4023,7 @@ static function verbandsorgane($titel, $beschreibung, $rows, $organisation_zeige if (count($rows) > 0) { ?> +
@@ -4061,6 +4062,7 @@ static function verbandsorgane($titel, $beschreibung, $rows, $organisation_zeige } ?>
+
"; echo "

" . $verbandsorgan->verbandsorgan . "

"; echo $verbandsorgan->beschreibung; @@ -4136,6 +4139,7 @@ static function verbandsorganeDetails($titel, $beschreibung, $verbandsorgan, $ro +   0) { ?> +
@@ -4187,6 +4192,7 @@ static function halloffame($titel, $beschreibung, $rows): void } ?>
+
@@ -4217,7 +4223,7 @@ static function halloffameDetails($titel, $beschreibung, $rows, $halloffame): vo if ($rows != null) { ?> - +
@@ -4320,6 +4326,7 @@ static function halloffameDetails($titel, $beschreibung, $rows, $halloffame): vo +   0) { ?> +
@@ -7137,6 +7138,7 @@ class HTML_sportsmanager_admin } ?>
ID
+
-
+
@@ -7432,7 +7434,8 @@ class HTML_sportsmanager_admin } } ?> -
ID
+ +
  0) { ?> - +
@@ -7585,7 +7588,7 @@ class HTML_sportsmanager_admin } ?>
- +
@@ -7770,6 +7774,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void } ?>
+ 0) { ?> +
@@ -7985,6 +7991,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void } ?>
+
- +
@@ -8253,6 +8260,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void } ?>
+
0) { ?> +
@@ -8523,6 +8532,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void } ?>
+
Date: Fri, 6 Mar 2026 15:10:01 +0100 Subject: [PATCH 02/14] Heimrechttausch: Sicherheitsabfrage und speichern in Historie --- .../components/com_sportsmanager/admin.php | 25 ++++++++++++++++++- .../views/sportsmanager/view_admin.php | 6 ++++- .../de-DE/de-DE.com_sportsmanager.ini | 4 ++- .../en-GB/en-GB.com_sportsmanager.ini | 4 ++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 3a7fc16..f3fba06 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10340,6 +10340,7 @@ function adminRemoveBegegnung(): void $db = getDatabase(); $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + $user_id = isExternalDatabase() ? 0 : (isJson() ? getUserID() : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id); $id = $jInput->get('id', 0, 'INT'); $veranstaltungId = $jInput->get('veranstaltungid', 0, 'INT'); if ($veranstaltungId == 0) die("Missing id!"); @@ -10388,6 +10389,14 @@ function adminRemoveBegegnung(): void die($db->stderr(true)); } + $query = "INSERT INTO #__sportsmanager_begegnung_historie" + . "\n (begegnung_historie_id,begegnung_id,aktion,user_id,eingetragen)" + . "\n VALUES (NULL,$id,11,$user_id,NOW());"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + termin_aktualisieren($id); redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungId . '#id' . $id); @@ -10525,7 +10534,6 @@ function adminEditBegegnungSpielplan($bestaetigen): void : $begegnung->spielort_id) . "\""; $begegnung->spielort_name = loadResult($db, $spielortQuery); - if (isJson()) { $response = JSON_sportsmanager::adminEditBegegnungSpielplan($bestaetigen, $veranstaltung, $begegnung, $heim_team, $gast_team, $spiele, $heim_spieler, $gast_spieler, $teamspiel_modus); JSON_sportsmanager::JSON($response); @@ -11122,6 +11130,21 @@ function adminSaveBegegnungSpielplan(): void if (!$db->execute()) { die($db->stderr(true)); } + + $encrypted_pin = $db->escape($jInput->get('pin', '', 'RAW')); + $pin = decrypt($encrypted_pin, "a9cZ" . $veranstaltungId . "oDS7" . $id . "2eA"); + + $query = "SELECT team_id FROM #__sportsmanager_team" + . "\n WHERE pin = '$pin' AND veranstaltung_id = $veranstaltungId;"; + $team_id = loadResult($db, $query); + + $query = "INSERT INTO #__sportsmanager_begegnung_historie" + . "\n (begegnung_historie_id,begegnung_id,aktion,team_id,eingetragen)" + . "\n VALUES (NULL,$id,11,$team_id,NOW());"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } } redirectSportsManagerURL('&task=' . ($bestaetigen != 0 ? ($bestaetigen == 1 ? 'admin_begegnung_spielplan_edit_bestaetigen' : 'pineingabe') : 'admin_begegnung_spielplan_edit') . '&id=' . $id . '&veranstaltungid=' . $veranstaltungId . ($bestaetigen != 0 ? '_bestaetigen' : '') . '&veranstaltungid=' . $veranstaltungId . '&id=' . $id . '&erneut_oeffnen=1' . (!empty($encrypted_pin) ? ('&epin=' . $encrypted_pin) : "") . ($aus_uebersicht ? '&aus_uebersicht=1' : '')); 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 777e55e..64cf33d 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -11103,7 +11103,9 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void ?> + href="veranstaltung_id . '&id=' . $row->begegnung_id); ?>" + onclick="return confirm('');"> + Text::_('COM_SPORTSMANAGER_MODIFIED_RESULTS'), 9 => Text::_('COM_SPORTSMANAGER_LIVE_RESULTS'), 10 => Text::_('COM_SPORTSMANAGER_REJECTED_SHIFT'), + 11 => Text::_('COM_SPORTSMANAGER_SWAP_MATCH'), default => Text::_('COM_SPORTSMANAGER_PROPOSED_APPOINTMENT'), }; ?> @@ -11572,6 +11575,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void ?> Date: Fri, 6 Mar 2026 20:16:54 +0100 Subject: [PATCH 03/14] =?UTF-8?q?Evtl.=20vorhandene=20Ordnungsstrafen=20we?= =?UTF-8?q?rden=20beim=20L=C3=B6schen=20eines=20Spieles=20mitgel=C3=B6scht?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index f3fba06..cd7bae3 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10312,6 +10312,12 @@ function adminRemoveBegegnung(): void die($db->stderr(true)); } + $query = "DELETE FROM #__sportsmanager_ordnungsstrafen WHERE begegnung_id = $id;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $query = "DELETE FROM #__sportsmanager_teamspiel WHERE begegnung_id = $id;"; $db->setQuery($query); if (!$db->execute()) { @@ -10323,7 +10329,7 @@ function adminRemoveBegegnung(): void if (!$db->execute()) { die($db->stderr(true)); } - + if ($elo_aktualisieren) { wannGespieltAktualisieren(); eloAktualisieren($aktualisieren_ab_datum); @@ -12701,6 +12707,12 @@ function adminBegegnungenPokalrundeAuslosenForm(): void die($db->stderr(true)); } + $query = "DELETE FROM #__sportsmanager_ordnungsstrafen WHERE begegnung_id = $id;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + $query = "DELETE FROM #__sportsmanager_teamspiel WHERE begegnung_id = $id;"; $db->setQuery($query); if (!$db->execute()) { From bac4c0ada4ffb4a1e44eabc67568f67b36264f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Sun, 8 Mar 2026 09:23:27 +0100 Subject: [PATCH 04/14] =?UTF-8?q?Funktion=20Spielbericht=20l=C3=B6schen=20?= =?UTF-8?q?hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 59 +++++++++++++++++++ .../views/sportsmanager/view_admin.php | 9 +-- .../de-DE/de-DE.com_sportsmanager.ini | 5 +- .../en-GB/en-GB.com_sportsmanager.ini | 5 +- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index cd7bae3..8ec62c3 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10410,6 +10410,10 @@ function adminRemoveBegegnung(): void function adminEditBegegnungSpielplan($bestaetigen): void { + //$bestaetigen = 0: Eingabe Moderator + //$bestaetigen = 1: Bestätigung Ergebnis + //$bestaetigen = 2: Pineingabe + $db = getDatabase(); $jInput = Factory::getContainer()->get(SiteApplication::class)->input; @@ -10593,6 +10597,13 @@ function adminSaveBegegnungSpielplan(): void $benutzer_ist_moderator = benutzerZugriff("mannschaftswettbewerb_aendern") || benutzerVeranstaltungModerator($veranstaltungId); // Abfrage muss vor LOCK erfolgen, da sonst die Abfrage mangels Lock auf Moderator-Tabelle scheitert + //Spielbericht komplett loeschen + if ($benutzer_ist_moderator && $jInput->get('loeschen', false, 'BOOL')) { + adminDeleteMatchReportBegegnung($id); + redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungId . '#id' . $id, Text::_('COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED')); + } + + $query = "SELECT #__sportsmanager_begegnung.*, unbestaetigtes_ergebnis_id, zwischenergebnis," . " (SELECT COUNT(*) FROM #__sportsmanager_begegnung_historie WHERE #__sportsmanager_begegnung_historie.begegnung_id = #__sportsmanager_begegnung.begegnung_id) AS verlegen_aktionen" . "\n FROM #__sportsmanager_begegnung" @@ -11030,6 +11041,54 @@ function adminSaveBegegnungSpielplan(): void } } +function adminDeleteMatchReportBegegnung($id): void +{ + $db = getDatabase(); + $user_id = isExternalDatabase() ? 0 : (isJson() ? getUserID() : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id); + + $query = "DELETE FROM #__sportsmanager_teamspiel WHERE begegnung_id = $id;"; + $db->setQuery($query); + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + + $query = "UPDATE #__sportsmanager_begegnung" + . "\n SET heim_punkte = NULL," + . "\n gast_punkte = NULL," + . "\n heim_spielpunkte = NULL," + . "\n gast_spielpunkte = NULL" + . "\n WHERE begegnung_id = $id"; + $db->setQuery($query); + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + + $query = "DELETE FROM #__sportsmanager_unbestaetigtes_ergebnis WHERE begegnung_id = $id;"; + $db->setQuery($query); + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + + $query = "DELETE FROM #__sportsmanager_begegnung_historie WHERE begegnung_id = $id AND aktion IN (6,7,8,9,10);"; + $db->setQuery($query); + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + + spielerstatistikAktualisieren(0, $veranstaltungId); + teamstatistikAktualisieren($veranstaltungId); + + $query = "INSERT INTO #__sportsmanager_begegnung_historie" + . "\n (begegnung_historie_id,begegnung_id,aktion,user_id,eingetragen)" + . "\n VALUES (NULL,$id,12,$user_id,NOW());"; + $db->setQuery($query); + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + + return; +} + #[NoReturn] function adminBegegnungSpielplanHeimtausch(): void { $db = getDatabase(); 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 64cf33d..18671cc 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -11475,6 +11475,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void 9 => Text::_('COM_SPORTSMANAGER_LIVE_RESULTS'), 10 => Text::_('COM_SPORTSMANAGER_REJECTED_SHIFT'), 11 => Text::_('COM_SPORTSMANAGER_SWAP_MATCH'), + 12 => Text::_('COM_SPORTSMANAGER_MATCH_REPORT_DELETED'), default => Text::_('COM_SPORTSMANAGER_PROPOSED_APPOINTMENT'), }; ?> @@ -12009,12 +12010,13 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void $js_pruefung .= "if (!spieler_eingetragen()) { if (!confirm('" . ($spielernamen == 1 ? Text::_('COM_SPORTSMANAGER_NO_PLAYERS_FOR_DOUBLES') : Text::_('COM_SPORTSMANAGER_NOT_ALL_PLAYERS_FROM_REGISTERED')) . " " . Text::_('COM_SPORTSMANAGER_WANT_TO_SAVE_RESULT') . "')) return false; } "; ?> /> + class="button" /> + - + "/> @@ -12034,7 +12036,6 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void static function adminBegegnungenGenerieren($veranstaltung, $rows): void { - //geändert am 07.03.2025 von Jürgen Meyer global $params; $anzahlteams = count($rows); if ($anzahlteams % 2) 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 c859f17..3fa74f3 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -1094,4 +1094,7 @@ COM_SPORTSMANAGER_YEARS="Jahre" COM_SPORTSMANAGER_ADD_HALL_OF_FAME_YEAR="Hall of Fame Jahr hinzufügen" COM_SPORTSMANAGER_NO_ENTRY="kein Eintrag" COM_SPORTSMANAGER_REALLY_SWAP_MATCH="Willst Du wirklich das Heimrecht tauschen?" -COM_SPORTSMANAGER_SWAP_MATCH="Heimrechttausch" \ No newline at end of file +COM_SPORTSMANAGER_SWAP_MATCH="Heimrechttausch" +COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="Der Spielbericht wird zusammen mit allen historischen Einträgen gelöscht. Willst du den Spielbericht wirklich löschen?" +COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Spielbericht gelöscht" +COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="Der Spielbericht wurde erfolgreich gelöscht!" \ No newline at end of file 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 429dae9..e7c39f8 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -1094,4 +1094,7 @@ COM_SPORTSMANAGER_YEARS="Years" COM_SPORTSMANAGER_ADD_HALL_OF_FAME_YEAR="Add Hall of Fame Year" COM_SPORTSMANAGER_NO_ENTRY="no entry" COM_SPORTSMANAGER_REALLY_SWAP_MATCH="Do you really want to swap the home advantage?" -COM_SPORTSMANAGER_SWAP_MATCH="Swap home advantage" \ No newline at end of file +COM_SPORTSMANAGER_SWAP_MATCH="Swap home advantage" +COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="The match report and all its history will be deleted. Are you sure you want to delete the match report?" +COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Match report deleted" +COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="The match report has been successfully deleted!" \ No newline at end of file From 8391bf9df10de94b494e17ffff903c3ec09e61cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Sun, 8 Mar 2026 12:19:10 +0100 Subject: [PATCH 05/14] Automatische Spielberichtskorrektur bei doppelter Spielnummer --- .../components/com_sportsmanager/admin.php | 34 +++++++++++++++++-- .../views/sportsmanager/view_admin.php | 1 + .../de-DE/de-DE.com_sportsmanager.ini | 3 +- .../en-GB/en-GB.com_sportsmanager.ini | 3 +- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 8ec62c3..42cc5a6 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10522,7 +10522,7 @@ function adminEditBegegnungSpielplan($bestaetigen): void if (count($rows) < 1) die("Wrong id!"); $gast_team = $rows[0]; - $query = "SELECT * FROM #__sportsmanager_teamspiel WHERE begegnung_id = $id ORDER BY teamspiel_nummer"; + $query = "SELECT * FROM #__sportsmanager_teamspiel WHERE begegnung_id = $id ORDER BY teamspiel_nummer, teamspiel_id"; $spiele = loadObjectList($db, $query); $query = "SELECT *" . "\n FROM #__sportsmanager_mitglied_von_team as t1" @@ -10953,6 +10953,36 @@ function adminSaveBegegnungSpielplan(): void if (!$db->execute()) { abortWithError($db->stderr(true)); } + + // Spielbericht auf Fehler (doppelte Einträge) überprüfen + $query = "DELETE t1" + . "\n FROM #__sportsmanager_teamspiel t1" + . "\n INNER JOIN #__sportsmanager_teamspiel t2" + . "\n ON t1.begegnung_id = t2.begegnung_id" + . "\n AND t1.teamspiel_nummer = t2.teamspiel_nummer" + . "\n AND t1.teamspiel_id < t2.teamspiel_id" + . "\n WHERE t1.begegnung_id = $id;"; + + $db->setQuery($query); + + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + + // Nur Historie eintragen, wenn Datensätze gelöscht wurden + $deleted = $db->getAffectedRows(); + if ($deleted > 0) { + + // Historie eintragen; team_id und user_id auf NULL, wenn nicht vorhanden + $query = "INSERT INTO #__sportsmanager_begegnung_historie" + . "\n (begegnung_historie_id, begegnung_id, aktion, team_id, user_id, eingetragen)" + . "\n VALUES (NULL, $id, 13, NULL, NULL, NOW());"; + + $db->setQuery($query); + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + } // Benachrichtigung schreiben $heim_team = null; @@ -11069,7 +11099,7 @@ function adminDeleteMatchReportBegegnung($id): void abortWithError($db->stderr(true)); } - $query = "DELETE FROM #__sportsmanager_begegnung_historie WHERE begegnung_id = $id AND aktion IN (6,7,8,9,10);"; + $query = "DELETE FROM #__sportsmanager_begegnung_historie WHERE begegnung_id = $id AND aktion IN (6,7,8,9,10,13);"; $db->setQuery($query); if (!$db->execute()) { abortWithError($db->stderr(true)); 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 18671cc..678bf30 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -11476,6 +11476,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void 10 => Text::_('COM_SPORTSMANAGER_REJECTED_SHIFT'), 11 => Text::_('COM_SPORTSMANAGER_SWAP_MATCH'), 12 => Text::_('COM_SPORTSMANAGER_MATCH_REPORT_DELETED'), + 13 => Text::_('COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED'), default => Text::_('COM_SPORTSMANAGER_PROPOSED_APPOINTMENT'), }; ?> 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 3fa74f3..f904d60 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -1097,4 +1097,5 @@ COM_SPORTSMANAGER_REALLY_SWAP_MATCH="Willst Du wirklich das Heimrecht tauschen?" COM_SPORTSMANAGER_SWAP_MATCH="Heimrechttausch" COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="Der Spielbericht wird zusammen mit allen historischen Einträgen gelöscht. Willst du den Spielbericht wirklich löschen?" COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Spielbericht gelöscht" -COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="Der Spielbericht wurde erfolgreich gelöscht!" \ No newline at end of file +COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="Der Spielbericht wurde erfolgreich gelöscht!" +COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED="Spielberichtskorrektur" \ No newline at end of file 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 e7c39f8..c4eb5f9 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -1097,4 +1097,5 @@ COM_SPORTSMANAGER_REALLY_SWAP_MATCH="Do you really want to swap the home advanta COM_SPORTSMANAGER_SWAP_MATCH="Swap home advantage" COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="The match report and all its history will be deleted. Are you sure you want to delete the match report?" COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Match report deleted" -COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="The match report has been successfully deleted!" \ No newline at end of file +COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="The match report has been successfully deleted!" +COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED="Match report corrected" \ No newline at end of file From 4ada3a3b77db84a06962e852e7e9344733db3e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Sun, 8 Mar 2026 12:23:39 +0100 Subject: [PATCH 06/14] Bemerkungen angepasst --- src/structure/components/com_sportsmanager/admin.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 42cc5a6..4616719 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10962,18 +10962,14 @@ function adminSaveBegegnungSpielplan(): void . "\n AND t1.teamspiel_nummer = t2.teamspiel_nummer" . "\n AND t1.teamspiel_id < t2.teamspiel_id" . "\n WHERE t1.begegnung_id = $id;"; - $db->setQuery($query); - if (!$db->execute()) { abortWithError($db->stderr(true)); } - // Nur Historie eintragen, wenn Datensätze gelöscht wurden + // In Historie eintragen, wenn doppelte Einträge gelöscht wurden $deleted = $db->getAffectedRows(); if ($deleted > 0) { - - // Historie eintragen; team_id und user_id auf NULL, wenn nicht vorhanden $query = "INSERT INTO #__sportsmanager_begegnung_historie" . "\n (begegnung_historie_id, begegnung_id, aktion, team_id, user_id, eingetragen)" . "\n VALUES (NULL, $id, 13, NULL, NULL, NOW());"; From 943551508835dca1171cb208f06c4159c11df1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Sun, 8 Mar 2026 20:43:10 +0100 Subject: [PATCH 07/14] =?UTF-8?q?Beim=20L=C3=B6schen=20von=20Spieler=20bzw?= =?UTF-8?q?.=20Vereine=20werden=20die=20entsprechenden=20ids=20in=20Hall?= =?UTF-8?q?=20of=20Fame=20und=20Verbandsorgane=20gel=C3=B6scht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/com_sportsmanager/admin.php | 13 +++-- .../com_sportsmanager/sportsmanager.php | 50 +++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 4616719..aaa7a0d 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -1655,6 +1655,7 @@ function adminEditSpieler(): void bildLoeschen("spieler", $id); spielerstatistikAktualisieren(); + halloffameAktualisieren(); redirectSportsManagerURL('&task=admin_spieler&filter=' . urlencode($filter)); } @@ -1962,7 +1963,8 @@ function adminSpielerZusammenlegenForm(): void aktuellerVereinAktualisieren($spieler_beizubehalten_id); ranglisteAktualisieren(); einstufungAktualisieren(); - + halloffameAktualisieren(); + redirectSportsManagerURL('&task=admin_spieler&filter=' . urlencode($filter) . '#id' . $spieler_beizubehalten_id); } @@ -2072,7 +2074,8 @@ function adminRemoveInaktiveSpielerForm(): void } spielerstatistikAktualisieren(); - + halloffameAktualisieren(); + foreach ($bilder_spieler_ids as $id) bildLoeschen("spieler", $id); @@ -3713,7 +3716,8 @@ function adminEditVerein(): void bildLoeschen("vereine", $id); aktuellerVereinAktualisieren(); - + halloffameAktualisieren(); + redirectSportsManagerURL('&task=admin_vereine'); } @@ -3821,7 +3825,8 @@ function adminVereineZusammenlegenForm(): void bildLoeschen("vereine", $verein_zu_entfernen_id); aktuellerVereinAktualisieren(); - + halloffameAktualisieren(); + redirectSportsManagerURL('&task=admin_vereine#id' . $verein_beizubehalten_id); } diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 1e2f20f..cac7242 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -6028,6 +6028,56 @@ function spielerstatistikAktualisieren($geaenderte_spielerstatistik_id = 0, $gea } } +function halloffameAktualisieren(): void +{ + //Beim Löschen von Spieler bzw. Vereine werden die entsprechenden ids in Hall of Fame und Verbandsorgane gelöscht + $db = getDatabase(); + + // spieler1_id prüfen + $query = "UPDATE #__sportsmanager_mitglied_von_halloffame h" + . "\n LEFT JOIN #__sportsmanager_spieler s ON s.spieler_id = h.spieler1_id" + . "\n SET h.spieler1_id = NULL" + . "\n WHERE h.spieler1_id IS NOT NULL" + . "\n AND s.spieler_id IS NULL;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + + // spieler2_id prüfen + $query = "UPDATE #__sportsmanager_mitglied_von_halloffame h" + . "\n LEFT JOIN #__sportsmanager_spieler s ON s.spieler_id = h.spieler2_id" + . "\n SET h.spieler2_id = NULL" + . "\n WHERE h.spieler2_id IS NOT NULL" + . "\n AND s.spieler_id IS NULL;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + + // verein_id prüfen + $query = "UPDATE #__sportsmanager_mitglied_von_halloffame h" + . "\n LEFT JOIN #__sportsmanager_verein v ON v.verein_id = h.verein_id" + . "\n SET h.verein_id = NULL" + . "\n WHERE h.verein_id IS NOT NULL" + . "\n AND v.verein_id IS NULL;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + + // Verbandsorgan-Spieler prüfen + $query = "UPDATE #__sportsmanager_mitglied_von_verbandsorgan h" + . "\n LEFT JOIN #__sportsmanager_spieler s ON s.spieler_id = h.spieler_id" + . "\n SET h.spieler_id = NULL" + . "\n WHERE h.spieler_id IS NOT NULL" + . "\n AND s.spieler_id IS NULL;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } +} + function wannGespieltAktualisieren(): void { $db = getDatabase(); From 1a9188c07bf46332f2fb5cd369bbc71aeff4fb95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Sun, 8 Mar 2026 21:46:09 +0100 Subject: [PATCH 08/14] Beanstandung Copilot abgearbeitet 1 --- src/structure/components/com_sportsmanager/admin.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index aaa7a0d..c58f498 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10604,7 +10604,7 @@ function adminSaveBegegnungSpielplan(): void //Spielbericht komplett loeschen if ($benutzer_ist_moderator && $jInput->get('loeschen', false, 'BOOL')) { - adminDeleteMatchReportBegegnung($id); + adminDeleteMatchReportBegegnung($id,$veranstaltungId); redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungId . '#id' . $id, Text::_('COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED')); } @@ -11072,7 +11072,7 @@ function adminSaveBegegnungSpielplan(): void } } -function adminDeleteMatchReportBegegnung($id): void +function adminDeleteMatchReportBegegnung($id,$veranstaltungId): void { $db = getDatabase(); $user_id = isExternalDatabase() ? 0 : (isJson() ? getUserID() : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id); @@ -11231,7 +11231,7 @@ function adminDeleteMatchReportBegegnung($id): void $pin = decrypt($encrypted_pin, "a9cZ" . $veranstaltungId . "oDS7" . $id . "2eA"); $query = "SELECT team_id FROM #__sportsmanager_team" - . "\n WHERE pin = '$pin' AND veranstaltung_id = $veranstaltungId;"; + . "\n WHERE pin = " . $db->quote($pin) . " AND veranstaltung_id = $veranstaltungId;"; $team_id = loadResult($db, $query); $query = "INSERT INTO #__sportsmanager_begegnung_historie" From 9ed58f29165d536261d7d9adc991961a5cbd19b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Sun, 8 Mar 2026 22:43:05 +0100 Subject: [PATCH 09/14] Beanstandung Copilot abgearbeitet 2 --- src/structure/components/com_sportsmanager/admin.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index c58f498..f9525dd 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10983,6 +10983,8 @@ function adminSaveBegegnungSpielplan(): void if (!$db->execute()) { abortWithError($db->stderr(true)); } + $query = "SELECT * FROM #__sportsmanager_teamspiel WHERE begegnung_id = $id ORDER BY teamspiel_nummer"; + $spiele = loadObjectList($db, $query); } // Benachrichtigung schreiben @@ -11109,6 +11111,16 @@ function adminDeleteMatchReportBegegnung($id,$veranstaltungId): void spielerstatistikAktualisieren(0, $veranstaltungId); teamstatistikAktualisieren($veranstaltungId); + // Elo-bezogene Auswertungen aktualisieren, falls für die Veranstaltung aktiviert + $query = "SELECT elo_wertung FROM #__sportsmanager_veranstaltung WHERE veranstaltung_id = " . $veranstaltungId . " LIMIT 1;"; + $db->setQuery($query); + $eloWertung = (int) $db->loadResult(); + if ($eloWertung === 1) { + wannGespieltAktualisieren($veranstaltungId); + eloAktualisieren($veranstaltungId); + einstufungAktualisieren($veranstaltungId); + } + $query = "INSERT INTO #__sportsmanager_begegnung_historie" . "\n (begegnung_historie_id,begegnung_id,aktion,user_id,eingetragen)" . "\n VALUES (NULL,$id,12,$user_id,NOW());"; From eccecedf95b5f608ee67f3781d929a2e98c8dc79 Mon Sep 17 00:00:00 2001 From: jmeyer26 Date: Sun, 8 Mar 2026 22:58:31 +0100 Subject: [PATCH 10/14] Update src/structure/language/de-DE/de-DE.com_sportsmanager.ini Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/structure/language/de-DE/de-DE.com_sportsmanager.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 f904d60..e93e999 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -1095,7 +1095,7 @@ COM_SPORTSMANAGER_ADD_HALL_OF_FAME_YEAR="Hall of Fame Jahr hinzufügen" COM_SPORTSMANAGER_NO_ENTRY="kein Eintrag" COM_SPORTSMANAGER_REALLY_SWAP_MATCH="Willst Du wirklich das Heimrecht tauschen?" COM_SPORTSMANAGER_SWAP_MATCH="Heimrechttausch" -COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="Der Spielbericht wird zusammen mit allen historischen Einträgen gelöscht. Willst du den Spielbericht wirklich löschen?" -COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Spielbericht gelöscht" -COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="Der Spielbericht wurde erfolgreich gelöscht!" +COM_SPORTSMANAGER_REALLY_DELETE_MATCH_REPORT="Der Spielbericht wird zusammen mit allen historischen Einträgen gelöscht. Willst du den Spielbericht wirklich löschen?" +COM_SPORTSMANAGER_MATCH_REPORT_DELETED="Spielbericht gelöscht" +COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED="Der Spielbericht wurde erfolgreich gelöscht!" COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED="Spielberichtskorrektur" \ No newline at end of file From 5919994a3ebc9b74443bcfcf3012af6290ceeae0 Mon Sep 17 00:00:00 2001 From: jmeyer26 Date: Sun, 8 Mar 2026 23:02:02 +0100 Subject: [PATCH 11/14] Update src/structure/components/com_sportsmanager/admin.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/structure/components/com_sportsmanager/admin.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index f9525dd..9289cab 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -11116,9 +11116,15 @@ function adminDeleteMatchReportBegegnung($id,$veranstaltungId): void $db->setQuery($query); $eloWertung = (int) $db->loadResult(); if ($eloWertung === 1) { - wannGespieltAktualisieren($veranstaltungId); - eloAktualisieren($veranstaltungId); - einstufungAktualisieren($veranstaltungId); + // Startdatum der Veranstaltung für Elo-Berechnung ermitteln + $query = "SELECT datum_beginn FROM #__sportsmanager_veranstaltung WHERE veranstaltung_id = " . $veranstaltungId . " LIMIT 1;"; + $db->setQuery($query); + $datumBeginn = $db->loadResult(); + + // Funktionen mit korrekten Parametern aufrufen + wannGespieltAktualisieren(); + eloAktualisieren($datumBeginn); + einstufungAktualisieren(true); } $query = "INSERT INTO #__sportsmanager_begegnung_historie" From e139ac4fc28442fa8355869371eb5bb54d3aaf1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Sun, 8 Mar 2026 23:59:38 +0100 Subject: [PATCH 12/14] Beanstandung Copilot abgearbeitet 4 --- src/structure/components/com_sportsmanager/admin.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 9289cab..015ce18 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10581,6 +10581,7 @@ function adminSaveBegegnungSpielplan(): void $erneut_oeffnen = $jInput->get('erneut_oeffnen', 0, 'INT'); $heim_team_id = $jInput->get('heim_team_id', 0, 'INT'); $gast_team_id = $jInput->get('gast_team_id', 0, 'INT'); + $loeschen = $jInput->getString('loeschen', ''); if ($jInput->get('cancel', false, 'BOOL')) { if ($bestaetigen == 1) { @@ -10603,7 +10604,7 @@ function adminSaveBegegnungSpielplan(): void $benutzer_ist_moderator = benutzerZugriff("mannschaftswettbewerb_aendern") || benutzerVeranstaltungModerator($veranstaltungId); // Abfrage muss vor LOCK erfolgen, da sonst die Abfrage mangels Lock auf Moderator-Tabelle scheitert //Spielbericht komplett loeschen - if ($benutzer_ist_moderator && $jInput->get('loeschen', false, 'BOOL')) { + if ($benutzer_ist_moderator && $loeschen !== '') { adminDeleteMatchReportBegegnung($id,$veranstaltungId); redirectSportsManagerURL('&task=admin_begegnungen&veranstaltungid=' . $veranstaltungId . '#id' . $id, Text::_('COM_SPORTSMANAGER_MATCH_REPORT_WAS_DELETED')); } @@ -11117,13 +11118,13 @@ function adminDeleteMatchReportBegegnung($id,$veranstaltungId): void $eloWertung = (int) $db->loadResult(); if ($eloWertung === 1) { // Startdatum der Veranstaltung für Elo-Berechnung ermitteln - $query = "SELECT datum_beginn FROM #__sportsmanager_veranstaltung WHERE veranstaltung_id = " . $veranstaltungId . " LIMIT 1;"; + $query = "SELECT erster_tag FROM #__sportsmanager_veranstaltung WHERE veranstaltung_id = " . $veranstaltungId . " LIMIT 1;"; $db->setQuery($query); - $datumBeginn = $db->loadResult(); + $aktualisieren_ab_datum = $db->loadResult(); // Funktionen mit korrekten Parametern aufrufen wannGespieltAktualisieren(); - eloAktualisieren($datumBeginn); + eloAktualisieren($aktualisieren_ab_datum); einstufungAktualisieren(true); } From dc0fcea945cbaa0f71069ff2de84302e63c5f94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 9 Mar 2026 07:43:20 +0100 Subject: [PATCH 13/14] Beanstandung Copilot abgearbeitet 5 --- src/structure/components/com_sportsmanager/admin.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 015ce18..7ca6a38 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10984,8 +10984,6 @@ function adminSaveBegegnungSpielplan(): void if (!$db->execute()) { abortWithError($db->stderr(true)); } - $query = "SELECT * FROM #__sportsmanager_teamspiel WHERE begegnung_id = $id ORDER BY teamspiel_nummer"; - $spiele = loadObjectList($db, $query); } // Benachrichtigung schreiben @@ -11125,7 +11123,7 @@ function adminDeleteMatchReportBegegnung($id,$veranstaltungId): void // Funktionen mit korrekten Parametern aufrufen wannGespieltAktualisieren(); eloAktualisieren($aktualisieren_ab_datum); - einstufungAktualisieren(true); + einstufungAktualisieren(); } $query = "INSERT INTO #__sportsmanager_begegnung_historie" @@ -11253,9 +11251,13 @@ function adminDeleteMatchReportBegegnung($id,$veranstaltungId): void . "\n WHERE pin = " . $db->quote($pin) . " AND veranstaltung_id = $veranstaltungId;"; $team_id = loadResult($db, $query); + if (empty($user_id) OR !empty($team_id)) $user_id = "NULL"; + if (empty($team_id)) $team_id = "NULL"; + $query = "INSERT INTO #__sportsmanager_begegnung_historie" - . "\n (begegnung_historie_id,begegnung_id,aktion,team_id,eingetragen)" - . "\n VALUES (NULL,$id,11,$team_id,NOW());"; + . "\n (begegnung_historie_id,begegnung_id,aktion,team_id,user_id,eingetragen)" + . "\n VALUES (NULL,$id,11,$team_id,$user_id,NOW());"; + echo $query; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true)); From 2faa38e2b8bffc6fc249feccb0ac833ad6437e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 9 Mar 2026 07:44:59 +0100 Subject: [PATCH 14/14] =?UTF-8?q?Hilfsausgabe=20gel=C3=B6scht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/structure/components/com_sportsmanager/admin.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 7ca6a38..deff560 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -11257,7 +11257,6 @@ function adminDeleteMatchReportBegegnung($id,$veranstaltungId): void $query = "INSERT INTO #__sportsmanager_begegnung_historie" . "\n (begegnung_historie_id,begegnung_id,aktion,team_id,user_id,eingetragen)" . "\n VALUES (NULL,$id,11,$team_id,$user_id,NOW());"; - echo $query; $db->setQuery($query); if (!$db->execute()) { die($db->stderr(true));