# Änderungen ## `update.sh` zieht aus dem Fork (25.09.2026) - Das Update-Skript holt den Code ausdrücklich per `git pull --ff-only origin main`. Vorher brach es ohne Tracking-Branch mit „Es gibt keine Tracking-Informationen“ ab. - Quelle ist der Fork, weil es derzeit nur die Entwicklungsumgebung gibt; der Upstream ist Backup und Veröffentlichung. Für eine spätere Produktion: `UPDATE_REMOTE=upstream`. - Das Skript bricht bei unverändertem Code nicht mehr ab: Container starten und Migrationen laufen immer, damit ein von Hand gezogener Stand nicht ohne Migration bleibt. - Der Pull läuft mit HTTP/1.1 (Codeberg liefert bei HTTP/2 sonst 504). ## Echtzeitüberweisung im Zahlungsverkehr (25.09.2026) Der Überweisungsdialog bietet jetzt das Häkchen **Echtzeitüberweisung**: Das Geld ist binnen Sekunden beim Empfänger. SEPA behandelt die Echtzeitüberweisung als eigenes Verfahren (SCT Inst), der Finanzmanager deshalb auch. - Über FinTS geht der Auftrag als Geschäftsvorfall HKIPZ hinaus (`SendSEPARealtimeTransfer` aus php-fints) statt als HKCCS. In der pain.001-Nachricht steht die Zahlungsart `LclInstrm/Cd = INST`; das gibt es nur im ISO-Format `pain.001.001.03`. - Eine Echtzeitüberweisung hat keinen Ausführungstermin: Der Dialog sperrt das Feld, ein Termin in der Zukunft wird beim Speichern abgewiesen. - Bietet die Bank keine Echtzeitüberweisung an, scheitert der Auftrag mit einer klaren Meldung und bleibt stehen. Eine stille Umwandlung in eine gewöhnliche Überweisung durch die Bank ist abgeschaltet. - Die Übersicht kennzeichnet Echtzeitüberweisungen in der Spalte „Ausführung“, das Übermittlungsprotokoll nennt sie ausdrücklich. - Neue Spalte `zahlungsauftraege.echtzeit` (Migration `019`). - Test 43 (`tests/43_EchtzeitueberweisungTest.php`) und ein E2E-Test für das Sperren des Termins. ## Übermittlungsprotokoll für Überweisungen und Bankkommunikation (21.09.2026) Als Nachweis gegenüber der Bank, dass eine Überweisung fristgerecht und korrekt übermittelt wurde, speichert der Finanzmanager jetzt den gesamten Dialog – gesendete und empfangene Meldungen im Wortlaut, im Erfolgs- wie im Fehlerfall. PIN und Benutzerkennung sind maskiert (das erledigt die FinTS-Bibliothek, bevor die Zeilen ankommen). - **Zahlungsverkehr:** Ein Klick auf den Status einer Überweisung öffnet ihr Übermittlungsprotokoll in einem modalen Dialog. Eine Überweisung mit TAN-Freigabe hat mehrere Durchläufe; alle stehen darin, der älteste zuerst. Ohne JavaScript führt der Status auf dieselbe Ansicht als eigene Seite. - **Verwaltung › Online-Banking › Protokoll** (`/banking/protokoll`): das Gesamtprotokoll über jede Kommunikation mit den Banken – Überweisungen, Umsatzabrufe und die Abfrage der TAN-Verfahren. Filterbar nach Bank, Zeitraum und Freitext. - Neue Tabelle `bank_protokolle` (Migration `018`), Modell `Bankprotokoll`, Mitschnitt über `Services\BankProtokollLogger`. Das Protokoll bleibt stehen, auch wenn die Überweisung gelöscht wird; es wird nicht automatisch aufgeräumt. - Test 42 (`tests/42_UebermittlungsprotokollTest.php`). ## Letzter roter E2E-Test aus dem Typeahead-Umbau behoben (04.09.2026) Ein Test blieb nach der Anpassung an den Typeahead (siehe unten) noch rot: „Bargeld-Tool › Eine vorgemerkte Kategorie wird beim Zuordnen geprüft“ – und zwar zuverlässig, nicht nur gelegentlich. Ursache war kein Rest des Umbaus mehr, sondern ein zu knapper Timeout: Die Schnellzuordnung im Kontoblatt prüft dabei gegen eine absichtlich ungültige Adresse (`kasse.beispiel.invalid`), und bis der serverseitige Abruf daran scheitert, vergehen durch `BargeldTool::ZEITGRENZE` (8 s Verbindungsaufbau) plus die Namensauflösung der ungültigen Adresse über 15 Sekunden – mehr, als Playwrights Standard-Timeout von 5 s für `toContainText()` hergibt. Die betroffenen Erwartungen tragen jetzt einen eigenen Timeout von 25 s, der Test insgesamt 90 s statt 60 s. ## E2E-Datenbestand wird vor jedem Lauf aufgeräumt (04.09.2026) Die Browser-Tests legten ihre Konten, Kategorien und Buchungen bei jedem Lauf neu an, weggeräumt hat sie niemand: Zuletzt standen über dreitausend Zeilen Testdaten in der Datenbank – vierzig „E2E Bankprovision …“ hintereinander im Kategoriefilter des Kontoblatts, und kein Bildschirmfoto eines fehlgeschlagenen Tests war mehr zu gebrauchen. `scripts/e2e-aufraeumen.php` räumt den Bestand weg; `tests/e2e/run.sh` ruft es vor jedem Lauf auf. Vor dem Lauf und nicht danach, weil ein abgebrochener Lauf sonst einen Bestand hinterlässt, an den niemand mehr denkt – und weil die Daten des letzten Laufs so bis zum nächsten für die Fehlersuche stehen bleiben. `E2E_KEIN_AUFRAEUMEN=1` lässt sie liegen, `--probe` zählt nur, was wegfiele. Gelöscht wird, was am Testnutzer hängt – nicht, was nach Testdaten aussieht. Ein Namensmuster übersähe die Buchung „Supermarkt“ und träfe irgendwann etwas Echtes; die Fremdschlüssel dagegen sagen genau, was zu diesem Nutzer gehört, und nehmen über ihre Kaskaden auch die Zeilen ohne eigene `benutzer_id` mit (Splitzeilen, Budgetpositionen, Bankkonten, Kurse). Der Nutzer selbst bleibt stehen, sonst käme der nächste Lauf nicht durch die Anmeldung. Als Schranke gegen den Fehlgriff muss er den Anzeigenamen tragen, den `scripts/e2e-benutzer.php` setzt: Wer `E2E_USER` versehentlich auf seinen eigenen Zugang stellt, bekommt einen Abbruch statt eines leeren Datenbestands. Das Aufräumen deckte auf, dass sieben Tests auf den Resten früherer Läufe standen: Die Auswertungen prüfen, dass ein Bericht eine Tabelle statt eines Platzhalters zeigt, das Cockpit, dass „Übrige Konten“ eine Ebene tiefer führt – Daten dafür legte keiner von ihnen an. Auf einer frisch aufgeräumten Instanz fielen sie aus; vorher hing ihr Ergebnis davon ab, wer zuletzt was hatte laufen lassen. `scripts/e2e-grundbestand.php` stellt deshalb nach dem Aufräumen einen festgelegten Bestand her, dessen Zuschnitte an genau diesen Tests hängen: mehr Konten als `Vermoegensentwicklung::SERIEN`, Buchungen in jedem Monat des laufenden Jahres, ein Vorjahr für den Vergleichsbericht, ein Depot mit Wertpapiergeschäft. Die Suite prüft damit dasselbe wie vorher, aber auf einem Bestand, den sie kennt. ## E2E-Tests an den Typeahead im Kontoblatt angepasst (04.09.2026) Zwölf E2E-Tests standen seit dem Typeahead-Umbau (Fix #41) auf Rot – nicht, weil die Anwendung etwas falsch machte, sondern weil die Specs den alten Stand prüften. Vier Ursachen lagen darunter: - **Die Kombobox versteckt ihr `` in ein Eingabefeld mit gefilterter Liste um, ohne dass App- oder Formular-Code etwas davon merken – Wert und Ändern-Ereignis bleiben identisch. Geprüft wurde außerdem, dass „Empfänger ins Adressbuch übernehmen“ beim Erfassen einer Überweisung tatsächlich eine Adresse anlegt (`ZahlungsverkehrController::anlegen()` → `Adresse::anlegen()`). ## Zahlungsverkehr: automatische Bankauswahl (31.08.2026) Beim Erfassen einer Überweisung musste bisher neben dem Auftragskonto auch die Bankverbindung von Hand gewählt werden – obwohl sich diese meist schon aus dem Konto ergibt (Feature #50). Das Formular fragt jetzt nur noch das Auftragskonto ab; die passende Bank ermittelt `Bankzugang::zugangJeKonto()` anhand der Kontenzuordnung (`bank_konten.konto_id`) und trägt sie beim Speichern automatisch in `zahlungsauftraege.zugang_id` ein. Konten ohne konfigurierte Bankverbindung stehen als Auftragskonto gar nicht erst zur Auswahl – ohne Bank ließe sich ohnehin nichts senden. Ein bereits erfasster Auftrag behält sein Auftragskonto auch dann, wenn dessen Bank nachträglich entfernt wurde: Es bleibt in der Auswahl, statt beim nächsten Speichern unbemerkt zu wechseln. ## Einstellungen: Reiter "Profil" zum Ändern des eigenen Passworts (20.08.2026) Bislang ließ sich das eigene Passwort nur direkt über den Datenbestand ändern (Feature #46). Der Einstellungsdialog bekommt dafür einen neuen Reiter `Profil`, der den angemeldeten Benutzernamen anzeigt und ein eigenes Formular für die Passwortänderung enthält – getrennt vom generischen Speichern-Formular der übrigen Reiter, weil hier kein Einstellungswert, sondern der Anmeldedatensatz geschrieben wird. `EinstellungenController::passwortAendern()` (Route `POST /einstellungen/passwort`) verlangt das aktuelle Passwort (geprüft über `Benutzer::pruefeAnmeldung()`), ein neues mit mindestens 10 Zeichen – dieselbe Grenze wie bei der Ersteinrichtung – und dessen Wiederholung. Bei Erfolg schreibt `Benutzer::passwortSetzen()` den neuen Hash; ein Eintrag landet wie bei An- und Abmeldung im Debug-Log. ## CONTRIBUTE.md und Setup-Skript für Mitwirkende (19.08.2026) `CONTRIBUTE.md` beschreibt, wie Beiträge ankommen (Issue, PR, E-Mail), welche Unterstützung gesucht wird und die drei bindenden Leitlinien des Projekts: FOSS, Datensparsamkeit und Security mit direktem Kontakt an fds2610@sonnengetrock.net für Sicherheitslücken. Vorangestellt ist ein Disclaimer, dass VIBE Coding ausdrücklich erlaubt ist – das Projekt selbst ist mit intensivem LLM-Einsatz entstanden (Feature #43). Neu ist außerdem `dev-setup.sh` im Repo-Root: richtet Docker (optional), Checkout mit Fork- und Upstream-Remote, lokale Container und optional die E2E-Testinfrastruktur ein. Zielverzeichnis, E2E-Setup und Docker-Installation lassen sich über Flags oder Umgebungsvariablen abweichend vom Default setzen. ## Kontoblatt: Typeahead für die Kategorie (19.08.2026) Die Kategorie ließ sich im Kontoblatt nur über eine lange Auswahlliste finden – bei vielen Kategorien ein langes Blättern (Feature #41). Ein neues `kombobox.js` baut ein markiertes `` bleibt unsichtbar im Formular stehen, damit Wert, Name und das Ändern-Ereignis für vorhandenen Code unverändert bleiben. Betroffen sind der Kategorie-Filter oben im Kontoblatt und die Schnellzuordnung je Buchung (`kontoblatt.js` öffnet dort die Kombobox statt `showPicker()`, sobald ein `` – ihre Liste ist kurz. Ohne JavaScript bleibt es überall beim normalen `