diff --git a/app/Facades/Utils.php b/app/Facades/Utils.php index 74433158..ac77b917 100644 --- a/app/Facades/Utils.php +++ b/app/Facades/Utils.php @@ -21,6 +21,11 @@ class Utils extends Facade return $key; } + public static function minutesToTimeParts($minutes): array + { + return self::secondsToTimeParts(self::minutesToSeconds($minutes)); + } + /** * Convert seconds to an array of hours, minutes, seconds * @param $seconds @@ -47,7 +52,7 @@ class Utils extends Facade * @param bool $incl_sec * @return string */ - public static function secondsToTime($seconds, $incl_sec=false): string + public static function secondsToTimeString($seconds, $incl_sec=false): string { $hms = self::secondsToTimeParts($seconds); $format = $hms['h'].'h '.$hms['m'].'m'; @@ -58,6 +63,44 @@ class Utils extends Facade return $format; } + /** + * @param $minutes + * @return float|int + */ + public static function minutesToSeconds($minutes) + { + return $minutes * 60; + } + + /** + * Convert the seconds to minutes and then round it up + * @param $seconds + * @return float|int + */ + public static function secondsToMinutes($seconds) + { + return ceil($seconds/60); + } + + /** + * Convert hours to minutes. Pretty complex + * @param $minutes + * @return float|int + */ + public static function minutesToHours($minutes) + { + return $minutes/60; + } + + /** + * @param $hours + * @return float|int + */ + public static function hoursToMinutes($hours) + { + return $hours * 60; + } + /** * Bitwise operator for setting days of week to integer field * @param int $datefield initial datefield diff --git a/app/Http/Controllers/Admin/PirepController.php b/app/Http/Controllers/Admin/PirepController.php index 19417df4..e4157e61 100644 --- a/app/Http/Controllers/Admin/PirepController.php +++ b/app/Http/Controllers/Admin/PirepController.php @@ -109,6 +109,9 @@ class PirepController extends BaseController $input = $request->all(); $pirep = $this->pirepRepo->create($input); + $pirep->flight_time = ((int) Utils::hoursToMinutes($request['hours'])) + + ((int) $request['minutes']); + Flash::success('Pirep saved successfully.'); return redirect(route('admin.pireps.index')); } @@ -145,7 +148,7 @@ class PirepController extends BaseController return redirect(route('admin.pireps.index')); } - $hms = Utils::secondsToTimeParts($pirep->flight_time); + $hms = Utils::minutesToTimeParts($pirep->flight_time); $pirep->hours = $hms['h']; $pirep->minutes = $hms['m']; @@ -167,8 +170,8 @@ class PirepController extends BaseController { $pirep = $this->pirepRepo->findWithoutFail($id); - $pirep->flight_time = ((int)$request['hours'] * 60 * 60) - + ((int)$request['minutes'] * 60); + $pirep->flight_time = ((int) Utils::hoursToMinutes($request['hours'])) + + ((int) $request['minutes']); if (empty($pirep)) { Flash::error('Pirep not found'); diff --git a/app/Http/Controllers/Frontend/PirepController.php b/app/Http/Controllers/Frontend/PirepController.php index 8131821c..4492ad37 100644 --- a/app/Http/Controllers/Frontend/PirepController.php +++ b/app/Http/Controllers/Frontend/PirepController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Frontend; +use App\Facades\Utils; use App\Repositories\Criteria\WhereCriteria; use App\Services\PIREPService; use Illuminate\Support\Facades\Auth; @@ -77,8 +78,8 @@ class PirepController extends Controller // Any special fields $pirep->pilot()->associate(Auth::user()); - $pirep->flight_time = ((int)$pirep_fields['hours'] * 60 * 60) - + ((int)$pirep_fields['minutes'] * 60); + $pirep->flight_time = ((int) Utils::hoursToMinutes($request['hours'])) + + ((int) $request['minutes']); // The custom fields from the form $custom_fields = []; diff --git a/app/Models/Pirep.php b/app/Models/Pirep.php index e6d70933..c45e5791 100644 --- a/app/Models/Pirep.php +++ b/app/Models/Pirep.php @@ -47,6 +47,7 @@ class Pirep extends Model * @var array */ protected $casts = [ + 'id' => 'string', 'flight_time' => 'integer', 'level' => 'integer', 'fuel_used' => 'integer', diff --git a/app/Services/PIREPService.php b/app/Services/PIREPService.php index f1a5cd44..664148ea 100644 --- a/app/Services/PIREPService.php +++ b/app/Services/PIREPService.php @@ -38,7 +38,7 @@ class PIREPService extends BaseService * * @return Pirep */ - public function create(Pirep &$pirep, array $field_values): Pirep + public function create(Pirep $pirep, array $field_values=[]): Pirep { if($field_values === null) { $field_values = []; @@ -85,7 +85,7 @@ class PIREPService extends BaseService * @param int $new_status * @return Pirep */ - public function changeStatus(Pirep &$pirep, int $new_status): Pirep + public function changeStatus(Pirep $pirep, int $new_status): Pirep { Log::info('PIREP ' . $pirep->id . ' status change from '.$pirep->status.' to ' . $new_status); @@ -127,7 +127,7 @@ class PIREPService extends BaseService * @param Pirep $pirep * @return Pirep */ - public function accept(Pirep &$pirep): Pirep + public function accept(Pirep $pirep): Pirep { # moving from a REJECTED state to ACCEPTED, reconcile statuses if ($pirep->status === config('enums.pirep_status.ACCEPTED')) { @@ -137,7 +137,7 @@ class PIREPService extends BaseService $ft = $pirep->flight_time; $pilot = $pirep->pilot; - $this->pilotSvc->adjustFlightHours($pilot, $ft); + $this->pilotSvc->adjustFlightTime($pilot, $ft); $this->pilotSvc->adjustFlightCount($pilot, +1); $this->pilotSvc->calculatePilotRank($pilot); $pirep->pilot->refresh(); @@ -160,7 +160,7 @@ class PIREPService extends BaseService * @param Pirep $pirep * @return Pirep */ - public function reject(Pirep &$pirep): Pirep + public function reject(Pirep $pirep): Pirep { # If this was previously ACCEPTED, then reconcile the flight hours # that have already been counted, etc @@ -168,7 +168,7 @@ class PIREPService extends BaseService $pilot = $pirep->pilot; $ft = $pirep->flight_time * -1; - $this->pilotSvc->adjustFlightHours($pilot, $ft); + $this->pilotSvc->adjustFlightTime($pilot, $ft); $this->pilotSvc->adjustFlightCount($pilot, -1); $this->pilotSvc->calculatePilotRank($pilot); $pirep->pilot->refresh(); diff --git a/app/Services/UserService.php b/app/Services/UserService.php index 7da58690..d0fb65c3 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -27,10 +27,10 @@ class UserService extends BaseService return $user; } - public function adjustFlightHours(User $user, int $hours): User + public function adjustFlightTime(User $user, int $minutes): User { $user->refresh(); - $user->flight_time += $hours; + $user->flight_time += $minutes; $user->save(); event(new UserStateChanged($user)); @@ -41,15 +41,10 @@ class UserService extends BaseService public function calculatePilotRank(User $user): User { $user->refresh(); - $pilot_hours = $user->flight_time / 3600; + $pilot_hours = Utils::minutesToHours($user->flight_time); # TODO: Cache - $ranks = Cache::remember( - config('cache.keys.RANKS_PILOT_LIST.key'), - config('cache.keys.RANKS_PILOT_LIST.time'), - function () { - return Rank::where('auto_promote', true)->orderBy('hours', 'asc')->get(); - }); + $ranks = Rank::where('auto_promote', true)->orderBy('hours', 'asc')->get(); foreach ($ranks as $rank) { if($rank->hours > $pilot_hours) { diff --git a/database/factories/PirepFactory.php b/database/factories/PirepFactory.php index 28d95329..31cd167c 100644 --- a/database/factories/PirepFactory.php +++ b/database/factories/PirepFactory.php @@ -15,7 +15,7 @@ $factory->define(App\Models\Pirep::class, function (Faker $faker) use ($airlines return [ 'id' => substr($faker->unique()->sha1, 0, 12), - 'airline_id' => $faker->randomElement($airlinesAvailable), + 'airline_id' => 1, #$faker->randomElement($airlinesAvailable), 'user_id' => function () { # OVERRIDE THIS IF NEEDED return factory(App\Models\User::class)->create()->id; }, @@ -26,19 +26,22 @@ $factory->define(App\Models\Pirep::class, function (Faker $faker) use ($airlines return factory(App\Models\Flight::class)->create()->flight_number; }, 'route_code' => function(array $pirep) { - return App\Models\Flight::where('flight_number', $pirep['flight_number'])->first()->route_code; + //return App\Models\Flight::where(['flight_number' => $pirep['flight_number']])->first()->route_code; }, 'route_leg' => function (array $pirep) { - return App\Models\Flight::where('flight_number', $pirep['flight_number'])->first()->route_leg; + //return App\Models\Flight::where('flight_number', $pirep['flight_number'])->first()->route_leg; }, 'dpt_airport_id' => function () { return factory(App\Models\Airport::class)->create()->id; }, + 'arr_airport_id' => function () { + return factory(App\Models\Airport::class)->create()->id; + }, 'flight_time' => $faker->randomFloat(2), 'route' => $faker->text(), 'notes' => $faker->text(), 'source' => $faker->randomElement([0, 1]), # MANUAL/ACARS - 'status' => $faker->randomElement([-1, 0, 1]), # REJECTED/PENDING/ACCEPTED + 'status' => config('enums.pirep_status.PENDING'), //$faker->randomElement([-1, 0, 1]), # REJECTED/PENDING/ACCEPTED 'raw_data' => $raw_data ?: $raw_data = json_encode(['key' => 'value']), 'created_at' => $faker->dateTimeBetween('-1 week', 'now'), 'updated_at' => function(array $pirep) { diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 12ad0442..ab310f17 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -12,6 +12,8 @@ $factory->define(App\Models\User::class, function (Faker $faker) 'email' => $faker->safeEmail, 'password' => $password ?: $password = Hash::make('secret'), 'api_key' => $faker->sha1, + 'airline_id' => 1, + 'rank_id' => 1, 'flights' => $faker->numberBetween(0, 1000), 'flight_time' => $faker->numberBetween(0, 10000), 'remember_token' => $faker->unique()->text(5), diff --git a/resources/views/layouts/default/dashboard/index.blade.php b/resources/views/layouts/default/dashboard/index.blade.php index 22ef00b2..160115f0 100644 --- a/resources/views/layouts/default/dashboard/index.blade.php +++ b/resources/views/layouts/default/dashboard/index.blade.php @@ -21,7 +21,7 @@