. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Category; use Carbon\Carbon; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Category; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Support\Http\Controllers\PeriodOverview; use Illuminate\Contracts\View\Factory; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\View\View; /** * * Class ShowController * */ class ShowController extends Controller { use PeriodOverview; /** @var CategoryRepositoryInterface The category repository */ private $repository; /** * CategoryController constructor. * * @codeCoverageIgnore */ public function __construct() { parent::__construct(); app('view')->share('showBudget', true); $this->middleware( function ($request, $next) { app('view')->share('title', (string) trans('firefly.categories')); app('view')->share('mainTitleIcon', 'fa-bookmark'); $this->repository = app(CategoryRepositoryInterface::class); return $next($request); } ); } /** * Show a single category. * * @param Request $request * @param Category $category * @param Carbon|null $start * @param Carbon|null $end * * @return Factory|View */ public function show(Request $request, Category $category, Carbon $start = null, Carbon $end = null) { /** @var Carbon $start */ $start = $start ?? session('start', Carbon::now()->startOfMonth()); /** @var Carbon $end */ $end = $end ?? session('end', Carbon::now()->endOfMonth()); $subTitleIcon = 'fa-bookmark'; $page = (int) $request->get('page'); $attachments = $this->repository->getAttachments($category); $pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $oldest = $this->repository->firstUseDate($category) ?? Carbon::now()->startOfYear(); $periods = $this->getCategoryPeriodOverview($category, $oldest, $end); $path = route('categories.show', [$category->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); $subTitle = trans( 'firefly.journals_in_period_for_category', ['name' => $category->name, 'start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat),] ); /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setRange($start, $end)->setLimit($pageSize)->setPage($page) ->withAccountInformation() ->setCategory($category)->withBudgetInformation()->withCategoryInformation(); $groups = $collector->getPaginatedGroups(); $groups->setPath($path); return view('categories.show', compact('category','attachments', 'groups', 'periods', 'subTitle', 'subTitleIcon', 'start', 'end')); } /** * Show all transactions within a category. * * @param Request $request * @param Category $category * * @return Factory|View */ public function showAll(Request $request, Category $category) { // default values: $subTitleIcon = 'fa-bookmark'; $page = (int) $request->get('page'); $pageSize = (int) app('preferences')->get('listPageSize', 50)->data; $start = null; $end = null; $periods = new Collection; $subTitle = (string) trans('firefly.all_journals_for_category', ['name' => $category->name]); $first = $this->repository->firstUseDate($category); /** @var Carbon $start */ $start = $first ?? today(config('app.timezone')); $end = today(config('app.timezone')); $path = route('categories.show.all', [$category->id]); $attachments = $this->repository->getAttachments($category); /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setRange($start, $end)->setLimit($pageSize)->setPage($page) ->withAccountInformation() ->setCategory($category)->withBudgetInformation()->withCategoryInformation(); $groups = $collector->getPaginatedGroups(); $groups->setPath($path); return view('categories.show', compact('category','attachments', 'groups', 'periods', 'subTitle', 'subTitleIcon', 'start', 'end')); } }