Fix PIREP field and non-existant airport errors when editing PIREPs
This commit is contained in:
@@ -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');
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
*/
|
*/
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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']
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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>
|
<b>DEP</b>
|
||||||
{{ $pirep->dpt_airport->icao }}
|
{{ $pirep->dpt_airport_id }}
|
||||||
<b>ARR</b>
|
<b>ARR</b>
|
||||||
{{ $pirep->arr_airport->icao }}
|
{{ $pirep->arr_airport_id }}
|
||||||
</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 @@
|
|||||||
{{ trans_choice('pireps.fare', 2) }}
|
{{ 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!
|
|||||||
{{ trans_choice('common.field', 2) }}
|
{{ 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
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user