package name.abuchen.portfolio.checks.impl;
import java.text.MessageFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.checks.Check;
import name.abuchen.portfolio.checks.Issue;
import name.abuchen.portfolio.checks.QuickFix;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Portfolio;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.Security;
public class PortfolioTransactionWithoutSecurityCheck implements Check
{
public static class MissingSecurityIssue implements Issue
{
private Client client;
private Portfolio portfolio;
private PortfolioTransaction transaction;
public MissingSecurityIssue(Client client, Portfolio portfolio, PortfolioTransaction transaction)
{
this.client = client;
this.portfolio = portfolio;
this.transaction = transaction;
}
@Override
public LocalDate getDate()
{
return transaction.getDate();
}
@Override
public Object getEntity()
{
return portfolio;
}
@Override
public Long getAmount()
{
return transaction.getAmount();
}
@Override
public String getLabel()
{
return Messages.IssuePortfolioTransactionWithoutSecurity;
}
@Override
public List<QuickFix> getAvailableFixes()
{
List<QuickFix> fixes = new ArrayList<QuickFix>();
fixes.add(new DeleteTransactionFix<PortfolioTransaction>(client, portfolio, transaction));
for (Security security : client.getSecurities())
fixes.add(new SetSecurityFix(security, transaction));
return fixes;
}
}
public static class SetSecurityFix implements QuickFix
{
private Security security;
private PortfolioTransaction transaction;
public SetSecurityFix(Security security, PortfolioTransaction transaction)
{
this.security = security;
this.transaction = transaction;
}
@Override
public String getLabel()
{
return MessageFormat.format(Messages.FixSetSecurity, security.getName());
}
@Override
public String getDoneLabel()
{
return MessageFormat.format(Messages.FixSetSecurityDone, security.getName());
}
@Override
public void execute()
{
transaction.setSecurity(security);
if (transaction.getCrossEntry() != null)
transaction.getCrossEntry().updateFrom(transaction);
}
}
@Override
public List<Issue> execute(Client client)
{
List<Issue> issues = new ArrayList<Issue>();
for (Portfolio portfolio : client.getPortfolios())
{
portfolio.getTransactions().stream() //
.filter(t -> t.getSecurity() == null) //
.forEach(t -> issues.add(new MissingSecurityIssue(client, portfolio, t)));
}
return issues;
}
}