# 📜 Session-Journal: Rulebook B-1 — Validierungs-Implementierung Frontend > **Datum:** 3. April 2026 > **Agent:** 📜 [ÖTO/FEI Rulebook Expert] > **Sprint:** B-1 > **Status:** ✅ Abgeschlossen --- ## Aufgabe Sprint B-1 aus der `Rulebook_Roadmap.md`: - Spezifikation aus A-1 (v0.3 DRAFT) an Frontend ĂŒbergeben - Live-Validierung auf Regelwerks-KonformitĂ€t prĂŒfen - Fehlermeldungs-Texte auf Korrektheit und VerstĂ€ndlichkeit prĂŒfen --- ## DurchgefĂŒhrte Änderungen ### 1. `OetoValidators.kt` — neue Datei **Pfad:** `frontend/core/domain/src/commonMain/kotlin/at/mocode/frontend/core/domain/validation/OetoValidators.kt` Zentrale, pure Validierungsfunktionen fĂŒr alle ÖTO/FEI-Regeln. KMP-kompatibel (kein JVM-spezifischer Code). | Funktion | Regel | Quelle | |--------------------------------|--------------------------------------------------|--------------------------| | `validateOepsNummer()` | 6–8 Ziffern, optional PrĂ€fix `OEPS-` | Validierungsregeln.md §1 | | `validateFeiId()` | 7–8 Ziffern oder Legacy `NNNAAnn` → Warning | Validierungsregeln.md §2 | | `validateLizenzklasse()` | Katalog: R1–R4, RD1–RD3, LZF | Validierungsregeln.md §3 | | `validateLizenzFuerSpringen()` | Lizenz × Höhe in cm | ÖTO § 231 (DRAFT) | | `validateLizenzFuerDressur()` | Lizenz × DressurNiveau | ÖTO § 103 (DRAFT) | | `validatePferdAlterSpringen()` | Mindestalter × Höhe, Stichtag 1. JĂ€nner | ÖTO § 231 (DRAFT) | | `validatePferdAlterDressur()` | Mindestalter × DressurNiveau, Stichtag 1. JĂ€nner | ÖTO § 103 (DRAFT) | **Typen:** - `ValidationResult` — sealed interface: `Ok`, `Error(short, long)`, `Warning(message)` - `DressurNiveau` — enum: `EINSTEIGER`, `A_L`, `LM_M`, `S` **Fehlermeldungs-Konzept:** Zweistufig — `short` fĂŒr Inline-Hint direkt am Feld, `long` fĂŒr Tooltip/Dialog mit vollstĂ€ndiger ErklĂ€rung. --- ### 2. `ReiterProfilViewModel.kt` — erweitert **Pfad:** `frontend/features/reiter-feature/src/commonMain/.../ReiterProfilViewModel.kt` - `ReiterProfilState` um `oepsNummerValidation`, `feiIdValidation`, `lizenzKlasseValidation` (je `ValidationResult`) erweitert - `isValid: Boolean` Property — blockiert Speichern bei aktiven Fehlern - `edit()`-Funktion löst nach jedem Intent automatisch alle drei Validierungen aus --- ### 3. `PferdProfilViewModel.kt` — erweitert **Pfad:** `frontend/features/pferde-feature/src/commonMain/.../PferdProfilViewModel.kt` - Analog zu ReiterProfilViewModel: `oepsNummerValidation`, `feiIdValidation`, `isValid` - `edit()` mit automatischer Live-Validierung --- ### 4. Mock-Daten korrigiert #### `Stores.kt` (Desktop-Shell) | Feld | Vorher (ungĂŒltig) | Nachher (regelkonform) | |---------------|--------------------------------------------|---------------------------| | Reiter OEPS | `O-12345`, `O-54321`, `GB-9999`, `O-44332` | `OEPS-1234567` etc. | | Reiter Lizenz | `RD4` (3×), `R2D2` | `RD3` (3×), `R2` | | Pferd OEPS | `3H66`, `2T15`, `1V51`, `4U89` | `3456601`, `2345602` etc. | > **Hinweis:** FEI-Legacy-Codes (`104FE22`, `103RW04`, `102UB51`, `104UD89`) in Pferd-Daten wurden **bewusst beibehalten ** — sie sind laut Spec gĂŒltig und lösen korrekt ein `Warning` aus. #### `NennungModels.kt` - `lizenzNr` von `AT-12345`-Format auf `OEPS-NNNNNNN`-Format korrigiert --- ### 5. `OetoValidatorsTest.kt` — neue Datei **Pfad:** `frontend/core/domain/src/jvmTest/kotlin/at/mocode/frontend/core/domain/validation/OetoValidatorsTest.kt` 30 Unit-Tests, alle grĂŒn (`BUILD SUCCESSFUL`): - OEPS: 11 Tests (gĂŒltige Formate, GrenzfĂ€lle, ungĂŒltige Altformate) - FEI-ID: 8 Tests (numerisch, Legacy-Warning, Fehlerformate) - Lizenzklasse: 9 Tests (Katalog, ungĂŒltige Werte) - Lizenz × Bewerb: 5 Tests (Springen-Höhen-Matrix) - Pferd-Alter: 7 Tests (Stichtagsregel, Grenzjahre, Fehlermeldungsinhalt) --- ### 6. `build.gradle.kts` — `jvmTest`-Dependency ergĂ€nzt **Pfad:** `frontend/core/domain/build.gradle.kts` ```kotlin jvmTest.dependencies { implementation(libs.kotlin.test) } ``` --- ## Offene Punkte / Hinweise fĂŒr andere Teams | Team | Hinweis | |-------------|----------------------------------------------------------------------------------------------------------------------------------| | 🎹 Frontend | `ValidationResult` in UI-Komponenten (`MsValidationWrapper`) einbinden — `Error.short` als Inline-Text, `Error.long` als Tooltip | | 🎹 Frontend | `isValid` im ViewModel fĂŒr Speichern-Button-State nutzen | | đŸ‘· Backend | Gleiche Validierungslogik serverseitig spiegeln (Sprint B-2) | | 🧐 QA | GrenzfĂ€lle aus `OetoValidatorsTest.kt` als Basis fĂŒr Integrationstests verwenden | | 📜 Rulebook | Lizenz×Bewerb-Tabellen (Springen + Dressur) sind noch DRAFT — nach Fachfreigabe auf STABLE anheben | --- ## Roadmap-Status - [x] **B-1** abgeschlossen → `Rulebook_Roadmap.md` aktualisiert - [ ] **B-2** Backend-Begleitung — nĂ€chster Sprint