From e4f04583a3c6ea763d85fb08fe3cf51e8ea017ee Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 17 Aug 2014 08:45:22 +0200 Subject: [PATCH] Added the ability to manually add or remove money from piggy banks (issue #6) [skip ci] --- app/controllers/PiggybankController.php | 63 ++++++++++++++++++- .../Piggybank/EloquentPiggybankRepository.php | 60 +++++++++++++----- .../PiggybankRepositoryInterface.php | 24 ++++--- .../Piggybanks/EloquentPiggybankTrigger.php | 11 ++-- app/models/Account.php | 8 +++ app/models/Piggybank.php | 2 + app/routes.php | 6 ++ app/views/piggybanks/index.blade.php | 35 +++++++++-- app/views/piggybanks/modifyAmount.blade.php | 62 ++++++++++++++++++ app/views/piggybanks/show.blade.php | 6 ++ 10 files changed, 245 insertions(+), 32 deletions(-) create mode 100644 app/views/piggybanks/modifyAmount.blade.php diff --git a/app/controllers/PiggybankController.php b/app/controllers/PiggybankController.php index 3e6796724e..f97ce96aae 100644 --- a/app/controllers/PiggybankController.php +++ b/app/controllers/PiggybankController.php @@ -1,6 +1,6 @@ _accounts = $accounts; } + /** + * @param Piggybank $piggyBank + */ + public function addMoney(Piggybank $piggyBank) + { + $what = 'add'; + $maxAdd = $this->_repository->leftOnAccount($piggyBank->account); + $maxRemove = null; + + return View::make('piggybanks.modifyAmount')->with('what', $what)->with('maxAdd', $maxAdd)->with( + 'maxRemove', $maxRemove + )->with('piggybank', $piggyBank); + } + /** * @return $this */ @@ -46,7 +60,6 @@ class PiggybankController extends BaseController return View::make('piggybanks.create-repeated')->with('accounts', $accounts)->with('periods', $periods); } - /** * @param Piggybank $piggyBank * @@ -101,11 +114,57 @@ class PiggybankController extends BaseController $countNonRepeating = $this->_repository->countNonrepeating(); $piggybanks = $this->_repository->get(); + return View::make('piggybanks.index')->with('piggybanks', $piggybanks) ->with('countRepeating', $countRepeating) ->with('countNonRepeating', $countNonRepeating); } + /** + * @param Piggybank $piggyBank + */ + public function modMoney(Piggybank $piggyBank) + { + var_dump(Input::all()); + $amount = floatval(Input::get('amount')); + switch (Input::get('what')) { + default: + throw new FireflyException('No such action'); + break; + case 'add': + $maxAdd = $this->_repository->leftOnAccount($piggyBank->account); + if ($amount <= min($maxAdd, $piggyBank->targetamount)) { + Session::flash('success','Amount updated!'); + $this->_repository->modifyAmount($piggyBank, $amount); + } else { + Session::flash('warning','Could not!'); + } + break; + case 'remove': + $maxRemove = $piggyBank->currentRelevantRep()->currentamount; + if($amount <= $maxRemove) { + $this->_repository->modifyAmount($piggyBank, ($amount * -1)); + } + break; + } + + return Redirect::route('piggybanks.index'); + } + + /** + * @param Piggybank $piggyBank + */ + public function removeMoney(Piggybank $piggyBank) + { + $what = 'remove'; + $maxAdd = $this->_repository->leftOnAccount($piggyBank->account); + $maxRemove = $piggyBank->currentRelevantRep()->currentamount; + + return View::make('piggybanks.modifyAmount')->with('what', $what)->with('maxAdd', $maxAdd)->with( + 'maxRemove', $maxRemove + )->with('piggybank', $piggyBank); + } + /** * */ diff --git a/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php b/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php index dafd2b750e..702d2341fd 100644 --- a/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php +++ b/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php @@ -69,7 +69,51 @@ class EloquentPiggybankRepository implements PiggybankRepositoryInterface */ public function get() { - return \Auth::user()->piggybanks()->with(['account', 'piggybankrepetitions'])->get(); + $piggies = \Auth::user()->piggybanks()->with(['account', 'piggybankrepetitions'])->get(); + + foreach($piggies as $pig) { + $pig->leftInAccount = $this->leftOnAccount($pig->account); + } + return $piggies; + } + + /** + * @param \Account $account + * + * @return mixed|void + */ + public function leftOnAccount(\Account $account) + { + $balance = $account->balance(); + /** @var \Piggybank $p */ + foreach ($account->piggybanks()->get() as $p) { + $balance -= $p->currentRelevantRep()->currentamount; + } + + return $balance; + + } + + + /** + * @param \Piggybank $piggyBank + * @param $amount + * + * @return bool|mixed + */ + public function modifyAmount(\Piggybank $piggyBank, $amount) + { + $rep = $piggyBank->currentRelevantRep(); + \Log::debug('Amount before: ' . $rep->currentamount); + $rep->currentamount += $amount; + \Log::debug('Amount after: ' . $rep->currentamount); + \Log::debug('validates: ' . $rep->validate()); + \Log::debug(print_r($rep->toArray(),true)); + $rep->save(); + + + return true; + } /** @@ -182,18 +226,4 @@ class EloquentPiggybankRepository implements PiggybankRepositoryInterface } - /** - * @param \Piggybank $piggyBank - * @param $amount - * - * @return mixed|void - */ - public function updateAmount(\Piggybank $piggyBank, $amount) - { - $piggyBank->amount = floatval($amount); - if ($piggyBank->validate()) { - $piggyBank->save(); - } - - } } \ No newline at end of file diff --git a/app/lib/Firefly/Storage/Piggybank/PiggybankRepositoryInterface.php b/app/lib/Firefly/Storage/Piggybank/PiggybankRepositoryInterface.php index 99227ee34f..6cf757b137 100644 --- a/app/lib/Firefly/Storage/Piggybank/PiggybankRepositoryInterface.php +++ b/app/lib/Firefly/Storage/Piggybank/PiggybankRepositoryInterface.php @@ -45,6 +45,23 @@ interface PiggybankRepositoryInterface */ public function get(); + /** + * Will tell you how much money is left on this account. + * + * @param \Account $account + * + * @return mixed + */ + public function leftOnAccount(\Account $account); + + /** + * @param \Piggybank $piggyBank + * @param $amount + * + * @return mixed + */ + public function modifyAmount(\Piggybank $piggyBank, $amount); + /** * @param $data * @@ -60,12 +77,5 @@ interface PiggybankRepositoryInterface */ public function update(\Piggybank $piggy, $data); - /** - * @param \Piggybank $piggyBank - * @param $amount - * - * @return mixed - */ - public function updateAmount(\Piggybank $piggyBank, $amount); } \ No newline at end of file diff --git a/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php b/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php index f9f4b7f912..73069c14c5 100644 --- a/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php +++ b/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php @@ -52,12 +52,15 @@ class EloquentPiggybankTrigger $reps = $piggy->piggybankrepetitions()->get(); /** @var \PiggybankRepetition $rep */ foreach ($reps as $rep) { - $sum = \Transaction::where('piggybank_id', $piggy->id)->leftJoin( + if ($rep->currentamount == 0) { + $sum = \Transaction::where('piggybank_id', $piggy->id)->leftJoin( 'transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id' )->where('transaction_journals.date', '>=', $rep->startdate->format('Y-m-d'))->where( - 'transaction_journals.date', '<=', $rep->targetdate->format('Y-m-d') - )->sum('transactions.amount'); - $rep->currentamount = floatval($sum); + 'transaction_journals.date', '<=', $rep->targetdate->format('Y-m-d') + )->sum('transactions.amount'); + + $rep->currentamount = floatval($sum); + } $rep->save(); diff --git a/app/models/Account.php b/app/models/Account.php index 7ec36d36a7..8d6bc2d00b 100644 --- a/app/models/Account.php +++ b/app/models/Account.php @@ -92,6 +92,14 @@ class Account extends Ardent return $this->hasMany('Transaction'); } + /** + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function piggybanks() + { + return $this->hasMany('Piggybank'); + } + /** * @param \Carbon\Carbon $date * diff --git a/app/models/Piggybank.php b/app/models/Piggybank.php index 6256ef861d..25dff01b90 100644 --- a/app/models/Piggybank.php +++ b/app/models/Piggybank.php @@ -177,6 +177,8 @@ class Piggybank extends Ardent /** * Grabs the PiggyBankRepetition that's currently relevant / active + * + * @returns \PiggybankRepetition */ public function currentRelevantRep() { return $this->piggybankrepetitions() diff --git a/app/routes.php b/app/routes.php index 5f22ccc253..c5c6e3442d 100644 --- a/app/routes.php +++ b/app/routes.php @@ -137,6 +137,10 @@ Route::group(['before' => 'auth'], function () { Route::get('/piggybanks',['uses' => 'PiggybankController@index','as' => 'piggybanks.index']); Route::get('/piggybanks/create/piggybank', ['uses' => 'PiggybankController@createPiggybank','as' => 'piggybanks.create.piggybank']); Route::get('/piggybanks/create/repeated', ['uses' => 'PiggybankController@createRepeated','as' => 'piggybanks.create.repeated']); + + Route::get('/piggybanks/addMoney/{piggybank}', ['uses' => 'PiggybankController@addMoney','as' => 'piggybanks.amount.add']); + Route::get('/piggybanks/removeMoney/{piggybank}', ['uses' => 'PiggybankController@removeMoney','as' => 'piggybanks.amount.remove']); + Route::get('/piggybanks/show/{piggybank}', ['uses' => 'PiggybankController@show','as' => 'piggybanks.show']); Route::get('/piggybanks/edit/{piggybank}', ['uses' => 'PiggybankController@edit','as' => 'piggybanks.edit']); Route::get('/piggybanks/delete/{piggybank}', ['uses' => 'PiggybankController@delete','as' => 'piggybanks.delete']); @@ -204,6 +208,8 @@ Route::group(['before' => 'csrf|auth'], function () { Route::post('/piggybanks/store/repeated',['uses' => 'PiggybankController@storeRepeated','as' => 'piggybanks.store.repeated']); Route::post('/piggybanks/update/{piggybank}', ['uses' => 'PiggybankController@update','as' => 'piggybanks.update']); Route::post('/piggybanks/destroy/{piggybank}', ['uses' => 'PiggybankController@destroy','as' => 'piggybanks.destroy']); + Route::post('/piggybanks/mod/{piggybank}', ['uses' => 'PiggybankController@modMoney','as' => 'piggybanks.modMoney']); + // preferences controller Route::post('/preferences', ['uses' => 'PreferencesController@postIndex']); diff --git a/app/views/piggybanks/index.blade.php b/app/views/piggybanks/index.blade.php index 5e72804037..b01ab75d5d 100644 --- a/app/views/piggybanks/index.blade.php +++ b/app/views/piggybanks/index.blade.php @@ -66,9 +66,17 @@ @endif

-
+
+ @if($piggyBank->leftInAccount > 0) + Add money + @endif + @if($piggyBank->currentRelevantRep()->currentamount > 0) + Remove money + @endif + +
@@ -114,9 +122,16 @@

-
- - +
+ + @if($piggyBank->leftInAccount > 0) + Add money + @endif + @if($piggyBank->currentRelevantRep()->currentamount > 0) + Remove money + @endif + +
@endif @@ -125,6 +140,18 @@ @endif
+ + + + + + @stop @section('scripts') diff --git a/app/views/piggybanks/modifyAmount.blade.php b/app/views/piggybanks/modifyAmount.blade.php new file mode 100644 index 0000000000..12b5699a5a --- /dev/null +++ b/app/views/piggybanks/modifyAmount.blade.php @@ -0,0 +1,62 @@ + +
+ + {{Form::token()}} + + +
+ diff --git a/app/views/piggybanks/show.blade.php b/app/views/piggybanks/show.blade.php index 5787904024..84b2484361 100644 --- a/app/views/piggybanks/show.blade.php +++ b/app/views/piggybanks/show.blade.php @@ -5,6 +5,12 @@

Firefly Piggy bank "{{{$piggyBank->name}}}"

+

+ {{{$piggyBank->account->name}}} has + a balance of {{mf($piggyBank->account->balance())}}. + Of that {{mf($piggyBank->account->balance())}}, you have {{mf(0)}} not yet locked up in other piggy banks. + You can add {{mf(max(0,1))}} to this piggy bank. +