diff --git a/backend/src/services/buchhaltung.service.ts b/backend/src/services/buchhaltung.service.ts index b266fcb..6981463 100644 --- a/backend/src/services/buchhaltung.service.ts +++ b/backend/src/services/buchhaltung.service.ts @@ -382,11 +382,13 @@ async function getBankkontoStatement( const where = `WHERE ${conditions.join(' AND ')}`; const txResult = await pool.query( `SELECT t.*, + hy.jahr as haushaltsjahr_jahr, k.bezeichnung as konto_bezeichnung, k.kontonummer as konto_kontonummer, bk.bezeichnung as bankkonto_bezeichnung, bk2.bezeichnung AS transfer_ziel_bezeichnung FROM buchhaltung_transaktionen t + JOIN buchhaltung_haushaltsjahre hy ON t.haushaltsjahr_id = hy.id LEFT JOIN buchhaltung_konten k ON t.konto_id = k.id LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.id LEFT JOIN buchhaltung_bankkonten bk2 ON t.transfer_ziel_bankkonto_id = bk2.id @@ -535,11 +537,13 @@ async function getKontoDetail(kontoId: number) { const transaktionenResult = await pool.query( `SELECT t.*, + hy.jahr as haushaltsjahr_jahr, k.bezeichnung as konto_bezeichnung, k.kontonummer as konto_kontonummer, bk.bezeichnung as bankkonto_bezeichnung, bk2.bezeichnung AS transfer_ziel_bezeichnung FROM buchhaltung_transaktionen t + JOIN buchhaltung_haushaltsjahre hy ON t.haushaltsjahr_id = hy.id LEFT JOIN buchhaltung_konten k ON t.konto_id = k.id LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.id LEFT JOIN buchhaltung_bankkonten bk2 ON t.transfer_ziel_bankkonto_id = bk2.id @@ -833,11 +837,13 @@ async function listTransaktionen(filters: { const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''; const result = await pool.query( `SELECT t.*, + hy.jahr as haushaltsjahr_jahr, k.bezeichnung as konto_bezeichnung, k.kontonummer as konto_kontonummer, bk.bezeichnung as bankkonto_bezeichnung, bk2.bezeichnung AS transfer_ziel_bezeichnung FROM buchhaltung_transaktionen t + JOIN buchhaltung_haushaltsjahre hy ON t.haushaltsjahr_id = hy.id LEFT JOIN buchhaltung_konten k ON t.konto_id = k.id LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.id LEFT JOIN buchhaltung_bankkonten bk2 ON t.transfer_ziel_bankkonto_id = bk2.id @@ -856,11 +862,13 @@ async function getTransaktionById(id: number) { try { const txResult = await pool.query( `SELECT t.*, + hy.jahr as haushaltsjahr_jahr, k.bezeichnung as konto_bezeichnung, k.kontonummer as konto_kontonummer, bk.bezeichnung as bankkonto_bezeichnung, bk2.bezeichnung AS transfer_ziel_bezeichnung FROM buchhaltung_transaktionen t + JOIN buchhaltung_haushaltsjahre hy ON t.haushaltsjahr_id = hy.id LEFT JOIN buchhaltung_konten k ON t.konto_id = k.id LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.id LEFT JOIN buchhaltung_bankkonten bk2 ON t.transfer_ziel_bankkonto_id = bk2.id @@ -1484,10 +1492,12 @@ async function exportTransaktionenCsv(haushaltsjahrId: number): Promise try { const result = await pool.query( `SELECT t.*, + hy.jahr as haushaltsjahr_jahr, k.bezeichnung as konto_bezeichnung, k.kontonummer as konto_kontonummer, bk.bezeichnung as bankkonto_bezeichnung FROM buchhaltung_transaktionen t + JOIN buchhaltung_haushaltsjahre hy ON t.haushaltsjahr_id = hy.id LEFT JOIN buchhaltung_konten k ON t.konto_id = k.id LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.id WHERE t.haushaltsjahr_id = $1 @@ -1516,7 +1526,7 @@ async function exportTransaktionenCsv(haushaltsjahrId: number): Promise return s.includes(';') || s.includes('"') || s.includes('\n') ? `"${s.replace(/"/g, '""')}"` : s; }; return [ - row.laufende_nummer ?? `E${row.id}`, + row.laufende_nummer != null ? `${row.haushaltsjahr_jahr}/${row.laufende_nummer}` : `E${row.id}`, datum, row.typ === 'einnahme' ? 'Einnahme' : 'Ausgabe', escCsv(row.beschreibung), diff --git a/frontend/src/pages/Buchhaltung.tsx b/frontend/src/pages/Buchhaltung.tsx index f02bea3..3d7c4b1 100644 --- a/frontend/src/pages/Buchhaltung.tsx +++ b/frontend/src/pages/Buchhaltung.tsx @@ -1219,7 +1219,7 @@ function TransaktionenTab({ haushaltsjahre, selectedJahrId, onJahrChange }: { )} {subTabTransaktionen.map((t: Transaktion) => ( - {t.laufende_nummer ?? `E${t.id}`} + {t.laufende_nummer != null ? `${t.haushaltsjahr_jahr}/${t.laufende_nummer}` : `E${t.id}`} {fmtDate(t.datum)} allKeys.includes(k) && !customGroupKeys.has(k)); const remaining = allKeys.filter((k) => !allSavedKeys.has(k)); - merged[group] = [...ordered, ...remaining]; + merged[group] = [...new Set([...ordered, ...remaining])]; } } // Include custom groups from preferences @@ -206,7 +206,7 @@ function Dashboard() { for (const cg of preferences.customGroups as { name: string; title: string }[]) { if (!merged[cg.name]) merged[cg.name] = []; if (preferences.widgetOrder[cg.name]) { - merged[cg.name] = preferences.widgetOrder[cg.name] as string[]; + merged[cg.name] = [...new Set(preferences.widgetOrder[cg.name] as string[])]; } } } diff --git a/frontend/src/types/buchhaltung.types.ts b/frontend/src/types/buchhaltung.types.ts index 59b7f58..6f9c825 100644 --- a/frontend/src/types/buchhaltung.types.ts +++ b/frontend/src/types/buchhaltung.types.ts @@ -133,6 +133,7 @@ export interface Transaktion { konto_id: number | null; bankkonto_id: number | null; laufende_nummer: number | null; + haushaltsjahr_jahr?: number; typ: TransaktionTyp; betrag: number; datum: string;