fix stage

This commit is contained in:
2026-06-24 16:18:19 -05:00
parent 7996ebc504
commit 2f8e8b4a12

View File

@@ -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 {