Klassen impl

This commit is contained in:
stefan 2025-05-20 16:44:45 +02:00
parent 0ca73cbe60
commit 181cbcf7d3
27 changed files with 1974 additions and 491 deletions

View File

@ -0,0 +1,610 @@
@startuml
!theme vibrant
title Datenbankmodell ÖTO - Service-Orientierte Modulare Struktur (inkl. aller Sparten)
' Ankerpunkt: Montag 19. Mai, 10:53 Uhr (basierend auf Nutzer-Input und vorherigen Diskussionen)
' Diagramm-Optionen
skinparam linetype ortho
hide empty members
skinparam shadowing false
skinparam defaultFontName "Segoe UI"
skinparam defaultFontSize 10
skinparam roundCorner 10
allow_mixing
' --- Enums (mit Suffix E) ---
enum SparteE {
DRESSUR,
SPRINGEN,
VIELSEITIGKEIT,
FAHREN,
VOLTIGIEREN,
WESTERN,
DISTANZ,
ISLAND,
PFERDESPORT_SPIEL,
SONDERPRUEFUNG,
SONSTIGE,
UNBEKANNT
}
enum RegelwerkTypE {
OETO,
FEI,
SONSTIGE
}
enum PruefungsaufgabeNationE {
NATIONAL_OEPS,
FEI,
SONSTIGE
}
enum PruefungsaufgabeRichtverfahrenModusE {
GM,
GT,
NICHT_SPEZIFIZIERT
}
enum PruefungsaufgabeViereckE {
VIERECK_20x40,
VIERECK_20x60,
ANDERE,
UNBEKANNT
}
enum ArtDesStechensE {
KEIN_STECHEN,
FEHLER_ZEIT_NORMAL,
FEHLER_ZEIT_AM3,
SIEGERUNDE_SR1_MIT_UEBERNAHME_GP,
SIEGERUNDE_SR2_OHNE_UEBERNAHME_GP,
ZWEI_STECHEN_AM4, ZWEI_STECHEN_AM6,
SONDERREGELUNG_AUSSCHREIBUNG
}
enum FunktionaerRolleE {
RICHTER,
RICHTER_VORSITZ,
RICHTER_BEI_C,
RICHTER_AM_ABREITEPLATZ,
PARCOURSBAUER,
PARCOURSBAU_ASSISTENT,
STEWARD,
TECHNISCHER_DELEGIERTER,
TURNIERLEITER,
TURNIERBEAUFTRAGTER,
TIERARZT_TURNIER,
HUFSCHMIED_TURNIER,
MELD,
RECHENSTELLE,
SPRECHER,
REITERSPRECHER,
ZEITNEHMER,
SCHREIBER_RICHTER,
HELFER_PARCOURS,
SONSTIGE_FUNKTION
}
enum RichterPositionE {
C,
E,
H,
B,
M,
VORSITZ,
RICHTERTURM,
SONSTIGE_POSITION
}
enum DatenQuelleE {
OEPS_ZNS,
MANUELL_NATIONAL,
MANUELL_INTERNATIONAL,
SYSTEM_GENERIERTR
}
enum NennungStatusE {
GEMELDET,
MANUELL_ERFASST,
BESTAETIGT,
NACHGENANNT,
BEZAHLT,
STARTBERECHTIGT,
ABGEMELDET_REITER,
ABGEMELDET_VERANSTALTER,
STORNIERT_SYSTEM
}
enum BeginnzeitTypE {
FIX_UM,
ANSCHLIESSEND,
CA_UM,
NACH_VORHERIGEM_BEWERB_ABTEILUNG
}
enum EventStatusE {
IN_PLANUNG,
GENEHMIGT_VERANSTALTER,
OEFFENTLICH_SICHTBAR,
AKTIV,
ABGESCHLOSSEN,
ABGESAGT
}
enum PlatzTypE {
AUSTRAGUNG,
VORBEREITUNG,
LONGIEREN,
SONSTIGES
}
enum SportfachStammdatenTypE {
DRESSURAUFGABE,
HINDERNISTYP_SPRINGEN,
WERTUNGSVERFAHREN,
RVK_PUNKTETABELLE,
OETO_REGEL_TEXT,
SONSTIGES
}
enum CupSerieTypE {
CUP,
MEISTERSCHAFT_LAND,
MEISTERSCHAFT_BUND,
SERIE,
SONDERWERTUNG
}
' #####################################################################
' ### Service OeTO-Verwaltung (Regeln, Lizenzen, Definitionen) ###
' #####################################################################
package Service_OeTO_Verwaltung {
entity OETORegelReferenz {
+ oeto_regel_referenz_id : UUID <<PK>>
--
paragraph_nummer : VARCHAR
kapitel_titel : VARCHAR?
kurzbeschreibung_regel : TEXT?
oeto_version_datum : DATE
url_detail : VARCHAR?
regelwerk_typ : RegelwerkTypE ' ÖTO oder FEI
}
' Definiert Funktionärsqualifikationen
entity QualifikationsTyp {
+ qual_typ_code : VARCHAR <<PK>> ' z.B. "R-DPF", "PB-S", "TD-NAT"
--
bezeichnung : VARCHAR
sparte : SparteE
# oeto_regel_ref_id : UUID <<FK>>?
}
QualifikationsTyp -- "?" OETORegelReferenz : unterliegt
' Deine LizenzTyp_OEPS, umbenannt für globale Lizenzdefinitionen
entity LizenzTypGlobal {
+ lizenz_typ_global_code : VARCHAR(10) <<PK>> ' z.B. "R1", "RS2", "F1", "S (Startkarte)"
--
bezeichnung : VARCHAR
sparte_primaer : SparteE? ' Hauptsparte dieser Lizenz
kategorie_lizenz_text : VARCHAR ' z.B. "Reiterlizenz", "Startkarte", "Fahrerlizenz", "Funktionärsqualifikation"
stufe : VARCHAR? ' z.B. "1", "2", "S"
beschreibung_berechtigung : TEXT?
# oeto_regel_ref_id : UUID <<FK>>?
}
LizenzTypGlobal -- "?" OETORegelReferenz : basiert auf
entity AltersklasseDefinition {
+ altersklasse_code : VARCHAR(10) <<PK>> ' z.B. "JG", "U18", "YR", "ALLG"
--
bezeichnung : VARCHAR
min_alter : INTEGER?
max_alter : INTEGER?
geschlecht_filter : CHAR(1)? ' W, M, oder null für alle
# oeto_regel_ref_id : UUID <<FK>>?
}
AltersklasseDefinition -- "?" OETORegelReferenz : definiert durch
' Für Dressuraufgaben, Richtverfahren etc.
entity Sportfachliche_Stammdaten {
+ stammdatum_id : UUID <<PK>>
--
typ : SportfachStammdatenTypE
code : VARCHAR ' z.B. "GA02/23" (Dressuraufgabe), "A2_OETO204" (Richtverfahren)
bezeichnung : VARCHAR
beschreibung_details_json : TEXT ' Strukturierte Details als JSON (z.B. Lektionen, Fehlerpunkte)
sparte_zugehoerigkeit : SparteE
nation_gueltigkeit: PruefungsaufgabeNationE? ' NATIONAL_OEPS, FEI
viereck_groesse: PruefungsaufgabeViereckE? ' Für Dressuraufgaben
richtverfahren_modus: PruefungsaufgabeRichtverfahrenModusE? ' GM/GT für Dressuraufgaben
istAktiv: Boolean
# oeto_regel_ref_id : UUID <<FK>>?
}
Sportfachliche_Stammdaten -- "?" OETORegelReferenz : referenziert
}
' --- Ende Service OeTO-Verwaltung ---
' #####################################################################
' ### Service ZNS-Daten (Staging/Rohdaten von OEPS) ###
' #####################################################################
package Service_ZNS_Daten {
entity Verein_ZNS_Staging {
+ oeps_vereins_nr : VARCHAR(4) <<PK>> ' Aus VEREIN01.dat
--
name : VARCHAR(50)
import_timestamp: TIMESTAMP
}
entity Person_ZNS_Staging {
+ oeps_satz_nr_person : VARCHAR(6) <<PK>> ' Aus LIZENZ01.dat / RICHT01.dat
--
familienname : VARCHAR(50)
vorname : VARCHAR(25)
geburtsdatum_text : VARCHAR(8) ' JJJJMMTT
geschlecht_code : CHAR(1)
nationalitaet_code : VARCHAR(3)
bundesland_code_oeps : VARCHAR(2)?
vereinsname_oeps_roh : VARCHAR(50)?
mitglied_nr_verein : VARCHAR(8)?
fei_id_person : VARCHAR(10)?
sperrliste_flag_oeps : CHAR(1)? ' "S" oder BLANK
kader_flag_oeps : CHAR(1)?
telefon_roh : VARCHAR(21)?
reiterlizenz_roh : VARCHAR(4)?
startkarte_roh : CHAR(1)?
fahrlizenz_roh : VARCHAR(2)?
altersklasse_jugend_code_oeps : VARCHAR(2)?
altersklasse_jungerreiter_code_oeps : CHAR(1)?
jahr_letzte_zahlung_lizenz_oeps : INTEGER?
lizenzinfo_raw_oeps : VARCHAR(10)?
qualifikationen_raw_oeps: VARCHAR(30)? ' Aus RICHT01.dat
import_timestamp: TIMESTAMP
}
entity Pferd_ZNS_Staging {
+ oeps_satz_nr_pferd : VARCHAR(10) <<PK>> ' Aus PFERDE01.dat
--
oeps_kopf_nr : VARCHAR(4)? ' Wird oft zusätzlich verwendet
name : VARCHAR(30)
lebensnummer : VARCHAR(9)?
geburtsjahr : INTEGER?
geschlecht_code : CHAR(1)?
farbe : VARCHAR(15)?
abstammung_vater_name : VARCHAR(30)?
abstammung_info_roh : VARCHAR(15)? ' Feld "ABSTAMMUNG"
oeps_verein_nr_pferd_roh : VARCHAR(4)?
verantwortliche_person_name_roh: VARCHAR(75)?
fei_pass_nr : VARCHAR(10)?
letzte_zahlung_pferdegebuehr_jahr : INTEGER?
import_timestamp: TIMESTAMP
}
}
' --- Ende Service ZNS-Daten ---
' ####################################################################################
' ### Domänen Service: Sportler & Pferde Verwaltung (aus ZNS und manuell) ###
' ####################################################################################
package Service_Sportler_Pferde_Verwaltung {
entity DomPerson {
+ person_id: UUID <<PK>>
--
oeps_satz_nr: VARCHAR(6) <<UQ>>?
nachname: VARCHAR
vorname: VARCHAR
geburtsdatum: DATE?
geschlecht: GeschlechtE?
nationalitaet_code: VARCHAR(3)?
fei_id: VARCHAR(10)?
telefon: VARCHAR?
email: VARCHAR?
# stamm_verein_id: UUID <<FK>>? ' Verweis auf DomVerein.verein_id
ist_gesperrt: BOOLEAN
sperr_grund: TEXT?
daten_quelle: DatenQuelleE
ist_aktiv: BOOLEAN
}
entity DomPferd {
+ pferd_id: UUID <<PK>>
--
oeps_satz_nr_pferd: VARCHAR(10) <<UQ>>?
oeps_kopf_nr: VARCHAR(4)?
name: VARCHAR
lebensnummer: VARCHAR?
geburtsjahr: INTEGER?
geschlecht_pferd: CHAR(1)? ' oder Enum
# besitzer_person_id: UUID <<FK>>?
# verantwortlicher_person_id: UUID <<FK>>?
# heimat_verein_id: UUID <<FK>>?
daten_quelle: DatenQuelleE
ist_aktiv: BOOLEAN
}
entity DomVerein {
+ verein_id: UUID <<PK>>
--
oeps_vereins_nr: VARCHAR(4) <<UQ>>
name: VARCHAR
kuerzel: VARCHAR?
bundesland_code: VARCHAR(2)?
}
entity DomLizenz {
+ lizenz_id: UUID <<PK>>
--
# person_id: UUID <<FK>>
# lizenz_typ_global_code: VARCHAR(10) <<FK>> ' Verweis auf Service_OeTO_Verwaltung.LizenzTypGlobal
gueltig_bis_jahr: INTEGER?
ist_aktiv_bezahlt: BOOLEAN ' Info aus LIZENZINFO
}
entity DomQualifikation {
+ qualifikation_id: UUID <<PK>>
--
# person_id: UUID <<FK>>
# qual_typ_code: VARCHAR <<FK>> ' Verweis auf Service_OeTO_Verwaltung.QualifikationsTyp
details: VARCHAR?
}
DomPerson "1" -- "0..*" DomLizenz : besitzt
DomLizenz -- "1" Service_OeTO_Verwaltung.LizenzTypGlobal : ist vom Typ
DomPerson "1" -- "0..*" DomQualifikation : besitzt
DomQualifikation -- "1" Service_OeTO_Verwaltung.QualifikationsTyp : ist vom Typ
DomPerson "0..*" -- "1" DomVerein : hat Stammverein
DomPferd "0..*" -- "1" DomPerson : hat Besitzer
DomPferd "0..*" -- "1" DomPerson : hat Verantwortlichen
DomPferd "0..*" -- "1" DomVerein : hat Heimatverein
}
' --- Ende Service Sportler & Pferde Verwaltung ---
' #####################################################################
' ### Service Veranstaltungsplanung (Events, Turniere, Prüfungen) ###
' #####################################################################
package Service_Veranstaltungsplanung {
' Entspricht unserem "Event"
entity VeranstaltungsRahmen {
+ veranst_rahmen_id : UUID <<PK>>
--
name : VARCHAR
datum_von_gesamt : DATE
datum_bis_gesamt : DATE
# hauptveranstalter_verein_id : UUID <<FK>> ' Verweis auf DomVerein
ort_text: VARCHAR
status: EventStatusE
}
' Entspricht unserem "Turnier"
entity Turnier_OEPS {
+ turnier_id : UUID <<PK>> ' Eigene UUID für interne Zwecke
--
# veranst_rahmen_id : UUID <<FK>>
oeps_turnier_nr : VARCHAR(5) <<UQ>> ' Offizielle OEPS Nummer
name_zusatz : VARCHAR?
datum_von_turnier : DATE
datum_bis_turnier : DATE
# oeto_kategorie_ids: List<UUID> '(FKs zu Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition)' ' Eher so'
kategorie_text_turnier : VARCHAR(50) ' Wie in SUDO, kann mehrere ÖTO Kat. enthalten, z.B. "CDN-C Neu / CDNP-C Neu"'
regelwerk_typ : RegelwerkTypE
hauptsparte: SparteE
}
' Entspricht unserer "BewerbBasis"
entity Pruefung_OEPS {
+ pruefung_db_id : UUID <<PK>>
--
# turnier_id : UUID <<FK>>
oeps_bewerb_nr_display : INTEGER ' Eindeutige Nummer pro Turnier
name_text_uebergeordnet : VARCHAR
sparte : SparteE ' Explizit, wird ggf. aus oeps_kategorie_id vorgeschlagen
# oeps_kategorie_id : UUID <<FK zu Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition>>
' # klasse_id : UUID <<FK zu Service_OeTO_Verwaltung.BewerbsKlasseDefinition>> ' Wandert in Spezifika'
' Verweise auf spartenspezifische Details '
# dressur_spezifika_id: UUID <<FK>>?
# springen_spezifika_id: UUID <<FK>>?
}
' Entspricht unserer "Abteilung"
entity Pruefung_Abteilung {
+ pruefung_abteilung_db_id : UUID <<PK>>
--
# pruefung_db_id : UUID <<FK>>
abteilungs_kennzeichen : VARCHAR ' z.B. "1", "A" -> für Anzeige "12/1"
bezeichnung_abteilung : VARCHAR?
' ... strukturierte Teilungskriterien ...
}
entity Meisterschaft_Cup_Serie {
+ mcs_id : UUID <<PK>>
--
name : VARCHAR
typ : CupSerieTypE
jahr : INTEGER
sparte : SparteE
# reglement_oeto_regel_ref_id : UUID <<FK>>?
}
entity MCS_Wertungspruefung {
# mcs_id : UUID <<PK>> <<FK>>
# pruefung_abteilung_db_id : UUID <<PK>> <<FK>>
--
faktor_fuer_wertung : DECIMAL?
}
entity Platz {
+ platz_id: UUID <<PK>>
name: VARCHAR
typ: PlatzTypE
'.. berichtFelder ..
}
entity Turnier_hat_Platz {
# turnier_id: UUID <<PK>> <<FK>>
# platz_id: UUID <<PK>> <<FK>>
verwendungszweck: VARCHAR?
}
package Sportfachliche_Details_Pruefung {
entity DressurPruefungSpezifika {
+ pruefung_db_id : UUID <<PK>> <<FK>> ' 1:1 zu Pruefung_OEPS
--
# aufgabe_stammdatum_id : UUID <<FK>> ' Zu Service_OeTO_Verwaltung.Sportfachliche_Stammdaten (Typ DRESSURAUFGABE)
# klasse_id : UUID <<FK>> ' Zu Service_OeTO_Verwaltung.BewerbsKlasseDefinition
# richtverfahren_id: UUID <<FK>> ' Zu Service_OeTO_Verwaltung.Sportfachliche_Stammdaten (Typ WERTUNGSVERFAHREN_DRESSUR)
viereck_groesse_code : PruefungsaufgabeViereckE
' geplanteRichterPositionen: List<RichterPositionE> '
}
entity SpringenPruefungSpezifika {
+ pruefung_db_id : UUID <<PK>> <<FK>> ' 1:1 zu Pruefung_OEPS
--
# klasse_id : UUID <<FK>> ' Zu Service_OeTO_Verwaltung.BewerbsKlasseDefinition (z.B. Höhe)
# richtverfahren_id: UUID <<FK>> ' Zu Service_OeTO_Verwaltung.Sportfachliche_Stammdaten (Typ WERTUNGSVERFAHREN_SPRINGEN)
art_des_stechens : ArtDesStechensE?
'.. parcours infos ..
}
' ... Weitere Sparten (VS, RVK) analog ...
}
' Beziehungen innerhalb Veranstaltungsplanung
VeranstaltungsRahmen "1" -- "0..*" Turnier_OEPS
Turnier_OEPS "1" -- "0..*" Pruefung_OEPS
Pruefung_OEPS "1" -- "1..*" Pruefung_Abteilung
Pruefung_OEPS "1" -- "0..1" Sportfachliche_Details_Pruefung.DressurPruefungSpezifika
Pruefung_OEPS "1" -- "0..1" Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika
' ... Beziehungen zu weiteren Spezifika ...
Meisterschaft_Cup_Serie "1" -- "0..*" MCS_Wertungspruefung
Pruefung_Abteilung "1" -- "0..*" MCS_Wertungspruefung
Turnier_OEPS "1" -- "0..*" Turnier_hat_Platz
Platz "1" -- "0..*" Turnier_hat_Platz
' Beziehungen zu Service_OeTO_Verwaltung
Sportfachliche_Details_Pruefung.DressurPruefungSpezifika -- Service_OeTO_Verwaltung.Sportfachliche_Stammdaten : "nutzt Aufgabe"
Sportfachliche_Details_Pruefung.DressurPruefungSpezifika -- Service_OeTO_Verwaltung.BewerbsKlasseDefinition : "hat Klasse"
Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika -- Service_OeTO_Verwaltung.BewerbsKlasseDefinition : "hat Klasse"
Pruefung_OEPS -- Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition : "hat ÖTO Kategorie"
Turnier_OEPS -- Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition : "ist kategorisiert als"
' Beziehungen zu Service_Sportler_Pferde_Verwaltung (für Funktionäre etc.)
Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika -- Service_Sportler_Pferde_Verwaltung.DomPerson : "Parcoursdesigner" (als FK)
}
' --- Ende Service Veranstaltungsplanung ---
' #####################################################################
' ### Service Nennungsabwicklung (Nennungen, Startlisten, Ergebnisse) ###
' #####################################################################
package Service_Nennungsabwicklung {
' Umbenannt von Nennung_OEPS für Domänenkontext
entity Nennung {
+ nennung_id : UUID <<PK>>
--
# pruefung_abteilung_db_id : UUID <<FK>>
# teilnehmer_person_id : UUID <<FK>> ' Verweis auf DomPerson
# genanntes_pferd_id : UUID <<FK>> ' Verweis auf DomPferd
# genutzte_lizenz_id: UUID <<FK>>? ' Verweis auf DomLizenz des Teilnehmers
nennungs_zeitpunkt : TIMESTAMP
status_nennung : NennungStatusE
kopf_nr_pferd_fuer_nennung : VARCHAR(4)? ' Für Anzeige/Abgleich, Pferd ist aber per ID verknüpft
startgeld_bezahlt: BOOLEAN
pferdepass_kontrolliert: BOOLEAN
}
entity NennungsTeilnehmerSnapshot {
+ snapshot_id: UUID <<PK>>
# nennung_id: UUID <<FK>> (1:1 oder 1:0..1)
--
' Gesnapshotete Personendaten zum Zeitpunkt der Nennung '
person_oeps_satz_nr: VARCHAR(6)?
person_nachname: VARCHAR
person_vorname: VARCHAR
person_verein_name_snapshot: VARCHAR? ' Name des Vereins zum Zeitpunkt der Nennung '
relevante_lizenz_kuerzel_snapshot: VARCHAR?
' Gesnapshotete Pferdedaten zum Zeitpunkt der Nennung '
pferd_oeps_kopf_nr: VARCHAR(4)?
pferd_name_snapshot: VARCHAR
}
Nennung "1" -- "0..1" NennungsTeilnehmerSnapshot
entity Startfolge {
+ startfolge_id: UUID <<PK>>
# nennung_id: UUID <<FK>>
start_nummer_display: INTEGER ' Die sichtbare Startnummer
start_zeit_geplant: TIMESTAMP?
start_zeit_effektiv: TIMESTAMP?
status_start: VARCHAR ' z.B. GENANNT, GESTARTET, ABGEMELDET
s4_kader_flag: BOOLEAN ' Für spezielle Kaderwertung
}
' Eine Nennung führt zu max. einem Startfolgeeintrag pro (Teil-)Prüfung
Nennung "1" -- "0..1" Startfolge
' Umbenannt von Ergebnis_OEPS_Zeile
entity Ergebnis_Zeile {
+ ergebnis_zeile_id : UUID <<PK>>
--
# startfolge_id : UUID <<FK>>
platz : INTEGER?
ausschluss_disq_code : CHAR(1)?
punkte_wertnote_text_ergebnis_roh : VARCHAR(10)? ' Rohwert, wie erfasst
zeit_prozent_text_ergebnis_roh : VARCHAR(10)? ' Rohwert, wie erfasst
stechen_sr_info_text_ergebnis_roh : VARCHAR(4)?
geldpreis_betrag_ergebnis : DECIMAL?
nation_code_fuer_ergebnis : VARCHAR(3)?
platziert_flag : BOOLEAN
' Verweise auf spartenspezifische Ergebnisdetails '
# dressur_ergebnis_spezifika_id: UUID <<FK>>?
# springen_ergebnis_spezifika_id: UUID <<FK>>?
}
Startfolge "1" -- "0..1" Ergebnis_Zeile
package Sportfachliche_Details_Ergebnis {
entity DressurErgebnisSpezifika {
+ ergebnis_zeile_id : UUID <<PK>> <<FK>>
--
gesamt_wertnote : DECIMAL(5,3)?
gesamt_prozent : DECIMAL(5,2)?
' Hier könnten Details zu Richterbewertungen pro Lektion folgen (Array von JSONs oder eigene Entitäten)
}
entity SpringenErgebnisSpezifika {
+ ergebnis_zeile_id : UUID <<PK>> <<FK>>
--
stilnote_gesamt : DECIMAL(3,1)? ' Falls zutreffend
}
' Kind von SpringenErgebnisSpezifika oder direkt von Ergebnis_Zeile
entity SpringenUmlaufErgebnis {
+ umlauf_ergebnis_id : UUID <<PK>>
--
# springen_ergebnis_spezifika_id : UUID <<FK>> ' oder ergebnis_zeile_id
umlauf_oder_stechen_nr : INTEGER ' 1=Grundumlauf, 2=1.Stechen etc.
fehlerpunkte_hindernis : DECIMAL(4,2)?
fehlerpunkte_zeit : DECIMAL(4,2)?
zeit_benoetigt_sek : DECIMAL(5,2)?
stilnote_umlauf : DECIMAL(3,1)?
}
SpringenErgebnisSpezifika "1" -- "0..*" SpringenUmlaufErgebnis : hat Umläufe/Stechen
' ... Weitere Sparten (VS, RVK) analog ...
}
Ergebnis_Zeile "1" -- "0..1" Sportfachliche_Details_Ergebnis.DressurErgebnisSpezifika
Ergebnis_Zeile "1" -- "0..1" Sportfachliche_Details_Ergebnis.SpringenErgebnisSpezifika
}
' --- Ende Service Nennungsabwicklung ---
' #####################################################################
' ### Paketübergreifende Beziehungen (Auswahl) ###
' #####################################################################
' Veranstaltungsplanung <--> OeTO-Verwaltung
Service_Veranstaltungsplanung.Sportfachliche_Details_Pruefung.DressurPruefungSpezifika -- Service_OeTO_Verwaltung.Sportfachliche_Stammdaten : "nutzt Aufgabe"
Service_Veranstaltungsplanung.Sportfachliche_Details_Pruefung.DressurPruefungSpezifika -- Service_OeTO_Verwaltung.BewerbsKlasseDefinition : "hat Klasse"
Service_Veranstaltungsplanung.Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika -- Service_OeTO_Verwaltung.BewerbsKlasseDefinition : "hat Klasse"
Service_Veranstaltungsplanung.Pruefung_OEPS -- Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition : "hat ÖTO Kategorie"
Service_Veranstaltungsplanung.Turnier_OEPS -- Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition : "ist kategorisiert als"
' Veranstaltungsplanung <--> Sportler & Pferde Verwaltung (für Funktionäre)
Service_Veranstaltungsplanung.Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika -- Service_Sportler_Pferde_Verwaltung.DomPerson : "Parcoursdesigner"
' Nennungsabwicklung <--> Veranstaltungsplanung
Service_Nennungsabwicklung.Nennung -- Service_Veranstaltungsplanung.Pruefung_Abteilung : "für"
' Nennungsabwicklung <--> Sportler & Pferde Verwaltung
Service_Nennungsabwicklung.Nennung -- Service_Sportler_Pferde_Verwaltung.DomPerson : "durch Reiter"
Service_Nennungsabwicklung.Nennung -- Service_Sportler_Pferde_Verwaltung.DomPferd : "mit Pferd"
Service_Nennungsabwicklung.Nennung -- Service_Sportler_Pferde_Verwaltung.DomLizenz : "unter Lizenz (genutzte)"
' ZNS Import Logik (konzeptionell)
' Service_ZNS_Daten.Person_ZNS_Staging -> Service_Sportler_Pferde_Verwaltung.DomPerson
' Service_ZNS_Daten.Pferd_ZNS_Staging -> Service_Sportler_Pferde_Verwaltung.DomPferd
' Service_ZNS_Daten.Verein_ZNS_Staging -> Service_Sportler_Pferde_Verwaltung.DomVerein
' Service_ZNS_Daten.Person_ZNS_Staging (lizenzinfo_raw_oeps, etc.) -> Service_Sportler_Pferde_Verwaltung.DomLizenz (über Service_OeTO_Verwaltung.LizenzTypGlobal)
@enduml

