feat: integrate new desktop shell and extend backend & ADRs
- Added `meldestelle-desktop` module using JVM/Compose Desktop, registered in `settings.gradle.kts`. - Integrated new screens and desktop navigation into core: `Veranstaltungen`, `TurnierDetail`, etc. - Expanded backend with `ExposedFunktionaerRepository` in `officials-infrastructure`. - Completed ADRs for bounded context mapping (`ADR-0014`) and context map (`ADR-0015`). - Updated and extended project documentation with session logs and architecture decisions. Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
@@ -46,11 +46,11 @@ Veranstalter (OEPS-Mitgliedsverein)
|
||||
|
||||
### A
|
||||
|
||||
| Begriff | Definition | ÖTO-Referenz |
|
||||
|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
|
||||
| **Abteilung** | **Kleinste Einheit für Nennungen, Startlisten und Ergebnisse.** Untereinheit eines Bewerbs mit eigenem Teilnehmerkreis (Lizenz, Pferdealter etc.) und eigener Platzierung/Siegerehrung. Erhält eine fortlaufende **Abteilungsnummer** (1, 2, ...) innerhalb des Bewerbs. Referenz auf Startliste/Ergebnisliste: `BW: 9 Abt: 1` bzw. `9-1`. Die ÖTO definiert sparten- und klassenabhängige Schwellenwerte, ab wievielen Startern eine Abteilung **verpflichtend** getrennt werden muss. Bei Überschreitung gibt das System eine **WARNUNG** (kein harter Fehler) – der TBA hat das letzte Wort (→ *Override-Event*). | ÖTO § 2 Abs. 7 |
|
||||
| **Akteur** | Oberbegriff für alle Personen (Reiter, Richter, Funktionäre, Besitzer) und Organisationen (Vereine), die im System interagieren. | – |
|
||||
| **Ausschreibung** | Das offizielle Dokument, das alle Bedingungen eines Turniers festlegt. Pflichtfelder gemäß ÖTO (A-Satz der ZNS-Schnittstelle). | ÖTO Ausschreibungs-Struktur |
|
||||
| Begriff | Definition | ÖTO-Referenz |
|
||||
|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|
|
||||
| **Abteilung** | **Kleinste Einheit für Nennungen, Startlisten und Ergebnisse.** Untereinheit eines Bewerbs mit eigenem Teilnehmerkreis (Lizenz, Pferdealter etc.) und eigener Platzierung/Siegerehrung. Erhält eine fortlaufende **Abteilungsnummer** (1, 2, ...) innerhalb des Bewerbs. Referenz auf Startliste/Ergebnisliste: `BW: 9 Abt: 1` bzw. `9-1`. Die ÖTO definiert sparten- und klassenabhängige Schwellenwerte, ab wievielen Startern eine Abteilung **verpflichtend** getrennt werden muss. Bei Überschreitung gibt das System eine **WARNUNG** (kein harter Fehler) – der TBA hat das letzte Wort (→ *Override-Event*). Vollständige Schwellenwert-Tabellen: → [`Abteilungs-Trennungs-Schwellenwerte.md`](../02_Reference/OETO_Regelwerk/Abteilungs-Trennungs-Schwellenwerte.md) | ÖTO § 2 Abs. 7, § 39 |
|
||||
| **Akteur** | Oberbegriff für alle Personen (Reiter, Richter, Funktionäre, Besitzer) und Organisationen (Vereine), die im System interagieren. | – |
|
||||
| **Ausschreibung** | Das offizielle Dokument, das alle Bedingungen eines Turniers festlegt. Pflichtfelder gemäß ÖTO (A-Satz der ZNS-Schnittstelle). | ÖTO Ausschreibungs-Struktur |
|
||||
|
||||
### B
|
||||
|
||||
|
||||
@@ -0,0 +1,251 @@
|
||||
---
|
||||
type: Reference
|
||||
status: ACTIVE
|
||||
owner: ÖTO/FEI Rulebook Expert
|
||||
last_update: 2026-03-24
|
||||
sources:
|
||||
- ÖTO 2026, A-Teil § 39 (Teilen von Bewerben)
|
||||
- ÖTO 2026, B-Teil § 200 ff. (Springen / CSN)
|
||||
- ÖTO 2026, B-Teil § 100 ff. (Dressur / CDN)
|
||||
- ÖTO 2026, B-Teil § 300 ff. (Vielseitigkeit / CCN)
|
||||
- ÖTO 2026, B-Teil § 803 (Caprilli)
|
||||
- ÖTO 2026, B-Teil § 850 ff. (Reitertreffen / Fahren)
|
||||
---
|
||||
|
||||
# Abteilungs-Trennungs-Schwellenwerte
|
||||
|
||||
📜 **[ÖTO/FEI Rulebook Expert]** | 24. März 2026
|
||||
|
||||
Dieses Dokument ist die **Single Source of Truth** für alle Regeln zur Pflicht- und Kann-Teilung
|
||||
von Bewerben in Abteilungen. Es ergänzt die [Ubiquitous Language](../../01_Glossary/Ubiquitous_Language.md)
|
||||
und dient als Grundlage für die Implementierung der Warn-Logik im `competition-context`.
|
||||
|
||||
> ⚠️ **System-Philosophie:** Das System gibt bei Überschreitung eines Schwellenwerts **niemals**
|
||||
> einen harten Fehler, sondern immer nur eine **WARNUNG**. Der TBA hat das letzte Wort und kann
|
||||
> per **Override-Event** bewusst abweichen (→ Ubiquitous Language: *Override-Event*).
|
||||
|
||||
---
|
||||
|
||||
## 1. Allgemeine Schwellenwerte (§ 39 A-Teil) – Alle Sparten
|
||||
|
||||
Diese Regeln gelten für **alle Turniere der Kategorien A\*, A, B\*, B und C** und für alle Sparten,
|
||||
sofern die spartenspezifischen Bestimmungen (Abschnitt 2) keine strengeren Regeln vorsehen.
|
||||
|
||||
### 1.1 Pflicht-Teilung (MUSS)
|
||||
|
||||
| Prüfungstyp | Schwellenwert (Starter) | Abteilungs-Kriterium (Standard) | ÖTO-Referenz |
|
||||
|------------------------------------------------|-------------------------|---------------------------------|--------------|
|
||||
| Stil- und Springpferdeprüfungen | **> 30** | Lizenzstufen (sonst: Plätze) | § 39 Abs. 2 |
|
||||
| Vielseitigkeitsprüfungen | **> 40** | Lizenzstufen (sonst: Plätze) | § 39 Abs. 2 |
|
||||
| Übrige Springprüfungen (Standard, Spezial ...) | **> 80** | Lizenzstufen (sonst: Plätze) | § 39 Abs. 2 |
|
||||
| Jede Abteilung nach Teilung | **> 80** | Erneute Teilung verpflichtend | § 39 Abs. 2 |
|
||||
|
||||
> **Hinweis:** „Übrige Springprüfungen" umfasst alle Springprüfungen, die **nicht** als Stil- oder
|
||||
> Springpferdeprüfung ausgeschrieben sind (Standardspringprüfung, Zweiphasen, Punkte, Risiko etc.).
|
||||
|
||||
### 1.2 Kann-Teilung (KANN / DARF)
|
||||
|
||||
| Prüfungstyp | Schwellenwert (Starter) | Abteilungs-Kriterium (Standard) | ÖTO-Referenz |
|
||||
|------------------|-------------------------|---------------------------------|--------------|
|
||||
| Dressurprüfungen | **> 30** | Lizenzstufen (sonst: Plätze) | § 39 Abs. 2 |
|
||||
|
||||
### 1.3 Teilungs-Kriterien (Priorität)
|
||||
|
||||
Sofern in der Ausschreibung kein anderes Kriterium festgelegt ist, gilt folgende Priorität:
|
||||
|
||||
1. **Ausschreibungs-Kriterium** (Altersklasse, Pferdealter, Geschlecht etc.) – hat Vorrang
|
||||
2. **Lizenzstufen** (Standard-Fallback)
|
||||
3. **Plätze** (wenn Teilung nach Lizenzstufen nicht möglich)
|
||||
|
||||
### 1.4 Ausnahmen von der Pflicht-Teilung
|
||||
|
||||
| Ausnahme | ÖTO-Referenz |
|
||||
|---------------------------------------------------------------------|--------------|
|
||||
| Meisterschaftsbewerbe (Cups und Serien) | § 39 Abs. 4 |
|
||||
| Bewerbe mit Geldpreisen > Doppeltes der Gebührenordnungs-Geldpreise | § 39 Abs. 2 |
|
||||
|
||||
### 1.5 Pflicht-Teilung nach Klasse (unabhängig von Starterzahl)
|
||||
|
||||
Diese Teilungen sind **strukturell verpflichtend** und gelten unabhängig von der Starterzahl:
|
||||
|
||||
| Prüfungstyp | Pflicht-Teilung | ÖTO-Referenz |
|
||||
|------------------------------------------------------|-------------------------------------------------------|--------------|
|
||||
| Dressur- und Springprüfungen Klassen **A und L** | Mindestens 2 Abteilungen; R1 in **eigener** Abteilung | § 39 Abs. 1 |
|
||||
| Lizenzprüfungsaufgaben | Getrennt nach R2/RD2 und R3/RD3 | § 39 Abs. 1 |
|
||||
| LM-Springen bei B- und C-Turnieren | Kann getrennt werden: R2/RS2 und R3/RS3/RS4 | § 39 Abs. 1 |
|
||||
| Pferdeprüfungen (Dressur- und Springpferdeprüfungen) | Teilung nach **Pferdealter** (nicht nach Lizenzen) | § 39 Abs. 1 |
|
||||
|
||||
---
|
||||
|
||||
## 2. Spartenspezifische Schwellenwerte
|
||||
|
||||
### 2.1 Springen (CSN) – Sparte B II
|
||||
|
||||
#### 2.1.1 Stil- und Idealzeitspringprüfungen bis 95 cm (alle CSN-Kategorien)
|
||||
|
||||
Pflicht-Teilung in **getrennte Abteilungen** nach Lizenzstatus – unabhängig von der Starterzahl:
|
||||
|
||||
| Abteilung | Teilnehmerkreis |
|
||||
|-----------|--------------------------|
|
||||
| Abt. 1 | Reiter **ohne Lizenz** |
|
||||
| Abt. 2 | Reiter mit Lizenz **R1** |
|
||||
|
||||
> **Referenz:** ÖTO B-Teil § 200 Abs. 5.3
|
||||
|
||||
#### 2.1.2 Springpferdeprüfungen – Pflicht-Teilung nach Pferdealter
|
||||
|
||||
| Höhe | Erlaubtes Pferdealter | Pflicht-Teilung | ÖTO-Referenz |
|
||||
|--------------|-----------------------|------------------------------------------|---------------------|
|
||||
| 95 – 110 cm | 4 – 6 jährig | **Ja:** 4-jährige / 5–6-jährige getrennt | B-Teil § 200 Abs. 6 |
|
||||
| 115 – 130 cm | 5 – 6 jährig | Nein (keine Teilung erforderlich) | B-Teil § 200 Abs. 6 |
|
||||
| 135 cm | 6 – 7 jährig | Nein (keine Teilung erforderlich) | B-Teil § 200 Abs. 6 |
|
||||
|
||||
#### 2.1.3 CSN-C-NEU – Zwingend 2 Abteilungen (strukturell, unabhängig von Starterzahl)
|
||||
|
||||
| Höhenbereich | Abt. 1 | Abt. 2 | ÖTO-Referenz |
|
||||
|--------------|-----------------|------------------|--------------|
|
||||
| bis 95 cm | **ohne Lizenz** | **mit Lizenz** | B-Teil § 231 |
|
||||
| ab 100 cm | **R1** | **R2 und höher** | B-Teil § 231 |
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Dressur (CDN) – Sparte B I
|
||||
|
||||
#### 2.2.1 Allgemeine Schwellenwerte
|
||||
|
||||
Für Dressurprüfungen gilt die **Kann-Teilung** aus § 39 Abs. 2 (> 30 Starter).
|
||||
Es gibt **keine Pflicht-Teilung** allein aufgrund der Starterzahl bei Dressur
|
||||
(außer den strukturellen Pflichten aus § 39 Abs. 1 für Klassen A/L).
|
||||
|
||||
#### 2.2.2 Dressurpferdeprüfungen – Pflicht-Teilung nach Pferdealter
|
||||
|
||||
| Klasse | Erlaubtes Pferdealter | Pflicht-Teilung | ÖTO-Referenz |
|
||||
|--------|-----------------------|------------------------------------------|---------------------|
|
||||
| A | 4 – 6 jährig | **Ja:** 4-jährige / 5–6-jährige getrennt | B-Teil § 100 Abs. 5 |
|
||||
| L | 5 – 6 jährig | Nein (keine Teilung erforderlich) | B-Teil § 100 Abs. 5 |
|
||||
| M | 6 – 7 jährig | Nein (keine Teilung erforderlich) | B-Teil § 100 Abs. 5 |
|
||||
| S | 7 – 8 jährig | Nein (keine Teilung erforderlich) | B-Teil § 100 Abs. 5 |
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Vielseitigkeit (CCN) – Sparte B III
|
||||
|
||||
#### 2.3.1 Allgemeine Schwellenwerte
|
||||
|
||||
Für Vielseitigkeitsprüfungen gilt die **Pflicht-Teilung** aus § 39 Abs. 2 (> 40 Starter).
|
||||
|
||||
#### 2.3.2 Klasse Welcome und 80 cm – Lizenz-Abteilung
|
||||
|
||||
| Klasse | Regel | ÖTO-Referenz |
|
||||
|---------|---------------------------------------------------------------------------------------------|-----------------------|
|
||||
| Welcome | Nur Reiter mit Reiterpass und **höchstens R1**. R2+ sind in **eigener Abteilung** zu werten | B-Teil § 301 Abs. 1.4 |
|
||||
| 80 cm | R2+ startberechtigt, aber in **eigener Abteilung** zu werten, erhalten keine Ehrenpreise | B-Teil § 301 Abs. 1.4 |
|
||||
|
||||
#### 2.3.3 CCN-C-NEU Geländeritte/Geländepferdeprüfungen – Zwingend nach Lizenz
|
||||
|
||||
| Höhenbereich | Abt. 1 | Abt. 2 | Abt. 3 | ÖTO-Referenz |
|
||||
|--------------|-----------------|------------------|------------------|----------------------|
|
||||
| bis 80 cm | **ohne Lizenz** | **R1-Reiter** | **R2 und höher** | B-Teil § 300 (C-NEU) |
|
||||
| ab 90 cm | **ohne Lizenz** | **R1 und höher** | – | B-Teil § 300 (C-NEU) |
|
||||
|
||||
---
|
||||
|
||||
### 2.4 Caprilli-Prüfungen (§ 803) – Alle Sparten
|
||||
|
||||
Pflicht-Teilung in **mindestens 2 Abteilungen** – unabhängig von der Starterzahl:
|
||||
|
||||
| Abteilung | Teilnehmerkreis |
|
||||
|-----------|-----------------------|
|
||||
| Abt. 1 | **lizenzfrei** |
|
||||
| Abt. 2 | **RD1, R1 und höher** |
|
||||
|
||||
> **Referenz:** ÖTO B-Teil § 803 Abs. 2
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Fahren (CAN) – Reitertreffen
|
||||
|
||||
Bei Fahrertreffen (§ 850 ff.) gilt:
|
||||
|
||||
| Regel | ÖTO-Referenz |
|
||||
|-------------------------------------------------------------------------------------|---------------------|
|
||||
| Fahrer mit Lizenz **höher als F1** werden in einer **separaten Abteilung** gewertet | B-Teil § 850 Abs. 9 |
|
||||
|
||||
---
|
||||
|
||||
## 3. Zusammenfassung: Schwellenwert-Matrix
|
||||
|
||||
| Sparte | Prüfungstyp | Schwellenwert | Typ | Kriterium |
|
||||
|--------|-------------------------------|---------------|------|-----------------------|
|
||||
| Alle | Stil- / Springpferdeprüfungen | > 30 Starter | MUSS | Lizenz / Plätze |
|
||||
| Alle | Vielseitigkeitsprüfungen | > 40 Starter | MUSS | Lizenz / Plätze |
|
||||
| Alle | Übrige Springprüfungen | > 80 Starter | MUSS | Lizenz / Plätze |
|
||||
| Alle | Jede Abteilung nach Teilung | > 80 Starter | MUSS | Erneute Teilung |
|
||||
| CDN | Dressurprüfungen | > 30 Starter | KANN | Lizenz / Plätze |
|
||||
| CDN | Dressurpferdeprüfung Klasse A | strukturell | MUSS | Pferdealter (4 / 5–6) |
|
||||
| CSN | Stil-/Idealzeit bis 95 cm | strukturell | MUSS | Lizenz (ohne / R1) |
|
||||
| CSN | Springpferdeprüfung 95–110 cm | strukturell | MUSS | Pferdealter (4 / 5–6) |
|
||||
| CSN | C-NEU bis 95 cm | strukturell | MUSS | Lizenz (ohne / mit) |
|
||||
| CSN | C-NEU ab 100 cm | strukturell | MUSS | Lizenz (R1 / R2+) |
|
||||
| CCN | C-NEU Gelände bis 80 cm | strukturell | MUSS | Lizenz (3 Abt.) |
|
||||
| CCN | C-NEU Gelände ab 90 cm | strukturell | MUSS | Lizenz (2 Abt.) |
|
||||
| CCN | Welcome / 80 cm | strukturell | MUSS | R2+ eigene Abt. |
|
||||
| Alle | Caprilli (§ 803) | strukturell | MUSS | Lizenz (frei / RD1+) |
|
||||
| CAN | Fahrertreffen | strukturell | MUSS | F1+ eigene Abt. |
|
||||
|
||||
---
|
||||
|
||||
## 4. Implementierungs-Hinweise für den `competition-context`
|
||||
|
||||
### 4.1 Warn-Logik (keine harten Fehler!)
|
||||
|
||||
Das System soll folgende **Warnungen** ausgeben (nie harte Fehler):
|
||||
|
||||
```
|
||||
WARN_ABTEILUNG_PFLICHT_TEILUNG_UEBERSCHRITTEN
|
||||
→ Bewerb [BW-Nr], Prüfungstyp [Typ], Starter: [N] > Schwellenwert [S]
|
||||
→ Empfehlung: Teilung in Abteilungen nach [Kriterium]
|
||||
→ Override möglich (TBA-Entscheidung erforderlich)
|
||||
|
||||
WARN_ABTEILUNG_STRUKTURELL_NICHT_GETRENNT
|
||||
→ Bewerb [BW-Nr], Sparte [Sparte], Klasse/Höhe [X]
|
||||
→ Strukturelle Pflicht-Teilung fehlt (z.B. CSN-C-NEU ohne Lizenz-Trennung)
|
||||
→ Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
### 4.2 Konfigurierbare Parameter
|
||||
|
||||
Die Schwellenwerte sind **nicht hard-coded**, sondern als konfigurierbare Werte zu hinterlegen:
|
||||
|
||||
| Parameter | Standardwert | Quelle |
|
||||
|----------------------------------------|--------------|-------------|
|
||||
| `threshold.stil_springpferd.pflicht` | 30 | § 39 Abs. 2 |
|
||||
| `threshold.vielseitigkeit.pflicht` | 40 | § 39 Abs. 2 |
|
||||
| `threshold.springen_uebrig.pflicht` | 80 | § 39 Abs. 2 |
|
||||
| `threshold.dressur.kann` | 30 | § 39 Abs. 2 |
|
||||
| `threshold.abteilung.max_nach_teilung` | 80 | § 39 Abs. 2 |
|
||||
|
||||
### 4.3 Beziehung zu Domain-Modellen
|
||||
|
||||
| Domain-Modell | Relevanz |
|
||||
|------------------|---------------------------------------------------------------|
|
||||
| `DomAbteilung` | Trägt `abteilungsNummer`, `teilnehmerkreis`, `starterAnzahl` |
|
||||
| `DomBewerb` | Kennt `prüfungsTyp`, `sparte`, `turnierkategorie`, `höhe` |
|
||||
| `DomNennung` | Referenziert `DomAbteilung` als kleinste Einheit |
|
||||
| `Override-Event` | Wird gespeichert, wenn TBA eine Warn-Überschreibung bestätigt |
|
||||
|
||||
---
|
||||
|
||||
## 5. Offene Fragen / Klärungsbedarf
|
||||
|
||||
| # | Frage | Status |
|
||||
|---|-----------------------------------------------------------------------------------------------------------------------|----------|
|
||||
| 1 | Gelten die Schwellenwerte aus § 39 auch für **Reitertreffen** (nicht nur Turniere)? | 🔍 Offen |
|
||||
| 2 | Wie verhält sich die Pflicht-Teilung bei **kombinierten Turnieren** (CDN + CSN am selben Wochenende, § 4)? | 🔍 Offen |
|
||||
| 3 | Gibt es für **Voltigieren (CVN)** eigene Abteilungs-Trennungsregeln? (B-Teil § 400 ff. nicht vollständig ausgewertet) | 🔍 Offen |
|
||||
| 4 | Gibt es für **Fahren (CAN)** eigene Starter-Schwellenwerte jenseits der Reitertreffen-Regel? | 🔍 Offen |
|
||||
|
||||
---
|
||||
|
||||
*Erstellt: 2026-03-24 | Autor: ÖTO/FEI Rulebook Expert (Junie)*
|
||||
*Basiert auf: ÖTO 2026 A-Teil § 39, B-Teil §§ 100, 200, 231, 300, 803, 850*
|
||||
+401
@@ -0,0 +1,401 @@
|
||||
---
|
||||
type: Specification
|
||||
status: ACTIVE
|
||||
owner: ÖTO/FEI Rulebook Expert
|
||||
last_update: 2026-03-24
|
||||
related:
|
||||
- Abteilungs-Trennungs-Schwellenwerte.md
|
||||
- docs/01_Architecture/adr/0016-api-design-acl-de.md
|
||||
---
|
||||
|
||||
# Warn-Logik-Spezifikation: `competition-context` – Abteilungs-Schwellenwerte
|
||||
|
||||
📜 **[ÖTO/FEI Rulebook Expert]** | 24. März 2026
|
||||
|
||||
Dieses Dokument ist die **verbindliche Implementierungs-Spezifikation** für die Warn-Logik
|
||||
im `competition-context` bezüglich Abteilungs-Schwellenwerte. Es baut auf der
|
||||
[Schwellenwert-Referenz](./Abteilungs-Trennungs-Schwellenwerte.md) auf und definiert
|
||||
präzise, **wann**, **was** und **wie** gewarnt wird.
|
||||
|
||||
> ⚠️ **Grundprinzip (ADR-0007):** Das System gibt **niemals** harte Fehler bei
|
||||
> Schwellenwert-Überschreitungen. Jede Warnung ist **overridebar** per Override-Event
|
||||
> (TBA-Entscheidung). Warnungen werden gespeichert und sind auditierbar.
|
||||
|
||||
---
|
||||
|
||||
## 1. Warn-Typen: Übersicht
|
||||
|
||||
| Warn-Code | Typ | Auslöser | Betrifft |
|
||||
|--------------------------------------------|-----------------------|--------------------------------------------------------------------------|------------------------------------|
|
||||
| `WARN_PFLICHT_TEILUNG_UEBERSCHRITTEN` | Starter-Schwellenwert | Starterzahl > Pflicht-Schwellenwert | `DomBewerb` |
|
||||
| `WARN_KANN_TEILUNG_EMPFOHLEN` | Starter-Schwellenwert | Starterzahl > Kann-Schwellenwert, keine Teilung konfiguriert | `DomBewerb` |
|
||||
| `WARN_ABTEILUNG_ZU_GROSS` | Abteilungs-Limit | Abteilung nach Teilung > 80 Starter | `DomAbteilung` |
|
||||
| `WARN_ABTEILUNG_MAX_UEBERSCHRITTEN` | Konfigurations-Limit | Starter > konfiguriertes `maxStarter`-Limit | `DomAbteilung` |
|
||||
| `WARN_STRUKTURELLE_TEILUNG_FEHLT` | Strukturelle Pflicht | Vorgeschriebene Abteilungs-Struktur nicht vorhanden | `DomBewerb` + `List<DomAbteilung>` |
|
||||
| `WARN_STRUKTURELLE_TEILUNG_UNVOLLSTAENDIG` | Strukturelle Pflicht | Abteilungs-Struktur vorhanden, aber Teilnehmerkreis falsch/unvollständig | `DomBewerb` + `List<DomAbteilung>` |
|
||||
|
||||
---
|
||||
|
||||
## 2. Warn-Typ 1: Starter-Schwellenwerte (`DomBewerb`)
|
||||
|
||||
### 2.1 Pflicht-Teilung überschritten
|
||||
|
||||
**Auslöser:** `DomBewerb.validateAbteilungsSchwellenwerte(aktuelleStarterAnzahl)`
|
||||
|
||||
| Bedingung | Warn-Code | Schwellenwert |
|
||||
|----------------------------------------------------------------------------------------------------------------------|---------------------------------------|---------------|
|
||||
| `pruefungsTyp` ∈ {`STIL_SPRINGEN`, `SPRINGPFERDE`, `DRESSURPFERDE`} UND `starterAnzahl > 30` UND `!istMeisterschaft` | `WARN_PFLICHT_TEILUNG_UEBERSCHRITTEN` | 30 |
|
||||
| `pruefungsTyp == VIELSEITIGKEIT` UND `starterAnzahl > 40` UND `!istMeisterschaft` | `WARN_PFLICHT_TEILUNG_UEBERSCHRITTEN` | 40 |
|
||||
| `pruefungsTyp == SPRINGEN_UEBRIG` UND `starterAnzahl > 80` UND `!istMeisterschaft` | `WARN_PFLICHT_TEILUNG_UEBERSCHRITTEN` | 80 |
|
||||
|
||||
**Warn-Nachricht (Format):**
|
||||
|
||||
```
|
||||
WARN_PFLICHT_TEILUNG_UEBERSCHRITTEN:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Prüfungstyp: [pruefungsTyp]
|
||||
Starter: [N] > Schwellenwert [S]
|
||||
Empfehlung: Teilung nach [teilungsTyp] (Standard: NACH_LIZENZ)
|
||||
Referenz: ÖTO § 39 Abs. 2
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
### 2.2 Kann-Teilung empfohlen
|
||||
|
||||
**Auslöser:** `DomBewerb.validateAbteilungsSchwellenwerte(aktuelleStarterAnzahl)`
|
||||
|
||||
| Bedingung | Warn-Code | Schwellenwert |
|
||||
|-------------------------------------------------------------------------------------------------------|-------------------------------|---------------|
|
||||
| `pruefungsTyp == DRESSUR` UND `starterAnzahl > 30` UND `teilungsTyp == KEINE` UND `!istMeisterschaft` | `WARN_KANN_TEILUNG_EMPFOHLEN` | 30 |
|
||||
|
||||
**Warn-Nachricht (Format):**
|
||||
|
||||
```
|
||||
WARN_KANN_TEILUNG_EMPFOHLEN:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Prüfungstyp: DRESSUR
|
||||
Starter: [N] > 30
|
||||
Empfehlung: Kann-Teilung nach NACH_LIZENZ möglich (§ 39 Abs. 2)
|
||||
Override möglich (TBA-Entscheidung)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Warn-Typ 2: Abteilungs-Größe nach Teilung (`DomAbteilung`)
|
||||
|
||||
### 3.1 Abteilung nach Teilung zu groß
|
||||
|
||||
**Auslöser:** `DomAbteilung.validateStarterLimit()`
|
||||
|
||||
| Bedingung | Warn-Code |
|
||||
|----------------------|---------------------------|
|
||||
| `starterAnzahl > 80` | `WARN_ABTEILUNG_ZU_GROSS` |
|
||||
|
||||
**Warn-Nachricht (Format):**
|
||||
|
||||
```
|
||||
WARN_ABTEILUNG_ZU_GROSS:
|
||||
Abteilung: [abteilungsNummer] – [bezeichnung]
|
||||
Starter: [N] > 80
|
||||
Erneute Teilung verpflichtend (§ 39 Abs. 2)
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
### 3.2 Konfiguriertes Starter-Limit überschritten
|
||||
|
||||
**Auslöser:** `DomAbteilung.validateStarterLimit()`
|
||||
|
||||
| Bedingung | Warn-Code |
|
||||
|---------------------------------------------------|-------------------------------------|
|
||||
| `maxStarter > 0` UND `starterAnzahl > maxStarter` | `WARN_ABTEILUNG_MAX_UEBERSCHRITTEN` |
|
||||
|
||||
**Warn-Nachricht (Format):**
|
||||
|
||||
```
|
||||
WARN_ABTEILUNG_MAX_UEBERSCHRITTEN:
|
||||
Abteilung: [abteilungsNummer] – [bezeichnung]
|
||||
Starter: [N] > Limit [maxStarter]
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Warn-Typ 3: Strukturelle Pflicht-Teilungen (`DomBewerb` + `List<DomAbteilung>`)
|
||||
|
||||
Strukturelle Teilungen sind **unabhängig von der Starterzahl** verpflichtend.
|
||||
Sie werden durch `DomBewerb.validateStrukturellesTeilung(abteilungen)` geprüft.
|
||||
|
||||
### 4.1 Entscheidungsbaum: Wann greift welche strukturelle Prüfung?
|
||||
|
||||
```
|
||||
DomBewerb
|
||||
├── sparte == SPRINGEN (CSN)
|
||||
│ ├── pruefungsTyp == STIL_SPRINGEN UND hoeheCm <= 95
|
||||
│ │ → Prüfung: LIZENZ_OHNE_VS_R1 (§ 200 Abs. 5.3)
|
||||
│ ├── pruefungsTyp == SPRINGPFERDE UND hoeheCm IN [95..110]
|
||||
│ │ → Prüfung: PFERDEALTER_4_VS_5_6 (§ 200 Abs. 6)
|
||||
│ └── turnierkategorie == C_NEU
|
||||
│ ├── hoeheCm <= 95
|
||||
│ │ → Prüfung: C_NEU_OHNE_VS_MIT_LIZENZ (§ 231)
|
||||
│ └── hoeheCm >= 100
|
||||
│ → Prüfung: C_NEU_R1_VS_R2PLUS (§ 231)
|
||||
│
|
||||
├── sparte == VIELSEITIGKEIT (CCN)
|
||||
│ ├── turnierkategorie == C_NEU
|
||||
│ │ ├── hoeheCm <= 80
|
||||
│ │ │ → Prüfung: CCN_C_NEU_3_ABT (§ 300 C-NEU)
|
||||
│ │ └── hoeheCm >= 90
|
||||
│ │ → Prüfung: CCN_C_NEU_2_ABT (§ 300 C-NEU)
|
||||
│ └── pruefungsTyp == VIELSEITIGKEIT UND bezeichnung enthält "Welcome" ODER hoeheCm == 80
|
||||
│ → Prüfung: CCN_WELCOME_80_R2PLUS_EIGENE_ABT (§ 301 Abs. 1.4)
|
||||
│
|
||||
├── sparte == DRESSUR (CDN)
|
||||
│ └── pruefungsTyp == DRESSURPFERDE UND hoeheCm == null (Klasse A, 4–6-jährig)
|
||||
│ → Prüfung: PFERDEALTER_4_VS_5_6 (§ 100 Abs. 5)
|
||||
│
|
||||
├── pruefungsTyp == CAPRILLI
|
||||
│ → Prüfung: CAPRILLI_LIZENSFREI_VS_RD1PLUS (§ 803 Abs. 2)
|
||||
│
|
||||
└── sparte == FAHREN (CAN) UND pruefungsTyp == FAHREN
|
||||
→ Prüfung: FAHREN_F1PLUS_EIGENE_ABT (§ 850 Abs. 9)
|
||||
```
|
||||
|
||||
### 4.2 Strukturelle Prüfungen im Detail
|
||||
|
||||
#### LIZENZ_OHNE_VS_R1 – CSN Stil-/Idealzeitspringen bis 95 cm
|
||||
|
||||
**Regel:** Mindestens 2 Abteilungen: Abt. ohne Lizenz + Abt. R1. Unabhängig von Starterzahl.
|
||||
|
||||
| Prüfung | Bedingung für `WARN_STRUKTURELLE_TEILUNG_FEHLT` |
|
||||
|-------------------------------|-------------------------------------------------------------------|
|
||||
| Abt. „ohne Lizenz" vorhanden? | Keine Abteilung mit `teilnehmerkreisBeschreibung` ~ „ohne Lizenz" |
|
||||
| Abt. „R1" vorhanden? | Keine Abteilung mit `teilnehmerkreisBeschreibung` ~ „R1" |
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: CSN, Prüfungstyp: STIL_SPRINGEN, Höhe: ≤ 95 cm
|
||||
Fehlende Abteilung(en): [ohne Lizenz / R1]
|
||||
Referenz: ÖTO B-Teil § 200 Abs. 5.3
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### PFERDEALTER_4_VS_5_6 – Springpferdeprüfung 95–110 cm / Dressurpferdeprüfung Klasse A
|
||||
|
||||
**Regel:** 4-jährige in eigener Abteilung, getrennt von 5–6-jährigen.
|
||||
|
||||
| Prüfung | Bedingung für `WARN_STRUKTURELLE_TEILUNG_FEHLT` |
|
||||
|-------------------------------|-------------------------------------------------------------------------|
|
||||
| Abt. „4-jährige" vorhanden? | Keine Abteilung mit `teilnehmerkreisBeschreibung` ~ „4-jährig" |
|
||||
| Abt. „5–6-jährige" vorhanden? | Keine Abteilung mit `teilnehmerkreisBeschreibung` ~ „5" oder „6-jährig" |
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: [CSN/CDN], Prüfungstyp: [SPRINGPFERDE/DRESSURPFERDE], Höhe: [X] cm
|
||||
Fehlende Abteilung(en): [4-jährige / 5–6-jährige]
|
||||
Referenz: ÖTO B-Teil § 200 Abs. 6 / § 100 Abs. 5
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### C_NEU_OHNE_VS_MIT_LIZENZ – CSN-C-NEU bis 95 cm
|
||||
|
||||
**Regel:** Abt. 1 = ohne Lizenz, Abt. 2 = mit Lizenz.
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: CSN, Kategorie: C-NEU, Höhe: ≤ 95 cm
|
||||
Fehlende Abteilung(en): [ohne Lizenz / mit Lizenz]
|
||||
Referenz: ÖTO B-Teil § 231
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### C_NEU_R1_VS_R2PLUS – CSN-C-NEU ab 100 cm
|
||||
|
||||
**Regel:** Abt. 1 = R1, Abt. 2 = R2 und höher.
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: CSN, Kategorie: C-NEU, Höhe: ≥ 100 cm
|
||||
Fehlende Abteilung(en): [R1 / R2+]
|
||||
Referenz: ÖTO B-Teil § 231
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### CCN_C_NEU_3_ABT – CCN-C-NEU Gelände bis 80 cm
|
||||
|
||||
**Regel:** 3 Abteilungen: ohne Lizenz / R1 / R2+.
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: CCN, Kategorie: C-NEU, Höhe: ≤ 80 cm
|
||||
Fehlende Abteilung(en): [ohne Lizenz / R1 / R2+]
|
||||
Referenz: ÖTO B-Teil § 300 (C-NEU)
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### CCN_C_NEU_2_ABT – CCN-C-NEU Gelände ab 90 cm
|
||||
|
||||
**Regel:** 2 Abteilungen: ohne Lizenz / R1+.
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: CCN, Kategorie: C-NEU, Höhe: ≥ 90 cm
|
||||
Fehlende Abteilung(en): [ohne Lizenz / R1+]
|
||||
Referenz: ÖTO B-Teil § 300 (C-NEU)
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### CCN_WELCOME_80_R2PLUS_EIGENE_ABT – CCN Welcome / 80 cm
|
||||
|
||||
**Regel:** R2+ Reiter müssen in eigener Abteilung gewertet werden.
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: CCN, Klasse: Welcome / 80 cm
|
||||
R2+-Reiter ohne eigene Abteilung
|
||||
Referenz: ÖTO B-Teil § 301 Abs. 1.4
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### CAPRILLI_LIZENSFREI_VS_RD1PLUS – Caprilli (§ 803)
|
||||
|
||||
**Regel:** Mindestens 2 Abteilungen: lizenzfrei / RD1 und höher. Unabhängig von Starterzahl.
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Prüfungstyp: CAPRILLI
|
||||
Fehlende Abteilung(en): [lizenzfrei / RD1+]
|
||||
Referenz: ÖTO B-Teil § 803 Abs. 2
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
#### FAHREN_F1PLUS_EIGENE_ABT – Fahrertreffen (§ 850)
|
||||
|
||||
**Regel:** Fahrer mit Lizenz höher als F1 in eigener Abteilung.
|
||||
|
||||
```
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT:
|
||||
Bewerb: [bewerbNummer] – [bezeichnung]
|
||||
Sparte: CAN, Prüfungstyp: FAHREN
|
||||
F1+-Fahrer ohne eigene Abteilung
|
||||
Referenz: ÖTO B-Teil § 850 Abs. 9
|
||||
Override möglich (TBA-Entscheidung erforderlich)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Implementierungs-Vorgaben
|
||||
|
||||
### 5.1 Methoden-Signaturen (Kotlin)
|
||||
|
||||
```kotlin
|
||||
// In DomBewerb – bereits vorhanden, vollständig implementieren:
|
||||
fun validateAbteilungsSchwellenwerte(aktuelleStarterAnzahl: Int): List<AbteilungsWarnung>
|
||||
|
||||
// In DomBewerb – NEU zu implementieren:
|
||||
fun validateStrukturellesTeilung(abteilungen: List<DomAbteilung>): List<AbteilungsWarnung>
|
||||
|
||||
// In DomAbteilung – bereits vorhanden, vollständig implementieren:
|
||||
fun validateStarterLimit(): List<AbteilungsWarnung>
|
||||
```
|
||||
|
||||
### 5.2 `AbteilungsWarnung` – Value Object
|
||||
|
||||
Statt roher Strings soll ein typisiertes Value Object verwendet werden:
|
||||
|
||||
```kotlin
|
||||
@Serializable
|
||||
data class AbteilungsWarnung(
|
||||
val code: AbteilungsWarnungCodeE, // Maschinenlesbarer Warn-Code
|
||||
val bewerbId: Uuid, // Betroffener Bewerb
|
||||
val abteilungId: Uuid? = null, // Betroffene Abteilung (wenn relevant)
|
||||
val nachricht: String, // Menschenlesbare Beschreibung
|
||||
val oetoParagraph: String, // z.B. "§ 39 Abs. 2"
|
||||
val istOverridebar: Boolean = true, // Immer true (ADR-0007)
|
||||
val timestamp: Instant = Clock.System.now()
|
||||
)
|
||||
|
||||
enum class AbteilungsWarnungCodeE {
|
||||
WARN_PFLICHT_TEILUNG_UEBERSCHRITTEN,
|
||||
WARN_KANN_TEILUNG_EMPFOHLEN,
|
||||
WARN_ABTEILUNG_ZU_GROSS,
|
||||
WARN_ABTEILUNG_MAX_UEBERSCHRITTEN,
|
||||
WARN_STRUKTURELLE_TEILUNG_FEHLT,
|
||||
WARN_STRUKTURELLE_TEILUNG_UNVOLLSTAENDIG
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 Override-Event
|
||||
|
||||
Wenn der TBA eine Warnung bestätigt/überschreibt, wird ein `AbteilungsWarnungOverrideEvent` gespeichert:
|
||||
|
||||
```kotlin
|
||||
@Serializable
|
||||
data class AbteilungsWarnungOverrideEvent(
|
||||
val overrideId: Uuid = Uuid.random(),
|
||||
val warnungCode: AbteilungsWarnungCodeE,
|
||||
val bewerbId: Uuid,
|
||||
val abteilungId: Uuid? = null,
|
||||
val begruendung: String, // Pflichtfeld – TBA muss Begründung angeben
|
||||
val tbaUserId: Uuid,
|
||||
val timestamp: Instant = Clock.System.now()
|
||||
)
|
||||
```
|
||||
|
||||
### 5.4 Konfigurierbare Schwellenwerte
|
||||
|
||||
Die Schwellenwerte sind **nicht hard-coded**, sondern über `AbteilungsSchwellenwertConfig` konfigurierbar:
|
||||
|
||||
```kotlin
|
||||
data class AbteilungsSchwellenwertConfig(
|
||||
val stilSpringpferdPflicht: Int = 30, // § 39 Abs. 2
|
||||
val vielseitigkeitPflicht: Int = 40, // § 39 Abs. 2
|
||||
val springenUebrigPflicht: Int = 80, // § 39 Abs. 2
|
||||
val dressurKann: Int = 30, // § 39 Abs. 2
|
||||
val abteilungMaxNachTeilung: Int = 80 // § 39 Abs. 2
|
||||
)
|
||||
```
|
||||
|
||||
### 5.5 Aufruf-Zeitpunkte (Trigger)
|
||||
|
||||
| Ereignis | Aufgerufene Validierung |
|
||||
|-------------------------------------------------------------|----------------------------------------------------------|
|
||||
| Neue Nennung wird einem Bewerb zugeordnet | `DomBewerb.validateAbteilungsSchwellenwerte(neueAnzahl)` |
|
||||
| Abteilung wird erstellt oder geändert | `DomAbteilung.validateStarterLimit()` |
|
||||
| Bewerb wird gespeichert / Abteilungs-Konfiguration geändert | `DomBewerb.validateStrukturellesTeilung(abteilungen)` |
|
||||
| Startliste wird aus ENTWURF → VEROEFFENTLICHT überführt | Alle drei Validierungen als Gesamt-Check |
|
||||
|
||||
---
|
||||
|
||||
## 6. Ausnahmen (nicht warnen)
|
||||
|
||||
| Bedingung | Begründung |
|
||||
|--------------------------------------------------------|-----------------------------------------------------|
|
||||
| `istMeisterschaft == true` | § 39 Abs. 4: Meisterschaftsbewerbe sind ausgenommen |
|
||||
| Bewerb mit Geldpreisen > Doppeltes der Gebührenordnung | § 39 Abs. 2: Ausnahme von Pflicht-Teilung |
|
||||
| `turnierkategorie` nicht in {A*, A, B*, B, C, C-NEU} | Schwellenwerte gelten nur für diese Kategorien |
|
||||
|
||||
---
|
||||
|
||||
## 7. Offene Fragen (Klärungsbedarf)
|
||||
|
||||
| # | Frage | Status |
|
||||
|---|----------------------------------------------------------------------------------------------|----------|
|
||||
| 1 | Gelten § 39-Schwellenwerte auch für **Reitertreffen** (nicht nur Turniere)? | 🔍 Offen |
|
||||
| 2 | Pflicht-Teilung bei **kombinierten Turnieren** (CDN + CSN, § 4)? | 🔍 Offen |
|
||||
| 3 | **Voltigieren (CVN):** Eigene Abteilungs-Trennungsregeln? (§ 400 ff. nicht ausgewertet) | 🔍 Offen |
|
||||
| 4 | **Fahren (CAN):** Eigene Starter-Schwellenwerte jenseits der Reitertreffen-Regel? | 🔍 Offen |
|
||||
| 5 | Wie wird „Bewerb mit Geldpreisen > Doppeltes der Gebührenordnung" im Datenmodell abgebildet? | 🔍 Offen |
|
||||
|
||||
---
|
||||
|
||||
*Erstellt: 2026-03-24 | Autor: ÖTO/FEI Rulebook Expert (Junie)*
|
||||
*Basiert auf: ÖTO 2026 A-Teil § 39, B-Teil §§ 100, 200, 231, 300, 301, 803, 850*
|
||||
*Implementierungs-Ziel: `competition-context` (PHASE 5)*
|
||||
Reference in New Issue
Block a user