@startuml
' 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,
 MELDESTELLEMPERSONAL,
 RECHENSTELLE,
 SPRECHER,
 REITERSPRECHER,
 ZEITNEHMER,
 SCHREIBER_RICHTER,
 HELFER_PARCOURS,
 SONSTIGE_FUNKTION
}
enum RichterPositionE {
 C, E, H, B, M,
 VORSITZ, 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
}


' --- Entitäten für verwaltbare Auswahllisten (Lookup Tables / Master Data) ---
entity "Pruefungsaufgabe" {
  + id: UUID (PK)
  --
  kuerzel: String
  nameLang: String
  sparte: SparteE
  nation: PruefungsaufgabeNationE
  '..weitere..
}

entity "Richtverfahren" {
  + id: UUID (PK)
  --
  code: String
  bezeichnung: String
  sparte: SparteE
}

entity "BewerbsKlasseDefinition" as BewerbsKlasseDef {
  + id: UUID (PK)
  --
  kuerzel: String
  bezeichnung: String
  sparte: SparteE
}

entity "BewerbsKategorieOetoDefinition" as BewerbsKatOetoDef {
  + id: UUID (PK)
  --
  kuerzel: String  'z.B. "CDN-C Neu"'
  bezeichnung: String
  abgeleiteteSparte: SparteE ' Automatisch aus Kuerzel oder manuell?'
}

' --- Kern-Entitäten ---
entity "Event" {
  + id: UUID (PK)
  --
  bezeichnung: String
  datumVon: LocalDate
  datumBis: LocalDate
}

entity "Turnier" {
  + id: UUID (PK)
  --
  eventId: UUID (FK)
  oepsTurnierNr: String
  titel: String
  ' sparte: SparteE ' Wird nun aus oetoKategorieIds abgeleitet oder ist spezifisch für das Turnier'
  oetoKategorieIds: List<UUID> '(FKs zu BewerbsKatOetoDef)'
  regelwerkTyp: RegelwerkTypE
  datumVon: LocalDate ' Eigenes Datum pro Turnier'
  datumBis: LocalDate ' Eigenes Datum pro Turnier'
}

entity "BewerbBasis" {
  + id: UUID (PK)
  --
  turnierId: UUID (FK)
  nummerInAusschreibung: Integer ' Eindeutig pro Turnier'
  uebergeordneteBezeichnung: String
  sparte: SparteE ' Bleibt explizit, kann aus oetoKategorieId vorgeschlagen werden'
  oetoKategorieId: UUID (FK zu BewerbsKatOetoDef.id) ' Die spezifische ÖTO Kategorie dieses Bewerbs'
  ' klasseId hier entfernt, wandert in spartspezifische Details '
}

entity "DressurBewerbDetails" {
  + bewerbBasisId: UUID (PK, FK)
  --
  pruefungsaufgabeId: UUID (FK)
  richtverfahrenId: UUID (FK)
  klasseId: UUID (FK zu BewerbsKlasseDef.id)? ' Klasse spezifisch für Dressur'
  ' zugewieseneFunktionaere: List<BewerbFunktionaerZuordnung> '
}

entity "SpringBewerbDetails" {
  + bewerbBasisId: UUID (PK, FK)
  --
  richtverfahrenId: UUID (FK)
  artDesStechens: ArtDesStechensE?
  klasseId: UUID (FK zu BewerbsKlasseDef.id)? ' Klasse spezifisch für Springen (z.B. Höhe)'
  ' zugewieseneFunktionaere: List<BewerbFunktionaerZuordnung> '
}

entity "BewerbFunktionaerZuordnung" {
  + id: UUID (PK)
  --
  ' Entweder zu bewerbBasisId oder besser zu spartspezifischer DetailId '
  ' dressurBewerbDetailsId: UUID (FK)? '
  ' springBewerbDetailsId: UUID (FK)? '
  bewerbBasisId: UUID (FK) ' Allgemeine Zuordnung, Rolle entscheidet über Relevanz '
  personId: UUID (FK)
  funktionaerRolle: FunktionaerRolleE
  positionImBewerb: String? ' Für Richterpositionen etc. '
}

entity "Abteilung" {
  + id: UUID (PK)
  --
  bewerbBasisId: UUID (FK)
  abteilungsKennzeichen: String ' z.B. "1", "A" -> ergibt mit BewerbBasis.nummer "12/1" '
  bezeichnungOeffentlich: String?
  ' ... Teilungskriterien (strukturiert) ...
}

entity "Person" {
  + id: UUID (PK)
  --
  nachname: String
  vorname: String
}

entity "Pferd" {
  + id: UUID (PK)
  --
  name: String
}

entity "Nennung" {
  + id: UUID (PK)
  --
  abteilungId: UUID (FK)
  personId: UUID (FK)
  pferdId: UUID (FK)
}

entity "Startfolge" {
  + id: UUID (PK)
  --
  nennungId: UUID (FK)
  startNummer: Int
}

entity "Ergebnis" {
  + id: UUID (PK)
  --
  startfolgeId: UUID (FK)
  platzierung: Int?
}

entity "FunktionaerEinsatz" {
  + id: UUID (PK)
  --
  personId: UUID (FK)
  eventId: UUID (FK)
  rolle: FunktionaerRolleE
  positionRichter: RichterPositionE?
  geplanterStart: LocalDateTime
  geplantesEnde: LocalDateTime
}

entity "CupOderMeisterschaft" as Cup {
  + id: UUID (PK)
  --
  name: String
  jahr: Int
  sparte: SparteE
}

' --- Beziehungen (Auswahl) ---
Event "1" -- "0..*" Turnier
Turnier "1" -- "0..*" BewerbBasis
BewerbBasis "1" -- "0..1" DressurDetails
BewerbBasis "1" -- "0..1" SpringDetails
BewerbBasis "1" -- "1..*" Abteilung

Abteilung "1" -- "0..*" Nennung
Nennung --> Person
Nennung --> Pferd
Nennung "1" -- "0..1" Startfolge
Startfolge "1" -- "0..1" Ergebnis

BewerbBasis "1" -- "0..*" BewerbFunktionaerZuordnung : "hat Funktionäre"
Person "1" -- "0..*" BewerbFunktionaerZuordnung

' Oder Funktionärszuweisung über FunktionaerEinsatz und Zeit/Bewerbs-Matching '
Event "1" -- "0..*" FunktionaerEinsatz
Person "1" -- "0..*" FunktionaerEinsatz

Cup "1" -- "0..*" Turnier : "umfasst Turniere \n(über Zwischentabelle)"
' ... weitere Beziehungen ...

@enduml
