Skip to content

Commit

Permalink
Option for SB only on bids; add the new file type #642
Browse files Browse the repository at this point in the history
  • Loading branch information
nabeelio committed Mar 27, 2020
1 parent f3fe3a5 commit 23be225
Show file tree
Hide file tree
Showing 15 changed files with 734 additions and 47 deletions.
7 changes: 7 additions & 0 deletions app/Database/seeds/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,13 @@
options: ''
type: string
description: 'Your SimBrief API key'
- key: simbrief.only_bids
name: 'Only allow for bids'
group: simbrief
value: true
options: ''
type: boolean
description: 'Only allow briefs to be created for bidded flights'
- key: simbrief.expire_days
name: 'SimBrief Expire Time'
group: simbrief
Expand Down
40 changes: 26 additions & 14 deletions app/Http/Controllers/Frontend/FlightController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@
use App\Repositories\Criteria\WhereCriteria;
use App\Repositories\FlightRepository;
use App\Repositories\SubfleetRepository;
use App\Repositories\UserRepository;
use App\Services\GeoService;
use Flash;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Laracasts\Flash\Flash;
use Prettus\Repository\Criteria\RequestCriteria;
use Prettus\Repository\Exceptions\RepositoryException;

Expand All @@ -24,26 +25,30 @@ class FlightController extends Controller
private $flightRepo;
private $subfleetRepo;
private $geoSvc;
private $userRepo;

/**
* @param AirlineRepository $airlineRepo
* @param AirportRepository $airportRepo
* @param FlightRepository $flightRepo
* @param GeoService $geoSvc
* @param SubfleetRepository $subfleetRepo
* @param UserRepository $userRepo
*/
public function __construct(
AirlineRepository $airlineRepo,
AirportRepository $airportRepo,
FlightRepository $flightRepo,
GeoService $geoSvc,
SubfleetRepository $subfleetRepo
SubfleetRepository $subfleetRepo,
UserRepository $userRepo
) {
$this->airlineRepo = $airlineRepo;
$this->airportRepo = $airportRepo;
$this->flightRepo = $flightRepo;
$this->geoSvc = $geoSvc;
$this->subfleetRepo = $subfleetRepo;
$this->userRepo = $userRepo;
}

