diff --git a/app/Generator/Report/Standard/MonthReportGenerator.php b/app/Generator/Report/Standard/MonthReportGenerator.php index 05bf049cc4..17e4d7c745 100644 --- a/app/Generator/Report/Standard/MonthReportGenerator.php +++ b/app/Generator/Report/Standard/MonthReportGenerator.php @@ -24,7 +24,6 @@ namespace FireflyIII\Generator\Report\Standard; use Carbon\Carbon; use FireflyIII\Generator\Report\ReportGeneratorInterface; -use FireflyIII\Helpers\Report\ReportHelperInterface; use Illuminate\Support\Collection; use Log; use Throwable; @@ -50,17 +49,11 @@ class MonthReportGenerator implements ReportGeneratorInterface */ public function generate(): string { - /** @var ReportHelperInterface $helper */ - $helper = app(ReportHelperInterface::class); - $bills = $helper->getBillReport($this->start, $this->end, $this->accounts); $accountIds = implode(',', $this->accounts->pluck('id')->toArray()); $reportType = 'default'; try { - return view( - 'reports.default.month', - compact('bills', 'accountIds', 'reportType') - )->with('start', $this->start)->with('end', $this->end)->render(); + return view('reports.default.month', compact('accountIds', 'reportType'))->with('start', $this->start)->with('end', $this->end)->render(); } catch (Throwable $e) { Log::error(sprintf('Cannot render reports.default.month: %s', $e->getMessage())); $result = 'Could not render report view.'; diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index 85dcde11ca..83a3d47589 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -66,20 +66,61 @@ class ReportHelper implements ReportHelperInterface * * Excludes bills which have not had a payment on the mentioned accounts. * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * * @param Carbon $start * @param Carbon $end * @param Collection $accounts * - * @return BillCollection + * @return array */ - public function getBillReport(Carbon $start, Carbon $end, Collection $accounts): BillCollection + public function getBillReport(Collection $accounts, Carbon $start, Carbon $end): array { /** @var BillRepositoryInterface $repository */ $repository = app(BillRepositoryInterface::class); $bills = $repository->getBillsForAccounts($accounts); + $report = [ + 'bills' => [], + ]; + + /** @var Bill $bill */ + foreach ($bills as $bill) { + $expectedDates = $repository->getPayDatesInRange($bill, $start, $end); + $billId = $bill->id; + $currency = $bill->transactionCurrency; + $current = [ + 'id' => $bill->id, + 'name' => $bill->name, + 'active' => $bill->active, + 'amount_min' => $bill->amount_min, + 'amount_max' => $bill->amount_max, + 'currency_id' => $bill->transaction_currency_id, + 'currency_code' => $currency->code, + 'currency_name' => $currency->name, + 'currency_symbol' => $currency->symbol, + 'currency_decimal_places' => $currency->decimal_places, + 'expected_dates' => $expectedDates->toArray(), + 'paid_moments' => [], + ]; + + /** @var Carbon $start */ + foreach ($expectedDates as $expectedStart) { + $expectedEnd = app('navigation')->endOfX($expectedStart, $bill->repeat_freq, null); + + // is paid in this period maybe? + /** @var GroupCollectorInterface $collector */ + $collector = app(GroupCollectorInterface::class); + $collector->setAccounts($accounts)->setRange($expectedStart, $expectedEnd)->setBill($bill); + $current['paid_moments'][] = $collector->getExtractedJournals(); + } + + // append to report: + $report['bills'][$billId] = $current; + } + + return $report; + echo '
'; + print_r($report); + exit; + $collection = new BillCollection; $collection->setStartDate($start); diff --git a/app/Helpers/Report/ReportHelperInterface.php b/app/Helpers/Report/ReportHelperInterface.php index 703aa149a9..5830764cad 100644 --- a/app/Helpers/Report/ReportHelperInterface.php +++ b/app/Helpers/Report/ReportHelperInterface.php @@ -41,9 +41,9 @@ interface ReportHelperInterface * @param Carbon $end * @param Collection $accounts * - * @return BillCollection + * @return array */ - public function getBillReport(Carbon $start, Carbon $end, Collection $accounts): BillCollection; + public function getBillReport(Collection $accounts, Carbon $start, Carbon $end): array; /** * Generate a list of months. diff --git a/app/Http/Controllers/Report/BalanceController.php b/app/Http/Controllers/Report/BalanceController.php index f9032ac989..25ac0f23cf 100644 --- a/app/Http/Controllers/Report/BalanceController.php +++ b/app/Http/Controllers/Report/BalanceController.php @@ -54,7 +54,7 @@ class BalanceController extends Controller $cache->addProperty('balance-report'); $cache->addProperty($accounts->pluck('id')->toArray()); if ($cache->has()) { - //return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } $helper = app(BalanceReportHelperInterface::class); $report = $helper->getBalanceReport($accounts, $start, $end); diff --git a/app/Http/Controllers/Report/BillController.php b/app/Http/Controllers/Report/BillController.php new file mode 100644 index 0000000000..ca5d88cf73 --- /dev/null +++ b/app/Http/Controllers/Report/BillController.php @@ -0,0 +1,73 @@ +. + */ + +namespace FireflyIII\Http\Controllers\Report; + + +use Carbon\Carbon; +use FireflyIII\Helpers\Report\ReportHelperInterface; +use FireflyIII\Http\Controllers\Controller; +use FireflyIII\Support\CacheProperties; +use Illuminate\Support\Collection; +use Log; +use Throwable; + +/** + * Class BillController + */ +class BillController extends Controller +{ + /** + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + */ + public function overview(Collection $accounts, Carbon $start, Carbon $end) + { // chart properties for cache: + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('bill-report'); + $cache->addProperty($accounts->pluck('id')->toArray()); + if ($cache->has()) { + //return $cache->get(); // @codeCoverageIgnore + } + + + /** @var ReportHelperInterface $helper */ + $helper = app(ReportHelperInterface::class); + $report = $helper->getBillReport($accounts, $start, $end); + + +// try { + $result = view('reports.partials.bills', compact('report'))->render(); + // @codeCoverageIgnoreStart +// } catch (Throwable $e) { +// Log::debug(sprintf('Could not render reports.partials.budgets: %s', $e->getMessage())); +// $result = 'Could not render view.'; +// } + // @codeCoverageIgnoreEnd + $cache->store($result); + + return $result; + + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Report/BudgetController.php b/app/Http/Controllers/Report/BudgetController.php index fe01dd7ac7..4cc0ac2cda 100644 --- a/app/Http/Controllers/Report/BudgetController.php +++ b/app/Http/Controllers/Report/BudgetController.php @@ -57,17 +57,17 @@ class BudgetController extends Controller $cache->addProperty('budget-report'); $cache->addProperty($accounts->pluck('id')->toArray()); if ($cache->has()) { - //return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } $helper = app(BudgetReportHelperInterface::class); $budgets = $helper->getBudgetReport($start, $end, $accounts); - //try { + try { $result = view('reports.partials.budgets', compact('budgets'))->render(); // @codeCoverageIgnoreStart -// } catch (Throwable $e) { -// Log::debug(sprintf('Could not render reports.partials.budgets: %s', $e->getMessage())); -// $result = 'Could not render view.'; -// } + } catch (Throwable $e) { + Log::debug(sprintf('Could not render reports.partials.budgets: %s', $e->getMessage())); + $result = 'Could not render view.'; + } // @codeCoverageIgnoreEnd $cache->store($result); diff --git a/app/Http/Controllers/Report/CategoryController.php b/app/Http/Controllers/Report/CategoryController.php index cd0d169443..d018f5f3c6 100644 --- a/app/Http/Controllers/Report/CategoryController.php +++ b/app/Http/Controllers/Report/CategoryController.php @@ -164,7 +164,7 @@ class CategoryController extends Controller $cache->addProperty('category-report'); $cache->addProperty($accounts->pluck('id')->toArray()); if ($cache->has()) { - //return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } /** @var CategoryRepositoryInterface $repository */ diff --git a/app/Http/Controllers/Report/ExpenseController.php b/app/Http/Controllers/Report/ExpenseController.php index 171f81659b..4b0c22d6ce 100644 --- a/app/Http/Controllers/Report/ExpenseController.php +++ b/app/Http/Controllers/Report/ExpenseController.php @@ -253,7 +253,7 @@ class ExpenseController extends Controller $cache->addProperty($accounts->pluck('id')->toArray()); $cache->addProperty($expense->pluck('id')->toArray()); if ($cache->has()) { - //return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } $combined = $this->combineAccounts($expense); $all = new Collection; @@ -305,7 +305,7 @@ class ExpenseController extends Controller $cache->addProperty($accounts->pluck('id')->toArray()); $cache->addProperty($expense->pluck('id')->toArray()); if ($cache->has()) { - //return $cache->get(); // @codeCoverageIgnore + return $cache->get(); // @codeCoverageIgnore } $combined = $this->combineAccounts($expense); $all = new Collection; diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index ba17f478ac..9f58772a1c 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -238,8 +238,8 @@ class ReportController extends Controller trans( 'firefly.report_default', [ - 'start' => $start->formatLocalized($this->monthFormat), - 'end' => $end->formatLocalized($this->monthFormat), + 'start' => $start->formatLocalized($this->monthAndDayFormat), + 'end' => $end->formatLocalized($this->monthAndDayFormat), ] ) ); diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index 228193dd05..56ea6f377c 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -192,13 +192,13 @@ class BillRepository implements BillRepositoryInterface $set = $this->user->bills() ->leftJoin( 'transaction_journals', - function (JoinClause $join) { + static function (JoinClause $join) { $join->on('transaction_journals.bill_id', '=', 'bills.id')->whereNull('transaction_journals.deleted_at'); } ) ->leftJoin( 'transactions', - function (JoinClause $join) { + static function (JoinClause $join) { $join->on('transaction_journals.id', '=', 'transactions.transaction_journal_id')->where('transactions.amount', '<', 0); } ) diff --git a/public/v1/js/ff/reports/default/all.js b/public/v1/js/ff/reports/default/all.js index 0993d18654..9436704fcc 100644 --- a/public/v1/js/ff/reports/default/all.js +++ b/public/v1/js/ff/reports/default/all.js @@ -31,5 +31,6 @@ $(function () { loadAjaxPartial('incomeReport', incomeReportUri); loadAjaxPartial('expenseReport', expenseReportUri); loadAjaxPartial('incomeVsExpenseReport', incExpReportUri); + loadAjaxPartial('billReport', billReportUri); }); diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php index 661ac8b976..4711ac9308 100644 --- a/resources/lang/en_US/form.php +++ b/resources/lang/en_US/form.php @@ -255,5 +255,7 @@ return [ 'withdrawal_destination_id' => 'Destination account', 'deposit_source_id' => 'Source account', + 'expected_on' => 'Expected on', + 'paid' => 'Paid', ]; diff --git a/resources/views/v1/reports/default/month.twig b/resources/views/v1/reports/default/month.twig index cd963c0572..d3d9a5a16d 100644 --- a/resources/views/v1/reports/default/month.twig +++ b/resources/views/v1/reports/default/month.twig @@ -102,8 +102,7 @@-{{ 'categories'|_ }}
-+ {# loading indicator #} --- --@@ -134,10 +128,19 @@+ {#{% include 'reports/partials/bills' %}#} {% endblock %} {% block styles %} @@ -166,6 +169,7 @@ var incomeReportUri = '{{ route('report-data.operations.income', [accountIds, start.format('Ymd'), end.format('Ymd')]) }}'; var expenseReportUri = '{{ route('report-data.operations.expenses', [accountIds, start.format('Ymd'), end.format('Ymd')]) }}'; var incExpReportUri = '{{ route('report-data.operations.operations', [accountIds, start.format('Ymd'), end.format('Ymd')]) }}'; + var billReportUri = '{{ route('report-data.bills.overview', [accountIds, start.format('Ymd'), end.format('Ymd')]) }}'; // uri's for charts: var accountChartUri = '{{ route('chart.account.report', [accountIds, start.format('Ymd'), end.format('Ymd')]) }}'; diff --git a/resources/views/v1/reports/partials/balance.twig b/resources/views/v1/reports/partials/balance.twig index 69a7cbc112..807328fcdf 100644 --- a/resources/views/v1/reports/partials/balance.twig +++ b/resources/views/v1/reports/partials/balance.twig @@ -20,10 +20,15 @@ {% for account in report.accounts %} {% if budget.spent[account.id] %} -- {% include 'reports/partials/bills' %} - ++++ + {# loading indicator #} + +{{ 'bills'|_ }}
+- {{ formatAmountBySymbol(budget.spent[account.id].spent, budget.spent[account.id].currency_symbol, budget.spent[account.id].currency_decimal_places) }} - ++ {{ formatAmountBySymbol(budget.spent[account.id].spent, budget.spent[account.id].currency_symbol, budget.spent[account.id].currency_decimal_places) }} + + {% else %} + {% if report.accounts[account.id].sum != 0 %} ++ {% endif %} {% endif %} + {% endfor %} {% for sum in report.sums[budget.budget_id] %} diff --git a/resources/views/v1/reports/partials/bills.twig b/resources/views/v1/reports/partials/bills.twig index f6a90b5081..d9fbad38a6 100644 --- a/resources/views/v1/reports/partials/bills.twig +++ b/resources/views/v1/reports/partials/bills.twig @@ -1,19 +1,51 @@ - -diff --git a/routes/web.php b/routes/web.php index 174d7fb86d..624b4520e6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -701,6 +701,16 @@ Route::group( } ); +/** + * Report Data Bill Controller + */ +Route::group( + ['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers\Report', 'prefix' => 'report-data/bill', 'as' => 'report-data.bills.'], + static function () { + Route::get('overview/{accountList}/{start_date}/{end_date}', ['uses' => 'BillController@overview', 'as' => 'overview']); + } +); + /** * Report Data Expense / Revenue Account Controller */--{{ 'bills'|_ }}
---
+ {% for bill in report.bills %} + {% if bill.expected_dates|length > 0 and bill.paid_moments|length > 0 and bill.active %} + {{ trans('form.name') }} {{ trans('form.amount_min') }} {{ trans('form.amount_max') }} -{{ trans('form.amount') }} -{{ trans('form.under') }} +{{ trans('form.expected_on') }} +{{ trans('form.paid') }} + + {% endif %} + {% endfor %} + + {% for line in bills.getBills %}+ {{ bill.name }} + ++ {{ formatAmountBySymbol(bill.amount_min, bill.currency_symbol, bill.currency_decimal_places) }} + ++ {{ formatAmountBySymbol(bill.amount_max, bill.currency_symbol, bill.currency_decimal_places) }} + ++ {% for date in bill.expected_dates %} + {{ date.formatLocalized(monthAndDayFormat) }} +
+ {% endfor %} ++ {% set hitCount = 0 %} + {% for journals in bill.paid_moments %} + {% for journal in journals %} + {% set hitCount = hitCount+1 %} + {{ journal.description }}, + {{ formatAmountBySymbol(journal.amount, journal.currency_symbol, journal.currency_decimal_places) }} + +
+ {% endfor %} + {% endfor %} + {% if hitCount == 0 %} + {{ 'notCharged'|_ }} + {% endif %} +@@ -50,5 +82,3 @@ {% endfor %}