mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-10-15 16:57:09 +00:00
Expand piggy banks
This commit is contained in:
@@ -276,7 +276,13 @@ class PiggybankController extends BaseController
|
|||||||
return Redirect::route('piggybanks.create')->withInput()->withErrors($messages['errors']);
|
return Redirect::route('piggybanks.create')->withInput()->withErrors($messages['errors']);
|
||||||
}
|
}
|
||||||
// store!
|
// store!
|
||||||
$repos->store($data);
|
$piggyBank = $repos->store($data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the relevant repetition per Event.
|
||||||
|
*/
|
||||||
|
Event::fire('piggybank.storePiggybank',[$piggyBank]);
|
||||||
|
|
||||||
Session::flash('success', 'New piggy bank stored!');
|
Session::flash('success', 'New piggy bank stored!');
|
||||||
|
|
||||||
if ($data['post_submit_action'] == 'create_another') {
|
if ($data['post_submit_action'] == 'create_another') {
|
||||||
|
@@ -320,7 +320,7 @@ class TransactionController extends BaseController
|
|||||||
* piggy bank and store an event.
|
* piggy bank and store an event.
|
||||||
*/
|
*/
|
||||||
if (!is_null(Input::get('piggybank_id')) && intval(Input::get('piggybank_id')) > 0) {
|
if (!is_null(Input::get('piggybank_id')) && intval(Input::get('piggybank_id')) > 0) {
|
||||||
Event::fire('piggybank.createTransfer', [$journal, intval(Input::get('piggybank_id'))]);
|
Event::fire('piggybank.storeTransfer', [$journal, intval(Input::get('piggybank_id'))]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($data['post_submit_action'] == 'create_another') {
|
if ($data['post_submit_action'] == 'create_another') {
|
||||||
|
@@ -59,8 +59,7 @@ class Piggybank implements CUD, CommonDatabaseCalls, PiggybankInterface
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
$piggybank->save();
|
$piggybank->save();
|
||||||
\Event::fire('piggybanks.store', [$piggybank]);
|
return $piggybank;
|
||||||
$piggybank->save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -28,11 +28,75 @@ class Piggybank
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function destroyTransfer(\TransactionJournal $journal)
|
||||||
|
{
|
||||||
|
if ($journal->piggybankevents()->count() > 0) {
|
||||||
|
|
||||||
|
/** @var \FireflyIII\Database\Piggybank $repository */
|
||||||
|
$repository = \App::make('FireflyIII\Database\Piggybank');
|
||||||
|
|
||||||
|
/** @var \Piggybank $piggyBank */
|
||||||
|
$piggyBank = $journal->piggybankevents()->first()->piggybank()->first();
|
||||||
|
|
||||||
|
/** @var \PiggybankRepetition $repetition */
|
||||||
|
$repetition = $repository->findRepetitionByDate($piggyBank, $journal->date);
|
||||||
|
|
||||||
|
$relevantTransaction = null;
|
||||||
|
/** @var \Transaction $transaction */
|
||||||
|
foreach ($journal->transactions as $transaction) {
|
||||||
|
if ($transaction->account_id == $piggyBank->account_id) {
|
||||||
|
$relevantTransaction = $transaction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_null($relevantTransaction)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$repetition->currentamount += floatval($relevantTransaction->amount * -1);
|
||||||
|
$repetition->save();
|
||||||
|
|
||||||
|
|
||||||
|
$event = new \PiggybankEvent;
|
||||||
|
$event->piggybank()->associate($piggyBank);
|
||||||
|
$event->amount = floatval($relevantTransaction->amount * -1);
|
||||||
|
$event->date = new Carbon;
|
||||||
|
if (!$event->validate()) {
|
||||||
|
var_dump($event->errors());
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$event->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \Piggybank $piggybank
|
||||||
|
* @param float $amount
|
||||||
|
*/
|
||||||
|
public function removeMoney(\Piggybank $piggybank, $amount = 0.0)
|
||||||
|
{
|
||||||
|
$amount = $amount * -1;
|
||||||
|
if ($amount < 0) {
|
||||||
|
$event = new \PiggybankEvent;
|
||||||
|
$event->piggybank()->associate($piggybank);
|
||||||
|
$event->amount = floatval($amount);
|
||||||
|
$event->date = new Carbon;
|
||||||
|
if (!$event->validate()) {
|
||||||
|
var_dump($event->errors());
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$event->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param \TransactionJournal $journal
|
* @param \TransactionJournal $journal
|
||||||
* @param int $piggybankId
|
* @param int $piggybankId
|
||||||
*/
|
*/
|
||||||
public function createTransfer(\TransactionJournal $journal, $piggybankId = 0)
|
public function storeTransfer(\TransactionJournal $journal, $piggybankId = 0)
|
||||||
{
|
{
|
||||||
/** @var \FireflyIII\Database\Piggybank $repository */
|
/** @var \FireflyIII\Database\Piggybank $repository */
|
||||||
$repository = \App::make('FireflyIII\Database\Piggybank');
|
$repository = \App::make('FireflyIII\Database\Piggybank');
|
||||||
@@ -95,67 +159,14 @@ class Piggybank
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroyTransfer(\TransactionJournal $journal)
|
public function storePiggybank(\Piggybank $piggybank) {
|
||||||
{
|
if(intval($piggybank->repeats) == 0) {
|
||||||
if ($journal->piggybankevents()->count() > 0) {
|
$repetition = new \PiggybankRepetition;
|
||||||
|
$repetition->piggybank()->associate($piggybank);
|
||||||
/** @var \FireflyIII\Database\Piggybank $repository */
|
$repetition->startdate = $piggybank->startdate;
|
||||||
$repository = \App::make('FireflyIII\Database\Piggybank');
|
$repetition->targetdate = $piggybank->targetdate;
|
||||||
|
$repetition->currentamount = 0;
|
||||||
/** @var \Piggybank $piggyBank */
|
|
||||||
$piggyBank = $journal->piggybankevents()->first()->piggybank()->first();
|
|
||||||
|
|
||||||
/** @var \PiggybankRepetition $repetition */
|
|
||||||
$repetition = $repository->findRepetitionByDate($piggyBank, $journal->date);
|
|
||||||
|
|
||||||
$relevantTransaction = null;
|
|
||||||
/** @var \Transaction $transaction */
|
|
||||||
foreach ($journal->transactions as $transaction) {
|
|
||||||
if ($transaction->account_id == $piggyBank->account_id) {
|
|
||||||
$relevantTransaction = $transaction;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_null($relevantTransaction)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$repetition->currentamount += floatval($relevantTransaction->amount * -1);
|
|
||||||
$repetition->save();
|
$repetition->save();
|
||||||
|
|
||||||
|
|
||||||
$event = new \PiggybankEvent;
|
|
||||||
$event->piggybank()->associate($piggyBank);
|
|
||||||
$event->amount = floatval($relevantTransaction->amount * -1);
|
|
||||||
$event->date = new Carbon;
|
|
||||||
if (!$event->validate()) {
|
|
||||||
var_dump($event->errors());
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
$event->save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param \Piggybank $piggybank
|
|
||||||
* @param float $amount
|
|
||||||
*/
|
|
||||||
public function removeMoney(\Piggybank $piggybank, $amount = 0.0)
|
|
||||||
{
|
|
||||||
$amount = $amount * -1;
|
|
||||||
if ($amount < 0) {
|
|
||||||
$event = new \PiggybankEvent;
|
|
||||||
$event->piggybank()->associate($piggybank);
|
|
||||||
$event->amount = floatval($amount);
|
|
||||||
$event->date = new Carbon;
|
|
||||||
if (!$event->validate()) {
|
|
||||||
var_dump($event->errors());
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
$event->save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +177,8 @@ class Piggybank
|
|||||||
{
|
{
|
||||||
$events->listen('piggybank.addMoney', 'FireflyIII\Event\Piggybank@addMoney');
|
$events->listen('piggybank.addMoney', 'FireflyIII\Event\Piggybank@addMoney');
|
||||||
$events->listen('piggybank.removeMoney', 'FireflyIII\Event\Piggybank@removeMoney');
|
$events->listen('piggybank.removeMoney', 'FireflyIII\Event\Piggybank@removeMoney');
|
||||||
$events->listen('piggybank.createTransfer', 'FireflyIII\Event\Piggybank@createTransfer');
|
$events->listen('piggybank.storeTransfer', 'FireflyIII\Event\Piggybank@storeTransfer');
|
||||||
|
$events->listen('piggybank.storePiggybank', 'FireflyIII\Event\Piggybank@storePiggybank');
|
||||||
$events->listen('piggybank.destroyTransfer', 'FireflyIII\Event\Piggybank@destroyTransfer');
|
$events->listen('piggybank.destroyTransfer', 'FireflyIII\Event\Piggybank@destroyTransfer');
|
||||||
$events->listen('piggybank.updateTransfer', 'FireflyIII\Event\Piggybank@updateTransfer');
|
$events->listen('piggybank.updateTransfer', 'FireflyIII\Event\Piggybank@updateTransfer');
|
||||||
}
|
}
|
||||||
@@ -176,7 +188,7 @@ class Piggybank
|
|||||||
|
|
||||||
if ($journal->piggybankevents()->count() > 0) {
|
if ($journal->piggybankevents()->count() > 0) {
|
||||||
|
|
||||||
$event = $journal->piggybankevents()->orderBy('date', 'DESC')->orderBy('id', 'DESC')->first();
|
$event = $journal->piggybankevents()->orderBy('date', 'DESC')->orderBy('id', 'DESC')->first();
|
||||||
$eventSum = floatval($journal->piggybankevents()->orderBy('date', 'DESC')->orderBy('id', 'DESC')->sum('amount'));
|
$eventSum = floatval($journal->piggybankevents()->orderBy('date', 'DESC')->orderBy('id', 'DESC')->sum('amount'));
|
||||||
|
|
||||||
/** @var \FireflyIII\Database\Piggybank $repository */
|
/** @var \FireflyIII\Database\Piggybank $repository */
|
||||||
|
@@ -1,10 +1,18 @@
|
|||||||
<table class="table table-bordered table-striped">
|
<table class="table table-bordered table-striped">
|
||||||
<tr>
|
<tr>
|
||||||
|
@if(isset($showPiggybank) && $showPiggybank === true)
|
||||||
|
<th>Piggy bank</th>
|
||||||
|
@endif
|
||||||
<th>Date</th>
|
<th>Date</th>
|
||||||
<th>Amount</th>
|
<th>Amount</th>
|
||||||
</tr>
|
</tr>
|
||||||
@foreach($events as $event)
|
@foreach($events as $event)
|
||||||
<tr>
|
<tr>
|
||||||
|
@if(isset($showPiggybank) && $showPiggybank === true)
|
||||||
|
<td>
|
||||||
|
<a href="{{route('piggybanks.show',$event->piggybank_id)}}">{{{$event->piggybank->name}}}</a>
|
||||||
|
</td>
|
||||||
|
@endif
|
||||||
<td>
|
<td>
|
||||||
@if(!is_null($event->transaction_journal_id))
|
@if(!is_null($event->transaction_journal_id))
|
||||||
<a href="{{route('transactions.show',$event->transaction_journal_id)}}" title="{{{$event->transactionJournal->description}}}">{{$event->date->format('j F Y')}}</a>
|
<a href="{{route('transactions.show',$event->transaction_journal_id)}}" title="{{{$event->transactionJournal->description}}}">{{$event->date->format('j F Y')}}</a>
|
||||||
|
@@ -2,71 +2,93 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-6 col-md-6 col-sm-12">
|
<div class="col-lg-6 col-md-6 col-sm-12">
|
||||||
<h3>Metadata</h3>
|
<div class="panel panel-default">
|
||||||
<table class="table table-striped table-bordered">
|
<div class="panel-heading">
|
||||||
<tr>
|
Metadata
|
||||||
<td>Date</td>
|
</div>
|
||||||
<td>{{{$journal->date->format('jS F Y')}}}</td>
|
<div class="panel-body">
|
||||||
</tr>
|
<table class="table table-striped table-bordered">
|
||||||
<tr>
|
<tr>
|
||||||
<td>Currency</td>
|
<td>Date</td>
|
||||||
<td>{{{$journal->transactioncurrency->code}}}</td>
|
<td>{{{$journal->date->format('jS F Y')}}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Type</td>
|
<td>Currency</td>
|
||||||
<td>{{{$journal->transactiontype->type}}}</td>
|
<td>{{{$journal->transactioncurrency->code}}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Completed</td>
|
<td>Type</td>
|
||||||
<td>
|
<td>{{{$journal->transactiontype->type}}}</td>
|
||||||
@if($journal->completed == 1)
|
</tr>
|
||||||
<span class="text-success">Yes</span>
|
<tr>
|
||||||
@else
|
<td>Completed</td>
|
||||||
<span class="text-danger">No</span>
|
<td>
|
||||||
@endif
|
@if($journal->completed == 1)
|
||||||
</td>
|
<span class="text-success">Yes</span>
|
||||||
</tr>
|
@else
|
||||||
@foreach($journal->budgets()->get() as $budget)
|
<span class="text-danger">No</span>
|
||||||
<tr>
|
@endif
|
||||||
<td>{{$budget->class}}</td>
|
</td>
|
||||||
<td><a href="{{route('budgets.show',$budget->id)}}">{{{$budget->name}}}</a></td>
|
</tr>
|
||||||
</tr>
|
@foreach($journal->budgets()->get() as $budget)
|
||||||
@endforeach
|
<tr>
|
||||||
@foreach($journal->categories()->get() as $category)
|
<td>{{$budget->class}}</td>
|
||||||
<tr>
|
<td><a href="{{route('budgets.show',$budget->id)}}">{{{$budget->name}}}</a></td>
|
||||||
<td>{{$category->class}}</td>
|
</tr>
|
||||||
<td><a href="{{route('categories.show',$category->id)}}">{{{$category->name}}}</a></td>
|
@endforeach
|
||||||
</tr>
|
@foreach($journal->categories()->get() as $category)
|
||||||
@endforeach
|
<tr>
|
||||||
|
<td>{{$category->class}}</td>
|
||||||
|
<td><a href="{{route('categories.show',$category->id)}}">{{{$category->name}}}</a></td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
<!-- TODO show related piggy bank -->
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- events, if present -->
|
||||||
|
@if(count($journal->piggybankevents) > 0)
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
Piggy banks
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
@include('list.piggybank-events',['events' => $journal->piggybankevents,'showPiggybank' => true])
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-6 col-sm-12">
|
<div class="col-lg-6 col-md-6 col-sm-12">
|
||||||
<h3>Transactions</h3>
|
|
||||||
@foreach($journal->transactions as $t)
|
|
||||||
<h4><a href="{{route('accounts.show',$t->account->id)}}">{{{$t->account->name}}}</a><br /><small>{{{$t->account->accounttype->description}}}</small></h4>
|
|
||||||
<table class="table table-striped table-bordered">
|
|
||||||
<tr>
|
|
||||||
<td>Amount</td>
|
|
||||||
<td>{{mf($t->amount)}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>New balance</td>
|
|
||||||
<td>{{mf($t->account->balanceBeforeJournal($journal))}} → {{mf($t->account->balanceBeforeJournal($journal) + $t->amount)}}</td>
|
|
||||||
</tr>
|
|
||||||
@if(!is_null($t->description))
|
|
||||||
<tr>
|
|
||||||
<td>Description</td>
|
|
||||||
<td>{{{$t->description}}}</td>
|
|
||||||
</tr>
|
|
||||||
@endif
|
|
||||||
</table>
|
|
||||||
@endforeach
|
|
||||||
|
|
||||||
|
@foreach($journal->transactions as $t)
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<a href="{{route('accounts.show',$t->account->id)}}">{{{$t->account->name}}}</a><br /><small>{{{$t->account->accounttype->description}}}</small>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<table class="table table-striped table-bordered">
|
||||||
|
<tr>
|
||||||
|
<td>Amount</td>
|
||||||
|
<td>{{mf($t->amount)}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>New balance</td>
|
||||||
|
<td>{{mf($t->account->balanceBeforeJournal($journal))}} → {{mf($t->account->balanceBeforeJournal($journal) + $t->amount)}}</td>
|
||||||
|
</tr>
|
||||||
|
@if(!is_null($t->description))
|
||||||
|
<tr>
|
||||||
|
<td>Description</td>
|
||||||
|
<td>{{{$t->description}}}</td>
|
||||||
|
</tr>
|
||||||
|
@endif
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-6 col-md-6 col-sm-12">
|
<div class="col-lg-6 col-md-6 col-sm-12">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
|
Reference in New Issue
Block a user