fareSvc = $fareSvc; $this->flightRepo = $flightRepo; $this->navDataRepo = $navdataRepo; $this->userSvc = $userSvc; } /** * Filter out any flights according to different settings * @param $user * @return FlightRepository */ public function filterFlights($user) { $where = []; if (setting('pilots.only_flights_from_current', false)) { $where['dpt_airport_id'] = $user->curr_airport_id; } return $this->flightRepo ->whereOrder($where, 'flight_number', 'asc'); } /** * Filter out subfleets to only include aircraft that a user has access to * @param $user * @param $flight * @return mixed */ public function filterSubfleets($user, $flight) { $subfleets = $flight->subfleets; /** * Only allow aircraft that the user has access to in their rank */ if (setting('pireps.restrict_aircraft_to_rank', false)) { $allowed_subfleets = $this->userSvc->getAllowableSubfleets($user)->pluck('id'); $subfleets = $subfleets->filter(function ($subfleet, $i) use ($allowed_subfleets) { if ($allowed_subfleets->contains($subfleet->id)) { return true; } }); } /** * Only allow aircraft that are at the current departure airport */ if (setting('pireps.only_aircraft_at_dpt_airport', false)) { foreach ($subfleets as $subfleet) { $subfleet->aircraft = $subfleet->aircraft->filter( function ($aircraft, $i) use ($flight) { if ($aircraft->airport_id === $flight->dpt_airport_id) { return true; } } ); } } $flight->subfleets = $subfleets; return $flight; } /** * Check if this flight has a duplicate already * @param Flight $flight * @return bool */ public function isFlightDuplicate(Flight $flight) { $where = [ ['id', '<>', $flight->id], 'airline_id' => $flight->airline_id, 'flight_number' => $flight->flight_number, ]; $found_flights = $this->flightRepo->findWhere($where); if($found_flights->count() === 0) { return false; } // Find within all the flights with the same flight number // Return any flights that have the same route code and leg // If this list is > 0, then this has a duplicate $found_flights = $found_flights->filter(function($value, $key) use ($flight) { if($flight->route_code === $value->route_code && $flight->route_leg === $value->route_leg) { return true; } return false; }); if($found_flights->count() === 0) { return false; } return true; } /** * Delete a flight, and all the user bids, etc associated with it * @param Flight $flight * @throws \Exception */ public function deleteFlight(Flight $flight): void { $where = ['flight_id' => $flight->id]; Bid::where($where)->delete(); $flight->delete(); } /** * Update any custom PIREP fields * @param Flight $flight * @param array $field_values */ public function updateCustomFields(Flight $flight, array $field_values): void { foreach ($field_values as $fv) { FlightFieldValue::updateOrCreate( [ 'flight_id' => $flight->id, 'name' => $fv['name'], ], [ 'value' => $fv['value'] ] ); } } /** * Return all of the navaid points as a collection * @param Flight $flight * @return \Illuminate\Support\Collection */ public function getRoute(Flight $flight) { if (!$flight->route) { return collect(); } $route_points = array_map(function ($point) { return strtoupper($point); }, explode(' ', $flight->route)); $route = $this->navDataRepo->findWhereIn('id', $route_points); // Put it back into the original order the route is in $return_points = []; foreach ($route_points as $rp) { $return_points[] = $route->where('id', $rp)->first(); } return collect($return_points); } /** * Allow a user to bid on a flight. Check settings and all that good stuff * @param Flight $flight * @param User $user * @return Bid|null * @throws \App\Exceptions\BidExists */ public function addBid(Flight $flight, User $user) { # If it's already been bid on, then it can't be bid on again if ($flight->has_bid && setting('bids.disable_flight_on_bid')) { Log::info($flight->id.' already has a bid, skipping'); throw new BidExists(); } # See if we're allowed to have multiple bids or not if (!setting('bids.allow_multiple_bids')) { $user_bids = Bid::where(['user_id' => $user->id])->first(); if ($user_bids) { Log::info('User "'.$user->id.'" already has bids, skipping'); throw new BidExists(); } } # See if this user has this flight bid on already $bid_data = [ 'user_id' => $user->id, 'flight_id' => $flight->id ]; $user_bid = Bid::where($bid_data)->first(); if ($user_bid) { return $user_bid; } $user_bid = Bid::create($bid_data); $flight->has_bid = true; $flight->save(); return $user_bid; } /** * Remove a bid from a given flight * @param Flight $flight * @param User $user */ public function removeBid(Flight $flight, User $user) { $user_bid = Bid::where([ 'flight_id' => $flight->id, 'user_id' => $user->id ])->first(); if ($user_bid) { $user_bid->forceDelete(); } # Only flip the flag if there are no bids left for this flight if (!Bid::where('flight_id', $flight->id)->exists()) { $flight->has_bid = false; $flight->save(); } } }