aircraftRepo = $aircraftRepo; $this->fareRepo = $fareRepo; $this->fareSvc = $fareSvc; $this->fleetSvc = $fleetSvc; $this->importSvc = $importSvc; $this->rankRepo = $rankRepo; $this->subfleetRepo = $subfleetRepo; } /** * Get the ranks that are available to the subfleet * @param $subfleet * @return array */ protected function getAvailRanks($subfleet) { $retval = []; $all_ranks = $this->rankRepo->all(); $avail_ranks = $all_ranks->except($subfleet->ranks->modelKeys()); foreach ($avail_ranks as $rank) { $retval[$rank->id] = $rank->name; } return $retval; } /** * Get all the fares that haven't been assigned to a given subfleet */ protected function getAvailFares($subfleet) { $retval = []; $all_fares = $this->fareRepo->all(); $avail_fares = $all_fares->except($subfleet->fares->modelKeys()); foreach ($avail_fares as $fare) { $retval[$fare->id] = $fare->name. ' (price: '.$fare->price. ', cost: '.$fare->cost. ', capacity: '.$fare->capacity.')'; } return $retval; } /** * Display a listing of the Subfleet. * @param Request $request * @return Response * @throws \Prettus\Repository\Exceptions\RepositoryException */ public function index(Request $request) { $this->subfleetRepo->pushCriteria(new RequestCriteria($request)); $subfleets = $this->subfleetRepo->all(); return view('admin.subfleets.index', [ 'subfleets' => $subfleets, ]); } /** * Show the form for creating a new Subfleet. * @return Response */ public function create() { return view('admin.subfleets.create', [ 'airlines' => Airline::all()->pluck('name', 'id'), 'fuel_types' => FuelType::labels(), ]); } /** * Store a newly created Subfleet in storage. * @param CreateSubfleetRequest $request * @return Response * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function store(CreateSubfleetRequest $request) { $input = $request->all(); $subfleet = $this->subfleetRepo->create($input); Flash::success('Subfleet saved successfully.'); return redirect(route('admin.subfleets.edit', ['id' => $subfleet->id])); } /** * Display the specified Subfleet. * @param int $id * @return Response */ public function show($id) { $subfleet = $this->subfleetRepo->findWithoutFail($id); if (empty($subfleet)) { Flash::error('Subfleet not found'); return redirect(route('admin.subfleets.index')); } $avail_fares = $this->getAvailFares($subfleet); return view('admin.subfleets.show', [ 'subfleet' => $subfleet, 'avail_fares' => $avail_fares, ]); } /** * Show the form for editing the specified Subfleet. * @param int $id * @return Response */ public function edit($id) { $subfleet = $this->subfleetRepo->findWithoutFail($id); if (empty($subfleet)) { Flash::error('Subfleet not found'); return redirect(route('admin.subfleets.index')); } $avail_fares = $this->getAvailFares($subfleet); $avail_ranks = $this->getAvailRanks($subfleet); return view('admin.subfleets.edit', [ 'airlines' => Airline::all()->pluck('name', 'id'), 'fuel_types' => FuelType::labels(), 'avail_fares' => $avail_fares, 'avail_ranks' => $avail_ranks, 'subfleet' => $subfleet, ]); } /** * Update the specified Subfleet in storage. * @param int $id * @param UpdateSubfleetRequest $request * @return Response * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function update($id, UpdateSubfleetRequest $request) { $subfleet = $this->subfleetRepo->findWithoutFail($id); if (empty($subfleet)) { Flash::error('Subfleet not found'); return redirect(route('admin.subfleets.index')); } $this->subfleetRepo->update($request->all(), $id); Flash::success('Subfleet updated successfully.'); return redirect(route('admin.subfleets.index')); } /** * Remove the specified Subfleet from storage. * @param int $id * @return Response */ public function destroy($id) { $subfleet = $this->subfleetRepo->findWithoutFail($id); if (empty($subfleet)) { Flash::error('Subfleet not found'); return redirect(route('admin.subfleets.index')); } # Make sure no aircraft are assigned to this subfleet # before trying to delete it, or else things might go boom $aircraft = $this->aircraftRepo->findWhere(['subfleet_id' => $id], ['id']); if ($aircraft->count() > 0) { Flash::error('There are aircraft still assigned to this subfleet, you can\'t delete it!')->important(); return redirect(route('admin.subfleets.index')); } $this->subfleetRepo->delete($id); Flash::success('Subfleet deleted successfully.'); return redirect(route('admin.subfleets.index')); } /** * Run the subfleet exporter * @param Request $request * @return \Symfony\Component\HttpFoundation\BinaryFileResponse */ public function export(Request $request) { $exporter = app(ExportService::class); $subfleets = $this->subfleetRepo->all(); $path = $exporter->exportSubfleets($subfleets); return response() ->download($path, 'subfleets.csv', [ 'content-type' => 'text/csv', ]) ->deleteFileAfterSend(true); } /** * * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws \Illuminate\Validation\ValidationException */ public function import(Request $request) { $logs = [ 'success' => [], 'errors' => [], ]; if ($request->isMethod('post')) { ImportRequest::validate($request); $path = Storage::putFileAs( 'import', $request->file('csv_file'), 'import_subfleets.csv' ); $path = storage_path('app/'.$path); Log::info('Uploaded subfleets import file to '.$path); $logs = $this->importSvc->importSubfleets($path); } return view('admin.subfleets.import', [ 'logs' => $logs, ]); } /** * @param Subfleet $subfleet * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ protected function return_ranks_view(?Subfleet $subfleet) { $subfleet->refresh(); $avail_ranks = $this->getAvailRanks($subfleet); return view('admin.subfleets.ranks', [ 'subfleet' => $subfleet, 'avail_ranks' => $avail_ranks, ]); } /** * @param Subfleet $subfleet * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ protected function return_fares_view(?Subfleet $subfleet) { $subfleet->refresh(); $avail_fares = $this->getAvailFares($subfleet); return view('admin.subfleets.fares', [ 'subfleet' => $subfleet, 'avail_fares' => $avail_fares, ]); } /** * Operations for associating ranks to the subfleet * @param $id * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function ranks($id, Request $request) { $subfleet = $this->subfleetRepo->findWithoutFail($id); if (empty($subfleet)) { return $this->return_ranks_view($subfleet); } if ($request->isMethod('get')) { return $this->return_ranks_view($subfleet); } /** * update specific rank data */ if ($request->isMethod('post')) { $rank = $this->rankRepo->find($request->input('rank_id')); $this->fleetSvc->addSubfleetToRank($subfleet, $rank); } elseif ($request->isMethod('put')) { $override = []; $rank = $this->rankRepo->find($request->input('rank_id')); $override[$request->name] = $request->value; $this->fleetSvc->addSubfleetToRank($subfleet, $rank, $override); } // dissassociate fare from teh aircraft elseif ($request->isMethod('delete')) { $rank = $this->rankRepo->find($request->input('rank_id')); $this->fleetSvc->removeSubfleetFromRank($subfleet, $rank); } $subfleet->save(); return $this->return_ranks_view($subfleet); } /** * @param Subfleet $subfleet * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ protected function return_expenses_view(?Subfleet $subfleet) { $subfleet->refresh(); return view('admin.subfleets.expenses', [ 'subfleet' => $subfleet, ]); } /** * Operations for associating ranks to the subfleet * @param $id * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws \Exception */ public function expenses($id, Request $request) { $subfleet = $this->subfleetRepo->findWithoutFail($id); if (empty($subfleet)) { return $this->return_expenses_view($subfleet); } if ($request->isMethod('get')) { return $this->return_expenses_view($subfleet); } /** * update specific rank data */ if ($request->isMethod('post')) { $expense = new Expense($request->post()); $expense->ref_class = Subfleet::class; $expense->ref_class_id = $subfleet->id; $expense->save(); } elseif ($request->isMethod('put')) { $expense = Expense::findOrFail($request->input('expense_id')); $expense->{$request->name} = $request->value; $expense->save(); } // dissassociate fare from teh aircraft elseif ($request->isMethod('delete')) { $expense = Expense::findOrFail($request->input('expense_id')); $expense->delete(); } return $this->return_expenses_view($subfleet); } /** * Operations on fares to the subfleet * @param $id * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function fares($id, Request $request) { $subfleet = $this->subfleetRepo->findWithoutFail($id); if (empty($subfleet)) { return $this->return_fares_view($subfleet); } if ($request->isMethod('get')) { return $this->return_fares_view($subfleet); } /** * update specific fare data */ if ($request->isMethod('post')) { $fare = $this->fareRepo->find($request->fare_id); $this->fareSvc->setForSubfleet($subfleet, $fare); } // update the pivot table with overrides for the fares elseif ($request->isMethod('put')) { $override = []; $fare = $this->fareRepo->find($request->fare_id); $override[$request->name] = $request->value; $this->fareSvc->setForSubfleet($subfleet, $fare, $override); } // dissassociate fare from teh aircraft elseif ($request->isMethod('delete')) { $fare = $this->fareRepo->find($request->fare_id); $this->fareSvc->delFareFromSubfleet($subfleet, $fare); } return $this->return_fares_view($subfleet); } }