Verträge aufspüren: wiederkehrende Zahlungen ohne hinterlegten Vertrag #3
Notifications
Total Time Spent: 47 minutes
florian.wilde
47 minutes
No due date set.
Dependencies
No dependencies set.
Reference: florian.wilde/betreuungs-cockpit#3
Reference in New Issue
Block a user
Problem
Am Anfang einer Betreuung weiß niemand, welche Verträge es überhaupt gibt.
Es liegt kein Ordner bereit, in dem alle Versicherungen stehen — die
betreute Person kann es oft selbst nicht mehr sagen, und die Unterlagen
sind über Jahre entstanden.
Die Antwort steht aber schon im System: Wer regelmäßig abbucht, hat einen
Vertrag. Die Kontoauszüge sind importiert,
Buchung.gegenstelleistgefüllt — nur wertet das niemand aus. Man scrollt durch hunderte Zeilen und
versucht sich zu merken, welcher Name schon dreimal vorkam.
Solange ich nicht weiß, an wen ich schreiben muss, nützt mir die beste
Briefvorlage nichts.
Was ich will
Unter Vermögen & Kasse eine Ansicht „Wiederkehrende Zahlungen":
Höhe und in erkennbarem Abstand auftreten
erste und letzte Zahlung, Anzahl
und vorbelegtem Beitrag, oder Als geklärt abhaken (Miete, Strom,
Rundfunkbeitrag sind keine Verträge im Sinne dieses Moduls)
Akzeptanzkriterien
Gegenstelle, absteigend nach Jahresbetrag
(„4 Zahlungen, etwa alle 3 Monate")
erkennbar und lassen sich ausblenden
Gesellschaft und vorbelegtem Beitrag
taucht dann nicht wieder auf
sicher geht (Groß-/Kleinschreibung, Rechtsform, Leerzeichen). Im
Zweifel lieber getrennt lassen als falsch zusammenwerfen
gibt — sonst sieht man die Seite nie wieder an
Hinweise zur Umsetzung
Buchung.gegenstelleist vorhanden und wird vom CAMT- und CSV-Importgefüllt (
src/lib/finanzen/camt.ts,import.ts)werden — die Gruppierung muss über die Gegenstelle laufen
(Gegenstelle + Kennzeichnung + Begründung), damit die Entscheidung einen
Import überlebt
Warum das zuerst kommt
Ohne diese Übersicht ist unklar, an welche Gesellschaften überhaupt
geschrieben werden muss. Die Aufgabe hängt an keiner anderen und kann
sofort beginnen.
Angelegt auf Zuruf im Chat, nicht aus dem Dashboard — bitte in Nebula
nachtragen.
🤖 Claude Code hat mit der Umsetzung begonnen.
feat/3-wiederkehrende-zahlungensrc/lib/finanzen/wiederkehrend.ts, ohne Datenbank — damit sie sich mit Einheitstests festnageln lässt (Normalisierung der Schreibweisen, Gruppierung, Rhythmus)Zwei Dinge, die ich beim Zuschnitt im Auge behalte und am Ende ausdrücklich berichte:
Jahresbeiträge. Die Erkennung braucht mindestens zwei Zahlungen. Eine jährlich abgebuchte Prämie taucht bei nur einem importierten Jahr genau einmal auf und fällt damit durch das Raster — ausgerechnet bei Versicherungen ist das ein häufiger Fall. Ich prüfe, ob sich einzelne größere Zahlungen ohne Vertrag sinnvoll als getrennter Abschnitt danebenstellen lassen.
Zusammenfassen von Schreibweisen. „Allianz Lebensversicherung AG" und „ALLIANZ LEBENSVERS.AG" sind dieselbe Stelle, „Stadtwerke Bamberg" und „Stadtwerke Bayreuth" nicht. Ich fasse nur zusammen, was sicher ist, und lasse im Zweifel getrennt — zwei Zeilen zu viel sind harmloser als eine falsche Gruppe.
Zeiterfassung läuft.
✅ Umsetzung abgeschlossen — bereit zum Testen.
Was geändert wurde
20260823000500_zahlungsgruppe_geklaert(nur eine neue Tabelle)..claude/ins.gitignore— dort liegen die Worktrees paralleler Agenten.Geänderte Dateien
src/lib/finanzen/wiederkehrend.ts(neu),wiederkehrend-laden.ts(neu)src/app/(app)/finanzen/wiederkehrend/page.tsx(neu)src/components/finanzen/wiederkehrend-aktionen.tsx(neu)src/server/actions/finanzen.ts,src/app/(app)/finanzen/page.tsx,src/app/(app)/vertraege/neu/page.tsxsrc/lib/dashboard/{laden,typen}.ts,src/components/dashboard/belege-kachel.tsxtests/wiederkehrend.test.ts(neu),e2e/wiederkehrend.spec.ts(neu)So testest du es
git switch feat/3-wiederkehrende-zahlungenundnpm run db:deploynpm run dev, dann Vermögen & Kasse → Buchungen → Import und einen echten Kontoauszug einlesenAufgewendete Zeit: 00:47
Pull Request: #13
Anmerkungen
Zwei Fehler hat erst der Browsertest gefunden, beide an Typprüfung und Einheitstests vorbei. Einer davon: ein verlorener Backslash machte aus
/^\d{1,15}$/ein/^d{1,15}$/— die Vorbelegung des Beitrags wurde stillschweigend verschluckt, alles andere funktionierte. Der zweite: Meine Regel „längste Schreibweise gewinnt" wählte die geschriene Variante aus dem Auszug, die dann so ins Vertragsformular gewandert wäre.Was diese Auswertung nicht findet: Verträge ohne Zahlung im importierten Zeitraum — beitragsfreie Lebensversicherungen, ruhende Verträge, alles vor dem ersten Auszug. Der Kontoauszug ist eine sehr gute Quelle, aber keine vollständige.
Nebenbei aufgefallen (gehört ins Dashboard, nicht Teil dieses PR):
prisma migrate diffwill jedes Mal die Trigramm-Indizes löschen. Sie stammen ausprisma/sql/suche.sqlund sind Prisma unbekannt. Zum zweiten Mal in Folge musste ich dieDROP INDEX-Zeilen von Hand aus der erzeugten Migration entfernen — ein übersehener Durchlauf legt die unscharfe Suche still, ohne dass etwas fehlschlägt. Ein kleines Skriptnpm run db:migration, das erzeugt und die Zeilen gleich herausnimmt, würde die Falle dauerhaft schließen.Nach Freigabe:
/issue-freigabe 3🚀 Freigegeben und nach
mainübernommen.8779cc6update.shdie Fassung nicht.Zusammen mit #10 freigegeben. Die Kombination beider Branches ist nach dem Merge noch einmal geprüft worden: 537 Tests, 0 Typfehler, Lint sauber.
Beim Ausrollen: Eine Migration läuft mit (
20260823000500_zahlungsgruppe_geklaert). Sie legt nur eine neue Tabelle an, bestehende Daten bleiben unberührt.Issue wird geschlossen.