import 'server-only' import { db, nichtGeloescht } from '@/lib/db' import { einzelneZahlungen, gruppieren, offeneKandidaten, type Einzelzahlung, type Zahlungsgruppe, } from '@/lib/finanzen/wiederkehrend' /** * Holt die Daten fuer die Ansicht "Wiederkehrende Zahlungen". * * Getrennt von wiederkehrend.ts, damit die Erkennung selbst ohne Datenbank * bleibt und sich mit Einheitstests festnageln laesst. Hier steht nur, was * ohne Postgres nicht geht. */ export type WiederkehrendBild = { gruppen: Zahlungsgruppe[] einzelne: Einzelzahlung[] /** Wie viele Gruppen noch keinem Vertrag zugeordnet sind. */ offen: number /** Bereits abgehakte Gruppen - zum Zurueckholen. */ abgehakt: { id: string; schluessel: string; anzeigename: string; begruendung: string | null }[] /** Wurde ueberhaupt schon etwas importiert? Sonst ist die Seite leer aus gutem Grund. */ ausgabenGesamt: number } export async function wiederkehrendLaden(betreuteId: string): Promise { const [buchungen, vertraege, abgehakt] = await Promise.all([ db.buchung.findMany({ where: { betreuteId, // Nur echte Ausgaben der betreuten Person. Umbuchungen zwischen // eigenen Konten sind kein Vertragshinweis - wer monatlich aufs // Sparbuch legt, hat deswegen keinen Vertrag. Auslagen des // Betreuers gehoeren ebenfalls nicht hierher. richtung: 'AUSGABE', betrifftBetreute: true, ...nichtGeloescht, }, select: { id: true, datum: true, betragCent: true, gegenstelle: true }, orderBy: { datum: 'asc' }, }), db.vertrag.findMany({ where: { betreuteId, ...nichtGeloescht }, select: { id: true, bezeichnung: true, gesellschaft: true }, }), db.zahlungsgruppeGeklaert.findMany({ where: { betreuteId }, select: { id: true, schluessel: true, anzeigename: true, begruendung: true }, orderBy: { anzeigename: 'asc' }, }), ]) const optionen = { abgehakt: new Set(abgehakt.map((eintrag) => eintrag.schluessel)), vertraege, } const gruppen = gruppieren(buchungen, optionen) return { gruppen, einzelne: einzelneZahlungen(buchungen, optionen), offen: offeneKandidaten(gruppen), abgehakt, ausgabenGesamt: buchungen.length, } } /** * Nur die Zahl fuer das Dashboard - ohne die vollen Listen aufzubauen. * * Laedt dieselben Buchungen, gibt aber nur die Anzahl offener Gruppen * zurueck. Die Kachel soll die Seite nicht spuerbar verlangsamen. */ export async function offeneZahlungsgruppen(betreuteId: string): Promise { const bild = await wiederkehrendLaden(betreuteId) return bild.offen }