fix(buchhaltung): format transaction IDs as YYYY/NR and deduplicate dashboard widgets
This commit is contained in:
@@ -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<string>
|
||||
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<string>
|
||||
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),
|
||||
|
||||
@@ -1219,7 +1219,7 @@ function TransaktionenTab({ haushaltsjahre, selectedJahrId, onJahrChange }: {
|
||||
)}
|
||||
{subTabTransaktionen.map((t: Transaktion) => (
|
||||
<TableRow key={t.id} hover>
|
||||
<TableCell>{t.laufende_nummer ?? `E${t.id}`}</TableCell>
|
||||
<TableCell>{t.laufende_nummer != null ? `${t.haushaltsjahr_jahr}/${t.laufende_nummer}` : `E${t.id}`}</TableCell>
|
||||
<TableCell>{fmtDate(t.datum)}</TableCell>
|
||||
<TableCell>
|
||||
<Chip
|
||||
|
||||
@@ -198,7 +198,7 @@ function Dashboard() {
|
||||
const allKeys = DEFAULT_ORDER[group];
|
||||
const ordered = saved.filter((k: string) => 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[])];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user