@startuml ' Diagramm-Optionen skinparam linetype ortho hide empty members skinparam shadowing false skinparam defaultFontName "Segoe UI" skinparam defaultFontSize 10 skinparam roundCorner 10 allow_mixing ' --- Enums (mit Suffix E) --- enum SparteE { DRESSUR, SPRINGEN, VIELSEITIGKEIT, FAHREN, VOLTIGIEREN, WESTERN, DISTANZ, ISLAND, PFERDESPORT_SPIEL, SONDERPRUEFUNG, SONSTIGE, UNBEKANNT } enum RegelwerkTypE { OETO, FEI, SONSTIGE } enum PruefungsaufgabeNationE { NATIONAL_OEPS, FEI, SONSTIGE } enum PruefungsaufgabeRichtverfahrenModusE { GM, GT, NICHT_SPEZIFIZIERT } enum PruefungsaufgabeViereckE { VIERECK_20x40, VIERECK_20x60, ANDERE, UNBEKANNT } enum ArtDesStechensE { KEIN_STECHEN, FEHLER_ZEIT_NORMAL, FEHLER_ZEIT_AM3, SIEGERUNDE_SR1_MIT_UEBERNAHME_GP, SIEGERUNDE_SR2_OHNE_UEBERNAHME_GP, ZWEI_STECHEN_AM4, ZWEI_STECHEN_AM6, SONDERREGELUNG_AUSSCHREIBUNG } enum FunktionaerRolleE { RICHTER, RICHTER_VORSITZ, RICHTER_BEI_C, RICHTER_AM_ABREITEPLATZ, PARCOURSBAUER, PARCOURSBAU_ASSISTENT, STEWARD, TECHNISCHER_DELEGIERTER, TURNIERLEITER, TURNIERBEAUFTRAGTER, TIERARZT_TURNIER, HUFSCHMIED_TURNIER, MELDESTELLEMPERSONAL, RECHENSTELLE, SPRECHER, REITERSPRECHER, ZEITNEHMER, SCHREIBER_RICHTER, HELFER_PARCOURS, SONSTIGE_FUNKTION } enum RichterPositionE { C, E, H, B, M, VORSITZ, SONSTIGE_POSITION } enum DatenQuelleE { OEPS_ZNS, MANUELL_NATIONAL, MANUELL_INTERNATIONAL, SYSTEM_GENERIERTR } enum NennungStatusE { GEMELDET, MANUELL_ERFASST, BESTAETIGT, NACHGENANNT, BEZAHLT, STARTBERECHTIGT, ABGEMELDET_REITER, ABGEMELDET_VERANSTALTER, STORNIERT_SYSTEM } enum BeginnzeitTypE { FIX_UM, ANSCHLIESSEND, CA_UM, NACH_VORHERIGEM_BEWERB_ABTEILUNG } enum EventStatusE { IN_PLANUNG, GENEHMIGT_VERANSTALTER, OEFFENTLICH_SICHTBAR, AKTIV, ABGESCHLOSSEN, ABGESAGT } enum PlatzTypE { AUSTRAGUNG, VORBEREITUNG, LONGIEREN, SONSTIGES } ' --- Entitäten für verwaltbare Auswahllisten (Lookup Tables / Master Data) --- entity "Pruefungsaufgabe" { + id: UUID (PK) -- kuerzel: String nameLang: String sparte: SparteE nation: PruefungsaufgabeNationE '..weitere.. } entity "Richtverfahren" { + id: UUID (PK) -- code: String bezeichnung: String sparte: SparteE } entity "BewerbsKlasseDefinition" as BewerbsKlasseDef { + id: UUID (PK) -- kuerzel: String bezeichnung: String sparte: SparteE } entity "BewerbsKategorieOetoDefinition" as BewerbsKatOetoDef { + id: UUID (PK) -- kuerzel: String 'z.B. "CDN-C Neu"' bezeichnung: String abgeleiteteSparte: SparteE ' Automatisch aus Kuerzel oder manuell?' } ' --- Kern-Entitäten --- entity "Event" { + id: UUID (PK) -- bezeichnung: String datumVon: LocalDate datumBis: LocalDate } entity "Turnier" { + id: UUID (PK) -- eventId: UUID (FK) oepsTurnierNr: String titel: String ' sparte: SparteE ' Wird nun aus oetoKategorieIds abgeleitet oder ist spezifisch für das Turnier' oetoKategorieIds: List '(FKs zu BewerbsKatOetoDef)' regelwerkTyp: RegelwerkTypE datumVon: LocalDate ' Eigenes Datum pro Turnier' datumBis: LocalDate ' Eigenes Datum pro Turnier' } entity "BewerbBasis" { + id: UUID (PK) -- turnierId: UUID (FK) nummerInAusschreibung: Integer ' Eindeutig pro Turnier' uebergeordneteBezeichnung: String sparte: SparteE ' Bleibt explizit, kann aus oetoKategorieId vorgeschlagen werden' oetoKategorieId: UUID (FK zu BewerbsKatOetoDef.id) ' Die spezifische ÖTO Kategorie dieses Bewerbs' ' klasseId hier entfernt, wandert in spartspezifische Details ' } entity "DressurBewerbDetails" { + bewerbBasisId: UUID (PK, FK) -- pruefungsaufgabeId: UUID (FK) richtverfahrenId: UUID (FK) klasseId: UUID (FK zu BewerbsKlasseDef.id)? ' Klasse spezifisch für Dressur' ' zugewieseneFunktionaere: List ' } entity "SpringBewerbDetails" { + bewerbBasisId: UUID (PK, FK) -- richtverfahrenId: UUID (FK) artDesStechens: ArtDesStechensE? klasseId: UUID (FK zu BewerbsKlasseDef.id)? ' Klasse spezifisch für Springen (z.B. Höhe)' ' zugewieseneFunktionaere: List ' } entity "BewerbFunktionaerZuordnung" { + id: UUID (PK) -- ' Entweder zu bewerbBasisId oder besser zu spartspezifischer DetailId ' ' dressurBewerbDetailsId: UUID (FK)? ' ' springBewerbDetailsId: UUID (FK)? ' bewerbBasisId: UUID (FK) ' Allgemeine Zuordnung, Rolle entscheidet über Relevanz ' personId: UUID (FK) funktionaerRolle: FunktionaerRolleE positionImBewerb: String? ' Für Richterpositionen etc. ' } entity "Abteilung" { + id: UUID (PK) -- bewerbBasisId: UUID (FK) abteilungsKennzeichen: String ' z.B. "1", "A" -> ergibt mit BewerbBasis.nummer "12/1" ' bezeichnungOeffentlich: String? ' ... Teilungskriterien (strukturiert) ... } entity "Person" { + id: UUID (PK) -- nachname: String vorname: String } entity "Pferd" { + id: UUID (PK) -- name: String } entity "Nennung" { + id: UUID (PK) -- abteilungId: UUID (FK) personId: UUID (FK) pferdId: UUID (FK) } entity "Startfolge" { + id: UUID (PK) -- nennungId: UUID (FK) startNummer: Int } entity "Ergebnis" { + id: UUID (PK) -- startfolgeId: UUID (FK) platzierung: Int? } entity "FunktionaerEinsatz" { + id: UUID (PK) -- personId: UUID (FK) eventId: UUID (FK) rolle: FunktionaerRolleE positionRichter: RichterPositionE? geplanterStart: LocalDateTime geplantesEnde: LocalDateTime } entity "CupOderMeisterschaft" as Cup { + id: UUID (PK) -- name: String jahr: Int sparte: SparteE } ' --- Beziehungen (Auswahl) --- Event "1" -- "0..*" Turnier Turnier "1" -- "0..*" BewerbBasis BewerbBasis "1" -- "0..1" DressurDetails BewerbBasis "1" -- "0..1" SpringDetails BewerbBasis "1" -- "1..*" Abteilung Abteilung "1" -- "0..*" Nennung Nennung --> Person Nennung --> Pferd Nennung "1" -- "0..1" Startfolge Startfolge "1" -- "0..1" Ergebnis BewerbBasis "1" -- "0..*" BewerbFunktionaerZuordnung : "hat Funktionäre" Person "1" -- "0..*" BewerbFunktionaerZuordnung ' Oder Funktionärszuweisung über FunktionaerEinsatz und Zeit/Bewerbs-Matching ' Event "1" -- "0..*" FunktionaerEinsatz Person "1" -- "0..*" FunktionaerEinsatz Cup "1" -- "0..*" Turnier : "umfasst Turniere \n(über Zwischentabelle)" ' ... weitere Beziehungen ... @enduml