fix: neutrale Kategorien gelten für Ausgabe UND Einnahme
Kategorien erben ihre Art von der Gruppe, und die ist entweder Ausgabe oder Einnahme. Für einen Kontoübertrag passt beides nicht: Auf dem einen Konto geht Geld raus, auf dem anderen kommt es rein – man musste also zwei Kategorien in zwei Gruppen anlegen. Als „nicht in Auswertungen einrechnen" markierte Kategorien werden jetzt in beiden Richtungen angeboten (Buchungsformular und Import-Prüfansicht), und ihre Schlagwörter greifen unabhängig vom Vorzeichen. Eine Kategorie „Kontoübertrag" in einer Ausgabe-Gruppe genügt damit für beide Seiten. Test für beide Richtungen; 94 grün. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
// Auswahl-Listen für Kategorien.
|
||||
//
|
||||
// Kategorien hängen an Gruppen, und eine Gruppe ist entweder Ausgabe oder
|
||||
// Einnahme. Für einen Kontoübertrag passt beides nicht: Auf dem einen Konto geht
|
||||
// Geld raus, auf dem anderen kommt es rein. Solche Kategorien sind als „nicht in
|
||||
// Auswertungen einrechnen" markiert – und werden deshalb in BEIDEN Richtungen
|
||||
// angeboten, egal in welcher Gruppe sie liegen.
|
||||
export function gruppenFuer(groups, kind) {
|
||||
const passend = [];
|
||||
for (const g of groups) {
|
||||
if (g.kind === kind) {
|
||||
passend.push(g);
|
||||
continue;
|
||||
}
|
||||
// Aus einer Gruppe der anderen Art nur die neutralen Kategorien übernehmen.
|
||||
const neutrale = (g.categories || []).filter((c) => c.excluded_from_stats);
|
||||
if (neutrale.length) passend.push({ ...g, categories: neutrale });
|
||||
}
|
||||
return passend;
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import { useToast } from "../toast";
|
||||
import Icon from "../components/Icon";
|
||||
import CategorySelect from "../components/CategorySelect";
|
||||
import DataTable from "../components/DataTable";
|
||||
import { gruppenFuer } from "../kategorien";
|
||||
import { formatMoney } from "../format";
|
||||
|
||||
// Eine Uhrzeit im Wert ist unkritisch – parse_date im Backend schneidet sie ab.
|
||||
@@ -217,8 +218,8 @@ export default function Import() {
|
||||
}));
|
||||
}, [raw]);
|
||||
|
||||
const expenseGroups = useMemo(() => groups.filter((g) => g.kind === "expense"), [groups]);
|
||||
const incomeGroups = useMemo(() => groups.filter((g) => g.kind === "income"), [groups]);
|
||||
const expenseGroups = useMemo(() => gruppenFuer(groups, "expense"), [groups]);
|
||||
const incomeGroups = useMemo(() => gruppenFuer(groups, "income"), [groups]);
|
||||
|
||||
const includeCount = rows ? rows.filter((r) => r.include).length : 0;
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import Money from "../components/Money";
|
||||
import Modal from "../components/Modal";
|
||||
import CategorySelect from "../components/CategorySelect";
|
||||
import DataTable from "../components/DataTable";
|
||||
import { gruppenFuer } from "../kategorien";
|
||||
import { centsToInput, parseAmountToCents, todayIso } from "../format";
|
||||
|
||||
const TYPES = ["expense", "income", "transfer"];
|
||||
@@ -78,7 +79,7 @@ export default function Transactions() {
|
||||
const savingsDest = form?.type === "transfer" && toAcc && SAVINGS_TYPES.includes(toAcc.type);
|
||||
|
||||
// Standard-Kategorie für budgetierte Sparen-Transfers (falls vorhanden).
|
||||
const expenseGroups = useMemo(() => groups.filter((g) => g.kind === "expense"), [groups]);
|
||||
const expenseGroups = useMemo(() => gruppenFuer(groups, "expense"), [groups]);
|
||||
const sparenCatId = useMemo(() => {
|
||||
for (const g of expenseGroups)
|
||||
for (const c of g.categories) if (c.name === "Sparen & Investments") return String(c.id);
|
||||
@@ -132,7 +133,7 @@ export default function Transactions() {
|
||||
const catOptions = useMemo(() => {
|
||||
if (!form) return [];
|
||||
const kind = form.type === "income" ? "income" : "expense";
|
||||
return groups.filter((g) => g.kind === kind);
|
||||
return gruppenFuer(groups, kind);
|
||||
}, [form, groups]);
|
||||
|
||||
async function speichern(e) {
|
||||
|
||||
Reference in New Issue
Block a user