From db80f584cd2828716d0e914b923b9a6431fda8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Meyer?= Date: Thu, 25 Dec 2025 13:20:54 +0100 Subject: [PATCH] Verschiebereln erweitert. Kategoriefilter optimiert. --- .../components/com_sportsmanager/admin.php | 14 +- .../com_sportsmanager/database/update.php | 21 + .../components/com_sportsmanager/tools.php | 46 +- .../views/sportsmanager/view.html.php | 480 +++++++++--------- .../views/sportsmanager/view_admin.php | 310 ++++++----- .../de-DE/de-DE.com_sportsmanager.ini | 3 + .../en-GB/en-GB.com_sportsmanager.ini | 3 + 7 files changed, 490 insertions(+), 387 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index b8fd46a..b841c72 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -4601,6 +4601,9 @@ function adminEditVerschiebenModus(): void $termine_minimal = $jInput->get('termine_minimal', 1, 'INT'); $termine_maximal = $jInput->get('termine_maximal', 3, 'INT'); $ablehnen = $jInput->get('ablehnen', 0, 'INT'); + $begruendung_erforderlich = $jInput->get('begruendung_erforderlich', 0, 'INT'); + $vereine_berechtigt = $jInput->get('vereine_berechtigt', 0, 'INT'); + $verband_berechtigt = $jInput->get('verband_berechtigt', 0, 'INT'); if ($termine_minimal > 0 && $termine_maximal > 0 && $termine_minimal > $termine_maximal) { $t = $termine_minimal; @@ -4609,7 +4612,11 @@ function adminEditVerschiebenModus(): void } if ($id == 0) - $query = "INSERT INTO #__sportsmanager_verschieberegel (bezeichnung, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage, termine_minimal, termine_maximal, ablehnen) VALUES ('$bezeichnung', '$initial_ohne_termin', '$keine_gegenvorschlaege', '$vorlaufzeit_tage', '$termine_minimal', '$termine_maximal', '$ablehnen');"; + $query = "INSERT INTO #__sportsmanager_verschieberegel" + . "\n (bezeichnung, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage, termine_minimal," + . "\n termine_maximal, ablehnen, begruendung_erforderlich, vereine_berechtigt, verband_berechtigt)" + . "\n VALUES ('$bezeichnung', '$initial_ohne_termin', '$keine_gegenvorschlaege', '$vorlaufzeit_tage', '$termine_minimal'," + . "\n '$termine_maximal', '$ablehnen', '$begruendung_erforderlich', '$vereine_berechtigt', '$verband_berechtigt');"; else { $query = "UPDATE #__sportsmanager_verschieberegel" . "\n SET bezeichnung = '$bezeichnung'," @@ -4618,7 +4625,10 @@ function adminEditVerschiebenModus(): void . "\n vorlaufzeit_tage = '$vorlaufzeit_tage'," . "\n termine_minimal = '$termine_minimal'," . "\n termine_maximal = '$termine_maximal'," - . "\n ablehnen = '$ablehnen'" + . "\n ablehnen = '$ablehnen'," + . "\n begruendung_erforderlich = '$begruendung_erforderlich'," + . "\n vereine_berechtigt = '$vereine_berechtigt'," + . "\n verband_berechtigt = '$verband_berechtigt'" . "\n WHERE verschieberegel_id = $id"; } $db->setQuery($query); diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php index c45acc4..7be5f42 100644 --- a/src/structure/components/com_sportsmanager/database/update.php +++ b/src/structure/components/com_sportsmanager/database/update.php @@ -5516,6 +5516,27 @@ function updateDatabase(): void } } + if ($datenbank_version < 115) { + + // Erweiterung Tabelle #__sportsmanager_verschieberegel + $query = "ALTER TABLE `#__sportsmanager_verschieberegel`" + ."\n ADD COLUMN IF NOT EXISTS `begruendung_erforderlich` INT(1) NOT NULL DEFAULT 0 AFTER `ablehnen`," + ."\n ADD COLUMN IF NOT EXISTS `vereine_berechtigt` INT(1) NOT NULL DEFAULT 1 AFTER `begruendung_erforderlich`," + ."\n ADD COLUMN IF NOT EXISTS `verband_berechtigt` INT(1) NOT NULL DEFAULT 0 AFTER `vereine_berechtigt`;"; + $db->setQuery($query); + if (!$db->execute()) { + die($db->stderr(true)); + } + + $query = "UPDATE #__sportsmanager_einstellungen" + . "\n SET wert = '115'" + . "\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/tools.php b/src/structure/components/com_sportsmanager/tools.php index 7f6beea..cfbeaad 100644 --- a/src/structure/components/com_sportsmanager/tools.php +++ b/src/structure/components/com_sportsmanager/tools.php @@ -185,17 +185,45 @@ function individualwettbewerbFilter($prefix): string function kategorieFilter($prefix, $suffix = ""): string { global $params; + $kategorien = explode(",", $params->get('kategorien')); - $filter = ""; - foreach ($kategorien as $s) { - $kategorie = intval(trim($s)); - if ($kategorie == 0) - continue; - if (!empty($filter)) - $filter .= ", "; - $filter .= $kategorie; + $result = []; + + foreach ($kategorien as $item) { + $item = trim($item); + if ($item === '') continue; + + // Prüfen, ob es ein Bereich ist + if (strpos($item, '-') !== false) { + $rangeParts = explode('-', $item); + + // genau 2 Teile für einen gültigen Bereich + if (count($rangeParts) !== 2) continue; + + $start = intval(trim($rangeParts[0])); + $end = intval(trim($rangeParts[1])); + + if ($start <= 0 || $end <= 0 || $start > $end) continue; + + for ($i = $start; $i <= $end; $i++) { + $result[$i] = true; // Duplikate vermeiden + } + } else { + $num = intval($item); + if ($num > 0) { + $result[$num] = true; + } + } } - return empty($filter) ? "" : (" " . $prefix . " (" . $filter . ") " . $suffix); + + if (empty($result)) { + return ""; + } + + $filter = array_keys($result); + sort($filter, SORT_NUMERIC); + + return " $prefix (" . implode(", ", $filter) . ") $suffix"; } function turnierFilter($prefix): string 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 6119d89..18edd2f 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -5122,253 +5122,245 @@ function begegnungVerlegen($veranstaltung, $begegnung, $heim_team, $gast_team, $
- +
- + + + aktion == 1 || $aktion->aktion == 5 || $aktion->aktion == 10) // akzeptiert, von Moderator eingetragen oder Verschiebung abgelehnt + break; + $letzte_verlegung_aktionen[] = $aktion; + } + + $termine = array(); + if (count($letzte_verlegung_aktionen) > 0) { + $eingetragen = $letzte_verlegung_aktionen[0]->eingetragen; + foreach ($letzte_verlegung_aktionen as $aktion) { + if ($aktion->eingetragen != $eingetragen || ($aktion->aktion != 0) || $aktion->zeitpunkt == null) // aktion == 1 <=> Akzeptiert + break; + $termine[] = $aktion; + } + } + + $berechtigt_anfordern = $veranstaltung->initial_ohne_termin != 1 && (count($letzte_verlegung_aktionen) == 0 || $letzte_verlegung_aktionen[0]->aktion == 1); + $berechtigt_vorschlagen = ($veranstaltung->initial_ohne_termin != 2 || (count($letzte_verlegung_aktionen) != 0 && $letzte_verlegung_aktionen[0]->aktion != 1)) && (!$veranstaltung->keine_gegenvorschlaege || count($letzte_verlegung_aktionen) == 0 || $letzte_verlegung_aktionen[0]->aktion != 3 || $letzte_verlegung_aktionen[0]->team_id != $vorschlagendes_team_id) && (count($termine) == 0 || !$veranstaltung->keine_gegenvorschlaege || $letzte_verlegung_aktionen[0]->team_id == $vorschlagendes_team_id); + $berechtigt_ablehnen = count($letzte_verlegung_aktionen) != 0 && ($letzte_verlegung_aktionen[0]->aktion == 0 || $letzte_verlegung_aktionen[0]->aktion == 3 || $letzte_verlegung_aktionen[0]->aktion == 4) && ((($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 3) && $berechtigt_fuer_akzeptieren) || (($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 2) && $berechtigt_vorschlagen)); + + if ($berechtigt_vorschlagen) { + $anzahl_moegliche_termine = $veranstaltung->termine_maximal == 0 ? 3 : $veranstaltung->termine_maximal; + ?> + + + + + + + kommentar)) { + ?> + + + + + + + + + + termine_maximal == 0 ? 3 : $veranstaltung->termine_maximal; + for ($termin = 1; + $termin <= count($termine); + $termin++) { + ?> + + + + + kommentar)) { + ?> + + + + +
-
- - - - - - - aktion == 1 || $aktion->aktion == 5 || $aktion->aktion == 10) // akzeptiert, von Moderator eingetragen oder Verschiebung abgelehnt - break; - $letzte_verlegung_aktionen[] = $aktion; - } - - $termine = array(); - if (count($letzte_verlegung_aktionen) > 0) { - $eingetragen = $letzte_verlegung_aktionen[0]->eingetragen; - foreach ($letzte_verlegung_aktionen as $aktion) { - if ($aktion->eingetragen != $eingetragen || ($aktion->aktion != 0) || $aktion->zeitpunkt == null) // aktion == 1 <=> Akzeptiert - break; - $termine[] = $aktion; - } - } - - $berechtigt_anfordern = $veranstaltung->initial_ohne_termin != 1 && (count($letzte_verlegung_aktionen) == 0 || $letzte_verlegung_aktionen[0]->aktion == 1); - $berechtigt_vorschlagen = ($veranstaltung->initial_ohne_termin != 2 || (count($letzte_verlegung_aktionen) != 0 && $letzte_verlegung_aktionen[0]->aktion != 1)) && (!$veranstaltung->keine_gegenvorschlaege || count($letzte_verlegung_aktionen) == 0 || $letzte_verlegung_aktionen[0]->aktion != 3 || $letzte_verlegung_aktionen[0]->team_id != $vorschlagendes_team_id) && (count($termine) == 0 || !$veranstaltung->keine_gegenvorschlaege || $letzte_verlegung_aktionen[0]->team_id == $vorschlagendes_team_id); - $berechtigt_ablehnen = count($letzte_verlegung_aktionen) != 0 && ($letzte_verlegung_aktionen[0]->aktion == 0 || $letzte_verlegung_aktionen[0]->aktion == 3 || $letzte_verlegung_aktionen[0]->aktion == 4) && ((($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 3) && $berechtigt_fuer_akzeptieren) || (($veranstaltung->ablehnen == 1 || $veranstaltung->ablehnen == 2) && $berechtigt_vorschlagen)); - - if ($berechtigt_vorschlagen) { - $anzahl_moegliche_termine = $veranstaltung->termine_maximal == 0 ? 3 : $veranstaltung->termine_maximal; - ?> - - - - - - - kommentar)) { - ?> - - - - - - - - - - termine_maximal == 0 ? 3 : $veranstaltung->termine_maximal; - for ($termin = 1; - $termin <= count($termine); - $termin++) { - ?> - - - - - kommentar)) { - ?> - - - - - -
- : - - zeitpunkt != null ? FormatiertesDatum($begegnung->zeitpunkt) : "N/A"; ?> -
- - . : - - - - - - - - - - -
- : - - kommentar); ?> -
- - - -
- - . : - - zeitpunkt)); ?> - -
- : - - kommentar); ?> -
-
+
+ : + + zeitpunkt != null ? FormatiertesDatum($begegnung->zeitpunkt) : "N/A"; ?>
+ + . : + + + + + + + + + + +
+ : + + kommentar); ?> +
+ + + +
+ + . : + + zeitpunkt)); ?> + +
+ : + + kommentar); ?> +
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 0173690..bfad356 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -4978,139 +4978,185 @@ class HTML_sportsmanager_admin
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - -
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
  -
