Compare commits

..

5 Commits

Author SHA1 Message Date
nabeelio
db34d0e3e7 Add test for METAR string 2021-03-15 09:14:39 -04:00
Nabeel S
fffbab7201 Merge branch 'dev' into patch-2 2021-03-15 08:30:29 -04:00
B.Fatih KOZ
76a2a16fa6 Merge branch 'dev' into patch-2 2021-03-14 03:54:53 +03:00
B.Fatih KOZ
cfbd1c901a Merge branch 'dev' into patch-2 2021-03-10 04:53:25 +03:00
B.Fatih KOZ
617813bdbf Fix Metar Decoding / Wind check for Wind Chill
PR aims to fix the bug #1071 by checking both the wind speed and it's value for starting Wind Chill calculation.
2021-03-09 16:06:39 +03:00
114 changed files with 1880 additions and 4456 deletions

View File

@@ -8,7 +8,7 @@ APP_LOCALE="en"
PHPVMS_INSTALLED="true"
APP_LOG="daily"
LOG_LEVEL="debug"
APP_LOG_LEVEL="debug"
APP_LOG_MAX_FILES="3"
DB_CONNECTION="mysql"

1
.gitignore vendored
View File

@@ -74,5 +74,4 @@ error_log
.sass-cache
.DS_Store
/config.php
/config.bak.php
/VERSION

View File

@@ -28,8 +28,6 @@ RedirectMatch 403 ^/composer.phar
RedirectMatch 403 ^/env.php.*?$
RedirectMatch 403 ^/env.php
RedirectMatch 403 ^/env.php$
RedirectMatch 403 ^/config.php$
RedirectMatch 403 ^/config.bak.php$
RedirectMatch 403 ^/Makefile
RedirectMatch 403 ^/package.json
RedirectMatch 403 ^/package-lock.json

View File

@@ -2,7 +2,7 @@ FROM php:7.4-fpm-alpine
WORKDIR /var/www/
RUN apk add gmp-dev icu-dev
RUN apk add gmp-dev
RUN curl --silent --show-error https://getcomposer.org/installer | php
# Copy any config files in
@@ -12,7 +12,6 @@ RUN ln -sf /dev/stderr /var/log/fpm-error.log
RUN docker-php-ext-install \
calendar \
intl \
pdo_mysql \
gmp \
opcache && \

View File

@@ -4,9 +4,9 @@ namespace App\Console\Commands;
use App;
use App\Contracts\Command;
use App\Services\Installer\ConfigService;
use App\Services\Installer\SeederService;
use DatabaseSeeder;
use Modules\Installer\Services\ConfigService;
/**
* Create the config files
@@ -81,13 +81,13 @@ class CreateConfigs extends Command
$this->info('Regenerating the config files');
$cfgSvc->createConfigFiles([
'APP_ENV' => 'dev',
'SITE_NAME' => $this->argument('name'),
'DB_CONNECTION' => 'mysql',
'DB_HOST' => $this->argument('db_host'),
'DB_DATABASE' => $this->argument('db_name'),
'DB_USERNAME' => $this->argument('db_user'),
'DB_PASSWORD' => $this->argument('db_pass'),
'APP_ENV' => 'dev',
'SITE_NAME' => $this->argument('name'),
'DB_CONN' => 'mysql',
'DB_HOST' => $this->argument('db_host'),
'DB_NAME' => $this->argument('db_name'),
'DB_USER' => $this->argument('db_user'),
'DB_PASS' => $this->argument('db_pass'),
]);
$this->info('Config files generated!');

View File

@@ -79,9 +79,9 @@ class DevInstall extends Command
$this->info('Regenerating the config files');
$cfgSvc->createConfigFiles([
'APP_ENV' => 'dev',
'SITE_NAME' => 'phpvms test',
'DB_CONNECTION' => 'sqlite',
'APP_ENV' => 'dev',
'SITE_NAME' => 'phpvms test',
'DB_CONN' => 'sqlite',
]);
$this->info('Config files generated!');

View File

@@ -1,25 +0,0 @@
<?php
namespace App\Console\Commands;
use App\Contracts\Command;
use App\Services\Installer\ConfigService;
/**
* Command to rewrite the config files
*/
class RewriteConfigs extends Command
{
protected $signature = 'phpvms:rewrite-configs';
protected $description = 'Rewrite the config files';
/**
* Run dev related commands
*/
public function handle()
{
/** @var ConfigService $configSvc */
$configSvc = app(ConfigService::class);
$configSvc->rewriteConfigFiles();
}
}

View File

@@ -17,7 +17,7 @@ use Illuminate\Support\Facades\Log;
class DeletePireps extends Listener
{
/**
* Delete old rejected PIREPs
* Remove expired bids
*
* @param CronHourly $event
*
@@ -37,8 +37,8 @@ class DeletePireps extends Listener
*/
protected function deletePireps(int $expire_time_hours, int $state)
{
$dt = Carbon::now('UTC')->subHours($expire_time_hours);
$pireps = Pirep::where('created_at', '<', $dt)->where(['state' => $state])->get();
$dt = Carbon::now()->subHours($expire_time_hours);
$pireps = Pirep::whereDate('created_at', '<', $dt)->where(['state' => $state])->get();
/** @var PirepService $pirepSvc */
$pirepSvc = app(PirepService::class);

View File

@@ -25,7 +25,7 @@ class RemoveExpiredBids extends Listener
return;
}
$date = Carbon::now('UTC')->subHours(setting('bids.expire_time'));
Bid::where('created_at', '<', $date)->delete();
$date = Carbon::now()->subHours(setting('bids.expire_time'));
Bid::whereDate('created_at', '<', $date)->delete();
}
}

View File

@@ -26,8 +26,8 @@ class RemoveExpiredLiveFlights extends Listener
return;
}
$date = Carbon::now('UTC')->subHours(setting('acars.live_time'));
Pirep::where('updated_at', '<', $date)
$date = Carbon::now()->subHours(setting('acars.live_time'));
Pirep::whereDate('updated_at', '<', $date)
->where('state', PirepState::IN_PROGRESS)
->delete();
}

View File

@@ -1,20 +1,17 @@
<?php
use App\Models\Journal;
use Carbon\Carbon;
use Faker\Generator as Faker;
use Ramsey\Uuid\Uuid;
$factory->define(App\Models\JournalTransaction::class, function (Faker $faker) {
$factory->define(App\Models\JournalTransactions::class, function (Faker $faker) {
return [
'transaction_group' => Uuid::uuid4()->toString(),
'transaction_group' => \Ramsey\Uuid\Uuid::uuid4()->toString(),
'journal_id' => function () {
return factory(Journal::class)->create()->id;
return factory(\App\Models\Journal::class)->create()->id;
},
'credit' => $faker->numberBetween(100, 10000),
'debit' => $faker->numberBetween(100, 10000),
'currency' => 'USD',
'memo' => $faker->sentence(6),
'post_date' => Carbon::now('UTC'),
'post_date' => \Carbon\Carbon::now(),
];
});

View File

@@ -1,13 +0,0 @@
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\Role::class, function (Faker $faker) {
return [
'id' => null,
'name' => $faker->name,
'display_name' => $faker->name,
'read_only' => false,
'disable_activity_checks' => $faker->boolean(),
];
});

View File

@@ -1,34 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddDisableactivitychecksToRoles extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('roles', function (Blueprint $table) {
$table->boolean('disable_activity_checks')
->default(false)
->after('read_only');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('roles', function (Blueprint $table) {
$table->dropColumn('disable_activity_checks');
});
}
}

View File

@@ -1,19 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
class RemoveSettingRemoveBidOnAccept extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::table('settings')
->where(['key' => 'pireps.remove_bid_on_accept'])
->delete();
}
}

View File

@@ -1,30 +0,0 @@
<?php
use App\Contracts\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Add a `anumeric_callsign` column for Alphanumeric Callsign to be assigned for a flight
* Exp DLH78BF, THY8EA, OGE1978
* According to FAA and EASA, callsigns must be maximum 7 chars in which first 3 chars is
* airline ICAO code remaining rest can be used freely according to airline's choices
*/
class FlightsAddAlphanumericCallsign extends Migration
{
public function up()
{
Schema::table('flights', function (Blueprint $table) {
$table->string('callsign', 4)
->nullable()
->after('flight_number');
});
}
public function down()
{
Schema::table('flights', function (Blueprint $table) {
$table->dropColumn('callsign');
});
}
}

View File

@@ -1,21 +0,0 @@
<?php
use App\Contracts\Migration;
use App\Services\Installer\ConfigService;
/**
* Migrate the configuration files
*/
class MigrateConfigs extends Migration
{
public function up()
{
/** @var ConfigService $configSvc */
$configSvc = app(ConfigService::class);
$configSvc->rewriteConfigFiles();
}
public function down()
{
}
}

File diff suppressed because one or more lines are too long

View File

@@ -235,13 +235,6 @@
options: ''
type: boolean
description: 'Use pilot ident as Simbrief ATC Callsign'
- key: simbrief.name_private
name: 'Use Privatized Name at OFPs'
group: simbrief
value: false
options: ''
type: boolean
description: 'Use privatized user name as SimBrief OFP captain name'
- key: pireps.duplicate_check_time
name: 'PIREP duplicate time check'
group: pireps
@@ -263,6 +256,13 @@
options: ''
type: boolean
description: 'Only allow aircraft that are at the departure airport'
- key: pireps.remove_bid_on_accept
name: 'Remove bid on accept'
group: pireps
value: false
options: ''
type: boolean
description: 'When a PIREP is accepted, remove the bid, if it exists'
- key: pireps.advanced_fuel
name: 'Advanced Fuel Calculations'
group: pireps

View File

@@ -1,44 +0,0 @@
<?php
namespace App\Exceptions;
/**
* Prefile Error
*
* If listening to the prefile event message, use `throw new PrefileError("message message");`
* to abort the prefile process and send the message up to ACARS
*/
class PrefileError extends AbstractHttpException
{
private $error;
public function __construct(string $error)
{
$this->error = $error;
parent::__construct(400, $error);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'prefile-error';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [];
}
}

View File

