@startuml
title "Detailliertes Datenmodell: Nennungs_Context"

!theme vibrant

' Externe Referenzen werden der Übersichtlichkeit halber als vereinfachte Entitäten dargestellt.
package "Externe Referenzen (Andere Kontexte)" {
    class Veranstaltungs_Context_API
    class Personen_Context_API
    class Lizenzen_Context_API
}

package "Nennungsabwicklung" as NennungsContext {

    ' #################### Aggregate Root: Nennung ####################
    class Nennung <<(A,blue) Aggregate Root>> {
        + nennungId : UUID <<PK>>
        --
        ' -- Snapshots von Daten aus anderen Kontexten --
        ' Daten zur Prüfung/Abteilung zum Zeitpunkt der Nennung
        + pruefung : PruefungsReferenzVO
        ' Daten zum Reiter zum Zeitpunkt der Nennung
        + reiter : ReiterReferenzVO
        ' Daten zum Pferd zum Zeitpunkt der Nennung
        + pferd : PferdeReferenzVO
        ' Optionaler Ersatzreiter gem. KKARTEI-Satz
        + ersatzreiter : ReiterReferenzVO
        --
        ' -- Nennungsspezifische Attribute --
        + nennungsZeitpunkt : timestamp
        + status : NennungsStatusVO
        ' Kopfnummer gem. KKARTEI-Satz
        + zugewieseneKopfnummer : VARCHAR(4)
        ' Nenn- und Startgeld
        + nenngebuehr : GeldbetragVO
        ' Zahlungsstatus der Nenngebühr
        + bezahlStatus : BezahlStatusVO
        ' Betrag, der lt. Nennliste eingezahlt wurde
        ' KKARTEI, Stelle 161-165
        + bezahltBetragKontrolle : GeldbetragVO
        ' Betrag, der mit dem Veranstalter verrechnet wird
        ' KKARTEI, Stelle 118-122
        + accontoBetrag : GeldbetragVO
        ' Box bestellt? Gem. KKARTEI-Satz
        + istStallReserviert : boolean
        ' Grund, falls die Nennung abgelehnt wurde
        + ablehnungsGrund : string
    }

    ' #################### Value Objects (VOs) für Snapshots und Beschreibungen ####################
    ' Snapshot der wichtigsten Prüfungsdaten aus dem Veranstaltungs_Context.
    class PruefungsReferenzVO <<VO>> {
        ' Referenz zur originalen Abteilung
        + pruefungAbteilungDbId : UUID
        ' Relevante Daten zum Zeitpunkt der Nennung
        + turnierName : string
        + bewerbBezeichnung : string
        + abteilungBezeichnung : string
        ' Anforderungsprofil, das zum Zeitpunkt der Nennung galt
        + anforderungsProfil : AnforderungsProfilVO
    }

    ' Snapshot der wichtigsten Reiterdaten aus dem Personen_Context.
    class ReiterReferenzVO <<VO>> {
        ' Referenz zur originalen Person
        + oepsSatzNrPerson : VARCHAR(6)
        ' Relevante Daten zum Zeitpunkt der Nennung
        + name : string
        + vereinsName : string
        ' Snapshot der Lizenzen zur Validierung
        + lizenzSnapshot : List<string>
    }

    ' Snapshot der wichtigsten Pferdedaten aus dem Personen_Context.
    class PferdeReferenzVO <<VO>> {
        ' Referenz zum originalen Pferd
        + oepsSatzNrPferd : VARCHAR(10)
        ' Relevante Daten zum Zeitpunkt der Nennung
        + name : string
    }

    ' Kapselt die Anforderungen, die zum Zeitpunkt der Nennung gültig waren.
    class AnforderungsProfilVO <<VO>> {
        + erlaubteAltersklassen : List<string>
        + erforderlicheLizenzen : List<string>
    }

    class GeldbetragVO <<VO>> {
        + wert : decimal
        + waehrung : string
    }

    ' Enum für den Lebenszyklus einer Nennung.
    enum NennungsStatusVO {
        EINGEGANGEN
        IN_PRUEFUNG
        STARTBERECHTIGT_BESTAETIGT
        ABGELEHNT
        ZURUECKGEZOGEN
    }

    ' Enum für den Zahlungsstatus.
    enum BezahlStatusVO {
        OFFEN
        BEZAHLT
    }


    ' #################### Beziehungen ####################
    ' Die Nennung ist das einzige Aggregat und enthält ihre beschreibenden VOs (Komposition).
    Nennung "1" o-- "1" PruefungsReferenzVO
    Nennung "1" o-- "1" ReiterReferenzVO
    Nennung "1" o-- "1" PferdeReferenzVO
    Nennung "1" o-- "0..1" ReiterReferenzVO : "Ersatzreiter"
    Nennung "1" o-- "1" GeldbetragVO : "Nenngebühr"
    Nennung "1" -- "1" NennungsStatusVO
    Nennung "1" -- "1" BezahlStatusVO
}

' Beziehungen zu externen Kontexten (dargestellt als API-Aufrufe)
Nennung ..> Veranstaltungs_Context_API : "holt Prüfungsdetails"
Nennung ..> Personen_Context_API : "holt Reiter-/Pferdedetails"
Nennung ..> Lizenzen_Context_API : "prüft Startberechtigung"

note right of Nennung
  **Aggregate Root: Nennung**
  * **Verantwortung:** Eine Nennung ist eine unteilbare, transaktionale Einheit. Sie repräsentiert den "Vertrag" zwischen Reiter und Veranstalter für die Teilnahme an einer Prüfung.
  * **Datenherkunft:** Viele Attribute sind direkt auf den `KKARTEI`-Satz im OEPS Pflichtenheft zurückzuführen, z.B. `ERSATZREITER` , `ACCONTO` , `STALL`  und `BEZAHLT`.
  * **Validierungslogik:** Bei der Erstellung oder Prüfung einer Nennung ruft das Aggregat andere Kontexte auf, um die aktuellen Daten zu verifizieren (z.B. "Ist die Lizenz des Reiters noch gültig?"). Die Entscheidung ("Akzeptiert" / "Abgelehnt") wird aber hier im `Nennungs_Context` getroffen und gespeichert.
end note

@enduml
