From dcb30e9567e04d4c751dda0b496875fa1a12df1c Mon Sep 17 00:00:00 2001 From: Calum Towers Date: Tue, 14 Jan 2025 16:00:02 +0000 Subject: [PATCH] fix: Various fixes for quarterly stats --- .../Operations/GenerateQuarterlyStats.php | 74 +++++++++---------- .../generate-quarterly-stats.blade.php | 41 +++++----- tests/Database/MockCtsDatabase.php | 28 +++++++ .../GenerateQuarterlyStatsPageTest.php | 2 +- 4 files changed, 84 insertions(+), 61 deletions(-) diff --git a/app/Filament/Pages/Operations/GenerateQuarterlyStats.php b/app/Filament/Pages/Operations/GenerateQuarterlyStats.php index 3c7ee91e15..078fb4e060 100644 --- a/app/Filament/Pages/Operations/GenerateQuarterlyStats.php +++ b/app/Filament/Pages/Operations/GenerateQuarterlyStats.php @@ -3,7 +3,6 @@ namespace App\Filament\Pages\Operations; use App\Filament\Helpers\Pages\BasePage; -use App\Models\Atc\PositionGroup; use App\Models\Mship\Account; use App\Models\Mship\Account\Endorsement; use Carbon\Carbon; @@ -61,19 +60,18 @@ public function submit(): void $endDate = $startDate->copy()->addMonths(3); $this->statistics = collect([ - ['name' => 'Left Division', 'value' => $this->membersLeftDivision($startDate, $endDate)], - ['name' => 'Pilots Visiting', 'value' => $this->pilotsVisiting($startDate, $endDate)], - ['name' => 'New Joiners as First Division', 'value' => $this->newJoinersAsFirstDivision($startDate, $endDate)], - ['name' => 'Members Becoming Inactive', 'value' => $this->membersBecomingInactive($startDate, $endDate)], - ['name' => 'Visiting Controllers Above S1', 'value' => $this->visitingControllersAboveS1($startDate, $endDate)], - ['name' => 'Completed Transfer (Ex OBS)', 'value' => $this->completedTransfersExObs($startDate, $endDate)], - ])->merge(collect(['OBS', 'TWR', 'APP', 'CTR'])->map(function ($value) use ($startDate, $endDate) { - return ['name' => "Completed 121 Mentoring Sessions - {$value}", 'value' => $this->completedMentoringSessions($startDate, $endDate, $value)]; - }))->merge(collect(['TWR', 'APP', 'CTR'])->map(function ($value) use ($startDate, $endDate) { - return ['name' => "Exam Pass - {$value}", 'value' => $this->examPasses($startDate, $endDate, $value)]; - })->merge(collect(['GND', 'TWR', 'APP'])->map(function ($value) use ($startDate, $endDate) { - return ['name' => "Issued Heathrow Endorsement - {$value}", 'value' => $this->issuedHeathrowEndorsements($startDate, $endDate, $value)]; - }))); + 'Division Membership' => [ + ['name' => 'Left Division', 'value' => $this->membersLeftDivision($startDate, $endDate)], + ['name' => 'Pilots Visiting', 'value' => $this->pilotsVisiting($startDate, $endDate)], + ['name' => 'New Joiners as First Division', 'value' => $this->newJoinersAsFirstDivision($startDate, $endDate)], + ['name' => 'Members Becoming Inactive', 'value' => $this->membersBecomingInactive($startDate, $endDate)], + ['name' => 'Visiting Controllers Above S1', 'value' => $this->visitingControllersAboveS1($startDate, $endDate)], + ['name' => 'Completed Transfer (Ex OBS)', 'value' => $this->completedTransfersExObs($startDate, $endDate)], + ], + 'Completed Mentoring Sessions' => $this->completedMentoringSessions($startDate, $endDate), + 'Exam Passes' => $this->examPasses($startDate, $endDate), + 'Issued Position Group Endorsements' => $this->issuedPositionGroupEndorsements($startDate, $endDate), + ]); } protected static function canUse(): bool @@ -147,45 +145,43 @@ private function visitingControllersAboveS1($startDate, $endDate) })->count(); } - private function completedMentoringSessions(Carbon $startDate, Carbon $endDate, string $type) + private function completedMentoringSessions(Carbon $startDate, Carbon $endDate) { - $studentRating = match ($type) { - 'OBS' => 1, - 'TWR' => 2, - 'APP' => 3, - 'CTR' => 4 - }; - return DB::connection('cts') ->table('sessions') + ->select('rts.name', DB::raw('count(*) as total')) + ->join('rts', 'sessions.rts_id', '=', 'rts.id') ->whereBetween('taken_date', [$startDate, $endDate]) ->whereNull('cancelled_datetime') - ->where('position', 'LIKE', "%$type%") - ->where('student_rating', '=', $studentRating) - ->count(); + ->where('noShow', '=', 0) + ->groupBy('rts_id') + ->get() + ->flatMap(fn ($value) => [['name' => $value->name, 'value' => $value->total]]) + ->toArray(); } - private function issuedHeathrowEndorsements(Carbon $startDate, Carbon $endDate, string $type) + private function issuedPositionGroupEndorsements(Carbon $startDate, Carbon $endDate) { - $positionGroup = match ($type) { - 'GND' => 18, - 'TWR' => 10, - 'APP' => 11 - }; - - return Endorsement::whereBetween('created_at', [$startDate, $endDate]) - ->whereEndorsableType(PositionGroup::class) - ->whereEndorsableId($positionGroup) - ->count(); + return Endorsement::with('endorsable') + ->whereBetween('mship_account_endorsement.created_at', [$startDate, $endDate]) + ->join('position_groups', 'position_groups.id', 'mship_account_endorsement.endorsable_id') + ->groupBy('position_groups.id', 'position_groups.name') + ->select(['position_groups.name', 'position_groups.id', DB::raw('count(*) as total')]) + ->get() + ->flatMap(fn ($value) => [['name' => $value->name, 'value' => $value->total]]) + ->toArray(); } - private function examPasses(Carbon $startDate, Carbon $endDate, string $type) + private function examPasses(Carbon $startDate, Carbon $endDate) { return DB::connection('cts') ->table('practical_results') + ->select('exam', DB::raw('count(*) as total')) ->whereBetween('date', [$startDate, $endDate]) ->where('result', '=', 'P') - ->where('exam', '=', $type) - ->count(); + ->groupBy('exam') + ->get() + ->flatMap(fn ($value) => [['name' => $value->exam, 'value' => $value->total]]) + ->toArray(); } } diff --git a/resources/views/filament/pages/operations/generate-quarterly-stats.blade.php b/resources/views/filament/pages/operations/generate-quarterly-stats.blade.php index c1ab78e8e5..22d9e8382d 100644 --- a/resources/views/filament/pages/operations/generate-quarterly-stats.blade.php +++ b/resources/views/filament/pages/operations/generate-quarterly-stats.blade.php @@ -1,32 +1,31 @@
{{ $this->form }} - + Submit
-
+
+ +
@if($this->statistics) - - Results for {{$this->quarterMappings[$this->quarter]}} {{$this->year}} - - - - - - - - + +
StatisticValue
+ + + @foreach($this->statistics as $groupName => $statisticGroup) + + @foreach($statisticGroup as $statistic) + + + + + @endforeach - @foreach($this->statistics as $statistic) - - - - - @endforeach + @endforeach - -
{{ $groupName }}
{{ $statistic['name'] }} {{ $statistic['value'] }}
{{ $statistic['name'] }}{{ $statistic['value'] }}
-
+ + + @endif
diff --git a/tests/Database/MockCtsDatabase.php b/tests/Database/MockCtsDatabase.php index 8b69515de4..523e47d38c 100644 --- a/tests/Database/MockCtsDatabase.php +++ b/tests/Database/MockCtsDatabase.php @@ -274,6 +274,30 @@ public static function create() KEY `mentor_id` (`mentor_id`) ) ENGINE=InnoDB AUTO_INCREMENT=62862 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;" ); + + DB::connection('cts')->statement( + "CREATE TABLE `rts` ( + `id` smallint unsigned NOT NULL AUTO_INCREMENT, + `forum_mentor_group` int NOT NULL, + `name` varchar(30) NOT NULL DEFAULT '', + `helpdesk` tinyint(1) NOT NULL, + `email` varchar(50) DEFAULT NULL, + `opened_by` int unsigned NOT NULL DEFAULT '0', + `opened_date` date NOT NULL DEFAULT '0000-00-00', + `edit_by` int unsigned DEFAULT NULL, + `edit_date` datetime DEFAULT NULL, + `full` smallint NOT NULL DEFAULT '0', + `cfg_sequence` tinyint(1) NOT NULL, + `allow_home` tinyint(1) NOT NULL DEFAULT '1', + `allow_visit` tinyint(1) NOT NULL DEFAULT '0', + `min_home_rating` tinyint NOT NULL, + `allow_area` tinyint(1) NOT NULL DEFAULT '0', + `min_area_rating` tinyint NOT NULL DEFAULT '12', + `min_visit_rating` tinyint NOT NULL DEFAULT '0', + `start_count` smallint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;" + ); } public static function destroy() @@ -325,5 +349,9 @@ public static function destroy() DB::connection('cts')->statement( 'DROP TABLE IF EXISTS `sessions`;' ); + + DB::connection('cts')->statement( + 'DROP TABLE IF EXISTS `rts`;' + ); } } diff --git a/tests/Feature/Admin/Pages/Operations/GenerateQuarterlyStatsPageTest.php b/tests/Feature/Admin/Pages/Operations/GenerateQuarterlyStatsPageTest.php index 183f06883c..19b9824379 100644 --- a/tests/Feature/Admin/Pages/Operations/GenerateQuarterlyStatsPageTest.php +++ b/tests/Feature/Admin/Pages/Operations/GenerateQuarterlyStatsPageTest.php @@ -26,6 +26,6 @@ public function test_it_generates_stats() 'year' => '2020', ]) ->call('submit') - ->assertSee('Results for Q1 2020'); + ->assertOk(); } }