@@ -1,38 +0,0 @@
<?php
namespace App\Exceptions;
class UserNotFound extends AbstractHttpException
{
public function __construct()
{
parent::__construct(
404,
'User not found'
);
}
/**
* Return the RFC 7807 error type (without the URL root)
*/
public function getErrorType(): string
{
return 'user-not-found';
}
/**
* Get the detailed error string
*/
public function getErrorDetails(): string
{
return $this->getMessage();
}
/**
* Return an array with the error details, merged with the RFC7807 response
*/
public function getErrorMetadata(): array
{
return [];
}
}

View File

@@ -115,7 +115,7 @@ class FlightController extends Controller
$avail_fleets = $all_aircraft->except($flight->subfleets->modelKeys());
foreach ($avail_fleets as $ac) {
$retval[$ac->id] = '['.$ac->airline->icao.']&nbsp;'.$ac->type.' - '.$ac->name;
$retval[$ac->id] = $ac->type.' - '.$ac->name;
}
return $retval;

View File

@@ -252,12 +252,15 @@ class UserController extends Controller
public function destroy($id)
{
$user = $this->userRepo->findWithoutFail($id);
if (empty($user)) {
Flash::error('User not found');
return redirect(route('admin.users.index'));
}
$this->userSvc->removeUser($user);
$this->userRepo->delete($id);
Flash::success('User deleted successfully.');
return redirect(route('admin.users.index'));

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Api;
use App\Contracts\Controller;
use App\Events\PirepPrefiled;
use App\Events\PirepUpdated;
use App\Exceptions\AircraftPermissionDenied;
use App\Exceptions\PirepCancelled;
@@ -218,6 +219,8 @@ class PirepController extends Controller
$this->updateFields($pirep, $request);
$this->updateFares($pirep, $request);
event(new PirepPrefiled($pirep));
return $this->get($pirep->id);
}

View File

