Account for fuel in the finance calculations #313

This commit is contained in:
Nabeel Shahzad
2019-07-23 08:41:20 -04:00
parent ee1c8ee3fa
commit 62a10224a0
31 changed files with 246 additions and 89 deletions

View File

@@ -3,7 +3,6 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Console\Command; use App\Console\Command;
use App\Services\DatabaseService;
use DB; use DB;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;
@@ -15,12 +14,7 @@ class YamlExport extends Command
protected $signature = 'phpvms:yaml-export {tables*}'; protected $signature = 'phpvms:yaml-export {tables*}';
protected $description = 'YAML table export'; protected $description = 'YAML table export';
/** public function __construct()
* YamlExport constructor.
*
* @param DatabaseService $dbSvc
*/
public function __construct(DatabaseService $dbSvc)
{ {
parent::__construct(); parent::__construct();
} }

View File

@@ -48,8 +48,8 @@ $factory->define(App\Models\Airport::class, function (Faker $faker) {
'lon' => $faker->longitude, 'lon' => $faker->longitude,
'hub' => false, 'hub' => false,
'ground_handling_cost' => $faker->randomFloat(2, 0, 500), 'ground_handling_cost' => $faker->randomFloat(2, 0, 500),
'fuel_100ll_cost' => $faker->randomFloat(2, 0, 100), 'fuel_100ll_cost' => $faker->randomFloat(2, 1, 10),
'fuel_jeta_cost' => $faker->randomFloat(2, 0, 100), 'fuel_jeta_cost' => $faker->randomFloat(2, 1, 10),
'fuel_mogas_cost' => $faker->randomFloat(2, 0, 100), 'fuel_mogas_cost' => $faker->randomFloat(2, 1, 10),
]; ];
}); });

View File

