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 @@
+
+
+
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.
+