View File

@ -0,0 +1,464 @@
@startuml
!theme vibrant
title Datenbankmodell ÖTO - Service-Orientierte Modulare Struktur (Stand: 19. Mai 2025, 10:53 Uhr)
' Diagramm-Optionen
skinparam linetype ortho
hide empty members
skinparam shadowing false
skinparam defaultFontName "Segoe UI"
skinparam defaultFontSize 9 ' Etwas kleiner für mehr Übersicht
skinparam roundCorner 10
allow_mixing
skinparam packageStyle rect
' --- Enums (mit Suffix E) ---
enum SparteE {
DRESSUR, SPRINGEN, VIELSEITIGKEIT, FAHREN, VOLTIGIEREN, WESTERN,
DISTANZ, ISLAND, PFERDESPORT_SPIEL, SONDERPRUEFUNG, SONSTIGE, UNBEKANNT
}
enum RegelwerkTypE {
OETO, FEI, SONSTIGE
}
enum PruefungsaufgabeNationE {
NATIONAL_OEPS, FEI, SONSTIGE
}
enum PruefungsaufgabeRichtverfahrenModusE {
GM, GT, NICHT_SPEZIFIZIERT
}
enum PruefungsaufgabeViereckE {
VIERECK_20x40, VIERECK_20x60, ANDERE, UNBEKANNT
}
enum ArtDesStechensE {
KEIN_STECHEN, FEHLER_ZEIT_NORMAL, FEHLER_ZEIT_AM3,
SIEGERUNDE_SR1_MIT_UEBERNAHME_GP, SIEGERUNDE_SR2_OHNE_UEBERNAHME_GP,
ZWEI_STECHEN_AM4, ZWEI_STECHEN_AM6, SONDERREGELUNG_AUSSCHREIBUNG
}
enum FunktionaerRolleE {
RICHTER, RICHTER_VORSITZ, RICHTER_BEI_C, RICHTER_AM_ABREITEPLATZ,
PARCOURSBAUER, PARCOURSBAU_ASSISTENT, STEWARD, TECHNISCHER_DELEGIERTER,
TURNIERLEITER, TURNIERBEAUFTRAGTER, TIERARZT_TURNIER, HUFSCHMIED_TURNIER,
MELD रात्रि, RECHENSTELLE, SPRECHER, REITERSPRECHER, ZEITNEHMER, SCHREIBER_RICHTER,
HELFER_PARCOURS, SONSTIGE_FUNKTION
}
enum RichterPositionE {
C, E, H, B, M, VORSITZ, RICHTERTURM, SONSTIGE_POSITION
}
enum DatenQuelleE {
OEPS_ZNS, MANUELL_NATIONAL, MANUELL_INTERNATIONAL, SYSTEM_GENERIERTR
}
enum NennungStatusE {
GEMELDET, MANUELL_ERFASST, BESTAETIGT, NACHGENANNT, BEZAHLT, STARTBERECHTIGT,
ABGEMELDET_REITER, ABGEMELDET_VERANSTALTER, STORNIERT_SYSTEM
}
enum BeginnzeitTypE {
FIX_UM, ANSCHLIESSEND, CA_UM, NACH_VORHERIGEM_BEWERB_ABTEILUNG
}
enum EventStatusE {
IN_PLANUNG, GENEHMIGT_VERANSTALTER, OEFFENTLICH_SICHTBAR, AKTIV, ABGESCHLOSSEN, ABGESAGT
}
enum PlatzTypE {
AUSTRAGUNG, VORBEREITUNG, LONGIEREN, SONSTIGES
}
enum SportfachStammdatenTypE {
DRESSURAUFGABE, HINDERNISTYP_SPRINGEN, WERTUNGSVERFAHREN_SPRINGEN,
WERTUNGSVERFAHREN_DRESSUR, RVK_PUNKTETABELLE, OETO_REGEL_TEXT, SONSTIGES
}
enum CupSerieTypE {
CUP, MEISTERSCHAFT_LAND, MEISTERSCHAFT_BUND, SERIE, SONDERWERTUNG
}
' #####################################################################
' ### Service OeTO-Verwaltung (Regeln, Lizenzen, Definitionen) ###
' #####################################################################
package "Service OeTO-Verwaltung" {
entity OETORegelReferenz {
+ oeto_regel_referenz_id : UUID <<PK>>
--
paragraph_nummer : VARCHAR
kapitel_titel : VARCHAR?
kurzbeschreibung_regel : TEXT?
oeto_version_datum : DATE
url_detail : VARCHAR?
regelwerk_typ : RegelwerkTypE
}
' Definiert Funktionärsqualifikationen
entity QualifikationsTyp {
+ qual_typ_code : VARCHAR(20) <<PK>> ' z.B. "R-DPF", "PB-S", "TD-NAT"
--
bezeichnung : VARCHAR
sparte : SparteE
oeto_regel_ref_id : UUID <<FK>>?
}
QualifikationsTyp -- "?" OETORegelReferenz
' Globale Lizenz-/Startkartendefinitionen
entity LizenzTypGlobal {
+ lizenz_typ_global_code : VARCHAR(10) <<PK>> ' z.B. "R1", "RS2", "F1", "S" (Startkarte)
--
bezeichnung : VARCHAR
sparte_primaer : SparteE?
kategorie_lizenz: VARCHAR ' z.B. "Reiterlizenz", "Startkarte", "Fahrerlizenz"
stufe: VARCHAR? ' z.B. "1", "2", "S"
beschreibung_berechtigung : TEXT?
oeto_regel_ref_id : UUID <<FK>>?
}
LizenzTypGlobal -- "?" OETORegelReferenz
entity AltersklasseDefinition {
+ altersklasse_code : VARCHAR(10) <<PK>> ' z.B. "JG", "U18", "YR", "ALLG"
--
bezeichnung : VARCHAR
min_alter : INTEGER?
max_alter : INTEGER?
geschlecht_filter : CHAR(1)?
oeto_regel_ref_id : UUID <<FK>>?
}
AltersklasseDefinition -- "?" OETORegelReferenz
' Für Dressuraufgaben, Richtverfahren etc.
entity Sportfachliche_Stammdaten {
+ stammdatum_id : UUID <<PK>>
--
typ : SportfachStammdatenTypE
code : VARCHAR ' z.B. "GA02/23", "A2_OETO204"
bezeichnung : VARCHAR
beschreibung_details_json : TEXT ' Strukturierte Details
sparte_zugehoerigkeit : SparteE
nation_gueltigkeit: PruefungsaufgabeNationE?
viereck_groesse: PruefungsaufgabeViereckE?
richtverfahren_modus: PruefungsaufgabeRichtverfahrenModusE?
istAktiv: Boolean
oeto_regel_ref_id : UUID <<FK>>?
}
Sportfachliche_Stammdaten -- "?" OETORegelReferenz
}
' #####################################################################
' ### Service ZNS-Daten (Staging/Rohdaten von OEPS) ###
' #####################################################################
package "Service ZNS-Daten (Staging)" {
entity Verein_ZNS_Staging {
+ oeps_vereins_nr : VARCHAR(4) <<PK>>
name : VARCHAR(50)
import_timestamp: TIMESTAMP
}
entity Person_ZNS_Staging {
+ oeps_satz_nr_person : VARCHAR(6) <<PK>>
--
familienname : VARCHAR(50)
vorname : VARCHAR(25)
geburtsdatum_text : VARCHAR(8)
geschlecht_code : CHAR(1)
nationalitaet_code : VARCHAR(3)
bundesland_code_oeps : VARCHAR(2)?
vereinsname_oeps_roh : VARCHAR(50)?
mitglied_nr_verein : VARCHAR(8)?
fei_id_person : VARCHAR(10)?
sperrliste_flag_oeps : CHAR(1)?
kader_flag_oeps : CHAR(1)?
telefon_roh : VARCHAR(21)?
reiterlizenz_roh : VARCHAR(4)?
startkarte_roh : CHAR(1)?
fahrlizenz_roh : VARCHAR(2)?
altersklasse_jugend_code_oeps : VARCHAR(2)?
altersklasse_jungerreiter_code_oeps : CHAR(1)?
jahr_letzte_zahlung_lizenz_oeps : INTEGER?
lizenzinfo_raw_oeps : VARCHAR(10)?
qualifikationen_raw_oeps: VARCHAR(30)? ' Aus RICHT01.dat
import_timestamp: TIMESTAMP
}
entity Pferd_ZNS_Staging {
+ oeps_satz_nr_pferd : VARCHAR(10) <<PK>>
--
oeps_kopf_nr : VARCHAR(4)?
name : VARCHAR(30)
lebensnummer : VARCHAR(9)?
geburtsjahr : INTEGER?
geschlecht_code : CHAR(1)?
farbe : VARCHAR(15)?
abstammung_vater_name_roh : VARCHAR(30)?
abstammung_info_roh : VARCHAR(15)?
oeps_verein_nr_pferd_roh : VARCHAR(4)?
verantwortliche_person_name_roh: VARCHAR(75)?
fei_pass_nr : VARCHAR(10)?
letzte_zahlung_pferdegebuehr_jahr : INTEGER?
import_timestamp: TIMESTAMP
}
}
' ####################################################################################
' ### Domänen Service: Sportler & Pferde Verwaltung (aus ZNS und manuell) ###
' ####################################################################################
package "Service Sportler & Pferde Verwaltung (Domäne)" {
entity DomPerson {
+ person_id: UUID <<PK>>
--
oeps_satz_nr: VARCHAR(6) <<UQ>>?
nachname: VARCHAR
vorname: VARCHAR
geburtsdatum: DATE?
geschlecht: GeschlechtE?
nationalitaet_code: VARCHAR(3)?
fei_id: VARCHAR(10)?
telefon: VARCHAR?
email: VARCHAR?
stamm_verein_id: UUID <<FK>>?
ist_gesperrt: BOOLEAN
sperr_grund: TEXT?
daten_quelle: DatenQuelleE
ist_aktiv: BOOLEAN
}
entity DomPferd {
+ pferd_id: UUID <<PK>>
--
oeps_satz_nr_pferd: VARCHAR(10) <<UQ>>?
oeps_kopf_nr: VARCHAR(4)?
name: VARCHAR
lebensnummer: VARCHAR?
geburtsjahr: INTEGER?
geschlecht_pferd: CHAR(1)?
besitzer_person_id: UUID <<FK>>?
verantwortlicher_person_id: UUID <<FK>>?
heimat_verein_id: UUID <<FK>>?
daten_quelle: DatenQuelleE
ist_aktiv: BOOLEAN
}
entity DomVerein {
+ verein_id: UUID <<PK>>
--
oeps_vereins_nr: VARCHAR(4) <<UQ>>
name: VARCHAR
kuerzel: VARCHAR?
bundesland_code: VARCHAR(2)?
}
' Zugeordnete Lizenz/Quali einer Person
entity DomLizenz {
+ lizenz_id: UUID <<PK>>
--
person_id: UUID <<FK>>
lizenz_typ_global_code: VARCHAR(10) <<FK>> ' Verweis auf Service_OeTO_Verwaltung.LizenzTypGlobal
gueltig_bis_jahr: INTEGER?
ist_aktiv_bezahlt_oeps: BOOLEAN
}
DomPerson "1" -- "0..*" DomLizenz
DomLizenz -- "1" Service_OeTO_Verwaltung.LizenzTypGlobal
DomPerson "0..1" -- "1" DomVerein : "hat Stammverein"
DomPferd "0..1" -- "1" DomPerson : "hat Besitzer"
DomPferd "0..1" -- "1" DomPerson : "hat Verantwortlichen"
DomPferd "0..1" -- "1" DomVerein : "hat Heimatverein"
}
' #####################################################################
' ### Service Veranstaltungsplanung (Events, Turniere, Prüfungen) ###
' #####################################################################
package "Service Veranstaltungsplanung" {
entity VeranstaltungsRahmen {
+ veranst_rahmen_id : UUID <<PK>>
name : VARCHAR
datum_von_gesamt : DATE
datum_bis_gesamt : DATE
hauptveranstalter_verein_id : UUID <<FK>>? ' Verweis auf DomVerein
ort_text: VARCHAR
status: EventStatusE
}
entity Turnier_OEPS {
+ turnier_id : UUID <<PK>>
veranst_rahmen_id : UUID <<FK>>
oeps_turnier_nr : VARCHAR(5) <<UQ>>
name_zusatz : VARCHAR?
datum_von_turnier : DATE
datum_bis_turnier : DATE
oeto_kategorie_definition_ids: List<UUID> ' FKs zu Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition
regelwerk_typ : RegelwerkTypE
hauptsparte: SparteE
}
' Entspricht BewerbBasis
entity Pruefung_OEPS {
+ pruefung_db_id : UUID <<PK>>
turnier_id : UUID <<FK>>
oeps_bewerb_nr_anzeige : INTEGER ' Deine nummerInAusschreibung
name_text_uebergeordnet : VARCHAR
sparte : SparteE
oeps_kategorie_definition_id : UUID <<FK>> ' FK zu Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition
' Verweise auf spartenspezifische Details (1:1)
' dressur_spezifika_id: UUID <<FK>>?
' springen_spezifika_id: UUID <<FK>>?
}
entity Pruefung_Abteilung {
+ pruefung_abteilung_db_id : UUID <<PK>>
pruefung_db_id : UUID <<FK>> ' FK zu Pruefung_OEPS
abteilungs_kennzeichen : VARCHAR ' z.B. "1", "A"
bezeichnung_abteilung : VARCHAR?
' ... strukturierte Teilungskriterien ...
}
entity Meisterschaft_Cup_Serie {
+ mcs_id : UUID <<PK>>
name : VARCHAR
typ : CupSerieTypE
jahr : INTEGER
sparte : SparteE
}
entity MCS_Wertungspruefung {
mcs_id : UUID <<PK>> <<FK>>
pruefung_abteilung_db_id : UUID <<PK>> <<FK>>
faktor_fuer_wertung : DECIMAL?
}
entity Platz {
+ platz_id: UUID <<PK>>
name: VARCHAR
typ: PlatzTypE
'.. berichtFelder ..
}
entity Turnier_hat_Platz {
turnier_id: UUID <<PK>> <<FK>>
platz_id: UUID <<PK>> <<FK>>
verwendungszweck: VARCHAR?
}
package "Sportfachliche Details Pruefung" {
entity DressurPruefungSpezifika {
+ pruefung_db_id : UUID <<PK>> <<FK>> ' 1:1 zu Pruefung_OEPS
aufgabe_stammdatum_id : UUID <<FK>> ' Zu Service_OeTO_Verwaltung.Sportfachliche_Stammdaten
klasse_definition_id : UUID <<FK>>? ' Zu Service_OeTO_Verwaltung.BewerbsKlasseDefinition
richtverfahren_stammdatum_id: UUID <<FK>>? ' Zu Service_OeTO_Verwaltung.Sportfachliche_Stammdaten
viereck_groesse_code : PruefungsaufgabeViereckE
' geplanteRichterPositionen: List<RichterPositionE> ' oder über BewerbFunktionaerZuordnung
}
entity SpringPruefungSpezifika {
+ pruefung_db_id : UUID <<PK>> <<FK>> ' 1:1 zu Pruefung_OEPS
klasse_definition_id : UUID <<FK>>?
richtverfahren_stammdatum_id: UUID <<FK>>?
art_des_stechens : ArtDesStechensE?
'.. parcours infos ..
}
}
VeranstaltungsRahmen "1" -- "0..*" Turnier_OEPS
Turnier_OEPS "1" -- "0..*" Pruefung_OEPS
Pruefung_OEPS "1" -- "1..*" Pruefung_Abteilung
Pruefung_OEPS "1" o-- "0..1" Sportfachliche_Details_Pruefung.DressurPruefungSpezifika
Pruefung_OEPS "1" o-- "0..1" Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika
Meisterschaft_Cup_Serie "1" -- "0..*" MCS_Wertungspruefung
Pruefung_Abteilung "1" -- "0..*" MCS_Wertungspruefung
Turnier_OEPS "1" -- "0..*" Turnier_hat_Platz
Platz "1" -- "0..*" Turnier_hat_Platz
Sportfachliche_Details_Pruefung.DressurPruefungSpezifika -- Service_OeTO_Verwaltung.Sportfachliche_Stammdaten
Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika -- Service_OeTO_Verwaltung.Sportfachliche_Stammdaten
Pruefung_OEPS -- Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition
Turnier_OEPS -- Service_OeTO_Verwaltung.BewerbsKategorieOetoDefinition
}
' #####################################################################
' ### Service Nennungsabwicklung (Nennungen, Startlisten, Ergebnisse) ###
' #####################################################################
package "Service Nennungsabwicklung" {
entity Nennung {
+ nennung_id : UUID <<PK>>
pruefung_abteilung_db_id : UUID <<FK>>
teilnehmer_person_id : UUID <<FK>> ' Verweis auf DomPerson
genanntes_pferd_id : UUID <<FK>> ' Verweis auf DomPferd
genutzte_lizenz_id: UUID <<FK>>? ' Verweis auf DomLizenz
nennungs_zeitpunkt : TIMESTAMP
status_nennung : NennungStatusE
kopf_nr_pferd_fuer_nennung : VARCHAR(4)?
startgeld_bezahlt: BOOLEAN
pferdepass_kontrolliert: BOOLEAN
}
entity NennungsTeilnehmerSnapshot {
+ snapshot_id: UUID <<PK>>
nennung_id: UUID <<FK>>
' Gesnapshotete Daten '
person_nachname_snapshot: VARCHAR
pferd_name_snapshot: VARCHAR
}
Nennung "1" -- "0..1" NennungsTeilnehmerSnapshot
entity Startfolge {
+ startfolge_id: UUID <<PK>>
nennung_id: UUID <<FK>>
start_nummer_display: INTEGER
start_zeit_geplant: TIMESTAMP?
s4_kader_flag: BOOLEAN
}
Nennung "1" -- "0..1" Startfolge
entity Ergebnis_Zeile {
+ ergebnis_zeile_id : UUID <<PK>>
startfolge_id : UUID <<FK>>
platz : INTEGER?
' Verweise auf spartenspezifische Ergebnisdetails '
}
Startfolge "1" -- "0..1" Ergebnis_Zeile
package "Sportfachliche Details Ergebnis" {
entity DressurErgebnisSpezifika {
+ ergebnis_zeile_id : UUID <<PK>> <<FK>>
gesamt_wertnote : DECIMAL(5,3)?
gesamt_prozent : DECIMAL(5,2)?
}
entity SpringenErgebnisSpezifika {
+ ergebnis_zeile_id : UUID <<PK>> <<FK>>
stilnote_gesamt : DECIMAL(3,1)?
}
entity SpringenUmlaufErgebnis {
+ umlauf_ergebnis_id : UUID <<PK>>
springen_ergebnis_spezifika_id : UUID <<FK>>
umlauf_oder_stechen_nr : INTEGER
fehlerpunkte_hindernis : DECIMAL(4,2)?
fehlerpunkte_zeit : DECIMAL(4,2)?
zeit_benoetigt_sek : DECIMAL(5,2)?
}
SpringenErgebnisSpezifika "1" -- "0..*" SpringenUmlaufErgebnis
}
Ergebnis_Zeile "1" -- "0..1" Sportfachliche_Details_Ergebnis.DressurErgebnisSpezifika
Ergebnis_Zeile "1" -- "0..1" Sportfachliche_Details_Ergebnis.SpringenErgebnisSpezifika
}
' #####################################################################
' ### Paketübergreifende Beziehungen (Auswahl) ###
' #####################################################################
Service_Veranstaltungsplanung.VeranstaltungsRahmen -- Service_Sportler_Pferde_Verwaltung.DomVerein : "veranstaltet von"
Service_Veranstaltungsplanung.Turnier_OEPS -- Service_Veranstaltungsplanung.VeranstaltungsRahmen
Service_Veranstaltungsplanung.Pruefung_OEPS -- Service_Veranstaltungsplanung.Turnier_OEPS
Service_Veranstaltungsplanung.Pruefung_Abteilung -- Service_Veranstaltungsplanung.Pruefung_OEPS
Service_Veranstaltungsplanung.Sportfachliche_Details_Pruefung.SpringenPruefungSpezifika -- Service_Sportler_Pferde_Verwaltung.DomPerson : "Parcoursdesigner"
Service_Nennungsabwicklung.Nennung -- Service_Veranstaltungsplanung.Pruefung_Abteilung
Service_Nennungsabwicklung.Nennung -- Service_Sportler_Pferde_Verwaltung.DomPerson : "Reiter"
Service_Nennungsabwicklung.Nennung -- Service_Sportler_Pferde_Verwaltung.DomPferd : "Pferd"
Service_Nennungsabwicklung.Nennung -- Service_Sportler_Pferde_Verwaltung.DomLizenz : "genutzte Lizenz"
' Beziehungen für Funktionärsplanung (noch konzeptionell)
entity FunktionaerEinsatzPlanung {
+ einsatz_plan_id: UUID <<PK>>
# event_id: UUID <<FK>>
# turnier_id: UUID <<FK>>?
# pruefung_abteilung_id: UUID <<FK>>?
# funktionaer_person_id: UUID <<FK zu DomPerson>>
rolle: FunktionaerRolleE
position_richter: RichterPositionE?
start_zeit: TIMESTAMP
ende_zeit: TIMESTAMP
}
Service_Veranstaltungsplanung.VeranstaltungsRahmen -- "0..*" FunktionaerEinsatzPlanung
Service_Sportler_Pferde_Verwaltung.DomPerson -- "0..*" FunktionaerEinsatzPlanung
@enduml

