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
import at.mocode.server.plugins.configureDatabase
import io.ktor.http.HttpHeaders
import io.ktor.http.HttpMethod
import io.ktor.http.HttpStatusCode
import io.ktor.serialization.kotlinx.json.json
import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.application.*
import io.ktor.server.netty.*
import io.ktor.server.plugins.calllogging.CallLogging
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
import io.ktor.server.plugins.cors.routing.CORS
import io.ktor.server.plugins.defaultheaders.DefaultHeaders
import io.ktor.server.plugins.statuspages.StatusPages
import io.ktor.server.plugins.calllogging.*
import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.server.plugins.cors.routing.*
import io.ktor.server.plugins.defaultheaders.*
import io.ktor.server.plugins.statuspages.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import kotlinx.serialization.json.Json
import org.slf4j.LoggerFactory
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>) {
EngineMain.main(args)
}
/**
* Application module configuration.
* This is where all server plugins and routes are configured.
*/
fun Application.module() {
val log = LoggerFactory.getLogger("Application")
@ -47,9 +37,6 @@ fun Application.module() {
log.info("Application initialized successfully")
}
/**
* Configures all Ktor plugins for the application
*/
private fun Application.configurePlugins() {
val log = LoggerFactory.getLogger("ApplicationPlugins")
// 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.model.serializers.UuidSerializer
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

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.model.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer
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

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.model.enums.Sparte
import at.mocode.shared.model.serializers.BigDecimalSerializer
import at.mocode.shared.model.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer
import at.mocode.shared.enums.BewerbStatus
import at.mocode.shared.enums.Sparte
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.ionspin.kotlin.bignum.decimal.BigDecimal
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.uuid4
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.model.serializers.UuidSerializer
import at.mocode.shared.enums.PlatzTyp
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
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.model.serializers.*
import at.mocode.shared.enums.NennungsArt
import at.mocode.shared.serializers.*
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal
@ -39,7 +39,7 @@ data class Turnier(
var turnierleiterId: Uuid?, // FK zu Person
@Serializable(with = UuidSerializer::class)
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 parcoursAssistentIds: List<@Serializable(with = UuidSerializer::class) Uuid> = emptyList(), // FKs zu Person
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.model.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.KotlinLocalDateSerializer
import at.mocode.shared.model.serializers.UuidSerializer
import at.mocode.shared.enums.VeranstalterTyp
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

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.enums
package at.mocode.shared.enums
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.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.model.enums.Sparte
import at.mocode.shared.model.serializers.KotlinLocalDateSerializer
import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.enums.Sparte
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import kotlinx.datetime.LocalDate
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.model.enums.Geschlecht
import at.mocode.shared.model.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.KotlinLocalDateSerializer
import at.mocode.shared.model.serializers.UuidSerializer
import at.mocode.shared.enums.FunktionaerRolle
import at.mocode.shared.enums.Geschlecht
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

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.model.serializers.KotlinInstantSerializer
import at.mocode.shared.model.serializers.UuidSerializer
import at.mocode.shared.enums.GeschlechtPferd
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

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.model.serializers.UuidSerializer
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

View File

@ -1,4 +1,4 @@
package at.mocode.shared.model.entitaeten
package at.mocode.shared.entitaeten
import com.benasher44.uuid.uuid4
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.model.enums.Sparte
import at.mocode.shared.enums.BewerbStatus
import at.mocode.shared.enums.Sparte
import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal
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 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 kotlinx.serialization.json.Json
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.model.enums.PlatzTyp
import at.mocode.shared.enums.NennungsArt
import at.mocode.shared.enums.PlatzTyp
import com.benasher44.uuid.uuid4
import com.ionspin.kotlin.bignum.decimal.BigDecimal
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 kotlinx.datetime.Clock
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.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.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.model.enums.Sparte
import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.enums.Sparte
import kotlinx.datetime.LocalDate
import kotlinx.serialization.json.Json
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.model.enums.Geschlecht
import at.mocode.shared.model.enums.LizenzTyp
import at.mocode.shared.model.enums.Sparte
import at.mocode.shared.enums.FunktionaerRolle
import at.mocode.shared.enums.Geschlecht
import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.enums.Sparte
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
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 kotlinx.datetime.Clock
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 kotlinx.datetime.Clock