diff --git a/Modules/Invoice/Services/CurrencyService.php b/Modules/Invoice/Services/CurrencyService.php index c4589addf2..b3bdfd9381 100644 --- a/Modules/Invoice/Services/CurrencyService.php +++ b/Modules/Invoice/Services/CurrencyService.php @@ -3,7 +3,10 @@ namespace Modules\Invoice\Services; use GuzzleHttp\Client; +use GuzzleHttp\Exception\ConnectException; +use GuzzleHttp\Exception\RequestException; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Log; use Modules\Invoice\Contracts\CurrencyServiceContract; class CurrencyService implements CurrencyServiceContract @@ -17,13 +20,15 @@ public function __construct() public function setClient() { - $headers = $headers = [ + $headers = [ 'apikey' => config('services.currencylayer.access_key'), ]; + $this->client = new Client([ - // 'base_uri' => 'http://apilayer.net/api', //This is old API URL - 'base_uri' => 'https://api.apilayer.com', // This is new API created from https://apilayer.com/marketplace/currency_data-api - 'headers' => $headers, + 'base_uri' => 'https://api.apilayer.com', + 'headers' => $headers, + 'timeout' => 10, + 'connect_timeout' => 5, ]); } @@ -48,35 +53,71 @@ public function getAllCurrentRatesInINR() private function fetchExchangeRateInINR() { if (! config('services.currencylayer.access_key')) { - return round(config('services.currencylayer.default_rate'), 2); - } + Log::warning('CurrencyLayer API key missing. Using default rate.'); - $response = $this->client->get('currency_data/live', [ - 'query' => [ - 'access_key' => config('services.currencylayer.access_key'), - 'currencies' => 'INR', - ], - ]); + return round(config('services.currencylayer.default_rate', 83.00), 2); + } - $data = json_decode($response->getBody()->getContents(), true); + try { + $response = $this->client->get('currency_data/live', [ + 'query' => [ + 'currencies' => 'INR', + 'source' => 'USD', + ], + ]); + + $data = json_decode($response->getBody()->getContents(), true); + + if (empty($data) || empty($data['quotes']['USDINR'])) { + throw new \Exception('Invalid API response structure.'); + } + + return round($data['quotes']['USDINR'], 2); + } catch (ConnectException $e) { + Log::error('Currency API connection failed: ' . $e->getMessage()); + } catch (RequestException $e) { + Log::error('Currency API request error: ' . $e->getMessage()); + } catch (\Throwable $e) { + Log::error('Unexpected error fetching exchange rate: ' . $e->getMessage()); + } - return round($data['quotes']['USDINR'], 2); + return round(config('services.currencylayer.default_rate', 83.00), 2); } private function fetchAllExchangeRateInINR() { if (! config('services.currencylayer.access_key')) { - return round(config('services.currencylayer.default_rate'), 2); - } + Log::warning('CurrencyLayer API key missing. Using default rate.'); - $response = $this->client->get('currency_data/live', [ - 'query' => [ - 'access_key' => config('services.currencylayer.access_key'), - ], - ]); + return [ + 'USDINR' => round(config('services.currencylayer.default_rate', 83.00), 2), + ]; + } - $data = json_decode($response->getBody()->getContents(), true); + try { + $response = $this->client->get('currency_data/live', [ + 'query' => [ + 'source' => 'USD', + ], + ]); + + $data = json_decode($response->getBody()->getContents(), true); + + if (empty($data) || empty($data['quotes'])) { + throw new \Exception('Invalid API response structure.'); + } + + return $data['quotes']; + } catch (ConnectException $e) { + Log::error('Currency API connection failed: ' . $e->getMessage()); + } catch (RequestException $e) { + Log::error('Currency API request error: ' . $e->getMessage()); + } catch (\Throwable $e) { + Log::error('Unexpected error fetching all exchange rates: ' . $e->getMessage()); + } - return $data['quotes']; + return [ + 'USDINR' => round(config('services.currencylayer.default_rate', 83.00), 2), + ]; } }