View File

@ -1,371 +0,0 @@
@startuml
' Diagramm-Optionen
skinparam linetype ortho
hide empty members
skinparam shadowing false
skinparam defaultFontName "Segoe UI"
skinparam defaultFontSize 11
skinparam roundCorner 10
allow_mixing
' --- Enums (Auswahl, können bei Bedarf erweitert werden) ---
enum SparteEnum {
DRESSUR
SPRINGEN
VIELSEITIGKEIT
FAHREN
VOLTIGIEREN
WESTERN
DISTANZ
ISLAND
PFERDESPORT_SPIEL
SONDERPRUEFUNG
SONSTIGE
UNBEKANNT
}
enum RegelwerkTypEnum {
OETO
FEI
SONSTIGE
}
enum PruefungsaufgabeNationEnum {
NATIONAL_OEPS
FEI
SONSTIGE
}
enum PruefungsaufgabeRichtverfahrenModusEnum {
GM
GT
NICHT_SPEZIFIZIERT
}
enum PruefungsaufgabeViereckEnum {
VIERECK_20x40
VIERECK_20x60
ANDERE
UNBEKANNT
}
enum ArtDesStechensEnum {
KEIN_STECHEN
FEHLER_ZEIT_NORMAL
FEHLER_ZEIT_AM3
SIEGERUNDE_SR1_MIT_UEBERNAHME_GP
SIEGERUNDE_SR2_OHNE_UEBERNAHME_GP
ZWEI_STECHEN_AM4
ZWEI_STECHEN_AM6
SONDERREGELUNG_AUSSCHREIBUNG
}
enum FunktionaerRolleEnum {
RICHTER
PARCOURS_BAUER
PARCOURSBAU_ASSISTENT
STEWARD
TURNIERLEITER
TURNIERBEAUFTRAGTER
TIERARZT
HUFSCHMIED
SPRECHER
REITERSPRECHER
SONSTIGE
}
enum RichterPositionEnum {
C
E
H
B
M
VORSITZ
SONSTIGE
}
enum DatenQuelleEnum {
OEPS_ZNS
MANUELL_NATIONAL
MANUELL_INTERNATIONAL
SYSTEM_GENERIERTR
}
enum NennungStatusEnum {
GEMELDET
MANUELL_ERFASST
BESTAETIGT
NACHGENANNT
BEZAHLT
STARTBERECHTIGT
ABGEMELDET_REITER
ABGEMELDET_VERANSTALTER
STORNIERT_SYSTEM
}
enum BeginnzeitTypEnum {
FIX_UM
ANSCHLIESSEND
CA_UM
NACH_VORHERIGEM_BEWERB_ABTEILUNG
}
enum EventStatusEnum {
IN_PLANUNG
GENEHMIGT_VERANSTALTER
OEFFENTLICH_SICHTBAR
AKTIV
ABGESCHLOSSEN
ABGESAGT
}
enum PlatzTypEnum {
AUSTRAGUNG
VORBEREITUNG
LONGIEREN
SONSTIGES
} ' Hinzugefügt für die Platz-Entität
' --- Entitäten für verwaltbare Auswahllisten (Lookup Tables / Master Data) ---
entity "Pruefungsaufgabe" {
+ id: UUID (PK)
--
kuerzel: String
nameLang: String
sparte: SparteEnum
nation: PruefungsaufgabeNationEnum
richtverfahrenModusDefault: PruefungsaufgabeRichtverfahrenModusEnum?
viereckGroesseDefault: PruefungsaufgabeViereckEnum?
istAktiv: Boolean
}
entity "Richtverfahren" {
+ id: UUID (PK)
--
code: String
bezeichnung: String
sparte: SparteEnum
oetoParagraphVerweis: String?
istAktiv: Boolean
}
entity "BewerbsKlasseDefinition" as BewerbsKlasseDef {
+ id: UUID (PK)
--
kuerzel: String
bezeichnung: String
sparte: SparteEnum
istAktiv: Boolean
}
entity "BewerbsKategorieOetoDefinition" as BewerbsKatOetoDef {
+ id: UUID (PK)
--
kuerzel: String
bezeichnung: String
sparte: SparteEnum
istAktiv: Boolean
}
' --- Kern-Entitäten ---
entity "Event" {
+ id: UUID (PK)
--
bezeichnung: String
datumVon: LocalDate
datumBis: LocalDate
veranstalterVereinId: UUID (FK)?
}
entity "Turnier" {
+ id: UUID (PK)
--
eventId: UUID (FK)
oepsTurnierNr: String
titel: String
sparte: SparteEnum
oetoKategorieIds: List<UUID> ' FKs zu BewerbsKatOetoDef
regelwerkTyp: RegelwerkTypEnum
datumVon: LocalDate
datumBis: LocalDate
}
entity "BewerbBasis" {
+ id: UUID (PK)
--
turnierId: UUID (FK)
nummerInAusschreibung: String
uebergeordneteBezeichnung: String
sparte: SparteEnum
klasseId: UUID (FK zu BewerbsKlasseDef.id)?
oetoKategorieId: UUID (FK zu BewerbsKatOetoDef.id)
dressurDetailsId: UUID (FK, optional)
springDetailsId: UUID (FK, optional)
}
entity "DressurBewerbDetails" {
+ bewerbBasisId: UUID (PK, FK)
--
pruefungsaufgabeId: UUID (FK)
richtverfahrenId: UUID (FK)
viereckGroesse: PruefungsaufgabeViereckEnum
}
entity "SpringBewerbDetails" {
+ bewerbBasisId: UUID (PK, FK)
--
richtverfahrenId: UUID (FK)
artDesStechens: ArtDesStechensEnum?
parcoursskizzeUrl: String?
}
entity "Abteilung" {
+ id: UUID (PK)
--
bewerbBasisId: UUID (FK)
abteilungsKennzeichen: String
bezeichnungOeffentlich: String?
}
entity "Person" {
+ id: UUID (PK)
--
nachname: String
vorname: String
oepsSatzNr: String?
datenQuelle: DatenQuelleEnum
stammVereinId: UUID (FK)?
}
entity "Pferd" {
+ id: UUID (PK)
--
name: String
oepsKopfNr: String?
datenQuelle: DatenQuelleEnum
besitzerPersonId: UUID (FK)?
}
entity "Verein" {
+ id: UUID (PK)
--
oepsVereinsNr: String
name: String
}
entity "Lizenz" {
+ id: UUID (PK)
--
personId: UUID (FK)
lizenzTypOepsCode: String
bezeichnung: String
}
entity "Nennung" {
+ id: UUID (PK)
--
turnierId: UUID (FK)
abteilungId: UUID (FK)
personId: UUID (FK)
pferdId: UUID (FK)
status: NennungStatusEnum
}
entity "Startfolge" {
+ id: UUID (PK)
--
nennungId: UUID (FK)
abteilungId: UUID (FK)
startNummer: Int
startZeitGeplant: LocalDateTime?
pferdepassKontrolliert: Boolean
}
entity "Ergebnis" {
+ id: UUID (PK)
--
startfolgeId: UUID (FK)
platzierung: Int?
}
entity "Platz" {
+ id: UUID (PK)
--
name: String
typ: PlatzTypEnum
}
entity "PlatzZuordnungTurnier" as PlatzZuordnung {
turnierId: UUID (FK)
platzId: UUID (FK)
(PK: turnierId, platzId)
}
entity "Artikel" {
+ id: UUID (PK)
--
bezeichnung: String
standardPreis: BigDecimal?
}
entity "TurnierArtikel" {
+ id: UUID (PK)
--
turnierId: UUID (FK)
artikelId: UUID (FK)
preis: BigDecimal
}
entity "FunktionaerEinsatz" {
+ id: UUID (PK)
--
personId: UUID (FK)
eventId: UUID (FK)
turnierId: UUID (FK)?
abteilungId: UUID (FK)?
rolle: FunktionaerRolleEnum
positionRichter: RichterPositionEnum?
geplanterStart: LocalDateTime
geplantesEnde: LocalDateTime
}
' --- Beziehungen ---
Event "1" -- "0..*" Turnier
Turnier "1" -- "0..*" BewerbBasis
BewerbBasis "1" -- "0..1" DressurDetails
BewerbBasis "1" -- "0..1" SpringDetails
BewerbBasis "1" -- "1..*" Abteilung
Turnier "1" -- "0..*" Nennung
Abteilung "1" -- "0..*" Nennung
Person "1" -- "0..*" Nennung
Pferd "1" -- "0..*" Nennung
Nennung "1" -- "0..1" Startfolge
Startfolge "1" -- "0..1" Ergebnis
Person "1" -- "0..*" Lizenz
Verein "1" -- "0..*" Person : Stammverein
Person "1" -- "0..*" Pferd : Besitzer
Turnier "1" -- "0..*" TurnierArtikel
Artikel "1" -- "0..*" TurnierArtikel
Turnier "1" -- "0..*" PlatzZuordnung
Platz "1" -- "0..*" PlatzZuordnung
Event "1" -- "0..*" FunktionaerEinsatz
Person "1" -- "0..*" FunktionaerEinsatz
Turnier -- FunktionaerEinsatz
Abteilung -- FunktionaerEinsatz
DressurDetails "1" -- "1" Pruefungsaufgabe
DressurDetails "1" -- "1" Richtverfahren
SpringDetails "1" -- "1" Richtverfahren
BewerbBasis "1" -- "1" BewerbsKlasseDef
BewerbBasis "1" -- "1" BewerbsKatOetoDef
Turnier "1" -- "0..*" BewerbsKatOetoDef : "verwendet ÖTO Kategorien"
@enduml

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 KiB

