From 75242f63fc7b71fa96fb903188e00e4c972a0f9b Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 6 Nov 2025 08:24:39 +0100 Subject: [PATCH] Enhance error handling and logging in MemberTransferService and MemberTransferDialog Updated the MemberTransferService to provide detailed error messages during bulk transfers, including identification of problematic members. Improved logging for error responses to facilitate debugging. In the MemberTransferDialog, implemented $nextTick to ensure login credentials are cleared properly upon loading and closing, enhancing user experience and preventing autofill issues. --- backend/services/memberTransferService.js | 48 ++++++++++++++- .../src/components/MemberTransferDialog.vue | 59 +++++++++++++------ 2 files changed, 86 insertions(+), 21 deletions(-) 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; } },