first commit
This commit is contained in:
93
Services/ExchangeRatesApiService.php
Normal file
93
Services/ExchangeRatesApiService.php
Normal file
@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace Koneko\CurrencyApi\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Koneko\VuexyAdmin\Models\CurrencyRate;
|
||||
use Koneko\VuexyAdmin\Models\Setting;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class CurrencyApiService
|
||||
{
|
||||
protected array $providers = ['banxico', 'fixer', 'ecb'];
|
||||
|
||||
/**
|
||||
* Obtiene la tasa de cambio de una moneda en una fecha específica.
|
||||
*/
|
||||
public function getExchangeRate(string $currency, $date = null): ?float
|
||||
{
|
||||
$date = $date ?: Carbon::now()->toDateString();
|
||||
|
||||
return CurrencyRate::where('currency_code', $currency)
|
||||
->where('date', '<=', $date)
|
||||
->orderByDesc('date')
|
||||
->first()
|
||||
?->exchange_rate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Actualiza las tasas de cambio de las 10 divisas.
|
||||
*/
|
||||
public function updateExchangeRates()
|
||||
{
|
||||
foreach ($this->providers as $provider) {
|
||||
$this->fetchAndStoreRates($provider);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene tasas de un proveedor y las guarda.
|
||||
*/
|
||||
protected function fetchAndStoreRates(string $provider)
|
||||
{
|
||||
$rates = match ($provider) {
|
||||
'banxico' => $this->fetchBanxicoRates(),
|
||||
'fixer' => $this->fetchFixerRates(),
|
||||
default => []
|
||||
};
|
||||
|
||||
foreach ($rates as $currency => $rate) {
|
||||
CurrencyRate::updateOrCreate(
|
||||
['currency_code' => $currency, 'date' => Carbon::now()->toDateString(), 'source' => $provider],
|
||||
['exchange_rate' => $rate]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene tasas de Banxico (solo las divisas disponibles en su API).
|
||||
*/
|
||||
protected function fetchBanxicoRates(): array
|
||||
{
|
||||
$apiKey = Setting::getValue('banxico.api_key');
|
||||
$url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43718,SF46410,SF46407,SF46406,SF60632/datos/oportuno/?token={$apiKey}";
|
||||
|
||||
$response = Http::get($url);
|
||||
|
||||
if ($response->successful()) {
|
||||
$data = $response->json();
|
||||
return [
|
||||
'USD' => (float) ($data['bmx']['series'][0]['datos'][0]['dato'] ?? null),
|
||||
'EUR' => (float) ($data['bmx']['series'][1]['datos'][0]['dato'] ?? null),
|
||||
'GBP' => (float) ($data['bmx']['series'][2]['datos'][0]['dato'] ?? null),
|
||||
'JPY' => (float) ($data['bmx']['series'][3]['datos'][0]['dato'] ?? null),
|
||||
'CAD' => (float) ($data['bmx']['series'][4]['datos'][0]['dato'] ?? null),
|
||||
];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtiene tasas de Fixer.io.
|
||||
*/
|
||||
protected function fetchFixerRates(): array
|
||||
{
|
||||
$apiKey = Setting::getValue('fixer.api_key');
|
||||
$url = "http://data.fixer.io/api/latest?access_key={$apiKey}&symbols=USD,EUR,GBP,JPY,CAD,AUD,CHF,CNY,GTQ,MXN";
|
||||
|
||||
$response = Http::get($url);
|
||||
|
||||
return $response->successful() ? $response->json()['rates'] ?? [] : [];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user