@startuml
!theme vibrant

title Datenbankmodell ÖTO - Fokus: Domänen-Stammdaten (Stand: 26. Mai 2025, 20:12 Uhr)

' Diagramm-Optionen
skinparam linetype ortho
hide empty members
skinparam shadowing false
skinparam defaultFontName "Segoe UI"
skinparam defaultFontSize 9
skinparam roundCorner 10
allow_mixing
skinparam packageStyle rect

' --- Enums (mit Suffix E) - Auswahl ---
enum DatenQuelleE {
 OEPS_ZNS,
 MANUELL_NATIONAL,
 MANUELL_INTERNATIONAL,
 SYSTEM_GENERIERTR
 }
enum GeschlechtE {
 M,
 W,
 UNBEKANNT
 }
 ' Angepasst gemäß deiner Implementierung
enum PferdeGeschlechtE {
 HENGST,
 STUTE,
 WALLACH,
 UNBEKANNT
 }
enum SparteE {
 DRESSUR,
 SPRINGEN,
 VIELSEITIGKEIT,
 }


' #####################################################################
' ### Service OeTO-Verwaltung (Definitionen) - Gekürzt dargestellt  ###
' #####################################################################
package "Service OeTO-Verwaltung" {
  entity LizenzTypGlobal {
    + lizenzTypGlobalId : UUID <<PK>>
    --
    lizenzTypGlobalCode : VARCHAR(15) <<UQ>> ' Eindeutiges OEPS Kürzel
    bezeichnung : VARCHAR(100)
    spartePrimaer : SparteE?
    kategorieLizenzText : VARCHAR(50) ' LizenzKategorieE als String oder Enum intern
    stufe: VARCHAR(10)?
    aufschluesselungKombilizenzCodes: List<VARCHAR(10)>?
    istAktiv: Boolean
  }

  entity QualifikationsTyp {
    + qualTypId : UUID <<PK>>
    --
    qualTypCode : VARCHAR(30) <<UQ>> ' Eindeutiges Kürzel
    bezeichnung : VARCHAR(100)
    sparte : SparteE
    istAktiv: Boolean
  }

  entity LandDefinition {
    + landId: UUID <<PK>>
    --
    isoAlpha2Code: String <<UQ>>
    isoAlpha3Code: String <<UQ>>
    nameDeutsch: String
  }

  entity BundeslandDefinition {
    + bundeslandId: UUID <<PK>>
    --
    landId: UUID <<FK>>
    oepsCode: String? ' Eindeutig für Österreich
    name: String
  }
}

' #####################################################################
' ### Service ZNS-Daten (Staging) - Gekürzt dargestellt            ###
' #####################################################################
package "Service ZNS-Daten (Staging)" {
  entity Person_ZNS_Staging {
    + oeps_satz_nr_person : VARCHAR(6) <<PK>>
    --
    familienname_roh : VARCHAR(50)
    vorname_roh : VARCHAR(25)
    '.. viele weitere Rohdaten-Felder ..
    lizenzinfo_raw_oeps_roh : VARCHAR(10)?
    qualifikationen_raw_oeps_roh: VARCHAR(30)?
    import_timestamp: TIMESTAMP
  }
  entity Pferd_ZNS_Staging {
    + oeps_satz_nr_pferd : VARCHAR(10) <<PK>>
    '.. viele weitere Rohdaten-Felder ..
    import_timestamp: TIMESTAMP
  }
  entity Verein_ZNS_Staging {
    + oeps_vereins_nr : VARCHAR(4) <<PK>>
    name_roh : VARCHAR(50)
    import_timestamp: TIMESTAMP
  }
}

' ####################################################################################
' ### Service Domänen-Stammdaten (Unsere finalisierten Domänenobjekte)             ###
' ####################################################################################
package "Service Domänen-Stammdaten" {
    entity DomVerein {
        + vereinId: UUID <<PK>>
        --
        oepsVereinsNr: String? <<UQ>>
        name: String
        kuerzel: String?
        adresseStrasse: String?
        plz: String?
        ort: String?
        bundeslandId: UUID <<FK>>?
        landId: UUID <<FK>>
        emailAllgemein: String?
        telefonAllgemein: String?
        webseiteUrl: String?
        datenQuelle: DatenQuelleE
        istAktiv: Boolean
        notizenIntern: String?
        createdAt: Instant
        updatedAt: Instant
    }

    entity DomPerson {
        + personId: UUID <<PK>>
        --
        oepsSatzNr: String? <<UQ>>
        nachname: String
        vorname: String
        titel: String?
        geburtsdatum: LocalDate?
        geschlecht: GeschlechtE?
        nationalitaetLandId: UUID <<FK>>?
        feiId: String?
        telefon: String?
        email: String?
        strasse: String?
        plz: String?
        ort: String?
        adresszusatzZusatzinfo: String?
        stammVereinId: UUID <<FK>>?
        mitgliedsNummerBeiStammVerein: String?
        istGesperrt: Boolean
        sperrGrund: String?
        altersklasseOepsCodeRaw: String?
        istJungerReiterOepsFlag: Boolean
        kaderStatusOepsRaw: String?
        datenQuelle: DatenQuelleE
        istAktiv: Boolean
        notizenIntern: String?
        createdAt: Instant
        updatedAt: Instant
    }

    entity DomPferd {
        + pferdId: UUID <<PK>>
        --
        oepsSatzNrPferd: String? <<UQ>>
        oepsKopfNr: String?
        name: String
        lebensnummer: String?
        feiPassNr: String?
        geburtsjahr: Int?
        geschlecht: PferdeGeschlechtE?
        farbe: String?
        rasse: String?
        abstammungVaterName: String?
        abstammungMutterName: String?
        abstammungMutterVaterName: String?
        abstammungZusatzInfo: String?
        besitzerPersonId: UUID <<FK>>?
        verantwortlichePersonId: UUID <<FK>>?
        heimatVereinId: UUID <<FK>>?
        letzteZahlungPferdegebuehrJahrOeps: Int?
        stockmassCm: Int?
        datenQuelle: DatenQuelleE
        istAktiv: Boolean
        notizenIntern: String?
        createdAt: Instant
        updatedAt: Instant
    }

    entity DomLizenz {
        + lizenzId: UUID <<PK>>
        --
        personId: UUID <<FK>>
        lizenzTypGlobalId: UUID <<FK>> ' Verweis auf Service_OeTO_Verwaltung.LizenzTypGlobal
        gueltigBisJahr: Int?
        ausgestelltAm: LocalDate?
        istAktivBezahltOeps: Boolean
        notiz: String?
        createdAt: Instant
        updatedAt: Instant
    }

    entity DomQualifikation {
        + qualifikationId: UUID <<PK>>
        --
        personId: UUID <<FK>>
        qualTypId: UUID <<FK>> ' Verweis auf Service_OeTO_Verwaltung.QualifikationsTyp
        bemerkung: String?
        gueltigVon: LocalDate?
        gueltigBis: LocalDate?
        istAktiv: Boolean
        createdAt: Instant
        updatedAt: Instant
    }
}

