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]

This commit is contained in:
James Cole 2014-08-19 06:57:11 +02:00
parent 87bddce1d3
commit f5330728d4
6 changed files with 475 additions and 177 deletions

View File

@ -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 {

View File

@ -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();
}

View File

@ -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!');

View File

@ -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();
//
//
// }
// }
// }
// }
}

View File

@ -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');
}
}

View File

@ -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',
];
/**