impl div Klassen

This commit is contained in:
2025-05-26 23:00:15 +02:00
parent 181cbcf7d3
commit 89b8900fb2
34 changed files with 1199 additions and 3146 deletions
@@ -11,8 +11,15 @@ enum class DatenQuelleE { OEPS_ZNS, MANUELL }
@Serializable
enum class VerbandE { OEPS, FEI, SONSTIGE }
@Serializable
enum class CupSerieTypE { CUP_SERIE }
@Serializable
enum class LizenzKategorieE { REITERLIZENZ, FAHRERLIZENZ, STARTKARTE }
@Serializable
enum class LizenzTyp { REITER, FAHRER, VOLTIGIERER, WESTERN, WORKING_EQUITATION, POLO, STARTKARTE_ALLG, STARTKARTE_VOLTIGIEREN, STARTKARTE_WESTERN, STARTKARTE_ISLAND, STARTKARTE_FAHREN_JUGEND, STARTKARTE_HORSEBALL, STARTKARTE_POLO, PARAEQUESTRIAN, SONSTIGE }
@Serializable
enum class SportfachStammdatenTypE { DRESSURAUFGABE, WERTUNGSVERFAHREN_SPRINGEN, WERTUNGSVERFAHREN_DRESSUR, BEWERBSKLASSE, BEWERBSKATEGORIE_OETO }
@@ -24,37 +31,43 @@ enum class PruefungsViereckE { VIERECK_20X40, VIERECK_20X60 }
enum class RichtverfahrenModusE { GM, GT }
@Serializable
enum class GeschlechtE { M, W }
enum class ArtDesStechensE { EINFACHES_STECHEN }
@Serializable
enum class PferdeGeschlechtE {
HENGST, STUTE, WALLACH, UNBEKANNT
}
@Serializable
enum class EventStatusE { IN_PLANUNG, AKTIV, BEENDET }
@Serializable
enum class VeranstalterTyp { VEREIN, FIRMA, PRIVATPERSON, SONSTIGE, UNBEKANNT }
enum class NennungsArtE {
ONLINE_PORTAL, EZNS_OEPS, EMAIL, TELEFON, FAX, VOR_ORT
}
@Serializable
enum class PlatzTyp { AUSTRAGUNG, VORBEREITUNG, LONGIEREN, SONSTIGES }
enum class VeranstalterTypE { VEREIN, FIRMA, PRIVATPERSON, SONSTIGE, UNBEKANNT }
@Serializable
enum class NennungsArt { OEPS_ZNS, EIGENES_ONLINE, DIREKT_VERANSTALTER_EMAIL, DIREKT_VERANSTALTER_TELEFON, DIREKT_VERANSTALTER_WHATSAPP, SONSTIGE }
enum class PlatzTypE { AUSTRAGUNG, VORBEREITUNG, LONGIEREN, SONSTIGES }
@Serializable
enum class SparteE { DRESSUR, SPRINGEN, VIELSEITIGKEIT, FAHREN, VOLTIGIEREN, WESTERN, DISTANZ, ISLAND, PFERDESPORT_SPIEL, BASIS, KOMBINIERT, SONSTIGES }
@Serializable
enum class BewerbStatus { GEPLANT, OFFEN_FUER_NENNUNG, GESCHLOSSEN_FUER_NENNUNG, LAEUFT, ABGESCHLOSSEN, ABGESAGT }
@Serializable
enum class Bedingungstyp { LIZENZ_REITER, LIZENZ_FAHRER, ALTER_PFERD, ALTER_REITER, RASSE_PFERD, GESCHLECHT_PFERD, GESCHLECHT_REITER, STARTKARTE, SONSTIGES }
@Serializable
enum class BeginnzeitTyp { FIX_UM, NACH_BEWERB, CA_UM, ANSCHLIESSEND }
enum class BeginnzeitTypE { FIX_UM, NACH_BEWERB, CA_UM, ANSCHLIESSEND }
@Serializable
enum class Operator { GLEICH, UNGLEICH, MINDESTENS, MAXIMAL, ZWISCHEN, IN_LISTE, NICHT_IN_LISTE }
@Serializable
enum class FunktionaerRolle { RICHTER, PARCOURSBAUER, PARCOURSBAU_ASSISTENT, TECHN_DELEGIERTER, TURNIERBEAUFTRAGTER, STEWARD, ZEITNEHMER, SCHREIBER, VERANSTALTER_KONTAKT, TURNIERLEITER, HELFER, SONSTIGE }
@Serializable
enum class RichterPosition { BEI_C, BEI_E, BEI_H, BEI_M, BEI_B, VORSITZ, SEITENRICHTER, SONSTIGE }
enum class RichterPositionE { C, E, H, M, B, VORSITZ, SEITENRICHTER, SONSTIGE }
@Serializable
enum class Geschlecht { M, W, D, UNBEKANNT }
@Serializable
enum class LizenzTyp { REITER, FAHRER, VOLTIGIERER, WESTERN, WORKING_EQUITATION, POLO, STARTKARTE_ALLG, STARTKARTE_VOLTIGIEREN, STARTKARTE_WESTERN, STARTKARTE_ISLAND, STARTKARTE_FAHREN_JUGEND, STARTKARTE_HORSEBALL, STARTKARTE_POLO, PARAEQUESTRIAN, SONSTIGE }
enum class GeschlechtE { M, W, D, UNBEKANNT }
@Serializable
enum class GeschlechtPferd { HENGST, STUTE, WALLACH, UNBEKANNT }
@@ -1,6 +1,6 @@
package at.mocode.shared.model
import at.mocode.shared.enums.BeginnzeitTyp
import at.mocode.shared.enums.BeginnzeitTypE
import at.mocode.shared.serializers.BigDecimalSerializer
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalTimeSerializer
@@ -41,7 +41,7 @@ data class Abteilung(
@Serializable(with = UuidSerializer::class)
var platzId: Uuid?, // FK zum Austragungsplatz (kann vom Hauptbewerb abweichen)
var datum: LocalDate?,
var beginnzeitTyp: BeginnzeitTyp = BeginnzeitTyp.ANSCHLIESSEND,
var beginnzeitTypE: BeginnzeitTypE = BeginnzeitTypE.ANSCHLIESSEND,
@Serializable(with = KotlinLocalTimeSerializer::class)
var beginnzeitFix: LocalTime? = null,
@Serializable(with = UuidSerializer::class)
@@ -1,6 +1,6 @@
package at.mocode.shared.model
import at.mocode.shared.enums.BeginnzeitTyp
import at.mocode.shared.enums.BeginnzeitTypE
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.*
import com.benasher44.uuid.Uuid
@@ -66,7 +66,7 @@ data class Bewerb(
var standardPlatzId: Uuid?, // FK zum Default-Austragungsplatz
@Serializable(with = KotlinLocalDateSerializer::class)
var standardDatum: LocalDate?,
var standardBeginnzeitTyp: BeginnzeitTyp = BeginnzeitTyp.ANSCHLIESSEND, // neuer Enum Wert
var standardBeginnzeitTypE: BeginnzeitTypE = BeginnzeitTypE.ANSCHLIESSEND, // neuer Enum Wert
@Serializable(with = KotlinLocalTimeSerializer::class)
var standardBeginnzeitFix: LocalTime? = null,
@Serializable(with = UuidSerializer::class)
@@ -1,6 +1,6 @@
package at.mocode.shared.model
import at.mocode.shared.enums.PlatzTyp
import at.mocode.shared.enums.PlatzTypE
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
@@ -13,5 +13,5 @@ data class Platz(
var name: String,
var dimension: String?,
var boden: String?,
var typ: PlatzTyp
var typ: PlatzTypE
)
@@ -31,7 +31,7 @@ data class Turnier(
var datumBis: LocalDate,
@Serializable(with = KotlinLocalDateTimeSerializer::class) // Beispiel
var nennungsschluss: LocalDateTime?,
var nennungsArt: List<NennungsArt> = emptyList(),
var nennungsArt: List<NennungsArtE> = emptyList(),
var nennungsHinweis: String?,
var eigenesNennsystemUrl: String?,
@Serializable(with = BigDecimalSerializer::class)
@@ -1,6 +1,6 @@
package at.mocode.shared.model
import at.mocode.shared.enums.VeranstalterTyp
import at.mocode.shared.enums.VeranstalterTypE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.serializers.UuidSerializer
@@ -22,7 +22,7 @@ data class Veranstaltung(
var datumBis: LocalDate,
var veranstalterName: String,
var veranstalterOepsNummer: String?,
var veranstalterTyp: VeranstalterTyp = VeranstalterTyp.UNBEKANNT,
var veranstalterTypE: VeranstalterTypE = VeranstalterTypE.UNBEKANNT,
var veranstaltungsortName: String,
var veranstaltungsortAdresse: String,
var kontaktpersonName: String?,
@@ -0,0 +1,55 @@
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable
/**
* Repräsentiert eine spezifische Lizenz oder Qualifikation, die einer Person (`DomPerson`)
* zugeordnet ist.
*
* Diese Entität verknüpft eine Person mit einer globalen Lizenzdefinition (`LizenzTypGlobal`)
* und speichert zusätzliche Informationen wie die Gültigkeit.
* Die Informationen stammen aus der Verarbeitung der Roh-Lizenzfelder
* (insb. `lizenzinfoRawOepsRoh`) aus `Person_ZNS_Staging`.
*
* @property lizenzId Eindeutiger interner Identifikator für diese zugeordnete Lizenz (UUID).
* @property personId Fremdschlüssel zur `DomPerson`, der diese Lizenz besitzt.
* @property lizenzTypGlobalId Fremdschlüssel zum `LizenzTypGlobal`, der die Art dieser Lizenz definiert.
* @property gueltigBisJahr Das Jahr, bis zu dem diese Lizenz (basierend auf der letzten Zahlung im ZNS) gültig ist.
* @property ausgestelltAm Optionales Datum, an dem diese spezifische Lizenz für die Person ausgestellt wurde (nicht immer aus ZNS ersichtlich).
* @property istAktivBezahltOeps Gibt an, ob diese Lizenz als "aktiv/bezahlt" aus den OEPS-Daten (primär LIZENZINFO) hervorgeht.
* @property notiz Interne Anmerkungen zu dieser spezifischen Lizenzzuordnung.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class DomLizenz(
@Serializable(with = UuidSerializer::class)
val lizenzId: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
val personId: Uuid, // FK zu DomPerson.personId
@Serializable(with = UuidSerializer::class)
val lizenzTypGlobalId: Uuid, // FK zu LizenzTypGlobal.lizenzTypGlobalId
var gueltigBisJahr: Int?, // Aus Person_ZNS_Staging.jahrLetzteZahlungLizenzOepsRoh
@Serializable(with = KotlinLocalDateSerializer::class)
var ausgestelltAm: LocalDate? = null, // Nicht direkt in LIZENZ01.dat, ggf. manuell oder andere Quelle
var istAktivBezahltOeps: Boolean = false, // Wird gesetzt, wenn die Lizenz aus LIZENZINFO stammt
// oder als Hauptlizenz aktiv ist.
var notiz: String? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -23,7 +23,7 @@ import kotlinx.serialization.Serializable
* @property vorname Vorname der Person.
* @property titel Akademischer Titel oder Anrede (z.B. Dr., Ing.).
* @property geburtsdatum Geburtsdatum der Person.
* @property geschlecht Geschlecht der Person.
* @property geschlechtE Geschlecht der Person.
* @property nationalitaetLandId Fremdschlüssel zur `LandDefinition` für die Nationalität.
* @property feiId Optionale FEI-Identifikationsnummer der Person.
* @property telefon Private oder geschäftliche Telefonnummer.
@@ -59,7 +59,7 @@ data class DomPerson(
@Serializable(with = KotlinLocalDateSerializer::class)
var geburtsdatum: LocalDate? = null, // Konvertiert aus Person_ZNS_Staging.geburtsdatumTextRoh
var geschlecht: GeschlechtE? = null, // Konvertiert aus Person_ZNS_Staging.geschlechtCodeRoh
var geschlechtE: GeschlechtE? = null, // Konvertiert aus Person_ZNS_Staging.geschlechtCodeRoh
@Serializable(with = UuidSerializer::class)
var nationalitaetLandId: Uuid? = null, // Aufgelöst aus Person_ZNS_Staging.nationalitaetCodeRoh via LandDefinition
@@ -0,0 +1,56 @@
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable
/**
* Repräsentiert eine spezifische Funktionärsqualifikation, die einer Person (`DomPerson`)
* zugeordnet ist.
*
* Diese Entität verknüpft eine Person mit einer globalen Qualifikationsdefinition (`QualifikationsTyp`)
* und kann zusätzliche Informationen wie eine spezifische Bemerkung oder Gültigkeit speichern.
* Die Informationen stammen primär aus der Verarbeitung der Roh-Qualifikationskürzel
* aus `Person_ZNS_Staging.qualifikationenRawOepsRoh` (welches aus `RICHT01.dat` befüllt wird).
*
* @property qualifikationId Eindeutiger interner Identifikator für diese zugeordnete Qualifikation (UUID).
* @property personId Fremdschlüssel zur `DomPerson`, die diese Qualifikation besitzt.
* @property qualTypId Fremdschlüssel zum `QualifikationsTyp`, der die Art dieser Qualifikation definiert.
* @property bemerkung Optionale Bemerkungen zu dieser spezifischen Qualifikation der Person
* (z.B. spezifische Einsatzbereiche, Einschränkungen).
* @property gueltigVon Optionales Datum, ab wann diese Qualifikation für die Person gültig ist.
* @property gueltigBis Optionales Datum, bis wann diese Qualifikation für die Person gültig ist.
* @property istAktiv Gibt an, ob diese Qualifikation für die Person aktuell als aktiv betrachtet wird.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class DomQualifikation(
@Serializable(with = UuidSerializer::class)
val qualifikationId: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
val personId: Uuid, // FK zu DomPerson.personId
@Serializable(with = UuidSerializer::class)
val qualTypId: Uuid, // FK zu QualifikationsTyp.qualTypId
var bemerkung: String? = null,
@Serializable(with = KotlinLocalDateSerializer::class)
var gueltigVon: LocalDate? = null, // Nicht direkt in RICHT01.dat, aber evtl. für manuelle Pflege
@Serializable(with = KotlinLocalDateSerializer::class)
var gueltigBis: LocalDate? = null, // Nicht direkt in RICHT01.dat
var istAktiv: Boolean = true, // Standardmäßig aktiv, wenn importiert
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -1,4 +1,4 @@
package at.mocode.shared.model.domaene.verein
package at.mocode.shared.model.domaene
import at.mocode.shared.enums.DatenQuelleE
import at.mocode.shared.serializers.KotlinInstantSerializer
@@ -0,0 +1,48 @@
import at.mocode.shared.enums.PlatzTypE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Repräsentiert einen physischen Platz auf einer Reitanlage, der für verschiedene Zwecke
* im Rahmen einer Pferdesportveranstaltung genutzt werden kann.
*
* @property platzId Eindeutiger interner Identifikator für diesen Platz (UUID).
* @property name Der Name oder die Bezeichnung des Platzes.
* @property typ Die Art des Platzes (z.B. AUSTRAGUNG, VORBEREITUNG).
* @property laengeMeter Optionale Angabe der Länge des Platzes in Metern.
* @property breiteMeter Optionale Angabe der Breite des Platzes in Metern.
* @property bodenbelag Beschreibung des Bodenbelags.
* @property ueberdacht Gibt an, ob der Platz überdacht ist.
* @property beleuchtungVorhanden Gibt an, ob eine Beleuchtung für den Platz vorhanden ist.
* @property istAktiv Gibt an, ob dieser Platz aktuell verfügbar und nutzbar ist.
* @property notizen Interne Notizen oder zusätzliche Informationen zum Platz.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class Platz(
@Serializable(with = UuidSerializer::class)
val platzId: Uuid = uuid4(),
var name: String,
var typ: PlatzTypE,
var laengeMeter: Double? = null,
var breiteMeter: Double? = null,
var bodenbelag: String? = null,
var ueberdacht: Boolean? = null,
var beleuchtungVorhanden: Boolean? = null,
var istAktiv: Boolean = true,
var notizen: String? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -0,0 +1,130 @@
import at.mocode.shared.enums.BeginnzeitTypE
import at.mocode.shared.enums.PlatzTypE
import at.mocode.shared.model.DotierungsAbstufung
import at.mocode.shared.serializers.BigDecimalSerializer
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.serializers.KotlinLocalTimeSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalTime
import kotlinx.serialization.Serializable
/**
* Repräsentiert eine spezifische Abteilung innerhalb einer Prüfung (`Pruefung_OEPS`).
* Eine Prüfung kann in eine oder mehrere Abteilungen unterteilt sein, basierend auf
* Kriterien wie Lizenzstufen, Altersklassen, Pferdeeigenschaften etc.
* Nennungen, Startlisten und Ergebnislisten beziehen sich primär auf diese Abteilungen.
*
* @property pruefungAbteilungDbId Eindeutiger interner Identifikator für diese Abteilung (UUID).
* @property pruefungDbId Fremdschlüssel zur übergeordneten `Pruefung_OEPS`.
* @property abteilungsKennzeichen Ein Kennzeichen für diese Abteilung innerhalb der Prüfung (z.B. "1", "A", "R1").
* Wird oft zur Erstellung der vollständigen Bewerbsnummer verwendet (z.B. "12/1").
* @property bezeichnungOeffentlich Die offizielle Bezeichnung dieser Abteilung, wie sie auf Listen erscheinen soll
* (z.B. "R1 Reiter", "Lizenzfrei", "Junioren"). Falls leer, kann sie aus der
* Bezeichnung der Hauptprüfung und dem Kennzeichen abgeleitet werden.
* @property bezeichnungIntern Interne Bezeichnung oder Notiz zur Abteilung.
* @property teilKritMinLizenzStammdatumId Optionaler FK zu `Sportfachliche_Stammdaten` (Typ LIZENZTYP_OEPS_STUFE),
* der die Mindestlizenz für diese Abteilung definiert.
* @property teilKritMaxLizenzStammdatumId Optionaler FK für die Maximallizenz.
* @property teilKritErlaubteLizenzenStammdatenIds Liste von FKs zu `Sportfachliche_Stammdaten` (Typ LIZENZTYP_OEPS),
* die die exakt erlaubten Lizenzen definieren.
* @property teilKritMinPferdealter Mindestalter der Pferde für diese Abteilung.
* @property teilKritMaxPferdealter Maximalalter der Pferde für diese Abteilung.
* @property teilKritAltersklasseReiterStammdatumId FK zu `Sportfachliche_Stammdaten` (Typ ALTERSCLASSEN_DEFINITION),
* der die Altersklasse der Reiter definiert.
* @property teilKritPferderasseStammdatumId FK zu `Sportfachliche_Stammdaten` (Typ PFERDERASSE),
* der die erlaubte Pferderasse definiert.
* @property teilKritAnzahlStarterMin Optionale Mindestanzahl an Startern für diese Abteilung.
* @property teilKritAnzahlStarterMax Optionale Maximalanzahl an Startern für diese Abteilung.
* @property teilKritFreiTextBeschreibung Freitextliche Beschreibung weiterer oder spezieller Teilungskriterien.
* @property startgeld Überschreibt ggf. das Standard-Startgeld der `Pruefung_OEPS` für diese Abteilung.
* @property dotierungen Spezifische Dotierungsabstufungen für diese Abteilung.
* @property platzId Optionaler Fremdschlüssel zum `Platz`, falls diese Abteilung auf einem anderen Platz
* als dem Standardplatz der `Pruefung_OEPS` stattfindet.
* @property datum Optionales spezifisches Datum für diese Abteilung.
* @property beginnzeitTyp Typ der geplanten Beginnzeit für diese Abteilung.
* @property beginnzeitFix Fixe Beginnzeit, falls Typ FIX_UM.
* @property beginnNachAbteilungOderPruefungId Fremdschlüssel zu einer anderen `Pruefung_Abteilung` oder `Pruefung_OEPS`,
* nach der diese Abteilung starten soll.
* @property beginnzeitCa Ungefähre Beginnzeit, falls Typ CA_UM.
* @property dauerProStartGeschaetztSek Geschätzte Dauer pro Starter in Sekunden für diese Abteilung.
* Überschreibt ggf. Werte aus `Pruefung_OEPS` oder den spartspezifischen Details.
* @property umbauzeitNachAbteilungMin Umbauzeit in Minuten nach dieser Abteilung.
* @property besichtigungszeitVorAbteilungMin Besichtigungszeit in Minuten vor dieser Abteilung.
* @property stechzeitZusaetzlichMin Zusatzzeit für ein eventuelles Stechen in Minuten für diese Abteilung.
* @property istAktivFuerNennung Gibt an, ob für diese Abteilung Nennungen entgegengenommen werden können.
* @property istStartlisteFinal Gibt an, ob die Startliste für diese Abteilung finalisiert wurde.
* @property istErgebnislisteFinal Gibt an, ob die Ergebnisliste für diese Abteilung finalisiert wurde.
* @property anzahlNennungen Informativ: Aktuelle Anzahl der Nennungen für diese Abteilung.
* @property anzahlStarterEffektiv Informativ: Tatsächliche Anzahl der Starter.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class Pruefung_Abteilung(
@Serializable(with = UuidSerializer::class)
val pruefungAbteilungDbId: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
val pruefungDbId: Uuid, // FK zu Pruefung_OEPS.pruefungDbId
var abteilungsKennzeichen: String, // z.B. "1", "A", "R1"
var bezeichnungOeffentlich: String? = null,
var bezeichnungIntern: String? = null,
// Strukturierte Teilungskriterien (Verweise auf Sportfachliche_Stammdaten)
@Serializable(with = UuidSerializer::class)
var teilKritMinLizenzStammdatumId: Uuid? = null, // Typ LIZENZTYP_OEPS_STUFE
@Serializable(with = UuidSerializer::class)
var teilKritMaxLizenzStammdatumId: Uuid? = null, // Typ LIZENZTYP_OEPS_STUFE
var teilKritErlaubteLizenzenStammdatenIds: List<@Serializable(with = UuidSerializer::class) Uuid>? = null, // Typ LIZENZTYP_OEPS
var teilKritMinPferdealter: Int? = null,
var teilKritMaxPferdealter: Int? = null,
@Serializable(with = UuidSerializer::class)
var teilKritAltersklasseReiterStammdatumId: Uuid? = null, // Typ ALTERSCLASSEN_DEFINITION
@Serializable(with = UuidSerializer::class)
var teilKritPferderasseStammdatumId: Uuid? = null, // Typ PFERDERASSE
var teilKritAnzahlStarterMin: Int? = null,
var teilKritAnzahlStarterMax: Int? = null,
var teilKritFreiTextBeschreibung: String? = null,
// Abteilungsspezifische Überschreibungen
@Serializable(with = BigDecimalSerializer::class)
var startgeld: BigDecimal? = null, // Überschreibt Pruefung_OEPS.startgeldStandard
var dotierungen: List<DotierungsAbstufung> = emptyList(), // Eigene Dotierung, erbt sonst von Pruefung_OEPS
// Zeitplanung (überschreibt ggf. Werte aus Pruefung_OEPS oder deren spartspez. Details)
@Serializable(with = UuidSerializer::class)
var platzId: Uuid?, // FK zu Platz.platzId
@Serializable(with = KotlinLocalDateSerializer::class)
var datum: LocalDate?,
var beginnzeitTyp: BeginnzeitTypE = BeginnzeitTypE.ANSCHLIESSEND,
@Serializable(with = KotlinLocalTimeSerializer::class)
var beginnzeitFix: LocalTime? = null,
@Serializable(with = UuidSerializer::class)
var beginnNachAbteilungOderPruefungId: Uuid?, // Kann ID einer anderen Pruefung_Abteilung oder Pruefung_OEPS sein
@Serializable(with = KotlinLocalTimeSerializer::class)
var beginnzeitCa: LocalTime? = null,
var dauerProStartGeschaetztSek: Int? = null,
var umbauzeitNachAbteilungMin: Int? = null,
var besichtigungszeitVorAbteilungMin: Int? = null,
var stechzeitZusaetzlichMin: Int? = null,
var istAktivFuerNennung: Boolean = true,
var istStartlisteFinal: Boolean = false,
var istErgebnislisteFinal: Boolean = false,
var anzahlNennungen: Int = 0, // Wird dynamisch befüllt oder periodisch aktualisiert
var anzahlStarterEffektiv: Int = 0, // Wird dynamisch befüllt
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -0,0 +1,92 @@
import at.mocode.shared.enums.BeginnzeitTypE
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.*
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalTime
import kotlinx.serialization.Serializable
/**
* Repräsentiert die Basis-Informationen eines Bewerbs (einer Prüfung) innerhalb eines Turniers.
* Diese Entität enthält spartenübergreifende Attribute. Spartenspezifische Details
* werden in separaten, verknüpften Entitäten gespeichert (z.B. `DressurPruefungSpezifika`).
*
* @property pruefungDbId Eindeutiger interner Identifikator für diese Prüfung/diesen Bewerb (UUID).
* @property turnierOepsId Fremdschlüssel zum übergeordneten `Turnier_OEPS`.
* @property oepsBewerbNrAnzeige Die offizielle Nummer des Bewerbs gemäß Ausschreibung (z.B. 1, 12).
* @property nameTextUebergeordnet Die Hauptbezeichnung des Bewerbs/der Prüfung
* (z.B. "Dressurprüfung", "Standardspringprüfung").
* @property sparte Die Pferdesportsparte dieses Bewerbs (DRESSUR, SPRINGEN, etc.).
* Wird beim Anlegen gesetzt, ggf. vorgeschlagen aus der gewählten ÖTO-Kategorie.
* @property oepsKategorieStammdatumId Fremdschlüssel zu `Sportfachliche_Stammdaten` (Typ BEWERBSKATEGORIE_OETO),
* die die spezifische ÖTO-Kategorie dieses Bewerbs definiert (z.B. "CDN-C Neu").
* @property istDotiert Gibt an, ob dieser Bewerb grundsätzlich mit Geldpreisen dotiert ist.
* Details zur Dotierung können in der Abteilung oder spartspezifisch festgelegt werden.
* @property startgeldStandard Ein Standard-Startgeld für diesen Bewerb. Kann von der Abteilung oder
* spartspezifischen Regeln überschrieben werden.
* @property oepsBewerbsartCodeZns Optionaler OEPS-Code für die Art des Bewerbs, relevant für den ZNS-Export.
* @property notizenIntern Interne Notizen oder Kommentare zu diesem Bewerb.
* @property istAbgesagt Gibt an, ob der Bewerb abgesagt wurde.
* @property erfordertAbteilungsAuswahlFuerNennung Gibt an, ob für Nennungen zu diesem Bewerb
* zwingend eine spezifische Abteilung ausgewählt werden muss (true), oder ob Nennungen direkt
* zum Bewerb (implizit zur Default-Abteilung) erfolgen können (false).
* @property standardPlatzId Optionaler Default-Austragungsort (FK zu `Platz`) für diesen Bewerb.
* Kann von der Abteilung überschrieben werden.
* @property standardDatum Optionales Default-Datum für diesen Bewerb. Kann von der Abteilung überschrieben werden.
* @property standardBeginnzeitTyp Default-Typ für die geplante Beginnzeit.
* @property standardBeginnzeitFix Default-fixe Beginnzeit, falls Typ FIX_UM.
* @property standardBeginnNachPruefungId Default-Verweis auf eine andere Pruefung_OEPS (deren letzte Abteilung),
* falls Typ ANSCHLIESSEND oder NACH_VORHERIGEM_BEWERB_ABTEILUNG.
* @property standardBeginnzeitCa Default-ungefähre Beginnzeit, falls Typ CA_UM.
* @property anzahlAbteilungen Die Anzahl der für diesen Bewerb definierten Abteilungen (informativ).
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class Pruefung_OEPS( // Unsere BewerbBasis
@Serializable(with = UuidSerializer::class)
val pruefungDbId: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
val turnierOepsId: Uuid, // Umbenannt von turnier_db_id für Konsistenz
var oepsBewerbNrAnzeige: Int, // Deine nummerInAusschreibung
var nameTextUebergeordnet: String,
var sparte: SparteE, // Explizit, kann aus oepsKategorieStammdatumId vorgeschlagen werden
@Serializable(with = UuidSerializer::class)
var oepsKategorieStammdatumId: Uuid, // FK zu Sportfachliche_Stammdaten (Typ BEWERBSKATEGORIE_OETO)
var istDotiert: Boolean = false,
@Serializable(with = BigDecimalSerializer::class)
var startgeldStandard: BigDecimal? = null,
var oepsBewerbsartCodeZns: String? = null,
var notizenIntern: String? = null,
var istAbgesagt: Boolean = false,
var erfordertAbteilungsAuswahlFuerNennung: Boolean = true, // Default: Nennung nur für spezifische Abteilung
// Standard-Zeitplanungswerte (können von Abteilung oder spartspez. Details überschrieben werden)
@Serializable(with = UuidSerializer::class)
var standardPlatzId: Uuid? = null,
@Serializable(with = KotlinLocalDateSerializer::class)
var standardDatum: LocalDate? = null,
var standardBeginnzeitTyp: BeginnzeitTypE = BeginnzeitTypE.ANSCHLIESSEND,
@Serializable(with = KotlinLocalTimeSerializer::class)
var standardBeginnzeitFix: LocalTime? = null,
@Serializable(with = UuidSerializer::class)
var standardBeginnNachPruefungId: Uuid? = null, // Verweis auf Pruefung_OEPS.pruefungDbId
@Serializable(with = KotlinLocalTimeSerializer::class)
var standardBeginnzeitCa: LocalTime? = null,
var anzahlAbteilungen: Int = 0, // Wird berechnet oder bei Erstellung der Abteilungen gesetzt
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -0,0 +1,125 @@
import at.mocode.shared.enums.EventStatusE
import at.mocode.shared.enums.NennungsArtE
import at.mocode.shared.enums.RegelwerkTypE
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.serializers.KotlinLocalDateTimeSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.serialization.Serializable
/**
* Repräsentiert ein spezifisches, vom zuständigen Verband (OEPS, FEI) genehmigtes Turnier
* innerhalb eines Veranstaltungsrahmens. Enthält alle turnierspezifischen Informationen
* gemäß Ausschreibung und die für den Turnierbericht relevanten Daten.
*
* @property turnierOepsId Eindeutiger interner Identifikator für dieses Turnier (UUID).
* @property veranstaltungsRahmenId Fremdschlüssel zum übergeordneten `VeranstaltungsRahmen`.
* @property oepsTurnierNr Die offizielle OEPS-Turniernummer (z.B. "25319"). Sollte eindeutig sein.
* @property titel Der offizielle Titel des Turniers laut Ausschreibung
* (z.B. "CSN-C NEU CSNP-C NEU NEUMARKT/M., OÖ").
* @property untertitel Optionaler Untertitel oder Zusatzbezeichnung für das Turnier.
* @property hauptsparte Die primäre Pferdesportsparte dieses Turniers (z.B. SPRINGEN, DRESSUR).
* Auch wenn Bewerbe anderer Sparten stattfinden können, gibt es meist eine Hauptausrichtung.
* @property oetoKategorieStammdatenIds Liste von Fremdschlüsseln zu `Sportfachliche_Stammdaten` (Typ BEWERBSKATEGORIE_OETO),
* die die offiziellen ÖTO-Kategorien dieses Turniers definieren (z.B. ["CDN-C Neu", "CDNP-C Neu"]).
* @property regelwerkTyp Das primär für dieses Turnier geltende Regelwerk (ÖTO, FEI).
* @property datumVon Spezifisches Startdatum dieses Turniers.
* @property datumBis Spezifisches Enddatum dieses Turniers.
* @property nennschlussNenndatei Zeitlicher Nennschluss für die vom OEPS bereitgestellte Nenndatei (n2).
* @property nennschlussOffiziell Offizieller Nennschluss laut Ausschreibung.
* @property nennungsArtBevorzugt Die bevorzugte Art der Nennung für dieses Turnier (z.B. Online-Portal, ZNS).
* @property nennungsHinweisText Wichtige Hinweise zur Nennung direkt aus der Ausschreibung.
* @property pdfAusschreibungUrl URL oder Pfad zur offiziellen PDF-Ausschreibung.
* @property kommentarIntern Interne Notizen oder Kommentare zum Turnier für die Meldestelle.
* @property typNationalInternational Kennzeichnung, ob es sich um ein nationales oder internationales Turnier handelt.
* @property spracheDefault Hauptsprache für Dokumente und Kommunikation dieses Turniers.
* @property startnummernVerwenden Gibt an, ob Startnummern (zusätzlich zu Kopfnummern) verwendet werden.
* @property nennungUeberZnsMoeglichOeps Info, ob dieses Turnier über das OEPS eZNS nennbar ist/war.
* @property erhebeNachnennungsgebuehr Gibt an, ob eine Nachnenngebühr erhoben wird.
* @property erhebeNennungstauschgebuehr Gibt an, ob eine Gebühr für Pferd-/Reitertausch erhoben wird.
* @property logoTurnierUrl URL oder Pfad zu einem spezifischen Logo für dieses Turnier.
* @property turnierleiterDomPersonId Fremdschlüssel zur `DomPerson` des Turnierleiters.
* @property turnierbeauftragterDomPersonId Fremdschlüssel zur `DomPerson` des Turnierbeauftragten (TBA).
* @property meldestelleTelefon Telefonnummer der Meldestelle für dieses Turnier.
* @property meldestelleOeffnungszeiten Öffnungszeiten der Meldestelle.
* @property startUndErgebnislistenUrl URL, unter der Start- und Ergebnislisten veröffentlicht werden.
* @property istBoxenMoeglich Gibt an, ob eine Einstallung/Boxenreservierung möglich ist.
* @property anmerkungBoxen Details zu den Boxen (Anzahl, Preis, Reservierung etc.).
* @property defaultDauerProStarterSek Standarddauer pro Starter in Sekunden (kann von Bewerb/Abteilung überschrieben werden).
* @property defaultUmbauzeitMin Standard-Umbauzeit zwischen Bewerben in Minuten.
* @property defaultBesichtigungszeitMin Standard-Besichtigungszeit (z.B. Parcours) in Minuten.
* @property defaultStechzeitMin Standard-Zusatzzeit für ein Stechen in Minuten.
* @property statusTurnier Aktueller Status des Turniers (analog zu EventStatusE, aber für das Turnier).
* @property berichtAnmerkungDopingkontrollen Textfeld für den Turnierbericht.
* @property berichtDopingboxVorhanden Boolean für den Turnierbericht.
* @property berichtPferdepasskontrollenBeiBewerb Textfeld für den Turnierbericht.
* @property berichtPferdepasskontrollenBeanstandungen Textfeld für den Turnierbericht.
* @property berichtAnmerkungMeldestelleFunktion Textfeld für den Turnierbericht.
* @property berichtAnmerkungZeitnehmungFunktion Textfeld für den Turnierbericht.
* @property berichtAnzeigetafelInfo Textfeld für den Turnierbericht.
* @property berichtZuschauertribueneInfo Textfeld für den Turnierbericht.
* @property berichtStallungenInfo Textfeld für den Turnierbericht.
* @property berichtAblaufBesonderheitenUnfaelleProteste Textfeld für den Turnierbericht.
* @property berichtBesondereVorkommnisse Textfeld für den Turnierbericht.
* @property berichtVerbesserungsvorschlaege Textfeld für den Turnierbericht.
* @property berichtGesamteindruck Textfeld für den Turnierbericht.
* @property berichtNennlisteMitSperrlisteGeprueft Boolean für den Turnierbericht.
* @property berichtNennlisteBeanstandungen Textfeld für den Turnierbericht.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class Turnier_OEPS( // Behält deinen Namen bei
@Serializable(with = UuidSerializer::class)
val turnierOepsId: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
val veranstaltungsRahmenId: Uuid,
var oepsTurnierNr: String,
var titel: String,
var untertitel: String? = null,
var hauptsparte: SparteE,
// Hier verwenden wir direkt List<Uuid>. Der Serializer für Uuid selbst (@Serializable(with = UuidSerializer::class) an der Uuid-Klasse)
// sollte es kotlinx.serialization ermöglichen, auch Listen davon zu behandeln.
var oetoKategorieStammdatenIds: List<@Serializable(with = UuidSerializer::class) Uuid>,
var regelwerkTyp: RegelwerkTypE = RegelwerkTypE.OETO,
@Serializable(with = KotlinLocalDateSerializer::class)
var datumVon: LocalDate,
@Serializable(with = KotlinLocalDateSerializer::class)
var datumBis: LocalDate,
@Serializable(with = KotlinLocalDateTimeSerializer::class)
var nennschlussOffiziell: LocalDateTime? = null, // Nur der offizielle Nennschluss lt. Ausschreibung
var pdfAusschreibungUrl: String? = null,
var kommentarIntern: String? = null,
var typNationalInternational: String = "National",
var spracheDefault: String = "Deutsch",
var logoTurnierUrl: String? = null,
@Serializable(with = UuidSerializer::class)
var turnierleiterDomPersonId: Uuid? = null,
@Serializable(with = UuidSerializer::class)
var turnierbeauftragterDomPersonId: Uuid? = null,
var meldestelleTelefon: String? = null,
var meldestelleOeffnungszeiten: String? = null,
var startUndErgebnislistenUrl: String? = null, // Kann auch dynamisch generiert werden
var statusTurnier: EventStatusE = EventStatusE.IN_PLANUNG, // Wiederverwendung EventStatusE
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -0,0 +1,26 @@
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import kotlinx.serialization.Serializable
/**
* Verknüpft ein Turnier (`Turnier_OEPS`) mit einem genutzten Platz (`Platz`)
* und beschreibt den spezifischen Verwendungszweck dieses Platzes im Kontext des Turniers.
*
* @property turnierOepsId Fremdschlüssel zum `Turnier_OEPS`. Teil des zusammengesetzten Primärschlüssels.
* @property platzId Fremdschlüssel zum `Platz`. Teil des zusammengesetzten Primärschlüssels.
* @property verwendungszweck Beschreibung, wofür der Platz bei diesem Turnier genutzt wird.
* @property istHauptAustragungsplatz Optionales Flag, um den primären Austragungsplatz zu kennzeichnen.
* @property istHauptVorbereitungsplatz Optionales Flag, um den primären Vorbereitungsplatz zu kennzeichnen.
*/
@Serializable
data class Turnier_hat_Platz(
@Serializable(with = UuidSerializer::class)
val turnierOepsId: Uuid, // Teil des PK, FK zu Turnier_OEPS.turnierOepsId
@Serializable(with = UuidSerializer::class)
val platzId: Uuid, // Teil des PK, FK zu Platz.platzId
var verwendungszweck: String? = null,
var istHauptAustragungsplatz: Boolean? = false,
var istHauptVorbereitungsplatz: Boolean? = false
)
@@ -0,0 +1,82 @@
package at.mocode.shared.model.veranstaltung
import at.mocode.shared.enums.EventStatusE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable
/**
* Definiert den übergeordneten Rahmen einer Veranstaltung (z.B. ein Turnierwochenende),
* der ein oder mehrere spezifische OEPS-Turniere umfassen kann.
*
* @property veranstRahmenId Eindeutiger interner Identifikator für diesen Veranstaltungsrahmen (UUID).
* @property name Die offizielle oder werbewirksame Bezeichnung des Veranstaltungsrahmens
* (z.B. "Neumarkter Pferdesporttage 2025", "Pfingstturnier Sudenhof").
* @property eventTypIntern Optionale interne Klassifizierung des Events
* (z.B. "StandardWochenende", "Meisterschaftsevent", "Cupveranstaltung").
* @property ortName Name der Anlage oder des Hauptortes der Veranstaltung (z.B. "Reitanlage Stroblmair").
* @property ortStrasse Straße und Hausnummer des Veranstaltungsortes.
* @property ortPlz Postleitzahl des Veranstaltungsortes.
* @property ortOrt Ortschaft des Veranstaltungsortes.
* @property datumVonGesamt Startdatum des gesamten Veranstaltungsrahmens.
* @property datumBisGesamt Enddatum des gesamten Veranstaltungsrahmens.
* @property logoUrl Optionaler URL-Pfad zu einem Logo für den Veranstaltungsrahmen.
* @property webseiteUrl Optionale URL zur Webseite des Veranstaltungsrahmens oder des Veranstalters.
* @property hauptveranstalterDomVereinId Optionale Verknüpfung zum `DomVerein`,
* der als Hauptveranstalter dieses Rahmenevents auftritt.
* @property hauptKontaktpersonDomPersonId Optionale Verknüpfung zur `DomPerson`,
* die als Hauptansprechpartner für den gesamten Veranstaltungsrahmen dient.
* @property status Aktueller Status des Veranstaltungsrahmens (z.B. in Planung, genehmigt, aktiv).
* @property anmerkungenAllgemein Allgemeine Notizen oder Beschreibungen zum Veranstaltungsrahmen.
* @property berichtAnmerkungSanitaer Anmerkungen zu sanitären Anlagen für den Turnierbericht.
* @property berichtAnmerkungParkenEntladen Anmerkungen zu Park- und Entlademöglichkeiten.
* @property berichtAnmerkungSponsorenBetreuung Anmerkungen zur Sponsorenbetreuung.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class VeranstaltungsRahmen(
@Serializable(with = UuidSerializer::class)
val veranstRahmenId: Uuid = uuid4(),
var name: String,
var eventTypIntern: String? = null,
var ortName: String, // Kombiniert aus deinem ort_text oder spezifischer
var ortStrasse: String? = null,
var ortPlz: String? = null,
var ortOrt: String? = null, // Genauer Ort
@Serializable(with = KotlinLocalDateSerializer::class)
var datumVonGesamt: LocalDate,
@Serializable(with = KotlinLocalDateSerializer::class)
var datumBisGesamt: LocalDate,
var logoUrl: String? = null,
var webseiteUrl: String? = null,
@Serializable(with = UuidSerializer::class)
var hauptveranstalterDomVereinId: Uuid? = null, // FK zu DomVerein.vereinId
@Serializable(with = UuidSerializer::class)
var hauptKontaktpersonDomPersonId: Uuid? = null, // FK zu DomPerson.personId
var status: EventStatusE = EventStatusE.IN_PLANUNG,
var anmerkungenAllgemein: String? = null,
// Felder für übergreifende Turnierbericht-Aspekte
var berichtAnmerkungSanitaer: String? = null,
var berichtAnmerkungParkenEntladen: String? = null,
var berichtAnmerkungSponsorenBetreuung: String? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -0,0 +1,41 @@
import at.mocode.shared.enums.CupSerieTypE
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.BigDecimalSerializer
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Verknüpft eine Meisterschaft/Cup/Serie (`Meisterschaft_Cup_Serie`) mit einer spezifischen
* Prüfungsabteilung (`Pruefung_Abteilung`), die als Wertungsprüfung für diesen
* übergreifenden Wettbewerb zählt.
*
* @property mcsId Fremdschlüssel zur `Meisterschaft_Cup_Serie`. Teil des zusammengesetzten Primärschlüssels.
* @property pruefungAbteilungDbId Fremdschlüssel zur `Pruefung_Abteilung`. Teil des zusammengesetzten Primärschlüssels.
* @property faktorFuerWertung Ein optionaler Faktor, mit dem das Ergebnis dieser Wertungsprüfung
* in die Gesamtwertung des Cups/der Meisterschaft einfließt (Default ist 1.0).
* @property bemerkung Optionale Bemerkung zu dieser spezifischen Wertungsprüfung im Kontext des Cups
* (z.B. "1. Vorrunde", "Finale", "Qualifikation West").
* @property istPflichttermin Gibt an, ob die Teilnahme an dieser Wertungsprüfung für die Cup-Gesamtwertung verpflichtend ist.
* @property mindestErgebnisNotwendig Optionales Mindestergebnis, das in dieser Prüfung erzielt werden muss,
* um für den Cup gewertet zu werden oder sich für das Finale zu qualifizieren.
*/
@Serializable
data class MCS_Wertungspruefung(
@Serializable(with = UuidSerializer::class)
val mcsId: Uuid, // Teil des PK, FK zu Meisterschaft_Cup_Serie.mcsId
@Serializable(with = UuidSerializer::class)
val pruefungAbteilungDbId: Uuid, // Teil des PK, FK zu Pruefung_Abteilung.pruefungAbteilungDbId
@Serializable(with = BigDecimalSerializer::class)
var faktorFuerWertung: BigDecimal? = BigDecimal.fromInt(1), // Default 1.0
var bemerkung: String? = null,
var istPflichttermin: Boolean = false,
var mindestErgebnisNotwendig: String? = null // z.B. "Note 6.0", "Fehlerfrei" - muss interpretiert werden
)
@@ -0,0 +1,73 @@
import at.mocode.shared.enums.CupSerieTypE
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Definiert einen übergreifenden Wettbewerb wie eine Meisterschaft, einen Cup oder eine Turnierserie,
* der sich über mehrere Turniere oder spezifische Prüfungen/Abteilungen erstrecken kann und
* eigene Reglements sowie eine Gesamtwertung haben kann.
*
* @property mcsId Eindeutiger interner Identifikator für diese Meisterschaft/Cup/Serie (UUID).
* @property name Der offizielle Name der Meisterschaft, des Cups oder der Serie
* (z.B. "EQUIVERON Cup 2025", "NÖ Landesmeisterschaft Dressur Allgemeine Klasse").
* @property typ Die Art des übergreifenden Wettbewerbs (siehe `CupSerieTypE`).
* @property jahr Das Jahr, in dem diese Meisterschaft/Cup/Serie stattfindet oder gewertet wird.
* @property sparte Die Pferdesportsparte, für die dieser Wettbewerb primär ausgeschrieben ist.
* @property beschreibung Optionale ausführlichere Beschreibung des Wettbewerbs.
* @property reglementText Das spezifische Reglement als Text oder Markdown.
* @property reglementPdfUrl Optionaler Link zum offiziellen PDF-Reglement.
* @property hauptsponsor Optionaler Name des Hauptsponsors.
* @property gesamtdotationText Optionale Beschreibung der Gesamtdotation (z.B. "ca. EUR 8.000.- in Sachpreisen").
* @property teilnahmebedingungenText Spezifische Teilnahmebedingungen für diesen Wettbewerb.
* @property austragungsbedingungenText Spezifische Austragungsbedingungen (z.B. welche Prüfungen zählen).
* @property wertungsModusBeschreibung Beschreibung, wie die Gesamtwertung ermittelt wird.
* @property oetoRegelReferenzId Optionale Verknüpfung zu einer spezifischen Regel in der
* `OETORegelReferenz`-Tabelle, die diesen Wettbewerb oder seine Grundlagen definiert.
* @property istAktiv Gibt an, ob dieser Wettbewerb aktuell aktiv ist.
* @property ansprechpartnerDomPersonId Optionale Verknüpfung zur `DomPerson`, die für diesen Cup verantwortlich ist.
* @property logoUrl Optionaler URL zu einem Logo für den Cup/die Meisterschaft.
* @property webseiteUrl Optionale Webseite mit weiteren Informationen.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class Meisterschaft_Cup_Serie(
@Serializable(with = UuidSerializer::class)
val mcsId: Uuid = uuid4(),
var name: String,
var typ: CupSerieTypE,
var jahr: Int,
var sparte: SparteE,
var beschreibung: String? = null,
var reglementText: String? = null,
var reglementPdfUrl: String? = null,
var hauptsponsor: String? = null,
var gesamtdotationText: String? = null,
var teilnahmebedingungenText: String? = null,
var austragungsbedingungenText: String? = null,
var wertungsModusBeschreibung: String? = null,
@Serializable(with = UuidSerializer::class)
var oetoRegelReferenzId: Uuid? = null, // Dein oeto_regel_ref_id_mcs
var istAktiv: Boolean = true,
@Serializable(with = UuidSerializer::class)
var ansprechpartnerDomPersonId: Uuid? = null,
var logoUrl: String? = null,
var webseiteUrl: String? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -0,0 +1,69 @@
import at.mocode.shared.enums.PruefungsViereckE
import at.mocode.shared.enums.RichterPositionE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Speichert die spezifischen Details und Anforderungen für eine Dressurprüfung,
* die auf einer Basis-Prüfung (`Pruefung_OEPS`) aufbaut.
*
* @property pruefungDbId Eindeutiger Identifikator, der auch der Fremdschlüssel zur
* zugehörigen `Pruefung_OEPS` ist (1:1-Beziehung).
* @property aufgabeStammdatumId Fremdschlüssel zu `Sportfachliche_Stammdaten` (Typ DRESSURAUFGABE),
* die die zu reitende Dressuraufgabe definiert.
* @property klasseStammdatumId Optionaler Fremdschlüssel zu `Sportfachliche_Stammdaten` (Typ BEWERBSKLASSE),
* der die Leistungsklasse dieser Dressurprüfung definiert (z.B. "A", "L", "M").
* @property richtverfahrenStammdatumId Fremdschlüssel zu `Sportfachliche_Stammdaten`
* (Typ WERTUNGSVERFAHREN_DRESSUR), der das anzuwendende Richtverfahren (z.B. "GM", "GT") definiert.
* @property viereckGroesse Die vorgeschriebene Größe des Dressurvierecks für diese Prüfung.
* @property erlaubeAuswendigReiten Gibt an, ob das Reiten der Aufgabe auswendig erlaubt/vorgeschrieben ist.
* @property erlaubeVorlesen Gibt an, ob das Vorlesen der Aufgabe erlaubt ist.
* @property anzahlRichterGeplant Die geplante Anzahl der Richter für diese Prüfung.
* @property maxPunkteProRichterMöglich Maximale Punktzahl, die pro Richter erreicht werden kann (falls relevant und nicht in der Aufgabe definiert).
* @property geplanteRichterpositionen Liste der geplanten Richterpositionen für diese Prüfung (z.B. [C, M, H]).
* Die tatsächliche Zuweisung von Personen erfolgt über `FunktionaerEinsatzPlanung` oder `BewerbFunktionaerZuordnung`.
* @property standardDauerProStartSek Standarddauer pro Starter in Sekunden für diese Art von Dressurprüfung.
* Kann von der Abteilung überschrieben werden.
* @property pauseNachAnzahlReiter Optional: Nach wie vielen Reitern eine kurze Pause eingeplant werden soll.
* @property dauerPauseMin Optional: Dauer der Pause in Minuten.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class DressurPruefungSpezifika(
@Serializable(with = UuidSerializer::class)
val pruefungDbId: Uuid, // PK (identisch mit Pruefung_OEPS.pruefungDbId) und FK
@Serializable(with = UuidSerializer::class)
var aufgabeStammdatumId: Uuid, // FK zu Sportfachliche_Stammdaten (Typ DRESSURAUFGABE)
@Serializable(with = UuidSerializer::class)
var klasseStammdatumId: Uuid?, // FK zu Sportfachliche_Stammdaten (Typ BEWERBSKLASSE, Sparte Dressur)
@Serializable(with = UuidSerializer::class)
var richtverfahrenStammdatumId: Uuid, // FK zu Sportfachliche_Stammdaten (Typ WERTUNGSVERFAHREN_DRESSUR)
var viereckGroesse: PruefungsViereckE,
var erlaubeAuswendigReiten: Boolean = true,
var erlaubeVorlesen: Boolean = false,
var anzahlRichterGeplant: Int = 1,
var maxPunkteProRichterMöglich: Double? = null,
// Definiert, welche Richterpositionen für diese Prüfung besetzt werden sollen
var geplanteRichterPositionen: List<RichterPositionE> = listOf(RichterPositionE.C),
// Zeitplanung spezifisch (Default für Abteilungen dieses Dressurbewerbs)
var standardDauerProStartSek: Int = 240, // z.B. 4 Minuten
var pauseNachAnzahlReiter: Int? = null,
var dauerPauseMin: Int? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -0,0 +1,83 @@
import at.mocode.shared.enums.ArtDesStechensE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Speichert die spezifischen Details und Anforderungen für eine Springprüfung,
* die auf einer Basis-Prüfung (`Pruefung_OEPS`) aufbaut.
*
* @property pruefungDbId Eindeutiger Identifikator, der auch der Fremdschlüssel zur
* zugehörigen `Pruefung_OEPS` ist (1:1-Beziehung).
* @property klasseStammdatumId Optionaler Fremdschlüssel zu `Sportfachliche_Stammdaten` (Typ BEWERBSKLASSE),
* der die Leistungsklasse/Höhe dieser Springprüfung definiert (z.B. "105cm", "Klasse A").
* @property richtverfahrenStammdatumId Fremdschlüssel zu `Sportfachliche_Stammdaten`
* (Typ WERTUNGSVERFAHREN_SPRINGEN), der das anzuwendende Richtverfahren definiert (z.B. "A2", "C").
* @property parcoursskizzeUrl Optionaler URL oder Pfad zur Parcoursskizze.
* @property gpParcoursLaengeMeter Länge des Grundparcours in Metern.
* @property gpErlaubteZeitSekunden Erlaubte Zeit für den Grundparcours in Sekunden.
* @property gpHoechstZeitSekunden Höchstzeit für den Grundparcours in Sekunden.
* @property gpAnzahlHindernisse Anzahl der Hindernisse im Grundparcours.
* @property gpAnzahlSpruenge Anzahl der Sprünge im Grundparcours.
* @property hatIdealzeit Gibt an, ob es eine Idealzeit gibt (relevant für Stilspringprüfungen oder spezielle Verfahren).
* @property artDesStechens Die Art des Stechens, falls eines stattfindet (siehe `ArtDesStechensE`).
* @property stParcoursLaengeMeter Länge des Stechparcours in Metern.
* @property stErlaubteZeitSekunden Erlaubte Zeit für das Stechen in Sekunden.
* @property stHoechstZeitSekunden Höchstzeit für das Stechen in Sekunden.
* @property stAnzahlHindernisse Anzahl der Hindernisse im Stechen.
* @property stAnzahlSpruenge Anzahl der Sprünge im Stechen.
* @property standardDauerProStartSek Standarddauer pro Starter in Sekunden für diese Art von Springprüfung.
* @property standardUmbauzeitMin Standard-Umbauzeit nach diesem Bewerb in Minuten (Default für Abteilungen).
* @property standardBesichtigungszeitMin Standard-Besichtigungszeit vor diesem Bewerb in Minuten (Default für Abteilungen).
* @property standardStechzeitZusaetzlichMin Standard-Zusatzzeit für ein eventuelles Stechen in Minuten (Default für Abteilungen).
* @property zeitMessSystemIntegrationInformation Information zur geplanten oder verwendeten Zeitmessanlage (z.B. "Microgate REI2", "Alge Timing").
* @propertycreatedAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class SpringPruefungSpezifika(
@Serializable(with = UuidSerializer::class)
val pruefungDbId: Uuid, // PK (identisch mit Pruefung_OEPS.pruefungDbId) und FK
@Serializable(with = UuidSerializer::class)
var klasseStammdatumId: Uuid?, // FK zu Sportfachliche_Stammdaten (Typ BEWERBSKLASSE, Sparte Springen)
@Serializable(with = UuidSerializer::class)
var richtverfahrenStammdatumId: Uuid, // FK zu Sportfachliche_Stammdaten (Typ WERTUNGSVERFAHREN_SPRINGEN)
var parcoursskizzeUrl: String? = null,
// Grundparcours Details
var gpParcoursLaengeMeter: Int? = null,
var gpErlaubteZeitSekunden: Int? = null,
var gpHoechstZeitSekunden: Int? = null,
var gpAnzahlHindernisse: Int? = null,
var gpAnzahlSpruenge: Int? = null,
var hatIdealzeit: Boolean = false,
// Stechen Details (optional, je nach Richtverfahren und artDesStechens)
var artDesStechens: ArtDesStechensE? = null,
var stParcoursLaengeMeter: Int? = null,
var stErlaubteZeitSekunden: Int? = null,
var stHoechstZeitSekunden: Int? = null,
var stAnzahlHindernisse: Int? = null,
var stAnzahlSpruenge: Int? = null,
// Zeitplanung spezifisch (Default für Abteilungen dieses Springbewerbs)
var standardDauerProStartSek: Int = 90, // z.B. 1.5 Minuten
var standardUmbauzeitMin: Int = 10,
var standardBesichtigungszeitMin: Int = 10,
var standardStechzeitZusaetzlichMin: Int? = null, // Nur relevant, wenn Stechen stattfindet
var zeitMessSystemIntegrationInformation: String? = null, // Freitext für Info zur Zeitmessung
// var zugewieseneFunktionaere: List<BewerbFunktionaerZuordnung> = emptyList(), // Kommt noch
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -1,7 +1,7 @@
package at.mocode.shared.stammdaten
import at.mocode.shared.enums.FunktionaerRolle
import at.mocode.shared.enums.Geschlecht
import at.mocode.shared.enums.GeschlechtE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.serializers.UuidSerializer
@@ -22,7 +22,7 @@ data class Person(
var titel: String?,
@Serializable(with = KotlinLocalDateSerializer::class)
var geburtsdatum: LocalDate?,
var geschlecht: Geschlecht? = Geschlecht.UNBEKANNT,
var geschlechtE: GeschlechtE?,
var nationalitaet: String?, // 3-Letter Code
var email: String?,
var telefon: String?,