From 2f8e8b4a1253afdab0be65a88fb453b465c6d797 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Wed, 24 Jun 2026 16:18:19 -0500 Subject: [PATCH] fix stage --- lib/resolve-bracket.ts | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/resolve-bracket.ts b/lib/resolve-bracket.ts index d255fbc..a867b7a 100644 --- a/lib/resolve-bracket.ts +++ b/lib/resolve-bracket.ts @@ -5,14 +5,6 @@ import { } from "@/lib/bracket"; import { placeIsSecure } from "@/lib/secure-places"; -// Eine Gruppe gilt als abgeschlossen, wenn alle ihre Gruppenspiele beendet sind. -// Wird für die Drittplatzierten-Sicherheit genutzt (gruppenübergreifend). -function groupFinished(group: GroupId, matches: Match[]): boolean { - const groupMatches = matches.filter((m) => m.group === group); - if (groupMatches.length === 0) return false; - return groupMatches.every((m) => m.status === "FINISHED"); -} - // Ein aufgelöster Teilnehmer einer K.o.-Begegnung. export interface ResolvedSide { teamId: string | null; // null = noch Platzhalter @@ -54,6 +46,15 @@ function loserOf(m: Match | undefined): string | null { return null; } +// Prüft, ob die gesamte Gruppenphase abgeschlossen ist. +// Erst dann stehen die Drittplatzierten-Rangliste und die +// Annex-C-Zuordnung final fest. +function groupStageComplete(matches: Match[]): boolean { + const groupMatches = matches.filter((m) => m.group != null); + if (groupMatches.length === 0) return false; + return groupMatches.every((m) => m.status === "FINISHED"); +} + // Löst einen R32-Slot (W/R/3) zu einer Team-ID auf, sofern bereits bekannt. // provisional = true, solange die zugrunde liegende Gruppe/Zuordnung nicht fix ist. function resolveR32Slot( @@ -88,9 +89,11 @@ function resolveR32Slot( const thirdGroup = assignment[winnerGroup]; if (thirdGroup) { const row = thirds.find((r) => r.group === thirdGroup && r.qualifies); - // Fix nur, wenn Annex C aufgelöst UND die Quellgruppe abgeschlossen ist - // (Drittplatzierten-Qualifikation ist gruppenübergreifend, bis zuletzt offen). - const fix = annexResolved && groupFinished(thirdGroup, matches); + // Fix nur, wenn ALLE drei Bedingungen erfüllt sind: + // 1. Annex C aufgelöst (8 Dritte zuweisbar) + // 2. Komplette Gruppenphase beendet (Dritten-Rangliste final) + // 3. Das Team gehört gesichert zu den besten 8 + const fix = annexResolved && groupStageComplete(matches) && row?.qualifies === true; const provisional = !fix; const prefix = provisional ? "aktuell " : ""; return {