diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 3a7fc16..deff560 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); } @@ -10312,6 +10317,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 +10334,7 @@ function adminRemoveBegegnung(): void if (!$db->execute()) { die($db->stderr(true)); } - + if ($elo_aktualisieren) { wannGespieltAktualisieren(); eloAktualisieren($aktualisieren_ab_datum); @@ -10340,6 +10351,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 +10400,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); @@ -10395,6 +10415,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; @@ -10503,7 +10527,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" @@ -10525,7 +10549,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); @@ -10558,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) { @@ -10579,6 +10603,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 && $loeschen !== '') { + adminDeleteMatchReportBegegnung($id,$veranstaltungId); + 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" @@ -10928,6 +10959,32 @@ 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)); + } + + // In Historie eintragen, wenn doppelte Einträge gelöscht wurden + $deleted = $db->getAffectedRows(); + if ($deleted > 0) { + $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; @@ -11016,6 +11073,70 @@ function adminSaveBegegnungSpielplan(): void } } +function adminDeleteMatchReportBegegnung($id,$veranstaltungId): 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,13);"; + $db->setQuery($query); + if (!$db->execute()) { + abortWithError($db->stderr(true)); + } + + 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) { + // Startdatum der Veranstaltung für Elo-Berechnung ermitteln + $query = "SELECT erster_tag FROM #__sportsmanager_veranstaltung WHERE veranstaltung_id = " . $veranstaltungId . " LIMIT 1;"; + $db->setQuery($query); + $aktualisieren_ab_datum = $db->loadResult(); + + // Funktionen mit korrekten Parametern aufrufen + wannGespieltAktualisieren(); + eloAktualisieren($aktualisieren_ab_datum); + einstufungAktualisieren(); + } + + $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(); @@ -11122,6 +11243,24 @@ 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 = " . $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,user_id,eingetragen)" + . "\n VALUES (NULL,$id,11,$team_id,$user_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' : '')); @@ -12678,6 +12817,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()) { 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(); 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 } ?>
+
+ 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'), + 12 => Text::_('COM_SPORTSMANAGER_MATCH_REPORT_DELETED'), + 13 => Text::_('COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED'), default => Text::_('COM_SPORTSMANAGER_PROPOSED_APPOINTMENT'), }; ?> @@ -11562,6 +11577,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void ?> /> + class="button" /> + - + "/> @@ -12020,7 +12037,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 eb72b6a..e93e999 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -1092,4 +1092,10 @@ COM_SPORTSMANAGER_MATCH_TYPE="Spielform" COM_SPORTSMANAGER_REALLY_REMOVE_HALL_OF_FAME_YEAR="Willst Du wirklich dieses Hall of Fame Jahr löschen?" COM_SPORTSMANAGER_YEARS="Jahre" COM_SPORTSMANAGER_ADD_HALL_OF_FAME_YEAR="Hall of Fame Jahr hinzufügen" -COM_SPORTSMANAGER_NO_ENTRY="kein Eintrag" \ No newline at end of file +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_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 ff6434f..c4eb5f9 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -1092,4 +1092,10 @@ COM_SPORTSMANAGER_MATCH_TYPE="Game Type" COM_SPORTSMANAGER_REALLY_REMOVE_HALL_OF_FAME_YEAR="Are you sure you want to delete this Hall of Fame year?" COM_SPORTSMANAGER_YEARS="Years" COM_SPORTSMANAGER_ADD_HALL_OF_FAME_YEAR="Add Hall of Fame Year" -COM_SPORTSMANAGER_NO_ENTRY="no entry" \ No newline at end of file +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" +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!" +COM_SPORTSMANAGER_MATCH_REPORT_CORRECTED="Match report corrected" \ No newline at end of file