End year procedures implementation #111

Merged
okorpheus merged 6 commits from EndYearProcedures into master 2025-05-30 03:13:24 +00:00
5 changed files with 68 additions and 10 deletions
Showing only changes of commit b5cb2a7870 - Show all commits

View File

@ -13,6 +13,7 @@ use App\Models\JudgeAdvancementVote;
use App\Models\NominationEnsembleEntry; use App\Models\NominationEnsembleEntry;
use App\Models\ScoreSheet; use App\Models\ScoreSheet;
use App\Models\Seat; use App\Models\Seat;
use App\Models\Student;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use function auth; use function auth;
@ -23,20 +24,20 @@ class YearEndCleanup
{ {
} }
public function __invoke(): void public function __invoke(array $options = []): void
{ {
$this->cleanup(); $this->cleanup($options);
} }
/** /**
* @param $options array array of reset options - possible values are deleteRooms * @param $options array array of reset options - possible values are deleteRooms
* removeAuditionsFromRoom unassignJudges * removeAuditionsFromRoom unassignJudges
* *
* @throws AuditionAdminException * @throws AuditionAdminException
*/ */
public function cleanup($options = []): true public function cleanup(array $options = []): true
{ {
if (! auth()->user() or ! auth()->user()->is_admin) { if (! auth()->user() or ! auth()->user()->is_admin) {
throw new AuditionAdminException('Only administrators may perform this action'); throw new AuditionAdminException('Only administrators may perform this action');
} }
@ -54,20 +55,22 @@ class YearEndCleanup
DB::table('entries')->delete(); DB::table('entries')->delete();
NominationEnsembleEntry::truncate(); NominationEnsembleEntry::truncate();
Student::query()->increment('grade');
if (in_array('deleteRooms', $options)) { if (in_array('deleteRooms', $options)) {
DB::table('auditions')->update(['room_id' => null]); DB::table('auditions')->update(['room_id' => null]);
DB::table('auditions')->update(['order_in_room' => null]); DB::table('auditions')->update(['order_in_room' => '0']);
DB::table('room_judges')->truncate(); DB::table('room_user')->truncate();
DB::table('rooms')->truncate(); DB::table('rooms')->delete();
} }
if (in_array('removeAuditionsFromRoom', $options)) { if (in_array('removeAuditionsFromRoom', $options)) {
DB::table('auditions')->update(['room_id' => null]); DB::table('auditions')->update(['room_id' => null]);
DB::table('auditions')->update(['order_in_room' => null]); DB::table('auditions')->update(['order_in_room' => '0']);
} }
if (in_array('unassignJudges', $options)) { if (in_array('unassignJudges', $options)) {
DB::table('room_judges')->truncate(); DB::table('room_user')->truncate();
} }
return true; return true;

View File

@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Actions\YearEndProcedures\YearEndCleanup;
use App\Http\Controllers\Controller;
use function auditionLog;
class YearEndResetController extends Controller
{
public function index()
{
return view('admin.year_end_reset');
}
public function execute()
{
$cleanUpProcedure = new YearEndCleanup;
$options = request()->options;
$cleanUpProcedure($options);
auditionLog('Executed year end reset.', []);
return redirect()->route('dashboard')->with('success', 'Year end reset completed');
}
}

View File

@ -0,0 +1,23 @@
<x-layout.app>
<x-layout.page-header>Year End Reset</x-layout.page-header>
<x-card.card class="mt-5 max-w-xl m-auto">
<x-card.heading>Reset Options</x-card.heading>
<x-form.form action="{{ route('admin.year_end_procedures') }}">
<x-form.checkbox name="options[]" label="Delete Rooms" value="deleteRooms" />
<x-form.checkbox name="options[]" label="Remove Auditions From Rooms" value="removeAuditionsFromRoom" />
<x-form.checkbox name="options[]" label="Unassign Judges" value="unassignJudges" />
<x-form.footer class="mb-3" x-data="{ 'showModal': false }" @keydown.escape="showModal = false">
<x-form.button type="button" @click="showModal = true">
Complete Year End Reset
</x-form.button>
<x-modal-body>
<x-slot:title>Confirm Year End Reset</x-slot:title>
Confirm you would like to perform a year end reset. This will delete all seats, scores, entries, and log entries,
as well as any optional data you chose. It will also increment the grade of all students in the database.
This action will result in data loss and cannot be undone.
<x-form.button class="mt-3">Confirm Reset</x-form.button>
</x-modal-body>
</x-form.footer>
</x-form.form>
</x-card.card>
</x-layout.app>

View File

@ -32,6 +32,7 @@
<a href="{{route('admin.export_results')}}" class="block p-2 hover:text-indigo-600">Export Results</a> <a href="{{route('admin.export_results')}}" class="block p-2 hover:text-indigo-600">Export Results</a>
<a href="{{route('admin.export_entries')}}" class="block p-2 hover:text-indigo-600">Export Entries</a> <a href="{{route('admin.export_entries')}}" class="block p-2 hover:text-indigo-600">Export Entries</a>
<a href="{{route('admin.print_stand_name_tags')}}" class="block p-2 hover:text-indigo-600">Print Stand Name Tags</a> <a href="{{route('admin.print_stand_name_tags')}}" class="block p-2 hover:text-indigo-600">Print Stand Name Tags</a>
<a href="{{route('admin.year_end_procedures')}}" class="block p-2 hover:text-indigo-600">Year End Reset</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -21,6 +21,7 @@ use App\Http\Controllers\Admin\SchoolController;
use App\Http\Controllers\Admin\ScoringGuideController; use App\Http\Controllers\Admin\ScoringGuideController;
use App\Http\Controllers\Admin\StudentController; use App\Http\Controllers\Admin\StudentController;
use App\Http\Controllers\Admin\UserController; use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Admin\YearEndResetController;
use App\Http\Middleware\CheckIfAdmin; use App\Http\Middleware\CheckIfAdmin;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@ -33,6 +34,10 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')->
Route::get('/recap', [RecapController::class, 'selectAudition'])->name('admin.recap.selectAudition'); Route::get('/recap', [RecapController::class, 'selectAudition'])->name('admin.recap.selectAudition');
Route::get('/recap/{audition}', [RecapController::class, 'showRecap'])->name('admin.recap.recap'); Route::get('/recap/{audition}', [RecapController::class, 'showRecap'])->name('admin.recap.recap');
// Year end prodecures
Route::get('/year_end_procedures', [YearEndResetController::class, 'index'])->name('admin.year_end_procedures');
Route::post('/year_end_procedures', [YearEndResetController::class, 'execute'])->name('admin.year_end_procedures');
Route::post('/auditions/roomUpdate', [ Route::post('/auditions/roomUpdate', [
AuditionController::class, 'roomUpdate', AuditionController::class, 'roomUpdate',
]); // Endpoint for JS assigning auditions to rooms ]); // Endpoint for JS assigning auditions to rooms