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 $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());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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, {
|
||||
|
|
|
@ -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::',
|
||||
|
|
Loading…
Reference in New Issue