mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-04 11:43:02 +00:00
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:
@@ -77,8 +77,9 @@ class PiggybankController extends BaseController
|
|||||||
*/
|
*/
|
||||||
public function destroy(Piggybank $piggyBank)
|
public function destroy(Piggybank $piggyBank)
|
||||||
{
|
{
|
||||||
|
Event::fire('piggybanks.destroy', [$piggyBank]);
|
||||||
$this->_repository->destroy($piggyBank);
|
$this->_repository->destroy($piggyBank);
|
||||||
Event::fire('piggybanks.change');
|
|
||||||
Session::flash('success', 'Piggy bank deleted.');
|
Session::flash('success', 'Piggy bank deleted.');
|
||||||
|
|
||||||
return Redirect::route('piggybanks.index');
|
return Redirect::route('piggybanks.index');
|
||||||
@@ -109,7 +110,6 @@ class PiggybankController extends BaseController
|
|||||||
*/
|
*/
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
Event::fire('piggybanks.change');
|
|
||||||
$countRepeating = $this->_repository->countRepeating();
|
$countRepeating = $this->_repository->countRepeating();
|
||||||
$countNonRepeating = $this->_repository->countNonrepeating();
|
$countNonRepeating = $this->_repository->countNonrepeating();
|
||||||
|
|
||||||
@@ -152,6 +152,7 @@ class PiggybankController extends BaseController
|
|||||||
if (round($amount, 2) <= round(min($maxAdd, $piggyBank->targetamount), 2)) {
|
if (round($amount, 2) <= round(min($maxAdd, $piggyBank->targetamount), 2)) {
|
||||||
Session::flash('success', 'Amount updated!');
|
Session::flash('success', 'Amount updated!');
|
||||||
$this->_repository->modifyAmount($piggyBank, $amount);
|
$this->_repository->modifyAmount($piggyBank, $amount);
|
||||||
|
Event::fire('piggybanks.modifyAmountAdd', [$piggyBank, $amount]);
|
||||||
} else {
|
} else {
|
||||||
Session::flash('warning', 'Could not!');
|
Session::flash('warning', 'Could not!');
|
||||||
}
|
}
|
||||||
@@ -162,6 +163,7 @@ class PiggybankController extends BaseController
|
|||||||
if (round($amount, 2) <= round($maxRemove, 2)) {
|
if (round($amount, 2) <= round($maxRemove, 2)) {
|
||||||
Session::flash('success', 'Amount updated!');
|
Session::flash('success', 'Amount updated!');
|
||||||
$this->_repository->modifyAmount($piggyBank, ($amount * -1));
|
$this->_repository->modifyAmount($piggyBank, ($amount * -1));
|
||||||
|
Event::fire('piggybanks.modifyAmountRemove', [$piggyBank, ($amount * -1)]);
|
||||||
} else {
|
} else {
|
||||||
Session::flash('warning', 'Could not!');
|
Session::flash('warning', 'Could not!');
|
||||||
}
|
}
|
||||||
@@ -210,7 +212,7 @@ class PiggybankController extends BaseController
|
|||||||
$piggyBank = $this->_repository->store($data);
|
$piggyBank = $this->_repository->store($data);
|
||||||
if (!is_null($piggyBank->id)) {
|
if (!is_null($piggyBank->id)) {
|
||||||
Session::flash('success', 'New piggy bank "' . $piggyBank->name . '" created!');
|
Session::flash('success', 'New piggy bank "' . $piggyBank->name . '" created!');
|
||||||
Event::fire('piggybanks.change');
|
Event::fire('piggybanks.storePiggy',[$piggyBank]);
|
||||||
|
|
||||||
return Redirect::route('piggybanks.index');
|
return Redirect::route('piggybanks.index');
|
||||||
|
|
||||||
@@ -239,7 +241,7 @@ class PiggybankController extends BaseController
|
|||||||
$piggyBank = $this->_repository->store($data);
|
$piggyBank = $this->_repository->store($data);
|
||||||
if ($piggyBank->id) {
|
if ($piggyBank->id) {
|
||||||
Session::flash('success', 'New piggy bank "' . $piggyBank->name . '" created!');
|
Session::flash('success', 'New piggy bank "' . $piggyBank->name . '" created!');
|
||||||
Event::fire('piggybanks.change');
|
Event::fire('piggybanks.storeRepeated',[$piggyBank]);
|
||||||
|
|
||||||
return Redirect::route('piggybanks.index');
|
return Redirect::route('piggybanks.index');
|
||||||
|
|
||||||
@@ -259,7 +261,7 @@ class PiggybankController extends BaseController
|
|||||||
$piggyBank = $this->_repository->update($piggyBank, Input::all());
|
$piggyBank = $this->_repository->update($piggyBank, Input::all());
|
||||||
if ($piggyBank->validate()) {
|
if ($piggyBank->validate()) {
|
||||||
Session::flash('success', 'Piggy bank "' . $piggyBank->name . '" updated.');
|
Session::flash('success', 'Piggy bank "' . $piggyBank->name . '" updated.');
|
||||||
Event::fire('piggybanks.change');
|
Event::fire('piggybanks.update',[$piggyBank]);
|
||||||
|
|
||||||
return Redirect::route('piggybanks.index');
|
return Redirect::route('piggybanks.index');
|
||||||
} else {
|
} else {
|
||||||
|
@@ -107,13 +107,6 @@ class EloquentPiggybankRepository implements PiggybankRepositoryInterface
|
|||||||
if (!is_null($rep)) {
|
if (!is_null($rep)) {
|
||||||
$rep->currentamount += $amount;
|
$rep->currentamount += $amount;
|
||||||
$rep->save();
|
$rep->save();
|
||||||
|
|
||||||
// create event:
|
|
||||||
$event = new \PiggybankEvent;
|
|
||||||
$event->date = new Carbon;
|
|
||||||
$event->amount = $amount;
|
|
||||||
$event->piggybank()->associate($piggyBank);
|
|
||||||
$event->save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -332,6 +332,9 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
|
|||||||
// connect the piggy to it:
|
// connect the piggy to it:
|
||||||
$transaction->piggybank()->associate($piggyBank);
|
$transaction->piggybank()->associate($piggyBank);
|
||||||
$transaction->save();
|
$transaction->save();
|
||||||
|
\Event::fire(
|
||||||
|
'piggybanks.createRelatedTransfer', [$piggyBank, $transactionJournal, $transaction]
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
\Session::flash(
|
\Session::flash(
|
||||||
'warning',
|
'warning',
|
||||||
@@ -388,6 +391,7 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
|
|||||||
if (!is_null($journal->budgets()->first())) {
|
if (!is_null($journal->budgets()->first())) {
|
||||||
$journal->budgets()->detach($journal->budgets()->first()->id);
|
$journal->budgets()->detach($journal->budgets()->first()->id);
|
||||||
}
|
}
|
||||||
|
// remove previous piggy bank, if any:
|
||||||
|
|
||||||
|
|
||||||
$category = isset($data['category']) ? $catRepository->findByName($data['category']) : null;
|
$category = isset($data['category']) ? $catRepository->findByName($data['category']) : null;
|
||||||
@@ -395,8 +399,18 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
|
|||||||
$journal->categories()->attach($category);
|
$journal->categories()->attach($category);
|
||||||
}
|
}
|
||||||
// update the amounts:
|
// update the amounts:
|
||||||
/** @var \Transaction $transaction */
|
|
||||||
$transactions = $journal->transactions()->orderBy('amount', 'ASC')->get();
|
$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[0]->amount = $amount * -1;
|
||||||
$transactions[1]->amount = $amount;
|
$transactions[1]->amount = $amount;
|
||||||
|
|
||||||
@@ -432,6 +446,37 @@ class EloquentTransactionJournalRepository implements TransactionJournalReposito
|
|||||||
$journal->transactions[0]->account()->associate($fromAccount);
|
$journal->transactions[0]->account()->associate($fromAccount);
|
||||||
$journal->transactions[1]->account()->associate($toAccount);
|
$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;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new FireflyException('Cannot edit this!');
|
throw new FireflyException('Cannot edit this!');
|
||||||
|
@@ -3,7 +3,6 @@
|
|||||||
namespace Firefly\Trigger\Piggybanks;
|
namespace Firefly\Trigger\Piggybanks;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Illuminate\Database\QueryException;
|
|
||||||
use Illuminate\Events\Dispatcher;
|
use Illuminate\Events\Dispatcher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -14,47 +13,191 @@ use Illuminate\Events\Dispatcher;
|
|||||||
class EloquentPiggybankTrigger
|
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(
|
return true;
|
||||||
'piggybanks.change', 'Firefly\Trigger\Piggybanks\EloquentPiggybankTrigger@updatePiggybankRepetitions'
|
}
|
||||||
);
|
|
||||||
|
/**
|
||||||
|
* @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.
|
// loop from start to today or something
|
||||||
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 = new \PiggybankRepetition;
|
||||||
$rep->piggybank()->associate($piggy);
|
$rep->piggybank()->associate($piggyBank);
|
||||||
$rep->targetdate = $piggy->targetdate;
|
$rep->startdate = $piggyBank->startdate;
|
||||||
$rep->startdate = $piggy->startdate;
|
$rep->targetdate = $piggyBank->targetdate;
|
||||||
$rep->currentamount = 0;
|
$rep->currentamount = 0;
|
||||||
try {
|
|
||||||
$rep->save();
|
$rep->save();
|
||||||
} catch (QueryException $e) {
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
$rep = new \PiggybankRepetition;
|
||||||
|
$rep->piggybank()->associate($piggyBank);
|
||||||
|
$rep->startdate = $startCurrent;
|
||||||
|
$rep->targetdate = $endCurrent;
|
||||||
|
$rep->currentamount = 0;
|
||||||
|
$startTarget = $endCurrent;
|
||||||
|
$rep->save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// whatever we did here, we now have all repetitions for this
|
return true;
|
||||||
// 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) {
|
* @param Dispatcher $events
|
||||||
$query = \Transaction::where('piggybank_id', $piggy->id)->leftJoin(
|
*/
|
||||||
|
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', '=',
|
'transaction_journals', 'transaction_journals.id', '=',
|
||||||
'transactions.transaction_journal_id'
|
'transactions.transaction_journal_id'
|
||||||
);
|
);
|
||||||
@@ -66,9 +209,10 @@ class EloquentPiggybankTrigger
|
|||||||
'transaction_journals.date', '<=', $rep->targetdate->format('Y-m-d')
|
'transaction_journals.date', '<=', $rep->targetdate->format('Y-m-d')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
$sum = $query->sum('transactions.amount');
|
||||||
|
|
||||||
// get events for piggy bank, save those as well:
|
// get events for piggy bank, save those as well:
|
||||||
$eventSumQuery = $piggy->piggybankevents();
|
$eventSumQuery = $piggyBank->piggybankevents();
|
||||||
if (!is_null($rep->startdate)) {
|
if (!is_null($rep->startdate)) {
|
||||||
$eventSumQuery->where('date', '>=', $rep->startdate->format('Y-m-d'));
|
$eventSumQuery->where('date', '>=', $rep->startdate->format('Y-m-d'));
|
||||||
}
|
}
|
||||||
@@ -76,87 +220,155 @@ class EloquentPiggybankTrigger
|
|||||||
$eventSumQuery->where('date', '<=', $rep->targetdate->format('Y-m-d'));
|
$eventSumQuery->where('date', '<=', $rep->targetdate->format('Y-m-d'));
|
||||||
}
|
}
|
||||||
$eventSum = floatval($eventSumQuery->sum('amount'));
|
$eventSum = floatval($eventSumQuery->sum('amount'));
|
||||||
|
|
||||||
|
|
||||||
$sum = $query->sum('transactions.amount');
|
|
||||||
$rep->currentamount = floatval($sum) + $eventSum;
|
$rep->currentamount = floatval($sum) + $eventSum;
|
||||||
$rep->save();
|
$rep->save();
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public function updateRelatedTransfer(\Piggybank $piggyBank, \TransactionJournal $journal)
|
||||||
unset($piggy, $piggybanks, $rep);
|
{
|
||||||
|
die('no impl updateRelatedTransfer');
|
||||||
// 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();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
//
|
||||||
}
|
// /**
|
||||||
|
// *
|
||||||
|
// */
|
||||||
|
// 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();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
@@ -184,6 +184,9 @@ class Piggybank extends Ardent
|
|||||||
{
|
{
|
||||||
$query = $this->piggybankrepetitions()
|
$query = $this->piggybankrepetitions()
|
||||||
->where(
|
->where(
|
||||||
|
function ($q) {
|
||||||
|
|
||||||
|
$q->where(
|
||||||
function ($q) {
|
function ($q) {
|
||||||
$today = new Carbon;
|
$today = new Carbon;
|
||||||
$q->whereNull('startdate');
|
$q->whereNull('startdate');
|
||||||
@@ -197,6 +200,14 @@ class Piggybank extends Ardent
|
|||||||
$q->orWhere('targetdate', '>=', $today->format('Y-m-d'));
|
$q->orWhere('targetdate', '>=', $today->format('Y-m-d'));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
)->orWhere(
|
||||||
|
function ($q) {
|
||||||
|
$today = new Carbon;
|
||||||
|
$q->where('startdate', '>=', $today->format('Y-m-d'));
|
||||||
|
$q->where('targetdate', '>=', $today->format('Y-m-d'));
|
||||||
|
}
|
||||||
|
)->orderBy('startdate', 'ASC');
|
||||||
$result = $query->first();
|
$result = $query->first();
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
@@ -220,4 +231,36 @@ class Piggybank extends Ardent
|
|||||||
return $this->hasMany('PiggybankEvent');
|
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');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@@ -34,6 +34,7 @@ class Transaction extends Ardent
|
|||||||
public static $rules
|
public static $rules
|
||||||
= [
|
= [
|
||||||
'account_id' => 'numeric|required|exists:accounts,id',
|
'account_id' => 'numeric|required|exists:accounts,id',
|
||||||
|
'piggybank_id' => 'numeric|exists:piggybanks,id',
|
||||||
'transaction_journal_id' => 'numeric|required|exists:transaction_journals,id',
|
'transaction_journal_id' => 'numeric|required|exists:transaction_journals,id',
|
||||||
'description' => 'between:1,255',
|
'description' => 'between:1,255',
|
||||||
'amount' => 'required|between:-65536,65536|not_in:0,0.00',
|
'amount' => 'required|between:-65536,65536|not_in:0,0.00',
|
||||||
@@ -42,9 +43,11 @@ class Transaction extends Ardent
|
|||||||
public static $factory
|
public static $factory
|
||||||
= [
|
= [
|
||||||
'account_id' => 'factory|Account',
|
'account_id' => 'factory|Account',
|
||||||
|
'piggybank_id' => null,
|
||||||
'transaction_journal_id' => 'factory|TransactionJournal',
|
'transaction_journal_id' => 'factory|TransactionJournal',
|
||||||
'description' => 'string',
|
'description' => 'string',
|
||||||
'amount' => 'integer:5'
|
'amount' => 'integer:5',
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user