Option for SB only on bids; add the new file type #642 (#643)

Option for SB only on bids; add the new file type #642
This commit is contained in:
Nabeel S 2020-03-27 11:49:19 -04:00 committed by GitHub
parent f3fe3a56ba
commit 4a3ec38919
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 746 additions and 56 deletions

View File

@ -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

View File

@ -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'),
]);
}

View File

@ -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
*

View File

@ -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.
*

View File

@ -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.',

View File

@ -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.',

View File

@ -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.',

View 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')

View File

@ -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">

View File

@ -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&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>

View File

@ -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">

View File

@ -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']

View File

@ -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]);

View 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>

View File

@ -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>