diff --git a/Tests/Unit/Action/GetStatementOfAccountTest.php b/Tests/Unit/Action/GetStatementOfAccountTest.php new file mode 100644 index 00000000..fcbcf17f --- /dev/null +++ b/Tests/Unit/Action/GetStatementOfAccountTest.php @@ -0,0 +1,163 @@ +expectException(\InvalidArgumentException::class); + GetStatementOfAccount::create( + self::account(), + new \DateTimeImmutable('2026-07-19'), + new \DateTimeImmutable('2026-04-20') + ); + } + + public function testCreateRequestBuildsHkkazV5FromDateTimeInterface() + { + $action = GetStatementOfAccount::create( + self::account(), + new \DateTimeImmutable('2026-04-20'), + new \DateTimeImmutable('2026-07-19'), + true + ); + + $requestSegments = $action->getNextRequest(self::createBpd(self::createHikazsSegment(5, true)), null); + + $this->assertCount(1, $requestSegments); + /** @var HKKAZv5 $request */ + $request = $requestSegments[0]; + self::assertInstanceOf(HKKAZv5::class, $request); + self::assertTrue($request->alleKonten); + self::assertSame('20260420', $request->vonDatum); + self::assertSame('20260719', $request->bisDatum); + self::assertSame('5407324931', $request->kontoverbindungAuftraggeber->kontonummer); + self::assertSame('50010517', $request->kontoverbindungAuftraggeber->kik->kreditinstitutscode); + } + + public function testCreateRequestBuildsHkkazV7FromDateTimeInterface() + { + $action = GetStatementOfAccount::create( + self::account(), + new \DateTimeImmutable('2026-04-20'), + new \DateTimeImmutable('2026-07-19'), + true + ); + + $bpd = self::createBpd( + self::createHikazsSegment(7, true), + self::createHispasSegment(true) + ); + $requestSegments = $action->getNextRequest($bpd, null); + + self::assertCount(1, $requestSegments); + /** @var HKKAZv7 $request */ + $request = $requestSegments[0]; + self::assertInstanceOf(HKKAZv7::class, $request); + self::assertTrue($request->alleKonten); + self::assertSame('20260420', $request->vonDatum); + self::assertSame('20260719', $request->bisDatum); + self::assertSame('DE44500105175407324931', $request->kontoverbindungInternational->iban); + self::assertSame('INGDDEFFXXX', $request->kontoverbindungInternational->bic); + self::assertSame('5407324931', $request->kontoverbindungInternational->kontonummer); + } + + public function testCreateRequestRejectsAllAccountsWhenNotSupportedByBank() + { + $action = GetStatementOfAccount::create(self::account(), null, null, true); + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('allAccounts=true'); + $action->getNextRequest(self::createBpd(self::createHikazsSegment(6, false)), null); + } + + private static function account(): SEPAAccount + { + return (new SEPAAccount()) + ->setIban('DE44500105175407324931') + ->setBic('INGDDEFFXXX') + ->setAccountNumber('5407324931') + ->setBlz('50010517'); + } + + private static function parameterKontoumsaetze(bool $allAccountsAllowed): ParameterKontoumsaetzeV2 + { + $parameter = new ParameterKontoumsaetzeV2(); + $parameter->speicherzeitraum = 90; + $parameter->eingabeAnzahlEintraegeErlaubt = false; + $parameter->alleKontenErlaubt = $allAccountsAllowed; + return $parameter; + } + + private static function createHikazsSegment(int $version, bool $allAccountsAllowed): HIKAZSv5|HIKAZSv6|HIKAZSv7 + { + switch ($version) { + case 5: + $segment = HIKAZSv5::createEmpty(); + break; + case 6: + $segment = HIKAZSv6::createEmpty(); + break; + case 7: + $segment = HIKAZSv7::createEmpty(); + break; + default: + throw new \InvalidArgumentException("Unsupported test HIKAZS version $version"); + } + + $segment->maximaleAnzahlAuftraege = 1; + $segment->anzahlSignaturenMindestens = 1; + if (!$segment instanceof HIKAZSv5) { + $segment->sicherheitsklasse = 0; + } + $segment->parameter = self::parameterKontoumsaetze($allAccountsAllowed); + return $segment; + } + + private static function createHispasSegment(bool $nationalAccountAllowed): HISPASv1 + { + $parameter = new ParameterSepaKontoverbindungAnfordernV1(); + $parameter->einzelkontenabrufErlaubt = true; + $parameter->nationaleKontoverbindungErlaubt = $nationalAccountAllowed; + $parameter->strukturierterVerwendungszweckErlaubt = false; + $parameter->unterstuetzteSepaDatenformate = ['urn:iso:std:iso:20022:tech:xsd:pain.001.001.03']; + + $segment = HISPASv1::createEmpty(); + $segment->maximaleAnzahlAuftraege = 1; + $segment->anzahlSignaturenMindestens = 1; + $segment->sicherheitsklasse = 0; + $segment->parameter = $parameter; + return $segment; + } + + private static function createBpd(BaseSegment $hikazs, ?BaseSegment $hispas = null): BPD + { + $bpd = new class extends BPD { + public function getBankName() + { + return 'Testbank'; + } + }; + + $bpd->parameters['HIKAZS'][$hikazs->getVersion()] = $hikazs; + if ($hispas !== null) { + $bpd->parameters['HISPAS'][$hispas->getVersion()] = $hispas; + } + + return $bpd; + } +} diff --git a/src/Segment/CAZ/HKCAZv1.php b/src/Segment/CAZ/HKCAZv1.php index ecaabf2b..f2001aac 100644 --- a/src/Segment/CAZ/HKCAZv1.php +++ b/src/Segment/CAZ/HKCAZv1.php @@ -28,7 +28,7 @@ class HKCAZv1 extends BaseSegment implements Paginateable public ?string $aufsetzpunkt = null; public static function create(\Fhp\Segment\Common\Kti $kti, UnterstuetzteCamtMessages $unterstuetzteCamtMessages, - bool $alleKonten, ?\DateTime $vonDatum, ?\DateTime $bisDatum, ?string $aufsetzpunkt = null): HKCAZv1 + bool $alleKonten, ?\DateTimeInterface $vonDatum, ?\DateTimeInterface $bisDatum, ?string $aufsetzpunkt = null): HKCAZv1 { $result = HKCAZv1::createEmpty(); $result->kontoverbindungInternational = $kti; diff --git a/src/Segment/KAZ/HKKAZv4.php b/src/Segment/KAZ/HKKAZv4.php index 9b612b80..7b01bd28 100644 --- a/src/Segment/KAZ/HKKAZv4.php +++ b/src/Segment/KAZ/HKKAZv4.php @@ -26,7 +26,7 @@ class HKKAZv4 extends BaseSegment implements Paginateable /** Max length: 35 */ public ?string $aufsetzpunkt = null; - public static function create(\Fhp\Segment\Common\Kto $kto, ?\DateTime $vonDatum, ?\DateTime $bisDatum, ?string $aufsetzpunkt = null): HKKAZv4 + public static function create(\Fhp\Segment\Common\Kto $kto, ?\DateTimeInterface $vonDatum, ?\DateTimeInterface $bisDatum, ?string $aufsetzpunkt = null): HKKAZv4 { $result = HKKAZv4::createEmpty(); $result->kontoverbindungAuftraggeber = $kto; diff --git a/src/Segment/KAZ/HKKAZv5.php b/src/Segment/KAZ/HKKAZv5.php index 8360c23e..dae9e536 100644 --- a/src/Segment/KAZ/HKKAZv5.php +++ b/src/Segment/KAZ/HKKAZv5.php @@ -27,7 +27,7 @@ class HKKAZv5 extends BaseSegment implements Paginateable /** Max length: 35 */ public ?string $aufsetzpunkt = null; - public static function create(\Fhp\Segment\Common\KtvV3 $ktv, bool $alleKonten, ?\DateTime $vonDatum, ?\DateTime $bisDatum, ?string $aufsetzpunkt = null): HKKAZv5 + public static function create(\Fhp\Segment\Common\KtvV3 $ktv, bool $alleKonten, ?\DateTimeInterface $vonDatum, ?\DateTimeInterface $bisDatum, ?string $aufsetzpunkt = null): HKKAZv5 { $result = HKKAZv5::createEmpty(); $result->kontoverbindungAuftraggeber = $ktv; diff --git a/src/Segment/KAZ/HKKAZv6.php b/src/Segment/KAZ/HKKAZv6.php index d84f6af4..84af1679 100644 --- a/src/Segment/KAZ/HKKAZv6.php +++ b/src/Segment/KAZ/HKKAZv6.php @@ -26,7 +26,7 @@ class HKKAZv6 extends BaseSegment implements Paginateable /** Max length: 35 */ public ?string $aufsetzpunkt = null; - public static function create(\Fhp\Segment\Common\KtvV3 $ktv, bool $alleKonten, ?\DateTime $vonDatum, ?\DateTime $bisDatum, ?string $aufsetzpunkt = null): HKKAZv6 + public static function create(\Fhp\Segment\Common\KtvV3 $ktv, bool $alleKonten, ?\DateTimeInterface $vonDatum, ?\DateTimeInterface $bisDatum, ?string $aufsetzpunkt = null): HKKAZv6 { $result = HKKAZv6::createEmpty(); $result->kontoverbindungAuftraggeber = $ktv; diff --git a/src/Segment/KAZ/HKKAZv7.php b/src/Segment/KAZ/HKKAZv7.php index 23d62831..134c6976 100644 --- a/src/Segment/KAZ/HKKAZv7.php +++ b/src/Segment/KAZ/HKKAZv7.php @@ -26,7 +26,7 @@ class HKKAZv7 extends BaseSegment implements Paginateable /** Max length: 35 */ public ?string $aufsetzpunkt = null; - public static function create(\Fhp\Segment\Common\Kti $kti, bool $alleKonten, ?\DateTime $vonDatum, ?\DateTime $bisDatum, ?string $aufsetzpunkt = null): HKKAZv7 + public static function create(\Fhp\Segment\Common\Kti $kti, bool $alleKonten, ?\DateTimeInterface $vonDatum, ?\DateTimeInterface $bisDatum, ?string $aufsetzpunkt = null): HKKAZv7 { $result = HKKAZv7::createEmpty(); $result->kontoverbindungInternational = $kti;