From 35384a5c43320d69be163bb6b17f92f810d6865c Mon Sep 17 00:00:00 2001 From: svennickel Date: Tue, 8 Sep 2026 17:46:38 +0200 Subject: [PATCH] Die Remis-Regel galt nur auf einem der beiden Rechenwege MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sven 2026-09-08: „Teste fuer alle Modus, ob Siege, Unentschieden und Niederlagen weiter korrekt berechnet werden pro Spiel fuer saemtliche Modusszenarien." Beim Testen ueber die volle Matrix (4 Spielpunkte-Wertungen x 7 Satzmodi x 4 Spielstaende = 112 Szenarien) kam ein Fehler DIESES Zweigs heraus: die Spielpunkte werden an ZWEI Stellen berechnet, und 09ae1c1/554ad25 hatte die Remis-Pruefung nur in eine davon eingebaut. Weg A admin.php, Spielbericht speichern — MIT Pruefung Weg B sportsmanager.php, begegnungenAktualisieren() bei Modus-/ Wettbewerbsaenderung — OHNE Pruefung Dasselbe Spiel bekam damit verschiedene Spielpunkte, je nachdem, welcher Weg es zuletzt angefasst hatte: Speichern ergab 0:0, ein Moduswechsel schrieb 1:1 zurueck. Betroffen sind Gleichstaende ungleich 0:0 in Wettbewerben, deren Satzmodus kein Remis zulaesst (ein fester Satz, ungerade Satzzahl, Gewinnsaetze) bei Wertung „Sieg 2/Remis 1" oder „Sieg 3/Remis 1" — 8 der 112 Szenarien. Gemessen, nicht geschaetzt. Die Regel steht jetzt als remisMoeglich() auf Dateiebene und wird von beiden Wegen aufgerufen, statt als Closure in einem der beiden Loops zu leben. Matrix danach: 0 Widersprueche. NICHT betroffen und mitgeprueft: - Siege/Unentschieden/Niederlagen je Spiel sind in ALLEN 112 Szenarien unveraendert. Sie kommen in der Spielerstatistik aus dem Vergleich der PUNKTE (sportsmanager.php:6338), nicht aus den Spielpunkten, und an den Punkten aendert dieser Zweig nichts. - Race bleibt unberuehrt: die Race-Normalisierung setzt die Wertung auf 2 („ohne Umrechnung"), und dort gibt es keinen Remis-Zweig. - spielerstatistikAktualisieren() selbst ist unveraendert (nur die Einheiten-Beschriftung kam hinzu). --- .../components/com_sportsmanager/admin.php | 31 ++++++++++++------- .../com_sportsmanager/sportsmanager.php | 6 ++-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 9047b26..52a8c81 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -10988,6 +10988,23 @@ function adminEditBegegnungSpielplan($bestaetigen): void } +// Kann ein Spiel dieses Satzmodus ueberhaupt unentschieden enden? +// +// Gleichstand ist nicht immer ein Unentschieden. Wo eine Zahl von GEWINNSAETZEN gilt, hat ein +// Spiel mit gleichem Satzstand noch keinen Sieger — es ist unfertig, und dafuer gibt es keinen +// Punkt. Ohne Angabe zur Satzzahl bleibt es beim bisherigen Verhalten. +// +// Steht bewusst auf Dateiebene und nicht als Closure im Speicher-Loop: die Spielpunkte werden +// an ZWEI Stellen berechnet — hier beim Speichern eines Spielberichts und in +// begegnungenAktualisieren() bei einer Modus-/Wettbewerbsaenderung. Dort fehlte die Regel, +// sodass beide Wege demselben Spiel verschiedene Spielpunkte gaben (gefunden 2026-09-08). +function remisMoeglich($saetze_modus): bool +{ + if ($saetze_modus == 0) return true; // keine Angabe + if ($saetze_modus < 0) return false; // Gewinnsaetze: am Ende steht keiner gleich + return $saetze_modus % 2 == 0; // feste Satzzahl: nur eine gerade endet remis +} + function adminSaveBegegnungSpielplan(): void { $app = Factory::getContainer()->get(SiteApplication::class); @@ -11325,16 +11342,6 @@ function adminSaveBegegnungSpielplan(): void $total_heim_punkte += $spiel_heim_punkte; $total_gast_punkte += $spiel_gast_punkte; - // Gleichstand ist nicht immer ein Unentschieden. Wo eine Zahl von GEWINNSAETZEN - // gilt, hat ein Spiel mit gleichem Satzstand einfach noch keinen Sieger — es ist - // unfertig, und dafuer gibt es keinen Punkt. Ohne Angabe zur Satzzahl bleibt es - // beim bisherigen Verhalten. - $remis_moeglich = function ($saetze_modus) { - if ($saetze_modus == 0) return true; // keine Angabe - if ($saetze_modus < 0) return false; // Gewinnsaetze: am Ende steht keiner gleich - return $saetze_modus % 2 == 0; // feste Satzzahl: nur eine gerade endet remis - }; - if ($spieltyp[0] != "D") { if ($spielpunkte_wertung_einzel == 2) { $spiel_heim_spielpunkte = $spiel_heim_punkte; @@ -11350,7 +11357,7 @@ function adminSaveBegegnungSpielplan(): void $spiel_heim_spielpunkte = 0; $spiel_gast_spielpunkte = 0; } else if ($spielpunkte_wertung_einzel != 3 - && $remis_moeglich($teamspiel_modus->saetze_modus_einzel)) { + && remisMoeglich($teamspiel_modus->saetze_modus_einzel)) { $spiel_heim_spielpunkte = 1; $spiel_gast_spielpunkte = 1; } else { @@ -11373,7 +11380,7 @@ function adminSaveBegegnungSpielplan(): void $spiel_heim_spielpunkte = 0; $spiel_gast_spielpunkte = 0; } else if ($spielpunkte_wertung_doppel != 3 - && $remis_moeglich($teamspiel_modus->saetze_modus_doppel)) { + && remisMoeglich($teamspiel_modus->saetze_modus_doppel)) { $spiel_heim_spielpunkte = 1; $spiel_gast_spielpunkte = 1; } else { diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php index 0bd74c7..303a2b3 100644 --- a/src/structure/components/com_sportsmanager/sportsmanager.php +++ b/src/structure/components/com_sportsmanager/sportsmanager.php @@ -6196,7 +6196,8 @@ function begegnungenAktualisieren($geaendert_veranstaltung_id = 0, $geaendert_mo } else if ($spiel_heim_punkte == 0 && $spiel_gast_punkte == 0) { $spiel_heim_spielpunkte = 0; $spiel_gast_spielpunkte = 0; - } else if ($spielpunkte_wertung_einzel != 3) { + } else if ($spielpunkte_wertung_einzel != 3 + && remisMoeglich($teamspiel_modus->saetze_modus_einzel)) { $spiel_heim_spielpunkte = 1; $spiel_gast_spielpunkte = 1; } else { @@ -6218,7 +6219,8 @@ function begegnungenAktualisieren($geaendert_veranstaltung_id = 0, $geaendert_mo } else if ($spiel_heim_punkte == 0 && $spiel_gast_punkte == 0) { $spiel_heim_spielpunkte = 0; $spiel_gast_spielpunkte = 0; - } else if ($spielpunkte_wertung_doppel != 3) { + } else if ($spielpunkte_wertung_doppel != 3 + && remisMoeglich($teamspiel_modus->saetze_modus_doppel)) { $spiel_heim_spielpunkte = 1; $spiel_gast_spielpunkte = 1; } else {