@startuml
title "Detailliertes Datenmodell: Veranstaltungs_Context"

!theme vibrant

' Externe Referenzen werden der Übersichtlichkeit halber als vereinfachte Entitäten dargestellt.
package "Externe Referenzen (Andere Kontexte)" {
    class Verein_ZNS
    class Person_ZNS
    class OETORegelReferenz
    class Sportfachliche_Stammdaten
}

package "Veranstaltungsplanung" as VeranstaltungsContext {

    ' #################### Aggregate Root: VeranstaltungsRahmen ####################
    class VeranstaltungsRahmen <<(A,orange) Aggregate Root>> {
        + veranstaltungsRahmenId : UUID
        --
        + name : string ' z.B. "Reitertage Musterhof Frühling 2025"
        + zeitraum : DatumsbereichVO
        + austragungsort : AdresseVO
        ' FK zu Service_ZNS_Daten.Verein_ZNS
        # hauptveranstalter_verein_nr : VARCHAR(4) <<FK>>
    }

    ' #################### Aggregate Root: Turnier_OEPS ####################
    class Turnier_OEPS <<(A,orange) Aggregate Root>> {
        ' A-Satz, Stelle 2-6
        + oepsTurnierNr : VARCHAR(5) <<PK>>
        --
        ' FK zu VeranstaltungsRahmen
        # veranstaltungsRahmenId : UUID <<FK>>
        ' A-Satz, Stelle 7-31
        + name_ort : VARCHAR(25)
        ' A-Satz, Stelle 32-47
        + zeitraum : DatumsbereichVO
        ' A-Satz, Stelle 48-72
        + kategorie_text_turnier : VARCHAR(25)
        + turnierart_sparte : string ' z.B. CDN-A, CSN-B*
        ' A-Satz (Ergebnis), Stelle 73-75
        + protokoll_version_oeps : VARCHAR(3)
        ' A-Satz (Ergebnis), Stelle 76-95
        + meldestelle_software_version : VARCHAR(20)
        ' A-Satz (Ergebnis), Stelle 96-103
        + link_id_turnier : VARCHAR(8)
    }

    ' #################### Aggregate Root: Meisterschaft_Cup_Serie ####################
    class Meisterschaft_Cup_Serie <<(A,orange) Aggregate Root>> {
        + mcsId : UUID <<PK>>
        --
        + name : string ' z.B. "XYZ Sommercup 2025"
        + typ : string ' Meisterschaft, Cup, Serie
        + jahr : INTEGER
        + sparte : string
        # oetoRegelRefId : UUID <<FK>>
    }

    ' #################### Entitäten innerhalb des Turnier_OEPS Aggregats ####################
    ' Ein Bewerb innerhalb eines Turniers
    entity Pruefung_OEPS {
        + pruefungId : UUID <<PK>>
        --
        ' B-Satz, Stelle 61-63 (3-stellig)
        + oepsBewerbNr : VARCHAR(3)
        ' B-Satz, Stelle 5-39
        + name_text_pruefung : VARCHAR(35)
        ' B-Satz, Stelle 40-43
        + klasse_text : VARCHAR(4)
        ' B-Satz, Stelle 44-51
        + kategorie_text_pruefung : VARCHAR(8)
        ' B-Satz, Stelle 52-59
        + datumPruefung : Date
        ' Zur Steuerung der spartenspezifischen Logik
        + artDisziplin : DisziplinVO
        ' B-Satz (Ergebnis), Stelle 64-71
        + link_id_pruefung : VARCHAR(8)
    }

    ' Eine Abteilung eines Bewerbs
    entity Pruefung_Abteilung {
        + abteilungId : UUID <<PK>>
        --
        ' B-Satz, Stelle 4
        + oepsAbteilungNr : INTEGER
        + bezeichnung : string ' z.B. "Abt. 1: Junioren"
        ' B-Satz (Ergebnis), Stelle 52-54
        + anzahl_starter_gemeldet : INTEGER
        ' B-Satz (Ergebnis), Stelle 55-60 (ohne Komma)
        + geldpreis_summe : DECIMAL
    }

    ' Entität zur Speicherung der konkreten Anforderungen für eine Prüfung/Abteilung
    entity PruefungsAnforderungen {
        + anforderungenId: UUID <<PK>>
        --
        ' Kann sich auf eine Pruefung_OEPS oder eine Pruefung_Abteilung beziehen
        # bezugs_id: UUID <<FK>>
        ' FK zu Service_OeTO_Verwaltung.OETORegelReferenz
        # oeto_regel_ref_id: UUID <<FK>>
    }

    entity Anforderung_Lizenz {
      # anforderungenId: UUID <<FK>>
      # lizenzTypCode: VARCHAR(4) <<FK>>
    }

    entity Anforderung_Altersklasse {
      # anforderungenId: UUID <<FK>>
      # altersklasseCode: VARCHAR(4) <<FK>>
    }

    ' #################### Spartenspezifische Erweiterungen ####################
    package "Sportfachliche Details für Prüfungen" {
        ' Alle Spezifika sind 1:1 mit Pruefung_OEPS verbunden
        entity DressurPruefungSpezifika {
            # pruefungId : UUID <<PK>> <<FK>>
            --
            ' FK zu Service_OeTO_Verwaltung.Sportfachliche_Stammdaten
            # aufgabe_stammdatum_id : UUID <<FK>>
            + platz_groesse_code : string ' z.B. 20x40, 20x60
        }
        entity SpringenPruefungSpezifika {
            # pruefungId : UUID <<PK>> <<FK>>
            --
            ' FK zu Service_ZNS_Daten.Person_ZNS
            # parcours_designer_person_id : VARCHAR(6) <<FK>>
            + anzahl_hindernisse : INTEGER
            + hoehe_max_cm : INTEGER
            + erlaubte_zeit_sek : INTEGER
            ' FK zu Service_OeTO_Verwaltung.Sportfachliche_Stammdaten
            # wertungs_verfahren_stammdatum_id : UUID <<FK>>
            + anzahl_umlaeufe : INTEGER
            + anzahl_stechen : INTEGER
        }
        ' (Vielseitigkeit und RVK Spezifika hier analog)
    }

    ' #################### Value Objects ####################
    class DatumsbereichVO <<VO>> {
     +von: Date,
     +bis: Date
     }
    class AdresseVO <<VO>> {
     +strasse: string,
     +plz: string,
     +ort: string
     }
    class DisziplinVO <<VO>> {
     +name: string
     }

    ' #################### Beziehungen ####################
    ' Aggregat-Hierarchie
    VeranstaltungsRahmen "1" -- "1..*" Turnier_OEPS : "beinhaltet"
    Turnier_OEPS "1" *-- "1..*" Pruefung_OEPS : "besteht aus"
    Pruefung_OEPS "1" *-- "1..*" Pruefung_Abteilung : "unterteilt in"

    ' Anforderungen zuordnen
    Pruefung_OEPS "1" -- "1" PruefungsAnforderungen : "hat"
    Pruefung_Abteilung "1" -- "0..1" PruefungsAnforderungen : "hat spezielle"
    PruefungsAnforderungen "1" -- "*" Anforderung_Lizenz
    PruefungsAnforderungen "1" -- "*" Anforderung_Altersklasse

    ' Sparten-Spezifika zuordnen (Vererbung/Erweiterung)
    Pruefung_OEPS <|-- DressurPruefungSpezifika
    Pruefung_OEPS <|-- SpringenPruefungSpezifika

    ' Meisterschaft/Cup Beziehungen
    class MCS_Wertungspruefung
    (Meisterschaft_Cup_Serie, MCS_Wertungspruefung) .up. Pruefung_Abteilung
}

' Beziehungen zu externen Kontexten
VeranstaltungsContext.VeranstaltungsRahmen -- Verein_ZNS : "veranstaltet von"
VeranstaltungsContext.SpringenPruefungSpezifika -- Person_ZNS : "Parcoursdesigner"
' Weitere Beziehungen zu OETORegelReferenz, Stammdaten etc.

@enduml
