307 lines
6.2 KiB
Plaintext
307 lines
6.2 KiB
Plaintext
@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<UUID> '(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<BewerbFunktionaerZuordnung> '
|
|
}
|
|
|
|
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<BewerbFunktionaerZuordnung> '
|
|
}
|
|
|
|
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
|