package name.abuchen.portfolio.checks.impl;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.checks.QuickFix;
import name.abuchen.portfolio.model.Account;
import name.abuchen.portfolio.model.BuySellEntry;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Portfolio;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.money.Values;
/* package */class MissingBuySellAccountIssue extends AbstractPortfolioIssue
{
private final class ConvertToDeliveryFix implements QuickFix
{
PortfolioTransaction.Type target;
public ConvertToDeliveryFix()
{
if (transaction.getType() == PortfolioTransaction.Type.BUY)
target = PortfolioTransaction.Type.DELIVERY_INBOUND;
else if (transaction.getType() == PortfolioTransaction.Type.SELL)
target = PortfolioTransaction.Type.DELIVERY_OUTBOUND;
else
throw new UnsupportedOperationException();
}
@Override
public String getLabel()
{
return MessageFormat.format(Messages.FixConvertToDelivery, target.toString());
}
@Override
public String getDoneLabel()
{
return MessageFormat.format(Messages.FixConvertToDeliveryDone, target.toString());
}
@Override
public void execute()
{
PortfolioTransaction t = new PortfolioTransaction();
t.setType(target);
t.setCurrencyCode(transaction.getCurrencyCode());
t.setDate(transaction.getDate());
t.setSecurity(transaction.getSecurity());
t.setShares(transaction.getShares());
t.setAmount(transaction.getAmount());
t.addUnits(transaction.getUnits());
portfolio.addTransaction(t);
portfolio.getTransactions().remove(transaction);
}
}
private final class CreateBuySellEntryFix implements QuickFix
{
private Account account;
private CreateBuySellEntryFix(Account account)
{
this.account = account;
}
@Override
public String getLabel()
{
return MessageFormat.format(Messages.FixCreateCrossEntryAccount, account.getName());
}
@Override
public String getDoneLabel()
{
return MessageFormat.format(Messages.FixCreateCrossEntryDone, transaction.getType().toString());
}
@Override
public void execute()
{
BuySellEntry entry = new BuySellEntry(portfolio, account);
entry.setCurrencyCode(transaction.getCurrencyCode());
entry.setDate(transaction.getDate());
entry.setType(transaction.getType());
entry.setSecurity(transaction.getSecurity());
entry.setShares(transaction.getShares());
entry.setAmount(transaction.getAmount());
entry.getPortfolioTransaction().addUnits(transaction.getUnits());
entry.insert();
portfolio.getTransactions().remove(transaction);
}
}
public MissingBuySellAccountIssue(Client client, Portfolio portfolio, PortfolioTransaction transaction)
{
super(client, portfolio, transaction);
}
@Override
public String getLabel()
{
return MessageFormat.format(Messages.IssueMissingBuySellInAccount, //
transaction.getType().toString(), //
Values.Share.format(transaction.getShares()), //
Values.Quote.format(transaction.getGrossPricePerShare()), //
transaction.getSecurity().getName());
}
@Override
public List<QuickFix> getAvailableFixes()
{
List<QuickFix> answer = new ArrayList<>();
answer.add(new ConvertToDeliveryFix());
if (portfolio.getReferenceAccount() != null)
answer.add(new CreateBuySellEntryFix(portfolio.getReferenceAccount()));
for (final Account account : client.getAccounts())
{
if (account.equals(portfolio.getReferenceAccount()))
continue;
answer.add(new CreateBuySellEntryFix(account));
}
answer.add(new DeleteTransactionFix<PortfolioTransaction>(client, portfolio, transaction));
return answer;
}
}