package name.abuchen.portfolio.snapshot.security;
import name.abuchen.portfolio.model.Account;
import name.abuchen.portfolio.model.Transaction;
import name.abuchen.portfolio.money.Money;
import name.abuchen.portfolio.money.MoneyCollectors;
import name.abuchen.portfolio.money.Values;
public class DividendTransaction extends Transaction
{
private Account account;
private long totalShares;
private Money fifoCost;
public Account getAccount()
{
return account;
}
/* package */
void setAccount(Account account)
{
this.account = account;
}
public long getDividendPerShare()
{
return amountFractionPerShare(getGrossValueAmount(), getShares());
}
public Money getFifoCost()
{
return fifoCost;
}
/* package */
void setFifoCost(Money fifoCost)
{
this.fifoCost = fifoCost;
}
/* package */
void setTotalShares(long totalShares)
{
this.totalShares = totalShares;
}
public double getPersonalDividendYield()
{
if (fifoCost.getAmount() <= 0)
return 0;
double cost = fifoCost.getAmount();
if (getShares() > 0)
cost = fifoCost.getAmount() * (getShares() / (double) totalShares);
return getGrossValueAmount() / cost;
}
static long amountFractionPerShare(long amount, long shares)
{
if (shares == 0)
return 0;
return Math.round((amount * (Values.AmountFraction.factor() / Values.Amount.factor()) * Values.Share.divider())
/ (double) shares);
}
public long getGrossValueAmount()
{
long taxes = getUnits().filter(u -> u.getType() == Unit.Type.TAX)
.collect(MoneyCollectors.sum(getCurrencyCode(), u -> u.getAmount())).getAmount();
return getAmount() + taxes;
}
public Money getGrossValue()
{
return Money.of(getCurrencyCode(), getGrossValueAmount());
}
}