Refactor financial transaction handling: Consolidate Einnahmen and Ausgaben into Buchung model, update routes and UI components, and add new migration scripts for database schema changes.

This commit is contained in:
hwinkel
2026-03-24 21:06:07 +01:00
parent d582c748a2
commit 1ec15600b5
18 changed files with 928 additions and 358 deletions
+18 -18
View File
@@ -63,42 +63,42 @@ export async function loader({ request }: { request: Request }) {
const bank = Number(bankAgg._sum.grossTotal ?? 0);
const summeAktiva = forderungen + bank;
// Betriebsausgaben für das Jahr
const ausgaben = await prisma.betriebsausgabe.findMany({
where: { companyId, datum: { gte: yearStart, lt: yearEnd } },
// Betriebsausgaben für das Jahr (from buchungen with type=ENTNAHME and isBusinessRecord=true)
const ausgaben = await prisma.buchung.findMany({
where: { companyId, type: "ENTNAHME", isBusinessRecord: true, date: { gte: yearStart, lt: yearEnd } },
});
const ausgabenGesamt = ausgaben.reduce((s, a) => s + Number(a.betrag), 0);
const ausgabenGesamt = ausgaben.reduce((s, a) => s + Number(a.amount), 0);
const ausgabenVorsteuer = ausgaben.reduce((s, a) => {
const brutto = Number(a.betrag);
const rate = Number(a.steuersatz) / 100;
const brutto = Number(a.amount);
const rate = (a.steuersatz || 0) / 100;
return s + (rate > 0 ? Math.round((brutto / (1 + rate)) * rate * 100) / 100 : 0);
}, 0);
// Ausgaben nach Kategorie
const ausgabenByKategorieMap: Record<string, number> = {};
for (const a of ausgaben) {
const k = a.kategorie;
ausgabenByKategorieMap[k] = (ausgabenByKategorieMap[k] ?? 0) + Number(a.betrag);
const k = a.kategorie || "Sonstige";
ausgabenByKategorieMap[k] = (ausgabenByKategorieMap[k] ?? 0) + Number(a.amount);
}
const ausgabenByKategorie = Object.entries(ausgabenByKategorieMap).map(([kategorie, betrag]) => ({ kategorie, betrag }));
// Sonstige Einnahmen für das Jahr
const einnahmen = await prisma.betriebseinnahme.findMany({
where: { companyId, datum: { gte: yearStart, lt: yearEnd } },
// Sonstige Einnahmen für das Jahr (from buchungen with type=EINLAGE and isBusinessRecord=true)
const einnahmen = await prisma.buchung.findMany({
where: { companyId, type: "EINLAGE", isBusinessRecord: true, date: { gte: yearStart, lt: yearEnd } },
});
const sonstigeEinnahmen = einnahmen.reduce((s, e) => s + Number(e.betrag), 0);
const sonstigeEinnahmen = einnahmen.reduce((s, e) => s + Number(e.amount), 0);
const einnahmenUst = einnahmen.reduce((s, e) => {
const brutto = Number(e.betrag);
const rate = Number(e.steuersatz) / 100;
const brutto = Number(e.amount);
const rate = (e.steuersatz || 0) / 100;
return s + (rate > 0 ? Math.round((brutto / (1 + rate)) * rate * 100) / 100 : 0);
}, 0);
// Kasse / Bank aus sonstigen Einnahmen und Ausgaben (nach Zahlungsart)
const einnahmenKasse = einnahmen.filter((e) => e.zahlungsart === "KASSE").reduce((s, e) => s + Number(e.betrag), 0);
const ausgabenKasse = ausgaben.filter((a) => a.zahlungsart === "KASSE").reduce((s, a) => s + Number(a.betrag), 0);
const einnahmenBank = einnahmen.filter((e) => e.zahlungsart === "BANK").reduce((s, e) => s + Number(e.betrag), 0);
const ausgabenBank = ausgaben.filter((a) => a.zahlungsart === "BANK").reduce((s, a) => s + Number(a.betrag), 0);
const einnahmenKasse = einnahmen.filter((e) => e.zahlungsart === "KASSE").reduce((s, e) => s + Number(e.amount), 0);
const ausgabenKasse = ausgaben.filter((a) => a.zahlungsart === "KASSE").reduce((s, a) => s + Number(a.amount), 0);
const einnahmenBank = einnahmen.filter((e) => e.zahlungsart === "BANK").reduce((s, e) => s + Number(e.amount), 0);
const ausgabenBank = ausgaben.filter((a) => a.zahlungsart === "BANK").reduce((s, a) => s + Number(a.amount), 0);
// Kasse-Saldo = bezahlte Rechnungen (Kasse-Anteil wird nicht getrennt) + sonstige Einnahmen Kasse - Ausgaben Kasse
// Bank-Näherung = bezahlte Rechnungen + sonstige Einnahmen Bank - Ausgaben Bank