mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-01-01 11:47:14 -06:00
Fix some views.
This commit is contained in:
parent
c66fe2b541
commit
0347649f42
@ -5,6 +5,7 @@ use Carbon\Carbon;
|
||||
use ExpandedForm;
|
||||
use FireflyIII\Http\Requests\AccountFormRequest;
|
||||
use FireflyIII\Models\Account;
|
||||
use FireflyIII\Models\AccountType;
|
||||
use FireflyIII\Repositories\Account\AccountRepositoryInterface as ARI;
|
||||
use FireflyIII\Support\CacheProperties;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
@ -222,25 +223,21 @@ class AccountController extends Controller
|
||||
|
||||
|
||||
if ($cache->has()) {
|
||||
$entries = $cache->get();
|
||||
|
||||
return view('accounts.show', compact('account', 'what', 'entries', 'subTitleIcon', 'journals', 'subTitle'));
|
||||
// $entries = $cache->get();
|
||||
// return view('accounts.show', compact('account', 'what', 'entries', 'subTitleIcon', 'journals', 'subTitle'));
|
||||
}
|
||||
|
||||
|
||||
$accountCollection = new Collection([$account]);
|
||||
while ($end >= $start) {
|
||||
$end = Navigation::startOfPeriod($end, $range);
|
||||
$currentEnd = Navigation::endOfPeriod($end, $range);
|
||||
$spent = $repository->spentInPeriod($accountCollection, $end, $currentEnd);
|
||||
$earned = $repository->earnedInPeriod($accountCollection, $end, $currentEnd);
|
||||
$spent = $this->spentInPeriod($account, $end, $currentEnd);
|
||||
$earned = $this->earnedInPeriod($account, $end, $currentEnd);
|
||||
$dateStr = $end->format('Y-m-d');
|
||||
$dateName = Navigation::periodShow($end, $range);
|
||||
$entries->push([$dateStr, $dateName, $spent, $earned]);
|
||||
$end = Navigation::subtractPeriod($end, $range, 1);
|
||||
|
||||
}
|
||||
$cache->store($entries);
|
||||
|
||||
return view('accounts.show', compact('account', 'what', 'entries', 'subTitleIcon', 'journals', 'subTitle'));
|
||||
}
|
||||
@ -375,4 +372,68 @@ class AccountController extends Controller
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Asset accounts actually earn money by being the destination of a deposit or the destination
|
||||
* of a transfer. The money moves to them.
|
||||
*
|
||||
* A revenue account doesn't really earn money itself. Money is earned "from" the revenue account.
|
||||
* So, the call to find out how many money has been earned by/from a revenue account is slightly different.
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param Account $account
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function earnedInPeriod(Account $account, Carbon $start, Carbon $end)
|
||||
{
|
||||
/** @var ARI $repository */
|
||||
$repository = app(ARI::class);
|
||||
$collection = new Collection([$account]);
|
||||
$type = $account->accountType->type;
|
||||
switch ($type) {
|
||||
case AccountType::DEFAULT:
|
||||
case AccountType::ASSET:
|
||||
return $repository->earnedInPeriod($collection, $start, $end);
|
||||
case AccountType::REVENUE:
|
||||
return $repository->earnedFromInPeriod($collection, $start, $end);
|
||||
default:
|
||||
return '0';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Asset accounts actually spend money by being the source of a withdrawal or the source
|
||||
* of a transfer. The money moves away from them.
|
||||
*
|
||||
* An expense account doesn't really spend money itself. Money is spent "at" the expense account.
|
||||
* So, the call to find out how many money has been spent on/at an expense account is slightly different.
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param Account $account
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function spentInPeriod(Account $account, Carbon $start, Carbon $end): string
|
||||
{
|
||||
/** @var ARI $repository */
|
||||
$repository = app(ARI::class);
|
||||
$collection = new Collection([$account]);
|
||||
$type = $account->accountType->type;
|
||||
switch ($type) {
|
||||
case AccountType::DEFAULT:
|
||||
case AccountType::ASSET:
|
||||
return $repository->spentInPeriod($collection, $start, $end);
|
||||
case AccountType::EXPENSE:
|
||||
return $repository->spentAtInPeriod($collection, $start, $end);
|
||||
default:
|
||||
return '0';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -73,6 +73,48 @@ class AccountRepository implements AccountRepositoryInterface
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is almost the same as ::earnedInPeriod, but only works for revenue accounts
|
||||
* instead of the implied asset accounts for ::earnedInPeriod. ::earnedInPeriod will tell you
|
||||
* how much money was earned by the given asset accounts. This method will tell you how much money
|
||||
* these given revenue accounts sent. Ie. how much money was made FROM these revenue accounts.
|
||||
*
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function earnedFromInPeriod(Collection $accounts, Carbon $start, Carbon $end): string
|
||||
{
|
||||
$query = $this->user->transactionjournals()->expanded()->sortCorrectly()
|
||||
->transactionTypes([TransactionType::DEPOSIT]);
|
||||
|
||||
if ($end >= $start) {
|
||||
$query->before($end)->after($start);
|
||||
}
|
||||
|
||||
if ($accounts->count() > 0) {
|
||||
$accountIds = $accounts->pluck('id')->toArray();
|
||||
$query->leftJoin(
|
||||
'transactions as source', function (JoinClause $join) {
|
||||
$join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', 0);
|
||||
}
|
||||
);
|
||||
$query->whereIn('source.account_id', $accountIds);
|
||||
|
||||
}
|
||||
// remove group by
|
||||
$query->getQuery()->getQuery()->groups = null;
|
||||
|
||||
// that should do it:
|
||||
$sum = strval($query->sum('source.amount'));
|
||||
$sum = bcmul($sum, '-1');
|
||||
|
||||
return $sum;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
@ -529,6 +571,47 @@ class AccountRepository implements AccountRepositoryInterface
|
||||
return $journal;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is almost the same as ::spentInPeriod, but only works for expense accounts
|
||||
* instead of the implied asset accounts for ::spentInPeriod. ::spentInPeriod will tell you
|
||||
* how much money was spent by the given asset accounts. This method will tell you how much money
|
||||
* these given expense accounts received. Ie. how much money was spent AT these expense accounts.
|
||||
*
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function spentAtInPeriod(Collection $accounts, Carbon $start, Carbon $end): string
|
||||
{
|
||||
/** @var HasMany $query */
|
||||
$query = $this->user->transactionjournals()->expanded()->sortCorrectly()
|
||||
->transactionTypes([TransactionType::WITHDRAWAL]);
|
||||
if ($end >= $start) {
|
||||
$query->before($end)->after($start);
|
||||
}
|
||||
|
||||
if ($accounts->count() > 0) {
|
||||
$accountIds = $accounts->pluck('id')->toArray();
|
||||
$query->leftJoin(
|
||||
'transactions as destination', function (JoinClause $join) {
|
||||
$join->on('destination.transaction_journal_id', '=', 'transaction_journals.id')->where('destination.amount', '>', 0);
|
||||
}
|
||||
);
|
||||
$query->whereIn('destination.account_id', $accountIds);
|
||||
|
||||
}
|
||||
// remove group by
|
||||
$query->getQuery()->getQuery()->groups = null;
|
||||
|
||||
// that should do it:
|
||||
$sum = strval($query->sum('destination.amount'));
|
||||
$sum = bcmul($sum, '-1');
|
||||
|
||||
return $sum;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
|
@ -33,6 +33,20 @@ interface AccountRepositoryInterface
|
||||
*/
|
||||
public function destroy(Account $account, Account $moveTo): bool;
|
||||
|
||||
/**
|
||||
* This method is almost the same as ::earnedInPeriod, but only works for revenue accounts
|
||||
* instead of the implied asset accounts for ::earnedInPeriod. ::earnedInPeriod will tell you
|
||||
* how much money was earned by the given asset accounts. This method will tell you how much money
|
||||
* these given revenue accounts sent. Ie. how much money was made FROM these revenue accounts.
|
||||
*
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function earnedFromInPeriod(Collection $accounts, Carbon $start, Carbon $end): string;
|
||||
|
||||
/**
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
@ -42,6 +56,21 @@ interface AccountRepositoryInterface
|
||||
*/
|
||||
public function earnedInPeriod(Collection $accounts, Carbon $start, Carbon $end): string;
|
||||
|
||||
/**
|
||||
* This method will call AccountRepositoryInterface::journalsInPeriod and get all withdrawaks made from the given $accounts,
|
||||
* as well as the transfers that move away from those $accounts. This is a slightly sharper selection
|
||||
* than made by journalsInPeriod itself.
|
||||
*
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @see AccountRepositoryInterface::journalsInPeriod
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
public function expensesInPeriod(Collection $accounts, Carbon $start, Carbon $end): Collection;
|
||||
|
||||
/**
|
||||
* @param int $accountId
|
||||
*
|
||||
@ -107,21 +136,6 @@ interface AccountRepositoryInterface
|
||||
*/
|
||||
public function getSavingsAccounts(Carbon $start, Carbon $end): Collection;
|
||||
|
||||
/**
|
||||
* This method will call AccountRepositoryInterface::journalsInPeriod and get all withdrawaks made from the given $accounts,
|
||||
* as well as the transfers that move away from those $accounts. This is a slightly sharper selection
|
||||
* than made by journalsInPeriod itself.
|
||||
*
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @see AccountRepositoryInterface::journalsInPeriod
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
public function expensesInPeriod(Collection $accounts, Carbon $start, Carbon $end): Collection;
|
||||
|
||||
/**
|
||||
* This method will call AccountRepositoryInterface::journalsInPeriod and get all deposits made to the given $accounts,
|
||||
* as well as the transfers that move to to those $accounts. This is a slightly sharper selection
|
||||
@ -182,6 +196,20 @@ interface AccountRepositoryInterface
|
||||
*/
|
||||
public function openingBalanceTransaction(Account $account) : TransactionJournal;
|
||||
|
||||
/**
|
||||
* This method is almost the same as ::spentInPeriod, but only works for expense accounts
|
||||
* instead of the implied asset accounts for ::spentInPeriod. ::spentInPeriod will tell you
|
||||
* how much money was spent by the given asset accounts. This method will tell you how much money
|
||||
* these given expense accounts received. Ie. how much money was spent AT these expense accounts.
|
||||
*
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
* @param Carbon $end
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function spentAtInPeriod(Collection $accounts, Carbon $start, Carbon $end): string;
|
||||
|
||||
/**
|
||||
* @param Collection $accounts
|
||||
* @param Carbon $start
|
||||
|
@ -52,7 +52,7 @@ class Journal extends Twig_Extension
|
||||
// check if this sum is the same as the journal:
|
||||
$journalSum = TransactionJournal::amount($journal);
|
||||
$full = Amount::formatJournal($journal);
|
||||
if (bccomp($journalSum, $amount) === 0) {
|
||||
if (bccomp($journalSum, $amount) === 0 || bccomp(bcmul($journalSum, '-1'), $amount) === 0) {
|
||||
$cache->store($full);
|
||||
|
||||
return $full;
|
||||
@ -79,6 +79,16 @@ class Journal extends Twig_Extension
|
||||
{
|
||||
return new Twig_SimpleFunction(
|
||||
'formatBudgetPerspective', function (TransactionJournal $journal, Budget $budget) {
|
||||
|
||||
$cache = new CacheProperties;
|
||||
$cache->addProperty('formatBudgetPerspective');
|
||||
$cache->addProperty($journal->id);
|
||||
$cache->addProperty($budget->id);
|
||||
|
||||
if ($cache->has()) {
|
||||
return $cache->get();
|
||||
}
|
||||
|
||||
// get the account amount:
|
||||
$transactions = $journal->transactions()->where('transactions.amount', '<', 0)->get(['transactions.*']);
|
||||
$amount = '0';
|
||||
@ -88,10 +98,17 @@ class Journal extends Twig_Extension
|
||||
$amount = bcadd($amount, strval($transaction->amount));
|
||||
}
|
||||
}
|
||||
if ($amount === '0') {
|
||||
$formatted = Amount::formatJournal($journal);
|
||||
$cache->store($formatted);
|
||||
|
||||
$formatted = Amount::format($amount, true);
|
||||
return $formatted;
|
||||
}
|
||||
|
||||
return $formatted . ' (' . Amount::formatJournal($journal) . ')';
|
||||
$formatted = Amount::format($amount, true) . ' (' . Amount::formatJournal($journal) . ')';
|
||||
$cache->store($formatted);
|
||||
|
||||
return $formatted;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user