impl Pruefungsaufgaben

This commit is contained in:
stefan 2025-05-13 14:01:52 +02:00
parent d1f5d07fab
commit 468b45aa56
28 changed files with 252 additions and 91 deletions

View File

@ -0,0 +1,131 @@
@startuml
' Allgemeines Layout
skinparam linetype ortho
hide empty members
' Entitäten
entity "Event" as Event {
+ id: UUID (PK)
--
bezeichnung: String
datumVon: LocalDate
datumBis: LocalDate
ortName: String
veranstalterVereinId: UUID (FK)
}
entity "Turnier" as Turnier {
+ id: UUID (PK)
--
eventId: UUID (FK)
oepsTurnierNr: String
titel: String
sparte: SparteEnum
oetoKategorien: List<String>
nennschluss: LocalDateTime
}
entity "Bewerb" as Bewerb {
+ id: UUID (PK)
--
turnierId: UUID (FK)
nummer: String
bezeichnung: String
klasseText: String
richtverfahren: String
startgeld: BigDecimal
}
entity "Abteilung" as Abteilung {
+ id: UUID (PK)
--
bewerbId: UUID (FK)
abteilungsKennzeichen: String
bezeichnung: String
}
entity "Person" as Person {
+ id: UUID (PK)
--
oepsSatzNr: String
nachname: String
vorname: String
stammVereinId: UUID (FK)
datenQuelle: PersonDatenQuelleEnum
}
entity "Pferd" as Pferd {
+ id: UUID (PK)
--
oepsKopfNr: String
name: String
geburtsjahr: Int
besitzerPersonId: UUID (FK)
datenQuelle: PferdDatenQuelleEnum
}
entity "Verein" as Verein {
+ id: UUID (PK)
--
oepsVereinsNr: String
name: String
}
entity "Lizenz" as Lizenz {
+ id: UUID (PK)
--
personId: UUID (FK)
lizenzTypOepsCode: String
gueltigBisJahr: Int
}
entity "Nennung" as Nennung {
+ id: UUID (PK)
--
turnierId: UUID (FK)
bewerbId: UUID (FK)
abteilungId: UUID (FK) ?
personId: UUID (FK)
pferdId: UUID (FK)
status: NennungsStatusEnum
}
entity "Startfolge" as Startfolge {
+ id: UUID (PK)
--
nennungId: UUID (FK)
startNummer: Int
startZeitGeplant: LocalDateTime
}
entity "Ergebnis" as Ergebnis {
+ id: UUID (PK)
--
startfolgeId: UUID (FK)
platzierung: Int
wertnote: Double
fehler: Double
zeitSekunden: Double
}
' Beziehungen
Event "1" -- "0..*" Turnier : beinhaltet
Turnier "1" -- "0..*" Bewerb : hat
Bewerb "1" -- "0..*" Abteilung : wird geteilt in
Turnier "1" -- "0..*" Nennung : hat
Bewerb "1" -- "0..*" Nennung : ist Ziel von
Abteilung "1" -- "0..*" Nennung : ist Ziel von (optional)
Person "1" -- "0..*" Nennung : nennt als Reiter
Pferd "1" -- "0..*" Nennung : wird genannt mit
Nennung "1" -- "0..1" Startfolge : führt zu
Startfolge "1" -- "0..1" Ergebnis : erzielt
Person "1" -- "0..*" Lizenz : besitzt
Verein "1" -- "0..*" Person : hat als Mitglied (Stammverein)
Verein "1" -- "0..*" Event : veranstaltet
Person "1" -- "0..*" Pferd : besitzt (als Besitzer)
Person "1" -- "0..*" Pferd : ist verantwortlich für (als Verantwortlicher)
' TODO: Weitere Entitäten und Beziehungen hinzufügen (Platz, Artikel, FunktionaerZuordnung etc.)
' TODO: Attribute detaillierter ausarbeiten
@enduml

View File

