package name.abuchen.portfolio.checks.impl;
import java.text.MessageFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
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.Account;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.money.CurrencyUnit;
/**
* Checks if there is at least one account or security without a currency.
*/
public class MissingCurrencyCheck implements Check
{
public class CurrencyQuickFix implements QuickFix
{
private Client client;
private CurrencyUnit currency;
public CurrencyQuickFix(Client client, CurrencyUnit currency)
{
if (currency == null)
throw new NullPointerException();
this.client = client;
this.currency = currency;
}
@Override
public String getLabel()
{
return currency.getLabel();
}
@Override
public String getDoneLabel()
{
return MessageFormat.format(Messages.FixAssignCurrencyCodeDone, currency.getDisplayName());
}
@Override
public void execute()
{
for (Account account : client.getAccounts())
if (account.getCurrencyCode() == null)
account.setCurrencyCode(currency.getCurrencyCode());
for (Security security : client.getSecurities())
if (security.getCurrencyCode() == null && security.hasTransactions(client))
security.setCurrencyCode(currency.getCurrencyCode());
}
}
private final class MissingCurrencyIssue implements Issue
{
private Client client;
public MissingCurrencyIssue(Client client)
{
this.client = client;
}
@Override
public LocalDate getDate()
{
return null;
}
@Override
public Object getEntity()
{
return client;
}
@Override
public Long getAmount()
{
return null;
}
@Override
public String getLabel()
{
return Messages.IssueMissingCurrencyCode;
}
@Override
public List<QuickFix> getAvailableFixes()
{
List<QuickFix> fixes = new ArrayList<QuickFix>();
// add most likely currencies at the top of the list
fixes.add(new CurrencyQuickFix(client, CurrencyUnit.getInstance("EUR"))); //$NON-NLS-1$
fixes.add(new CurrencyQuickFix(client, CurrencyUnit.getInstance("CHF"))); //$NON-NLS-1$
fixes.add(new CurrencyQuickFix(client, CurrencyUnit.getInstance("USD"))); //$NON-NLS-1$
fixes.add(QuickFix.SEPARATOR);
List<CurrencyUnit> available = CurrencyUnit.getAvailableCurrencyUnits();
Collections.sort(available);
for (CurrencyUnit currency : available)
fixes.add(new CurrencyQuickFix(client, currency));
return fixes;
}
}
@Override
public List<Issue> execute(Client client)
{
boolean hasCurrencyMissing = false;
for (Account account : client.getAccounts())
if (account.getCurrencyCode() == null)
hasCurrencyMissing = true;
if (!hasCurrencyMissing)
{
for (Security security : client.getSecurities())
if (security.getCurrencyCode() == null && security.hasTransactions(client))
hasCurrencyMissing = true;
}
if (hasCurrencyMissing)
{
Issue issue = new MissingCurrencyIssue(client);
return Arrays.asList(issue);
}
else
{
return Collections.emptyList();
}
}
}