Enhance member validation and error reporting in MemberTransferService and MemberTransferDialog

Updated the MemberTransferService to include validation for required member fields, categorizing members into valid and invalid lists. Improved error handling to provide detailed feedback on invalid members during transfers. Enhanced the MemberTransferDialog to display information about excluded members and their errors, ensuring users are informed of any issues during the transfer process.
This commit is contained in:
Torsten Schulz (local)
2025-11-06 08:28:27 +01:00
parent 75242f63fc
commit c9d82827ff
2 changed files with 148 additions and 11 deletions

View File

@@ -46,7 +46,73 @@ class MemberTransferService {
};
}
// 2. Login durchführen
// 2. Mitglieder validieren und filtern
const validMembers = [];
const invalidMembers = [];
for (const member of members) {
const validationErrors = [];
// Pflichtfelder prüfen
if (!member.firstName || member.firstName.trim() === '') {
validationErrors.push('Vorname ist erforderlich');
}
if (!member.lastName || member.lastName.trim() === '') {
validationErrors.push('Nachname ist erforderlich');
}
// Geburtsdatum prüfen (wird als geburtsdatum im Template verwendet)
const birthDate = this.formatBirthDate(member.birthDate);
if (!birthDate || birthDate.trim() === '') {
validationErrors.push('Geburtsdatum ist erforderlich');
}
if (validationErrors.length > 0) {
invalidMembers.push({
member: {
id: member.id,
firstName: member.firstName || '',
lastName: member.lastName || ''
},
errors: validationErrors
});
} else {
validMembers.push(member);
}
}
// Wenn keine gültigen Mitglieder vorhanden sind
if (validMembers.length === 0) {
const errorMessages = invalidMembers.map(inv => {
const name = `${inv.member.firstName} ${inv.member.lastName}`.trim() || `ID: ${inv.member.id}`;
return `${name}: ${inv.errors.join(', ')}`;
}).join('\n');
return {
status: 400,
response: {
success: false,
message: 'Keine gültigen Mitglieder zum Übertragen gefunden',
error: `Alle ${members.length} Mitglieder haben fehlende Pflichtfelder:\n${errorMessages}`,
transferred: 0,
total: members.length,
invalidMembers: invalidMembers,
errors: []
}
};
}
// Logge gefilterte Mitglieder
if (invalidMembers.length > 0) {
infoLog(`[transferMembers] ${invalidMembers.length} Mitglieder wurden aufgrund fehlender Pflichtfelder ausgeschlossen`);
invalidMembers.forEach(inv => {
const name = `${inv.member.firstName} ${inv.member.lastName}`.trim() || `ID: ${inv.member.id}`;
infoLog(`[transferMembers] Ausgeschlossen: ${name} - ${inv.errors.join(', ')}`);
});
}
// 3. Login durchführen
let authToken = null;
let sessionCookie = null;
@@ -245,7 +311,7 @@ class MemberTransferService {
const membersArray = [];
const memberErrors = [];
for (const member of members) {
for (const member of validMembers) {
try {
const memberData = this.replacePlaceholders(
config.transferTemplate,
@@ -352,7 +418,7 @@ class MemberTransferService {
const bulkErrors = transferResult.data?.results?.errors || [];
const bulkDuplicates = transferResult.data?.results?.duplicates || [];
let message = `${transferred} von ${members.length} Mitglieder(n) erfolgreich übertragen.`;
let message = `${transferred} von ${validMembers.length} gültigen Mitglieder(n) erfolgreich übertragen.`;
if (bulkDuplicates.length > 0) {
message += ` ${bulkDuplicates.length} Duplikat(e) gefunden.`;
}
@@ -360,15 +426,34 @@ class MemberTransferService {
message += ` ${bulkErrors.length + memberErrors.length} Fehler.`;
}
// Kombiniere Fehler aus ungültigen Mitgliedern und Übertragungsfehlern
const allErrors = [
...invalidMembers.map(inv => ({
member: `${inv.member.firstName} ${inv.member.lastName}`.trim() || `ID: ${inv.member.id}`,
error: inv.errors.join(', ')
})),
...bulkErrors,
...memberErrors
];
// Erweitere Nachricht um Informationen über ausgeschlossene Mitglieder
let finalMessage = message;
if (invalidMembers.length > 0) {
finalMessage += ` ${invalidMembers.length} Mitglieder wurden aufgrund fehlender Pflichtfelder ausgeschlossen.`;
}
return {
status: 200,
response: {
success: true,
message: message,
message: finalMessage,
transferred: transferred,
total: members.length,
validCount: validMembers.length,
invalidCount: invalidMembers.length,
duplicates: bulkDuplicates.length,
errors: [...bulkErrors, ...memberErrors],
invalidMembers: invalidMembers,
errors: allErrors,
details: transferResult.data
}
};
@@ -392,6 +477,15 @@ class MemberTransferService {
}
}
// Kombiniere Fehler aus ungültigen Mitgliedern und Übertragungsfehlern
const allErrors = [
...invalidMembers.map(inv => ({
member: `${inv.member.firstName} ${inv.member.lastName}`.trim() || `ID: ${inv.member.id}`,
error: inv.errors.join(', ')
})),
...memberErrors
];
return {
status: transferResult.status || 500,
response: {
@@ -400,7 +494,8 @@ class MemberTransferService {
error: errorMessage,
transferred: 0,
total: members.length,
errors: memberErrors
invalidMembers: invalidMembers,
errors: allErrors
}
};
}
@@ -423,7 +518,15 @@ class MemberTransferService {
const errors = [];
let successCount = 0;
for (const member of members) {
// Füge Fehler für ungültige Mitglieder hinzu
for (const inv of invalidMembers) {
errors.push({
member: `${inv.member.firstName} ${inv.member.lastName}`.trim() || `ID: ${inv.member.id}`,
error: inv.errors.join(', ')
});
}
for (const member of validMembers) {
try {
const memberData = this.replacePlaceholders(
config.transferTemplate,
@@ -460,7 +563,10 @@ class MemberTransferService {
}
}
const message = `${successCount} von ${members.length} Mitglieder(n) erfolgreich übertragen.`;
let message = `${successCount} von ${validMembers.length} gültigen Mitglieder(n) erfolgreich übertragen.`;
if (invalidMembers.length > 0) {
message += ` ${invalidMembers.length} Mitglieder wurden aufgrund fehlender Pflichtfelder ausgeschlossen.`;
}
return {
status: 200,
@@ -469,7 +575,10 @@ class MemberTransferService {
message: message,
transferred: successCount,
total: members.length,
validCount: validMembers.length,
invalidCount: invalidMembers.length,
results: results,
invalidMembers: invalidMembers,
errors: errors
}
};

View File

@@ -369,24 +369,50 @@ export default {
`${response.data.transferred} von ${response.data.total} Mitglieder(n) erfolgreich übertragen.`;
let details = '';
// Zeige ausgeschlossene Mitglieder an
if (response.data.invalidMembers && response.data.invalidMembers.length > 0) {
details += 'Ausgeschlossene Mitglieder (fehlende Pflichtfelder):\n';
details += response.data.invalidMembers.map(inv => {
const name = `${inv.member.firstName} ${inv.member.lastName}`.trim() || `ID: ${inv.member.id}`;
return `${name}: ${inv.errors.join(', ')}`;
}).join('\n');
details += '\n\n';
}
// Zeige weitere Fehler an
if (response.data.errors && response.data.errors.length > 0) {
details = 'Fehler:\n' + response.data.errors.map(e =>
details += 'Weitere Fehler:\n';
details += response.data.errors.map(e =>
`${e.member}: ${e.error}`
).join('\n');
}
this.$emit('success', {
message: message,
details: details,
details: details.trim(),
results: response.data
});
this.handleClose();
} else {
// Bei Fehlern auch ausgeschlossene Mitglieder anzeigen
let errorDetails = response.data.error || '';
if (response.data.invalidMembers && response.data.invalidMembers.length > 0) {
errorDetails += '\n\nAusgeschlossene Mitglieder (fehlende Pflichtfelder):\n';
errorDetails += response.data.invalidMembers.map(inv => {
const name = `${inv.member.firstName} ${inv.member.lastName}`.trim() || `ID: ${inv.member.id}`;
return `${name}: ${inv.errors.join(', ')}`;
}).join('\n');
}
this.$emit('error', {
message: response.data.message || 'Übertragung fehlgeschlagen',
error: response.data.error
error: errorDetails
});
this.handleClose();
}
} catch (error) {
console.error('Transfer error:', error);
@@ -399,6 +425,8 @@ export default {
message: 'Fehler bei der Übertragung',
error: errorMessage
});
this.handleClose();
} finally {
this.isTransferring = false;
}