diff --git a/app/Member/Actions/NamiPutMemberAction.php b/app/Member/Actions/NamiPutMemberAction.php index d0be6154..2c843cb8 100644 --- a/app/Member/Actions/NamiPutMemberAction.php +++ b/app/Member/Actions/NamiPutMemberAction.php @@ -48,7 +48,16 @@ class NamiPutMemberAction 'id' => $member->nami_id, 'version' => $member->version, 'keepdata' => $member->keepdata, - 'bankAccount' => BankAccount::from([]), + 'bankAccount' => BankAccount::from([ + 'bankName' => $member->bankAccount->bank_name, + 'id' => $member->bankAccount->nami_id, + 'memberId' => $member->mitgliedsnr, + 'iban' => $member->bankAccount->iban, + 'bic' => $member->bankAccount->bic, + 'blz' => $member->bankAccount->blz, + 'person' => $member->bankAccount->person, + 'accountNumber' => $member->bankAccount->account_number, + ]), ]); $response = $api->putMember($namiMember, $activity ? $activity->nami_id : null, $subactivity ? $subactivity->nami_id : null); Member::withoutEvents(function () use ($response, $member) { diff --git a/database/factories/Member/BankAccountFactory.php b/database/factories/Member/BankAccountFactory.php index a9dc6ae7..da46829a 100644 --- a/database/factories/Member/BankAccountFactory.php +++ b/database/factories/Member/BankAccountFactory.php @@ -27,7 +27,17 @@ class BankAccountFactory extends Factory public function definition(): array { return [ - // + 'bank_name' => $this->faker->name(), + 'bic' => $this->faker->swiftBicNumber(), + 'iban' => $this->faker->iban('DE'), + 'blz' => $this->faker->name(), + 'person' => $this->faker->name(), + 'account_number' => $this->faker->name(), ]; } + + public function inNami(int $namiId): self + { + return $this->state(['nami_id' => $namiId]); + } } diff --git a/database/factories/Member/MemberFactory.php b/database/factories/Member/MemberFactory.php index a5d06419..4b7054c7 100644 --- a/database/factories/Member/MemberFactory.php +++ b/database/factories/Member/MemberFactory.php @@ -93,6 +93,13 @@ class MemberFactory extends Factory return $this->state(['nami_id' => $namiId]); } + public function withBankAccount(BankAccountFactory $factory): self + { + return $this->afterCreating(function ($member) use ($factory) { + $member->bankAccount->update($factory->make()->toArray()); + }); + } + public function sameFamilyAs(Member $member): self { return $this->state([ diff --git a/tests/Feature/Member/NamiPutMemberActionTest.php b/tests/Feature/Member/NamiPutMemberActionTest.php index bd1d642b..ebb80aa3 100644 --- a/tests/Feature/Member/NamiPutMemberActionTest.php +++ b/tests/Feature/Member/NamiPutMemberActionTest.php @@ -7,11 +7,11 @@ use App\Actions\PullMembershipsAction; use App\Activity; use App\Confession; use App\Country; -use App\Fee; +use App\Gender; use App\Group; use App\Member\Actions\NamiPutMemberAction; +use App\Member\BankAccount; use App\Member\Member; -use App\Nationality; use App\Payment\Subscription; use App\Region; use App\Subactivity; @@ -20,52 +20,130 @@ use Phake; use Zoomyboy\LaravelNami\Fakes\MemberFake; uses(DatabaseTransactions::class); +covers(NamiPutMemberAction::class); -it('testItPutsAMember', function (array $memberAttributes, array $storedAttributes) { - Fee::factory()->create(); +beforeEach(function () { $this->stubIo(PullMemberAction::class, fn ($mock) => $mock); $this->stubIo(PullMembershipsAction::class, fn ($mock) => $mock); + Group::factory()->inNami(55)->create(); $this->withoutExceptionHandling()->login()->loginNami(); - $country = Country::factory()->create(); - $region = Region::factory()->create(); - $nationality = Nationality::factory()->inNami(565)->create(); - $subscription = Subscription::factory()->forFee()->create(); - $group = Group::factory()->inNami(55)->create(); - $confession = Confession::factory()->inNami(567)->create(['is_null' => true]); app(MemberFake::class)->stores(55, 993); - $activity = Activity::factory()->hasAttached(Subactivity::factory()->name('Biber')->inNami(55))->name('Leiter')->inNami(6)->create(); - $subactivity = $activity->subactivities->first(); + Confession::factory()->inNami(567)->create(['is_null' => true]); + $activity = Activity::factory()->inNami(6)->create(); + Subactivity::factory()->hasAttached($activity)->inNami(55)->create(); +}); - $member = Member::factory() - ->for($country) - ->for($subscription) - ->for($region) - ->for($nationality) - ->for($group) - ->emailBillKind() - ->create($memberAttributes); +it('pulls member and memberships befre pushing', function () { + $member = Member::factory()->defaults()->create(); - NamiPutMemberAction::run($member, $activity, $subactivity); + NamiPutMemberAction::run($member, Activity::first(), Subactivity::first()); - app(MemberFake::class)->assertStored(55, [ - 'ersteTaetigkeitId' => 6, - 'ersteUntergliederungId' => 55, - 'konfessionId' => 567, - ...$storedAttributes, - ]); - $this->assertDatabaseHas('members', [ - 'nami_id' => 993, - ]); Phake::verify(app(PullMemberAction::class))->handle(55, 993); Phake::verify(app(PullMembershipsAction::class))->handle($member); +}); + +it('sets nami id of member', function () { + $member = Member::factory()->defaults()->create(); + + NamiPutMemberAction::run($member, Activity::first(), Subactivity::first()); + + $this->assertDatabaseHas('members', ['nami_id' => 993]); +}); + +it('stores member attributes', function (array $memberAttributes, array $storedAttributes) { + $member = Member::factory()->defaults()->create($memberAttributes); + + NamiPutMemberAction::run($member, Activity::first(), Subactivity::first()); + + app(MemberFake::class)->assertStored(55, $storedAttributes); })->with([ - [ - ['email_parents' => 'a@b.de'], ['emailVertretungsberechtigter' => 'a@b.de'], - ], - [ - ['keepdata' => true], ['wiederverwendenFlag' => true], - ], - [ - ['keepdata' => false], ['wiederverwendenFlag' => false], - ], + [['firstname' => 'Phi'], ['vorname' => 'Phi']], + [['lastname' => 'Phi'], ['nachname' => 'Phi']], + [['nickname' => 'Nick'], ['spitzname' => 'Nick']], + [['email' => 'a@b.de'], ['email' => 'a@b.de']], + [['zip' => '5566'], ['plz' => '5566']], + [['location' => 'SG'], ['ort' => 'SG']], + [['further_address' => 'SG'], ['nameZusatz' => 'SG']], + [['other_country' => 'SG'], ['staatsangehoerigkeitText' => 'SG']], + [['address' => 'Add'], ['strasse' => 'Add']], + [['main_phone' => '+49 212 5566234'], ['telefon1' => '+49 212 5566234']], + [['mobile_phone' => '+49 212 5566234'], ['telefon2' => '+49 212 5566234']], + [['work_phone' => '+49 212 5566234'], ['telefon3' => '+49 212 5566234']], + [['email_parents' => 'a@b.de'], ['emailVertretungsberechtigter' => 'a@b.de']], + [['keepdata' => true], ['wiederverwendenFlag' => true]], + [['keepdata' => false], ['wiederverwendenFlag' => false]], + fn () => [['joined_at' => now()], ['eintrittsdatum' => now()->format('Y-m-d') . ' 00:00:00']], + [['fax' => '555'], ['telefax' => '555']], + [[], ['konfessionId' => 567]], + [[], ['ersteTaetigkeitId' => 6]], + [[], ['ersteUntergliederungId' => 55]], ]); + +it('stores related models', function () { + Subscription::factory()->forFee(3)->create(); + $member = Member::factory()->defaults() + ->for(Country::factory()->inNami(1)->create()) + ->for(Region::factory()->inNami(2)->create()) + ->for(Gender::factory()->inNami(4)->create()) + ->create(); + + NamiPutMemberAction::run($member, Activity::first(), Subactivity::first()); + + app(MemberFake::class)->assertStored(55, ['regionId' => 2, 'landId' => 1, 'beitragsartId' => 3, 'geschlechtId' => 4]); +}); + +it('stores bank account with empty values', function () { + $member = Member::factory()->defaults()->create(['mitgliedsnr' => 56]); + + NamiPutMemberAction::run($member, Activity::first(), Subactivity::first()); + + app(MemberFake::class)->assertStored(55, ['kontoverbindung' => json_encode([ + 'id' => '', + 'zahlungsKonditionId' => null, + 'mitgliedsNummer' => 56, + 'institut' => '', + 'kontoinhaber' => '', + 'kontonummer' => '', + 'bankleitzahl' => '', + 'iban' => '', + 'bic' => '' + ])]); +}); + +it('updates existing member', function () { + app(MemberFake::class)->updatesSuccessfully(55, 103)->shows(55, 103); + $member = Member::factory()->defaults()->inNami(103)->create(['version' => 50]); + + NamiPutMemberAction::run($member, Activity::first(), Subactivity::first()); + + app(MemberFake::class)->assertUpdated(55, 103, ['id' => 103, 'version' => 50]); +}); + +it('updates bank account with filled values', function () { + app(MemberFake::class)->updatesSuccessfully(55, 103)->shows(55, 103); + $member = Member::factory()->defaults() + ->withBankAccount(BankAccount::factory()->inNami(30)->state([ + 'bank_name' => 'Stadt', + 'bic' => 'SOLSDE33', + 'iban' => 'DE50', + 'blz' => 'ssss', + 'person' => 'Pill', + 'account_number' => 'ddf', + ])) + ->inNami(103) + ->create(['mitgliedsnr' => 56]); + + NamiPutMemberAction::run($member, Activity::first(), Subactivity::first()); + + app(MemberFake::class)->assertUpdated(55, 103, ['kontoverbindung' => json_encode([ + 'id' => 30, + 'zahlungsKonditionId' => null, + 'mitgliedsNummer' => 56, + 'institut' => 'Stadt', + 'kontoinhaber' => 'Pill', + 'kontonummer' => 'ddf', + 'bankleitzahl' => 'ssss', + 'iban' => 'DE50', + 'bic' => 'SOLSDE33' + ])]); +});