/**
Expand Down Expand Up @@ -113,6 +118,7 @@ public function search(Request $request)
'dep_icao' => $request->input('dep_icao'),
'subfleet_id' => $request->input('subfleet_id'),
'simbrief' => !empty(setting('simbrief.api_key')),
'simbrief_bids' => setting('simbrief.only_bids'),
]);
}

Expand All @@ -125,19 +131,25 @@ public function search(Request $request)
*/
public function bids(Request $request)
{
$user = Auth::user();

$flights = $user->flights()->paginate();
$saved_flights = $flights->pluck('id')->toArray();
$user = $this->userRepo
->with(['bids', 'bids.flight'])
->find(Auth::user()->id);

$flights = collect();
$saved_flights = [];
foreach ($user->bids as $bid) {
$flights->add($bid->flight);
$saved_flights[] = $bid->flight->id;
}

return view('flights.index', [
'title' => trans_choice('flights.mybid', 2),
'airlines' => $this->airlineRepo->selectBoxList(true),
'airports' => $this->airportRepo->selectBoxList(true),
'flights' => $flights,
'saved' => $saved_flights,
'subfleets' => $this->subfleetRepo->selectBoxList(true),
'simbrief' => !empty(setting('simbrief.api_key')),
return view('flights.bids', [
'airlines' => $this->airlineRepo->selectBoxList(true),
'airports' => $this->airportRepo->selectBoxList(true),
'flights' => $flights,
'saved' => $saved_flights,
'subfleets' => $this->subfleetRepo->selectBoxList(true),
'simbrief' => !empty(setting('simbrief.api_key')),
'simbrief_bids' => setting('simbrief.only_bids'),
]);
}

Expand Down
15 changes: 15 additions & 0 deletions app/Models/SimBriefXML.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,21 @@ public function getFlightLevel(): string
return str_pad($fl, 3, '0', STR_PAD_LEFT);
}

/**
* Return the URL to the vmsACARS flight plan file
*
* @return string|null
*/
public function getAcarsXmlUrl()
{
if (!empty($this->fms_downloads->vms)) {
$base_url = $this->fms_downloads->directory;
return $base_url.$this->fms_downloads->vms->link;
}

return null;
}

/**
* Retrieve all of the flightplans
*
Expand Down
60 changes: 50 additions & 10 deletions app/Services/SimBriefService.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use App\Models\Enums\AcarsType;
use App\Models\Pirep;
use App\Models\SimBrief;
use App\Models\SimBriefXML;
use Carbon\Carbon;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Exception\GuzzleException;
Expand All @@ -31,7 +32,7 @@ public function __construct(GuzzleClient $httpClient)
*
* @return SimBrief|null
*/
public function checkForOfp(string $user_id, string $ofp_id, string $flight_id): SimBrief
public function checkForOfp(string $user_id, string $ofp_id, string $flight_id)
{
$uri = str_replace('{id}', $ofp_id, config('phpvms.simbrief_url'));

Expand All @@ -52,20 +53,27 @@ public function checkForOfp(string $user_id, string $ofp_id, string $flight_id):

$body = $response->getBody()->getContents();

/** @var SimBriefXML $ofp */
$ofp = simplexml_load_string($body, SimBriefXML::class);

$attrs = [
'user_id' => $user_id,
'flight_id' => $flight_id,
'ofp_xml' => $body,
'ofp_xml' => $ofp->asXML(),
];

// TODO: Retrieve the ACARS XML and store that. For now, replace the doctype

$new_doctype = '<VMSAcars Type="FlightPlan" version="1.0" generated="'.time().'">';
$acars_xml = str_replace('<OFP>', $new_doctype, $body);
$acars_xml = str_replace('</OFP>', '</VMSAcars>', $acars_xml);
$acars_xml = str_replace("\n", '', $acars_xml);

$attrs['acars_xml'] = simplexml_load_string($acars_xml)->asXML();
// Try to download the XML file for ACARS. If it doesn't work, try to modify the main OFP
$acars_xml = $this->getAcarsOFP($ofp);
if (empty($acars_xml)) {
$new_doctype = '<VMSAcars Type="FlightPlan" version="1.0" generated="'.time().'">';
$acars_xml = str_replace('<OFP>', $new_doctype, $body);
$acars_xml = str_replace('</OFP>', '</VMSAcars>', $acars_xml);
$acars_xml = str_replace("\n", '', $acars_xml);

$attrs['acars_xml'] = simplexml_load_string($acars_xml)->asXML();
} else {
$attrs['acars_xml'] = $acars_xml->asXML();
}

// Save this into the Simbrief table, if it doesn't already exist
return SimBrief::updateOrCreate(
Expand All @@ -74,6 +82,38 @@ public function checkForOfp(string $user_id, string $ofp_id, string $flight_id):
);
}

/**
* @param \App\Models\SimBriefXML $ofp
*
* @return \SimpleXMLElement|null
*/
public function getAcarsOFP(SimBriefXML $ofp)
{
$url = $ofp->getAcarsXmlUrl();
if (empty($url)) {
return null;
}

$opts = [
'connect_timeout' => 2, // wait two seconds by default
'allow_redirects' => true,
];

try {
$response = $this->httpClient->request('GET', $url, $opts);
if ($response->getStatusCode() !== 200) {
return null;
}
} catch (GuzzleException $e) {
Log::error('Simbrief HTTP Error: '.$e->getMessage());
dd($e);
return null;
}

$body = $response->getBody()->getContents();
return simplexml_load_string($body);
}

/**
* Create a prefiled PIREP from a given brief.
*
Expand Down
2 changes: 1 addition & 1 deletion resources/lang/en/flights.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
'flighttype' => 'Flight Type',
'flighthours' => 'Flight Hours',
'route' => 'Route',
'mybid' => 'My Bid|My Bids',
'mybid' => 'My Bids',
'search' => 'Search',
'addremovebid' => 'Add/Remove Bid',
'bidremoved' => 'Your bid was removed.',
Expand Down
2 changes: 1 addition & 1 deletion resources/lang/es/flights.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
'flighttype' => 'Tipo de vuelo',
'flighthours' => 'Horas de vuelo',
'route' => 'Ruta',
'mybid' => 'Mi reserva|Mis reservas',
'mybid' => 'Mis reservas',
'search' => 'Buscar',
'addremovebid' => 'Añadir/Quitar reserva',
'bidremoved' => 'Tu reserva ha sido eliminada.',
Expand Down
2 changes: 1 addition & 1 deletion resources/lang/it/flights.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
'flighttype' => 'Tipo di Volo',
'flighthours' => 'Ore di Volo',
'route' => 'Rotta',
'mybid' => 'Mia prenotazione|Mie Prenotazioni',
'mybid' => 'Mie Prenotazioni',
'addremovebid' => 'Aggiungi/Rimuovi Prenotazione',
'bidremoved' => 'La tua prenotazione è stata rimossa.',
'bidadded' => 'La tua prenotazione è stata aggiunta.',
Expand Down
15 changes: 15 additions & 0 deletions resources/views/layouts/default/flights/bids.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
@extends('app')
@section('title', __('flights.mybid'))

@section('content')
<div class="row">
@include('flash::message')
<div class="col-md-12">
<h2>{{ __('flights.mybid') }}</h2>
@include('flights.table')
</div>
</div>
@endsection

@include('flights.scripts')

2 changes: 1 addition & 1 deletion resources/views/layouts/default/flights/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<div class="row">
@include('flash::message')
<div class="col-md-9">
<h2>{{ $title ?? trans_choice('common.flight', 2) }}</h2>
<h2>{{ trans_choice('common.flight', 2) }}</h2>
@include('flights.table')
</div>
<div class="col-md-3">
Expand Down
111 changes: 109 additions & 2 deletions resources/views/layouts/default/flights/simbrief_form.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,115 @@ class="form-control"
<div class="col-sm-4">
<label for="type">Aircraft</label>
<select id="type" name="type" class="custom-select select2">
<option value="a320">A320</option>
<option value="b738">B738</option>
<option value="A306" title="A306">A306 - A300F4-600</option>
<option value="A310" title="A310 / CF6-80C2A2">A310 - A310-304</option>
<option value="A318" title="A318 / CFM56-5B9/P">A318 - A318-100</option>
<option value="A319" title="A319 / CFM56-5B6/2P">A319 - A319-100</option>
<option value="A320" title="A320 / CFM56-5B4/P">A320 - A320-200</option>
<option value="A321" title="A321 / CFM56-5B3/P">A321 - A321-200</option>
<option value="A332" title="A332 / CF6-80E1A4">A332 - A330-200</option>
<option value="A333" title="A333 / RR Trent 772B">A333 - A330-300</option>
<option value="A342" title="A342 / CFM56-5C2">A342 - A340-200</option>
<option value="A343" title="A343 / CFM56-5C4">A343 - A340-300</option>
<option value="A345" title="A345 / RB211 Trent 556-61">A345 - A340-500</option>
<option value="A346" title="A346 / RB211 Trent 556-61">A346 - A340-600</option>
<option value="A359" title="A359 / TRENT XWB-84">A359 - A350-900</option>
<option value="A35K" title="A35K / TRENT XWB-97">A35K - A350-1000</option>
<option value="A388" title="A388">A388 - A380-800</option>
<option value="AT72" title="AT72">AT72 - ATR72-500</option>
<option value="B190" title="B190 / PT6A-67D">B190 - B1900D</option>
<option value="B350" title="B350">B350 - KINGAIR</option>
<option value="B463" title="B463">B463 - BAE-146</option>
<option value="B703" title="B703">B703 - B707-320B</option>
<option value="B712" title="B712 / BR715-C1-30">B712 - B717-200</option>
<option value="B722" title="B722">B722 - B727-200</option>
<option value="B732" title="B732 / JT8D-15A">B732 - B737-200</option>
<option value="B733" title="B733 / CFM56-3C-1">B733 - B737-300</option>
<option value="B734" title="B734">B734 - B737-400</option>
<option value="B735" title="B735">B735 - B737-500</option>
<option value="B736" title="B736 / CFM56-7B22">B736 - B737-600</option>
<option value="BBJ1" title="B737 / CFM56-7B27">BBJ1 - B737 BBJ</option>
<option value="B737" title="B737 / CFM56-7B24">B737 - B737-700</option>
<option value="BBJ2" title="B738 / CFM56-7B27">BBJ2 - B737 BBJ2</option>
<option value="B738" title="B738 / CFM56-7B26">B738 - B737-800</option>
<option value="BBJ3" title="B739 / CFM56-7B27">BBJ3 - B737 BBJ3</option>
<option value="B739" title="B739 / CFM56-7B26">B739 - B737-900</option>
<option value="B742" title="B742 / JT9D-7F">B742 - B747-200B</option>
<option value="B744" title="B744 / RB211-524G/H">B744 - B747-400</option>
<option value="B74F" title="B744 / RB211-524G/H">B74F - B747-400F</option>
<option value="B748" title="B748 / GENX-2B67">B748 - B747-8</option>
<option value="B48F" title="B748 / GENX-2B67">B48F - B747-8F</option>
<option value="B752" title="B752 / PW2037">B752 - B757-200</option>
<option value="B75F" title="B752 / PW2037">B75F - B757-200PF</option>
<option value="B753" title="B753 / PW2037">B753 - B757-300</option>
<option value="B762" title="B762 / CF6-80C2-B2">B762 - B767-200ER</option>
<option value="B763" title="B763 / CF6-80C2B6F">B763 - B767-300ER</option>
<option value="B76F" title="B763 / CF6-80C2B6F">B76F - B767-300F</option>
<option value="B764" title="B764">B764 - B767-400ER</option>
<option value="B772" title="B772 / GE90-94B">B772 - B777-200ER</option>
<option value="B77L" title="B77L / GE90-110B1">B77L - B777-200LR</option>
<option value="B77F" title="B77L / GE90-110B1">B77F - B777-F</option>
<option value="B77W" title="B77W / GE90-115BL2">B77W - B777-300ER</option>
<option value="B788" title="B788 / GENX-1B70">B788 - B787-8</option>
<option value="B789" title="B789 / GENX-1B74">B789 - B787-9</option>
<option value="B78X" title="B78X / GENX-1B76">B78X - B787-10</option>
<option value="BE20" title="BE20">BE20 - KINGAIR</option>
<option value="C172" title="C172 / IO-360-L2A">C172 - CESSNA 172R</option>
<option value="C208" title="C208">C208 - CESSNA 208</option>
<option value="C25A" title="C25A / FJ44-2C">C25A - CITATION CJ2</option>
<option value="C404" title="C404">C404 - C404 TITAN</option>
<option value="C510" title="C510">C510 - C510 MUSTANG</option>
<option value="C550" title="C550">C550 - CITATION</option>
<option value="C56X" title="C56X / PW545A">C56X - CITATION 560XL</option>
<option value="C750" title="C750">C750 - CITATION X</option>
<option value="CL30" title="CL30 / HTF7350">CL30 - CHALLENGER</option>
<option value="CRJ2" title="CRJ2 / CF34-3B1">CRJ2 - CRJ-200</option>
<option value="CRJ7" title="CRJ7 / CF34-8C1">CRJ7 - CRJ-700</option>
<option value="CRJ9" title="CRJ9 / CF34-8C5">CRJ9 - CRJ-900</option>
<option value="CRJX" title="CRJX / CF34-8C5A1">CRJX - CRJ-1000</option>
<option value="DC10" title="DC10">DC10 - DC-10-30</option>
<option value="DC6" title="DC6 / R2800-CB16">DC6&nbsp; - DC-6</option>
<option value="DC85" title="DC85 / JT3D-3B">DC85 - DC-8-55</option>
<option value="DH8A" title="DH8A / PW120A">DH8A - DHC8-102</option>
<option value="DH8B" title="DH8B / PW123C">DH8B - DHC8-200</option>
<option value="DH8C" title="DH8C / PW123B">DH8C - DHC8-311</option>
<option value="DH8D" title="DH8D / PW150A">DH8D - DHC8-402</option>
<option value="DHC2" title="DHC2">DHC2 - BEAVER</option>
<option value="DHC6" title="DHC6">DHC6 - TWIN OTTER</option>
<option value="E13L" title="E135">E13L - EMB-135BJ</option>
<option value="E135" title="E135 / AE3007-A1/3">E135 - EMB-135LR</option>
<option value="E140" title="E135 / AE3007-A1/3">E140 - ERJ-140LR</option>
<option value="E145" title="E145 / AE3007-A1">E145 - EMB-145LR</option>
<option value="E170" title="E170 / CF34-8E5">E170 - EMB-170</option>
<option value="E175" title="E170 / CF34-8E5">E175 - EMB-175</option>
<option value="E190" title="E190 / CF34-10E6">E190 - EMB-190</option>
<option value="E195" title="E190 / CF34-10E7">E195 - EMB-195</option>
<option value="E50P" title="E50P / PW617F1-E">E50P - PHENOM 100</option>
<option value="E55P" title="E55P / PW535E">E55P - PHENOM 300</option>
<option value="EA50" title="EA50 / PW610F">EA50 - ECLIPSE 550</option>
<option value="F50" title="F50">F50&nbsp; - FOKKER F50</option>
<option value="FA50" title="FA50 / TFE 731-40">FA50 - FALCON 50EX</option>
<option value="GLF4" title="GLF4">GLF4 - GULFSTREAM</option>
<option value="H25B" title="H25B">H25B - HAWKER 800A</option>
<option value="JS41" title="JS41">JS41 - BAE JS-41</option>
<option value="L101" title="L101 / RB211-524B">L101 - L1011-500</option>
<option value="LJ25" title="LJ25 / CJ-610-8A">LJ25 - LEARJET 25</option>
<option value="LJ45" title="LJ45">LJ45 - LEARJET 45</option>
<option value="MD11" title="MD11 / CF6-80C2D1F">MD11 - MD-11</option>
<option value="MD1F" title="MD11 / CF6-80C2D1F">MD1F - MD-11F</option>
<option value="MD82" title="MD82 / JT8D-217">MD82 - DC-9-82</option>
<option value="MD83" title="MD83 / JT8D-219">MD83 - DC-9-83</option>
<option value="MD88" title="MD88 / JT8D-219">MD88 - MD-88</option>
<option value="MD90" title="MD90">MD90 - MD-90-30</option>
<option value="PC12" title="PC12 / PT6A-66D">PC12 - PILATUS PC12</option>
<option value="RJ1H" title="RJ1H">RJ1H - AVRO RJ100</option>
<option value="RJ70" title="RJ70">RJ70 - AVRO RJ70</option>
<option value="RJ85" title="RJ85">RJ85 - AVRO RJ85</option>
<option value="SF34" title="SF34 / GE CT7-9B">SF34 - SAAB 340B</option>
<option value="SF50" title="SF50 / FJ33-5A">SF50 - VISION JET</option>
<option value="SW4" title="SW4 / TPE-331">SW4&nbsp; - METROLINER</option>
<option value="T154" title="T154">T154 - TU-154B2</option>
<option value="TBM9" title="TBM9 / PT6A-66D">TBM9 - TBM 900</option>
</select>
</div>
</div>
Expand Down
Loading

0 comments on commit 23be225

Please # to comment.