adrema/modules/Member/AgeGroupCountBlock.php

82 lines
2.3 KiB
PHP

<?php
namespace Modules\Member;
use Modules\Dashboard\Block;
use App\Member\Membership;
use Illuminate\Database\Eloquent\Builder;
class AgeGroupCountBlock extends Block
{
public $groups;
/**
* @return Builder<Membership>
*/
protected function memberQuery(): Builder
{
return Membership::select('subactivities.slug', 'subactivities.name')
->selectRaw('COUNT(member_id) AS count')
->join('activities', 'memberships.activity_id', 'activities.id')
->join('subactivities', 'memberships.subactivity_id', 'subactivities.id')
->isAgeGroup()
->isMember()
->active()
->groupBy('subactivities.slug', 'subactivities.name')
->orderBy('subactivity_id');
}
/**
* @return Builder<Membership>
*/
protected function leaderQuery(): Builder
{
return Membership::selectRaw('"leiter" AS slug, "Leiter" AS name, COUNT(member_id) AS count')
->join('activities', 'memberships.activity_id', 'activities.id')
->join('subactivities', 'memberships.subactivity_id', 'subactivities.id')
->active()
->isLeader();
}
public function mount(): void
{
$this->groups = [
...$this->memberQuery()->get(),
...$this->leaderQuery()->get(),
];
}
public function title(): string
{
return 'Gruppierungs-Verteilung';
}
public function groupColor(string $slug): string
{
return data_get([
'biber' => 'text-biber',
'woelfling' => 'text-woelfling',
'jungpfadfinder' => 'text-jungpfadfinder',
'pfadfinder' => 'text-pfadfinder',
'rover' => 'text-rover',
'leiter' => 'text-leiter',
], $slug);
}
public function render(): string
{
return <<<'HTML'
<div>
@foreach($groups as $group)
<div class="flex mt-2 items-center leading-none text-gray-100">
<x-ui::sprite class="w-4 h-4 mr-2 {{ $this->groupColor($group->slug) }}" src="lilie"></x-ui::sprite>
<span class="grow">{{$group->name}}</span>
<span>{{$group->count}}</span>
</div>
@endforeach
</div>
HTML;
}
}