fix stage
This commit is contained in:
@@ -5,14 +5,6 @@ import {
|
|||||||
} from "@/lib/bracket";
|
} from "@/lib/bracket";
|
||||||
import { placeIsSecure } from "@/lib/secure-places";
|
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.
|
// Ein aufgelöster Teilnehmer einer K.o.-Begegnung.
|
||||||
export interface ResolvedSide {
|
export interface ResolvedSide {
|
||||||
teamId: string | null; // null = noch Platzhalter
|
teamId: string | null; // null = noch Platzhalter
|
||||||
@@ -54,6 +46,15 @@ function loserOf(m: Match | undefined): string | null {
|
|||||||
return 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.
|
// 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.
|
// provisional = true, solange die zugrunde liegende Gruppe/Zuordnung nicht fix ist.
|
||||||
function resolveR32Slot(
|
function resolveR32Slot(
|
||||||
@@ -88,9 +89,11 @@ function resolveR32Slot(
|
|||||||
const thirdGroup = assignment[winnerGroup];
|
const thirdGroup = assignment[winnerGroup];
|
||||||
if (thirdGroup) {
|
if (thirdGroup) {
|
||||||
const row = thirds.find((r) => r.group === thirdGroup && r.qualifies);
|
const row = thirds.find((r) => r.group === thirdGroup && r.qualifies);
|
||||||
// Fix nur, wenn Annex C aufgelöst UND die Quellgruppe abgeschlossen ist
|
// Fix nur, wenn ALLE drei Bedingungen erfüllt sind:
|
||||||
// (Drittplatzierten-Qualifikation ist gruppenübergreifend, bis zuletzt offen).
|
// 1. Annex C aufgelöst (8 Dritte zuweisbar)
|
||||||
const fix = annexResolved && groupFinished(thirdGroup, matches);
|
// 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 provisional = !fix;
|
||||||
const prefix = provisional ? "aktuell " : "";
|
const prefix = provisional ? "aktuell " : "";
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user