@@ -22,7 +22,7 @@ $factory->define(App\Models\Flight::class, function (Faker $faker) {
'alt_airport_id' => function () { 'alt_airport_id' => function () {
return factory(App\Models\Airport::class)->create()->id; return factory(App\Models\Airport::class)->create()->id;
}, },
'distance' => $faker->numberBetween(0, 1000), 'distance' => $faker->numberBetween(1, 1000),
'route' => null, 'route' => null,
'level' => 0, 'level' => 0,
'dpt_time' => $faker->time(), 'dpt_time' => $faker->time(),

View File

@@ -37,8 +37,10 @@ $factory->define(App\Models\Pirep::class, function (Faker $faker) {
'flight_time' => $faker->numberBetween(60, 360), 'flight_time' => $faker->numberBetween(60, 360),
'planned_flight_time' => $faker->numberBetween(60, 360), 'planned_flight_time' => $faker->numberBetween(60, 360),
'zfw' => $faker->randomFloat(2), 'zfw' => $faker->randomFloat(2),
'block_fuel' => $faker->randomFloat(2, 0, 30000), 'block_fuel' => $faker->randomFloat(2, 0, 1000),
'fuel_used' => $faker->randomFloat(2, 0, 30000), 'fuel_used' => function (array $pirep) {
return round($pirep['block_fuel'] * .9, 2); // 90% of the fuel loaded was used
},
'block_on_time' => Carbon::now('UTC'), 'block_on_time' => Carbon::now('UTC'),
'block_off_time' => function (array $pirep) { 'block_off_time' => function (array $pirep) {
return $pirep['block_on_time']->subMinutes($pirep['flight_time']); return $pirep['block_on_time']->subMinutes($pirep['flight_time']);

View File

@@ -1,5 +1,6 @@
acars: acars:
- pirep_id: pirepid_1 - id: acars_1
pirep_id: pirepid_1
type: 1 type: 1
nav_type: 2 nav_type: 2
name: TNV name: TNV
@@ -7,7 +8,8 @@ acars:
lon: -96.058239 lon: -96.058239
created_at: now created_at: now
updated_at: now updated_at: now
- pirep_id: pirepid_1 - id: acars_2
pirep_id: pirepid_1
type: 1 type: 1
nav_type: 2 nav_type: 2
name: IAH name: IAH
@@ -15,7 +17,8 @@ acars:
lon: -95.345719 lon: -95.345719
created_at: now created_at: now
updated_at: now updated_at: now
- pirep_id: pirepid_1 - id: acars_3
pirep_id: pirepid_1
type: 1 type: 1
nav_type: 2 nav_type: 2
name: LCH name: LCH
@@ -23,7 +26,8 @@ acars:
lon: -93.105569 lon: -93.105569
created_at: now created_at: now
updated_at: now updated_at: now
- pirep_id: pirepid_1 - id: acars_4
pirep_id: pirepid_1
type: 1 type: 1
nav_type: 2 nav_type: 2
name: MEI name: MEI
@@ -31,7 +35,8 @@ acars:
lon: -88.804267 lon: -88.804267
created_at: now created_at: now
updated_at: now updated_at: now
- pirep_id: pirepid_1 - id: acars_5
pirep_id: pirepid_1
type: 1 type: 1
nav_type: 2 nav_type: 2
name: ATL name: ATL
@@ -39,7 +44,8 @@ acars:
lon: -84.435064 lon: -84.435064
created_at: now created_at: now
updated_at: now updated_at: now
- pirep_id: pirepid_1 - id: acars_6
pirep_id: pirepid_1
type: 1 type: 1
nav_type: 2 nav_type: 2
name: SIE name: SIE

View File

@@ -3,14 +3,4 @@
# want to modify or erase any of this here # want to modify or erase any of this here
# #
airports:
- id: KAUS
iata: AUS
icao: KAUS
name: Austin-Bergstrom
location: Austin, Texas, USA
country: United States
timezone: America/Chicago
lat: 30.1945278
lon: -97.6698889
hub: 1

View File

@@ -452,15 +452,17 @@ pireps:
block_off_time: 2018-04-04T12:42:36+00:00 block_off_time: 2018-04-04T12:42:36+00:00
block_on_time: 2018-04-04T16:42:36+00:00 block_on_time: 2018-04-04T16:42:36+00:00
flight_time: 180 # 6 hours flight_time: 180 # 6 hours
block_fuel: 20000
fuel_used: 10000
state: 1 # accepted state: 1 # accepted
status: 0 status: 0
source: 1 source: 1
flight_type: J flight_type: J
route: KAUS SID TNV J87 IAH J2 LCH J22 MEI J239 ATL J52 AJFEB J14 BYJAC Q60 JAXSN J14 COLIN J61 HUBBS J55 SIE STAR KJFK route: KAUS SID TNV J87 IAH J2 LCH J22 MEI J239 ATL J52 AJFEB J14 BYJAC Q60 JAXSN J14 COLIN J61 HUBBS J55 SIE STAR KJFK
notes: just a pilot report notes: just a pilot report
submitted_at: 2018-04-04T16:50:36+00:00 submitted_at: NOW
created_at: 2018-04-04T16:50:36+00:00 created_at: NOW
updated_at: 2018-04-04T17:00:36+00:00 updated_at: NOW
- id: pirepid_2 - id: pirepid_2
user_id: 1 user_id: 1
airline_id: 1 airline_id: 1
@@ -469,6 +471,8 @@ pireps:
dpt_airport_id: KJFK dpt_airport_id: KJFK
arr_airport_id: KAUS arr_airport_id: KAUS
flight_time: 180 # 6 hours flight_time: 180 # 6 hours
block_fuel: 20000
fuel_used: 15000
state: 5 # draft state: 5 # draft
source: 0 # manual source: 0 # manual
flight_type: J flight_type: J
@@ -494,7 +498,7 @@ pireps:
planned_flight_time: '0' planned_flight_time: '0'
zfw: null zfw: null
block_fuel: '21500.25390625' block_fuel: '21500.25390625'
fuel_used: null fuel_used: 20000
landing_rate: '0' landing_rate: '0'
score: '0' score: '0'
route: '' route: ''
@@ -503,11 +507,11 @@ pireps:
source_name: vmsacars source_name: vmsacars
state: 0 state: 0
status: ENR status: ENR
submitted_at: null
block_off_time: now block_off_time: now
block_on_time: null block_on_time: null
created_at: now submitted_at: NOW
updated_at: now created_at: NOW
updated_at: NOW
- id: pirepid_4 - id: pirepid_4
user_id: 1 user_id: 1
airline_id: 1 airline_id: 1
@@ -517,6 +521,8 @@ pireps:
arr_airport_id: KAUS arr_airport_id: KAUS
block_off_time: 2018-04-04T12:42:36+00:00 block_off_time: 2018-04-04T12:42:36+00:00
block_on_time: 2018-04-04T16:42:36+00:00 block_on_time: 2018-04-04T16:42:36+00:00
block_fuel: 100000
fuel_used: 20000
flight_time: 180 # 6 hours flight_time: 180 # 6 hours
state: 0 state: 0
status: 0 status: 0
@@ -524,9 +530,9 @@ pireps:
flight_type: J flight_type: J
route: KAUS SID TNV J87 IAH J2 LCH J22 MEI J239 ATL J52 AJFEB J14 BYJAC Q60 JAXSN J14 COLIN J61 HUBBS J55 SIE STAR KJFK route: KAUS SID TNV J87 IAH J2 LCH J22 MEI J239 ATL J52 AJFEB J14 BYJAC Q60 JAXSN J14 COLIN J61 HUBBS J55 SIE STAR KJFK
notes: just a pilot report notes: just a pilot report
submitted_at: 2018-04-04T16:50:36+00:00 submitted_at: NOW
created_at: 2018-04-04T16:50:36+00:00 created_at: NOW
updated_at: 2018-04-04T17:00:36+00:00 updated_at: NOW
pirep_fares: pirep_fares:
- id: 1 - id: 1

View File

@@ -11,7 +11,7 @@ use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Laracasts\Flash\Flash; use Laracasts\Flash\Flash;
use SebastianBergmann\Version; use PragmaRX\Version\Package\Facade as Version;
use vierbergenlars\SemVer\version as semver; use vierbergenlars\SemVer\version as semver;
class DashboardController extends Controller class DashboardController extends Controller

View File

@@ -2,6 +2,9 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use App\Support\Units\Distance;
use App\Support\Units\Fuel;
class Acars extends Response class Acars extends Response
{ {
/** /**
@@ -9,16 +12,25 @@ class Acars extends Response
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* *
* @throws \PhpUnitsOfMeasure\Exception\NonNumericValue
* @throws \PhpUnitsOfMeasure\Exception\NonStringUnitName
*
* @return array * @return array
*/ */
public function toArray($request) public function toArray($request)
{ {
$res = parent::toArray($request); $res = parent::toArray($request);
$this->checkUnitFields($res, [ // Set these to the response units
'distance', if (!empty($res['distance'])) {
'fuel', $distance = new Distance($res['distance'], config('phpvms.internal_units.distance'));
]); $res['distance'] = $distance->getResponseUnits();
}
if (!empty($res['fuel'])) {
$fuel = new Fuel($res['fuel'], config('phpvms.internal_units.fuel'));
$res['fuel'] = $fuel->getResponseUnits();
}
return $res; return $res;
} }

View File

@@ -2,6 +2,8 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use App\Support\Units\Distance;
class Flight extends Response class Flight extends Response
{ {
/** /**
@@ -19,16 +21,24 @@ class Flight extends Response
return $fields; return $fields;
} }
/**
* @param \Illuminate\Http\Request $request
*
* @throws \PhpUnitsOfMeasure\Exception\NonNumericValue
* @throws \PhpUnitsOfMeasure\Exception\NonStringUnitName
*
* @return array
*/
public function toArray($request) public function toArray($request)
{ {
$res = parent::toArray($request); $res = parent::toArray($request);
$res['ident'] = $this->ident; $res['ident'] = $this->ident;
// Return multiple measures so the client can pick what they want if (!empty($res['distance'])) {
$this->checkUnitFields($res, [ $distance = new Distance($res['distance'], config('phpvms.internal_units.distance'));
'distance', $res['distance'] = $distance->getResponseUnits();
]); }
$res['airline'] = new Airline($this->airline); $res['airline'] = new Airline($this->airline);
$res['subfleets'] = Subfleet::collection($this->subfleets); $res['subfleets'] = Subfleet::collection($this->subfleets);

View File

@@ -3,6 +3,8 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use App\Models\Enums\PirepStatus; use App\Models\Enums\PirepStatus;
use App\Support\Units\Distance;
use App\Support\Units\Fuel;
class Pirep extends Response class Pirep extends Response
{ {
@@ -11,6 +13,9 @@ class Pirep extends Response
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* *
* @throws \PhpUnitsOfMeasure\Exception\NonNumericValue
* @throws \PhpUnitsOfMeasure\Exception\NonStringUnitName
*
* @return array * @return array
*/ */
public function toArray($request) public function toArray($request)
@@ -18,11 +23,21 @@ class Pirep extends Response
$res = parent::toArray($request); $res = parent::toArray($request);
$res['ident'] = $this->ident; $res['ident'] = $this->ident;
$this->checkUnitFields($res, [ // Set these to the response units
'distance', if (!empty($res['distance'])) {
'fuel_used', $distance = new Distance($res['distance'], config('phpvms.internal_units.distance'));
'planned_distance', $res['distance'] = $distance->getResponseUnits();
]); }
if (!empty($res['fuel_used'])) {
$fuel_used = new Fuel($res['fuel_used'], config('phpvms.internal_units.fuel'));
$res['fuel_used'] = $fuel_used->getResponseUnits();
}
if (!empty($res['planned_distance'])) {
$planned_dist = new Distance($res['planned_distance'], config('phpvms.internal_units.distance'));
$res['planned_distance'] = $planned_dist->getResponseUnits();
}
/* /*
* Relationship fields * Relationship fields

View File

@@ -85,7 +85,7 @@ class Acars extends Model
* *
* @return int|Distance * @return int|Distance
*/ */
public function getDistanceAttribute() /*public function getDistanceAttribute()
{ {
if (!array_key_exists('distance', $this->attributes)) { if (!array_key_exists('distance', $this->attributes)) {
return 0; return 0;
@@ -103,7 +103,7 @@ class Acars extends Model
} catch (NonStringUnitName $e) { } catch (NonStringUnitName $e) {
return 0; return 0;
} }
} }*/
/** /**
* Set the distance unit, convert to our internal default unit * Set the distance unit, convert to our internal default unit
@@ -126,7 +126,7 @@ class Acars extends Model
* *
* @return int|Fuel * @return int|Fuel
*/ */
public function getFuelAttribute() /*public function getFuelAttribute()
{ {
if (!array_key_exists('fuel', $this->attributes)) { if (!array_key_exists('fuel', $this->attributes)) {
return 0; return 0;
@@ -140,7 +140,7 @@ class Acars extends Model
} catch (NonStringUnitName $e) { } catch (NonStringUnitName $e) {
return 0; return 0;
} }
} }*/
/** /**
* Set the amount of fuel * Set the amount of fuel

View File

@@ -17,6 +17,9 @@ use App\Models\Traits\FilesTrait;
* @property string country * @property string country
* @property string timezone * @property string timezone
* @property float ground_handling_cost * @property float ground_handling_cost
* @property float fuel_100ll_cost
* @property float fuel_jeta_cost
* @property float fuel_mogas_cost
* @property float lat * @property float lat
* @property float lon * @property float lon
*/ */
@@ -67,6 +70,9 @@ class Airport extends Model
'lat' => 'required|numeric', 'lat' => 'required|numeric',
'lon' => 'required|numeric', 'lon' => 'required|numeric',
'ground_handling_cost' => 'nullable|numeric', 'ground_handling_cost' => 'nullable|numeric',
'fuel_100ll_cost' => 'nullable|numeric',
'fuel_jeta_cost' => 'nullable|numeric',
'fuel_mogas_cost' => 'nullable|numeric',
]; ];
/** /**

View File

@@ -137,7 +137,7 @@ class Flight extends Model
* *
* @return Distance * @return Distance
*/ */
public function getDistanceAttribute() /*public function getDistanceAttribute()
{ {
if (!array_key_exists('distance', $this->attributes)) { if (!array_key_exists('distance', $this->attributes)) {
return 0; return 0;
@@ -152,7 +152,7 @@ class Flight extends Model
} catch (NonStringUnitName $e) { } catch (NonStringUnitName $e) {
return new Distance(0, config('phpvms.internal_units.distance', 'nmi')); return new Distance(0, config('phpvms.internal_units.distance', 'nmi'));
} }
} }*/
/** /**
* Set the distance unit, convert to our internal default unit * Set the distance unit, convert to our internal default unit

View File

@@ -35,6 +35,8 @@ use PhpUnitsOfMeasure\Exception\NonStringUnitName;
* @property int block_time * @property int block_time
* @property int flight_time In minutes * @property int flight_time In minutes
* @property int planned_flight_time * @property int planned_flight_time
* @property float block_fuel
* @property float fuel_used
* @property float distance * @property float distance
* @property float planned_distance * @property float planned_distance
* @property string route * @property string route
@@ -124,6 +126,8 @@ class Pirep extends Model
'flight_number' => 'required', 'flight_number' => 'required',
'dpt_airport_id' => 'required', 'dpt_airport_id' => 'required',
'arr_airport_id' => 'required', 'arr_airport_id' => 'required',
'block_fuel' => 'required|numeric',
'fuel_used' => 'required|numeric',
'notes' => 'nullable', 'notes' => 'nullable',
'route' => 'nullable', 'route' => 'nullable',
]; ];
@@ -132,7 +136,6 @@ class Pirep extends Model
* If a PIREP is in these states, then it can't be changed. * If a PIREP is in these states, then it can't be changed.
*/ */
public static $read_only_states = [ public static $read_only_states = [
//PirepState::PENDING,
PirepState::ACCEPTED, PirepState::ACCEPTED,
PirepState::REJECTED, PirepState::REJECTED,
PirepState::CANCELLED, PirepState::CANCELLED,
@@ -200,7 +203,7 @@ class Pirep extends Model
* *
* @return int|Distance * @return int|Distance
*/ */
public function getDistanceAttribute() /*public function getDistanceAttribute()
{ {
if (!array_key_exists('distance', $this->attributes)) { if (!array_key_exists('distance', $this->attributes)) {
return 0; return 0;
@@ -218,7 +221,7 @@ class Pirep extends Model
} catch (NonStringUnitName $e) { } catch (NonStringUnitName $e) {
return 0; return 0;
} }
} }*/
/** /**
* Set the distance unit, convert to our internal default unit * Set the distance unit, convert to our internal default unit
@@ -249,7 +252,7 @@ class Pirep extends Model
* *
* @return int|Fuel * @return int|Fuel
*/ */
public function getFuelUsedAttribute() /*public function getFuelUsedAttribute()
{ {
if (!array_key_exists('fuel_used', $this->attributes)) { if (!array_key_exists('fuel_used', $this->attributes)) {
return 0; return 0;
@@ -264,14 +267,14 @@ class Pirep extends Model
} catch (NonStringUnitName $e) { } catch (NonStringUnitName $e) {
return 0; return 0;
} }
} }*/
/** /**
* Return the planned_distance in a converter class * Return the planned_distance in a converter class
* *
* @return int|Distance * @return int|Distance
*/ */
public function getPlannedDistanceAttribute() /*public function getPlannedDistanceAttribute()
{ {
if (!array_key_exists('planned_distance', $this->attributes)) { if (!array_key_exists('planned_distance', $this->attributes)) {
return 0; return 0;
@@ -289,7 +292,7 @@ class Pirep extends Model
} catch (NonStringUnitName $e) { } catch (NonStringUnitName $e) {
return 0; return 0;
} }
} }*/
/** /**
* Return the flight progress in a percent. * Return the flight progress in a percent.

View File

@@ -80,8 +80,8 @@ class JournalRepository extends Repository implements CacheableInterface
* @param Model|null $reference The object this is a reference to * @param Model|null $reference The object this is a reference to
* @param string|null $memo Memo for this transaction * @param string|null $memo Memo for this transaction
* @param string|null $post_date Date of the posting * @param string|null $post_date Date of the posting
* @param string|null $transaction_group * @param string|null $transaction_group Grouping name for the summaries
* @param array|string|null $tags * @param array|string|null $tags Tag used for grouping/finding items
* *
* @throws ValidatorException * @throws ValidatorException
* *

View File

@@ -13,7 +13,7 @@ use App\Repositories\JournalRepository;
use App\Services\FareService; use App\Services\FareService;
use App\Support\Math; use App\Support\Math;
use App\Support\Money; use App\Support\Money;
use Log; use Illuminate\Support\Facades\Log;
/** /**
* Class FinanceService * Class FinanceService
@@ -70,6 +70,7 @@ class PirepFinanceService extends Service
Log::info('Finance: Starting PIREP pay for '.$pirep->id); Log::info('Finance: Starting PIREP pay for '.$pirep->id);
// Now start and pay from scratch // Now start and pay from scratch
$this->payFuelCosts($pirep);
$this->payFaresForPirep($pirep); $this->payFaresForPirep($pirep);
$this->payExpensesForSubfleet($pirep); $this->payExpensesForSubfleet($pirep);
$this->payExpensesForPirep($pirep); $this->payExpensesForPirep($pirep);
@@ -132,6 +133,34 @@ class PirepFinanceService extends Service
} }
} }
/**
* Calculate the fuel used by the PIREP and add those costs in
*
* @param Pirep $pirep
*
* @throws \Prettus\Validator\Exceptions\ValidatorException
*/
public function payFuelCosts(Pirep $pirep): void
{
$ap = $pirep->dpt_airport;
$fuel_used = $pirep->block_fuel;
$debit = Money::createFromAmount($fuel_used * $ap->fuel_jeta_cost);
Log::info('Finance: Fuel cost, (fuel='.$fuel_used.', cost='.$ap->fuel_jeta_cost.') D='
.$debit->getAmount());
$this->journalRepo->post(
$pirep->airline->journal,
null,
$debit,
$pirep,
'Fuel Cost ('.$ap->fuel_jeta_cost.'/'.config('phpvms.internal_units.fuel').')',
null,
'Fuel',
'fuel'
);
}
/** /**
* Calculate what the cost is for the operating an aircraft * Calculate what the cost is for the operating an aircraft
* in this subfleet, as-per the block time * in this subfleet, as-per the block time

View File

@@ -37,7 +37,7 @@ class FlightExporter extends ImportExport
// Modify special fields // Modify special fields
$ret['airline'] = $ret['airline']->icao; $ret['airline'] = $ret['airline']->icao;
$ret['distance'] = $ret['distance'][config('phpvms.internal_units.distance')]; // $ret['distance'] = $ret['distance'][config('phpvms.internal_units.distance')];
$ret['dpt_airport'] = $flight->dpt_airport_id; $ret['dpt_airport'] = $flight->dpt_airport_id;
$ret['arr_airport'] = $flight->arr_airport_id; $ret['arr_airport'] = $flight->arr_airport_id;

View File

@@ -28,6 +28,7 @@ class MigrationService extends Service
public function syncAllSeeds(): void public function syncAllSeeds(): void
{ {
$this->syncAllSettings(); $this->syncAllSettings();
$this->syncAllPermissions();
} }
public function syncAllSettings(): void public function syncAllSettings(): void
@@ -43,6 +44,22 @@ class MigrationService extends Service
} }
} }
public function syncAllPermissions(): void
{
$data = file_get_contents(database_path('/seeds/permissions.yml'));
$yml = Yaml::parse($data);
foreach ($yml as $perm) {
$count = DB::table('permissions')->where('name', $perm['name'])->count('name');
if ($count === 0) {
DB::table('permissions')->insert($perm);
} else {
DB::table('settings')
->where('name', $perm['name'])
->update($perm);
}
}
}
/** /**
* @param $key * @param $key
* @param $attrs * @param $attrs

View File

@@ -44,6 +44,10 @@ class Database
{ {
$imported = []; $imported = [];
$yml = Yaml::parse($yml); $yml = Yaml::parse($yml);
if (empty($yml)) {
return $imported;
}
foreach ($yml as $table => $rows) { foreach ($yml as $table => $rows) {
$imported[$table] = 0; $imported[$table] = 0;
@@ -80,6 +84,10 @@ class Database
$row['password'] = bcrypt($row['password']); $row['password'] = bcrypt($row['password']);
} }
if (empty($row)) {
return $row;
}
// if any time fields are == to "now", then insert the right time // if any time fields are == to "now", then insert the right time
foreach ($row as $column => $value) { foreach ($row as $column => $value) {
if (strtolower($value) === 'now') { if (strtolower($value) === 'now') {
@@ -91,6 +99,7 @@ class Database
DB::table($table)->insert($row); DB::table($table)->insert($row);
} catch (QueryException $e) { } catch (QueryException $e) {
Log::error($e); Log::error($e);
dd($row);
throw $e; throw $e;
} }

View File

@@ -21,6 +21,7 @@ return [
'fieldsreadonly' => 'Once a PIREP has been submitted, certain fields go into read-only mode.', 'fieldsreadonly' => 'Once a PIREP has been submitted, certain fields go into read-only mode.',
'flightinformations' => 'Flight Information', 'flightinformations' => 'Flight Information',
'flightident' => 'Flight Number/Code/Leg', 'flightident' => 'Flight Number/Code/Leg',
'block_fuel' => 'Block Fuel',
'fuel_used' => 'Fuel Used', 'fuel_used' => 'Fuel Used',
'codeoptional' => 'Code (optional)', 'codeoptional' => 'Code (optional)',
'legoptional' => 'Leg (optional)', 'legoptional' => 'Leg (optional)',

View File

@@ -21,6 +21,7 @@ return [
'fieldsreadonly' => 'Una vez que se ha enviado un PIREP, ciertos campos pasan al modo de solo lectura.', 'fieldsreadonly' => 'Una vez que se ha enviado un PIREP, ciertos campos pasan al modo de solo lectura.',
'flightinformations' => 'Información de vuelo', 'flightinformations' => 'Información de vuelo',
'flightident' => 'Vuelo Número/Código/Etapa', 'flightident' => 'Vuelo Número/Código/Etapa',
'block_fuel' => 'Bloque de Combustible',
'fuel_used' => 'Combustible Usado', 'fuel_used' => 'Combustible Usado',
'codeoptional' => 'Código (opcional)', 'codeoptional' => 'Código (opcional)',
'legoptional' => 'Etapa (opcional)', 'legoptional' => 'Etapa (opcional)',

View File

@@ -16,6 +16,7 @@ return [
'fieldsreadonly' => 'Quando un PIREP viene sottoporre, alcuni cami entrano in modalità di sola lettura.', 'fieldsreadonly' => 'Quando un PIREP viene sottoporre, alcuni cami entrano in modalità di sola lettura.',
'flightinformations' => 'Informazioni di Volo', 'flightinformations' => 'Informazioni di Volo',
'flightident' => 'Numero di Volo/Codice/Leg', 'flightident' => 'Numero di Volo/Codice/Leg',
'block_fuel' => 'Bloccare il Carburante',
'fuel_used' => 'Carburante Usato', 'fuel_used' => 'Carburante Usato',
'codeoptional' => 'Codice (facoltativo)', 'codeoptional' => 'Codice (facoltativo)',
'legoptional' => 'Leg (facoltativa)', 'legoptional' => 'Leg (facoltativa)',

View File

@@ -72,7 +72,13 @@
</div> </div>
<div class="form-group col-md-6"> <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']) }}
<p class="text-danger">{{ $errors->first('fuel_jeta_cost') }}</p>
@component('admin.components.info')
This is the cost per {{ config('phpvms.internal_units.fuel') }}
@endcomponent
</div> </div>
</div> </div>

View File

@@ -6,9 +6,9 @@
<th>Location</th> <th>Location</th>
<th>Hub</th> <th>Hub</th>
<th style="text-align: center;">GH Cost</th> <th style="text-align: center;">GH Cost</th>
<th style="text-align: center;">100LL</th> {{--<th style="text-align: center;">100LL</th>--}}
<th style="text-align: center;">JetA</th> <th style="text-align: center;">JetA</th>
<th style="text-align: center;">MOGAS</th> {{--<th style="text-align: center;">MOGAS</th>--}}
<th></th> <th></th>
</thead> </thead>
<tbody> <tbody>
@@ -25,15 +25,15 @@
<td style="text-align: center;"> <td style="text-align: center;">
{{ $airport->ground_handling_cost }} {{ $airport->ground_handling_cost }}
</td> </td>
<td style="text-align: center;"> {{--<td style="text-align: center;">
<a class="inline" href="#" data-pk="{{ $airport->id }}" data-name="fuel_100ll_cost">{{ $airport->fuel_100ll_cost }}</a> <a class="inline" href="#" data-pk="{{ $airport->id }}" data-name="fuel_100ll_cost">{{ $airport->fuel_100ll_cost }}</a>
</td> </td>--}}
<td style="text-align: center;"> <td style="text-align: center;">
<a class="inline" href="#" data-pk="{{ $airport->id }}" data-name="fuel_jeta_cost">{{ $airport->fuel_jeta_cost }}</a> <a class="inline" href="#" data-pk="{{ $airport->id }}" data-name="fuel_jeta_cost">{{ $airport->fuel_jeta_cost }}</a>
</td> </td>
<td style="text-align: center;"> {{--<td style="text-align: center;">
<a class="inline" href="#" data-pk="{{ $airport->id }}" data-name="fuel_mogas_cost">{{ $airport->fuel_mogas_cost }}</a> <a class="inline" href="#" data-pk="{{ $airport->id }}" data-name="fuel_mogas_cost">{{ $airport->fuel_mogas_cost }}</a>
</td> </td>--}}
<td style="text-align: right;"> <td style="text-align: right;">
{{ Form::open(['route' => ['admin.airports.destroy', $airport->id], 'method' => 'delete']) }} {{ 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 class="fas fa-pencil-alt"></i></a> <a href="{{ route('admin.airports.edit', [$airport->id]) }}" class='btn btn-sm btn-success btn-icon'><i class="fas fa-pencil-alt"></i></a>

View File

@@ -28,6 +28,7 @@
@endif @endif
</td> </td>
<td>&nbsp;</td> <td>&nbsp;</td>
@if ($on_edit_page === false)
<td> <td>
<form action="{{ route('admin.pireps.edit', [$pirep->id]) }}"> <form action="{{ route('admin.pireps.edit', [$pirep->id]) }}">
<button type="submit" <button type="submit"
@@ -35,5 +36,6 @@
<i class="fas fa-pencil-alt"></i>&nbsp;&nbsp;Edit</button> <i class="fas fa-pencil-alt"></i>&nbsp;&nbsp;Edit</button>
</form> </form>
</td> </td>
@endif
</tr> </tr>
</table> </table>

View File

@@ -135,7 +135,7 @@
<div class="row"> <div class="row">
<!-- Flight Time Field --> <!-- Flight Time Field -->
<div class="form-group col-sm-6"> <div class="form-group col-sm-3">
{{ Form::label('flight_time', 'Flight Time (hours & minutes):') }} {{ Form::label('flight_time', 'Flight Time (hours & minutes):') }}
@if($pirep->read_only) @if($pirep->read_only)
<p> <p>
@@ -163,8 +163,30 @@
@endif @endif
</div> </div>
<!-- Block Fuel Field -->
<div class="form-group col-sm-2">
{{ Form::label('block_fuel', 'Block Fuel:') }}
<div class="row">
<div class="col-sm-12">
{{ Form::number('block_fuel', null, ['class' => 'form-control', 'min' => 0]) }}
<p class="text-danger">{{ $errors->first('block_fuel') }}</p>
</div>
</div>
</div>
<!-- Fuel Used Field -->
<div class="form-group col-sm-2">
{{ Form::label('fuel_used', 'Fuel Used:') }}
<div class="row">
<div class="col-sm-12">
{{ Form::number('fuel_used', null, ['class' => 'form-control', 'min' => 0]) }}
<p class="text-danger">{{ $errors->first('fuel_used') }}</p>
</div>
</div>
</div>
<!-- Level Field --> <!-- Level Field -->
<div class="form-group col-sm-6"> <div class="form-group col-sm-5">
{{ Form::label('level', 'Flight Level:') }} {{ Form::label('level', 'Flight Level:') }}
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">

View File

@@ -228,13 +228,27 @@ flight reports that have been filed. You've been warned!
<p class="text-danger">{{ $errors->first('aircraft_id') }}</p> <p class="text-danger">{{ $errors->first('aircraft_id') }}</p>
@endif @endif
</div> </div>
<div class="col-4">
{{ Form::label('block_fuel', __('pireps.block_fuel')) }} ({{config('phpvms.internal_units.fuel')}})
@if(!empty($pirep) && $pirep->read_only)
<p>{{ $pirep->block_fuel }}</p>
@else
<div class="input-group input-group-sm form-group">
{{ Form::number('block_fuel', null, [
'class' => 'form-control',
'min' => '0',
'readonly' => (!empty($pirep) && $pirep->read_only),
]) }}
</div>
<p class="text-danger">{{ $errors->first('block_fuel') }}</p>
@endif
</div>
<div class="col-4"> <div class="col-4">
{{ Form::label('fuel_used', __('pireps.fuel_used')) }} ({{config('phpvms.internal_units.fuel')}}) {{ Form::label('fuel_used', __('pireps.fuel_used')) }} ({{config('phpvms.internal_units.fuel')}})
@if(!empty($pirep) && $pirep->read_only) @if(!empty($pirep) && $pirep->read_only)
<p>{{ $pirep->fuel_used }}</p> <p>{{ $pirep->fuel_used }}</p>
@else @else
<div class="input-group input-group-sm form-group"> <div class="input-group input-group-sm form-group">
{{-- You probably don't want to change this ID if you want the fare select to work --}}
{{ Form::number('fuel_used', null, [ {{ Form::number('fuel_used', null, [
'class' => 'form-control', 'class' => 'form-control',
'min' => '0', 'min' => '0',

View File

@@ -56,8 +56,14 @@ class FinanceTest extends TestCase
$this->fleetSvc->addSubfleetToRank($subfleet['subfleet'], $rank); $this->fleetSvc->addSubfleetToRank($subfleet['subfleet'], $rank);
$airport = factory(App\Models\Airport::class)->create([ $dpt_apt = factory(App\Models\Airport::class)->create([
'ground_handling_cost' => 10, 'ground_handling_cost' => 10,
'fuel_jeta_cost' => 10,
]);
$arr_apt = factory(App\Models\Airport::class)->create([
'ground_handling_cost' => 10,
'fuel_jeta_cost' => 10,
]); ]);
$user = factory(App\Models\User::class)->create([ $user = factory(App\Models\User::class)->create([
@@ -66,19 +72,23 @@ class FinanceTest extends TestCase
$flight = factory(App\Models\Flight::class)->create([ $flight = factory(App\Models\Flight::class)->create([
'airline_id' => $user->airline_id, 'airline_id' => $user->airline_id,
'arr_airport_id' => $airport->icao, 'dpt_airport_id' => $dpt_apt->icao,
'arr_airport_id' => $arr_apt->icao,
]); ]);
$pirep = factory(App\Models\Pirep::class)->create([ $pirep = factory(App\Models\Pirep::class)->create([
'flight_number' => $flight->flight_number, 'flight_number' => $flight->flight_number,
'route_code' => $flight->route_code, 'route_code' => $flight->route_code,
'route_leg' => $flight->route_leg, 'route_leg' => $flight->route_leg,
'arr_airport_id' => $airport->id, 'dpt_airport_id' => $dpt_apt->id,
'arr_airport_id' => $arr_apt->id,
'user_id' => $user->id, 'user_id' => $user->id,
'airline_id' => $user->airline_id, 'airline_id' => $user->airline_id,
'aircraft_id' => $subfleet['aircraft']->random(), 'aircraft_id' => $subfleet['aircraft']->random(),
'source' => PirepSource::ACARS, 'source' => PirepSource::ACARS,
'flight_time' => 120, 'flight_time' => 120,
'block_fuel' => 10,
'fuel_used' => 9,
]); ]);
/** /**
@@ -649,13 +659,14 @@ class FinanceTest extends TestCase
$transactions = $journalRepo->getAllForObject($pirep); $transactions = $journalRepo->getAllForObject($pirep);
$this->assertCount(9, $transactions['transactions']); // $this->assertCount(9, $transactions['transactions']);
$this->assertEquals(3020, $transactions['credits']->getValue()); $this->assertEquals(3020, $transactions['credits']->getValue());
$this->assertEquals(1860, $transactions['debits']->getValue()); $this->assertEquals(1960, $transactions['debits']->getValue());
// Check that all the different transaction types are there // Check that all the different transaction types are there
// test by the different groups that exist // test by the different groups that exist
$transaction_tags = [ $transaction_tags = [
'fuel' => 1,
'expense' => 1, 'expense' => 1,
'subfleet' => 2, 'subfleet' => 2,
'fare' => 3, 'fare' => 3,

View File

@@ -487,7 +487,7 @@ class ImporterTest extends TestCase
$this->assertEquals('0810 CST', $flight->dpt_time); $this->assertEquals('0810 CST', $flight->dpt_time);
$this->assertEquals('1235 EST', $flight->arr_time); $this->assertEquals('1235 EST', $flight->arr_time);
$this->assertEquals('350', $flight->level); $this->assertEquals('350', $flight->level);
$this->assertEquals(1477, $flight->distance['nmi']); $this->assertEquals(1477, $flight->distance);
$this->assertEquals('207', $flight->flight_time); $this->assertEquals('207', $flight->flight_time);
$this->assertEquals(FlightType::SCHED_PAX, $flight->flight_type); $this->assertEquals(FlightType::SCHED_PAX, $flight->flight_type);
$this->assertEquals('ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6', $flight->route); $this->assertEquals('ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6', $flight->route);

View File

@@ -139,15 +139,15 @@ class PIREPTest extends TestCase
// Check that it has the fuel units // Check that it has the fuel units
$this->assertHasKeys($body['fuel_used'], ['lbs', 'kg']); $this->assertHasKeys($body['fuel_used'], ['lbs', 'kg']);
$this->assertEquals($pirep->fuel_used['lbs'], $body['fuel_used']['lbs']); $this->assertEquals($pirep->fuel_used, $body['fuel_used']['lbs']);
// Check that it has the distance units // Check that it has the distance units
$this->assertHasKeys($body['distance'], ['km', 'nmi', 'mi']); $this->assertHasKeys($body['distance'], ['km', 'nmi', 'mi']);
$this->assertEquals($pirep->distance['nmi'], $body['distance']['nmi']); $this->assertEquals($pirep->distance, $body['distance']['nmi']);
// Check the planned_distance field // Check the planned_distance field
$this->assertHasKeys($body['planned_distance'], ['km', 'nmi', 'mi']); $this->assertHasKeys($body['planned_distance'], ['km', 'nmi', 'mi']);
$this->assertEquals($pirep->planned_distance['nmi'], $body['planned_distance']['nmi']); $this->assertEquals($pirep->planned_distance, $body['planned_distance']['nmi']);
} }
public function testGetUserPireps() public function testGetUserPireps()