From 085656a85b7f86d92e505ea278396dc4775a10c7 Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Wed, 8 Apr 2026 22:58:53 +0200 Subject: [PATCH] Extend `Bewerb` domain model: add new properties (e.g., `Beschreibung`, `Aufgabe`, `BeginnZeitTyp`), update `Enums`, and align repository structures. --- .../domain/model/{DomBewerb.kt => Bewerb.kt} | 48 +++++++++++++++++-- .../service/bewerbe/BewerbRepository.kt | 26 ++++++++++ .../at/mocode/core/domain/model/Enums.kt | 17 ++++++- 3 files changed, 87 insertions(+), 4 deletions(-) rename backend/services/entries/entries-domain/src/main/kotlin/at/mocode/entries/domain/model/{DomBewerb.kt => Bewerb.kt} (73%) diff --git a/backend/services/entries/entries-domain/src/main/kotlin/at/mocode/entries/domain/model/DomBewerb.kt b/backend/services/entries/entries-domain/src/main/kotlin/at/mocode/entries/domain/model/Bewerb.kt similarity index 73% rename from backend/services/entries/entries-domain/src/main/kotlin/at/mocode/entries/domain/model/DomBewerb.kt rename to backend/services/entries/entries-domain/src/main/kotlin/at/mocode/entries/domain/model/Bewerb.kt index 50644b85..00c33fb3 100644 --- a/backend/services/entries/entries-domain/src/main/kotlin/at/mocode/entries/domain/model/DomBewerb.kt +++ b/backend/services/entries/entries-domain/src/main/kotlin/at/mocode/entries/domain/model/Bewerb.kt @@ -3,11 +3,14 @@ package at.mocode.entries.domain.model import at.mocode.core.domain.model.AbteilungsTeilungsTypE +import at.mocode.core.domain.model.BeginnZeitTypE import at.mocode.core.domain.model.PruefungsTypE import at.mocode.core.domain.model.SparteE import at.mocode.core.domain.model.TurnierkategorieE import at.mocode.core.domain.serialization.InstantSerializer import at.mocode.core.domain.serialization.UuidSerializer +import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalTime import kotlinx.serialization.Serializable import kotlin.time.Clock import kotlin.time.Instant @@ -17,7 +20,7 @@ import kotlin.uuid.Uuid * Domain-Modell für einen Bewerb im registration-context. * * Ein Bewerb ist eine einzelne Prüfung innerhalb eines Turniers (z.B. „Stilspringen 90 cm"). - * Er kann in mehrere [DomAbteilung]en aufgeteilt sein. Die Abteilungs-Warn-Logik basiert + * Er kann in mehrere [Abteilung]en aufgeteilt sein. Die Abteilungs-Warn-Logik basiert * auf den ÖTO-Schwellenwerten (§ 39 A-Teil + spartenspezifische Bestimmungen). * * Aggregate Root des `registration-context` für den Bewerbs-Workflow. @@ -34,12 +37,27 @@ import kotlin.uuid.Uuid * @property maxStarterProAbteilung Maximale Starter pro Abteilung (0 = kein Limit gesetzt). * @property istMeisterschaft Ob es sich um einen Meisterschaftsbewerb handelt (Ausnahme von § 39 Abs. 4). * @property istNachnennungErlaubt Ob Nachnennungen für diesen Bewerb zugelassen sind. + * @property beschreibung Optionale Beschreibung (z.B. "Pony Einsteiger Cup"). + * @property aufgabe Aufgaben-Bezeichnung gemäß ÖTO (z.B. "R1", "L1"). + * @property aufgabenNummer Aufgaben-Nummer (z.B. "R1/2024"). + * @property paraGrade Para-Equestrian Grade (z.B. "Grade I"), falls zutreffend. + * @property austragungsplatzId Referenz auf den Austragungsplatz (UUID aus events-context). + * @property richterEinsaetze Liste der Richter-Einsätze für diesen Bewerb. + * @property geplantesDatum Geplantes Datum des Bewerbs. + * @property beginnZeitTyp Typ des Beginnzeit-Eintrags (FIX oder ANSCHLIESSEND). + * @property beginnZeit Geplante Beginnzeit (nur bei FIX). + * @property reitdauerMinuten Geplante Reitdauer in Minuten. + * @property umbauMinuten Geplante Umbauzeit in Minuten. + * @property besichtigungMinuten Geplante Besichtigungszeit in Minuten. + * @property stechenGeplant Ob ein Stechen geplant ist. + * @property startgeldCent Startgeld in Cent (z.B. 1500 = 15,00 €). + * @property geldpreisAusbezahlt Ob der Geldpreis bereits ausbezahlt wurde. * @property bemerkungen Interne Notizen. * @property createdAt Erstellungszeitpunkt. * @property updatedAt Letzter Änderungszeitpunkt. */ @Serializable -data class DomBewerb( +data class Bewerb( @Serializable(with = UuidSerializer::class) val bewerbId: Uuid = Uuid.random(), @@ -61,6 +79,30 @@ data class DomBewerb( var teilungsTyp: AbteilungsTeilungsTypE = AbteilungsTeilungsTypE.KEINE, var maxStarterProAbteilung: Int = 0, + // Text & Details + var beschreibung: String? = null, + var aufgabe: String? = null, + var aufgabenNummer: String? = null, + var paraGrade: String? = null, + + // Ort & Funktionäre + @Serializable(with = UuidSerializer::class) + var austragungsplatzId: Uuid? = null, + var richterEinsaetze: List = emptyList(), + + // Zeitplan + var geplantesDatum: LocalDate? = null, + var beginnZeitTyp: BeginnZeitTypE? = null, + var beginnZeit: LocalTime? = null, + var reitdauerMinuten: Int? = null, + var umbauMinuten: Int? = null, + var besichtigungMinuten: Int? = null, + var stechenGeplant: Boolean = false, + + // Finanzen + var startgeldCent: Long? = null, + var geldpreisAusbezahlt: Boolean = false, + // Flags var istMeisterschaft: Boolean = false, var istNachnennungErlaubt: Boolean = true, @@ -146,5 +188,5 @@ data class DomBewerb( /** * Erstellt eine Kopie mit aktualisiertem Zeitstempel. */ - fun withUpdatedTimestamp(): DomBewerb = this.copy(updatedAt = Clock.System.now()) + fun withUpdatedTimestamp(): Bewerb = this.copy(updatedAt = Clock.System.now()) } diff --git a/backend/services/entries/entries-service/src/main/kotlin/at/mocode/entries/service/bewerbe/BewerbRepository.kt b/backend/services/entries/entries-service/src/main/kotlin/at/mocode/entries/service/bewerbe/BewerbRepository.kt index 9da3d61d..37bf1af4 100644 --- a/backend/services/entries/entries-service/src/main/kotlin/at/mocode/entries/service/bewerbe/BewerbRepository.kt +++ b/backend/services/entries/entries-service/src/main/kotlin/at/mocode/entries/service/bewerbe/BewerbRepository.kt @@ -2,6 +2,11 @@ package at.mocode.entries.service.bewerbe +import at.mocode.core.domain.model.AbteilungsTeilungsTypE +import at.mocode.core.domain.model.BeginnZeitTypE +import at.mocode.entries.domain.model.RichterEinsatz +import kotlinx.datetime.LocalDate +import kotlinx.datetime.LocalTime import kotlin.uuid.Uuid data class Bewerb( @@ -10,6 +15,27 @@ data class Bewerb( val klasse: String, val hoeheCm: Int?, val bezeichnung: String, + // Abteilungs-Konfiguration + val teilungsTyp: AbteilungsTeilungsTypE? = null, + // Text & Details + val beschreibung: String? = null, + val aufgabe: String? = null, + val aufgabenNummer: String? = null, + val paraGrade: String? = null, + // Ort & Funktionäre + val austragungsplatzId: Uuid? = null, + val richterEinsaetze: List = emptyList(), + // Zeitplan + val geplantesDatum: LocalDate? = null, + val beginnZeitTyp: BeginnZeitTypE? = null, + val beginnZeit: LocalTime? = null, + val reitdauerMinuten: Int? = null, + val umbauMinuten: Int? = null, + val besichtigungMinuten: Int? = null, + val stechenGeplant: Boolean = false, + // Finanzen + val startgeldCent: Long? = null, + val geldpreisAusbezahlt: Boolean = false, ) interface BewerbRepository { diff --git a/core/core-domain/src/commonMain/kotlin/at/mocode/core/domain/model/Enums.kt b/core/core-domain/src/commonMain/kotlin/at/mocode/core/domain/model/Enums.kt index 5e7a564d..5c549137 100644 --- a/core/core-domain/src/commonMain/kotlin/at/mocode/core/domain/model/Enums.kt +++ b/core/core-domain/src/commonMain/kotlin/at/mocode/core/domain/model/Enums.kt @@ -372,7 +372,22 @@ enum class AbteilungsTeilungsTypE { ORGANISATORISCH, /** Separate Siegerehrung: Abteilungen werden nicht zusammengeführt, jede Abt. hat eigene Platzierung */ - SEPARATE_SIEGEREHRUNG + SEPARATE_SIEGEREHRUNG, + + /** Manuelle Teilung: Abteilungen werden vom Benutzer manuell festgelegt */ + MANUELL +} + +/** + * Typ des Beginnzeit-Eintrags für einen Bewerb im Zeitplan. + */ +@Serializable +enum class BeginnZeitTypE { + /** Fixer Startzeitpunkt (z.B. 09:00 Uhr) */ + FIX, + + /** Anschließend an den vorherigen Bewerb */ + ANSCHLIESSEND } /**