@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 <> -- lizenzTypGlobalCode : VARCHAR(15) <> ' Eindeutiges OEPS Kürzel bezeichnung : VARCHAR(100) spartePrimaer : SparteE? kategorieLizenzText : VARCHAR(50) ' LizenzKategorieE als String oder Enum intern stufe: VARCHAR(10)? aufschluesselungKombilizenzCodes: List? istAktiv: Boolean } entity QualifikationsTyp { + qualTypId : UUID <> -- qualTypCode : VARCHAR(30) <> ' Eindeutiges Kürzel bezeichnung : VARCHAR(100) sparte : SparteE istAktiv: Boolean } entity LandDefinition { + landId: UUID <> -- isoAlpha2Code: String <> isoAlpha3Code: String <> nameDeutsch: String } entity BundeslandDefinition { + bundeslandId: UUID <> -- landId: UUID <> 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) <> -- 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) <> '.. viele weitere Rohdaten-Felder .. import_timestamp: TIMESTAMP } entity Verein_ZNS_Staging { + oeps_vereins_nr : VARCHAR(4) <> name_roh : VARCHAR(50) import_timestamp: TIMESTAMP } } ' #################################################################################### ' ### Service Domänen-Stammdaten (Unsere finalisierten Domänenobjekte) ### ' #################################################################################### package "Service Domänen-Stammdaten" { entity DomVerein { + vereinId: UUID <> -- oepsVereinsNr: String? <> name: String kuerzel: String? adresseStrasse: String? plz: String? ort: String? bundeslandId: UUID <>? landId: UUID <> emailAllgemein: String? telefonAllgemein: String? webseiteUrl: String? datenQuelle: DatenQuelleE istAktiv: Boolean notizenIntern: String? createdAt: Instant updatedAt: Instant } entity DomPerson { + personId: UUID <> -- oepsSatzNr: String? <> nachname: String vorname: String titel: String? geburtsdatum: LocalDate? geschlecht: GeschlechtE? nationalitaetLandId: UUID <>? feiId: String? telefon: String? email: String? strasse: String? plz: String? ort: String? adresszusatzZusatzinfo: String? stammVereinId: UUID <>? 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 <> -- oepsSatzNrPferd: String? <> 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 <>? verantwortlichePersonId: UUID <>? heimatVereinId: UUID <>? letzteZahlungPferdegebuehrJahrOeps: Int? stockmassCm: Int? datenQuelle: DatenQuelleE istAktiv: Boolean notizenIntern: String? createdAt: Instant updatedAt: Instant } entity DomLizenz { + lizenzId: UUID <> -- personId: UUID <> lizenzTypGlobalId: UUID <> ' Verweis auf Service_OeTO_Verwaltung.LizenzTypGlobal gueltigBisJahr: Int? ausgestelltAm: LocalDate? istAktivBezahltOeps: Boolean notiz: String? createdAt: Instant updatedAt: Instant } entity DomQualifikation { + qualifikationId: UUID <> -- personId: UUID <> qualTypId: UUID <> ' 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