package name.abuchen.portfolio.snapshot.security;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.money.CurrencyConverter;
import name.abuchen.portfolio.money.Money;
import name.abuchen.portfolio.money.MutableMoney;
/* package */class DeltaCalculation extends Calculation
{
private MutableMoney delta;
private MutableMoney cost;
@Override
public void setTermCurrency(String termCurrency)
{
super.setTermCurrency(termCurrency);
this.delta = MutableMoney.of(termCurrency);
this.cost = MutableMoney.of(termCurrency);
}
@Override
public void visit(CurrencyConverter converter, DividendInitialTransaction t)
{
Money amount = t.getMonetaryAmount().with(converter.at(t.getDate()));
delta.subtract(amount);
cost.add(amount);
}
@Override
public void visit(CurrencyConverter converter, DividendFinalTransaction t)
{
delta.add(t.getMonetaryAmount().with(converter.at(t.getDate())));
}
@Override
public void visit(CurrencyConverter converter, DividendTransaction t)
{
delta.add(t.getMonetaryAmount().with(converter.at(t.getDate())));
}
@Override
public void visit(CurrencyConverter converter, AccountTransaction t)
{
delta.add(t.getMonetaryAmount().with(converter.at(t.getDate())));
}
@Override
public void visit(CurrencyConverter converter, PortfolioTransaction t)
{
switch (t.getType())
{
case BUY:
case DELIVERY_INBOUND:
Money amount = t.getMonetaryAmount().with(converter.at(t.getDate()));
delta.subtract(amount);
cost.add(amount);
break;
case SELL:
case DELIVERY_OUTBOUND:
delta.add(t.getMonetaryAmount().with(converter.at(t.getDate())));
break;
case TRANSFER_IN:
case TRANSFER_OUT:
// transferals do not contribute to the delta
break;
default:
throw new UnsupportedOperationException();
}
}
public Money getDelta()
{
return delta.toMoney();
}
public double getDeltaPercent()
{
if (delta.getAmount() == 0L && cost.getAmount() == 0L)
return 0d;
return delta.getAmount() / (double) cost.getAmount();
}
}