diff --git a/backend/services/memberTransferService.js b/backend/services/memberTransferService.js index ca41c2d..c83fb3b 100644 --- a/backend/services/memberTransferService.js +++ b/backend/services/memberTransferService.js @@ -373,12 +373,31 @@ class MemberTransferService { } }; } else { + // Extrahiere detaillierte Fehlerinformationen + let errorMessage = transferResult.error || 'Bulk-Übertragung fehlgeschlagen'; + + // Wenn die Fehlermeldung Validierungsfehler enthält, versuche zu identifizieren, welches Mitglied das Problem verursacht + if (errorMessage.includes('Zeile') || errorMessage.includes('Validierungsfehler')) { + // Versuche die Zeilennummer zu extrahieren + const lineMatch = errorMessage.match(/Zeile\s+(\d+)/); + if (lineMatch) { + const lineNumber = parseInt(lineMatch[1], 10); + // Zeile 1 = Index 0 im Array + const memberIndex = lineNumber - 1; + if (memberIndex >= 0 && memberIndex < membersArray.length) { + const problematicMember = membersArray[memberIndex]; + const memberName = `${problematicMember.firstName || ''} ${problematicMember.lastName || ''}`.trim() || 'Unbekanntes Mitglied'; + errorMessage = `${errorMessage}\n\nProblematisches Mitglied (Index ${memberIndex + 1}): ${memberName}`; + } + } + } + return { status: transferResult.status || 500, response: { success: false, message: 'Bulk-Übertragung fehlgeschlagen', - error: transferResult.error, + error: errorMessage, transferred: 0, total: members.length, errors: memberErrors @@ -727,10 +746,33 @@ class MemberTransferService { }; } catch (error) { errorLog('[transferMember] Error:', error); + + // Extrahiere detaillierte Fehlerinformationen + let errorMessage = 'Übertragung fehlgeschlagen'; + let statusCode = error.response?.status; + + if (error.response?.data) { + // Versuche verschiedene Felder für die Fehlermeldung + errorMessage = error.response.data.message || + error.response.data.error || + error.response.data.errorMessage || + (typeof error.response.data === 'string' ? error.response.data : errorMessage); + + // Logge die vollständige Fehlerantwort für Debugging + infoLog('[transferMember] Fehlerantwort vom externen Endpoint:', JSON.stringify(error.response.data, null, 2)); + } else if (error.message) { + errorMessage = error.message; + } + + // Logge den Status-Code für Debugging + if (statusCode) { + infoLog(`[transferMember] Externer Endpoint Status: ${statusCode}`); + } + return { success: false, - error: error.response?.data?.message || error.message || 'Übertragung fehlgeschlagen', - status: error.response?.status + error: errorMessage, + status: statusCode }; } } diff --git a/frontend/src/components/MemberTransferDialog.vue b/frontend/src/components/MemberTransferDialog.vue index bfda938..20b1e60 100644 --- a/frontend/src/components/MemberTransferDialog.vue +++ b/frontend/src/components/MemberTransferDialog.vue @@ -58,17 +58,27 @@
+ + + +
@@ -77,12 +87,16 @@ v-model="loginCredentials.additionalField1" :placeholder="additionalField1Placeholder" class="form-input" + autocomplete="off" + name="transfer-additional1" />
@@ -173,12 +187,15 @@ export default { modelValue(newVal) { if (newVal) { // WICHTIG: Felder sofort leeren, bevor Konfiguration geladen wird - this.loginCredentials = { - username: '', - password: '', - additionalField1: '', - additionalField2: '' - }; + // Verwende $nextTick, um sicherzustellen, dass Vue die Änderungen verarbeitet + this.$nextTick(() => { + this.loginCredentials = { + username: '', + password: '', + additionalField1: '', + additionalField2: '' + }; + }); this.loadSavedConfig(); } else { // Beim Schließen auch leeren @@ -200,12 +217,15 @@ export default { } // WICHTIG: Login-Credentials sofort leeren, damit sie nicht vorausgefüllt werden - this.loginCredentials = { - username: '', - password: '', - additionalField1: '', - additionalField2: '' - }; + // Verwende $nextTick, um sicherzustellen, dass Vue die Änderungen verarbeitet + this.$nextTick(() => { + this.loginCredentials = { + username: '', + password: '', + additionalField1: '', + additionalField2: '' + }; + }); this.loadingConfig = true; try { @@ -235,12 +255,15 @@ export default { } } finally { // Sicherstellen, dass Login-Credentials leer sind - this.loginCredentials = { - username: '', - password: '', - additionalField1: '', - additionalField2: '' - }; + // Verwende $nextTick, um sicherzustellen, dass Vue die Änderungen verarbeitet + this.$nextTick(() => { + this.loginCredentials = { + username: '', + password: '', + additionalField1: '', + additionalField2: '' + }; + }); this.loadingConfig = false; } },