From 2cfbfd8649e00e83c1bbe1f8588250e91c276410 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 24 Apr 2016 20:00:20 +0200 Subject: [PATCH] Start of better budget charts. --- .../Budget/BudgetChartGeneratorInterface.php | 7 --- .../Budget/ChartJsBudgetChartGenerator.php | 19 ++----- app/Helpers/Report/BudgetReportHelper.php | 27 ++++++++++ .../Report/BudgetReportHelperInterface.php | 9 ++++ .../Controllers/Chart/BudgetController.php | 49 ------------------- app/Http/Controllers/ReportController.php | 7 +-- app/Http/routes.php | 2 - public/js/ff/reports/default/year.js | 13 ++++- resources/views/reports/default/year.twig | 6 ++- 9 files changed, 59 insertions(+), 80 deletions(-) diff --git a/app/Generator/Chart/Budget/BudgetChartGeneratorInterface.php b/app/Generator/Chart/Budget/BudgetChartGeneratorInterface.php index 58d4e5302f..f9c2279646 100644 --- a/app/Generator/Chart/Budget/BudgetChartGeneratorInterface.php +++ b/app/Generator/Chart/Budget/BudgetChartGeneratorInterface.php @@ -19,13 +19,6 @@ use Illuminate\Support\Collection; */ interface BudgetChartGeneratorInterface { - /** - * @param Collection $entries - * - * @return array - */ - public function budget(Collection $entries): array; - /** * @param Collection $entries * diff --git a/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php b/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php index 3cdd335b31..9ba792f194 100644 --- a/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php +++ b/app/Generator/Chart/Budget/ChartJsBudgetChartGenerator.php @@ -14,18 +14,16 @@ use Preferences; */ class ChartJsBudgetChartGenerator implements BudgetChartGeneratorInterface { - /** + * * @param Collection $entries - * @param string $dateFormat * * @return array */ - public function budget(Collection $entries, $dateFormat = 'month'): array + public function budgetLimit(Collection $entries): array { - // language: $language = Preferences::get('language', env('DEFAULT_LANGUAGE', 'en_US'))->data; - $format = Config::get('firefly.' . $dateFormat . '.' . $language); + $format = Config::get('firefly.monthAndDay.' . $language); $data = [ 'labels' => [], @@ -49,17 +47,6 @@ class ChartJsBudgetChartGenerator implements BudgetChartGeneratorInterface return $data; } - /** - * - * @param Collection $entries - * - * @return array - */ - public function budgetLimit(Collection $entries): array - { - return $this->budget($entries, 'monthAndDay'); - } - /** * @param Collection $entries * diff --git a/app/Helpers/Report/BudgetReportHelper.php b/app/Helpers/Report/BudgetReportHelper.php index e7e8036fa2..35707945a2 100644 --- a/app/Helpers/Report/BudgetReportHelper.php +++ b/app/Helpers/Report/BudgetReportHelper.php @@ -14,6 +14,7 @@ namespace FireflyIII\Helpers\Report; use Carbon\Carbon; use FireflyIII\Helpers\Collection\Budget as BudgetCollection; use FireflyIII\Helpers\Collection\BudgetLine; +use FireflyIII\Models\Budget; use FireflyIII\Models\LimitRepetition; use Illuminate\Support\Collection; @@ -106,6 +107,32 @@ class BudgetReportHelper implements BudgetReportHelperInterface return $object; } + /** + * @param Carbon $start + * @param Carbon $end + * @param Collection $accounts + * + * @return Collection + */ + public function getBudgetsWithExpenses(Carbon $start, Carbon $end, Collection $accounts): Collection + { + /** @var \FireflyIII\Repositories\Budget\BudgetRepositoryInterface $repository */ + $repository = app('FireflyIII\Repositories\Budget\BudgetRepositoryInterface'); + $budgets = $repository->getActiveBudgets(); + + $set = new Collection; + /** @var Budget $budget */ + foreach ($budgets as $budget) { + $expenses = $repository->getExpensesPerDay($budget, $start, $end); + $total = strval($expenses->sum('dailyAmount')); + if (bccomp($total, '0') === -1) { + $set->push($budget); + } + } + + return $set; + } + /** * Take the array as returned by SingleCategoryRepositoryInterface::spentPerDay and SingleCategoryRepositoryInterface::earnedByDay * and sum up everything in the array in the given range. diff --git a/app/Helpers/Report/BudgetReportHelperInterface.php b/app/Helpers/Report/BudgetReportHelperInterface.php index b1cd8fb955..6bc376f2e4 100644 --- a/app/Helpers/Report/BudgetReportHelperInterface.php +++ b/app/Helpers/Report/BudgetReportHelperInterface.php @@ -30,4 +30,13 @@ interface BudgetReportHelperInterface * @return BudgetCollection */ public function getBudgetReport(Carbon $start, Carbon $end, Collection $accounts): BudgetCollection; + + /** + * @param Carbon $start + * @param Carbon $end + * @param Collection $accounts + * + * @return Collection + */ + public function getBudgetsWithExpenses(Carbon $start, Carbon $end, Collection $accounts): Collection; } diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index b7025dd279..6c7ee6fe29 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -36,55 +36,6 @@ class BudgetController extends Controller $this->generator = app('FireflyIII\Generator\Chart\Budget\BudgetChartGeneratorInterface'); } - /** - * @param BudgetRepositoryInterface $repository - * @param Budget $budget - * - * @return \Symfony\Component\HttpFoundation\Response - */ - public function budget(BudgetRepositoryInterface $repository, Budget $budget) - { - - // dates and times - $first = $repository->getFirstBudgetLimitDate($budget); - $range = Preferences::get('viewRange', '1M')->data; - $last = session('end', new Carbon); - - // chart properties for cache: - $cache = new CacheProperties(); - $cache->addProperty($first); - $cache->addProperty($last); - $cache->addProperty('budget'); - if ($cache->has()) { - - return Response::json($cache->get()); - } - - $final = clone $last; - $final->addYears(2); - $last = Navigation::endOfX($last, $range, $final); - $entries = new Collection; - // get all expenses: - $spentArray = $repository->spentPerDay($budget, $first, $last); - - while ($first < $last) { - - // periodspecific dates: - $currentStart = Navigation::startOfPeriod($first, $range); - $currentEnd = Navigation::endOfPeriod($first, $range); - $spent = $this->getSumOfRange($currentStart, $currentEnd, $spentArray); - $entry = [$first, ($spent * -1)]; - - $entries->push($entry); - $first = Navigation::addPeriod($first, $range, 0); - } - - $data = $this->generator->budget($entries); - $cache->store($data); - - return Response::json($data); - } - /** * Shows the amount left in a specific budget limit. * diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 0873d45846..ac269636e6 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -9,8 +9,6 @@ use FireflyIII\Helpers\Report\ReportHelperInterface; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface as ARI; -use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; -use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use Illuminate\Support\Collection; use Log; use Preferences; @@ -313,6 +311,9 @@ class ReportController extends Controller $expenses = $this->helper->getExpenseReport($start, $end, $accounts); $tags = $this->helper->tagReport($start, $end, $accounts); + // find the budgets we've spent money on this period with these accounts: + $budgets = $this->budgetHelper->getBudgetsWithExpenses($start, $end, $accounts); + Session::flash('gaEventCategory', 'report'); Session::flash('gaEventAction', 'year'); Session::flash('gaEventLabel', $start->format('Y')); @@ -329,7 +330,7 @@ class ReportController extends Controller 'reports.default.year', compact( 'start', 'accountReport', 'incomes', 'reportType', 'accountIds', 'end', - 'expenses', 'incomeTopLength', 'expenseTopLength', 'tags' + 'expenses', 'incomeTopLength', 'expenseTopLength', 'tags', 'budgets' ) ); } diff --git a/app/Http/routes.php b/app/Http/routes.php index c9caa03944..04b22c255c 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -200,9 +200,7 @@ Route::group( Route::get('/chart/budget/frontpage', ['uses' => 'Chart\BudgetController@frontpage']); // this chart is used in reports: - Route::get('/chart/budget/year/{reportType}/{start_date}/{end_date}/{accountList}', ['uses' => 'Chart\BudgetController@year']); Route::get('/chart/budget/multi-year/{reportType}/{start_date}/{end_date}/{accountList}/{budgetList}', ['uses' => 'Chart\BudgetController@multiYear']); - Route::get('/chart/budget/{budget}/{limitrepetition}', ['uses' => 'Chart\BudgetController@budgetLimit']); Route::get('/chart/budget/{budget}', ['uses' => 'Chart\BudgetController@budget']); diff --git a/public/js/ff/reports/default/year.js b/public/js/ff/reports/default/year.js index 8a39be3ef3..184b651d37 100644 --- a/public/js/ff/reports/default/year.js +++ b/public/js/ff/reports/default/year.js @@ -18,7 +18,18 @@ function drawChart() { lineChart('chart/report/net-worth/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'net-worth'); columnChart('chart/report/in-out/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'income-expenses-chart'); columnChart('chart/report/in-out-sum/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'income-expenses-sum-chart'); - stackedColumnChart('chart/budget/year/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'budgets'); + + // in a loop + $.each($('.budget_year_chart'), function (i, v) { + var holder = $(v); + var id = holder.id; + var budgetId = holder.data('budget'); + console.log('now at ' + id); + columnChart('chart/budget/period/' + budgetId + '/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, id); + + }); + + //stackedColumnChart('chart/budget/year/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'budgets'); stackedColumnChart('chart/category/spent-in-period/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'categories-spent-in-period'); stackedColumnChart('chart/category/earned-in-period/' + reportType + '/' + startDate + '/' + endDate + '/' + accountIds, 'categories-earned-in-period'); diff --git a/resources/views/reports/default/year.twig b/resources/views/reports/default/year.twig index 43b6b4e9be..83e189a86f 100644 --- a/resources/views/reports/default/year.twig +++ b/resources/views/reports/default/year.twig @@ -87,18 +87,20 @@ + {% for budget in budgets %}
-

{{ 'budgets'|_ }}

+

{{ budget.name }}

- +
+ {% endfor %} {% endblock %} {% block scripts %}