diff --git a/app/Database/migrations/2018_02_28_231807_create_journal_transactions_table.php b/app/Database/migrations/2018_02_28_231807_create_journal_transactions_table.php index bb296282..33409ee4 100644 --- a/app/Database/migrations/2018_02_28_231807_create_journal_transactions_table.php +++ b/app/Database/migrations/2018_02_28_231807_create_journal_transactions_table.php @@ -27,6 +27,7 @@ class CreateJournalTransactionsTable extends Migration $table->dateTime('post_date'); $table->softDeletes(); + $table->primary('id'); $table->index('journal_id'); $table->index('transaction_group'); $table->index(['ref_class', 'ref_class_id']); diff --git a/app/Http/Controllers/Admin/AirportController.php b/app/Http/Controllers/Admin/AirportController.php index 04332ff4..7cf2af7d 100644 --- a/app/Http/Controllers/Admin/AirportController.php +++ b/app/Http/Controllers/Admin/AirportController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers\Admin; use App\Http\Requests\CreateAirportRequest; use App\Http\Requests\UpdateAirportRequest; +use App\Models\Airport; +use App\Models\Expense; use App\Repositories\AirportRepository; use App\Repositories\Criteria\WhereCriteria; use Flash; @@ -15,7 +17,7 @@ use Response; class AirportController extends BaseController { /** @var AirportRepository */ - private $airportRepository; + private $airportRepo; /** * AirportController constructor. @@ -24,7 +26,7 @@ class AirportController extends BaseController public function __construct( AirportRepository $airportRepo ) { - $this->airportRepository = $airportRepo; + $this->airportRepo = $airportRepo; } /** @@ -40,8 +42,8 @@ class AirportController extends BaseController $where['icao'] = $request->get('icao'); } - $this->airportRepository->pushCriteria(new WhereCriteria($request, $where)); - $airports = $this->airportRepository + $this->airportRepo->pushCriteria(new WhereCriteria($request, $where)); + $airports = $this->airportRepo ->orderBy('icao', 'asc') ->paginate(); @@ -72,7 +74,7 @@ class AirportController extends BaseController $input = $request->all(); $input['hub'] = get_truth_state($input['hub']); - $this->airportRepository->create($input); + $this->airportRepo->create($input); Flash::success('Airport saved successfully.'); return redirect(route('admin.airports.index')); @@ -85,7 +87,7 @@ class AirportController extends BaseController */ public function show($id) { - $airport = $this->airportRepository->findWithoutFail($id); + $airport = $this->airportRepo->findWithoutFail($id); if (empty($airport)) { Flash::error('Airport not found'); @@ -104,7 +106,7 @@ class AirportController extends BaseController */ public function edit($id) { - $airport = $this->airportRepository->findWithoutFail($id); + $airport = $this->airportRepo->findWithoutFail($id); if (empty($airport)) { Flash::error('Airport not found'); @@ -126,7 +128,7 @@ class AirportController extends BaseController */ public function update($id, UpdateAirportRequest $request) { - $airport = $this->airportRepository->findWithoutFail($id); + $airport = $this->airportRepo->findWithoutFail($id); if (empty($airport)) { Flash::error('Airport not found'); @@ -136,7 +138,7 @@ class AirportController extends BaseController $attrs = $request->all(); $attrs['hub'] = get_truth_state($attrs['hub']); - $this->airportRepository->update($attrs, $id); + $this->airportRepo->update($attrs, $id); Flash::success('Airport updated successfully.'); return redirect(route('admin.airports.index')); @@ -149,19 +151,70 @@ class AirportController extends BaseController */ public function destroy($id) { - $airport = $this->airportRepository->findWithoutFail($id); + $airport = $this->airportRepo->findWithoutFail($id); if (empty($airport)) { Flash::error('Airport not found'); return redirect(route('admin.airports.index')); } - $this->airportRepository->delete($id); + $this->airportRepo->delete($id); Flash::success('Airport deleted successfully.'); return redirect(route('admin.airports.index')); } + /** + * @param Airport|null $airport + * @return mixed + */ + protected function return_expenses_view(?Airport $airport) + { + $airport->refresh(); + return view('admin.airports.expenses', [ + 'airport' => $airport, + ]); + } + + /** + * 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) + { + $airport = $this->airportRepo->findWithoutFail($id); + if (empty($airport)) { + return $this->return_expenses_view($airport); + } + + if ($request->isMethod('get')) { + return $this->return_expenses_view($airport); + } + + /** + * update specific rank data + */ + if ($request->isMethod('post')) { + $expense = new Expense($request->post()); + $expense->ref_class = Airport::class; + $expense->ref_class_id = $airport->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($airport); + } + /** * Set fuel prices for this airport * @param Request $request @@ -171,7 +224,7 @@ class AirportController extends BaseController { $id = $request->id; - $airport = $this->airportRepository->findWithoutFail($id); + $airport = $this->airportRepo->findWithoutFail($id); if (empty($airport)) { Flash::error('Flight not found'); return redirect(route('admin.flights.index')); diff --git a/app/Http/Controllers/Admin/SubfleetController.php b/app/Http/Controllers/Admin/SubfleetController.php index 45189400..351a2c2e 100644 --- a/app/Http/Controllers/Admin/SubfleetController.php +++ b/app/Http/Controllers/Admin/SubfleetController.php @@ -342,7 +342,6 @@ class SubfleetController extends BaseController $expense->ref_class = Subfleet::class; $expense->ref_class_id = $subfleet->id; $expense->save(); - $subfleet->refresh(); } elseif ($request->isMethod('put')) { $expense = Expense::findOrFail($request->input('expense_id')); $expense->{$request->name} = $request->value; diff --git a/app/Models/Traits/Expensable.php b/app/Models/Traits/Expensable.php index 51fc6f8e..0ef08921 100644 --- a/app/Models/Traits/Expensable.php +++ b/app/Models/Traits/Expensable.php @@ -6,14 +6,9 @@ use App\Models\Expense; trait Expensable { - /** - * Initialize a new journal when a new record is created - */ public static function bootExpensable() { - /*static::created(function ($model) { - $model->initJournal(config('phpvms.currency')); - });*/ + } /** @@ -22,7 +17,11 @@ trait Expensable */ public function expenses() { - return $this->hasMany(Expense::class, 'ref_class_id') - ->where('ref_class', __CLASS__); + return $this->morphMany( + Expense::class, + 'expenses', # overridden by the next two anyway + 'ref_class', + 'ref_class_id' + ); } } diff --git a/app/Routes/admin.php b/app/Routes/admin.php index f847b0fc..9dc419cf 100644 --- a/app/Routes/admin.php +++ b/app/Routes/admin.php @@ -11,6 +11,7 @@ Route::group([ Route::match(['get', 'put'], 'airports/fuel', 'AirportController@fuel'); Route::resource('airports', 'AirportController'); + Route::match(['get', 'post', 'put', 'delete'], 'airports/{id}/expenses', 'AirportController@expenses'); # aircraft and fare associations Route::resource('aircraft', 'AircraftController'); diff --git a/resources/views/admin/airports/edit.blade.php b/resources/views/admin/airports/edit.blade.php index 1df30525..0f7b4319 100644 --- a/resources/views/admin/airports/edit.blade.php +++ b/resources/views/admin/airports/edit.blade.php @@ -1,12 +1,22 @@ @extends('admin.app') @section('title', "Edit \"$airport->name\"") @section('content') -
-
- {!! Form::model($airport, ['route' => ['admin.airports.update', $airport->id], 'method' => 'patch', 'id' => 'airportForm']) !!} - @include('admin.airports.fields') - {!! Form::close() !!} +
+
+ {!! Form::model($airport, [ + 'route' => ['admin.airports.update', $airport->id], + 'method' => 'patch', + 'id' => 'airportForm']) + !!} + @include('admin.airports.fields') + {!! Form::close() !!} +
+
+ +
+
+ @include('admin.airports.expenses') +
-
@endsection @include('admin.airports.script') diff --git a/resources/views/admin/airports/expenses.blade.php b/resources/views/admin/airports/expenses.blade.php new file mode 100644 index 00000000..fd15b8c1 --- /dev/null +++ b/resources/views/admin/airports/expenses.blade.php @@ -0,0 +1,75 @@ +
+
+

expenses

+ @component('admin.components.info') + These expenses are only applied to this airport. + @endcomponent +
+
+ + + @if(count($airport->expenses)) + + + + + + + @endif + + + @foreach($airport->expenses as $expense) + + + + + + + @endforeach + +
NameCost {!! currency(config('phpvms.currency')) !!}Type
+

+ {!! $expense->name !!} +

+
+

+ {!! $expense->amount !!} +

+
+

+ {!! \App\Models\Enums\ExpenseType::label($expense->type) !!} +

+
+ {!! Form::open(['url' => url('/admin/airports/'.$airport->id.'/expenses'), + 'method' => 'delete', 'class' => 'modify_expense form-inline']) !!} + {!! Form::hidden('expense_id', $expense->id) !!} + {!! Form::button('', ['type' => 'submit', + 'class' => 'btn btn-sm btn-danger btn-icon', + 'onclick' => "return confirm('Are you sure?')", + ]) !!} + {!! Form::close() !!} +
+
+
+
+
+ {!! Form::open(['url' => url('/admin/airports/'.$airport->id.'/expenses'), + 'method' => 'post', 'class' => 'modify_expense form-inline']) !!} + {!! Form::input('text', 'name', null, ['class' => 'form-control input-sm', 'placeholder' => 'Name']) !!} + {!! Form::number('amount', null, ['class' => 'form-control input-sm', 'placeholder' => 'Amount']) !!} + {!! Form::select('type', \App\Models\Enums\ExpenseType::select(), null, ['class' => 'select2']) !!} + {!! Form::button(' Add', ['type' => 'submit', + 'class' => 'btn btn-success btn-small']) !!} + {!! Form::close() !!} + +

{{ $errors->first('name') }}

+

{{ $errors->first('amount') }}

+
+
+
+
diff --git a/resources/views/admin/airports/script.blade.php b/resources/views/admin/airports/script.blade.php index 3670eb7e..76ec69d7 100644 --- a/resources/views/admin/airports/script.blade.php +++ b/resources/views/admin/airports/script.blade.php @@ -1,5 +1,39 @@ @section('scripts') @endsection diff --git a/resources/views/admin/subfleets/expenses.blade.php b/resources/views/admin/subfleets/expenses.blade.php index e2e867b2..53bbb2f1 100644 --- a/resources/views/admin/subfleets/expenses.blade.php +++ b/resources/views/admin/subfleets/expenses.blade.php @@ -58,12 +58,15 @@
{!! Form::open(['url' => url('/admin/subfleets/'.$subfleet->id.'/expenses'), 'method' => 'post', 'class' => 'modify_expense form-inline']) !!} - {!! Form::input('text', 'name', null, ['class' => 'form-control input-sm', 'placeholder' => 'Name']) !!} - {!! Form::number('cost', null, ['class' => 'form-control input-sm', 'placeholder' => 'Amount']) !!} + {!! Form::text('name', null, ['class' => 'form-control input-sm', 'placeholder' => 'Name']) !!} + {!! Form::number('amount', null, ['class' => 'form-control input-sm', 'placeholder' => 'Amount']) !!} {!! Form::select('type', \App\Models\Enums\ExpenseType::select(), null, ['class' => 'select2']) !!} {!! Form::button(' Add', ['type' => 'submit', 'class' => 'btn btn-success btn-small']) !!} {!! Form::close() !!} + +

{{ $errors->first('name') }}

+

{{ $errors->first('amount') }}