From f5330728d4dfe4ee8a5d59e05440db226e52a98a Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 19 Aug 2014 06:57:11 +0200 Subject: [PATCH] Some cleaning up in the whole piggy bank section. More narrow events and stricter code. Still not catching some events, so it'll eventually all break down. [skip ci] --- app/controllers/PiggybankController.php | 18 +- .../Piggybank/EloquentPiggybankRepository.php | 7 - .../EloquentTransactionJournalRepository.php | 47 +- .../Piggybanks/EloquentPiggybankTrigger.php | 472 +++++++++++++----- app/models/Piggybank.php | 103 ++-- app/models/Transaction.php | 5 +- 6 files changed, 475 insertions(+), 177 deletions(-) diff --git a/app/controllers/PiggybankController.php b/app/controllers/PiggybankController.php index b76a1e28f6..63922f9bfa 100644 --- a/app/controllers/PiggybankController.php +++ b/app/controllers/PiggybankController.php @@ -77,8 +77,9 @@ class PiggybankController extends BaseController */ public function destroy(Piggybank $piggyBank) { + Event::fire('piggybanks.destroy', [$piggyBank]); $this->_repository->destroy($piggyBank); - Event::fire('piggybanks.change'); + Session::flash('success', 'Piggy bank deleted.'); return Redirect::route('piggybanks.index'); @@ -109,7 +110,6 @@ class PiggybankController extends BaseController */ public function index() { - Event::fire('piggybanks.change'); $countRepeating = $this->_repository->countRepeating(); $countNonRepeating = $this->_repository->countNonrepeating(); @@ -120,10 +120,10 @@ class PiggybankController extends BaseController $accounts = []; /** @var \Piggybank $piggybank */ - foreach($piggybanks as $piggybank) { + foreach ($piggybanks as $piggybank) { $account = $piggybank->account; $id = $account->id; - if(!isset($accounts[$id])) { + if (!isset($accounts[$id])) { $accounts[$id] = ['account' => $account, 'left' => $this->_repository->leftOnAccount($account)]; } } @@ -131,7 +131,7 @@ class PiggybankController extends BaseController return View::make('piggybanks.index')->with('piggybanks', $piggybanks) ->with('countRepeating', $countRepeating) ->with('countNonRepeating', $countNonRepeating) - ->with('accounts',$accounts); + ->with('accounts', $accounts); } /** @@ -152,6 +152,7 @@ class PiggybankController extends BaseController if (round($amount, 2) <= round(min($maxAdd, $piggyBank->targetamount), 2)) { Session::flash('success', 'Amount updated!'); $this->_repository->modifyAmount($piggyBank, $amount); + Event::fire('piggybanks.modifyAmountAdd', [$piggyBank, $amount]); } else { Session::flash('warning', 'Could not!'); } @@ -162,6 +163,7 @@ class PiggybankController extends BaseController if (round($amount, 2) <= round($maxRemove, 2)) { Session::flash('success', 'Amount updated!'); $this->_repository->modifyAmount($piggyBank, ($amount * -1)); + Event::fire('piggybanks.modifyAmountRemove', [$piggyBank, ($amount * -1)]); } else { Session::flash('warning', 'Could not!'); } @@ -210,7 +212,7 @@ class PiggybankController extends BaseController $piggyBank = $this->_repository->store($data); if (!is_null($piggyBank->id)) { Session::flash('success', 'New piggy bank "' . $piggyBank->name . '" created!'); - Event::fire('piggybanks.change'); + Event::fire('piggybanks.storePiggy',[$piggyBank]); return Redirect::route('piggybanks.index'); @@ -239,7 +241,7 @@ class PiggybankController extends BaseController $piggyBank = $this->_repository->store($data); if ($piggyBank->id) { Session::flash('success', 'New piggy bank "' . $piggyBank->name . '" created!'); - Event::fire('piggybanks.change'); + Event::fire('piggybanks.storeRepeated',[$piggyBank]); return Redirect::route('piggybanks.index'); @@ -259,7 +261,7 @@ class PiggybankController extends BaseController $piggyBank = $this->_repository->update($piggyBank, Input::all()); if ($piggyBank->validate()) { Session::flash('success', 'Piggy bank "' . $piggyBank->name . '" updated.'); - Event::fire('piggybanks.change'); + Event::fire('piggybanks.update',[$piggyBank]); return Redirect::route('piggybanks.index'); } else { diff --git a/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php b/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php index 2cd6710358..7daf85d7f8 100644 --- a/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php +++ b/app/lib/Firefly/Storage/Piggybank/EloquentPiggybankRepository.php @@ -107,13 +107,6 @@ class EloquentPiggybankRepository implements PiggybankRepositoryInterface if (!is_null($rep)) { $rep->currentamount += $amount; $rep->save(); - - // create event: - $event = new \PiggybankEvent; - $event->date = new Carbon; - $event->amount = $amount; - $event->piggybank()->associate($piggyBank); - $event->save(); } diff --git a/app/lib/Firefly/Storage/TransactionJournal/EloquentTransactionJournalRepository.php b/app/lib/Firefly/Storage/TransactionJournal/EloquentTransactionJournalRepository.php index ece635ea00..65a180bbed 100644 --- a/app/lib/Firefly/Storage/TransactionJournal/EloquentTransactionJournalRepository.php +++ b/app/lib/Firefly/Storage/TransactionJournal/EloquentTransactionJournalRepository.php @@ -332,6 +332,9 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito // connect the piggy to it: $transaction->piggybank()->associate($piggyBank); $transaction->save(); + \Event::fire( + 'piggybanks.createRelatedTransfer', [$piggyBank, $transactionJournal, $transaction] + ); } else { \Session::flash( 'warning', @@ -388,6 +391,7 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito if (!is_null($journal->budgets()->first())) { $journal->budgets()->detach($journal->budgets()->first()->id); } + // remove previous piggy bank, if any: $category = isset($data['category']) ? $catRepository->findByName($data['category']) : null; @@ -395,8 +399,18 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito $journal->categories()->attach($category); } // update the amounts: - /** @var \Transaction $transaction */ $transactions = $journal->transactions()->orderBy('amount', 'ASC')->get(); + + // remove previous piggy bank, if any: + /** @var \Transaction $transaction */ + foreach ($transactions as $transaction) { + if (!is_null($transaction->piggybank()->first())) { + $transaction->piggybank()->detach($transaction->piggybank()->first()->first()); + $transaction->save(); + } + } + unset($transaction); + $transactions[0]->amount = $amount * -1; $transactions[1]->amount = $amount; @@ -432,6 +446,37 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito $journal->transactions[0]->account()->associate($fromAccount); $journal->transactions[1]->account()->associate($toAccount); + // attach the new piggy bank, if valid: + /** @var \Firefly\Storage\Piggybank\PiggybankRepositoryInterface $piggyRepository */ + $piggyRepository = \App::make('Firefly\Storage\Piggybank\PiggybankRepositoryInterface'); + + if (isset($data['piggybank_id'])) { + /** @var \Piggybank $piggyBank */ + $piggyBank = $piggyRepository->find(intval($data['piggybank_id'])); + + if ($piggyBank) { + if ($toAccount->id == $piggyBank->account_id) { + + // find the transaction connected to the $toAccount: + /** @var \Transaction $transaction */ + $transaction + = $journal->transactions()->where('account_id', $toAccount->id)->first(); + // connect the piggy to it: + $transaction->piggybank()->associate($piggyBank); + $transaction->save(); + \Event::fire('piggybanks.updateRelatedTransfer', [$piggyBank, $journal]); + } else { + \Session::flash( + 'warning', + 'Piggy bank "' . e($piggyBank->name) . '" is not set to draw money from account "' . e( + $toAccount->name + ) . '", so the money isn\'t added to the piggy bank.' + ); + } + } + } + + break; default: throw new FireflyException('Cannot edit this!'); diff --git a/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php b/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php index 680b864e47..c4914f2e31 100644 --- a/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php +++ b/app/lib/Firefly/Trigger/Piggybanks/EloquentPiggybankTrigger.php @@ -3,7 +3,6 @@ namespace Firefly\Trigger\Piggybanks; use Carbon\Carbon; -use Illuminate\Database\QueryException; use Illuminate\Events\Dispatcher; /** @@ -14,149 +13,362 @@ use Illuminate\Events\Dispatcher; class EloquentPiggybankTrigger { /** - * @param Dispatcher $events + * @param \Piggybank $piggyBank + * @param \TransactionJournal $journal */ - public function subscribe(Dispatcher $events) + public function createRelatedTransfer( + \Piggybank $piggyBank, \TransactionJournal $journal, \Transaction $transaction + ) { + $repetition = $piggyBank->repetitionForDate($journal->date); + if (!is_null($repetition)) { + // get the amount transferred TO this + $amount = floatval($transaction->amount); + $repetition->currentamount += $amount; + $repetition->save(); + } else { + \Session::flash('warning', 'Cannot add transfer to piggy, outside of scope.'); + } + + return true; + } + + /** + * @param \Piggybank $piggyBank + * + * @return bool + */ + public function destroy(\Piggybank $piggyBank) { - $events->listen( - 'piggybanks.change', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@updatePiggybankRepetitions' - ); + return true; + } + + /** + * @param \Piggybank $piggyBank + * @param $amount + */ + public function modifyAmountAdd(\Piggybank $piggyBank, $amount) + { + $rep = $piggyBank->currentRelevantRep(); + $today = new Carbon; + + // create event: + $event = new \PiggybankEvent; + $event->date = new Carbon; + $event->amount = $amount; + $event->piggybank()->associate($piggyBank); + + // for future / past repetitions. + if (!($rep->startdate >= $today && $rep->targetdate <= $today)) { + $event->date = $rep->startdate; + } + + + $event->save(); + } + + /** + * @param \Piggybank $piggyBank + * @param $amount + */ + public function modifyAmountRemove(\Piggybank $piggyBank, $amount) + { + // create event: + $event = new \PiggybankEvent; + $event->date = new Carbon; + $event->amount = $amount; + $event->piggybank()->associate($piggyBank); + $event->save(); + } + + /** + * @param \Piggybank $piggyBank + */ + public function storePiggy(\Piggybank $piggyBank) + { + $rep = new \PiggybankRepetition; + $rep->piggybank()->associate($piggyBank); + $rep->targetdate = $piggyBank->targetdate; + $rep->startdate = $piggyBank->startdate; + $rep->currentamount = 0; + $rep->save(); + + return true; } /** + * @param \Piggybank $piggyBank * + * @return bool */ - public function updatePiggybankRepetitions() + public function storeRepeated(\Piggybank $piggyBank) { - // grab all piggy banks. - if (\Auth::check()) { - $piggybanks = \Auth::user()->piggybanks()->with(['piggybankrepetitions'])->where('repeats', 0)->get(); - $today = new Carbon; - /** @var \Piggybank $piggy */ - foreach ($piggybanks as $piggy) { - if (count($piggy->piggybankrepetitions) == 0) { - $rep = new \PiggybankRepetition; - $rep->piggybank()->associate($piggy); - $rep->targetdate = $piggy->targetdate; - $rep->startdate = $piggy->startdate; - $rep->currentamount = 0; - try { - $rep->save(); - } catch (QueryException $e) { - } + // loop from start to today or something + $rep = new \PiggybankRepetition; + $rep->piggybank()->associate($piggyBank); + $rep->startdate = $piggyBank->startdate; + $rep->targetdate = $piggyBank->targetdate; + $rep->currentamount = 0; + $rep->save(); + unset($rep); + $today = new Carbon; + + if ($piggyBank->targetdate <= $today) { + // add 1 month to startdate, or maybe X period, like 3 weeks. + $startTarget = clone $piggyBank->targetdate; + while ($startTarget <= $today) { + $startCurrent = clone $startTarget; + + // add some kind of period to start current making $endCurrent. + $endCurrent = clone $startCurrent; + switch ($piggyBank->rep_length) { + default: + return true; + break; + case 'day': + $endCurrent->addDays($piggyBank->rep_every); + break; + case 'week': + $endCurrent->addWeeks($piggyBank->rep_every); + break; + case 'month': + $endCurrent->addMonths($piggyBank->rep_every); + break; + case 'year': + $endCurrent->addYears($piggyBank->rep_every); + break; } - // whatever we did here, we now have all repetitions for this - // piggy bank, and we can find transactions that fall within - // that repetition (to fix the "saved amount". - $reps = $piggy->piggybankrepetitions()->get(); - - /** @var \PiggybankRepetition $rep */ - foreach ($reps as $rep) { - $query = \Transaction::where('piggybank_id', $piggy->id)->leftJoin( - 'transaction_journals', 'transaction_journals.id', '=', - 'transactions.transaction_journal_id' - ); - if (!is_null($rep->startdate)) { - $query->where('transaction_journals.date', '>=', $rep->startdate->format('Y-m-d')); - } - if (!is_null($rep->targetdate)) { - $query->where( - 'transaction_journals.date', '<=', $rep->targetdate->format('Y-m-d') - ); - } - - // get events for piggy bank, save those as well: - $eventSumQuery = $piggy->piggybankevents(); - if(!is_null($rep->startdate)) { - $eventSumQuery->where('date','>=',$rep->startdate->format('Y-m-d')); - } - if(!is_null($rep->targetdate)) { - $eventSumQuery->where('date','<=',$rep->targetdate->format('Y-m-d')); - } - $eventSum = floatval($eventSumQuery->sum('amount')); - - - $sum = $query->sum('transactions.amount'); - $rep->currentamount = floatval($sum) + $eventSum; - $rep->save(); - - - } - - } - unset($piggy, $piggybanks, $rep); - - // grab all repeated transactions. - $repeatedExpenses = \Auth::user()->piggybanks()->with(['piggybankrepetitions'])->where('repeats', 1)->get(); - /** @var \Piggybank $repeated */ - foreach ($repeatedExpenses as $repeated) { - // loop from start to today or something $rep = new \PiggybankRepetition; - $rep->piggybank()->associate($repeated); - $rep->startdate = $repeated->startdate; - $rep->targetdate = $repeated->targetdate; + $rep->piggybank()->associate($piggyBank); + $rep->startdate = $startCurrent; + $rep->targetdate = $endCurrent; $rep->currentamount = 0; - try { - $rep->save(); - } catch (QueryException $e) { - } - unset($rep); - - if ($repeated->targetdate <= $today) { - // add 1 month to startdate, or maybe X period, like 3 weeks. - $startTarget = clone $repeated->targetdate; - while ($startTarget <= $today) { - $startCurrent = clone $startTarget; - - // add some kind of period to start current making $endCurrent. - $endCurrent = clone $startCurrent; - switch ($repeated->rep_length) { - default: - die('No rep lengt!'); - break; - case 'day': - $endCurrent->addDays($repeated->rep_every); - break; - case 'week': - $endCurrent->addWeeks($repeated->rep_every); - break; - case 'month': - $endCurrent->addMonths($repeated->rep_every); - break; - case 'year': - $endCurrent->addYears($repeated->rep_every); - break; - } - - $rep = new \PiggybankRepetition; - $rep->piggybank()->associate($repeated); - $rep->startdate = $startCurrent; - $rep->targetdate = $endCurrent; - $rep->currentamount = 0; - $startTarget = $endCurrent; - try { - $rep->save(); - } catch (QueryException $e) { - - } - } - } - $reps = $repeated->piggybankrepetitions()->get(); - /** @var \PiggybankRepetition $rep */ - foreach ($reps as $rep) { - $sum = \Transaction::where('piggybank_id', $repeated->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); - $rep->save(); - - - } + $startTarget = $endCurrent; + $rep->save(); } } + + return true; } + + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen('piggybanks.destroy', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@destroy'); + + $events->listen( + 'piggybanks.modifyAmountAdd', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@modifyAmountAdd' + ); + $events->listen( + 'piggybanks.modifyAmountRemove', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@modifyAmountRemove' + ); + $events->listen('piggybanks.storePiggy', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@storePiggy'); + $events->listen( + 'piggybanks.storeRepeated', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@storeRepeated' + ); + $events->listen('piggybanks.update', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@update'); + $events->listen( + 'piggybanks.createRelatedTransfer', + 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@createRelatedTransfer' + ); + $events->listen( + 'piggybanks.updateRelatedTransfer', + 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@updateRelatedTransfer' + ); + } + + public function update(\Piggybank $piggyBank) + { + // delete all repetitions: + foreach ($piggyBank->piggybankrepetitions()->get() as $rep) { + $rep->delete(); + } + unset($rep); + + // trigger "new" piggy bank to recreate them. + if ($piggyBank->repeats == 1) { + \Event::fire('piggybanks.storeRepeated', [$piggyBank]); + } else { + \Event::fire('piggybanks.storePiggy', [$piggyBank]); + } + // loop the repetitions and update them according to the events and the transactions: + foreach ($piggyBank->piggybankrepetitions()->get() as $rep) { + // SUM for transactions + $query = \Transaction::where('piggybank_id', $piggyBank->id)->leftJoin( + 'transaction_journals', 'transaction_journals.id', '=', + 'transactions.transaction_journal_id' + ); + if (!is_null($rep->startdate)) { + $query->where('transaction_journals.date', '>=', $rep->startdate->format('Y-m-d')); + } + if (!is_null($rep->targetdate)) { + $query->where( + 'transaction_journals.date', '<=', $rep->targetdate->format('Y-m-d') + ); + } + $sum = $query->sum('transactions.amount'); + + // get events for piggy bank, save those as well: + $eventSumQuery = $piggyBank->piggybankevents(); + if (!is_null($rep->startdate)) { + $eventSumQuery->where('date', '>=', $rep->startdate->format('Y-m-d')); + } + if (!is_null($rep->targetdate)) { + $eventSumQuery->where('date', '<=', $rep->targetdate->format('Y-m-d')); + } + $eventSum = floatval($eventSumQuery->sum('amount')); + $rep->currentamount = floatval($sum) + $eventSum; + $rep->save(); + + } + } + + public function updateRelatedTransfer(\Piggybank $piggyBank, \TransactionJournal $journal) + { + die('no impl updateRelatedTransfer'); + } + + + + + +// +// /** +// * +// */ +// public function updatePiggybankRepetitions() +// { +// // grab all piggy banks. +// if (\Auth::check()) { +// $piggybanks = \Auth::user()->piggybanks()->with(['piggybankrepetitions'])->where('repeats', 0)->get(); +// $today = new Carbon; +// /** @var \Piggybank $piggy */ +// foreach ($piggybanks as $piggy) { +// if (count($piggy->piggybankrepetitions) == 0) { +// $rep = new \PiggybankRepetition; +// $rep->piggybank()->associate($piggy); +// $rep->targetdate = $piggy->targetdate; +// $rep->startdate = $piggy->startdate; +// $rep->currentamount = 0; +// try { +// $rep->save(); +// } catch (QueryException $e) { +// } +// } +// +// // whatever we did here, we now have all repetitions for this +// // piggy bank, and we can find transactions that fall within +// // that repetition (to fix the "saved amount". +// $reps = $piggy->piggybankrepetitions()->get(); +// +// /** @var \PiggybankRepetition $rep */ +// foreach ($reps as $rep) { +// $query = \Transaction::where('piggybank_id', $piggy->id)->leftJoin( +// 'transaction_journals', 'transaction_journals.id', '=', +// 'transactions.transaction_journal_id' +// ); +// if (!is_null($rep->startdate)) { +// $query->where('transaction_journals.date', '>=', $rep->startdate->format('Y-m-d')); +// } +// if (!is_null($rep->targetdate)) { +// $query->where( +// 'transaction_journals.date', '<=', $rep->targetdate->format('Y-m-d') +// ); +// } +// +// // get events for piggy bank, save those as well: +// $eventSumQuery = $piggy->piggybankevents(); +// if(!is_null($rep->startdate)) { +// $eventSumQuery->where('date','>=',$rep->startdate->format('Y-m-d')); +// } +// if(!is_null($rep->targetdate)) { +// $eventSumQuery->where('date','<=',$rep->targetdate->format('Y-m-d')); +// } +// $eventSum = floatval($eventSumQuery->sum('amount')); +// +// +// $sum = $query->sum('transactions.amount'); +// $rep->currentamount = floatval($sum) + $eventSum; +// $rep->save(); +// +// +// } +// +// } +// unset($piggy, $piggybanks, $rep); +// +// // grab all repeated transactions. +// $repeatedExpenses = \Auth::user()->piggybanks()->with(['piggybankrepetitions'])->where('repeats', 1)->get(); +// /** @var \Piggybank $repeated */ +// foreach ($repeatedExpenses as $repeated) { +// // loop from start to today or something +// $rep = new \PiggybankRepetition; +// $rep->piggybank()->associate($repeated); +// $rep->startdate = $repeated->startdate; +// $rep->targetdate = $repeated->targetdate; +// $rep->currentamount = 0; +// try { +// $rep->save(); +// } catch (QueryException $e) { +// } +// unset($rep); +// +// if ($repeated->targetdate <= $today) { +// // add 1 month to startdate, or maybe X period, like 3 weeks. +// $startTarget = clone $repeated->targetdate; +// while ($startTarget <= $today) { +// $startCurrent = clone $startTarget; +// +// // add some kind of period to start current making $endCurrent. +// $endCurrent = clone $startCurrent; +// switch ($repeated->rep_length) { +// default: +// die('No rep lengt!'); +// break; +// case 'day': +// $endCurrent->addDays($repeated->rep_every); +// break; +// case 'week': +// $endCurrent->addWeeks($repeated->rep_every); +// break; +// case 'month': +// $endCurrent->addMonths($repeated->rep_every); +// break; +// case 'year': +// $endCurrent->addYears($repeated->rep_every); +// break; +// } +// +// $rep = new \PiggybankRepetition; +// $rep->piggybank()->associate($repeated); +// $rep->startdate = $startCurrent; +// $rep->targetdate = $endCurrent; +// $rep->currentamount = 0; +// $startTarget = $endCurrent; +// try { +// $rep->save(); +// } catch (QueryException $e) { +// +// } +// } +// } +// $reps = $repeated->piggybankrepetitions()->get(); +// /** @var \PiggybankRepetition $rep */ +// foreach ($reps as $rep) { +// $sum = \Transaction::where('piggybank_id', $repeated->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); +// $rep->save(); +// +// +// } +// } +// } +// } } \ No newline at end of file diff --git a/app/models/Piggybank.php b/app/models/Piggybank.php index 9519347305..c13fb02344 100644 --- a/app/models/Piggybank.php +++ b/app/models/Piggybank.php @@ -42,18 +42,18 @@ class Piggybank extends Ardent { public static $rules = [ - 'account_id' => 'required|exists:accounts,id', // link to Account - 'name' => 'required|between:1,255', // name - 'targetamount' => 'required|min:0', // amount you want to save - 'startdate' => 'date', // when you started - 'targetdate' => 'date', // when its due - 'repeats' => 'required|between:0,1', // does it repeat? - 'rep_length' => 'in:day,week,month,year', // how long is the period? - 'rep_every' => 'required|min:1|max:100', // how often does it repeat? every 3 years. - 'rep_times' => 'min:1|max:100', // how many times do you want to save this amount? eg. 3 times - 'reminder' => 'in:day,week,month,year', // want a reminder to put money in this? + 'account_id' => 'required|exists:accounts,id', // link to Account + 'name' => 'required|between:1,255', // name + 'targetamount' => 'required|min:0', // amount you want to save + 'startdate' => 'date', // when you started + 'targetdate' => 'date', // when its due + 'repeats' => 'required|between:0,1', // does it repeat? + 'rep_length' => 'in:day,week,month,year', // how long is the period? + 'rep_every' => 'required|min:1|max:100', // how often does it repeat? every 3 years. + 'rep_times' => 'min:1|max:100', // how many times do you want to save this amount? eg. 3 times + 'reminder' => 'in:day,week,month,year', // want a reminder to put money in this? 'reminder_skip' => 'required|min:0|max:100', // every week? every 2 months? - 'order' => 'required:min:1', // not yet used. + 'order' => 'required:min:1', // not yet used. ]; public $fillable = [ @@ -82,18 +82,18 @@ class Piggybank extends Ardent $end->endOfMonth(); return [ - 'account_id' => 'factory|Account', - 'name' => 'string', - 'targetamount' => 'integer', - 'startdate' => $start->format('Y-m-d'), - 'targetdate' => $end->format('Y-m-d'), - 'repeats' => 0, - 'rep_length' => null, - 'rep_times' => 0, - 'rep_every' => 0, - 'reminder' => null, + 'account_id' => 'factory|Account', + 'name' => 'string', + 'targetamount' => 'integer', + 'startdate' => $start->format('Y-m-d'), + 'targetdate' => $end->format('Y-m-d'), + 'repeats' => 0, + 'rep_length' => null, + 'rep_times' => 0, + 'rep_every' => 0, + 'reminder' => null, 'reminder_skip' => 0, - 'order' => 1, + 'order' => 1, ]; } @@ -185,18 +185,29 @@ class Piggybank extends Ardent $query = $this->piggybankrepetitions() ->where( function ($q) { - $today = new Carbon; - $q->whereNull('startdate'); - $q->orWhere('startdate', '<=', $today->format('Y-m-d')); + + $q->where( + function ($q) { + $today = new Carbon; + $q->whereNull('startdate'); + $q->orWhere('startdate', '<=', $today->format('Y-m-d')); + } + ) + ->where( + function ($q) { + $today = new Carbon; + $q->whereNull('targetdate'); + $q->orWhere('targetdate', '>=', $today->format('Y-m-d')); + } + ); } - ) - ->where( + )->orWhere( function ($q) { $today = new Carbon; - $q->whereNull('targetdate'); - $q->orWhere('targetdate', '>=', $today->format('Y-m-d')); + $q->where('startdate', '>=', $today->format('Y-m-d')); + $q->where('targetdate', '>=', $today->format('Y-m-d')); } - ); + )->orderBy('startdate', 'ASC'); $result = $query->first(); return $result; @@ -220,4 +231,36 @@ class Piggybank extends Ardent return $this->hasMany('PiggybankEvent'); } + /** + * Same but for specific date. + * + * @param Carbon $date + * + * @returns \PiggybankRepetition + */ + public function repetitionForDate(Carbon $date) + { + $query = $this->piggybankrepetitions() + ->where( + function ($q) use ($date) { + $q->whereNull('startdate'); + $q->orWhere('startdate', '<=', $date->format('Y-m-d')); + } + ) + ->where( + function ($q) use ($date) { + $q->whereNull('targetdate'); + $q->orWhere('targetdate', '>=', $date->format('Y-m-d')); + } + ); + $result = $query->first(); + + return $result; + } + + public function transactions() + { + return $this->hasMany('Transaction'); + } + } \ No newline at end of file diff --git a/app/models/Transaction.php b/app/models/Transaction.php index 526124decd..92fad128e0 100644 --- a/app/models/Transaction.php +++ b/app/models/Transaction.php @@ -34,6 +34,7 @@ class Transaction extends Ardent public static $rules = [ 'account_id' => 'numeric|required|exists:accounts,id', + 'piggybank_id' => 'numeric|exists:piggybanks,id', 'transaction_journal_id' => 'numeric|required|exists:transaction_journals,id', 'description' => 'between:1,255', 'amount' => 'required|between:-65536,65536|not_in:0,0.00', @@ -42,9 +43,11 @@ class Transaction extends Ardent public static $factory = [ 'account_id' => 'factory|Account', + 'piggybank_id' => null, 'transaction_journal_id' => 'factory|TransactionJournal', 'description' => 'string', - 'amount' => 'integer:5' + 'amount' => 'integer:5', + ]; /**