@ -1,35 +1,25 @@
package at.mocode.server package at.mocode.server
import at.mocode.server.plugins.configureDatabase import at.mocode.server.plugins.configureDatabase
import io.ktor.http.HttpHeaders import io.ktor.http.*
import io.ktor.http.HttpMethod import io.ktor.serialization.kotlinx.json.*
import io.ktor.http.HttpStatusCode
import io.ktor.serialization.kotlinx.json.json
import io.ktor.server.application.* import io.ktor.server.application.*
import io.ktor.server.netty.* import io.ktor.server.netty.*
import io.ktor.server.plugins.calllogging.CallLogging import io.ktor.server.plugins.calllogging.*
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.server.plugins.cors.routing.CORS import io.ktor.server.plugins.cors.routing.*
import io.ktor.server.plugins.defaultheaders.DefaultHeaders import io.ktor.server.plugins.defaultheaders.*
import io.ktor.server.plugins.statuspages.StatusPages import io.ktor.server.plugins.statuspages.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.slf4j.event.Level import org.slf4j.event.Level
/**
* Main entry point for the application.
* Uses Ktor's EngineMain to start the server with configuration from application.yaml
*/
fun main(args: Array<String>) { fun main(args: Array<String>) {
EngineMain.main(args) EngineMain.main(args)
} }
/**
* Application module configuration.
* This is where all server plugins and routes are configured.
*/
fun Application.module() { fun Application.module() {
val log = LoggerFactory.getLogger("Application") val log = LoggerFactory.getLogger("Application")
@ -47,9 +37,6 @@ fun Application.module() {
log.info("Application initialized successfully") log.info("Application initialized successfully")
} }
/**
* Configures all Ktor plugins for the application
*/
private fun Application.configurePlugins() { private fun Application.configurePlugins() {
val log = LoggerFactory.getLogger("ApplicationPlugins") val log = LoggerFactory.getLogger("ApplicationPlugins")
// Add default headers to all responses // Add default headers to all responses

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.serializers.KotlinInstantSerializer import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import kotlinx.datetime.Clock import kotlinx.datetime.Clock
import kotlinx.datetime.Instant import kotlinx.datetime.Instant

View File

@ -1,8 +1,8 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.serializers.BigDecimalSerializer import at.mocode.shared.serializers.BigDecimalSerializer
import at.mocode.shared.model.serializers.KotlinInstantSerializer import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.ionspin.kotlin.bignum.decimal.BigDecimal

View File

@ -1,10 +1,10 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.BewerbStatus import at.mocode.shared.enums.BewerbStatus
import at.mocode.shared.model.enums.Sparte import at.mocode.shared.enums.Sparte
import at.mocode.shared.model.serializers.BigDecimalSerializer import at.mocode.shared.serializers.BigDecimalSerializer
import at.mocode.shared.model.serializers.KotlinInstantSerializer import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Instant import kotlinx.datetime.Instant

View File

@ -1,6 +1,6 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.PlatzTyp import at.mocode.shared.enums.PlatzTyp
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.NennungsArt import at.mocode.shared.enums.NennungsArt
import at.mocode.shared.model.serializers.* import at.mocode.shared.serializers.*
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.ionspin.kotlin.bignum.decimal.BigDecimal
@ -39,7 +39,7 @@ data class Turnier(
var turnierleiterId: Uuid?, // FK zu Person var turnierleiterId: Uuid?, // FK zu Person
@Serializable(with = UuidSerializer::class) @Serializable(with = UuidSerializer::class)
var turnierbeauftragterId: Uuid?, // FK zu Person var turnierbeauftragterId: Uuid?, // FK zu Person
var richterIds: List<@Serializable(with = UuidSerializer::class) Uuid> = emptyList(), // Pool an Richtern var richterIds: List<@Serializable(with = UuidSerializer::class) Uuid> = emptyList(), // Pool Richtern
var parcoursbauerIds: List<@Serializable(with = UuidSerializer::class) Uuid> = emptyList(), // FKs zu Person var parcoursbauerIds: List<@Serializable(with = UuidSerializer::class) Uuid> = emptyList(), // FKs zu Person
var parcoursAssistentIds: List<@Serializable(with = UuidSerializer::class) Uuid> = emptyList(), // FKs zu Person var parcoursAssistentIds: List<@Serializable(with = UuidSerializer::class) Uuid> = emptyList(), // FKs zu Person
var tierarztInfos: String?, var tierarztInfos: String?,

View File

@ -1,9 +1,9 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.VeranstalterTyp import at.mocode.shared.enums.VeranstalterTyp
import at.mocode.shared.model.serializers.KotlinInstantSerializer import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.KotlinLocalDateSerializer import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.enums package at.mocode.shared.enums
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -0,0 +1,43 @@
package at.mocode.shared.model
import at.mocode.shared.enums.Sparte
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
@Serializable
data class Pruefungsaufgabe(
@Serializable(with = UuidSerializer::class)
val id: Uuid,
var kuerzel: String, // Eindeutiges Kürzel, z.B. "A1", "LF3", "FEI GP PSG"
var nameLang: String, // Vollständiger Name, z.B. "Dressuraufgabe A1 (GM, 20x40m)"
var kategorieText: String?, // Übergeordnete Kategorie, z.B. "Dressuraufgaben Klasse A", "FEI Grand Prix Serie"
var sparte: Sparte, // Primär DRESSUR, aber auch für Vielseitigkeit etc.
var nation: PruefungsaufgabeNationEnum = PruefungsaufgabeNationEnum.NATIONAL,
var richtverfahrenModusDefault: PruefungsaufgabeRichtverfahrenModusEnum?, // GM, GT - als Default für diese Aufgabe
var viereckGroesseDefault: PruefungsaufgabeViereckEnum?, // VIERECK_20x40, VIERECK_20x60 - als Default
var schwierigkeitsgradText: String?, // z.B. "A", "L", "M", "S", "Grand Prix"
var aufgabenNummerInSammlung: String?, // z.B. die "1" bei "Aufgabe A1" oder spezifische FEI Nummer
var jahrgangVersion: String?, // z.B. "2011", "FEI 2023"
var pdfUrlExtern: String?, // Link zur offiziellen PDF-Datei (OEPS, FEI)
var pdfDateinameIntern: String?, // Falls wir die PDFs auch bei uns speichern/hochladen (Dateiname)
var anmerkungen: String?, // z.B. "Diese Aufgabe darf nur mit Leitfaden gerichtet werden"
var dauerGeschaetztMinuten: Double?, // z.B. 3.5
var anzahlMaxPunkteProRichter: Double?, // Für Dressur, falls standardisiert
var istAktiv: Boolean = true, // Kann die Aufgabe aktuell ausgewählt werden?
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
enum class PruefungsaufgabeNationEnum { NATIONAL, FEI, SONSTIGE }
enum class PruefungsaufgabeRichtverfahrenModusEnum { GM, GT, NICHT_SPEZIFIZIERT } // Gemeinsam, Getrennt
enum class PruefungsaufgabeViereckEnum { VIERECK_20x40, VIERECK_20x60, ANDERE, UNBEKANNT }
// Shared Serializers (Beispiel, falls noch nicht vorhanden)
// object UuidSerializer // ...
// object KotlinInstantSerializer // ...

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.serializers package at.mocode.shared.serializers
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuidFrom import com.benasher44.uuid.uuidFrom

View File

@ -1,8 +1,8 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import at.mocode.shared.model.enums.LizenzTyp import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.model.enums.Sparte import at.mocode.shared.enums.Sparte
import at.mocode.shared.model.serializers.KotlinLocalDateSerializer import at.mocode.shared.serializers.KotlinLocalDateSerializer
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View File

@ -1,10 +1,10 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import at.mocode.shared.model.enums.FunktionaerRolle import at.mocode.shared.enums.FunktionaerRolle
import at.mocode.shared.model.enums.Geschlecht import at.mocode.shared.enums.Geschlecht
import at.mocode.shared.model.serializers.KotlinInstantSerializer import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.KotlinLocalDateSerializer import at.mocode.shared.serializers.KotlinLocalDateSerializer
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock

View File

@ -1,8 +1,8 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import at.mocode.shared.model.enums.GeschlechtPferd import at.mocode.shared.enums.GeschlechtPferd
import at.mocode.shared.model.serializers.KotlinInstantSerializer import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import at.mocode.shared.model.serializers.KotlinInstantSerializer import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.ionspin.kotlin.bignum.decimal.BigDecimal

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.BewerbStatus import at.mocode.shared.enums.BewerbStatus
import at.mocode.shared.model.enums.Sparte import at.mocode.shared.enums.Sparte
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Clock import kotlinx.datetime.Clock

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json

View File

@ -1,6 +1,6 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.PlatzTyp import at.mocode.shared.enums.PlatzTyp
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlin.test.Test import kotlin.test.Test

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.NennungsArt import at.mocode.shared.enums.NennungsArt
import at.mocode.shared.model.enums.PlatzTyp import at.mocode.shared.enums.PlatzTyp
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Clock import kotlinx.datetime.Clock

View File

@ -1,6 +1,6 @@
package at.mocode.shared.model.entitaeten package at.mocode.shared.entitaeten
import at.mocode.shared.model.enums.VeranstalterTyp import at.mocode.shared.enums.VeranstalterTyp
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.enums package at.mocode.shared.enums
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.serializers package at.mocode.shared.serializers
import com.benasher44.uuid.Uuid import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import at.mocode.shared.model.enums.LizenzTyp import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.model.enums.Sparte import at.mocode.shared.enums.Sparte
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlin.test.Test import kotlin.test.Test

View File

@ -1,9 +1,9 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import at.mocode.shared.model.enums.FunktionaerRolle import at.mocode.shared.enums.FunktionaerRolle
import at.mocode.shared.model.enums.Geschlecht import at.mocode.shared.enums.Geschlecht
import at.mocode.shared.model.enums.LizenzTyp import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.model.enums.Sparte import at.mocode.shared.enums.Sparte
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate

View File

@ -1,6 +1,6 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import at.mocode.shared.model.enums.GeschlechtPferd import at.mocode.shared.enums.GeschlechtPferd
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.stammdaten package at.mocode.shared.stammdaten
import com.benasher44.uuid.uuid4 import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock import kotlinx.datetime.Clock