From 3d395b1981f973c860737d784828c4a24a07b5e3 Mon Sep 17 00:00:00 2001 From: philipp lang <philipp@aweos.de> Date: Tue, 6 Sep 2022 01:25:04 +0200 Subject: [PATCH] Add leader lilie --- app/Http/Views/MemberView.php | 2 +- app/Member/Member.php | 7 +++++++ app/Member/MemberResource.php | 1 + database/factories/SubactivityFactory.php | 5 +++++ resources/js/views/member/VIndex.vue | 10 ++++++++-- tests/Feature/Member/IndexTest.php | 7 +++++-- 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/Http/Views/MemberView.php b/app/Http/Views/MemberView.php index 8415c1e0..7bb388f6 100644 --- a/app/Http/Views/MemberView.php +++ b/app/Http/Views/MemberView.php @@ -25,7 +25,7 @@ class MemberView 'data' => MemberResource::collection(Member::select('*') ->filter($filter)->search($request->query('search', null)) ->with('billKind')->with('payments')->with('memberships')->with('courses') - ->withSubscriptionName()->withIsConfirmed()->withPendingPayment()->withAgeGroup() + ->withSubscriptionName()->withIsConfirmed()->withPendingPayment()->withAgeGroup()->withIsLeader() ->orderByRaw('lastname, firstname') ->paginate(15) ), diff --git a/app/Member/Member.php b/app/Member/Member.php index 105a749c..ffac1fa7 100644 --- a/app/Member/Member.php +++ b/app/Member/Member.php @@ -28,6 +28,7 @@ use Zoomyboy\LaravelNami\Data\MembershipEntry; * @property int $pending_payment * @property bool $is_confirmed * @property string $age_group_icon + * @property bool $is_leader * @property \Carbon\Carbon $try_created_at */ class Member extends Model @@ -55,6 +56,7 @@ class Member extends Model 'has_vk' => 'boolean', 'multiply_pv' => 'boolean', 'multiply_more_pv' => 'boolean', + 'is_leader' => 'boolean', ]; public function scopeSearch(Builder $q, ?string $text): Builder @@ -252,6 +254,11 @@ class Member extends Model ]); } + public function scopeWithIsLeader(Builder $q): Builder + { + return $q->selectSub('EXISTS(SELECT memberships.id FROM memberships INNER JOIN activities ON activities.id=memberships.activity_id INNER JOIN subactivities ON subactivities.id=memberships.subactivity_id WHERE members.id=memberships.member_id AND subactivities.is_age_group=1 AND activities.has_efz=1)', 'is_leader'); + } + public function scopeWhereHasPendingPayment(Builder $q): Builder { return $q->whereHas('payments', function (Builder $q): void { diff --git a/app/Member/MemberResource.php b/app/Member/MemberResource.php index 51ef0765..2f8c5bf6 100644 --- a/app/Member/MemberResource.php +++ b/app/Member/MemberResource.php @@ -72,6 +72,7 @@ class MemberResource extends JsonResource 'multiply_pv' => $this->multiply_pv, 'multiply_more_pv' => $this->multiply_more_pv, 'age' => $this->getModel()->getAge(), + 'is_leader' => $this->is_leader, ]; } } diff --git a/database/factories/SubactivityFactory.php b/database/factories/SubactivityFactory.php index 91ae064e..030f719a 100644 --- a/database/factories/SubactivityFactory.php +++ b/database/factories/SubactivityFactory.php @@ -29,4 +29,9 @@ class SubactivityFactory extends Factory { return $this->state(['nami_id' => $namiId]); } + + public function ageGroup(): self + { + return $this->state(['is_age_group' => true]); + } } diff --git a/resources/js/views/member/VIndex.vue b/resources/js/views/member/VIndex.vue index 1a8e3eb9..2227ff2b 100644 --- a/resources/js/views/member/VIndex.vue +++ b/resources/js/views/member/VIndex.vue @@ -25,9 +25,15 @@ </thead> <tr v-for="(member, index) in data.data" :key="index"> - <td class="w-3"> + <td class="w-3 flex gap-1"> <svg-sprite - class="w-3 h-3" + class="w-3 h-3 flex-none" + v-if="member.is_leader" + :class="ageColors.leiter" + src="lilie" + ></svg-sprite> + <svg-sprite + class="w-3 h-3 flex-none" v-if="member.age_group_icon" :class="ageColors[member.age_group_icon]" src="lilie" diff --git a/tests/Feature/Member/IndexTest.php b/tests/Feature/Member/IndexTest.php index 53f94989..016a93a1 100644 --- a/tests/Feature/Member/IndexTest.php +++ b/tests/Feature/Member/IndexTest.php @@ -53,11 +53,11 @@ class IndexTest extends TestCase $this->login()->loginNami(); $member = Member::factory() ->defaults() - ->has(Membership::factory()->for(Subactivity::factory())->for(Activity::factory()->state(['has_efz' => true]))) + ->has(Membership::factory()->for(Subactivity::factory()->ageGroup())->for(Activity::factory()->state(['has_efz' => true]))) ->create(['lastname' => 'A']); Member::factory() ->defaults() - ->has(Membership::factory()->for(Subactivity::factory())->for(Activity::factory()->state(['has_efz' => false]))) + ->has(Membership::factory()->for(Subactivity::factory()->ageGroup())->for(Activity::factory()->state(['has_efz' => false]))) ->create(['lastname' => 'B']); Member::factory() ->defaults() @@ -68,5 +68,8 @@ class IndexTest extends TestCase $this->assertInertiaHas(url("/member/{$member->id}/efz"), $response, 'data.data.0.efz_link'); $this->assertInertiaHas(null, $response, 'data.data.1.efz_link'); $this->assertInertiaHas(null, $response, 'data.data.2.efz_link'); + $this->assertInertiaHas(true, $response, 'data.data.0.is_leader'); + $this->assertInertiaHas(false, $response, 'data.data.1.is_leader'); + $this->assertInertiaHas(false, $response, 'data.data.2.is_leader'); } }