Type Ratings | New Feature (#1360)
* Type Ratings Adding "Type Rating" definition and assignment possibility to v7 core. * Update ProfileController.php * StyleFix 1 * Update settings.yml Change description text as requested
This commit is contained in:
@@ -17,6 +17,7 @@ use App\Repositories\AircraftRepository;
|
||||
use App\Repositories\FareRepository;
|
||||
use App\Repositories\RankRepository;
|
||||
use App\Repositories\SubfleetRepository;
|
||||
use App\Repositories\TypeRatingRepository;
|
||||
use App\Services\ExportService;
|
||||
use App\Services\FareService;
|
||||
use App\Services\FleetService;
|
||||
@@ -36,26 +37,29 @@ class SubfleetController extends Controller
|
||||
private $importSvc;
|
||||
private $rankRepo;
|
||||
private $subfleetRepo;
|
||||
private $typeratingRepo;
|
||||
|
||||
/**
|
||||
* SubfleetController constructor.
|
||||
*
|
||||
* @param AircraftRepository $aircraftRepo
|
||||
* @param FleetService $fleetSvc
|
||||
* @param FareRepository $fareRepo
|
||||
* @param FareService $fareSvc
|
||||
* @param ImportService $importSvc
|
||||
* @param RankRepository $rankRepo
|
||||
* @param SubfleetRepository $subfleetRepo
|
||||
* @param AircraftRepository $aircraftRepo
|
||||
* @param FareRepository $fareRepo
|
||||
* @param FareService $fareSvc
|
||||
* @param FleetService $fleetSvc
|
||||
* @param ImportService $importSvc
|
||||
* @param RankRepository $rankRepo
|
||||
* @param SubfleetRepository $subfleetRepo
|
||||
* @param TypeRatingRepository $typeratingRepo
|
||||
*/
|
||||
public function __construct(
|
||||
AircraftRepository $aircraftRepo,
|
||||
FleetService $fleetSvc,
|
||||
FareRepository $fareRepo,
|
||||
FareService $fareSvc,
|
||||
FleetService $fleetSvc,
|
||||
ImportService $importSvc,
|
||||
RankRepository $rankRepo,
|
||||
SubfleetRepository $subfleetRepo
|
||||
SubfleetRepository $subfleetRepo,
|
||||
TypeRatingRepository $typeratingRepo
|
||||
) {
|
||||
$this->aircraftRepo = $aircraftRepo;
|
||||
$this->fareRepo = $fareRepo;
|
||||
@@ -64,48 +68,7 @@ class SubfleetController extends Controller
|
||||
$this->importSvc = $importSvc;
|
||||
$this->rankRepo = $rankRepo;
|
||||
$this->subfleetRepo = $subfleetRepo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ranks that are available to the subfleet
|
||||
*
|
||||
* @param $subfleet
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getAvailRanks($subfleet)
|
||||
{
|
||||
$retval = [];
|
||||
$all_ranks = $this->rankRepo->all();
|
||||
$avail_ranks = $all_ranks->except($subfleet->ranks->modelKeys());
|
||||
foreach ($avail_ranks as $rank) {
|
||||
$retval[$rank->id] = $rank->name;
|
||||
}
|
||||
|
||||
return $retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the fares that haven't been assigned to a given subfleet
|
||||
*
|
||||
* @param mixed $subfleet
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getAvailFares($subfleet)
|
||||
{
|
||||
$retval = [];
|
||||
$all_fares = $this->fareRepo->all();
|
||||
$avail_fares = $all_fares->except($subfleet->fares->modelKeys());
|
||||
foreach ($avail_fares as $fare) {
|
||||
$retval[$fare->id] = $fare->name.
|
||||
' (price: '.$fare->price.
|
||||
', type: '.FareType::label($fare->type).
|
||||
', cost: '.$fare->cost.
|
||||
', capacity: '.$fare->capacity.')';
|
||||
}
|
||||
|
||||
return $retval;
|
||||
$this->typeratingRepo = $typeratingRepo;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -152,8 +115,8 @@ class SubfleetController extends Controller
|
||||
{
|
||||
$input = $request->all();
|
||||
$subfleet = $this->subfleetRepo->create($input);
|
||||
|
||||
Flash::success('Subfleet saved successfully.');
|
||||
|
||||
return redirect(route('admin.subfleets.edit', [$subfleet->id]));
|
||||
}
|
||||
|
||||
@@ -172,10 +135,12 @@ class SubfleetController extends Controller
|
||||
|
||||
if (empty($subfleet)) {
|
||||
Flash::error('Subfleet not found');
|
||||
|
||||
return redirect(route('admin.subfleets.index'));
|
||||
}
|
||||
|
||||
$avail_fares = $this->getAvailFares($subfleet);
|
||||
|
||||
return view('admin.subfleets.show', [
|
||||
'subfleet' => $subfleet,
|
||||
'avail_fares' => $avail_fares,
|
||||
@@ -192,24 +157,27 @@ class SubfleetController extends Controller
|
||||
public function edit($id)
|
||||
{
|
||||
$subfleet = $this->subfleetRepo
|
||||
->with(['fares', 'ranks'])
|
||||
->with(['fares', 'ranks', 'typeratings'])
|
||||
->findWithoutFail($id);
|
||||
|
||||
if (empty($subfleet)) {
|
||||
Flash::error('Subfleet not found');
|
||||
|
||||
return redirect(route('admin.subfleets.index'));
|
||||
}
|
||||
|
||||
$avail_fares = $this->getAvailFares($subfleet);
|
||||
$avail_ranks = $this->getAvailRanks($subfleet);
|
||||
$avail_ratings = $this->getAvailTypeRatings($subfleet);
|
||||
|
||||
return view('admin.subfleets.edit', [
|
||||
'airlines' => Airline::all()->pluck('name', 'id'),
|
||||
'hubs' => Airport::where('hub', 1)->pluck('name', 'id'),
|
||||
'fuel_types' => FuelType::labels(),
|
||||
'avail_fares' => $avail_fares,
|
||||
'avail_ranks' => $avail_ranks,
|
||||
'subfleet' => $subfleet,
|
||||
'airlines' => Airline::all()->pluck('name', 'id'),
|
||||
'hubs' => Airport::where('hub', 1)->pluck('name', 'id'),
|
||||
'fuel_types' => FuelType::labels(),
|
||||
'avail_fares' => $avail_fares,
|
||||
'avail_ranks' => $avail_ranks,
|
||||
'avail_ratings' => $avail_ratings,
|
||||
'subfleet' => $subfleet,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -229,12 +197,13 @@ class SubfleetController extends Controller
|
||||
|
||||
if (empty($subfleet)) {
|
||||
Flash::error('Subfleet not found');
|
||||
|
||||
return redirect(route('admin.subfleets.index'));
|
||||
}
|
||||
|
||||
$this->subfleetRepo->update($request->all(), $id);
|
||||
|
||||
Flash::success('Subfleet updated successfully.');
|
||||
|
||||
return redirect(route('admin.subfleets.index'));
|
||||
}
|
||||
|
||||
@@ -251,6 +220,7 @@ class SubfleetController extends Controller
|
||||
|
||||
if (empty($subfleet)) {
|
||||
Flash::error('Subfleet not found');
|
||||
|
||||
return redirect(route('admin.subfleets.index'));
|
||||
}
|
||||
|
||||
@@ -259,12 +229,13 @@ class SubfleetController extends Controller
|
||||
$aircraft = $this->aircraftRepo->findWhere(['subfleet_id' => $id], ['id']);
|
||||
if ($aircraft->count() > 0) {
|
||||
Flash::error('There are aircraft still assigned to this subfleet, you can\'t delete it!')->important();
|
||||
|
||||
return redirect(route('admin.subfleets.index'));
|
||||
}
|
||||
|
||||
$this->subfleetRepo->delete($id);
|
||||
|
||||
Flash::success('Subfleet deleted successfully.');
|
||||
|
||||
return redirect(route('admin.subfleets.index'));
|
||||
}
|
||||
|
||||
@@ -281,11 +252,8 @@ class SubfleetController extends Controller
|
||||
$subfleets = $this->subfleetRepo->all();
|
||||
|
||||
$path = $exporter->exportSubfleets($subfleets);
|
||||
return response()
|
||||
->download($path, 'subfleets.csv', [
|
||||
'content-type' => 'text/csv',
|
||||
])
|
||||
->deleteFileAfterSend(true);
|
||||
|
||||
return response()->download($path, 'subfleets.csv', ['content-type' => 'text/csv'])->deleteFileAfterSend(true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -312,77 +280,64 @@ class SubfleetController extends Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Subfleet $subfleet
|
||||
* Get all the fares that haven't been assigned to a given subfleet
|
||||
*
|
||||
* @return mixed
|
||||
* @param mixed $subfleet
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function return_ranks_view(?Subfleet $subfleet)
|
||||
protected function getAvailFares($subfleet)
|
||||
{
|
||||
$subfleet->refresh();
|
||||
$retval = [];
|
||||
$all_fares = $this->fareRepo->all();
|
||||
$avail_fares = $all_fares->except($subfleet->fares->modelKeys());
|
||||
foreach ($avail_fares as $fare) {
|
||||
$retval[$fare->id] = $fare->name.
|
||||
' (price: '.$fare->price.
|
||||
', type: '.FareType::label($fare->type).
|
||||
', cost: '.$fare->cost.
|
||||
', capacity: '.$fare->capacity.')';
|
||||
}
|
||||
|
||||
$avail_ranks = $this->getAvailRanks($subfleet);
|
||||
return view('admin.subfleets.ranks', [
|
||||
'subfleet' => $subfleet,
|
||||
'avail_ranks' => $avail_ranks,
|
||||
]);
|
||||
return $retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Subfleet $subfleet
|
||||
* Get the ranks that are available to the subfleet
|
||||
*
|
||||
* @return mixed
|
||||
* @param $subfleet
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function return_fares_view(?Subfleet $subfleet)
|
||||
protected function getAvailRanks($subfleet)
|
||||
{
|
||||
$subfleet->refresh();
|
||||
$retval = [];
|
||||
$all_ranks = $this->rankRepo->all();
|
||||
$avail_ranks = $all_ranks->except($subfleet->ranks->modelKeys());
|
||||
foreach ($avail_ranks as $rank) {
|
||||
$retval[$rank->id] = $rank->name;
|
||||
}
|
||||
|
||||
$avail_fares = $this->getAvailFares($subfleet);
|
||||
return view('admin.subfleets.fares', [
|
||||
'subfleet' => $subfleet,
|
||||
'avail_fares' => $avail_fares,
|
||||
]);
|
||||
return $retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for associating ranks to the subfleet
|
||||
* Get the type ratings that are available to the subfleet
|
||||
*
|
||||
* @param $id
|
||||
* @param Request $request
|
||||
* @param $subfleet
|
||||
*
|
||||
* @return mixed
|
||||
* @return array
|
||||
*/
|
||||
public function ranks($id, Request $request)
|
||||
protected function getAvailTypeRatings($subfleet)
|
||||
{
|
||||
$subfleet = $this->subfleetRepo->findWithoutFail($id);
|
||||
if (empty($subfleet)) {
|
||||
return $this->return_ranks_view($subfleet);
|
||||
$retval = [];
|
||||
$all_ratings = $this->typeratingRepo->all();
|
||||
$avail_ratings = $all_ratings->except($subfleet->typeratings->modelKeys());
|
||||
foreach ($avail_ratings as $tr) {
|
||||
$retval[$tr->id] = $tr->name.' ('.$tr->type.')';
|
||||
}
|
||||
|
||||
if ($request->isMethod('get')) {
|
||||
return $this->return_ranks_view($subfleet);
|
||||
}
|
||||
|
||||
/*
|
||||
* update specific rank data
|
||||
*/
|
||||
if ($request->isMethod('post')) {
|
||||
$rank = $this->rankRepo->find($request->input('rank_id'));
|
||||
$this->fleetSvc->addSubfleetToRank($subfleet, $rank);
|
||||
} elseif ($request->isMethod('put')) {
|
||||
$override = [];
|
||||
$rank = $this->rankRepo->find($request->input('rank_id'));
|
||||
$override[$request->name] = $request->value;
|
||||
|
||||
$this->fleetSvc->addSubfleetToRank($subfleet, $rank, $override);
|
||||
} // dissassociate fare from teh aircraft
|
||||
elseif ($request->isMethod('delete')) {
|
||||
$rank = $this->rankRepo->find($request->input('rank_id'));
|
||||
$this->fleetSvc->removeSubfleetFromRank($subfleet, $rank);
|
||||
}
|
||||
|
||||
$subfleet->save();
|
||||
|
||||
return $this->return_ranks_view($subfleet);
|
||||
return $retval;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -398,6 +353,54 @@ class SubfleetController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Subfleet $subfleet
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function return_fares_view(?Subfleet $subfleet)
|
||||
{
|
||||
$subfleet->refresh();
|
||||
$avail_fares = $this->getAvailFares($subfleet);
|
||||
|
||||
return view('admin.subfleets.fares', [
|
||||
'subfleet' => $subfleet,
|
||||
'avail_fares' => $avail_fares,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Subfleet $subfleet
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function return_ranks_view(?Subfleet $subfleet)
|
||||
{
|
||||
$subfleet->refresh();
|
||||
$avail_ranks = $this->getAvailRanks($subfleet);
|
||||
|
||||
return view('admin.subfleets.ranks', [
|
||||
'subfleet' => $subfleet,
|
||||
'avail_ranks' => $avail_ranks,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Subfleet $subfleet
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function return_typeratings_view(?Subfleet $subfleet)
|
||||
{
|
||||
$subfleet->refresh();
|
||||
$avail_ratings = $this->getAvailTypeRatings($subfleet);
|
||||
|
||||
return view('admin.subfleets.type_ratings', [
|
||||
'subfleet' => $subfleet,
|
||||
'avail_ratings' => $avail_ratings,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for associating ranks to the subfleet
|
||||
*
|
||||
@@ -479,4 +482,79 @@ class SubfleetController extends Controller
|
||||
|
||||
return $this->return_fares_view($subfleet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for associating ranks to the subfleet
|
||||
*
|
||||
* @param $id
|
||||
* @param Request $request
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function ranks($id, Request $request)
|
||||
{
|
||||
$subfleet = $this->subfleetRepo->findWithoutFail($id);
|
||||
if (empty($subfleet)) {
|
||||
return $this->return_ranks_view($subfleet);
|
||||
}
|
||||
|
||||
if ($request->isMethod('get')) {
|
||||
return $this->return_ranks_view($subfleet);
|
||||
}
|
||||
|
||||
// associate rank with the subfleet
|
||||
if ($request->isMethod('post')) {
|
||||
$rank = $this->rankRepo->find($request->input('rank_id'));
|
||||
$this->fleetSvc->addSubfleetToRank($subfleet, $rank);
|
||||
} // override definitions
|
||||
elseif ($request->isMethod('put')) {
|
||||
$override = [];
|
||||
$rank = $this->rankRepo->find($request->input('rank_id'));
|
||||
$override[$request->name] = $request->value;
|
||||
|
||||
$this->fleetSvc->addSubfleetToRank($subfleet, $rank, $override);
|
||||
} // dissassociate rank from the subfleet
|
||||
elseif ($request->isMethod('delete')) {
|
||||
$rank = $this->rankRepo->find($request->input('rank_id'));
|
||||
$this->fleetSvc->removeSubfleetFromRank($subfleet, $rank);
|
||||
}
|
||||
|
||||
$subfleet->save();
|
||||
|
||||
return $this->return_ranks_view($subfleet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for associating type ratings to the subfleet
|
||||
*
|
||||
* @param $id
|
||||
* @param Request $request
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function typeratings($id, Request $request)
|
||||
{
|
||||
$subfleet = $this->subfleetRepo->findWithoutFail($id);
|
||||
if (empty($subfleet)) {
|
||||
return $this->return_typeratings_view($subfleet);
|
||||
}
|
||||
|
||||
if ($request->isMethod('get')) {
|
||||
return $this->return_typeratings_view($subfleet);
|
||||
}
|
||||
|
||||
// associate subfleet with type rating
|
||||
if ($request->isMethod('post')) {
|
||||
$typerating = $this->typeratingRepo->find($request->input('typerating_id'));
|
||||
$this->fleetSvc->addSubfleetToTypeRating($subfleet, $typerating);
|
||||
} // dissassociate subfleet from the type rating
|
||||
elseif ($request->isMethod('delete')) {
|
||||
$typerating = $this->typeratingRepo->find($request->input('typerating_id'));
|
||||
$this->fleetSvc->removeSubfleetFromTypeRating($subfleet, $typerating);
|
||||
}
|
||||
|
||||
$subfleet->save();
|
||||
|
||||
return $this->return_typeratings_view($subfleet);
|
||||
}
|
||||
}
|
||||
|
||||
168
app/Http/Controllers/Admin/TypeRatingController.php
Normal file
168
app/Http/Controllers/Admin/TypeRatingController.php
Normal file
@@ -0,0 +1,168 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Contracts\Controller;
|
||||
use App\Http\Requests\CreateTypeRatingRequest;
|
||||
use App\Http\Requests\UpdateTypeRatingRequest;
|
||||
use App\Repositories\SubfleetRepository;
|
||||
use App\Repositories\TypeRatingRepository;
|
||||
use App\Services\FleetService;
|
||||
use Cache;
|
||||
use Illuminate\Http\Request;
|
||||
use Laracasts\Flash\Flash;
|
||||
use Prettus\Repository\Criteria\RequestCriteria;
|
||||
|
||||
class TypeRatingController extends Controller
|
||||
{
|
||||
private $fleetSvc;
|
||||
private $subfleetRepo;
|
||||
private $typeratingRepo;
|
||||
|
||||
public function __construct(
|
||||
FleetService $fleetSvc,
|
||||
SubfleetRepository $subfleetRepo,
|
||||
TypeRatingRepository $typeratingRepo
|
||||
) {
|
||||
$this->fleetSvc = $fleetSvc;
|
||||
$this->subfleetRepo = $subfleetRepo;
|
||||
$this->typeratingRepo = $typeratingRepo;
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$this->typeratingRepo->pushCriteria(new RequestCriteria($request));
|
||||
$typeratings = $this->typeratingRepo->all();
|
||||
|
||||
return view('admin.typeratings.index', [
|
||||
'typeratings' => $typeratings,
|
||||
]);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
return view('admin.typeratings.create');
|
||||
}
|
||||
|
||||
public function store(CreateTypeRatingRequest $request)
|
||||
{
|
||||
$input = $request->all();
|
||||
|
||||
$model = $this->typeratingRepo->create($input);
|
||||
Flash::success('Type Rating saved successfully.');
|
||||
// Cache::forget(config('cache.keys.RANKS_PILOT_LIST.key'));
|
||||
|
||||
return redirect(route('admin.typeratings.edit', [$model->id]));
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$typerating = $this->typeratingRepo->findWithoutFail($id);
|
||||
|
||||
if (empty($typerating)) {
|
||||
Flash::error('Type Rating not found');
|
||||
|
||||
return redirect(route('admin.typeratings.index'));
|
||||
}
|
||||
|
||||
return view('admin.typeratings.show', [
|
||||
'typerating' => $typerating,
|
||||
]);
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$typerating = $this->typeratingRepo->findWithoutFail($id);
|
||||
|
||||
if (empty($typerating)) {
|
||||
Flash::error('Type Rating not found');
|
||||
|
||||
return redirect(route('admin.typeratings.index'));
|
||||
}
|
||||
|
||||
$avail_subfleets = $this->getAvailSubfleets($typerating);
|
||||
|
||||
return view('admin.typeratings.edit', [
|
||||
'typerating' => $typerating,
|
||||
'avail_subfleets' => $avail_subfleets,
|
||||
]);
|
||||
}
|
||||
|
||||
public function update($id, UpdateTypeRatingRequest $request)
|
||||
{
|
||||
$typerating = $this->typeratingRepo->findWithoutFail($id);
|
||||
|
||||
if (empty($typerating)) {
|
||||
Flash::error('Type Rating not found');
|
||||
|
||||
return redirect(route('admin.typeratings.index'));
|
||||
}
|
||||
|
||||
$typerating = $this->typeratingRepo->update($request->all(), $id);
|
||||
// Cache::forget(config('cache.keys.RANKS_PILOT_LIST.key'));
|
||||
Flash::success('Type Rating updated successfully.');
|
||||
|
||||
return redirect(route('admin.typeratings.index'));
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
$typerating = $this->typeratingRepo->findWithoutFail($id);
|
||||
|
||||
if (empty($typerating)) {
|
||||
Flash::error('Type Rating not found');
|
||||
|
||||
return redirect(route('admin.typeratings.index'));
|
||||
}
|
||||
|
||||
$this->typeratingRepo->delete($id);
|
||||
|
||||
Flash::success('Type Rating deleted successfully.');
|
||||
|
||||
return redirect(route('admin.typeratings.index'));
|
||||
}
|
||||
|
||||
protected function getAvailSubfleets($typerating)
|
||||
{
|
||||
$retval = [];
|
||||
$all_subfleets = $this->subfleetRepo->all();
|
||||
$avail_subfleets = $all_subfleets->except($typerating->subfleets->modelKeys());
|
||||
foreach ($avail_subfleets as $subfleet) {
|
||||
$retval[$subfleet->id] = $subfleet->name.' (Airline: '.$subfleet->airline->code.')';
|
||||
}
|
||||
|
||||
return $retval;
|
||||
}
|
||||
|
||||
protected function return_subfleet_view($typerating)
|
||||
{
|
||||
$avail_subfleets = $this->getAvailSubfleets($typerating);
|
||||
|
||||
return view('admin.typeratings.subfleets', [
|
||||
'typerating' => $typerating,
|
||||
'avail_subfleets' => $avail_subfleets,
|
||||
]);
|
||||
}
|
||||
|
||||
public function subfleets($id, Request $request)
|
||||
{
|
||||
$typerating = $this->typeratingRepo->findWithoutFail($id);
|
||||
if (empty($typerating)) {
|
||||
Flash::error('Type Rating not found!');
|
||||
return redirect(route('admin.typeratings.index'));
|
||||
}
|
||||
|
||||
// add subfleet to type rating
|
||||
if ($request->isMethod('post')) {
|
||||
$subfleet = $this->subfleetRepo->find($request->input('subfleet_id'));
|
||||
$this->fleetSvc->addSubfleetToTypeRating($subfleet, $typerating);
|
||||
}
|
||||
// remove subfleet from type rating
|
||||
elseif ($request->isMethod('delete')) {
|
||||
$subfleet = $this->subfleetRepo->find($request->input('subfleet_id'));
|
||||
$this->fleetSvc->removeSubfleetFromTypeRating($subfleet, $typerating);
|
||||
}
|
||||
|
||||
return $this->return_subfleet_view($typerating);
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@ use App\Repositories\AirlineRepository;
|
||||
use App\Repositories\AirportRepository;
|
||||
use App\Repositories\PirepRepository;
|
||||
use App\Repositories\RoleRepository;
|
||||
use App\Repositories\TypeRatingRepository;
|
||||
use App\Repositories\UserRepository;
|
||||
use App\Services\UserService;
|
||||
use App\Support\Timezonelist;
|
||||
@@ -30,24 +31,27 @@ class UserController extends Controller
|
||||
private $airportRepo;
|
||||
private $pirepRepo;
|
||||
private $roleRepo;
|
||||
private $typeratingRepo;
|
||||
private $userRepo;
|
||||
private $userSvc;
|
||||
|
||||
/**
|
||||
* UserController constructor.
|
||||
*
|
||||
* @param AirlineRepository $airlineRepo
|
||||
* @param AirportRepository $airportRepo
|
||||
* @param PirepRepository $pirepRepo
|
||||
* @param RoleRepository $roleRepo
|
||||
* @param UserRepository $userRepo
|
||||
* @param UserService $userSvc
|
||||
* @param AirlineRepository $airlineRepo
|
||||
* @param AirportRepository $airportRepo
|
||||
* @param PirepRepository $pirepRepo
|
||||
* @param RoleRepository $roleRepo
|
||||
* @param TypeRatingRepository $typeratingRepo
|
||||
* @param UserRepository $userRepo
|
||||
* @param UserService $userSvc
|
||||
*/
|
||||
public function __construct(
|
||||
AirlineRepository $airlineRepo,
|
||||
AirportRepository $airportRepo,
|
||||
PirepRepository $pirepRepo,
|
||||
RoleRepository $roleRepo,
|
||||
TypeRatingRepository $typeratingRepo,
|
||||
UserRepository $userRepo,
|
||||
UserService $userSvc
|
||||
) {
|
||||
@@ -55,6 +59,7 @@ class UserController extends Controller
|
||||
$this->airportRepo = $airportRepo;
|
||||
$this->pirepRepo = $pirepRepo;
|
||||
$this->roleRepo = $roleRepo;
|
||||
$this->typeratingRepo = $typeratingRepo;
|
||||
$this->userSvc = $userSvc;
|
||||
$this->userRepo = $userRepo;
|
||||
}
|
||||
@@ -149,7 +154,7 @@ class UserController extends Controller
|
||||
public function edit($id)
|
||||
{
|
||||
$user = $this->userRepo
|
||||
->with(['awards', 'fields', 'rank'])
|
||||
->with(['awards', 'fields', 'rank', 'typeratings'])
|
||||
->findWithoutFail($id);
|
||||
|
||||
if (empty($user)) {
|
||||
@@ -169,17 +174,19 @@ class UserController extends Controller
|
||||
$airlines = $this->airlineRepo->selectBoxList();
|
||||
$airports = $this->airportRepo->selectBoxList(false);
|
||||
$roles = $this->roleRepo->selectBoxList(false, true);
|
||||
$avail_ratings = $this->getAvailTypeRatings($user);
|
||||
|
||||
return view('admin.users.edit', [
|
||||
'user' => $user,
|
||||
'pireps' => $pireps,
|
||||
'country' => new ISO3166(),
|
||||
'countries' => $countries,
|
||||
'timezones' => Timezonelist::toArray(),
|
||||
'airports' => $airports,
|
||||
'airlines' => $airlines,
|
||||
'ranks' => Rank::all()->pluck('name', 'id'),
|
||||
'roles' => $roles,
|
||||
'user' => $user,
|
||||
'pireps' => $pireps,
|
||||
'country' => new ISO3166(),
|
||||
'countries' => $countries,
|
||||
'timezones' => Timezonelist::toArray(),
|
||||
'airports' => $airports,
|
||||
'airlines' => $airlines,
|
||||
'ranks' => Rank::all()->pluck('name', 'id'),
|
||||
'roles' => $roles,
|
||||
'avail_ratings' => $avail_ratings,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -260,6 +267,7 @@ class UserController extends Controller
|
||||
$user = $this->userRepo->findWithoutFail($id);
|
||||
if (empty($user)) {
|
||||
Flash::error('User not found');
|
||||
|
||||
return redirect(route('admin.users.index'));
|
||||
}
|
||||
|
||||
@@ -283,6 +291,7 @@ class UserController extends Controller
|
||||
$userAward = UserAward::where(['user_id' => $id, 'award_id' => $award_id]);
|
||||
if (empty($userAward)) {
|
||||
Flash::error('The user award could not be found');
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
@@ -311,4 +320,73 @@ class UserController extends Controller
|
||||
|
||||
return redirect(route('admin.users.edit', [$id]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the type ratings that are available to the user
|
||||
*
|
||||
* @param $user
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getAvailTypeRatings($user)
|
||||
{
|
||||
$retval = [];
|
||||
$all_ratings = $this->typeratingRepo->all();
|
||||
$avail_ratings = $all_ratings->except($user->typeratings->modelKeys());
|
||||
foreach ($avail_ratings as $tr) {
|
||||
$retval[$tr->id] = $tr->name.' ('.$tr->type.')';
|
||||
}
|
||||
|
||||
return $retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param User $user
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function return_typeratings_view(?User $user)
|
||||
{
|
||||
$user->refresh();
|
||||
|
||||
$avail_ratings = $this->getAvailTypeRatings($user);
|
||||
return view('admin.users.type_ratings', [
|
||||
'user' => $user,
|
||||
'avail_ratings' => $avail_ratings,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Operations for associating type ratings to the user
|
||||
*
|
||||
* @param $id
|
||||
* @param Request $request
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function typeratings($id, Request $request)
|
||||
{
|
||||
$user = $this->userRepo->findWithoutFail($id);
|
||||
if (empty($user)) {
|
||||
return $this->return_typeratings_view($user);
|
||||
}
|
||||
|
||||
if ($request->isMethod('get')) {
|
||||
return $this->return_typeratings_view($user);
|
||||
}
|
||||
|
||||
// associate user with type rating
|
||||
if ($request->isMethod('post')) {
|
||||
$typerating = $this->typeratingRepo->find($request->input('typerating_id'));
|
||||
$this->userSvc->addUserToTypeRating($user, $typerating);
|
||||
} // dissassociate user from the type rating
|
||||
elseif ($request->isMethod('delete')) {
|
||||
$typerating = $this->typeratingRepo->find($request->input('typerating_id'));
|
||||
$this->userSvc->removeUserFromTypeRating($user, $typerating);
|
||||
}
|
||||
|
||||
$user->save();
|
||||
|
||||
return $this->return_typeratings_view($user);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ class ProfileController extends Controller
|
||||
public function show($id)
|
||||
{
|
||||
/** @var \App\Models\User $user */
|
||||
$with = ['airline', 'awards', 'current_airport', 'fields.field', 'home_airport', 'last_pirep', 'rank'];
|
||||
$with = ['airline', 'awards', 'current_airport', 'fields.field', 'home_airport', 'last_pirep', 'rank', 'typeratings'];
|
||||
$user = User::with($with)->where('id', $id)->first();
|
||||
|
||||
if (empty($user)) {
|
||||
|
||||
@@ -80,46 +80,39 @@ class SimBriefController
|
||||
|
||||
// No aircraft selected, show selection form
|
||||
if (!$aircraft_id) {
|
||||
// If no subfleets defined for flight get them from user
|
||||
if ($flight->subfleets->count() > 0) {
|
||||
$subfleets = $flight->subfleets;
|
||||
} else {
|
||||
$subfleets = $this->userSvc->getAllowableSubfleets($user);
|
||||
}
|
||||
|
||||
// Build an array of subfleet id's from the subfleets collection
|
||||
$sf_ids = $subfleets->map(function ($subfleets) {
|
||||
return collect($subfleets->toArray())
|
||||
->only(['id'])
|
||||
->all();
|
||||
});
|
||||
// Get user's allowed subfleets and intersect it with flight subfleets
|
||||
// so we will have a proper list which the user is allowed to fly
|
||||
$user_subfleets = $this->userSvc->getAllowableSubfleets($user)->pluck('id')->toArray();
|
||||
$flight_subfleets = $flight->subfleets->pluck('id')->toArray();
|
||||
|
||||
// Now we can build a proper aircrafts collection
|
||||
// Contents will be either members of flight->subfleets
|
||||
// or members of user's allowable subfleets
|
||||
$aircrafts = Aircraft::whereIn('subfleet_id', $sf_ids)
|
||||
->where('state', AircraftState::PARKED)
|
||||
->where('status', AircraftStatus::ACTIVE)
|
||||
->orderby('icao')
|
||||
->orderby('registration')
|
||||
->get();
|
||||
$subfleet_ids = filled($flight_subfleets) ? array_intersect($user_subfleets, $flight_subfleets) : $user_subfleets;
|
||||
|
||||
// Prepare variables for single aircraft query
|
||||
$where = [];
|
||||
$where['state'] = AircraftState::PARKED;
|
||||
$where['status'] = AircraftStatus::ACTIVE;
|
||||
|
||||
if (setting('pireps.only_aircraft_at_dpt_airport')) {
|
||||
$aircrafts = $aircrafts->where('airport_id', $flight->dpt_airport_id);
|
||||
$where['airport_id'] = $flight->dpt_airport_id;
|
||||
}
|
||||
|
||||
if (setting('simbrief.block_aircraft')) {
|
||||
// Build a list of aircraft_id's being used for active sb packs
|
||||
$sb_aircraft = SimBrief::whereNotNull('flight_id')->pluck('aircraft_id');
|
||||
$withCount = ['simbriefs' => function ($query) {
|
||||
$query->whereNull('pirep_id');
|
||||
}];
|
||||
|
||||
// Filter aircraft list to non used/blocked ones
|
||||
$aircrafts = $aircrafts->whereNotIn('id', $sb_aircraft);
|
||||
}
|
||||
// Build proper aircraft collection considering all possible settings
|
||||
// Flight subfleets, user subfleet restrictions, pirep restrictions, simbrief blocking etc
|
||||
$aircraft = Aircraft::withCount($withCount)->where($where)
|
||||
->when(setting('simbrief.block_aircraft'), function ($query) {
|
||||
return $query->having('simbriefs_count', 0);
|
||||
})->whereIn('subfleet_id', $subfleet_ids)
|
||||
->orderby('icao')->orderby('registration')
|
||||
->get();
|
||||
|
||||
return view('flights.simbrief_aircraft', [
|
||||
'flight' => $flight,
|
||||
'aircrafts' => $aircrafts,
|
||||
'subfleets' => $subfleets,
|
||||
'aircrafts' => $aircraft,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user