. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Json; use Carbon\Carbon; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Services\Currency\ExchangeRateInterface; use Illuminate\Http\Request; use Log; /** * Class ExchangeController. */ class ExchangeController extends Controller { /** * @param Request $request * @param TransactionCurrency $fromCurrency * @param TransactionCurrency $toCurrency * @param Carbon $date * * @return \Illuminate\Http\JsonResponse */ public function getRate(Request $request, TransactionCurrency $fromCurrency, TransactionCurrency $toCurrency, Carbon $date) { /** @var CurrencyRepositoryInterface $repository */ $repository = app(CurrencyRepositoryInterface::class); $rate = $repository->getExchangeRate($fromCurrency, $toCurrency, $date); if (null === $rate->id) { Log::debug(sprintf('No cached exchange rate in database for %s to %s on %s', $fromCurrency->code, $toCurrency->code, $date->format('Y-m-d'))); // create service: /** @var ExchangeRateInterface $service */ $service = app(ExchangeRateInterface::class); $service->setUser(auth()->user()); // get rate: $rate = $service->getRate($fromCurrency, $toCurrency, $date); } $return = $rate->toArray(); $return['amount'] = null; if (null !== $request->get('amount')) { // assume amount is in "from" currency: $return['amount'] = bcmul($request->get('amount'), (string)$rate->rate, 12); // round to toCurrency decimal places: $return['amount'] = round($return['amount'], $toCurrency->decimal_places); } return response()->json($return); } }