fix: Die Kennung der Bank steht jetzt an der Buchung selbst

Bisher lag sie nur am Eingangs-Eintrag. Das reicht nicht: Der Eintrag ist eine
Zwischenstation und faellt weg, wenn ein Konto geloescht wird oder ein aelteres
Backup ihn nicht kannte. Dann war die Zahlung fuer den naechsten Abruf neu,
obwohl sie laengst gebucht war.

Am schlimmsten bei einem als Uebertrag gebuchten Umsatz: Der ist von der
Aehnlichkeitspruefung ausgenommen, dort griff also gar nichts mehr.

Die Kennung gehoert deshalb an die Buchung (transactions.source_uid, mit der
Quelle davor). Dort ueberlebt sie alles, was mit dem Eingang passiert, und die
Eindeutigkeit haelt die Datenbank selbst durch – nicht erst der pruefende Code
davor. Gestempelt wird an allen drei Buchungswegen: Eingang, Kurzbefehl und
Uebertrag.

Vorhandene Buchungen bekommen die Kennung nachgetragen, solange ihr
Eingangs-Eintrag noch da ist.

Ohne Kennung – von Hand erfasst, aus einer CSV-Datei – bleibt es beim
bisherigen Schutz ueber die Aehnlichkeit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-07 11:59:43 +02:00
co-authored by Claude Opus 5
parent 175d9f50e0
commit 991a8e4fc2
8 changed files with 308 additions and 3 deletions
+9
View File
@@ -673,6 +673,15 @@ def hole_umsaetze(db: Session, user: User, verbindung: BankConnection,
InboxItem.external_id.in_(kennungen))
.first()
)
if schon is None:
# Und dann noch an den BUCHUNGEN selbst. Der Eingangs-Eintrag
# ist eine Zwischenstation: Er faellt weg, wenn ein Konto
# geloescht wird, und aeltere Backups kannten ihn nicht. Die
# Buchung bleibt – und traegt die Kennung seit 0027 selbst.
schon = eingang.gebuchte_mit_kennung(
db, user,
[eingang.quell_kennung(InboxSource.bank, k) for k in kennungen],
)
if schon is not None:
continue
kennung = kennungen[0]