Fixed: Sync memberships

Fixed: Resolve activity id by id in name

Fixed: Sync missing membership group from group name

Fixed: Sync memberships without a subactivity
This commit is contained in:
philipp lang 2022-01-02 21:50:15 +01:00
parent fe5c446d64
commit 91265a3f55
6 changed files with 215 additions and 36 deletions

View File

@ -0,0 +1,39 @@
<?php
namespace App\Initialize;
class ActivityCreator {
private array $tries = [
'Schnuppermitgliedschaft',
];
private array $members = [
'€ Mitglied',
'Schnuppermitgliedschaft',
];
public function createFor($api, int $groupId) {
$api->activities($groupId)->each(function($activity) use ($api) {
$activity = \App\Activity::updateOrCreate(['nami_id' => $activity->id], [
'nami_id' => $activity->id,
'name' => $activity->name,
'is_try' => in_array($activity->name, $this->tries),
'is_member' => in_array($activity->name, $this->members),
]);
$groups = [];
$api->subactivitiesOf($activity->nami_id)->each(function($group) use (&$groups) {
$group = \App\Subactivity::updateOrCreate(['nami_id' => $group->id], [
'nami_id' => $group->id,
'name' => $group->name,
]);
$groups[] = $group->id;
});
$activity->subactivities()->sync($groups);
});
}
}

View File

@ -9,15 +9,6 @@ class InitializeActivities {
private $bar;
private $api;
private array $tries = [
'Schnuppermitgliedschaft',
];
private array $members = [
'€ Mitglied',
'Schnuppermitgliedschaft',
];
public function __construct($bar, $api) {
$this->bar = $bar;
$this->api = $api;
@ -25,25 +16,7 @@ class InitializeActivities {
public function handle(NamiUser $user) {
$this->bar->task('Synchronisiere Tätigkeiten', function() use ($user) {
$this->api->activities($user->getNamiGroupId())->each(function($activity) {
$activity = \App\Activity::create([
'nami_id' => $activity->id,
'name' => $activity->name,
'is_try' => in_array($activity->name, $this->tries),
'is_member' => in_array($activity->name, $this->members),
]);
$groups = [];
$this->api->subactivitiesOf($activity->nami_id)->each(function($group) use (&$groups) {
$group = \App\Subactivity::updateOrCreate(['nami_id' => $group->id], [
'nami_id' => $group->id,
'name' => $group->name,
]);
$groups[] = $group->id;
});
$activity->subactivities()->sync($groups);
});
app(ActivityCreator::class)->createFor($this->api, $user->getNamiGroupId());
});
}
}

View File

@ -12,8 +12,11 @@ use App\Group;
use App\Member\Member;
use App\Nationality;
use App\Region;
use App\Subactivity;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Zoomyboy\LaravelNami\Member as NamiMember;
use Zoomyboy\LaravelNami\NamiException;
class InitializeMembers {
@ -82,6 +85,44 @@ class InitializeMembers {
'nami_id' => $course->id,
]);
}
foreach ($this->api->membershipsOf($member->id) as $membership) {
if (Carbon::parse($membership['entries_aktivVon'])->addYears(200)->isPast()) {
continue;
}
if ($membership['entries_aktivBis'] !== '') {
continue;
}
if (preg_match('/\(([0-9]+)\)/', $membership['entries_taetigkeit'], $activityMatches) !== 1) {
throw new NamiException("ID in taetigkeit string not found: {$membership['entries_taetigkeit']}");
}
$group = Group::where('name', $membership['entries_gruppierung'])->first();
if (!$group) {
preg_match('/(.*?) ([0-9]+)$/', $membership['entries_gruppierung'], $groupMatches);
[$groupAll, $groupName, $groupId] = $groupMatches;
$group = Group::create(['name' => $groupName, 'nami_id' => $groupId]);
}
$subactivityId = $membership['entries_untergliederung'] === ''
? null
: Subactivity::where('name', $membership['entries_untergliederung'])->firstOrFail()->id;
$activity = Activity::where('nami_id', (int) $activityMatches[1])->first();
if (!$activity) {
$singleMembership = $this->api->membership($member->id, $membership['id']);
app(ActivityCreator::class)->createFor($this->api, $singleMembership['gruppierungId']);
$activity = Activity::where('nami_id', $singleMembership['taetigkeitId'])->first();
$group = Group::firstOrCreate(['nami_id' => $singleMembership['gruppierungId']], [
'nami_id' => $singleMembership['gruppierungId'],
'name' => $singleMembership['gruppierung'],
]);
}
$m->memberships()->create([
'nami_id' => $membership['id'],
'created_at' => $membership['entries_aktivVon'],
'group_id' => $group->id,
'activity_id' => $activity->id,
'subactivity_id' => $subactivityId,
]);
}
} catch (ModelNotFoundException $e) {
dd($e->getMessage(), $member);
}

