diff --git a/backend/services/tournamentService.js b/backend/services/tournamentService.js index 4109f9a..583130b 100644 --- a/backend/services/tournamentService.js +++ b/backend/services/tournamentService.js @@ -380,8 +380,13 @@ class TournamentService { for (const m of groupMatches.filter(m => m.groupId === g.id)) { if (!stats[m.player1Id] || !stats[m.player2Id]) continue; const [p1, p2] = m.result.split(":").map(n => parseInt(n, 10)); - if (p1 > p2) stats[m.player1Id].points += 2; - else stats[m.player2Id].points += 2; + if (p1 > p2) { + stats[m.player1Id].points += 1; // Sieger bekommt +1 + stats[m.player2Id].points -= 1; // Verlierer bekommt -1 + } else { + stats[m.player2Id].points += 1; // Sieger bekommt +1 + stats[m.player1Id].points -= 1; // Verlierer bekommt -1 + } stats[m.player1Id].setsWon += p1; stats[m.player1Id].setsLost += p2; stats[m.player2Id].setsWon += p2; diff --git a/frontend/src/views/TournamentsView.vue b/frontend/src/views/TournamentsView.vue index be980b0..2c899bb 100644 --- a/frontend/src/views/TournamentsView.vue +++ b/frontend/src/views/TournamentsView.vue @@ -86,6 +86,7 @@ Index + Platz Spieler Punkte Satz @@ -93,12 +94,13 @@ G{{ String.fromCharCode(96 + group.groupNumber) }}{{ idx + 1 }} - Platz + Live-Platz G{{ String.fromCharCode(96 + group.groupNumber) }}{{ idx + 1 }} + {{ pl.position }}. {{ pl.name }} {{ pl.points }} {{ pl.setsWon }}:{{ pl.setsLost }} @@ -116,7 +118,7 @@ - - {{ pl.position }}. + {{ getLivePosition(pl.id, group.groupId) }}. @@ -372,8 +374,13 @@ export default { const e1 = arr.find(x => x.id === m.player1.id); const e2 = arr.find(x => x.id === m.player2.id); if (!e1 || !e2) return; - if (s1 > s2) e1.points += 2; - else if (s2 > s1) e2.points += 2; + if (s1 > s2) { + e1.points += 1; // Sieger bekommt +1 + e2.points -= 1; // Verlierer bekommt -1 + } else if (s2 > s1) { + e2.points += 1; // Sieger bekommt +1 + e1.points -= 1; // Verlierer bekommt -1 + } e1.setsWon += s1; e1.setsLost += s2; e2.setsWon += s2; e2.setsLost += s1; }); @@ -1049,6 +1056,80 @@ export default { } return classes; + }, + + getLivePosition(playerId, groupId) { + // Berechne Live-Punkte für alle Spieler in der Gruppe + const groupPlayers = this.groupRankings[groupId] || []; + const liveStats = groupPlayers.map(player => { + let livePoints = player.points || 0; + let liveSetsWon = player.setsWon || 0; + let liveSetsLost = player.setsLost || 0; + + // Füge Live-Punkte aus begonnenen (aber nicht abgeschlossenen) Spielen hinzu + const playerMatches = this.matches.filter(m => + m.round === 'group' && + m.groupId === groupId && + (m.player1.id === player.id || m.player2.id === player.id) && + !m.isFinished && // Nur begonnene, nicht abgeschlossene Spiele + m.tournamentResults && m.tournamentResults.length > 0 // Mit Satz-Ergebnissen + ); + + playerMatches.forEach(match => { + const isPlayer1 = match.player1.id === player.id; + const results = match.tournamentResults || []; + + if (results.length > 0) { + let setsWon = 0, setsLost = 0; + results.forEach(result => { + if (isPlayer1) { + if (result.pointsPlayer1 > result.pointsPlayer2) setsWon++; + else if (result.pointsPlayer2 > result.pointsPlayer1) setsLost++; + } else { + if (result.pointsPlayer2 > result.pointsPlayer1) setsWon++; + else if (result.pointsPlayer1 > result.pointsPlayer2) setsLost++; + } + }); + + // Füge Live-Punkte hinzu (basierend auf aktuellen Sätzen) + if (setsWon > setsLost) { + livePoints += 1; + } else if (setsLost > setsWon) { + livePoints -= 1; + } + + // Füge Live-Sätze hinzu + if (isPlayer1) { + liveSetsWon += results.reduce((sum, r) => sum + r.pointsPlayer1, 0); + liveSetsLost += results.reduce((sum, r) => sum + r.pointsPlayer2, 0); + } else { + liveSetsWon += results.reduce((sum, r) => sum + r.pointsPlayer2, 0); + liveSetsLost += results.reduce((sum, r) => sum + r.pointsPlayer1, 0); + } + } + }); + + return { + id: player.id, + name: player.name, + livePoints: livePoints, + liveSetsWon: liveSetsWon, + liveSetsLost: liveSetsLost, + liveSetDiff: liveSetsWon - liveSetsLost + }; + }); + + // Sortiere nach Live-Punkten (absteigend), dann nach Satzverhältnis + liveStats.sort((a, b) => { + if (b.livePoints !== a.livePoints) return b.livePoints - a.livePoints; + if (b.liveSetDiff !== a.liveSetDiff) return b.liveSetDiff - a.liveSetDiff; + if (b.liveSetsWon !== a.liveSetsWon) return b.liveSetsWon - a.liveSetsWon; + return a.name.localeCompare(b.name); + }); + + // Finde Position des Spielers + const position = liveStats.findIndex(p => p.id === playerId) + 1; + return position; } } }; @@ -1226,8 +1307,8 @@ button { font-weight: bold; } -.group-table th:nth-child(2), -.group-table td:nth-child(2) { +.group-table th:nth-child(3), +.group-table td:nth-child(3) { text-align: left; min-width: 120px; }