diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php
index cab859e..c783808 100644
--- a/src/structure/components/com_sportsmanager/admin.php
+++ b/src/structure/components/com_sportsmanager/admin.php
@@ -18,18 +18,25 @@ defined('_JEXEC') or die('Restricted access');
require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php';
require_once JPATH_SITE . '/components/com_sportsmanager/database/init.php';
-function UhrzeitWandlerDE($Zeitstempel): mixed
-{
- $Temp = explode(' ', $Zeitstempel);
- $Datum = $Temp[0];
- $Uhrzeit = $Temp[1];
- if (preg_match("/\d{2}\.\d{2}\.\d{4}/", $Datum)) {
- $Datum = substr($Datum, 6, 4) . "-" . substr($Datum, 3, 2) . "-" . substr($Datum, 0, 2);
- } else if (preg_match("/\d{4}-\d{2}-\d{2}/", $Datum)) {
- return $Zeitstempel;
- }
- return $Datum . " " . $Uhrzeit;
+function UhrzeitWandlerDE(string $input): string {
+ // mögliche Datumsformate
+ $formats = [
+ 'Y-m-d H:i',
+ 'd.m.Y H:i',
+ 'd.m.Y H:i:s',
+ ];
+ foreach ($formats as $format) {
+ $dt = DateTime::createFromFormat($format, $input);
+
+ // prüfen, ob Parsing erfolgreich war UND das Datum exakt passt
+ if ($dt && $dt->format($format) === $input) {
+ return $dt->format('Y-m-d H:i:s');
+ }
+ }
+
+ // falls kein bekanntes Format -> Original zurückgeben
+ return $input;
}
function validateDate($date, $format = 'Y-m-d H:i:s'): bool
@@ -38,6 +45,22 @@ function validateDate($date, $format = 'Y-m-d H:i:s'): bool
return $d && $d->format($format) == $date;
}
+function detectFileEncoding(string $filename): string {
+ $handle = fopen($filename, "r");
+ if (!$handle) {
+ throw new Exception("Datei konnte nicht geöffnet werden: $filename");
+ }
+
+ // Erstes Stück der Datei lesen (nicht alles, reicht für Erkennung)
+ $sample = fread($handle, 1000);
+ fclose($handle);
+
+ // Encoding bestimmen
+ $encoding = mb_detect_encoding($sample, ['UTF-8', 'ISO-8859-1', 'Windows-1252'], true);
+
+ return $encoding ?: 'UTF-8'; // Fallback auf UTF-8
+}
+
function adminUebersicht(): void
{
$db = getDatabase();
@@ -658,17 +681,15 @@ function adminEinstellungen(): void
$lizenz_anzeigen = $jInput->get('lizenz_anzeigen', 0, 'INT');
$anzahl_mitglieder_zeigen = $jInput->get('anzahl_mitglieder_zeigen', 0, 'INT');
$verband_anzeigen = $jInput->get('verband_anzeigen', 0, 'INT');
+ $spalte_mitglieder_zeigen = $jInput->get('spalte_mitglieder_zeigen', 0, 'INT');
$turnierbaum_zeigen = $jInput->get('turnierbaum_zeigen', 0, 'INT');
$termine_beantragen = $jInput->get('termine_beantragen', 0, 'INT');
+ $enableEmailReminders = $jInput->get('enable_email_reminders', 0, 'INT');
+
$spielerimport_persoenliche_daten_vorauswahl = $jInput->get('spielerimport_persoenliche_daten_vorauswahl', 0, 'INT');
$api_push_key = $jInput->get('api_push_key', '', 'RAW');
- /*
- $twitter_benutzername = $db->escape(trim( $jInput->get('twitter_benutzername', '', 'RAW') ));
- $twitter_kennwort = !empty($twitter_benutzername) ? $db->escape(trim( $jInput->get('twitter_kennwort', '', 'RAW') )) : "";
- */
-
$query = "REPLACE #__sportsmanager_einstellungen"
. "\n SET name = 'basis_spielernr'"
. ", wert = '$basis_spielernr'";
@@ -717,6 +738,14 @@ function adminEinstellungen(): void
die($db->stderr(true));
}
+ $query = "REPLACE #__sportsmanager_einstellungen"
+ . "\n SET name = 'spalte_mitglieder_zeigen'"
+ . ", wert = '$spalte_mitglieder_zeigen'";
+ $db->setQuery($query);
+ if (!$db->execute()) {
+ die($db->stderr(true));
+ }
+
$query = "REPLACE #__sportsmanager_einstellungen"
. "\n SET name = 'turnierbaum_zeigen'"
. ", wert = '$turnierbaum_zeigen'";
@@ -771,6 +800,12 @@ function adminEinstellungen(): void
die($db->stderr(true));
}
+ $query = "REPLACE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '$enableEmailReminders'";
+ $db->setQuery($query);
+ if (!$db->execute()) {
+ die($db->stderr(true));
+ }
+
redirectSportsManagerURL('&task=admin_uebersicht');
}
@@ -6448,7 +6483,6 @@ function adminEditMannschaft(): void
if ($id == 0) {
$query = "INSERT INTO #__sportsmanager_team (verein_id, veranstaltung_id, teamname, teamname_kurz, tischtyp, tischeigenschaften, heimspiel_wochentag, heimspiel_uhrzeit, heimspielort_id, nichtraucherschutz, zusatzpunkte" . ($veranstaltung->tabellenwertung == -2 ? ", platz" : "") . ", pin)"
. "\n VALUES (" . ($verein_id != 0 ? "'$verein_id'" : "NULL") . ", '$veranstaltungId', '$teamname', '$teamname_kurz', '$tischtyp', '$tischeigenschaften', '$heimspiel_wochentag', '$heimspiel_uhrzeit', " . ($heimspielort_id != 0 ? "'$heimspielort_id'" : "NULL") . ", '$nichtraucherschutz', '$zusatzpunkte'" . ($veranstaltung->tabellenwertung == -2 ? ($platz != 0 ? ", '$platz'" : ", NULL") : "") . ", '$pin');";
- echo $query;
$db->setQuery($query);
if (!$db->execute()) {
die($db->stderr(true));
@@ -8319,7 +8353,7 @@ function adminSaveBegegnungSpielplan(): void
}
if ($zwischenergebnis) {
- $query = "INSERT INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, zwischenergebnis, kommentar, vorgeschlagen)"
+ $query = "INSERT IGNORE INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, zwischenergebnis, kommentar, vorgeschlagen)"
. "\n VALUES ('$id', " . ($bestaetigen != 0 ? "'$vorschlagendes_team_id'" : "'0'") . ", '1', '$kommentar', now());";
$db->setQuery($query);
if (!$db->execute()) {
@@ -8333,7 +8367,7 @@ function adminSaveBegegnungSpielplan(): void
abortWithError($db->stderr(true));
}
} else if ($bestaetigen != 0) {
- $query = "INSERT INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, kommentar, vorgeschlagen)"
+ $query = "INSERT IGNORE INTO #__sportsmanager_unbestaetigtes_ergebnis (begegnung_id, vorschlagendes_team_id, kommentar, vorgeschlagen)"
. "\n VALUES ('$id', '$vorschlagendes_team_id', '$kommentar', now());";
$db->setQuery($query);
if (!$db->execute()) {
@@ -9491,6 +9525,8 @@ function adminBegegnungenImportieren(): void
redirectSportsManagerURL('&task=admin_spieler', Text::_('COM_SPORTSMANAGER_NO_FILE_SPECIFIED'));
}
+ $encoding = detectFileEncoding($_FILES["daten"]["tmp_name"]);
+
$handle = fopen($_FILES["daten"]["tmp_name"], "r");
if (!$handle) {
redirectSportsManagerURL('&task=admin_spieler', Text::_('COM_SPORTSMANAGER_COULD_NOT_OPEN_FILE'));
@@ -9512,6 +9548,7 @@ function adminBegegnungenImportieren(): void
$Titelzeile = null;
$import_zeile = false;
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
+ if (empty($data[0])){continue;}
if ($Zeile == 1) {
foreach($data as $spalte_nr => $spalte)
{
@@ -9520,7 +9557,7 @@ function adminBegegnungenImportieren(): void
if (vergleich($spalte,"heim,heimteam,heimmannschaft")) $Titelzeile['Heim'] = $spalte_nr;
if (vergleich($spalte,"gast,gastteam,gastmannschaft")) $Titelzeile['Gast'] = $spalte_nr;
if (vergleich($spalte,"spielnr,spielnummer")) $Titelzeile['Spiel_Nr'] = $spalte_nr;
- if (vergleich($spalte,"spieltagtitel")) $Titelzeile['Spieltag_Titel'] = $spalte_nr;
+ if (vergleich($spalte,"spieltagtitel,spieltitel")) $Titelzeile['Spieltag_Titel'] = $spalte_nr;
if (vergleich($spalte,"jahr,spieljahr")) $Titelzeile['Spieljahr'] = $spalte_nr;
if (vergleich($spalte,"kalenderwoche,woche,kw")) $Titelzeile['Kalenderwoche'] = $spalte_nr;
}
@@ -9529,10 +9566,16 @@ function adminBegegnungenImportieren(): void
$bgcolor = "green";
$Begegnung[$Zeile]['spieltag'] = $data[$Titelzeile['Spieltag_Nr']];
$Begegnung[$Zeile]['zeitpunkt'] = UhrzeitWandlerDE($data[$Titelzeile['Spielstart']]);
- $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[$data[$Titelzeile['Heim']]]['team_id'];
- $Begegnung[$Zeile]['gast_team_id'] = $Mannschaften[$data[$Titelzeile['Gast']]]['team_id'];
+ if ($encoding == "UTF-8"){
+ $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[$data[$Titelzeile['Heim']]]['team_id'];
+ $Begegnung[$Zeile]['gast_team_id'] = $Mannschaften[$data[$Titelzeile['Gast']]]['team_id'];
+ if (isset($data[$Titelzeile['Spieltag_Titel']])) $Begegnung[$Zeile]['spieltag_titel'] = $data[$Titelzeile['Spieltag_Titel']];
+ } else {
+ $Begegnung[$Zeile]['heim_team_id'] = $Mannschaften[utf8_encode($data[$Titelzeile['Heim']])]['team_id'];
+ $Begegnung[$Zeile]['gast_team_id'] = $Mannschaften[utf8_encode($data[$Titelzeile['Gast']])]['team_id'];
+ if (isset($data[$Titelzeile['Spieltag_Titel']])) $Begegnung[$Zeile]['spieltag_titel'] = utf8_encode($data[$Titelzeile['Spieltag_Titel']]);
+ }
if (isset($data[$Titelzeile['Spiel_Nr']])) $Begegnung[$Zeile]['spiel_nr'] = $data[$Titelzeile['Spiel_Nr']];
- if (isset($data[$Titelzeile['Spieltag_Titel']])) $Begegnung[$Zeile]['spieltag_titel'] = $data[$Titelzeile['Spieltag_Titel']];
echo "
";
if ($Begegnung[$Zeile]['spieltag'] > 99 or $Begegnung[$Zeile]['spieltag'] < 1) {
$bgcolor = "red";
@@ -9552,7 +9595,6 @@ function adminBegegnungenImportieren(): void
$Mannschaften[$data[$Titelzeile['Heim']]]['heimspiel_uhrzeit']);
}
- $Begegnung[$Zeile]['zeitpunkt'] = $data[$Titelzeile['Spielstart']];
if (!validateDate($Begegnung[$Zeile]['zeitpunkt'])) {
$bgcolor = "red";
$import = false;
@@ -9572,7 +9614,12 @@ function adminBegegnungenImportieren(): void
} else {
$bgcolor = "green";
}
- echo "| " . $data[$Titelzeile['Heim']] . " | ";
+ echo "";
+ if ($encoding == "UTF-8")
+ echo $data[$Titelzeile['Heim']];
+ else
+ echo utf8_encode($data[$Titelzeile['Heim']]);
+ echo " | ";
if ($Begegnung[$Zeile]['gast_team_id'] == "") {
if ($data[$Titelzeile['Gast']] == "spielfrei") {
$bgcolor = "orange";
@@ -9584,7 +9631,12 @@ function adminBegegnungenImportieren(): void
} else {
$bgcolor = "green";
}
- echo "" . $data[$Titelzeile['Gast']] . " | ";
+ echo "";
+ if ($encoding == "UTF-8")
+ echo $data[$Titelzeile['Gast']];
+ else
+ echo utf8_encode($data[$Titelzeile['Gast']]);
+ echo " | ";
echo "
";
}
if (!$import_zeile) {
@@ -9592,6 +9644,7 @@ function adminBegegnungenImportieren(): void
}
$Zeile++;
}
+ echo "| Dateiformat: $encoding |
";
echo "";
fclose($handle);
@@ -9818,7 +9871,12 @@ function adminBegegnungenPokalrundeAuslosenForm(): void
. "\n ORDER BY spieltag DESC";
$veranstaltung->nicht_abgeschlossene_spiele = loadResult($db, $query);
- HTML_sportsmanager_admin::adminBegegnungenPokalrundeAuslosenForm($veranstaltung,getAuswahlSpieltagtitel());
+ $query = "SELECT *"
+ . "\n FROM #__sportsmanager_spielort"
+ . "\n ORDER BY ortsname, name, ortsteil";
+ $spielorte = loadObjectList($db, $query);
+
+ HTML_sportsmanager_admin::adminBegegnungenPokalrundeAuslosenForm($veranstaltung,getAuswahlSpieltagtitel(),$spielorte);
}
#[NoReturn] function adminBegegnungenPokalrundeAuslosen(): void
@@ -9828,6 +9886,7 @@ function adminBegegnungenPokalrundeAuslosenForm(): void
$sperren = false;
$veranstaltungId = $jInput->get('veranstaltungid', 0, 'INT');
+ $spielort_id = $jInput->get('spielort_id', 0, 'INT');
$rundenNr = $jInput->get('runde', 0, 'INT');
$rundenTitel = $jInput->get('rundentitel', 0, 'STRING');
$spielumplatz3 = $jInput->get('spielumplatz3', 0, 'INT');
@@ -9978,7 +10037,7 @@ function adminBegegnungenPokalrundeAuslosenForm(): void
$query .= "('" . $match['zeitpunkt'] . "', " . $rundenNr .
", '" . $match['rundentitel'] . "', " . $key .
", '" . $match['heim'] . "', '" . $match['gast'] . "'" .
- ", " . ($match['heimspielort_id'] != 0 ? "'" . $match['heimspielort_id'] . "'" : "NULL") . ")";
+ ", " . ($spielort_id != 0 ? "'" . $spielort_id . "'" : "NULL") . ")";
}
$query .= "; ";
$db->setQuery($query);
@@ -10007,9 +10066,11 @@ function adminBegegnungenPokalrundeAuslosenForm(): void
$sperren = false;
$veranstaltungId = $jInput->get('veranstaltungid', 0, 'INT');
+ $spielort_id = $jInput->get('spielort_id', 0, 'INT');
$rundenNr = $jInput->get('runde', 0, 'INT');
$rundenTitel = $jInput->get('rundentitel', 0, 'STRING');
$spielumplatz3 = $jInput->get('spielumplatz3', 0, 'INT');
+ $heimrecht_losen = $jInput->get('heimrecht_losen', 0, 'INT');
if ($veranstaltungId == 0) die("Missing id!");
@@ -10159,12 +10220,22 @@ function adminBegegnungenPokalrundeAuslosenForm(): void
$matches[2]['rundentitel'] = "Spiel um Platz 3";
}
+ if ($heimrecht_losen)
+ {
+ foreach ($matches as $key => $match) {
+ if (random_int(0, 1) === 1) {
+ $tmp = $matches[$key]['heim'];
+ $matches[$key]['heim'] = $matches[$key]['gast'];
+ $matches[$key]['gast'] = $tmp;
+ }
+ }
+ }
+
$Fehlertext = "";
foreach($matches AS $spiel_nr => $match)
{
$matches[$spiel_nr]['rundentitel'] = $matches[$spiel_nr]['rundentitel'] ?? $rundenTitel;
$matches[$spiel_nr]['zeitpunkt'] = $zeitpunkt;
- $matches[$spiel_nr]['heimspielort_id'] = $teams[$teams_setzliste[$setzung[0]]]['heimspielort_id'];
$team_heim = $match['heim'];
if ($datum_kw != null && $teams[$team_heim]['heimspiel_wochentag'] !== 0) {
$ts = getdate(mondaykw($datum_kw, $datum_jahr, $teams[$team_heim]['heimspiel_wochentag'] - 1));
@@ -10185,7 +10256,7 @@ function adminBegegnungenPokalrundeAuslosenForm(): void
$query .= "('" . $match['zeitpunkt'] . "', " . $rundenNr .
", '" . $match['rundentitel'] . "', " . $key .
", '" . $match['heim'] . "', '" . $match['gast'] . "'" .
- ", " . ($match['heimspielort_id'] != 0 ? "'" . $match['heimspielort_id'] . "'" : "NULL") . ")";
+ ", " . ($spielort_id != 0 ? "'" . $spielort_id . "'" : "NULL") . ")";
}
$query .= "; ";
$db->setQuery($query);
@@ -10538,6 +10609,7 @@ function adminEditTurnier(): void
$turnierort = $db->escape(trim($jInput->get('turnierort', '', 'RAW')));
$erster_tag = normalisiertesDatum(sprintf("%04d-%02d-%02d", $jInput->get('erster_tag_jahr', 2000, 'INT'), $jInput->get('erster_tag_monat', 1, 'INT'), $jInput->get('erster_tag_tag', 1, 'INT')));
$mehrtaegig = $jInput->get('mehrtaegig', 0, 'INT');
+ $reminder_count = $jInput->get('reminder_count', 0, 'INT');
if (!$mehrtaegig)
$letzter_tag = $erster_tag;
else
@@ -10561,7 +10633,20 @@ function adminEditTurnier(): void
}
if ($id == 0) {
- $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag" . ($letzter_tag != null ? ", letzter_tag" : "") . ", kategorie) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'" . ($letzter_tag != null ? ", '$letzter_tag'" : "") . ", '$kategorie');";
+ $query = $db->getQuery(true)
+ ->select('wert')
+ ->from('#__sportsmanager_einstellungen')
+ ->where('name = ' . $db->quote('enable_email_reminders'));
+ $remindersEnabled = loadResult($db, $query);
+
+ $query = "INSERT INTO #__sportsmanager_turnier (veranstalter_id, turnierbezeichnung, saison_id, turnierort, erster_tag"
+ . ($letzter_tag != null ? ", letzter_tag" : "")
+ . ", kategorie, reminder_count) VALUES ('$veranstalterId', '$turnierbezeichnung', '$saison_id', '$turnierort', '$erster_tag'"
+ . ($letzter_tag != null ? ", '$letzter_tag'" : "")
+ . ", '$kategorie', "
+ . (!$remindersEnabled ? "'3'" : "'0'")
+ . ")";
+
$db->setQuery($query);
if (!$db->execute()) {
die($db->stderr(true));
@@ -10575,7 +10660,8 @@ function adminEditTurnier(): void
. "\n turnierort = '$turnierort',"
. "\n erster_tag = '$erster_tag',"
. "\n letzter_tag = " . ($letzter_tag != null ? "'$letzter_tag'" : "NULL") . ","
- . "\n kategorie = '$kategorie'"
+ . "\n kategorie = '$kategorie',"
+ . "\n reminder_count = '$reminder_count'"
. "\n WHERE turnier_id = $id";
$db->setQuery($query);
if (!$db->execute()) {
diff --git a/src/structure/components/com_sportsmanager/database/update.php b/src/structure/components/com_sportsmanager/database/update.php
index 66dfd2c..ad54812 100644
--- a/src/structure/components/com_sportsmanager/database/update.php
+++ b/src/structure/components/com_sportsmanager/database/update.php
@@ -5291,6 +5291,80 @@ function updateDatabase(): void
}
}
+ if ($datenbank_version < 107) {
+
+ $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'anzahl_mitglieder_zeigen', wert = '0';";
+ $db->setQuery( $query );
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'verband_anzeigen', wert = '1';";
+ $db->setQuery( $query );
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'turnierbaum_zeigen', wert = '0';";
+ $db->setQuery( $query );
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spalte_mitglieder_zeigen', wert = '1';";
+ $db->setQuery( $query );
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ $query = "UPDATE #__sportsmanager_einstellungen"
+ . "\n SET wert = '107'"
+ . "\n WHERE name = 'datenbank_version'";
+ $db->setQuery($query);
+ if (!$db->execute()) {
+ die($db->stderr(true));
+ }
+ }
+
+ if ($datenbank_version < 108) {
+
+ $query = "DELETE t1 FROM #__sportsmanager_unbestaetigtes_ergebnis t1"
+ . "\n INNER JOIN #__sportsmanager_unbestaetigtes_ergebnis t2"
+ . "\n ON t1.begegnung_id = t2.begegnung_id"
+ . "\n AND t1.unbestaetigtes_ergebnis_id < t2.unbestaetigtes_ergebnis_id;";
+ $db->setQuery( $query );
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ $query = " ALTER TABLE `#__sportsmanager_unbestaetigtes_ergebnis`"
+ . "\n DROP INDEX `begegnung_id`, ADD UNIQUE `begegnung_id` (`begegnung_id`) USING BTREE;";
+ $db->setQuery( $query );
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ $query = "UPDATE #__sportsmanager_einstellungen"
+ . "\n SET wert = '108'"
+ . "\n WHERE name = 'datenbank_version'";
+ $db->setQuery($query);
+ if (!$db->execute()) {
+ die($db->stderr(true));
+ }
+ }
+
+ if ($datenbank_version < 109) {
+ $query = "ALTER TABLE #__sportsmanager_turnier ADD COLUMN `reminder_count` TINYINT DEFAULT '0'";
+ $db->setQuery($query);
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ // set all existing tournaments to 3 to prevent email flooding
+ $query = "UPDATE #__sportsmanager_turnier SET `reminder_count` = '3'";
+ $db->setQuery($query);
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ // 3: prevent email flood for past tournaments
+ $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '0';";
+ $db->setQuery( $query );
+ if (!$db->execute()) { die($db->stderr(true)); }
+
+ $query = "UPDATE #__sportsmanager_einstellungen"
+ . "\n SET wert = '109'"
+ . "\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 6ac4499..a5c7ea8 100644
--- a/src/structure/components/com_sportsmanager/sportsmanager.php
+++ b/src/structure/components/com_sportsmanager/sportsmanager.php
@@ -42,11 +42,14 @@ require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/vie
require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_admin.php';
require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_ticker.php';
require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php';
+require_once JPATH_SITE . '/components/com_sportsmanager/util/email.php';
require_once JPATH_SITE . '/components/com_sportsmanager/database/update.php'; // will also include init.php and util.php
initDatabase();
updateDatabase();
+sentEmailReminders();
+
if (isset($_POST['filter_saison_id']))
setcookie('sportsmanager_filter_saison_id', $_POST['filter_saison_id'], time() + (60 * 60 * 24));
else if (isset($_REQUEST['filter_saison_id']))
@@ -1186,7 +1189,7 @@ function benutzerVeranstaltungModerator($veranstaltung_id = NULL): bool
return false;
$user_id = Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
- $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14";
+ $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21";
if ($veranstaltung_id != NULL)
$query .= " AND berechtigt_veranstaltung_id = $veranstaltung_id";
$rows = loadObjectList($db, $query);
@@ -1204,7 +1207,7 @@ function benutzerVeranstaltungIdsModerator(): array
return array();
$user_id = Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
- $query = "SELECT DISTINCT veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14";
+ $query = "SELECT DISTINCT veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21";
$rows = loadObjectList($db, $query);
$ids = array();
@@ -1222,7 +1225,7 @@ function benutzerTurnierModerator($turnier_id = NULL): bool
return false;
$user_id = Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
- $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_turnier INNER JOIN #__sportsmanager_turnier ON turnier_id = berechtigt_turnier_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14";
+ $query = "SELECT * FROM #__sportsmanager_berechtigt_fuer_turnier INNER JOIN #__sportsmanager_turnier ON turnier_id = berechtigt_turnier_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21";
if ($turnier_id != NULL)
$query .= " AND berechtigt_turnier_id = $turnier_id";
$rows = loadObjectList($db, $query);
@@ -2873,12 +2876,14 @@ function spieler(): void
$query .= "\n INNER JOIN (SELECT spieler_id, teamname FROM #__sportsmanager_veranstaltung INNER JOIN #__sportsmanager_team USING (veranstaltung_id) INNER JOIN #__sportsmanager_mitglied_von_team USING (team_id) WHERE status > 0 AND veranstaltung_id = $veranstaltungid AND NOT ausgetreten GROUP BY spieler_id ORDER BY YEAR(letzter_tag) DESC, reihenfolge, letzter_tag DESC, bezeichnung, teamname) AS mannschaftsmitglied USING (spieler_id)";
$query .= "\n LEFT JOIN #__sportsmanager_verein ON aktueller_verein_id = verein_id"
. "\n LEFT JOIN #__sportsmanager_veranstalter USING (veranstalter_id)"
- . "\n WHERE NOT ISNULL(aktueller_verein_id)";
+ . "\n LEFT JOIN #__sportsmanager_mitglied_von_verein USING (spieler_id)"
+ . "\n WHERE NOT ISNULL(aktueller_verein_id) AND #__sportsmanager_mitglied_von_verein.mitgliedsstatus IN (1,2)";
if (!empty($search))
$query .= "\n AND (CONCAT_WS(', ', nachname, vorname) LIKE '$searchEscapedWildcards' OR CONCAT_WS(' ', vorname, nachname) LIKE '$searchEscapedWildcards' OR spielernr = '$searchEscaped' OR lizenznr = '$searchEscaped')";
if ($einstufungid != 0)
$query .= "\n AND (einstufung_allgemein_id = $einstufungid OR einstufung_einzel_id = $einstufungid OR einstufung_doppel_id = $einstufungid)";
- if (!empty($kategorie))
+ $query .= "\n GROUP BY spieler_id";
+ if (!empty($kategorie))
$query .= "\n HAVING kategorie = '" . $db->escape($kategorie) . "'";
$query .= "\n ORDER BY " . $sortierung_query
. "\n LIMIT $beginn, 50";
@@ -2996,7 +3001,11 @@ function spielerDetails(): void
$query = "SELECT vereinsname"
. "\n FROM #__sportsmanager_mitglied_von_verein, #__sportsmanager_verein"
. "\n LEFT JOIN #__sportsmanager_veranstalter USING (veranstalter_id)"
- . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id AND NOT #__sportsmanager_verein.ausgetreten AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id"
+ . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id "
+ . "\n AND NOT #__sportsmanager_verein.ausgetreten"
+ . "\n AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten"
+ . "\n AND #__sportsmanager_mitglied_von_verein.mitgliedsstatus IN (1,2)"
+ . "\n AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id"
. "\n ORDER BY vereinsname";
$vereine = loadObjectList($db, $query);
@@ -3004,7 +3013,12 @@ function spielerDetails(): void
$query = "SELECT veranstalterbezeichnung"
. "\n FROM #__sportsmanager_mitglied_von_verein, #__sportsmanager_verein"
. "\n LEFT JOIN #__sportsmanager_veranstalter USING (veranstalter_id)"
- . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id AND NOT #__sportsmanager_verein.ausgetreten AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id"
+ . "\n WHERE #__sportsmanager_mitglied_von_verein.spieler_id = $id"
+ . "\n AND NOT #__sportsmanager_verein.ausgetreten"
+ . "\n AND NOT #__sportsmanager_mitglied_von_verein.ausgetreten"
+ . "\n AND #__sportsmanager_mitglied_von_verein.mitgliedsstatus IN (1,2)"
+ . "\n AND #__sportsmanager_verein.verein_id = #__sportsmanager_mitglied_von_verein.verein_id"
+ . "\n GROUP BY veranstalterbezeichnung"
. "\n ORDER BY veranstalterbezeichnung";
$veranstalter = loadObjectList($db, $query);
@@ -3788,13 +3802,14 @@ function vereine($sort): void
$db = getDatabase();
global $params;
$organisationAnzeigen = einstellungswert('verband_anzeigen');
-
+ $spalteMitgliederAnzeigen = einstellungswert('spalte_mitglieder_zeigen');
+ if (!$spalteMitgliederAnzeigen) $sort = "vereinsname";
$query = "SELECT t1.verein_id, t1.vereinsname, t1.vereinssitz,"
. "\n t2.veranstalterbezeichnung, COUNT(*) As mitglieder"
. "\n FROM #__sportsmanager_verein AS t1"
. "\n LEFT JOIN #__sportsmanager_veranstalter AS t2 USING (veranstalter_id)"
. "\n LEFT JOIN #__sportsmanager_mitglied_von_verein AS t3 USING (verein_id)"
- . "\n WHERE t1.ausgetreten = 0 AND verstecken = 0"
+ . "\n WHERE t1.ausgetreten = 0 AND t1.verstecken = 0 AND t3.ausgetreten = 0"
. "\n GROUP BY t1.verein_id";
if ($sort == "mitglieder"){
$query .= "\n HAVING mitglieder >= " . einstellungswert('anzahl_mitglieder_zeigen');
@@ -3805,7 +3820,7 @@ function vereine($sort): void
}
$vereine = loadObjectList($db, $query);
- HTML_sportsmanager::vereine($params->get('titel'), $params->get('beschreibung'), $vereine, $organisationAnzeigen);
+ HTML_sportsmanager::vereine($params->get('titel'), $params->get('beschreibung'), $vereine, $organisationAnzeigen, $spalteMitgliederAnzeigen);
administrationFooter();
}
@@ -4810,7 +4825,6 @@ function teamstatistikAktualisieren($geaenderte_veranstaltung_id = 0, $geaendert
function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnierdisziplin_id = 0, $geaenderte_spieler_id = 0, $berechnungen_auswerten = FALSE): void
{
$db = getDatabase();
-
if ($geaenderte_spieler_id != 0) {
$query = "SELECT DISTINCT #__sportsmanager_rangliste.*"
. "\n FROM #__sportsmanager_turniermeldung_spieler"
@@ -4819,6 +4833,12 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie
. "\n INNER JOIN #__sportsmanager_rangliste_turnierdisziplin USING (turnierdisziplin_id)"
. "\n INNER JOIN #__sportsmanager_rangliste USING (rangliste_id)"
. "\n WHERE spieler_id = $geaenderte_spieler_id AND rundenstufe = 0";
+ } else if ($berechnungen_auswerten) {
+ $session_id = redirectRequestGetSessionId();
+ $query = "SELECT DISTINCT #__sportsmanager_rangliste.*"
+ . "\n FROM #__sportsmanager_berechnung"
+ . "\n INNER JOIN #__sportsmanager_rangliste ON id = rangliste_id"
+ . "\n WHERE typ = 'rangliste' AND " . (empty($session_id) ? ("session_id < SUBTIME(NOW(), '00:10:00')") : ("session_id = '" . $session_id . "'"));
} else if ($geaenderte_rangliste_id != 0) {
$query = "SELECT * FROM #__sportsmanager_rangliste"
. "\n WHERE rangliste_id = $geaenderte_rangliste_id";
@@ -4920,6 +4940,8 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie
$db->transactionStart();
$meldungen = array();
+ $Anzahl = 0;
+ $query = "INSERT INTO #__sportsmanager_rangliste_turnierdisziplin_punkte (rangliste_id, spieler_id, turnierdisziplin_id, platz, punkte) VALUES ";
foreach ($turnierplatzierungen as $index => $turnierplatzierung) {
if (empty($turnierplatzierung->spieler_id))
continue;
@@ -5011,12 +5033,17 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie
}
}
$punkte[$turnierplatzierung->spieler_id][] = $p;
- $query = "INSERT INTO #__sportsmanager_rangliste_turnierdisziplin_punkte (rangliste_id, spieler_id, turnierdisziplin_id, platz, punkte) VALUES ('$rangliste_id', '$turnierplatzierung->spieler_id', '$turnierdisziplin->turnierdisziplin_id', '$turnierplatzierung->platz', '$p') ON DUPLICATE KEY UPDATE punkte = punkte + VALUES(punkte);";
- $db->setQuery($query);
- if (!$db->execute()) {
- die($db->stderr(true));
- }
+ if ($Anzahl > 0) $query .= ",";
+ $query .= "('$rangliste_id', '$turnierplatzierung->spieler_id', '$turnierdisziplin->turnierdisziplin_id', '$turnierplatzierung->platz', '$p')";
+ $Anzahl++;
}
+ $query .= " ON DUPLICATE KEY UPDATE punkte = punkte + VALUES(punkte);";
+ if ($Anzahl > 0){
+ $db->setQuery($query);
+ if (!$db->execute()) {
+ die($db->stderr(true));
+ }
+ }
$db->transactionCommit();
}
@@ -5037,22 +5064,26 @@ function ranglisteAktualisieren($geaenderte_rangliste_id = 0, $geaenderte_turnie
$platz = 1;
$tatsaechlicher_platz = 1;
$spieler_punkte = 0;
-
+ $Anzahl = 0;
$db->transactionStart();
+ $query = "INSERT INTO #__sportsmanager_rangliste_punkte(rangliste_id, spieler_id, punkte, teilnahmen, platz) VALUES ";
foreach ($punkte_summe as $spieler_id => $spieler_punkte_summe) {
$spieler_teilnahmen = $teilnahmen[$spieler_id];
if ($platz == 1 || $spieler_punkte != $spieler_punkte_summe)
$tatsaechlicher_platz = $platz;
-
- $query = "INSERT INTO #__sportsmanager_rangliste_punkte (rangliste_id, spieler_id, punkte, teilnahmen, platz) VALUES ('$rangliste_id', '$spieler_id', '$spieler_punkte_summe', '$spieler_teilnahmen', '$tatsaechlicher_platz') ON DUPLICATE KEY UPDATE punkte = VALUES(punkte), teilnahmen = VALUES(teilnahmen), platz = VALUES(platz);";
- $db->setQuery($query);
- if (!$db->execute()) {
- die($db->stderr(true));
- }
-
+ if ($Anzahl > 0) $query .= ",";
+ $query .= "('$rangliste_id', '$spieler_id', '$spieler_punkte_summe', '$spieler_teilnahmen', '$tatsaechlicher_platz') ";
+ $Anzahl++;
$spieler_punkte = $spieler_punkte_summe;
$platz++;
}
+ $query .= " ON DUPLICATE KEY UPDATE punkte = VALUES(punkte), teilnahmen = VALUES(teilnahmen), platz = VALUES(platz);";
+ if ($Anzahl > 0){
+ $db->setQuery($query);
+ if (!$db->execute()) {
+ die($db->stderr(true));
+ }
+ }
$db->transactionCommit();
// Unabhängig von $berechnungen_auswerten ausführen, um ggf. vorhandene Inhalte zu entfernen
diff --git a/src/structure/components/com_sportsmanager/tools.php b/src/structure/components/com_sportsmanager/tools.php
index 0aca5bd..7f6beea 100644
--- a/src/structure/components/com_sportsmanager/tools.php
+++ b/src/structure/components/com_sportsmanager/tools.php
@@ -201,7 +201,7 @@ function kategorieFilter($prefix, $suffix = ""): string
function turnierFilter($prefix): string
{
$user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
- return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
+ return " " . $prefix . " (SELECT berechtigt_turnier_id FROM #__sportsmanager_berechtigt_fuer_turnier WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21) ";
}
function vereinFilter($prefix): string
@@ -219,7 +219,7 @@ function veranstalterFilter($prefix): string
function veranstaltungFilter($prefix): string
{
$user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id;
- return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -14) ";
+ return " " . $prefix . " (SELECT berechtigt_veranstaltung_id FROM #__sportsmanager_berechtigt_fuer_veranstaltung INNER JOIN #__sportsmanager_veranstaltung ON veranstaltung_id = berechtigt_veranstaltung_id WHERE berechtigt_user_id = $user_id AND DATEDIFF(letzter_tag, NOW()) >= -21) ";
}
// Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres
diff --git a/src/structure/components/com_sportsmanager/util/email.php b/src/structure/components/com_sportsmanager/util/email.php
new file mode 100644
index 0000000..4b2b5c5
--- /dev/null
+++ b/src/structure/components/com_sportsmanager/util/email.php
@@ -0,0 +1,125 @@
+get(SiteApplication::class);
+ $db = getDatabase();
+
+ $query = $db->getQuery(true)
+ ->select('wert')
+ ->from('#__sportsmanager_einstellungen')
+ ->where('name = ' . $db->quote('enable_email_reminders'));
+ $row = loadResult($db, $query);
+
+ if (!$row) {
+ return; // quit when email reminders are disabled
+ }
+
+ $query = $db->getQuery(true)
+ ->select('tournament.turnier_id, tournament.turnierbezeichnung, tournament.letzter_tag, tournament.reminder_count, GROUP_CONCAT(user.email SEPARATOR ", ") as emails')
+ ->from($db->quoteName('#__sportsmanager_turnier', 'tournament'))
+ ->join('INNER', $db->quoteName('#__sportsmanager_berechtigt_fuer_turnier', 'entitled') . ' ON tournament.turnier_id = entitled.berechtigt_turnier_id')
+ ->join('INNER', $db->quoteName('#__users', 'user') . ' ON entitled.berechtigt_user_id = user.id')
+ ->where('tournament.reminder_count < 3')
+ ->group('tournament.turnier_id, tournament.turnierbezeichnung');
+ $rows = loadObjectList($db, $query);
+
+ if(!empty($rows)) {
+ $mailFrom = $app->getCfg('mailfrom');
+ $fromName = $app->getCfg('fromname');
+
+ $mailer = Factory::getContainer()->get(MailerFactoryInterface::class)->createMailer();
+ $mailer->setSender($mailFrom, $fromName);
+ foreach ($rows as $row) {
+ $currentReminder = $row->reminder_count + 1;
+
+ if (hasResultsAlready($db, $row)) {
+ updateDBReminders($db, $row, 3); // do not sent any more reminders
+ continue;
+ }
+
+ if (!isset($row->emails) || $row->emails == "" || $row->emails == NULL) {
+ Log::add('can\'t sent ' . $currentReminder .'. email reminder for tournament ' . $row->turnierbezeichnung . ': no recipient set', Log::WARNING, 'com_sportsmanager');
+ continue;
+ }
+
+ $now = new DateTime();
+ $last_day = new DateTime($row->letzter_tag);
+ $last_day->modify('+1 day'); // start to count at the end of the day, not at the beginning
+ $diff = $now->getTimestamp() - $last_day->getTimestamp();
+
+ $reminderDelays = [
+ 1 => 24*60*60, // 24h
+ 2 => 3*24*60*60, // 3d
+ 3 => 13*24*60*60 // 13d
+ ];
+
+ foreach ($reminderDelays as $count => $delay) {
+ if ($diff >= $delay && $row->reminder_count < $count) {
+ $subject = ($row->reminder_count == 2 ? "Letzte " : "") . "Erinnerung: " . $row->turnierbezeichnung . " Ergebnisse einreichen!";
+ $body = "Hi,"
+ . "\n\nDies ist die " . $currentReminder . ". " . ($row->reminder_count == 2 ? "*und damit letzte* " : "") . "Erinnerung die Turnierergebnisse einzureichen."
+ . "\n\nTurnier: " . $row->turnierbezeichnung
+ . "\nTurnierende: " . FormatiertesDatum($row->letzter_tag, false, false)
+ . "\n\nLaut Turnierordnung müssen die Ergebnisse spätestens 24 Stunden nach Turnierende eingetragen werden. Bitte reich die Ergebnisse umgehend nach."
+ . "\n\nDu erhältst diese Mail, weil du als Berechtigter für das Turnier eingetragen wurdest. Falls du nicht der Veranstalter bist, leite diese Email bitte entsprechend weiter."
+ . "\n\nHochladen der Ergebnisse über " . SportsManagerURL('&task=admin_turnierdisziplinen&turnierid=' . $row->turnier_id, -1) . ".";
+
+ $mailer->setSubject($subject);
+ $mailer->setBody($body);
+
+ $emailArray = explode(", ", $row->emails);
+ foreach ($emailArray as $email) {
+ $mailer->addBcc($email);
+ }
+ $mailer->send();
+
+ updateDBReminders($db, $currentReminder, $row->turnier_id);
+ }
+ }
+ }
+ }
+}
+
+function updateDBReminders($db, $reminder, $tournamentId): void
+{
+ $query = $db->getQuery(true)
+ ->update($db->quoteName('#__sportsmanager_turnier'))
+ ->set($db->quoteName('reminder_count') . ' = ' . $db->quote($reminder))
+ ->where($db->quoteName('turnier_id') . ' = ' . $db->quote($tournamentId));
+
+ $db->setQuery($query);
+ $db->execute();
+}
+
+/**
+ * checks if a tournament has at least one result entry for a discipline
+ * @param $db
+ * @param $row mixed tournament entry
+ * @return bool true if at least one result is given, else false
+ * @since 2.2
+ */
+function hasResultsAlready($db, mixed $row): bool
+{
+ $subQuery = $db->getQuery(true)
+ ->select($db->quoteName('turnierdisziplin_id'))
+ ->from($db->quoteName('#__sportsmanager_turnierdisziplin'))
+ ->where($db->quoteName('turnier_id') . ' = ' . $db->quote($row->turnier_id));
+
+ $query = $db->getQuery(true)
+ ->select('COUNT(*) AS count')
+ ->from($db->quoteName('#__sportsmanager_turniermeldung', 'tm'))
+ ->where($db->quoteName('tm.turnierdisziplin_id') . ' IN (' . $subQuery . ')');
+
+ $result = loadResult($db, $query);
+ return $result && $result[0]->count > 0;
+}
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 3fc8916..d8c663b 100644
--- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php
+++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php
@@ -444,7 +444,14 @@ static function turniere($turniere): void
if (!empty($turnier->disziplinen)) {
?>
- disziplinen; ?>
+
+ disziplinen);
+ $parts = array_map('trim', $parts); // remove extra spaces
+ foreach ($parts as $discipline) {
+ echo $discipline . "
";
+ } ?>
+
@@ -1731,8 +1738,8 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie