Fix PIREP field and non-existant airport errors when editing PIREPs

This commit is contained in:
Nabeel Shahzad
2018-07-12 21:20:10 -05:00
parent 85615300e0
commit 9cc640b866
18 changed files with 138 additions and 65 deletions
@@ -84,7 +84,7 @@ class CreatePirepTables extends Migration
$table->string('name', 50); $table->string('name', 50);
$table->string('slug', 50)->nullable(); $table->string('slug', 50)->nullable();
$table->string('value')->nullable(); $table->string('value')->nullable();
$table->string('source')->nullable(); $table->unsignedTinyInteger('source');
$table->timestamps(); $table->timestamps();
$table->index('pirep_id'); $table->index('pirep_id');
+21 -15
View File
@@ -393,10 +393,10 @@ flights:
updated_at: NOW updated_at: NOW
flight_fields: flight_fields:
- name: Departure Gate - name: Departure Terminal
slug: departure-gate slug: departure-terminal
- name: Arrival Gate - name: Arrival Terminal
slug: arrival-gate slug: arrival-terminal
flight_field_values: flight_field_values:
- id: 1 - id: 1
@@ -540,27 +540,33 @@ pirep_fares:
pirep_fields: pirep_fields:
- id: 1 - id: 1
name: departure gate name: departure terminal
slug: departure-gate slug: departure-terminal
required: 1 required: 1
- id: 2 - id: 2
name: arrival gate name: arrival terminal
slug: arrival-gate slug: arrival-terminal
required: 0 required: 0
pirep_field_values: pirep_field_values:
- id: 1 - id: 1
pirep_id: pirepid_1 pirep_id: pirepid_1
name: arrival gate name: arrival terminal
slug: arrival-gate slug: arrival-terminal
value: 10 value: 10
source: manual source: 0
- id: 2 - id: 2
pirep_id: pirepid_1 pirep_id: pirepid_1
name: departure gate name: departure terminal
slug: departure-gate slug: departure-terminal
value: B32 value: 4
source: manual source: 0
- id: 3
pirep_id: pirepid_1
name: Landing Rate
slug: landing-rate
value: -225.3
source: 1
pirep_comments: pirep_comments:
- id: 1 - id: 1
@@ -298,7 +298,8 @@ class PirepController extends Controller
# set the custom fields # set the custom fields
foreach ($pirep->fields as $field) { foreach ($pirep->fields as $field) {
$pirep->{$field->slug} = $field->value; $field_name = 'field_'.$field->slug;
$pirep->{$field_name} = $field->value;
} }
# set the fares # set the fares
+2 -1
View File
@@ -20,6 +20,7 @@ use App\Http\Resources\PirepFieldCollection;
use App\Interfaces\Controller; use App\Interfaces\Controller;
use App\Models\Acars; use App\Models\Acars;
use App\Models\Enums\AcarsType; use App\Models\Enums\AcarsType;
use App\Models\Enums\PirepFieldSource;
use App\Models\Enums\PirepSource; use App\Models\Enums\PirepSource;
use App\Models\Enums\PirepState; use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus; use App\Models\Enums\PirepStatus;
@@ -122,7 +123,7 @@ class PirepController extends Controller
$pirep_fields[] = [ $pirep_fields[] = [
'name' => $field_name, 'name' => $field_name,
'value' => $field_value, 'value' => $field_value,
'source' => $pirep->source, 'source' => PirepFieldSource::ACARS,
]; ];
} }
@@ -332,6 +332,9 @@ class PirepController extends Controller
return redirect(route('frontend.pireps.index')); return redirect(route('frontend.pireps.index'));
} }
# Eager load the subfleet and fares under it
$pirep->aircraft->load('subfleet.fares');
$time = new Time($pirep->flight_time); $time = new Time($pirep->flight_time);
$pirep->hours = $time->hours; $pirep->hours = $time->hours;
$pirep->minutes = $time->minutes; $pirep->minutes = $time->minutes;
@@ -342,7 +345,8 @@ class PirepController extends Controller
$field->slug = str_slug($field->name); $field->slug = str_slug($field->name);
} }
$pirep->{$field->slug} = $field->value; $field_name = 'field_'.$field->slug;
$pirep->{$field_name} = $field->value;
} }
# set the fares # set the fares
+15
View File
@@ -0,0 +1,15 @@
<?php
namespace App\Models\Enums;
use App\Interfaces\Enum;
/**
* Class AcarsType
* @package App\Models\Enums
*/
class PirepFieldSource extends Enum
{
public const MANUAL = 0;
public const ACARS = 1;
}
+30 -3
View File
@@ -4,6 +4,7 @@ namespace App\Models;
use App\Interfaces\Model; use App\Interfaces\Model;
use App\Models\Enums\AcarsType; use App\Models\Enums\AcarsType;
use App\Models\Enums\PirepFieldSource;
use App\Models\Enums\PirepState; use App\Models\Enums\PirepState;
use App\Models\Traits\HashIdTrait; use App\Models\Traits\HashIdTrait;
use App\Support\Units\Distance; use App\Support\Units\Distance;
@@ -128,7 +129,7 @@ class Pirep extends Model
* If a PIREP is in these states, then it can't be changed. * If a PIREP is in these states, then it can't be changed.
*/ */
public static $read_only_states = [ public static $read_only_states = [
PirepState::PENDING, //PirepState::PENDING,
PirepState::ACCEPTED, PirepState::ACCEPTED,
PirepState::REJECTED, PirepState::REJECTED,
PirepState::CANCELLED, PirepState::CANCELLED,
@@ -301,6 +302,32 @@ class Pirep extends Model
return round(($this->distance['nmi'] / $upper_bound) * 100, 0); return round(($this->distance['nmi'] / $upper_bound) * 100, 0);
} }
/**
* Get the pirep_fields and then the pirep_field_values and
* merge them together. If a field value doesn't exist then add in a fake one
*/
public function getFieldsAttribute()
{
$custom_fields = PirepField::all();
$field_values = PirepFieldValue::where('pirep_id', $this->id)->get();
# Merge the field values into $fields
foreach($custom_fields as $field) {
$has_value = $field_values->firstWhere('slug', $field->slug);
if(!$has_value) {
$field_values->push(new PirepFieldValue([
'pirep_id' => $this->id,
'name' => $field->name,
'slug' => $field->slug,
'value' => '',
'source' => PirepFieldSource::MANUAL
]));
}
}
return $field_values->sortBy('source');
}
/** /**
* Look up the flight, based on the PIREP flight info * Look up the flight, based on the PIREP flight info
* @return Flight|null * @return Flight|null
@@ -454,9 +481,9 @@ class Pirep extends Model
return $this->hasMany(PirepFare::class, 'pirep_id'); return $this->hasMany(PirepFare::class, 'pirep_id');
} }
public function fields() public function field_values()
{ {
return $this->hasMany(PirepFieldValues::class, 'pirep_id'); return $this->hasMany(PirepFieldValue::class, 'pirep_id');
} }
public function pilot() public function pilot()
@@ -3,12 +3,13 @@
namespace App\Models; namespace App\Models;
use App\Interfaces\Model; use App\Interfaces\Model;
use App\Models\Enums\PirepFieldSource;
/** /**
* Class PirepFieldValues * Class PirepFieldValue
* @package App\Models * @package App\Models
*/ */
class PirepFieldValues extends Model class PirepFieldValue extends Model
{ {
public $table = 'pirep_field_values'; public $table = 'pirep_field_values';
@@ -24,6 +25,19 @@ class PirepFieldValues extends Model
'name' => 'required', 'name' => 'required',
]; ];
protected $casts = [
'source' => 'integer',
];
/**
* If it was filled in from ACARS, then it's read only
* @return bool
*/
public function getReadOnlyAttribute()
{
return $this->source === PirepFieldSource::ACARS;
}
/** /**
* @param $name * @param $name
*/ */
+2 -2
View File
@@ -16,7 +16,7 @@ use App\Models\Observers\Sluggable;
use App\Models\Observers\SettingObserver; use App\Models\Observers\SettingObserver;
use App\Models\Observers\SubfleetObserver; use App\Models\Observers\SubfleetObserver;
use App\Models\PirepField; use App\Models\PirepField;
use App\Models\PirepFieldValues; use App\Models\PirepFieldValue;
use App\Models\Setting; use App\Models\Setting;
use App\Models\Subfleet; use App\Models\Subfleet;
use App\Repositories\SettingRepository; use App\Repositories\SettingRepository;
@@ -49,7 +49,7 @@ class AppServiceProvider extends ServiceProvider
FlightFieldValue::observe(Sluggable::class); FlightFieldValue::observe(Sluggable::class);
PirepField::observe(Sluggable::class); PirepField::observe(Sluggable::class);
PirepFieldValues::observe(Sluggable::class); PirepFieldValue::observe(Sluggable::class);
Setting::observe(SettingObserver::class); Setting::observe(SettingObserver::class);
Subfleet::observe(SubfleetObserver::class); Subfleet::observe(SubfleetObserver::class);
+3 -3
View File
@@ -17,7 +17,7 @@ use App\Models\Enums\PirepStatus;
use App\Models\Enums\UserState; use App\Models\Enums\UserState;
use App\Models\Navdata; use App\Models\Navdata;
use App\Models\Pirep; use App\Models\Pirep;
use App\Models\PirepFieldValues; use App\Models\PirepFieldValue;
use App\Models\User; use App\Models\User;
use App\Repositories\AcarsRepository; use App\Repositories\AcarsRepository;
use App\Repositories\FlightRepository; use App\Repositories\FlightRepository;
@@ -152,7 +152,7 @@ class PirepService extends Service
* Create a new PIREP with some given fields * Create a new PIREP with some given fields
* *
* @param Pirep $pirep * @param Pirep $pirep
* @param array [PirepFieldValues] $field_values * @param array PirepFieldValue[] $field_values
* *
* @return Pirep * @return Pirep
*/ */
@@ -244,7 +244,7 @@ class PirepService extends Service
public function updateCustomFields($pirep_id, array $field_values) public function updateCustomFields($pirep_id, array $field_values)
{ {
foreach ($field_values as $fv) { foreach ($field_values as $fv) {
PirepFieldValues::updateOrCreate( PirepFieldValue::updateOrCreate(
['pirep_id' => $pirep_id, ['pirep_id' => $pirep_id,
'name' => $fv['name'] 'name' => $fv['name']
], ],
+4
View File
@@ -3,6 +3,10 @@
* *
*/ */
.form-container {
font-weight: normal;
}
.select2-container { .select2-container {
margin-top: 2px; margin-top: 2px;
} }
@@ -15,9 +15,13 @@
</td> </td>
<td> <td>
<div class="form-group"> <div class="form-group">
{{ Form::text($field->slug, null, [ @if(!$field->read_only)
'class' => 'form-control' {{ Form::text($field->slug, $field->value, [
]) }} 'class' => 'form-control'
]) }}
@else
<p>{{ $field->value }}</p>
@endif
</div> </div>
<p class="text-danger">{{ $errors->first($field->slug) }}</p> <p class="text-danger">{{ $errors->first($field->slug) }}</p>
</td> </td>
@@ -28,9 +28,9 @@
<div> <div>
<span class="description"> <span class="description">
<b>DEP</b>&nbsp; <b>DEP</b>&nbsp;
{{ $pirep->dpt_airport->icao }}&nbsp; {{ $pirep->dpt_airport_id }}&nbsp;
<b>ARR</b>&nbsp; <b>ARR</b>&nbsp;
{{ $pirep->arr_airport->icao }}&nbsp; {{ $pirep->arr_airport_id }}&nbsp;
</span> </span>
</div> </div>
<div> <div>
@@ -0,0 +1,21 @@
<tr>
<td>
{{ $field->name }}
@if($field->required === true)
<span class="text-danger">*</span>
@endif
</td>
<td>
<div class="input-group input-group-sm form-group">
@if(!$field->read_only)
{{ Form::text($field->slug, $field->value, [
'class' => 'form-control',
'readonly' => (!empty($pirep) && $pirep->read_only),
]) }}
@else
{{ $field->value }}
@endif
</div>
<p class="text-danger">{{ $errors->first($field->slug) }}</p>
</td>
</tr>
@@ -4,7 +4,7 @@
&nbsp;{{ trans_choice('pireps.fare', 2) }} &nbsp;{{ trans_choice('pireps.fare', 2) }}
</h6> </h6>
<div class="form-container-body"> <div class="form-container-body">
@foreach($aircraft->subfleet->fares as $fare) @foreach($pirep->aircraft->subfleet->fares as $fare)
<div class="row"> <div class="row">
<div class="col"> <div class="col">
{{Form::label('fare_'.$fare->id, $fare->name.' ('.$fare->code.')')}} {{Form::label('fare_'.$fare->id, $fare->name.' ('.$fare->code.')')}}
@@ -276,36 +276,16 @@ flight reports that have been filed. You've been warned!
&nbsp;{{ trans_choice('common.field', 2) }} &nbsp;{{ trans_choice('common.field', 2) }}
</h6> </h6>
<div class="form-container-body"> <div class="form-container-body">
{{-- {{--
Write out the custom fields, and label if they're required Write out the custom fields, and label if they're required
--}} --}}
@foreach($pirep_fields as $field) @each('pireps.custom_fields', $pirep->fields, 'field')
<tr>
<td>
{{ $field->name }}
@if($field->required === true)
<span class="text-danger">*</span>
@endif
</td>
<td>
<div class="input-group input-group-sm form-group">
{{ Form::text($field->slug, null, [
'class' => 'form-control',
'readonly' => (!empty($pirep) && $pirep->read_only),
]) }}
</div>
<p class="text-danger">{{ $errors->first($field->slug) }}</p>
</td>
</tr>
@endforeach
</div> </div>
</div> </div>
<div id="fares_container"> <div id="fares_container">
@include('pireps.fares') @include('pireps.fares')
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@@ -22,16 +22,12 @@
$pirep->id]) }}">{{ $pirep->airline->code }}{{ $pirep->ident }}</a> $pirep->id]) }}">{{ $pirep->airline->code }}{{ $pirep->ident }}</a>
</td> </td>
<td> <td>
{{ $pirep->dpt_airport->name }} @if($pirep->dpt_airport){{ $pirep->dpt_airport->name }}@endif
(<a href="{{route('frontend.airports.show', [ (<a href="{{route('frontend.airports.show', ['id' => $pirep->dpt_airport_id])}}">{{$pirep->dpt_airport_id}}</a>)
'id' => $pirep->dpt_airport->icao
])}}">{{$pirep->dpt_airport->icao}}</a>)
</td> </td>
<td> <td>
{{ $pirep->arr_airport->name }} @if($pirep->arr_airport){{ $pirep->arr_airport->name }}@endif
(<a href="{{route('frontend.airports.show', [ (<a href="{{route('frontend.airports.show', ['id' => $pirep->arr_airport_id])}}">{{$pirep->arr_airport_id}}</a>)
'id' => $pirep->arr_airport->icao
])}}">{{$pirep->arr_airport->icao}}</a>)
</td> </td>
<td> <td>
@if($pirep->aircraft) @if($pirep->aircraft)
+1 -1
View File
@@ -226,7 +226,7 @@ class AcarsTest extends TestCase
$this->assertEquals($fare->capacity, $saved_fare['count']); $this->assertEquals($fare->capacity, $saved_fare['count']);
# Check saved fields # Check saved fields
$saved_fields = \App\Models\PirepFieldValues::where('pirep_id', $pirep['id'])->get(); $saved_fields = \App\Models\PirepFieldValue::where('pirep_id', $pirep['id'])->get();
$this->assertCount(1, $saved_fields); $this->assertCount(1, $saved_fields);
$field = $saved_fields->first(); $field = $saved_fields->first();