View File

@ -1,68 +0,0 @@
@startuml
enum KurzbezeichnungTurnierBewerbE {
CDN ... Dressur
CSN ... Springen
CCN ... Vielseitigkeit
CAN ... Fahren
CVN ... Voltigieren
CEN ... Distanzreiten
CHNI ... Turniere für Islandpferde
CHNV ... Reitervierkampf
TREC ... Orientierungsreiten
CPEDN ... Pferdesportler mit Behinderung Dressur
CPEAN ... Pferdesportler mit Behinderung Fahren
CMGN ... Mounted Games
CWEN ... Working Equitation
}
note top of KurzbezeichnungTurnierBewerbE
Die Gliederung nach Sparten und die Kurzbezeichnung von Tur-
nieren und Bewerben, die nach der ÖTO ausgetragen werden,
erfolgt in Übereinstimmung mit der FEI. Die angegebenen
Bezeichnungen gelten für nationale Turniere;
end note
enum TeilnehmerkreisesE {
J ... JG, JN und/oder YR
P ... Ponys
N ... Noriker
H ... Haflinger
L ... Ländliche Reiter auf Warmblutpferden
A ... Vollblutaraberbewerbe
K ... Kaltblut
D ... Damensattel
}
note top of TeilnehmerkreisesE
Die Einschränkungen des Teilnehmerkreises für Turniere oder
einzelne Bewerbe auf die folgenden Reiter oder Pferde durch
die Ausschreibung sind in der Bezeichnung durch Anhängen
des angegebenen Buchstaben zu berücksichtigen:
end note
enum TurnierGliederungE {
A* ... -A*
A ... -A
B* ... -B*
B ... -B
C ... -C
C-NEU ... -C-NEU
}
note top of TurnierGliederungE
Zur Gliederung nach den Anforderungen werden nationale Tur-
niere in die Kategorien A*, A, B*, B, C und C-NEU eingeteilt. Der
Kurzbezeichnung gemäß Abs. 2 und 3 ist zur Kennzeichnung
entweder -A*, -A, -B*, -B, -C oder -C-NEU anzuhängen.
end note
entity "Ergebnis" {
+ id: UUID (PK)
--
startfolgeId: UUID (FK)
platzierung: Int?
}
@enduml

