accept/reject pireps in admin; cleanup and refactoring

This commit is contained in:
Nabeel Shahzad
2017-12-03 00:48:33 -06:00
parent 0272f7e729
commit 4c8fca39eb
17 changed files with 253 additions and 180 deletions

View File

@@ -6,19 +6,25 @@ use App\Http\Requests\CreatePirepRequest;
use App\Http\Requests\UpdatePirepRequest;
use App\Repositories\AircraftRepository;
use App\Repositories\PirepRepository;
use App\Services\PIREPService;
use Illuminate\Http\Request;
use Flash;
use Log;
use Prettus\Repository\Criteria\RequestCriteria;
use Response;
class PirepController extends BaseController
{
private $pirepRepo, $aircraftRepo;
private $pirepRepo, $aircraftRepo, $pirepSvc;
public function __construct(PirepRepository $pirepRepo, AircraftRepository $aircraftRepo)
{
public function __construct(
AircraftRepository $aircraftRepo,
PirepRepository $pirepRepo,
PIREPService $pirepSvc
) {
$this->aircraftRepo = $aircraftRepo;
$this->pirepRepo = $pirepRepo;
$this->pirepSvc = $pirepSvc;
}
public function aircraftList()
@@ -43,7 +49,8 @@ class PirepController extends BaseController
$criterea = new RequestCriteria($request);
$this->pirepRepo->pushCriteria($criterea);
$pireps = $this->pirepRepo->orderBy('created_at', 'desc')
$pireps = $this->pirepRepo
->orderBy('created_at', 'desc')
->paginate();
return view('admin.pireps.index', [
@@ -53,7 +60,6 @@ class PirepController extends BaseController
/**
* Show the form for creating a new Pirep.
*
* @return Response
*/
public function create()
@@ -77,7 +83,6 @@ class PirepController extends BaseController
/**
* Display the specified Pirep.
*
* @param int $id
* @return Response
*/
@@ -97,7 +102,6 @@ class PirepController extends BaseController
/**
* Show the form for editing the specified Pirep.
*
* @param int $id
* @return Response
*/
@@ -139,9 +143,7 @@ class PirepController extends BaseController
/**
* Remove the specified Pirep from storage.
*
* @param int $id
*
* @return Response
*/
public function destroy($id)
@@ -158,4 +160,23 @@ class PirepController extends BaseController
Flash::success('Pirep deleted successfully.');
return redirect(route('admin.pireps.index'));
}
/**
* Change or update the PIREP status
* @param Request $request
* @return \Illuminate\View\View
*/
public function status(Request $request)
{
Log::info('PIREP status update call', [$request->toArray()]);
$pirep = $this->pirepRepo->findWithoutFail($request->id);
if($request->isMethod('post')) {
$new_status = (int) $request->new_status;
$pirep = $this->pirepSvc->changeStatus($pirep, $new_status);
}
$pirep->refresh();
return view('admin.pireps.pirep_card', ['pirep' => $pirep]);
}
}

View File

@@ -29,9 +29,9 @@ class Rank extends Model
protected $casts = [
'name' => 'string',
'hours' => 'integer',
'auto_approve_acars' => 'boolean',
'auto_approve_manual' => 'boolean',
'auto_promote' => 'boolean',
'auto_approve_acars' => 'integer',
'auto_approve_manual' => 'integer',
'auto_promote' => 'integer',
];
/**

View File

@@ -81,7 +81,7 @@ class User extends Authenticatable
protected $casts
= [
'flights' => 'integer',
'flight_hours' => 'integer',
'flight_time' => 'integer',
'balance' => 'double',
'timezone' => 'integer',
];

View File

@@ -9,8 +9,6 @@ class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
@@ -27,27 +25,9 @@ class AppServiceProvider extends ServiceProvider
/**
* Register any application services.
*
* @return void
*/
public function register()
{
// bind all the app services...
$this->app->bind('App\Services\AircraftService', function($app) {
return new \App\Services\AircraftService();
});
$this->app->bind('App\Services\AircraftFareService', function($app) {
return new \App\Services\AircraftFareService();
});
$this->app->bind('App\Services\PilotService', function($app) {
return new \App\Services\PilotService();
});
$this->app->bind('App\Services\PIREPService', function($app) {
return new \App\Services\PIREPService();
});
}
}

View File

@@ -12,7 +12,9 @@ class PirepRepository extends BaseRepository implements CacheableInterface
use CacheableRepository;
protected $fieldSearchable = [
'user_id'
'user_id',
'flight_id',
'status',
];
public function model()

View File

@@ -10,16 +10,24 @@ use App\Events\PirepFiled;
use App\Events\PirepRejected;
use App\Events\UserStateChanged;
use App\Repositories\PirepRepository;
use Log;
class PIREPService extends BaseService
{
protected $pilotSvc;
protected $pilotSvc, $pirepRepo;
/**
* return a PIREP model
* PIREPService constructor.
* @param PilotService $pilotSvc
* @param PirepRepository $pirepRepo
*/
public function __construct()
{
$this->pilotSvc = app('App\Services\PilotService');
public function __construct(
PilotService $pilotSvc,
PirepRepository $pirepRepo
) {
$this->pilotSvc = $pilotSvc;
$this->pirepRepo = $pirepRepo;
}
/**
@@ -30,15 +38,15 @@ class PIREPService extends BaseService
*
* @return Pirep
*/
public function create(Pirep $pirep, array $field_values): Pirep {
if($field_values == null) {
public function create(Pirep &$pirep, array $field_values): Pirep
{
if($field_values === null) {
$field_values = [];
}
# Figure out what default state should be. Look at the default
# behavior from the rank that the pilot is assigned to
if($pirep->source == config('enums.sources.ACARS')) {
if($pirep->source === config('enums.sources.ACARS')) {
$default_status = $pirep->pilot->rank->auto_approve_acars;
} else {
$default_status = $pirep->pilot->rank->auto_approve_manual;
@@ -56,24 +64,31 @@ class PIREPService extends BaseService
$v->save();
}
Log::info('New PIREP filed', [$pirep]);
event(new PirepFiled($pirep));
if ($default_status == config('enums.pirep_status.ACCEPTED')) {
if ($default_status === config('enums.pirep_status.ACCEPTED')) {
$pirep = $this->accept($pirep);
}
# only update the pilot last state if they are accepted
if ($default_status == config('enums.pirep_status.ACCEPTED')) {
if ($default_status === config('enums.pirep_status.ACCEPTED')) {
$this->setPilotState($pirep);
}
# TODO: Emit filed event. Do financials through that
return $pirep;
}
/**
* @param Pirep $pirep
* @param int $new_status
* @return Pirep
*/
public function changeStatus(Pirep &$pirep, int $new_status): Pirep
{
Log::info('PIREP ' . $pirep->id . ' status change from '.$pirep->status.' to ' . $new_status);
if ($pirep->status === $new_status) {
return $pirep;
}
@@ -81,10 +96,10 @@ class PIREPService extends BaseService
/**
* Move from a PENDING status into either ACCEPTED or REJECTED
*/
if ($pirep->status == config('enums.pirep_status.PENDING')) {
if ($new_status == config('enums.pirep_status.ACCEPTED')) {
if ($pirep->status === config('enums.pirep_status.PENDING')) {
if ($new_status === config('enums.pirep_status.ACCEPTED')) {
return $this->accept($pirep);
} elseif ($new_status == config('enums.pirep_status.REJECTED')) {
} elseif ($new_status === config('enums.pirep_status.REJECTED')) {
return $this->reject($pirep);
} else {
return $pirep;
@@ -94,7 +109,7 @@ class PIREPService extends BaseService
/*
* Move from a ACCEPTED to REJECTED status
*/
elseif ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
elseif ($pirep->status === config('enums.pirep_status.ACCEPTED')) {
$pirep = $this->reject($pirep);
return $pirep;
}
@@ -102,7 +117,7 @@ class PIREPService extends BaseService
/**
* Move from REJECTED to ACCEPTED
*/
elseif ($pirep->status == config('enums.pirep_status.REJECTED')) {
elseif ($pirep->status === config('enums.pirep_status.REJECTED')) {
$pirep = $this->accept($pirep);
return $pirep;
}
@@ -115,7 +130,7 @@ class PIREPService extends BaseService
public function accept(Pirep &$pirep): Pirep
{
# moving from a REJECTED state to ACCEPTED, reconcile statuses
if ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
if ($pirep->status === config('enums.pirep_status.ACCEPTED')) {
return $pirep;
}
@@ -134,6 +149,8 @@ class PIREPService extends BaseService
$this->setPilotState($pirep);
Log::info('PIREP '.$pirep->id.' status change to ACCEPTED');
event(new PirepAccepted($pirep));
return $pirep;
@@ -147,7 +164,7 @@ class PIREPService extends BaseService
{
# If this was previously ACCEPTED, then reconcile the flight hours
# that have already been counted, etc
if ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
if ($pirep->status === config('enums.pirep_status.ACCEPTED')) {
$pilot = $pirep->pilot;
$ft = $pirep->flight_time * -1;
@@ -162,14 +179,21 @@ class PIREPService extends BaseService
$pirep->save();
$pirep->refresh();
Log::info('PIREP ' . $pirep->id . ' status change to REJECTED');
event(new PirepRejected($pirep));
return $pirep;
}
public function setPilotState($pirep) {
/**
* @param Pirep $pirep
*/
public function setPilotState(Pirep &$pirep)
{
$pilot = $pirep->pilot;
$pilot->refresh();
$pilot->curr_airport_id = $pirep->arr_airport_id;
$pilot->last_pirep_id = $pirep->id;
$pilot->save();