. */ declare(strict_types=1); namespace FireflyIII\Console\Commands\Integrity; use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Models\Account; use FireflyIII\Models\Budget; use FireflyIII\Models\Category; use FireflyIII\Models\Tag; use Illuminate\Console\Command; use stdClass; /** * Class ReportEmptyObjects */ class ReportEmptyObjects extends Command { use ShowsFriendlyMessages; /** * The console command description. * * @var string */ protected $description = 'Reports on empty database objects.'; /** * The name and signature of the console command. * * @var string */ protected $signature = 'firefly-iii:report-empty-objects'; /** * Execute the console command. * * @return int */ public function handle(): int { $this->reportEmptyBudgets(); $this->reportEmptyCategories(); $this->reportEmptyTags(); $this->reportAccounts(); $this->reportBudgetLimits(); return 0; } /** * Report on budgets with no transactions or journals. */ private function reportEmptyBudgets(): void { $set = Budget::leftJoin('budget_transaction_journal', 'budgets.id', '=', 'budget_transaction_journal.budget_id') ->leftJoin('users', 'budgets.user_id', '=', 'users.id') ->distinct() ->whereNull('budget_transaction_journal.budget_id') ->whereNull('budgets.deleted_at') ->get(['budgets.id', 'budgets.name', 'budgets.user_id', 'users.email']); /** @var stdClass $entry */ foreach ($set as $entry) { $line = sprintf( 'User #%d (%s) has budget #%d ("%s") which has no transaction journals.', $entry->user_id, $entry->email, $entry->id, $entry->name ); $this->friendlyWarning($line); } } /** * Report on categories with no transactions or journals. */ private function reportEmptyCategories(): void { $set = Category::leftJoin('category_transaction_journal', 'categories.id', '=', 'category_transaction_journal.category_id') ->leftJoin('users', 'categories.user_id', '=', 'users.id') ->distinct() ->whereNull('category_transaction_journal.category_id') ->whereNull('categories.deleted_at') ->get(['categories.id', 'categories.name', 'categories.user_id', 'users.email']); /** @var stdClass $entry */ foreach ($set as $entry) { $line = sprintf( 'User #%d (%s) has category #%d ("%s") which has no transaction journals.', $entry->user_id, $entry->email, $entry->id, $entry->name ); $this->friendlyWarning($line); } } /** * */ private function reportEmptyTags(): void { $set = Tag::leftJoin('tag_transaction_journal', 'tags.id', '=', 'tag_transaction_journal.tag_id') ->leftJoin('users', 'tags.user_id', '=', 'users.id') ->distinct() ->whereNull('tag_transaction_journal.tag_id') ->whereNull('tags.deleted_at') ->get(['tags.id', 'tags.tag', 'tags.user_id', 'users.email']); /** @var stdClass $entry */ foreach ($set as $entry) { $line = sprintf( 'User #%d (%s) has tag #%d ("%s") which has no transaction journals.', $entry->user_id, $entry->email, $entry->id, $entry->tag ); $this->friendlyWarning($line); } } /** * Reports on accounts with no transactions. */ private function reportAccounts(): void { $set = Account::leftJoin('transactions', 'transactions.account_id', '=', 'accounts.id') ->leftJoin('users', 'accounts.user_id', '=', 'users.id') ->groupBy(['accounts.id', 'accounts.encrypted', 'accounts.name', 'accounts.user_id', 'users.email']) ->whereNull('transactions.account_id') ->get( ['accounts.id', 'accounts.encrypted', 'accounts.name', 'accounts.user_id', 'users.email'] ); /** @var stdClass $entry */ foreach ($set as $entry) { $line = 'User #%d (%s) has account #%d ("%s") which has no transactions.'; $line = sprintf($line, $entry->user_id, $entry->email, $entry->id, $entry->name); $this->friendlyWarning($line); } } /** * Reports on budgets with no budget limits (which makes them pointless). */ private function reportBudgetLimits(): void { $set = Budget::leftJoin('budget_limits', 'budget_limits.budget_id', '=', 'budgets.id') ->leftJoin('users', 'budgets.user_id', '=', 'users.id') ->groupBy(['budgets.id', 'budgets.name', 'budgets.encrypted', 'budgets.user_id', 'users.email']) ->whereNull('budget_limits.id') ->get(['budgets.id', 'budgets.name', 'budgets.user_id', 'budgets.encrypted', 'users.email']); /** @var Budget $entry */ foreach ($set as $entry) { $line = sprintf( 'User #%d (%s) has budget #%d ("%s") which has no budget limits.', $entry->user_id, $entry->email, $entry->id, $entry->name ); $this->friendlyWarning($line); } } }