Commit graph

98 commits

Author SHA1 Message Date
fds2610
8bd61f55a3 Merge pull request 'Fix #71: Echtzeitüberweisung im Überweisungsdialog' (#72) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/72
2026-09-25 15:22:39 +02:00
fds2610-bot
822458ee0f Fix #71: Echtzeitüberweisung im Überweisungsdialog
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>
2026-09-25 15:21:04 +02:00
fds2610
ba1747849d Merge pull request 'Fix #67: Übermittlungsprotokoll für Überweisungen speichern' (#68) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/68
2026-09-21 08:12:57 +02:00
fds2610-bot
3caf1dcdca Fix #67: Übermittlungsprotokoll für Überweisungen und Bankkommunikation speichern
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>
2026-09-21 07:48:10 +02:00
fds2610
451a40a826 Merge pull request 'Fix #61: Verbliebenen roten E2E-Test aus dem Typeahead-Umbau behoben' (#66) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/66
2026-09-20 21:10:55 +02:00
fds2610-bot
9488c2d4ef Fix #61: Verbliebenen roten E2E-Test aus dem Typeahead-Umbau behoben
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>
2026-09-04 21:37:57 +02:00
fds2610
2abcb852c3 Merge pull request 'Fix #64: E2E-Datenbestand vor jedem Lauf aufräumen und neu aufbauen' (#65) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/65
2026-09-04 21:12:47 +02:00
fds2610-bot
a81ec1ceba Fix #64: E2E-Datenbestand vor jedem Lauf aufräumen und neu aufbauen
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, und kein Bildschirmfoto eines fehlgeschlagenen Tests war mehr
zu gebrauchen.

scripts/e2e-aufraeumen.php räumt weg, 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. Der Nutzer selbst bleibt stehen, und er muss 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.

Aufgerufen wird es vor dem Lauf, nicht danach – ein abgebrochener Lauf
hinterlässt sonst einen Bestand, an den niemand mehr denkt, und so bleiben die
Daten des letzten Laufs bis zum nächsten für die Fehlersuche stehen.

Das 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. scripts/e2e-grundbestand.php stellt deshalb 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.
Test 41 prüft jede dieser Grenzen einzeln und nennt den Test, der daran hängt.

87 E2E-Tests grün, in 1,3 statt 2,7 Minuten – die Listen rendern keine
Tausenden Altzeilen mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQ57wQWZ4xKHcKmp26bzgr
2026-09-04 17:36:13 +02:00
fds2610
f4fa4f0e3a Merge pull request 'Fix #62: E2E-Tests an den Typeahead im Kontoblatt angepasst' (#63) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/63
2026-09-04 15:35:00 +02:00
fds2610-bot
5491bb69f6 Fix #62: E2E-Tests an den Typeahead im Kontoblatt angepasst
Zwölf Tests standen auf Rot, ohne dass die Anwendung etwas falsch machte – die
Specs prüften den Stand vor dem Umbau. Vier Ursachen lagen darunter:

Die Kombobox lässt ihr <select> zwar im Formular stehen, setzt es aber auf
hidden; selectOption() wartet darauf vergeblich. Der neue Helfer
tests/e2e/specs/hilfen.js bedient das Eingabefeld, tippt die Beschriftung ein
und klickt den genau passenden Treffer an – exakt, weil [Depot] sonst auch das
[Depot] … des Wertpapiergeschäfts träfe.

Seit dem Schnellspeichern ohne Neuladen stehen zwei Erfolgsmeldungen
übereinander; gemeint ist die neue, also .last().

Die Adressliste ist seit der Adressverwaltung eine Bearbeitungstabelle: Die
Namen stehen in Eingabefeldern, wo toContainText nicht hinsieht. Geprüft wird
jetzt der Feldwert – gespeichert wurde die Adresse die ganze Zeit korrekt.

Die beiden übrigen Fehlschläge waren Folgefehler: Playwright startet nach jedem
Fehlschlag einen frischen Worker, das Spec-Modul wird neu geladen, seine Marke
neu gezogen und beforeAll legt leere Konten an. Sie brauchten keine Änderung.

87 Tests grün, und ohne die Timeouts in 2,7 statt 7,1 Minuten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQ57wQWZ4xKHcKmp26bzgr
2026-09-04 12:39:29 +02:00
fds2610
16256211af Merge pull request 'FinTS-Bibliothek auf 4.1.4 gehoben' (#60) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/60
2026-09-04 11:17:14 +02:00
fds2610-bot
b74cbe5416 FinTS-Bibliothek auf 4.1.4 gehoben
Der Fork steht jetzt auf dem Upstream-Stand vom 03.09.2026. Der Patch fuer
getDifferingPayeeName() ist upstream gemergt und entfaellt als eigener Commit;
im Fork bleiben das eingebaute psr/log und der VOP-Stepwise-Patch, der als
PR #584 offen und auf den neuen Stand rebased ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AQ57wQWZ4xKHcKmp26bzgr
2026-09-04 10:01:33 +02:00
fds2610
26ad7dea6e Merge pull request 'Fix #58: Auftragskonto über die Kontenzuordnung finden' (#59) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/59
2026-09-01 20:21:53 +02:00
fds2610-bot
e7c965c219 Fix #58: Auftragskonto über die Kontenzuordnung finden
Beim Senden suchte FinTsUeberweisung unter den Konten, die die Bank meldet,
nach der IBAN aus dem Konto selbst. Die ist in der Kontenverwaltung als
optional ausgewiesen und bleibt meist leer – dann scheiterte die Überweisung
an "Die Bank führt kein Konto mit der IBAN des Auftragskontos", obwohl der
Umsatzabruf für dasselbe Konto längst lief.

Maßgeblich ist jetzt dieselbe Zuordnung wie beim Abruf: die Zeile in
bank_konten, die dem Konto zugewiesen ist. Dort steht die IBAN, die die Bank
selbst gemeldet hat, und die Kontonummer für die Häuser, die keine IBAN
liefern. Die IBAN am Konto bleibt als Weg bestehen, ebenso der Fall, dass die
Bank nur ein einziges Konto führt.

passendesKonto() ist dafür public static geworden und nimmt den Zugang als
Parameter – so lässt sich die Wahl mit echten SEPAAccount-Objekten prüfen,
ohne eine Bank zu brauchen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013iURiWYZJQYVGQNXFFGyWu
2026-09-01 20:08:54 +02:00
fds2610
e425c76975 Merge pull request 'Fix #56: Namensabgleich vor der Überweisung' (#57) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/57
2026-09-01 20:07:44 +02:00
fds2610-bot
79f617025b Fix #56: Namensabgleich vor der Überweisung
Seit Oktober 2025 gleicht die Bank vor der Ausführung den Empfängernamen mit
dem Kontoinhaber ab (Verification of Payee). Der Finanzmanager kannte diese
Stufe nicht, die Überweisung blieb stehen.

FinTsUeberweisung wartet jetzt auf das Ergebnis, solange die Bank es braucht.
Stimmt der Name überein, wird selbst bestätigt und direkt zur TAN gegangen –
eine Rückfrage ohne Erkenntnis erspart das dem Nutzer. Weicht der Name ab, ist
er nur nahezu gleich oder konnte die Bank nicht prüfen, kommt die neue Maske
zahlungsverkehr/vop.php: Ergebnis in einem deutschen Satz, Aufklärungstext der
Bank als Klartext, Empfänger und IBAN aus dem Auftrag und – sofern die Bank ihn
nennt – der bei ihr hinterlegte Kontoinhaber.

Ohne Ausführungstermin steht jetzt das Platzhalterdatum 1999-01-01 in der
Nachricht. Mit dem heutigen Datum wurde daraus eine terminierte Überweisung
(HKCSE statt HKCCS), die die Bank mit "Die minimale Vorlaufzeit beträgt 1 Tage"
zurückwies.

Der FinTS-Fork steht auf v4.1.3 mit zwei Eingriffen: Die schrittweise Lieferung
des Prüfberichts wird erst abgelehnt, wenn sie wirklich eintritt, und der beim
Close Match gemeldete Kontoinhaber wird an die Anwendung durchgereicht. Beide
liegen zusätzlich auf eigenen Branches für PRs an das Upstream-Projekt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013iURiWYZJQYVGQNXFFGyWu
2026-09-01 19:58:12 +02:00
fds2610
8dc5afd8ba Merge pull request 'Fix #54: Überweisung im SEPA-Format der Bank' (#55) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/55
2026-09-01 19:17:36 +02:00
fds2610-bot
3444f8f6ec Fix #54: Überweisung im SEPA-Format der Bank
Die Nachricht wurde fest als pain.001.001.03 erzeugt. Banken, die nur das
ältere DK-Format pain.001.003.03 führen, weisen die Überweisung damit schon
beim Einreichen ab, noch vor der TAN.

FinTsUeberweisung liest die unterstützten Formate nach der Anmeldung aus dem
Segment HISPAS; SepaXml::schemaWaehlen() bestimmt daraus den Namensraum –
bevorzugt ISO, sonst DK. Für die Einzelüberweisung sind beide Fassungen im
Aufbau gleich, es genügt der andere Namensraum. Das DK-Schema liegt der
Testsuite bei, damit die Nachricht wirklich dagegen geprüft wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013iURiWYZJQYVGQNXFFGyWu
2026-09-01 18:22:04 +02:00
fds2610
2f524c72da Merge pull request 'Fix #51: Adressverwaltung in der Verwaltung, Typeahead im Zahlungsverkehr' (#53) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/53
2026-09-01 18:20:25 +02:00
fds2610-bot
85518ad850 Fix #51: Adressverwaltung in der Verwaltung, Typeahead im Zahlungsverkehr
Das Adressbuch bekommt in der Verwaltung eine eigene Kachel statt nur
über die Verträge erreichbar zu sein, denn es speist auch den
Zahlungsverkehr. Auf der Adressliste klappt zu jeder Adresse ein
<details>-Element ihre letzten Buchungen auf (Buchung::letzteFuerEmpfaenger,
kontenübergreifend nach dem exakten Empfängernamen – die Buchung führt
kein Fremdschlüsselfeld auf die Adresse).

Die Empfängerauswahl im Zahlungsverkehr-Formular ist jetzt ein Typeahead:
kombobox.js (bereits für die Kategorie im Kontoblatt im Einsatz) baut das
<select> in ein gefiltertes Eingabefeld um. Geprüft (PHP- und E2E-Tests),
dass "Empfänger ins Adressbuch übernehmen" beim Erfassen einer
Überweisung tatsächlich eine Adresse anlegt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 08:27:15 +02:00
fds2610
89e16d6da2 Merge pull request 'Fix #50: Zahlungsverkehr wählt die Bank automatisch zum Auftragskonto' (#52) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/52
2026-08-31 08:08:19 +02:00
fds2610-bot
da8e3784fa Fix #50: Zahlungsverkehr wählt die Bank automatisch zum Auftragskonto
Das Überweisungsformular fragt nur noch das Auftragskonto ab; die passende
Bankverbindung ermittelt Bankzugang::zugangJeKonto() aus der Kontenzuordnung.
Konten ohne konfigurierte Bank stehen in der Auswahl nicht mehr zur Verfügung.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 07:58:07 +02:00
fds2610
9022144c9e Merge pull request 'Fix #46: Reiter "Profil" zum Ändern des eigenen Passworts' (#47) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/47
2026-08-20 19:25:46 +02:00
fds2610-bot
606bbb3b35 Fix #46: Reiter 'Profil' zum Ändern des eigenen Passworts 2026-08-20 18:48:27 +02:00
fds2610
7e4ef4751f Merge pull request 'Fix #43: CONTRIBUTE.md und Setup-Skript für Mitwirkende' (#45) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/45
2026-08-19 20:30:47 +02:00
fds2610-bot
94e8057d73 Fix #43: CONTRIBUTE.md und Setup-Skript für Mitwirkende
CONTRIBUTE.md beschreibt Wege für Beiträge, gesuchte Unterstützung und die
drei bindenden Leitlinien (FOSS, Datensparsamkeit, Security) mit einem
Disclaimer, dass VIBE Coding ausdrücklich erlaubt ist. dev-setup.sh im
Repo-Root richtet Docker, Fork/Upstream-Checkout, lokale Container und
optional die E2E-Testinfrastruktur ein.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 20:28:10 +02:00
fds2610
f737db6182 Merge pull request 'Fix #41: Typeahead für Kategorien im Kontoblatt' (#44) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/44
2026-08-19 20:15:07 +02:00
fds2610-bot
088cfbfe66 Fix #41: Typeahead für Kategorien im Kontoblatt
Kategorie-Filter und Schnellzuordnung tragen jetzt data-kombobox: kombobox.js
baut das <select> beim Laden in ein Eingabefeld mit gefilterter, aufklappender
Liste um, ohne Verhalten oder Markup für vorhandenen Code (kontoblatt.js) zu
ändern. Die Klassen-Auswahl bleibt bewusst ein gewöhnliches <select> – ihre
Liste ist kurz.
2026-08-19 20:03:16 +02:00
fds2610
1c3c0de604 Merge pull request 'Fix #40: Kategorie im Kontoblatt ohne Neuladen speichern' (#42) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/42
2026-08-19 16:40:29 +02:00
fds2610-bot
a077e03bee Fix #40: Kategorie im Kontoblatt ohne Neuladen speichern
Das Ändern von Kategorie oder Klasse im Kontoblatt lud bisher die ganze
Seite neu, um die Zeile zu aktualisieren – dabei sprang der Bildschirm
nach ganz oben. kontoblatt.js schickt die Auswahl jetzt per fetch im
Hintergrund; Kategorie, Klasse und das Symbol der Bargeld-Abgleichspalte
aktualisieren sich an Ort und Stelle, die Bildlaufposition bleibt stehen.
Ohne JavaScript bleibt es bei der bisherigen Weiterleitung.
2026-08-19 14:57:09 +02:00
fds2610
18c1603dbd Merge pull request 'Fix #21: Bargeld-Tool auch bei Adresse mit /api/v1 erreichen' (#39) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/39
2026-08-19 08:42:14 +02:00
fds2610-bot
aeb8254840 Fix #21: Bargeld-Tool auch bei Adresse mit /api/v1 erreichen
Der Verbindungstest meldete „Das Bargeld-Tool kennt die Schnittstelle nicht
(HTTP 404)“, sobald die hinterlegte Adresse den Schnittstellenpfad schon
enthielt: Der Finanzmanager hängt ihn selbst an und fragte damit unter
/api/v1/api/v1/status an.

Die Adresse aus der Browserzeile zu kopieren ist der naheliegende Weg, und
der Pfad ist dort mit dabei. Ein abschließendes /api oder /api/v1 kürzt
BargeldTool::basisadresse() deshalb weg – beim Speichern und noch einmal im
Konstruktor, damit auch schon gespeicherte Adressen greifen. Ein
Unterverzeichnis davor bleibt erhalten, ein Hostname wie apianbieter.example
bleibt unangetastet.

Bereits gespeicherte Adressen räumt Migration 017 auf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 08:15:45 +02:00
fds2610
be61514093 Merge pull request 'Fix #21: Abgleich mit dem Bargeld-Tool' (#38) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/38
2026-08-19 07:24:22 +02:00
fds2610-bot
ddf0638693 Fix #21: Abgleich mit dem Bargeld-Tool
Beim Zuweisen einer Kategorie fragt der Finanzmanager beim Bargeld-Tool
(FSCash) nach, ob es zum Betrag dort schon eine Buchung gibt.

Eingerichtet wird das unter Verwaltung → Bargeld-Tool: Adresse,
Zugangsdaten (Passwort AES-verschlüsselt), Suchzeitraum und die Auswahl
der abzugleichenden Kategorien. Die Vormerkung steht als
`bargeld_abgleich` an der Kategorie selbst, nicht als Nummernliste in den
Einstellungen – so verschwindet sie mit der Kategorie.

Geprüft wird nur, was geprüft werden soll: Kategorie an der Buchung,
Kategorie vorgemerkt, Adresse konfiguriert. Fällt eines weg, verschwindet
der Status. Gesucht wird rückwärts ab dem Buchungsdatum, weil Bargeld
ausgegeben wird, bevor der Umsatz auf dem Konto ankommt.

Im Kontoblatt steht das Ergebnis zwischen Klasse und Betrag: grauer Kreis,
grüner Haken, rotes X, Ausrufezeichen. Das Ausrufezeichen behält die
Textfarbe des Farbschemas – der Fehler liegt beim Abruf, nicht bei der
Buchung. Ohne hinterlegte Adresse entfällt die Spalte.

Ein Fehlschlag ist ein Ergebnis, kein Abbruch: Die Kategorie wird auch
dann gespeichert, wenn das Bargeld-Tool schweigt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 07:06:20 +02:00
fds2610
e3d5e58900 Merge pull request 'Berichte: Tabellen so breit wie nötig, Zahlen rechtsbündig' (#37) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/37
2026-08-18 21:15:41 +02:00
fds2610-bot
a5e50f8529 Listen: Zahlenspalten überall rechtsbündig
Die Klasse .rechts wurde in Listen von der spezifischeren Grundregel
"table.liste th, table.liste td { text-align: left }" überstimmt – die
Ausrichtung war also überall wirkungslos, nicht nur in den Berichten. Die
Regel steht jetzt bei den Tabellen-Grundregeln und gilt für alle Listen:
Kontenübersicht, Kontoblatt, Wertpapiere, Depotbuchungen, Kategorien und
die Berichte. Die berichtseigene Sonderregel entfällt dadurch.

Budgetplaner und Splittabellen bringen ihre eigene Ausrichtung mit und
bleiben unberührt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 21:13:13 +02:00
fds2610-bot
6ca247a40d Berichte: Tabelle mittig statt links ausgerichtet
Linksbündig wirkte die schmale Tabelle verloren neben dem zentrierten
Berichtskopf. Sie steht jetzt mittig unter Überschrift und Zeitraumzeile;
die Zahlenspalten bleiben in sich rechtsbündig. Der E2E-Test prüft, dass
links und rechts gleich viel Luft bleibt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 21:04:19 +02:00
fds2610-bot
43cd73afb7 Berichte: Tabellen so breit wie nötig, Zahlen rechtsbündig
Berichtstabellen nehmen nur noch den Platz, den ihre Spalten brauchen, und
stehen links; erst bei mehr Inhalt wachsen sie bis zur vollen Breite. Im
Scrollrahmen .breittabelle bleibt es beim bisherigen Verhalten, damit die
zwölf Monatsspalten weiter waagerecht scrollen statt umzubrechen.

Dabei kam heraus, dass die Zahlenspalten gar nicht rechtsbündig standen:
.rechts und .betrag sind nur einfach spezifisch, das weiter oben stehende
"table.liste th, table.liste td { text-align: left }" gewann. Für Berichte
steht die Ausrichtung jetzt ausdrücklich, sodass die letzte Spalte ihre
Beträge an der eigenen Kante ausrichtet.

Nachgezogen: Der E2E-Test der eingeklappten Seitenleiste erwartete
toBeHidden() für die Beschriftungen, die aber mit Absicht nur per clip-path
aus dem Bild geschoben werden – für Playwright bleiben sie sichtbar. Geprüft
wird jetzt, dass sie keinen Platz mehr einnehmen und der Verweis seinen
zugänglichen Namen behält.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 21:00:32 +02:00
fds2610
b0675dc58b Merge pull request 'Seitenleiste: Marke mit Münzstapel, ein Klick schiebt sie auf Symbolbreite' (#36) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/36
2026-08-18 12:35:42 +02:00
fds2610-bot
280664b8a3 Seitenleiste: Marke mit Münzstapel, ein Klick schiebt sie auf Symbolbreite
Die Marke oben in der Seitenleiste trägt jetzt das Coinstack-Symbol aus den
Altdaten und den zweifarbigen Schriftzug Finanz|manager – wie die
sidebar-brand im Steuerkram. Sie ist zugleich der Schalter: Ein Klick schiebt
die Leiste von 232 px auf 64 px zusammen, ein Klick auf das Symbol klappt sie
wieder auf. Die Menüpunkte behalten dabei Ziel und Symbol.

Der Zustand steht in einem Cookie und nicht im localStorage: So rendert der
Server die Leiste schon in der richtigen Breite, statt sie bei jedem
Seitenwechsel kurz breit aufblitzen zu lassen. Die Beschriftungen wandern
eingeklappt per clip-path aus dem Bild statt per display:none – sonst
verlören die Verweise ihren Namen für Vorleseprogramme.

Nebenbei: Die Marke hieß bisher .marke, wie die kleine Statusmarke weiter
unten im Stilblatt, deren Regeln sie überschrieben. Sie heißt jetzt
.seitenleisten-marke.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 11:45:45 +02:00
fds2610
1d93ac4a20 Merge pull request 'Sammel-PR: PayPal-Bankverbindung und Bankleitzahlen-Verzeichnis' (#35) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/35
2026-08-18 08:57:40 +02:00
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
fds2610
ff022baf3a Merge pull request 'Test: Umbuchungen spiegeln sich zuverlässig' (#33) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/33
2026-08-18 06:54:16 +02:00
fds2610-bot
066879d61f Test: Umbuchungen spiegeln sich zuverlässig
Neuer Test 30. Er hält die zwei Zusagen des Datenmodells fest: Was ein
Gegenkonto trägt, steht im Kontoblatt dieses Gegenkontos – auf allen vier
Wegen, auf denen ein Gegenkonto an eine Buchung kommt – und wer die Buchung
löscht, löscht beide Sichten.

Dazu eine Invariantenprüfung über alle Daten des Mandanten an sieben Stellen
des Ablaufs. Vier absichtliche Eingriffe ins Modell lassen den Test
zuverlässig fehlschlagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 06:52:33 +02:00
fds2610
5072e9d5d8 Merge pull request 'Sammel-PR: Umsätze sammelweise löschen, Import/Export in QIF und CSV, Konto- und Buchungsformular zweispaltig' (#32) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/32
2026-08-17 23:48:26 +02:00
fds2610-bot
4e3230c888 Buchungsmaske nennt das Konto und passt auf einen Bildschirm
Neue Buchung und Buchung bearbeiten zeigen oben das Konto, in dem die
Buchung liegt. Die Maske steht zweispaltig, die Beschriftungen links
neben ihren Eingaben und die Erklärungen in deren Tooltip – damit endet
sie samt Splitzeilen und Knopfleiste oberhalb der Fensterhöhe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:36:47 +02:00
fds2610-bot
a22c33bb12 Kontoformular zweispaltig
Konto bearbeiten und Neues Konto zeigen ihre vierzehn Felder in zwei
Spalten, damit alles ohne vertikales Scrollen auf einen Bildschirm passt.

- Neue Formularvariante .formular.zweispaltig: Grid mit zwei Spalten, je
  Feld ein .feld aus Beschriftung, Eingabe und Hinweis. Überschriften,
  Knopfleiste und .feld.ganz laufen über beide Spalten, unter 720 px
  fällt das Formular auf eine Spalte zurück.
- Feldreihenfolge zeilenweise; Namen, Werte und Feld-IDs unverändert.
- E2E-Test: Kontoart steht rechts neben dem Namen, das Formular endet
  oberhalb der Fensterhöhe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:12:35 +02:00
fds2610-bot
2c86e8522b Import und Export in QIF und CSV, Housekeeping für Importdateien
Aus der Kachel QIF-Import wird Import/Export mit je einem Knopf für beide
Richtungen; davor steht die Wahl des Dateiformats (QIF oder CSV), die als
Dialog und ohne Skript als eigene Seite funktioniert.

- CsvBuchungsImport/CsvTabelle: Buchungen samt Splitzeilen, Spalten über die
  Kopfzeile, dieselbe Dublettenerkennung und der Trockenlauf wie beim QIF.
- BuchungsExport/ExportController: Filter nach Zeitraum, Konto, Kategorie und
  Klasse; die Datei entsteht im Speicher, ein Exportverzeichnis gibt es nicht.
- Housekeeping: Hochgeladene Importdateien und data/tmp werden nach der
  eingestellten Frist gelöscht (Vorgabe 14 Tage, 0 schaltet ab).

Migration 013, Test 29 sowie E2E-Spec importexport.spec.js.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:01:30 +02:00
fds2610-bot
9839bd5b16 Banking: Umsätze sammelweise löschen
Die Umsatzlisten haben jetzt dieselbe Mehrfachauswahl wie ein Kontoblatt:
ein Ankreuzfeld vor jedem Umsatz, eines in der Titelleiste für alle
angezeigten und darüber der Knopf „Auswahl löschen“. Er steht in jedem
Reiter – offen, übernommen und verworfen –, nennt die Anzahl der Auswahl
und bleibt ohne Auswahl gesperrt. Bisher ließ sich ein abgerufener Umsatz
nur übernehmen oder verwerfen; wegräumen ging gar nicht.

Gelöscht wird allein die abgerufene Zeile. Eine daraus entstandene
Buchung gehört ins Kontoblatt und bleibt dort stehen – wer sie loswerden
will, löscht sie dort, und dann kehrt ihr Umsatz ohnehin in die
Vorschlagsliste zurück. Mit dem Umsatz geht aber sein Fingerabdruck: Was
im nächsten Abrufzeitraum liegt, kommt danach wieder herein, bei einem
verworfenen Umsatz also erneut als offen.

- Neue Route POST /banking/umsaetze/loeschen auf
  Bankumsatz::mehrereLoeschen(); der Status hängt am Formularziel, sodass
  der Weg in denselben Reiter zurückführt. Ohne JavaScript weist der
  Controller eine leere Auswahl ab.
- Die Liste ist keine Tabelle, sondern eine Folge von Karten. Die
  Kopfzeile, die eine Tabelle von selbst hätte, gibt es deshalb neu als
  .listenkopf; die Mechanik dahinter (.alle-waehlen mit data-waehlt) ist
  unverändert die des Kontoblatts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 22:24:14 +02:00
fds2610
377bb12e24 Merge pull request 'Kontoblatt: Klasse direkt auswählen, Zeilen einheitlich zweizeilig' (#31) from fds2610-bot/Finanzmanager:main into main
Reviewed-on: https://codeberg.org/fds2610/Finanzmanager/pulls/31
2026-08-17 22:06:46 +02:00