package name.abuchen.portfolio.snapshot; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import name.abuchen.portfolio.model.Classification; import name.abuchen.portfolio.money.CurrencyConverter; import name.abuchen.portfolio.money.Money; import name.abuchen.portfolio.money.MoneyCollectors; import name.abuchen.portfolio.money.MutableMoney; public class AssetCategory { private final Classification classification; private final CurrencyConverter converter; private final LocalDate date; private final List<AssetPosition> positions = new ArrayList<>(); private final Money totalAssets; private final MutableMoney valuation; /* package */AssetCategory(Classification classification, CurrencyConverter converter, LocalDate date, Money totalAssets) { this.classification = classification; this.converter = converter; this.date = date; this.totalAssets = totalAssets; this.valuation = MutableMoney.of(converter.getTermCurrency()); } public Money getValuation() { return this.valuation.toMoney(); } public double getShare() { return (double) this.valuation.getAmount() / (double) this.totalAssets.getAmount(); } public Money getFIFOPurchaseValue() { return positions.stream().map(AssetPosition::getFIFOPurchaseValue) .collect(MoneyCollectors.sum(converter.getTermCurrency())); } public Money getProfitLoss() { return positions.stream().map(AssetPosition::getProfitLoss) .collect(MoneyCollectors.sum(converter.getTermCurrency())); } public Classification getClassification() { return this.classification; } public List<AssetPosition> getPositions() { return positions; } public void addPosition(AssetPosition p) { this.positions.add(p); this.valuation.add(converter.convert(date, p.getValuation())); } }