From 4686f5d8db2c2587da6ba72bd8dc8d30bc4b7ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Mon, 29 Dec 2025 12:44:50 +0100 Subject: [PATCH] Liste Spielverlegungen in Frontend --- .../de-DE/de-DE.com_sportsmanager.sys.ini | 3 +- .../en-GB/en-GB.com_sportsmanager.sys.ini | 3 +- .../com_sportsmanager/sportsmanager.php | 92 +++++++++++- .../views/sportsmanager/tmpl/default.xml | 1 + .../views/sportsmanager/view.html.php | 141 ++++++++++++++---- .../de-DE/de-DE.com_sportsmanager.ini | 5 +- .../en-GB/en-GB.com_sportsmanager.ini | 5 +- 7 files changed, 215 insertions(+), 35 deletions(-) diff --git a/src/structure/administrator/language/de-DE/de-DE.com_sportsmanager.sys.ini b/src/structure/administrator/language/de-DE/de-DE.com_sportsmanager.sys.ini index 15d6c3e..f83385e 100644 --- a/src/structure/administrator/language/de-DE/de-DE.com_sportsmanager.sys.ini +++ b/src/structure/administrator/language/de-DE/de-DE.com_sportsmanager.sys.ini @@ -21,12 +21,13 @@ COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TEAMS_JOINT="Mannschaften in gem COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CLUBS="Vereine" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_VENUES="Spielorte" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_APPOINTMENTS="Termine" +COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_MATCH_RESCHEDULING="Spielverlegungen" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE="Titel" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE_DESC="Titel, der im Fenster oben angezeigt wird" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION="Beschreibung" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION_DESC="Beschreibung, die unterhalb des Titels angezeigt wird (WICHTIG: Werden HTML-Tags verwendet, müssen auch Umlaute in HTML-Code angeben werden)" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES="Kategorien" -COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="Eine optionale Auswahl an durch Kommata getrennte Kategorienummern" +COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="Eine optionale Auswahl von Kategorienummern durch Kommata oder Spiegelstrich getrennt" COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_TITLE="Layout: Elo-Rangliste" COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_DESC="Auflistung der Spieler sortiert nach Elo-Wertung" COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_OPTION_ELO_RANKING="Elo-Rangliste" diff --git a/src/structure/administrator/language/en-GB/en-GB.com_sportsmanager.sys.ini b/src/structure/administrator/language/en-GB/en-GB.com_sportsmanager.sys.ini index 7b85a69..7d4373d 100644 --- a/src/structure/administrator/language/en-GB/en-GB.com_sportsmanager.sys.ini +++ b/src/structure/administrator/language/en-GB/en-GB.com_sportsmanager.sys.ini @@ -21,12 +21,13 @@ COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TEAMS_JOINT="Teams in joint list COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CLUBS="Clubs" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_VENUES="Venues" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_APPOINTMENTS="Appointments" +COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_MATCH_RESCHEDULING="Match reschedulings" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE="Title" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_TITLE_DESC="Title which will be shows on top" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION="Description" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_DESCRIPTION_DESC="Description that will be shows below the titel (IMPORTANT: if html tags are used, special characters must be maskeraded)" COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES="Categories" -COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="An optional selection of category numbers seperated by commas" +COM_SPORTSMANAGER_LAYOUT_GENERAL_CONTENT_OPTION_CATEGORIES_DESC="An optional selection of category numbers seperated by commas or bullet point" COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_TITLE="Layout: elo ranking" COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_DESC="Listing of players sorted by elo rating" COM_SPORTSMANAGER_LAYOUT_ELO_RANKING_OPTION_ELO_RANKING="Elo ranking" diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index e6bc4fa..35540a5 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -1038,6 +1038,8 @@ if ($task == "spielerbild") { adminTermine(0); break; } +} else if ($content == 'spielverlegungen') { + spielverlegungen(); } else if ($content == 'login') { userAuth(); } else if ($content == 'login_refresh') { @@ -4094,6 +4096,85 @@ function spielort(): void HTML_sportsmanager::iCalBegegnungen(SportsManagerURL('&task=spielort_begegnungen_ical&id=' . $id)); } +function spielverlegungen(): void +{ + $db = getDatabase(); + global $params; + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + $filter_status = $jInput->get('filter_status', '', 'RAW'); + + if (empty($filter_status)) + $filter_status = "offen,genehmigt,abgelehnt"; + +$query = "SELECT" + . "\n t1.begegnung_id, t1.beantragt, t1.Begruendung AS Begruendung_beantragt, t1.Termin_alt," + . "\n t2.genehmigt, t2.Termin_neu, t2.Begruendung AS Begruendung_genehmigt," + . "\n t3.abgelehnt, t3.Begruendung AS Begruendung_abgelehnt," + . "\n t5.teamname AS Heim, t6.teamname AS Gast, t7.bezeichnung AS Liga, t8.teamname AS beantragt_von," + + // Ermittlung Status + . "\n CASE" + . "\n WHEN t3.abgelehnt IS NOT NULL AND (t2.genehmigt IS NULL OR t3.abgelehnt > t2.genehmigt)" + . "\n THEN 'abgelehnt'" + . "\n WHEN t2.genehmigt IS NOT NULL" + . "\n THEN 'genehmigt'" + . "\n ELSE 'offen'" + . "\n END AS status" + + // Beantragt + . "\n FROM (" + . "\n SELECT begegnung_id," + . "\n MIN(eingetragen) AS beantragt," + . "\n MIN(zeitpunkt) AS Termin_alt," + . "\n MAX(kommentar) AS Begruendung," + . "\n MAX(team_id) AS team_id" + . "\n FROM #__sportsmanager_begegnung_historie" + . "\n WHERE aktion IN (2,3)" + . "\n GROUP BY begegnung_id" + . "\n ) AS t1" + + // Genehmigt + . "\n LEFT JOIN (" + . "\n SELECT begegnung_id," + . "\n MAX(eingetragen) AS genehmigt," + . "\n MAX(zeitpunkt) AS Termin_neu," + . "\n MAX(kommentar) AS Begruendung" + . "\n FROM #__sportsmanager_begegnung_historie" + . "\n WHERE aktion = 1" + . "\n GROUP BY begegnung_id" + . "\n ) AS t2 ON t2.begegnung_id = t1.begegnung_id" + + // Abgelehnt + . "\n LEFT JOIN (" + . "\n SELECT begegnung_id," + . "\n MAX(eingetragen) AS abgelehnt," + . "\n MAX(kommentar) AS Begruendung" + . "\n FROM #__sportsmanager_begegnung_historie" + . "\n WHERE aktion = 10" + . "\n GROUP BY begegnung_id" + . "\n ) AS t3 ON t3.begegnung_id = t1.begegnung_id" + + // Sonstige Infos + . "\n LEFT JOIN #__sportsmanager_begegnung AS t4 ON t4.begegnung_id = t1.begegnung_id" + . "\n LEFT JOIN #__sportsmanager_team AS t5 ON t5.team_id = t4.heim_team_id" + . "\n LEFT JOIN #__sportsmanager_team AS t6 ON t6.team_id = t4.gast_team_id" + . "\n LEFT JOIN #__sportsmanager_veranstaltung AS t7 ON t7.veranstaltung_id = t5.veranstaltung_id" + . "\n LEFT JOIN #__sportsmanager_team AS t8 ON t8.team_id = t1.team_id" + + // Filter + . "\n " . kategorieFilter("WHERE t7.kategorie IN") + . "\n HAVING status in ('" . str_replace(",", "','", $filter_status) . "')" + . "\n ORDER BY t1.beantragt DESC;"; + + $spielverlegungen = loadObjectList($db, $query); + + if (isJson()) { + echo json_encode($spielverlegungen); + } else { + HTML_sportsmanager::spielverlegungen($params->get('titel'), $params->get('beschreibung'), $spielverlegungen); + } +} + function begegnungSpielplan($teamansicht = false): void { $db = getDatabase(); @@ -4280,7 +4361,11 @@ function begegnungVerlegenForm(): void die("Missing id!"); $aus_uebersicht = $jInput->get('aus_uebersicht', 0, 'INT'); - $query = "SELECT #__sportsmanager_veranstaltung.*, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage, termine_minimal, termine_maximal, ablehnen FROM #__sportsmanager_veranstaltung LEFT JOIN #__sportsmanager_verschieberegel USING (verschieberegel_id) WHERE veranstaltung_id = $veranstaltungid"; + $query = "SELECT #__sportsmanager_veranstaltung.*, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage," + . "\n termine_minimal, termine_maximal, ablehnen, begruendung_erforderlich" + . "\n FROM #__sportsmanager_veranstaltung LEFT JOIN #__sportsmanager_verschieberegel USING (verschieberegel_id)" + . "\n WHERE veranstaltung_id = $veranstaltungid"; + $rows = loadObjectList($db, $query); if (count($rows) < 1) die("Wrong id!"); @@ -4364,6 +4449,7 @@ function begegnungVerlegen(): void $aus_uebersicht = $jInput->get('aus_uebersicht', 0, 'INT'); $angefordert = $jInput->get('anfordern', false, 'BOOL'); $abgelehnt = $jInput->get('ablehnen', false, 'BOOL'); + $verlegungsgrund = $jInput->get('verlegungsgrund', '', 'RAW'); if ($jInput->get('cancel', false, 'BOOL')) { redirectSportsManagerURL('&task=' . ($aus_uebersicht ? 'veranstaltungen' : 'veranstaltung') . '&veranstaltungid=' . $veranstaltungId); @@ -4431,7 +4517,7 @@ function begegnungVerlegen(): void $aktueller_zeitpunkt = date('Y-m-d H:i:s'); if (count($verlegen_aktionen) == 0 || $verlegen_aktionen[0]->aktion == 1 || $verlegen_aktionen[0]->aktion == 5 || $verlegen_aktionen[0]->aktion == 10) { $query = "INSERT INTO #__sportsmanager_begegnung_historie (begegnung_id, aktion, zeitpunkt, user_id, team_id, verantwortlich_team_id, kommentar, eingetragen)" - . "\n VALUES ($id, 2, '$begegnung->zeitpunkt', NULL, NULL, NULL, NULL, '$aktueller_zeitpunkt');"; + . "\n VALUES ($id, 2, '$begegnung->zeitpunkt', '$user_id', '$vorschlagendes_team_id', '" . ($vorschlagendes_team_id == $begegnung->heim_team_id ? $begegnung->gast_team_id : $begegnung->heim_team_id) . "', '$verlegungsgrund', '$aktueller_zeitpunkt');"; $db->setQuery($query); if (!$db->execute()) { abortWithError($db->stderr(true)); @@ -4440,7 +4526,7 @@ function begegnungVerlegen(): void if ($angefordert) { $query = "INSERT INTO #__sportsmanager_begegnung_historie (begegnung_id, aktion, zeitpunkt, user_id, team_id, verantwortlich_team_id, kommentar, eingetragen)" - . "\n VALUES ($id, 3, NULL, '$user_id', '$vorschlagendes_team_id', '" . ($vorschlagendes_team_id == $begegnung->heim_team_id ? $begegnung->gast_team_id : $begegnung->heim_team_id) . "', NULL, '$aktueller_zeitpunkt');"; + . "\n VALUES ($id, 3, NULL, '$user_id', '$vorschlagendes_team_id', '" . ($vorschlagendes_team_id == $begegnung->heim_team_id ? $begegnung->gast_team_id : $begegnung->heim_team_id) . "', '$verlegungsgrund', '$aktueller_zeitpunkt');"; $db->setQuery($query); if (!$db->execute()) { abortWithError($db->stderr(true)); diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/tmpl/default.xml b/src/structure/components/com_sportsmanager/views/sportsmanager/tmpl/default.xml index dcc238d..abbb926 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/tmpl/default.xml +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/tmpl/default.xml @@ -24,6 +24,7 @@ + + +
+
+ + + + +
") ? $beschreibung : htmlentities_utf8($beschreibung); ?>
+
+ +
+ + + + + + + + + 0) { + $k = 0; + foreach ($rows as $row) { + ?> + + + + + + + + +
+ ", $row->Termin_alt); ?> + + Liga); ?> + + Heim == $row->beantragt_von) + echo "" . htmlentities_utf8($row->Heim) . ""; + else + echo htmlentities_utf8($row->Heim); + echo "
"; + if ($row->Gast == $row->beantragt_von) + echo "" . htmlentities_utf8($row->Gast) . ""; + else + echo htmlentities_utf8($row->Gast); + ?> +
+ ", $row->Termin_neu); ?> + + Begruendung_beantragt); ?> +
+   + = termine_minimal; } + begruendung_erforderlich && empty($verlegen_aktionen)){ ?> + + + + + + + + termine_maximal == 0 ? 3 : $veranstaltung->termine_maximal; for ($termin = 1; $termin <= count($termine); - $termin++) { - ?> - - - - . : - - - zeitpunkt)); ?> - - - - kommentar)) { + $termin++) { ?> - - - : - - - kommentar); ?> - - - + + + . : + + + zeitpunkt)); ?> + + + + kommentar)) { + ?> + + + : + + + kommentar); ?> + + + 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 9999cf4..b7e3a21 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -1059,4 +1059,7 @@ COM_SPORTSMANAGER_BILL_ISSUER="Rechnung erstellt" COM_SPORTSMANAGER_MULTIPLIER="Multiplikator" COM_SPORTSMANAGER_ADDITIONAL_INFORMATION="Weitere Angaben" COM_SPORTSMANAGER_EMAIL_WAS_SEND="Die E-Mail wurde erfolgreich versendet" -COM_SPORTSMANAGER_EMAIL_WAS_NOT_SEND="Die E-Mail wurde nicht versendet" \ No newline at end of file +COM_SPORTSMANAGER_EMAIL_WAS_NOT_SEND="Die E-Mail wurde nicht versendet" +COM_SPORTSMANAGER_OLD_DATE="Alter Termin" +COM_SPORTSMANAGER_NEW_DATE="Neuer Termin" +COM_SPORTSMANAGER_REASON_GAME_APPOINTMENT="Verlegungsgrund" \ 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 e1db513..ff21948 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -1059,4 +1059,7 @@ COM_SPORTSMANAGER_BILL_ISSUER="Bill issuer" COM_SPORTSMANAGER_MULTIPLIER="Multiplier" COM_SPORTSMANAGER_ADDITIONAL_INFORMATION="Additional information" COM_SPORTSMANAGER_EMAIL_WAS_SEND="E-Mail was succesfully sent" -COM_SPORTSMANAGER_EMAIL_WAS_NOT_SEND="E-Mail was not sent" \ No newline at end of file +COM_SPORTSMANAGER_EMAIL_WAS_NOT_SEND="E-Mail was not sent" +COM_SPORTSMANAGER_OLD_DATE="Old Date" +COM_SPORTSMANAGER_NEW_DATE="New Date" +COM_SPORTSMANAGER_REASON_GAME_APPOINTMENT="Appointment reason" \ No newline at end of file