meldestelle/docs/diagrams/ER-Dia-Iteration-4.puml
2025-05-16 14:38:16 +02:00

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