- -
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 647b965..9999cf4 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -886,6 +886,9 @@ COM_SPORTSMANAGER_INITIAL_APPOINTMENT_SUGGESTIONS="Initiale Terminvorschläg COM_SPORTSMANAGER_REQUESTING_TEAM="Beantragende Mannschaft" COM_SPORTSMANAGER_OPPONENT_TEAM="Gegnerische Mannschaft" COM_SPORTSMANAGER_AGAINST_PROPOSALS_ALLOWED="Gegensvorschläge zulässig" +COM_SPORTSMANAGER_REASON_REQUIRED="Begründung erforderlich" +COM_SPORTSMANAGER_CLUB_ENTITLEMENT="Berechtigung Vereine" +COM_SPORTSMANAGER_ASSOCIATION_ENTITLEMENT="Berechtigung Verband" COM_SPORTSMANAGER_LEAD_TIME="Vorlaufzeit" COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MINIMAL="Terminvorschläge minimal" COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MAXIMUM="Terminvorschläge maximal" 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 eddda13..e1db513 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -886,6 +886,9 @@ COM_SPORTSMANAGER_INITIAL_APPOINTMENT_SUGGESTIONS="Initial appointment suggestio COM_SPORTSMANAGER_REQUESTING_TEAM="Requesting team" COM_SPORTSMANAGER_OPPONENT_TEAM="Opponent team" COM_SPORTSMANAGER_AGAINST_PROPOSALS_ALLOWED="Against proposals allowed" +COM_SPORTSMANAGER_REASON_REQUIRED="Reason required" +COM_SPORTSMANAGER_CLUB_ENTITLEMENT="Club entitlement" +COM_SPORTSMANAGER_ASSOCIATION_ENTITLEMENT="Association_entitlement" COM_SPORTSMANAGER_LEAD_TIME="Lead time" COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MINIMAL="Appointment proposals minimal" COM_SPORTSMANAGER_APPOINTMENT_PROPOSALS_MAXIMUM="Appointment proposals maximum"