package name.abuchen.portfolio.snapshot; import java.time.LocalDate; import java.util.Comparator; import name.abuchen.portfolio.model.InvestmentVehicle; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.money.CurrencyConverter; import name.abuchen.portfolio.money.Money; public class AssetPosition { public static final class ByDescription implements Comparator<AssetPosition> { @Override public int compare(AssetPosition p1, AssetPosition p2) { return p1.getDescription().compareToIgnoreCase(p2.getDescription()); } } private final SecurityPosition position; private final CurrencyConverter converter; private final LocalDate date; private final Money totalAssets; private final Money valuation; /* package */ AssetPosition(SecurityPosition position, CurrencyConverter converter, LocalDate date, Money totalAssets) { this.position = position; this.converter = converter; this.date = date; this.totalAssets = totalAssets; this.valuation = position.calculateValue(); } public Money getValuation() { return converter.convert(date, valuation); } public double getShare() { return (double) getValuation().getAmount() / (double) this.totalAssets.getAmount(); } public Money getFIFOPurchaseValue() { return position.getFIFOPurchaseValue(converter.getTermCurrency()); } public Money getProfitLoss() { // calculate profit/loss on the converted values to avoid rounding // differences that can happen when converting the profit/loss value // from the base currency if (position.getInvestmentVehicle() instanceof Security) return getValuation().subtract(getFIFOPurchaseValue()); else return Money.of(converter.getTermCurrency(), 0); } public String getDescription() { return position.getInvestmentVehicle().getName(); } public Security getSecurity() { return position.getSecurity(); } public SecurityPosition getPosition() { return position; } public InvestmentVehicle getInvestmentVehicle() { return position.getInvestmentVehicle(); } @SuppressWarnings("nls") @Override public String toString() { return "AssetPosition [" + position.getInvestmentVehicle() + ", date=" + date + ", valuation=" + valuation + "]"; } }