diff --git a/src/main.jsx b/src/main.jsx index b40a02e..e5ab1ec 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -140,8 +140,7 @@ function annualForecast(data, accountId = 'all') { function categoryStats(data, accountId = 'all') { const categoryMap = new Map((data.categories || []).map(c => [c.id, c.name])); - const filteredEntries = items => accountId === 'all' ? items : items.filter(x => x.accountId === accountId); - const filteredTransfers = items => accountId === 'all' ? items : items.filter(x => x.fromAccountId === accountId || x.toAccountId === accountId); + const isAll = accountId === 'all'; const aggregate = items => { const buckets = new Map(); for (const item of items) { @@ -156,10 +155,32 @@ function categoryStats(data, accountId = 'all') { const rows = [...buckets.values()].sort((a,b)=>b.amount-a.amount).map(x=>({...x,percent:total>0?(x.amount/total)*100:0})); return { total, rows }; }; + + if (isAll) { + return { + incomes: aggregate(data.incomes), + expenses: aggregate(data.expenses), + transfers: aggregate(data.transfers), + transfersMerged: false, + }; + } + + // Bei einer Einzelkonto-Auswertung sind Transfers echte Zu-/Abflüsse + // dieses Kontos: Zielkonto = Eingang, Quellkonto = Ausgang. + const incomeItems = [ + ...data.incomes.filter(x => x.accountId === accountId), + ...data.transfers.filter(x => x.toAccountId === accountId), + ]; + const expenseItems = [ + ...data.expenses.filter(x => x.accountId === accountId), + ...data.transfers.filter(x => x.fromAccountId === accountId), + ]; + return { - incomes: aggregate(filteredEntries(data.incomes)), - expenses: aggregate(filteredEntries(data.expenses)), - transfers: aggregate(filteredTransfers(data.transfers)), + incomes: aggregate(incomeItems), + expenses: aggregate(expenseItems), + transfers: { total:0, rows:[] }, + transfersMerged: true, }; } @@ -231,9 +252,9 @@ function StatisticsPage({data,onAddCategory,onEditCategory,onDeleteCategory}){ return
Kategorien gelten für Eingänge, Ausgänge und Transfers gemeinsam.