From bca2ddd5295053deda8b0cb5e8f9ec642665610d Mon Sep 17 00:00:00 2001 From: James Cole Date: Sat, 16 May 2015 14:14:22 +0200 Subject: [PATCH] Budget report thing. --- app/Helpers/Collection/Budget.php | 147 ++++++++++++++++++- app/Helpers/Collection/BudgetLine.php | 132 +++++++++++++++++ app/Helpers/Report/ReportHelper.php | 58 +++++++- app/Repositories/Budget/BudgetRepository.php | 2 - resources/twig/partials/reports/budgets.twig | 62 ++++++++ resources/twig/reports/month.twig | 63 +------- 6 files changed, 393 insertions(+), 71 deletions(-) create mode 100644 app/Helpers/Collection/BudgetLine.php create mode 100644 resources/twig/partials/reports/budgets.twig diff --git a/app/Helpers/Collection/Budget.php b/app/Helpers/Collection/Budget.php index 3347302dcd..1a8811b479 100644 --- a/app/Helpers/Collection/Budget.php +++ b/app/Helpers/Collection/Budget.php @@ -1,14 +1,147 @@ budgetLines = new Collection; + } + + /** + * @param BudgetLine $budgetLine + */ + public function addBudgetLine(BudgetLine $budgetLine) + { + $this->budgetLines->push($budgetLine); + } + + /** + * @param float $add + */ + public function addBudgeted($add) + { + $this->budgeted += floatval($add); + } + + /** + * @param float $add + */ + public function addLeft($add) + { + $this->left += floatval($add); + } + + /** + * @param float $add + */ + public function addOverspent($add) + { + $this->overspent += floatval($add); + } + + /** + * @param float $add + */ + public function addSpent($add) + { + $this->spent += floatval($add); + } + + /** + * @return float + */ + public function getBudgeted() + { + return $this->budgeted; + } + + /** + * @param float $budgeted + */ + public function setBudgeted($budgeted) + { + $this->budgeted = $budgeted; + } + + /** + * @return float + */ + public function getLeft() + { + return $this->left; + } + + /** + * @param float $left + */ + public function setLeft($left) + { + $this->left = $left; + } + + /** + * @return float + */ + public function getOverspent() + { + return $this->overspent; + } + + /** + * @param float $overspent + */ + public function setOverspent($overspent) + { + $this->overspent = $overspent; + } + + /** + * @return float + */ + public function getSpent() + { + return $this->spent; + } + + /** + * @param float $spent + */ + public function setSpent($spent) + { + $this->spent = $spent; + } + + /** + * @return \Illuminate\Support\Collection + */ + public function getBudgetLines() + { + return $this->budgetLines; + } + -class Budget { } \ No newline at end of file diff --git a/app/Helpers/Collection/BudgetLine.php b/app/Helpers/Collection/BudgetLine.php new file mode 100644 index 0000000000..8d9af943af --- /dev/null +++ b/app/Helpers/Collection/BudgetLine.php @@ -0,0 +1,132 @@ +budget; + } + + /** + * @param BudgetModel $budget + */ + public function setBudget($budget) + { + $this->budget = $budget; + } + + /** + * @return float + */ + public function getBudgeted() + { + return $this->budgeted; + } + + /** + * @param float $budgeted + */ + public function setBudgeted($budgeted) + { + $this->budgeted = $budgeted; + } + + /** + * @return float + */ + public function getLeft() + { + return $this->left; + } + + /** + * @param float $left + */ + public function setLeft($left) + { + $this->left = $left; + } + + /** + * @return float + */ + public function getOverspent() + { + return $this->overspent; + } + + /** + * @param float $overspent + */ + public function setOverspent($overspent) + { + $this->overspent = $overspent; + } + + /** + * @return float + */ + public function getSpent() + { + return $this->spent; + } + + /** + * @param float $spent + */ + public function setSpent($spent) + { + $this->spent = $spent; + } + + /** + * @return LimitRepetition + */ + public function getRepetition() + { + return $this->repetition; + } + + /** + * @param LimitRepetition $repetition + */ + public function setRepetition($repetition) + { + $this->repetition = $repetition; + } + + + + + + +} \ No newline at end of file diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index 7994ba03f3..347380408c 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -2,13 +2,16 @@ namespace FireflyIII\Helpers\Report; +use App; use Carbon\Carbon; use FireflyIII\Helpers\Collection\Account as AccountCollection; use FireflyIII\Helpers\Collection\Budget as BudgetCollection; +use FireflyIII\Helpers\Collection\BudgetLine; use FireflyIII\Helpers\Collection\Category as CategoryCollection; use FireflyIII\Helpers\Collection\Expense; use FireflyIII\Helpers\Collection\Income; use FireflyIII\Models\Account; +use FireflyIII\Models\LimitRepetition; /** * Class ReportHelper @@ -75,7 +78,60 @@ class ReportHelper implements ReportHelperInterface */ public function getBudgetReport(Carbon $start, Carbon $end, $shared) { - return null; + $object = new BudgetCollection; + /** @var \FireflyIII\Repositories\Budget\BudgetRepositoryInterface $repository */ + $repository = App::make('FireflyIII\Repositories\Budget\BudgetRepositoryInterface'); + $set = $repository->getBudgets(); + + foreach ($set as $budget) { + + $repetitions = $repository->getBudgetLimitRepetitions($budget, $start, $end); + + // no repetition(s) for this budget: + if ($repetitions->count() == 0) { + $spent = $repository->spentInPeriod($budget, $start, $end, $shared); + $budgetLine = new BudgetLine; + $budgetLine->setBudget($budget); + $budgetLine->setOverspent($spent); + $object->addOverspent($spent); + $object->addBudgetLine($budgetLine); + continue; + } + + // one or more repetitions for budget: + /** @var LimitRepetition $repetition */ + foreach ($repetitions as $repetition) { + $budgetLine = new BudgetLine; + $budgetLine->setBudget($budget); + $budgetLine->setRepetition($repetition); + $expenses = $repository->spentInPeriod($budget, $repetition->startdate, $repetition->enddate, $shared); + $left = $expenses < floatval($repetition->amount) ? floatval($repetition->amount) - $expenses : 0; + $spent = $expenses > floatval($repetition->amount) ? 0 : $expenses; + $overspent = $expenses > floatval($repetition->amount) ? $expenses - floatval($repetition->amount) : 0; + + $budgetLine->setLeft($left); + $budgetLine->setSpent($spent); + $budgetLine->setOverspent($overspent); + $budgetLine->setBudgeted($repetition->amount); + + $object->addBudgeted($repetition->amount); + $object->addSpent($spent); + $object->addLeft($left); + $object->addOverspent($overspent); + $object->addBudgetLine($budgetLine); + + } + + } + + // stuff outside of budgets: + $noBudget = $repository->getWithoutBudgetSum($start, $end); + $budgetLine = new BudgetLine; + $budgetLine->setOverspent($noBudget); + $object->addOverspent($noBudget); + $object->addBudgetLine($budgetLine); + + return $object; } /** diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 495697f5db..74dc26b9e2 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -99,8 +99,6 @@ class BudgetRepository implements BudgetRepositoryInterface public function getBudgets() { $budgets = Auth::user()->budgets()->get(); - $budgets->sortBy('name'); - return $budgets; } diff --git a/resources/twig/partials/reports/budgets.twig b/resources/twig/partials/reports/budgets.twig new file mode 100644 index 0000000000..89b55be2b6 --- /dev/null +++ b/resources/twig/partials/reports/budgets.twig @@ -0,0 +1,62 @@ +
+ +
+ + {{ 'budgets'|_ }} +
+ + + + + + + + + + {% for budgetLine in budgets.getBudgetLines %} + + + + + + + + + {% endfor %} + + + + + + + +
{{ 'budget'|_ }}{{ 'date'|_ }}{{ 'budgeted'|_ }}{{ 'spent'|_ }}{{ 'left'|_ }}{{ 'overspent'|_ }}
+ {% if budgetLine.getBudget %} + {{ budgetLine.getBudget.name }} + {% else %} + {{ 'noBudget'|_ }} + {% endif %} + + {% if budgetLine.getRepetition %} + {{ budgetLine.getRepetition.startdate.formatLocalized(monthAndDayFormat) }} + {% endif %} + + {% if budgetLine.getRepetition %} + {{ budgetLine.getRepetition.amount|formatAmount }} + {% else %} + {{ 0|formatAmount }} + {% endif %} + + {% if budgetLine.getSpent != 0 %} + {{ budgetLine.getSpent|formatAmount }} + {% endif %} + + {% if budgetLine.getLeft != 0 %} + {{ budgetLine.getLeft|formatAmount }} + {% endif %} + + {% if budgetLine.getOverspent != 0 %} + {{ budgetLine.getOverspent|formatAmountPlain }} + {% endif %} +
{{ 'sum'|_ }}{{ budgets.getBudgeted|formatAmount }}{{ budgets.getSpent|formatAmount }}{{ budgets.getLeft|formatAmount }}{{ budgets.getOverspent|formatAmountPlain }}
+
\ No newline at end of file diff --git a/resources/twig/reports/month.twig b/resources/twig/reports/month.twig index 6f39a41189..f2f9e79d4b 100644 --- a/resources/twig/reports/month.twig +++ b/resources/twig/reports/month.twig @@ -32,67 +32,8 @@
-
-
- - {{ 'budgets'|_ }} -
- - - - - - - - - - {% for data in budgets %} - - - - - - - - - {% endfor %} - - - - - - - -
{{ 'budget'|_ }}{{ 'date'|_ }}{{ 'budgeted'|_ }}{{ 'spent'|_ }}{{ 'left'|_ }}{{ 'overspent'|_ }}
- {% if data[0] %} - {{ data[0].name }} - {% else %} - {{ 'noBudget'|_ }} - {% endif %} - - {% if data[1] %} - {{ data[1].startdate.formatLocalized(monthAndDayFormat) }} - {% endif %} - - {% if data[1] %} - {{ data[1].amount|formatAmount }} - {% else %} - {{ 0|formatAmount }} - {% endif %} - - {% if data[3] != 0 %} - {{ data[3]|formatAmount }} - {% endif %} - - {% if data[2] != 0 %} - {{ data[2]|formatAmount }} - {% endif %} - - {% if data[4] != 0 %} - {{ data[4]|formatAmountPlain }} - {% endif %} -
{{ 'sum'|_ }}{{ budgetSums.budgeted|formatAmount }}{{ budgetSums.spent|formatAmount }}{{ budgetSums.left|formatAmount }}{{ budgetSums.overspent|formatAmountPlain }}
-
+ + {% include 'partials/reports/budgets.twig' %}