@@ -3,7 +3,6 @@
namespace App\Http\Controllers\Api;
use App\Contracts\Controller;
use App\Exceptions\UserNotFound;
use App\Http\Resources\Bid as BidResource;
use App\Http\Resources\Pirep as PirepResource;
use App\Http\Resources\Subfleet as SubfleetResource;
@@ -92,10 +91,6 @@ class UserController extends Controller
public function get($id)
{
$user = $this->userSvc->getUser($id);
if ($user === null) {
throw new UserNotFound();
}
return new UserResource($user);
}
@@ -113,9 +108,6 @@ class UserController extends Controller
{
$user_id = $this->getUserId($request);
$user = $this->userSvc->getUser($user_id);
if ($user === null) {
throw new UserNotFound();
}
// Add a bid
if ($request->isMethod('PUT') || $request->isMethod('POST')) {
@@ -154,10 +146,6 @@ class UserController extends Controller
public function fleet(Request $request)
{
$user = $this->userRepo->find($this->getUserId($request));
if ($user === null) {
throw new UserNotFound();
}
$subfleets = $this->userSvc->getAllowableSubfleets($user);
return SubfleetResource::collection($subfleets);

View File

@@ -3,7 +3,6 @@
namespace App\Http\Controllers\Frontend;
use App\Contracts\Controller;
use App\Models\Airline;
use App\Models\File;
use Auth;
use Flash;
@@ -19,7 +18,6 @@ class DownloadController extends Controller
*/
public function index()
{
$airlines = Airline::where('active', 1)->count();
$files = File::orderBy('ref_model', 'asc')->get();
/**
@@ -44,14 +42,10 @@ class DownloadController extends Controller
$category = explode('\\', $class);
$category = end($category);
if ($category == 'Aircraft' && $airlines > 1) {
$group_name = $category.' > '.$obj->subfleet->airline->name.' '.$obj->icao.' '.$obj->registration;
} elseif ($category == 'Aircraft') {
if ($category == 'Aircraft') {
$group_name = $category.' > '.$obj->icao.' '.$obj->registration;
} elseif ($category == 'Airport') {
$group_name = $category.' > '.$obj->icao.' : '.$obj->name.' ('.$obj->country.')';
} elseif ($category == 'Subfleet' && $airlines > 1) {
$group_name = $category.' > '.$obj->airline->name.' '.$obj->name;
} else {
$group_name = $category.' > '.$obj->name;
}
@@ -59,15 +53,13 @@ class DownloadController extends Controller
$regrouped_files[$group_name] = $files;
}
ksort($regrouped_files, SORT_STRING);
return view('downloads.index', [
'grouped_files' => $regrouped_files,
]);
}
/**
* Show the application dashboard
* Show the application dashboard.
*
* @param string $id
*

View File

@@ -211,7 +211,6 @@ class PirepController extends Controller
return view('pireps.show', [
'pirep' => $pirep,
'map_features' => $map_features,
'user' => Auth::user(),
]);
}
@@ -429,18 +428,12 @@ class PirepController extends Controller
*/
public function edit($id)
{
/** @var Pirep $pirep */
$pirep = $this->pirepRepo->findWithoutFail($id);
if (empty($pirep)) {
Flash::error('Pirep not found');
return redirect(route('frontend.pireps.index'));
}
if ($pirep->user_id !== Auth::id()) {
Flash::error('Cannot edit someone else\'s PIREP!');
return redirect(route('admin.pireps.index'));
}
// Eager load the subfleet and fares under it
if ($pirep->aircraft) {
$pirep->aircraft->load('subfleet.fares');
@@ -493,21 +486,12 @@ class PirepController extends Controller
*/
public function update($id, UpdatePirepRequest $request)
{
/** @var User $user */
$user = Auth::user();
/** @var Pirep $pirep */
$pirep = $this->pirepRepo->findWithoutFail($id);
if (empty($pirep)) {
Flash::error('Pirep not found');
return redirect(route('admin.pireps.index'));
}
if ($user->id !== $pirep->user_id) {
Flash::error('Cannot edit someone else\'s PIREP!');
return redirect(route('admin.pireps.index'));
}
$orig_route = $pirep->route;
$attrs = $request->all();
$attrs['submit'] = strtolower($attrs['submit']);
@@ -560,11 +544,6 @@ class PirepController extends Controller
return redirect(route('admin.pireps.index'));
}
if ($pirep->user_id !== Auth::id()) {
Flash::error('Cannot edit someone else\'s PIREP!');
return redirect(route('admin.pireps.index'));
}
$this->pirepSvc->submit($pirep);
return redirect(route('frontend.pireps.show', [$pirep->id]));
}

View File

@@ -4,8 +4,6 @@ namespace App\Http\Controllers\Frontend;
use App\Exceptions\AssetNotFound;
use App\Models\Aircraft;
use App\Models\Enums\AircraftState;
use App\Models\Enums\AircraftStatus;
use App\Models\Enums\FareType;
use App\Models\Enums\FlightType;
use App\Models\Fare;
@@ -79,30 +77,8 @@ class SimBriefController
$subfleets = $this->userSvc->getAllowableSubfleets($user);
}
// Build an array of subfleet id's from the subfleets collection
$sf_ids = $subfleets->map(function ($subfleets) {
return collect($subfleets->toArray())
->only(['id'])
->all();
});
// Now we can build a proper aircrafts collection
// Contents will be either members of flight->subfleets
// or members of user's allowable subfleets
$aircrafts = Aircraft::whereIn('subfleet_id', $sf_ids)
->where('state', AircraftState::PARKED)
->where('status', AircraftStatus::ACTIVE)
->orderby('icao')
->orderby('registration')
->get();
if (setting('pireps.only_aircraft_at_dpt_airport')) {
$aircrafts = $aircrafts->where('airport_id', $flight->dpt_airport_id);
}
return view('flights.simbrief_aircraft', [
'flight' => $flight,
'aircrafts' => $aircrafts,
'subfleets' => $subfleets,
]);
}

View File

@@ -203,21 +203,21 @@ class InstallerController extends Controller
Log::error('Testing db before writing configs failed');
Log::error($e->getMessage());
flash()->error($e->getMessage());
Flash::error($e->getMessage());
return redirect(route('installer.step2'))->withInput();
}
// Now write out the env file
$attrs = [
'SITE_NAME' => $request->post('site_name'),
'APP_URL' => $request->post('app_url'),
'DB_CONNECTION' => $request->post('db_conn'),
'DB_HOST' => $request->post('db_host'),
'DB_PORT' => $request->post('db_port'),
'DB_DATABASE' => $request->post('db_name'),
'DB_USERNAME' => $request->post('db_user'),
'DB_PASSWORD' => $request->post('db_pass'),
'DB_PREFIX' => $request->post('db_prefix'),
'SITE_NAME' => $request->post('site_name'),
'SITE_URL' => $request->post('site_url'),
'DB_CONN' => $request->post('db_conn'),
'DB_HOST' => $request->post('db_host'),
'DB_PORT' => $request->post('db_port'),
'DB_NAME' => $request->post('db_name'),
'DB_USER' => $request->post('db_user'),
'DB_PASS' => $request->post('db_pass'),
'DB_PREFIX' => $request->post('db_prefix'),
];
/*
@@ -231,7 +231,7 @@ class InstallerController extends Controller
Log::error('Config files failed to write');
Log::error($e->getMessage());
flash()->error($e->getMessage());
Flash::error($e->getMessage());
return redirect(route('installer.step2'))->withInput();
}
@@ -257,7 +257,7 @@ class InstallerController extends Controller
Log::error('Error on db setup: '.$e->getMessage());
//dd($e);
$this->envSvc->removeConfigFiles();
flash()->error($e->getMessage());
Flash::error($e->getMessage());
return redirect(route('installer.step2'))->withInput();
}

View File

@@ -52,7 +52,7 @@ class SetActiveTheme implements Middleware
}
try {
$theme = setting('general.theme', 'default');
$theme = setting('general.theme');
} catch (\Exception $e) {
Log::error($e->getMessage());
$theme = 'default';

View File

@@ -9,7 +9,7 @@ class Bid extends Resource
public function toArray($request)
{
$res = parent::toArray($request);
$res['flight'] = new BidFlight($this->flight);
$res['flight'] = new Flight($this->flight);
return $res;
}

View File

@@ -1,36 +0,0 @@
<?php
namespace App\Http\Resources;
use App\Http\Resources\SimBrief as SimbriefResource;
/**
* @mixin \App\Models\Flight
*/
class BidFlight extends Flight
{
/**
* @param \Illuminate\Http\Request $request
*
* @throws \PhpUnitsOfMeasure\Exception\NonNumericValue
* @throws \PhpUnitsOfMeasure\Exception\NonStringUnitName
*
* @return array
*/
public function toArray($request)
{
$res = parent::toArray($request);
if ($this->whenLoaded('simbrief')) {
unset($res['subfleets']);
$res['simbrief'] = new SimbriefResource($this->simbrief);
} else {
unset($res['simbrief']);
$res['subfleets'] = Subfleet::collection($this->whenLoaded('subfleets'));
}
$res['fields'] = $this->setFields();
return $res;
}
}

View File

@@ -1,41 +0,0 @@
<?php
namespace App\Http\Resources;
class BidSubfleet extends Subfleet
{
protected $aircraft;
protected $fares;
public function __construct($resource, $aircraft, $fares)
{
parent::__construct($resource);
$this->aircraft = $aircraft;
$this->fares = $fares;
}
public function toArray($request)
{
$res = [];
$res['airline_id'] = $this->airline_id;
$res['hub_id'] = $this->hub_id;
$res['type'] = $this->type;
$res['simbrief_type'] = $this->simbrief_type;
$res['name'] = $this->name;
$res['fuel_type'] = $this->fuel_type;
$res['cost_block_hour'] = $this->cost_block_hour;
$res['cost_delay_minute'] = $this->cost_delay_minute;
$res['ground_handling_multiplier'] = $this->ground_handling_multiplier;
$res['cargo_capacity'] = $this->cargo_capacity;
$res['fuel_capacity'] = $this->fuel_capacity;
$res['gross_weight'] = $this->gross_weight;
$res['fares'] = Fare::collection($this->fares);
// There should only be one aircraft tied to a bid subfleet, wrap in a collection
$res['aircraft'] = Aircraft::collection([$this->aircraft]);
return $res;
}
}

View File

@@ -15,7 +15,7 @@ class Flight extends Resource
/**
* Set the fields on the flight object
*/
protected function setFields()
private function setFields()
{
/** @var \Illuminate\Support\Collection $field_values */
$return_values = new stdClass();

View File

@@ -12,27 +12,25 @@ class SimBrief extends Resource
public function toArray($request)
{
$data = [
'id' => $this->id,
'aircraft_id' => $this->aircraft_id,
'url' => url(route('api.flights.briefing', ['id' => $this->id])),
'id' => $this->id,
'url' => url(route('api.flights.briefing', ['id' => $this->id])),
];
$fares = [];
try {
if (!empty($this->fare_data)) {
$fares = [];
$fare_data = json_decode($this->fare_data, true);
foreach ($fare_data as $fare) {
$fares[] = new \App\Models\Fare($fare);
}
$fares = collect($fares);
$this->aircraft->subfleet->fares = collect($fares);
}
} catch (\Exception $e) {
// Invalid fare data
}
$data['subfleet'] = new BidSubfleet($this->aircraft->subfleet, $this->aircraft, $fares);
$data['subfleet'] = new Subfleet($this->aircraft->subfleet);
return $data;
}

View File

@@ -3,7 +3,8 @@
namespace App\Listeners;
use App\Contracts\Listener;
use App\Events\PirepFiled;
use App\Events\PirepAccepted;
use App\Events\PirepRejected;
use App\Services\BidService;
/**
@@ -12,7 +13,8 @@ use App\Services\BidService;
class BidEventHandler extends Listener
{
public static $callbacks = [
PirepFiled::class => 'onPirepFiled',
PirepAccepted::class => 'onPirepAccept',
PirepRejected::class => 'onPirepReject',
];
private $bidSvc;
@@ -23,15 +25,29 @@ class BidEventHandler extends Listener
}
/**
* When a PIREP is filed, remove any bids
* When a PIREP is accepted, remove any bids
*
* @param PirepFiled $event
* @param PirepAccepted $event
*
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
* @throws \Exception
*/
public function onPirepFiled(PirepFiled $event): void
public function onPirepAccept(PirepAccepted $event): void
{
$this->bidSvc->removeBidForPirep($event->pirep);
}
/**
* When a PIREP is accepted, remove any bids
*
* @param PirepRejected $event
*
* @throws \UnexpectedValueException
* @throws \InvalidArgumentException
* @throws \Exception
*/
public function onPirepReject(PirepRejected $event): void
{
$this->bidSvc->removeBidForPirep($event->pirep);
}

View File

@@ -1,29 +0,0 @@
<?php
namespace App\Listeners;
use App\Contracts\Listener;
use App\Events\PirepPrefiled;
/**
* Look for and run any of the award classes. Don't modify this.
* See the documentation on creating awards:
*
* @url http://docs.phpvms.net/customizing/awards
*/
class PirepEventsHandler extends Listener
{
/** The events and the callback */
public static $callbacks = [
PirepPrefiled::class => 'onPirepPrefile',
];
/**
* Called when a PIREP is prefiled
*
* @param PirepPrefiled $event
*/
public function onPirepPrefile(PirepPrefiled $event)
{
}
}

View File

@@ -24,7 +24,6 @@ use Carbon\Carbon;
* @property int status
* @property int state
* @property Carbon landing_time
* @property float fuel_onboard
*/
class Aircraft extends Model
{

View File

@@ -46,7 +46,6 @@ class Airport extends Model
'lon',
'hub',
'timezone',
'tz',
'ground_handling_cost',
'fuel_100ll_cost',
'fuel_jeta_cost',

View File

@@ -11,7 +11,6 @@ class UserState extends Enum
public const REJECTED = 2;
public const ON_LEAVE = 3;
public const SUSPENDED = 4;
public const DELETED = 5;
protected static $labels = [
self::PENDING => 'user.state.pending',
@@ -19,6 +18,5 @@ class UserState extends Enum
self::REJECTED => 'user.state.rejected',
self::ON_LEAVE => 'user.state.on_leave',
self::SUSPENDED => 'user.state.suspended',
self::DELETED => 'user.state.deleted',
];
}

View File

@@ -15,7 +15,6 @@ use Illuminate\Support\Collection;
* @property Airline airline
* @property int airline_id
* @property mixed flight_number
* @property mixed callsign
* @property mixed route_code
* @property int route_leg
* @property bool has_bid
@@ -61,7 +60,6 @@ class Flight extends Model
'id',
'airline_id',
'flight_number',
'callsign',
'route_code',
'route_leg',
'dpt_airport_id',
@@ -106,7 +104,6 @@ class Flight extends Model
public static $rules = [
'airline_id' => 'required|exists:airlines,id',
'flight_number' => 'required',
'callsign' => 'string|max:4|nullable',
'route_code' => 'nullable',
'route_leg' => 'nullable',
'dpt_airport_id' => 'required|exists:airports,id',

View File

@@ -186,7 +186,7 @@ class Journal extends Model
*/
public function getCurrentBalance()
{
return $this->getBalanceOn(Carbon::now('UTC'));
return $this->getBalanceOn(Carbon::now());
}
/**

View File

@@ -5,12 +5,6 @@ namespace App\Models;
use Laratrust\Models\LaratrustRole;
/**
* @property int id
* @property string name
* @property string display_name
* @property bool read_only
* @property bool disable_activity_checks
*
* @mixin \Illuminate\Database\Eloquent\Builder
*/
class Role extends LaratrustRole
@@ -20,12 +14,10 @@ class Role extends LaratrustRole
'name',
'display_name',
'read_only',
'disable_activity_checks',
];
protected $casts = [
'read_only' => 'boolean',
'disable_activity_checks' => 'boolean',
'read_only' => 'boolean',
];
/**

View File

@@ -49,7 +49,7 @@ class SimBrief extends Model
*
* @return \App\Models\SimBriefXML|null
*/
public function getXmlAttribute(): ?SimBriefXML
public function getXmlAttribute(): SimBriefXML
{
if (empty($this->attributes['ofp_xml'])) {
return null;

View File

@@ -38,8 +38,6 @@ use Laratrust\Traits\LaratrustUserTrait;
* @property string last_pirep_id
* @property Pirep last_pirep
* @property UserFieldValue[] fields
* @property Role[] roles
* @property Subfleet[] subfleets
*
* @mixin \Illuminate\Database\Eloquent\Builder
* @mixin \Illuminate\Notifications\Notifiable

View File

@@ -46,20 +46,14 @@ class EventHandler extends Listener
*
* @param \App\Contracts\Notification $notification
*/
protected function notifyAdmins(\App\Contracts\Notification $notification)
protected function notifyAdmins($notification)
{
$admin_users = User::whereRoleIs('admin')->get();
foreach ($admin_users as $user) {
if (empty($user->email)) {
continue;
}
try {
Notification::send([$user], $notification);
} catch (Exception $e) {
Log::emergency('Error emailing admin ('.$user->email.'). Error='.$e->getMessage());
}
try {
Notification::send($admin_users, $notification);
} catch (Exception $e) {
Log::emergency('Error emailing admins, malformed email='.$e->getMessage());
}
}
@@ -67,16 +61,12 @@ class EventHandler extends Listener
* @param User $user
* @param \App\Contracts\Notification $notification
*/
protected function notifyUser(User $user, \App\Contracts\Notification $notification)
protected function notifyUser($user, $notification)
{
if ($user->state === UserState::DELETED) {
return;
}
try {
$user->notify($notification);
} catch (Exception $e) {
Log::emergency('Error emailing user, '.$user->ident.'='.$user->email.', error='.$e->getMessage());
Log::emergency('Error emailing admins, malformed email='.$e->getMessage());
}
}
@@ -94,15 +84,17 @@ class EventHandler extends Listener
}
/** @var Collection $users */
$users = User::where($where)->where('state', '<>', UserState::DELETED)->get();
$users = User::where($where)->get();
if (empty($users) || $users->count() === 0) {
return;
}
Log::info('Sending notification to '.$users->count().' users');
foreach ($users as $user) {
$this->notifyUser($user, $notification);
try {
Notification::send($users, $notification);
} catch (Exception $e) {
Log::emergency('Error emailing admins, malformed email='.$e->getMessage());
}
}

View File

@@ -22,7 +22,7 @@ class NewsAdded extends Notification
$this->news = $news;
$this->setMailable(
$news->subject,
'notifications.mail.news.news',
'notifications.mail.news',
['news' => $news]
);
}

View File

@@ -3,7 +3,6 @@
namespace App\Providers;
use App\Services\ModuleService;
use App\Support\ThemeViewFinder;
use App\Support\Utils;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Schema;
@@ -24,14 +23,6 @@ class AppServiceProvider extends ServiceProvider
*/
public function register(): void
{
$this->app->singleton('view.finder', function ($app) {
return new ThemeViewFinder(
$app['files'],
$app['config']['view.paths'],
null
);
});
// Only load the IDE helper if it's included and enabled
if (config('app.debug') === true) {
/* @noinspection NestedPositiveIfStatementsInspection */

View File

@@ -9,7 +9,6 @@ use App\Listeners\AwardHandler;
use App\Listeners\BidEventHandler;
use App\Listeners\ExpenseListener;
use App\Listeners\FinanceEventHandler;
use App\Listeners\PirepEventsHandler;
use App\Listeners\UserStateListener;
use App\Notifications\EventHandler;
use Codedge\Updater\Events\UpdateAvailable;
@@ -46,6 +45,5 @@ class EventServiceProvider extends ServiceProvider
FinanceEventHandler::class,
EventHandler::class,
AwardHandler::class,
PirepEventsHandler::class,
];
}

View File

@@ -147,7 +147,7 @@ class JournalRepository extends Repository implements CacheableInterface
$journal->refresh();
if (!$date) {
$date = Carbon::now('UTC');
$date = Carbon::now();
}
$credit = $this->getCreditBalanceBetween($date, $journal);

View File

@@ -41,7 +41,7 @@ class SubfleetRepository extends Repository implements CacheableInterface
}
foreach ($items as $i) {
$retval[$i->id] = $i->name.' | '.$i->airline->icao;
$retval[$i->id] = $i->name;
}
return $retval;

View File

@@ -28,7 +28,6 @@ class VaCentralLookup extends AirportLookup
try {
$airport = $this->client->getAirport($icao);
$airport->location = $airport->city;
$airport->timezone = $airport->tz;
return $airport;
} catch (HttpException $e) {

View File

@@ -2,7 +2,7 @@
namespace App\Services;
use App\Contracts\AirportLookup;
use App\Contracts\AirportLookup as AirportLookupProvider;
use App\Contracts\Metar as MetarProvider;
use App\Contracts\Service;
use App\Exceptions\AirportNotFound;
@@ -23,7 +23,7 @@ class AirportService extends Service
private $metarProvider;
public function __construct(
AirportLookup $lookupProvider,
AirportLookupProvider $lookupProvider,
AirportRepository $airportRepo,
MetarProvider $metarProvider
) {

View File

@@ -47,26 +47,22 @@ class BidService extends Service
*/
public function findBidsForUser(User $user)
{
$with = [
$bids = Bid::with([
'flight',
'flight.fares',
'flight.simbrief' => function ($query) use ($user) {
$query->where('user_id', $user->id);
},
'flight.simbrief.aircraft',
'flight.simbrief.aircraft.subfleet',
'flight.subfleets',
'flight.subfleets.aircraft',
'flight.subfleets.fares',
];
$bids = Bid::with($with)->where(['user_id' => $user->id])->get();
])
->where(['user_id' => $user->id])->get();
foreach ($bids as $bid) {
// if (empty($bid->flight->simbrief)) {
$bid->flight = $this->flightSvc->filterSubfleets($user, $bid->flight);
$bid->flight = $this->fareSvc->getReconciledFaresForFlight($bid->flight);
// }
}
return $bids;
@@ -169,6 +165,10 @@ class BidService extends Service
*/
public function removeBidForPirep(Pirep $pirep)
{
if (!setting('pireps.remove_bid_on_accept')) {
return;
}
$flight = $pirep->flight;
if (!$flight) {
return;

View File

@@ -152,13 +152,6 @@ class PirepFinanceService extends Service
public function payFuelCosts(Pirep $pirep): void
{
$ap = $pirep->dpt_airport;
// Get Airport Fuel Cost or revert back to settings
if (empty($ap->fuel_jeta_cost)) {
$fuel_cost = setting('airports.default_jet_a_fuel_cost');
} else {
$fuel_cost = $ap->fuel_jeta_cost;
}
if (setting('pireps.advanced_fuel', false)) {
$ac = $pirep->aircraft;
// Reading second row by skip(1) to reach the previous accepted pirep. Current pirep is at the first row
@@ -180,15 +173,15 @@ class PirepFinanceService extends Service
$fuel_amount = $pirep->fuel_used;
}
$debit = Money::createFromAmount($fuel_amount * $fuel_cost);
Log::info('Finance: Fuel cost, (fuel='.$fuel_amount.', cost='.$fuel_cost.') D='
$debit = Money::createFromAmount($fuel_amount * $ap->fuel_jeta_cost);
Log::info('Finance: Fuel cost, (fuel='.$fuel_amount.', cost='.$ap->fuel_jeta_cost.') D='
.$debit->getAmount());
$this->financeSvc->debitFromJournal(
$pirep->airline->journal,
$debit,
$pirep,
'Fuel Cost ('.$fuel_cost.'/'.config('phpvms.internal_units.fuel').')',
'Fuel Cost ('.$ap->fuel_jeta_cost.'/'.config('phpvms.internal_units.fuel').')',
'Fuel',
'fuel'
);
@@ -422,26 +415,14 @@ class PirepFinanceService extends Service
*/
public function payGroundHandlingForPirep(Pirep $pirep): void
{
$ground_handling_cost = $this->getGroundHandlingCost($pirep, $pirep->dpt_airport);
Log::info('Finance: PIREP: '.$pirep->id.'; dpt ground handling: '.$ground_handling_cost);
$ground_handling_cost = $this->getGroundHandlingCost($pirep);
Log::info('Finance: PIREP: '.$pirep->id.'; ground handling: '.$ground_handling_cost);
$this->financeSvc->debitFromJournal(
$pirep->airline->journal,
Money::createFromAmount($ground_handling_cost),
$pirep,
'Ground Handling (Departure)',
'Ground Handling',
'ground_handling'
);
$ground_handling_cost = $this->getGroundHandlingCost($pirep, $pirep->arr_airport);
Log::info('Finance: PIREP: '.$pirep->id.'; arr ground handling: '.$ground_handling_cost);
$this->financeSvc->debitFromJournal(
$pirep->airline->journal,
Money::createFromAmount($ground_handling_cost),
$pirep,
'Ground Handling (Arrival)',
'Ground Handling',
'ground_handling'
);
@@ -544,26 +525,23 @@ class PirepFinanceService extends Service
* Return the costs for the ground handling, with the multiplier
* being applied from the subfleet
*
* @param Pirep $pirep
* @param Airport $airport
* @param Pirep $pirep
*
* @return float|null
*/
public function getGroundHandlingCost(Pirep $pirep, Airport $airport): ?float
public function getGroundHandlingCost(Pirep $pirep)
{
if (empty($airport->ground_handling_cost)) {
$gh_cost = setting('airports.default_ground_handling_cost');
} else {
$gh_cost = $airport->ground_handling_cost;
if (filled($pirep->aircraft->subfleet->ground_handling_multiplier)) {
// force into percent mode
$multiplier = $pirep->aircraft->subfleet->ground_handling_multiplier.'%';
return Math::applyAmountOrPercent(
$pirep->arr_airport->ground_handling_cost,
$multiplier
);
}
if (!filled($pirep->aircraft->subfleet->ground_handling_multiplier)) {
return $gh_cost;
}
// force into percent mode
$multiplier = $pirep->aircraft->subfleet->ground_handling_multiplier.'%';
return Math::applyAmountOrPercent($gh_cost, $multiplier);
return $pirep->arr_airport->ground_handling_cost;
}
/**

View File

@@ -135,9 +135,6 @@ class FlightService extends Service
*/
public function filterSubfleets(User $user, Flight $flight)
{
// Eager load some of the relationships needed
//$flight->load(['flight.subfleets', 'flight.subfleets.aircraft', 'flight.subfleets.fares']);
/** @var \Illuminate\Support\Collection $subfleets */
$subfleets = $flight->subfleets;

View File

@@ -209,7 +209,7 @@ class FlightImporter extends ImportExport
$count = 0;
$subfleets = $this->parseMultiColumnValues($col);
foreach ($subfleets as $subfleet_type) {
$subfleet = Subfleet::firstOrCreate(
$subfleet = Subfleet::updateOrCreate(
['type' => $subfleet_type],
['name' => $subfleet_type]
);

View File

@@ -31,12 +31,12 @@ class AirportImporter extends BaseImporter
$ground_handling_cost = (float) $row->ground_handling_cost;
$fuel_jetA_cost = (float) $row->fuel_jeta_cost;
if (empty($ground_handling_cost)) {
$ground_handling_cost = 0;
if ($ground_handling_cost === null && $ground_handling_cost !== 0) {
$ground_handling_cost = (float) setting('general.default_ground_handling_cost');
}
if (empty($fuel_jetA_cost)) {
$fuel_jetA_cost = 0;
if ($fuel_jetA_cost === null && $fuel_jetA_cost !== 0) {
$fuel_jetA_cost = (float) setting('general.default_jetA_fuel_cost');
}
$attrs = [

View File

@@ -15,49 +15,34 @@ use Symfony\Component\HttpFoundation\File\Exception\FileException;
class ConfigService extends Service
{
protected static $defaultValues = [
'APP_ENV' => 'prod',
'APP_KEY' => '',
'APP_DEBUG' => true,
'APP_LOCALE' => 'en',
'DEBUG_TOOLBAR' => false,
'SITE_NAME' => '',
'APP_URL' => 'http://phpvms.test',
'DB_CONNECTION' => '',
'DB_HOST' => '',
'DB_PORT' => 3306,
'DB_DATABASE' => '',
'DB_USERNAME' => '',
'DB_PASSWORD' => '',
'DB_PREFIX' => '',
'DB_EMULATE_PREPARES' => false,
'CACHE_DRIVER' => 'array',
'CACHE_PREFIX' => '',
'MAIL_DRIVER' => 'mail',
'MAIL_HOST' => '',
'MAIL_PORT' => 587,
'MAIL_ENCRYPTION' => '',
'MAIL_USERNAME' => '',
'MAIL_PASSWORD' => '',
'MAIL_FROM_NAME' => 'phpVMS Admin',
'MAIL_FROM_ADDRESS' => 'no-reply@phpvms.net',
];
/**
* Create the .env file. This is called by an initial install
* Create the .env file
*
* @param $attrs
*
* @throws FileException
* @throws \Symfony\Component\HttpFoundation\File\Exception\FileException
*
* @return bool
*/
public function createConfigFiles($attrs): bool
{
$opts = array_merge(static::$defaultValues, $attrs);
if (empty($opts['APP_KEY'])) {
$opts['APP_KEY'] = $this->createAppKey();
}
$opts = [
'APP_ENV' => 'dev',
'APP_KEY' => $this->createAppKey(),
'SITE_NAME' => '',
'SITE_URL' => 'http://phpvms.test',
'CACHE_PREFIX' => '',
'DB_CONN' => '',
'DB_HOST' => '',
'DB_PORT' => 3306,
'DB_NAME' => '',
'DB_USER' => '',
'DB_PASS' => '',
'DB_PREFIX' => '',
'DB_EMULATE_PREPARES' => false,
];
$opts = array_merge($opts, $attrs);
$opts = $this->determinePdoOptions($opts);
$opts = $this->configCacheDriver($opts);
@@ -68,61 +53,6 @@ class ConfigService extends Service
return true;
}
/**
* Rewrite the config files - this means mapping the values that are currently
* loaded in the config and rewriting them into the env.php file, and then renaming
* the config.php files to config.bak.php
*
* This is called from the migrations which removes the old config.php file
*/
public function rewriteConfigFiles()
{
/*$cfg_file = App::environmentPath().'/config.php';
if (!file_exists($cfg_file)) {
Log::info('Main config.php file is missing, migration already completed');
return;
}*/
$db_opts = config('database.connections.mysql.options');
$emulate_prepares = $db_opts[PDO::ATTR_EMULATE_PREPARES] ? 'true' : 'false';
$opts = array_merge(static::$defaultValues, [
'APP_ENV' => config('app.env'),
'APP_KEY' => config('app.key'),
'APP_DEBUG' => config('app.debug') ? 'true' : 'false',
'APP_LOCALE' => config('app.locale'),
'DEBUG_TOOLBAR' => config('app.debug_toolbar') ? 'true' : 'false',
'SITE_NAME' => config('app.name'),
'APP_URL' => config('app.url'),
'DB_CONNECTION' => config('database.default'),
'DB_HOST' => config('database.connections.mysql.host'),
'DB_PORT' => config('database.connections.mysql.port'),
'DB_DATABASE' => config('database.connections.mysql.database'),
'DB_USERNAME' => config('database.connections.mysql.username'),
'DB_PASSWORD' => config('database.connections.mysql.password'),
'DB_PREFIX' => config('database.connections.mysql.prefix'),
'DB_EMULATE_PREPARES' => $emulate_prepares,
'CACHE_DRIVER' => config('cache.default'),
'CACHE_PREFIX' => config('cache.prefix'),
'MAIL_DRIVER' => config('mail.default'),
'MAIL_HOST' => config('mail.mailers.smtp.host'),
'MAIL_PORT' => config('mail.mailers.smtp.port'),
'MAIL_ENCRYPTION' => config('mail.mailers.smtp.encryption'),
'MAIL_USERNAME' => config('mail.mailers.smtp.username'),
'MAIL_PASSWORD' => config('mail.mailers.smtp.password'),
'MAIL_FROM_NAME' => config('mail.from.name'),
'MAIL_FROM_ADDRESS' => config('mail.from.address'),
]);
$this->writeConfigFiles($opts);
// Rename the old config file
$cfg_file = App::environmentPath().'/config.php';
if (file_exists($cfg_file)) {
rename($cfg_file, App::environmentPath().'/config.bak.php');
}
}
/**
* Update the environment file and update certain keys/values
*
@@ -167,7 +97,7 @@ class ConfigService extends Service
*/
protected function createAppKey(): string
{
return 'base64:'.base64_encode(Encrypter::generateKey(config('app.cipher')));
return base64_encode(Encrypter::generateKey(config('app.cipher')));
}
/**
@@ -180,14 +110,14 @@ class ConfigService extends Service
*/
protected function determinePdoOptions($opts)
{
if ($opts['DB_CONNECTION'] !== 'mysql') {
if ($opts['DB_CONN'] !== 'mysql') {
return $opts;
}
$dsn = "mysql:host=$opts[DB_HOST];port=$opts[DB_PORT];";
Log::info('Connection string: '.$dsn);
$conn = new PDO($dsn, $opts['DB_USERNAME'], $opts['DB_PASSWORD']);
$conn = new PDO($dsn, $opts['DB_USER'], $opts['DB_PASS']);
$version = strtolower($conn->getAttribute(PDO::ATTR_SERVER_VERSION));
Log::info('Detected DB Version: '.$version);
@@ -212,8 +142,7 @@ class ConfigService extends Service
protected function configCacheDriver($opts)
{
// Set the cache prefix
$prefix = substr(str_slug($opts['SITE_NAME'], '_'), 0, 8);
$opts['CACHE_PREFIX'] = strtolower(uniqid($prefix.'_'));
$opts['CACHE_PREFIX'] = uniqid($opts['SITE_NAME'].'_');
// Figure out what cache driver to initially use, depending on
// what is installed. It won't detect redis or anything, though
@@ -242,7 +171,7 @@ class ConfigService extends Service
{
// If we're setting up a database, then also setup
// the default queue driver to use the database
if ($opts['DB_CONNECTION'] === 'mysql' || $opts['DB_CONNECTION'] === 'postgres') {
if ($opts['DB_CONN'] === 'mysql' || $opts['DB_CONN'] === 'postgres') {
$opts['QUEUE_DRIVER'] = 'database';
} else {
$opts['QUEUE_DRIVER'] = 'sync';
@@ -281,13 +210,14 @@ class ConfigService extends Service
*
* @param $opts
*
* @throws FileException
* @throws \Symfony\Component\HttpFoundation\File\Exception\FileException
*/
protected function writeConfigFiles($opts)
{
Stub::setBasePath(resource_path('/stubs/installer'));
$env_file = App::environmentFilePath();
if (file_exists($env_file) && !is_writable($env_file)) {
Log::error('Permissions on existing env.php is not writable');
@@ -309,7 +239,7 @@ class ConfigService extends Service
* Next write out the config file. If there's an error here,
* then throw an exception but delete the env file first
*/
/*try {
try {
$stub = new Stub('/config.stub', $opts);
$stub->render();
$stub->saveTo(App::environmentPath(), 'config.php');
@@ -317,6 +247,6 @@ class ConfigService extends Service
unlink(App::environmentPath().'/'.App::environmentFile());
throw new FileException('Couldn\'t write config.php. ('.$e.')');
}*/
}
}
}

View File

@@ -90,10 +90,10 @@ class SeederService extends Service
$data = file_get_contents(database_path('/seeds/modules.yml'));
$yml = Yaml::parse($data);
foreach ($yml as $module) {
$module['updated_at'] = Carbon::now('UTC');
$module['updated_at'] = Carbon::now();
$count = DB::table('modules')->where('name', $module['name'])->count('name');
if ($count === 0) {
$module['created_at'] = Carbon::now('UTC');
$module['created_at'] = Carbon::now();
DB::table('modules')->insert($module);
} else {
DB::table('modules')

View File

@@ -6,7 +6,6 @@ use App\Contracts\Service;
use App\Events\PirepAccepted;
use App\Events\PirepCancelled;
use App\Events\PirepFiled;
use App\Events\PirepPrefiled;
use App\Events\PirepRejected;
use App\Events\UserStatsChanged;
use App\Exceptions\AircraftInvalid;
@@ -147,14 +146,11 @@ class PirepService extends Service
$dupe_pirep = $this->findDuplicate($pirep);
if ($dupe_pirep !== false) {
$pirep = $dupe_pirep;
Log::info('Found duplicate PIREP, id='.$dupe_pirep->id);
if ($pirep->cancelled) {
throw new \App\Exceptions\PirepCancelled($pirep);
}
}
event(new PirepPrefiled($pirep));
$pirep->save();
return $pirep;
@@ -291,14 +287,12 @@ class PirepService extends Service
public function findDuplicate(Pirep $pirep)
{
$minutes = setting('pireps.duplicate_check_time', 10);
$time_limit = Carbon::now('UTC')->subMinutes($minutes)->toDateTimeString();
$time_limit = Carbon::now()->subMinutes($minutes)->toDateTimeString();
$where = [
'user_id' => $pirep->user_id,
'airline_id' => $pirep->airline_id,
'flight_number' => $pirep->flight_number,
'dpt_airport_id' => $pirep->dpt_airport_id,
'arr_airport_id' => $pirep->arr_airport_id,
'user_id' => $pirep->user_id,
'airline_id' => $pirep->airline_id,
'flight_number' => $pirep->flight_number,
];
if (filled($pirep->route_code)) {

View File

@@ -9,14 +9,12 @@ use App\Events\UserStatsChanged;
use App\Exceptions\PilotIdNotFound;
use App\Exceptions\UserPilotIdExists;
use App\Models\Airline;
use App\Models\Bid;
use App\Models\Enums\PirepState;
use App\Models\Enums\UserState;
use App\Models\Pirep;
use App\Models\Rank;
use App\Models\Role;
use App\Models\User;
use App\Models\UserFieldValue;
use App\Repositories\AircraftRepository;
use App\Repositories\AirlineRepository;
use App\Repositories\SubfleetRepository;
@@ -25,7 +23,6 @@ use App\Support\Units\Time;
use App\Support\Utils;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use function is_array;
@@ -63,23 +60,14 @@ class UserService extends Service
*
* @param $user_id
*
* @return User|null
* @return User
*/
public function getUser($user_id): ?User
public function getUser($user_id): User
{
/** @var User $user */
$user = $this->userRepo
->with(['airline', 'bids', 'rank'])
->find($user_id);
if (empty($user)) {
return null;
}
if ($user->state === UserState::DELETED) {
return null;
}
// Load the proper subfleets to the rank
$user->rank->subfleets = $this->getAllowableSubfleets($user);
$user->subfleets = $user->rank->subfleets;
@@ -129,33 +117,6 @@ class UserService extends Service
return $user;
}
/**
* Remove the user. But don't actually delete them - set the name to deleted, email to
* something random
*
* @param User $user
*
* @throws \Exception
*/
public function removeUser(User $user)
{
$user->name = 'Deleted User';
$user->email = Utils::generateApiKey().'@deleted-user.com';
$user->api_key = Utils::generateApiKey();
$user->password = Hash::make(Utils::generateApiKey());
$user->state = UserState::DELETED;
$user->save();
// Detach all roles from this user
$user->detachRoles($user->roles);
// Delete any fields which might have personal information
UserFieldValue::where('user_id', $user->id)->delete();
// Remove any bids
Bid::where('user_id', $user->id)->delete();
}
/**
* Add a user to a given role
*
@@ -164,7 +125,7 @@ class UserService extends Service
*
* @return User
*/
public function addUserToRole(User $user, string $roleName): User
public function addUserToRole(User $user, $roleName): User
{
$role = Role::where(['name' => $roleName])->first();
$user->attachRole($role);
@@ -321,24 +282,9 @@ class UserService extends Service
}
// See if the difference is larger than what the setting calls for
if ($date->diffInDays($diff_date) <= $leave_days) {
continue;
if ($date->diffInDays($diff_date) > $leave_days) {
$return_users[] = $user;
}
$skip = false;
// If any role for this user has the "disable_activity_check" feature activated, skip this user
foreach ($user->roles()->get() as $role) {
/** @var Role $role */
if ($role->disable_activity_checks) {
$skip = true;
break;
}
}
if ($skip) {
continue;
}
$return_users[] = $user;
}
return $return_users;

View File

@@ -879,8 +879,8 @@ class Metar implements \ArrayAccess
$this->set_result_value('cavok', true);
$this->method += 4; // can skip the next 4 methods: visibility_min, runway_vr, present_weather, clouds
}
} elseif ($found[1] === '////') {
} // information not available
} /*elseif ($found[1] === '////') {
}*/ // information not available
else {
$prefix = '';
@@ -994,10 +994,8 @@ class Metar implements \ArrayAccess
}
$unit = 'meter';
$report_unit = 'm';
if (isset($found[6]) && $found[6] === 'FT') {
$unit = 'feet';
$report_unit = 'nmi';
}
$observed = [
@@ -1032,15 +1030,15 @@ class Metar implements \ArrayAccess
if (!empty($observed['runway'])) {
$report = [];
if ($observed['variable'] !== null) {
$report[] = $observed['variable'][$report_unit].$report_unit;
$report[] = $observed['variable']['nmi'].' nmi';
} elseif ($observed['interval_min'] !== null && $observed['interval_max'] !== null) {
if (isset(static::$rvr_prefix_codes[$observed['variable_prefix']])) {
$report[] = 'varying from a min. of '.$observed['interval_min'][$report_unit].$report_unit.' until a max. of '.
$report[] = 'varying from a min. of '.$observed['interval_min']['nmi'].' nmi until a max. of '.
static::$rvr_prefix_codes[$observed['variable_prefix']].' that '.
$observed['interval_max'][$report_unit].' '.$report_unit;
$observed['interval_max']['nmi'].' nmi';
} else {
$report[] = 'varying from a min. of '.$observed['interval_min'][$report_unit].$report_unit.' until a max. of '.
$observed['interval_max'][$report_unit].$report_unit;
$report[] = 'varying from a min. of '.$observed['interval_min']['nmi'].' nmi until a max. of '.
$observed['interval_max']['nmi'].' nmi';
}
}

View File

@@ -1,89 +0,0 @@
<?php
namespace App\Support;
use Igaster\LaravelTheme\Facades\Theme;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Arr;
class ThemeViewFinder extends \Igaster\LaravelTheme\themeViewFinder
{
public function __construct(Filesystem $files, array $paths, array $extensions = null)
{
//$this->themeEngine = \App::make('igaster.themes');
parent::__construct($files, $paths, $extensions);
}
/*
* Override findNamespacedView() to add "Theme/vendor/..." paths
*
* @param string $name
* @return string
*/
protected function findNamespacedView($name)
{
// Extract the $view and the $namespace parts
list($namespace, $view) = $this->parseNamespaceSegments($name);
$paths = $this->addThemeNamespacePaths($namespace);
// Find and return the view
return $this->findInPaths($view, $paths);
}
public function addThemeNamespacePaths($namespace)
{
// This rule will remap all paths starting with $key to $value.
// For exapmle paths starting with 'resources/views/vendor' (relative to base_path())
// will be maped to path 'THEMENAME/vendor' (relative to current theme views-path)
$pathsMap = [
// 'resources/views/vendor/mail' => 'mail',
'resources/views/vendor' => 'vendor',
'resources/views/modules' => 'modules',
];
// Does $namespace exists?
if (!isset($this->hints[$namespace])) {
return [];
}
// Get the paths registered to the $namespace
$paths = $this->hints[$namespace];
// Search $paths array and remap paths that start with a key of $pathsMap array.
// replace with the value of $pathsMap array
$themeSubPaths = [];
foreach ($paths as $path) {
$pathRelativeToApp = substr($path, strlen(base_path()) + 1);
$pathRelativeToApp = str_replace('\\', '/', $pathRelativeToApp);
// Ignore paths in composer installed packages (paths inside vendor folder)
if (strpos($pathRelativeToApp, 'vendor') !== 0) {
// Remap paths definded int $pathsMap array
foreach ($pathsMap as $key => $value) {
if (strpos($pathRelativeToApp, $key) === 0) {
$pathRelativeToApp = str_replace($key, $value, $pathRelativeToApp);
break;
}
}
$themeSubPaths[] = $pathRelativeToApp;
}
}
// Prepend current theme's view path to the remaped paths
$newPaths = [];
$searchPaths = array_diff($this->paths, Theme::getLaravelViewPaths());
foreach ($searchPaths as $path1) {
foreach ($themeSubPaths as $path2) {
$newPaths[] = $path1.'/'.$path2;
}
}
// Add new paths in the beggin of the search paths array
foreach (array_reverse($newPaths) as $path) {
if (!in_array($path, $paths, true)) {
$paths = Arr::prepend($paths, $path);
}
}
return $paths;
}
}

View File

@@ -8,7 +8,6 @@ use App\Repositories\PirepRepository;
/**
* Show the latest PIREPs in a view
* sorted nicely by their submit time
*/
class LatestPireps extends Widget
{
@@ -29,7 +28,7 @@ class LatestPireps extends Widget
PirepState::CANCELLED,
PirepState::DRAFT,
PirepState::IN_PROGRESS,
], 'submitted_at', 'desc')
], 'created_at', 'desc')
->recent($this->config['count']);
return view('widgets.latest_pireps', [

View File

@@ -15,7 +15,7 @@ return [
'debug' => env('APP_DEBUG', true),
'url' => env('APP_URL', ''),
'version' => '7.0.0',
'debug_toolbar' => env('DEBUG_TOOLBAR', false),
'debug_toolbar' => false,
'locale' => env('APP_LOCALE', 'en'),
'fallback_locale' => 'en',

View File

@@ -7,17 +7,17 @@
* Don't edit this file directly, add the section to your config.php
*/
return [
'enabled' => env('CAPTCHA_ENABLED', false),
'sitekey' => env('CAPTCHA_SITEKEY', ''),
'secret' => env('CAPTCHA_SECRET', ''),
'enabled' => false,
'sitekey' => '',
'secret' => '',
// Attributes can be found here:
// https://developers.google.com/recaptcha/docs/display#render_param
'attributes' => [
'data-theme' => env('CAPTCHA_DATATHEME', 'light'),
'data-theme' => 'light',
],
'options' => [
'timeout' => env('CAPTCHA_TIMEOUT', '2.0'),
'timeout' => 2.0,
],
];

View File

@@ -5,5 +5,5 @@
return [
'url' => 'https://www.gravatar.com/avatar/',
'default' => env('GRAVATAR_DEFAULT_AVATAR', 'https://en.gravatar.com/userimage/12856995/aa6c0527a723abfd5fb9e246f0ff8af4.png'),
'default' => 'https://en.gravatar.com/userimage/12856995/aa6c0527a723abfd5fb9e246f0ff8af4.png',
];

View File

@@ -1,7 +1,5 @@
<?php
use App\Console\Logger;
return [
/*
|--------------------------------------------------------------------------
@@ -46,18 +44,18 @@ return [
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'level' => 'debug',
'days' => 3,
],
'cron_rotating' => [
'driver' => 'daily',
'path' => storage_path('logs/cron.log'),
'level' => env('LOG_LEVEL', 'debug'),
'level' => 'debug',
'days' => 3,
],
'slack' => [
@@ -69,15 +67,15 @@ return [
],
'stdout' => [
'driver' => 'custom',
'via' => Logger::class,
'via' => \App\Console\Logger::class,
],
'syslog' => [
'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'),
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'),
'level' => 'debug',
],
],
];

View File

@@ -1,7 +1,5 @@
<?php
use App\Models\User;
return [
/*
|--------------------------------------------------------------------------
@@ -31,7 +29,7 @@ return [
],
'stripe' => [
'model' => User::class,
'model' => App\User::class,
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
],

4558
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -27,7 +27,7 @@
"jquery": "^3.5.1",
"jquery-pjax": "~2.0",
"js-yaml": "^3.14.0",
"laravel-mix": "^5.0.8",
"laravel-mix": "^5.0.7",
"leaflet": "^1.3.4",
"leaflet-ajax": "2.1.0",
"leaflet-providers": "1.0.*",

View File

@@ -6,6 +6,7 @@
}
.map-info-box {
display: none;
position: absolute;
bottom: 0;
padding: 20px;

View File

@@ -10,7 +10,6 @@ RUN ln -sf /dev/stderr /var/log/fpm-error.log
RUN docker-php-ext-install \
bcmath \
calendar \
pdo_mysql \
gmp \
intl \
opcache \
pdo_mysql
opcache

View File

@@ -5,7 +5,6 @@ return [
'flighttime' => 'Flight Time',
'flighttype' => 'Flight Type',
'flighthours' => 'Flight Hours',
'callsign' => 'Callsign',
'route' => 'Route',
'mybid' => 'My Bids',
'search' => 'Search',

View File

@@ -8,6 +8,5 @@ return [
'rejected' => 'Rejected',
'on_leave' => 'On Leave',
'suspended' => 'Suspended',
'deleted' => 'Deleted',
],
];

View File

@@ -5,7 +5,6 @@ return [
'flighttime' => 'Tiempo de vuelo',
'flighttype' => 'Tipo de vuelo',
'flighthours' => 'Horas de vuelo',
'callsign' => 'Indicativo',
'route' => 'Ruta',
'mybid' => 'Mis reservas',
'search' => 'Buscar',

View File

@@ -8,6 +8,5 @@ return [
'rejected' => 'Rechazado',
'on_leave' => 'De vacaciones',
'suspended' => 'Suspendido',
'deleted' => 'Borrar',
],
];

View File

@@ -5,7 +5,6 @@ return [
'flighttime' => 'Tempo di Volo',
'flighttype' => 'Tipo di Volo',
'flighthours' => 'Ore di Volo',
'callsign' => 'Nominativo',
'route' => 'Rotta',
'mybid' => 'Mie Prenotazioni',
'addremovebid' => 'Aggiungi/Rimuovi Prenotazione',

View File

@@ -8,6 +8,5 @@ return [
'rejected' => 'Rifiutato',
'on_leave' => 'In Ferie',
'suspended' => 'Sospeso',
'deleted' => 'Cancellato',
],
];

View File

@@ -5,7 +5,6 @@ return [
'flighttime' => 'Tempo do Voo',
'flighttype' => 'Tipo de Voo',
'flighthours' => 'Horas de Voo',
'callsign' => 'Indicativo',
'route' => 'Rota',
'mybid' => 'Minhas Reservas',
'search' => 'Procurar',

View File

@@ -8,6 +8,5 @@ return [
'rejected' => 'Rejeitado',
'on_leave' => 'Em licença',
'suspended' => 'Suspensa',
'deleted' => 'Excluído',
],
];

View File

@@ -10,7 +10,7 @@ return [
// Overrides config/app.php
'app' => [
'name' => '$SITE_NAME$',
'url' => '$APP_URL$',
'url' => '$SITE_URL$',
// When live, 'env' should be 'prod'
'env' => 'prod',
@@ -60,9 +60,9 @@ return [
'mysql' => [
'host' => env('DB_HOST', '$DB_HOST$'),
'port' => $DB_PORT$,
'database' => '$DB_DATABASE$',
'username' => '$DB_USERNAME$',
'password' => '$DB_PASSWORD$',
'database' => '$DB_NAME$',
'username' => '$DB_USER$',
'password' => '$DB_PASS$',
'prefix' => '$DB_PREFIX$',
'prefix_indexes' => true,
],

View File

@@ -1,50 +1,8 @@
#
# THIS FILE MUST BE KEPT SECRET! IT IS BLOCKED IN THE HTACCESS FILE
# HOWEVER, THIS DIRECTORY SHOULDN'T BE EXPOSED TO THE PUBLIC AT ALL
# SEE THE DOCS FOR PROPER (SECURE) INSTALLATION:
# https://docs.phpvms.net/installation/uploading
#
# This is the place to edit your configuration. To change a config that's
# not present here, you need to either edit the file/config in the config
# folder, or change it to read the value from the environment. Something like:
#
# 'some_key' = env('ENVIRONMENT_VARIABLE_KEY_ADDED_BELOW', 'default value')
#
# Various other settings in the configs also read from some environment variables
# by default. You can override those here
APP_KEY='$APP_KEY$'
APP_NAME='$SITE_NAME$'
SITE_NAME='$SITE_NAME$'
APP_URL='$APP_URL$'
APP_ENV=$APP_ENV$
APP_LOCALE=$APP_LOCALE$
LOG_LEVEL=debug
APP_DEBUG=$APP_DEBUG$
DEBUG_TOOLBAR=$DEBUG_TOOLBAR$
# DATABASE SETTINGS
DB_CONNECTION=$DB_CONNECTION$
DB_HOST='$DB_HOST$'
DB_PORT=$DB_PORT$
DB_DATABASE='$DB_DATABASE$'
DB_USERNAME='$DB_USERNAME$'
DB_PASSWORD='$DB_PASSWORD$'
DB_PREFIX='$DB_PREFIX$'
DB_EMULATE_PREPARES=$DB_EMULATE_PREPARES$
DB_SOCKET=
# CACHE SETTINGS
CACHE_DRIVER=$CACHE_DRIVER$
CACHE_PREFIX='$CACHE_PREFIX$'
# EMAIL SETTINGS
# Look at the available mail configs in config/mail.php
# Also refer to the Laravel docs here: https://laravel.com/docs/8.x/mail
MAIL_DRIVER=$MAIL_DRIVER$
MAIL_FROM_NAME='$MAIL_FROM_NAME$'
MAIL_FROM_ADDRESS='$MAIL_FROM_ADDRESS$'
MAIL_HOST=$MAIL_HOST$
MAIL_PORT=$MAIL_PORT$
MAIL_ENCRYPTION=$MAIL_ENCRYPTION$
MAIL_USERNAME=$MAIL_USERNAME$
MAIL_PASSWORD=$MAIL_PASSWORD$
APP_KEY=base64:$APP_KEY$

View File

@@ -60,7 +60,7 @@
</div>
<div class="row">
<div class="form-group col-sm-3">
<div class="form-group col-sm-6">
{{ Form::label('ground_handling_cost', 'Ground Handling Cost:') }}
{{ Form::number('ground_handling_cost', null, ['class' => 'form-control', 'step' => '0.01']) }}
<p class="text-danger">{{ $errors->first('ground_handling_cost') }}</p>
@@ -71,7 +71,7 @@
@endcomponent
</div>
<div class="form-group col-md-3">
<div class="form-group col-md-6">
{{ Form::label('fuel_jeta_cost', 'Jet A Fuel Cost:') }}
{{ Form::number('fuel_jeta_cost', null, ['class' => 'form-control', 'step' => '0.01']) }}
<p class="text-danger">{{ $errors->first('fuel_jeta_cost') }}</p>
@@ -81,26 +81,6 @@
@endcomponent
</div>
<div class="form-group col-md-3">
{{ Form::label('fuel_100ll_cost', '100LL Fuel Cost:') }}
{{ Form::number('fuel_100ll_cost', null, ['class' => 'form-control', 'step' => '0.01']) }}
<p class="text-danger">{{ $errors->first('fuel_100ll_cost') }}</p>
@component('admin.components.info')
This is the cost per {{ config('phpvms.internal_units.fuel') }}
@endcomponent
</div>
<div class="form-group col-md-3">
{{ Form::label('fuel_mogas_cost', 'MOGAS Fuel Cost:') }}
{{ Form::number('fuel_mogas_cost', null, ['class' => 'form-control', 'step' => '0.01']) }}
<p class="text-danger">{{ $errors->first('fuel_mogas_cost') }}</p>
@component('admin.components.info')
This is the cost per {{ config('phpvms.internal_units.fuel') }}
@endcomponent
</div>
</div>
<div class="row">

View File

@@ -7,8 +7,6 @@
<th>Hub</th>
<th style="text-align: center;">GH Cost</th>
<th style="text-align: center;">JetA</th>
<th style="text-align: center;">100LL</th>
<th style="text-align: center;">MOGAS</th>
<th></th>
</thead>
<tbody>
@@ -29,14 +27,6 @@
<a class="inline" href="#" data-pk="{{ $airport->id }}"
data-name="fuel_jeta_cost">{{ $airport->fuel_jeta_cost }}</a>
</td>
<td style="text-align: center;">
<a class="inline" href="#" data-pk="{{ $airport->id }}"
data-name="fuel_100ll_cost">{{ $airport->fuel_100ll_cost }}</a>
</td>
<td style="text-align: center;">
<a class="inline" href="#" data-pk="{{ $airport->id }}"
data-name="fuel_mogas_cost">{{ $airport->fuel_mogas_cost }}</a>
</td>
<td style="text-align: right;">
{{ Form::open(['route' => ['admin.airports.destroy', $airport->id], 'method' => 'delete']) }}
<a href="{{ route('admin.airports.edit', [$airport->id]) }}" class='btn btn-sm btn-success btn-icon'><i

View File

@@ -1,30 +1,26 @@
@foreach (session('flash_notification', collect()) as $message)
@if (is_string($message))
<div class="alert alert-error">{!! $message !!}</div>
@if ($message['overlay'])
@include('flash::modal', [
'modalClass' => 'flash-modal',
'title' => $message['title'],
'body' => $message['message']
])
@else
@if ($message['overlay'])
@include('flash::modal', [
'modalClass' => 'flash-modal',
'title' => $message['title'],
'body' => $message['message']
])
@else
<div class="alert
alert-{{ $message['level'] }}
{{ $message['important'] ? 'alert-important' : '' }}"
role="alert">
@if ($message['important'])
<button type="button"
class="close"
data-dismiss="alert"
aria-hidden="true"
>&times;
</button>
@endif
<div class="alert
alert-{{ $message['level'] }}
{{ $message['important'] ? 'alert-important' : '' }}"
role="alert">
@if ($message['important'])
<button type="button"
class="close"
data-dismiss="alert"
aria-hidden="true"
>&times;
</button>
@endif
{!! $message['message'] !!}
</div>
@endif
{!! $message['message'] !!}
</div>
@endif
@endforeach

View File

@@ -29,22 +29,15 @@
</div>
<!-- Callsign Field -->
<div class="form-group input-group-sm col-sm-2">
{{ Form::label('callsign', 'Callsign:') }}
{{ Form::text('callsign', null, ['class'=>'form-control', 'placeholder'=>'optional', 'maxlength' => 4]) }}
<p class="text-danger">{{ $errors->first('callsign') }}</p>
</div>
<!-- Flight Type Field -->
<div class="form-group col-sm-2">
<!-- Route Code Field -->
<div class="form-group col-sm-3">
{{ Form::label('level', 'Flight Type:') }}&nbsp;<span class="required">*</span>
{{ Form::select('flight_type', $flight_types, null, ['class' => 'form-control select2']) }}
<p class="text-danger">{{ $errors->first('flight_type') }}</p>
</div>
<!-- Flight Time Field -->
<div class="form-group col-sm-2">
<!-- Route Leg Field -->
<div class="form-group col-sm-3">
{{ Form::label('flight_time', 'Flight Time (hours & minutes)') }}
<div class="input-group input-group-sm mb3">

View File

@@ -13,7 +13,6 @@
<table class="table table-responsive" id="aircrafts-table">
@if(count($flight->subfleets))
<thead>
<th>Airline</th>
<th>Type</th>
<th>Name</th>
<th style="text-align: center;">Actions</th>
@@ -22,12 +21,6 @@
<tbody>
@foreach($flight->subfleets as $sf)
<tr>
<td>@if ($sf->airline->logo)
<img src="{{ $sf->airline->logo }}" style="max-width: 60px; width: 55%; height: auto;">
@else
&nbsp;{{ $sf->airline->icao }}
@endif
</td>
<td>{{ $sf->type }}</td>
<td>{{ $sf->name }}</td>
<td style="width: 10%; text-align: center;" class="form-inline">

View File

@@ -31,8 +31,7 @@
{{ Form::open(['url' => route('admin.pireps.destroy', [$pirep->id]),
'method' => 'delete',
'name' => 'delete_'.$pirep->id,
'id' => $pirep->id.'_delete',
'onclick' => "return confirm('Are you sure?')"
'id' => $pirep->id.'_delete'
]) }}
{{ Form::button('Delete', ['type' => 'submit', 'class' => 'btn btn-danger']) }}
{{ Form::close() }}
@@ -47,13 +46,5 @@
</form>
</td>
@endif
<td>
<form action="{{ route('frontend.pireps.show', [$pirep->id]) }}" target="_blank">
<button type="submit"
class='btn btn-success'>
<i class="fas fa-eye"></i>&nbsp;&nbsp; View Pirep
</button>
</form>
</td>
</tr>
</table>

View File

@@ -14,23 +14,6 @@
</div>
</div>
</div>
<div class="form-container">
<h6><i class="fas fa-check-square"></i>
Features
</h6>
<div class="form-container-body">
<div class="row">
<div class="form-group col-sm-12">
<div class="checkbox">
{{ Form::hidden('disable_activity_checks', 0) }}
{{ Form::checkbox('disable_activity_checks', 1) }}
{{ Form::label('disable_activity_checks', 'disable activity checks') }}
<p class="text-danger">{{ $errors->first('disable_activity_checks') }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Permissions Field -->

View File

@@ -1,27 +1,26 @@
@foreach (collect(session('flash_notification', collect()))->toArray() as $message)
@if (is_string($message))
<div class="alert alert-error">{!! $message !!}</div>
@if ($message['overlay'])
@include('flash::modal', [
'modalClass' => 'flash-modal',
'title' => $message['title'],
'body' => $message['message']
])
@else
@if ($message['overlay'])
@include('flash::modal', [
'modalClass' => 'flash-modal',
'title' => $message['title'],
'body' => $message['message']
])
@else
<div class="alert alert-{{ $message['level'] }}
{{ $message['important'] ? 'alert-important' : '' }}"
role="alert">
@if ($message['important'])
<button type="button"
class="close"
data-dismiss="alert"
aria-hidden="true">&times;</button>
@endif
<div class="alert
alert-{{ $message['level'] }}
{{ $message['important'] ? 'alert-important' : '' }}"
role="alert">
@if ($message['important'])
<button type="button"
class="close"
data-dismiss="alert"
aria-hidden="true"
>&times;
</button>
@endif
{!! $message['message'] !!}
</div>
@endif
{!! $message['message'] !!}
</div>
@endif
@endforeach

View File

@@ -43,18 +43,12 @@
</td>
</tr>
@endif
@if(filled($flight->route))
<tr>
<td>@lang('flights.route')</td>
<td>{{ $flight->route }}</td>
</tr>
@endif
@if(filled($flight->callsign))
<tr>
<td>@lang('flights.callsign')</td>
<td>{{ $flight->airline->icao }} {{ $flight->callsign }}</td>
</tr>
@endif
<tr>
<td>@lang('flights.route')</td>
<td>{{ $flight->route }}</td>
</tr>
@if(filled($flight->notes))
<tr>
<td>{{ trans_choice('common.note', 2) }}</td>

View File

@@ -12,9 +12,11 @@
<div class="col-md-12">
<select id="aircraftselection" class="form-control select2" onchange="checkacselection()">
<option value="ZZZZZ">Please Select An Aircraft</option>
@foreach($aircrafts as $ac)
<option value="{{ $ac->id }}">[{{ $ac->icao }}] {{ $ac->registration }} @if($ac->registration != $ac->name)'{{ $ac->name }}'@endif</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">

View File

@@ -143,11 +143,6 @@
<input type="hidden" name="fltnum" value="{{ $flight->flight_number }}">
@if(setting('simbrief.callsign', true))
<input type="hidden" name="callsign" value="{{ $user->ident }}">
@else
<input type="hidden" name="callsign" value="{{ $flight->airline->icao }}{{ $flight->callsign ?? $flight->flight_number }}">
@endif
@if(setting('simbrief.name_private', true))
<input type="hidden" name="cpt" value="{{ $user->name_private }}">
@endif
<input type="hidden" id="steh" name="steh" maxlength="2">
<input type="hidden" id="stem" name="stem" maxlength="2">

View File

@@ -51,20 +51,14 @@
])}}">{{$flight->arr_airport_id}}</a>)
@if($flight->arr_time), {{ $flight->arr_time }}@endif
<br/>
@if(filled($flight->callsign))
<span class="title">{{ strtoupper(__('flights.callsign')) }}&nbsp;</span>
{{ $flight->airline->icao }} {{ $flight->callsign }}
<br/>
@endif
@if($flight->distance)
<span class="title">{{ strtoupper(__('common.distance')) }}&nbsp;</span>
{{ $flight->distance }} {{ setting('units.distance') }}
<br/>
@endif
<br/>
@if($flight->level)
<span class="title">{{ strtoupper(__('flights.level')) }}&nbsp;</span>
{{ $flight->level }} {{ setting('units.altitude') }}
<br/>
@endif
</div>
<div class="col-sm-5">

View File

@@ -327,8 +327,7 @@ flight reports that have been filed. You've been warned!
'name' => 'submit',
'value' => 'Delete',
'class' => 'btn btn-warning',
'type' => 'submit',
'onclick' => "return confirm('Are you sure you want to delete this PIREP?')"])
'type' => 'submit'])
}}
@endif

View File

@@ -15,7 +15,7 @@
class="btn btn-outline-info">View SimBrief</a>
@endif
@if(!$pirep->read_only && $pirep->user_id === $user->id)
@if(!$pirep->read_only)
<div class="float-right" style="margin-bottom: 10px;">
<form method="get"
action="{{ route('frontend.pireps.edit', $pirep->id) }}"
@@ -131,33 +131,28 @@
<tr>
<td>@lang('pireps.filedroute')</td>
<td>{{ $pirep->route }}</td>
<td>
{{ $pirep->route }}
</td>
</tr>
<tr>
<td>{{ trans_choice('common.note', 2) }}</td>
<td>{{ $pirep->notes }}</td>
<td>
{{ $pirep->notes }}
</td>
</tr>
@if($pirep->score && $pirep->landing_rate)
<tr>
<td>Score</td>
<td>{{ $pirep->score }}</td>
</tr>
<tr>
<td>Landing Rate</td>
<td>{{ number_format($pirep->landing_rate) }}</td>
</tr>
@endif
<tr>
<td>@lang('pireps.filedon')</td>
<td>{{ show_datetime($pirep->created_at) }}</td>
<td>
{{ show_datetime($pirep->created_at) }}
</td>
</tr>
</table>
@if(count($pirep->fields) > 0)
@if(count($pirep->fields) > 0 || count($pirep->fares) > 0)
<div class="separator"></div>
@endif
@@ -219,7 +214,7 @@
<div class="col-12">
<table class="table table-hover table-condensed" id="users-table">
<tbody>
@foreach($pirep->acars_logs->sortBy('created_at') as $log)
@foreach($pirep->acars_logs as $log)
<tr>
<td nowrap="true">{{ show_datetime($log->created_at) }}</td>
<td>{{ $log->log }}</td>

View File

@@ -29,7 +29,7 @@
A couple of places (like the distance) use both to output the correct bindings.
--}}
<div id="map-info-box" class="map-info-box"
rv-show="pirep.id"
rv-show="pirep"
style="width: {{ $config['width'] }};">
<div style="float: left; width: 50%;">
<h3 style="margin: 0" id="map_flight_id">

View File

@@ -1,7 +1,11 @@
@component('mail::message')
# {{ $news->subject }}
{{ $news->body }}
$news->body
@component('mail::button', ['url' => route('frontend.pireps.show', [$pirep->id])])
View PIREP
@endcomponent
Thanks,<br>
{{ config('app.name') }}

View File

@@ -1,20 +1,19 @@
@foreach (collect(session('flash_notification', collect()))->toArray() as $message)
@if (is_string($message))
<div class="alert alert-error">{!! $message !!}</div>
@if (session()->has('flash_notification.message'))
@if (session()->has('flash_notification.overlay'))
@include('flash::modal', [
'modalClass' => 'flash-modal',
'title' => session('flash_notification.title'),
'body' => session('flash_notification.message')
])
@else
<div class="alert alert-{{ $message['level'] }}
{{ $message['important'] ? 'alert-important' : '' }}"
role="alert">
@if ($message['important'])
<button type="button"
class="close"
data-dismiss="alert"
aria-hidden="true">&times;</button>
<div class="alert
alert-{{ session('flash_notification.level') }}
{{ session()->has('flash_notification.important') ? 'alert-important' : '' }}">
@if(session()->has('flash_notification.important'))
<button type="button" class="close" data-dismiss="alert">&times;</button>
@endif
{!! $message['message'] !!}
{{ session('flash_notification.message') }}
</div>
@endif
@endforeach
{{ session()->forget('flash_notification') }}
@endif

Some files were not shown because too many files have changed in this diff Show More