docs: add class diagram for core entities in C4 architecture
Desktop CI — Headless Tests & Build / Compose Desktop — Tests (headless) & Build (push) Has been cancelled

- Created `class_diagram_core.drawio` to visualize core domain entities (`Veranstaltung`, `Platz`, `Turnier`, etc.).
- Included relationships and associations between entities such as 1:N and reference mappings.
- Structured diagram to align with Clean Architecture principles for better domain comprehension.
This commit is contained in:
2026-04-08 14:39:02 +02:00
parent 8f0640810b
commit 3ce085ea18
@@ -0,0 +1,92 @@
<mxfile host="Electron" modified="2026-04-07T12:00:00.000Z" agent="Lead Architect" version="21.0.0" type="device">
<diagram id="class_diagram" name="Core Class Diagram">
<mxGraphModel dx="1600" dy="1200" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- Veranstaltung -->
<mxCell id="class_veranstaltung" value="&lt;b&gt;Veranstaltung&lt;/b&gt;&lt;hr&gt;+ id: UUID&lt;br&gt;+ name: String&lt;br&gt;+ ort: String&lt;br&gt;+ startDatum: LocalDate&lt;br&gt;+ endDatum: LocalDate&lt;br&gt;+ nennschluss: DateTime&lt;br&gt;+ status: Enum" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="220" height="150" as="geometry" />
</mxCell>
<!-- Austragungsplatz -->
<mxCell id="class_platz" value="&lt;b&gt;Austragungsplatz&lt;/b&gt;&lt;hr&gt;+ id: UUID&lt;br&gt;+ bezeichnung: String (z.B. Waldarena)&lt;br&gt;+ typ: Enum (Austragung, Vorbereitung)&lt;br&gt;+ sparte: Enum? (optional)&lt;br&gt;+ masse: String" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="340" y="40" width="260" height="130" as="geometry" />
</mxCell>
<!-- TurnierArtikel -->
<mxCell id="class_artikel" value="&lt;b&gt;TurnierArtikel&lt;/b&gt;&lt;hr&gt;+ id: UUID&lt;br&gt;+ bezeichnung: String (z.B. Heu, Ansage)&lt;br&gt;+ preisCent: Int&lt;br&gt;+ typ: Enum (Automatisch, Manuell)" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="660" y="40" width="240" height="110" as="geometry" />
</mxCell>
<!-- Turnier -->
<mxCell id="class_turnier" value="&lt;b&gt;Turnier&lt;/b&gt;&lt;hr&gt;+ id: UUID&lt;br&gt;+ turnierNummer: String (26128)&lt;br&gt;+ sparte: Enum&lt;br&gt;+ kategorie: Enum (C-NEU)&lt;br&gt;+ einschraenkungen: List&amp;lt;Enum&amp;gt;&lt;br&gt;+ turnierbeauftragterId: UUID" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="40" y="260" width="220" height="150" as="geometry" />
</mxCell>
<!-- Bewerb -->
<mxCell id="class_bewerb" value="&lt;b&gt;Bewerb&lt;/b&gt;&lt;hr&gt;&lt;b&gt;Identifikation:&lt;/b&gt;&lt;br&gt;+ bewerbNummer: String (z.B. 14a)&lt;br&gt;+ bezeichnung: String&lt;br&gt;+ beschreibung: String?&lt;br&gt;&lt;b&gt;Sportliches:&lt;/b&gt;&lt;br&gt;+ klasse / hoeheCm: String / Int&lt;br&gt;+ pruefungsTyp: Enum&lt;br&gt;+ aufgabe / aufgabenNummer: String?&lt;br&gt;+ paraGrade: String?&lt;br&gt;&lt;b&gt;Zeitplan &amp;amp; Ort:&lt;/b&gt;&lt;br&gt;+ austragungsplatzId: UUID?&lt;br&gt;+ geplantesDatum: LocalDate&lt;br&gt;+ beginnZeitTyp: Enum (FIX, ANSCHL)&lt;br&gt;+ beginnZeit: Time?&lt;br&gt;+ reitdauerMin / umbauMin: Int&lt;br&gt;+ besichtigungMin: Int&lt;br&gt;+ stechenGeplant: Boolean&lt;br&gt;&lt;b&gt;Finanzen &amp;amp; Orga:&lt;/b&gt;&lt;br&gt;+ startgeldCent: Int&lt;br&gt;+ geldpreisAusbezahlt: Boolean&lt;br&gt;+ teilungsTyp: Enum (inkl. MANUELL)" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="340" y="260" width="280" height="340" as="geometry" />
</mxCell>
<!-- RichterEinsatz -->
<mxCell id="class_richter" value="&lt;b&gt;RichterEinsatz&lt;/b&gt;&lt;hr&gt;+ funktionaerId: UUID&lt;br&gt;+ position: String (z.B. 'C', 'Abreiteplatz')" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="700" y="260" width="240" height="80" as="geometry" />
</mxCell>
<!-- Abteilung -->
<mxCell id="class_abteilung" value="&lt;b&gt;Abteilung&lt;/b&gt;&lt;hr&gt;+ id: UUID&lt;br&gt;+ abteilungsNummer: Int&lt;br&gt;+ bezeichnung: String (z.B. R1)&lt;br&gt;+ teilungsTyp: Enum&lt;br&gt;+ starterAnzahl: Int" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="340" y="660" width="220" height="130" as="geometry" />
</mxCell>
<!-- Nennung -->
<mxCell id="class_nennung" value="&lt;b&gt;Nennung&lt;/b&gt;&lt;hr&gt;+ id: UUID&lt;br&gt;+ reiterId: UUID&lt;br&gt;+ pferdId: UUID&lt;br&gt;+ zahlerId: UUID&lt;br&gt;+ status: Enum&lt;br&gt;+ istNachnennung: Boolean" style="shape=swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="660" y="660" width="220" height="130" as="geometry" />
</mxCell>
<!-- Relationen -->
<!-- Veranstaltung -> Platz -->
<mxCell id="rel_ver_platz" value="1 : N" style="endArrow=classic;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_veranstaltung" target="class_platz">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
<!-- Veranstaltung -> Artikel -->
<mxCell id="rel_ver_artikel" value="1 : N" style="endArrow=classic;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_veranstaltung" target="class_artikel">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
<!-- Veranstaltung -> Turnier -->
<mxCell id="rel_ver_tur" value="1 : N" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_veranstaltung" target="class_turnier">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
<!-- Turnier -> Bewerb -->
<mxCell id="rel_tur_bew" value="1 : N" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_turnier" target="class_bewerb">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
<!-- Bewerb -> Richter -->
<mxCell id="rel_bew_richter" value="1 : N" style="endArrow=classic;html=1;exitX=1;exitY=0.1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_bewerb" target="class_richter">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
<!-- Bewerb -> Platz (Referenz) -->
<mxCell id="rel_bew_platz" value="Ref" style="endArrow=dashed;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_bewerb" target="class_platz">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
<!-- Bewerb -> Abteilung -->
<mxCell id="rel_bew_abt" value="1 : N" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_bewerb" target="class_abteilung">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
<!-- Abteilung -> Nennung -->
<mxCell id="rel_abt_nen" value="1 : N" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="class_abteilung" target="class_nennung">
<mxGeometry width="50" height="50" relative="1" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>