Option for SB only on bids; add the new file type #642
This commit is contained in:
parent
f3fe3a56ba
commit
4a3ec38919
@ -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
|
||||
|
@ -9,11 +9,12 @@ use App\Repositories\AirportRepository;
|
||||
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;
|
||||
|
||||
@ -24,6 +25,7 @@ class FlightController extends Controller
|
||||
private $flightRepo;
|
||||
private $subfleetRepo;
|
||||
private $geoSvc;
|
||||
private $userRepo;
|
||||
|
||||
/**
|
||||
* @param AirlineRepository $airlineRepo
|
||||
@ -31,19 +33,22 @@ class FlightController extends Controller
|
||||
* @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;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -113,6 +118,7 @@ class FlightController extends Controller
|
||||
'dep_icao' => $request->input('dep_icao'),
|
||||
'subfleet_id' => $request->input('subfleet_id'),
|
||||
'simbrief' => !empty(setting('simbrief.api_key')),
|
||||
'simbrief_bids' => setting('simbrief.only_bids'),
|
||||
]);
|
||||
}
|
||||
|
||||
@ -125,19 +131,25 @@ class FlightController extends Controller
|
||||
*/
|
||||
public function bids(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
$user = $this->userRepo
|
||||
->with(['bids', 'bids.flight'])
|
||||
->find(Auth::user()->id);
|
||||
|
||||
$flights = $user->flights()->paginate();
|
||||
$saved_flights = $flights->pluck('id')->toArray();
|
||||
$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),
|
||||
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'),
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,21 @@ class SimBriefXML extends SimpleXMLElement
|
||||
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
|
||||
*
|
||||
|
@ -7,6 +7,7 @@ use App\Models\Acars;
|
||||
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;
|
||||
@ -31,7 +32,7 @@ class SimBriefService extends Service
|
||||
*
|
||||
* @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'));
|
||||
|
||||
@ -52,20 +53,27 @@ class SimBriefService extends Service
|
||||
|
||||
$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
|
||||
|
||||
// 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(
|
||||
@ -74,6 +82,38 @@ class SimBriefService extends Service
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
*
|
||||
|
@ -6,7 +6,7 @@ return [
|
||||
'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.',
|
||||
|
@ -6,7 +6,7 @@ return [
|
||||
'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.',
|
||||
|
@ -6,7 +6,7 @@ return [
|
||||
'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.',
|
||||
|
15
resources/views/layouts/default/flights/bids.blade.php
Normal file
15
resources/views/layouts/default/flights/bids.blade.php
Normal file
@ -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')
|
||||
|
@ -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">
|
||||
|
@ -39,8 +39,115 @@
|
||||
<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 - 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 - 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 - 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>
|
||||
|
@ -71,11 +71,13 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-12 text-right">
|
||||
@if ($simbrief !== false)
|
||||
@if ($simbrief_bids === false || ($simbrief_bids === true && in_array($flight->id, $saved, true)))
|
||||
<a href="{{ route('frontend.simbrief.generate') }}?flight_id={{ $flight->id }}"
|
||||
class="btn btn-sm btn-outline-primary">
|
||||
Create SimBrief Flight Plan
|
||||
</a>
|
||||
@endif
|
||||
@endif
|
||||
|
||||
<a href="{{ route('frontend.pireps.create') }}?flight_id={{ $flight->id }}"
|
||||
class="btn btn-sm btn-outline-info">
|
||||
|
@ -23,7 +23,10 @@ class SimBriefTest extends TestCase
|
||||
'arr_airport_id' => 'OMDB',
|
||||
]);
|
||||
|
||||
$this->mockXmlResponse('briefing.xml');
|
||||
$this->mockXmlResponse([
|
||||
'simbrief/briefing.xml',
|
||||
'simbrief/acars_briefing.xml',
|
||||
]);
|
||||
|
||||
/** @var SimBriefService $sb */
|
||||
$sb = app(SimBriefService::class);
|
||||
@ -44,7 +47,7 @@ class SimBriefTest extends TestCase
|
||||
|
||||
// Spot check reading of the files
|
||||
$files = $briefing->files;
|
||||
$this->assertEquals(45, $files->count());
|
||||
$this->assertEquals(47, $files->count());
|
||||
$this->assertEquals(
|
||||
'http://www.simbrief.com/ofp/flightplans/OMAAOMDB_PDF_1584226092.pdf',
|
||||
$files->firstWhere('name', 'PDF Document')['url']
|
||||
|
@ -132,19 +132,22 @@ class TestCase extends Illuminate\Foundation\Testing\TestCase
|
||||
/**
|
||||
* Return a mock Guzzle Client with a response loaded from $mockFile
|
||||
*
|
||||
* @param $mockFile
|
||||
* @param array|string $files
|
||||
*/
|
||||
public function mockGuzzleClient($mockFile): void
|
||||
public function mockGuzzleClient($files): void
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(
|
||||
200,
|
||||
[
|
||||
if (!is_array($files)) {
|
||||
$files = [$files];
|
||||
}
|
||||
|
||||
$responses = [];
|
||||
foreach ($files as $file) {
|
||||
$responses[] = new Response(200, [
|
||||
'Content-Type' => 'application/json; charset=utf-8',
|
||||
],
|
||||
$this->readDataFile($mockFile)
|
||||
),
|
||||
]);
|
||||
], $this->readDataFile($file));
|
||||
}
|
||||
|
||||
$mock = new MockHandler($responses);
|
||||
|
||||
$handler = HandlerStack::create($mock);
|
||||
$guzzleClient = new Client(['handler' => $handler]);
|
||||
@ -152,19 +155,22 @@ class TestCase extends Illuminate\Foundation\Testing\TestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $filename
|
||||
* @param array|string $files The filename or files to respond with
|
||||
*/
|
||||
public function mockXmlResponse($filename)
|
||||
public function mockXmlResponse($files)
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(
|
||||
200,
|
||||
[
|
||||
if (!is_array($files)) {
|
||||
$files = [$files];
|
||||
}
|
||||
|
||||
$responses = [];
|
||||
foreach ($files as $file) {
|
||||
$responses[] = new Response(200, [
|
||||
'Content-Type' => 'text/xml',
|
||||
],
|
||||
$this->readDataFile($filename)
|
||||
),
|
||||
]);
|
||||
], $this->readDataFile($file));
|
||||
}
|
||||
|
||||
$mock = new MockHandler($responses);
|
||||
|
||||
$handler = HandlerStack::create($mock);
|
||||
$guzzleClient = new Client(['handler' => $handler]);
|
||||
|
475
tests/data/simbrief/acars_briefing.xml
Normal file
475
tests/data/simbrief/acars_briefing.xml
Normal file
@ -0,0 +1,475 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<VMSAcars Type="FlightPlan" version="1.0" generated="1585313544">
|
||||
<params>
|
||||
<request_id>19722791</request_id>
|
||||
<user_id>120867</user_id>
|
||||
<time_generated>1585313544</time_generated>
|
||||
<ofp_layout>lido2</ofp_layout>
|
||||
<airac>2001</airac>
|
||||
<units>lbs</units>
|
||||
</params>
|
||||
<general>
|
||||
<release>1</release>
|
||||
<icao_airline>VMS</icao_airline>
|
||||
<flight_number>99</flight_number>
|
||||
<is_etops>0</is_etops>
|
||||
<dx_rmk>PAYLOAD/CARGO LIMITED BY MLW</dx_rmk>
|
||||
<sys_rmk/>
|
||||
<is_detailed_profile>1</is_detailed_profile>
|
||||
<cruise_profile>CI5</cruise_profile>
|
||||
<climb_profile>250/300/78</climb_profile>
|
||||
<descent_profile>78/300/250</descent_profile>
|
||||
<alternate_profile>CI0</alternate_profile>
|
||||
<reserve_profile>RES</reserve_profile>
|
||||
<costindex>5</costindex>
|
||||
<initial_altitude>23000</initial_altitude>
|
||||
<stepclimb_string>MKJP/0230</stepclimb_string>
|
||||
<avg_temp_dev>11</avg_temp_dev>
|
||||
<avg_tropopause>56792</avg_tropopause>
|
||||
<avg_wind_comp>12</avg_wind_comp>
|
||||
<avg_wind_dir>064</avg_wind_dir>
|
||||
<avg_wind_spd>018</avg_wind_spd>
|
||||
<gc_distance>273</gc_distance>
|
||||
<route_distance>319</route_distance>
|
||||
<air_distance>307</air_distance>
|
||||
<total_burn>5723</total_burn>
|
||||
<cruise_tas>388</cruise_tas>
|
||||
<cruise_mach>.63</cruise_mach>
|
||||
<passengers>171</passengers>
|
||||
<route>LEXUV3 KEMBO G633 NALRO GUBEL3</route>
|
||||
<route_ifps>LEXUV3 KEMBO G633 NALRO GUBEL3</route_ifps>
|
||||
<route_navigraph>LEXUV3 KEMBO G633 NALRO GUBEL3</route_navigraph>
|
||||
</general>
|
||||
<origin>
|
||||
<icao_code>MKJP</icao_code>
|
||||
<iata_code>KIN</iata_code>
|
||||
<faa_code/>
|
||||
<elevation>18</elevation>
|
||||
<pos_lat>17.935556</pos_lat>
|
||||
<pos_long>-76.787500</pos_long>
|
||||
<name>NORMAN MANLEY INTL</name>
|
||||
<plan_rwy>12</plan_rwy>
|
||||
</origin>
|
||||
<destination>
|
||||
<icao_code>MWCR</icao_code>
|
||||
<iata_code>GCM</iata_code>
|
||||
<faa_code/>
|
||||
<elevation>8</elevation>
|
||||
<pos_lat>19.292781</pos_lat>
|
||||
<pos_long>-81.357767</pos_long>
|
||||
<name>ROBERTS INTL</name>
|
||||
<plan_rwy>08</plan_rwy>
|
||||
</destination>
|
||||
<alternate>
|
||||
<icao_code>MKJS</icao_code>
|
||||
<iata_code>MBJ</iata_code>
|
||||
<faa_code/>
|
||||
<elevation>4</elevation>
|
||||
<pos_lat>18.503669</pos_lat>
|
||||
<pos_long>-77.913389</pos_long>
|
||||
<name>SANGSTER INTL</name>
|
||||
<plan_rwy>07</plan_rwy>
|
||||
<cruise_altitude>31000</cruise_altitude>
|
||||
<distance>232</distance>
|
||||
<gc_distance>201</gc_distance>
|
||||
<air_distance>233</air_distance>
|
||||
<track_true>103</track_true>
|
||||
<track_mag>109</track_mag>
|
||||
<tas>411</tas>
|
||||
<gs>410</gs>
|
||||
<avg_wind_comp>M001</avg_wind_comp>
|
||||
<avg_wind_dir>018</avg_wind_dir>
|
||||
<avg_wind_spd>018</avg_wind_spd>
|
||||
<avg_tropopause>57000</avg_tropopause>
|
||||
<avg_tdv>P12</avg_tdv>
|
||||
<ete>2575</ete>
|
||||
<burn>4302</burn>
|
||||
<route>NALRO2 NALRO DCT OTEKO DCT IMONI OMAXI5</route>
|
||||
<route_ifps>NALRO2 NALRO DCT OTEKO DCT IMONI OMAXI5</route_ifps>
|
||||
</alternate>
|
||||
<takeoff_altn/>
|
||||
<enroute_altn/>
|
||||
<navlog>
|
||||
<fix>
|
||||
<ident>UKIMO</ident>
|
||||
<name>UKIMO</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>17.918556</pos_lat>
|
||||
<pos_long>-76.743300</pos_long>
|
||||
<stage>CLB</stage>
|
||||
<via_airway>LEXUV3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>5</distance>
|
||||
<track_true>112</track_true>
|
||||
<track_mag>119</track_mag>
|
||||
<heading_true>111</heading_true>
|
||||
<heading_mag>118</heading_mag>
|
||||
<altitude_feet>4900</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>PEMPE</ident>
|
||||
<name>PEMPE</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>17.809956</pos_lat>
|
||||
<pos_long>-76.789128</pos_long>
|
||||
<stage>CLB</stage>
|
||||
<via_airway>LEXUV3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>7</distance>
|
||||
<track_true>201</track_true>
|
||||
<track_mag>210</track_mag>
|
||||
<heading_true>199</heading_true>
|
||||
<heading_mag>207</heading_mag>
|
||||
<altitude_feet>10800</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>LEXUV</ident>
|
||||
<name>LEXUV</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>17.853819</pos_lat>
|
||||
<pos_long>-76.902525</pos_long>
|
||||
<stage>CLB</stage>
|
||||
<via_airway>LEXUV3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>7</distance>
|
||||
<track_true>292</track_true>
|
||||
<track_mag>300</track_mag>
|
||||
<heading_true>293</heading_true>
|
||||
<heading_mag>301</heading_mag>
|
||||
<altitude_feet>14200</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>KEMBO</ident>
|
||||
<name>KEMBO</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>18.218889</pos_lat>
|
||||
<pos_long>-77.354722</pos_long>
|
||||
<stage>CLB</stage>
|
||||
<via_airway>LEXUV3</via_airway>
|
||||
<is_sid_star>0</is_sid_star>
|
||||
<distance>34</distance>
|
||||
<track_true>310</track_true>
|
||||
<track_mag>318</track_mag>
|
||||
<heading_true>311</heading_true>
|
||||
<heading_mag>319</heading_mag>
|
||||
<altitude_feet>22200</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>TOC</ident>
|
||||
<name>TOP OF CLIMB</name>
|
||||
<type>ltlg</type>
|
||||
<pos_lat>18.288425</pos_lat>
|
||||
<pos_long>-77.494553</pos_long>
|
||||
<stage>CLB</stage>
|
||||
<via_airway>G633</via_airway>
|
||||
<is_sid_star>0</is_sid_star>
|
||||
<distance>9</distance>
|
||||
<track_true>297</track_true>
|
||||
<track_mag>305</track_mag>
|
||||
<heading_true>298</heading_true>
|
||||
<heading_mag>306</heading_mag>
|
||||
<altitude_feet>23000</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>SIA</ident>
|
||||
<name>SANGSTER</name>
|
||||
<type>vor</type>
|
||||
<pos_lat>18.501047</pos_lat>
|
||||
<pos_long>-77.924100</pos_long>
|
||||
<stage>CRZ</stage>
|
||||
<via_airway>G633</via_airway>
|
||||
<is_sid_star>0</is_sid_star>
|
||||
<distance>28</distance>
|
||||
<track_true>297</track_true>
|
||||
<track_mag>305</track_mag>
|
||||
<heading_true>298</heading_true>
|
||||
<heading_mag>305</heading_mag>
|
||||
<altitude_feet>23000</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>PETSI</ident>
|
||||
<name>PETSI</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>18.660278</pos_lat>
|
||||
<pos_long>-78.595833</pos_long>
|
||||
<stage>CRZ</stage>
|
||||
<via_airway>G633</via_airway>
|
||||
<is_sid_star>0</is_sid_star>
|
||||
<distance>39</distance>
|
||||
<track_true>284</track_true>
|
||||
<track_mag>291</track_mag>
|
||||
<heading_true>285</heading_true>
|
||||
<heading_mag>292</heading_mag>
|
||||
<altitude_feet>23000</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>FROST</ident>
|
||||
<name>FROST</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>18.756944</pos_lat>
|
||||
<pos_long>-79.009167</pos_long>
|
||||
<stage>CRZ</stage>
|
||||
<via_airway>G633</via_airway>
|
||||
<is_sid_star>0</is_sid_star>
|
||||
<distance>24</distance>
|
||||
<track_true>283</track_true>
|
||||
<track_mag>291</track_mag>
|
||||
<heading_true>284</heading_true>
|
||||
<heading_mag>291</heading_mag>
|
||||
<altitude_feet>23000</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>OTEKO</ident>
|
||||
<name>OTEKO</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>18.870278</pos_lat>
|
||||
<pos_long>-79.500000</pos_long>
|
||||
<stage>CRZ</stage>
|
||||
<via_airway>G633</via_airway>
|
||||
<is_sid_star>0</is_sid_star>
|
||||
<distance>29</distance>
|
||||
<track_true>283</track_true>
|
||||
<track_mag>290</track_mag>
|
||||
<heading_true>285</heading_true>
|
||||
<heading_mag>292</heading_mag>
|
||||
<altitude_feet>23000</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>NALRO</ident>
|
||||
<name>NALRO</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>19.030822</pos_lat>
|
||||
<pos_long>-80.206147</pos_long>
|
||||
<stage>CRZ</stage>
|
||||
<via_airway>G633</via_airway>
|
||||
<is_sid_star>0</is_sid_star>
|
||||
<distance>41</distance>
|
||||
<track_true>283</track_true>
|
||||
<track_mag>290</track_mag>
|
||||
<heading_true>285</heading_true>
|
||||
<heading_mag>291</heading_mag>
|
||||
<altitude_feet>23000</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>TOD</ident>
|
||||
<name>TOP OF DESCENT</name>
|
||||
<type>ltlg</type>
|
||||
<pos_lat>19.126848</pos_lat>
|
||||
<pos_long>-80.634858</pos_long>
|
||||
<stage>CRZ</stage>
|
||||
<via_airway>GUBEL3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>25</distance>
|
||||
<track_true>283</track_true>
|
||||
<track_mag>289</track_mag>
|
||||
<heading_true>286</heading_true>
|
||||
<heading_mag>292</heading_mag>
|
||||
<altitude_feet>23000</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>D107Q</ident>
|
||||
<name>D107Q</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>19.225436</pos_lat>
|
||||
<pos_long>-81.080228</pos_long>
|
||||
<stage>DSC</stage>
|
||||
<via_airway>GUBEL3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>26</distance>
|
||||
<track_true>283</track_true>
|
||||
<track_mag>288</track_mag>
|
||||
<heading_true>285</heading_true>
|
||||
<heading_mag>290</heading_mag>
|
||||
<altitude_feet>10500</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>D080O</ident>
|
||||
<name>D080O</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>19.350150</pos_lat>
|
||||
<pos_long>-81.115561</pos_long>
|
||||
<stage>DSC</stage>
|
||||
<via_airway>GUBEL3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>8</distance>
|
||||
<track_true>345</track_true>
|
||||
<track_mag>350</track_mag>
|
||||
<heading_true>348</heading_true>
|
||||
<heading_mag>353</heading_mag>
|
||||
<altitude_feet>6700</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>GUBEL</ident>
|
||||
<name>GUBEL</name>
|
||||
<type>wpt</type>
|
||||
<pos_lat>19.338075</pos_lat>
|
||||
<pos_long>-81.166667</pos_long>
|
||||
<stage>DSC</stage>
|
||||
<via_airway>GUBEL3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>3</distance>
|
||||
<track_true>255</track_true>
|
||||
<track_mag>261</track_mag>
|
||||
<heading_true>255</heading_true>
|
||||
<heading_mag>260</heading_mag>
|
||||
<altitude_feet>5300</altitude_feet>
|
||||
</fix>
|
||||
<fix>
|
||||
<ident>MWCR</ident>
|
||||
<name>ROBERTS INTL</name>
|
||||
<type>apt</type>
|
||||
<pos_lat>19.292781</pos_lat>
|
||||
<pos_long>-81.357767</pos_long>
|
||||
<stage>DSC</stage>
|
||||
<via_airway>GUBEL3</via_airway>
|
||||
<is_sid_star>1</is_sid_star>
|
||||
<distance>34</distance>
|
||||
<track_true>255</track_true>
|
||||
<track_mag>261</track_mag>
|
||||
<heading_true>255</heading_true>
|
||||
<heading_mag>260</heading_mag>
|
||||
<altitude_feet>2500</altitude_feet>
|
||||
</fix>
|
||||
</navlog>
|
||||
<atc>
|
||||
<flightplan_text>(FPL-VMS99-IS
|
||||
-A320/M-SDE3FGHIRWY/LB1
|
||||
-MKJP1230
|
||||
-N0388F230 LEXUV3 KEMBO G633 NALRO GUBEL3
|
||||
-MWCR0100 MKJS
|
||||
-PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS)</flightplan_text>
|
||||
<route>N0388F230 LEXUV3 KEMBO G633 NALRO GUBEL3</route>
|
||||
<route_ifps>N0388F230 LEXUV3 KEMBO G633 NALRO GUBEL3</route_ifps>
|
||||
<callsign>VMS99</callsign>
|
||||
<initial_spd>0388</initial_spd>
|
||||
<initial_spd_unit>N</initial_spd_unit>
|
||||
<initial_alt>230</initial_alt>
|
||||
<initial_alt_unit>F</initial_alt_unit>
|
||||
<section18>PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS</section18>
|
||||
<fir_orig>MKJK</fir_orig>
|
||||
<fir_dest>MKJK</fir_dest>
|
||||
<fir_altn>MKJK</fir_altn>
|
||||
<fir_etops/>
|
||||
<fir_enroute/>
|
||||
</atc>
|
||||
<aircraft>
|
||||
<icaocode>A320</icaocode>
|
||||
<iatacode>320</iatacode>
|
||||
<name>A320-200</name>
|
||||
<reg>N320SB</reg>
|
||||
<fin>205</fin>
|
||||
<selcal/>
|
||||
<equip>M-SDE3FGHIRWY/LB1</equip>
|
||||
<max_passengers>180</max_passengers>
|
||||
<fuelfact>1</fuelfact>
|
||||
</aircraft>
|
||||
<fuel>
|
||||
<taxi>220</taxi>
|
||||
<enroute_burn>5723</enroute_burn>
|
||||
<contingency>1411</contingency>
|
||||
<alternate_burn>4302</alternate_burn>
|
||||
<reserve>3967</reserve>
|
||||
<etops>0</etops>
|
||||
<extra>0</extra>
|
||||
<min_takeoff>15403</min_takeoff>
|
||||
<plan_takeoff>15403</plan_takeoff>
|
||||
<plan_ramp>15623</plan_ramp>
|
||||
<plan_landing>9900</plan_landing>
|
||||
<avg_fuel_flow>5643</avg_fuel_flow>
|
||||
<max_tanks>42600</max_tanks>
|
||||
</fuel>
|
||||
<times>
|
||||
<est_time_enroute>3651</est_time_enroute>
|
||||
<sched_time_enroute>7620</sched_time_enroute>
|
||||
<sched_out>1388579400</sched_out>
|
||||
<sched_off>1388579700</sched_off>
|
||||
<sched_on>1388587320</sched_on>
|
||||
<sched_in>1388587500</sched_in>
|
||||
<sched_block>8100</sched_block>
|
||||
<est_out>1388579400</est_out>
|
||||
<est_off>1388579700</est_off>
|
||||
<est_on>1388583351</est_on>
|
||||
<est_in>1388583531</est_in>
|
||||
<est_block>4131</est_block>
|
||||
<orig_timezone>-5</orig_timezone>
|
||||
<dest_timezone>-5</dest_timezone>
|
||||
<taxi_out>300</taxi_out>
|
||||
<taxi_in>180</taxi_in>
|
||||
<reserve_time>2700</reserve_time>
|
||||
<endurance>10496</endurance>
|
||||
<contfuel_time>900</contfuel_time>
|
||||
<etopsfuel_time>0</etopsfuel_time>
|
||||
<extrafuel_time>0</extrafuel_time>
|
||||
</times>
|
||||
<weights>
|
||||
<oew>96518</oew>
|
||||
<pax_count>171</pax_count>
|
||||
<pax_weight>230</pax_weight>
|
||||
<cargo>0</cargo>
|
||||
<payload>39307</payload>
|
||||
<est_zfw>135825</est_zfw>
|
||||
<max_zfw>137789</max_zfw>
|
||||
<est_tow>151228</est_tow>
|
||||
<max_tow>151228</max_tow>
|
||||
<max_tow_struct>171961</max_tow_struct>
|
||||
<tow_limit_code>L</tow_limit_code>
|
||||
<est_ldw>145505</est_ldw>
|
||||
<max_ldw>145505</max_ldw>
|
||||
<est_ramp>151448</est_ramp>
|
||||
</weights>
|
||||
<api_params>
|
||||
<airline>VMS</airline>
|
||||
<fltnum>99</fltnum>
|
||||
<type>A320</type>
|
||||
<orig>MKJP</orig>
|
||||
<dest>MWCR</dest>
|
||||
<date>1388534400</date>
|
||||
<dephour>43200</dephour>
|
||||
<depmin>1800</depmin>
|
||||
<route>LEXUV3 KEMBO G633 NALRO GUBEL3</route>
|
||||
<stehour>7200</stehour>
|
||||
<stemin>900</stemin>
|
||||
<reg/>
|
||||
<fin/>
|
||||
<selcal/>
|
||||
<pax>auto</pax>
|
||||
<altn>MKJS</altn>
|
||||
<fl/>
|
||||
<cpt>NABEEL SHAHZAD</cpt>
|
||||
<pid>120867</pid>
|
||||
<fuelfactor>1</fuelfactor>
|
||||
<manualzfw>auto</manualzfw>
|
||||
<addedfuel>0</addedfuel>
|
||||
<contpct>auto</contpct>
|
||||
<resvrule>45</resvrule>
|
||||
<taxiout>auto</taxiout>
|
||||
<taxiin>auto</taxiin>
|
||||
<cargo>auto</cargo>
|
||||
<origrwy>auto</origrwy>
|
||||
<destrwy>auto</destrwy>
|
||||
<climb>auto</climb>
|
||||
<descent>auto</descent>
|
||||
<cruisemode>auto</cruisemode>
|
||||
<cruisesub>AUTO</cruisesub>
|
||||
<planformat>lido</planformat>
|
||||
<pounds>1</pounds>
|
||||
<navlog>1</navlog>
|
||||
<etops>0</etops>
|
||||
<stepclimbs>1</stepclimbs>
|
||||
<tlr>1</tlr>
|
||||
<notams_opt>1</notams_opt>
|
||||
<firnot>0</firnot>
|
||||
<maps>1</maps>
|
||||
<turntoflt/>
|
||||
<turntoapt/>
|
||||
<turntotime/>
|
||||
<turnfrflt/>
|
||||
<turnfrapt/>
|
||||
<turnfrtime/>
|
||||
<fuelstats/>
|
||||
<contlabel/>
|
||||
<static_id/>
|
||||
<acdata>false</acdata>
|
||||
<acdata_parsed/>
|
||||
</api_params>
|
||||
</VMSAcars>
|
@ -4277,6 +4277,10 @@ NIL
|
||||
<name>X-Plane 9/10</name>
|
||||
<link>OMAAOMDB_XP9_1584226092.fms</link>
|
||||
</file>
|
||||
<file>
|
||||
<name>phpVMS ACARS</name>
|
||||
<link>MKJPMWCR_VMS_1585313544.xml</link>
|
||||
</file>
|
||||
</files>
|
||||
<fms_downloads>
|
||||
<directory>http://www.simbrief.com/ofp/flightplans/</directory>
|
||||
@ -4460,6 +4464,10 @@ NIL
|
||||
<name>X-Plane 9/10</name>
|
||||
<link>OMAAOMDB_XP9_1584226092.fms</link>
|
||||
</xp9>
|
||||
<vms>
|
||||
<name>phpVMS ACARS</name>
|
||||
<link>MKJPMWCR_VMS_1585313544.xml</link>
|
||||
</vms>
|
||||
</fms_downloads>
|
||||
<images>
|
||||
<directory>http://www.simbrief.com/ofp/uads/</directory>
|
Loading…
Reference in New Issue
Block a user