phpvms/app/Services/PIREPService.php

165 lines
4.3 KiB
PHP
Raw Normal View History

2017-06-10 14:50:00 +08:00
<?php
namespace App\Services;
2017-07-02 10:06:55 +08:00
use App\Models\Pirep;
use App\Models\PirepFieldValues;
2017-06-10 14:50:00 +08:00
class PIREPService extends BaseService
{
protected $pilotSvc;
2017-06-10 14:50:00 +08:00
/**
* return a PIREP model
*/
public function __construct()
{
$this->pilotSvc = app('App\Services\PilotService');
2017-06-10 14:50:00 +08:00
}
/**
* Create a new PIREP with some given fields
*
* @param Pirep $pirep
* @param array [PirepFieldValues] $field_values
*
* @return Pirep
*/
2017-07-02 10:06:55 +08:00
public function create(
Pirep $pirep,
array $field_values=[]
): Pirep {
2017-07-02 10:06:55 +08:00
# Figure out what default state should be. Look at the default
# behavior from the rank that the pilot is assigned to
2017-07-05 04:43:47 +08:00
if($pirep->source == config('enums.sources.ACARS')) {
$default_status = $pirep->pilot->rank->auto_approve_acars;
} else {
$default_status = $pirep->pilot->rank->auto_approve_manual;
}
2017-07-02 10:06:55 +08:00
2017-07-05 04:43:47 +08:00
if ($default_status == config('enums.pirep_status.ACCEPTED')) {
$pirep = $this->accept($pirep);
}
foreach ($field_values as $fv) {
2017-07-02 10:06:55 +08:00
$v = new PirepFieldValues();
$v->name = $fv['name'];
$v->value = $fv['value'];
$v->source = $fv['source'];
$v->save();
}
2017-06-10 14:50:00 +08:00
# TODO: Financials even if it's rejected, log the expenses
$pirep->save();
# update pilot information
$pilot = $pirep->pilot;
$pilot->refresh();
$pilot->curr_airport_id = $pirep->arr_airport_id;
$pilot->last_pirep_id = $pirep->id;
$pilot->save();
return $pirep;
}
public function changeStatus(Pirep &$pirep, int $new_status): Pirep
{
if ($pirep->status === $new_status) {
return $pirep;
}
/**
* Move from a PENDING status into either ACCEPTED or REJECTED
*/
2017-07-05 04:43:47 +08:00
if ($pirep->status == config('enums.pirep_status.PENDING')) {
if ($new_status == config('enums.pirep_status.ACCEPTED')) {
return $this->accept($pirep);
2017-07-05 04:43:47 +08:00
} elseif ($new_status == config('enums.pirep_status.REJECTED')) {
return $this->reject($pirep);
} else {
return $pirep;
}
}
/*
* Move from a ACCEPTED to REJECTED status
*/
2017-07-05 04:43:47 +08:00
elseif ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
$pirep = $this->reject($pirep);
return $pirep;
}
/**
* Move from REJECTED to ACCEPTED
*/
2017-07-05 04:43:47 +08:00
elseif ($pirep->status == config('enums.pirep_status.REJECTED')) {
$pirep = $this->accept($pirep);
return $pirep;
}
}
/**
* @param Pirep $pirep
* @return Pirep
*/
public function accept(Pirep &$pirep): Pirep
{
# moving from a REJECTED state to ACCEPTED, reconcile statuses
2017-07-05 04:43:47 +08:00
if ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
return $pirep;
}
$ft = $pirep->flight_time;
2017-07-05 02:57:08 +08:00
$pilot = $pirep->pilot;
$this->pilotSvc->adjustFlightHours($pilot, $ft);
$this->pilotSvc->adjustFlightCount($pilot, +1);
$this->pilotSvc->calculatePilotRank($pilot);
$pirep->pilot->refresh();
# Change the status
2017-07-05 04:43:47 +08:00
$pirep->status = config('enums.pirep_status.ACCEPTED');
$pirep->save();
return $pirep;
}
/**
* @param Pirep $pirep
* @return Pirep
*/
public function reject(Pirep &$pirep): Pirep
{
# If this was previously ACCEPTED, then reconcile the flight hours
# that have already been counted, etc
2017-07-05 04:43:47 +08:00
if ($pirep->status == config('enums.pirep_status.ACCEPTED')) {
$pilot = $pirep->pilot;
$ft = $pirep->flight_time * -1;
$this->pilotSvc->adjustFlightHours($pilot, $ft);
$this->pilotSvc->adjustFlightCount($pilot, -1);
$this->pilotSvc->calculatePilotRank($pilot);
$pirep->pilot->refresh();
}
# Change the status
2017-07-05 04:43:47 +08:00
$pirep->status = config('enums.pirep_status.REJECTED');
$pirep->save();
return $pirep;
2017-06-10 14:50:00 +08:00
}
/**
* Calculate all of the finances for a PIREP
* @param Pirep $pirep
*/
public function calculateFinances(Pirep &$pirep)
{
}
2017-06-10 14:50:00 +08:00
}