mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Fixed #1405
This commit is contained in:
parent
4031057bc0
commit
664451d0c6
@ -404,11 +404,17 @@ class PiggyBankController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function show(PiggyBank $piggyBank)
|
public function show(PiggyBank $piggyBank)
|
||||||
{
|
{
|
||||||
$note = $piggyBank->notes()->first();
|
/** @var Carbon $end */
|
||||||
$events = $this->piggyRepos->getEvents($piggyBank);
|
$end = session('end', Carbon::now()->endOfMonth());
|
||||||
$subTitle = $piggyBank->name;
|
// transform piggies using the transformer:
|
||||||
|
$parameters = new ParameterBag;
|
||||||
|
$parameters->set('end', $end);
|
||||||
|
$transformer = new PiggyBankTransformer(new ParameterBag);
|
||||||
|
$piggy = $transformer->transform($piggyBank);
|
||||||
|
$events = $this->piggyRepos->getEvents($piggyBank);
|
||||||
|
$subTitle = $piggyBank->name;
|
||||||
|
|
||||||
return view('piggy-banks.show', compact('piggyBank', 'events', 'subTitle', 'note'));
|
return view('piggy-banks.show', compact('piggyBank', 'events', 'subTitle', 'piggy'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,6 +36,11 @@ use FireflyIII\Models\Account;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class PiggyBank.
|
* Class PiggyBank.
|
||||||
|
*
|
||||||
|
* @property Carbon $targetdate
|
||||||
|
* @property Carbon $startdate
|
||||||
|
* @property string $targetamount
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
class PiggyBank extends Model
|
class PiggyBank extends Model
|
||||||
{
|
{
|
||||||
@ -132,32 +137,6 @@ class PiggyBank extends Model
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getSuggestedMonthlyAmount(): string
|
|
||||||
{
|
|
||||||
$savePerMonth = '0';
|
|
||||||
if ($this->targetdate && $this->currentRelevantRep()->currentamount < $this->targetamount) {
|
|
||||||
$now = Carbon::now();
|
|
||||||
$diffInMonths = $now->diffInMonths($this->targetdate, false);
|
|
||||||
$remainingAmount = bcsub($this->targetamount, $this->currentRelevantRep()->currentamount);
|
|
||||||
|
|
||||||
// more than 1 month to go and still need money to save:
|
|
||||||
if ($diffInMonths > 0 && 1 === bccomp($remainingAmount, '0')) {
|
|
||||||
$savePerMonth = bcdiv($remainingAmount, (string)$diffInMonths);
|
|
||||||
}
|
|
||||||
|
|
||||||
// less than 1 month to go but still need money to save:
|
|
||||||
if (0 === $diffInMonths && 1 === bccomp($remainingAmount, '0')) {
|
|
||||||
$savePerMonth = $remainingAmount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $savePerMonth;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Carbon $date
|
* @param Carbon $date
|
||||||
*
|
*
|
||||||
|
@ -29,6 +29,7 @@ use FireflyIII\Models\PiggyBank;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class PiggyBankRepetition.
|
* Class PiggyBankRepetition.
|
||||||
|
* @property string $currentamount
|
||||||
*/
|
*/
|
||||||
class PiggyBankRepetition extends Model
|
class PiggyBankRepetition extends Model
|
||||||
{
|
{
|
||||||
|
@ -324,6 +324,39 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
|
|||||||
return $piggyBank->piggyBankRepetitions()->first();
|
return $piggyBank->piggyBankRepetitions()->first();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the suggested amount the user should save per month, or "".
|
||||||
|
*
|
||||||
|
* @param PiggyBank $piggyBank
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSuggestedMonthlyAmount(PiggyBank $piggyBank): string
|
||||||
|
{
|
||||||
|
$savePerMonth = '0';
|
||||||
|
$repetition = $this->getRepetition($piggyBank);
|
||||||
|
if(null === $repetition) {
|
||||||
|
return $savePerMonth;
|
||||||
|
}
|
||||||
|
if (null !== $piggyBank->targetdate && $repetition->currentamount < $piggyBank->targetamount) {
|
||||||
|
$now = Carbon::now();
|
||||||
|
$diffInMonths = $now->diffInMonths($piggyBank->targetdate, false);
|
||||||
|
$remainingAmount = bcsub($piggyBank->targetamount, $repetition->currentamount);
|
||||||
|
|
||||||
|
// more than 1 month to go and still need money to save:
|
||||||
|
if ($diffInMonths > 0 && 1 === bccomp($remainingAmount, '0')) {
|
||||||
|
$savePerMonth = bcdiv($remainingAmount, (string)$diffInMonths);
|
||||||
|
}
|
||||||
|
|
||||||
|
// less than 1 month to go but still need money to save:
|
||||||
|
if (0 === $diffInMonths && 1 === bccomp($remainingAmount, '0')) {
|
||||||
|
$savePerMonth = $remainingAmount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $savePerMonth;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get for piggy account what is left to put in piggies.
|
* Get for piggy account what is left to put in piggies.
|
||||||
*
|
*
|
||||||
|
@ -67,6 +67,11 @@ interface PiggyBankRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function canRemoveAmount(PiggyBank $piggyBank, string $amount): bool;
|
public function canRemoveAmount(PiggyBank $piggyBank, string $amount): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct order of piggies in case of issues.
|
||||||
|
*/
|
||||||
|
public function correctOrder(): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new event.
|
* Create a new event.
|
||||||
*
|
*
|
||||||
@ -86,11 +91,6 @@ interface PiggyBankRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function createEventWithJournal(PiggyBank $piggyBank, string $amount, TransactionJournal $journal): PiggyBankEvent;
|
public function createEventWithJournal(PiggyBank $piggyBank, string $amount, TransactionJournal $journal): PiggyBankEvent;
|
||||||
|
|
||||||
/**
|
|
||||||
* Correct order of piggies in case of issues.
|
|
||||||
*/
|
|
||||||
public function correctOrder(): void;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy piggy bank.
|
* Destroy piggy bank.
|
||||||
*
|
*
|
||||||
@ -173,6 +173,15 @@ interface PiggyBankRepositoryInterface
|
|||||||
*/
|
*/
|
||||||
public function getRepetition(PiggyBank $piggyBank): ?PiggyBankRepetition;
|
public function getRepetition(PiggyBank $piggyBank): ?PiggyBankRepetition;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the suggested amount the user should save per month, or "".
|
||||||
|
*
|
||||||
|
* @param PiggyBank $piggyBank
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getSuggestedMonthlyAmount(PiggyBank $piggyBank): string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get for piggy account what is left to put in piggies.
|
* Get for piggy account what is left to put in piggies.
|
||||||
*
|
*
|
||||||
@ -202,7 +211,7 @@ interface PiggyBankRepositoryInterface
|
|||||||
* Set specific piggy bank to specific order.
|
* Set specific piggy bank to specific order.
|
||||||
*
|
*
|
||||||
* @param PiggyBank $piggyBank
|
* @param PiggyBank $piggyBank
|
||||||
* @param int $order
|
* @param int $order
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
|
@ -45,13 +45,6 @@ class PiggyBank extends Twig_Extension
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
$functions[] = new Twig_SimpleFunction(
|
|
||||||
'suggestedMonthlyAmount',
|
|
||||||
function (PB $piggyBank) {
|
|
||||||
return $piggyBank->getSuggestedMonthlyAmount();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return $functions;
|
return $functions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,6 +166,7 @@ class PiggyBankTransformer extends TransformerAbstract
|
|||||||
'percentage' => $percentage,
|
'percentage' => $percentage,
|
||||||
'current_amount' => $currentAmount,
|
'current_amount' => $currentAmount,
|
||||||
'left_to_save' => round($leftToSave, $decimalPlaces),
|
'left_to_save' => round($leftToSave, $decimalPlaces),
|
||||||
|
'save_per_month' => $piggyRepos->getSuggestedMonthlyAmount($piggyBank),
|
||||||
'startdate' => $startDate,
|
'startdate' => $startDate,
|
||||||
'targetdate' => $targetDate,
|
'targetdate' => $targetDate,
|
||||||
'order' => (int)$piggyBank->order,
|
'order' => (int)$piggyBank->order,
|
||||||
|
@ -472,12 +472,13 @@ class FireflyValidator extends Validator
|
|||||||
$query = DB::table('piggy_banks')->whereNull('piggy_banks.deleted_at')
|
$query = DB::table('piggy_banks')->whereNull('piggy_banks.deleted_at')
|
||||||
->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')->where('accounts.user_id', auth()->user()->id);
|
->leftJoin('accounts', 'accounts.id', '=', 'piggy_banks.account_id')->where('accounts.user_id', auth()->user()->id);
|
||||||
if (null !== $exclude) {
|
if (null !== $exclude) {
|
||||||
$query->where('piggy_banks.id', '!=', $exclude);
|
$query->where('piggy_banks.id', '!=', (int)$exclude);
|
||||||
}
|
}
|
||||||
$set = $query->get(['piggy_banks.*']);
|
$set = $query->get(['piggy_banks.*']);
|
||||||
|
|
||||||
/** @var PiggyBank $entry */
|
/** @var PiggyBank $entry */
|
||||||
foreach ($set as $entry) {
|
foreach ($set as $entry) {
|
||||||
|
|
||||||
$fieldValue = $this->tryDecrypt($entry->name);
|
$fieldValue = $this->tryDecrypt($entry->name);
|
||||||
if ($fieldValue === $value) {
|
if ($fieldValue === $value) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1017,6 +1017,7 @@ return [
|
|||||||
'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"',
|
'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"',
|
||||||
'add' => 'Add',
|
'add' => 'Add',
|
||||||
'no_money_for_piggy' => 'You have no money to put in this piggy bank.',
|
'no_money_for_piggy' => 'You have no money to put in this piggy bank.',
|
||||||
|
'suggested_savings_per_month' => 'Suggested per month',
|
||||||
|
|
||||||
'remove' => 'Remove',
|
'remove' => 'Remove',
|
||||||
'max_amount_add' => 'The maximum amount you can add is',
|
'max_amount_add' => 'The maximum amount you can add is',
|
||||||
|
@ -110,6 +110,7 @@ return [
|
|||||||
'in_array' => 'The :attribute field does not exist in :other.',
|
'in_array' => 'The :attribute field does not exist in :other.',
|
||||||
'present' => 'The :attribute field must be present.',
|
'present' => 'The :attribute field must be present.',
|
||||||
'amount_zero' => 'The total amount cannot be zero',
|
'amount_zero' => 'The total amount cannot be zero',
|
||||||
|
'unique_piggy_bank_for_user' => 'The name of the piggy bank must be unique.',
|
||||||
'secure_password' => 'This is not a secure password. Please try again. For more information, visit http://bit.ly/FF3-password-security',
|
'secure_password' => 'This is not a secure password. Please try again. For more information, visit http://bit.ly/FF3-password-security',
|
||||||
'attributes' => [
|
'attributes' => [
|
||||||
'email' => 'email address',
|
'email' => 'email address',
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
<th colspan="3" class="hidden-sm hidden-xs"> </th>
|
<th colspan="3" class="hidden-sm hidden-xs"> </th>
|
||||||
<th style="text-align: right;" class="hidden-sm hidden-xs">{{ 'target_amount'|_ }}</th>
|
<th style="text-align: right;" class="hidden-sm hidden-xs">{{ 'target_amount'|_ }}</th>
|
||||||
<th style="text-align: right;" class="hidden-sm hidden-xs">{{ 'left_to_save'|_ }}</th>
|
<th style="text-align: right;" class="hidden-sm hidden-xs">{{ 'left_to_save'|_ }}</th>
|
||||||
|
<th style="text-align: right;" class="hidden-sm hidden-xs">{{ 'suggested_savings_per_month'|_ }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@ -79,6 +80,11 @@
|
|||||||
<span title="{{ 'left_to_save'|_ }}">{{ formatAmountBySymbol(piggy.left_to_save,piggy.currency_symbol,piggy.currency_dp) }}</span>
|
<span title="{{ 'left_to_save'|_ }}">{{ formatAmountBySymbol(piggy.left_to_save,piggy.currency_symbol,piggy.currency_dp) }}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
|
<td class="hidden-sm hidden-xs" style="text-align:right;">
|
||||||
|
{% if piggy.targetdate %}
|
||||||
|
{{ formatAmountBySymbol(piggy.save_per_month, piggy.currency_symbol, piggy.currency_dp) }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
|
<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i></button>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li><a href="{{ route('piggy-banks.edit', piggyBank.id) }}"><i class="fa fa-pencil fa-fw"></i> {{ 'edit'|_ }}</a></li>
|
<li><a href="{{ route('piggy-banks.edit', piggy.id) }}"><i class="fa fa-pencil fa-fw"></i> {{ 'edit'|_ }}</a></li>
|
||||||
<li><a href="{{ route('piggy-banks.delete', piggyBank.id) }}"><i class="fa fa-trash fa-fw"></i> {{ 'delete'|_ }}</a></li>
|
<li><a href="{{ route('piggy-banks.delete', piggy.id) }}"><i class="fa fa-trash fa-fw"></i> {{ 'delete'|_ }}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -40,15 +40,21 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ 'target_amount'|_ }}</td>
|
<td>{{ 'target_amount'|_ }}</td>
|
||||||
<td>{{ piggyBank.targetamount|formatAmount }}</td>
|
<td>
|
||||||
|
{{ formatAmountBySymbol(piggy.target_amount, piggy.currency_symbol, piggy.currency_dp) }}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ 'saved_so_far'|_ }}</td>
|
<td>{{ 'saved_so_far'|_ }}</td>
|
||||||
<td>{{ currentRelevantRepAmount(piggyBank)|formatAmount }}</td>
|
<td>
|
||||||
|
{{ formatAmountBySymbol(piggy.current_amount, piggy.currency_symbol, piggy.currency_dp) }}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ 'left_to_save'|_ }}</td>
|
<td>{{ 'left_to_save'|_ }}</td>
|
||||||
<td>{{ (piggyBank.targetamount - currentRelevantRepAmount(piggyBank))|formatAmount }}</td>
|
<td>
|
||||||
|
{{ formatAmountBySymbol(piggy.left_to_save, piggy.currency_symbol, piggy.currency_dp) }}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ 'start_date'|_ }}</td>
|
<td>{{ 'start_date'|_ }}</td>
|
||||||
@ -74,7 +80,8 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{ 'suggested_amount'|_ }}</td>
|
<td>{{ 'suggested_amount'|_ }}</td>
|
||||||
<td>
|
<td>
|
||||||
{{ suggestedMonthlyAmount(piggyBank)|formatAmount }}
|
{{ formatAmountBySymbol(piggy.save_per_month, piggy.currency_symbol, piggy.currency_dp) }}
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
Loading…
Reference in New Issue
Block a user