Reinstate report.

This commit is contained in:
James Cole
2016-05-11 09:08:18 +02:00
parent dc825d5a9c
commit ed9acbdfde
3 changed files with 102 additions and 74 deletions

View File

@@ -84,10 +84,13 @@ class BalanceReportHelper implements BalanceReportHelperInterface
Log::debug('Create and add balance line for budget #' . $budget->id); Log::debug('Create and add balance line for budget #' . $budget->id);
$balance->addBalanceLine($this->createBalanceLine($budget, $repetition, $accounts)); $balance->addBalanceLine($this->createBalanceLine($budget, $repetition, $accounts));
} }
$noBudgetLine = $this->createNoBudgetLine($accounts, $start, $end);
$coveredByTagLine = $this->createTagsBalanceLine($accounts, $start, $end);
$leftUnbalancedLine = $this->createLeftUnbalancedLine($noBudgetLine, $coveredByTagLine);
$balance->addBalanceLine($this->createEmptyBalanceLine($accounts, $spentData)); $balance->addBalanceLine($noBudgetLine);
$balance->addBalanceLine($this->createTagsBalanceLine($accounts, $start, $end)); $balance->addBalanceLine($coveredByTagLine);
$balance->addBalanceLine($this->createDifferenceBalanceLine($accounts, $spentData, $start, $end)); $balance->addBalanceLine($leftUnbalancedLine);
$balance->setBalanceHeader($header); $balance->setBalanceHeader($header);
// remove budgets without expenses from balance lines: // remove budgets without expenses from balance lines:
@@ -178,90 +181,55 @@ class BalanceReportHelper implements BalanceReportHelperInterface
} }
/** /**
* @param Account $account * @param BalanceLine $noBudgetLine
* @param Collection $spentData * @param BalanceLine $coveredByTagLine
* @param Collection $tagsLeft
* *
* @return BalanceEntry * @return BalanceLine
*/ */
private function createDifferenceBalanceEntry(Account $account, Collection $spentData, Collection $tagsLeft): BalanceEntry private function createLeftUnbalancedLine(BalanceLine $noBudgetLine, BalanceLine $coveredByTagLine): BalanceLine
{ {
$entry = $spentData->filter( $line = new BalanceLine;
function (TransactionJournal $model) use ($account) { $line->setRole(BalanceLine::ROLE_DIFFROLE);
return $model->account_id == $account->id && is_null($model->budget_id); $noBudgetEntries = $noBudgetLine->getBalanceEntries();
$tagEntries = $coveredByTagLine->getBalanceEntries();
/** @var BalanceEntry $entry */
foreach ($noBudgetEntries as $entry) {
$account = $entry->getAccount();
$tagEntry = $tagEntries->filter(
function (BalanceEntry $current) use ($account) {
return $current->getAccount()->id === $account->id;
} }
); );
$spent = '0'; if ($tagEntry->first()) {
if (!is_null($entry->first())) { // found corresponding entry. As we should:
$spent = $entry->first()->spent; $newEntry = new BalanceEntry;
$newEntry->setAccount($account);
$spent = bcadd($tagEntry->first()->getLeft(), $entry->getSpent());
$newEntry->setSpent($spent);
$line->addBalanceEntry($newEntry);
} }
$leftEntry = $tagsLeft->filter(
function (Tag $tag) use ($account) {
return $tag->account_id == $account->id;
} }
);
$left = '0';
if (!is_null($leftEntry->first())) {
$left = $leftEntry->first()->sum;
}
$diffValue = bcadd($spent, $left);
// difference: return $line;
$diffEntry = new BalanceEntry;
$diffEntry->setAccount($account);
$diffEntry->setSpent($diffValue);
return $diffEntry;
} }
/** /**
* @param Collection $accounts * @param Collection $accounts
* @param Collection $spentData
* @param Carbon $start * @param Carbon $start
* @param Carbon $end * @param Carbon $end
* *
*
*
* @return BalanceLine * @return BalanceLine
*/ */
private function createDifferenceBalanceLine(Collection $accounts, Collection $spentData, Carbon $start, Carbon $end): BalanceLine private function createNoBudgetLine(Collection $accounts, Carbon $start, Carbon $end): BalanceLine
{
$diff = new BalanceLine;
$tagsLeft = $this->allCoveredByBalancingActs($accounts, $start, $end);
$diff->setRole(BalanceLine::ROLE_DIFFROLE);
/** @var Account $account */
foreach ($accounts as $account) {
$diffEntry = $this->createDifferenceBalanceEntry($account, $spentData, $tagsLeft);
$diff->addBalanceEntry($diffEntry);
}
return $diff;
}
/**
* @param Collection $accounts
* @param Collection $spentData
*
* @return BalanceLine
*/
private function createEmptyBalanceLine(Collection $accounts, Collection $spentData): BalanceLine
{ {
$empty = new BalanceLine; $empty = new BalanceLine;
foreach ($accounts as $account) { foreach ($accounts as $account) {
$entry = $spentData->filter( $spent = $this->budgetRepository->spentInPeriodWithoutBudget(new Collection([$account]), $start, $end);
function (TransactionJournal $model) use ($account) { //$spent ='0';
return $model->account_id == $account->id && is_null($model->budget_id);
}
);
$spent = '0';
if (!is_null($entry->first())) {
$spent = $entry->first()->spent;
}
// budget // budget
$budgetEntry = new BalanceEntry; $budgetEntry = new BalanceEntry;
$budgetEntry->setAccount($account); $budgetEntry->setAccount($account);

View File

@@ -13,6 +13,7 @@ use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionType; use FireflyIII\Models\TransactionType;
use FireflyIII\User; use FireflyIII\User;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Query\JoinClause;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Log; use Log;
@@ -881,7 +882,12 @@ class BudgetRepository implements BudgetRepositoryInterface
->before($end) ->before($end)
->sortCorrectly() ->sortCorrectly()
->after($start) ->after($start)
->leftJoin('transactions as source', 'source.transaction_journal_id', '=', 'transaction_journals.id') ->leftJoin(
'transactions as source',
function (JoinClause $join) {
$join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', '0');
}
)
->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')
->whereIn('budget_transaction_journal.budget_id', $budgets->pluck('id')->toArray()); ->whereIn('budget_transaction_journal.budget_id', $budgets->pluck('id')->toArray());
// add account id's, if relevant: // add account id's, if relevant:
@@ -900,7 +906,12 @@ class BudgetRepository implements BudgetRepositoryInterface
->after($start) ->after($start)
->leftJoin('transactions as related', 'related.transaction_journal_id', '=', 'transaction_journals.id') ->leftJoin('transactions as related', 'related.transaction_journal_id', '=', 'transaction_journals.id')
->leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'related.id') ->leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'related.id')
->leftJoin('transactions as source', 'source.transaction_journal_id', '=', 'transaction_journals.id') ->leftJoin(
'transactions as source',
function (JoinClause $join) {
$join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', '0');
}
)
->whereIn('budget_transaction.budget_id', $budgets->pluck('id')->toArray()); ->whereIn('budget_transaction.budget_id', $budgets->pluck('id')->toArray());
if (count($accountIds) > 0) { if (count($accountIds) > 0) {
@@ -925,14 +936,25 @@ class BudgetRepository implements BudgetRepositoryInterface
*/ */
public function journalsInPeriodWithoutBudget(Collection $accounts, Carbon $start, Carbon $end): Collection public function journalsInPeriodWithoutBudget(Collection $accounts, Carbon $start, Carbon $end): Collection
{ {
$accountIds = [];
if ($accounts->count() > 0) {
$accountIds = $accounts->pluck('id')->toArray();
}
/** @var Collection $set */ /** @var Collection $set */
$set = $this->user $query = $this->user
->transactionjournals() ->transactionjournals()
->expanded() ->expanded()
->sortCorrectly() ->sortCorrectly()
->transactionTypes([TransactionType::WITHDRAWAL]) ->transactionTypes([TransactionType::WITHDRAWAL])
->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') ->leftJoin('budget_transaction_journal', 'budget_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id')
->whereNull('budget_transaction_journal.id') ->whereNull('budget_transaction_journal.id')
->leftJoin(
'transactions as source',
function (JoinClause $join) {
$join->on('source.transaction_journal_id', '=', 'transaction_journals.id')->where('source.amount', '<', '0');
}
)
->before($end) ->before($end)
->after($start)->with( ->after($start)->with(
[ [
@@ -941,8 +963,14 @@ class BudgetRepository implements BudgetRepositoryInterface
}, },
'transactions.budgets', 'transactions.budgets',
] ]
)->get(TransactionJournal::queryFields()); );
// add account id's, if relevant:
if (count($accountIds) > 0) {
$query->whereIn('source.account_id', $accountIds);
}
$set = $query->get(TransactionJournal::queryFields());
$set = $set->filter( $set = $set->filter(
function (TransactionJournal $journal) { function (TransactionJournal $journal) {
foreach ($journal->transactions as $t) { foreach ($journal->transactions as $t) {
@@ -1065,4 +1093,26 @@ class BudgetRepository implements BudgetRepositoryInterface
return $limit; return $limit;
} }
/**
* @param Collection $accounts
* @param Carbon $start
* @param Carbon $end
*
* @return string
*/
public function spentInPeriodWithoutBudget(Collection $accounts, Carbon $start, Carbon $end): string
{
$set = $this->journalsInPeriodWithoutBudget($accounts, $start, $end);
//Log::debug('spentInPeriod set count is ' . $set->count());
$sum = '0';
/** @var TransactionJournal $journal */
foreach ($set as $journal) {
$sum = bcadd($sum, TransactionJournal::amount($journal));
}
Log::debug('spentInPeriodWithoutBudget between ' . $start->format('Y-m-d') . ' and ' . $end->format('Y-m-d') . ' is ' . $sum);
return $sum;
}
} }

View File

@@ -53,6 +53,7 @@ interface BudgetRepositoryInterface
/** /**
* This method returns the oldest journal or transaction date known to this budget. * This method returns the oldest journal or transaction date known to this budget.
* Will cache result. * Will cache result.
*
* @param Budget $budget * @param Budget $budget
* *
* @return Carbon * @return Carbon
@@ -218,6 +219,15 @@ interface BudgetRepositoryInterface
*/ */
public function journalsInPeriodWithoutBudget(Collection $accounts, Carbon $start, Carbon $end): Collection; public function journalsInPeriodWithoutBudget(Collection $accounts, Carbon $start, Carbon $end): Collection;
/**
* @param Collection $accounts
* @param Carbon $start
* @param Carbon $end
*
* @return string
*/
public function spentInPeriodWithoutBudget(Collection $accounts, Carbon $start, Carbon $end): string;
/** /**
* @param Collection $budgets * @param Collection $budgets
* @param Collection $accounts * @param Collection $accounts