From abbf6d155bf5ded05357111f861bbbd41d1cd398 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Thu, 31 Oct 2024 23:42:04 -0500 Subject: [PATCH] Implement results export Closes #79 --- app/Actions/Reports/GetExportData.php | 63 +++++++++++++++++++ .../Admin/ExportResultsController.php | 37 +++++++++++ .../layout/navbar/menus/admin.blade.php | 1 + routes/admin.php | 2 + 4 files changed, 103 insertions(+) create mode 100644 app/Actions/Reports/GetExportData.php create mode 100644 app/Http/Controllers/Admin/ExportResultsController.php diff --git a/app/Actions/Reports/GetExportData.php b/app/Actions/Reports/GetExportData.php new file mode 100644 index 0000000..a549699 --- /dev/null +++ b/app/Actions/Reports/GetExportData.php @@ -0,0 +1,63 @@ +getData(); + } + + public function getData() + { + // Audition, Rank, Name, School, Score, Flags or Seat + $ranker = App::make(RankAuditionEntries::class); + $exportRows = [ + 'Audition,Rank,Student Name,School,Score,Seat or Flag', + ]; + $events = Event::all(); + foreach ($events as $event) { + $auditions = $event->auditions; + foreach ($auditions as $audition) { + $entries = $ranker->rank('seating', $audition); + foreach ($entries as $entry) { + $thisRow = $audition->name.','; + $thisRow .= $entry->raw_rank ?? ''; + $thisRow .= ','; + $thisRow .= $entry->student->full_name().','; + $thisRow .= $entry->student->school->name.','; + $thisRow .= $entry->score_totals[0] ?? ''; + $thisRow .= ','; + if ($entry->hasFlag('failed_prelim')) { + $thisRow .= 'Failed Prelim'; + } elseif ($entry->hasFlag('no_show')) { + $thisRow .= 'No Show'; + } elseif ($entry->hasFlag('declined')) { + $thisRow .= 'Declined'; + } else { + $seat = Seat::where('entry_id', $entry->id)->first(); + if ($seat) { + $thisRow .= $seat->ensemble->name.' '.$seat->seat; + } else { + $thisRow .= ' '; + } + } + $exportRows[] = $thisRow; + } + } + } + + //dd($exportRows); + return $exportRows; + } +} diff --git a/app/Http/Controllers/Admin/ExportResultsController.php b/app/Http/Controllers/Admin/ExportResultsController.php new file mode 100644 index 0000000..b792100 --- /dev/null +++ b/app/Http/Controllers/Admin/ExportResultsController.php @@ -0,0 +1,37 @@ +getData(); + // Create a callback to write the CSV data + $callback = function () use ($data) { + $file = fopen('php://output', 'w'); + + foreach ($data as $line) { + // Convert the string into an array + $fields = explode(',', $line); + // Write the array to the CSV file + fputcsv($file, $fields); + } + + fclose($file); + }; + + // Return a response with the CSV content + return Response::stream($callback, 200, [ + 'Content-Type' => 'text/csv', + 'Content-Disposition' => 'attachment; filename="audition_export.csv"', + ]); + + } +} diff --git a/resources/views/components/layout/navbar/menus/admin.blade.php b/resources/views/components/layout/navbar/menus/admin.blade.php index f70c668..b397127 100644 --- a/resources/views/components/layout/navbar/menus/admin.blade.php +++ b/resources/views/components/layout/navbar/menus/admin.blade.php @@ -26,6 +26,7 @@ Students Entries View Logs + Export Results diff --git a/routes/admin.php b/routes/admin.php index fdbd25c..ad0af0a 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -9,6 +9,7 @@ use App\Http\Controllers\Admin\DrawController; use App\Http\Controllers\Admin\EnsembleController; use App\Http\Controllers\Admin\EntryController; use App\Http\Controllers\Admin\EventController; +use App\Http\Controllers\Admin\ExportResultsController; use App\Http\Controllers\Admin\PrintCards; use App\Http\Controllers\Admin\PrintRoomAssignmentsController; use App\Http\Controllers\Admin\PrintSignInSheetsController; @@ -23,6 +24,7 @@ use Illuminate\Support\Facades\Route; Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')->group(function () { Route::view('/', 'admin.dashboard')->name('admin.dashboard'); Route::get('/logs', App\Http\Controllers\Admin\LogViewer::class)->name('admin.view_logs'); + Route::get('/export_results', ExportResultsController::class)->name('admin.export_results'); Route::post('/auditions/roomUpdate', [ AuditionController::class, 'roomUpdate',