Allow draft for PIREPs, separate out the save/submit and delete functionality
This commit is contained in:
@@ -461,7 +461,7 @@ pireps:
|
||||
dpt_airport_id: KJFK
|
||||
arr_airport_id: KAUS
|
||||
flight_time: 180 # 6 hours
|
||||
state: 1 # pending
|
||||
state: 5 # draft
|
||||
source: 0 # manual
|
||||
flight_type: J
|
||||
route: PLMMR2 SPA Q22 BEARI FAK PHLBO3
|
||||
|
||||
@@ -26,6 +26,7 @@ use Flash;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Log;
|
||||
use PirepStatus;
|
||||
|
||||
/**
|
||||
* Class PirepController
|
||||
@@ -292,6 +293,17 @@ class PirepController extends Controller
|
||||
$this->saveFares($pirep, $request);
|
||||
$this->pirepSvc->saveRoute($pirep);
|
||||
|
||||
// Depending on the button they selected, set an initial state
|
||||
// Can be saved as a draft or just submitted
|
||||
if ($attrs['submit'] === 'save') {
|
||||
$pirep->status = PirepState::DRAFT;
|
||||
$pirep->save();
|
||||
Flash::success('PIREP saved successfully.');
|
||||
} else if ($attrs['submit'] === 'submit') {
|
||||
$this->pirepSvc->submit($pirep);
|
||||
Flash::success('PIREP submitted!');
|
||||
}
|
||||
|
||||
return redirect(route('frontend.pireps.show', ['id' => $pirep->id]));
|
||||
}
|
||||
|
||||
@@ -344,15 +356,12 @@ class PirepController extends Controller
|
||||
public function update($id, UpdatePirepRequest $request)
|
||||
{
|
||||
$pirep = $this->pirepRepo->findWithoutFail($id);
|
||||
|
||||
if (empty($pirep)) {
|
||||
Flash::error('Pirep not found');
|
||||
|
||||
return redirect(route('admin.pireps.index'));
|
||||
}
|
||||
|
||||
$orig_route = $pirep->route;
|
||||
|
||||
$attrs = $request->all();
|
||||
|
||||
# Fix the time
|
||||
@@ -370,8 +379,39 @@ class PirepController extends Controller
|
||||
$this->saveCustomFields($pirep, $request);
|
||||
$this->saveFares($pirep, $request);
|
||||
|
||||
Flash::success('Pirep updated successfully.');
|
||||
if($attrs['submit'] === 'save') {
|
||||
Flash::success('PIREP saved successfully.');
|
||||
} else if($attrs['submit'] === 'submit') {
|
||||
$this->pirepSvc->submit($pirep);
|
||||
Flash::success('PIREP submitted!');
|
||||
} else if($attrs['submit'] === 'cancel') {
|
||||
$this->pirepRepo->update([
|
||||
'state' => PirepState::CANCELLED,
|
||||
'status' => PirepStatus::CANCELLED,
|
||||
], $pirep->id);
|
||||
|
||||
Flash::success('PIREP cancelled!');
|
||||
return redirect(route('frontend.pireps.index'));
|
||||
}
|
||||
|
||||
return redirect(route('frontend.pireps.show', ['id' => $pirep->id]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit the PIREP
|
||||
* @param $id
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
|
||||
*/
|
||||
public function submit($id, Request $request)
|
||||
{
|
||||
$pirep = $this->pirepRepo->findWithoutFail($id);
|
||||
if (empty($pirep)) {
|
||||
Flash::error('PIREP not found');
|
||||
return redirect(route('admin.pireps.index'));
|
||||
}
|
||||
|
||||
$this->pirepSvc->submit($pirep);
|
||||
return redirect(route('frontend.pireps.show', ['id' => $pirep->id]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,20 +109,8 @@ class Pirep extends Model
|
||||
'score' => 'integer',
|
||||
'source' => 'integer',
|
||||
'state' => 'integer',
|
||||
#'block_off_time' => 'datetime',
|
||||
#'block_on_time' => 'datetime',
|
||||
#'submitted_at' => 'datetime',
|
||||
];
|
||||
|
||||
/*protected $dates = [
|
||||
'block_off_time',
|
||||
'block_on_time',
|
||||
'submitted_at',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
'deleted_at'
|
||||
];*/
|
||||
|
||||
public static $rules = [
|
||||
'airline_id' => 'required|exists:airlines,id',
|
||||
'aircraft_id' => 'required|exists:aircraft,id',
|
||||
@@ -133,10 +121,15 @@ class Pirep extends Model
|
||||
'route' => 'nullable',
|
||||
];
|
||||
|
||||
/*public static $sanitize = [
|
||||
'dpt_airport_id' => 'trim|uppercase',
|
||||
'arr_airport_id' => 'trim|uppercase',
|
||||
];*/
|
||||
/**
|
||||
* If a PIREP is in these states, then it can't be changed.
|
||||
*/
|
||||
public static $read_only_states = [
|
||||
PirepState::ACCEPTED,
|
||||
PirepState::REJECTED,
|
||||
PirepState::PENDING,
|
||||
PirepState::CANCELLED,
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the flight ident, e.,g JBU1900
|
||||
@@ -240,8 +233,7 @@ class Pirep extends Model
|
||||
*/
|
||||
public function getReadOnlyAttribute(): bool
|
||||
{
|
||||
return $this->state !== PirepState::PENDING
|
||||
&& $this->state != PirepState::IN_PROGRESS;
|
||||
return \in_array($this->state, static::$read_only_states, true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -375,11 +367,7 @@ class Pirep extends Model
|
||||
*/
|
||||
public function allowedUpdates(): bool
|
||||
{
|
||||
if ($this->state === PirepState::CANCELLED) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return ! $this->getReadOnlyAttribute();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -37,6 +37,7 @@ Route::group([
|
||||
|
||||
Route::get('pireps/fares', 'PirepController@fares');
|
||||
Route::resource('pireps', 'PirepController');
|
||||
Route::post('pireps/{id}/submit', 'PirepController@submit')->name('pireps.submit');
|
||||
|
||||
Route::get('profile/regen_apikey', 'ProfileController@regen_apikey')
|
||||
->name('profile.regen_apikey');
|
||||
|
||||
@@ -172,19 +172,6 @@ class PirepService extends Service
|
||||
$field_values = [];
|
||||
}
|
||||
|
||||
# Figure out what default state should be. Look at the default
|
||||
# behavior from the rank that the pilot is assigned to
|
||||
$default_state = PirepState::PENDING;
|
||||
if ($pirep->source === PirepSource::ACARS) {
|
||||
if ($pirep->pilot->rank->auto_approve_acars) {
|
||||
$default_state = PirepState::ACCEPTED;
|
||||
}
|
||||
} else {
|
||||
if ($pirep->pilot->rank->auto_approve_manual) {
|
||||
$default_state = PirepState::ACCEPTED;
|
||||
}
|
||||
}
|
||||
|
||||
# Check the block times. If a block on (arrival) time isn't
|
||||
# specified, then use the time that it was submitted. It won't
|
||||
# be the most accurate, but that might be OK
|
||||
@@ -214,6 +201,28 @@ class PirepService extends Service
|
||||
$this->updateCustomFields($pirep->id, $field_values);
|
||||
}
|
||||
|
||||
return $pirep;
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit the PIREP. Figure out its default state
|
||||
* @param Pirep $pirep
|
||||
*/
|
||||
public function submit(Pirep $pirep)
|
||||
{
|
||||
# Figure out what default state should be. Look at the default
|
||||
# behavior from the rank that the pilot is assigned to
|
||||
$default_state = PirepState::PENDING;
|
||||
if ($pirep->source === PirepSource::ACARS) {
|
||||
if ($pirep->pilot->rank->auto_approve_acars) {
|
||||
$default_state = PirepState::ACCEPTED;
|
||||
}
|
||||
} else {
|
||||
if ($pirep->pilot->rank->auto_approve_manual) {
|
||||
$default_state = PirepState::ACCEPTED;
|
||||
}
|
||||
}
|
||||
|
||||
Log::info('New PIREP filed', [$pirep]);
|
||||
event(new PirepFiled($pirep));
|
||||
|
||||
@@ -224,15 +233,13 @@ class PirepService extends Service
|
||||
}
|
||||
|
||||
# Check the user state, set them to ACTIVE if on leave
|
||||
if($pirep->user->state !== UserState::ACTIVE) {
|
||||
if ($pirep->user->state !== UserState::ACTIVE) {
|
||||
$old_state = $pirep->user->state;
|
||||
$pirep->user->state = UserState::ACTIVE;
|
||||
$pirep->user->save();
|
||||
|
||||
event(new UserStateChanged($pirep->user, $old_state));
|
||||
}
|
||||
|
||||
return $pirep;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -62,7 +62,7 @@ return [
|
||||
],
|
||||
'state' => [
|
||||
'accepted' => 'Accepted',
|
||||
'pending' => 'Pending',
|
||||
'pending' => 'Pending Approval',
|
||||
'rejected' => 'Rejected',
|
||||
'in_progress' => 'In Progress',
|
||||
'cancelled' => 'Cancelled',
|
||||
|
||||
@@ -308,8 +308,31 @@ flight reports that have been filed. You've been warned!
|
||||
<div class="col-sm-12">
|
||||
<div class="float-right">
|
||||
<div class="form-group">
|
||||
{{--{{ Form::button('Save Draft', ['class' => 'btn btn-primary']) }}--}}
|
||||
{{ Form::submit('Save PIREP', ['class' => 'btn btn-info']) }}
|
||||
|
||||
@if(isset($pirep) && !$pirep->read_only)
|
||||
{{ Form::button('Delete PIREP', [
|
||||
'name' => 'submit',
|
||||
'value' => 'cancel',
|
||||
'class' => 'btn btn-warning',
|
||||
'type' => 'submit'])
|
||||
}}
|
||||
@endif
|
||||
|
||||
@if(!isset($pirep) || (filled($pirep) && !$pirep->read_only))
|
||||
{{ Form::button('Save PIREP', [
|
||||
'name' => 'submit',
|
||||
'value' => 'save',
|
||||
'class' => 'btn btn-info',
|
||||
'type' => 'submit'])
|
||||
}}
|
||||
|
||||
{{ Form::button('Submit PIREP', [
|
||||
'name' => 'submit',
|
||||
'value' => 'submit',
|
||||
'class' => 'btn btn-success',
|
||||
'type' => 'submit'])
|
||||
}}
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
@section('title', 'PIREP '.$pirep->ident)
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="row">
|
||||
<div class="col-8">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<p>
|
||||
<h2 style="margin-bottom: 5px;">{{$pirep->airline->code}}{{ $pirep->ident }}</h2>
|
||||
<h2 style="margin-bottom: 5px;">{{$pirep->airline->code}}{{ $pirep->ident }}</h2>
|
||||
<p>
|
||||
@if($pirep->state === PirepState::IN_PROGRESS)
|
||||
|
||||
@@ -17,7 +16,6 @@
|
||||
@endif
|
||||
</p>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
@@ -62,9 +60,6 @@
|
||||
<div class="progress-bar progress-bar-success" role="progressbar"
|
||||
aria-valuenow="40" aria-valuemin="0" aria-valuemax="100"
|
||||
style="width: {{$pirep->progress_percent}}%;">
|
||||
{{--<p style="padding: 10px">
|
||||
{{ Utils::minutesToTimeString($pirep->flight_time) }}
|
||||
</p>--}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -86,26 +81,26 @@
|
||||
<div class="col-4">
|
||||
|
||||
<h2> </h2>
|
||||
<table class="table table-striped">
|
||||
{{--<tr>
|
||||
<td width="30%">Status</td>
|
||||
<td>
|
||||
@php
|
||||
if($pirep->state === PirepState::PENDING)
|
||||
$badge = 'warning';
|
||||
elseif ($pirep->state === PirepState::ACCEPTED)
|
||||
$badge = 'success';
|
||||
elseif ($pirep->state === PirepState::REJECTED)
|
||||
$badge = 'danger';
|
||||
else
|
||||
$badge = 'info';
|
||||
@endphp
|
||||
<div class="badge badge-{{$badge}}">
|
||||
{{ PirepState::label($pirep->state) }}
|
||||
</div>
|
||||
</td>
|
||||
</tr>--}}
|
||||
|
||||
{{-- Show the link to edit if it can be edited --}}
|
||||
@if(!$pirep->read_only)
|
||||
<div class="float-right" style="margin-bottom: 10px;">
|
||||
<form method="get"
|
||||
action="{{ route('frontend.pireps.edit', ['id' => $pirep->id]) }}"
|
||||
style="display: inline">
|
||||
@csrf
|
||||
<button class="btn btn-info">Edit</button>
|
||||
</form>
|
||||
|
||||
<form method="post"
|
||||
action="{{ route('frontend.pireps.submit', ['id' => $pirep->id]) }}"
|
||||
style="display: inline">
|
||||
@csrf
|
||||
<button class="btn btn-success">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
@endif
|
||||
<table class="table table-striped">
|
||||
<tr>
|
||||
<td width="30%">State</td>
|
||||
<td>
|
||||
@@ -119,20 +114,6 @@
|
||||
<td>Source</td>
|
||||
<td>{{ PirepSource::label($pirep->source) }}</td>
|
||||
</tr>
|
||||
{{--<tr>--}}
|
||||
{{--<td>Departure/Arrival</td>--}}
|
||||
{{--<td>--}}
|
||||
{{--{{ $pirep->dpt_airport->name }}--}}
|
||||
{{--(<a href="{{route('frontend.airports.show', [--}}
|
||||
{{--'id' => $pirep->dpt_airport->icao--}}
|
||||
{{--])}}">{{$pirep->dpt_airport->icao}}</a>)--}}
|
||||
{{--<span class="description">to</span>--}}
|
||||
{{--{{ $pirep->arr_airport->name }}--}}
|
||||
{{--(<a href="{{route('frontend.airports.show', [--}}
|
||||
{{--'id' => $pirep->arr_airport->icao--}}
|
||||
{{--])}}">{{$pirep->arr_airport->icao}}</a>)--}}
|
||||
{{--</td>--}}
|
||||
{{--</tr>--}}
|
||||
|
||||
<tr>
|
||||
<td>Flight Type</td>
|
||||
|
||||
@@ -231,6 +231,7 @@ class PIREPTest extends TestCase
|
||||
|
||||
# Pilot should be at rank 2, where accept should be automatic
|
||||
$this->pirepSvc->create($pirep);
|
||||
$this->pirepSvc->submit($pirep);
|
||||
|
||||
$pilot->refresh();
|
||||
$latest_pirep = Pirep::where('id', $pilot->last_pirep_id)->first();
|
||||
|
||||
Reference in New Issue
Block a user