From 1fe8ba8cf94de1a5a5bb4b46411b318d884394b9 Mon Sep 17 00:00:00 2001 From: philipp lang <philipp@aweos.de> Date: Sat, 29 Mar 2025 02:34:54 +0100 Subject: [PATCH] Add: Store Member with empty kontoverbindung --- src/Data/BankAccount.php | 28 +++++++++++- src/Data/Member.php | 1 + tests/Factories/BankAccountRequestFactory.php | 27 ++++++++++++ tests/Factories/MemberRequestFactory.php | 5 +++ tests/Unit/Api/PutMemberTest.php | 44 +++++++++++-------- 5 files changed, 85 insertions(+), 20 deletions(-) create mode 100644 tests/Factories/BankAccountRequestFactory.php diff --git a/src/Data/BankAccount.php b/src/Data/BankAccount.php index 9d5d3e6..0539dc2 100644 --- a/src/Data/BankAccount.php +++ b/src/Data/BankAccount.php @@ -4,14 +4,15 @@ namespace Zoomyboy\LaravelNami\Data; use Spatie\LaravelData\Data; use Spatie\LaravelData\Attributes\MapInputName; +use Zoomyboy\LaravelNami\Tests\Factories\BankAccountRequestFactory; class BankAccount extends Data { public function __construct( - public int $id, + public ?int $id, #[MapInputName('mitgliedsNummer')] - public int $memberId, + public ?int $memberId, #[MapInputName('bankleitzahl')] public ?string $blz = null, @@ -27,4 +28,27 @@ class BankAccount extends Data public ?int $conditionId = null, ) { } + + public static function toFactory(): BankAccountRequestFactory + { + return BankAccountRequestFactory::new(); + } + + /** + * @return array<string, mixed> + */ + public function toNami(): string + { + return json_encode([ + 'id' => $this->id ?: '', + 'zahlungsKonditionId' => $this->conditionId, + 'mitgliedsNummer' => $this->memberId, + 'institut' => $this->bankName ?: '', + 'kontoinhaber' => $this->person ?: '', + 'kontonummer' => $this->accountNumber ?: '', + 'bankleitzahl' => $this->blz ?: '', + 'iban' => $this->iban ?: '', + 'bic' => $this->bic ?: '', + ]); + } } diff --git a/src/Data/Member.php b/src/Data/Member.php index 1faf6ed..56a4dd3 100644 --- a/src/Data/Member.php +++ b/src/Data/Member.php @@ -159,6 +159,7 @@ class Member extends Data 'nameZusatz' => $this->furtherAddress, 'version' => $this->version, 'eintrittsdatum' => $this->joinedAt->format('Y-m-d 00:00:00'), + 'kontoverbindung' => $this->bankAccount->toNami(), ]; } diff --git a/tests/Factories/BankAccountRequestFactory.php b/tests/Factories/BankAccountRequestFactory.php new file mode 100644 index 0000000..948063c --- /dev/null +++ b/tests/Factories/BankAccountRequestFactory.php @@ -0,0 +1,27 @@ +<?php + +namespace Zoomyboy\LaravelNami\Tests\Factories; + +use Worksome\RequestFactories\RequestFactory; + +class BankAccountRequestFactory extends RequestFactory +{ + /** + * @return array<string, mixed> + */ + public function definition(): array + { + return [ + 'id' => $this->faker->numberBetween(500, 1000), + 'memberId' => $this->faker->numberBetween(500, 1000), + ]; + } + + public function empty(): self + { + return $this->state([ + 'id' => null, + 'memberId' => null, + ]); + } +} diff --git a/tests/Factories/MemberRequestFactory.php b/tests/Factories/MemberRequestFactory.php index 1432665..4f7d852 100644 --- a/tests/Factories/MemberRequestFactory.php +++ b/tests/Factories/MemberRequestFactory.php @@ -35,6 +35,11 @@ class MemberRequestFactory extends RequestFactory ]; } + public function withBankAccount(BankAccountRequestFactory $bankAccount): self + { + return $this->state(['kontoverbindung' => $bankAccount->create()]); + } + public function inNami(int $groupId, int $namiId): self { return $this->state([ diff --git a/tests/Unit/Api/PutMemberTest.php b/tests/Unit/Api/PutMemberTest.php index 69218c4..bfc587e 100644 --- a/tests/Unit/Api/PutMemberTest.php +++ b/tests/Unit/Api/PutMemberTest.php @@ -2,6 +2,7 @@ namespace Zoomyboy\LaravelNami\Tests\Unit\Api; +use Zoomyboy\LaravelNami\Data\BankAccount; use Zoomyboy\LaravelNami\Data\Member; use Zoomyboy\LaravelNami\Fakes\MemberFake; use Zoomyboy\LaravelNami\Tests\TestCase; @@ -74,6 +75,31 @@ class PutMemberTest extends TestCase ]); } + public function testItPutsEmptyKontoverbindung(): void + { + app(MemberFake::class)->stores(103, 16); + $member = Member::toFactory() + ->withBankAccount(BankAccount::toFactory()->empty()) + ->toMember(['groupId' => 103]); + $response = $this->login()->putMember($member, 78, 79); + + $this->assertEquals(16, $response); + + app(MemberFake::class)->assertStored(103, [ + 'kontoverbindung' => json_encode([ + 'id' => '', + 'zahlungsKonditionId' => null, + 'mitgliedsNummer' => null, + 'institut' => '', + 'kontoinhaber' => '', + 'kontonummer' => '', + 'bankleitzahl' => '', + 'iban' => '', + 'bic' => '', + ]), + ]); + } + public function testUpdateAMemberWithForeignAttributes(): void { app(MemberFake::class) @@ -137,24 +163,6 @@ class PutMemberTest extends TestCase ]); } - public function testItMergesKontoverbindung(): void - { - app(MemberFake::class) - ->updatesSuccessfully(103, 16) - ->shows(103, 16, [ - 'foreign' => 'fff', - 'kontoverbindung' => ['a' => 'b'], - ]); - $response = $this->login()->putMember(Member::toFactory()->inNami(103, 16)->toMember()); - - $this->assertEquals(16, $response); - - app(MemberFake::class)->assertUpdated(103, 16, [ - 'kontoverbindung' => '{"a":"b"}', - 'foreign' => 'fff', - ]); - } - public function testUpdateToDefaultGenderIdAndRegionIdIfTheyAreNull(): void { app(MemberFake::class)