From 85518ad85072c70a242b87c698f6a0c0867f2689 Mon Sep 17 00:00:00 2001 From: fds2610-bot Date: Mon, 31 Aug 2026 08:27:15 +0200 Subject: [PATCH] Fix #51: Adressverwaltung in der Verwaltung, Typeahead im Zahlungsverkehr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
-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 ` 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 diff --git a/docs/nebenmodule.md b/docs/nebenmodule.md index 4d1b2b4..3793d04 100644 --- a/docs/nebenmodule.md +++ b/docs/nebenmodule.md @@ -62,6 +62,24 @@ Das Adressbuch speist die Empfängerauswahl im Zahlungsverkehr. **IBANs werden g Gerechnet wird stückweise mit `%` statt mit `bcmod`: Die BC-Erweiterung ist keine Standardausstattung, und ein Modulo über sieben Ziffern lange Blöcke kommt ohne sie aus. +**Adressverwaltung.** Eine eigene Kachel in der Verwaltung führt zur Adressliste +(`/vertraege/adressen`, weiter über `VertraegeController` gepflegt) – neben, nicht nur +innerhalb der Verträge-Kachel: Das Adressbuch bedient auch den Zahlungsverkehr, der mit +Verträgen nichts zu tun hat. Zu jeder Adresse klappt ein `
`-Element ihre letzten +Buchungen auf, kontenübergreifend nach dem exakten Empfängernamen gesucht +(`Buchung::letzteFuerEmpfaenger()`) – die Buchung führt kein Fremdschlüsselfeld auf die +Adresse, nur den Freitext-Empfänger. + +**Typeahead im Zahlungsverkehr.** Die Empfängerauswahl (` + ein + sichtbares Eingabefeld ohne eigene id, das aria-label trägt die + Beschriftung für die Vorleser weiter. */ ?> + + #', + $html + ), + 'Die Adressauswahl ist als Kombobox (Typeahead) markiert' + ); + $this->assert(str_contains($html, '/static/kombobox.js'), 'kombobox.js wird eingebunden'); + } + + /** @param list> $adressen */ + private function adressenHtml(array $adressen): string + { + return $this->rendere('vertraege/adressen.php', [ + 'adressen' => $adressen, + 'suche' => '', + ]); + } + + private function zahlungsverkehrFormularHtml(): string + { + return $this->rendere('zahlungsverkehr/formular.php', [ + 'auftrag' => null, + 'konten' => [], + 'adressen' => Adresse::alle(), + 'kategorien' => [], + 'klassen' => [], + ]); + } + + /** @param array $daten */ + private function rendere(string $view, array $daten): string + { + $daten += ['titel' => 'Test', 'flash' => [], 'benutzer' => null, 'csrfToken' => 'x', 'aktuellerPfad' => '/']; + + extract($daten, EXTR_SKIP); + + ob_start(); + include dirname(__DIR__) . '/src/Views/' . $view; + return (string)ob_get_clean(); + } +} diff --git a/tests/e2e/specs/module.spec.js b/tests/e2e/specs/module.spec.js index bc4f1b3..87822a9 100644 --- a/tests/e2e/specs/module.spec.js +++ b/tests/e2e/specs/module.spec.js @@ -309,4 +309,42 @@ test.describe('Module der Phasen 4 bis 7', () => { // werden, bevor eine eingerichtet ist. Geprüft wird sie erst beim Senden. await expect(page.locator('.meldung-fehler')).toContainText('IBAN') }) + + test('Eine Überweisung übernimmt den Empfänger auf Wunsch ins Adressbuch', async ({ page }) => { + const empfaenger = `E2E-Adressbuch ${Date.now()}` + + await page.goto('/zahlungsverkehr/neu') + await page.fill('#empfaenger', empfaenger) + await page.fill('#iban', 'DE02120300000000202051') + await page.fill('#betrag', '12,34') + await page.check('input[name="adresse_merken"]') + await page.click('button:has-text("Erfassen")') + + await expect(page.locator('.meldung-erfolg')).toContainText('erfasst') + + // Die Adresse landet wirklich im Adressbuch – nicht nur der Auftrag. + await page.goto('/vertraege/adressen') + await expect(page.locator('table.liste')).toContainText(empfaenger) + }) + + test('Die Empfängerauswahl im Zahlungsverkehr ist ein Typeahead aus dem Adressbuch', async ({ page }) => { + const empfaenger = `E2E-Typeahead ${Date.now()}` + + // Erst eine Adresse anlegen, damit die Auswahl etwas zu bieten hat. + await page.goto('/vertraege/adressen') + await page.fill('#name', empfaenger) + await page.fill('#iban', 'DE02120300000000202051') + await page.click('button:has-text("Adresse anlegen")') + await expect(page.locator('.meldung-erfolg')).toContainText('angelegt') + + await page.goto('/zahlungsverkehr/neu') + + // kombobox.js ersetzt das