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:
parent
fe5c446d64
commit
91265a3f55
|
@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -9,15 +9,6 @@ class InitializeActivities {
|
||||||
private $bar;
|
private $bar;
|
||||||
private $api;
|
private $api;
|
||||||
|
|
||||||
private array $tries = [
|
|
||||||
'Schnuppermitgliedschaft',
|
|
||||||
];
|
|
||||||
|
|
||||||
private array $members = [
|
|
||||||
'€ Mitglied',
|
|
||||||
'Schnuppermitgliedschaft',
|
|
||||||
];
|
|
||||||
|
|
||||||
public function __construct($bar, $api) {
|
public function __construct($bar, $api) {
|
||||||
$this->bar = $bar;
|
$this->bar = $bar;
|
||||||
$this->api = $api;
|
$this->api = $api;
|
||||||
|
@ -25,25 +16,7 @@ class InitializeActivities {
|
||||||
|
|
||||||
public function handle(NamiUser $user) {
|
public function handle(NamiUser $user) {
|
||||||
$this->bar->task('Synchronisiere Tätigkeiten', function() use ($user) {
|
$this->bar->task('Synchronisiere Tätigkeiten', function() use ($user) {
|
||||||
$this->api->activities($user->getNamiGroupId())->each(function($activity) {
|
app(ActivityCreator::class)->createFor($this->api, $user->getNamiGroupId());
|
||||||
$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);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,11 @@ use App\Group;
|
||||||
use App\Member\Member;
|
use App\Member\Member;
|
||||||
use App\Nationality;
|
use App\Nationality;
|
||||||
use App\Region;
|
use App\Region;
|
||||||
|
use App\Subactivity;
|
||||||
|
use Carbon\Carbon;
|
||||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||||
use Zoomyboy\LaravelNami\Member as NamiMember;
|
use Zoomyboy\LaravelNami\Member as NamiMember;
|
||||||
|
use Zoomyboy\LaravelNami\NamiException;
|
||||||
|
|
||||||
class InitializeMembers {
|
class InitializeMembers {
|
||||||
|
|
||||||
|
@ -82,6 +85,44 @@ class InitializeMembers {
|
||||||
'nami_id' => $course->id,
|
'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) {
|
} catch (ModelNotFoundException $e) {
|
||||||
dd($e->getMessage(), $member);
|
dd($e->getMessage(), $member);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 99486140bf291f216a3129387dfb8d619d8e5f51
|
Subproject commit 21158cd5e28c02c811d1171059eb4393bd8f6505
|
|
@ -27,7 +27,7 @@ Vue.component('v-bool', VBool);
|
||||||
const el = document.getElementById('app')
|
const el = document.getElementById('app')
|
||||||
|
|
||||||
Vue.mixin(hasModule);
|
Vue.mixin(hasModule);
|
||||||
Vue.component(Link);
|
Vue.component('Link', Link);
|
||||||
|
|
||||||
new Vue({
|
new Vue({
|
||||||
render: h => h(InertiaApp, {
|
render: h => h(InertiaApp, {
|
||||||
|
|
|
@ -6,8 +6,10 @@ use App\Activity;
|
||||||
use App\Country;
|
use App\Country;
|
||||||
use App\Course\Models\Course;
|
use App\Course\Models\Course;
|
||||||
use App\Gender;
|
use App\Gender;
|
||||||
|
use App\Group;
|
||||||
use App\Member\Member;
|
use App\Member\Member;
|
||||||
use App\Nationality;
|
use App\Nationality;
|
||||||
|
use App\Subactivity;
|
||||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
use Illuminate\Foundation\Testing\WithFaker;
|
use Illuminate\Foundation\Testing\WithFaker;
|
||||||
use Illuminate\Support\Facades\Http;
|
use Illuminate\Support\Facades\Http;
|
||||||
|
@ -31,7 +33,7 @@ class InitializeTest extends TestCase
|
||||||
->fakeGenders([['name' => 'Male', 'id' => 303]])
|
->fakeGenders([['name' => 'Male', 'id' => 303]])
|
||||||
->fakeRegions([['name' => 'nrw', 'id' => 304]])
|
->fakeRegions([['name' => 'nrw', 'id' => 304]])
|
||||||
->fakeCourses([['name' => '1a', 'id' => 506]])
|
->fakeCourses([['name' => '1a', 'id' => 506]])
|
||||||
->fakeActivities(1000, [['name' => 'leiter', 'id' => 305]]);
|
->fakeActivities(1000, [['name' => '€ leiter', 'id' => 305]]);
|
||||||
|
|
||||||
if (!$callback) {
|
if (!$callback) {
|
||||||
$backend->fakeMember([
|
$backend->fakeMember([
|
||||||
|
@ -47,7 +49,7 @@ class InitializeTest extends TestCase
|
||||||
'staatsangehoerigkeitId' => 291,
|
'staatsangehoerigkeitId' => 291,
|
||||||
'zeitschriftenversand' => true,
|
'zeitschriftenversand' => true,
|
||||||
'strasse' => '::street',
|
'strasse' => '::street',
|
||||||
'plz' => '12345',
|
'plz' => '12346',
|
||||||
'ort' => '::location::',
|
'ort' => '::location::',
|
||||||
'gruppierung' => '::group::',
|
'gruppierung' => '::group::',
|
||||||
'version' => 40,
|
'version' => 40,
|
||||||
|
@ -94,7 +96,7 @@ class InitializeTest extends TestCase
|
||||||
'nami_id' => 302
|
'nami_id' => 302
|
||||||
]);
|
]);
|
||||||
$this->assertDatabaseHas('activities', [
|
$this->assertDatabaseHas('activities', [
|
||||||
'name' => 'Leiter',
|
'name' => '€ Leiter',
|
||||||
'nami_id' => 305
|
'nami_id' => 305
|
||||||
]);
|
]);
|
||||||
$this->assertDatabaseHas('courses', [
|
$this->assertDatabaseHas('courses', [
|
||||||
|
@ -109,13 +111,13 @@ class InitializeTest extends TestCase
|
||||||
'nationality_id' => Nationality::nami(291)->id,
|
'nationality_id' => Nationality::nami(291)->id,
|
||||||
'send_newspaper' => 1,
|
'send_newspaper' => 1,
|
||||||
'address' => '::street',
|
'address' => '::street',
|
||||||
'zip' => '12345',
|
'zip' => '12346',
|
||||||
'location' => '::location::',
|
'location' => '::location::',
|
||||||
'version' => 40,
|
'version' => 40,
|
||||||
]);
|
]);
|
||||||
$this->assertEquals([306], Activity::where('nami_id', 305)->firstOrFail()->subactivities()->pluck('nami_id')->toArray());
|
$this->assertEquals([306], Activity::where('nami_id', 305)->firstOrFail()->subactivities()->pluck('nami_id')->toArray());
|
||||||
|
|
||||||
Http::assertSentCount(15);
|
Http::assertSentCount(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSyncCoursesOfMember(): void
|
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
|
public function testItDoesntGetMembersWithNoJoinedAtDate(): void
|
||||||
{
|
{
|
||||||
$this->withoutExceptionHandling();
|
$this->withoutExceptionHandling();
|
||||||
|
@ -209,7 +335,7 @@ class InitializeTest extends TestCase
|
||||||
'staatsangehoerigkeitId' => 291,
|
'staatsangehoerigkeitId' => 291,
|
||||||
'zeitschriftenversand' => true,
|
'zeitschriftenversand' => true,
|
||||||
'strasse' => '::street',
|
'strasse' => '::street',
|
||||||
'plz' => '12345',
|
'plz' => '12346',
|
||||||
'ort' => '::location::',
|
'ort' => '::location::',
|
||||||
'version' => 40,
|
'version' => 40,
|
||||||
'gruppierung' => '::group::',
|
'gruppierung' => '::group::',
|
||||||
|
|
Loading…
Reference in New Issue