Compare commits

...
Author SHA1 Message Date
Nabeel Shahzad c97977de9a Include all enums in aliases 2021-01-25 17:07:11 -05:00
Nabeel Shahzad bda1a91117 Return null on empty value 2021-01-25 17:03:48 -05:00
Nabeel Shahzad 3f92191126 Tests for the CSV import fix
#1007
2021-01-25 16:49:32 -05:00
Nabeel Shahzad 5821067231 Default settings to false 2021-01-25 07:06:27 -05:00
Nabeel S fc7ad7eb6a Simbrief attachment not working #1005 (#1006)
* Refactoring for Simbrief not working #1005

* Style fixes

* Update tests for new briefing URL

* Check the OFP user

* Comment out user check temporarily
2021-01-25 06:54:17 -05:00
Nabeel S 101b3261f5 Move loadmin/max into the controller (#1003) 2021-01-22 09:02:15 -05:00
Nabeel Shahzad fb0027b140 Update Discord message 2021-01-22 08:38:54 -05:00
Nabeel Shahzad 066702e490 Switch to http until I can get the certificates sorted 2021-01-22 08:30:25 -05:00
Nabeel Shahzad b4e0515405 Add tar/zip reference to Discord build message 2021-01-22 08:29:22 -05:00
B.Fatih KOZ f5ca8ce6e3 Fix For Load Factor and Variance Bug (#1002)
PR fixes the issue where load factor and variance being reported 0 to simbrief form, where user does not provide any values for each and wants to use general settings per flight.

Quick fix for issue #1001
2021-01-22 08:14:34 -05:00
Nabeel Shahzad 7e9196c7e6 Check if simbrief is valid 2021-01-21 11:57:44 -05:00
Nabeel S a2916bf536 Cleanup visible flight logic (#1000)
* Cleanup visible flight logic

* Add transfer_time to API response
2021-01-21 11:11:11 -05:00
Nabeel Shahzad 0578f98b58 Force flight to visible before day checks 2021-01-21 10:57:51 -05:00
Nabeel Shahzad 2e0f0b00ef Ensure simbrief id is assigned 2021-01-21 09:21:39 -05:00
Daniel Ortez d5d9010134 Fix error in webpack file (#994) 2021-01-20 09:24:27 -05:00
Nabeel Shahzad bd8e13e78f Cleanup Simbrief Briefing pages 2021-01-17 21:52:22 -05:00
Nabeel Shahzad c4dee07b7f Cleanup flight search code 2021-01-17 21:25:44 -05:00
dependabot[bot]andNabeel S f8a44d8c6d Bump ini from 1.3.5 to 1.3.8 (#955)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nabeel S <nabeelio@users.noreply.github.com>
2021-01-17 16:01:04 -05:00
617cea5df7 SimBrief Planning System Update (#991)
* SimBrief Planning System Update

Replaces outdated old pr.

Same improvements apply to both controller and simbrief_form.blade.

* Style Fix for SimBrief.Controller

* strict equals fix and some comments

changed equals to strict equals and put in some comments about the loadarray and manualrmk generation.

* Formatting/separate out secstohhmm

* Formatting

* Removed duplicates

We have the $wakecat, $equipment and $transponder in the controller, removed them from the blade.

Fixed a harmless typo in the IVAO Prefile DEPTIME line

Co-authored-by: Nabeel S <nabeelio@users.noreply.github.com>
Co-authored-by: Nabeel Shahzad <nabeel@nabeel.sh>
2021-01-17 15:59:32 -05:00
B.Fatih KOZ 3a99fe9e0e SimBrief Briefing Display Fix (#992)
Fixed Estimate Enroute Time (EET) display (it was using Scheduled Enroute Time)
2021-01-17 14:26:03 -05:00
a952071cb4 Subfleet Hubs / Base Airports (#978)
* Update SubFleet Model

Add hub_id for storing subfleet's main base/hub airport, define a relationship with airport model to get details of the base/hub airport when needed.

* Update Admin / SubFleetController

Added the ability to read and pass hub airports to admin view for create/edit options.

* Update Admin/SubFleets.fields.blade

Added the dropdown for adding/editing main base/hub of a subfleet.

* Add migration for the hub_id column

Co-authored-by: Nabeel S <nabeelio@users.noreply.github.com>
Co-authored-by: Nabeel Shahzad <nshahzad@live.com>
2021-01-17 12:43:06 -05:00
dependabot[bot]andNabeel S 157e0d830c Bump axios from 0.18.1 to 0.21.1 (#979)
Bumps [axios](https://github.com/axios/axios) from 0.18.1 to 0.21.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.18.1...v0.21.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nabeel S <nabeelio@users.noreply.github.com>
2021-01-17 12:27:54 -05:00
B.Fatih KOZandNabeel S a5b83185f5 Search Flights By Flight Type (#987)
Flight Controller : Added flight_type to return

Flight Repository : Made flight_type searchable and added its where criteria

Flight.Search.Blade : Added the flight types in a reasonable order as a dropdown (like schedule pax,charter pax,cargo,others)

Co-authored-by: Nabeel S <nabeelio@users.noreply.github.com>
2021-01-17 12:23:23 -05:00
Maximiliano Fallico 29ff0758a7 Add filter/search by airline in admin (#990)
Add filter/search by Airline
2021-01-17 11:59:34 -05:00
Nabeel Shahzad be74d99ae8 Run on pull request 2021-01-17 11:54:46 -05:00
Nabeel Shahzad 53de2e3229 Only run workflows on main repo 2021-01-17 11:52:49 -05:00
Nabeel S 80a90c6e3c Fix github badge 2021-01-16 22:15:32 -05:00
Nabeel S 854ed9b92c Remove travis-ci badge 2021-01-16 22:14:28 -05:00
Nabeel S 46b17b5c04 Use GitHub actions (#989) 2021-01-16 20:25:58 -05:00
Andrew Roberts 0068b1215a Remove existing fares when importing (#988)
Delete all existing fares and overwrite with new import when Delete Existing Data is checked/true.
2021-01-16 13:09:56 -05:00
B.Fatih KOZ 984c1e0cec SimBrief : Generate New Briefing (#986)
* Add SB Briefing Removal Route

Route will be called from simbrief.briefing.blade

* SimBrief Controller and Briefing Blade Update

Added the remove function to controller, which removes the simbrief ofp if no pirep_id is present, else it just nulls the flight_id for to be able to create a new SB pack

Also added the button to blade for it to work

* Style Fix

love styleci
2021-01-15 17:36:46 -05:00
Daniel Ortez ad8b8e8945 Fix for deleting flights when importing (#984) 2021-01-14 07:07:35 -05:00
B.Fatih KOZ 2b0056b7c5 Added the ability to enable/disable flight table display below the map (#983)
* LiveMap Widget Upgrade

Added the ability to enable/disable flight table display below the map.

Default is on

* Update LiveMap.php

* Update LiveMap.php

* Update live_map.blade.php
2021-01-12 08:24:50 -05:00
B.Fatih KOZ 319a9fc8e1 Weather widget additions/fixes (#981)
Fixed the problem where values are not displayed when the reported wind,temp and dewpoint are 0 (zero).
Fixed the hPa number formatting, there is no need to add 2 more digits to it, it is a plain 4 digit value always (like 1013 or 1024, it is never reported nor used as 1013,58 or 1024,35 etc).
Corrected the display order, as it should be read (or say decoded).
Also added decoded Current and Recent Weather Situations, RVR and Runway Condition reports.

RVR report needs improvement in the Support / Metar.php too, it only reports nmi as the distance as far as i saw but it should be able to report meters too.
2021-01-07 09:09:05 -05:00
B.Fatih KOZ a037597a21 Airline > Subfleet Relationship (#970) 2021-01-03 08:05:48 -05:00
Andrew Roberts 4026fe9149 Fix location of configservice (#977)
Pointing to wrong location of file which is throwing errors as a result
2021-01-03 07:39:02 -05:00
50 changed files with 1271 additions and 726 deletions
+7 -71
View File
@@ -1,52 +1,12 @@
#!/usr/bin/env bash #!/usr/bin/env bash
if [ "$TRAVIS" != "true" ]; then
exit 0
fi
cd $TRAVIS_BUILD_DIR
if test "$TRAVIS_TAG"; then
VERSION=$TRAVIS_TAG
# Pass in the tag as the version to write out
php artisan phpvms:version --write --write-full-version "${VERSION}"
FULL_VERSION=$(php artisan phpvms:version)
else
echo "On branch $TRAVIS_BRANCH"
if [ "$TRAVIS_BRANCH" != "master" ] && [ "$TRAVIS_BRANCH" != "dev" ]; then
echo "Not on valid branch, exiting"
exit 0
fi
# Write the version out but place the branch ID in there
# This is only for the dev branch
BASE_VERSION=$(php artisan phpvms:version --base-only)
# This now includes the pre-release version, so "-dev" by default
VERSION=${BASE_VERSION}
# Don't pass in a version here, just write out the latest hash
php artisan phpvms:version --write "${VERSION}"
FULL_VERSION=$(php artisan phpvms:version)
fi
FILE_NAME="phpvms-${VERSION}"
TAR_NAME="$FILE_NAME.tar.gz"
ZIP_NAME="$FILE_NAME.zip"
echo "Version: ${VERSION}" echo "Version: ${VERSION}"
echo "Full Version: ${FULL_VERSION}" echo "Full Version: ${FULL_VERSION}"
echo "Package name: ${TAR_NAME}" echo "Package name: ${TAR_NAME}"
echo "Current directory: ${BASE_DIR}"
echo "==========================="
echo "Cleaning files" echo "Cleaning files"
rm -rf vendor
composer install --no-dev --prefer-dist --no-interaction --verbose
# Leftover individual files to delete # Leftover individual files to delete
declare -a remove_files=( declare -a remove_files=(
.git .git
@@ -107,44 +67,20 @@ mkdir -p storage/framework/cache
mkdir -p storage/framework/sessions mkdir -p storage/framework/sessions
mkdir -p storage/framework/views mkdir -p storage/framework/views
# Regenerate the autoloader and classes
composer dump-autoload
make clean
cd /tmp cd /tmp
ls -al $TRAVIS_BUILD_DIR/../
tar -czf $TAR_NAME -C $TRAVIS_BUILD_DIR . ls -al $BASE_DIR/../
tar -czf $TAR_NAME -C $BASE_DIR .
sha256sum $TAR_NAME >"$TAR_NAME.sha256" sha256sum $TAR_NAME >"$TAR_NAME.sha256"
tar2zip $TAR_NAME tar2zip $TAR_NAME
sha256sum $ZIP_NAME >"$ZIP_NAME.sha256" sha256sum $ZIP_NAME >"$ZIP_NAME.sha256"
ls -al /tmp ls -al /tmp
echo "Uploading to S3" echo "Moving to dist"
mkdir -p $TRAVIS_BUILD_DIR/build mkdir -p $BASE_DIR/dist
cd $TRAVIS_BUILD_DIR/build cd $BASE_DIR/dist
mv "/tmp/$TAR_NAME" "/tmp/$ZIP_NAME" "/tmp/$TAR_NAME.sha256" "/tmp/$ZIP_NAME.sha256" . mv "/tmp/$TAR_NAME" "/tmp/$ZIP_NAME" "/tmp/$TAR_NAME.sha256" "/tmp/$ZIP_NAME.sha256" .
artifacts upload --target-paths "/" $ZIP_NAME $TAR_NAME $TRAVIS_BUILD_DIR/VERSION $TAR_NAME.sha256 $ZIP_NAME.sha256
# Upload the version for a tagged release. Move to a version file in different
# tags. Within phpVMS, we have an option of which version to track in the admin
if test "$TRAVIS_TAG"; then
echo "Uploading release version file"
cp "$TRAVIS_BUILD_DIR/VERSION" release_version
artifacts upload --target-paths "/" release_version
else
echo "Uploading ${TRAVIS_BRANCH}_version file"
cp $TRAVIS_BUILD_DIR/VERSION ${TRAVIS_BRANCH}_version
artifacts upload --target-paths "/" ${TRAVIS_BRANCH}_version
fi
#if [ "$TRAVIS_BRANCH" != "master" ] && [ "$TRAVIS_BRANCH" != "dev" ]; then
# echo "Skipping Discord branch update broadcast"
#else
curl -X POST \
--data "{\"content\": \"A new build is available at http://downloads.phpvms.net/$TAR_NAME (${FULL_VERSION})\"}" \
-H "Content-Type: application/json" \
$DISCORD_WEBHOOK_URL
#fi
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env bash
if test "$GIT_TAG_NAME"; then
export VERSION=$GIT_TAG_NAME
# Pass in the tag as the version to write out
php artisan phpvms:version --write --write-full-version "${VERSION}"
export FULL_VERSION=$(php artisan phpvms:version)
else
export BRANCH=${GITHUB_REF##*/}
echo "On branch $BRANCH"
# Write the version out but place the branch ID in there
# This is only for the dev branch
export BASE_VERSION=$(php artisan phpvms:version --base-only)
# This now includes the pre-release version, so "-dev" by default
export VERSION=${BASE_VERSION}
# Don't pass in a version here, just write out the latest hash
php artisan phpvms:version --write "${VERSION}"
export FULL_VERSION=$(php artisan phpvms:version)
fi
export FILE_NAME="phpvms-${VERSION}"
export TAR_NAME="$FILE_NAME.tar.gz"
export ZIP_NAME="$FILE_NAME.zip"
export BASE_DIR=`pwd`
# https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#environment-files
echo "BRANCH=${BRANCH}" >> $GITHUB_ENV
echo "FILE_NAME=${FILE_NAME}" >> $GITHUB_ENV
echo "TAR_NAME=${TAR_NAME}" >> $GITHUB_ENV
echo "ZIP_NAME=${ZIP_NAME}" >> $GITHUB_ENV
echo "BASE_DIR=${BASE_DIR}" >> $GITHUB_ENV
echo "DISCORD_MSG=Version ${FULL_VERSION} is available, download: [zip](http://downloads.phpvms.net/$ZIP_NAME) | [tar](http://downloads.phpvms.net/$TAR_NAME)" >> $GITHUB_ENV
+252
View File
@@ -0,0 +1,252 @@
name: 'Build'
on: ['push', 'pull_request', 'workflow_dispatch', 'release']
jobs:
build:
runs-on: ubuntu-18.04
if: github.repository == 'nabeelio/phpvms'
strategy:
fail-fast: true
matrix:
php-versions: ['7.3', '7.4']
name: PHP ${{ matrix.php-versions }}
env:
extensions: intl, pcov, mbstring
key: cache-v1
steps:
- name: Checkout
uses: actions/checkout@v2
# Configure Caching
- name: Setup cache environment
id: cache-env
uses: shivammathur/cache-extensions@v1
with:
php-version: ${{ matrix.php-versions }}
extensions: ${{ env.extensions }}
key: ${{ env.key }}
- name: Cache extensions
uses: actions/cache@v1
with:
path: ${{ steps.cache-env.outputs.dir }}
key: ${{ steps.cache-env.outputs.key }}
restore-keys: ${{ steps.cache-env.outputs.key }}
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
# Configure PHP
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: ${{ env.extensions }}
ini-values: post_max_size=256M, short_open_tag=On
coverage: xdebug
tools: php-cs-fixer, phpunit
- name: Shutdown Ubuntu MySQL
run: sudo service mysql stop
- name: Install MariaDB
uses: getong/mariadb-action@v1.1
with:
character set server: 'utf8'
collation server: 'utf8_general_ci'
mysql database: 'phpvms'
mysql root password: ''
mysql user: ''
mysql password: ''
- name: Configure Environment
run: |
php --version
mysql --version
# Downgrade composer version to 1.x
composer self-update --1
composer install --dev --no-interaction --verbose
cp .github/scripts/env.php env.php
cp .github/scripts/phpunit.xml phpunit.xml
php artisan database:create --reset
php artisan migrate:refresh --seed
- name: Run Tests
run: |
vendor/bin/php-cs-fixer fix --config=.php_cs -v --dry-run --diff --using-cache=no
vendor/bin/phpunit --debug --verbose
# This runs after all of the tests, run have run. Creates a cleaned up version of the
# distro, and then creates the artifact to push up to S3 or wherever
artifacts:
name: 'Create dev build'
needs: build
runs-on: 'ubuntu-18.04'
if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev'
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
- uses: olegtarasov/get-tag@v2.1
id: tagName
# Configure Caching
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
# Dependencies
- name: 'Install Release Dependencies'
run: |
rm -rf vendor
sudo npm i tar-to-zip -g
composer self-update --1
composer install --no-dev --prefer-dist --no-interaction --verbose
sudo chmod +x ./.github/scripts/*
- name: Get version
run: .github/scripts/version.sh
- name: Build Distro
run: .github/scripts/build.sh
- name: Upload S3
uses: shallwefootball/s3-upload-action@v1.1.3
with:
aws_key_id: ${{ secrets.S3_BUILD_ARTIFACTS_ACCESS_KEY_ID }}
aws_secret_access_key: ${{ secrets.S3_BUILD_ARTIFACTS_SECRET_ACCESS_KEY}}
aws_bucket: ${{ secrets.S3_BUCKET_NAME }}
source_dir: 'dist'
destination_dir: ''
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.0
with:
# DISCORD_MSG is defined in versions.sh
args: '{{ DISCORD_MSG }}'
# This runs after all of the tests, run have run. Creates a cleaned up version of the
# distro, and then creates the artifact to push up to S3 or wherever
# https://github.com/actions/create-release
release:
name: 'Create Release'
needs: build
runs-on: 'ubuntu-18.04'
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
- uses: olegtarasov/get-tag@v2.1
id: tagName
# Configure Caching
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
# Dependencies
- name: 'Install Release Dependencies'
run: |
rm -rf vendor
sudo npm i tar-to-zip -g
composer self-update --1
composer install --no-dev --prefer-dist --no-interaction --verbose
sudo chmod +x ./.github/scripts/*
- name: Get version
run: .github/scripts/version.sh
- name: Build Distro
run: .github/scripts/build.sh
- name: Upload S3
uses: shallwefootball/s3-upload-action@v1.1.3
with:
aws_key_id: ${{ secrets.S3_BUILD_ARTIFACTS_ACCESS_KEY_ID }}
aws_secret_access_key: ${{ secrets.S3_BUILD_ARTIFACTS_SECRET_ACCESS_KEY}}
aws_bucket: ${{ secrets.S3_BUCKET_NAME }}
source_dir: 'dist'
destination_dir: ''
- name: Checkout code
uses: actions/checkout@v2
- name: Get version
run: .github/scripts/version.sh
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: true
prerelease: false
# Upload the tar file to the release
- name: Upload Tar Asset
id: upload-tar-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: dist/{{TAR_NAME}}
asset_name: '{{ TAR_NAME }}'
asset_content_type: application/gzip
# upload the zip file to the release
- name: Upload Zip Asset
id: upload-zip-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: dist/{{ZIP_NAME}}
asset_name: '{{ ZIP_NAME }}'
asset_content_type: application/zip
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.0
with:
# DISCORD_MSG is defined in versions.sh
args: '{{ DISCORD_MSG }}'
-162
View File
@@ -1,162 +0,0 @@
#
# Travis CI config file
#
language: php
php:
- '7.4'
- '7.3'
#env:
# - DB=mysql
# - DB=mariadb
cache:
# Cache lives for 10 min
# Default of 3m might not be long enough for all the runs
timeout: 600
directories:
- "$HOME/.composer/cache"
- "$HOME/.npm"
services:
- mysql
#addons:
# mariadb: '10.2'
install:
- php --version
- mysql --version
# Downgrade composer version to 1.x
- composer self-update --1
- composer install --dev --no-interaction --verbose
- npm i tar-to-zip -g
- cp .travis/env.travis.php env.php
- cp .travis/phpunit.travis.xml phpunit.xml
before_script:
- php artisan database:create --reset
- php artisan migrate:refresh --seed
script:
- vendor/bin/php-cs-fixer fix --config=.php_cs -v --dry-run --diff --using-cache=no
- vendor/bin/phpunit --debug --verbose
after_failure:
- cat storage/logs/*.log
# Refer to: https://github.com/doctrine/dbal/blob/master/.travis.yml#L39
jobs:
include:
# Different test stages
# - stage: Test
# name: PHP 7.2 + MySQL 5.7
# php: 7.2
# env: DB=mysql
# services:
# - mysql
# - stage: Test
# name: PHP 7.3 + MySQL 5.7
# php: 7.3
# env: DB=mysql
# services:
# - mysql
# - stage: Test
# name: PHP 7.4 + MySQL 5.7
# php: 7.4
# env: DB=mysql
# services:
# - mysql
# - stage: Test
# name: PHP 7.2 + MariaDB 10.1
# php: 7.2
# env: DB=mariadb
# addons:
# mariadb: '10.1'
# - stage: Test
# name: PHP 7.3 + MariaDB 10.1
# php: 7.3
# env: DB=mariadb
# addons:
# mariadb: '10.1'
# - stage: Test
# name: PHP 7.4 + MariaDB 10.1
# php: 7.4
# env: DB=mariadb MARIADB_VERSION=10.1
# addons:
# mariadb: '10.1'
# - stage: Test
# name: PHP 7.2 + MariaDB 10.2
# php: 7.2
# env: DB=mariadb
# addons:
# mariadb: '10.2'
# - stage: Test
# name: PHP 7.3 + MariaDB 10.3
# php: 7.3
# env: DB=mariadb
# addons:
# mariadb: '10.2'
# - stage: Test
# name: PHP 7.4 + MariaDB 10.2
# php: 7.4
# env: DB=mariadb
# addons:
# mariadb: '10.2'
# - stage: Test
# name: PHP 7.2 + MariaDB 10.3
# php: 7.2
# env: DB=mariadb
# addons:
# mariadb: '10.3'
# - stage: Test
# name: PHP 7.3 + MariaDB 10.3
# php: 7.3
# env: DB=mariadb
# addons:
# mariadb: '10.3'
# - stage: Test
# name: PHP 7.4 + MariaDB 10.3
# php: 7.4
# env: DB=mariadb
# addons:
# mariadb: '10.3'
# Just packages up a release
- stage: package
script: skip
before_deploy:
- curl -sL https://raw.githubusercontent.com/travis-ci/artifacts/6b10798/install | bash
# Configure the conditional deployment
# https://docs.travis-ci.com/user/deployment/#examples-of-conditional-deployment
deploy:
- provider: script
skip_cleanup: true
script: ./.travis/deploy_script.sh
on:
all_branches: true
repo: nabeelio/phpvms
php: '7.4'
tags: false
# RELEASE STAGE
# Only runs when there's a tag applied to this release (tag should be the version)
# This uses Github Releases and posts it there (provider: releases)
# https://docs.travis-ci.com/user/deployment/releases
- stage: release
script: skip
before_deploy:
- curl -sL https://raw.githubusercontent.com/travis-ci/artifacts/6b10798/install | bash
- ./.travis/deploy_script.sh
deploy:
provider: releases
skip_cleanup: true
api_key: $GITHUB_TOKEN
file_glob: true
file: build/*
on:
tags: true
repo: nabeelio/phpvms
php: '7.4'
+1 -1
View File
@@ -1,6 +1,6 @@
# phpVMS <sup>7</sup> # phpVMS <sup>7</sup>
[![Build Status](https://travis-ci.org/nabeelio/phpvms.svg)](https://travis-ci.org/nabeelio/phpvms) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d668bebb0a3c46bda381af16ce3d9450)](https://www.codacy.com/app/nabeelio/phpvms?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nabeelio/phpvms&amp;utm_campaign=Badge_Grade) [![Latest Stable Version](https://poser.pugx.org/nabeel/phpvms/v/stable)](https://packagist.org/packages/nabeel/phpvms) ![StyleCI](https://github.styleci.io/repos/93688482/shield?branch=dev) [![License](https://poser.pugx.org/nabeel/phpvms/license)](https://packagist.org/packages/nabeel/phpvms) [![Build](https://github.com/nabeelio/phpvms/workflows/Build/badge.svg?branch=dev)](https://github.com/nabeelio/phpvms/actions) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/d668bebb0a3c46bda381af16ce3d9450)](https://www.codacy.com/app/nabeelio/phpvms?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nabeelio/phpvms&amp;utm_campaign=Badge_Grade) [![Latest Stable Version](https://poser.pugx.org/nabeel/phpvms/v/stable)](https://packagist.org/packages/nabeel/phpvms) ![StyleCI](https://github.styleci.io/repos/93688482/shield?branch=dev) [![License](https://poser.pugx.org/nabeel/phpvms/license)](https://packagist.org/packages/nabeel/phpvms)
The next phpvms version built on the laravel framework. work in progress. The latest documentation, with installation instructions is available [on the phpVMS documentation](https://docs.phpvms.net/) page. The next phpvms version built on the laravel framework. work in progress. The latest documentation, with installation instructions is available [on the phpVMS documentation](https://docs.phpvms.net/) page.
+1 -1
View File
@@ -3,7 +3,7 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Contracts\Command; use App\Contracts\Command;
use Modules\Installer\Services\ConfigService; use App\Services\Installer\ConfigService;
/** /**
* Create a fresh development install * Create a fresh development install
+10 -24
View File
@@ -42,23 +42,18 @@ class SetActiveFlights extends Listener
continue; continue;
} }
// Set to visible by default
$flight->visible = true;
// dates aren't set, so just save if there were any changes above // dates aren't set, so just save if there were any changes above
// and move onto the next one // and move onto the next one
if ($flight->start_date === null || $flight->end_date === null) { if ($flight->start_date === null || $flight->end_date === null) {
if ($flight->days !== null && $flight->days > 0) { if ($flight->days !== null && $flight->days > 0) {
$visible = Days::isToday($flight->days); $flight->visible = Days::isToday($flight->days);
if ($flight->visible !== $visible) { if (!$flight->visible) {
Log::info('Flight '.$flight->ident.' to '.($visible ? 'shown' : 'hidden')); Log::info('Today='.date('N').', start=no, mask='.$flight->days.', in='
.Days::in($flight->days, Days::$isoDayMap[(int) date('N')]));
$flight->visible = $visible;
if ($visible === false) {
Log::info('Today='.date('N').', start=no, mask='.$flight->days.', in='
.Days::in($flight->days, Days::$isoDayMap[(int) date('N')]));
}
} }
} else {
Log::info('Toggling flight '.$flight->ident.' to visible');
$flight->visible = true;
} }
$flight->save(); $flight->save();
@@ -71,20 +66,11 @@ class SetActiveFlights extends Listener
// and then make sure if days of the week are specified, check that too // and then make sure if days of the week are specified, check that too
if ($today->gte($flight->start_date) && $today->lte($flight->end_date)) { if ($today->gte($flight->start_date) && $today->lte($flight->end_date)) {
if ($flight->days !== null && $flight->days > 0) { if ($flight->days !== null && $flight->days > 0) {
$visible = Days::isToday($flight->days); $flight->visible = Days::isToday($flight->days);
if ($flight->visible !== $visible) { if (!$flight->visible) {
Log::info('Toggling flight '.$flight->ident.' to '.($visible ? 'shown' : 'hidden').''); Log::info('Today='.date('N').', start=no, mask='.$flight->days.', in='
$flight->visible = $visible;
if ($visible === false) {
Log::info('Today='.date('N').', start='.$flight->start_date
.', end='.$flight->end_date.', mask='.$flight->days.', in='
.Days::in($flight->days, Days::$isoDayMap[(int) date('N')])); .Days::in($flight->days, Days::$isoDayMap[(int) date('N')]));
}
} }
} else {
Log::info('Toggling flight '.$flight->ident.' to visible');
$flight->visible = true;
} }
} else { } else {
$flight->visible = false; $flight->visible = false;
@@ -0,0 +1,20 @@
<?php
use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Add a hub to the subfleet is
*/
class AddHubToSubfleets extends Migration
{
public function up()
{
Schema::table('subfleets', function (Blueprint $table) {
$table->string('hub_id', 4)
->nullable()
->after('airline_id');
});
}
}
@@ -7,6 +7,7 @@ use App\Http\Controllers\Admin\Traits\Importable;
use App\Http\Requests\CreateSubfleetRequest; use App\Http\Requests\CreateSubfleetRequest;
use App\Http\Requests\UpdateSubfleetRequest; use App\Http\Requests\UpdateSubfleetRequest;
use App\Models\Airline; use App\Models\Airline;
use App\Models\Airport;
use App\Models\Enums\FareType; use App\Models\Enums\FareType;
use App\Models\Enums\FuelType; use App\Models\Enums\FuelType;
use App\Models\Enums\ImportExportType; use App\Models\Enums\ImportExportType;
@@ -133,6 +134,7 @@ class SubfleetController extends Controller
{ {
return view('admin.subfleets.create', [ return view('admin.subfleets.create', [
'airlines' => Airline::all()->pluck('name', 'id'), 'airlines' => Airline::all()->pluck('name', 'id'),
'hubs' => Airport::where('hub', 1)->pluck('name', 'id'),
'fuel_types' => FuelType::labels(), 'fuel_types' => FuelType::labels(),
]); ]);
} }
@@ -203,6 +205,7 @@ class SubfleetController extends Controller
return view('admin.subfleets.edit', [ return view('admin.subfleets.edit', [
'airlines' => Airline::all()->pluck('name', 'id'), 'airlines' => Airline::all()->pluck('name', 'id'),
'hubs' => Airport::where('hub', 1)->pluck('name', 'id'),
'fuel_types' => FuelType::labels(), 'fuel_types' => FuelType::labels(),
'avail_fares' => $avail_fares, 'avail_fares' => $avail_fares,
'avail_ranks' => $avail_ranks, 'avail_ranks' => $avail_ranks,
+10 -3
View File
@@ -4,9 +4,11 @@ namespace App\Http\Controllers\Api;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Exceptions\AssetNotFound; use App\Exceptions\AssetNotFound;
use App\Exceptions\Unauthorized;
use App\Http\Resources\Flight as FlightResource; use App\Http\Resources\Flight as FlightResource;
use App\Http\Resources\Navdata as NavdataResource; use App\Http\Resources\Navdata as NavdataResource;
use App\Models\SimBrief; use App\Models\SimBrief;
use App\Models\User;
use App\Repositories\Criteria\WhereCriteria; use App\Repositories\Criteria\WhereCriteria;
use App\Repositories\FlightRepository; use App\Repositories\FlightRepository;
use App\Services\FareService; use App\Services\FareService;
@@ -152,20 +154,25 @@ class FlightController extends Controller
* *
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/ */
public function briefing($id) public function briefing(string $id)
{ {
/** @var User $user */
$user = Auth::user(); $user = Auth::user();
$w = [ $w = [
'user_id' => $user->id, 'id' => $id,
'flight_id' => $id,
]; ];
/** @var SimBrief $simbrief */
$simbrief = SimBrief::where($w)->first(); $simbrief = SimBrief::where($w)->first();
if ($simbrief === null) { if ($simbrief === null) {
throw new AssetNotFound(new Exception('Flight briefing not found')); throw new AssetNotFound(new Exception('Flight briefing not found'));
} }
/*if ($simbrief->user_id !== $user->id) {
throw new Unauthorized(new Exception('User cannot access another user\'s simbrief'));
}*/
return response($simbrief->acars_xml, 200, [ return response($simbrief->acars_xml, 200, [
'Content-Type' => 'application/xml', 'Content-Type' => 'application/xml',
]); ]);
+5 -12
View File
@@ -22,8 +22,6 @@ use App\Models\Acars;
use App\Models\Enums\AcarsType; use App\Models\Enums\AcarsType;
use App\Models\Enums\PirepFieldSource; use App\Models\Enums\PirepFieldSource;
use App\Models\Enums\PirepSource; use App\Models\Enums\PirepSource;
use App\Models\Enums\PirepState;
use App\Models\Enums\PirepStatus;
use App\Models\Pirep; use App\Models\Pirep;
use App\Models\PirepComment; use App\Models\PirepComment;
use App\Repositories\AcarsRepository; use App\Repositories\AcarsRepository;
@@ -38,9 +36,6 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
/**
* Class PirepController
*/
class PirepController extends Controller class PirepController extends Controller
{ {
private $acarsRepo; private $acarsRepo;
@@ -93,6 +88,10 @@ class PirepController extends Controller
$attrs['created_at'] = Carbon::createFromTimeString($attrs['created_at']); $attrs['created_at'] = Carbon::createFromTimeString($attrs['created_at']);
} }
if (array_key_exists('submitted_at', $attrs)) {
$attrs['submitted_at'] = Carbon::createFromTimeString($attrs['submitted_at']);
}
if (array_key_exists('updated_at', $attrs)) { if (array_key_exists('updated_at', $attrs)) {
$attrs['updated_at'] = Carbon::createFromTimeString($attrs['updated_at']); $attrs['updated_at'] = Carbon::createFromTimeString($attrs['updated_at']);
} }
@@ -306,14 +305,8 @@ class PirepController extends Controller
} }
} }
$attrs['state'] = PirepState::PENDING;
$attrs['status'] = PirepStatus::ARRIVED;
$attrs['submitted_at'] = Carbon::now('UTC');
$pirep = $this->pirepRepo->update($attrs, $pirep_id);
try { try {
$pirep = $this->pirepSvc->create($pirep); $pirep = $this->pirepSvc->file($pirep, $attrs);
$this->updateFields($pirep, $request); $this->updateFields($pirep, $request);
$this->updateFares($pirep, $request); $this->updateFares($pirep, $request);
} catch (\Exception $e) { } catch (\Exception $e) {
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Frontend;
use App\Contracts\Controller; use App\Contracts\Controller;
use App\Models\Bid; use App\Models\Bid;
use App\Models\Enums\FlightType;
use App\Repositories\AirlineRepository; use App\Repositories\AirlineRepository;
use App\Repositories\AirportRepository; use App\Repositories\AirportRepository;
use App\Repositories\Criteria\WhereCriteria; use App\Repositories\Criteria\WhereCriteria;
@@ -120,6 +121,8 @@ class FlightController extends Controller
'saved' => $saved_flights, 'saved' => $saved_flights,
'subfleets' => $this->subfleetRepo->selectBoxList(true), 'subfleets' => $this->subfleetRepo->selectBoxList(true),
'flight_number' => $request->input('flight_number'), 'flight_number' => $request->input('flight_number'),
'flight_types' => FlightType::select(true),
'flight_type' => $request->input('flight_type'),
'arr_icao' => $request->input('arr_icao'), 'arr_icao' => $request->input('arr_icao'),
'dep_icao' => $request->input('dep_icao'), 'dep_icao' => $request->input('dep_icao'),
'subfleet_id' => $request->input('subfleet_id'), 'subfleet_id' => $request->input('subfleet_id'),
@@ -3,22 +3,34 @@
namespace App\Http\Controllers\Frontend; namespace App\Http\Controllers\Frontend;
use App\Exceptions\AssetNotFound; use App\Exceptions\AssetNotFound;
use App\Models\Aircraft;
use App\Models\Enums\FlightType;
use App\Models\SimBrief; use App\Models\SimBrief;
use App\Repositories\FlightRepository; use App\Repositories\FlightRepository;
use App\Services\FareService;
use App\Services\SimBriefService; use App\Services\SimBriefService;
use App\Services\UserService;
use Exception; use Exception;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
class SimBriefController class SimBriefController
{ {
private $fareSvc;
private $flightRepo; private $flightRepo;
private $simBriefSvc; private $simBriefSvc;
private $userSvc;
public function __construct(FlightRepository $flightRepo, SimBriefService $simBriefSvc) public function __construct(
{ FareService $fareSvc,
FlightRepository $flightRepo,
SimBriefService $simBriefSvc,
UserService $userSvc
) {
$this->fareSvc = $fareSvc;
$this->flightRepo = $flightRepo; $this->flightRepo = $flightRepo;
$this->simBriefSvc = $simBriefSvc; $this->simBriefSvc = $simBriefSvc;
$this->userSvc = $userSvc;
} }
/** /**
@@ -32,8 +44,14 @@ class SimBriefController
*/ */
public function generate(Request $request) public function generate(Request $request)
{ {
/** @var \App\Models\User $user */
$user = Auth::user();
$flight_id = $request->input('flight_id'); $flight_id = $request->input('flight_id');
$flight = $this->flightRepo->find($flight_id); $aircraft_id = $request->input('aircraft_id');
$flight = $this->flightRepo->with(['subfleets'])->find($flight_id);
$flight = $this->fareSvc->getReconciledFaresForFlight($flight);
if (!$flight) { if (!$flight) {
flash()->error('Unknown flight'); flash()->error('Unknown flight');
return redirect(route('frontend.flights.index')); return redirect(route('frontend.flights.index'));
@@ -45,7 +63,7 @@ class SimBriefController
return redirect(route('frontend.flights.index')); return redirect(route('frontend.flights.index'));
} }
$user = Auth::user(); // Check if a Simbrief profile already exists
$simbrief = SimBrief::select('id')->where([ $simbrief = SimBrief::select('id')->where([
'flight_id' => $flight_id, 'flight_id' => $flight_id,
'user_id' => $user->id, 'user_id' => $user->id,
@@ -55,8 +73,51 @@ class SimBriefController
return redirect(route('frontend.simbrief.briefing', [$simbrief->id])); return redirect(route('frontend.simbrief.briefing', [$simbrief->id]));
} }
// Simbrief Profile doesn't exist; prompt the user to create a new one
$aircraft = Aircraft::select('registration', 'name', 'icao', 'iata', 'subfleet_id')
->where('id', $aircraft_id)
->get();
if ($flight->subfleets->count() > 0) {
$subfleets = $flight->subfleets;
} else {
$subfleets = $this->userSvc->getAllowableSubfleets($user);
}
if ($flight->flight_type === FlightType::CHARTER_PAX_ONLY) {
$pax_weight = 197;
} else {
$pax_weight = 208;
}
// No aircraft selected, show that form
if (!$aircraft_id) {
return view('flights.simbrief_aircraft', [
'flight' => $flight,
'aircraft' => $aircraft,
'subfleets' => $subfleets,
'pax_weight' => $pax_weight,
]);
}
// Get the correct load factors
$lfactor = $flight->load_factor ?? setting('flights.default_load_factor');
$lfactorv = $flight->load_factor_variance ?? setting('flights.load_factor_variance');
$loadmin = $lfactor - $lfactorv;
$loadmin = $loadmin < 0 ? 0 : $loadmin;
$loadmax = $lfactor + $lfactorv;
$loadmax = $loadmax > 100 ? 100 : $loadmax;
// Show the main simbrief form
return view('flights.simbrief_form', [ return view('flights.simbrief_form', [
'flight' => $flight, 'flight' => $flight,
'aircraft' => $aircraft,
'subfleets' => $subfleets,
'pax_weight' => $pax_weight,
'loadmin' => $loadmin,
'loadmax' => $loadmax,
]); ]);
} }
@@ -75,11 +136,53 @@ class SimBriefController
return redirect(route('frontend.flights.index')); return redirect(route('frontend.flights.index'));
} }
$str = $simbrief->xml->aircraft->equip;
$wc = stripos($str, '-');
$tr = stripos($str, '/');
$wakecat = substr($str, 0, $wc);
$equipment = substr($str, $wc + 1, $tr - 2);
$transponder = substr($str, $tr + 1);
return view('flights.simbrief_briefing', [ return view('flights.simbrief_briefing', [
'simbrief' => $simbrief, 'simbrief' => $simbrief,
'wakecat' => $wakecat,
'equipment' => $equipment,
'transponder' => $transponder,
]); ]);
} }
/**
* Remove the flight_id from the SimBrief Briefing (to a create a new one)
* or if no pirep_id is attached to the briefing delete it completely
*
* @param \Illuminate\Http\Request $request
*
* @throws \Exception
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function generate_new(Request $request)
{
$simbrief = SimBrief::find($request->id);
// Invalid Simbrief ID/profile, go back to the main flight index
if (!$simbrief) {
return redirect(route('frontend.flights.index'));
}
// Cleanup the current Simbrief entry and redirect to the new generation form
// If there isn't a PIREP ID, then delete the entry, otherwise, remove the flight
$flight_id = $simbrief->flight_id;
if (!$simbrief->pirep_id) {
$simbrief->delete();
} else {
$simbrief->flight_id = null;
$simbrief->save();
}
return redirect(route('frontend.simbrief.generate').'?flight_id='.$flight_id);
}
/** /**
* Create a prefile of this PIREP with a given OFP. Then redirect the * Create a prefile of this PIREP with a given OFP. Then redirect the
* user to the newly prefiled PIREP * user to the newly prefiled PIREP
@@ -129,7 +232,7 @@ class SimBriefController
$ofp_id = $request->input('ofp_id'); $ofp_id = $request->input('ofp_id');
$flight_id = $request->input('flight_id'); $flight_id = $request->input('flight_id');
$simbrief = $this->simBriefSvc->checkForOfp(Auth::user()->id, $ofp_id, $flight_id); $simbrief = $this->simBriefSvc->downloadOfp(Auth::user()->id, $ofp_id, $flight_id);
if ($simbrief === null) { if ($simbrief === null) {
$error = new AssetNotFound(new Exception('Simbrief OFP not found')); $error = new AssetNotFound(new Exception('Simbrief OFP not found'));
return $error->getResponse(); return $error->getResponse();
+1 -1
View File
@@ -13,7 +13,7 @@ class SimBrief extends Resource
{ {
return [ return [
'id' => $this->id, 'id' => $this->id,
'url' => url(route('api.flights.briefing', ['id' => $this->flight_id])), 'url' => url(route('api.flights.briefing', ['id' => $this->id])),
]; ];
} }
} }
+1
View File
@@ -25,6 +25,7 @@ class User extends Resource
'last_pirep_id' => $this->last_pirep_id, 'last_pirep_id' => $this->last_pirep_id,
'flights' => $this->flights, 'flights' => $this->flights,
'flight_time' => $this->flight_time, 'flight_time' => $this->flight_time,
'transfer_time' => $this->transfer_time,
'timezone' => $this->timezone, 'timezone' => $this->timezone,
'state' => $this->state, 'state' => $this->state,
]; ];
+5
View File
@@ -97,6 +97,11 @@ class Airline extends Model
$this->attributes['icao'] = strtoupper($icao); $this->attributes['icao'] = strtoupper($icao);
} }
public function subfleets()
{
return $this->hasMany(Subfleet::class, 'airline_id');
}
public function flights() public function flights()
{ {
return $this->belongsTo(Flight::class, 'airline_id'); return $this->belongsTo(Flight::class, 'airline_id');
+12 -5
View File
@@ -8,27 +8,26 @@ use App\Models\Traits\ExpensableTrait;
use App\Models\Traits\FilesTrait; use App\Models\Traits\FilesTrait;
/** /**
* Class Subfleet
*
* @property int id * @property int id
* @property string type * @property string type
* @property string name * @property string name
* @property int airline_id
* @property int hub_id
* @property string ground_handling_multiplier * @property string ground_handling_multiplier
* @property Fare[] fares * @property Fare[] fares
* @property float cost_block_hour * @property float cost_block_hour
* @property float cost_delay_minute * @property float cost_delay_minute
* @property Airline airline * @property Airline airline
* @property int airline_id * @property Airport hub
*/ */
class Subfleet extends Model class Subfleet extends Model
{ {
use ExpensableTrait; use ExpensableTrait;
use FilesTrait; use FilesTrait;
public $table = 'subfleets';
public $fillable = [ public $fillable = [
'airline_id', 'airline_id',
'hub_id',
'type', 'type',
'name', 'name',
'fuel_type', 'fuel_type',
@@ -40,6 +39,8 @@ class Subfleet extends Model
'gross_weight', 'gross_weight',
]; ];
public $table = 'subfleets';
public $casts = [ public $casts = [
'airline_id' => 'integer', 'airline_id' => 'integer',
'turn_time' => 'integer', 'turn_time' => 'integer',
@@ -55,6 +56,7 @@ class Subfleet extends Model
public static $rules = [ public static $rules = [
'type' => 'required', 'type' => 'required',
'name' => 'required', 'name' => 'required',
'hub_id' => 'nullable',
'ground_handling_multiplier' => 'nullable|numeric', 'ground_handling_multiplier' => 'nullable|numeric',
]; ];
@@ -81,6 +83,11 @@ class Subfleet extends Model
return $this->belongsTo(Airline::class, 'airline_id'); return $this->belongsTo(Airline::class, 'airline_id');
} }
public function hub()
{
return $this->hasOne(Airport::class, 'id', 'hub_id');
}
public function fares() public function fares()
{ {
return $this->belongsToMany(Fare::class, 'subfleet_fare') return $this->belongsToMany(Fare::class, 'subfleet_fare')
@@ -19,5 +19,9 @@ class DirectiveServiceProvider extends ServiceProvider
Blade::directive('minutestohours', function ($expr) { Blade::directive('minutestohours', function ($expr) {
return "<?php echo \App\Support\Units\Time::minutesToHours($expr); ?>"; return "<?php echo \App\Support\Units\Time::minutesToHours($expr); ?>";
}); });
Blade::directive('secstohhmm', function ($expr) {
return "<?php echo secstohhmm($expr); ?>";
});
} }
} }
+1
View File
@@ -147,6 +147,7 @@ class RouteServiceProvider extends ServiceProvider
Route::get('simbrief/{id}', 'SimBriefController@briefing')->name('simbrief.briefing'); Route::get('simbrief/{id}', 'SimBriefController@briefing')->name('simbrief.briefing');
Route::get('simbrief/{id}/prefile', 'SimBriefController@prefile')->name('simbrief.prefile'); Route::get('simbrief/{id}/prefile', 'SimBriefController@prefile')->name('simbrief.prefile');
Route::get('simbrief/{id}/cancel', 'SimBriefController@cancel')->name('simbrief.cancel'); Route::get('simbrief/{id}/cancel', 'SimBriefController@cancel')->name('simbrief.cancel');
Route::get('simbrief/{id}/generate_new', 'SimBriefController@generate_new')->name('simbrief.generate_new');
}); });
Route::group([ Route::group([
+5
View File
@@ -20,6 +20,7 @@ class FlightRepository extends Repository implements CacheableInterface
'arr_airport_id', 'arr_airport_id',
'distance', 'distance',
'dpt_airport_id', 'dpt_airport_id',
'flight_type',
'flight_number' => 'like', 'flight_number' => 'like',
'route_code' => 'like', 'route_code' => 'like',
'route_leg' => 'like', 'route_leg' => 'like',
@@ -93,6 +94,10 @@ class FlightRepository extends Repository implements CacheableInterface
$where['flight_number'] = $request->input('flight_number'); $where['flight_number'] = $request->input('flight_number');
} }
if ($request->filled('flight_type') && $request->input('flight_type') !== '0') {
$where['flight_type'] = $request->input('flight_type');
}
if ($request->filled('route_code')) { if ($request->filled('route_code')) {
$where['route_code'] = $request->input('route_code'); $where['route_code'] = $request->input('route_code');
} }
+1 -1
View File
@@ -101,7 +101,7 @@ class AirportService extends Service
} }
// Don't lookup the airport, so just add in something generic // Don't lookup the airport, so just add in something generic
if (!setting('general.auto_airport_lookup')) { if (!setting('general.auto_airport_lookup', false)) {
$airport = new Airport([ $airport = new Airport([
'id' => $icao, 'id' => $icao,
'icao' => $icao, 'icao' => $icao,
@@ -51,8 +51,13 @@ class FlightImporter extends ImportExport
'fields' => 'nullable', 'fields' => 'nullable',
]; ];
/** @var AirportService */
private $airportSvc; private $airportSvc;
/** @var FareService */
private $fareSvc; private $fareSvc;
/** @var FlightService */
private $flightSvc; private $flightSvc;
/** /**
+7 -7
View File
@@ -6,6 +6,9 @@ use App\Contracts\ImportExport;
use App\Contracts\Service; use App\Contracts\Service;
use App\Models\Airport; use App\Models\Airport;
use App\Models\Expense; use App\Models\Expense;
use App\Models\Fare;
use App\Models\Flight;
use App\Models\FlightFieldValue;
use App\Repositories\FlightRepository; use App\Repositories\FlightRepository;
use App\Services\ImportExport\AircraftImporter; use App\Services\ImportExport\AircraftImporter;
use App\Services\ImportExport\AirportImporter; use App\Services\ImportExport\AirportImporter;
@@ -115,11 +118,7 @@ class ImportService extends Service
// turn it into a collection and run some filtering // turn it into a collection and run some filtering
$row = collect($row)->map(function ($val, $index) { $row = collect($row)->map(function ($val, $index) {
$val = trim($val); $val = trim($val);
if ($val === '') { return empty($val) ? null : $val;
return;
}
return $val;
})->toArray(); })->toArray();
// Try to validate // Try to validate
@@ -209,7 +208,7 @@ class ImportService extends Service
public function importFares($csv_file, bool $delete_previous = true) public function importFares($csv_file, bool $delete_previous = true)
{ {
if ($delete_previous) { if ($delete_previous) {
// TODO: Delete all from: fares Fare::truncate();
} }
$importer = new FareImporter(); $importer = new FareImporter();
@@ -229,7 +228,8 @@ class ImportService extends Service
public function importFlights($csv_file, bool $delete_previous = true) public function importFlights($csv_file, bool $delete_previous = true)
{ {
if ($delete_previous) { if ($delete_previous) {
// TODO: Delete all from: flights, flight_field_values Flight::truncate();
FlightFieldValue::truncate();
} }
$importer = new FlightImporter(); $importer = new FlightImporter();
+73 -17
View File
@@ -24,6 +24,7 @@ use App\Models\Enums\PirepStatus;
use App\Models\Navdata; use App\Models\Navdata;
use App\Models\Pirep; use App\Models\Pirep;
use App\Models\PirepFieldValue; use App\Models\PirepFieldValue;
use App\Models\SimBrief;
use App\Models\User; use App\Models\User;
use App\Repositories\AircraftRepository; use App\Repositories\AircraftRepository;
use App\Repositories\AirportRepository; use App\Repositories\AirportRepository;
@@ -40,17 +41,16 @@ class PirepService extends Service
private $airportSvc; private $airportSvc;
private $geoSvc; private $geoSvc;
private $pirepRepo; private $pirepRepo;
private $simBriefSvc;
private $userSvc; private $userSvc;
/** /**
* @param AircraftRepository $aircraftRepo * @param AircraftRepository $aircraftRepo
* @param GeoService $geoSvc * @param GeoService $geoSvc
* @param PirepRepository $pirepRepo
* @param UserService $userSvc
* @param AirportRepository $airportRepo * @param AirportRepository $airportRepo
* @param AirportService $airportSvc * @param AirportService $airportSvc
* @param GeoService $geoSvc
* @param PirepRepository $pirepRepo * @param PirepRepository $pirepRepo
* @param SimBriefService $simBriefSvc
* @param UserService $userSvc * @param UserService $userSvc
*/ */
public function __construct( public function __construct(
@@ -59,14 +59,16 @@ class PirepService extends Service
AircraftRepository $aircraftRepo, AircraftRepository $aircraftRepo,
GeoService $geoSvc, GeoService $geoSvc,
PirepRepository $pirepRepo, PirepRepository $pirepRepo,
SimBriefService $simBriefSvc,
UserService $userSvc UserService $userSvc
) { ) {
$this->airportRepo = $airportRepo; $this->airportRepo = $airportRepo;
$this->airportSvc = $airportSvc; $this->airportSvc = $airportSvc;
$this->aircraftRepo = $aircraftRepo; $this->aircraftRepo = $aircraftRepo;
$this->geoSvc = $geoSvc; $this->geoSvc = $geoSvc;
$this->userSvc = $userSvc;
$this->pirepRepo = $pirepRepo; $this->pirepRepo = $pirepRepo;
$this->simBriefSvc = $simBriefSvc;
$this->userSvc = $userSvc;
} }
/** /**
@@ -115,7 +117,7 @@ class PirepService extends Service
// See if this user is at the current airport // See if this user is at the current airport
/* @noinspection NotOptimalIfConditionsInspection */ /* @noinspection NotOptimalIfConditionsInspection */
if (setting('pilots.only_flights_from_current') if (setting('pilots.only_flights_from_current', false)
&& $user->curr_airport_id !== $pirep->dpt_airport_id) { && $user->curr_airport_id !== $pirep->dpt_airport_id) {
throw new UserNotAtAirport($user, $pirep->dpt_airport); throw new UserNotAtAirport($user, $pirep->dpt_airport);
} }
@@ -206,6 +208,72 @@ class PirepService extends Service
return $pirep; return $pirep;
} }
/**
* Finalize a PIREP (meaning it's been filed)
*
* @param Pirep $pirep
* @param array $attrs
* @param array PirepFieldValue[] $field_values
*
* @throws \Exception
*
* @return Pirep
*/
public function file(Pirep $pirep, array $attrs = [], array $field_values = []): Pirep
{
if (empty($field_values)) {
$field_values = [];
}
$attrs['state'] = PirepState::PENDING;
$attrs['status'] = PirepStatus::ARRIVED;
$attrs['submitted_at'] = Carbon::now('UTC');
$this->pirepRepo->update($attrs, $pirep->id);
$pirep->refresh();
// Check if there is a simbrief_id, change it to be set to the PIREP
// at the end of the flight when it's been filed
if (array_key_exists('simbrief_id', $attrs)) {
/** @var SimBrief $simbrief */
$simbrief = SimBrief::find($attrs['simbrief_id']);
if ($simbrief) {
$this->simBriefSvc->attachSimbriefToPirep($pirep, $simbrief);
}
}
// Check the block times. If a block on (arrival) time isn't
// specified, then use the time that it was submitted. It won't
// be the most accurate, but that might be OK
if (!$pirep->block_on_time) {
if ($pirep->submitted_at) {
$pirep->block_on_time = $pirep->submitted_at;
} else {
$pirep->block_on_time = Carbon::now('UTC');
}
}
// Check that there's a submit time
if (!$pirep->submitted_at) {
$pirep->submitted_at = Carbon::now('UTC');
}
// Copy some fields over from Flight if we have it
if ($pirep->flight) {
$pirep->planned_distance = $pirep->flight->distance;
$pirep->planned_flight_time = $pirep->flight->flight_time;
}
$pirep->save();
$pirep->refresh();
if (count($field_values) > 0) {
$this->updateCustomFields($pirep->id, $field_values);
}
return $pirep;
}
/** /**
* Find if there are duplicates to a given PIREP. Ideally, the passed * Find if there are duplicates to a given PIREP. Ideally, the passed
* in PIREP hasn't been saved or gone through the create() method * in PIREP hasn't been saved or gone through the create() method
@@ -306,18 +374,6 @@ class PirepService extends Service
return $pirep; return $pirep;
} }
/**
* Alias to submit()
*
* @param \App\Models\Pirep $pirep
*
* @throws \Exception
*/
public function file(Pirep $pirep)
{
return $this->submit($pirep);
}
/** /**
* Submit the PIREP. Figure out its default state * Submit the PIREP. Figure out its default state
* *
+1 -1
View File
@@ -32,7 +32,7 @@ class SimBriefService extends Service
* *
* @return SimBrief|null * @return SimBrief|null
*/ */
public function checkForOfp(string $user_id, string $ofp_id, string $flight_id) public function downloadOfp(string $user_id, string $ofp_id, string $flight_id)
{ {
$uri = str_replace('{id}', $ofp_id, config('phpvms.simbrief_url')); $uri = str_replace('{id}', $ofp_id, config('phpvms.simbrief_url'));
+1
View File
@@ -14,6 +14,7 @@ class LiveMap extends Widget
protected $config = [ protected $config = [
'height' => '800px', 'height' => '800px',
'width' => '100%', 'width' => '100%',
'table' => true,
]; ];
/** /**
+16
View File
@@ -161,6 +161,7 @@ if (!function_exists('setting')) {
*/ */
function setting($key, $default = null) function setting($key, $default = null)
{ {
/** @var \App\Repositories\SettingRepository $settingRepo */
$settingRepo = app(SettingRepository::class); $settingRepo = app(SettingRepository::class);
try { try {
@@ -181,6 +182,7 @@ if (!function_exists('setting')) {
if (!function_exists('setting_save')) { if (!function_exists('setting_save')) {
function setting_save($key, $value) function setting_save($key, $value)
{ {
/** @var \App\Repositories\SettingRepository $settingRepo */
$settingRepo = app(SettingRepository::class); $settingRepo = app(SettingRepository::class);
$settingRepo->save($key, $value); $settingRepo->save($key, $value);
return $value; return $value;
@@ -355,6 +357,20 @@ if (!function_exists('show_datetime_format')) {
} }
} }
if (!function_exists('secstohhmm')) {
/**
* Convert seconds to hhmm format
*
* @param $seconds
*/
function secstohhmm($seconds)
{
$seconds = round($seconds);
$hhmm = sprintf('%02d%02d', ($seconds / 3600), ($seconds / 60 % 60));
echo $hhmm;
}
}
if (!function_exists('_fmt')) { if (!function_exists('_fmt')) {
/** /**
* Replace strings * Replace strings
+17 -5
View File
@@ -131,10 +131,22 @@ return [
'Yaml' => Symfony\Component\Yaml\Yaml::class, 'Yaml' => Symfony\Component\Yaml\Yaml::class,
// ENUMS // ENUMS
'ActiveState' => App\Models\Enums\ActiveState::class, 'AcarsType' => App\Models\Enums\AcarsType::class,
'UserState' => App\Models\Enums\UserState::class, 'ActiveState' => App\Models\Enums\ActiveState::class,
'PirepSource' => App\Models\Enums\PirepSource::class, 'AircraftState' => App\Models\Enums\AircraftState::class,
'PirepState' => App\Models\Enums\PirepState::class, 'AircraftStatus' => App\Models\Enums\AircraftStatus::class,
'PirepStatus' => App\Models\Enums\PirepStatus::class, 'Days' => App\Models\Enums\Days::class,
'ExpenseType' => App\Models\Enums\ExpenseType::class,
'FareType' => App\Models\Enums\FareType::class,
'FlightType' => App\Models\Enums\FlightType::class,
'FuelType' => App\Models\Enums\FuelType::class,
'JournalType' => App\Models\Enums\JournalType::class,
'NavaidType' => App\Models\Enums\NavaidType::class,
'PageType' => App\Models\Enums\PageType::class,
'PirepFieldSource' => App\Models\Enums\PirepFieldSource::class,
'PirepSource' => App\Models\Enums\PirepSource::class,
'PirepState' => App\Models\Enums\PirepState::class,
'PirepStatus' => App\Models\Enums\PirepStatus::class,
'UserState' => App\Models\Enums\UserState::class,
], ],
]; ];
+14 -13
View File
@@ -1651,12 +1651,18 @@
"dev": true "dev": true
}, },
"axios": { "axios": {
"version": "0.18.1", "version": "0.21.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
"integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
"requires": { "requires": {
"follow-redirects": "1.5.10", "follow-redirects": "^1.10.0"
"is-buffer": "^2.0.2" },
"dependencies": {
"follow-redirects": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz",
"integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg=="
}
} }
}, },
"axobject-query": { "axobject-query": {
@@ -5124,9 +5130,9 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
}, },
"inquirer": { "inquirer": {
"version": "7.3.3", "version": "7.3.3",
@@ -5316,11 +5322,6 @@
"binary-extensions": "^1.0.0" "binary-extensions": "^1.0.0"
} }
}, },
"is-buffer": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
"integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
},
"is-callable": { "is-callable": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+1 -1
View File
@@ -13,7 +13,7 @@
"@turf/center": "^6.0.1", "@turf/center": "^6.0.1",
"acorn": "^7.4.1", "acorn": "^7.4.1",
"animate.css": "~3.6", "animate.css": "~3.6",
"axios": "^0.18.1", "axios": "^0.21.1",
"bootstrap": "~4.3", "bootstrap": "~4.3",
"bootstrap-sass": "^3.4.1", "bootstrap-sass": "^3.4.1",
"bootstrap3": "npm:bootstrap@~3.4", "bootstrap3": "npm:bootstrap@~3.4",
@@ -3,7 +3,9 @@
<div class="col-sm-12"> <div class="col-sm-12">
<div class="form-group"> <div class="form-group">
{{ Form::open(['route' => 'admin.flights.index', 'method' => 'GET', 'class'=>'form-inline pull-right']) }} {{ Form::open(['route' => 'admin.flights.index', 'method' => 'GET', 'class'=>'form-inline pull-right']) }}
&nbsp;&nbsp;
{{ Form::label('airlines', 'Airline:') }}
{{ Form::select('airline_id', $airlines, null , ['class' => 'form-control select2']) }}
{{ Form::label('flight_number', 'Flight Number:') }} {{ Form::label('flight_number', 'Flight Number:') }}
{{ Form::text('flight_number', null, ['class' => 'form-control']) }} {{ Form::text('flight_number', null, ['class' => 'form-control']) }}
&nbsp; &nbsp;
@@ -12,19 +12,25 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="form-group col-sm-4"> <div class="form-group col-sm-3">
{{ Form::label('airline_id', 'Airline:') }} {{ Form::label('airline_id', 'Airline:') }}
{{ Form::select('airline_id', $airlines, null , ['class' => 'form-control select2']) }} {{ Form::select('airline_id', $airlines, null , ['class' => 'form-control select2']) }}
<p class="text-danger">{{ $errors->first('airline_id') }}</p> <p class="text-danger">{{ $errors->first('airline_id') }}</p>
</div> </div>
<div class="form-group col-sm-4"> <div class="form-group col-sm-3">
{{ Form::label('hub_id', 'Main Hub:') }}
{{ Form::select('hub_id', $hubs, null , ['class' => 'form-control select2']) }}
<p class="text-danger">{{ $errors->first('hub_id') }}</p>
</div>
<div class="form-group col-sm-3">
{{ Form::label('type', 'Type:') }} {{ Form::label('type', 'Type:') }}
{{ Form::text('type', null, ['class' => 'form-control']) }} {{ Form::text('type', null, ['class' => 'form-control']) }}
<p class="text-danger">{{ $errors->first('type') }}</p> <p class="text-danger">{{ $errors->first('type') }}</p>
</div> </div>
<div class="form-group col-sm-4"> <div class="form-group col-sm-3">
{{ Form::label('name', 'Name:') }} {{ Form::label('name', 'Name:') }}
{{ Form::text('name', null, ['class' => 'form-control']) }} {{ Form::text('name', null, ['class' => 'form-control']) }}
<p class="text-danger">{{ $errors->first('name') }}</p> <p class="text-danger">{{ $errors->first('name') }}</p>
@@ -1,7 +1,6 @@
<div class="card"> <div class="text-right">
<div class="card-block" style="min-height: 0px; display: flex; justify-content: center; align-items: center;"> <div class="form-group text-right">
<div class="form-group text-right"> <a href="{{ route('frontend.flights.bids') }}"
<a href="{{ route('frontend.flights.bids') }}" class="btn btn-outline-primary">{{ trans_choice('flights.mybid', 2) }}</a> class="btn btn-outline-primary">{{ trans_choice('flights.mybid', 2) }}</a>
</div>
</div> </div>
</div> </div>
@@ -1,18 +1,25 @@
<h3 class="description">@lang('flights.search')</h3> <h4 class="description">@lang('flights.search')</h4>
<div class="card border-blue-bottom"> <div class="row">
<div class="card-body ml-1 mr-1" style="min-height: 0px; display: flex; justify-content: center; align-items: center;"> <div class="col-12">
<div class="form-group search-form"> <div class="form-group search-form">
{{ Form::open([ {{ Form::open([
'route' => 'frontend.flights.search', 'route' => 'frontend.flights.search',
'method' => 'GET', 'method' => 'GET',
'class'=>'form-inline'
]) }} ]) }}
<div class="mt-1"> <div class="mt-1">
<p>@lang('common.airline')</p> <div class="form-group">
{{ Form::select('airline_id', $airlines, null , ['class' => 'form-control select2']) }} <p>@lang('common.airline')</p>
{{ Form::select('airline_id', $airlines, null , ['class' => 'form-control select2']) }}
</div>
</div> </div>
<div> <div class="mt-1">
<p>@lang('flights.flighttype')</p>
{{ Form::select('flight_type', $flight_types, null , ['class' => 'form-control select2']) }}
</div>
<div class="mt-1">
<p>@lang('flights.flightnumber')</p> <p>@lang('flights.flightnumber')</p>
{{ Form::text('flight_number', null, ['class' => 'form-control']) }} {{ Form::text('flight_number', null, ['class' => 'form-control']) }}
</div> </div>
@@ -0,0 +1,47 @@
@extends('app')
@section('title', 'SimBrief Flight Planning')
@section('content')
<div class="row">
<div class="col-md-12">
<h2>Select Aircraft for Flight</h2>
</div>
</div>
<div class="row">
<div class="col-md-12">
<select id="aircraftselection" class="form-control select2" onchange="checkacselection()">
<option value="ZZZZZ">Please Select An Aircraft</option>
@foreach($subfleets as $subfleet)
@foreach($subfleet->aircraft as $ac)
<option value="{{ $ac->id }}">[ {{ $ac->icao }} ] {{ $ac->registration }}</option>
@endforeach
@endforeach
</select>
</div>
<div class="col-md-12 text-right">
<a id="generate_link" style="visibility: hidden"
href="{{ route('frontend.simbrief.generate') }}?flight_id={{ $flight->id }}"
class="btn btn-primary">Proceed To Flight Planning</a>
</div>
</div>
@endsection
@section('scripts')
<script type="text/javascript">
// Simple Aircraft Selection With Dropdown Change
// Also keep Generate button hidden until a valid AC selection
const $oldlink = document.getElementById("generate_link").href;
function checkacselection() {
if (document.getElementById("aircraftselection").value === "ZZZZZ") {
document.getElementById('generate_link').style.visibility = 'hidden';
} else {
document.getElementById('generate_link').style.visibility = 'visible';
}
const selectedac = document.getElementById("aircraftselection").value;
const newlink = "&aircraft_id=".concat(selectedac);
document.getElementById("generate_link").href = $oldlink.concat(newlink);
}
</script>
@endsection
@@ -3,17 +3,22 @@
@section('content') @section('content')
<div class="row"> <div class="row">
<div class="col-sm-9"> <div class="col-sm-6">
<h2>{{ $simbrief->xml->general->icao_airline }}{{ $simbrief->xml->general->flight_number }} <h2>{{ $simbrief->xml->general->icao_airline }}{{ $simbrief->xml->general->flight_number }}
: {{ $simbrief->xml->origin->icao_code }} to {{ $simbrief->xml->destination->icao_code }}</h2> : {{ $simbrief->xml->origin->icao_code }} to {{ $simbrief->xml->destination->icao_code }}</h2>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
@if (empty($simbrief->pirep_id)) @if (empty($simbrief->pirep_id))
<a class="btn btn-outline-info pull-right btn-lg" <a class="btn btn-outline-info pull-right btn-lg"
style="margin-top: -10px;margin-bottom: 5px" style="margin-top: -10px; margin-bottom: 5px"
href="{{ url(route('frontend.simbrief.prefile', [$simbrief->id])) }}">Prefile PIREP</a> href="{{ url(route('frontend.simbrief.prefile', [$simbrief->id])) }}">Prefile PIREP</a>
@endif @endif
</div> </div>
<div class="col-sm-3">
<a class="btn btn-primary pull-right btn-lg"
style="margin-top: -10px; margin-bottom: 5px"
href="{{ url(route('frontend.simbrief.generate_new', [$simbrief->id])) }}">Generate New OFP</a>
</div>
</div> </div>
<div class="row"> <div class="row">
@@ -67,9 +72,9 @@
</div> </div>
<div class="col-4 text-center"> <div class="col-4 text-center">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Enroute Time</p> <div><p class="small text-uppercase pb-sm-0 mb-sm-1">Est. Enroute Time</p>
<p class="border border-dark rounded p-1 small text-monospace"> <p class="border border-dark rounded p-1 small text-monospace">
@minutestotime($simbrief->xml->times->sched_time_enroute / 60)</p> @minutestotime($simbrief->xml->times->est_time_enroute / 60)</p>
</div> </div>
</div> </div>
@@ -129,24 +134,30 @@
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Departure METAR</p> <div><p class="small text-uppercase pb-sm-0 mb-sm-1">Departure METAR</p>
<p class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->orig_metar }}</p> <p
class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->orig_metar }}</p>
</div> </div>
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Departure TAF</p> <div><p class="small text-uppercase pb-sm-0 mb-sm-1">Departure TAF</p>
<p class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->orig_taf }}</p> <p
class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->orig_taf }}</p>
</div> </div>
<hr/> <hr/>
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Destination METAR</p> <div><p class="small text-uppercase pb-sm-0 mb-sm-1">Destination METAR</p>
<p class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->dest_metar }}</p> <p
class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->dest_metar }}</p>
</div> </div>
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Destination TAF</p> <div><p class="small text-uppercase pb-sm-0 mb-sm-1">Destination TAF</p>
<p class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->dest_taf }}</p> <p
class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->dest_taf }}</p>
</div> </div>
<hr/> <hr/>
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Alternate METAR</p> <div><p class="small text-uppercase pb-sm-0 mb-sm-1">Alternate METAR</p>
<p class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->altn_metar }}</p> <p
class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->altn_metar }}</p>
</div> </div>
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Alternate TAF</p> <div><p class="small text-uppercase pb-sm-0 mb-sm-1">Alternate TAF</p>
<p class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->altn_taf }}</p> <p
class="border border-dark rounded p-1 small text-monospace">{{ $simbrief->xml->weather->altn_taf }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -176,66 +187,55 @@
</div> </div>
</div> </div>
</div> </div>
<div class="form-container"> <div class="form-container">
<h6><i class="fas fa-info-circle"></i>&nbsp;Prefile ATC Flight Plan</h6> <h6><i class="fas fa-info-circle"></i>&nbsp;Prefile ATC Flight Plan</h6>
<div class="form-container-body"> <div class="form-container-body">
<div class="row"> <div class="row">
<div class="col-4" align="center"> <div class="col-4" align="center">
@php <form action="https://fpl.ivao.aero/api/fp/load" method="POST" target="_blank">
$str = $simbrief->xml->aircraft->equip ; <input type="hidden" name="CALLSIGN" value="{{ $simbrief->xml->atc->callsign }}"/>
$wc = stripos($str,"-"); <input type="hidden" name="RULES" value="I"/>
$tr = stripos($str,"/"); <input type="hidden" name="FLIGHTTYPE" value="N"/>
$wakecat = substr($str,0,$wc); <input type="hidden" name="NUMBER" value="1"/>
$equipment = substr($str,$wc+1,$tr-2); <input type="hidden" name="ACTYPE" value="{{ $simbrief->xml->aircraft->icaocode }}"/>
$transponder = substr($str,$tr+1); <input type="hidden" name="WAKECAT" value="{{ $wakecat }}"/>
function secstohhmm($seconds) { <input type="hidden" name="EQUIPMENT" value="{{ $equipment }}"/>
$seconds = round($seconds); <input type="hidden" name="TRANSPONDER" value="{{ $transponder }}"/>
$hhmm = sprintf('%02d%02d', ($seconds/ 3600),($seconds/ 60 % 60)); <input type="hidden" name="DEPICAO" value="{{ $simbrief->xml->origin->icao_code}}"/>
echo $hhmm ; <input type="hidden" name="DEPTIME" value="{{ date('Hi', $simbrief->xml->times->est_out->__toString()) }}"/>
} <input type="hidden" name="SPEEDTYPE" value="{{ $simbrief->xml->atc->initial_spd_unit }}"/>
@endphp <input type="hidden" name="SPEED" value="{{ $simbrief->xml->atc->initial_spd }}"/>
<form action="https://fpl.ivao.aero/api/fp/load" method="POST" target="_blank"> <input type="hidden" name="LEVELTYPE" value="{{ $simbrief->xml->atc->initial_alt_unit }}"/>
<input type="hidden" name="CALLSIGN" value="{{ $simbrief->xml->atc->callsign }}" /> <input type="hidden" name="LEVEL" value="{{ $simbrief->xml->atc->initial_alt }}"/>
<input type="hidden" name="RULES" value="I" /> <input type="hidden" name="ROUTE" value="{{ $simbrief->xml->general->route_ifps }}"/>
<input type="hidden" name="FLIGHTTYPE" value="N" /> <input type="hidden" name="DESTICAO" value="{{ $simbrief->xml->destination->icao_code }}"/>
<input type="hidden" name="NUMBER" value="1" /> <input type="hidden" name="EET" value="@secstohhmm($simbrief->xml->times->est_time_enroute)"/>
<input type="hidden" name="ACTYPE" value="{{ $simbrief->xml->aircraft->icaocode }}" /> <input type="hidden" name="ALTICAO" value="{{ $simbrief->xml->alternate->icao_code}}"/>
<input type="hidden" name="WAKECAT" value="{{ $wakecat }}" /> <input type="hidden" name="ALTICAO2" value="{{ $simbrief->xml->alternate2->icao_code}}"/>
<input type="hidden" name="EQUIPMENT" value="{{ $equipment }}" /> <input type="hidden" name="OTHER" value="{{ $simbrief->xml->atc->section18 }}"/>
<input type="hidden" name="TRANSPONDER" value="{{ $transponder }}" /> <input type="hidden" name="ENDURANCE" value="@secstohhmm($simbrief->xml->times->endurance)"/>
<input type="hidden" name="DEPICAO" value="{{ $simbrief->xml->origin->icao_code}}" /> <input type="hidden" name="POB" value="{{ $simbrief->xml->weights->pax_count }}"/>
<input type="hidden" name="DEPTIME" value="{{ date('Hi', $simbrief->xml->times->est_out->__toString())."" }}" /> <input id="ivao_prefile" type="submit" class="btn btn-primary" value="File ATC on IVAO"/>
<input type="hidden" name="SPEEDTYPE" value="{{ $simbrief->xml->atc->initial_spd_unit }}" /> </form>
<input type="hidden" name="SPEED" value="{{ $simbrief->xml->atc->initial_spd }}" /> </div>
<input type="hidden" name="LEVELTYPE" value="{{ $simbrief->xml->atc->initial_alt_unit }}" /> <div class="col-4" align="center">
<input type="hidden" name="LEVEL" value="{{ $simbrief->xml->atc->initial_alt }}" /> <form action="https://my.vatsim.net/pilots/flightplan" method="GET" target="_blank">
<input type="hidden" name="ROUTE" value="{{ $simbrief->xml->general->route_ifps }}" /> <input type="hidden" name="raw" value="{{ $simbrief->xml->atc->flightplan_text }}">
<input type="hidden" name="DESTICAO" value="{{ $simbrief->xml->destination->icao_code }}" /> <input type="hidden" name="fuel_time" value="@secstohhmm($simbrief->xml->times->endurance)">
<input type="hidden" name="EET" value="@php secstohhmm($simbrief->xml->times->est_time_enroute) @endphp" /> <input type="hidden" name="speed" value="{{ $simbrief->xml->atc->initial_spd }}">
<input type="hidden" name="ALTICAO" value="{{ $simbrief->xml->alternate->icao_code}}" /> <input type="hidden" name="altitude" value="{{ $simbrief->xml->atc->initial_alt }}">
<input type="hidden" name="ALTICAO2" value="{{ $simbrief->xml->alternate2->icao_code}}" /> <input id="vatsim_prefile" type="submit" class="btn btn-primary" value="File ATC on VATSIM"/>
<input type="hidden" name="OTHER" value="{{ $simbrief->xml->atc->section18 }}" /> </form>
<input type="hidden" name="ENDURANCE" value="@php secstohhmm($simbrief->xml->times->endurance) @endphp" /> </div>
<input type="hidden" name="POB" value="{{ $simbrief->xml->weights->pax_count }}" /> <div class="col-4" align="center">
<input id="ivao_prefile" type="submit" class="btn btn-primary" value="File ATC on IVAO" /> <a
</form> href="http://skyvector.com/?chart=304&amp;fpl={{ $simbrief->xml->origin->icao_code}} {{ $simbrief->xml->general->route }} {{ $simbrief->xml->destination->icao_code}}"
</div> target="_blank" class="btn btn-info">View Route At SkyVector</a>
<div class="col-4" align="center"> </div>
<form action="https://my.vatsim.net/pilots/flightplan" method="GET" target="_blank"> </div>
<input type="hidden" name="raw" value="{{ $simbrief->xml->atc->flightplan_text }}">
<input type="hidden" name="fuel_time" value="@php secstohhmm($simbrief->xml->times->endurance) @endphp">
<input type="hidden" name="speed" value="{{ $simbrief->xml->atc->initial_spd }}">
<input type="hidden" name="altitude" value="{{ $simbrief->xml->atc->initial_alt }}">
<input id="vatsim_prefile" type="submit" class="btn btn-primary" value="File ATC on VATSIM"/>
</form>
</div> </div>
<div class="col-4" align="center"> </div>
<a href="http://skyvector.com/?chart=304&amp;fpl={{ $simbrief->xml->origin->icao_code}} {{ $simbrief->xml->general->route }} {{ $simbrief->xml->destination->icao_code}}" target="_blank" class="btn btn-info">View Route At SkyVector</a>
</div>
</div>
</div>
</div>
<div class="form-container"> <div class="form-container">
<h6><i class="fas fa-info-circle"></i> <h6><i class="fas fa-info-circle"></i>
&nbsp;OFP &nbsp;OFP
@@ -1,269 +1,416 @@
@extends('app') @extends('app')
@section('title', 'Generate OFP') @section('title', 'SimBrief Flight Planning')
@section('content') @section('content')
@foreach($aircraft as $acdetails)
@php
$simbrieftype = $acdetails->icao ;
$subflid = $acdetails->subfleet_id ;
if($acdetails->icao === 'A20N') { $simbrieftype = 'A320'; }
if($acdetails->icao === 'A21N') { $simbrieftype = 'A321'; }
if($acdetails->icao === 'B77L') { $simbrieftype = 'B77F'; }
if($acdetails->icao === 'B773') { $simbrieftype = 'B77W'; }
if($acdetails->icao === 'E35L') { $simbrieftype = 'E135'; }
@endphp
@endforeach
<form id="sbapiform"> <form id="sbapiform">
<div class="row"> <div class="row">
<div class="col-md-12"> <h2>Create Simbrief Briefing</h2>
<h2>Create Flight Briefing</h2> <div class="card">
<div class="row"> <div class="col-md-12">
<div class="col-8"> <div class="row">
<div class="form-container"> <div class="col-8">
<h6><i class="fas fa-info-circle"></i> <div class="form-container">
&nbsp;@lang('pireps.flightinformations') <div class="form-container-body">
</h6> <h6><i class="fas fa-info-circle"></i>&nbsp;Aircraft Details</h6>
<div class="form-container-body"> <div class="row">
<div class="row"> <div class="col-sm-4">
<div class="col-sm-4"> <label for="type">Type</label>
<label for="orig">Departure Airport</label> <input type="text" class="form-control" value="{{ $acdetails->icao }}" maxlength="4" disabled/>
<input id="orig" <input type="hidden" id="type" name="type" class="form-control" value="{{ $simbrieftype }}"
name="orig" maxlength="4"/>
type="text" </div>
class="form-control" <div class="col-sm-4">
placeholder="ZZZZ" <label for="reg">Registration</label>
maxlength="4" <input type="text" class="form-control" value="{{ $acdetails->registration }}" maxlength="6"
value="{{ $flight->dpt_airport_id }}"/> disabled/>
<input type="hidden" id="reg" name="reg" value="{{ $acdetails->registration }}"/>
</div>
</div> </div>
<br>
</div>
<div class="col-sm-4"> <div class="form-container-body">
<label for="dest">Arrival Airport</label> <h6><i class="fas fa-info-circle"></i>&nbsp;@lang('pireps.flightinformations') for
<input id="dest" <b>{{ $flight->airline->icao }} {{ $flight->flight_number }}</b></h6>
name="dest" <div class="row">
type="text" <div class="col-sm-4">
class="form-control" <label for="dorig">Departure Airport</label>
placeholder="" <input id="dorig" type="text" class="form-control" maxlength="4"
maxlength="4" value="{{ $flight->dpt_airport_id }}" disabled/>
value="{{ $flight->arr_airport_id }}"/> <input id="orig" 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 id="dest" name="dest" type="hidden" maxlength="4" value="{{ $flight->arr_airport_id }}"/>
</div>
<div class="col-sm-4">
<label for="altn">Alternate Airport</label>
<input id="altn" name="altn" type="text" class="form-control" maxlength="4"
value="{{ $flight->alt_airport_id ?? 'AUTO' }}"/>
</div>
</div> </div>
<br>
<div class="row">
<div class="col-sm-8">
<label for="route">Preferred Company Route</label>
<input id="route" name="route" type="text" class="form-control" placeholder="" maxlength="1000"
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" placeholder="" maxlength="5"
value="{{ $flight->level }}"/>
</div>
</div>
<br>
<div class="row">
<div class="col-sm-4">
<label for="std">Scheduled Departure Time (UTC)</label>
<input id="std" type="text" class="form-control" placeholder="" maxlength="4"
value="{{ $flight->dpt_time }}" disabled/>
</div>
<div class="col-sm-4">
<label for="etd">Estimated Departure Time (UTC)</label>
<input id="etd" type="text" class="form-control" placeholder="" 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" placeholder="" maxlength="4" disabled/>
</div>
</div>
<br>
</div>
<div class="col-sm-4"> <div class="form-container-body">
<label for="type">Aircraft</label> @foreach($subfleets as $subfleet)
<select id="type" name="type" class="custom-select select2"> @if($subfleet->id == $subflid)
<option value="A306" title="A306">A306 - A300F4-600</option> <h6><i class="fas fa-info-circle"></i>&nbsp;Configuration And Load Information For
<option value="A310" title="A310 / CF6-80C2A2">A310 - A310-304</option> <b>{{ $subfleet->name }} ; {{ $acdetails->registration }}</b></h6>
<option value="A318" title="A318 / CFM56-5B9/P">A318 - A318-100</option> {{-- Generate Load Figures --}}
<option value="A319" title="A319 / CFM56-5B6/2P">A319 - A319-100</option> <div class="row">
<option value="A320" title="A320 / CFM56-5B4/P">A320 - A320-200</option> {{-- Create and send some data to the $loadarray for MANUALRMK generation --}}
<option value="A321" title="A321 / CFM56-5B3/P">A321 - A321-200</option> @php $loadarray = [] ; @endphp
<option value="A332" title="A332 / CF6-80E1A4">A332 - A330-200</option> @foreach($subfleet->fares as $fare)
<option value="A333" title="A333 / RR Trent 772B">A333 - A330-300</option> @if($fare->capacity > 0)
<option value="A342" title="A342 / CFM56-5C2">A342 - A340-200</option> @php
<option value="A343" title="A343 / CFM56-5C4">A343 - A340-300</option> $randomloadperfare = ceil(($fare->capacity * (rand($loadmin, $loadmax))) /100);
<option value="A345" title="A345 / RB211 Trent 556-61">A345 - A340-500</option> $loadarray[] = ['SeatType' => $fare->code];
<option value="A346" title="A346 / RB211 Trent 556-61">A346 - A340-600</option> $loadarray[] = ['SeatLoad' => $randomloadperfare];
<option value="A359" title="A359 / TRENT XWB-84">A359 - A350-900</option> @endphp
<option value="A35K" title="A35K / TRENT XWB-97">A35K - A350-1000</option> <div class="col-sm-4">
<option value="A388" title="A388">A388 - A380-800</option> <label for="LoadFare{{ $fare->id }}">{{ $fare->name }} Load [
<option value="AT72" title="AT72">AT72 - ATR72-500</option> Max: {{ number_format($fare->capacity) }} ]</label>
<option value="B190" title="B190 / PT6A-67D">B190 - B1900D</option> <input id="LoadFare{{ $fare->id }}" type="text" class="form-control"
<option value="B350" title="B350">B350 - KINGAIR</option> value="{{ number_format($randomloadperfare) }} @if($randomloadperfare > '900') {{ setting('units.weight') }} @endif"
<option value="B463" title="B463">B463 - BAE-146</option> disabled/>
<option value="B703" title="B703">B703 - B707-320B</option> </div>
<option value="B712" title="B712 / BR715-C1-30">B712 - B717-200</option> @endif
<option value="B722" title="B722">B722 - B727-200</option> @endforeach
<option value="B732" title="B732 / JT8D-15A">B732 - B737-200</option> @php
<option value="B733" title="B733 / CFM56-3C-1">B733 - B737-300</option> $loadcollection = collect($loadarray) ;
<option value="B734" title="B734">B734 - B737-400</option> $totalgenload = $loadcollection->sum('SeatLoad') ;
<option value="B735" title="B735">B735 - B737-500</option> @endphp
<option value="B736" title="B736 / CFM56-7B22">B736 - B737-600</option> </div>
<option value="BBJ1" title="B737 / CFM56-7B27">BBJ1 - B737 BBJ</option>
<option value="B737" title="B737 / CFM56-7B24">B737 - B737-700</option> @if($totalgenload > 0 && $totalgenload < 900)
<option value="BBJ2" title="B738 / CFM56-7B27">BBJ2 - B737 BBJ2</option> <input type="hidden" name="acdata" value="{'paxwgt':{{ $pax_weight }}}">
<option value="B738" title="B738 / CFM56-7B26">B738 - B737-800</option> <br>
<option value="BBJ3" title="B739 / CFM56-7B27">BBJ3 - B737 BBJ3</option> <div class="row">
<option value="B739" title="B739 / CFM56-7B26">B739 - B737-900</option> <div class="col-sm-4">
<option value="B742" title="B742 / JT9D-7F">B742 - B747-200B</option> @if(setting('units.weight') === 'kg')
<option value="B744" title="B744 / RB211-524G/H">B744 - B747-400</option> @php $estimatedpayload = number_format(round(($pax_weight * $totalgenload) / 2.2)) ; @endphp
<option value="B74F" title="B744 / RB211-524G/H">B74F - B747-400F</option> @else
<option value="B748" title="B748 / GENX-2B67">B748 - B747-8</option> @php $estimatedpayload = number_format(round($pax_weight * $totalgenload)) ; @endphp
<option value="B48F" title="B748 / GENX-2B67">B48F - B747-8F</option> @endif
<option value="B752" title="B752 / PW2037">B752 - B757-200</option> <label for="EstimatedLoad">Estimated Payload For {{ $totalgenload }} Pax</label>
<option value="B75F" title="B752 / PW2037">B75F - B757-200PF</option> <input id="EstimatedLoad" type="text" class="form-control"
<option value="B753" title="B753 / PW2037">B753 - B757-300</option> value="{{ $estimatedpayload }} {{ setting('units.weight') }}" disabled/>
<option value="B762" title="B762 / CF6-80C2-B2">B762 - B767-200ER</option> </div>
<option value="B763" title="B763 / CF6-80C2B6F">B763 - B767-300ER</option> </div>
<option value="B76F" title="B763 / CF6-80C2B6F">B76F - B767-300F</option> <input type="hidden" id="pax" name="pax" class="form-control" value="{{ $totalgenload }}"/>
<option value="B764" title="B764">B764 - B767-400ER</option> @elseif($totalgenload > 900)
<option value="B772" title="B772 / GE90-94B">B772 - B777-200ER</option> <input type='hidden' id="pax" name='pax' value='0' maxlength='3'>
<option value="B77L" title="B77L / GE90-110B1">B77L - B777-200LR</option> <input type='hidden' id="cargo" name='cargo' value="{{ $totalgenload }}" maxlength='7'>
<option value="B77F" title="B77L / GE90-110B1">B77F - B777-F</option> @endif
<option value="B77W" title="B77W / GE90-115BL2">B77W - B777-300ER</option> @endif
<option value="B788" title="B788 / GENX-1B70">B788 - B787-8</option> @endforeach
<option value="B789" title="B789 / GENX-1B74">B789 - B787-9</option> </div>
<option value="B78X" title="B78X / GENX-1B76">B78X - B787-10</option> </div>
<option value="BE20" title="BE20">BE20 - KINGAIR</option> </div>
<option value="C172" title="C172 / IO-360-L2A">C172 - CESSNA 172R</option> {{--
<option value="C208" title="C208">C208 - CESSNA 208</option> Here we generate the MANUALRMK which is sent to SimBrief and displayed in the generated
<option value="C25A" title="C25A / FJ44-2C">C25A - CITATION CJ2</option> ofp as Dispatch Remarks. $loadarray is created and filled with data during random load
<option value="C404" title="C404">C404 - C404 TITAN</option> generation, it holds each fare's code and the generated load then we are imploding that
<option value="C510" title="C510">C510 - C510 MUSTANG</option> array to get the fare codes and load counts.
<option value="C550" title="C550">C550 - CITATION</option>
<option value="C56X" title="C56X / PW545A">C56X - CITATION 560XL</option> Returned string will be like Load Distribution Y 132 C 12 F 4
<option value="C750" title="C750">C750 - CITATION X</option> --}}
<option value="CL30" title="CL30 / HTF7350">CL30 - CHALLENGER</option> @if($totalgenload > 0)
<option value="CRJ2" title="CRJ2 / CF34-3B1">CRJ2 - CRJ-200</option> @php
<option value="CRJ7" title="CRJ7 / CF34-8C1">CRJ7 - CRJ-700</option> $loaddisttxt = "Load Distribution ";
<option value="CRJ9" title="CRJ9 / CF34-8C5">CRJ9 - CRJ-900</option> $loaddist = implode(' ', array_map(
<option value="CRJX" title="CRJX / CF34-8C5A1">CRJX - CRJ-1000</option> function ($v, $k) {
<option value="DC10" title="DC10">DC10 - DC-10-30</option> if(is_array($v)){
<option value="DC6" title="DC6 / R2800-CB16">DC6&nbsp; - DC-6</option> return implode('&'.' '.':', $v);
<option value="DC85" title="DC85 / JT3D-3B">DC85 - DC-8-55</option> }else{
<option value="DH8A" title="DH8A / PW120A">DH8A - DHC8-102</option> return $k.':'.$v;
<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> $loadarray, array_keys($loadarray)
<option value="DHC2" title="DHC2">DHC2 - BEAVER</option> ));
<option value="DHC6" title="DHC6">DHC6 - TWIN OTTER</option> @endphp
<option value="E13L" title="E135">E13L - EMB-135BJ</option> <input type="hidden" name="manualrmk" value="{{ $loaddisttxt }}{{ $loaddist }}">
<option value="E135" title="E135 / AE3007-A1/3">E135 - EMB-135LR</option> @endif
<option value="E140" title="E135 / AE3007-A1/3">E140 - ERJ-140LR</option> <input type="hidden" name="airline" value="{{ $flight->airline->icao }}">
<option value="E145" title="E145 / AE3007-A1">E145 - EMB-145LR</option> <input type="hidden" name="fltnum" value="{{ $flight->flight_number }}">
<option value="E170" title="E170 / CF34-8E5">E170 - EMB-170</option> <input type="hidden" id="steh" name="steh" maxlength="2">
<option value="E175" title="E170 / CF34-8E5">E175 - EMB-175</option> <input type="hidden" id="stem" name="stem" maxlength="2">
<option value="E190" title="E190 / CF34-10E6">E190 - EMB-190</option> <input type="hidden" id="date" name="date" maxlength="9">
<option value="E195" title="E190 / CF34-10E7">E195 - EMB-195</option> <input type="hidden" id="deph" name="deph" maxlength="2">
<option value="E50P" title="E50P / PW617F1-E">E50P - PHENOM 100</option> <input type="hidden" id="depm" name="depm" maxlength="2">
<option value="E55P" title="E55P / PW535E">E55P - PHENOM 300</option> <input type="hidden" name="selcal" value="BK-FS">
<option value="EA50" title="EA50 / PW610F">EA50 - ECLIPSE 550</option> <input type="hidden" name="planformat" value="lido">
<option value="F50" title="F50">F50&nbsp; - FOKKER F50</option> <input type="hidden" name="omit_sids" value="0">
<option value="FA50" title="FA50 / TFE 731-40">FA50 - FALCON 50EX</option> <input type="hidden" name="omit_stars" value="0">
<option value="GLF4" title="GLF4">GLF4 - GULFSTREAM</option> <input type="hidden" name="cruise" value="CI">
<option value="H25B" title="H25B">H25B - HAWKER 800A</option> <input type="hidden" name="civalue" value="AUTO">
<option value="JS41" title="JS41">JS41 - BAE JS-41</option>
<option value="L101" title="L101 / RB211-524B">L101 - L1011-500</option> <div class="col-4">
<option value="LJ25" title="LJ25 / CJ-610-8A">LJ25 - LEARJET 25</option> <div class="form-container">
<option value="LJ45" title="LJ45">LJ45 - LEARJET 45</option> <div class="form-container-body">
<option value="MD11" title="MD11 / CF6-80C2D1F">MD11 - MD-11</option> <h6><i class="fas fa-info-circle"></i>&nbsp;Planning Options</h6>
<option value="MD1F" title="MD11 / CF6-80C2D1F">MD1F - MD-11F</option> <table class="table table-hover table-striped">
<option value="MD82" title="MD82 / JT8D-217">MD82 - DC-9-82</option> <tr>
<option value="MD83" title="MD83 / JT8D-219">MD83 - DC-9-83</option> <td>Cont Fuel:</td>
<option value="MD88" title="MD88 / JT8D-219">MD88 - MD-88</option> <td>
<option value="MD90" title="MD90">MD90 - MD-90-30</option> <select name="contpct" class="form-control">
<option value="PC12" title="PC12 / PT6A-66D">PC12 - PILATUS PC12</option> <option value="auto">AUTO</option>
<option value="RJ1H" title="RJ1H">RJ1H - AVRO RJ100</option> <option value="0">0 PCT</option>
<option value="RJ70" title="RJ70">RJ70 - AVRO RJ70</option> <option value="0.02">2 PCT</option>
<option value="RJ85" title="RJ85">RJ85 - AVRO RJ85</option> <option value="0.03">3 PCT</option>
<option value="SF34" title="SF34 / GE CT7-9B">SF34 - SAAB 340B</option> <option value="0.05" selected>5 PCT</option>
<option value="SF50" title="SF50 / FJ33-5A">SF50 - VISION JET</option> <option value="0.1">10 PCT</option>
<option value="SW4" title="SW4 / TPE-331">SW4&nbsp; - METROLINER</option> <option value="0.15">15 PCT</option>
<option value="T154" title="T154">T154 - TU-154B2</option> <option value="0.2">20 PCT</option>
<option value="TBM9" title="TBM9 / PT6A-66D">TBM9 - TBM 900</option> </select>
</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;@lang('stisla.briefingoptions')</h6>
<table class="table table-hover 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>
</div> </div>
<div class="col-4">
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;Briefing Options
</h6>
<table class="table table-hover table-striped">
<tr>
<td>Units:</td>
<td><select name="units">
<option value="KGS">KGS</option>
<option value="LBS" selected>LBS</option>
</select></td>
</tr>
<tr>
<td>Cont Fuel:</td>
<td><select name="contpct">
<option value="auto" selected>AUTO</option>
<option value="0">0 PCT</option>
<option value="0.02">2 PCT</option>
<option value="0.03">3 PCT</option>
<option value="0.05">5 PCT</option>
<option value="0.1">10 PCT</option>
<option value="0.15">15 PCT</option>
<option value="0.2">20 PCT</option>
</select></td>
</tr>
<tr>
<td>Reserve Fuel:</td>
<td><select name="resvrule">
<option value="auto">AUTO</option>
<option value="0">0 MIN</option>
<option value="15">15 MIN</option>
<option value="30">30 MIN</option>
<option value="45" selected>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>Detailed Navlog:</td>
<td><input type="hidden" name="navlog" value="0"><input type="checkbox" name="navlog" value="1"
checked>
</td>
</tr>
<tr>
<td>ETOPS Planning:</td>
<td><input type="hidden" name="etops" value="0"><input type="checkbox" name="etops" value="1"></td>
</tr>
<tr>
<td>Plan Stepclimbs:</td>
<td><input type="hidden" name="stepclimbs" value="0"><input type="checkbox" name="stepclimbs"
value="1"
checked>
</td>
</tr>
<tr>
<td>Runway Analysis:</td>
<td><input type="hidden" name="tlr" value="0"><input type="checkbox" name="tlr" value="1" checked>
</td>
</tr>
<tr>
<td>Include NOTAMS:</td>
<td><input type="hidden" name="notams" value="0"><input type="checkbox" name="notams" value="1"
checked>
</td>
</tr>
<tr>
<td>FIR NOTAMS:</td>
<td><input type="hidden" name="firnot" value="0"><input type="checkbox" name="firnot" value="1"></td>
</tr>
<tr>
<td>Flight Maps:</td>
<td><select name="maps">
<option value="detail">Detailed</option>
<option value="simple">Simple</option>
<option value="none">None</option>
</select></td>
</tr>
</table>
</div>
</div>
</div>
<input type="hidden" name="airline" value="{{ $flight->airline->icao }}">
<input type="hidden" name="fltnum" value="{{ $flight->flight_number }}">
<input type="hidden" name="date" value="01JAN14">
<input type="hidden" name="deph" value="12">
<input type="hidden" name="depm" value="30">
<input type="hidden" name="steh" value="2">
<input type="hidden" name="stem" value="15">
{{--<input type="hidden" name="reg" value="N123SB">
<input type="hidden" name="selcal" value="GR-FS">--}}
<input type="hidden" name="planformat" value="lido">
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="float-right">
<div class="form-group">
<input type="button"
onclick="simbriefsubmit('{{ $flight->id }}', '{{ url(route('frontend.simbrief.briefing', [''])) }}');"
class="btn btn-outline-primary"
value="Generate">
</div>
</div> </div>
</div> </div>
</div> </div>
</form> </form>
@endsection @endsection
@section('scripts') @section('scripts')
<script src="{{public_asset('/assets/global/js/simbrief.apiv1.js')}}"></script> <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>
<script type="text/javascript">
// *** Simple Aircraft Selection With Dropdown Change
// *** Also keep Generate button hidden until a valid AC selection
const $oldlink = document.getElementById("mylink").href;
function checkacselection() {
if (document.getElementById("aircraftselection").value === "ZZZZZ") {
document.getElementById('mylink').style.visibility = 'hidden';
} else {
document.getElementById('mylink').style.visibility = 'visible';
}
var $selectedac = document.getElementById("aircraftselection").value;
var $newlink = "&aircraft_id=".concat($selectedac);
document.getElementById("mylink").href = $oldlink.concat($newlink);
}
</script>
@endsection @endsection
@@ -64,6 +64,7 @@
</div> </div>
</div> </div>
@if($config['table'] === true)
<div class="clearfix" style="padding-top: 25px"></div> <div class="clearfix" style="padding-top: 25px"></div>
{{-- {{--
@@ -95,7 +96,7 @@ and being mindful of the rivets bindings
{{-- Show the full airport name on hover --}} {{-- Show the full airport name on hover --}}
<td><span rv-title="pirep.dpt_airport.name">{ pirep.dpt_airport.icao }</span></td> <td><span rv-title="pirep.dpt_airport.name">{ pirep.dpt_airport.icao }</span></td>
<td><span rv-title="pirep.arr_airport.name">{ pirep.arr_airport.icao }</span></td> <td><span rv-title="pirep.arr_airport.name">{ pirep.arr_airport.icao }</span></td>
<td>{ pirep.aircraft.name }</td> <td>{ pirep.aircraft.registration }</td>
<td>{ pirep.position.altitude }</td> <td>{ pirep.position.altitude }</td>
<td>{ pirep.position.gs }</td> <td>{ pirep.position.gs }</td>
<td>{ pirep.position.distance.{{setting('units.distance')}} | fallback 0 } / <td>{ pirep.position.distance.{{setting('units.distance')}} | fallback 0 } /
@@ -107,6 +108,7 @@ and being mindful of the rivets bindings
</table> </table>
</div> </div>
</div> </div>
@endif
@section('scripts') @section('scripts')
<script> <script>
@@ -10,71 +10,87 @@ https://api.checkwx.com/#metar-decoded
<table class="table table-striped"> <table class="table table-striped">
<tr> <tr>
<td>@lang('widgets.weather.conditions')</td> <td>@lang('widgets.weather.conditions')</td>
<td> <td>{{ $metar['category'] }}</td>
{{ $metar['category'] }}
{{ $metar['temperature'][$unit_temp] }}
°{{strtoupper($unit_temp)}}
@if($metar['visibility'])
, @lang('widgets.weather.visibility') {{ $metar['visibility'][$unit_dist] }} {{$unit_dist}}
@endif
@if($metar['humidity'])
, {{ $metar['humidity'] }}% @lang('widgets.weather.humidity')
@endif
@if($metar['dew_point'])
, @lang('widgets.weather.dewpoint')
{{ $metar['dew_point'][$unit_temp] }}
°{{strtoupper($unit_temp)}}
@endif
</td>
</tr> </tr>
<tr>
<td>@lang('widgets.weather.barometer')</td>
<td>
{{ number_format($metar['barometer']['hPa'], 2) }} hPa
/ {{ number_format($metar['barometer']['inHg'], 2) }} inHg
</td>
</tr>
@if($metar['clouds'])
<tr>
<td>@lang('widgets.weather.clouds')</td>
<td>
@if($unit_alt === 'ft')
{{$metar['clouds_report_ft']}}
@else
{{ $metar['clouds_report'] }}
@endif
</td>
</tr>
@endif
<tr> <tr>
<td>@lang('widgets.weather.wind')</td> <td>@lang('widgets.weather.wind')</td>
<td> <td>
{{$metar['wind_speed']}} kts @lang('common.from') {{$metar['wind_direction_label']}} @if($metar['wind_speed'] < '1') Calm @else {{ $metar['wind_speed'] }} kts @lang('common.from') {{ $metar['wind_direction_label'] }} ({{ $metar['wind_direction']}}°) @endif
({{$metar['wind_direction']}}°) @if($metar['wind_gust_speed']) @lang('widgets.weather.guststo') {{ $metar['wind_gust_speed'] }} @endif
@if($metar['wind_gust_speed'])
@lang('widgets.weather.guststo') {{ $metar['wind_gust_speed'] }}
@endif
</td> </td>
</tr> </tr>
@if($metar['visibility'])
<tr> <tr>
<td>@lang('common.metar')</td> <td>Visibility</td>
<td> <td>{{ $metar['visibility'][$unit_dist] }} {{$unit_dist}}</td>
<div style="line-height:1.5em;min-height: 3em;">
{{ $metar['raw'] }}
</div>
</td>
</tr> </tr>
@endif
@if($metar['runways_visual_range'])
<tr>
<td>Runway Visual Range</td>
<td>
@foreach($metar['runways_visual_range'] as $rvr)
<b>RWY{{ $rvr['runway'] }}</b>; {{ $rvr['report'] }}<br>
@endforeach
</td>
</tr>
@endif
@if($metar['present_weather_report'] <> 'Dry')
<tr>
<td>Phenomena</td>
<td>{{ $metar['present_weather_report'] }}</td>
</tr>
@endif
@if($metar['clouds'] || $metar['cavok'])
<tr>
<td>@lang('widgets.weather.clouds')</td>
<td>
@if($unit_alt === 'ft') {{ $metar['clouds_report_ft'] }} @else {{ $metar['clouds_report'] }} @endif
@if($metar['cavok'] == 1) Ceiling and Visibility OK @endif
</td>
</tr>
@endif
<tr>
<td>Temperature</td>
<td>
@if($metar['temperature'][$unit_temp]) {{ $metar['temperature'][$unit_temp] }} @else 0 @endif °{{strtoupper($unit_temp)}}
@if($metar['dew_point']), @lang('widgets.weather.dewpoint') @if($metar['dew_point'][$unit_temp]) {{ $metar['dew_point'][$unit_temp] }} @else 0 @endif °{{strtoupper($unit_temp)}} @endif
@if($metar['humidity']), @lang('widgets.weather.humidity') {{ $metar['humidity'] }}% @endif
</td>
</tr>
<tr>
<td>@lang('widgets.weather.barometer')</td>
<td>{{ number_format($metar['barometer']['hPa']) }} hPa / {{ number_format($metar['barometer']['inHg'], 2) }} inHg</td>
</tr>
@if($metar['recent_weather_report'])
<tr>
<td>Recent Phenomena</td>
<td>{{ $metar['recent_weather_report'] }}</td>
</tr>
@endif
@if($metar['runways_report'])
<tr>
<td>Runway Condition</td>
<td>
@foreach($metar['runways_report'] as $runway)
<b>RWY{{ $runway['runway'] }}</b>; {{ $runway['report'] }}<br>
@endforeach
</td>
</tr>
@endif
@if($metar['remarks']) @if($metar['remarks'])
<tr> <tr>
<td>@lang('widgets.weather.remarks')</td> <td>@lang('widgets.weather.remarks')</td>
<td> <td>{{ $metar['remarks'] }}</td>
{{ $metar['remarks'] }}
</td>
</tr> </tr>
@endif @endif
<tr> <tr>
<td>@lang('widgets.weather.updated')</td> <td>@lang('widgets.weather.updated')</td>
<td>{{$metar['observed_time']}} ({{$metar['observed_age']}})</td> <td>{{$metar['observed_time']}} ({{$metar['observed_age']}})</td>
</tr> </tr>
<tr>
<td>@lang('common.metar')</td>
<td>{{ $metar['raw'] }}</td>
</tr>
</table> </table>
@endif @endif
+6
View File
@@ -230,12 +230,18 @@ class AcarsTest extends TestCase
$this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false); $this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false);
$this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false); $this->settingsRepo->store('pireps.restrict_aircraft_to_rank', false);
/** @var User user */
$this->user = factory(User::class)->create([ $this->user = factory(User::class)->create([
'curr_airport_id' => 'KJFK', 'curr_airport_id' => 'KJFK',
]); ]);
/** @var Airport $airport */
$airport = factory(Airport::class)->create(); $airport = factory(Airport::class)->create();
/** @var Airline $airline */
$airline = factory(Airline::class)->create(); $airline = factory(Airline::class)->create();
/** @var Aircraft $aircraft */
$aircraft = factory(Aircraft::class)->create([ $aircraft = factory(Aircraft::class)->create([
'airport_id' => 'KAUS', 'airport_id' => 'KAUS',
]); ]);
+20 -2
View File
@@ -467,6 +467,11 @@ class ImporterTest extends TestCase
*/ */
public function testFlightImporter(): void public function testFlightImporter(): void
{ {
$this->updateSetting('general.auto_airport_lookup', false);
factory(Airport::class)->create(['icao' => 'KAUS']);
factory(Airport::class)->create(['icao' => 'KJFK']);
[$airline, $subfleet] = $this->insertFlightsScaffoldData(); [$airline, $subfleet] = $this->insertFlightsScaffoldData();
$file_path = base_path('tests/data/flights.csv'); $file_path = base_path('tests/data/flights.csv');
@@ -531,6 +536,19 @@ class ImporterTest extends TestCase
// Check the subfleets // Check the subfleets
$subfleets = $flight->subfleets; $subfleets = $flight->subfleets;
$this->assertCount(1, $subfleets); $this->assertCount(1, $subfleets);
// Reimport, see that data updates
$file_path = base_path('tests/data/flights-update.csv');
$status = $this->importSvc->importFlights($file_path);
$flight = Flight::where([
'airline_id' => $airline->id,
'flight_number' => '1972',
])->first();
$this->assertCount(1, $status['success']);
$this->assertEquals('12:00 CST', $flight->dpt_time);
$this->assertEquals('18:35 EST', $flight->arr_time);
} }
/** /**
@@ -634,8 +652,8 @@ class ImporterTest extends TestCase
$this->assertEquals(true, $airport->hub); $this->assertEquals(true, $airport->hub);
$this->assertEquals('30.1945', $airport->lat); $this->assertEquals('30.1945', $airport->lat);
$this->assertEquals('-97.6699', $airport->lon); $this->assertEquals('-97.6699', $airport->lon);
$this->assertEquals(0.0, $airport->ground_handling_cost); $this->assertEquals(250, $airport->ground_handling_cost);
$this->assertEquals(setting('airports.default_jet_a_fuel_cost'), $airport->fuel_jeta_cost); $this->assertEquals(0.8, $airport->fuel_jeta_cost); // should be updated
// See if it imported // See if it imported
$airport = Airport::where([ $airport = Airport::where([
+3 -1
View File
@@ -423,14 +423,16 @@ class PIREPTest extends TestCase
// Submit two PIREPs // Submit two PIREPs
// 1 hour flight times, but the rank should bump up because of the transfer hours // 1 hour flight times, but the rank should bump up because of the transfer hours
/** @var Pirep $pirep */
$pirep = factory(Pirep::class)->create([ $pirep = factory(Pirep::class)->create([
'airline_id' => $user->airline_id, 'airline_id' => $user->airline_id,
'user_id' => $user->id, 'user_id' => $user->id,
]); ]);
$this->pirepSvc->create($pirep); $this->pirepSvc->create($pirep);
$this->pirepSvc->file($pirep); $this->pirepSvc->submit($pirep);
/** @var User $user */
$user = User::find($user->id); $user = User::find($user->id);
$this->assertEquals(UserState::ACTIVE, $user->state); $this->assertEquals(UserState::ACTIVE, $user->state);
} }
+5 -5
View File
@@ -23,8 +23,9 @@ class SimBriefTest extends TestCase
* *
* @return \App\Models\SimBrief * @return \App\Models\SimBrief
*/ */
protected function loadSimBrief($user): SimBrief protected function loadSimBrief(User $user): SimBrief
{ {
/** @var \App\Models\Flight $flight */
$flight = factory(Flight::class)->create([ $flight = factory(Flight::class)->create([
'id' => self::$simbrief_flight_id, 'id' => self::$simbrief_flight_id,
'dpt_airport_id' => 'OMAA', 'dpt_airport_id' => 'OMAA',
@@ -39,7 +40,7 @@ class SimBriefTest extends TestCase
/** @var SimBriefService $sb */ /** @var SimBriefService $sb */
$sb = app(SimBriefService::class); $sb = app(SimBriefService::class);
return $sb->checkForOfp($user->id, Utils::generateNewId(), $flight->id); return $sb->downloadOfp($user->id, Utils::generateNewId(), $flight->id);
} }
/** /**
@@ -99,14 +100,13 @@ class SimBriefTest extends TestCase
$url = str_replace('http://', 'https://', $flight['simbrief']['url']); $url = str_replace('http://', 'https://', $flight['simbrief']['url']);
$this->assertEquals( $this->assertEquals(
'https://localhost/api/flights/'.$briefing->flight_id.'/briefing', 'https://localhost/api/flights/'.$briefing->id.'/briefing',
$url $url
); );
// Retrieve the briefing via API, and then check the doctype // Retrieve the briefing via API, and then check the doctype
$response = $this->get('/api/flights/'.$briefing->flight_id.'/briefing'); $response = $this->get('/api/flights/'.$briefing->id.'/briefing', [], $this->user);
$response->assertOk(); $response->assertOk();
// $response->assertHeader('Content-Type', 'application/xml');
$xml = simplexml_load_string($response->content()); $xml = simplexml_load_string($response->content());
$this->assertNotNull($xml); $this->assertNotNull($xml);
+4 -4
View File
@@ -1,4 +1,4 @@
icao,iata,name,location,country,timezone,hub,lat,lon,ground_handling_cost,fuel_100ll_cost,fuel_jeta_cost,fuel_mogas_cost icao,iata,name,location,country,timezone,hub,lat,lon,ground_handling_cost,fuel_100ll_cost,fuel_jeta_cost,fuel_mogas_cost
KAUS,AUS,Austin-Bergstrom,"Austin, Texas, USA", United States,America/Chicago,1,30.1945,-97.6699,0,,, KAUS,AUS,Austin-Bergstrom,"Austin, Texas, USA", United States,America/Chicago,1,30.1945,-97.6699,250,0.8,0.8,0.8
KSFO,SFO,San Francisco,"San Francisco, California, USA", United States,America/California,1,30.1945,-97.6699,,,0.9, KSFO,SFO,San Francisco,"San Francisco, California, USA", United States,America/California,1,30.1945,-97.6699,,,0.9,
KJFK,JFK,Kennedy,"Queens, New York, USA", United States,America/New_York,0,30.1945,abcd,150,,0.8, KJFK,JFK,Kennedy,"Queens, New York, USA", United States,America/New_York,0,30.1945,abcd,150,,0.8,
1 icao iata name location country timezone hub lat lon ground_handling_cost fuel_100ll_cost fuel_jeta_cost fuel_mogas_cost
2 KAUS AUS Austin-Bergstrom Austin, Texas, USA United States America/Chicago 1 30.1945 -97.6699 0 250 0.8 0.8 0.8
3 KSFO SFO San Francisco San Francisco, California, USA United States America/California 1 30.1945 -97.6699 0.9
4 KJFK JFK Kennedy Queens, New York, USA United States America/New_York 0 30.1945 abcd 150 0.8
+2
View File
@@ -0,0 +1,2 @@
airline,flight_number,route_code,route_leg,dpt_airport,arr_airport,alt_airport,days,dpt_time,arr_time,level,distance,flight_time,flight_type,load_factor, load_factor_variance,pilot_pay,route,notes,active,subfleets,fares,fields
VMS,1972, ,,KAUS,KJFK,KLGA,15,12:00 CST,18:35 EST,350,1477,207,J,85,0,100, ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6,"Just a flight",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?,Departure Gate=4;Arrival Gate=C41
1 airline flight_number route_code route_leg dpt_airport arr_airport alt_airport days dpt_time arr_time level distance flight_time flight_type load_factor load_factor_variance pilot_pay route notes active subfleets fares fields
2 VMS 1972 KAUS KJFK KLGA 15 12:00 CST 18:35 EST 350 1477 207 J 85 0 100 ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6 Just a flight 1 A32X Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B? Departure Gate=4;Arrival Gate=C41
+1 -1
View File
@@ -79,7 +79,7 @@ function buildAdminAssets()
'node_modules/x-editable/dist/bootstrap3-editable/js/bootstrap-editable.js', 'node_modules/x-editable/dist/bootstrap3-editable/js/bootstrap-editable.js',
'node_modules/eonasdan-bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js', 'node_modules/eonasdan-bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js',
'node_modules/jquery-pjax/jquery.pjax.js', 'node_modules/jquery-pjax/jquery.pjax.js',
'node_modues/paper-dashboard/assets/js/paper-dashboard.js', 'node_modules/paper-dashboard/assets/js/paper-dashboard.js',
], 'public/assets/admin/js/vendor.js'); ], 'public/assets/admin/js/vendor.js');
mix.copy('node_modules/ckeditor4', 'public/assets/vendor/ckeditor4/'); mix.copy('node_modules/ckeditor4', 'public/assets/vendor/ckeditor4/');