From 9cc640b86671c3d0653c37b3e9f96aeeddc52442 Mon Sep 17 00:00:00 2001 From: Nabeel Shahzad Date: Thu, 12 Jul 2018 21:20:10 -0500 Subject: [PATCH] Fix PIREP field and non-existant airport errors when editing PIREPs --- .../2017_06_28_195426_create_pirep_tables.php | 2 +- app/Database/seeds/sample.yml | 36 +++++++++++-------- .../Controllers/Admin/PirepController.php | 3 +- app/Http/Controllers/Api/PirepController.php | 3 +- .../Controllers/Frontend/PirepController.php | 6 +++- app/Models/Enums/PirepFieldSource.php | 15 ++++++++ app/Models/Pirep.php | 33 +++++++++++++++-- ...repFieldValues.php => PirepFieldValue.php} | 18 ++++++++-- app/Providers/AppServiceProvider.php | 4 +-- app/Services/PirepService.php | 6 ++-- public/assets/admin/css/admin.css | 4 +++ .../views/admin/pireps/field_values.blade.php | 10 ++++-- .../views/admin/pireps/pirep_card.blade.php | 4 +-- .../default/pireps/custom_fields.blade.php | 21 +++++++++++ .../layouts/default/pireps/fares.blade.php | 2 +- .../layouts/default/pireps/fields.blade.php | 22 +----------- .../layouts/default/pireps/table.blade.php | 12 +++---- tests/AcarsTest.php | 2 +- 18 files changed, 138 insertions(+), 65 deletions(-) create mode 100644 app/Models/Enums/PirepFieldSource.php rename app/Models/{PirepFieldValues.php => PirepFieldValue.php} (63%) create mode 100644 resources/views/layouts/default/pireps/custom_fields.blade.php diff --git a/app/Database/migrations/2017_06_28_195426_create_pirep_tables.php b/app/Database/migrations/2017_06_28_195426_create_pirep_tables.php index 66ad7b02..f32cba12 100644 --- a/app/Database/migrations/2017_06_28_195426_create_pirep_tables.php +++ b/app/Database/migrations/2017_06_28_195426_create_pirep_tables.php @@ -84,7 +84,7 @@ class CreatePirepTables extends Migration $table->string('name', 50); $table->string('slug', 50)->nullable(); $table->string('value')->nullable(); - $table->string('source')->nullable(); + $table->unsignedTinyInteger('source'); $table->timestamps(); $table->index('pirep_id'); diff --git a/app/Database/seeds/sample.yml b/app/Database/seeds/sample.yml index f07fe30e..ac4fe439 100644 --- a/app/Database/seeds/sample.yml +++ b/app/Database/seeds/sample.yml @@ -393,10 +393,10 @@ flights: updated_at: NOW flight_fields: - - name: Departure Gate - slug: departure-gate - - name: Arrival Gate - slug: arrival-gate + - name: Departure Terminal + slug: departure-terminal + - name: Arrival Terminal + slug: arrival-terminal flight_field_values: - id: 1 @@ -540,27 +540,33 @@ pirep_fares: pirep_fields: - id: 1 - name: departure gate - slug: departure-gate + name: departure terminal + slug: departure-terminal required: 1 - id: 2 - name: arrival gate - slug: arrival-gate + name: arrival terminal + slug: arrival-terminal required: 0 pirep_field_values: - id: 1 pirep_id: pirepid_1 - name: arrival gate - slug: arrival-gate + name: arrival terminal + slug: arrival-terminal value: 10 - source: manual + source: 0 - id: 2 pirep_id: pirepid_1 - name: departure gate - slug: departure-gate - value: B32 - source: manual + name: departure terminal + slug: departure-terminal + value: 4 + source: 0 + - id: 3 + pirep_id: pirepid_1 + name: Landing Rate + slug: landing-rate + value: -225.3 + source: 1 pirep_comments: - id: 1 diff --git a/app/Http/Controllers/Admin/PirepController.php b/app/Http/Controllers/Admin/PirepController.php index 7601d682..3f5188db 100644 --- a/app/Http/Controllers/Admin/PirepController.php +++ b/app/Http/Controllers/Admin/PirepController.php @@ -298,7 +298,8 @@ class PirepController extends Controller # set the custom fields foreach ($pirep->fields as $field) { - $pirep->{$field->slug} = $field->value; + $field_name = 'field_'.$field->slug; + $pirep->{$field_name} = $field->value; } # set the fares diff --git a/app/Http/Controllers/Api/PirepController.php b/app/Http/Controllers/Api/PirepController.php index 06765e42..8a46dc30 100644 --- a/app/Http/Controllers/Api/PirepController.php +++ b/app/Http/Controllers/Api/PirepController.php @@ -20,6 +20,7 @@ use App\Http\Resources\PirepFieldCollection; use App\Interfaces\Controller; use App\Models\Acars; use App\Models\Enums\AcarsType; +use App\Models\Enums\PirepFieldSource; use App\Models\Enums\PirepSource; use App\Models\Enums\PirepState; use App\Models\Enums\PirepStatus; @@ -122,7 +123,7 @@ class PirepController extends Controller $pirep_fields[] = [ 'name' => $field_name, 'value' => $field_value, - 'source' => $pirep->source, + 'source' => PirepFieldSource::ACARS, ]; } diff --git a/app/Http/Controllers/Frontend/PirepController.php b/app/Http/Controllers/Frontend/PirepController.php index c58b7729..e900ccb1 100644 --- a/app/Http/Controllers/Frontend/PirepController.php +++ b/app/Http/Controllers/Frontend/PirepController.php @@ -332,6 +332,9 @@ class PirepController extends Controller 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); $pirep->hours = $time->hours; $pirep->minutes = $time->minutes; @@ -342,7 +345,8 @@ class PirepController extends Controller $field->slug = str_slug($field->name); } - $pirep->{$field->slug} = $field->value; + $field_name = 'field_'.$field->slug; + $pirep->{$field_name} = $field->value; } # set the fares diff --git a/app/Models/Enums/PirepFieldSource.php b/app/Models/Enums/PirepFieldSource.php new file mode 100644 index 00000000..cc7784f8 --- /dev/null +++ b/app/Models/Enums/PirepFieldSource.php @@ -0,0 +1,15 @@ +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 * @return Flight|null @@ -454,9 +481,9 @@ class Pirep extends Model 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() diff --git a/app/Models/PirepFieldValues.php b/app/Models/PirepFieldValue.php similarity index 63% rename from app/Models/PirepFieldValues.php rename to app/Models/PirepFieldValue.php index 584944d8..02552058 100644 --- a/app/Models/PirepFieldValues.php +++ b/app/Models/PirepFieldValue.php @@ -3,12 +3,13 @@ namespace App\Models; use App\Interfaces\Model; +use App\Models\Enums\PirepFieldSource; /** - * Class PirepFieldValues + * Class PirepFieldValue * @package App\Models */ -class PirepFieldValues extends Model +class PirepFieldValue extends Model { public $table = 'pirep_field_values'; @@ -24,6 +25,19 @@ class PirepFieldValues extends Model '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 */ diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ce371553..7bbe4a22 100755 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -16,7 +16,7 @@ use App\Models\Observers\Sluggable; use App\Models\Observers\SettingObserver; use App\Models\Observers\SubfleetObserver; use App\Models\PirepField; -use App\Models\PirepFieldValues; +use App\Models\PirepFieldValue; use App\Models\Setting; use App\Models\Subfleet; use App\Repositories\SettingRepository; @@ -49,7 +49,7 @@ class AppServiceProvider extends ServiceProvider FlightFieldValue::observe(Sluggable::class); PirepField::observe(Sluggable::class); - PirepFieldValues::observe(Sluggable::class); + PirepFieldValue::observe(Sluggable::class); Setting::observe(SettingObserver::class); Subfleet::observe(SubfleetObserver::class); diff --git a/app/Services/PirepService.php b/app/Services/PirepService.php index 6b7e68fa..cbe2780e 100644 --- a/app/Services/PirepService.php +++ b/app/Services/PirepService.php @@ -17,7 +17,7 @@ use App\Models\Enums\PirepStatus; use App\Models\Enums\UserState; use App\Models\Navdata; use App\Models\Pirep; -use App\Models\PirepFieldValues; +use App\Models\PirepFieldValue; use App\Models\User; use App\Repositories\AcarsRepository; use App\Repositories\FlightRepository; @@ -152,7 +152,7 @@ class PirepService extends Service * Create a new PIREP with some given fields * * @param Pirep $pirep - * @param array [PirepFieldValues] $field_values + * @param array PirepFieldValue[] $field_values * * @return Pirep */ @@ -244,7 +244,7 @@ class PirepService extends Service public function updateCustomFields($pirep_id, array $field_values) { foreach ($field_values as $fv) { - PirepFieldValues::updateOrCreate( + PirepFieldValue::updateOrCreate( ['pirep_id' => $pirep_id, 'name' => $fv['name'] ], diff --git a/public/assets/admin/css/admin.css b/public/assets/admin/css/admin.css index e7ce00bd..dba05404 100644 --- a/public/assets/admin/css/admin.css +++ b/public/assets/admin/css/admin.css @@ -3,6 +3,10 @@ * */ +.form-container { + font-weight: normal; +} + .select2-container { margin-top: 2px; } diff --git a/resources/views/admin/pireps/field_values.blade.php b/resources/views/admin/pireps/field_values.blade.php index 17cdab55..06144b54 100644 --- a/resources/views/admin/pireps/field_values.blade.php +++ b/resources/views/admin/pireps/field_values.blade.php @@ -15,9 +15,13 @@
- {{ Form::text($field->slug, null, [ - 'class' => 'form-control' - ]) }} + @if(!$field->read_only) + {{ Form::text($field->slug, $field->value, [ + 'class' => 'form-control' + ]) }} + @else +

{{ $field->value }}

+ @endif

{{ $errors->first($field->slug) }}

diff --git a/resources/views/admin/pireps/pirep_card.blade.php b/resources/views/admin/pireps/pirep_card.blade.php index e0c9707c..9b587824 100644 --- a/resources/views/admin/pireps/pirep_card.blade.php +++ b/resources/views/admin/pireps/pirep_card.blade.php @@ -28,9 +28,9 @@
DEP  - {{ $pirep->dpt_airport->icao }}  + {{ $pirep->dpt_airport_id }}  ARR  - {{ $pirep->arr_airport->icao }}  + {{ $pirep->arr_airport_id }} 
diff --git a/resources/views/layouts/default/pireps/custom_fields.blade.php b/resources/views/layouts/default/pireps/custom_fields.blade.php new file mode 100644 index 00000000..32a97313 --- /dev/null +++ b/resources/views/layouts/default/pireps/custom_fields.blade.php @@ -0,0 +1,21 @@ + + + {{ $field->name }} + @if($field->required === true) + * + @endif + + +
+ @if(!$field->read_only) + {{ Form::text($field->slug, $field->value, [ + 'class' => 'form-control', + 'readonly' => (!empty($pirep) && $pirep->read_only), + ]) }} + @else + {{ $field->value }} + @endif +
+

