From c6bb534a0d16d9ec6937622378b17d5aa7afa342 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 3 Oct 2025 23:01:13 +0200 Subject: [PATCH] =?UTF-8?q?Erweitert=20den=20MatchReportApiDialog=20um=20V?= =?UTF-8?q?alidierungslogik=20f=C3=BCr=20Mindestspielerzahlen=20und=20Dopp?= =?UTF-8?q?el.=20F=C3=BCgt=20Methoden=20zur=20=C3=9Cberpr=C3=BCfung=20der?= =?UTF-8?q?=20Spieleranzahl=20und=20Doppelformationen=20basierend=20auf=20?= =?UTF-8?q?dem=20Spielmodus=20hinzu.=20Implementiert=20Fehlermeldungen=20z?= =?UTF-8?q?ur=20Anzeige=20von=20Validierungsfehlern=20f=C3=BCr=20Heim-=20u?= =?UTF-8?q?nd=20Gastteams.=20Verbessert=20die=20Benutzeroberfl=C3=A4che=20?= =?UTF-8?q?mit=20neuen=20CSS-Stilen=20f=C3=BCr=20Fehlermeldungen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/MatchAccountDialog.vue | 0 .../src/components/MatchReportApiDialog.vue | 216 +++++++++++++++++- 2 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/MatchAccountDialog.vue diff --git a/frontend/src/components/MatchAccountDialog.vue b/frontend/src/components/MatchAccountDialog.vue new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/components/MatchReportApiDialog.vue b/frontend/src/components/MatchReportApiDialog.vue index 5f6f30a..f361305 100644 --- a/frontend/src/components/MatchReportApiDialog.vue +++ b/frontend/src/components/MatchReportApiDialog.vue @@ -135,6 +135,10 @@ ✍️ Aufstellung signieren + +
+ {{ getPlayerCountErrorMessage('home') }} +
@@ -226,6 +230,10 @@ ✍️ Aufstellung signieren + +
+ {{ getPlayerCountErrorMessage('guest') }} +
@@ -2255,7 +2263,198 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr canSignLineup(team) { const pin = team === 'home' ? this.homePin : this.guestPin; - return pin && pin.length > 0; + + // PIN prüfen + if (!pin || pin.length === 0) { + return false; + } + + // Mindestspielerzahlen prüfen + if (!this.hasMinimumPlayerCount(team)) { + return false; + } + + // Mindestdoppelzahlen prüfen + if (!this.hasMinimumDoubleCount(team)) { + return false; + } + + return true; + }, + + // Prüfe Mindestspielerzahlen basierend auf Spielmodus + hasMinimumPlayerCount(team) { + const playMode = this.getPlayMode(); + const selectedPlayers = this.getSelectedPlayerCount(team); + const requiredPlayers = this.getRequiredPlayerCount(playMode); + + return selectedPlayers >= requiredPlayers; + }, + + // Prüfe Mindestdoppelzahlen basierend auf Spielmodus + hasMinimumDoubleCount(team) { + const playMode = this.getPlayMode(); + const doubleCount = this.getDoubleCount(team); + const selectedPlayers = this.getSelectedPlayerCount(team); + const requiredDoubles = this.getMinimumDoubleRequirement(playMode, selectedPlayers); + + return doubleCount >= requiredDoubles; + }, + + // Bestimme erforderliche Mindestdoppelzahl basierend auf Spielmodus und Spieleranzahl + getMinimumDoubleRequirement(playMode, playerCount) { + const mode = (playMode || '').toLowerCase(); + + // 6er System + if (mode.includes('6')) { + if (playerCount === 6) { + return 6; // Alle 6 müssen Doppel spielen + } else { + return 4; // 4-5 Spieler: 4 müssen Doppel spielen + } + } + + // Braunschweiger System + if (mode.includes('braunschweiger')) { + if (playerCount === 2) { + return 2; // Alle 2 müssen Doppel spielen + } else if (playerCount === 3) { + return 2; // 2 von 3 müssen Doppel spielen + } else if (playerCount >= 4) { + return playerCount; // Alle müssen Doppel spielen + } + return 0; + } + + // Andere 4er Systeme (paarkreuz, bundessystem, werner-scheffler, etc.) + if (mode.includes('4') || mode.includes('paarkreuz') || mode.includes('bundes') || mode.includes('werner')) { + if (playerCount === 3) { + return 2; // 2 von 3 müssen Doppel spielen + } else if (playerCount >= 4) { + return playerCount; // Alle müssen Doppel spielen + } + return Math.min(playerCount, 1); // Mindestens 1 Doppel + } + + // 3er System + if (mode.includes('3')) { + return Math.min(playerCount, 1); // Mindestens 1 Doppel + } + + // Default: Mindestens 1 Doppel + return Math.min(playerCount, 1); + }, + + + // Zähle Anzahl der Doppel für ein Team + getDoubleCount(team) { + try { + if (team === 'home') { + const homePlayers = this.meetingDetails?.teamLineupHomePlayers || this.teamLineupHomePlayers || []; + return homePlayers.reduce((count, player) => { + return count + (player.positionDouble ? 1 : 0); + }, 0); + } else if (team === 'guest') { + const guestPlayers = this.meetingDetails?.teamLineupGuestPlayers || this.teamLineupGuestPlayers || []; + return guestPlayers.reduce((count, player) => { + return count + (player.positionDouble ? 1 : 0); + }, 0); + } + return 0; + } catch (error) { + console.error('❌ getDoubleCount Fehler:', error); + return 0; + } + }, + + + // Hole aktuellen Spielmodus + getPlayMode() { + return (this.meetingDetails && this.meetingDetails.playMode) || + (this.meetingData && (this.meetingData.playMode || this.meetingData.matchSystem || this.meetingData.system)) || + ''; + }, + + // Bestimme erforderliche Mindestspielerzahl für Spielmodus + getRequiredPlayerCount(playMode) { + const mode = (playMode || '').toLowerCase(); + + // 6er System: 4 Spieler erforderlich + if (mode.includes('6')) { + return 4; + } + + // 3er System: 2 Spieler erforderlich + if (mode.includes('3')) { + return 2; + } + + // Braunschweiger System: 2 Spieler erforderlich + if (mode.includes('braunschweiger')) { + return 2; + } + + // Alle anderen 4-Spieler-Systeme: 3 Spieler erforderlich + // (paarkreuz-system, bundessystem, werner-scheffler-system, etc.) + return 3; + }, + + // Hole Fehlermeldung für Mindestspielerzahlen und Doppel + getPlayerCountErrorMessage(team) { + const playMode = this.getPlayMode(); + const selectedPlayers = this.getSelectedPlayerCount(team); + const requiredPlayers = this.getRequiredPlayerCount(playMode); + const doubleCount = this.getDoubleCount(team); + const requiredDoubles = this.getMinimumDoubleRequirement(playMode, selectedPlayers); + + const teamName = team === 'home' ? 'Heim' : 'Gast'; + const playModeName = playMode || 'unbekanntes System'; + + const errors = []; + + // Spielerfehler + if (selectedPlayers < requiredPlayers) { + errors.push(`${teamName}team hat nur ${selectedPlayers}/${requiredPlayers} Spieler (${playModeName} benötigt mindestens ${requiredPlayers} Spieler)`); + } + + // Doppelfehler + if (doubleCount < requiredDoubles) { + const mode = playMode.toLowerCase(); + let explanation = ''; + + // Spezielle Erklärungen basierend auf System und Spieleranzahl + if (mode.includes('6')) { + if (selectedPlayers === 6 && requiredDoubles === 6) { + explanation = 'alle 6 Spieler müssen Doppel spielen'; + } else if (requiredDoubles === 4) { + explanation = '4 Spieler müssen Doppel spielen'; + } + } else if (mode.includes('braunschweiger')) { + if (selectedPlayers === 2) { + explanation = 'beide Spieler müssen Doppel spielen'; + } else if (selectedPlayers === 3) { + explanation = '2 von 3 Spielern müssen Doppel spielen'; + } else if (requiredDoubles === selectedPlayers) { + explanation = `alle ${selectedPlayers} Spieler müssen Doppel spielen`; + } + } else if (mode.includes('4') || mode.includes('paarkreuz') || mode.includes('bundes') || mode.includes('werner')) { + if (selectedPlayers === 3 && requiredDoubles === 2) { + explanation = '2 von 3 Spielern müssen Doppel spielen'; + } else if (requiredDoubles === selectedPlayers) { + explanation = `alle ${selectedPlayers} Spieler müssen Doppel spielen`; + } + } else { + explanation = `mindestens ${requiredDoubles} Doppel erforderlich`; + } + + errors.push(`${teamName}team hat nur ${doubleCount}/${requiredDoubles} Doppel-spieler (${playModeName} erfordert: ${explanation})`); + } + + if (errors.length === 0) { + return ''; + } + + return `⚠️ ${errors.join(', ')}`; }, // Hash4096 - 4096-mal SHA-512 (wie nuscore verwendet!) @@ -3296,6 +3495,21 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr background-color: #6c757d; } +/* Fehlermeldung bei PIN-Eingabe */ +.pin-error-message { + margin-top: 8px; + padding: 8px 12px; + background-color: #fee; + border: 1px solid #fcc; + border-radius: 4px; + color: #c33; + font-size: 14px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; +} + /* Zertifizierung-Styles */ .section-btn.certified { background-color: #d4edda;