feat: Pockets sind erkennbar und zuordenbar

Ein Revolut-Pocket bringt weder eigene IBAN noch eigenen Namen mit. Certain
hielt bisher nur uid, IBAN, Name und Waehrung fest – mehrere Konten derselben
Bank sahen damit gleich aus, und in der Zeile stand die rohe Kennung.

Jetzt werden Produktbezeichnung und die Kennung fuer Konten ohne IBAN
mitgefuehrt, der angezeigte Name faellt der Reihe nach auf Name, Details,
Produkt, Kennung, IBAN zurueck statt auf die uid, und der uebermittelte
Datensatz laesst sich aufklappen – nachsehen statt raten, wenn zwei Konten
gleich aussehen. Beim Neuverbinden werden die Merkmale aufgefrischt, ohne die
Zuordnung anzutasten.

Fehlt ein Konto in der Waehrung des Bankkontos, steht das jetzt dabei; vorher
war die Auswahl einfach leer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-26 23:02:25 +02:00
co-authored by Claude Opus 5
parent d8995116cb
commit f684c752d8
8 changed files with 199 additions and 11 deletions
+24
View File
@@ -12,6 +12,7 @@ hinzu und werden dann alle über ``owner_id`` je Benutzer getrennt.
from __future__ import annotations
import enum
import json
# date/time unter Alias, weil es Spalten namens "date"/"time" gibt, die die
# gleichnamigen Typen sonst in den (späten) Annotationen beschatten.
from datetime import date as date_t, datetime, time as time_t, timezone
@@ -904,6 +905,14 @@ class BankAccountLink(Base):
remote_uid: Mapped[str] = mapped_column(String(64), nullable=False)
iban: Mapped[str | None] = mapped_column(String(64), nullable=True)
remote_name: Mapped[str | None] = mapped_column(String(255), nullable=True)
# Produktbezeichnung der Bank. Bei Revolut unterscheidet sie das Konto von
# seinen Pockets – die haben weder eigene IBAN noch eigenen Namen.
product: Mapped[str | None] = mapped_column(String(120), nullable=True)
# Kennung fuer Konten ohne IBAN (PSD2 fuehrt sie unter ``other``).
other_id: Mapped[str | None] = mapped_column(String(128), nullable=True)
# Der uebermittelte Datensatz, wie er kam. Damit laesst sich nachsehen,
# statt zu raten, wenn zwei Konten gleich aussehen.
raw_json: Mapped[str | None] = mapped_column(Text, nullable=True)
currency: Mapped[str] = mapped_column(String(3), nullable=False, default="EUR")
account_id: Mapped[int | None] = mapped_column(
ForeignKey("accounts.id", ondelete="SET NULL"), nullable=True
@@ -913,3 +922,18 @@ class BankAccountLink(Base):
__table_args__ = (
UniqueConstraint("owner_id", "remote_uid", name="uq_bank_link_remote"),
)
@property
def bank_felder(self) -> dict:
"""Der uebermittelte Datensatz als Feld-Liste.
Wird in den Einstellungen aufklappbar gezeigt. Wenn zwei Konten gleich
aussehen, steht der Unterschied hier – nachsehen schlaegt raten.
"""
if not self.raw_json:
return {}
try:
daten = json.loads(self.raw_json)
except ValueError:
return {}
return daten if isinstance(daten, dict) else {}