Altersüberprüfung bei Wettkämpfen / Age Eligibility Checks¶
Last Updated: 2026-03-25
Related code: shared/src/ageCheckUtils.ts
Überblick / Overview¶
Für die Zuordnung von Teilnehmern zu Wettkämpfen wird das Geburtsjahr (nicht das genaue Geburtsdatum) als Standardmethode verwendet. Dies entspricht der Praxis im deutschen Turnbetrieb (Jahrgangsprinzip).
Zwei Modi / Two Modes¶
1. Jahrgangsprüfung – DEFAULT (ageMatchesByBirthYear)¶
Formel: eventJahr − Geburtsjahr ∈ [ageFrom, ageTo]
- Nur das Geburtsjahr wird verglichen.
- Monat und Tag des Geburtstags werden ignoriert.
- Ein Turner, der im Dezember 2011 geboren ist, gilt für Wettkämpfe 2026 als 15 Jahre alt — unabhängig davon, ob der Wettkampf vor oder nach seinem Geburtstag stattfindet.
Anwendung:
import { ageMatchesByBirthYear } from '@turnfix/shared';
// Geburtsjahr 2011, Wettkampf erfordert Altersgruppe 15–18
const eligible = ageMatchesByBirthYear(2011, 15, 18); // true (2026 - 2011 = 15)
2. Genaue Datumsüberprüfung – NICHT Standard (ageMatchesExact)¶
Formel: Exaktes Alter am Referenzdatum (Monat und Tag berücksichtigt)
- Nur im Code erhalten — wird derzeit nicht als Standard verwendet.
- Ein Turner, der im Dezember 2011 geboren ist, hätte im März 2026 noch nicht seinen 15. Geburtstag gefeiert → Alter = 14 → würde bei Altersgruppe 15+ scheitern.
Anwendung:
import { ageMatchesExact } from '@turnfix/shared';
// Geburtsdatum 2011-12-15, Wettkampf März 2026, Altersgruppe 15–18
const eligible = ageMatchesExact('2011-12-15', 15, 18); // false (exaktes Alter = 14)
Wichtiger Unterschied / Key Difference¶
| Situation | Jahrgangsprüfung (Standard) | Genaue Prüfung |
|---|---|---|
| Turner geb. Dez. 2011, Wettkampf März 2026, AK 15–18 | ✅ eligible (15) | ❌ not eligible (14) |
| Turner geb. März 2011, Wettkampf März 2026, AK 15–18 | ✅ eligible (15) | ✅ eligible (15) |
| Turner geb. März 2012, Wettkampf März 2026, AK 15–18 | ❌ not eligible (14) | ❌ not eligible (13) |
UI: Checkbox im Wettkampfformular¶
Im Wettkampf-Formular ist eine ausgegraufte Checkbox "Jahrgangsprüfung (Standard)" zu sehen.
- Die Checkbox ist immer angehakt (true) und deaktiviert.
- Sie zeigt an, dass das Jahrgangsprinzip das Standard-Verhalten ist.
- Es gibt noch kein Datenbankfeld für diese Einstellung (keine Pro-Wettkampf-Umschaltung möglich).
- Tooltip erklärt: "Dieses Verhalten ist im Standard festgelegt. Ein DB-Feld für diese Einstellung existiert noch nicht."
Implementierungsdetails / Implementation Details¶
Funktion: ageMatchesByBirthYear¶
Parameter:
- birthYear: number — Geburtsjahr des Teilnehmers (z. B. 2010)
- ageFrom: number — Mindestalter für den Wettkampf (inklusive)
- ageTo: number — Höchstalter für den Wettkampf (inklusive)
- eventYear?: number — Jahr des Wettkampfs (Standard: aktuelles Jahr)
Rückgabewert: true wenn berechtigt, false wenn nicht.
Sonderfälle:
- birthYear = 0 oder ungültig → true (unbekannte Daten blockieren nie)
- Invertiertes ageFrom/ageTo → wird automatisch normalisiert
Integration in Hooks¶
useAddParticipantWizard.ts — filtert die angezeigten Wettkämpfe nach Teilnehmer-Geburtsjahr:
const birthYear = selectedParticipant.birthYear;
if (birthYear && birthYear > 0) {
if (!ageMatchesByBirthYear(birthYear, comp.ageFrom, comp.ageTo)) return false;
} else {
// Fallback: berechnetes Alter, falls Geburtsjahr nicht verfügbar
if (!ageMatchesCompetition(selectedParticipant.age, comp)) return false;
}
useParticipantValidation.ts — validiert Teilnehmer bei der Wettkampfzuordnung:
const birthYear = new Date(birthday).getFullYear();
if (birthYear > 0 && !ageMatchesByBirthYear(birthYear, competition.ageFrom, competition.ageTo)) {
const age = calculateAgeByYear(birthday);
reasons.push(t('eventParticipants.validation.ageWarning', { age, ageFrom, ageTo }));
}
Datenbank-Hinweis / Database Note¶
Die Altersgruppe in der Datenbank wird als Geburtsjahre gespeichert (yer_von, yer_bis), wird aber vom Server bei der API-Antwort in Alterswerte umgerechnet:
Das impliziert das Veranstaltungsjahr in den ageFrom/ageTo-Werten.
Zukünftige Erweiterung / Future Extension¶
Wenn eine Pro-Wettkampf-Einstellung gewünscht ist, muss:
1. Ein Datenbankfeld (z. B. bol_jahrgangspruefung) zur Tabelle tfx_wettkampf hinzugefügt werden.
2. Das Wettkampfformular um eine aktivierbare Checkbox erweitert werden.
3. Der Prüfmodus in den Hooks dynamisch aus den Wettkampfdaten gelesen werden.