/**
  * @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;
 }