/**
   * Convert specified amount target currency into USD .
   *
   * @see {@link CurrencyExchangeDao#getCurrencyExchange(String, Date)}
   * @return amount in target currency or <code>null</code> if original <code>foreignAmount</code>
   *     was <code>null</code> or exchange rate cannot be identified.
   */
  public BigDecimal convert(String currencyCode, Date effectiveFromDate, BigDecimal foreignAmount) {
    if (foreignAmount == null) {
      return null;
    }

    CurrencyExchange exchange =
        currencyExchangeDao.getCurrencyExchange(currencyCode, effectiveFromDate);
    if (exchange == null) {
      return null;
    }

    BigDecimal foreignCurrencyAmount =
        foreignAmount.setScale(exchange.getPrecisionNumber(), RoundingMode.HALF_UP);
    BigDecimal convertedAmount =
        foreignCurrencyAmount.divide(
            exchange.getAlternativeExchangeRate(), USD_PRECISION, RoundingMode.HALF_UP);

    return convertedAmount;
  }
  /**
   * Convert specified amount target currency into another currency .
   *
   * @see {@link CurrencyExchangeDao#getCurrencyExchange(String, Date)}
   * @return amount in target currency or <code>null</code> if original <code>originalAmount</code>
   *     was <code>null</code> or exchange rate cannot be identified.
   */
  public BigDecimal convert(
      String currencyCode,
      String anotherCurrency,
      Date effectiveFromDate,
      BigDecimal originalAmount) {
    if (originalAmount == null) {
      return null;
    }
    if (anotherCurrency != null && anotherCurrency.equals(currencyCode)) {
      return originalAmount;
    }
    CurrencyExchange exchange =
        currencyExchangeDao.getCurrencyExchange(currencyCode, effectiveFromDate);
    CurrencyExchange anotherExchange =
        currencyExchangeDao.getCurrencyExchange(anotherCurrency, effectiveFromDate);
    if (exchange == null || anotherExchange == null) {
      return null;
    }

    BigDecimal originalCurrencyAmount =
        originalAmount.setScale(exchange.getPrecisionNumber(), RoundingMode.HALF_UP);
    BigDecimal exchangeRate =
        exchange
            .getAlternativeExchangeRate()
            .divide(anotherExchange.getAlternativeExchangeRate(), 16, RoundingMode.HALF_UP);
    BigDecimal convertedAmount =
        originalCurrencyAmount.divide(
            exchangeRate, anotherExchange.getPrecisionNumber(), RoundingMode.HALF_UP);
    return convertedAmount;
  }