. */ declare(strict_types=1); namespace FireflyIII\Console\Commands\Upgrade; use FireflyIII\Console\Commands\ShowsFriendlyMessages; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use Illuminate\Console\Command; use Illuminate\Support\Collection; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; /** * Class CCLiabilities */ class CCLiabilities extends Command { use ShowsFriendlyMessages; public const CONFIG_NAME = '480_cc_liabilities'; protected $description = 'Convert old credit card liabilities.'; protected $signature = 'firefly-iii:cc-liabilities {--F|force : Force the execution of this command.}'; /** * Execute the console command. * * @return int * @throws ContainerExceptionInterface * @throws FireflyException * @throws NotFoundExceptionInterface */ public function handle(): int { if ($this->isExecuted() && true !== $this->option('force')) { $this->friendlyInfo('This command has already been executed.'); return 0; } $ccType = AccountType::where('type', AccountType::CREDITCARD)->first(); $debtType = AccountType::where('type', AccountType::DEBT)->first(); if (null === $ccType || null === $debtType) { $this->friendlyPositive('No incorrectly stored credit card liabilities.'); $this->markAsExecuted(); return 0; } /** @var Collection $accounts */ $accounts = Account::where('account_type_id', $ccType->id)->get(); foreach ($accounts as $account) { $account->account_type_id = $debtType->id; $account->save(); $this->friendlyInfo(sprintf('Converted credit card liability account "%s" (#%d) to generic debt liability.', $account->name, $account->id)); } if ($accounts->count() > 0) { $this->friendlyWarning( 'Credit card liability types are no longer supported and have been converted to generic debts. See: https://bit.ly/FF3-credit-cards' ); } if (0 === $accounts->count()) { $this->friendlyPositive('No incorrectly stored credit card liabilities.'); } $this->markAsExecuted(); return 0; } /** * @return bool * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ private function isExecuted(): bool { $configVar = app('fireflyconfig')->get(self::CONFIG_NAME, false); return (bool)$configVar?->data; } /** * */ private function markAsExecuted(): void { app('fireflyconfig')->set(self::CONFIG_NAME, true); } }