' --- Beziehungen für Domänen-Stammdaten ---
Service_Domänen_Stammdaten.DomVerein -- "? Service_OeTO_Verwaltung.BundeslandDefinition : hat Bundesland"
Service_Domänen_Stammdaten.DomVerein -- "1" Service_OeTO_Verwaltung.LandDefinition : ist in Land"

Service_Domänen_Stammdaten.DomPerson -- "? Service_OeTO_Verwaltung.LandDefinition : hat Nationalität"
Service_Domänen_Stammdaten.DomPerson "0..1" -- "1" Service_Domänen_Stammdaten.DomVerein : hat Stammverein >
Service_Domänen_Stammdaten.DomPerson "1" -- "0..*" Service_Domänen_Stammdaten.DomLizenz : besitzt
Service_Domänen_Stammdaten.DomPerson "1" -- "0..*" Service_Domänen_Stammdaten.DomQualifikation : besitzt

Service_Domänen_Stammdaten.DomPferd "0..1" -- "1" Service_Domänen_Stammdaten.DomPerson : hat Besitzer >
Service_Domänen_Stammdaten.DomPferd "0..1" -- "1" Service_Domänen_Stammdaten.DomPerson : hat Verantwortlichen >
Service_Domänen_Stammdaten.DomPferd "0..1" -- "1" Service_Domänen_Stammdaten.DomVerein : hat Heimatverein >

Service_Domänen_Stammdaten.DomLizenz -- "1" Service_OeTO_Verwaltung.LizenzTypGlobal : ist vom Typ
Service_Domänen_Stammdaten.DomQualifikation -- "1" Service_OeTO_Verwaltung.QualifikationsTyp : ist vom Typ


' --- Andeutung der weiteren Pakete und wichtigsten Entitäten (stark gekürzt) ---
package "Service Veranstaltungsplanung" {
  entity VeranstaltungsRahmen
  entity Turnier_OEPS
  'BewerbBasis'
  entity Pruefung_OEPS
  package "Sportfachliche Details Pruefung" {
    entity DressurPruefungSpezifika
    entity SpringPruefungSpezifika
  }
  entity Pruefung_Abteilung
  entity Meisterschaft_Cup_Serie
}

package "Service Nennungsabwicklung" {
  entity Nennung
  entity NennungsTeilnehmerSnapshot
  entity Startfolge
  entity Ergebnis_Zeile
  package "Sportfachliche Details Ergebnis" {
    entity DressurErgebnisSpezifika
    entity SpringenErgebnisSpezifika
  }
}

package "Service Funktionärsplanung" {
    entity FunktionaerEinsatzPlanung
}


' --- Wichtige übergreifende Beziehungen (Beispiele) ---
Service_Veranstaltungsplanung.VeranstaltungsRahmen "1" -- "0..*" Service_Veranstaltungsplanung.Turnier_OEPS
Service_Veranstaltungsplanung.Turnier_OEPS "1" -- "0..*" Service_Veranstaltungsplanung.Pruefung_OEPS
Service_Veranstaltungsplanung.Pruefung_OEPS "1" o-- "0..1" Service_Veranstaltungsplanung.Sportfachliche_Details_Pruefung.DressurPruefungSpezifika
Service_Veranstaltungsplanung.Pruefung_OEPS "1" o-- "0..1" Service_Veranstaltungsplanung.Sportfachliche_Details_Pruefung.SpringPruefungSpezifika
Service_Veranstaltungsplanung.Pruefung_OEPS "1" -- "1..*" Service_Veranstaltungsplanung.Pruefung_Abteilung

Service_Nennungsabwicklung.Nennung -- Service_Veranstaltungsplanung.Pruefung_Abteilung
Service_Nennungsabwicklung.Nennung -- Service_Domänen_Stammdaten.DomPerson
Service_Nennungsabwicklung.Nennung -- Service_Domänen_Stammdaten.DomPferd

Service_Funktionärsplanung.FunktionaerEinsatzPlanung -- Service_Domänen_Stammdaten.DomPerson
Service_Funktionärsplanung.FunktionaerEinsatzPlanung -- Service_Veranstaltungsplanung.VeranstaltungsRahmen
' ... usw.

@enduml
