auditionadmin/app/Http/Controllers/Tabulation/TabulationController.php

102 lines
3.4 KiB
PHP

<?php
namespace App\Http\Controllers\Tabulation;
use App\Http\Controllers\Controller;
use App\Models\Audition;
use App\Models\Seat;
use App\Services\DoublerService;
use App\Services\SeatingService;
use App\Services\TabulationService;
use Illuminate\Http\Request;
use function compact;
class TabulationController extends Controller
{
protected $tabulationService;
protected $doublerService;
protected $seatingService;
public function __construct(TabulationService $tabulationService, DoublerService $doublerService, SeatingService $seatingService)
{
$this->tabulationService = $tabulationService;
$this->doublerService = $doublerService;
$this->seatingService = $seatingService;
}
public function status()
{
$auditions = $this->tabulationService->getAuditionsWithStatus();
return view('tabulation.status', compact('auditions'));
}
public function auditionSeating(Request $request, Audition $audition)
{
if ($request->method() == 'POST') {
$requestedEnsembleAccepts = $request->input('ensembleAccept');
} else {
$requestedEnsembleAccepts = false;
}
$entries = $this->tabulationService->auditionEntries($audition->id);
$doublerComplete = true;
foreach ($entries as $entry) {
if ($this->doublerService->studentIsDoubler($entry->student_id)) { // If this entry is a doubler
if ($this->doublerService->getDoublerInfo($entry->student_id)[$entry->id]['status'] === 'undecided') { // If there is no decision for this entry
$doublerComplete = false;
}
}
}
$scoringComplete = $entries->every(function ($entry) {
return $entry->scoring_complete;
});
$ensembleLimits = $this->seatingService->getLimitForAudition($audition->id);
$auditionComplete = $scoringComplete && $doublerComplete;
$seatableEntries = $this->seatingService->getSeatableEntries($audition->id);
return view('tabulation.auditionSeating', compact('audition',
'entries',
'scoringComplete',
'doublerComplete',
'auditionComplete',
'ensembleLimits',
'seatableEntries',
'requestedEnsembleAccepts'));
}
public function publishSeats(Request $request, Audition $audition)
{
// TODO move this to SeatingService
$sessionKey = 'audition'.$audition->id.'seatingProposal';
$seats = $request->session()->get($sessionKey);
foreach ($seats as $seat) {
Seat::create([
'ensemble_id' => $seat['ensemble_id'],
'audition_id' => $seat['audition_id'],
'seat' => $seat['seat'],
'entry_id' => $seat['entry_id'],
]);
}
$audition->addFlag('seats_published');
$request->session()->forget($sessionKey);
return redirect()->route('tabulation.audition.seat', ['audition' => $audition->id]);
}
public function unpublishSeats(Request $request, Audition $audition)
{
// TODO move this to SeatingService
$this->seatingService->forgetSeatsForAudition($audition->id);
Seat::where('audition_id', $audition->id)->delete();
$audition->removeFlag('seats_published');
return redirect()->route('tabulation.audition.seat', ['audition' => $audition->id]);
}
}