# Konzept: Zeitplan-Optimierung (Drag & Drop Logik) > **Status:** ENTWURF | **Datum:** 11. April 2026 > **Autor:** 🏗️ Lead Architect > **Kontext:** Phase 9 — Zeitplan & Protokollierung ## 1. Vision & Zielsetzung Die Zeitplan-Optimierung ist das zentrale Werkzeug für die Meldestelle, um den Turnierablauf dynamisch an die Gegebenheiten vor Ort anzupassen. Ziel ist eine intuitive, visuelle Oberfläche (Kalender-Ansicht), in der Bewerbe und Abteilungen per Drag & Drop verschoben werden können, wobei das System automatisch Auswirkungen auf Folge-Bewerbe berechnet und vor Konflikten warnt. ## 2. Fachliche Anforderungen (Use Cases) ### UC-1: Verschieben eines Bewerbs/einer Abteilung - Ein Benutzer zieht einen Bewerb oder eine Abteilung auf eine neue Startzeit oder einen anderen Austragungsplatz. - **System-Reaktion:** - Neuberechnung der Endzeit basierend auf `reitdauerMinuten * starterAnzahl + besichtigungMinuten + umbauMinuten`. - Prüfung auf Überschneidungen am selben Austragungsplatz. - Warnung bei Konflikten (z.B. Richter-Doppelbelegung). ### UC-2: Dynamische Zeitplan-Anpassung („Anschließend“) - Bewerbe können als `ANSCHLIESSEND` markiert werden (`beginnZeitTyp`). - **System-Reaktion:** Wenn der vorangehende Bewerb verschoben wird oder länger dauert, verschiebt sich der anschließende Bewerb automatisch mit. ### UC-3: Drag & Drop in der Startliste - Innerhalb einer Startliste können Teilnehmer per Drag & Drop umsortiert werden. - **System-Reaktion:** Automatische Aktualisierung der Kopfnummern (Startnummern) und Neuberechnung der individuellen Startzeiten. ### UC-4: Protokollierung (Audit Log) - Jede manuelle Änderung am Zeitplan oder der Startlisten-Reihenfolge muss protokolliert werden. - **Grund:** Nachvollziehbarkeit bei Einsprüchen und Synchronisation zwischen verschiedenen Arbeitsplätzen (Meldestelle ↔ Richterturm). ## 3. Datenmodell-Erweiterungen & Logik ### 3.1 Erweiterung `Bewerb` & `Abteilung` Das bestehende Modell in `entries-domain` deckt bereits viele Felder ab. Für die Optimierung präzisieren wir: - **`Umbauzeit`:** Zeit zwischen zwei Abteilungen oder Bewerben. - **`Pausen`:** Geplante Unterbrechungen (z.B. Mittagspause, Platzpflege) werden als spezielle „Blocker-Events“ im Zeitplan geführt. - **`BesichtigungsBlock` (NEU):** Eigenständiges Objekt für Parcoursbesichtigungen. - Kann mit mehreren Bewerben/Abteilungen verknüpft werden (Cross-Competition Inspection). - Unterstützt Typen: `ZU_FUSS` (Standard) und `ZU_PFERD` (Spezialfall für Springpferde bis 110cm gemäß ÖTO). - Validierung: Mindestens 5 Min. Puffer vor dem ersten Start (ÖTO §43). ### 3.2 Zeitberechnungs-Algorithmus (Präzisierung) Die Logik in `StartlistenService.berechneStartzeiten` wird erweitert: 1. **Basis:** `Startzeit` der Abteilung. 2. **Vorlauf:** `besichtigungMinuten`. 3. **Starter-Loop:** - `individuelleStartzeit = aktuelleZeit`. - `aktuelleZeit += bewerb.reitdauerMinuten`. - *Neu:* Berücksichtigung von festen Pausen nach X Startern (z.B. 10 Min. Pause alle 20 Starter). 4. **Nachlauf:** `umbauMinuten` am Ende der Abteilung/des Bewerbs. ### 3.3 Drag & Drop Logik (Frontend & Backend) - **Frontend (Compose Desktop):** - Implementierung eines `DraggableBewerbItem`. - Visuelle Darstellung von Konflikten (Rote Markierung bei Überlappung). - **Backend (API):** - Neuer Endpunkt `PATCH /bewerbe/{id}/zeitplan` für schnelle Updates. - Validierung der neuen Zeiten gegen den `austragungsplatzId` und `richterEinsaetze`. ## 4. Konflikt-Management Das System arbeitet nach dem Prinzip **„Warnen statt Blockieren“** (ADR-0016): - **Harte Fehler:** Nur bei technischer Unmöglichkeit (z.B. Datum in der Vergangenheit bei Live-Betrieb). - **Warnungen:** - Überlappung auf dem Platz. - Richter hat gleichzeitig Einsatz in anderem Bewerb. - Zeitunterschreitung für Reiter (Reiter startet in zwei kurz aufeinanderfolgenden Bewerben). ## 5. Synchronisation (Offline-First) Änderungen am Zeitplan erzeugen `SyncEvents` (gemäß ADR-0022). - **Lamport-Uhren:** Stellen sicher, dass bei gleichzeitigen Änderungen an zwei Laptops die zeitlich spätere Änderung (oder die mit höherer Priorität) gewinnt. - **Echtzeit-Update:** Über WebSockets werden Zeitplan-Änderungen sofort an alle verbundenen Clients (z.B. Anzeige-Monitor, Richter-Tablet) gepusht. ## 6. Nächste Schritte 1. **Backend:** ✅ Implementiert (BewerbService, API, Zeitberechnungs-Pausen). 2. **Frontend:** Prototyping der Kalender-Ansicht mit Compose Desktop. 3. **QA:** Test-Szenarien für komplexe Verschiebungen (Kettenreaktionen bei „Anschließend“).