View File

@ -2,6 +2,36 @@ package at.mocode.shared.enums
import kotlinx.serialization.Serializable
@Serializable
enum class RegelwerkTypE { OETO, FEI, SONSTIGE }
@Serializable
enum class DatenQuelleE { OEPS_ZNS, MANUELL }
@Serializable
enum class VerbandE { OEPS, FEI, SONSTIGE }
@Serializable
enum class LizenzKategorieE { REITERLIZENZ, FAHRERLIZENZ, STARTKARTE }
@Serializable
enum class SportfachStammdatenTypE { DRESSURAUFGABE, WERTUNGSVERFAHREN_SPRINGEN, WERTUNGSVERFAHREN_DRESSUR, BEWERBSKLASSE, BEWERBSKATEGORIE_OETO }
@Serializable
enum class PruefungsViereckE { VIERECK_20X40, VIERECK_20X60 }
@Serializable
enum class RichtverfahrenModusE { GM, GT }
@Serializable
enum class GeschlechtE { M, W }
@Serializable
enum class PferdeGeschlechtE {
HENGST, STUTE, WALLACH, UNBEKANNT
}
@Serializable
enum class VeranstalterTyp { VEREIN, FIRMA, PRIVATPERSON, SONSTIGE, UNBEKANNT }
@Serializable
@ -9,7 +39,7 @@ enum class PlatzTyp { AUSTRAGUNG, VORBEREITUNG, LONGIEREN, SONSTIGES }
@Serializable
enum class NennungsArt { OEPS_ZNS, EIGENES_ONLINE, DIREKT_VERANSTALTER_EMAIL, DIREKT_VERANSTALTER_TELEFON, DIREKT_VERANSTALTER_WHATSAPP, SONSTIGE }
@Serializable
enum class Sparte { DRESSUR, SPRINGEN, VIELSEITIGKEIT, FAHREN, VOLTIGIEREN, WESTERN, DISTANZ, ISLAND, PFERDESPORT_SPIEL, BASIS, KOMBINIERT, SONSTIGES }
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

View File

