@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
