From b7015ace84013a8010ba47679fe799fac72721ff Mon Sep 17 00:00:00 2001 From: Matthias Hochmeister Date: Mon, 30 Mar 2026 11:03:53 +0200 Subject: [PATCH] fix: return 409 on duplicate kontonummer, show server error in snackbar, block save when sub-account suffix is empty --- backend/src/controllers/buchhaltung.controller.ts | 5 +++-- backend/src/services/buchhaltung.service.ts | 5 ++++- frontend/src/pages/Buchhaltung.tsx | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/backend/src/controllers/buchhaltung.controller.ts b/backend/src/controllers/buchhaltung.controller.ts index 68812d5..72a0060 100644 --- a/backend/src/controllers/buchhaltung.controller.ts +++ b/backend/src/controllers/buchhaltung.controller.ts @@ -167,9 +167,10 @@ class BuchhaltungController { try { const data = await buchhaltungService.createKonto(req.body, req.user!.id); res.status(201).json({ success: true, data }); - } catch (error) { + } catch (error: any) { logger.error('BuchhaltungController.createKonto', { error }); - res.status(500).json({ success: false, message: 'Konto konnte nicht erstellt werden' }); + const status = error.statusCode || 500; + res.status(status).json({ success: false, message: error.message || 'Konto konnte nicht erstellt werden' }); } } diff --git a/backend/src/services/buchhaltung.service.ts b/backend/src/services/buchhaltung.service.ts index 8842076..aa4f151 100644 --- a/backend/src/services/buchhaltung.service.ts +++ b/backend/src/services/buchhaltung.service.ts @@ -375,8 +375,11 @@ async function createKonto( [data.haushaltsjahr_id, data.konto_typ_id || null, data.kontonummer, data.bezeichnung, data.parent_id || null, data.budget_gwg || 0, data.budget_anlagen || 0, data.budget_instandhaltung || 0, data.notizen || null, userId] ); return result.rows[0]; - } catch (error) { + } catch (error: any) { logger.error('BuchhaltungService.createKonto failed', { error }); + if (error.code === '23505' && error.constraint === 'buchhaltung_konten_haushaltsjahr_id_kontonummer_key') { + throw Object.assign(new Error(`Kontonummer "${data.kontonummer}" existiert bereits in diesem Haushaltsjahr`), { statusCode: 409 }); + } throw new Error('Konto konnte nicht erstellt werden'); } } diff --git a/frontend/src/pages/Buchhaltung.tsx b/frontend/src/pages/Buchhaltung.tsx index c37de47..2aa5476 100644 --- a/frontend/src/pages/Buchhaltung.tsx +++ b/frontend/src/pages/Buchhaltung.tsx @@ -268,7 +268,7 @@ function KontoDialog({ - + ); @@ -992,7 +992,7 @@ function KontenTab({ haushaltsjahre, selectedJahrId, onJahrChange }: { const createKontoMut = useMutation({ mutationFn: buchhaltungApi.createKonto, onSuccess: () => { qc.invalidateQueries({ queryKey: ['buchhaltung-konten'] }); qc.invalidateQueries({ queryKey: ['kontenTree'] }); setKontoDialog({ open: false }); showSuccess('Konto erstellt'); }, - onError: () => showError('Konto konnte nicht erstellt werden'), + onError: (err: any) => showError(err?.response?.data?.message || 'Konto konnte nicht erstellt werden'), }); const updateKontoMut = useMutation({ mutationFn: ({ id, data }: { id: number; data: Partial }) => buchhaltungApi.updateKonto(id, data),