Update
This commit is contained in:
parent
af2cb5688a
commit
0ffce6b25e
|
@ -1,193 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Activity;
|
||||
use App\Confession;
|
||||
use App\Country;
|
||||
use App\Course\Models\Course;
|
||||
use App\Fee;
|
||||
use App\Gender;
|
||||
use App\Group;
|
||||
use App\Initialize\ActivityCreator;
|
||||
use App\Member\Member;
|
||||
use App\Member\Membership;
|
||||
use App\Nationality;
|
||||
use App\Region;
|
||||
use App\Subactivity;
|
||||
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\NamiException;
|
||||
|
||||
class MemberPullAction
|
||||
{
|
||||
private NamiMember $member;
|
||||
private Api $api;
|
||||
|
||||
public function api(Api $api): self
|
||||
{
|
||||
$this->api = $api;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function member(int $groupId, int $memberId): self
|
||||
{
|
||||
$this->member = NamiMember::fromNami($this->api->member($groupId, $memberId));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function execute(): void
|
||||
{
|
||||
if (!$this->member->joined_at) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$region = Region::firstWhere('nami_id', $this->member->region_id ?: -1);
|
||||
$m = Member::updateOrCreate(['nami_id' => $this->member->id], [
|
||||
'firstname' => $this->member->firstname,
|
||||
'lastname' => $this->member->lastname,
|
||||
'joined_at' => $this->member->joined_at,
|
||||
'birthday' => $this->member->birthday,
|
||||
'send_newspaper' => $this->member->send_newspaper,
|
||||
'address' => $this->member->address,
|
||||
'zip' => $this->member->zip,
|
||||
'location' => $this->member->location,
|
||||
'nickname' => $this->member->nickname,
|
||||
'other_country' => $this->member->other_country,
|
||||
'further_address' => $this->member->further_address,
|
||||
'main_phone' => $this->member->main_phone,
|
||||
'mobile_phone' => $this->member->mobile_phone,
|
||||
'work_phone' => $this->member->work_phone,
|
||||
'fax' => $this->member->fax,
|
||||
'email' => $this->member->email,
|
||||
'email_parents' => $this->member->email_parents,
|
||||
'nami_id' => $this->member->id,
|
||||
'group_id' => Group::firstOrCreate(['nami_id' => $this->member->group_id], ['nami_id' => $this->member->group_id, 'name' => $this->member->group_name])->id,
|
||||
'gender_id' => optional(Gender::firstWhere('nami_id', $this->member->gender_id ?: -1))->id,
|
||||
'confession_id' => optional(Confession::firstWhere('nami_id', $this->member->confession_id ?: -1))->id,
|
||||
'region_id' => $region && !$region->is_null ? $region->id : null,
|
||||
'country_id' => optional(Country::where('nami_id', $this->member->country_id)->first())->id,
|
||||
'subscription_id' => $this->getSubscriptionId($this->member),
|
||||
'nationality_id' => Nationality::where('nami_id', $this->member->nationality_id)->firstOrFail()->id,
|
||||
'version' => $this->member->version,
|
||||
]);
|
||||
|
||||
try {
|
||||
foreach ($this->api->coursesFor($this->member->id) as $course) {
|
||||
$m->courses()->updateOrCreate(['nami_id' => $course->id], [
|
||||
'course_id' => Course::where('nami_id', $course->courseId)->firstOrFail()->id,
|
||||
'organizer' => $course->organizer,
|
||||
'event_name' => $course->eventName,
|
||||
'completed_at' => $course->completedAt,
|
||||
'nami_id' => $course->id,
|
||||
]);
|
||||
}
|
||||
} catch (RightException $e) {
|
||||
}
|
||||
|
||||
try {
|
||||
foreach ($this->api->membershipsOf($this->member->id) as $membership) {
|
||||
$existingMembership = Membership::where('nami_id', $membership->id)->first();
|
||||
if (null !== $membership->endsAt && !$existingMembership) {
|
||||
continue;
|
||||
}
|
||||
if (null !== $membership->endsAt && $existingMembership) {
|
||||
$existingMembership->delete();
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
[$activityId, $subactivityId, $groupId] = $this->fetchMembership($membership);
|
||||
} catch (RightException $e) {
|
||||
continue;
|
||||
}
|
||||
if (is_null($activityId)) {
|
||||
continue;
|
||||
}
|
||||
$m->memberships()->updateOrCreate(['nami_id' => $membership->id], [
|
||||
'nami_id' => $membership->id,
|
||||
'from' => $membership->startsAt,
|
||||
'group_id' => $groupId,
|
||||
'activity_id' => $activityId,
|
||||
'subactivity_id' => $subactivityId,
|
||||
]);
|
||||
}
|
||||
} catch (RightException $e) {
|
||||
}
|
||||
} catch (ModelNotFoundException $e) {
|
||||
dd($e->getMessage(), $this->member);
|
||||
}
|
||||
}
|
||||
|
||||
private function fetchMembership(MembershipEntry $membershipEntry): array
|
||||
{
|
||||
if ($this->shouldSyncMembership($membershipEntry)) {
|
||||
$membership = $this->api->membership($this->member->id, $membershipEntry->id);
|
||||
|
||||
if (is_null($membership)) {
|
||||
return [null, null, null];
|
||||
}
|
||||
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', $membership->activityId)->firstOrFail()->id;
|
||||
$subactivityId = $membership->subactivityId
|
||||
? Subactivity::where('nami_id', $membership->subactivityId)->firstOrFail()->id
|
||||
: null;
|
||||
|
||||
return [$activityId, $subactivityId, $group->id];
|
||||
} catch (ModelNotFoundException $e) {
|
||||
return [null, null, null];
|
||||
}
|
||||
}
|
||||
|
||||
if (null === $membershipEntry->subactivity) {
|
||||
$subactivityId = null;
|
||||
} else {
|
||||
$subactivityId = Subactivity::where('name', $membershipEntry->subactivity)->firstOrFail()->id;
|
||||
}
|
||||
preg_match('/\(([0-9]+)\)$/', $membershipEntry->activity, $activityMatches);
|
||||
$activityId = Activity::where('nami_id', $activityMatches[1])->firstOrFail()->id;
|
||||
$groupId = Group::where('name', $membershipEntry->group)->firstOrFail()->id;
|
||||
|
||||
return [$activityId, $subactivityId, $groupId];
|
||||
}
|
||||
|
||||
private function shouldSyncMembership(MembershipEntry $membershipEntry): bool
|
||||
{
|
||||
if (!Group::where('name', $membershipEntry->group)->exists()) {
|
||||
return true;
|
||||
}
|
||||
if (1 !== preg_match('/\(([0-9]+)\)/', $membershipEntry->activity, $activityMatches)) {
|
||||
throw new NamiException("ID in taetigkeit string not found: {$membershipEntry->activity}");
|
||||
}
|
||||
|
||||
if (!Activity::where('nami_id', (int) $activityMatches[1])->exists()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (null === $membershipEntry->subactivity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return !Subactivity::where('name', $membershipEntry->subactivity)->exists();
|
||||
}
|
||||
|
||||
public function getSubscriptionId(NamiMember $member): ?int
|
||||
{
|
||||
$fee = Fee::firstWhere('nami_id', $member->fee_id ?: -1);
|
||||
if (is_null($fee)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return optional($fee->subscriptions()->first())->id;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
|
||||
namespace App\Actions;
|
||||
|
||||
use App\Confession;
|
||||
use App\Country;
|
||||
use App\Fee;
|
||||
use App\Gender;
|
||||
use App\Group;
|
||||
use App\Member\Member;
|
||||
use App\Nationality;
|
||||
use App\Region;
|
||||
use App\Setting\NamiSettings;
|
||||
use Lorisleiva\Actions\Concerns\AsAction;
|
||||
use Zoomyboy\LaravelNami\Api;
|
||||
use Zoomyboy\LaravelNami\Data\Member as NamiMember;
|
||||
|
||||
class PullMemberAction
|
||||
{
|
||||
use AsAction;
|
||||
|
||||
public function handle(int $groupId, int $memberId): void
|
||||
{
|
||||
$member = $this->api()->member($groupId, $memberId);
|
||||
|
||||
if (!$member->joinedAt) {
|
||||
return;
|
||||
}
|
||||
|
||||
$region = Region::firstWhere('nami_id', $member->regionId ?: -1);
|
||||
$m = Member::updateOrCreate(['nami_id' => $member->id], [
|
||||
'firstname' => $member->firstname,
|
||||
'lastname' => $member->lastname,
|
||||
'joined_at' => $member->joinedAt,
|
||||
'birthday' => $member->birthday,
|
||||
'send_newspaper' => $member->sendNewspaper,
|
||||
'address' => $member->address,
|
||||
'zip' => $member->zip,
|
||||
'location' => $member->location,
|
||||
'nickname' => $member->nickname,
|
||||
'other_country' => $member->otherCountry,
|
||||
'further_address' => $member->furtherAddress,
|
||||
'main_phone' => $member->mainPhone,
|
||||
'mobile_phone' => $member->mobilePhone,
|
||||
'work_phone' => $member->workPhone,
|
||||
'fax' => $member->fax,
|
||||
'email' => $member->email,
|
||||
'email_parents' => $member->emailParents,
|
||||
'nami_id' => $member->id,
|
||||
'group_id' => Group::firstOrCreate(['nami_id' => $member->groupId], ['nami_id' => $member->groupId, 'name' => $member->groupName])->id,
|
||||
'gender_id' => optional(Gender::firstWhere('nami_id', $member->genderId ?: -1))->id,
|
||||
'confession_id' => optional(Confession::firstWhere('nami_id', $member->confessionId ?: -1))->id,
|
||||
'region_id' => $region && !$region->is_null ? $region->id : null,
|
||||
'country_id' => optional(Country::where('nami_id', $member->countryId)->first())->id,
|
||||
'subscription_id' => $this->getSubscriptionId($member),
|
||||
'nationality_id' => Nationality::where('nami_id', $member->nationalityId)->firstOrFail()->id,
|
||||
'version' => $member->version,
|
||||
]);
|
||||
}
|
||||
|
||||
public function getSubscriptionId(NamiMember $member): ?int
|
||||
{
|
||||
$fee = Fee::firstWhere('nami_id', $member->feeId ?: -1);
|
||||
if (is_null($fee)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return optional($fee->subscriptions()->first())->id;
|
||||
}
|
||||
|
||||
private function api(): Api
|
||||
{
|
||||
return app(NamiSettings::class)->login();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
<?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 Lorisleiva\Actions\Concerns\AsAction;
|
||||
use Zoomyboy\LaravelNami\Api;
|
||||
use Zoomyboy\LaravelNami\Data\MembershipEntry as NamiMembershipEntry;
|
||||
|
||||
class PullMembershipsAction
|
||||
{
|
||||
use AsAction;
|
||||
|
||||
public function handle(Member $member): void
|
||||
{
|
||||
if (!$member->hasNami) {
|
||||
return;
|
||||
}
|
||||
|
||||
$memberships = $this->api()->membershipsOf($member->nami_id);
|
||||
|
||||
foreach ($memberships as $membership) {
|
||||
$existingMembership = Membership::where('nami_id', $membership->id)->first();
|
||||
|
||||
$group = Group::where('name', $membership->group)->first();
|
||||
if (!$group) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (null !== $this->overviewStrategy($member, $group, $membership)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->singleStrategy($member, $group, $membership);
|
||||
}
|
||||
}
|
||||
|
||||
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::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,
|
||||
'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->groupId);
|
||||
|
||||
$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,
|
||||
'group_id' => $group->id,
|
||||
'activity_id' => $activity->id,
|
||||
'subactivity_id' => $subactivity?->id,
|
||||
]);
|
||||
}
|
||||
|
||||
private function api(): Api
|
||||
{
|
||||
return app(NamiSettings::class)->login();
|
||||
}
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App;
|
||||
|
||||
use App\Nami\HasNamiField;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
@ -9,15 +10,11 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|||
class Group extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use HasNamiField;
|
||||
|
||||
public $fillable = ['nami_id', 'name', 'parent_id'];
|
||||
public $timestamps = false;
|
||||
|
||||
public static function nami(int $id): self
|
||||
{
|
||||
return static::firstWhere('nami_id', $id);
|
||||
}
|
||||
|
||||
public function parent(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(static::class, 'parent_id');
|
||||
|
|
|
@ -9,6 +9,7 @@ use App\Member\Member;
|
|||
use App\Setting\NamiSettings;
|
||||
use App\Subactivity;
|
||||
use Lorisleiva\Actions\Concerns\AsAction;
|
||||
use Zoomyboy\LaravelNami\Data\Member as NamiMember;
|
||||
|
||||
class NamiPutMemberAction
|
||||
{
|
||||
|
@ -17,36 +18,37 @@ class NamiPutMemberAction
|
|||
public function handle(Member $member, ?Activity $activity = null, ?Subactivity $subactivity = null): void
|
||||
{
|
||||
$api = app(NamiSettings::class)->login();
|
||||
$response = $api->putMember([
|
||||
$response = $api->putMember(NamiMember::from([
|
||||
'firstname' => $member->firstname,
|
||||
'lastname' => $member->lastname,
|
||||
'joined_at' => $member->joined_at,
|
||||
'joinedAt' => $member->joined_at,
|
||||
'birthday' => $member->birthday,
|
||||
'send_newspaper' => $member->send_newspaper,
|
||||
'sendNewspaper' => $member->send_newspaper,
|
||||
'address' => $member->address,
|
||||
'zip' => $member->zip,
|
||||
'location' => $member->location,
|
||||
'nickname' => $member->nickname,
|
||||
'other_country' => $member->other_country,
|
||||
'further_address' => $member->further_address,
|
||||
'main_phone' => $member->main_phone,
|
||||
'mobile_phone' => $member->mobile_phone,
|
||||
'work_phone' => $member->work_phone,
|
||||
'otherCountry' => $member->other_country,
|
||||
'furtherAddress' => $member->further_address,
|
||||
'mainPhone' => $member->main_phone,
|
||||
'mobilePhone' => $member->mobile_phone,
|
||||
'workPhone' => $member->work_phone,
|
||||
'fax' => $member->fax,
|
||||
'email' => $member->email,
|
||||
'email_parents' => $member->email_parents,
|
||||
'gender_id' => optional($member->gender)->nami_id,
|
||||
'confession_id' => $member->confession ? $member->confession->nami_id : Confession::firstWhere('is_null', true)->nami_id,
|
||||
'region_id' => optional($member->region)->nami_id,
|
||||
'country_id' => $member->country->nami_id,
|
||||
'fee_id' => $member->getNamiFeeId(),
|
||||
'nationality_id' => $member->nationality->nami_id,
|
||||
'group_id' => $member->group->nami_id,
|
||||
'genderId' => optional($member->gender)->nami_id,
|
||||
'confessionId' => $member->confession ? $member->confession->nami_id : Confession::firstWhere('is_null', true)->nami_id,
|
||||
'regionId' => optional($member->region)->nami_id,
|
||||
'countryId' => $member->country->nami_id,
|
||||
'feeId' => $member->getNamiFeeId(),
|
||||
'nationalityId' => $member->nationality->nami_id,
|
||||
'groupId' => $member->group->nami_id,
|
||||
'first_activity_id' => $activity ? $activity->nami_id : null,
|
||||
'first_subactivity_id' => $subactivity ? $subactivity->nami_id : null,
|
||||
'id' => $member->nami_id,
|
||||
'version' => $member->version,
|
||||
]);
|
||||
'keepdata' => false,
|
||||
]));
|
||||
Member::withoutEvents(function () use ($response, $member, $api) {
|
||||
$member->update(['nami_id' => $response['id']]);
|
||||
app(MemberPullAction::class)->api($api)->member($member->group->nami_id, $member->nami_id)->execute();
|
||||
|
|
|
@ -7,6 +7,7 @@ use App\Country;
|
|||
use App\Course\Models\CourseMember;
|
||||
use App\Group;
|
||||
use App\Letter\BillKind;
|
||||
use App\Nami\HasNamiField;
|
||||
use App\Nationality;
|
||||
use App\Payment\Payment;
|
||||
use App\Payment\Subscription;
|
||||
|
@ -34,6 +35,7 @@ use Zoomyboy\LaravelNami\Data\MembershipEntry;
|
|||
class Member extends Model
|
||||
{
|
||||
use Notifiable;
|
||||
use HasNamiField;
|
||||
use HasFactory;
|
||||
use Sluggable;
|
||||
|
||||
|
@ -95,7 +97,7 @@ class Member extends Model
|
|||
// ---------------------------------- Actions ----------------------------------
|
||||
public function syncVersion(): void
|
||||
{
|
||||
$version = app(NamiSettings::class)->login()->member($this->group->nami_id, $this->nami_id)['version'];
|
||||
$version = app(NamiSettings::class)->login()->member($this->group->nami_id, $this->nami_id)->version;
|
||||
|
||||
$this->update(['version' => $version]);
|
||||
}
|
||||
|
@ -156,11 +158,6 @@ class Member extends Model
|
|||
: null;
|
||||
}
|
||||
|
||||
public function getHasNamiAttribute(): bool
|
||||
{
|
||||
return null !== $this->nami_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection<int, MembershipEntry>
|
||||
*/
|
||||
|
|
|
@ -26,7 +26,7 @@ class MembershipStoreAction
|
|||
$from = now()->startOfDay();
|
||||
|
||||
try {
|
||||
$namiId = $settings->login()->putMembership($member->nami_id, NamiMembership::fromArray([
|
||||
$namiId = $settings->login()->putMembership($member->nami_id, NamiMembership::from([
|
||||
'startsAt' => $from,
|
||||
'groupId' => $member->group->nami_id,
|
||||
'activityId' => $activity->nami_id,
|
||||
|
|
|
@ -2,18 +2,15 @@
|
|||
|
||||
namespace App\Nami;
|
||||
|
||||
use Exception;
|
||||
|
||||
trait HasNamiField
|
||||
{
|
||||
public static function nami(int $id): self
|
||||
public static function nami(int $id): ?self
|
||||
{
|
||||
$model = static::firstWhere('nami_id', $id);
|
||||
return static::firstWhere('nami_id', $id);
|
||||
}
|
||||
|
||||
if (is_null($model)) {
|
||||
throw new Exception('Nami search on '.static::class.' with ID '.$id.' failed.');
|
||||
}
|
||||
|
||||
return $model;
|
||||
public function getHasNamiAttribute(): bool
|
||||
{
|
||||
return null !== $this->nami_id;
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -24,4 +24,9 @@ class CountryFactory extends Factory
|
|||
'nami_id' => $this->faker->randomNumber(),
|
||||
];
|
||||
}
|
||||
|
||||
public function inNami(int $namiId): self
|
||||
{
|
||||
return $this->state(['nami_id' => $namiId]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,4 +24,9 @@ class FeeFactory extends Factory
|
|||
'nami_id' => $this->faker->randomNumber(),
|
||||
];
|
||||
}
|
||||
|
||||
public function inNami(int $namiId): self
|
||||
{
|
||||
return $this->state(['nami_id' => $namiId]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,4 +29,9 @@ class GroupFactory extends Factory
|
|||
{
|
||||
return $this->state(['nami_id' => $namiId]);
|
||||
}
|
||||
|
||||
public function name(string $name): self
|
||||
{
|
||||
return $this->state(['name' => $name]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ class MemberFactory extends Factory
|
|||
'address' => $this->faker->streetAddress,
|
||||
'zip' => $this->faker->postcode,
|
||||
'location' => $this->faker->city,
|
||||
'email' => $this->faker->safeEmail(),
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit e8d26ab774dbc101729c4942e5259a30fbe9e342
|
||||
Subproject commit a2e5adfd4ce758a453f2ddbe2a25a88e9c932b0e
|
|
@ -169,26 +169,6 @@ class InitializeTest extends TestCase
|
|||
->fakeActivities(9056, []);
|
||||
},
|
||||
],
|
||||
'normal' => [
|
||||
[
|
||||
'aktivVon' => '2021-08-22 00:00:00',
|
||||
'aktivBis' => '',
|
||||
'gruppierung' => 'testgroup',
|
||||
'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,
|
||||
'from' => '2021-08-22 00:00:00',
|
||||
'group_id' => Group::where('name', 'testgroup')->firstOrFail()->id,
|
||||
]);
|
||||
},
|
||||
],
|
||||
'fetch_subactivity_from_group' => [
|
||||
[
|
||||
'gruppierung' => '::newgroup:: 22',
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature\Initialize;
|
||||
|
||||
use App\Actions\PullMemberAction;
|
||||
use App\Country;
|
||||
use App\Fee;
|
||||
use App\Gender;
|
||||
use App\Group;
|
||||
use App\Nationality;
|
||||
use App\Payment\Subscription;
|
||||
use App\Region;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Tests\TestCase;
|
||||
use Zoomyboy\LaravelNami\Fakes\MemberFake;
|
||||
|
||||
class PullMemberActionTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
Subscription::factory()->name('test')->for(Fee::factory()->inNami(300))->create();
|
||||
Gender::factory()->inNami(303)->create();
|
||||
Country::factory()->inNami(302)->create();
|
||||
Nationality::factory()->inNami(1054)->create();
|
||||
$this->loginNami();
|
||||
}
|
||||
|
||||
public function testFetchNormalMember(): void
|
||||
{
|
||||
app(MemberFake::class)->shows(1000, 1001, [
|
||||
'vorname' => '::firstname::',
|
||||
'nachname' => '::lastname::',
|
||||
'beitragsartId' => 300,
|
||||
'geburtsDatum' => '2014-07-11 00:00:00',
|
||||
'gruppierungId' => 1000,
|
||||
'geschlechtId' => 303,
|
||||
'id' => 1001,
|
||||
'eintrittsdatum' => '2020-11-17 00:00:00',
|
||||
'landId' => 302,
|
||||
'staatsangehoerigkeitId' => 1054,
|
||||
'zeitschriftenversand' => true,
|
||||
'strasse' => '::street::',
|
||||
'plz' => '12346',
|
||||
'ort' => '::location::',
|
||||
'version' => 40,
|
||||
'gruppierung' => 'SG Wald',
|
||||
]);
|
||||
|
||||
app(PullMemberAction::class)->handle(1000, 1001);
|
||||
|
||||
$group = Group::firstWhere('nami_id', 1000);
|
||||
$this->assertDatabaseHas('members', [
|
||||
'firstname' => '::firstname::',
|
||||
'lastname' => '::lastname::',
|
||||
'subscription_id' => Subscription::firstWhere('name', 'test')->id,
|
||||
'birthday' => '2014-07-11',
|
||||
'group_id' => Group::nami(1000)->id,
|
||||
'gender_id' => Gender::nami(303)->id,
|
||||
'nami_id' => 1001,
|
||||
'joined_at' => '2020-11-17',
|
||||
'country_id' => Country::nami(302)->id,
|
||||
'nationality_id' => Nationality::nami(1054)->id,
|
||||
'send_newspaper' => 1,
|
||||
'address' => '::street::',
|
||||
'zip' => '12346',
|
||||
'location' => '::location::',
|
||||
'version' => '40',
|
||||
]);
|
||||
|
||||
$this->assertDatabaseHas('groups', [
|
||||
'name' => 'SG Wald',
|
||||
'nami_id' => 1000,
|
||||
]);
|
||||
}
|
||||
|
||||
public function testRegionIdIsSetToNull(): void
|
||||
{
|
||||
Region::factory()->inNami(999)->name('nicht-de')->create(['is_null' => true]);
|
||||
app(MemberFake::class)->shows(1000, 1001, [
|
||||
'regionId' => 999,
|
||||
]);
|
||||
|
||||
app(PullMemberAction::class)->handle(1000, 1001);
|
||||
|
||||
$this->assertDatabaseHas('members', [
|
||||
'region_id' => null,
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature\Initialize;
|
||||
|
||||
use App\Actions\PullMembershipsAction;
|
||||
use App\Activity;
|
||||
use App\Country;
|
||||
use App\Fee;
|
||||
use App\Gender;
|
||||
use App\Group;
|
||||
use App\Member\Member;
|
||||
use App\Nationality;
|
||||
use App\Payment\Subscription;
|
||||
use App\Subactivity;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Tests\TestCase;
|
||||
use Zoomyboy\LaravelNami\Fakes\ActivityFake;
|
||||
use Zoomyboy\LaravelNami\Fakes\MembershipFake;
|
||||
use Zoomyboy\LaravelNami\Fakes\SubactivityFake;
|
||||
|
||||
class PullMembershipsActionTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
Subscription::factory()->name('test')->for(Fee::factory()->inNami(300))->create();
|
||||
Gender::factory()->inNami(303)->create();
|
||||
Country::factory()->inNami(302)->create();
|
||||
Nationality::factory()->inNami(1054)->create();
|
||||
$this->loginNami();
|
||||
}
|
||||
|
||||
public function testItDoesntSyncMembershipisWhenMemberHasNoNami(): void
|
||||
{
|
||||
$member = Member::factory()->defaults()->for(Group::factory()->inNami(1000)->name('SG Wald'))->create();
|
||||
|
||||
app(PullMembershipsAction::class)->handle($member);
|
||||
|
||||
Http::assertSentCount(0);
|
||||
}
|
||||
|
||||
public function testFetchMembershipViaOverviewIfMemberHasSameGroup(): void
|
||||
{
|
||||
$activity = Activity::factory()->inNami(1003)->name('Tätigkeit')->create();
|
||||
$member = Member::factory()->defaults()->for(Group::factory()->inNami(1000)->name('SG Wald'))->inNami(1001)->create();
|
||||
app(MembershipFake::class)->fetches(1001, [
|
||||
[
|
||||
'id' => 1077,
|
||||
'entries_aktivBis' => '',
|
||||
'entries_aktivVon' => '2021-08-22 00:00:00',
|
||||
'entries_taetigkeit' => 'Tätigkeit (1003)',
|
||||
'entries_gruppierung' => 'SG Wald',
|
||||
'entries_untergliederung' => '',
|
||||
],
|
||||
]);
|
||||
|
||||
app(PullMembershipsAction::class)->handle($member);
|
||||
|
||||
$group = Group::firstWhere('nami_id', 1000);
|
||||
$member = Member::nami(1001);
|
||||
$this->assertDatabaseHas('memberships', [
|
||||
'activity_id' => $activity->id,
|
||||
'subactivity_id' => null,
|
||||
'group_id' => $group->id,
|
||||
'from' => '2021-08-22',
|
||||
'nami_id' => 1077,
|
||||
]);
|
||||
}
|
||||
|
||||
public function testFetchMembershipsFromForeignGroup(): void
|
||||
{
|
||||
$activity = Activity::factory()->inNami(1003)->name('Tätigkeit')->create();
|
||||
$group = Group::factory()->inNami(1099)->name('Gruppe')->create();
|
||||
$member = Member::factory()->defaults()->for($group)->inNami(1001)->create();
|
||||
app(MembershipFake::class)->fetches(1001, [
|
||||
[
|
||||
'id' => 1077,
|
||||
'entries_aktivBis' => '',
|
||||
'entries_aktivVon' => '2021-08-22 00:00:00',
|
||||
'entries_taetigkeit' => 'Tätigkeit (1003)',
|
||||
'entries_gruppierung' => 'Gruppe',
|
||||
'entries_untergliederung' => '',
|
||||
],
|
||||
]);
|
||||
|
||||
app(PullMembershipsAction::class)->handle($member);
|
||||
|
||||
$this->assertDatabaseHas('memberships', [
|
||||
'group_id' => $group->id,
|
||||
'nami_id' => 1077,
|
||||
]);
|
||||
}
|
||||
|
||||
public function testFetchSingleMembership(): void
|
||||
{
|
||||
$member = Member::factory()->defaults()->for(Group::factory()->inNami(90))->inNami(1001)->create();
|
||||
$group = Group::factory()->inNami(1005)->name('Gruppe')->create();
|
||||
app(MembershipFake::class)->fetches(1001, [
|
||||
[
|
||||
'id' => 1077,
|
||||
'entries_aktivBis' => '',
|
||||
'entries_aktivVon' => '2021-08-22 00:00:00',
|
||||
'entries_taetigkeit' => 'ReferentIn (33)',
|
||||
'entries_gruppierung' => 'Gruppe',
|
||||
'entries_untergliederung' => '',
|
||||
],
|
||||
]);
|
||||
app(MembershipFake::class)->shows(1001, [
|
||||
'id' => 1077,
|
||||
'gruppierung' => 'Gruppe',
|
||||
'gruppierungId' => 1005,
|
||||
'taetigkeit' => 'ReferentIn',
|
||||
'taetigkeitId' => 33,
|
||||
'untergliederung' => 'Pfadfinder',
|
||||
'untergliederungId' => 55,
|
||||
'aktivVon' => '2021-08-22 00:00:00',
|
||||
'aktivBis' => '',
|
||||
]);
|
||||
app(ActivityFake::class)->fetches(1005, [['descriptor' => 'ReferentIn2', 'id' => 33]]);
|
||||
app(SubactivityFake::class)->fetches(33, [['descriptor' => 'Pfadfinder2', 'id' => 55]]);
|
||||
|
||||
app(PullMembershipsAction::class)->handle($member);
|
||||
|
||||
$this->assertDatabaseHas('activities', [
|
||||
'name' => 'ReferentIn2',
|
||||
'nami_id' => 33,
|
||||
]);
|
||||
$this->assertDatabaseHas('subactivities', [
|
||||
'name' => 'Pfadfinder2',
|
||||
'nami_id' => 55,
|
||||
]);
|
||||
$this->assertDatabaseHas('memberships', [
|
||||
'group_id' => $group->id,
|
||||
'activity_id' => Activity::nami(33)->id,
|
||||
'subactivity_id' => Subactivity::nami(55)->id,
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -1,112 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature\Member;
|
||||
|
||||
use App\Actions\MemberPullAction;
|
||||
use App\Member\Member;
|
||||
use App\Member\Membership;
|
||||
use App\Nationality;
|
||||
use App\Region;
|
||||
use App\Setting\NamiSettings;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Tests\TestCase;
|
||||
use Zoomyboy\LaravelNami\Fakes\CourseFake;
|
||||
use Zoomyboy\LaravelNami\Fakes\MemberFake;
|
||||
use Zoomyboy\LaravelNami\Fakes\MembershipFake;
|
||||
|
||||
class MemberPullActionTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function testItUpdatesMemberships(): void
|
||||
{
|
||||
$member = Member::factory()
|
||||
->defaults()
|
||||
->has(Membership::factory()->inNami(60)->in('€ LeiterIn', 63))
|
||||
->inNami(123)
|
||||
->create();
|
||||
app(MemberFake::class)->shows(55, 123, [
|
||||
'vorname' => '::firstname::',
|
||||
'nachname' => '::lastname::',
|
||||
'beitragsartId' => 300,
|
||||
'geburtsDatum' => '2014-07-11 00:00:00',
|
||||
'gruppierungId' => 1000,
|
||||
'id' => 123,
|
||||
'eintrittsdatum' => '2020-11-17 00:00:00',
|
||||
'geschlechtId' => 303,
|
||||
'landId' => 302,
|
||||
'staatsangehoerigkeitId' => $member->nationality->nami_id,
|
||||
'zeitschriftenversand' => true,
|
||||
'strasse' => '::street',
|
||||
'plz' => '12346',
|
||||
'ort' => '::location::',
|
||||
'gruppierung' => 'testgroup',
|
||||
'version' => 40,
|
||||
]);
|
||||
app(MembershipFake::class)
|
||||
->fetches(123, [['id' => 60]])
|
||||
->shows(123, [
|
||||
'id' => 60,
|
||||
'untergliederungId' => 2,
|
||||
'taetigkeitId' => 1,
|
||||
'gruppierungId' => 1400,
|
||||
'aktivVon' => '2022-02-03T00:00:00',
|
||||
'aktivBis' => '2022-02-03T00:00:01',
|
||||
]);
|
||||
app(CourseFake::class)->fetches(123, []);
|
||||
$this->withoutExceptionHandling()->login()->loginNami();
|
||||
|
||||
app(MemberPullAction::class)
|
||||
->api(app(NamiSettings::class)->login())
|
||||
->member(55, $member->nami_id)
|
||||
->execute();
|
||||
|
||||
$this->assertDatabaseMissing('memberships', [
|
||||
'member_id' => $member->id,
|
||||
]);
|
||||
}
|
||||
|
||||
public function testRegionIdIsSetToNull(): void
|
||||
{
|
||||
Nationality::factory()->inNami(1054)->create();
|
||||
Region::factory()->inNami(999)->name('nicht-de')->create(['is_null' => true]);
|
||||
app(MemberFake::class)->shows(55, 123, [
|
||||
'gruppierungId' => 55,
|
||||
'id' => 123,
|
||||
'regionId' => 999,
|
||||
]);
|
||||
app(MembershipFake::class)->fetches(123, []);
|
||||
app(CourseFake::class)->fetches(123, []);
|
||||
$this->withoutExceptionHandling()->login()->loginNami();
|
||||
|
||||
app(MemberPullAction::class)
|
||||
->api(app(NamiSettings::class)->login())
|
||||
->member(55, 123)
|
||||
->execute();
|
||||
|
||||
$this->assertDatabaseHas('members', [
|
||||
'region_id' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
public function testItSetsNormalAttributes(): void
|
||||
{
|
||||
Nationality::factory()->inNami(1054)->create();
|
||||
$region = Region::factory()->inNami(999)->name('nicht-de')->create(['is_null' => false]);
|
||||
app(MemberFake::class)->shows(55, 123, [
|
||||
'regionId' => 999,
|
||||
]);
|
||||
app(MembershipFake::class)->fetches(123, []);
|
||||
app(CourseFake::class)->fetches(123, []);
|
||||
$this->withoutExceptionHandling()->login()->loginNami();
|
||||
|
||||
app(MemberPullAction::class)
|
||||
->api(app(NamiSettings::class)->login())
|
||||
->member(55, 123)
|
||||
->execute();
|
||||
|
||||
$this->assertDatabaseHas('members', [
|
||||
'region_id' => $region->id,
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -8,6 +8,7 @@ use App\Setting\NamiSettings;
|
|||
use App\User;
|
||||
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Testing\TestResponse;
|
||||
use Phake;
|
||||
use Tests\Lib\TestsInertia;
|
||||
|
@ -106,4 +107,11 @@ abstract class TestCase extends BaseTestCase
|
|||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function fakeAllHttp(): self
|
||||
{
|
||||
Http::fake(['*' => Http::response('', 200)]);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue