From 9115da8f77033028e6b3782f58558ceaaf77eba8 Mon Sep 17 00:00:00 2001 From: philipp lang <philipp@aweos.de> Date: Mon, 23 Aug 2021 01:26:46 +0200 Subject: [PATCH] Add group stats --- app/Activity.php | 2 +- app/Http/Views/HomeView.php | 19 ++++++++--- ...629_create_activities_is_member_column.php | 34 +++++++++++++++++++ resources/js/views/home/Index.vue | 7 ++++ 4 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 database/migrations/2021_08_22_231629_create_activities_is_member_column.php diff --git a/app/Activity.php b/app/Activity.php index 1c998efb..b19dac9d 100644 --- a/app/Activity.php +++ b/app/Activity.php @@ -11,7 +11,7 @@ class Activity extends Model use HasNamiField; - public $fillable = ['name', 'is_filterable', 'nami_id']; + public $fillable = ['is_member', 'name', 'is_filterable', 'nami_id']; public $timestamps = false; public $casts = [ diff --git a/app/Http/Views/HomeView.php b/app/Http/Views/HomeView.php index 1c27f607..6ccf0b28 100644 --- a/app/Http/Views/HomeView.php +++ b/app/Http/Views/HomeView.php @@ -2,26 +2,35 @@ namespace App\Http\Views; -use App\Member\MemberResource; use App\Member\Member; -use Illuminate\Http\Request; +use App\Member\MemberResource; +use App\Payment\Payment; +use App\Payment\PaymentResource; use App\Payment\Status; use App\Payment\Subscription; -use App\Payment\PaymentResource; -use App\Payment\Payment; +use Illuminate\Http\Request; class HomeView { public function index(Request $request) { $amount = Payment::whereNeedsPayment()->selectRaw('sum(subscriptions.amount) AS a')->join('subscriptions', 'subscriptions.id', 'payments.subscription_id')->first()->a; $members = Member::whereHasPendingPayment()->count(); + return [ 'data' => [ 'payments' => [ 'users' => $members, 'all_users' => Member::count(), 'amount' => number_format($amount / 100, 2, ',', '.').' €' - ] + ], + 'groups' => Member::select('subactivities.slug', 'subactivities.name')->selectRaw('COUNT(members.id) AS count')->join('memberships', 'memberships.member_id', 'members.id') + ->join('activities', 'memberships.activity_id', 'activities.id') + ->join('subactivities', 'memberships.subactivity_id', 'subactivities.id') + ->where('subactivities.is_age_group', true) + ->where('activities.is_member', true) + ->groupBy('subactivities.name', 'subactivities.slug') + ->orderBy('subactivities.id') + ->get() ] ]; } diff --git a/database/migrations/2021_08_22_231629_create_activities_is_member_column.php b/database/migrations/2021_08_22_231629_create_activities_is_member_column.php new file mode 100644 index 00000000..47b87623 --- /dev/null +++ b/database/migrations/2021_08_22_231629_create_activities_is_member_column.php @@ -0,0 +1,34 @@ +<?php + +use App\Activity; +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +class CreateActivitiesIsMemberColumn extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::table('activities', function (Blueprint $table) { + $table->boolean('is_member')->default(false); + }); + Activity::whereIn('name', ['€ Mitglied', 'Schnuppermitgliedschaft'])->update(['is_member' => true]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $table->dropColumn('is_member'); + }); + } +} diff --git a/resources/js/views/home/Index.vue b/resources/js/views/home/Index.vue index f99fc2fb..903ca804 100644 --- a/resources/js/views/home/Index.vue +++ b/resources/js/views/home/Index.vue @@ -6,6 +6,13 @@ <span class="text-sm" v-text="`von ${data.payments.users} / ${data.payments.all_users} Mitgliedern`"></span> </div> </block> + <block title="Gruppierungs-Verteilung"> + <div v-for="group in data.groups" class="flex mt-2 items-center leading-none text-gray-100"> + <sprite class="w-4 h-4 mr-2" src="lilie" :class="`text-${group.slug}`"></sprite> + <span v-text="group.name" class="flex-grow"></span> + <span v-text="group.count"></span> + </div> + </block> </div> </template>