From 90d6c11de2e0df1e2ee9abeda46403c67895cf80 Mon Sep 17 00:00:00 2001 From: philipp lang <philipp@aweos.de> Date: Sun, 6 Mar 2022 02:57:39 +0100 Subject: [PATCH] Update membership sync --- app/Initialize/InitializeMembers.php | 47 +++++++++++++------------ app/Member/Member.php | 5 +-- app/Membership/MembershipController.php | 21 +++-------- database/factories/GroupFactory.php | 5 +++ packages/laravel-nami | 2 +- 5 files changed, 37 insertions(+), 43 deletions(-) diff --git a/app/Initialize/InitializeMembers.php b/app/Initialize/InitializeMembers.php index ffe32b11..8ef03ee1 100644 --- a/app/Initialize/InitializeMembers.php +++ b/app/Initialize/InitializeMembers.php @@ -16,6 +16,7 @@ use App\Subactivity; use Carbon\Carbon; use Illuminate\Database\Eloquent\ModelNotFoundException; use Zoomyboy\LaravelNami\Api; +use Zoomyboy\LaravelNami\Data\MembershipEntry; use Zoomyboy\LaravelNami\Exceptions\RightException; use Zoomyboy\LaravelNami\Member as NamiMember; use Zoomyboy\LaravelNami\Membership as NamiMembership; @@ -94,7 +95,7 @@ class InitializeMembers { try { foreach ($this->api->membershipsOf($member->id) as $membership) { - if ($membership['entries_aktivBis'] !== '') { + if ($membership->endsAt !== null) { continue; } try { @@ -106,8 +107,8 @@ class InitializeMembers { continue; } $m->memberships()->create([ - 'nami_id' => $membership['id'], - 'from' => $membership['entries_aktivVon'], + 'nami_id' => $membership->id, + 'from' => $membership->startsAt, 'group_id' => $groupId, 'activity_id' => $activityId, 'subactivity_id' => $subactivityId, @@ -122,19 +123,19 @@ class InitializeMembers { }); } - private function fetchMembership(NamiMember $member, array $membership): array + private function fetchMembership(NamiMember $member, MembershipEntry $membershipEntry): array { - if ($this->shouldSyncMembership($membership)) { - $singleMembership = $this->api->membership($member->id, $membership['id']); - app(ActivityCreator::class)->createFor($this->api, $singleMembership['gruppierungId']); - $group = Group::firstOrCreate(['nami_id' => $singleMembership['gruppierungId']], [ - 'nami_id' => $singleMembership['gruppierungId'], - 'name' => $singleMembership['gruppierung'], + if ($this->shouldSyncMembership($membershipEntry)) { + $membership = $this->api->membership($member->id, $membershipEntry->id); + app(ActivityCreator::class)->createFor($this->api, $membership->groupId); + $group = Group::firstOrCreate(['nami_id' => $membership->groupId], [ + 'nami_id' => $membership->groupId, + 'name' => $membership->group, ]); try { - $activityId = Activity::where('nami_id', $singleMembership['taetigkeitId'])->firstOrFail()->id; - $subactivityId = $singleMembership['untergliederungId'] - ? Subactivity::where('nami_id', $singleMembership['untergliederungId'])->firstOrFail()->id + $activityId = Activity::where('nami_id', $membership->activityId)->firstOrFail()->id; + $subactivityId = $membership->subactivityId + ? Subactivity::where('nami_id', $membership->subactivityId)->firstOrFail()->id : null; return [$activityId, $subactivityId, $group->id]; } catch (ModelNotFoundException $e) { @@ -142,35 +143,35 @@ class InitializeMembers { } } - if ($membership['entries_untergliederung'] === '') { + if ($membershipEntry->subactivity === null) { $subactivityId = null; } else { - $subactivityId = Subactivity::where('name', $membership['entries_untergliederung'])->firstOrFail()->id; + $subactivityId = Subactivity::where('name', $membershipEntry->subactivity)->firstOrFail()->id; } - preg_match('/\(([0-9]+)\)$/', $membership['entries_taetigkeit'], $activityMatches); + preg_match('/\(([0-9]+)\)$/', $membershipEntry->activity, $activityMatches); $activityId = Activity::where('nami_id', $activityMatches[1])->firstOrFail()->id; - $groupId = Group::where('name', $membership['entries_gruppierung'])->firstOrFail()->id; + $groupId = Group::where('name', $membershipEntry->group)->firstOrFail()->id; return [$activityId, $subactivityId, $groupId]; } - private function shouldSyncMembership(array $membership): bool + private function shouldSyncMembership(MembershipEntry $membershipEntry): bool { - if (!Group::where('name', $membership['entries_gruppierung'])->exists()) { + if (!Group::where('name', $membershipEntry->group)->exists()) { return true; } - if (preg_match('/\(([0-9]+)\)/', $membership['entries_taetigkeit'], $activityMatches) !== 1) { - throw new NamiException("ID in taetigkeit string not found: {$membership['entries_taetigkeit']}"); + if (preg_match('/\(([0-9]+)\)/', $membershipEntry->activity, $activityMatches) !== 1) { + throw new NamiException("ID in taetigkeit string not found: {$membershipEntry->activity}"); } if (!Activity::where('nami_id', (int) $activityMatches[1])->exists()) { return true; } - if ($membership['entries_untergliederung'] === '') { + if ($membershipEntry->subactivity === null) { return false; } - return !Subactivity::where('name', $membership['entries_untergliederung'])->exists(); + return !Subactivity::where('name', $membershipEntry->subactivity)->exists(); } } diff --git a/app/Member/Member.php b/app/Member/Member.php index 4121944a..123a22f9 100644 --- a/app/Member/Member.php +++ b/app/Member/Member.php @@ -12,6 +12,7 @@ use App\Nationality; use App\Payment\Payment; use App\Payment\Subscription; use App\Region; +use App\Setting\NamiSettings; use App\Subactivity; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -60,9 +61,9 @@ class Member extends Model } // ---------------------------------- Actions ---------------------------------- - public function syncVersion(Api $api): void + public function syncVersion(): void { - $version = $api->group($this->group->nami_id)->member($this->nami_id)->version; + $version = app(NamiSettings::class)->login()->member($this->group->nami_id, $this->nami_id)['version']; $this->update(['version' => $version]); } diff --git a/app/Membership/MembershipController.php b/app/Membership/MembershipController.php index e16c6fbd..214774d6 100644 --- a/app/Membership/MembershipController.php +++ b/app/Membership/MembershipController.php @@ -2,33 +2,20 @@ namespace App\Membership; -use App\Activity; use App\Http\Controllers\Controller; use App\Member\Member; use App\Member\Membership; -use App\Subactivity; +use App\Membership\Requests\StoreRequest; +use App\Setting\NamiSettings; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; class MembershipController extends Controller { - public function store(Member $member, Request $request): RedirectResponse + public function store(Member $member, StoreRequest $request, NamiSettings $settings): RedirectResponse { - $namiId = auth()->user()->api()->group($member->group->nami_id)->member($member->nami_id) - ->putMembership([ - 'starts_at' => now(), - 'group_id' => $member->group->nami_id, - 'activity_id' => Activity::find($request->input('activity_id'))->nami_id, - 'subactivity_id' => optional(Subactivity::find($request->input('subactivity_id')))->nami_id, - ]); - - $member->memberships()->create(array_merge( - $request->input(), - ['nami_id' => $namiId], - )); - - $member->syncVersion(auth()->user()->api()); + $request->persist($member, $settings); return redirect()->back(); } diff --git a/database/factories/GroupFactory.php b/database/factories/GroupFactory.php index 2e4ebab6..c32f25d2 100644 --- a/database/factories/GroupFactory.php +++ b/database/factories/GroupFactory.php @@ -22,4 +22,9 @@ class GroupFactory extends Factory 'nami_id' => $this->faker->randomNumber(), ]; } + + public function inNami(int $namiId): self + { + return $this->state(['nami_id' => $namiId]); + } } diff --git a/packages/laravel-nami b/packages/laravel-nami index 07e5a902..99974ec4 160000 --- a/packages/laravel-nami +++ b/packages/laravel-nami @@ -1 +1 @@ -Subproject commit 07e5a9021c30a472e856b30ad46de3f3bc109c6a +Subproject commit 99974ec425182292170278fd69c876b443b427da