2 Commits

Author SHA1 Message Date
Torsten Schulz (local)
83f4e1c45e feat(match-report): add lineup certification logic in MatchReportApiDialog
- Implemented applyLineupCertificationFromMeetingDetails method to automatically set lineup certification based on meeting details.
- Enhanced the initialization process to include lineup confirmation when PINs are already signed, improving user experience and data accuracy.
2026-02-26 16:27:58 +01:00
Torsten Schulz (local)
f0477b1023 feat(match-report): improve result initialization and data synchronization in MatchReportApiDialog
- Enhanced the initializeResults method to retain existing match results when available, improving data consistency.
- Added logic to set start and end dates based on available meeting data, ensuring accurate match timing.
- Implemented populateResultsFromMeetingDetails to transfer existing set results from meeting details, enhancing data accuracy.
- Improved fallback mechanisms for match results to ensure defaults are only created when necessary.
2026-02-26 16:27:00 +01:00

View File

@@ -1832,19 +1832,19 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
}
},
// Verwende die Matches aus dem Match-Objekt oder erstelle defaults
// Verwende die Matches aus dem Match-Objekt oder lasse vorhandene Ergebnisse bestehen
initializeResults() {
if (this.match.matches && Array.isArray(this.match.matches)) {
// Verwende existierende Matches vom Server
this.results = this.match.matches.map(match => ({
homeName: match.homePlayer || `Spieler Heim ${match.matchNumber || ''}`,
guestName: match.guestPlayer || `Spieler Gast ${match.matchNumber || ''}`,
sets: match.sets || ['', '', '', '', ''], // 5 leere Sätze
completed: match.completed || false,
result: match.result || ''
if (this.match.matches && Array.isArray(this.match.matches) && this.match.matches.length > 0) {
// Verwende existierende Matches vom Server / aus nuscore-Synchronisation
this.results = this.match.matches.map((match, index) => ({
homeName: match.homePlayer || (this.results[index] && this.results[index].homeName) || `Spieler Heim ${match.matchNumber || ''}`,
guestName: match.guestPlayer || (this.results[index] && this.results[index].guestName) || `Spieler Gast ${match.matchNumber || ''}`,
sets: match.sets || (this.results[index] && this.results[index].sets) || ['', '', '', '', ''],
completed: typeof match.completed === 'boolean' ? match.completed : ((this.results[index] && this.results[index].completed) || false),
result: match.result || (this.results[index] && this.results[index].result) || ''
}));
} else {
// Fallback: Erstelle Default-Matches basierend auf Spielsystem
} else if (!this.results || this.results.length === 0) {
// Fallback: Erstelle Default-Matches basierend auf Spielsystem, falls noch keine Ergebnisse existieren
const playMode = (this.meetingDetails && this.meetingDetails.playMode) ||
(this.meetingData && (this.meetingData.playMode || this.meetingData.matchSystem || this.meetingData.system));
const matchCount = this.getMatchCountForPlayMode(playMode);
@@ -1945,21 +1945,40 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
// PINs automatisch laden
this.loadPinsAutomatically();
// Aufstellungs-Bestätigung aus nuscore übernehmen (wenn bereits signiert)
this.applyLineupCertificationFromMeetingDetails();
// Vereins-Einstellungen für Begrüßung laden
await this.loadClubSettings();
// Setze Standardwert für Spielbeginn aus scheduleDate, falls noch nicht gesetzt
// Setze Standardwert für Spielbeginn aus vorhandenen Daten, falls noch nicht gesetzt
if (!this.match.startDate) {
const scheduleDate = this.meetingDetails?.scheduleDate || this.meetingData?.scheduleDate;
if (scheduleDate) {
this.match.startDate = new Date(scheduleDate);
const startDate =
this.meetingDetails?.startDate ||
this.meetingData?.startDate ||
this.meetingDetails?.scheduleDate ||
this.meetingData?.scheduleDate;
if (startDate) {
this.match.startDate = new Date(startDate);
console.log('✅ Spielbeginn auf Standardwert gesetzt:', this.match.startDate);
}
}
// Ergebnisse initial auf Basis der Matrix vorbereiten
// Spielende aus Meeting-Daten übernehmen, falls vorhanden
if (!this.match.endDate) {
const endDate = this.meetingDetails?.endDate || this.meetingData?.endDate;
if (endDate) {
this.match.endDate = new Date(endDate);
console.log('✅ Spielende auf vorhandenen Wert gesetzt:', this.match.endDate);
}
}
// Ergebnisse initial auf Basis der Matrix vorbereiten (Namen/Zuweisungen)
this.prepareResults();
// Bereits vorhandene Satzergebnisse aus nuscore übernehmen (falls vorhanden)
this.populateResultsFromMeetingDetails();
// Wenn teamNotAppeared gesetzt ist und die Daten noch nicht angepasst wurden, wende die Anpassung an
if (this.teamNotAppeared !== null && !this.meetingData.wo) {
this.applyTeamNotAppeared();
@@ -1983,6 +2002,56 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
result: '1:0'
}));
},
populateResultsFromMeetingDetails() {
if (!this.meetingDetails || !Array.isArray(this.meetingDetails.matches)) {
return;
}
const sourceMatches = this.meetingDetails.matches;
const count = Math.min((this.results && this.results.length) || 0, sourceMatches.length);
for (let i = 0; i < count; i++) {
const src = sourceMatches[i] || {};
const dst = this.results[i];
if (!dst.sets || !Array.isArray(dst.sets)) {
this.$set(dst, 'sets', ['', '', '', '', '']);
}
let anySet = false;
for (let s = 0; s < dst.sets.length; s++) {
const homeKey = `set${s + 1}A`;
const guestKey = `set${s + 1}B`;
const rawHome = src[homeKey];
const rawGuest = src[guestKey];
const home = typeof rawHome === 'number' ? rawHome : parseInt(rawHome || 0);
const guest = typeof rawGuest === 'number' ? rawGuest : parseInt(rawGuest || 0);
if ((home || 0) > 0 || (guest || 0) > 0) {
dst.sets[s] = `${home}:${guest}`;
anySet = true;
} else if (!dst.sets[s]) {
dst.sets[s] = '';
}
}
// Versuche, den Abschlussstatus aus nuscore zu übernehmen
if (typeof src.matchesA !== 'undefined' || typeof src.matchesB !== 'undefined') {
dst.completed = src.matchesA === 1 || src.matchesB === 1;
} else if (anySet) {
const homeWins = this.getPlayerSetWins(dst, 'home');
const guestWins = this.getPlayerSetWins(dst, 'guest');
dst.completed = homeWins >= 3 || guestWins >= 3;
}
this.calculateMatchResult(i);
}
// Synchronisiere in das Match-Objekt, damit initializeResults() darauf zurückgreifen kann
this.syncResultsToMatch();
},
applyTeamNotAppeared() {
if (!this.meetingData || this.teamNotAppeared === null) {
return;
@@ -1995,6 +2064,25 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
console.log('✅ Team "Nicht angetreten" angewendet:', this.teamNotAppeared, 'wo:', woValue);
},
/**
* Setzt die Aufstellungs-Bestätigung (certified) aus den Meeting-Details.
* In nuscore wird nach PIN-Eingabe ein Hash gespeichert (homePin/guestPin).
* Ist dieser gesetzt, gilt die Aufstellung als bereits bestätigt.
*/
applyLineupCertificationFromMeetingDetails() {
if (!this.meetingDetails) return;
const homePinSet = this.meetingDetails.homePin != null && String(this.meetingDetails.homePin).trim() !== '';
const guestPinSet = this.meetingDetails.guestPin != null && String(this.meetingDetails.guestPin).trim() !== '';
if (homePinSet) {
this.isHomeLineupCertified = true;
}
if (guestPinSet) {
this.isGuestLineupCertified = true;
}
},
resolveSide(label, side) {
// label z.B. "A1 B2" oder "DA1 DB1"
try {