@ -1,7 +1,7 @@
package at.mocode.shared.model
import at.mocode.shared.enums.BeginnzeitTyp
import at.mocode.shared.enums.Sparte
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.*
import com.benasher44.uuid.Uuid
import com.benasher44.uuid.uuid4
@ -24,7 +24,7 @@ data class Bewerb(
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 sparteE: SparteE,
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.

View File

@ -1,6 +1,6 @@
package at.mocode.shared.model
import at.mocode.shared.enums.Sparte
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
@ -16,7 +16,7 @@ data class Pruefungsaufgabe(
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 sparteE: SparteE, // 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

View File

@ -1,6 +1,6 @@
package at.mocode.shared.model
import at.mocode.shared.enums.Sparte
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.KotlinInstantSerializer
import at.mocode.shared.serializers.UuidSerializer
import com.benasher44.uuid.Uuid
@ -15,7 +15,7 @@ data class Richtverfahren(
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 sparteE: SparteE,
var basisRegelnBeschreibungKurz: String?, // Kurze Beschreibung oder Hauptmerkmal
var oetoParagraphVerweis: String?, // z.B. "ÖTO §204 A2", "ÖTO §104"
var hatStechen: Boolean = false,

View File

@ -0,0 +1,98 @@
import at.mocode.shared.enums.DatenQuelleE
import at.mocode.shared.enums.GeschlechtE
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 Person (Reiter, Funktionär, Kontaktperson etc.)
* im Domänenmodell der Anwendung.
*
* Die Daten können aus dem OEPS ZNS-Import (`Person_ZNS_Staging`) stammen
* oder manuell im System angelegt werden.
*
* @property personId Eindeutiger interner Identifikator für diese Person (UUID).
* @property oepsSatzNr Die offizielle 6-stellige OEPS-Satznummer der Person, falls vorhanden. Eindeutig.
* @property nachname Familienname der Person.
* @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 nationalitaetLandId Fremdschlüssel zur `LandDefinition` für die Nationalität.
* @property feiId Optionale FEI-Identifikationsnummer der Person.
* @property telefon Private oder geschäftliche Telefonnummer.
* @property email Private oder geschäftliche E-Mail-Adresse.
* @property strasse Straße und Hausnummer der Hauptadresse.
* @property plz Postleitzahl der Hauptadresse.
* @property ort Ortschaft der Hauptadresse.
* @property adresszusatzZusatzinfo Weitere Adressinformationen.
* @property stammVereinId Optionale Verknüpfung zum `DomVerein` (Stammverein der Person).
* @property mitgliedsNummerBeiStammVerein Mitgliedsnummer der Person beim Stammverein.
* @property istGesperrt Gibt an, ob die Person laut OEPS oder intern gesperrt ist.
* @property sperrGrund Begründung für eine eventuelle Sperre.
* @property altersklasseOepsCodeRaw Der Roh-Code für die Altersklasse aus dem ZNS-Import (z.B. "JG", "JR", "25").
* Dient zur Ableitung oder als Information.
* @property istJungerReiterOepsFlag Ob die Person im ZNS als "Junger Reiter" ("Y") gekennzeichnet ist.
* @property kaderStatusOepsRaw Kaderkennzeichen aus dem ZNS-Import.
* @property datenQuelle Gibt die Herkunft dieses Datensatzes an (z.B. OEPS_ZNS, MANUELL).
* @property istAktiv Gibt an, ob dieser Personendatensatz aktuell aktiv ist.
* @property notizenIntern Interne Anmerkungen oder Notizen zu dieser Person.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class DomPerson(
@Serializable(with = UuidSerializer::class)
val personId: Uuid = uuid4(),
var oepsSatzNr: String?, // Wird aus Person_ZNS_Staging.oepsSatzNrPerson befüllt, UNIQUE
var nachname: String, // Wird aus Person_ZNS_Staging.familiennameRoh befüllt
var vorname: String, // Wird aus Person_ZNS_Staging.vornameRoh befüllt
var titel: String? = null, // Manuelle Eingabe oder ggf. später aus ZNS falls vorhanden
@Serializable(with = KotlinLocalDateSerializer::class)
var geburtsdatum: LocalDate? = null, // Konvertiert aus Person_ZNS_Staging.geburtsdatumTextRoh
var geschlecht: 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
var feiId: String? = null, // Wird aus Person_ZNS_Staging.feiIdPersonRoh befüllt
var telefon: String? = null, // Wird aus Person_ZNS_Staging.telefonRoh befüllt
var email: String? = null, // Manuelle Eingabe, nicht in LIZENZ01.dat
// Adresse (manuelle Eingabe, nicht primär in LIZENZ01.dat für Person direkt)
var strasse: String? = null,
var plz: String? = null,
var ort: String? = null,
var adresszusatzZusatzinfo: String? = null,
@Serializable(with = UuidSerializer::class)
var stammVereinId: Uuid? = null, // Aufgelöst aus Person_ZNS_Staging.vereinsnameOepsRoh & bundeslandCodeOepsRoh via DomVerein
var mitgliedsNummerBeiStammVerein: String? = null, // Wird aus Person_ZNS_Staging.mitgliedNrVereinRoh befüllt
var istGesperrt: Boolean = false, // Konvertiert aus Person_ZNS_Staging.sperrlisteFlagOepsRoh ("S" -> true)
var sperrGrund: String? = null, // Manuelle Eingabe
var altersklasseOepsCodeRaw: String? = null, // Speichert Roh-Code "JG", "JR", "25"
var istJungerReiterOepsFlag: Boolean = false, // true wenn Roh-Code "Y"
var kaderStatusOepsRaw: String? = null, // Speichert Roh-Code (aktuell meist BLANK)
var datenQuelle: DatenQuelleE = DatenQuelleE.MANUELL,
var istAktiv: Boolean = true,
var notizenIntern: String? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,84 @@
import at.mocode.shared.enums.DatenQuelleE
import at.mocode.shared.enums.PferdeGeschlechtE // NEUES ENUM
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 ein Pferd im Domänenmodell der Anwendung.
*
* Die Daten für ein Pferd können aus dem OEPS ZNS-Import (`Pferd_ZNS_Staging`)
* stammen oder manuell im System angelegt werden (z.B. für ausländische Pferde oder
* Pferde ohne OEPS-Registrierung, die z.B. in lizenzfreien Bewerben starten).
*
* @property pferdId Eindeutiger interner Identifikator für dieses Pferd (UUID).
* @property oepsSatzNrPferd Die offizielle 10-stellige OEPS-Satznummer des Pferdes, falls vorhanden. Eindeutig.
* @property oepsKopfNr Die offizielle 4-stellige OEPS-Kopfnummer des Pferdes, falls vorhanden.
* @property name Der Name des Pferdes.
* @property lebensnummer Die Lebensnummer des Pferdes (UELN), falls bekannt.
* @property feiPassNr Die FEI-Passnummer des Pferdes, falls vorhanden.
* @property geburtsjahr Geburtsjahr des Pferdes.
* @property geschlecht Geschlecht des Pferdes.
* @property farbe Farbe des Pferdes.
* @property rasse Rasse des Pferdes.
* @property abstammungVaterName Name des Vaters.
* @property abstammungMutterName Name der Mutter.
* @property abstammungMutterVaterName Name des Muttervaters.
* @property abstammungZusatzInfo Allgemeine Abstammungsinformationen aus dem ZNS (Feld "ABSTAMMUNG").
* @property besitzerPersonId Optionale Verknüpfung zur `DomPerson` (Besitzer).
* @property verantwortlichePersonId Optionale Verknüpfung zur `DomPerson` (Verantwortliche Person lt. ZNS).
* @property heimatVereinId Optionale Verknüpfung zum `DomVerein` (Heimatverein des Pferdes lt. ZNS).
* @property letzteZahlungPferdegebuehrJahrOeps Jahr der letzten Zahlung der OEPS-Pferdegebühr.
* @property stockmassCm Stockmaß des Pferdes in cm.
* @property datenQuelle Gibt die Herkunft dieses Datensatzes an.
* @property istAktiv Gibt an, ob dieser Pferdedatensatz aktuell aktiv ist.
* @property notizenIntern Interne Anmerkungen oder Notizen zu diesem Pferd.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class DomPferd(
@Serializable(with = UuidSerializer::class)
val pferdId: Uuid = uuid4(),
var oepsSatzNrPferd: String?, // Aus Pferd_ZNS_Staging.oepsSatzNrPferd, UNIQUE
var oepsKopfNr: String?, // Aus Pferd_ZNS_Staging.oepsKopfNrRoh
var name: String, // Aus Pferd_ZNS_Staging.nameRoh
var lebensnummer: String? = null, // Aus Pferd_ZNS_Staging.lebensnummerRoh
var feiPassNr: String? = null, // Aus Pferd_ZNS_Staging.feiPassNrRoh
var geburtsjahr: Int? = null, // Konvertiert aus Pferd_ZNS_Staging.geburtsjahrRoh
var geschlecht: PferdeGeschlechtE? = null, // Konvertiert aus Pferd_ZNS_Staging.geschlechtCodeRoh
var farbe: String? = null, // Aus Pferd_ZNS_Staging.farbeRoh
var rasse: String? = null, // Nicht direkt in PFERDE01.dat, aber oft bekannt/wichtig
var abstammungVaterName: String? = null, // Aus Pferd_ZNS_Staging.abstammungVaterNameRoh
var abstammungMutterName: String? = null, // Manuell oder andere Quelle
var abstammungMutterVaterName: String? = null, // Manuell oder andere Quelle
var abstammungZusatzInfo: String? = null, // Aus Pferd_ZNS_Staging.abstammungInfoRoh
@Serializable(with = UuidSerializer::class)
var besitzerPersonId: Uuid? = null, // Muss aufgelöst werden (Name in Pferd_ZNS_Staging.verantwortlichePersonNameRoh, oder separate Besitzerinfo?)
@Serializable(with = UuidSerializer::class)
var verantwortlichePersonId: Uuid? = null, // Muss aufgelöst werden aus Pferd_ZNS_Staging.verantwortlichePersonNameRoh
@Serializable(with = UuidSerializer::class)
var heimatVereinId: Uuid? = null, // Muss aufgelöst werden aus Pferd_ZNS_Staging.oepsVereinNrPferdRoh via DomVerein
var letzteZahlungPferdegebuehrJahrOeps: Int? = null, // Konvertiert aus Pferd_ZNS_Staging.letzteZahlungPferdegebuehrJahrRoh
var stockmassCm: Int? = null, // Nicht in PFERDE01.dat
var datenQuelle: DatenQuelleE = DatenQuelleE.MANUELL,
var istAktiv: Boolean = true,
var notizenIntern: String? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,70 @@
package at.mocode.shared.model.domaene.verein
import at.mocode.shared.enums.DatenQuelleE
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 Reitverein im Domänenmodell der Anwendung.
*
* Die Daten für einen Verein können aus dem OEPS ZNS-Import (`Verein_ZNS_Staging`)
* stammen oder manuell im System angelegt werden (z.B. für ausländische Vereine).
* Jeder Verein wird durch eine systeminterne UUID und die offizielle OEPS-Vereinsnummer
* (falls vorhanden) eindeutig identifiziert.
*
* @property vereinId Eindeutiger interner Identifikator für diesen Verein (UUID).
* @property oepsVereinsNr Die offizielle 4-stellige OEPS-Vereinsnummer. Sollte eindeutig sein, falls vorhanden.
* @property name Der offizielle Name des Vereins.
* @property kuerzel Ein optionales Kürzel oder eine Kurzbezeichnung für den Verein.
* @property adresseStrasse Straße und Hausnummer des Vereinssitzes.
* @property plz Postleitzahl des Vereinssitzes.
* @property ort Ortschaft des Vereinssitzes.
* @property bundeslandId Optionale Verknüpfung zur `BundeslandDefinition`. Für OEPS-Vereine
* wird versucht, dies aus der ersten Ziffer der `oepsVereinsNr` abzuleiten.
* @property landId Verknüpfung zur `LandDefinition`. Für OEPS-Vereine ist dies "Österreich".
* @property emailAllgemein Allgemeine E-Mail-Adresse des Vereins.
* @property telefonAllgemein Allgemeine Telefonnummer des Vereins.
* @property webseiteUrl URL zur Webseite des Vereins.
* @property datenQuelle Gibt die Herkunft dieses Datensatzes an (z.B. OEPS_ZNS, MANUELL).
* @property istAktiv Gibt an, ob dieser Verein aktuell aktiv ist und im System verwendet werden kann.
* @property notizenIntern Interne Anmerkungen oder Notizen zu diesem Verein.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class DomVerein(
@Serializable(with = UuidSerializer::class)
val vereinId: Uuid = uuid4(),
var oepsVereinsNr: String?, // Kann null sein für nicht-OEPS Vereine. Wenn gesetzt, erste Ziffer = Bundesland-Code.
var name: String,
var kuerzel: String? = null,
var adresseStrasse: String? = null,
var plz: String? = null,
var ort: String? = null,
@Serializable(with = UuidSerializer::class)
var bundeslandId: Uuid? = null, // FK zu BundeslandDefinition.bundeslandId
@Serializable(with = UuidSerializer::class)
var landId: Uuid, // FK zu LandDefinition.landId (jeder Verein ist in einem Land)
var emailAllgemein: String? = null,
var telefonAllgemein: String? = null,
var webseiteUrl: String? = null,
var datenQuelle: DatenQuelleE = DatenQuelleE.OEPS_ZNS, // default OEPS_ZNS
var istAktiv: Boolean = true,
var notizenIntern: String? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,59 @@
package at.mocode.shared.model.oeto_verwaltung
import at.mocode.shared.enums.SparteE // Optional, falls Altersklassen stark spartenspezifisch sind
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 eine spezifische Altersklasse für Teilnehmer (Reiter, Fahrer, Voltigierer)
* oder ggf. auch für Pferde, basierend auf den Vorgaben der ÖTO oder anderer Regelwerke.
*
* Beispiele: "Jugend U16", "Junioren U18", "Junge Reiter U21", "Allgemeine Klasse",
* "Pony Jugend U14", "Senioren Ü40".
* Diese Definitionen dienen zur Überprüfung von Teilnahmeberechtigungen in Bewerben und Abteilungen.
*
* @property altersklasseId Eindeutiger interner Identifikator für diese Altersklassendefinition (UUID).
* @property altersklasseCode Ein eindeutiges Kürzel oder Code für die Altersklasse
* (z.B. "JGD_U16", "JUN_U18", "YR_U21", "AK", "PONY_U14"). Dient als fachlicher Schlüssel.
* @property bezeichnung Die offizielle oder allgemein verständliche Bezeichnung der Altersklasse.
* @property minAlter Das Mindestalter (Jahre, inklusive) für diese Altersklasse. `null`, wenn es keine Untergrenze gibt.
* @property maxAlter Das Höchstalter (Jahre, inklusive) für diese Altersklasse. `null`, wenn es keine Obergrenze gibt.
* @property stichtagRegelText Eine Beschreibung der Regel für den Stichtag zur Altersberechnung
* (z.B. "31.12. des laufenden Kalenderjahres", "Geburtstag im laufenden Jahr").
* @property sparteFilter Optionale Angabe, ob diese Altersklassendefinition nur für eine spezifische Sparte gilt.
* @property geschlechtFilter Optionaler Filter für das Geschlecht ('M', 'W'), falls die Altersklasse geschlechtsspezifisch ist.
* `null` bedeutet für alle Geschlechter gültig.
* @property oetoRegelReferenzId Optionale Verknüpfung zu einer spezifischen Regel in der `OETORegelReferenz`-Tabelle,
* die diese Altersklasse definiert.
* @property istAktiv Gibt an, ob diese Altersklassendefinition aktuell im System verwendet werden kann.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class AltersklasseDefinition(
@Serializable(with = UuidSerializer::class)
val altersklasseId: Uuid = uuid4(), // Interner Primärschlüssel
var altersklasseCode: String, // Fachlicher PK, z.B. "JGD_U16"
var bezeichnung: String,
var minAlter: Int? = null,
var maxAlter: Int? = null,
var stichtagRegelText: String? = "31.12. des laufenden Kalenderjahres", // Typischer Default
var sparteFilter: SparteE? = null, // Ist diese Definition spartenspezifisch?
var geschlechtFilter: Char? = null, // 'M', 'W', oder null für beide
@Serializable(with = UuidSerializer::class)
var oetoRegelReferenzId: Uuid? = null, // FK zu OETORegelReferenz.oetoRegelReferenzId
var istAktiv: Boolean = true,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,70 @@
package at.mocode.shared.model.oeto_verwaltung
import at.mocode.shared.enums.LizenzKategorieE
import at.mocode.shared.enums.SparteE
import at.mocode.shared.enums.VerbandE // Wiederverwendung von VerbandE
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 globalen Typ einer Lizenz oder Startkarte gemäß der Systematik
* des OEPS oder anderer relevanter Verbände (z.B. FEI).
*
* Diese Entität dient als zentrale Referenz für alle im System bekannten Lizenzarten,
* ihre grundlegenden Eigenschaften und wie sie ggf. aus kombinierten Kürzeln
* aufgeschlüsselt werden.
*
* @property lizenzTypGlobalId Eindeutiger interner Identifikator für diesen globalen Lizenztyp (UUID).
* @property lizenzTypGlobalCode Das offizielle und eindeutige Kürzel des Lizenztyps
* (z.B. "R1", "RD2", "S" für Startkarte allgemein, "F1", "R1S2" für eine Kombi-Lizenz).
* Dient als fachlicher Primärschlüssel. Die Länge sollte auch längere Kombi-Kürzel erlauben.
* @property bezeichnung Die offizielle oder allgemein verständliche Bezeichnung des Lizenztyps
* (z.B. "Reiterlizenz R1", "Reiterlizenz Dressur D2", "Startkarte Allgemein", "Fahrerlizenz F1").
* @property spartePrimaer Die primäre Pferdesportsparte, für die dieser Lizenztyp hauptsächlich relevant ist.
* Kann `null` sein, wenn spartenübergreifend oder nicht eindeutig zuzuordnen (z.B. bei manchen Startkarten).
* @property kategorieLizenzText Eine übergeordnete Kategorie zur Gruppierung von Lizenzen
* (z.B. "Reiterlizenz", "Fahrerlizenz", "Startkarte", "Sonderlizenz").
* @property stufe Die Stufe oder das Level der Lizenz, falls anwendbar (z.B. "1", "2", "S", "M", "GP").
* @property beschreibungBerechtigung Eine kurze Beschreibung der Berechtigungen oder des Geltungsbereichs
* dieser Lizenz (z.B. "Startberechtigung Dressur & Springen Klasse A", "Nationale Turniere").
* @property aufschluesselungKombilizenzCodes Eine optionale Liste von Basis-`lizenzTypGlobalCode`s,
* falls dieser Lizenztyp eine Kombination darstellt (z.B. für "R1S2" könnte hier ["R1", "RS2"] stehen,
* wobei "R1" und "RS2" dann eigene `LizenzTypGlobal`-Einträge wären). Dies hilft bei der
* detaillierten Berechtigungsprüfung.
* @property zustaendigerVerband Der Verband, der diesen Lizenztyp primär definiert oder ausstellt.
* @property oetoRegelReferenzId Optionale Verknüpfung zu einer spezifischen Regel in der `OETORegelReferenz`-Tabelle,
* die diesen Lizenztyp definiert.
* @property istAktiv Gibt an, ob dieser Lizenztyp aktuell im System verwendet und bei der Nennung
* oder Funktionärszuordnung ausgewählt werden kann.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class LizenzTypGlobal(
@Serializable(with = UuidSerializer::class)
val lizenzTypGlobalId: Uuid = uuid4(), // Interner Primärschlüssel
var lizenzTypGlobalCode: String, // Fachlicher PK, z.B. "R1", "RD2", "R1S2"
var bezeichnung: String,
var spartePrimaer: SparteE? = null,
var kategorieLizenzText: LizenzKategorieE, // z.B. "Reiterlizenz", "Startkarte"
var stufe: String? = null,
var beschreibungBerechtigung: String? = null,
var aufschluesselungKombilizenzCodes: List<String>? = null, // Liste von lizenzTypGlobalCode(s)
var zustaendigerVerband: VerbandE = VerbandE.OEPS,
@Serializable(with = UuidSerializer::class)
var oetoRegelReferenzId: Uuid? = null, // FK zu OETORegelReferenz.oetoRegelReferenzId
var istAktiv: Boolean = true,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,60 @@
package at.mocode.shared.model.oeto_verwaltung
import at.mocode.shared.enums.RegelwerkTypE
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 einen spezifischen Verweis auf eine Regel, einen Paragrafen oder einen
* Abschnitt innerhalb eines offiziellen Regelwerks, primär der österreichischen Turnierordnung (ÖTO)
* oder des FEI-Reglements.
*
* Diese Entität dient dazu, Datenmodellentscheidungen, spezifische Anforderungen in Bewerben
* oder Lizenzbedingungen nachvollziehbar mit der jeweiligen offiziellen Regelgrundlage
* zu verknüpfen. Sie ermöglicht eine zentrale Verwaltung und Referenzierung von
* Regelwerksbestandteilen.
*
* @property oetoRegelReferenzId Eindeutiger Identifikator für diesen Regelverweis (UUID).
* @property paragraphNummer Die genaue Bezeichnung des Paragrafen, Artikels oder Abschnitts
* (z.B. "§15", "§104 Abs. 2 Z1", "FEI Art. 240").
* @property kapitelTitel Optionaler Titel des Kapitels oder übergeordneten Abschnitts,
* in dem sich die Regel befindet (z.B. "Reiterlizenzen", "Richtverfahren A").
* @property kurzbeschreibungRegel Optionale kurze Zusammenfassung oder Beschreibung des Inhalts der Regel.
* @property regelwerkTyp Gibt an, auf welches Regelwerk sich dieser Verweis bezieht (z.B. ÖTO, FEI).
* @property versionDatum Das Datum der Version des Regelwerks, auf das sich dieser Verweis bezieht,
* um die Gültigkeit im Kontext der jeweiligen Regelwerksausgabe sicherzustellen.
* @property urlDetail Optionaler URL-Link zur Online-Quelle der spezifischen Regel oder des Dokuments.
* @property istAktiv Gibt an, ob dieser Regelverweis aktuell gültig und in Verwendung ist.
* Veraltete Verweise können so markiert werden, ohne sie physisch zu löschen.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes in der lokalen Datenbank.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes in der lokalen Datenbank.
*/
@Serializable
data class OETORegelReferenz(
@Serializable(with = UuidSerializer::class)
val oetoRegelReferenzId: Uuid = uuid4(),
var paragraphNummer: String,
var kapitelTitel: String? = null,
var kurzbeschreibungRegel: String? = null,
var regelwerkTyp: RegelwerkTypE, // OETO, FEI, SONSTIGE
@Serializable(with = KotlinLocalDateSerializer::class)
var versionDatum: LocalDate,
var urlDetail: String? = null,
var istAktiv: Boolean = true,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,58 @@
package at.mocode.shared.model.oeto_verwaltung
import at.mocode.shared.enums.SparteE
import at.mocode.shared.enums.VerbandE
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 spezifischen Typ einer Funktionärsqualifikation gemäß den
* Richtlinien der ÖTO oder anderer relevanter Verbände.
*
* Beispiele für Qualifikationstypen sind "Richter Dressur bis Grand Prix" (R-DGP),
* "Parcoursbauer Springen bis Klasse S*" (PB-S*), "Technischer delegierter National" (TD-NAT),
* oder auch spezifische Ausbilder-Qualifikationen.
* Diese Entität dient als zentrale Referenz für die im System bekannten und
* verwaltbaren Funktionärsqualifikationen.
*
* @property qualTypId Eindeutiger interner Identifikator für diesen Qualifikationstyp (UUID).
* @property qualTypCode Eindeutiger Code oder Kürzel für den Qualifikationstyp,
* wie er vom OEPS oder anderen Verbänden verwendet wird (z.B. "R-DPF-S", "PB-S*", "STEWARD-FEI-L2").
* Dieser Code dient als Primärschlüssel für die fachliche Identifikation.
* @property bezeichnung Die offizielle oder allgemein verständliche Bezeichnung des Qualifikationstyps
* (z.B. "Richter Dressurpferdeprüfung bis Klasse S", "Parcoursbauer Springen Kategorie S*", "FEI Steward Level 2").
* @property sparte Die primäre Pferdesportsparte, für die diese Qualifikation relevant ist.
* Kann auch spartenübergreifend sein (z.B. für Stewards).
* @property zustaendigerVerband Optional der Verband, der diese Qualifikation ausstellt oder definiert (z.B. "OEPS", "FEI").
* @property oetoRegelReferenzId Optionale Verknüpfung zu einer spezifischen Regel in der `OETORegelReferenz`-Tabelle,
* die diese Qualifikation definiert oder beschreibt.
* @property istAktiv Gibt an, ob dieser Qualifikationstyp aktuell im System verwendet werden kann.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class QualifikationsTyp(
@Serializable(with = UuidSerializer::class)
val qualTypId: Uuid = uuid4(),
var qualTypCode: String,
var bezeichnung: String,
var sparte: SparteE,
var zustaendigerVerband: VerbandE = VerbandE.OEPS, // Default OEPS
var beschreibungDetails: String? = null,
@Serializable(with = UuidSerializer::class)
var oetoRegelReferenzId: Uuid? = null, // FK zu OETORegelReferenz.oetoRegelReferenzId
var istAktiv: Boolean = true,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,73 @@
package at.mocode.shared.model.oeto_verwaltung
import at.mocode.shared.enums.*
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
/**
* Zentrale Entität zur Speicherung verschiedener, wiederverwendbarer sportfachlicher Definitionen
* und Stammdaten, die nicht in spezifischere Entitäten wie `LizenzTypGlobal` oder
* `QualifikationsTyp` passen. Die Art des Stammdatums wird durch das Feld `typ` definiert.
*
* Beispiele für Typen:
* - DRESSURAUFGABE: Definition einer spezifischen Dressuraufgabe (z.B. "A1", "LF3").
* - WERTUNGSVERFAHREN_SPRINGEN: Definition eines Richtverfahrens im Springen (z.B. "A2 nach ÖTO §204").
* - WERTUNGSVERFAHREN_DRESSUR: Definition eines Richtverfahrens in der Dressur (z.B. "GM", "GT").
* - BEWERBSKLASSE: Definition einer Leistungsklasse (z.B. "Klasse A", "115cm Höhe").
* - BEWERBSKATEGORIE_OETO: Definition einer offiziellen ÖTO-Turnier-/Bewerbskategorie (z.B. "CDN-C Neu").
* - HINDERNISTYP: Definition von Standard-Hindernistypen im Springen.
* - RVK_PUNKTETABELLE: Punktetabellen für den Reitervierkampf.
* - OETO_REGEL_TEXT: Freitextauszüge oder Erläuterungen zu spezifischen ÖTO-Regeln.
*
* @property stammdatumId Eindeutiger interner Identifikator für diesen Stammdatensatz (UUID).
* @property typ Der Typ des sportfachlichen Stammdatums (siehe `SportfachStammdatenTypE`).
* Bestimmt, wie die anderen Felder, insbesondere `detailsJson`, zu interpretieren sind.
* @property code Ein eindeutiger Code oder Kürzel für diesen Stammdatensatz,
* typischerweise eindeutig innerhalb des jeweiligen `typs` (z.B. "A1" für Typ DRESSURAUFGABE,
* "CDN-CNEU" für Typ BEWERBSKATEGORIE_OETO).
* @property bezeichnung Die offizielle oder allgemein verständliche Bezeichnung dieses Stammdatums.
* @property detailsJson Optionale, strukturierte Zusatzinformationen im JSON-Format,
* deren Inhalt vom `typ` abhängt.
* Beispiele:
* - Für DRESSURAUFGABE: Lektionen, Dauer, Max-Punkte.
* - Für WERTUNGSVERFAHREN: Spezifische Fehlerwerte, Zeitregeln.
* - Für BEWERBSKLASSE: Höhenangaben im Springen, Anforderungen in Dressur.
* @property sparteZugehoerigkeit Optionale primäre Pferdesportsparte, für die dieser Stammdatensatz relevant ist.
* Kann `null` sein, wenn spartenübergreifend oder nicht direkt zuzuordnen.
* @property verbandGueltigkeit Für Aufgaben oder Regelwerke relevant, ob sie national (OEPS), FEI oder von anderer Nation sind.
* @property viereckGroesse Standard-Viereckgröße, relevant für Typ DRESSURAUFGABE.
* @property richtverfahrenModus Standard-Richtverfahrensmodus (GM/GT), relevant für Typ DRESSURAUFGABE.
* @property oetoRegelReferenzId Optionale Verknüpfung zu einer spezifischen Regel in der `OETORegelReferenz`-Tabelle.
* @property istAktiv Gibt an, ob dieser Stammdatensatz aktuell im System verwendet werden kann.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class Sportfachliche_Stammdaten(
@Serializable(with = UuidSerializer::class)
val stammdatumId: Uuid = uuid4(),
var typ: SportfachStammdatenTypE,
var code: String, // Eindeutig pro Typ, z.B. "A1", "CDN-CNEU", "115CM"
var bezeichnung: String,
var detailsJson: String? = null, // Strukturierte Details als JSON-String
var sparteZugehoerigkeit: SparteE? = null,
var verbandGueltigkeit: VerbandE? = null, // für Aufgaben/Regeln
var viereckGroesse: PruefungsViereckE? = null, // für Dressuraufgaben
var richtverfahrenModus: RichtverfahrenModusE? = null, // für Dressuraufgaben
@Serializable(with = UuidSerializer::class)
var oetoRegelReferenzId: Uuid? = null,
var istAktiv: Boolean = true,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,51 @@
package at.mocode.shared.model.stammdaten
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 ein Bundesland oder eine vergleichbare subnationale Verwaltungseinheit.
*
* Diese Entität ist primär für die österreichischen Bundesländer mit ihren OEPS-spezifischen
* Codes gedacht, kann aber auch für Bundesländer/Regionen anderer Nationen erweitert werden.
*
* @property bundeslandId Eindeutiger interner Identifikator für dieses Bundesland (UUID).
* @property landId Fremdschlüssel zur `LandDefinition`, dem dieses Bundesland angehört.
* @property oepsCode Der 2-stellige numerische OEPS-Code für österreichische Bundesländer
* (z.B. "01" für Wien, "02" für Niederösterreich). Sollte eindeutig sein für Land "Österreich".
* @property iso3166_2_Code Optionaler offizieller ISO 3166-2 Code für das Bundesland
* (z.B. "AT-1" für Burgenland, "DE-BY" für Bayern).
* @property name Der offizielle Name des Bundeslandes.
* @property kuerzel Ein gängiges Kürzel für das Bundesland (z.B. "", "W", "STMK").
* @property wappenUrl Optionaler URL-Pfad zu einer Bilddatei des Bundeslandwappens.
* @property istAktiv Gibt an, ob dieses Bundesland aktuell im System ausgewählt/verwendet werden kann.
* @property sortierReihenfolge Optionale Zahl zur Steuerung der Sortierreihenfolge in Auswahllisten.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class BundeslandDefinition(
@Serializable(with = UuidSerializer::class)
val bundeslandId: Uuid = uuid4(),
@Serializable(with = UuidSerializer::class)
var landId: Uuid, // FK zu LandDefinition.landId
var oepsCode: String?, // z.B. "01", "02", ... für Österreich; Eindeutig pro landId = Österreich
var iso3166_2_Code: String?, // z.B. "AT-1", "DE-BY"; Eindeutig global oder pro Land?
var name: String, // z.B. "Niederösterreich", "Bayern"
var kuerzel: String? = null, // z.B. "NÖ", "BY"
var wappenUrl: String? = null,
var istAktiv: Boolean = true,
var sortierReihenfolge: Int? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,51 @@
package at.mocode.shared.model.stammdaten
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 ein Land/eine Nation mit seinen offiziellen Codes und Bezeichnungen.
*
* Diese Entität dient als zentrale Referenz für Länder, die im System für
* Nationalitäten von Personen, Vereinen oder für internationale Turniere relevant sind.
*
* @property landId Eindeutiger interner Identifikator für dieses Land (UUID).
* @property isoAlpha2Code Der 2-stellige ISO 3166-1 Alpha-2 Code des Landes (z.B. "AT", "DE"). Sollte eindeutig sein.
* @property isoAlpha3Code Der 3-stellige ISO 3166-1 Alpha-3 Code des Landes (z.B. "AUT", "DEU"). Sollte eindeutig sein.
* @property isoNumerischerCode Optionaler 3-stelliger numerischer ISO 3166-1 Code des Landes (z.B. "040" für Österreich).
* @property nameDeutsch Der offizielle deutsche Name des Landes.
* @property nameEnglisch Der offizielle englische Name des Landes.
* @property wappenUrl Optionaler URL-Pfad zu einer Bilddatei des Länderwappens oder der Flagge.
* @property istEuMitglied Gibt an, ob das Land Mitglied der Europäischen Union ist.
* @property istEwrMitglied Gibt an, ob das Land Mitglied des Europäischen Wirtschaftsraums ist.
* @property istAktiv Gibt an, ob dieses Land aktuell im System ausgewählt/verwendet werden kann.
* @property sortierReihenfolge Optionale Zahl zur Steuerung der Sortierreihenfolge in Auswahllisten.
* @property createdAt Zeitstempel der Erstellung dieses Datensatzes.
* @property updatedAt Zeitstempel der letzten Aktualisierung dieses Datensatzes.
*/
@Serializable
data class LandDefinition(
@Serializable(with = UuidSerializer::class)
val landId: Uuid = uuid4(),
var isoAlpha2Code: String, // z.B. "AT" -> Fachlicher PK oder Unique Constraint
var isoAlpha3Code: String, // z.B. "AUT" -> Unique Constraint
var isoNumerischerCode: String? = null, // z.B. "040"
var nameDeutsch: String, // z.B. "Österreich"
var nameEnglisch: String? = null, // z.B. "Austria"
var wappenUrl: String? = null,
var istEuMitglied: Boolean? = null,
var istEwrMitglied: Boolean? = null, // Europäischer Wirtschaftsraum
var istAktiv: Boolean = true,
var sortierReihenfolge: Int? = null,
@Serializable(with = KotlinInstantSerializer::class)
val createdAt: Instant = Clock.System.now(),
@Serializable(with = KotlinInstantSerializer::class)
var updatedAt: Instant = Clock.System.now()
)

View File

@ -0,0 +1,67 @@
package at.mocode.shared.model.zns_staging
import at.mocode.shared.serializers.KotlinInstantSerializer
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Repräsentiert einen Rohdatensatz für eine Person (Reiter, Funktionär etc.),
* wie er aus den OEPS ZNS-Dateien (`LIZENZ01.dat`, `RICHT01.dat`) importiert wird.
*
* Diese Klasse dient als temporärer Container (Staging-Tabelle) für die unverarbeiteten
* Personendaten, bevor sie validiert, transformiert und in die Domänen-Entitäten
* `DomPerson` und `DomLizenz` überführt werden. Alle Felder aus der Datei werden
* als String oder der direkteste Basistyp gespeichert, um Parsing-Fehler auf dieser
* Ebene zu minimieren. Die Konvertierung und Interpretation erfolgt im nächsten Schritt.
*
* @property oepsSatzNrPerson Die eindeutige OEPS-Satznummer der Person (aus `LIZENZ01.dat` / `RICHT01.dat`, Stelle 1-6). Dient als Primärschlüssel.
* @property familiennameRoh Familienname der Person (Rohwert).
* @property vornameRoh Vorname der Person (Rohwert).
* @property geburtsdatumTextRoh Geburtsdatum als Text im Format JJJJMMTT (Rohwert).
* @property geschlechtCodeRoh Geschlechtscode (W, M, " ") (Rohwert).
* @property nationalitaetCodeRoh Nationalitätskürzel (3-stellig) (Rohwert).
* @property bundeslandCodeOepsRoh OEPS-Code für das Bundesland (Rohwert).
* @property vereinsnameOepsRoh Name des Stammvereins (Rohwert).
* @property mitgliedNrVereinRoh Mitgliedsnummer im Verein (Rohwert).
* @property feiIdPersonRoh FEI-ID der Person (Rohwert).
* @property sperrlisteFlagOepsRoh Kennzeichen für Sperrliste ("S" oder BLANK) (Rohwert).
* @property kaderFlagOepsRoh Kaderkennzeichen (Rohwert).
* @property telefonRoh Telefonnummer (Rohwert).
* @property reiterlizenzRoh Kürzel der Haupt-Reiterlizenz (Rohwert).
* @property startkarteRoh Kürzel der Startkarte (Rohwert).
* @property fahrlizenzRoh Kürzel der Fahrlizenz (Rohwert).
* @property altersklasseJugendCodeOepsRoh Code für Altersklasse Jugend/Junior/U25 (Rohwert).
* @property altersklasseJungerreiterCodeOepsRoh Code für Altersklasse Junge Reiter ("Y") (Rohwert).
* @property jahrLetzteZahlungLizenzOepsRoh Jahr der letzten Lizenzzahlung als Text (Rohwert).
* @property lizenzinfoRawOepsRoh Kommagetrennte Liste der bezahlten Lizenzen/Startkarten (Rohwert).
* @property qualifikationenRawOepsRoh Kommagetrennte Liste der Funktionärsqualifikationen aus `RICHT01.dat` (Rohwert).
* @property importTimestamp Zeitstempel, wann dieser Datensatz in die Staging-Tabelle importiert wurde.
*/
@Serializable
data class Person_ZNS_Staging(
val oepsSatzNrPerson: String, // PK aus LIZENZ01.dat / RICHT01.dat (VARCHAR(6))
var familiennameRoh: String?, // VARCHAR(50)
var vornameRoh: String?, // VARCHAR(25)
var geburtsdatumTextRoh: String?, // VARCHAR(8) (JJJJMMTT)
var geschlechtCodeRoh: String?, // CHAR(1)
var nationalitaetCodeRoh: String?, // VARCHAR(3)
var bundeslandCodeOepsRoh: String?,// VARCHAR(2)
var vereinsnameOepsRoh: String?, // VARCHAR(50)
var mitgliedNrVereinRoh: String?, // VARCHAR(8)
var feiIdPersonRoh: String?, // VARCHAR(10)
var sperrlisteFlagOepsRoh: String?,// CHAR(1)
var kaderFlagOepsRoh: String?, // CHAR(1)
var telefonRoh: String?, // VARCHAR(21)
var reiterlizenzRoh: String?, // VARCHAR(4)
var startkarteRoh: String?, // CHAR(1)
var fahrlizenzRoh: String?, // VARCHAR(2)
var altersklasseJugendCodeOepsRoh: String?, // VARCHAR(2)
var altersklasseJungerreiterCodeOepsRoh: String?, // CHAR(1)
var jahrLetzteZahlungLizenzOepsRoh: String?, // VARCHAR(4) -> wird zu Int?
var lizenzinfoRawOepsRoh: String?, // VARCHAR(10)
var qualifikationenRawOepsRoh: String?, // VARCHAR(30) aus RICHT01.dat
@Serializable(with = KotlinInstantSerializer::class)
var importTimestamp: Instant = Clock.System.now()
)

View File

@ -0,0 +1,50 @@
package at.mocode.shared.model.zns_staging
import at.mocode.shared.serializers.KotlinInstantSerializer
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Repräsentiert einen Rohdatensatz für ein Pferd, wie er aus der OEPS ZNS-Datei
* `PFERDE01.dat` importiert wird.
*
* Diese Klasse dient als temporärer Container (Staging-Tabelle) für die unverarbeiteten
* Pferdedaten, bevor sie validiert, transformiert und in die Domänen-Entität
* `DomPferd` überführt werden. Alle Felder aus der Datei werden als String oder
* der direkteste Basistyp gespeichert.
*
* @property oepsSatzNrPferd Die eindeutige 10-stellige OEPS-Satznummer des Pferdes (aus `PFERDE01.dat`). Dient als Primärschlüssel.
* @property oepsKopfNrRoh Die 4-stellige OEPS-Kopfnummer des Pferdes (Rohwert).
* @property nameRoh Name des Pferdes (Rohwert).
* @property lebensnummerRoh Lebensnummer des Pferdes (Rohwert).
* @property geburtsjahrRoh Geburtsjahr des Pferdes als Text (Rohwert).
* @property geschlechtCodeRoh Geschlechtscode des Pferdes (Rohwert).
* @property farbeRoh Farbe des Pferdes (Rohwert).
* @property abstammungVaterNameRoh Name des Vaters (Rohwert).
* @property abstammungInfoRoh Allgemeines Abstammungsfeld (Muttervater etc.) (Rohwert).
* @property oepsVereinNrPferdRoh OEPS-Vereinsnummer des Heimatvereins des Pferdes (Rohwert).
* @property verantwortlichePersonNameRoh Name der verantwortlichen Person für das Pferd (Rohwert).
* @property feiPassNrRoh FEI-Passnummer des Pferdes (Rohwert).
* @property letzteZahlungPferdegebuehrJahrRoh Jahr der letzten Zahlung der Pferdegebühr als Text (Rohwert).
* @property importTimestamp Zeitstempel, wann dieser Datensatz in die Staging-Tabelle importiert wurde.
*/
@Serializable
data class Pferd_ZNS_Staging(
val oepsSatzNrPferd: String, // PK aus PFERDE01.dat (VARCHAR(10))
var oepsKopfNrRoh: String?, // VARCHAR(4)
var nameRoh: String?, // VARCHAR(30)
var lebensnummerRoh: String?, // VARCHAR(9)
var geburtsjahrRoh: String?, // VARCHAR(4) -> wird zu Int?
var geschlechtCodeRoh: String?, // CHAR(1)
var farbeRoh: String?, // VARCHAR(15)
var abstammungVaterNameRoh: String?,// VARCHAR(30)
var abstammungInfoRoh: String?, // VARCHAR(15) (allgemeines Abstammungsfeld)
var oepsVereinNrPferdRoh: String?, // VARCHAR(4)
var verantwortlichePersonNameRoh: String?, // VARCHAR(75)
var feiPassNrRoh: String?, // VARCHAR(10)
var letzteZahlungPferdegebuehrJahrRoh: String?, // VARCHAR(4) -> wird zu Int?
@Serializable(with = KotlinInstantSerializer::class)
var importTimestamp: Instant = Clock.System.now()
)

View File

@ -0,0 +1,27 @@
package at.mocode.shared.model.zns_staging
import at.mocode.shared.serializers.KotlinInstantSerializer
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.Serializable
/**
* Repräsentiert einen Rohdatensatz für einen Verein, wie er aus der OEPS ZNS-Datei
* `VEREIN01.dat` importiert wird.
*
* Diese Klasse dient als temporärer Container (Staging-Tabelle) für die unverarbeiteten
* Vereinsdaten, bevor sie validiert, transformiert und in die Domänen-Entität
* `DomVerein` überführt werden.
*
* @property oepsVereinsNr Die offizielle OEPS-Vereinsnummer (aus `VEREIN01.dat`, Stelle 1-4). Dient als Primärschlüssel für diesen Staging-Datensatz.
* @property nameRoh Der Name des Vereins, wie er in der `VEREIN01.dat` (Stelle 5-54) steht.
* @property importTimestamp Zeitstempel, wann dieser Datensatz in die Staging-Tabelle importiert wurde.
*/
@Serializable
data class Verein_ZNS_Staging(
val oepsVereinsNr: String, // PK aus VEREIN01.dat (VARCHAR(4))
var nameRoh: String?, // VARCHAR(50)
@Serializable(with = KotlinInstantSerializer::class)
var importTimestamp: Instant = Clock.System.now()
)

View File

@ -1,7 +1,7 @@
package at.mocode.shared.stammdaten
import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.enums.Sparte
import at.mocode.shared.enums.SparteE
import at.mocode.shared.serializers.KotlinLocalDateSerializer
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable
@ -10,7 +10,7 @@ import kotlinx.serialization.Serializable
data class LizenzInfo(
val lizenzTyp: LizenzTyp,
val stufe: String?,
val sparte: Sparte?,
val sparteE: SparteE?,
val gueltigBisJahr: Int?, // Jahr als Int
@Serializable(with = KotlinLocalDateSerializer::class)
val ausgestelltAm: LocalDate?

View File

@ -87,40 +87,40 @@ class EnumsTest {
@Test
fun testSparteEnum() {
// Test all enum values
val values = Sparte.entries.toTypedArray()
val values = SparteE.entries.toTypedArray()
assertEquals(12, values.size)
// Test specific enum values
assertEquals(Sparte.DRESSUR, values[0])
assertEquals(Sparte.SPRINGEN, values[1])
assertEquals(Sparte.VIELSEITIGKEIT, values[2])
assertEquals(Sparte.FAHREN, values[3])
assertEquals(Sparte.VOLTIGIEREN, values[4])
assertEquals(Sparte.WESTERN, values[5])
assertEquals(Sparte.DISTANZ, values[6])
assertEquals(Sparte.ISLAND, values[7])
assertEquals(Sparte.PFERDESPORT_SPIEL, values[8])
assertEquals(Sparte.BASIS, values[9])
assertEquals(Sparte.KOMBINIERT, values[10])
assertEquals(Sparte.SONSTIGES, values[11])
assertEquals(SparteE.DRESSUR, values[0])
assertEquals(SparteE.SPRINGEN, values[1])
assertEquals(SparteE.VIELSEITIGKEIT, values[2])
assertEquals(SparteE.FAHREN, values[3])
assertEquals(SparteE.VOLTIGIEREN, values[4])
assertEquals(SparteE.WESTERN, values[5])
assertEquals(SparteE.DISTANZ, values[6])
assertEquals(SparteE.ISLAND, values[7])
assertEquals(SparteE.PFERDESPORT_SPIEL, values[8])
assertEquals(SparteE.BASIS, values[9])
assertEquals(SparteE.KOMBINIERT, values[10])
assertEquals(SparteE.SONSTIGES, values[11])
// Test serialization and deserialization
testEnumSerialization(Sparte.DRESSUR)
testEnumSerialization(Sparte.SPRINGEN)
testEnumSerialization(Sparte.VIELSEITIGKEIT)
testEnumSerialization(Sparte.FAHREN)
testEnumSerialization(Sparte.VOLTIGIEREN)
testEnumSerialization(Sparte.WESTERN)
testEnumSerialization(Sparte.DISTANZ)
testEnumSerialization(Sparte.ISLAND)
testEnumSerialization(Sparte.PFERDESPORT_SPIEL)
testEnumSerialization(Sparte.BASIS)
testEnumSerialization(Sparte.KOMBINIERT)
testEnumSerialization(Sparte.SONSTIGES)
testEnumSerialization(SparteE.DRESSUR)
testEnumSerialization(SparteE.SPRINGEN)
testEnumSerialization(SparteE.VIELSEITIGKEIT)
testEnumSerialization(SparteE.FAHREN)
testEnumSerialization(SparteE.VOLTIGIEREN)
testEnumSerialization(SparteE.WESTERN)
testEnumSerialization(SparteE.DISTANZ)
testEnumSerialization(SparteE.ISLAND)
testEnumSerialization(SparteE.PFERDESPORT_SPIEL)
testEnumSerialization(SparteE.BASIS)
testEnumSerialization(SparteE.KOMBINIERT)
testEnumSerialization(SparteE.SONSTIGES)
// Test comparison
assertEquals(Sparte.DRESSUR, Sparte.DRESSUR)
assertNotEquals(Sparte.DRESSUR, Sparte.SPRINGEN)
assertEquals(SparteE.DRESSUR, SparteE.DRESSUR)
assertNotEquals(SparteE.DRESSUR, SparteE.SPRINGEN)
}
@Test
@ -455,7 +455,7 @@ class EnumsTest {
}
// Test serialization for a specific enum value
private fun testEnumSerialization(value: Sparte) {
private fun testEnumSerialization(value: SparteE) {
val json = Json { prettyPrint = true }
val jsonString = json.encodeToString(value)
@ -463,7 +463,7 @@ class EnumsTest {
assertEquals("\"${value.name}\"", jsonString)
// Verify deserialization
val deserializedValue = json.decodeFromString<Sparte>(jsonString)
val deserializedValue = json.decodeFromString<SparteE>(jsonString)
assertEquals(value, deserializedValue)
}

View File

@ -1,7 +1,7 @@
package at.mocode.shared.stammdaten
import at.mocode.shared.enums.LizenzTyp
import at.mocode.shared.enums.Sparte
import at.mocode.shared.enums.SparteE
import kotlinx.datetime.LocalDate
import kotlinx.serialization.json.Json
import kotlin.test.Test
@ -16,7 +16,7 @@ class LizenzInfoTest {
val lizenzInfo = LizenzInfo(
lizenzTyp = LizenzTyp.REITER,
stufe = null,
sparte = null,
sparteE = null,
gueltigBisJahr = null,
ausgestelltAm = null
)
@ -26,7 +26,7 @@ class LizenzInfoTest {
// Verify optional fields are null
assertEquals(null, lizenzInfo.stufe)
assertEquals(null, lizenzInfo.sparte)
assertEquals(null, lizenzInfo.sparteE)
assertEquals(null, lizenzInfo.gueltigBisJahr)
assertEquals(null, lizenzInfo.ausgestelltAm)
}
@ -39,7 +39,7 @@ class LizenzInfoTest {
val lizenzInfo = LizenzInfo(
lizenzTyp = LizenzTyp.FAHRER,
stufe = "A",
sparte = Sparte.DRESSUR,
sparteE = SparteE.DRESSUR,
gueltigBisJahr = 2024,
ausgestelltAm = ausgestelltAm
)
@ -47,7 +47,7 @@ class LizenzInfoTest {
// Verify all fields
assertEquals(LizenzTyp.FAHRER, lizenzInfo.lizenzTyp)
assertEquals("A", lizenzInfo.stufe)
assertEquals(Sparte.DRESSUR, lizenzInfo.sparte)
assertEquals(SparteE.DRESSUR, lizenzInfo.sparteE)
assertEquals(2024, lizenzInfo.gueltigBisJahr)
assertEquals(ausgestelltAm, lizenzInfo.ausgestelltAm)
}
@ -60,7 +60,7 @@ class LizenzInfoTest {
val lizenzInfo = LizenzInfo(
lizenzTyp = LizenzTyp.VOLTIGIERER,
stufe = "B",
sparte = Sparte.VOLTIGIEREN,
sparteE = SparteE.VOLTIGIEREN,
gueltigBisJahr = 2025,
ausgestelltAm = ausgestelltAm
)
@ -90,7 +90,7 @@ class LizenzInfoTest {
// Verify deserialized object matches original
assertEquals(lizenzInfo.lizenzTyp, deserializedLizenzInfo.lizenzTyp)
assertEquals(lizenzInfo.stufe, deserializedLizenzInfo.stufe)
assertEquals(lizenzInfo.sparte, deserializedLizenzInfo.sparte)
assertEquals(lizenzInfo.sparteE, deserializedLizenzInfo.sparteE)
assertEquals(lizenzInfo.gueltigBisJahr, deserializedLizenzInfo.gueltigBisJahr)
assertEquals(lizenzInfo.ausgestelltAm, deserializedLizenzInfo.ausgestelltAm)
}
@ -101,7 +101,7 @@ class LizenzInfoTest {
val original = LizenzInfo(
lizenzTyp = LizenzTyp.WESTERN,
stufe = "C",
sparte = Sparte.WESTERN,
sparteE = SparteE.WESTERN,
gueltigBisJahr = 2023,
ausgestelltAm = null
)
@ -115,7 +115,7 @@ class LizenzInfoTest {
// Verify copied properties
assertEquals(original.lizenzTyp, copy.lizenzTyp)
assertEquals(original.sparte, copy.sparte)
assertEquals(original.sparteE, copy.sparteE)
// Verify modified properties
assertEquals("B", copy.stufe)
@ -148,7 +148,7 @@ class LizenzInfoTest {
val lizenzInfo = LizenzInfo(
lizenzTyp = lizenzTyp,
stufe = "Test",
sparte = Sparte.SONSTIGES,
sparteE = SparteE.SONSTIGES,
gueltigBisJahr = 2024,
ausgestelltAm = null
)

View File

@ -3,7 +3,7 @@ package at.mocode.shared.stammdaten
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 at.mocode.shared.enums.SparteE
import com.benasher44.uuid.uuid4
import kotlinx.datetime.Clock
import kotlinx.datetime.LocalDate
@ -83,7 +83,7 @@ class PersonTest {
LizenzInfo(
lizenzTyp = LizenzTyp.REITER,
stufe = "A",
sparte = Sparte.SPRINGEN,
sparteE = SparteE.SPRINGEN,
gueltigBisJahr = 2024,
ausgestelltAm = null
)
@ -180,7 +180,7 @@ class PersonTest {
LizenzInfo(
lizenzTyp = LizenzTyp.FAHRER,
stufe = "B",
sparte = Sparte.DRESSUR,
sparteE = SparteE.DRESSUR,
gueltigBisJahr = 2025,
ausgestelltAm = null
)
@ -250,7 +250,7 @@ class PersonTest {
LizenzInfo(
lizenzTyp = LizenzTyp.REITER,
stufe = "A",
sparte = Sparte.SPRINGEN,
sparteE = SparteE.SPRINGEN,
gueltigBisJahr = 2024,
ausgestelltAm = null
)