impl Abteilung

This commit is contained in:
2025-05-13 22:29:23 +02:00
parent 468b45aa56
commit 0cebc711cf
20 changed files with 246 additions and 464 deletions
@@ -1,25 +0,0 @@
package at.mocode.shared.entitaeten
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 Abteilung(
@Serializable(with = UuidSerializer::class)
val id: Uuid,
@Serializable(with = UuidSerializer::class)
val bewerbId: Uuid,
val bezeichnung: String, // z.B. "R1", "R2/RS2 u. höher"
val beginnZeit: String, // TIME als String, z.B. "09:00" oder "anschließend"
val istFixeBeginnZeit: Boolean = false,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -1,41 +0,0 @@
package at.mocode.shared.entitaeten
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
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable
@Serializable
data class Bewerb(
@Serializable(with = UuidSerializer::class)
val id: Uuid,
@Serializable(with = UuidSerializer::class)
var turnierId: Uuid,
var nummer: Int,
var bezeichnung: String,
var klasse: String,
var datum: LocalDate,
var sparte: Sparte,
var richtverfahren: String?,
var beginnZeit: String, // TIME als String (z.B. "09:00" oder "anschließend")
var istFixeBeginnZeit: Boolean = false,
var laufzeitProStarter: Int?, // Dauer pro Starter in Minuten
var maxStarter: Int?,
@Serializable(with = BigDecimalSerializer::class)
var nenngeld: BigDecimal?,
var sonderpruefungReferenz: SonderpruefungReferenz?,
var cupReferenz: List<CupReferenz> = emptyList(),
var status: BewerbStatus = BewerbStatus.GEPLANT,
var details: String?,
var einteilung: String?,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant,
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant
)
@@ -15,6 +15,8 @@ enum class BewerbStatus { GEPLANT, OFFEN_FUER_NENNUNG, GESCHLOSSEN_FUER_NENNUNG,
@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 }
@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 }
@@ -0,0 +1,62 @@
package at.mocode.shared.model
import at.mocode.shared.enums.BeginnzeitTyp
import at.mocode.shared.serializers.BigDecimalSerializer
import at.mocode.shared.serializers.KotlinInstantSerializer
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
@Serializable
data class Abteilung(
@Serializable(with = UuidSerializer::class)
val id: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
val bewerbId: Uuid, // Gehört zu diesem Hauptbewerb
var abteilungsKennzeichen: String, // z.B. "1", "A", "R1", oder generiert "Abt1"
var bezeichnungIntern: String?, // Zur Unterscheidung im Admin, z.B. "R1 Reiter", "Lizenzfrei", "Pony LK3"
var bezeichnungAufStartliste: String?, // Wie es auf der Start/Ergebnisliste erscheinen soll
// Kriterien für diese Abteilung (aus SUDO "Teilen nach:")
var teilungsKriteriumLizenz: String? = null, // z.B. "R1", "R2+R3", "lizenzfrei" (kann komplex sein)
var teilungsKriteriumPferdealter: String? = null,
var teilungsKriteriumAltersklasseReiter: String? = null,
var teilungsKriteriumAnzahlMin: Int? = null, // Mindestanzahl für diese Teilung
var teilungsKriteriumAnzahlMax: Int? = null, // Maximale Anzahl für diese Teilung
var teilungsKriteriumFreiText: String? = null, // Für "freie Angabe"
// Überschreibt ggf. Werte vom Hauptbewerb
@Serializable(with = BigDecimalSerializer::class)
var startgeld: BigDecimal? = null,
var dotierungen: List<DotierungsAbstufung> = emptyList(),
@Serializable(with = UuidSerializer::class)
var platzId: Uuid?, // FK zum Austragungsplatz (kann vom Hauptbewerb abweichen)
var datum: LocalDate?,
var beginnzeitTyp: BeginnzeitTyp = BeginnzeitTyp.ANSCHLIESSEND,
@Serializable(with = KotlinLocalTimeSerializer::class)
var beginnzeitFix: LocalTime? = null,
@Serializable(with = UuidSerializer::class)
var beginnNachAbteilungId: Uuid?, // Reihenfolge der Abteilungen
var beginnzeitCa: LocalTime? = null,
var dauerProStartGeschaetztSek: Int? = null,
var umbauzeitNachAbteilungMin: Int? = null,
var besichtigungszeitVorAbteilungMin: Int? = null,
var stechzeitZusaetzlichMin: Int? = null,
var anzahlStarter: Int = 0, // Wird später befüllt
var istAktiv: Boolean = true, // Kann diese Abteilung genannt werden?
@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.entitaeten
package at.mocode.shared.model
import at.mocode.shared.serializers.BigDecimalSerializer
import at.mocode.shared.serializers.KotlinInstantSerializer
@@ -0,0 +1,100 @@
package at.mocode.shared.model
import at.mocode.shared.enums.BeginnzeitTyp
import at.mocode.shared.enums.Sparte
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
@Serializable
data class Bewerb(
@Serializable(with = UuidSerializer::class)
val id: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
val turnierId: Uuid,
// Allgemeine Infos
var nummer: String, // Offizielle Nummer aus Ausschreibung, z.B. "12"
var bezeichnungOffiziell: String, // z.B. "Dressurprüfung Kl. L", "Standardspringprüfung 115cm"
var internerName: String?, // Für Listen, falls abweichend/kürzer
var sparte: Sparte,
var klasse: String?, // z.B. "L", "115cm", "Reiterpass"
var kategorieOetoDesBewerbs: String?, // ÖTO Kategorie, z.B. "CDN-C Neu". Kann vom Turnier abweichen/spezifischer sein.
// Wird für die Gültigkeit von Regeln/Lizenzen herangezogen.
var teilnahmebedingungenText: String? = null, // Freitext für spezielle Teilnahmebedingungen
// Detail-Informationen (aus den Tabs deines alten Programms)
var maxPferdeProReiter: Int? = null,
var pferdealterAnforderung: String? = null, // z.B. "4-jährig", "alle", "5-6j."
var zusatzTextZeile1: String? = null, // Für Cup-Namen, Sponsoren etc. auf Ergebnislisten
var zusatzTextZeile2: String? = null,
var zusatzTextZeile3: String? = null,
var logoBewerbUrl: String? = null,
var parcoursskizzeUrl: String? = null,
// Bewertung & Aufgabe
var pruefungsArtDetailName: String?, // Beschreibung der Prüfung aus SUDO "Prüfung" Dropdown
@Serializable(with = UuidSerializer::class)
var pruefungsaufgabeId: Uuid?, // FK zu Pruefungsaufgabe.id (bes. für Dressur)
@Serializable(with = UuidSerializer::class)
var richtverfahrenId: Uuid?, // FK zu Richtverfahren.id
var anzahlRichterGeplant: Int? = 1,
var paraGradeAnforderung: String? = null,
var istManuellKalkuliert: Boolean = false, // Für Ergebnisberechnung
// Geldpreis/Dotierung
var istDotiert: Boolean = false,
@Serializable(with = BigDecimalSerializer::class)
var startgeldStandard: BigDecimal? = null, // Standard-Startgeld für diesen Bewerb
@Serializable(with = BigDecimalSerializer::class)
var startgeldKaderreiter: BigDecimal? = null,
var auszahlungsModusGeldpreis: String? = null,
var hatGeldpreisFuerKaderreiter: Boolean = false,
@Serializable(with = UuidSerializer::class)
var geldpreisVorlageId: Uuid?, // FK zu einer GeldpreisVorlagen-Tabelle (optional für später)
var dotierungenManuell: List<DotierungsAbstufung> = emptyList(),
// Ort/Zeit (Default-Werte, können pro Abteilung überschrieben werden)
@Serializable(with = UuidSerializer::class)
var standardPlatzId: Uuid?, // FK zum Default-Austragungsplatz
@Serializable(with = KotlinLocalDateSerializer::class)
var standardDatum: LocalDate?,
var standardBeginnzeitTyp: BeginnzeitTyp = BeginnzeitTyp.ANSCHLIESSEND, // neuer Enum Wert
@Serializable(with = KotlinLocalTimeSerializer::class)
var standardBeginnzeitFix: LocalTime? = null,
@Serializable(with = UuidSerializer::class)
var standardBeginnNachBewerbId: Uuid?,
@Serializable(with = KotlinLocalTimeSerializer::class)
var standardBeginnzeitCa: LocalTime? = null,
var standardDauerProStartGeschaetztSek: Int? = 120,
var standardUmbauzeitNachBewerbMin: Int? = 10,
var standardBesichtigungszeitVorBewerbMin: Int? = 10,
var standardStechzeitZusaetzlichMin: Int? = 0,
// ÖTO/ZNS Spezifika
var oepsBewerbsartCodeZns: String? = null,
var oepsAltersklasseCodeZns: String? = null,
var oepsPferderassenCodeZns: String? = null,
// Steuerung
var notizenIntern: String? = null,
var istStartlisteFinal: Boolean = false,
var istErgebnislisteFinal: Boolean = false,
var erfordertAbteilungsAuswahlFuerNennung: Boolean = true, // Standardmäßig ja, außer es gibt nur eine Default-Abteilung
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
// Enum BeginnzeitTypEnum um ANSCHLIESSEND erweitern
// ANSCHLIESSEND wäre der Standard, wenn keine explizite Zeit oder "nach Bewerb X" angegeben ist.
@@ -0,0 +1,14 @@
package at.mocode.shared.model
import at.mocode.shared.serializers.BigDecimalSerializer
import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.serialization.Serializable
@Serializable
data class DotierungsAbstufung(
val platz: Int, // Für welchen Platz gilt dieser Geldpreis (z.B. 1, 2, 3)
@Serializable(with = BigDecimalSerializer::class)
val betrag: BigDecimal,
val beschreibung: String? = null // z.B. "Ehrenpreis zusätzlich"
)
@@ -1,4 +1,4 @@
package at.mocode.shared.entitaeten
package at.mocode.shared.model
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
@@ -1,4 +1,4 @@
package at.mocode.shared.entitaeten
package at.mocode.shared.model
import at.mocode.shared.enums.PlatzTyp
import at.mocode.shared.serializers.UuidSerializer
@@ -4,6 +4,7 @@ import at.mocode.shared.enums.Sparte
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
@@ -11,7 +12,7 @@ import kotlinx.serialization.Serializable
@Serializable
data class Pruefungsaufgabe(
@Serializable(with = UuidSerializer::class)
val id: Uuid,
val id: Uuid = uuid4(),
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"
@@ -0,0 +1,32 @@
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 com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
@Serializable
data class Richtverfahren(
@Serializable(with = UuidSerializer::class)
val id: Uuid = uuid4(),
var code: String, // Eindeutiger Code, z.B. "A", "A2_OETO204", "C_ZEIT", "STIL_A_IDEALZEIT"
var bezeichnung: String, // z.B. "Standardspringprüfung nach Fehlern und Zeit (§204 A2)", "Stilspringprüfung Kl. A mit Idealzeit"
var sparte: Sparte,
var basisRegelnBeschreibungKurz: String?, // Kurze Beschreibung oder Hauptmerkmal
var oetoParagraphVerweis: String?, // z.B. "ÖTO §204 A2", "ÖTO §104"
var hatStechen: Boolean = false,
var artDesStechens: String? = null, // z.B. "nach Fehlern/Zeit", "nur Fehler"
// Weitere strukturierte Regeln könnten hier folgen, z.B. für Fehlerpunkte, Zeitberechnung.
// Für V1 könnten viele Regeln noch in der Anwendungslogik sein, basierend auf dem `code`.
// Beispiel für strukturierte Fehler:
// var fehlerdefinitionen: Map<String, Double> = emptyMap(), // z.B. "HINDERNIS" -> 4.0
var istAktiv: Boolean = true,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)
@@ -1,7 +1,12 @@
package at.mocode.shared.entitaeten
package at.mocode.shared.model
import at.mocode.shared.model.Artikel
import at.mocode.shared.enums.NennungsArt
import at.mocode.shared.serializers.*
import at.mocode.shared.serializers.BigDecimalSerializer
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 com.ionspin.kotlin.bignum.decimal.BigDecimal
@@ -1,4 +1,4 @@
package at.mocode.shared.entitaeten
package at.mocode.shared.model
import at.mocode.shared.enums.VeranstalterTyp
import at.mocode.shared.serializers.KotlinInstantSerializer
@@ -6,6 +6,7 @@ import com.ionspin.kotlin.bignum.decimal.BigDecimal
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.LocalTime
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
@@ -42,3 +43,9 @@ object KotlinLocalDateTimeSerializer : KSerializer<LocalDateTime> {
override fun serialize(encoder: Encoder, value: LocalDateTime) = encoder.encodeString(value.toString())
override fun deserialize(decoder: Decoder): LocalDateTime = LocalDateTime.parse(decoder.decodeString())
}
object KotlinLocalTimeSerializer : KSerializer<LocalTime> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LocalTime", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: LocalTime) = encoder.encodeString(value.toString())
override fun deserialize(decoder: Decoder): LocalTime = LocalTime.parse(decoder.decodeString())
}