. */ declare(strict_types=1); namespace App\Command\Currencies; use App\Entity\PriceInformations\Currency; use App\Services\Tools\ExchangeRateUpdater; use Doctrine\ORM\EntityManagerInterface; use Exchanger\Exception\Exception; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use function count; use function strlen; #[\Symfony\Component\Console\Attribute\AsCommand('partdb:currencies:update-exchange-rates|partdb:update-exchange-rates|app:update-exchange-rates', 'Updates the currency exchange rates.')] class UpdateExchangeRatesCommand extends Command { protected string $base_current; protected EntityManagerInterface $em; protected ExchangeRateUpdater $exchangeRateUpdater; public function __construct(string $base_current, EntityManagerInterface $entityManager, ExchangeRateUpdater $exchangeRateUpdater) { //$this->swap = $swap; $this->base_current = $base_current; $this->em = $entityManager; $this->exchangeRateUpdater = $exchangeRateUpdater; parent::__construct(); } protected function configure(): void { $this->addArgument('iso_code', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'The ISO Codes of the currencies that should be updated.'); } protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); //Check for valid base current if (3 !== strlen($this->base_current)) { $io->error('Chosen Base current is not valid. Check your settings!'); return \Symfony\Component\Console\Command\Command::FAILURE; } $io->note('Update currency exchange rates with base currency: '.$this->base_current); //Check what currencies we need to update: $iso_code = $input->getArgument('iso_code'); $repo = $this->em->getRepository(Currency::class); if (!empty($iso_code)) { $candidates = $repo->findBy(['iso_code' => $iso_code]); } else { $candidates = $repo->findAll(); } $success_counter = 0; //Iterate over each candidate and update exchange rate foreach ($candidates as $currency) { /** @var Currency $currency */ try { $this->exchangeRateUpdater->update($currency); $io->note(sprintf('Set exchange rate of %s to %f', $currency->getIsoCode(), $currency->getExchangeRate()->toFloat())); $this->em->persist($currency); ++$success_counter; } catch (Exception $exception) { $io->warning(sprintf('Error updating %s:', $currency->getIsoCode())); $io->warning($exception->getMessage()); } } //Save to database $this->em->flush(); $io->success(sprintf('%d (of %d) currency exchange rates were updated.', $success_counter, count($candidates))); return \Symfony\Component\Console\Command\Command::SUCCESS; } }