/** * @param CurrencyPair $currencyPair * @return Rate * @throws Exception */ public function fetchRate(CurrencyPair $currencyPair) { $providers = [$this->mainProvider => CurrencyRateProvider::getByName($this->mainProvider), $this->secondProvider => CurrencyRateProvider::getByName($this->secondProvider)]; if (count($providers) !== 2) { throw new Exception('One of providers not found'); } $rates = []; /** @var CurrencyRateProvider $provider */ foreach ($providers as $name => $provider) { if (null === $provider) { throw new Exception("Provider \"{$name}\" not found!"); } try { $providerHandler = $provider->getImplementationInstance($this->httpAdapter); if ($providerHandler !== null) { $swap = new Swap($providerHandler); $rate = $swap->quote($currencyPair->getBaseCurrency() . '/' . $currencyPair->getQuoteCurrency())->getValue(); $rates[] = floatval($rate); } else { throw new Exception('Provider "' . $provider->name . '" not found'); } } catch (\Exception $e) { throw new Exception('One or more currency providers did not return result'); } } $min = min($rates); $max = max($rates); return new Rate($max - $min >= $max * $this->criticalDifference / 100 ? $max : $rates[0], new \DateTime()); }
/** * Relation to CurrencyRateProvider model * * @return CurrencyRateProvider */ public function getRateProvider() { return CurrencyRateProvider::getByName($this->currency_rate_provider_name); }