fix: Bei keinem Treffer zeigen, was ueberhaupt geladen wurde

N26 und Revolut sind bei Enable Banking abgedeckt – in 31 Laendern, unter
genau diesen Namen. Wer sie trotzdem nicht findet, bekommt die falsche Liste,
und der haeufigste Grund ist eine als Sandbox statt Production angelegte
Anwendung: Dann kommen Test-Institute, man sieht also Banken, nur nicht die
echten.

Bleibt die Suche ohne Treffer, stehen jetzt acht Beispiele aus der geladenen
Liste da. Sind das lauter Mock-Institute, ist die Ursache auf einen Blick zu
sehen statt nach Namensvarianten zu raten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-26 21:52:04 +02:00
co-authored by Claude Opus 5
parent 9a0c607e8c
commit d3e4b0e089
4 changed files with 33 additions and 10 deletions
+6 -4
View File
@@ -89,11 +89,13 @@ def banken(db: Session, user: User, land: str | None = None,
"logo": b.get("logo"), "psu_types": b.get("psu_types", []), "logo": b.get("logo"), "psu_types": b.get("psu_types", []),
"beta": bool(b.get("beta"))}) "beta": bool(b.get("beta"))})
treffer.sort(key=lambda b: (b["name"].lower(), b.get("country") or "")) treffer.sort(key=lambda b: (b["name"].lower(), b.get("country") or ""))
# „gesamt" mitliefern: Sonst sieht „keine Treffer" gleich aus, egal ob die # „gesamt" und eine Kostprobe mitliefern: Sonst sieht „keine Treffer"
# Liste leer kam oder der Suchbegriff nicht passte – und man sucht den # gleich aus, egal ob die Liste leer kam, der Suchbegriff nicht passte –
# Fehler an der falschen Stelle. # oder die Anwendung als Sandbox angelegt wurde und lauter Test-Institute
# liefert. An der Kostprobe sieht man Letzteres sofort.
beispiele = sorted({str(b.get("name")) for b in roh if b.get("name")})[:8]
return {"gesamt": len(roh), "treffer": treffer[:MAX_TREFFER], return {"gesamt": len(roh), "treffer": treffer[:MAX_TREFFER],
"gekuerzt": len(treffer) > MAX_TREFFER} "gekuerzt": len(treffer) > MAX_TREFFER, "beispiele": beispiele}
def starte_verbindung(db: Session, user: User, aspsp_name: str, land: str, def starte_verbindung(db: Session, user: User, aspsp_name: str, land: str,
+3 -1
View File
@@ -603,7 +603,9 @@
"searchHint": "Ohne Land wird überall gesucht. Das ist meist richtig: Das Sitzland einer Bank steht nicht in der IBAN – Revolut vergibt deutsche IBANs, sitzt aber in Litauen.", "searchHint": "Ohne Land wird überall gesucht. Das ist meist richtig: Das Sitzland einer Bank steht nicht in der IBAN – Revolut vergibt deutsche IBANs, sitzt aber in Litauen.",
"allCountries": "alle Länder", "allCountries": "alle Länder",
"noMatch": "{{gesamt}} Banken geladen, aber keine passt zum Suchbegriff. Versuch etwas Kürzeres – manche heissen in der Liste anders als im Alltag.", "noMatch": "{{gesamt}} Banken geladen, aber keine passt zum Suchbegriff. Versuch etwas Kürzeres – manche heissen in der Liste anders als im Alltag.",
"noneLoaded": "Die Schnittstelle hat gar keine Banken geliefert. Das liegt nicht am Suchbegriff: Prüf, ob deine Anwendung bei Enable Banking schon aktiv ist – sie wird es erst, wenn du dort deine eigenen Konten verknüpft hast." "noneLoaded": "Die Schnittstelle hat gar keine Banken geliefert. Das liegt nicht am Suchbegriff: Prüf, ob deine Anwendung bei Enable Banking schon aktiv ist – sie wird es erst, wenn du dort deine eigenen Konten verknüpft hast.",
"sampleTitle": "Beispiele aus der geladenen Liste:",
"sandboxHint": "Stehen dort lauter Test- oder Mock-Institute statt echter Banken, ist deine Anwendung im Control Panel als „Sandbox“ angelegt. N26 und Revolut gibt es nur in „Production“ – dort heissen sie genau so, in DE wie in LT."
}, },
"bankReturn": { "bankReturn": {
"title": "Rückkehr von der Bank", "title": "Rückkehr von der Bank",
+3 -1
View File
@@ -603,7 +603,9 @@
"searchHint": "Without a country it searches everywhere, which is usually right: a bank's home country is not in the IBAN – Revolut issues German IBANs but is based in Lithuania.", "searchHint": "Without a country it searches everywhere, which is usually right: a bank's home country is not in the IBAN – Revolut issues German IBANs but is based in Lithuania.",
"allCountries": "all countries", "allCountries": "all countries",
"noMatch": "{{gesamt}} banks loaded, but none matches. Try something shorter – some are listed under a different name than the one you know.", "noMatch": "{{gesamt}} banks loaded, but none matches. Try something shorter – some are listed under a different name than the one you know.",
"noneLoaded": "The interface returned no banks at all. That is not the search term: check whether your Enable Banking application is active yet – it only becomes active once you have linked your own accounts there." "noneLoaded": "The interface returned no banks at all. That is not the search term: check whether your Enable Banking application is active yet – it only becomes active once you have linked your own accounts there.",
"sampleTitle": "Examples from the loaded list:",
"sandboxHint": "If those are test or mock institutions instead of real banks, your application is registered as “Sandbox” in the Control Panel. N26 and Revolut exist only in “Production”, where they are listed under exactly those names."
}, },
"bankReturn": { "bankReturn": {
"title": "Back from your bank", "title": "Back from your bank",
+18 -1
View File
@@ -265,10 +265,27 @@ export default function Bankanbindung() {
{banken.treffer.length === 0 ? ( {banken.treffer.length === 0 ? (
// Der Unterschied zwischen „Liste kam leer" und „nichts passte" // Der Unterschied zwischen „Liste kam leer" und „nichts passte"
// entscheidet, wo man den Fehler sucht. // entscheidet, wo man den Fehler sucht.
<p className="muted small"> <div className="alert" style={{ display: "block" }}>
<p className="muted small" style={{ marginTop: 0 }}>
{banken.gesamt === 0 ? t("bank.noneLoaded") {banken.gesamt === 0 ? t("bank.noneLoaded")
: t("bank.noMatch", { gesamt: banken.gesamt })} : t("bank.noMatch", { gesamt: banken.gesamt })}
</p> </p>
{banken.gesamt > 0 && (
<>
{/* Eine Kostprobe der geladenen Liste. Stehen dort lauter
Test-Institute, ist die Anwendung als Sandbox angelegt –
das sieht man hier auf einen Blick. */}
<p className="muted small" style={{ marginBottom: 2 }}>
{t("bank.sampleTitle")}
</p>
<ul className="muted small selectable"
style={{ paddingLeft: "1.2em", margin: 0 }}>
{(banken.beispiele || []).map((n) => <li key={n}>{n}</li>)}
</ul>
<p className="muted small">{t("bank.sandboxHint")}</p>
</>
)}
</div>
) : ( ) : (
<> <>
<p className="muted small"> <p className="muted small">