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)