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 where = `WHERE ${conditions.join(' AND ')}`;
|
||||||
const txResult = await pool.query(
|
const txResult = await pool.query(
|
||||||
`SELECT t.*,
|
`SELECT t.*,
|
||||||
|
hy.jahr as haushaltsjahr_jahr,
|
||||||
k.bezeichnung as konto_bezeichnung,
|
k.bezeichnung as konto_bezeichnung,
|
||||||
k.kontonummer as konto_kontonummer,
|
k.kontonummer as konto_kontonummer,
|
||||||
bk.bezeichnung as bankkonto_bezeichnung,
|
bk.bezeichnung as bankkonto_bezeichnung,
|
||||||
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
||||||
FROM buchhaltung_transaktionen t
|
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_konten k ON t.konto_id = k.id
|
||||||
LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.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
|
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(
|
const transaktionenResult = await pool.query(
|
||||||
`SELECT t.*,
|
`SELECT t.*,
|
||||||
|
hy.jahr as haushaltsjahr_jahr,
|
||||||
k.bezeichnung as konto_bezeichnung,
|
k.bezeichnung as konto_bezeichnung,
|
||||||
k.kontonummer as konto_kontonummer,
|
k.kontonummer as konto_kontonummer,
|
||||||
bk.bezeichnung as bankkonto_bezeichnung,
|
bk.bezeichnung as bankkonto_bezeichnung,
|
||||||
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
||||||
FROM buchhaltung_transaktionen t
|
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_konten k ON t.konto_id = k.id
|
||||||
LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.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
|
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 where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
||||||
const result = await pool.query(
|
const result = await pool.query(
|
||||||
`SELECT t.*,
|
`SELECT t.*,
|
||||||
|
hy.jahr as haushaltsjahr_jahr,
|
||||||
k.bezeichnung as konto_bezeichnung,
|
k.bezeichnung as konto_bezeichnung,
|
||||||
k.kontonummer as konto_kontonummer,
|
k.kontonummer as konto_kontonummer,
|
||||||
bk.bezeichnung as bankkonto_bezeichnung,
|
bk.bezeichnung as bankkonto_bezeichnung,
|
||||||
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
||||||
FROM buchhaltung_transaktionen t
|
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_konten k ON t.konto_id = k.id
|
||||||
LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.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
|
LEFT JOIN buchhaltung_bankkonten bk2 ON t.transfer_ziel_bankkonto_id = bk2.id
|
||||||
@@ -856,11 +862,13 @@ async function getTransaktionById(id: number) {
|
|||||||
try {
|
try {
|
||||||
const txResult = await pool.query(
|
const txResult = await pool.query(
|
||||||
`SELECT t.*,
|
`SELECT t.*,
|
||||||
|
hy.jahr as haushaltsjahr_jahr,
|
||||||
k.bezeichnung as konto_bezeichnung,
|
k.bezeichnung as konto_bezeichnung,
|
||||||
k.kontonummer as konto_kontonummer,
|
k.kontonummer as konto_kontonummer,
|
||||||
bk.bezeichnung as bankkonto_bezeichnung,
|
bk.bezeichnung as bankkonto_bezeichnung,
|
||||||
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
bk2.bezeichnung AS transfer_ziel_bezeichnung
|
||||||
FROM buchhaltung_transaktionen t
|
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_konten k ON t.konto_id = k.id
|
||||||
LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.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
|
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 {
|
try {
|
||||||
const result = await pool.query(
|
const result = await pool.query(
|
||||||
`SELECT t.*,
|
`SELECT t.*,
|
||||||
|
hy.jahr as haushaltsjahr_jahr,
|
||||||
k.bezeichnung as konto_bezeichnung,
|
k.bezeichnung as konto_bezeichnung,
|
||||||
k.kontonummer as konto_kontonummer,
|
k.kontonummer as konto_kontonummer,
|
||||||
bk.bezeichnung as bankkonto_bezeichnung
|
bk.bezeichnung as bankkonto_bezeichnung
|
||||||
FROM buchhaltung_transaktionen t
|
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_konten k ON t.konto_id = k.id
|
||||||
LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.id
|
LEFT JOIN buchhaltung_bankkonten bk ON t.bankkonto_id = bk.id
|
||||||
WHERE t.haushaltsjahr_id = $1
|
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 s.includes(';') || s.includes('"') || s.includes('\n') ? `"${s.replace(/"/g, '""')}"` : s;
|
||||||
};
|
};
|
||||||
return [
|
return [
|
||||||
row.laufende_nummer ?? `E${row.id}`,
|
row.laufende_nummer != null ? `${row.haushaltsjahr_jahr}/${row.laufende_nummer}` : `E${row.id}`,
|
||||||
datum,
|
datum,
|
||||||
row.typ === 'einnahme' ? 'Einnahme' : 'Ausgabe',
|
row.typ === 'einnahme' ? 'Einnahme' : 'Ausgabe',
|
||||||
escCsv(row.beschreibung),
|
escCsv(row.beschreibung),
|
||||||
|
|||||||
@@ -1219,7 +1219,7 @@ function TransaktionenTab({ haushaltsjahre, selectedJahrId, onJahrChange }: {
|
|||||||
)}
|
)}
|
||||||
{subTabTransaktionen.map((t: Transaktion) => (
|
{subTabTransaktionen.map((t: Transaktion) => (
|
||||||
<TableRow key={t.id} hover>
|
<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>{fmtDate(t.datum)}</TableCell>
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<Chip
|
<Chip
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ function Dashboard() {
|
|||||||
const allKeys = DEFAULT_ORDER[group];
|
const allKeys = DEFAULT_ORDER[group];
|
||||||
const ordered = saved.filter((k: string) => allKeys.includes(k) && !customGroupKeys.has(k));
|
const ordered = saved.filter((k: string) => allKeys.includes(k) && !customGroupKeys.has(k));
|
||||||
const remaining = allKeys.filter((k) => !allSavedKeys.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
|
// Include custom groups from preferences
|
||||||
@@ -206,7 +206,7 @@ function Dashboard() {
|
|||||||
for (const cg of preferences.customGroups as { name: string; title: string }[]) {
|
for (const cg of preferences.customGroups as { name: string; title: string }[]) {
|
||||||
if (!merged[cg.name]) merged[cg.name] = [];
|
if (!merged[cg.name]) merged[cg.name] = [];
|
||||||
if (preferences.widgetOrder[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;
|
konto_id: number | null;
|
||||||
bankkonto_id: number | null;
|
bankkonto_id: number | null;
|
||||||
laufende_nummer: number | null;
|
laufende_nummer: number | null;
|
||||||
|
haushaltsjahr_jahr?: number;
|
||||||
typ: TransaktionTyp;
|
typ: TransaktionTyp;
|
||||||
betrag: number;
|
betrag: number;
|
||||||
datum: string;
|
datum: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user