114 lines
3.5 KiB
PHP
114 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace App\Actions;
|
|
|
|
use App\Activity;
|
|
use App\Group;
|
|
use App\Initialize\ActivityCreator;
|
|
use App\Member\Member;
|
|
use App\Member\Membership;
|
|
use App\Setting\NamiSettings;
|
|
use App\Subactivity;
|
|
use Illuminate\Support\Collection;
|
|
use Lorisleiva\Actions\Concerns\AsAction;
|
|
use Zoomyboy\LaravelNami\Api;
|
|
use Zoomyboy\LaravelNami\Data\MembershipEntry as NamiMembershipEntry;
|
|
|
|
class InsertMembershipsAction
|
|
{
|
|
use AsAction;
|
|
|
|
/**
|
|
* @param Collection<int, NamiMembershipEntry> $memberships
|
|
*/
|
|
public function handle(Member $member, Collection $memberships): void
|
|
{
|
|
if (!$member->hasNami) {
|
|
return;
|
|
}
|
|
|
|
foreach ($memberships as $membership) {
|
|
$existingMembership = Membership::where('nami_id', $membership->id)->first();
|
|
|
|
$group = Group::where('name', $membership->group)->whereNotNull('nami_id')->first();
|
|
if (!$group) {
|
|
continue;
|
|
}
|
|
|
|
if (null !== $this->overviewStrategy($member, $group, $membership)) {
|
|
continue;
|
|
}
|
|
|
|
$this->singleStrategy($member, $group, $membership);
|
|
}
|
|
|
|
$membershipIds = $memberships->map(fn ($membership) => $membership->id)->toArray();
|
|
$member->memberships()->whereNotIn('nami_id', $membershipIds)->whereNotNull('nami_id')->delete();
|
|
}
|
|
|
|
private function overviewStrategy(Member $member, Group $group, NamiMembershipEntry $membership): ?Membership
|
|
{
|
|
$activity = 1 === preg_match('/\(([0-9]+)\)/', $membership->activity, $activityMatches)
|
|
? Activity::where('nami_id', (int) $activityMatches[1])->first()
|
|
: null;
|
|
|
|
if (!$activity) {
|
|
return null;
|
|
}
|
|
|
|
if (null !== $membership->subactivity) {
|
|
$subactivity = Subactivity::remote()->where('name', $membership->subactivity)->first();
|
|
|
|
if (!$subactivity) {
|
|
return null;
|
|
}
|
|
} else {
|
|
$subactivity = null;
|
|
}
|
|
|
|
return $member->memberships()->updateOrCreate(['nami_id' => $membership->id], [
|
|
'nami_id' => $membership->id,
|
|
'from' => $membership->startsAt,
|
|
'to' => $membership->endsAt,
|
|
'group_id' => $group->id,
|
|
'activity_id' => $activity->id,
|
|
'subactivity_id' => $subactivity?->id,
|
|
]);
|
|
}
|
|
|
|
private function singleStrategy(Member $member, Group $group, NamiMembershipEntry $membershipEntry): ?Membership
|
|
{
|
|
$membership = $this->api()->membership($member->nami_id, $membershipEntry->id);
|
|
app(ActivityCreator::class)->createFor($this->api(), $membership->group());
|
|
|
|
$activity = Activity::nami($membership->activityId);
|
|
if (!$activity) {
|
|
return null;
|
|
}
|
|
|
|
if (null !== $membership->subactivityId) {
|
|
$subactivity = Subactivity::nami($membership->subactivityId);
|
|
|
|
if (!$subactivity) {
|
|
return null;
|
|
}
|
|
} else {
|
|
$subactivity = null;
|
|
}
|
|
|
|
return $member->memberships()->updateOrCreate(['nami_id' => $membership->id], [
|
|
'nami_id' => $membership->id,
|
|
'from' => $membership->startsAt,
|
|
'to' => $membership->endsAt,
|
|
'group_id' => $group->id,
|
|
'activity_id' => $activity->id,
|
|
'subactivity_id' => $subactivity?->id,
|
|
]);
|
|
}
|
|
|
|
private function api(): Api
|
|
{
|
|
return app(NamiSettings::class)->login();
|
|
}
|
|
}
|