public function __construct(ICurrency $currency, ICurrencyRateProvider $provider, \DateTime $date = null)
 {
     $this->currency = $currency;
     $this->date = $date;
     $this->provider = $provider;
     $this->message = sprintf('Rate not found for currency %s and provider %s', $currency->getCode(), $provider->getName());
 }
 /**
  * {@inheritdoc}
  */
 public function getRate(ICurrency $currency, ICurrencyRateProvider $provider, \DateTime $rateDate = null)
 {
     $qb = $this->em->createQueryBuilder();
     $qb->select('r')->from($this->currencyRateClassName, 'r')->leftJoin('r.currency', 'c')->where($qb->expr()->eq('c.code', ':currency'))->andWhere($qb->expr()->eq('r.providerName', ':provider'))->setParameters(['currency' => $currency->getCode(), 'provider' => $provider->getName()])->orderBy('r.date', 'DESC');
     if (isset($rateDate)) {
         $qb->andWhere($qb->expr()->eq('r.date', ':date'))->setParameter('date', $rateDate->format('Y-m-d 00:00:00'));
     }
     $result = $qb->getQuery()->getResult();
     $result = reset($result);
     return $result;
 }