{{ $errors->first($field->slug) }}

+ + diff --git a/resources/views/layouts/default/pireps/fares.blade.php b/resources/views/layouts/default/pireps/fares.blade.php index 5ee31199..a6c05575 100644 --- a/resources/views/layouts/default/pireps/fares.blade.php +++ b/resources/views/layouts/default/pireps/fares.blade.php @@ -4,7 +4,7 @@  {{ trans_choice('pireps.fare', 2) }}
- @foreach($aircraft->subfleet->fares as $fare) + @foreach($pirep->aircraft->subfleet->fares as $fare)
{{Form::label('fare_'.$fare->id, $fare->name.' ('.$fare->code.')')}} diff --git a/resources/views/layouts/default/pireps/fields.blade.php b/resources/views/layouts/default/pireps/fields.blade.php index 86a04376..652a5227 100644 --- a/resources/views/layouts/default/pireps/fields.blade.php +++ b/resources/views/layouts/default/pireps/fields.blade.php @@ -276,36 +276,16 @@ flight reports that have been filed. You've been warned!  {{ trans_choice('common.field', 2) }}
- {{-- Write out the custom fields, and label if they're required --}} - @foreach($pirep_fields as $field) - - - {{ $field->name }} - @if($field->required === true) - * - @endif - - -
- {{ Form::text($field->slug, null, [ - 'class' => 'form-control', - 'readonly' => (!empty($pirep) && $pirep->read_only), - ]) }} -
-

{{ $errors->first($field->slug) }}

- - - @endforeach + @each('pireps.custom_fields', $pirep->fields, 'field')
@include('pireps.fares')
-
diff --git a/resources/views/layouts/default/pireps/table.blade.php b/resources/views/layouts/default/pireps/table.blade.php index 2762c3ca..912dde44 100644 --- a/resources/views/layouts/default/pireps/table.blade.php +++ b/resources/views/layouts/default/pireps/table.blade.php @@ -22,16 +22,12 @@ $pirep->id]) }}">{{ $pirep->airline->code }}{{ $pirep->ident }} - {{ $pirep->dpt_airport->name }} - ({{$pirep->dpt_airport->icao}}) + @if($pirep->dpt_airport){{ $pirep->dpt_airport->name }}@endif + ({{$pirep->dpt_airport_id}}) - {{ $pirep->arr_airport->name }} - ({{$pirep->arr_airport->icao}}) + @if($pirep->arr_airport){{ $pirep->arr_airport->name }}@endif + ({{$pirep->arr_airport_id}}) @if($pirep->aircraft) diff --git a/tests/AcarsTest.php b/tests/AcarsTest.php index 90e611bb..bf185d10 100644 --- a/tests/AcarsTest.php +++ b/tests/AcarsTest.php @@ -226,7 +226,7 @@ class AcarsTest extends TestCase $this->assertEquals($fare->capacity, $saved_fare['count']); # 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); $field = $saved_fields->first();