2017-06-10 14:50:00 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
2017-07-02 10:06:55 +08:00
|
|
|
use App\Models\Pirep;
|
|
|
|
use App\Models\PirepFieldValues;
|
|
|
|
|
2017-12-03 00:55:17 +08:00
|
|
|
use App\Events\PirepAccepted;
|
|
|
|
use App\Events\PirepFiled;
|
|
|
|
use App\Events\PirepRejected;
|
|
|
|
use App\Events\UserStateChanged;
|
2017-06-10 14:50:00 +08:00
|
|
|
|
2017-07-04 14:05:37 +08:00
|
|
|
class PIREPService extends BaseService
|
|
|
|
{
|
|
|
|
protected $pilotSvc;
|
2017-06-10 14:50:00 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* return a PIREP model
|
|
|
|
*/
|
2017-07-04 14:05:37 +08:00
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
$this->pilotSvc = app('App\Services\PilotService');
|
2017-06-10 14:50:00 +08:00
|
|
|
}
|
|
|
|
|
2017-07-04 14:05:37 +08:00
|
|
|
/**
|
|
|
|
* Create a new PIREP with some given fields
|
|
|
|
*
|
|
|
|
* @param Pirep $pirep
|
|
|
|
* @param array [PirepFieldValues] $field_values
|
|
|
|
*
|
|
|
|
* @return Pirep
|
|
|
|
*/
|
2017-08-24 03:19:05 +08:00
|
|
|
public function create(Pirep $pirep, array $field_values): Pirep {
|
|
|
|
|
|
|
|
if($field_values == null) {
|
|
|
|
$field_values = [];
|
|
|
|
}
|
2017-07-02 10:06:55 +08:00
|
|
|
|
2017-07-04 14:05:37 +08:00
|
|
|
# Figure out what default state should be. Look at the default
|
|
|
|
# behavior from the rank that the pilot is assigned to
|
2017-07-05 04:43:47 +08:00
|
|
|
if($pirep->source == config('enums.sources.ACARS')) {
|
2017-07-04 14:05:37 +08:00
|
|
|
$default_status = $pirep->pilot->rank->auto_approve_acars;
|
|
|
|
} else {
|
|
|
|
$default_status = $pirep->pilot->rank->auto_approve_manual;
|
|
|
|
}
|
2017-07-02 10:06:55 +08:00
|
|
|
|
2017-08-24 03:19:05 +08:00
|
|
|
$pirep->save();
|
|
|
|
$pirep->refresh();
|
|
|
|
|
2017-07-04 14:05:37 +08:00
|
|
|
foreach ($field_values as $fv) {
|
2017-07-02 10:06:55 +08:00
|
|
|
$v = new PirepFieldValues();
|
2017-08-24 03:19:05 +08:00
|
|
|
$v->pirep_id = $pirep->id;
|
2017-07-02 10:06:55 +08:00
|
|
|
$v->name = $fv['name'];
|
|
|
|
$v->value = $fv['value'];
|
|
|
|
$v->source = $fv['source'];
|
|
|
|
$v->save();
|
|
|
|
}
|
2017-06-10 14:50:00 +08:00
|
|
|
|
2017-12-03 00:55:17 +08:00
|
|
|
event(new PirepFiled($pirep));
|
|
|
|
|
|
|
|
if ($default_status == config('enums.pirep_status.ACCEPTED')) {
|
|
|
|
$pirep = $this->accept($pirep);
|
|
|
|
}
|
|
|
|
|
2017-08-24 03:19:05 +08:00
|
|
|
# only update the pilot last state if they are accepted
|
|
|
|
if ($default_status == config('enums.pirep_status.ACCEPTED')) {
|
|
|
|
$this->setPilotState($pirep);
|
|
|
|
}
|
2017-07-04 14:05:37 +08:00
|
|
|
|
2017-08-24 03:19:05 +08:00
|
|
|
# TODO: Emit filed event. Do financials through that
|
2017-07-04 14:05:37 +08:00
|
|
|
|
|
|
|
return $pirep;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function changeStatus(Pirep &$pirep, int $new_status): Pirep
|
|
|
|
{
|
|
|
|
if ($pirep->status === $new_status) {
|
|
|
|
return $pirep;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Move from a PENDING status into either ACCEPTED or REJECTED
|
|
|
|
*/
|
2017-07-05 04:43:47 +08:00
|
|
|
if ($pirep->status == config('enums.pirep_status.PENDING')) {
|
|
|
|
if ($new_status == config('enums.pirep_status.ACCEPTED')) {
|
2017-07-04 14:05:37 +08:00
|
|
|
return $this->accept($pirep);
|
2017-07-05 04:43:47 +08:00
|
|
|
} elseif ($new_status == config('enums.pirep_status.REJECTED')) {
|
2017-07-04 14:05:37 +08:00
|
|
|
return $this->reject($pirep);
|
|
|
|
} else {
|
|
|
|
return $pirep;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Move from a ACCEPTED to REJECTED status
|
|
|
|
*/
|
2017-07-05 04:43:47 +08:00
|
|
|
elseif ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
|
2017-07-04 14:05:37 +08:00
|
|
|
$pirep = $this->reject($pirep);
|
|
|
|
return $pirep;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Move from REJECTED to ACCEPTED
|
|
|
|
*/
|
2017-07-05 04:43:47 +08:00
|
|
|
elseif ($pirep->status == config('enums.pirep_status.REJECTED')) {
|
2017-07-04 14:05:37 +08:00
|
|
|
$pirep = $this->accept($pirep);
|
|
|
|
return $pirep;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param Pirep $pirep
|
|
|
|
* @return Pirep
|
|
|
|
*/
|
|
|
|
public function accept(Pirep &$pirep): Pirep
|
|
|
|
{
|
|
|
|
# moving from a REJECTED state to ACCEPTED, reconcile statuses
|
2017-07-05 04:43:47 +08:00
|
|
|
if ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
|
2017-07-04 14:05:37 +08:00
|
|
|
return $pirep;
|
|
|
|
}
|
|
|
|
|
|
|
|
$ft = $pirep->flight_time;
|
2017-07-05 02:57:08 +08:00
|
|
|
$pilot = $pirep->pilot;
|
2017-07-04 14:05:37 +08:00
|
|
|
|
|
|
|
$this->pilotSvc->adjustFlightHours($pilot, $ft);
|
|
|
|
$this->pilotSvc->adjustFlightCount($pilot, +1);
|
|
|
|
$this->pilotSvc->calculatePilotRank($pilot);
|
|
|
|
$pirep->pilot->refresh();
|
|
|
|
|
|
|
|
# Change the status
|
2017-07-05 04:43:47 +08:00
|
|
|
$pirep->status = config('enums.pirep_status.ACCEPTED');
|
2017-07-04 14:05:37 +08:00
|
|
|
$pirep->save();
|
2017-08-24 03:19:05 +08:00
|
|
|
$pirep->refresh();
|
2017-07-04 14:05:37 +08:00
|
|
|
|
2017-09-08 04:35:17 +08:00
|
|
|
$this->setPilotState($pirep);
|
|
|
|
|
2017-12-03 00:55:17 +08:00
|
|
|
event(new PirepAccepted($pirep));
|
|
|
|
|
2017-07-04 14:05:37 +08:00
|
|
|
return $pirep;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param Pirep $pirep
|
|
|
|
* @return Pirep
|
|
|
|
*/
|
|
|
|
public function reject(Pirep &$pirep): Pirep
|
|
|
|
{
|
|
|
|
# If this was previously ACCEPTED, then reconcile the flight hours
|
|
|
|
# that have already been counted, etc
|
2017-07-05 04:43:47 +08:00
|
|
|
if ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
|
2017-07-04 14:05:37 +08:00
|
|
|
$pilot = $pirep->pilot;
|
|
|
|
$ft = $pirep->flight_time * -1;
|
|
|
|
|
|
|
|
$this->pilotSvc->adjustFlightHours($pilot, $ft);
|
|
|
|
$this->pilotSvc->adjustFlightCount($pilot, -1);
|
|
|
|
$this->pilotSvc->calculatePilotRank($pilot);
|
|
|
|
$pirep->pilot->refresh();
|
|
|
|
}
|
|
|
|
|
|
|
|
# Change the status
|
2017-07-05 04:43:47 +08:00
|
|
|
$pirep->status = config('enums.pirep_status.REJECTED');
|
2017-07-04 14:05:37 +08:00
|
|
|
$pirep->save();
|
2017-08-24 03:19:05 +08:00
|
|
|
$pirep->refresh();
|
2017-07-04 14:05:37 +08:00
|
|
|
|
2017-12-03 00:55:17 +08:00
|
|
|
event(new PirepRejected($pirep));
|
|
|
|
|
2017-07-04 14:05:37 +08:00
|
|
|
return $pirep;
|
2017-06-10 14:50:00 +08:00
|
|
|
}
|
2017-07-11 07:54:51 +08:00
|
|
|
|
2017-08-24 03:19:05 +08:00
|
|
|
public function setPilotState($pirep) {
|
|
|
|
$pilot = $pirep->pilot;
|
|
|
|
$pilot->refresh();
|
|
|
|
$pilot->curr_airport_id = $pirep->arr_airport_id;
|
|
|
|
$pilot->last_pirep_id = $pirep->id;
|
|
|
|
$pilot->save();
|
2017-07-11 07:54:51 +08:00
|
|
|
|
2017-12-03 00:55:17 +08:00
|
|
|
event(new UserStateChanged($pilot));
|
2017-07-11 07:54:51 +08:00
|
|
|
}
|
2017-06-10 14:50:00 +08:00
|
|
|
}
|