Neu unter Vermögen & Kasse → Wiederkehrende Zahlungen. Die importierten Kontobewegungen werden nach Empfänger gruppiert, nach Jahresbetrag sortiert und daneben steht, ob dazu schon ein Vertrag in der Akte liegt.
Aus der Zeile heraus geht es weiter: Vertrag anlegen mit vorbelegter Gesellschaft und vorbelegtem Beitrag, oder kein Vertrag mit Begründung.
Die Seite wertet nur aus. Sie legt von sich aus nichts an.
Zwei Haltungen, die den Ausschlag gaben
Im Zweifel getrennt lassen. Zusammengefasst wird nur das Unstrittige: Groß-/Kleinschreibung, Satzzeichen, Umlaute, Rechtsform am Ende. Ausdrücklich keine Ähnlichkeitssuche über Abstandsmaße — „Stadtwerke Bamberg" und „Stadtwerke Bayreuth" trennen drei Zeichen und zwei Rechnungssteller. Zwei Zeilen zu viel sind harmlos; eine falsch zusammengefasste Gruppe verbirgt einen Vertrag, und der fehlt dann im Vermögensverzeichnis.
Nichts behaupten, was nicht belegt ist. Statt „monatlich" steht dort „6 Zahlungen, etwa monatlich". Schwankt der Betrag, wird die Spanne genannt statt eines Mittelwerts, der Genauigkeit vortäuscht. Ohne erkennbaren Abstand wird nicht aufs Jahr hochgerechnet, sondern gezeigt, was tatsächlich geflossen ist.
Die Lücke, die ich nicht verschweigen wollte
Die Gruppierung braucht mindestens zwei Zahlungen. Eine jährlich abgebuchte Prämie erscheint bei einem importierten Jahr aber genau einmal — und ausgerechnet Versicherungen zahlt man oft jährlich. Ohne Gegenmaßnahme wäre die Suche genau dort blind, wo sie am meisten bringen soll.
Deshalb ein zweiter, klar getrennter Abschnitt: Einzelne größere Zahlungen ab 150 €, ohne hinterlegten Vertrag. Kein Vertragsverdacht, sondern eine Merkliste — so steht es auch auf der Seite.
Das Abhaken hängt am normalisierten Empfängernamen, nicht an Buchungen — nur so überlebt die Entscheidung den nächsten Kontoauszug.
Geprüft
37 Einheitstests, etwa die Hälfte in der Gegenrichtung: dass ähnliche, aber verschiedene Namen nicht zusammenfallen
Vier End-to-End-Tests auf Desktop und Handy: Erkennung, getrennte Einzelliste, Übernahme ins Vertragsformular, Abhaken samt Neuladen
537 Unit-Tests, 53 e2e, 0 Typfehler, Lint sauber, Produktionsbau steht
Zwei Fehler hat erst der Browsertest gefunden, beide an Typprüfung und Einheitstests vorbei:
Ein verlorener Backslash machte aus /^\d{1,15}$/ ein /^d{1,15}$/. Die Vorbelegung des Beitrags wurde stillschweigend verschluckt — der Rest funktionierte.
Meine Regel „längste Schreibweise gewinnt" wählte die geschriene Variante aus dem Auszug (PRUEFHAUSEN LEBENSVERSICHERUNG AG). Die wäre so ins Vertragsformular gewandert und hätte von Hand neu getippt werden müssen. Jetzt gewinnt die gemischt geschriebene.
Nebenbei
.claude/ steht jetzt im .gitignore. Dort legen parallel arbeitende Agenten ihre git-Worktrees ab; ein git add -A hätte einen kompletten zweiten Checkout eingecheckt.
## Was es tut
Neu unter **Vermögen & Kasse → Wiederkehrende Zahlungen**. Die importierten Kontobewegungen werden nach Empfänger gruppiert, nach Jahresbetrag sortiert und daneben steht, ob dazu schon ein Vertrag in der Akte liegt.
Aus der Zeile heraus geht es weiter: **Vertrag anlegen** mit vorbelegter Gesellschaft und vorbelegtem Beitrag, oder **kein Vertrag** mit Begründung.
Die Seite wertet nur aus. Sie legt von sich aus nichts an.
## Zwei Haltungen, die den Ausschlag gaben
**Im Zweifel getrennt lassen.** Zusammengefasst wird nur das Unstrittige: Groß-/Kleinschreibung, Satzzeichen, Umlaute, Rechtsform am Ende. Ausdrücklich **keine** Ähnlichkeitssuche über Abstandsmaße — „Stadtwerke Bamberg" und „Stadtwerke Bayreuth" trennen drei Zeichen und zwei Rechnungssteller. Zwei Zeilen zu viel sind harmlos; eine falsch zusammengefasste Gruppe verbirgt einen Vertrag, und der fehlt dann im Vermögensverzeichnis.
**Nichts behaupten, was nicht belegt ist.** Statt „monatlich" steht dort „6 Zahlungen, etwa monatlich". Schwankt der Betrag, wird die Spanne genannt statt eines Mittelwerts, der Genauigkeit vortäuscht. Ohne erkennbaren Abstand wird nicht aufs Jahr hochgerechnet, sondern gezeigt, was tatsächlich geflossen ist.
## Die Lücke, die ich nicht verschweigen wollte
Die Gruppierung braucht mindestens zwei Zahlungen. Eine **jährlich** abgebuchte Prämie erscheint bei einem importierten Jahr aber genau einmal — und ausgerechnet Versicherungen zahlt man oft jährlich. Ohne Gegenmaßnahme wäre die Suche genau dort blind, wo sie am meisten bringen soll.
Deshalb ein zweiter, klar getrennter Abschnitt: **Einzelne größere Zahlungen** ab 150 €, ohne hinterlegten Vertrag. Kein Vertragsverdacht, sondern eine Merkliste — so steht es auch auf der Seite.
## Aufbau
| Datei | Zweck |
|---|---|
| `src/lib/finanzen/wiederkehrend.ts` | Erkennung, reine Funktionen, **ohne Datenbank** |
| `src/lib/finanzen/wiederkehrend-laden.ts` | Datenzugriff, getrennt gehalten |
| `src/app/(app)/finanzen/wiederkehrend/page.tsx` | die Ansicht |
| `src/components/finanzen/wiederkehrend-aktionen.tsx` | Abhaken und Zurückholen |
| Migration | ein Modell für „das ist kein Vertrag" |
Das Abhaken hängt am **normalisierten Empfängernamen**, nicht an Buchungen — nur so überlebt die Entscheidung den nächsten Kontoauszug.
## Geprüft
- **37 Einheitstests**, etwa die Hälfte in der Gegenrichtung: dass ähnliche, aber verschiedene Namen *nicht* zusammenfallen
- **Vier End-to-End-Tests** auf Desktop und Handy: Erkennung, getrennte Einzelliste, Übernahme ins Vertragsformular, Abhaken samt Neuladen
- 537 Unit-Tests, 53 e2e, 0 Typfehler, Lint sauber, Produktionsbau steht
**Zwei Fehler hat erst der Browsertest gefunden**, beide an Typprüfung und Einheitstests vorbei:
1. Ein verlorener Backslash machte aus `/^\d{1,15}$/` ein `/^d{1,15}$/`. Die Vorbelegung des Beitrags wurde stillschweigend verschluckt — der Rest funktionierte.
2. Meine Regel „längste Schreibweise gewinnt" wählte die **geschriene** Variante aus dem Auszug (`PRUEFHAUSEN LEBENSVERSICHERUNG AG`). Die wäre so ins Vertragsformular gewandert und hätte von Hand neu getippt werden müssen. Jetzt gewinnt die gemischt geschriebene.
## Nebenbei
`.claude/` steht jetzt im `.gitignore`. Dort legen parallel arbeitende Agenten ihre git-Worktrees ab; ein `git add -A` hätte einen kompletten zweiten Checkout eingecheckt.
Version auf **1.2.0** angehoben, Changelog ergänzt.
Closes #3
Am Anfang einer Betreuung weiss niemand, welche Vertraege es gibt. Die
Antwort steht aber im Kontoauszug: Wer regelmaessig abbucht, hat einen
Vertrag. Neu unter Vermoegen & Kasse wird aus hunderten Buchungszeilen
eine Arbeitsliste.
Aufbau:
- Die Erkennung liegt als reine Funktionen in
src/lib/finanzen/wiederkehrend.ts, ohne Datenbank. Nur so laesst sich
jede Einordnung einzeln nachrechnen.
- Der Datenzugriff steht getrennt in wiederkehrend-laden.ts.
- Ein kleines Modell haelt fest, was bewusst KEIN Vertrag ist. Es haengt
am normalisierten Empfaengernamen, nicht an Buchungen - nur so
ueberlebt die Entscheidung den naechsten Import.
Zwei Haltungen liegen der Erkennung zugrunde:
Im Zweifel getrennt lassen. Zusammengefasst wird nur das Unstrittige:
Gross- und Kleinschreibung, Satzzeichen, Umlaute, Rechtsform am Ende.
Keine Aehnlichkeitssuche - "Stadtwerke Bamberg" und "Stadtwerke
Bayreuth" trennen drei Zeichen und zwei Rechnungssteller. Zwei Zeilen zu
viel sind harmlos; eine falsche Gruppe verbirgt einen Vertrag.
Nichts behaupten, was nicht belegt ist. Statt "monatlich" steht dort
"6 Zahlungen, etwa monatlich". Schwankt der Betrag, wird die Spanne
genannt. Ohne erkennbaren Abstand wird nicht hochgerechnet, sondern
gezeigt, was geflossen ist.
Dazu eine zweite Liste fuer einzelne groessere Zahlungen: Die
Gruppierung braucht zwei Zahlungen, ein Jahresbeitrag erscheint bei
einem importierten Jahr aber nur einmal - und ausgerechnet
Versicherungen zahlt man oft jaehrlich.
Geprueft: 37 Einheitstests, die Haelfte davon in der Gegenrichtung, plus
vier End-to-End-Tests auf beiden Geraeteprofilen. Der Browsertest hat
zwei Fehler gefunden, die Typpruefung und Einheitstests durchgelassen
haben - darunter ein verlorener Backslash, der die Vorbelegung des
Beitrags stillschweigend verschluckte.
Nebenbei: .claude/ ins .gitignore. Dort legen parallel arbeitende
Agenten ihre Worktrees ab; ein "git add -A" haette einen kompletten
zweiten Checkout eingecheckt.
Refs #3
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Was es tut
Neu unter Vermögen & Kasse → Wiederkehrende Zahlungen. Die importierten Kontobewegungen werden nach Empfänger gruppiert, nach Jahresbetrag sortiert und daneben steht, ob dazu schon ein Vertrag in der Akte liegt.
Aus der Zeile heraus geht es weiter: Vertrag anlegen mit vorbelegter Gesellschaft und vorbelegtem Beitrag, oder kein Vertrag mit Begründung.
Die Seite wertet nur aus. Sie legt von sich aus nichts an.
Zwei Haltungen, die den Ausschlag gaben
Im Zweifel getrennt lassen. Zusammengefasst wird nur das Unstrittige: Groß-/Kleinschreibung, Satzzeichen, Umlaute, Rechtsform am Ende. Ausdrücklich keine Ähnlichkeitssuche über Abstandsmaße — „Stadtwerke Bamberg" und „Stadtwerke Bayreuth" trennen drei Zeichen und zwei Rechnungssteller. Zwei Zeilen zu viel sind harmlos; eine falsch zusammengefasste Gruppe verbirgt einen Vertrag, und der fehlt dann im Vermögensverzeichnis.
Nichts behaupten, was nicht belegt ist. Statt „monatlich" steht dort „6 Zahlungen, etwa monatlich". Schwankt der Betrag, wird die Spanne genannt statt eines Mittelwerts, der Genauigkeit vortäuscht. Ohne erkennbaren Abstand wird nicht aufs Jahr hochgerechnet, sondern gezeigt, was tatsächlich geflossen ist.
Die Lücke, die ich nicht verschweigen wollte
Die Gruppierung braucht mindestens zwei Zahlungen. Eine jährlich abgebuchte Prämie erscheint bei einem importierten Jahr aber genau einmal — und ausgerechnet Versicherungen zahlt man oft jährlich. Ohne Gegenmaßnahme wäre die Suche genau dort blind, wo sie am meisten bringen soll.
Deshalb ein zweiter, klar getrennter Abschnitt: Einzelne größere Zahlungen ab 150 €, ohne hinterlegten Vertrag. Kein Vertragsverdacht, sondern eine Merkliste — so steht es auch auf der Seite.
Aufbau
src/lib/finanzen/wiederkehrend.tssrc/lib/finanzen/wiederkehrend-laden.tssrc/app/(app)/finanzen/wiederkehrend/page.tsxsrc/components/finanzen/wiederkehrend-aktionen.tsxDas Abhaken hängt am normalisierten Empfängernamen, nicht an Buchungen — nur so überlebt die Entscheidung den nächsten Kontoauszug.
Geprüft
Zwei Fehler hat erst der Browsertest gefunden, beide an Typprüfung und Einheitstests vorbei:
/^\d{1,15}$/ein/^d{1,15}$/. Die Vorbelegung des Beitrags wurde stillschweigend verschluckt — der Rest funktionierte.PRUEFHAUSEN LEBENSVERSICHERUNG AG). Die wäre so ins Vertragsformular gewandert und hätte von Hand neu getippt werden müssen. Jetzt gewinnt die gemischt geschriebene.Nebenbei
.claude/steht jetzt im.gitignore. Dort legen parallel arbeitende Agenten ihre git-Worktrees ab; eingit add -Ahätte einen kompletten zweiten Checkout eingecheckt.Version auf 1.2.0 angehoben, Changelog ergänzt.
Closes #3