Finanzmanager/migrations/015_bankinstitute.sql
fds2610-bot 0b4a216954 Sammel-Commit: PayPal-Bankverbindung und Bankleitzahlen-Verzeichnis
Zwei Features an derselben Stelle, die im Arbeitsverzeichnis
nebeneinander lagen und sich dieselben Dateien teilen (Routen,
BankingController, Bankzugang, Zugangsformular, Dokumentation) –
getrennte Commits ließen sich daraus nur mit einem kaputten
Zwischenstand schneiden.

PayPal als zweite Art von Bankverbindung
----------------------------------------
„Bankverbindung anlegen“ führt zur Wahl der Art: HBCI/FinTS oder
PayPal (bank_zugaenge.typ, Migration 014). Die Abfrage läuft über die
Classic-NVP-API (Services\PaypalNvp, TransactionSearch und GetBalance).
Kein Dreischritt, da PayPal genau ein Guthabenkonto führt –
Zugangsdaten und Kontenzuordnung stehen in einem Formular. Konten,
Umsätze, Protokoll, Regeln und Abgleich bleiben dieselben.

Bankleitzahlen-Verzeichnis
--------------------------
Verwaltung → Bankleitzahlen (/verwaltung/bankinstitute, Migration 015)
nimmt die CSV-Institutsliste der Deutschen Kreditwirtschaft auf und
beantwortet damit die eine Angabe, die beim Anlegen einer
FinTS-Verbindung regelmäßig fehlt: den PIN/TAN-Zugangspunkt.

Reine Nachschlagedaten ohne benutzer_id; ein Import ersetzt den
gesamten Bestand, statt ihn zu ergänzen. „Nur prüfen“ und „Übernehmen“
sind zwei Knöpfe an derselben Datei – abgelegt wird sie nicht, ihr
Inhalt steht ja in der Tabelle.

Services\FintsInstituteImport nimmt der Datei ihre Eigenheiten ab:
ISO-8859-1 statt UTF-8, ein Institutsname über zwei Zeilen in
Anführungszeichen, dieselbe Bankleitzahl vielfach (eine Zeile je
Filiale), Hunderte leerer Zeilen am Ende, Text statt Adresse, wo es
keinen PIN/TAN-Zugang gibt. Spalten werden über ihre Überschrift
angesprochen; fehlen BLZ und Institut, bricht der Import ab.

Gesucht wird über Bankleitzahl, BIC, Name und Ort in einem Zug: „1822“
steht bei der 1822direkt im Namen und bei der Frankfurter Sparkasse im
BIC, in keiner der beiden Bankleitzahlen.

Aus der Trefferliste führt „Verbindung anlegen“ ins gefüllte
FinTS-Formular. Die FinTS-Adresse ist damit kein Pflichtfeld mehr –
bleibt sie leer, wird sie zur Bankleitzahl nachgeschlagen. Findet auch
das nichts, weist Bankzugang den Zugang ab, statt ihn ohne Gegenstelle
zu speichern.

Tests: 31_PaypalZugangTest, 32_BankinstituteTest,
e2e/specs/banking.spec.js, e2e/specs/bankinstitute.spec.js.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 08:48:14 +02:00

48 lines
2.6 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Das Bankleitzahlen-Verzeichnis der FinTS-Institute.
--
-- Die Liste kommt als CSV von der Deutschen Kreditwirtschaft
-- (https://www.hbci-zka.de/) und nennt zu jeder Bankleitzahl unter anderem den
-- PIN/TAN-Zugangspunkt. Genau der fehlt beim Anlegen einer Bankverbindung am
-- häufigsten – die Banken verstecken ihn tief in ihrer Hilfe.
--
-- Reine Nachschlagedaten: keine benutzer_id, kein Fremdschlüssel, keine
-- Verweise aus anderen Tabellen. Ein Import ersetzt den gesamten Bestand, statt
-- ihn zu ergänzen – sonst blieben Institute stehen, die es nicht mehr gibt.
--
-- Die Spalten für die Chipkartenverfahren (DDV, RDH-1…10, RAH-7/9/10) der Datei
-- werden nicht übernommen: Der Finanzmanager spricht ausschließlich PIN/TAN.
CREATE TABLE IF NOT EXISTS bankinstitute (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
-- Die laufende Nummer der Datei. Sie ist nicht stabil zwischen zwei
-- Ausgaben, taugt aber als Reihenfolge innerhalb einer.
nr INT UNSIGNED NOT NULL DEFAULT 0,
blz VARCHAR(16) NOT NULL,
bic VARCHAR(16) NOT NULL DEFAULT '',
institut VARCHAR(191) NOT NULL DEFAULT '',
ort VARCHAR(128) NOT NULL DEFAULT '',
rechenzentrum VARCHAR(128) NOT NULL DEFAULT '',
organisation VARCHAR(64) NOT NULL DEFAULT '',
-- Der HBCI-Zugang über DNS-Namen; für PIN/TAN belanglos, aber er verrät bei
-- einer Fehlersuche, welches Rechenzentrum tatsächlich antwortet.
hbci_adresse VARCHAR(191) NOT NULL DEFAULT '',
hbci_version VARCHAR(16) NOT NULL DEFAULT '',
pintan_url VARCHAR(255) NOT NULL DEFAULT '',
pintan_version VARCHAR(32) NOT NULL DEFAULT '',
-- „Datum letzte Änderung“ der Zeile, nicht der Datei: Manche Einträge sind
-- über zehn Jahre alt und entsprechend mit Vorsicht zu genießen.
stand DATE NULL,
PRIMARY KEY (id),
-- Eine Bankleitzahl steht oft mehrfach in der Datei, einmal je Filiale, mit
-- identischem Zugangspunkt. Deshalb ein gewöhnlicher Index, kein UNIQUE.
KEY idx_bankinstitut_blz (blz),
KEY idx_bankinstitut_bic (bic),
KEY idx_bankinstitut_institut (institut)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Wann welche Datei eingelesen wurde. Steht bewusst nicht im Einstellungsdialog:
-- Beides schreibt der Import, von Hand gibt es daran nichts einzustellen.
INSERT INTO einstellungen (schluessel, wert, bereich) VALUES
('bankinstitute_datei', '', 'banking'),
('bankinstitute_import_am', '', 'banking')
ON DUPLICATE KEY UPDATE schluessel = schluessel;