DashboardController::getCategorySpending and
DashboardAnalyticsController::getCategorySpending were the same rolled-up
expense-per-category query, differing only in whether they accepted a drill
parent (the dashboard always passed the top level). Copies of a financial
aggregation on two screens are a divergence risk.
Extract App\Services\CategorySpendingService::forPeriod() with an optional
drill parent and consume it from both controllers, dropping the now-unused
CategoryTree/DB/Collection/Category imports. Behaviour-preserving: the query,
roll-up and positive-amount filter are unchanged, and existing
DashboardAnalyticsTest / DashboardTest coverage stays green.