Files
phpvms/resources/views/layouts/default/flights/simbrief_form.blade.php
B.Fatih KOZ e3b4a0ed2e SimBrief integration enhancements (#1045)
* SimBrief Integration Update

* Added SimBrief Type field to subfleets, can be used to assign simbrief airframes to subfleets and fix non existing or wrong types. If not used simbrief form will use aircraft's icao type code

* Added Passenger and Baggage weights to settings

* Added setting for using PhpVms Pilot/User  Ident as simbrief atc callsign

* SimBrief form code cleaned up a bit and improved. Now form supports both cargo and passenger fares to be used at the same time.

Generated passenger baggage weight will be reduced from aircraft's cargo capacity and remaining amount will be used for random cargo generation.

Also multiple cargo fares or any mix is possible now (like only cargo, only passenger, multiple cargo and passenger fares)

* StyleFix (SimBrief Controller)

* Fix Callsign Setting Check

* Code Cleanup

Reduced loops and removed if's in loops, getting fares from aircraft instead of flight/subfleets.

No need to go through getReconciledFaresForFlight anymore. Aircraft provides all fare info we need.

Removed unnecessary html elements, added some comments.

* Update Simbrief Controller

Fixed setting checks.

Removed non used $subfleet and from main form and $aircraft from aircraft selection form blade.

Added/fixed comments.

* StyleFix for Controller
2021-02-24 09:32:29 -05:00

428 lines
21 KiB
PHP

@extends('app')
@section('title', 'SimBrief Flight Planning')
@section('content')
<form id="sbapiform">
<div class="row">
<h2>Create Simbrief Briefing</h2>
<div class="card">
<div class="col-md-12">
<div class="row">
<div class="col-8">
<div class="form-container">
<div class="form-container-body">
<h6><i class="fas fa-info-circle"></i>&nbsp;Aircraft Details</h6>
<div class="row">
<div class="col-sm-4">
<label for="type">Type</label>
<input type="text" class="form-control" value="{{ $aircraft->icao }}" maxlength="4" disabled>
<input type="hidden" name="type" value="{{ $aircraft->subfleet->simbrief_type ?? $aircraft->icao }}">
</div>
<div class="col-sm-4">
<label for="reg">Registration</label>
<input type="text" class="form-control" value="{{ $aircraft->registration }}" maxlength="6" disabled>
<input type="hidden" name="reg" value="{{ $aircraft->registration }}">
</div>
</div>
<br>
</div>
<div class="form-container-body">
<h6><i class="fas fa-info-circle"></i>&nbsp;@lang('pireps.flightinformations') For
<b>{{ $flight->airline->icao }}{{ $flight->flight_number }} ({{ \App\Models\Enums\FlightType::label($flight->flight_type) }})</b></h6>
<div class="row">
<div class="col-sm-4">
<label for="dorig">Departure Airport</label>
<input id="dorig" type="text" class="form-control" maxlength="4" value="{{ $flight->dpt_airport_id }}" disabled>
<input name="orig" type="hidden" maxlength="4" value="{{ $flight->dpt_airport_id }}">
</div>
<div class="col-sm-4">
<label for="ddest">Arrival Airport</label>
<input id="ddest" type="text" class="form-control" maxlength="4" value="{{ $flight->arr_airport_id }}" disabled>
<input name="dest" type="hidden" maxlength="4" value="{{ $flight->arr_airport_id }}">
</div>
<div class="col-sm-4">
<label for="altn">Alternate Airport</label>
<input name="altn" type="text" class="form-control" maxlength="4" value="{{ $flight->alt_airport_id ?? 'AUTO' }}">
</div>
</div>
<br>
<div class="row">
<div class="col-sm-8">
<label for="route">Preferred Company Route</label>
<input name="route" type="text" class="form-control" value="{{ $flight->route }}">
</div>
<div class="col-sm-4">
<label for="fl">Preferred Flight Level</label>
<input id="fl" name="fl" type="text" class="form-control" maxlength="5" value="{{ $flight->level }}">
</div>
</div>
<br>
<div class="row">
<div class="col-sm-4">
@if($flight->dpt_time)
<label for="std">Scheduled Departure Time (UTC)</label>
<input id="std" type="text" class="form-control" maxlength="4" value="{{ $flight->dpt_time }}" disabled>
@endif
</div>
<div class="col-sm-4">
<label for="etd">Estimated Departure Time (UTC)</label>
<input id="etd" type="text" class="form-control" maxlength="4" disabled>
</div>
<div class="col-sm-4">
<label for="dof">Date Of Flight (UTC)</label>
<input id="dof" type="text" class="form-control" maxlength="4" disabled>
</div>
</div>
<br>
</div>
<div class="form-container-body">
<h6><i class="fas fa-info-circle"></i>&nbsp;Configuration And Load Information For
<b>{{ $aircraft->registration }} ({{ $aircraft->subfleet->name }})</b></h6>
<div class="row">
@php $loadarray = [] ; @endphp
{{-- Generate Load Figures For Pax Fares --}}
@foreach($aircraft->subfleet->fares->where('type', 0) as $fare)
@php
$randompaxperfare = floor(($fare->pivot->capacity * rand($loadmin, $loadmax)) /100);
$loadarray[] = ['LoadType' => $fare->code];
$loadarray[] = ['LoadFigure' => $randompaxperfare];
@endphp
<div class="col-sm-3">
<label for="LoadFare{{ $fare->id }}">{{ $fare->name }} [Max: {{ number_format($fare->pivot->capacity) }}]</label>
<input id="LoadFare{{ $fare->id }}" type="text" class="form-control" value="{{ number_format($randompaxperfare) }}" disabled>
</div>
@endforeach
{{-- Calculate weights for Pax Loads Before moving to Cargo Fares --}}
@php
$paxcollection = collect($loadarray);
$tpaxfig = $paxcollection->sum('LoadFigure');
if(setting('units.weight') === 'kg') {
$tpaxload = round(($pax_weight * $tpaxfig) / 2.205);
$tbagload = round(($bag_weight * $tpaxfig) / 2.205);
} else {
$tpaxload = round($pax_weight * $tpaxfig);
$tbagload = round($bag_weight * $tpaxfig);
}
@endphp
{{-- Generate Load Figures For Cargo Fares --}}
@foreach($aircraft->subfleet->fares->where('type', 1) as $fare)
@php
$randomcargoperfare = ceil((($fare->pivot->capacity - $tbagload) * rand($loadmin, $loadmax)) /100);
$loadarray[] = ['LoadType' => $fare->code];
$loadarray[] = ['CargoFigure' => $randomcargoperfare];
@endphp
<div class="col-sm-3">
<label for="LoadFare{{ $fare->id }}">{{ $fare->name }} [Max: {{ number_format($fare->pivot->capacity - $tbagload) }} {{ setting('units.weight') }}]</label>
<input id="LoadFare{{ $fare->id }}" type="text" class="form-control" value="{{ number_format($randomcargoperfare) }}" disabled>
</div>
@endforeach
@php
$loadcollection = collect($loadarray);
$tcargoload = $loadcollection->sum('CargoFigure');
$tpayload = $tpaxload + $tbagload + $tcargoload;
@endphp
</div>
@if(isset($tpayload) && $tpayload > 0)
{{-- Display The Weights Generated --}}
<br>
<div class="row">
@if($tpaxload)
<div class="col-sm-3">
<label for="tdPaxLoad">Pax Weight</label>
<input id="tdPaxLoad" type="text" class="form-control" value="{{ number_format($tpaxload) }} {{ setting('units.weight') }}" disabled>
</div>
<div class="col-sm-3">
<label for="tBagLoad">Baggage Weight</label>
<input id="tBagLoad" type="text" class="form-control" value="{{ number_format($tbagload) }} {{ setting('units.weight') }}" disabled>
</div>
@endif
@if($tpaxload && $tcargoload)
<div class="col-sm-3">
<label for="tCargoload">Cargo Weight</label>
<input id="tCargoload" type="text" class="form-control" value="{{ number_format($tcargoload) }} {{ setting('units.weight') }}" disabled>
</div>
@endif
<div class="col-sm-3">
<label for="tPayload">Total Payload</label>
<input id="tPayload" type="text" class="form-control" value="{{ number_format($tpayload) }} {{ setting('units.weight') }}" disabled>
</div>
</div>
@endif
</div>
</div>
{{-- Prepare Form Fields For SimBrief --}}
<input type="hidden" name="acdata" value="{'paxwgt':{{ round($pax_weight + $bag_weight) }}}">
@if($tpaxfig)
<input type="hidden" name="pax" value="{{ $tpaxfig }}">
@elseif(!$tpaxfig && $tcargoload)
<input type="hidden" name="pax" value="0">
@endif
@if($tcargoload)
<input type='hidden' name='cargo' value="{{ number_format(($tcargoload / 1000),1) }}">
@endif
{{--
Generate the MANUALRMK which is sent to SimBrief and displayed as Dispatch Remark.
$loadarray is created and filled with data during random load generation,
it holds each fare's code and the generated load.
Returned string will be "FixedText eachFareCode eachFareLoad"
Example Remark ; Load Distribution Y 132 J 12 F 4 C 2800
--}}
@if(isset($tpayload) && $tpayload > 0)
@php
$loaddisttxt = "Load Distribution ";
$loaddist = implode(' ', array_map(
function ($v, $k) {
if(is_array($v)){
return implode('&'.' '.':', $v);
}else{
return $k.':'.$v;
}
},
$loadarray, array_keys($loadarray)
));
@endphp
<input type="hidden" name="manualrmk" value="{{ $loaddisttxt }}{{ $loaddist }}">
@endif
<input type="hidden" name="airline" value="{{ $flight->airline->icao }}">
<input type="hidden" name="fltnum" value="{{ $flight->flight_number }}">
@if(setting('simbrief.callsign', false))
<input type="hidden" name="callsign" value="{{ Auth::user()->ident }}">
@endif
<input type="hidden" id="steh" name="steh" maxlength="2">
<input type="hidden" id="stem" name="stem" maxlength="2">
<input type="hidden" id="date" name="date" maxlength="9">
<input type="hidden" id="deph" name="deph" maxlength="2">
<input type="hidden" id="depm" name="depm" maxlength="2">
<input type="hidden" name="selcal" value="BK-FS">
<input type="hidden" name="planformat" value="lido">
<input type="hidden" name="omit_sids" value="0">
<input type="hidden" name="omit_stars" value="0">
<input type="hidden" name="cruise" value="CI">
<input type="hidden" name="civalue" value="AUTO">
{{-- For more info about form fields and their details check SimBrief Forum / API Support --}}
</div>
<div class="col-4">
<div class="form-container">
<div class="form-container-body">
<h6><i class="fas fa-info-circle"></i>&nbsp;Planning Options</h6>
<table class="table table-sm table-striped">
<tr>
<td>Cont Fuel:</td>
<td>
<select name="contpct" class="form-control">
<option value="0">None</option>
<option value="auto">AUTO</option>
<option value="easa">EASA</option>
<option value="0.03/5">3% or 05 MIN</option>
<option value="0.03/10">3% or 10 MIN</option>
<option value="0.03/15">3% or 15 MIN</option>
<option value="0.05/5" selected>5% or 05 MIN</option>
<option value="0.05/10">5% or 10 MIN</option>
<option value="0.05/15">5% or 15 MIN</option>
<option value="0.03">3%</option>
<option value="0.05">5%</option>
<option value="0.1">10%</option>
<option value="0.15">15%</option>
<option value="3">03 MIN</option>
<option value="5">05 MIN</option>
<option value="10">10 MIN</option>
<option value="15">15 MIN</option>
</select>
</td>
</tr>
<tr>
<td>Reserve Fuel:</td>
<td>
<select name="resvrule" class="form-control">
<option value="auto">AUTO</option>
<option value="0">0 MIN</option>
<option value="15">15 MIN</option>
<option value="30" selected>30 MIN</option>
<option value="45">45 MIN</option>
<option value="60">60 MIN</option>
<option value="75">75 MIN</option>
<option value="90">90 MIN</option>
</select>
</td>
</tr>
<tr>
<td>SID/STAR Type:</td>
<td>
<select name="find_sidstar" class="form-control">
<option value="C">Conventional</option>
<option value="R" selected>RNAV</option>
</select>
</td>
</tr>
<tr>
<td>Plan Stepclimbs:</td>
<td>
<select id="stepclimbs" name="stepclimbs" class="form-control" onchange="DisableFL()">
<option value="0" selected>Disabled</option>
<option value="1">Enabled</option>
</select>
</td>
</tr>
<tr>
<td>ETOPS Planning:</td>
<td>
<select name="etops" class="form-control">
<option value="0" selected>Disabled</option>
<option value="1">Enabled</option>
</select>
</td>
</tr>
</table>
</div>
<br>
<div class="form-container-body">
<h6><i class="fas fa-info-circle"></i>&nbsp;Briefing Options</h6>
<table class="table table-sm table-striped">
<tr>
<td>Units:</td>
<td>
<select id="kgslbs" name="units" class="form-control">
@if(setting('units.weight') === 'kg')
<option value="KGS" selected>KGS</option>
<option value="LBS">LBS</option>
@else
<option value="KGS">KGS</option>
<option value="LBS" selected>LBS</option>
@endif
</select>
</td>
</tr>
<tr>
<td>Detailed Navlog:</td>
<td>
<select name="navlog" class="form-control">
<option value="0">Disabled</option>
<option value="1" selected>Enabled</option>
</select>
</td>
</tr>
<tr>
<td>Runway Analysis:</td>
<td>
<select name="tlr" class="form-control">
<option value="0">Disabled</option>
<option value="1" selected>Enabled</option>
</select>
</td>
</tr>
<tr>
<td>Include NOTAMS:</td>
<td>
<select name="notams" class="form-control">
<option value="0">Disabled</option>
<option value="1" selected>Enabled</option>
</select>
</td>
</tr>
<tr>
<td>FIR NOTAMS:</td>
<td>
<select name="firnot" class="form-control">
<option value="0" selected>Disabled</option>
<option value="1">Enabled</option>
</select>
</td>
</tr>
<tr>
<td>Flight Maps:</td>
<td>
<select name="maps" class="form-control">
<option value="detail" selected>Detailed</option>
<option value="simple">Simple</option>
<option value="none">None</option>
</select>
</td>
</tr>
</table>
</div>
<br>
<div class="form-container-body">
<div class="float-right">
<div class="form-group">
<input type="button"
onclick="simbriefsubmit('{{ $flight->id }}', '{{ url(route('frontend.simbrief.briefing', [''])) }}');"
class="btn btn-primary" value="Generate">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
@endsection
@section('scripts')
<script src="{{public_asset('/assets/global/js/simbrief.apiv1.js')}}"></script>
<script type="text/javascript">
// ******
// Disable Submitting a fixed flight level for Stepclimb option to work
// Script is related to Plan Step Climbs selection
function DisableFL() {
let climb = document.getElementById("stepclimbs").value;
if (climb === "0") {
document.getElementById("fl").disabled = false
}
if (climb === "1") {
document.getElementById("fl").disabled = true
}
}
</script>
<script type="text/javascript">
// ******
// Get current UTC time, add 45 minutes to it and format according to Simbrief API
// Script also rounds the minutes to nearest 5 to avoid a Departure time like 1538 ;)
// If you need to reduce the margin of 45 mins, change value below
let d = new Date();
const months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
d.setMinutes(d.getMinutes() + 45); // Change the value here
let deph = ("0" + d.getUTCHours(d)).slice(-2);
let depm = d.getUTCMinutes(d);
if (depm < 55) {
depm = Math.ceil(depm / 5) * 5;
}
if (depm > 55) {
depm = Math.floor(depm / 5) * 5;
}
depm = ("0" + depm).slice(-2);
dept = deph + ":" + depm;
let dof = ("0" + d.getUTCDate()).slice(-2) + months[d.getUTCMonth()] + d.getUTCFullYear();
document.getElementById("dof").setAttribute('value', dof);
document.getElementById("etd").setAttribute('value', dept);
document.getElementById("date").setAttribute('value', dof); // Sent to Simbrief
document.getElementById("deph").setAttribute('value', deph); // Sent to SimBrief
document.getElementById("depm").setAttribute('value', depm); // Sent to SimBrief
</script>
<script type="text/javascript">
// ******
// Calculate the Scheduled Enroute Time for Simbrief API
// Your PHPVMS flight_time value must be from BLOCK to BLOCK
// Including departure and arrival taxi times
// If this value is not correctly calculated and configured
// Simbrief CI (Cost Index) calculation will not provide realistic results
let num = {{ $flight->flight_time }};
let hours = (num / 60);
let rhours = Math.floor(hours);
let minutes = (hours - rhours) * 60;
let rminutes = Math.round(minutes);
document.getElementById("steh").setAttribute('value', rhours.toString()); // Sent to Simbrief
document.getElementById("stem").setAttribute('value', rminutes.toString()); // Sent to Simbrief
</script>
@endsection