diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 6823688027..3e1a48ea88 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -54,7 +54,7 @@ class AccountController extends Controller { $subTitle = 'Delete ' . strtolower(e($account->accountType->type)) . ' "' . e($account->name) . '"'; - return View::make('accounts.delete', compact('account', 'subTitle')); + return view('accounts.delete', compact('account', 'subTitle')); } /** @@ -134,7 +134,7 @@ class AccountController extends Controller $journals = $repository->getJournals($account, $page, $range); $subTitle = 'Details for ' . strtolower(e($account->accountType->type)) . ' "' . e($account->name) . '"'; - return View::make('accounts.show', compact('account', 'what', 'range', 'subTitleIcon', 'journals', 'subTitle')); + return view('accounts.show', compact('account', 'what', 'range', 'subTitleIcon', 'journals', 'subTitle')); } /** diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 0022d4bdf3..93afee239e 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -49,7 +49,7 @@ class BudgetController extends Controller */ public function create() { - return View::make('budgets.create')->with('subTitle', 'Create a new budget'); + return view('budgets.create')->with('subTitle', 'Create a new budget'); } /** @@ -61,7 +61,7 @@ class BudgetController extends Controller { $subTitle = 'Delete budget' . e($budget->name) . '"'; - return View::make('budgets.delete', compact('budget', 'subTitle')); + return view('budgets.delete', compact('budget', 'subTitle')); } /** @@ -89,7 +89,7 @@ class BudgetController extends Controller { $subTitle = 'Edit budget "' . e($budget->name) . '"'; - return View::make('budgets.edit', compact('budget', 'subTitle')); + return view('budgets.edit', compact('budget', 'subTitle')); } @@ -117,7 +117,7 @@ class BudgetController extends Controller $budgetMax = Preferences::get('budgetMaximum', 1000); $budgetMaximum = $budgetMax->data; - return View::make('budgets.index', compact('budgetMaximum', 'budgets', 'spent', 'spentPCT', 'overspent', 'amount')); + return view('budgets.index', compact('budgetMaximum', 'budgets', 'spent', 'spentPCT', 'overspent', 'amount')); } /** @@ -137,7 +137,7 @@ class BudgetController extends Controller ->get(['transaction_journals.*']); $subTitle = 'Transactions without a budget in ' . $start->format('F Y'); - return View::make('budgets.noBudget', compact('list', 'subTitle')); + return view('budgets.noBudget', compact('list', 'subTitle')); } /** @@ -176,7 +176,7 @@ class BudgetController extends Controller public function show(Budget $budget, LimitRepetition $repetition = null, BudgetRepositoryInterface $repository) { if (!is_null($repetition->id) && $repetition->budgetLimit->budget->id != $budget->id) { - return View::make('error')->with('message', 'Invalid selection.'); + return view('error')->with('message', 'Invalid selection.'); } $hideBudget = true; // used in transaction list. @@ -184,7 +184,7 @@ class BudgetController extends Controller $limits = !is_null($repetition->id) ? [$repetition->budgetLimit] : $budget->budgetLimits()->orderBy('startdate', 'DESC')->get(); $subTitle = !is_null($repetition->id) ? e($budget->name) . ' in ' . $repetition->startdate->format('F Y') : e($budget->name); - return View::make('budgets.show', compact('limits', 'budget', 'repetition', 'journals', 'subTitle', 'hideBudget')); + return view('budgets.show', compact('limits', 'budget', 'repetition', 'journals', 'subTitle', 'hideBudget')); } /** @@ -216,7 +216,7 @@ class BudgetController extends Controller $date = Session::get('start', Carbon::now()->startOfMonth())->format('FY'); $budgetAmount = Preferences::get('budgetIncomeTotal' . $date, 1000); - return View::make('budgets.income')->with('amount', $budgetAmount); + return view('budgets.income')->with('amount', $budgetAmount); } } diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php new file mode 100644 index 0000000000..d328d92b5e --- /dev/null +++ b/app/Http/Controllers/CategoryController.php @@ -0,0 +1,127 @@ +with('subTitle', 'Create a new category'); + } + + /** + * @param Category $category + * + * @return \Illuminate\View\View + */ + public function delete(Category $category) + { + $subTitle = 'Delete category' . e($category->name) . '"'; + + return view('categories.delete', compact('category', 'subTitle')); + } + + /** + * @param Category $category + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(Category $category, CategoryRepositoryInterface $repository) + { + + $name = $category->name; + $repository->destroy($category); + + Session::flash('success', 'The category "' . e($name) . '" was deleted.'); + + return Redirect::route('categories.index'); + } + + /** + * @param Category $category + * + * @return $this + */ + public function edit(Category $category) + { + $subTitle = 'Edit category "' . e($category->name) . '"'; + + return view('categories.edit', compact('category', 'subTitle')); + + } + + /** + * @return $this + */ + public function index() + { + $categories = Auth::user()->categories()->get(); + + return view('categories.index', compact('categories')); + } + + /** + * @param CategoryFormRequest $request + * @param CategoryRepositoryInterface $repository + * + * @return mixed + */ + public function store(CategoryFormRequest $request, CategoryRepositoryInterface $repository) + { + $categoryData = [ + 'name' => $request->input('name'), + 'user' => Auth::user()->id, + ]; + $category = $repository->store($categoryData); + + Session::flash('success', 'New category "' . $category->name . '" stored!'); + + return Redirect::route('categories.index'); + + } + + + /** + * @param Category $category + * @param CategoryFormRequest $request + * @param CategoryRepositoryInterface $repository + * + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Category $category, CategoryFormRequest $request, CategoryRepositoryInterface $repository) + { + $categoryData = [ + 'name' => $request->input('name'), + ]; + + $repository->update($category, $categoryData); + + Session::flash('success', 'Category "' . $category->name . '" updated.'); + + return Redirect::route('categories.index'); + + } + +} diff --git a/app/Http/Requests/CategoryFormRequest.php b/app/Http/Requests/CategoryFormRequest.php new file mode 100644 index 0000000000..30376b4cd8 --- /dev/null +++ b/app/Http/Requests/CategoryFormRequest.php @@ -0,0 +1,40 @@ + $nameRule, + ]; + } +} \ No newline at end of file diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index c465fd3f79..d126aae49c 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -3,6 +3,7 @@ use Carbon\Carbon; use DaveJamesMiller\Breadcrumbs\Generator; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; +use FireflyIII\Models\Category; use FireflyIII\Models\Budget; use FireflyIII\Models\LimitRepetition; /* diff --git a/app/Http/routes.php b/app/Http/routes.php index e6f6ab2311..0a6fab87ea 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -1,7 +1,8 @@ where('account_types.editable', 1) ->where('accounts.id', $value) ->where('user_id', Auth::user()->id) @@ -27,8 +27,7 @@ Route::bind( Route::bind( 'bill', function ($value, $route) { if (Auth::check()) { - return Bill:: - where('id', $value)->where('user_id', Auth::user()->id)->first(); + return Bill::where('id', $value)->where('user_id', Auth::user()->id)->first(); } return null; @@ -38,8 +37,7 @@ Route::bind( Route::bind( 'budget', function ($value, $route) { if (Auth::check()) { - return Budget:: - where('id', $value)->where('user_id', Auth::user()->id)->first(); + return Budget::where('id', $value)->where('user_id', Auth::user()->id)->first(); } return null; @@ -60,6 +58,16 @@ Route::bind( } ); +Route::bind( + 'category', function ($value, $route) { + if (Auth::check()) { + return Category::where('id', $value)->where('user_id', Auth::user()->id)->first(); + } + + return null; +} +); + /** * Home Controller */ @@ -90,7 +98,7 @@ Route::group( //Route::get('/bills/rescan/{bill}', ['uses' => 'BillController@rescan', 'as' => 'bills.rescan']); # rescan for matching. Route::get('/bills/create', ['uses' => 'BillController@create', 'as' => 'bills.create']); //Route::get('/bills/edit/{bill}', ['uses' => 'BillController@edit', 'as' => 'bills.edit']); -// Route::get('/bills/delete/{bill}', ['uses' => 'BillController@delete', 'as' => 'bills.delete']); + // Route::get('/bills/delete/{bill}', ['uses' => 'BillController@delete', 'as' => 'bills.delete']); Route::get('/bills/show/{bill}', ['uses' => 'BillController@show', 'as' => 'bills.show']); /** @@ -113,11 +121,14 @@ Route::group( * Category Controller */ Route::get('/categories', ['uses' => 'CategoryController@index', 'as' => 'categories.index']); - //Route::get('/categories/create', ['uses' => 'CategoryController@create', 'as' => 'categories.create']); - //Route::get('/categories/edit/{category}', ['uses' => 'CategoryController@edit', 'as' => 'categories.edit']); - //Route::get('/categories/delete/{category}', ['uses' => 'CategoryController@delete', 'as' => 'categories.delete']); + Route::get('/categories/create', ['uses' => 'CategoryController@create', 'as' => 'categories.create']); + Route::get('/categories/edit/{category}', ['uses' => 'CategoryController@edit', 'as' => 'categories.edit']); + Route::get('/categories/delete/{category}', ['uses' => 'CategoryController@delete', 'as' => 'categories.delete']); Route::get('/categories/show/{category}', ['uses' => 'CategoryController@show', 'as' => 'categories.show']); - //Route::get('/categories/list/noCategory', ['uses' => 'CategoryController@noCategory', 'as' => 'categories.noCategory']); + Route::get('/categories/list/noCategory', ['uses' => 'CategoryController@noCategory', 'as' => 'categories.noCategory']); + Route::post('/categories/store', ['uses' => 'CategoryController@store', 'as' => 'categories.store']); + Route::post('/categories/update/{category}', ['uses' => 'CategoryController@update', 'as' => 'categories.update']); + Route::post('/categories/destroy/{category}', ['uses' => 'CategoryController@destroy', 'as' => 'categories.destroy']); /** * Currency Controller diff --git a/app/Models/Category.php b/app/Models/Category.php index 1d9ceb0678..37f12c7ca8 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -12,6 +12,8 @@ class Category extends Model { use SoftDeletes; + protected $fillable = ['user_id', 'name']; + /** * @return array */ diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index cbfeb35313..26ab9d0ebd 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -59,7 +59,9 @@ class FireflyServiceProvider extends ServiceProvider // preferences $this->app->bind('FireflyIII\Repositories\Account\AccountRepositoryInterface', 'FireflyIII\Repositories\Account\AccountRepository'); $this->app->bind('FireflyIII\Repositories\Budget\BudgetRepositoryInterface', 'FireflyIII\Repositories\Budget\BudgetRepository'); + $this->app->bind('FireflyIII\Repositories\Category\CategoryRepositoryInterface', 'FireflyIII\Repositories\Category\CategoryRepository'); $this->app->bind('FireflyIII\Repositories\Journal\JournalRepositoryInterface', 'FireflyIII\Repositories\Journal\JournalRepository'); + } } \ No newline at end of file diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php new file mode 100644 index 0000000000..cc168bb0b9 --- /dev/null +++ b/app/Repositories/Category/CategoryRepository.php @@ -0,0 +1,61 @@ +delete(); + + return true; + } + + + /** + * @param array $data + * + * @return Category + */ + public function store(array $data) + { + $newCategory = new Category( + [ + 'user_id' => $data['user'], + 'name' => $data['name'], + ] + ); + $newCategory->save(); + + return $newCategory; + } + + /** + * @param Category $category + * @param array $data + * + * @return Category + */ + public function update(Category $category, array $data) + { + // update the account: + $category->name = $data['name']; + $category->save(); + + return $category; + } + +} \ No newline at end of file diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php new file mode 100644 index 0000000000..5850dd4d37 --- /dev/null +++ b/app/Repositories/Category/CategoryRepositoryInterface.php @@ -0,0 +1,34 @@ +getName()) !!} +{!! Form::open(['class' => 'form-horizontal','id' => 'store','url' => route('categories.store')]) !!} + +
+
+
+
+ Mandatory fields +
+
+ {!! ExpandedForm::text('name') !!} +
+
+

+ +

+
+ +
+ + +
+
+ Options +
+
+ {!! ExpandedForm::optionsList('create','category') !!} +
+
+ +
+
+ +{!! Form::close() !!} + + +@stop diff --git a/resources/views/categories/delete.blade.php b/resources/views/categories/delete.blade.php new file mode 100644 index 0000000000..77353b9faf --- /dev/null +++ b/resources/views/categories/delete.blade.php @@ -0,0 +1,27 @@ +@extends('layouts.default') +@section('content') +{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName(), $category) !!} +{!! Form::open(['class' => 'form-horizontal','id' => 'destroy','url' => route('categories.destroy',$category->id)]) !!} +
+
+
+
+ Delete category "{{{$category->name}}}" +
+
+

