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 - - +
-
+
+
- - + + + + platz == null; $platz = -1; $k = 0; - foreach ($teams - - as $team) { - if ($laufende_veranstaltung && $team->platz != $platz && $team->platz == null) { - ?> - - - - - - - - + foreach ($teams as $team) { + if ($laufende_veranstaltung && $team->platz != $platz && $team->platz == null) { + ?> + + + + + + + + - - letzter_spieltag); - ?> - - - - - - + team_id) . "\">" . htmlentities_utf8(NichtLeererString($team->teamname)) . ""; + ?> + + + + + +
+
- -
+ +
platz != $platz) { @@ -2040,63 +2048,32 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie ?> - - - - - - - - -
- team_id) . "\">" . htmlentities_utf8(NichtLeererString($team->teamname)) . ""; - ?> - - team_id, 50, 50, 0, 0, 'border="0"'); - if ($bild != null) { - echo $bild; - } else if ($team->verein_id != null) { - $bild = bildHTML("vereine", $team->verein_id, 50, 50, 0, 0, 'border="0"'); - if ($bild != null) - echo $bild; - } - ?> -
- -
- letzter_spieltag; - ?> - - zuletzt_gewonnen; - ?> - - -
+ team_id, 50, 50, 0, 0, 'border="0"'); + if ($bild != null) { + echo $bild; + } else if ($team->verein_id != null) { + $bild = bildHTML("vereine", $team->verein_id, 50, 50, 0, 0, 'border="0"'); + if ($bild != null) + echo $bild; + } + ?> +
@@ -3115,17 +3092,20 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie - + - - + + + + @@ -3153,9 +3133,11 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie vereinsname)); ?> + + " . $row->veranstalterbezeichnung . ""; @@ -4277,9 +4259,16 @@ static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spie } } - static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, $teams, $sortierung, $vorheriger_spieler_id, $naechster_spieler_id, $elo_detailliert, $statistik, $beginn, $kategorie, $einstufungen, $filter, $veranstaltungid, $veranstalterid, $einstufungid, $unabhaengige_ansicht, $details_anzeigen, $lizenz_anzeigen):void { + static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, + $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, + $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, + $teams, $sortierung, $vorheriger_spieler_id, $naechster_spieler_id, $elo_detailliert, + $statistik, $beginn, $kategorie, $einstufungen, $filter, $veranstaltungid, $veranstalterid, + $einstufungid, $unabhaengige_ansicht, $details_anzeigen, $lizenz_anzeigen):void { global $params; + if (count($vereine) == 0){echo "Sie haben keine Berechtigung auf diesen Datensatz!!!"; die;} + ?>
VereinslogoVereinslogo - - + + + Organisation mitglieder; ?> vereinssitz)) echo htmlentities_utf8($row->vereinssitz . (!empty($row->vereinssitz_ortsteil) ? ("-" . $row->vereinssitz_ortsteil) : "")); ?>
diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php index 5d7f3ed..c19377d 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.json.php @@ -197,6 +197,7 @@ class JSON_sportsmanager #[NoReturn] static function spielerDetails($spieler, $vereine, $veranstalter, $spieler_elo_verlauf_einzel, $spieler_elo_verlauf_doppel, $spielerNamen, $teamNamen, $veranstaltungBezeichnungen, $turnierdisziplinBezeichnungen, $individualwettbewerbBezeichnungen, $ranglistenplatzierungen, $turnierplatzierungen, $teams, $elo_detailliert, $statistik, $einstufungen): void { + if (count($vereine) == 0){die;} $letzte_einzel = []; $spieler->bild = playerImage($spieler->spieler_id, $spieler->geschlecht); for ($i = sizeof($spieler_elo_verlauf_einzel) - 1; $i >= max(sizeof($spieler_elo_verlauf_einzel) - 10, 0); $i--) { 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 6a01e20..ab99e95 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -374,7 +374,16 @@ class HTML_sportsmanager_admin echo htmlentities_utf8($row->turnierbezeichnung); if (!empty($row->disziplinen)) { ?> -
disziplinen; ?> +
+ + disziplinen); + $parts = array_map('trim', $parts); // remove extra spaces + foreach ($parts as $discipline) { + echo $discipline . "
"; + } + ?> +
@@ -723,18 +732,14 @@ class HTML_sportsmanager_admin @@ -755,6 +760,24 @@ class HTML_sportsmanager_admin + + + + + + + + - - tabellenwertung == -3 || $veranstaltung->tabellenwertung == -4){ ?> + + @@ -8900,6 +8968,7 @@ class HTML_sportsmanager_admin { global $params; ?> +
'bezeichnung); ?> @@ -8909,11 +8978,11 @@ class HTML_sportsmanager_admin action="begegnung_id) : ''); ?>" method="post" name="adminForm" id="adminForm">
-
- + + name="anzahl_mitglieder_zeigen" placeholder="Zahl eingeben">
+ + + +
+ + + +
  @@ -905,6 +944,35 @@ class HTML_sportsmanager_admin class="button"/> + ">
- - + + unterteilung == 0 ? Text::_('COM_SPORTSMANAGER_GAMEDAY_GENERATION') : Text::_('COM_SPORTSMANAGER_ROUND_GENERATION'); ?>
+
- +
+ + + + + tabellenwertung == -4){ ?> + + + + + letzteRunde == $veranstaltung->naechsteRunde) {$display = "";} else {$display = "none";} ?> - + @@ -11498,14 +11599,51 @@ class HTML_sportsmanager_admin - "/> "/> + "/> + + setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_unbestaetigtes_ergebnis` (" + $query = "CREATE TABLE IF NOT EXISTS `#__sportsmanager_unbestaetigtes_ergebnis` (" . "\n `unbestaetigtes_ergebnis_id` int(11) NOT NULL AUTO_INCREMENT," . "\n `begegnung_id` int(11) NOT NULL DEFAULT '0'," . "\n `vorschlagendes_team_id` int(11) NOT NULL DEFAULT '0'," @@ -1013,7 +1014,7 @@ return new class () implements InstallerScriptInterface . "\n `kommentar` varchar(255) DEFAULT NULL," . "\n `vorgeschlagen` datetime DEFAULT NULL," . "\n PRIMARY KEY (`unbestaetigtes_ergebnis_id`)," - . "\n KEY `begegnung_id` (`begegnung_id`)," + . "\n UNIQUE KEY `begegnung_id` (`begegnung_id`)," . "\n KEY `vorschlagendes_team_id` (`vorschlagendes_team_id`)" . "\n) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"; $db->setQuery( $query ); @@ -1117,7 +1118,7 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '106';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'datenbank_version', wert = '108';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } @@ -1125,11 +1126,11 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spielerliste_elo', wert = '0';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'spielerliste_elo', wert = '0';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } - $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ansprechpartner_ausblenden', wert = '0';"; + $query = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'ansprechpartner_ausblenden', wert = '0';"; $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } @@ -1137,6 +1138,26 @@ return new class () implements InstallerScriptInterface $db->setQuery( $query ); if (!$db->execute()) { die($db->stderr(true)); } + $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 = "INSERT IGNORE #__sportsmanager_einstellungen SET name = 'enable_email_reminders', wert = '0';"; + $db->setQuery( $query ); + if (!$db->execute()) { die($db->stderr(true)); } + $query = "INSERT INTO #__sportsmanager_verschieberegel (bezeichnung, initial_ohne_termin, keine_gegenvorschlaege, vorlaufzeit_tage, termine_minimal, termine_maximal, ablehnen)" . "\n VALUES ('Beliebig', '0', '0', '0', '1', '3', '0');"; $db->setQuery($query);
+ + + +
@@ -10385,8 +10481,26 @@ class HTML_sportsmanager_admin
+ + + +
@@ -11272,20 +11386,6 @@ class HTML_sportsmanager_admin class="componentheadingget('pageclass_sfx'); ?>"> : - -
@@ -11468,8 +11568,8 @@ class HTML_sportsmanager_admin +