package name.abuchen.portfolio.snapshot; import java.time.LocalDate; import java.time.temporal.ChronoField; import java.util.ArrayList; import java.util.Collections; import java.util.List; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.ConsumerPriceIndex; import name.abuchen.portfolio.money.CurrencyConverter; import name.abuchen.portfolio.util.Interval; /* package */class CPIIndex extends PerformanceIndex { /* package */CPIIndex(Client client, CurrencyConverter converter, ReportingPeriod reportInterval) { super(client, converter, reportInterval); } /* package */void calculate(PerformanceIndex clientIndex) { Interval actualInterval = clientIndex.getActualInterval(); LocalDate firstDataPoint = clientIndex.getFirstDataPoint().orElse(actualInterval.getStart()); Interval interval = Interval.of(firstDataPoint, actualInterval.getEnd()); List<ConsumerPriceIndex> cpiSeries = new ArrayList<ConsumerPriceIndex>(clientIndex.getClient() .getConsumerPriceIndices()); Collections.sort(cpiSeries, new ConsumerPriceIndex.ByDate()); List<LocalDate> dates = new ArrayList<LocalDate>(); List<Double> accumulated = new ArrayList<Double>(); int baseline = -1; for (ConsumerPriceIndex cpi : cpiSeries) { LocalDate date = LocalDate.of(cpi.getYear(), cpi.getMonth(), 1); date = date.with(ChronoField.DAY_OF_MONTH, date.lengthOfMonth()); if (interval.contains(date)) { if (baseline == -1) baseline = cpi.getIndex(); dates.add(date); accumulated.add(((double) cpi.getIndex() / (double) baseline) - 1); } } this.dates = dates.toArray(new LocalDate[0]); this.accumulated = new double[accumulated.size()]; for (int ii = 0; ii < this.accumulated.length; ii++) this.accumulated[ii] = accumulated.get(ii); } }