+ Are you sure? +

+ +

+ + Cancel +

+
+
+
+
+ + +{!! Form::close()!!} +@stop diff --git a/resources/views/categories/edit.blade.php b/resources/views/categories/edit.blade.php new file mode 100644 index 0000000000..53d53d9c9e --- /dev/null +++ b/resources/views/categories/edit.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.default') +@section('content') +{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName(), $category) !!} +{!! Form::model($category, ['class' => 'form-horizontal','id' => 'update','url' => route('categories.update',$category->id)]) !!} + +
+
+
+
+ Mandatory fields +
+
+ {!! ExpandedForm::text('name') !!} +
+
+

+ +

+
+
+ + + +
+
+ Options +
+
+ {!! ExpandedForm::optionsList('update','category') !!} +
+
+ +
+
+ +{!! Form::close() !!} +@stop diff --git a/resources/views/categories/index.blade.php b/resources/views/categories/index.blade.php new file mode 100644 index 0000000000..fbb537b6c0 --- /dev/null +++ b/resources/views/categories/index.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.default') +@section('content') +{!! Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName()) !!} +
+
+
+
+ Categories + + +
+
+ + +
+
+ + +
+ @include('list.categories') +
+
+
+@stop +@section('scripts') + + + + + + +@stop diff --git a/resources/views/categories/noCategory.blade.php b/resources/views/categories/noCategory.blade.php new file mode 100644 index 0000000000..dea483315f --- /dev/null +++ b/resources/views/categories/noCategory.blade.php @@ -0,0 +1,24 @@ +@extends('layouts.default') +@section('content') +{{ Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName()) }} +
+
+ + @include('partials.date_nav') +
+
+
+
+
+
+ {{{$subTitle}}} +
+
+ @include('list.journals-full',['journals' => $list]) +
+
+
+
+ + +@stop diff --git a/resources/views/categories/show.blade.php b/resources/views/categories/show.blade.php new file mode 100644 index 0000000000..bdfefd3e52 --- /dev/null +++ b/resources/views/categories/show.blade.php @@ -0,0 +1,42 @@ +@extends('layouts.default') +@section('content') +{{ Breadcrumbs::renderIfExists(Route::getCurrentRoute()->getName(), $category) }} +
+
+
+
+ Overview +
+
+
+
+
+ +
+
+ Transactions +
+
+ @include('list.journals-full') +
+
+
+
+ BLa bla something here. +
+
+ +@stop +@section('scripts') + + + +{{HTML::script('assets/javascript/firefly/gcharts.options.js')}} +{{HTML::script('assets/javascript/firefly/gcharts.js')}} +{{HTML::script('assets/javascript/firefly/categories.js')}} + +@stop diff --git a/resources/views/list/categories.blade.php b/resources/views/list/categories.blade.php new file mode 100644 index 0000000000..789481e63e --- /dev/null +++ b/resources/views/list/categories.blade.php @@ -0,0 +1,29 @@ + + + + + + + + + + + + @foreach($categories as $category) + + + + + + @endforeach +
 NameLast activity
 Without a category 
+
+ + +
+
+ {{{$category->name}}} + + + Never +
diff --git a/tests/functional/BudgetControllerCest.php b/tests/functional/BudgetControllerCest.php index 0635587438..7259be9975 100644 --- a/tests/functional/BudgetControllerCest.php +++ b/tests/functional/BudgetControllerCest.php @@ -239,5 +239,4 @@ class BudgetControllerCest $I->wantTo('update my monthly income'); $I->see('Update (expected) income for '); } - }