/** * @param Carbon $start * @param Carbon $end * @param Collection $accounts * * @return Balance */ public function getBalanceReport(Carbon $start, Carbon $end, Collection $accounts) : Balance { $balance = new Balance(); $header = new BalanceHeader(); $limitRepetitions = $this->budgetRepository->getAllBudgetLimitRepetitions($start, $end); foreach ($accounts as $account) { $header->addAccount($account); } /** @var LimitRepetition $repetition */ foreach ($limitRepetitions as $repetition) { $budget = $this->budgetRepository->find($repetition->budget_id); $line = $this->createBalanceLine($budget, $repetition, $accounts); $balance->addBalanceLine($line); } $noBudgetLine = $this->createNoBudgetLine($accounts, $start, $end); $coveredByTagLine = $this->createTagsBalanceLine($accounts, $start, $end); $leftUnbalancedLine = $this->createLeftUnbalancedLine($noBudgetLine, $coveredByTagLine); $balance->addBalanceLine($noBudgetLine); $balance->addBalanceLine($coveredByTagLine); $balance->addBalanceLine($leftUnbalancedLine); $balance->setBalanceHeader($header); // remove budgets without expenses from balance lines: $balance = $this->removeUnusedBudgets($balance); return $balance; }