diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 27012b8..72bd87b 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -4724,10 +4724,16 @@ function adminEditTeamspielmodus(): void $spielpunkte_wertung_einzel = $jInput->get('spielpunkte_wertung_einzel', 0, 'INT'); $spielpunkte_wertung_doppel_separat = $jInput->get('spielpunkte_wertung_doppel_separat', 0, 'INT'); $spielpunkte_wertung_doppel = $spielpunkte_wertung_doppel_separat ? $jInput->get('spielpunkte_wertung_doppel', 0, 'INT') : $spielpunkte_wertung_einzel; - if ($spielpunkte_wertung_einzel == 4 && ($punktetyp != 1 || $satzergebnisse != 1)) - $spielpunkte_wertung_einzel = 0; - if ($spielpunkte_wertung_doppel == 4 && ($punktetyp != 1 || $satzergebnisse != 1)) - $spielpunkte_wertung_doppel = 0; + $spielpunkte_wertung_pruefen = function ($wertung) use ($punktetyp, $satzergebnisse) { + $erlaubt = array(0, 1, 2, 3, 10, 11, 13); + if (!in_array($wertung, $erlaubt)) + $wertung = 0; + if ($wertung >= 10 && ($punktetyp != 1 || $satzergebnisse != 1)) + $wertung = $wertung % 10; + return $wertung; + }; + $spielpunkte_wertung_einzel = $spielpunkte_wertung_pruefen($spielpunkte_wertung_einzel); + $spielpunkte_wertung_doppel = $spielpunkte_wertung_pruefen($spielpunkte_wertung_doppel); $spielpunkte_bedingung = $jInput->get('spielpunkte_bedingung', 0, 'INT'); $spielernamen = $jInput->get('spielernamen', 0, 'INT'); diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 233b831..01e4b78 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -1854,7 +1854,7 @@ function getTabelleDirekterVergleich($teams,$veranstaltung,$spieltag) . "\n WHERE teamspiel_modus_id = " . (int)($veranstaltung->modus_id ?? 0); $wertungen = loadObjectList($db, $query); $je_satz = count($wertungen) > 0 - && ($wertungen[0]->spielpunkte_wertung_einzel == 4 || $wertungen[0]->spielpunkte_wertung_doppel == 4); + && ($wertungen[0]->spielpunkte_wertung_einzel >= 10 || $wertungen[0]->spielpunkte_wertung_doppel >= 10); $gesamtpunkte = 1000; $anzahl_spiele = 1000; @@ -2002,7 +2002,7 @@ function getTabelleSpieltag($veranstaltung,$spieltag,$mannschaften = "",$offset_ . "\n WHERE teamspiel_modus_id = " . (int)($veranstaltung->modus_id ?? 0); $wertungen = loadObjectList($db, $query); $je_satz = count($wertungen) > 0 - && ($wertungen[0]->spielpunkte_wertung_einzel == 4 || $wertungen[0]->spielpunkte_wertung_doppel == 4); + && ($wertungen[0]->spielpunkte_wertung_einzel >= 10 || $wertungen[0]->spielpunkte_wertung_doppel >= 10); $query = "SELECT verein_id, teamname, zusatzpunkte," . "\n werte.*," @@ -5625,7 +5625,7 @@ function teamstatistikAktualisieren($geaenderte_veranstaltung_id = 0, $geaendert . "\n WHERE teamspiel_modus_id = " . (int)($veranstaltung->modus_id ?? 0); $wertungen = loadObjectList($db, $query); $je_satz = count($wertungen) > 0 - && ($wertungen[0]->spielpunkte_wertung_einzel == 4 || $wertungen[0]->spielpunkte_wertung_doppel == 4); + && ($wertungen[0]->spielpunkte_wertung_einzel >= 10 || $wertungen[0]->spielpunkte_wertung_doppel >= 10); $query = "UPDATE #__sportsmanager_team" . "\n LEFT JOIN" @@ -6352,7 +6352,7 @@ function spielerstatistikAktualisieren($geaenderte_spielerstatistik_id = 0, $gea $ergebnis = $heim_punkte > $gast_punkte ? 1 : ($heim_punkte < $gast_punkte ? 2 : 0); $wertung = $begegnung->heim_spieler_2_id === NULL && $begegnung->gast_spieler_2_id === NULL ? $begegnung->spielpunkte_wertung_einzel : $begegnung->spielpunkte_wertung_doppel; - if ($wertung == 4 && !empty($begegnung->ergebnis_detailliert)) { + if ($wertung >= 10 && !empty($begegnung->ergebnis_detailliert)) { $auswertung = runden_detailliert_auswertung($begegnung->ergebnis_detailliert); $heim_saetze = $auswertung[1]; $unentschieden_saetze = $auswertung[2]; diff --git a/src/structure/components/com_sportsmanager/tools.php b/src/structure/components/com_sportsmanager/tools.php index be7de2b..40c9f75 100644 --- a/src/structure/components/com_sportsmanager/tools.php +++ b/src/structure/components/com_sportsmanager/tools.php @@ -1,695 +1,699 @@ -createFunc("ROUND", 'round', 1); - $this->createFunc("VERTEILUNG", 'mathParserVerteilung', 4); - $this->createFunc("VERTEILUNGR", 'mathParserVerteilungR', 4); - } catch (Exception $e) { - Log::add('an error occurred: ' . $e->getMessage(), Log::ERROR, 'com_sportsmanager'); - throw new RuntimeException('An error occurred.', 500); - } - } -} - -#[NoReturn] function keinZugriff($login = FALSE): void -{ - if (isJson()) { - abortWithError(401 . ' Unauthorized'); - } - if (!$login || Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id) { - Log::add('Unauthorized user with id ' . Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id, Log::WARNING, 'com_sportsmanager'); - throw new RuntimeException('Not authorized!', 401); - } - $version = new Version(); - $joomla = $version->getShortVersion(); - $u = Uri::getInstance(); - $redirectUrl = urlencode(base64_encode($u->toString())); - $redirectUrl = '&return=' . $redirectUrl; - $joomlaLoginUrl = 'index.php?option=' . (!str_starts_with($joomla, '1.5') ? 'com_users' : 'com_user') . '&view=login'; - $finalUrl = $joomlaLoginUrl . $redirectUrl; - $app = Factory::getContainer()->get(SiteApplication::class); - $app->redirect(Route::_($finalUrl)); - jexit(); -} - -function bereinigterDateiname($dateiname): array|string -{ - $_convertTable = array( - '&' => 'and', '@' => 'at', '©' => 'c', '®' => 'r', 'À' => 'a', - 'Á' => 'a', 'Â' => 'a', 'Ä' => 'a', 'Å' => 'a', 'Æ' => 'ae', 'Ç' => 'c', - 'È' => 'e', 'É' => 'e', 'Ë' => 'e', 'Ì' => 'i', 'Í' => 'i', 'Î' => 'i', - 'Ï' => 'i', 'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Õ' => 'o', 'Ö' => 'o', - 'Ø' => 'o', 'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'Ý' => 'y', - 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', 'å' => 'a', - 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', - 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ò' => 'o', 'ó' => 'o', - 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', - 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'þ' => 'p', 'ÿ' => 'y', 'Ā' => 'a', - 'ā' => 'a', 'Ă' => 'a', 'ă' => 'a', 'Ą' => 'a', 'ą' => 'a', 'Ć' => 'c', - 'ć' => 'c', 'Ĉ' => 'c', 'ĉ' => 'c', 'Ċ' => 'c', 'ċ' => 'c', 'Č' => 'c', - 'č' => 'c', 'Ď' => 'd', 'ď' => 'd', 'Đ' => 'd', 'đ' => 'd', 'Ē' => 'e', - 'ē' => 'e', 'Ĕ' => 'e', 'ĕ' => 'e', 'Ė' => 'e', 'ė' => 'e', 'Ę' => 'e', - 'ę' => 'e', 'Ě' => 'e', 'ě' => 'e', 'Ĝ' => 'g', 'ĝ' => 'g', 'Ğ' => 'g', - 'ğ' => 'g', 'Ġ' => 'g', 'ġ' => 'g', 'Ģ' => 'g', 'ģ' => 'g', 'Ĥ' => 'h', - 'ĥ' => 'h', 'Ħ' => 'h', 'ħ' => 'h', 'Ĩ' => 'i', 'ĩ' => 'i', 'Ī' => 'i', - 'ī' => 'i', 'Ĭ' => 'i', 'ĭ' => 'i', 'Į' => 'i', 'į' => 'i', 'İ' => 'i', - 'ı' => 'i', 'IJ' => 'ij', 'ij' => 'ij', 'Ĵ' => 'j', 'ĵ' => 'j', 'Ķ' => 'k', - 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'l', 'ĺ' => 'l', 'Ļ' => 'l', 'ļ' => 'l', - 'Ľ' => 'l', 'ľ' => 'l', 'Ŀ' => 'l', 'ŀ' => 'l', 'Ł' => 'l', 'ł' => 'l', - 'Ń' => 'n', 'ń' => 'n', 'Ņ' => 'n', 'ņ' => 'n', 'Ň' => 'n', 'ň' => 'n', - 'ʼn' => 'n', 'Ŋ' => 'n', 'ŋ' => 'n', 'Ō' => 'o', 'ō' => 'o', 'Ŏ' => 'o', - 'ŏ' => 'o', 'Ő' => 'o', 'ő' => 'o', 'Œ' => 'oe', 'œ' => 'oe', 'Ŕ' => 'r', - 'ŕ' => 'r', 'Ŗ' => 'r', 'ŗ' => 'r', 'Ř' => 'r', 'ř' => 'r', 'Ś' => 's', - 'ś' => 's', 'Ŝ' => 's', 'ŝ' => 's', 'Ş' => 's', 'ş' => 's', 'Š' => 's', - 'š' => 's', 'Ţ' => 't', 'ţ' => 't', 'Ť' => 't', 'ť' => 't', 'Ŧ' => 't', - 'ŧ' => 't', 'Ũ' => 'u', 'ũ' => 'u', 'Ū' => 'u', 'ū' => 'u', 'Ŭ' => 'u', - 'ŭ' => 'u', 'Ů' => 'u', 'ů' => 'u', 'Ű' => 'u', 'ű' => 'u', 'Ų' => 'u', - 'ų' => 'u', 'Ŵ' => 'w', 'ŵ' => 'w', 'Ŷ' => 'y', 'ŷ' => 'y', 'Ÿ' => 'y', - 'Ź' => 'z', 'ź' => 'z', 'Ż' => 'z', 'ż' => 'z', 'Ž' => 'z', 'ž' => 'z', - 'ſ' => 'z', 'Ə' => 'e', 'ƒ' => 'f', 'Ơ' => 'o', 'ơ' => 'o', 'Ư' => 'u', - 'ư' => 'u', 'Ǎ' => 'a', 'ǎ' => 'a', 'Ǐ' => 'i', 'ǐ' => 'i', 'Ǒ' => 'o', - 'ǒ' => 'o', 'Ǔ' => 'u', 'ǔ' => 'u', 'Ǖ' => 'u', 'ǖ' => 'u', 'Ǘ' => 'u', - 'ǘ' => 'u', 'Ǚ' => 'u', 'ǚ' => 'u', 'Ǜ' => 'u', 'ǜ' => 'u', 'Ǻ' => 'a', - 'ǻ' => 'a', 'Ǽ' => 'ae', 'ǽ' => 'ae', 'Ǿ' => 'o', 'ǿ' => 'o', 'ə' => 'e', - 'Ё' => 'jo', 'Є' => 'e', 'І' => 'i', 'Ї' => 'i', 'А' => 'a', 'Б' => 'b', - 'В' => 'v', 'Г' => 'g', 'Д' => 'd', 'Е' => 'e', 'Ж' => 'zh', 'З' => 'z', - 'И' => 'i', 'Й' => 'j', 'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n', - 'О' => 'o', 'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u', - 'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch', 'Ш' => 'sh', 'Щ' => 'sch', - 'Ъ' => '-', 'Ы' => 'y', 'Ь' => '-', 'Э' => 'je', 'Ю' => 'ju', 'Я' => 'ja', - 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', - 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', - 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', - 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', - 'ш' => 'sh', 'щ' => 'sch', 'ъ' => '-', 'ы' => 'y', 'ь' => '-', 'э' => 'je', - 'ю' => 'ju', 'я' => 'ja', 'ё' => 'jo', 'є' => 'e', 'і' => 'i', 'ї' => 'i', - 'Ґ' => 'g', 'ґ' => 'g', 'א' => 'a', 'ב' => 'b', 'ג' => 'g', 'ד' => 'd', - 'ה' => 'h', 'ו' => 'v', 'ז' => 'z', 'ח' => 'h', 'ט' => 't', 'י' => 'i', - 'ך' => 'k', 'כ' => 'k', 'ל' => 'l', 'ם' => 'm', 'מ' => 'm', 'ן' => 'n', - 'נ' => 'n', 'ס' => 's', 'ע' => 'e', 'ף' => 'p', 'פ' => 'p', 'ץ' => 'C', - 'צ' => 'c', 'ק' => 'q', 'ר' => 'r', 'ש' => 'w', 'ת' => 't', '™' => 'tm', - ); - $bad = array_merge( - array_map('chr', range(0, 31)), - array("<", ">", ":", '"', "/", "\\", "|", "?", "*")); - - return str_replace($bad, "", strtr($dateiname, $_convertTable)); -} - -function setMinMemoryLimit($memDestSize): void -{ - if (getBytes(ini_get('memory_limit')) < getBytes($memDestSize)) - ini_set('memory_limit', $memDestSize); -} - -function getBytes($val): int|string -{ - $val = trim($val); - $numeric = substr($val, 0, strlen($val) - 1); - $last = strtolower($val[strlen($val) - 1]); - switch ($last) { - // The 'G' modifier is available since PHP 5.1.0 - case 'm': - case 'g': - case 'k': - $numeric *= 1024; - break; - } - return $numeric; -} - -function encrypt($str, $key): string -{ - $result = ""; - for ($i = 0; $i < strlen($str); $i++) { - $char = substr($str, $i, 1); - $keychar = substr($key, ($i % strlen($key)) - 1, 1); - $char = chr(ord($char) + ord($keychar)); - $result .= $char; - } - return base64_encode($result); -} - -function decrypt($str, $key): string -{ - $str = base64_decode($str); - $result = ""; - for ($i = 0; $i < strlen($str); $i++) { - $char = substr($str, $i, 1); - $keychar = substr($key, ($i % strlen($key)) - 1, 1); - $char = chr(ord($char) - ord($keychar)); - $result .= $char; - } - return $result; -} - -function individualwettbewerbFilter($prefix): string -{ - $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - return " " . $prefix . " (SELECT berechtigt_individualwettbewerb_id FROM #__sportsmanager_berechtigt_fuer_individualwettbewerb INNER JOIN #__sportsmanager_individualwettbewerb ON individualwettbewerb_id = berechtigt_individualwettbewerb_id WHERE berechtigt_user_id = $user_id) "; -} - -function kategorieFilter($prefix, $suffix = ""): string -{ - global $params; - - $kategorien = explode(",", $params->get('kategorien')); - $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; - } - } - } - - if (empty($result)) { - return ""; - } - - $filter = array_keys($result); - sort($filter, SORT_NUMERIC); - - return " $prefix (" . implode(", ", $filter) . ") $suffix"; -} - -function idListeParameterFilter(string $parameterName, string $prefix, string $suffix = ""): string -{ - $jInput = Factory::getContainer()->get(SiteApplication::class)->input; - $werte = $jInput->get($parameterName, '', 'STRING'); - - $result = []; - foreach (explode(",", $werte) as $item) { - $item = trim($item); - if ($item === '') continue; - - $num = intval($item); - if ($num > 0) { - $result[$num] = true; // Duplikate vermeiden - } - } - - if (empty($result)) { - return ""; - } - - $filter = array_keys($result); - sort($filter, SORT_NUMERIC); - - return " $prefix (" . implode(", ", $filter) . ") $suffix"; -} - -function halloffameIdFilter($prefix): string -{ - // Keine Bereichssuche bei der Halloffame-Id, nur einzelne Werte - return idListeParameterFilter('halloffame_id', $prefix); -} - -function halloffameJahrFilter($prefix): string -{ - $minJahr = 1900; - $maxJahr = (int) date('Y') + 5; - - $jInput = Factory::getContainer()->get(SiteApplication::class)->input; - $werte = $jInput->get('jahr', '', 'STRING'); - - $result = []; - foreach (explode(",", $werte) 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) continue; - - // Werte vertauschen, falls der 2. Wert kleiner als der 1. ist - if ($end < $start) { - [$start, $end] = [$end, $start]; - } - - // Bereich auf 1900 .. aktuelles Jahr+5 begrenzen - $start = max($start, $minJahr); - $end = min($end, $maxJahr); - - if ($start > $end) continue; - - for ($i = $start; $i <= $end; $i++) { - $result[$i] = true; // Duplikate vermeiden - } - } else { - $num = intval($item); - if ($num <= 0) continue; - - // Einzelwert auf 1900 .. aktuelles Jahr+5 begrenzen - $num = max($minJahr, min($maxJahr, $num)); - $result[$num] = true; - } - } - - if (empty($result)) { - return ""; - } - - $filter = array_keys($result); - sort($filter, SORT_NUMERIC); - - return " $prefix (" . implode(", ", $filter) . ")"; -} - -function halloffameAlleTeams($db): array -{ - return loadObjectList($db, "SELECT team_id, teamname FROM #__sportsmanager_team ORDER BY team_id DESC"); -} - -function halloffameTeamIdFuerTeamname(array $alleTeams, ?string $teamname) -{ - if (empty($teamname)) - return null; - foreach ($alleTeams as $team) { - if (str_starts_with($team->teamname, $teamname)) - return $team->team_id; - } - return null; -} - -function halloffameAlleSpielerInfo($db): array -{ - // "Aktiv" = hat einen aktuellen Verein; ohne aktuellen Verein liefert spieler_details ohnehin keine Daten - $rows = loadObjectList($db, "SELECT spieler_id, geschlecht, aktueller_verein_id FROM #__sportsmanager_spieler"); - $result = []; - foreach ($rows as $row) { - $result[$row->spieler_id] = (object) [ - 'geschlecht' => $row->geschlecht, - 'aktiv' => !empty($row->aktueller_verein_id), - ]; - } - return $result; -} - -function halloffameSpielerAktiv(array $alleSpielerInfo, $spieler_id): bool -{ - return empty($spieler_id) || !isset($alleSpielerInfo[$spieler_id]) || $alleSpielerInfo[$spieler_id]->aktiv; -} - -function halloffameSpielerBildId(array $alleSpielerInfo, $spieler_id) -{ - return halloffameSpielerAktiv($alleSpielerInfo, $spieler_id) ? $spieler_id : ''; -} - -function halloffameSpielerBildAlternativ(array $alleSpielerInfo, $spieler_id, string $geschaetztesGeschlecht = ''): string -{ - if (!empty($spieler_id) && isset($alleSpielerInfo[$spieler_id])) - return $alleSpielerInfo[$spieler_id]->geschlecht == 'M' ? 'm' : 'w'; - if ($geschaetztesGeschlecht === 'M') - return 'm'; - if ($geschaetztesGeschlecht === 'W') - return 'w'; - return 'n'; -} - -function halloffameGeschlechtZaehlen(object $ziel, array $alleSpielerInfo, $spieler1_id, $spieler2_id): void -{ - foreach ([$spieler1_id, $spieler2_id] as $id) { - if (empty($id) || !isset($alleSpielerInfo[$id])) - continue; - if ($alleSpielerInfo[$id]->geschlecht == 'M') - $ziel->anzahl_m++; - else - $ziel->anzahl_w++; - } -} - -function halloffameGeschaetztesGeschlecht($anzahl_m, $anzahl_w): string -{ - if ($anzahl_m > $anzahl_w) - return 'M'; - if ($anzahl_w > $anzahl_m) - return 'W'; - return ''; -} - -function halloffameAlleVereineInfo($db): array -{ - $rows = loadObjectList($db, "SELECT verein_id, ausgetreten FROM #__sportsmanager_verein"); - $result = []; - foreach ($rows as $row) { - $result[$row->verein_id] = (object) [ - 'aktiv' => empty($row->ausgetreten), - ]; - } - return $result; -} - -function halloffameVereinAktiv(array $alleVereineInfo, $verein_id): bool -{ - return empty($verein_id) || !isset($alleVereineInfo[$verein_id]) || $alleVereineInfo[$verein_id]->aktiv; -} - -function halloffameNameLink(string $bild_type, $id, array $alleSpielerInfo, array $alleVereineInfo, string $nameHtml): string -{ - if (empty($id)) - return $nameHtml; - if ($bild_type === 'spieler' && !halloffameSpielerAktiv($alleSpielerInfo, $id)) - return $nameHtml; - if ($bild_type === 'vereine' && !halloffameVereinAktiv($alleVereineInfo, $id)) - return $nameHtml; - - $tasks = ['spieler' => 'spieler_details', 'vereine' => 'verein_details', 'mannschaften' => 'team_details']; - if (!isset($tasks[$bild_type])) - return $nameHtml; - - return '' . $nameHtml . ''; -} - -function halloffameTitel(): string -{ - global $params; - - $titel = trim((string) $params->get('titel', '')); - if ($titel !== '') - return $titel; - - $menu = Factory::getContainer()->get(SiteApplication::class)->getMenu()->getActive(); - if ($menu !== null && trim((string) $menu->title) !== '') - return $menu->title; - - return ''; -} - -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()) >= -21) "; -} - -function vereinFilter($prefix): string -{ - $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - return " " . $prefix . " (SELECT berechtigt_verein_id FROM #__sportsmanager_berechtigt_fuer_verein INNER JOIN #__sportsmanager_verein ON berechtigt_verein_id = verein_id WHERE berechtigt_user_id = $user_id AND NOT ausgetreten) "; -} - -function veranstalterFilter($prefix): string -{ - $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; - return " " . $prefix . " (SELECT berechtigt_veranstalter_id FROM #__sportsmanager_berechtigt_fuer_veranstalter WHERE berechtigt_user_id = $user_id) "; -} - -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()) >= -21) "; -} - -// Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres -function firstkw($jahr): bool|int -{ - $erster = mktime(0, 0, 0, 1, 1, $jahr); - $wtag = date('w', $erster); - if ($wtag <= 4) { - /** - * Donnerstag oder kleiner: auf den Montag zurückrechnen. - */ - $montag = mktime(0, 0, 0, 1, 1 - ($wtag - 1), $jahr); - } else { - /** - * auf den Montag nach vorne rechnen. - */ - $montag = mktime(0, 0, 0, 1, 1 + (7 - $wtag + 1), $jahr); - } - return $montag; -} - -// Berechnet Wochentag über Kalenderwoche, Jahr und Wochentag (0 = Montag, ..., 6 = Sonntag) -function mondaykw($kw, $jahr, $weekday): bool|int -{ - $firstmonday = firstkw($jahr); - $mon_monat = date('m', $firstmonday); - $mon_jahr = date('Y', $firstmonday); - $mon_tage = (int)date('d', $firstmonday); - $tage = ($kw - 1) * 7; - return mktime(0, 0, 0, $mon_monat, $mon_tage + $tage + $weekday, $mon_jahr); -} - -// Berechnet Termin am Wochentag (0 = Montag, ..., 6 = Sonntag) in Kalenderwoche zum Datum -function geaenderterWochentag($datum, $wochentag): bool|int -{ - $wtag = date('w', $datum); - if ($wtag == 0) // Sonntag - $wtag = 7; - $mon_monat = date('m', $datum); - $mon_jahr = date('Y', $datum); - $mon_tage = (int)date('d', $datum); - return mktime(0, 0, 0, $mon_monat, $mon_tage + 1 - $wtag + $wochentag, $mon_jahr); -} - -function normalisiertesDatum($datum): ?string -{ - if ($datum == NULL) - return NULL; - - if (str_contains($datum, "-")) - $trennzeichen = "-"; - else - $trennzeichen = "."; - - $t = explode($trennzeichen, $datum); - $n = count($t); - if ($n == 1) { - $s = $t[0]; - if (strlen($s) < 8) - return NULL; - $jahr = intval(substr($s, 0, 4)); - $monat = intval(substr($s, 4, 2)); - $tag = intval(substr($s, 6, 2)); - } else if ($n == 3) { - if ($trennzeichen != ".") { - $jahr = intval($t[0]); - if (strlen($t[0]) <= 2) - $jahr += 1900; - $monat = intval($t[1]); - $tag = intval($t[2]); - } else { - $tag = intval($t[0]); - $monat = intval($t[1]); - $jahr = intval($t[2]); - if (strlen($t[2]) <= 2) - $jahr += 1900; - } - } else - return NULL; - - if (!checkdate($monat, $tag, $jahr)) - return NULL; - - return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag); -} - -function normalisierteUhrzeit($uhrzeit): ?string -{ - if ($uhrzeit == NULL) - return NULL; - - if (str_contains($uhrzeit, "-")) - $trennzeichen = "-"; - else - $trennzeichen = ":"; - - $t = explode($trennzeichen, $uhrzeit); - $n = count($t); - if ($n == 1) { - $s = $t[0]; - $len = strlen($s); - if ($len != 4 && $len != 6) - return NULL; - $stunden = intval(substr($s, 0, 2)); - $minuten = intval(substr($s, 2, 2)); - $sekunden = $len != 6 ? 0 : intval(substr($s, 4, 2)); - } else if ($n == 2 || $n == 3) { - $stunden = intval($t[0]); - $minuten = intval($t[1]); - $sekunden = $n != 3 ? 0 : intval($t[2]); - } else - return NULL; - - if ($stunden < 0 || $stunden > 23 || $minuten < 0 || $minuten > 59 || $sekunden < 0 || $sekunden > 59) - return NULL; - - return sprintf("%02d:%02d:%02d", $stunden, $minuten, $sekunden); -} - -function runden_detailliert_invers($runden): ?string -{ - if ($runden == null) - return null; - $runden_invers = ""; - $saetze = explode(" ", $runden); - foreach ($saetze as $satz) { - $punkte = explode(":", $satz); - if (!empty($runden_invers)) - $runden_invers .= " "; - $runden_invers .= $punkte[1] . ":" . $punkte[0]; - } - return $runden_invers; -} - -function runden_detailliert_auswertung($runden): array -{ - $ergebnis = 0; - $heim_saetze = 0; - $unentschieden_saetze = 0; - $gast_saetze = 0; - $heim_punkte = 0; - $gast_punkte = 0; - if ($runden != null) { - $saetze = explode(" ", $runden); - foreach ($saetze as $satz) { - $punkte = explode(":", $satz); - $heim_punkte += (int)$punkte[0]; - $gast_punkte += (int)$punkte[1]; - if ($punkte[0] > $punkte[1]) - $heim_saetze++; - else if ($punkte[0] < $punkte[1]) - $gast_saetze++; - else - $unentschieden_saetze++; - } - if ($heim_saetze > $gast_saetze) - $ergebnis = 1; - else if ($heim_saetze < $gast_saetze) - $ergebnis = 2; - } - return array($ergebnis, $heim_saetze, $unentschieden_saetze, $gast_saetze, $heim_punkte, $gast_punkte); -} - -function spielpunkteFuerSpiel($wertung, $heim_punkte, $gast_punkte, $ergebnis_detailliert = null): array -{ - if ($wertung == 2) - return array($heim_punkte, $gast_punkte); - if ($wertung == 4) { - if (empty($ergebnis_detailliert)) - return array(2 * (int)$heim_punkte, 2 * (int)$gast_punkte); - $auswertung = runden_detailliert_auswertung($ergebnis_detailliert); - return array(2 * $auswertung[1] + $auswertung[2], 2 * $auswertung[3] + $auswertung[2]); - } - $sieg = $wertung == 0 ? 2 : ($wertung == 1 ? 3 : 1); - if ($heim_punkte > $gast_punkte) - return array($sieg, 0); - if ($heim_punkte < $gast_punkte) - return array(0, $sieg); - if (($heim_punkte == 0 && $gast_punkte == 0) || $wertung == 3) - return array(0, 0); - return array(1, 1); -} - -function toreFuerSpiel($punktetyp, $satzergebnisse, $heim_punkte, $gast_punkte, $ergebnis_detailliert): array -{ - if ($punktetyp == 0) - return array((int)$heim_punkte, (int)$gast_punkte); - if (!empty($satzergebnisse) && !empty($ergebnis_detailliert)) { - $auswertung = runden_detailliert_auswertung($ergebnis_detailliert); - return array($auswertung[4], $auswertung[5]); - } - return array(null, null); -} - -// pass two file names -// returns TRUE if files are the same, FALSE otherwise -function files_identical($fn1, $fn2): bool -{ - if (!is_file($fn1) || !is_file($fn2)) - return FALSE; - - if (filesize($fn1) !== filesize($fn2)) - return FALSE; - - if (!$fp1 = fopen($fn1, 'rb')) - return FALSE; - - if (!$fp2 = fopen($fn2, 'rb')) { - fclose($fp1); - return FALSE; - } - - $same = TRUE; - while (!feof($fp1) and !feof($fp2)) - if (fread($fp1, 4096) !== fread($fp2, 4096)) { - $same = FALSE; - break; - } - - if (feof($fp1) !== feof($fp2)) - $same = FALSE; - - fclose($fp1); - fclose($fp2); - - return $same; -} - +createFunc("ROUND", 'round', 1); + $this->createFunc("VERTEILUNG", 'mathParserVerteilung', 4); + $this->createFunc("VERTEILUNGR", 'mathParserVerteilungR', 4); + } catch (Exception $e) { + Log::add('an error occurred: ' . $e->getMessage(), Log::ERROR, 'com_sportsmanager'); + throw new RuntimeException('An error occurred.', 500); + } + } +} + +#[NoReturn] function keinZugriff($login = FALSE): void +{ + if (isJson()) { + abortWithError(401 . ' Unauthorized'); + } + if (!$login || Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id) { + Log::add('Unauthorized user with id ' . Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id, Log::WARNING, 'com_sportsmanager'); + throw new RuntimeException('Not authorized!', 401); + } + $version = new Version(); + $joomla = $version->getShortVersion(); + $u = Uri::getInstance(); + $redirectUrl = urlencode(base64_encode($u->toString())); + $redirectUrl = '&return=' . $redirectUrl; + $joomlaLoginUrl = 'index.php?option=' . (!str_starts_with($joomla, '1.5') ? 'com_users' : 'com_user') . '&view=login'; + $finalUrl = $joomlaLoginUrl . $redirectUrl; + $app = Factory::getContainer()->get(SiteApplication::class); + $app->redirect(Route::_($finalUrl)); + jexit(); +} + +function bereinigterDateiname($dateiname): array|string +{ + $_convertTable = array( + '&' => 'and', '@' => 'at', '©' => 'c', '®' => 'r', 'À' => 'a', + 'Á' => 'a', 'Â' => 'a', 'Ä' => 'a', 'Å' => 'a', 'Æ' => 'ae', 'Ç' => 'c', + 'È' => 'e', 'É' => 'e', 'Ë' => 'e', 'Ì' => 'i', 'Í' => 'i', 'Î' => 'i', + 'Ï' => 'i', 'Ò' => 'o', 'Ó' => 'o', 'Ô' => 'o', 'Õ' => 'o', 'Ö' => 'o', + 'Ø' => 'o', 'Ù' => 'u', 'Ú' => 'u', 'Û' => 'u', 'Ü' => 'u', 'Ý' => 'y', + 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ä' => 'a', 'å' => 'a', + 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', + 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ò' => 'o', 'ó' => 'o', + 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', + 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'þ' => 'p', 'ÿ' => 'y', 'Ā' => 'a', + 'ā' => 'a', 'Ă' => 'a', 'ă' => 'a', 'Ą' => 'a', 'ą' => 'a', 'Ć' => 'c', + 'ć' => 'c', 'Ĉ' => 'c', 'ĉ' => 'c', 'Ċ' => 'c', 'ċ' => 'c', 'Č' => 'c', + 'č' => 'c', 'Ď' => 'd', 'ď' => 'd', 'Đ' => 'd', 'đ' => 'd', 'Ē' => 'e', + 'ē' => 'e', 'Ĕ' => 'e', 'ĕ' => 'e', 'Ė' => 'e', 'ė' => 'e', 'Ę' => 'e', + 'ę' => 'e', 'Ě' => 'e', 'ě' => 'e', 'Ĝ' => 'g', 'ĝ' => 'g', 'Ğ' => 'g', + 'ğ' => 'g', 'Ġ' => 'g', 'ġ' => 'g', 'Ģ' => 'g', 'ģ' => 'g', 'Ĥ' => 'h', + 'ĥ' => 'h', 'Ħ' => 'h', 'ħ' => 'h', 'Ĩ' => 'i', 'ĩ' => 'i', 'Ī' => 'i', + 'ī' => 'i', 'Ĭ' => 'i', 'ĭ' => 'i', 'Į' => 'i', 'į' => 'i', 'İ' => 'i', + 'ı' => 'i', 'IJ' => 'ij', 'ij' => 'ij', 'Ĵ' => 'j', 'ĵ' => 'j', 'Ķ' => 'k', + 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'l', 'ĺ' => 'l', 'Ļ' => 'l', 'ļ' => 'l', + 'Ľ' => 'l', 'ľ' => 'l', 'Ŀ' => 'l', 'ŀ' => 'l', 'Ł' => 'l', 'ł' => 'l', + 'Ń' => 'n', 'ń' => 'n', 'Ņ' => 'n', 'ņ' => 'n', 'Ň' => 'n', 'ň' => 'n', + 'ʼn' => 'n', 'Ŋ' => 'n', 'ŋ' => 'n', 'Ō' => 'o', 'ō' => 'o', 'Ŏ' => 'o', + 'ŏ' => 'o', 'Ő' => 'o', 'ő' => 'o', 'Œ' => 'oe', 'œ' => 'oe', 'Ŕ' => 'r', + 'ŕ' => 'r', 'Ŗ' => 'r', 'ŗ' => 'r', 'Ř' => 'r', 'ř' => 'r', 'Ś' => 's', + 'ś' => 's', 'Ŝ' => 's', 'ŝ' => 's', 'Ş' => 's', 'ş' => 's', 'Š' => 's', + 'š' => 's', 'Ţ' => 't', 'ţ' => 't', 'Ť' => 't', 'ť' => 't', 'Ŧ' => 't', + 'ŧ' => 't', 'Ũ' => 'u', 'ũ' => 'u', 'Ū' => 'u', 'ū' => 'u', 'Ŭ' => 'u', + 'ŭ' => 'u', 'Ů' => 'u', 'ů' => 'u', 'Ű' => 'u', 'ű' => 'u', 'Ų' => 'u', + 'ų' => 'u', 'Ŵ' => 'w', 'ŵ' => 'w', 'Ŷ' => 'y', 'ŷ' => 'y', 'Ÿ' => 'y', + 'Ź' => 'z', 'ź' => 'z', 'Ż' => 'z', 'ż' => 'z', 'Ž' => 'z', 'ž' => 'z', + 'ſ' => 'z', 'Ə' => 'e', 'ƒ' => 'f', 'Ơ' => 'o', 'ơ' => 'o', 'Ư' => 'u', + 'ư' => 'u', 'Ǎ' => 'a', 'ǎ' => 'a', 'Ǐ' => 'i', 'ǐ' => 'i', 'Ǒ' => 'o', + 'ǒ' => 'o', 'Ǔ' => 'u', 'ǔ' => 'u', 'Ǖ' => 'u', 'ǖ' => 'u', 'Ǘ' => 'u', + 'ǘ' => 'u', 'Ǚ' => 'u', 'ǚ' => 'u', 'Ǜ' => 'u', 'ǜ' => 'u', 'Ǻ' => 'a', + 'ǻ' => 'a', 'Ǽ' => 'ae', 'ǽ' => 'ae', 'Ǿ' => 'o', 'ǿ' => 'o', 'ə' => 'e', + 'Ё' => 'jo', 'Є' => 'e', 'І' => 'i', 'Ї' => 'i', 'А' => 'a', 'Б' => 'b', + 'В' => 'v', 'Г' => 'g', 'Д' => 'd', 'Е' => 'e', 'Ж' => 'zh', 'З' => 'z', + 'И' => 'i', 'Й' => 'j', 'К' => 'k', 'Л' => 'l', 'М' => 'm', 'Н' => 'n', + 'О' => 'o', 'П' => 'p', 'Р' => 'r', 'С' => 's', 'Т' => 't', 'У' => 'u', + 'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c', 'Ч' => 'ch', 'Ш' => 'sh', 'Щ' => 'sch', + 'Ъ' => '-', 'Ы' => 'y', 'Ь' => '-', 'Э' => 'je', 'Ю' => 'ju', 'Я' => 'ja', + 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', + 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', + 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', + 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', + 'ш' => 'sh', 'щ' => 'sch', 'ъ' => '-', 'ы' => 'y', 'ь' => '-', 'э' => 'je', + 'ю' => 'ju', 'я' => 'ja', 'ё' => 'jo', 'є' => 'e', 'і' => 'i', 'ї' => 'i', + 'Ґ' => 'g', 'ґ' => 'g', 'א' => 'a', 'ב' => 'b', 'ג' => 'g', 'ד' => 'd', + 'ה' => 'h', 'ו' => 'v', 'ז' => 'z', 'ח' => 'h', 'ט' => 't', 'י' => 'i', + 'ך' => 'k', 'כ' => 'k', 'ל' => 'l', 'ם' => 'm', 'מ' => 'm', 'ן' => 'n', + 'נ' => 'n', 'ס' => 's', 'ע' => 'e', 'ף' => 'p', 'פ' => 'p', 'ץ' => 'C', + 'צ' => 'c', 'ק' => 'q', 'ר' => 'r', 'ש' => 'w', 'ת' => 't', '™' => 'tm', + ); + $bad = array_merge( + array_map('chr', range(0, 31)), + array("<", ">", ":", '"', "/", "\\", "|", "?", "*")); + + return str_replace($bad, "", strtr($dateiname, $_convertTable)); +} + +function setMinMemoryLimit($memDestSize): void +{ + if (getBytes(ini_get('memory_limit')) < getBytes($memDestSize)) + ini_set('memory_limit', $memDestSize); +} + +function getBytes($val): int|string +{ + $val = trim($val); + $numeric = substr($val, 0, strlen($val) - 1); + $last = strtolower($val[strlen($val) - 1]); + switch ($last) { + // The 'G' modifier is available since PHP 5.1.0 + case 'm': + case 'g': + case 'k': + $numeric *= 1024; + break; + } + return $numeric; +} + +function encrypt($str, $key): string +{ + $result = ""; + for ($i = 0; $i < strlen($str); $i++) { + $char = substr($str, $i, 1); + $keychar = substr($key, ($i % strlen($key)) - 1, 1); + $char = chr(ord($char) + ord($keychar)); + $result .= $char; + } + return base64_encode($result); +} + +function decrypt($str, $key): string +{ + $str = base64_decode($str); + $result = ""; + for ($i = 0; $i < strlen($str); $i++) { + $char = substr($str, $i, 1); + $keychar = substr($key, ($i % strlen($key)) - 1, 1); + $char = chr(ord($char) - ord($keychar)); + $result .= $char; + } + return $result; +} + +function individualwettbewerbFilter($prefix): string +{ + $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; + return " " . $prefix . " (SELECT berechtigt_individualwettbewerb_id FROM #__sportsmanager_berechtigt_fuer_individualwettbewerb INNER JOIN #__sportsmanager_individualwettbewerb ON individualwettbewerb_id = berechtigt_individualwettbewerb_id WHERE berechtigt_user_id = $user_id) "; +} + +function kategorieFilter($prefix, $suffix = ""): string +{ + global $params; + + $kategorien = explode(",", $params->get('kategorien')); + $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; + } + } + } + + if (empty($result)) { + return ""; + } + + $filter = array_keys($result); + sort($filter, SORT_NUMERIC); + + return " $prefix (" . implode(", ", $filter) . ") $suffix"; +} + +function idListeParameterFilter(string $parameterName, string $prefix, string $suffix = ""): string +{ + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + $werte = $jInput->get($parameterName, '', 'STRING'); + + $result = []; + foreach (explode(",", $werte) as $item) { + $item = trim($item); + if ($item === '') continue; + + $num = intval($item); + if ($num > 0) { + $result[$num] = true; // Duplikate vermeiden + } + } + + if (empty($result)) { + return ""; + } + + $filter = array_keys($result); + sort($filter, SORT_NUMERIC); + + return " $prefix (" . implode(", ", $filter) . ") $suffix"; +} + +function halloffameIdFilter($prefix): string +{ + // Keine Bereichssuche bei der Halloffame-Id, nur einzelne Werte + return idListeParameterFilter('halloffame_id', $prefix); +} + +function halloffameJahrFilter($prefix): string +{ + $minJahr = 1900; + $maxJahr = (int) date('Y') + 5; + + $jInput = Factory::getContainer()->get(SiteApplication::class)->input; + $werte = $jInput->get('jahr', '', 'STRING'); + + $result = []; + foreach (explode(",", $werte) 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) continue; + + // Werte vertauschen, falls der 2. Wert kleiner als der 1. ist + if ($end < $start) { + [$start, $end] = [$end, $start]; + } + + // Bereich auf 1900 .. aktuelles Jahr+5 begrenzen + $start = max($start, $minJahr); + $end = min($end, $maxJahr); + + if ($start > $end) continue; + + for ($i = $start; $i <= $end; $i++) { + $result[$i] = true; // Duplikate vermeiden + } + } else { + $num = intval($item); + if ($num <= 0) continue; + + // Einzelwert auf 1900 .. aktuelles Jahr+5 begrenzen + $num = max($minJahr, min($maxJahr, $num)); + $result[$num] = true; + } + } + + if (empty($result)) { + return ""; + } + + $filter = array_keys($result); + sort($filter, SORT_NUMERIC); + + return " $prefix (" . implode(", ", $filter) . ")"; +} + +function halloffameAlleTeams($db): array +{ + return loadObjectList($db, "SELECT team_id, teamname FROM #__sportsmanager_team ORDER BY team_id DESC"); +} + +function halloffameTeamIdFuerTeamname(array $alleTeams, ?string $teamname) +{ + if (empty($teamname)) + return null; + foreach ($alleTeams as $team) { + if (str_starts_with($team->teamname, $teamname)) + return $team->team_id; + } + return null; +} + +function halloffameAlleSpielerInfo($db): array +{ + // "Aktiv" = hat einen aktuellen Verein; ohne aktuellen Verein liefert spieler_details ohnehin keine Daten + $rows = loadObjectList($db, "SELECT spieler_id, geschlecht, aktueller_verein_id FROM #__sportsmanager_spieler"); + $result = []; + foreach ($rows as $row) { + $result[$row->spieler_id] = (object) [ + 'geschlecht' => $row->geschlecht, + 'aktiv' => !empty($row->aktueller_verein_id), + ]; + } + return $result; +} + +function halloffameSpielerAktiv(array $alleSpielerInfo, $spieler_id): bool +{ + return empty($spieler_id) || !isset($alleSpielerInfo[$spieler_id]) || $alleSpielerInfo[$spieler_id]->aktiv; +} + +function halloffameSpielerBildId(array $alleSpielerInfo, $spieler_id) +{ + return halloffameSpielerAktiv($alleSpielerInfo, $spieler_id) ? $spieler_id : ''; +} + +function halloffameSpielerBildAlternativ(array $alleSpielerInfo, $spieler_id, string $geschaetztesGeschlecht = ''): string +{ + if (!empty($spieler_id) && isset($alleSpielerInfo[$spieler_id])) + return $alleSpielerInfo[$spieler_id]->geschlecht == 'M' ? 'm' : 'w'; + if ($geschaetztesGeschlecht === 'M') + return 'm'; + if ($geschaetztesGeschlecht === 'W') + return 'w'; + return 'n'; +} + +function halloffameGeschlechtZaehlen(object $ziel, array $alleSpielerInfo, $spieler1_id, $spieler2_id): void +{ + foreach ([$spieler1_id, $spieler2_id] as $id) { + if (empty($id) || !isset($alleSpielerInfo[$id])) + continue; + if ($alleSpielerInfo[$id]->geschlecht == 'M') + $ziel->anzahl_m++; + else + $ziel->anzahl_w++; + } +} + +function halloffameGeschaetztesGeschlecht($anzahl_m, $anzahl_w): string +{ + if ($anzahl_m > $anzahl_w) + return 'M'; + if ($anzahl_w > $anzahl_m) + return 'W'; + return ''; +} + +function halloffameAlleVereineInfo($db): array +{ + $rows = loadObjectList($db, "SELECT verein_id, ausgetreten FROM #__sportsmanager_verein"); + $result = []; + foreach ($rows as $row) { + $result[$row->verein_id] = (object) [ + 'aktiv' => empty($row->ausgetreten), + ]; + } + return $result; +} + +function halloffameVereinAktiv(array $alleVereineInfo, $verein_id): bool +{ + return empty($verein_id) || !isset($alleVereineInfo[$verein_id]) || $alleVereineInfo[$verein_id]->aktiv; +} + +function halloffameNameLink(string $bild_type, $id, array $alleSpielerInfo, array $alleVereineInfo, string $nameHtml): string +{ + if (empty($id)) + return $nameHtml; + if ($bild_type === 'spieler' && !halloffameSpielerAktiv($alleSpielerInfo, $id)) + return $nameHtml; + if ($bild_type === 'vereine' && !halloffameVereinAktiv($alleVereineInfo, $id)) + return $nameHtml; + + $tasks = ['spieler' => 'spieler_details', 'vereine' => 'verein_details', 'mannschaften' => 'team_details']; + if (!isset($tasks[$bild_type])) + return $nameHtml; + + return '' . $nameHtml . ''; +} + +function halloffameTitel(): string +{ + global $params; + + $titel = trim((string) $params->get('titel', '')); + if ($titel !== '') + return $titel; + + $menu = Factory::getContainer()->get(SiteApplication::class)->getMenu()->getActive(); + if ($menu !== null && trim((string) $menu->title) !== '') + return $menu->title; + + return ''; +} + +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()) >= -21) "; +} + +function vereinFilter($prefix): string +{ + $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; + return " " . $prefix . " (SELECT berechtigt_verein_id FROM #__sportsmanager_berechtigt_fuer_verein INNER JOIN #__sportsmanager_verein ON berechtigt_verein_id = verein_id WHERE berechtigt_user_id = $user_id AND NOT ausgetreten) "; +} + +function veranstalterFilter($prefix): string +{ + $user_id = isExternalDatabase() ? 0 : Factory::getContainer()->get(SiteApplication::class)->getIdentity()->id; + return " " . $prefix . " (SELECT berechtigt_veranstalter_id FROM #__sportsmanager_berechtigt_fuer_veranstalter WHERE berechtigt_user_id = $user_id) "; +} + +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()) >= -21) "; +} + +// Berechnet Datum zum Montag der ersten Kalenderwoche eines Jahres +function firstkw($jahr): bool|int +{ + $erster = mktime(0, 0, 0, 1, 1, $jahr); + $wtag = date('w', $erster); + if ($wtag <= 4) { + /** + * Donnerstag oder kleiner: auf den Montag zurückrechnen. + */ + $montag = mktime(0, 0, 0, 1, 1 - ($wtag - 1), $jahr); + } else { + /** + * auf den Montag nach vorne rechnen. + */ + $montag = mktime(0, 0, 0, 1, 1 + (7 - $wtag + 1), $jahr); + } + return $montag; +} + +// Berechnet Wochentag über Kalenderwoche, Jahr und Wochentag (0 = Montag, ..., 6 = Sonntag) +function mondaykw($kw, $jahr, $weekday): bool|int +{ + $firstmonday = firstkw($jahr); + $mon_monat = date('m', $firstmonday); + $mon_jahr = date('Y', $firstmonday); + $mon_tage = (int)date('d', $firstmonday); + $tage = ($kw - 1) * 7; + return mktime(0, 0, 0, $mon_monat, $mon_tage + $tage + $weekday, $mon_jahr); +} + +// Berechnet Termin am Wochentag (0 = Montag, ..., 6 = Sonntag) in Kalenderwoche zum Datum +function geaenderterWochentag($datum, $wochentag): bool|int +{ + $wtag = date('w', $datum); + if ($wtag == 0) // Sonntag + $wtag = 7; + $mon_monat = date('m', $datum); + $mon_jahr = date('Y', $datum); + $mon_tage = (int)date('d', $datum); + return mktime(0, 0, 0, $mon_monat, $mon_tage + 1 - $wtag + $wochentag, $mon_jahr); +} + +function normalisiertesDatum($datum): ?string +{ + if ($datum == NULL) + return NULL; + + if (str_contains($datum, "-")) + $trennzeichen = "-"; + else + $trennzeichen = "."; + + $t = explode($trennzeichen, $datum); + $n = count($t); + if ($n == 1) { + $s = $t[0]; + if (strlen($s) < 8) + return NULL; + $jahr = intval(substr($s, 0, 4)); + $monat = intval(substr($s, 4, 2)); + $tag = intval(substr($s, 6, 2)); + } else if ($n == 3) { + if ($trennzeichen != ".") { + $jahr = intval($t[0]); + if (strlen($t[0]) <= 2) + $jahr += 1900; + $monat = intval($t[1]); + $tag = intval($t[2]); + } else { + $tag = intval($t[0]); + $monat = intval($t[1]); + $jahr = intval($t[2]); + if (strlen($t[2]) <= 2) + $jahr += 1900; + } + } else + return NULL; + + if (!checkdate($monat, $tag, $jahr)) + return NULL; + + return sprintf("%04d-%02d-%02d", $jahr, $monat, $tag); +} + +function normalisierteUhrzeit($uhrzeit): ?string +{ + if ($uhrzeit == NULL) + return NULL; + + if (str_contains($uhrzeit, "-")) + $trennzeichen = "-"; + else + $trennzeichen = ":"; + + $t = explode($trennzeichen, $uhrzeit); + $n = count($t); + if ($n == 1) { + $s = $t[0]; + $len = strlen($s); + if ($len != 4 && $len != 6) + return NULL; + $stunden = intval(substr($s, 0, 2)); + $minuten = intval(substr($s, 2, 2)); + $sekunden = $len != 6 ? 0 : intval(substr($s, 4, 2)); + } else if ($n == 2 || $n == 3) { + $stunden = intval($t[0]); + $minuten = intval($t[1]); + $sekunden = $n != 3 ? 0 : intval($t[2]); + } else + return NULL; + + if ($stunden < 0 || $stunden > 23 || $minuten < 0 || $minuten > 59 || $sekunden < 0 || $sekunden > 59) + return NULL; + + return sprintf("%02d:%02d:%02d", $stunden, $minuten, $sekunden); +} + +function runden_detailliert_invers($runden): ?string +{ + if ($runden == null) + return null; + $runden_invers = ""; + $saetze = explode(" ", $runden); + foreach ($saetze as $satz) { + $punkte = explode(":", $satz); + if (!empty($runden_invers)) + $runden_invers .= " "; + $runden_invers .= $punkte[1] . ":" . $punkte[0]; + } + return $runden_invers; +} + +function runden_detailliert_auswertung($runden): array +{ + $ergebnis = 0; + $heim_saetze = 0; + $unentschieden_saetze = 0; + $gast_saetze = 0; + $heim_punkte = 0; + $gast_punkte = 0; + if ($runden != null) { + $saetze = explode(" ", $runden); + foreach ($saetze as $satz) { + $punkte = explode(":", $satz); + $heim_punkte += (int)$punkte[0]; + $gast_punkte += (int)$punkte[1]; + if ($punkte[0] > $punkte[1]) + $heim_saetze++; + else if ($punkte[0] < $punkte[1]) + $gast_saetze++; + else + $unentschieden_saetze++; + } + if ($heim_saetze > $gast_saetze) + $ergebnis = 1; + else if ($heim_saetze < $gast_saetze) + $ergebnis = 2; + } + return array($ergebnis, $heim_saetze, $unentschieden_saetze, $gast_saetze, $heim_punkte, $gast_punkte); +} + +function spielpunkteFuerSpiel($wertung, $heim_punkte, $gast_punkte, $ergebnis_detailliert = null): array +{ + if ($wertung == 2) + return array($heim_punkte, $gast_punkte); + $je_satz = $wertung >= 10; + $grund = $wertung % 10; + $sieg = $grund == 0 ? 2 : ($grund == 1 ? 3 : 1); + $remis = $grund == 3 ? 0 : 1; + if ($je_satz) { + if (empty($ergebnis_detailliert)) + return array($sieg * (int)$heim_punkte, $sieg * (int)$gast_punkte); + $auswertung = runden_detailliert_auswertung($ergebnis_detailliert); + return array($sieg * $auswertung[1] + $remis * $auswertung[2], + $sieg * $auswertung[3] + $remis * $auswertung[2]); + } + if ($heim_punkte > $gast_punkte) + return array($sieg, 0); + if ($heim_punkte < $gast_punkte) + return array(0, $sieg); + if ($heim_punkte == 0 && $gast_punkte == 0) + return array(0, 0); + return array($remis, $remis); +} + +function toreFuerSpiel($punktetyp, $satzergebnisse, $heim_punkte, $gast_punkte, $ergebnis_detailliert): array +{ + if ($punktetyp == 0) + return array((int)$heim_punkte, (int)$gast_punkte); + if (!empty($satzergebnisse) && !empty($ergebnis_detailliert)) { + $auswertung = runden_detailliert_auswertung($ergebnis_detailliert); + return array($auswertung[4], $auswertung[5]); + } + return array(null, null); +} + +// pass two file names +// returns TRUE if files are the same, FALSE otherwise +function files_identical($fn1, $fn2): bool +{ + if (!is_file($fn1) || !is_file($fn2)) + return FALSE; + + if (filesize($fn1) !== filesize($fn2)) + return FALSE; + + if (!$fp1 = fopen($fn1, 'rb')) + return FALSE; + + if (!$fp2 = fopen($fn2, 'rb')) { + fclose($fp1); + return FALSE; + } + + $same = TRUE; + while (!feof($fp1) and !feof($fp2)) + if (fread($fp1, 4096) !== fread($fp2, 4096)) { + $same = FALSE; + break; + } + + if (feof($fp1) !== feof($fp2)) + $same = FALSE; + + fclose($fp1); + fclose($fp2); + + return $same; +} + 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 bf63b26..e47bc1d 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view.html.php @@ -1708,7 +1708,7 @@ if (count($spiele) > 0) { static function tabelleAnzeigen($veranstaltung, $modus, $teams, $spieltag, $spieltage, $alleine_angezeigt, int $praesentation = 0): void { global $params; - $je_satz = !empty($modus) && ($modus->spielpunkte_wertung_einzel == 4 || $modus->spielpunkte_wertung_doppel == 4); + $je_satz = !empty($modus) && ($modus->spielpunkte_wertung_einzel >= 10 || $modus->spielpunkte_wertung_doppel >= 10); if (count($teams) > 0) { if ($alleine_angezeigt && $veranstaltung->tabellenwertung >= -1 && $veranstaltung->tabellenwertung <= 11 && count($spieltage) > 1) { ?> 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 d9ccbc6..0eafc06 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -4860,7 +4860,7 @@ class HTML_sportsmanager_admin var _punktetyp_vorher = satzergebnisse) ? 2 : (int)($row->punktetyp ?? 0); ?>; var _hat_ergebnisse = hat_ergebnisse) ? 'true' : 'false'; ?>; - var _wertung4_vorher = spielpunkte_wertung_einzel == 4 || $row->spielpunkte_wertung_doppel == 4) ? 'true' : 'false'; ?>; + var _wertung4_vorher = spielpunkte_wertung_einzel >= 10 || $row->spielpunkte_wertung_doppel >= 10) ? 'true' : 'false'; ?>; function punktetyp_geprueft() { if (!_hat_ergebnisse) return true; @@ -4868,8 +4868,8 @@ class HTML_sportsmanager_admin && !confirm()) return false; var separat = document.adminForm.spielpunkte_wertung_doppel_separat.value == 1; - var wertung4 = document.adminForm.spielpunkte_wertung_einzel.value == 4 - || (separat && document.adminForm.spielpunkte_wertung_doppel.value == 4); + var wertung4 = Number(document.adminForm.spielpunkte_wertung_einzel.value) >= 10 + || (separat && Number(document.adminForm.spielpunkte_wertung_doppel.value) >= 10); if (wertung4 !== _wertung4_vorher) return confirm(); return true; @@ -5136,7 +5136,9 @@ class HTML_sportsmanager_admin } $html .= ''; $html .= ''; - $html .= ''; + foreach (array(13 => 'COM_SPORTSMANAGER_WIN_1_POINT_PER_SET', 10 => 'COM_SPORTSMANAGER_WIN_2_POINTS_PER_SET', 11 => 'COM_SPORTSMANAGER_WIN_3_POINTS_PER_SET') as $wert => $schluessel) { + $html .= ''; + } $html .= ''; return $html; }; @@ -12752,7 +12754,7 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void . "}\n"; } } - if ($spielpunkte_wertung_einzel == 4 || $spielpunkte_wertung_doppel == 4) { + if ($spielpunkte_wertung_einzel >= 10 || $spielpunkte_wertung_doppel >= 10) { echo "function satz_summen(nr) {\n" . " var heim = document.getElementsByName('spiel_' + nr + '_heim_punkte_detailliert[]');\n" . " var gast = document.getElementsByName('spiel_' + nr + '_gast_punkte_detailliert[]');\n" @@ -12773,10 +12775,13 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void for ($i = 1; $i <= count($spieltypen); $i++) { $d = $spieltypen[$i - 1][0] == "D"; $w = $d ? $spielpunkte_wertung_doppel : $spielpunkte_wertung_einzel; - if ($w == 4) { + if ($w >= 10) { + $g = $w % 10; + $sieg = $g == 0 ? 2 : ($g == 1 ? 3 : 1); + $remis = $g == 3 ? 0 : 1; echo " satzstand = satz_summen(" . $i . ");\n" - . " sh += 2 * satzstand[0] + satzstand[1];\n" - . " sg += 2 * satzstand[2] + satzstand[1];\n"; + . " sh += " . $sieg . " * satzstand[0] + " . $remis . " * satzstand[1];\n" + . " sg += " . $sieg . " * satzstand[2] + " . $remis . " * satzstand[1];\n"; continue; } echo " h = document.adminForm['spiel_" . $i . "_heim_punkte'];\n" @@ -12927,10 +12932,10 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void echo "function spielpunkte_bedingung() {\n" . " var spielpunkte_heim = 0;\n" . " var spielpunkte_gast = 0;\n" - . " var spielpunkte_sieg_einzel = " . ($spielpunkte_wertung_einzel == 0 ? 2 : ($spielpunkte_wertung_einzel == 1 ? 3 : 1)) . ";\n" - . " var spielpunkte_sieg_doppel = " . ($spielpunkte_wertung_doppel == 0 ? 2 : ($spielpunkte_wertung_doppel == 1 ? 3 : 1)) . ";\n" - . " var spielpunkte_unentschieden_einzel = " . ($spielpunkte_wertung_einzel <= 1 ? 1 : 0) . ";\n" - . " var spielpunkte_unentschieden_doppel = " . ($spielpunkte_wertung_doppel <= 1 ? 1 : 0) . ";\n" + . " var spielpunkte_sieg_einzel = " . ($spielpunkte_wertung_einzel % 10 == 0 ? 2 : ($spielpunkte_wertung_einzel % 10 == 1 ? 3 : 1)) . ";\n" + . " var spielpunkte_sieg_doppel = " . ($spielpunkte_wertung_doppel % 10 == 0 ? 2 : ($spielpunkte_wertung_doppel % 10 == 1 ? 3 : 1)) . ";\n" + . " var spielpunkte_unentschieden_einzel = " . ($spielpunkte_wertung_einzel % 10 <= 1 ? 1 : 0) . ";\n" + . " var spielpunkte_unentschieden_doppel = " . ($spielpunkte_wertung_doppel % 10 <= 1 ? 1 : 0) . ";\n" . " var punkte_heim;\n" . " var punkte_gast;\n" . " var satzstand;\n"; @@ -12939,10 +12944,14 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void $spiel_einzel = $spieltypen[$i - 1][0] != "D"; if (($spiel_einzel && $spielpunkte_wertung_einzel == 2) || (!$spiel_einzel && $spielpunkte_wertung_doppel == 2)) continue; - if (($spiel_einzel ? $spielpunkte_wertung_einzel : $spielpunkte_wertung_doppel) == 4) { + $w_spiel = $spiel_einzel ? $spielpunkte_wertung_einzel : $spielpunkte_wertung_doppel; + if ($w_spiel >= 10) { + $g = $w_spiel % 10; + $sieg = $g == 0 ? 2 : ($g == 1 ? 3 : 1); + $remis = $g == 3 ? 0 : 1; echo " satzstand = satz_summen(" . $i . ");\n" - . " spielpunkte_heim += 2 * satzstand[0] + satzstand[1];\n" - . " spielpunkte_gast += 2 * satzstand[2] + satzstand[1];\n"; + . " spielpunkte_heim += " . $sieg . " * satzstand[0] + " . $remis . " * satzstand[1];\n" + . " spielpunkte_gast += " . $sieg . " * satzstand[2] + " . $remis . " * satzstand[1];\n"; continue; } // Number(): .value ist eine Zeichenkette, "10" > "9" wäre sonst unwahr 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 06712e5..cfa5f50 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -501,7 +501,9 @@ COM_SPORTSMANAGER_ADD_SEASON="Saison hinzufügen" COM_SPORTSMANAGER_GAME_POINTS_GAME="Spielpunkte" COM_SPORTSMANAGER_WIN_1_POINT="Sieg: 1 Punkt" COM_SPORTSMANAGER_WIN_2_POINTS="Sieg: 2 Punkte, Unentschieden: 1 Punkt" +COM_SPORTSMANAGER_WIN_1_POINT_PER_SET="Je Satz: Sieg 1 Punkt" COM_SPORTSMANAGER_WIN_2_POINTS_PER_SET="Je Satz: Sieg 2 Punkte, Unentschieden 1 Punkt" +COM_SPORTSMANAGER_WIN_3_POINTS_PER_SET="Je Satz: Sieg 3 Punkte, Unentschieden 1 Punkt" COM_SPORTSMANAGER_GAME_POINTS_FOR_GAME="Für das ganze Spiel" COM_SPORTSMANAGER_GAME_POINTS_FOR_SET="Für jeden Satz einzeln" COM_SPORTSMANAGER_WIN_3_POINTS="Sieg: 3 Punkte, Unentschieden: 1 Punkt" @@ -1177,6 +1179,6 @@ COM_SPORTSMANAGER_GROUP_SEQUENCE="Spielfolge" COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST_ONE="nur das erste Spiel" COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST="nur die ersten %d Spiele" COM_SPORTSMANAGER_POINT_TYPE_CHANGED_WARNING="Für diesen Mannschaftsspielplan sind bereits Ergebnisse eingetragen. Die gespeicherten Zahlen werden NICHT umgerechnet – sie bedeuten danach etwas anderes (Tore statt Sätze bzw. umgekehrt). Trotzdem speichern?" -COM_SPORTSMANAGER_PER_SET_VALUATION_CHANGED_WARNING="Für diesen Mannschaftsspielplan sind bereits Ergebnisse eingetragen. Beim Wechsel der Wertung „je Satz" wird nichts umgerechnet: Spiele ohne gespeicherte Satzergebnisse werden mit 2 Punkten je gewonnenem Satz gewertet, ihre Satz-Unentschieden gehen verloren. Und wo unter „Mehrere" in Wahrheit Tore in den Punkte-Feldern stehen (statt Sätzen), zählt ab jetzt jedes Tor wie ein gewonnener Satz doppelt. Trotzdem speichern?" +COM_SPORTSMANAGER_PER_SET_VALUATION_CHANGED_WARNING="Für diesen Mannschaftsspielplan sind bereits Ergebnisse eingetragen. Beim Wechsel der Wertung „je Satz" wird nichts umgerechnet: Spiele ohne gespeicherte Satzergebnisse werden mit dem vollen Siegwert je gewonnenem Satz gewertet, ihre Satz-Unentschieden gehen verloren. Und wo unter „Mehrere" in Wahrheit Tore in den Punkte-Feldern stehen (statt Sätzen), zählt ab jetzt jedes Tor wie ein gewonnener Satz doppelt. Trotzdem speichern?" COM_SPORTSMANAGER_RACE_RUNNING="Stand" COM_SPORTSMANAGER_TOTAL_SCORE="Gesamtstand" 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 24d8a0f..5716e2a 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -501,7 +501,9 @@ COM_SPORTSMANAGER_ADD_SEASON="Add season" COM_SPORTSMANAGER_GAME_POINTS_GAME="Game points" COM_SPORTSMANAGER_WIN_1_POINT="Win: 1 point" COM_SPORTSMANAGER_WIN_2_POINTS="Win: 2 points, draw: 1 point" +COM_SPORTSMANAGER_WIN_1_POINT_PER_SET="Per set: win 1 point" COM_SPORTSMANAGER_WIN_2_POINTS_PER_SET="Per set: win 2 points, draw 1 point" +COM_SPORTSMANAGER_WIN_3_POINTS_PER_SET="Per set: win 3 points, draw 1 point" COM_SPORTSMANAGER_GAME_POINTS_FOR_GAME="For the whole game" COM_SPORTSMANAGER_GAME_POINTS_FOR_SET="For each set separately" COM_SPORTSMANAGER_WIN_3_POINTS="Win: 3 points, draw: 1 point" @@ -1177,6 +1179,6 @@ COM_SPORTSMANAGER_GROUP_SEQUENCE="Game sequence" COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST_ONE="the first game only" COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST="the first %d games only" COM_SPORTSMANAGER_POINT_TYPE_CHANGED_WARNING="Results have already been entered for this team schedule. The stored numbers are NOT converted – afterwards they mean something else (goals instead of sets, or the other way round). Save anyway?" -COM_SPORTSMANAGER_PER_SET_VALUATION_CHANGED_WARNING="Results have already been entered for this team schedule. Switching the per-set valuation converts nothing: games without stored set results are valued at 2 points per set won, and their drawn sets are lost. And where a 'multiple sets' schedule in fact holds goals in its points fields (instead of sets), every goal will from now on count double, like a set won. Save anyway?" +COM_SPORTSMANAGER_PER_SET_VALUATION_CHANGED_WARNING="Results have already been entered for this team schedule. Switching the per-set valuation converts nothing: games without stored set results are valued at the full win value per set won, and their drawn sets are lost. And where a 'multiple sets' schedule in fact holds goals in its points fields (instead of sets), every goal will from now on count double, like a set won. Save anyway?" COM_SPORTSMANAGER_RACE_RUNNING="Score" COM_SPORTSMANAGER_TOTAL_SCORE="Total score"