fix(buchhaltung): show Übersicht tab first and count all booked transactions in budget overview

This commit is contained in:
Matthias Hochmeister
2026-04-18 16:16:50 +02:00
parent 219e5f1195
commit fa9f50d982
3 changed files with 15 additions and 12 deletions

View File

@@ -496,10 +496,11 @@ async function getKontenTree(haushaltsjahrId: number) {
kt.bezeichnung as konto_typ_bezeichnung, kt.art as konto_typ_art,
pk.bezeichnung AS parent_bezeichnung,
k.kategorie_id, kat.bezeichnung AS kategorie_bezeichnung,
COALESCE(SUM(CASE WHEN t.typ='ausgabe' AND t.ausgaben_typ='gwg' AND t.status='gebucht' THEN t.betrag ELSE 0 END), 0) AS spent_gwg,
COALESCE(SUM(CASE WHEN t.typ='ausgabe' AND t.ausgaben_typ='anlagen' AND t.status='gebucht' THEN t.betrag ELSE 0 END), 0) AS spent_anlagen,
COALESCE(SUM(CASE WHEN t.typ='ausgabe' AND t.ausgaben_typ='instandhaltung' AND t.status='gebucht' THEN t.betrag ELSE 0 END), 0) AS spent_instandhaltung,
COALESCE(SUM(CASE WHEN t.typ='einnahme' AND t.status='gebucht' THEN t.betrag ELSE 0 END), 0) AS einnahmen_betrag
COALESCE(SUM(CASE WHEN t.typ='ausgabe' AND t.ausgaben_typ='gwg' AND t.status IN ('gebucht','freigegeben') THEN t.betrag ELSE 0 END), 0) AS spent_gwg,
COALESCE(SUM(CASE WHEN t.typ='ausgabe' AND t.ausgaben_typ='anlagen' AND t.status IN ('gebucht','freigegeben') THEN t.betrag ELSE 0 END), 0) AS spent_anlagen,
COALESCE(SUM(CASE WHEN t.typ='ausgabe' AND t.ausgaben_typ='instandhaltung' AND t.status IN ('gebucht','freigegeben') THEN t.betrag ELSE 0 END), 0) AS spent_instandhaltung,
COALESCE(SUM(CASE WHEN t.typ='ausgabe' AND t.status IN ('gebucht','freigegeben') THEN t.betrag ELSE 0 END), 0) AS spent_gesamt,
COALESCE(SUM(CASE WHEN t.typ='einnahme' AND t.status IN ('gebucht','freigegeben') THEN t.betrag ELSE 0 END), 0) AS einnahmen_betrag
FROM buchhaltung_konten k
LEFT JOIN buchhaltung_konto_typen kt ON k.konto_typ_id = kt.id
LEFT JOIN buchhaltung_konten pk ON pk.id = k.parent_id

View File

@@ -513,7 +513,7 @@ function KontoRow({ konto, depth = 0, onNavigate }: { konto: KontoTreeNode; dept
const [open, setOpen] = useState(false);
const isEinfach = (konto.budget_typ || 'detailliert') === 'einfach';
const totalBudget = isEinfach ? Number(konto.budget_gesamt || 0) : Number(konto.budget_gwg || 0) + Number(konto.budget_anlagen || 0) + Number(konto.budget_instandhaltung || 0);
const totalSpent = Number(konto.spent_gwg || 0) + Number(konto.spent_anlagen || 0) + Number(konto.spent_instandhaltung || 0);
const totalSpent = Number(konto.spent_gesamt || 0);
return (
<>
@@ -618,7 +618,7 @@ function UebersichtTab({ haushaltsjahre, selectedJahrId, onJahrChange }: {
const sumSpentGwg = treeData.reduce((s, k) => s + Number(k.spent_gwg || 0), 0);
const sumSpentAnlagen = treeData.reduce((s, k) => s + Number(k.spent_anlagen || 0), 0);
const sumSpentInst = treeData.reduce((s, k) => s + Number(k.spent_instandhaltung || 0), 0);
const sumSpentGesamt = sumSpentGwg + sumSpentAnlagen + sumSpentInst;
const sumSpentGesamt = treeData.reduce((s, k) => s + Number(k.spent_gesamt || 0), 0);
const sumEinnahmen = treeData.reduce((s, k) => s + Number(k.einnahmen_betrag || 0), 0);
const totalEinnahmen = sumEinnahmen;
@@ -724,6 +724,7 @@ function UebersichtTab({ haushaltsjahre, selectedJahrId, onJahrChange }: {
const catSpentGwg = items.reduce((s, k) => s + Number(k.spent_gwg || 0), 0);
const catSpentAnl = items.reduce((s, k) => s + Number(k.spent_anlagen || 0), 0);
const catSpentInst = items.reduce((s, k) => s + Number(k.spent_instandhaltung || 0), 0);
const catSpentGesamt = items.reduce((s, k) => s + Number(k.spent_gesamt || 0), 0);
const catEinnahmen = items.reduce((s, k) => s + Number(k.einnahmen_betrag || 0), 0);
rows.push(
<TableRow key={`cat-${key}`} sx={{ bgcolor: 'action.hover', '& td': { fontWeight: 600, fontSize: '0.8rem' } }}>
@@ -735,7 +736,7 @@ function UebersichtTab({ haushaltsjahre, selectedJahrId, onJahrChange }: {
<TableCell align="right" sx={dividerLeft}>{fmtEur(catSpentGwg)}</TableCell>
<TableCell align="right">{fmtEur(catSpentAnl)}</TableCell>
<TableCell align="right">{fmtEur(catSpentInst)}</TableCell>
<TableCell align="right">{fmtEur(catSpentGwg + catSpentAnl + catSpentInst)}</TableCell>
<TableCell align="right">{fmtEur(catSpentGesamt)}</TableCell>
<TableCell align="right" sx={{ ...dividerLeft, ...dividerRight }}>{fmtEur(catEinnahmen)}</TableCell>
<TableCell />
</TableRow>
@@ -1024,13 +1025,13 @@ function TransaktionenTab({ haushaltsjahre, selectedJahrId, onJahrChange }: {
const buchenMut = useMutation({
mutationFn: (id: number) => buchhaltungApi.buchenTransaktion(id),
onSuccess: () => { qc.invalidateQueries({ queryKey: ['buchhaltung-transaktionen'] }); qc.invalidateQueries({ queryKey: ['buchhaltung-stats'] }); showSuccess('Transaktion gebucht'); },
onSuccess: () => { qc.invalidateQueries({ queryKey: ['buchhaltung-transaktionen'] }); qc.invalidateQueries({ queryKey: ['buchhaltung-stats'] }); qc.invalidateQueries({ queryKey: ['kontenTree'] }); showSuccess('Transaktion gebucht'); },
onError: () => showError('Buchung fehlgeschlagen'),
});
const stornoMut = useMutation({
mutationFn: (id: number) => buchhaltungApi.stornoTransaktion(id),
onSuccess: () => { qc.invalidateQueries({ queryKey: ['buchhaltung-transaktionen'] }); qc.invalidateQueries({ queryKey: ['buchhaltung-stats'] }); setTxSubTab(0); showSuccess('Transaktion storniert'); },
onSuccess: () => { qc.invalidateQueries({ queryKey: ['buchhaltung-transaktionen'] }); qc.invalidateQueries({ queryKey: ['buchhaltung-stats'] }); qc.invalidateQueries({ queryKey: ['kontenTree'] }); setTxSubTab(0); showSuccess('Transaktion storniert'); },
onError: () => showError('Storno fehlgeschlagen'),
});
@@ -1981,20 +1982,20 @@ export default function Buchhaltung() {
</Box>
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
<Tabs value={tabValue} onChange={handleTabChange} variant="scrollable" scrollButtons="auto">
<Tab label="Transaktionen" />
<Tab label="Übersicht" />
<Tab label="Transaktionen" />
<Tab label="Konten" />
</Tabs>
</Box>
<TabPanel value={tabValue} index={0}>
<TransaktionenTab
<UebersichtTab
haushaltsjahre={haushaltsjahre}
selectedJahrId={selectedJahrId}
onJahrChange={setSelectedJahrId}
/>
</TabPanel>
<TabPanel value={tabValue} index={1}>
<UebersichtTab
<TransaktionenTab
haushaltsjahre={haushaltsjahre}
selectedJahrId={selectedJahrId}
onJahrChange={setSelectedJahrId}

View File

@@ -115,6 +115,7 @@ export interface KontoTreeNode extends Konto {
spent_gwg: number;
spent_anlagen: number;
spent_instandhaltung: number;
spent_gesamt: number;
einnahmen_betrag: number;
kategorie_bezeichnung?: string;
children: KontoTreeNode[];