Skip to content

Commit

Permalink
fix: Various fixes for quarterly stats
Browse files Browse the repository at this point in the history
  • Loading branch information
CalumTowers committed Jan 14, 2025
1 parent ebc4429 commit dcb30e9
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 61 deletions.
74 changes: 35 additions & 39 deletions app/Filament/Pages/Operations/GenerateQuarterlyStats.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -1,32 +1,31 @@
<x-filament::page>
<form wire:submit.prevent="submit">
{{ $this->form }}

<x-filament::button type="submit" class="my-2">Submit</x-filament::button>
</form>

<div class="items-center" wire:loading.flex><x-filament::loading-indicator class="w-10 mx-auto" /></div>
<div class="items-center" wire:loading.flex>
<x-filament::loading-indicator class="w-10 mx-auto"/>
</div>
@if($this->statistics)
<x-filament::card wire:loading.remove>
<x-filament::section.heading>Results for {{$this->quarterMappings[$this->quarter]}} {{$this->year}}</x-filament.section::heading>
<table class="table text-center table-auto w-full">
<thead>
<tr>
<th>Statistic</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<x-filament::card wire:loading.remove>
<table class="table text-center table-auto w-full">
<tbody>

@foreach($this->statistics as $groupName => $statisticGroup)
<td colspan="2" class="text-left"><strong>{{ $groupName }}<br></strong></td>
@foreach($statisticGroup as $statistic)
<tr>
<td>{{ $statistic['name'] }}</td>
<td> {{ $statistic['value'] }}</td>
</tr>
@endforeach

@foreach($this->statistics as $statistic)
<tr>
<td>{{ $statistic['name'] }}</td>
<td>{{ $statistic['value'] }}</td>
</tr>
@endforeach
@endforeach

</tbody>
</table>
</x-filament::card>
</tbody>
</table>
</x-filament::card>
@endif
</x-filament::page>
28 changes: 28 additions & 0 deletions tests/Database/MockCtsDatabase.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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`;'
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ public function test_it_generates_stats()
'year' => '2020',
])
->call('submit')
->assertSee('Results for Q1 2020');
->assertOk();
}
}

0 comments on commit dcb30e9

Please sign in to comment.