Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

UpdateCurrencyRates.php 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. namespace App\Listeners;
  3. use App\Contracts\CurrencyHandler;
  4. use App\Events\DefaultCurrencyChanged;
  5. use App\Models\Setting\Currency;
  6. use Illuminate\Support\Facades\DB;
  7. readonly class UpdateCurrencyRates
  8. {
  9. /**
  10. * Create the event listener.
  11. */
  12. public function __construct(private CurrencyHandler $currencyService)
  13. {
  14. //
  15. }
  16. /**
  17. * Handle the event.
  18. */
  19. public function handle(DefaultCurrencyChanged $event): void
  20. {
  21. DB::transaction(function () use ($event) {
  22. $defaultCurrency = $event->currency;
  23. if (bccomp((string) $defaultCurrency->rate, '1.0', 8) !== 0) {
  24. $defaultCurrency->update(['rate' => 1]);
  25. }
  26. $this->updateOtherCurrencyRates($defaultCurrency);
  27. });
  28. }
  29. private function updateOtherCurrencyRates(Currency $defaultCurrency): void
  30. {
  31. $targetCurrencies = Currency::where('code', '!=', $defaultCurrency->code)
  32. ->pluck('code')
  33. ->toArray();
  34. $exchangeRates = $this->currencyService->getCachedExchangeRates($defaultCurrency->code, $targetCurrencies);
  35. foreach ($exchangeRates as $currencyCode => $newRate) {
  36. $currency = Currency::where('code', $currencyCode)->first();
  37. if ($currency && bccomp((string) $currency->rate, (string) $newRate, 8) !== 0) {
  38. $currency->update(['rate' => $newRate]);
  39. }
  40. }
  41. }
  42. }