package name.abuchen.portfolio; import java.math.BigDecimal; import java.time.LocalDate; import name.abuchen.portfolio.money.CurrencyConverter; import name.abuchen.portfolio.money.CurrencyUnit; import name.abuchen.portfolio.money.ExchangeRate; import name.abuchen.portfolio.money.ExchangeRateTimeSeries; import name.abuchen.portfolio.money.MonetaryException; import name.abuchen.portfolio.money.Money; import name.abuchen.portfolio.money.impl.ExchangeRateTimeSeriesImpl; import name.abuchen.portfolio.money.impl.InverseExchangeRateTimeSeries; @SuppressWarnings("nls") public class TestCurrencyConverter implements CurrencyConverter { private static ExchangeRateTimeSeriesImpl EUR_USD = null; static { EUR_USD = new ExchangeRateTimeSeriesImpl(null, CurrencyUnit.EUR, "USD"); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2014-12-31"), BigDecimal.valueOf(1.2141).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-02"), BigDecimal.valueOf(1.2043).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-05"), BigDecimal.valueOf(1.1915).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-06"), BigDecimal.valueOf(1.1914).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-07"), BigDecimal.valueOf(1.1831).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-08"), BigDecimal.valueOf(1.1768).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-09"), BigDecimal.valueOf(1.1813).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-12"), BigDecimal.valueOf(1.1804).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-14"), BigDecimal.valueOf(1.1775).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-15"), BigDecimal.valueOf(1.1708).setScale(10))); EUR_USD.addRate(new ExchangeRate(LocalDate.parse("2015-01-16"), BigDecimal.valueOf(1.1588).setScale(10))); } private final String termCurrency; private final ExchangeRateTimeSeries series; public TestCurrencyConverter() { this(CurrencyUnit.EUR, new InverseExchangeRateTimeSeries(EUR_USD)); } public TestCurrencyConverter(String currencyCode, ExchangeRateTimeSeries series) { this.termCurrency = currencyCode; this.series = series; } @Override public String getTermCurrency() { return termCurrency; } @Override public Money convert(LocalDate date, Money amount) { if (termCurrency.equals(amount.getCurrencyCode())) return amount; if (amount.isZero()) return Money.of(termCurrency, 0); // testing: any other currency will be converted 1:1 if (!amount.getCurrencyCode().equals(series.getBaseCurrency())) return Money.of(termCurrency, amount.getAmount()); ExchangeRate rate = getRate(date, amount.getCurrencyCode()); BigDecimal converted = rate.getValue().multiply(BigDecimal.valueOf(amount.getAmount())); return Money.of(termCurrency, Math.round(converted.doubleValue())); } @Override public ExchangeRate getRate(LocalDate date, String currencyCode) { if (termCurrency.equals(currencyCode)) return new ExchangeRate(date, BigDecimal.ONE); if (!currencyCode.equals(series.getBaseCurrency())) throw new MonetaryException(); return series.lookupRate(date).get(); } @Override public CurrencyConverter with(String currencyCode) { if (currencyCode.equals(termCurrency)) return this; if (currencyCode.equals(CurrencyUnit.EUR)) return new TestCurrencyConverter(); if (currencyCode.equals("USD")) return new TestCurrencyConverter("USD", EUR_USD); return null; } }