mainCurrency = $mainCurrency; $this->currencyExchangeRateRepository = new CurrencyExchangeRateRepository(); } public function calculate(float $sumInCurrency, Currency $currency, DateTime $time): float { if ($currency->getId() === $this->mainCurrency->getId()) { return $sumInCurrency; } $currentExchangeRate = $this->getCurrentExchangeRate($currency, $time); if ($currentExchangeRate === null) { return 0.0; } return $sumInCurrency * $currentExchangeRate->getExchangeRate(); } private function getCurrentExchangeRate(Currency $currency, DateTime $time): ?CurrencyExchangeRate { if (!isset($this->exchangeRates[$currency->getId()])) { $this->exchangeRates[$currency->getId()] = iterator_to_array($this->currencyExchangeRateRepository->getAllByCurrency($currency)); } $currentExchangeRate = null; foreach ($this->exchangeRates[$currency->getId()] as $exchangeRate) { if ($exchangeRate->getValidFromDate() > $time) { break; } $currentExchangeRate = $exchangeRate; } return $currentExchangeRate; } }