Die Wertpapiermaske (Dialog im Kontoblatt und Seite ohne JavaScript) sowie
„Depotbuchung erfassen“ bieten eine Klasse an. Im Kontoblatt ist sie mit der
bisherigen Klasse der Buchung vorbelegt und gilt für die Buchung samt aller
Splitzeilen der Nebenkosten; bei der Depotbuchung steht sie an der erzeugten
Geldbuchung. Unbekannte Klassen werden abgewiesen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unter den Kategorien stehen überall die aktiven Umbuchungskonten, je
Kontengruppe gruppiert und in deren Reihenfolge (Konto::umbuchungsgruppen()):
Regeln samt Splitzeilen, Umsatzabgleich, Buchungsvorlagen, Regelmäßige
Buchungen, Zahlungsverkehr, Verträge sowie die Filter von Buchungsbericht
und Export. Die Masken nutzen dafür die gemeinsame Liste Kategorie /
Gegenkonto der Buchungsmaske; das getrennte Gegenkonto-Feld der Regel
entfällt.
Regel-Splitzeilen können auf ein Umbuchungskonto zeigen. Zahlungsaufträge
und Verträge bekommen ein Gegenkonto (Migration 030). Ein schon gewähltes
inaktives Konto bleibt sichtbar, damit keine Zuordnung verloren geht.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Neuer Schalter „automatisch abgleichen“ unter „automatisch buchen“
(Vorgabe: eingeschaltet). Gesetzt wird die aus der Reihe entstandene
Buchung als abgeglichen markiert. Die Übersicht erhält die Spalte
„Abgleichen“ zwischen „Auto“ und „Aktiv“.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Neuer Schalter „Bewusst ohne Kategorie“ in der Buchungsmaske für
Abschreibungen und rein rechnerische Solarerträge. Solche Buchungen
erscheinen nicht unter den offenen Vorgängen im Cockpit, nicht im
Prüflauf des Monatsabschlusses, setzen das Konto in der Kontenübersicht
nicht fett und werden von der Regelanwendung sowie dem automatischen
Zusammenführen zu Umbuchungen ausgelassen. Kommt eine Kategorie, ein
Gegenkonto oder eine Splitbuchung hinzu, entfällt die Markierung.
Migration 028_bewusst_ohne_kategorie.sql, Test 59 und E2E-Test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die comdirect liefert bei Zahlungen mit der Visa-Debitkarte (GVC 700) kein
Namensfeld; der Händler steht nur zwischen „KARTENVERFÜGUNG“ und „KARTE NR.“.
Der Abruf leitet ihn ab, ohne den Fingerabdruck zu ändern; ein erneuter Abruf
und Migration 027 tragen ihn bei vorhandenen Umsätzen und Buchungen nach.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Meldet die Bank nach der TAN 3045 (noch keine Rückmeldung zum Status),
fragt ein Hintergrundprozess nach der Mindestwartezeit aus HIIPSS per
HKIPS nach (höchstens fünfmal). Ausgeführt wird vermerkt, abgelehnt
entfernt die Buchung; ein verbundener Kontoumsatz klärt den Status
ebenfalls. php-fints-Fork v4.1.7 bringt HKIPS/HIIPS/HIIPSS mit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Status „wartet auf Freigabe“, solange die Bank auf TAN/Namensabgleich wartet
- Abbruch der Freigabe (auch durch neuen Sendeversuch) im Übermittlungsprotokoll
als „abgebrochen“ festhalten, Auftrag als fehlgeschlagen vermerken
- Aufträge mit Übermittlungsprotokoll nur stornieren, nicht löschen
- Migration 025, PHP-Test 57, E2E-Spec zahlungsfreigabe
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nennt die Bank bei der TAN-Abfrage einen Startcode für den TAN-Generator,
geht er im Fließtext leicht unter. StartcodeErkennung erkennt ihn über
einen pro Bankverbindung konfigurierbaren Beispielsatz (Ziffernfolge =
Platzhalter für den Code) und zeigt den Fund fett, zentriert und in
eigener Zeile. BankFreitext löst dafür die bisherige Klartext-Aufbereitung
aus FinTsUeberweisung::vopHinweis() heraus, damit TAN-Anfrage und
VoP-Rückmeldung dieselbe HTML-zu-Klartext-Umwandlung nutzen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Elf Listenansichten (Klassen, Buchungsvorlagen, Regelmäßige Buchungen,
Erinnerungen, Verträge, Adressen, Sparziele, Kredite, Abgleichregeln,
Budgets, Berichtsgruppen) zeigten das Formular unter der Liste. Jetzt
öffnet der Knopf „+ Neu“ es als Dialog.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Die Kachel "Offene Vorgänge" im Cockpit zeigt jetzt auch Buchungen, deren
letzter Abgleich mit dem Bargeld-Tool an einem Abrufproblem gescheitert ist
(bargeld_status = 'fehler'). Ein Klick führt auf die neue, kontoübergreifende
Liste unter Verwaltung -> Bargeld-Tool -> fehlgeschlagene Prüfungen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Depot der Bank wird einem Depot im Finanzmanager zugeordnet (Migration 022)
- Bestand einbuchen: Ein-/Auslieferungen aus dem Bankbestand, Stichtag per Dialog
- Zuordnungsliste: Depots nur noch als Wertpapiergeschäft
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Depotaufstellung (HKWPD, Version 6) unter Wertpapiere mit Vergleich zum eigenen
Bestand; Prüfsumme und Textnachweis für das Übermittlungsprotokoll einer
Überweisung; phpFinTS v4.1.5.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Eine falsche Splitsumme zeigte zwar die Fehlermeldung, leitete aber auf eine
frische Buchungsmaske weiter und riss dabei alle gerade erfassten Splitzeilen
(und übrigen Feldwerte) heraus, obwohl in der Datenbank nichts geändert wurde.
anlegen()/speichern() zeichnen die Maske bei einem Validierungsfehler jetzt
direkt mit den zuletzt abgeschickten Werten neu, statt wegzuleiten.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Die Summenzeile der Splitbuchungen (Buchungsmaske und Splitdialog im
Kontoblatt) zeigt jetzt den noch offenen Restbetrag zum Buchungswert statt
der Summe der Zeilen. „Speichern" bleibt gesperrt, solange Splitzeilen
befüllt sind und der Restbetrag nicht Null ist; ohne Splitzeilen (auch mit
direkter Kategorie/Gegenkonto) bleibt der Knopf wie bisher an.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Toggle „Regel anlegen“ in der Buchungsmaske (Fix#94); beim Speichern
entsteht daraus eine Regel (AbgleichRegel::ausBuchung()), die das
Kontoblatt danach in einem modalen Dialog zum Prüfen und Anpassen zeigt.
Abbruch (auch per Escape) verwirft die Regel wieder, Speichern übernimmt
Änderungen. Die Regelfelder sind aus regeln.php in regelfelder.php
ausgelagert, damit beide Formulare dieselbe Bauart teilen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Die Spalte heißt nur noch „Anteil“; darunter steht die Summe der Anteile,
die sich mit jeder Eingabe in derselben Tabelle neu berechnet.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
SepaXml erzeugt jetzt zusätzlich pain.001.001.09 (Dt-Element für den
Ausführungstermin, BICFI statt BIC, UETR je Zahlung) für Banken, die das
ältere pain.001.001.03 nicht mehr führen. FinTsUeberweisung fängt außerdem
die UnsupportedException ab, die php-fints wirft, wenn die Bank
Namensabgleich-Volltreffer und TAN-Anfrage in einem Antwortsatz kombiniert,
und lässt den vorhandenen automatischen Volltreffer-Namensabgleich den Rest
erledigen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
In der Buchungsmaske sperrt eine Eingabe in den Splitzeilen sofort
Kategorie / Gegenkonto und Klasse, und umgekehrt sperrt eine Kategorie
oder Klasse alle Splitzeilen. Der neue Knopf „Splitbuchungen löschen“
rechts über der Splittabelle leert alle Zeilen und gibt die direkten
Felder wieder frei.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bei einer Splitbuchung zeigt die Klassenspalte jetzt die gemeinsame Klasse
der Splitzeilen. Unterscheiden sie sich, steht dort die Marke „Splitbuchung“,
der Tooltip nennt je Splitzeile Kategorie und Klasse. Ein Klick auf die
Klassenzelle einer Splitbuchung öffnet den Splitdialog.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Über der Tabelle der Bankverbindungen ruft ein neuer Knopf jede aktive
Bankverbindung einzeln nacheinander ab. Die Warteschlange (Services\Sammelabruf)
übersteht TAN-Runden in der Sitzung; nach der Freigabe geht es mit der nächsten
Bank weiter. Die TAN-Maske zeigt den Stand und erlaubt, eine Bank zu
überspringen. Am Ende steht je Bankverbindung eine eigene Meldung.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Jeder Legendeneintrag der Cockpit-Kacheln führt zu den Buchungen, aus denen
sich sein Wert zusammensetzt: Kategorien, „Nicht kategorisiert“ und „Übrige“
in „Meine Ausgaben“, Einnahmen/Ausgaben/Saldo in „Einnahmen und Ausgaben“,
Konten der Vermögensentwicklung ins Kontoblatt. Ziel ist der Drilldown der
Auswertungen mit dem Filter der Kachel; zeilenbuchungen() kennt dafür einen
Art-Filter, „alle Bewegungen“ und mehrere Kategorien.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Liegen zwei Buchungen, die eigentlich derselbe Vorgang sind, zu weit
auseinander oder gehörte eine ursprünglich einem anderen Ursprungskonto,
findet der automatische Abgleich sie nicht – die Umbuchung und ihre
einzeln erfasste Dublette stehen dann dauerhaft nebeneinander im
Kontoblatt.
Buchung::verknuepfen() führt eine Umbuchung (eigene Seite oder
Gegenseite auf diesem Konto) und eine einzeln erfasste Buchung mit
passendem Betrag zusammen: Die Umbuchung bleibt, die Dublette fällt
weg, ihr Bankumsatz hängt sich an die Umbuchung. Im Kontoblatt lässt
sich dafür jetzt auch die Gegenseite einer fremden Umbuchung ankreuzen;
ein neuer Knopf „Verknüpfen“ nutzt dieselbe Auswahl wie „Auswahl
löschen“.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bei Gruppierung nach Konto oder Empfänger landen alle Zeilen einer
Splitbuchung ohnehin in derselben Gruppe, erschienen dort aber trotzdem
einzeln mit ihrem Teilbetrag statt dem Gesamtbetrag der Buchung – wer nur
eine Zeile sah, hielt sie für den vollständigen Betrag. Bei Kategorie oder
Klasse bleibt es beim bisherigen Verhalten, weil eine Splitbuchung dort auf
mehrere Gruppen verteilt ist und die Gruppensummen sonst nicht mehr zum
Summenbericht passten.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Der Pull nennt Remote und Branch ausdrücklich (origin main, HTTP/1.1), damit kein
Tracking-Branch nötig ist. Quelle ist der Fork, solange es nur die Entwicklungsumgebung
gibt; für eine spätere Produktion gibt es UPDATE_REMOTE=upstream. Das Skript bricht bei
unverändertem Code nicht mehr ab, sodass Migrationen eines von Hand gezogenen Stands
nachgeholt werden. Doku (CLAUDE.md, PLAN.md, README.md, Changes.md) angepasst.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Der Überweisungsdialog bietet das Häkchen „Echtzeitüberweisung“. SEPA
behandelt sie als eigenes Verfahren: Über FinTS geht der Auftrag als HKIPZ
(SendSEPARealtimeTransfer) statt als HKCCS hinaus, die pain.001-Nachricht
trägt die Zahlungsart LclInstrm/Cd = INST (nur im ISO-Format
pain.001.001.03). Eine Echtzeitüberweisung hat keinen Ausführungstermin;
bietet die Bank sie nicht an, scheitert der Auftrag mit klarer Meldung,
eine stille Umwandlung in eine gewöhnliche Überweisung ist abgeschaltet.
Neue Spalte zahlungsauftraege.echtzeit (Migration 019), Test 43 und ein
E2E-Test für das Sperren des Termins.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der gesamte FinTS-Dialog (gesendete und empfangene Meldungen) wird je Durchlauf
in bank_protokolle gespeichert, im Erfolgs- wie im Fehlerfall. Im Zahlungsverkehr
öffnet der Status das Protokoll der Überweisung als modalen Dialog; unter
Online-Banking › Protokoll gibt es das Gesamtprotokoll mit Filter nach Bank,
Datum und Freitext.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Die vier in #61 beschriebenen Ursachen waren bereits durch Fix#62 (PR #63)
behoben. Ein Test blieb aber weiterhin zuverlässig rot: Der Abgleich gegen die
absichtlich ungültige Bargeld-Tool-Adresse braucht durch Verbindungsaufbau und
Namensauflösung über 15 Sekunden, bevor er als gescheitert gilt – mehr, als
Playwrights Standard-Timeout von 5 s für toContainText() hergibt. Die
betroffenen Erwartungen tragen jetzt 25 s Timeout, der Test insgesamt 90 s.
Geprüft: tests/e2e/run.sh (87/87 grün, dreifach wiederholt) und
./scripts/run-tests.sh (1895 Prüfungen bestanden).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>