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>
132 lines
4.4 KiB
PHP
132 lines
4.4 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Finanzmanager\Models\Bankzugang;
|
||
use Finanzmanager\Models\Konto;
|
||
use Finanzmanager\Models\Zahlungsauftrag;
|
||
|
||
/**
|
||
* Automatische Bankauswahl im Zahlungsverkehr.
|
||
*
|
||
* Beim Erfassen einer Überweisung wählt der Nutzer nur noch das Auftragskonto;
|
||
* die Bankverbindung ergibt sich aus `Bankzugang::zugangJeKonto()`. Konten ohne
|
||
* konfigurierte Bank tauchen dort nicht auf und dürfen deshalb auch nicht als
|
||
* Auftragskonto zur Wahl stehen.
|
||
*/
|
||
class UeberweisungBankZuordnungTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 37: Überweisung – automatische Bankzuordnung';
|
||
|
||
private int $giro = 0;
|
||
private int $ohneBank = 0;
|
||
private int $zugang = 0;
|
||
|
||
public function run(): void
|
||
{
|
||
$this->mandantAnlegen();
|
||
$this->stammdaten();
|
||
|
||
$this->kontoOhneBankStehtNichtInDerZuordnung();
|
||
$this->zugeordnetesKontoStehtInDerZuordnung();
|
||
$this->einDeaktivierterZugangFaelltHeraus();
|
||
$this->derAuftragUebernimmtDieBankAutomatisch();
|
||
}
|
||
|
||
private function stammdaten(): void
|
||
{
|
||
$this->giro = Konto::anlegen([
|
||
'name' => 'Zahlungsverkehr-Giro', 'kontoart' => 'bank', 'anfangssaldo' => 0, 'aktiv' => 1,
|
||
]);
|
||
$this->ohneBank = Konto::anlegen([
|
||
'name' => 'Zahlungsverkehr-Sparbuch', 'kontoart' => 'sparkonto', 'anfangssaldo' => 0, 'aktiv' => 1,
|
||
]);
|
||
|
||
$this->zugang = Bankzugang::anlegen([
|
||
'name' => 'Zahlungsverkehr-Bank',
|
||
'bankname' => 'Zahlungsverkehr-Bank AG',
|
||
'blz' => '12030000',
|
||
'fints_url' => 'https://banking.example.org/fints',
|
||
'benutzerkennung' => 'testkunde',
|
||
'pin' => 'geheim1234',
|
||
'abrufzeitraum' => 'letzter_abruf',
|
||
'aktiv' => 1,
|
||
]);
|
||
}
|
||
|
||
private function kontoOhneBankStehtNichtInDerZuordnung(): void
|
||
{
|
||
$this->assert(
|
||
!array_key_exists($this->ohneBank, Bankzugang::zugangJeKonto()),
|
||
'Ein Konto ohne Bankverbindung fehlt in der Zuordnung'
|
||
);
|
||
}
|
||
|
||
private function zugeordnetesKontoStehtInDerZuordnung(): void
|
||
{
|
||
$bankkonto = Bankzugang::findeOderLegeKontoAn(
|
||
$this->zugang,
|
||
'DE29120300000000202052',
|
||
'202052',
|
||
'Girokonto'
|
||
);
|
||
Bankzugang::ordneKontoZu((int)$bankkonto['id'], $this->giro);
|
||
|
||
$this->assertEquals(
|
||
$this->zugang,
|
||
Bankzugang::zugangJeKonto()[$this->giro] ?? null,
|
||
'Das zugeordnete Konto verweist auf seine Bank'
|
||
);
|
||
}
|
||
|
||
private function einDeaktivierterZugangFaelltHeraus(): void
|
||
{
|
||
Bankzugang::speichern($this->zugang, [
|
||
'name' => 'Zahlungsverkehr-Bank',
|
||
'bankname' => 'Zahlungsverkehr-Bank AG',
|
||
'blz' => '12030000',
|
||
'fints_url' => 'https://banking.example.org/fints',
|
||
'benutzerkennung' => 'testkunde',
|
||
'abrufzeitraum' => 'letzter_abruf',
|
||
'aktiv' => 0,
|
||
]);
|
||
|
||
$this->assert(
|
||
!array_key_exists($this->giro, Bankzugang::zugangJeKonto()),
|
||
'Ein deaktivierter Zugang taugt nicht als automatische Auswahl'
|
||
);
|
||
|
||
Bankzugang::speichern($this->zugang, [
|
||
'name' => 'Zahlungsverkehr-Bank',
|
||
'bankname' => 'Zahlungsverkehr-Bank AG',
|
||
'blz' => '12030000',
|
||
'fints_url' => 'https://banking.example.org/fints',
|
||
'benutzerkennung' => 'testkunde',
|
||
'abrufzeitraum' => 'letzter_abruf',
|
||
'aktiv' => 1,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* Genau das, was der Controller beim Anlegen tut: die Bank kommt aus der
|
||
* Zuordnung, nicht aus einer eigenen Formularauswahl.
|
||
*/
|
||
private function derAuftragUebernimmtDieBankAutomatisch(): void
|
||
{
|
||
$zugangId = Bankzugang::zugangJeKonto()[$this->giro] ?? null;
|
||
|
||
$auftragId = Zahlungsauftrag::anlegen([
|
||
'konto_id' => $this->giro,
|
||
'zugang_id' => $zugangId,
|
||
'empfaenger' => 'Beispielempfänger',
|
||
'iban' => 'DE02120300000000202051',
|
||
'betrag' => 42.50,
|
||
]);
|
||
|
||
$this->assertEquals(
|
||
$this->zugang,
|
||
(int)Zahlungsauftrag::find($auftragId)['zugang_id'],
|
||
'Der Auftrag trägt die automatisch ermittelte Bank'
|
||
);
|
||
}
|
||
}
|