@ -1 +1 @@
Subproject commit 99486140bf291f216a3129387dfb8d619d8e5f51
Subproject commit 21158cd5e28c02c811d1171059eb4393bd8f6505

2
resources/js/app.js vendored
View File

@ -27,7 +27,7 @@ Vue.component('v-bool', VBool);
const el = document.getElementById('app')
Vue.mixin(hasModule);
Vue.component(Link);
Vue.component('Link', Link);
new Vue({
render: h => h(InertiaApp, {

View File

@ -6,8 +6,10 @@ use App\Activity;
use App\Country;
use App\Course\Models\Course;
use App\Gender;
use App\Group;
use App\Member\Member;
use App\Nationality;
use App\Subactivity;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Http;
@ -31,7 +33,7 @@ class InitializeTest extends TestCase
->fakeGenders([['name' => 'Male', 'id' => 303]])
->fakeRegions([['name' => 'nrw', 'id' => 304]])
->fakeCourses([['name' => '1a', 'id' => 506]])
->fakeActivities(1000, [['name' => 'leiter', 'id' => 305]]);
->fakeActivities(1000, [['name' => 'leiter', 'id' => 305]]);
if (!$callback) {
$backend->fakeMember([
@ -47,7 +49,7 @@ class InitializeTest extends TestCase
'staatsangehoerigkeitId' => 291,
'zeitschriftenversand' => true,
'strasse' => '::street',
'plz' => '12345',
'plz' => '12346',
'ort' => '::location::',
'gruppierung' => '::group::',
'version' => 40,
@ -94,7 +96,7 @@ class InitializeTest extends TestCase
'nami_id' => 302
]);
$this->assertDatabaseHas('activities', [
'name' => 'Leiter',
'name' => 'Leiter',
'nami_id' => 305
]);
$this->assertDatabaseHas('courses', [
@ -109,13 +111,13 @@ class InitializeTest extends TestCase
'nationality_id' => Nationality::nami(291)->id,
'send_newspaper' => 1,
'address' => '::street',
'zip' => '12345',
'zip' => '12346',
'location' => '::location::',
'version' => 40,
]);
$this->assertEquals([306], Activity::where('nami_id', 305)->firstOrFail()->subactivities()->pluck('nami_id')->toArray());
Http::assertSentCount(15);
Http::assertSentCount(16);
}
public function testSyncCoursesOfMember(): void
@ -140,6 +142,130 @@ class InitializeTest extends TestCase
]);
}
public function membershipDataProvider() {
return [
'fetch_group_from_backend' => [
[
'gruppierung' => '::newgroup:: 22',
'id' => 1077,
'taetigkeit' => '::newtaetigkeit:: (9001)',
],
function($db) {
$db->assertDatabaseHas('activities', ['name' => '::newtaetigkeit::', 'nami_id' => 4000]);
$db->assertDatabaseHas('groups', ['name' => '::newgroup::', 'nami_id' => 9056]);
$db->assertDatabaseHas('activity_subactivity', [
'activity_id' => Activity::where('nami_id', 4000)->firstOrFail()->id,
'subactivity_id' => Subactivity::where('nami_id', 306)->firstOrFail()->id,
]);
$db->assertDatabaseHas('memberships', [
'activity_id' => Activity::where('nami_id', 4000)->firstOrFail()->id,
'group_id' => Group::where('nami_id', 9056)->firstOrFail()->id,
'nami_id' => 1077,
]);
},
function($backend) {
return $backend->fakeSingleMembership(116, 1077, [
'aktivVon' => '2021-08-22 00:00:00',
'aktivBis' => '',
'gruppierungId' => 9056,
'gruppierung' => '::newgroup::',
'id' => 1077,
'taetigkeit' => '::newtaetigkeit::',
'taetigkeitId' => 4000,
'untergliederungId' => 306,
])
->fakeActivities(9056, [['name' => '::newtaetigkeit::', 'id' => 4000]])
->fakeSubactivities([
4000 => [['name' => 'wö', 'id' => 306]]
]);
}
],
'normal' => [
[
'aktivVon' => '2021-08-22 00:00:00',
'aktivBis' => '',
'gruppierung' => '::group::',
'id' => 1077,
'taetigkeit' => '€ leiter (305)',
'untergliederung' => 'wö',
],
function($db) {
$db->assertDatabaseHas('memberships', [
'member_id' => Member::where('firstname', '::firstname::')->firstOrFail()->id,
'activity_id' => Activity::where('nami_id', 305)->firstOrFail()->id,
'subactivity_id' => Subactivity::where('nami_id', 306)->firstOrFail()->id,
'nami_id' => 1077,
'created_at' => '2021-08-22 00:00:00',
'group_id' => Group::where('name', '::group::')->firstOrFail()->id,
]);
},
],
'new_group' => [
[
'gruppierung' => '::new group:: 5555',
],
function($db) {
$db->assertDatabaseHas('groups', ['name' => '::new group::', 'nami_id' => 5555]);
},
],
'no_subactivity' => [
[
'untergliederung' => '',
],
function($db) {
$db->assertDatabaseHas('memberships', ['subactivity_id' => null]);
},
],
'no_wrong_dates' => [
[
'aktivVon' => '1014-04-01 00:00:00',
],
function($db) {
$db->assertDatabaseCount('memberships', 0);
},
],
'not_inactive' => [
[
'aktivBis' => '2021-08-25 00:00:00',
],
function($db) {
$db->assertDatabaseCount('memberships', 0);
},
],
];
}
/**
* @dataProvider membershipDataProvider
*/
public function testSyncMembershipsOfMember(array $membership, callable $dbcheck, ?callable $backendCallback = null): void
{
if (!$backendCallback) {
$backendCallback = function($backend) { return $backend; };
}
$this->withoutExceptionHandling();
$this->initializeProvider(function($backend) use ($membership, $backendCallback) {
$backend->fakeMembers([
$this->member([
'memberships' => [array_merge([
'aktivVon' => '2021-08-22 00:00:00',
'aktivBis' => '',
'gruppierung' => '::group::',
'id' => 1077,
'taetigkeit' => 'leiter (305)',
'untergliederung' => 'wö',
], $membership)],
])
]);
$backendCallback($backend);
});
$this->login();
$this->post('/initialize');
$dbcheck($this);
}
public function testItDoesntGetMembersWithNoJoinedAtDate(): void
{
$this->withoutExceptionHandling();
@ -209,7 +335,7 @@ class InitializeTest extends TestCase
'staatsangehoerigkeitId' => 291,
'zeitschriftenversand' => true,
'strasse' => '::street',
'plz' => '12345',
'plz' => '12346',
'ort' => '::location::',
'version' => 40,
'gruppierung' => '::group::',