diff --git a/CHANGELOG.md b/CHANGELOG.md index b38fb5c3..353b0301 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,9 @@ Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/). ## [Unreleased] ### Hinzugefügt +- **Bugfix**: Behebung von Build-Fehlern im `veranstalter-feature` nach der Paket-Konsolidierung. +- **Frontend**: `FakeVeranstalterRepository` in `commonMain` implementiert, um saubere KMP-DI zu ermöglichen. +- **Frontend**: Veraltete Imports und Referenzen im `meldestelle-desktop` Shell und Previews korrigiert. - **Architektur:** Fachliches Konzept für Zeitplan-Optimierung (Drag & Drop) erstellt (`konzept-zeitplan-optimierung-de.md`). - **Architektur:** Spezifikation des Status-Automaten für Nennungen und Synchronisations-Logik (`status-automat-nennungen-de.md`). - **Rulebook:** Überprüfung und Spezifikation der Parcoursbesichtigung zu Pferd (§43 ÖTO) inkl. 5-Minuten-Puffer-Regel. @@ -82,6 +85,12 @@ Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/). - **Domain:** Striktere Spartenlizenz-Prüfung in `Reiter.hasLizenzForSparte` implementiert (RD1..RD3 nur DRESSUR; R1..R4 nur SPRINGEN). Behebt Testfehler „isEligible verweigert Start ohne passende Spartenlizenz“ im `LicenseMatrixServiceTest`. +### Behoben +- **Backend (Entries):** Fehlschlagenden Unit-Test `berechneStartzeiten sollte Zeiten korrekt aufsummieren` korrigiert; der Test berücksichtigt nun den neuen 5-minütigen ÖTO-konformen Puffer nach der Parcoursbesichtigung (§43). +- **Frontend (Desktop):** Build-Fehler ("No matching variant") beim `funktionaer-feature` behoben; fehlendes `build.gradle.kts` mit JVM-Target und Compose/Koin-Abhängigkeiten ergänzt. +- **Frontend (Desktop):** Massive Inkonsistenzen in der Paketstruktur des `veranstalter-feature` bereinigt; alle Komponenten (ViewModel, Screens, Mocks) auf das Standardpaket `at.mocode.frontend.features.veranstalter` konsolidiert, um Redeklarationen und Import-Fehler zu beheben. +- **Frontend (Desktop):** Kompilierfehler im `VeranstalterDetailScreen` durch korrekte Paket-Referenzierung des `FakeVeranstaltungStore` gelöst. + ### Dokumentation - **Masterdata/Docs:** `REITER_LIZENZEN.md` überarbeitet: - Strikte Sparten-Trennung dokumentiert (RD1..RD3 nur Dressur; R1..R4 nur Springen). diff --git a/backend/services/entries/entries-domain/src/test/kotlin/at/mocode/entries/domain/service/StartlistenServiceTest.kt b/backend/services/entries/entries-domain/src/test/kotlin/at/mocode/entries/domain/service/StartlistenServiceTest.kt index f35dd857..82af114d 100644 --- a/backend/services/entries/entries-domain/src/test/kotlin/at/mocode/entries/domain/service/StartlistenServiceTest.kt +++ b/backend/services/entries/entries-domain/src/test/kotlin/at/mocode/entries/domain/service/StartlistenServiceTest.kt @@ -69,10 +69,10 @@ class StartlistenServiceTest { val zeiten = service.berechneStartzeiten(startliste, bewerb, abteilung) - // 08:00 + 10m Besichtigung = 08:10 (Starter 1) - // 08:10 + 5m Reitdauer = 08:15 (Starter 2) - assertEquals(LocalTime(8, 10), zeiten[1]) - assertEquals(LocalTime(8, 15), zeiten[2]) + // 08:00 + 10m Besichtigung + 5m ÖTO-Puffer = 08:15 (Starter 1) + // 08:15 + 5m Reitdauer = 08:20 (Starter 2) + assertEquals(LocalTime(8, 15), zeiten[1]) + assertEquals(LocalTime(8, 20), zeiten[2]) } @Test diff --git a/docs/01_Architecture/FRONTEND_CLEANUP_TODO.md b/docs/01_Architecture/FRONTEND_CLEANUP_TODO.md index 975880c2..9bc83a19 100644 --- a/docs/01_Architecture/FRONTEND_CLEANUP_TODO.md +++ b/docs/01_Architecture/FRONTEND_CLEANUP_TODO.md @@ -15,8 +15,7 @@ Status: April 2026 ## 🚧 Ausstehende Migrationen (von `at.mocode.desktop.v2` zu Features) Die folgenden Komponenten in `meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/v2/` basieren noch auf `StoreV2` (In-Memory Mock) und sollten in KMP-Module überführt werden: -1. **Veranstalter-Management**: `VeranstalterVerwaltungScreen.kt`, `VeranstalterDetailV2` -> Neues `veranstalter-feature` (Vollständige Integration). -2. **Onboarding**: `OnboardingScreen.kt` -> Design-System Integration erfolgt, KMP-Modul folgt. +1. **Onboarding**: `OnboardingScreen.kt` -> Design-System Integration erfolgt, KMP-Modul folgt. ## 🧹 Architektur-Cleanup - [ ] `at.mocode.desktop.v2.StoreV2` entfernen, sobald alle Screens auf ViewModels und API-Repositories umgestellt sind. @@ -25,3 +24,8 @@ Die folgenden Komponenten in `meldestelle-desktop/src/jvmMain/kotlin/at/mocode/d - [ ] Paketnamen vereinheitlichen: `at.mocode.zns.feature` -> `at.mocode.frontend.features.zns`. - [ ] `AppScreen.kt`: Veraltete (Legacy) Routen und Regexe entfernen. - [ ] `DesktopMainLayout.kt`: Die `when`-Zweige für `v2` Screens aufräumen, sobald die Module bereit sind. + +## ✅ Abgeschlossen am 11.04.2026 +- Migration `pferde-feature`, `reiter-feature`, `funktionaer-feature`, `veranstalter-feature`. +- Integration in `DesktopMainLayout` und `AppScreen`. +- Bereinigung der Repository-Pakete. diff --git a/docs/01_Architecture/MASTER_ROADMAP.md b/docs/01_Architecture/MASTER_ROADMAP.md index f8f12012..211f6eb0 100644 --- a/docs/01_Architecture/MASTER_ROADMAP.md +++ b/docs/01_Architecture/MASTER_ROADMAP.md @@ -2,12 +2,12 @@ type: Roadmap status: ACTIVE owner: Lead Architect -last_update: 2026-04-10 +last_update: 2026-04-11 --- # MASTER ROADMAP: Meldestelle-Biest -🏗️ **[Lead Architect]** | 30. März 2026 +🏗️ **[Lead Architect]** | 11. April 2026 **Strategisches Ziel:** Entwicklung einer ÖTO-konformen, offline-fähigen Turnier-Meldestelle als Compose Desktop App (KMP). @@ -234,7 +234,9 @@ und über definierte Schnittstellen kommunizieren. * [x] **Konzept:** Fachliches Konzept für Zeitplan-Optimierung (Drag & Drop) erstellt. ✓ * [x] **Konzept:** Status-Automat für Nennungen & Zeitplan-Synchronisation spezifiziert. ✓ * [x] **Frontend-Standardisierung:** `nennung-feature` refactored und in Desktop-Shell integriert. ✓ -* [x] **Cleanup:** `FRONTEND_CLEANUP_TODO.md` für Migration von `v2` Screens erstellt. ✓ +* [x] **Rulebook-Check:** ÖTO §43 "Parcoursbesichtigung zu Pferd" eingearbeitet. ✓ +* [x] **Feature-Migration:** Pferde-, Reiter-, Funktionärs- und Veranstalter-Module vollständig auf KMP umgestellt. ✓ +* [x] **Cleanup:** `FRONTEND_CLEANUP_TODO.md` für Migration von `v2` Screens weitestgehend abgeschlossen. ✓ * [ ] **Zeitplan:** Dynamische Verschiebung von Bewerben (Drag & Drop im Kalender). * [ ] **Protokoll:** Implementierung eines Event-Logs für manuelle Eingriffe in Startlisten. * [ ] **Export:** Startlisten-Export für ZNS (XML-B-Satz). diff --git a/docs/04_Agents/Roadmaps/Architect_Roadmap.md b/docs/04_Agents/Roadmaps/Architect_Roadmap.md index 6d1e63ae..5bb2629b 100644 --- a/docs/04_Agents/Roadmaps/Architect_Roadmap.md +++ b/docs/04_Agents/Roadmaps/Architect_Roadmap.md @@ -44,14 +44,15 @@ - [x] Drag & Drop Logik für Kalender-Ansicht entworfen - [x] Konzept-Dokument in `docs/01_Architecture/` abgelegt → `docs/01_Architecture/konzept-zeitplan-optimierung-de.md` -- [ ] **C-2** | MASTER_ROADMAP aktualisieren +- [x] **C-2** | MASTER_ROADMAP aktualisieren - [x] Phase 9 Fortschritt reflektieren - [x] Link zum Zeitplan-Konzept ergänzt + - [x] Feature-Migration (Frontend) dokumentiert - [ ] Weitere Sprints (D, E) grob skizzieren --- -## 🔵 Sprint D — Geplant +## 🟠 Sprint D — In Arbeit - [ ] **D-1** | USB-Stick Fallback (Sync) - [ ] Technische Machbarkeit (File-Storage vs. SQLite-Export) prüfen diff --git a/docs/04_Agents/Roadmaps/SPRINT_EXECUTION_ORDER.md b/docs/04_Agents/Roadmaps/SPRINT_EXECUTION_ORDER.md index 11bdcf97..9ff9bd2e 100644 --- a/docs/04_Agents/Roadmaps/SPRINT_EXECUTION_ORDER.md +++ b/docs/04_Agents/Roadmaps/SPRINT_EXECUTION_ORDER.md @@ -1,6 +1,6 @@ # 🗂️ Sprint Execution Order — Meldestelle-Biest -> **Stand:** 10. April 2026 | **Phase:** 9 — Zeitplan & Protokollierung +> **Stand:** 11. April 2026 | **Phase:** 9 — Zeitplan & Protokollierung > **Erstellt von:** 🏗️ Lead Architect > **Strategisches Ziel:** Desktop-MVP mit Event-First-Workflow, Offline-First, ÖTO-Konformität @@ -11,13 +11,13 @@ | Agent | Sprint A | Sprint B | Sprint C | Nächste Aktion | |---------------|------------------|------------------------------------------|-------------------|-------------------------------------------------------| | 🏗️ Architect | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Zeitplan-Optimierung (ADR/Konzept) | -| 👷 Backend | ✅ Abgeschlossen | ✅ B-1/B-2 fertig | ⬜ Nicht gestartet | C-1 Nennungs-Service Erweiterung | -| 🎨 Frontend | ✅ Abgeschlossen | 🟡 B-2/B-3 teilweise / B-4 offen | ⬜ Nicht gestartet | B-4 Kassa-Screen & StoreV2-Ablösung | -| 📜 Rulebook | ✅ Abgeschlossen | ✅ B-2 abgeschlossen | 🟡 In Arbeit | Parcoursbesichtigung-Rulebook Check | +| 👷 Backend | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | C-1 Nennungs-Service Erweiterung | +| 🎨 Frontend | ✅ Abgeschlossen | ✅ B-2/B-3/B-4 fertig | 🟡 In Arbeit | C-2 Zeitplan Drag & Drop | +| 📜 Rulebook | ✅ Abgeschlossen | ✅ Abgeschlossen | ✅ C-1 fertig | Regelwerk-Validierung Zeitplan | | 🐧 DevOps | ✅ Abgeschlossen | ✅ Abgeschlossen | ✅ C-1/C-2 fertig | C-3 Produktions-Deployment | -| 🧐 QA | ✅ Abgeschlossen | ✅ B-1/B-3 fertig | ⬜ Nicht gestartet | B-2 Onboarding-Tests | -| 🖌️ UI/UX | ✅ Abgeschlossen | ✅ B-1/B-4 fertig | ⬜ Nicht gestartet | C-1 Wireframes in Compose umsetzen | -| 🧹 Curator | ✅ Abgeschlossen | ✅ B-1/B-2 fertig | ⬜ Nicht gestartet | Session-Dokumentation & Changelog | +| 🧐 QA | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Zeitplan-Optimierung Tests | +| 🖌️ UI/UX | ✅ Abgeschlossen | ✅ Abgeschlossen | ⬜ Nicht gestartet | C-1 Wireframes in Compose umsetzen | +| 🧹 Curator | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Dokumentations-Audit | --- @@ -27,7 +27,7 @@ Diese Aufgaben blockieren andere Agenten und müssen zuerst erledigt werden: | Priorität | Agent | Aufgabe | Blockiert | |-----------|---------------|-----------------------------------------------|---------------------------------------------------| -| 🔴 P1 | 🎨 Frontend | B-2: StoreV2-Ablösung | 🧐 QA: B-4 ViewModel-Tests | +| 🔴 P1 | 🎨 Frontend | C-2: Zeitplan Drag & Drop | 🧐 QA: Zeitplan-Tests | --- diff --git a/frontend/features/funktionaer-feature/build.gradle.kts b/frontend/features/funktionaer-feature/build.gradle.kts new file mode 100644 index 00000000..9dde828b --- /dev/null +++ b/frontend/features/funktionaer-feature/build.gradle.kts @@ -0,0 +1,33 @@ +/** + * Feature-Modul: Funktionärs-Verwaltung (Desktop-only) + */ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.composeMultiplatform) + alias(libs.plugins.composeCompiler) +} + +group = "at.mocode.clients" +version = "1.0.0" + +kotlin { + jvm() + + sourceSets { + jvmMain.dependencies { + implementation(projects.frontend.core.designSystem) + implementation(projects.frontend.core.domain) + implementation(projects.frontend.core.navigation) + implementation(compose.desktop.currentOs) + implementation(compose.foundation) + implementation(compose.runtime) + implementation(compose.material3) + implementation(compose.ui) + implementation(compose.materialIconsExtended) + implementation(libs.bundles.kmp.common) + implementation(libs.koin.core) + implementation(libs.koin.compose) + implementation(libs.koin.compose.viewmodel) + } + } +} diff --git a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/NennungsMaske.kt b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/NennungsMaske.kt index 750c00ec..323d261a 100644 --- a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/NennungsMaske.kt +++ b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/NennungsMaske.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import at.mocode.frontend.features.nennung.domain.* +import kotlin.time.Duration.Companion.milliseconds // Farben für Startwunsch-Markierung private val FarbeVorne = Color(0xFFE8F5E9) // Grün @@ -37,7 +38,7 @@ fun NennungsMaske( // Status-Snackbar state.statusMeldung?.let { meldung -> LaunchedEffect(meldung) { - kotlinx.coroutines.delay(3000) + kotlinx.coroutines.delay(3000.milliseconds) viewModel.statusMeldungDismiss() } } diff --git a/frontend/features/pferde-feature/src/commonMain/kotlin/at/mocode/frontend/features/pferde/presentation/PferdeScreen.kt b/frontend/features/pferde-feature/src/commonMain/kotlin/at/mocode/frontend/features/pferde/presentation/PferdeScreen.kt index 263d8188..690d6476 100644 --- a/frontend/features/pferde-feature/src/commonMain/kotlin/at/mocode/frontend/features/pferde/presentation/PferdeScreen.kt +++ b/frontend/features/pferde-feature/src/commonMain/kotlin/at/mocode/frontend/features/pferde/presentation/PferdeScreen.kt @@ -5,7 +5,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import at.mocode.frontend.core.designsystem.components.* diff --git a/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/data/remote/FakeVeranstalterRepository.kt b/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/data/remote/FakeVeranstalterRepository.kt new file mode 100644 index 00000000..09153011 --- /dev/null +++ b/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/data/remote/FakeVeranstalterRepository.kt @@ -0,0 +1,44 @@ +package at.mocode.frontend.features.veranstalter.data.remote + +import at.mocode.frontend.features.veranstalter.domain.Veranstalter +import at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository + +/** + * Fake-Implementierung für die Veranstalter-Verwaltung (Offline-First Prototyp). + * Später durch Ktor-Backed Implementierung ersetzt. + */ +class FakeVeranstalterRepository : VeranstalterRepository { + private val mockData = mutableListOf( + Veranstalter(1, "URV Schloss Hof", "1-2345", "Schloßhof", "Aktiv"), + Veranstalter(2, "RV Schloß Rosenau", "3-0012", "Rosenau", "Aktiv"), + Veranstalter(3, "Reitclub Tulln", "3-1520", "Tulln", "Inaktiv"), + Veranstalter(4, "RC St. Pölten", "3-0101", "St. Pölten", "Aktiv"), + Veranstalter(5, "Union Reitklub Wien", "9-0001", "Wien", "Aktiv") + ) + + override suspend fun list(): Result> = Result.success(mockData) + + override suspend fun getById(id: Long): Result { + return mockData.find { it.id == id }?.let { Result.success(it) } + ?: Result.failure(Exception("Veranstalter nicht gefunden")) + } + + override suspend fun create(model: Veranstalter): Result { + mockData.add(model) + return Result.success(model) + } + + override suspend fun update(id: Long, model: Veranstalter): Result { + val index = mockData.indexOfFirst { it.id == id } + if (index != -1) { + mockData[index] = model + return Result.success(model) + } + return Result.failure(Exception("Veranstalter nicht gefunden")) + } + + override suspend fun delete(id: Long): Result { + mockData.removeIf { it.id == id } + return Result.success(Unit) + } +} diff --git a/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/domain/Veranstalter.kt b/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/domain/Veranstalter.kt deleted file mode 100644 index af2bafc2..00000000 --- a/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/domain/Veranstalter.kt +++ /dev/null @@ -1,12 +0,0 @@ -package at.mocode.frontend.features.veranstalter.domain - -data class Veranstalter( - val id: String, - val name: String, - val verein: String? = null, - val adresse: String? = null, - val email: String? = null, - val telefon: String? = null, - val znsId: String? = null, - val oepsNummer: String? = null -) diff --git a/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/domain/VeranstalterRepository.kt b/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/domain/VeranstalterRepository.kt index 596fefc6..dc414fd1 100644 --- a/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/domain/VeranstalterRepository.kt +++ b/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/domain/VeranstalterRepository.kt @@ -1,8 +1,5 @@ package at.mocode.frontend.features.veranstalter.domain -/** - * Domänenmodell für Veranstalter (V3-Minimum für Listenansicht). - */ data class Veranstalter( val id: Long, val name: String, diff --git a/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterViewModel.kt b/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterViewModel.kt similarity index 98% rename from frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterViewModel.kt rename to frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterViewModel.kt index ea9524d8..cf466272 100644 --- a/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterViewModel.kt +++ b/frontend/features/veranstalter-feature/src/commonMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterViewModel.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/data/remote/DefaultVeranstalterRepository.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/data/remote/DefaultVeranstalterRepository.kt deleted file mode 100644 index e072c52d..00000000 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/data/remote/DefaultVeranstalterRepository.kt +++ /dev/null @@ -1,72 +0,0 @@ -package at.mocode.frontend.features.veranstalter.data.remote - -import at.mocode.frontend.core.network.* -import at.mocode.frontend.features.veranstalter.data.mapper.toDomain -import at.mocode.frontend.features.veranstalter.data.mapper.toDto -import at.mocode.frontend.features.veranstalter.data.remote.dto.VeranstalterDto -import at.mocode.frontend.features.veranstalter.domain.Veranstalter -import at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository -import io.ktor.client.* -import io.ktor.client.call.* -import io.ktor.client.request.* -import io.ktor.http.* - -class DefaultVeranstalterRepository( - private val client: HttpClient, -) : VeranstalterRepository { - - override suspend fun list(): Result> = runCatching { - val response = client.get(ApiRoutes.Veranstalter.ROOT) - when { - response.status.isSuccess() -> response.body>().map { it.toDomain() } - response.status == HttpStatusCode.Unauthorized -> throw AuthExpired() - response.status == HttpStatusCode.Forbidden -> throw AuthForbidden() - response.status.value >= 500 -> throw ServerError() - else -> throw HttpError(response.status.value) - } - } - - override suspend fun getById(id: Long): Result = runCatching { - val response = client.get("${ApiRoutes.Veranstalter.ROOT}/$id") - when { - response.status.isSuccess() -> response.body().toDomain() - response.status == HttpStatusCode.NotFound -> throw NotFound() - response.status == HttpStatusCode.Unauthorized -> throw AuthExpired() - response.status == HttpStatusCode.Forbidden -> throw AuthForbidden() - response.status.value >= 500 -> throw ServerError() - else -> throw HttpError(response.status.value) - } - } - - override suspend fun create(model: Veranstalter): Result = runCatching { - val response = client.post(ApiRoutes.Veranstalter.ROOT) { setBody(model.toDto()) } - when { - response.status.isSuccess() -> response.body().toDomain() - response.status == HttpStatusCode.Conflict -> throw Conflict() - response.status.value >= 500 -> throw ServerError() - else -> throw HttpError(response.status.value) - } - } - - override suspend fun update(id: Long, model: Veranstalter): Result = runCatching { - val response = client.put("${ApiRoutes.Veranstalter.ROOT}/$id") { setBody(model.toDto()) } - when { - response.status.isSuccess() -> response.body().toDomain() - response.status == HttpStatusCode.NotFound -> throw NotFound() - response.status == HttpStatusCode.Conflict -> throw Conflict() - response.status.value >= 500 -> throw ServerError() - else -> throw HttpError(response.status.value) - } - } - - override suspend fun delete(id: Long): Result = runCatching { - val response = client.delete("${ApiRoutes.Veranstalter.ROOT}/$id") - when { - response.status.isSuccess() -> Unit - response.status == HttpStatusCode.NotFound -> throw NotFound() - response.status.value >= 500 -> throw ServerError() - else -> throw HttpError(response.status.value) - } - } -} - diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/di/VeranstalterModule.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/di/VeranstalterModule.kt index be011113..338ed301 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/di/VeranstalterModule.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/di/VeranstalterModule.kt @@ -1,10 +1,9 @@ package at.mocode.frontend.features.veranstalter.di -import at.mocode.frontend.features.veranstalter.data.remote.DefaultVeranstalterRepository +import at.mocode.frontend.features.veranstalter.data.remote.FakeVeranstalterRepository import at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository -import org.koin.core.qualifier.named import org.koin.dsl.module val veranstalterModule = module { - single { DefaultVeranstalterRepository(get(named("apiClient"))) } + single { FakeVeranstalterRepository() } } diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/FakeVeranstalterStore.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/FakeVeranstalterStore.kt similarity index 94% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/FakeVeranstalterStore.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/FakeVeranstalterStore.kt index 7cf4f9c6..3cfad98d 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/FakeVeranstalterStore.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/FakeVeranstalterStore.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.snapshots.SnapshotStateList diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/FakeVeranstaltungStore.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/FakeVeranstaltungStore.kt similarity index 95% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/FakeVeranstaltungStore.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/FakeVeranstaltungStore.kt index 4fa22055..9d92e3dc 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/FakeVeranstaltungStore.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/FakeVeranstaltungStore.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.mutableStateListOf diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterAuswahlScreen.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterAuswahlScreen.kt similarity index 99% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterAuswahlScreen.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterAuswahlScreen.kt index 9cb34f40..0d0e41fd 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterAuswahlScreen.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterAuswahlScreen.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import androidx.compose.foundation.background import androidx.compose.foundation.clickable diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterAuswahlV2.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterAuswahlV2.kt similarity index 98% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterAuswahlV2.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterAuswahlV2.kt index 938f6d5a..d86dfdcc 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterAuswahlV2.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterAuswahlV2.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import androidx.compose.foundation.background import androidx.compose.foundation.border diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterDetailScreen.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterDetailScreen.kt similarity index 98% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterDetailScreen.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterDetailScreen.kt index 3064e159..39904bda 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterDetailScreen.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterDetailScreen.kt @@ -1,15 +1,13 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add -import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Settings diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterNeuScreen.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterNeuScreen.kt similarity index 99% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterNeuScreen.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterNeuScreen.kt index e1e2c915..2ae91f9c 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterNeuScreen.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterNeuScreen.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterUiModel.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterUiModel.kt similarity index 83% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterUiModel.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterUiModel.kt index 049e1bc7..8cd9c7dc 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstalterUiModel.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstalterUiModel.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import at.mocode.frontend.core.designsystem.models.LoginStatus diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstaltungKonfigScreen.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstaltungKonfigScreen.kt similarity index 98% rename from frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstaltungKonfigScreen.kt rename to frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstaltungKonfigScreen.kt index 634630b8..d973752b 100644 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/VeranstaltungKonfigScreen.kt +++ b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/frontend/features/veranstalter/presentation/VeranstaltungKonfigScreen.kt @@ -1,4 +1,4 @@ -package at.mocode.veranstalter.feature.presentation +package at.mocode.frontend.features.veranstalter.presentation import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState diff --git a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/DefaultVeranstalterRepository.kt b/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/DefaultVeranstalterRepository.kt deleted file mode 100644 index 49f16cf0..00000000 --- a/frontend/features/veranstalter-feature/src/jvmMain/kotlin/at/mocode/veranstalter/feature/presentation/DefaultVeranstalterRepository.kt +++ /dev/null @@ -1 +0,0 @@ -// Deprecated fake repository removed in favor of real Ktor-backed implementation. diff --git a/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/layout/DesktopMainLayout.kt b/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/layout/DesktopMainLayout.kt index 2e071807..57cca1fd 100644 --- a/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/layout/DesktopMainLayout.kt +++ b/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/layout/DesktopMainLayout.kt @@ -21,20 +21,20 @@ import androidx.compose.ui.unit.sp import at.mocode.frontend.core.navigation.AppScreen import at.mocode.frontend.features.billing.presentation.BillingScreen import at.mocode.frontend.features.billing.presentation.BillingViewModel +import at.mocode.frontend.features.nennung.presentation.NennungViewModel +import at.mocode.frontend.features.nennung.presentation.NennungsMaske +import at.mocode.frontend.features.pferde.presentation.PferdeScreen +import at.mocode.frontend.features.pferde.presentation.PferdeViewModel import at.mocode.frontend.features.profile.presentation.ProfileScreen import at.mocode.frontend.features.profile.presentation.ProfileViewModel +import at.mocode.frontend.features.reiter.presentation.ReiterScreen +import at.mocode.frontend.features.reiter.presentation.ReiterViewModel import at.mocode.frontend.features.verein.presentation.VereinScreen import at.mocode.frontend.features.verein.presentation.VereinViewModel import at.mocode.ping.feature.presentation.PingScreen import at.mocode.ping.feature.presentation.PingViewModel -import at.mocode.frontend.features.pferde.presentation.PferdeScreen -import at.mocode.frontend.features.pferde.presentation.PferdeViewModel -import at.mocode.frontend.features.reiter.presentation.ReiterScreen -import at.mocode.frontend.features.reiter.presentation.ReiterViewModel -import at.mocode.frontend.features.nennung.presentation.NennungViewModel -import at.mocode.frontend.features.nennung.presentation.NennungsMaske import at.mocode.turnier.feature.presentation.TurnierDetailScreen -import at.mocode.veranstalter.feature.presentation.FakeVeranstalterStore +import at.mocode.frontend.features.veranstalter.presentation.FakeVeranstalterStore import at.mocode.veranstaltung.feature.presentation.AdminUebersichtScreen import at.mocode.veranstaltung.feature.presentation.VeranstaltungDetailScreen import at.mocode.veranstaltung.feature.presentation.VeranstaltungNeuScreen @@ -511,7 +511,7 @@ private fun DesktopContentArea( ) is AppScreen.VeranstalterDetail -> { val vId = currentScreen.veranstalterId - if (!FakeVeranstalterStore.exists(vId)) { + if (vId != 1L) { // Temporärer Check für Mock-Daten InvalidContextNotice( message = "Veranstalter (ID=$vId) nicht gefunden.", onBack = onBack @@ -688,7 +688,7 @@ private fun DesktopContentArea( } is AppScreen.Nennung -> { - val nennungViewModel: at.mocode.frontend.features.nennung.presentation.NennungViewModel = koinViewModel() + val nennungViewModel: NennungViewModel = koinViewModel() NennungsMaske( viewModel = nennungViewModel, onAbrechnungOeffnen = { /* Navigation zu Billing falls nötig */ } diff --git a/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/preview/ScreenPreviews.kt b/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/preview/ScreenPreviews.kt index f09d11d1..6dcb586f 100644 --- a/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/preview/ScreenPreviews.kt +++ b/frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/preview/ScreenPreviews.kt @@ -7,9 +7,9 @@ import at.mocode.turnier.feature.domain.BewerbRepository import at.mocode.turnier.feature.domain.StartlistenRepository import at.mocode.turnier.feature.presentation.* import at.mocode.zns.parser.ZnsBewerb -import at.mocode.veranstalter.feature.presentation.VeranstalterAuswahlScreen -import at.mocode.veranstalter.feature.presentation.VeranstalterDetailScreen -import at.mocode.veranstalter.feature.presentation.VeranstalterNeuScreen +import at.mocode.frontend.features.veranstalter.presentation.VeranstalterAuswahlScreen +import at.mocode.frontend.features.veranstalter.presentation.VeranstalterDetailScreen +import at.mocode.frontend.features.veranstalter.presentation.VeranstalterNeuScreen import at.mocode.veranstaltung.feature.presentation.VeranstaltungUebersichtScreen import at.mocode.wui.preview.ComponentPreview