@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 <> -- ' -- 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 <> { ' 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 <> { ' Referenz zur originalen Person + oepsSatzNrPerson : VARCHAR(6) ' Relevante Daten zum Zeitpunkt der Nennung + name : string + vereinsName : string ' Snapshot der Lizenzen zur Validierung + lizenzSnapshot : List } ' Snapshot der wichtigsten Pferdedaten aus dem Personen_Context. class PferdeReferenzVO <> { ' 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 <> { + erlaubteAltersklassen : List + erforderlicheLizenzen : List } class GeldbetragVO <> { + 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