package name.abuchen.portfolio.datatransfer;
import java.io.File;
import java.time.LocalDate;
import java.util.EnumSet;
import java.util.List;
import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.datatransfer.ImportAction.Context;
import name.abuchen.portfolio.datatransfer.ImportAction.Status;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.AccountTransferEntry;
import name.abuchen.portfolio.model.Annotated;
import name.abuchen.portfolio.model.BuySellEntry;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.PortfolioTransferEntry;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.Transaction;
import name.abuchen.portfolio.money.Money;
public interface Extractor
{
public abstract static class Item
{
public abstract Annotated getSubject();
public abstract Security getSecurity();
public abstract String getTypeInformation();
public abstract LocalDate getDate();
public Money getAmount()
{
return null;
}
public long getShares()
{
return 0;
}
public abstract Status apply(ImportAction action, Context context);
}
static class TransactionItem extends Item
{
private Transaction transaction;
public TransactionItem(AccountTransaction transaction)
{
if (EnumSet.of(AccountTransaction.Type.BUY, //
AccountTransaction.Type.SELL, //
AccountTransaction.Type.TRANSFER_IN, //
AccountTransaction.Type.TRANSFER_OUT) //
.contains(transaction.getType()))
throw new UnsupportedOperationException();
this.transaction = transaction;
}
public TransactionItem(PortfolioTransaction transaction)
{
if (EnumSet.of(PortfolioTransaction.Type.BUY, //
PortfolioTransaction.Type.SELL, //
PortfolioTransaction.Type.TRANSFER_IN, //
PortfolioTransaction.Type.TRANSFER_OUT) //
.contains(transaction.getType()))
throw new UnsupportedOperationException();
this.transaction = transaction;
}
@Override
public Annotated getSubject()
{
return transaction;
}
@Override
public String getTypeInformation()
{
if (transaction instanceof AccountTransaction)
return ((AccountTransaction) transaction).getType().toString();
else if (transaction instanceof PortfolioTransaction)
return ((PortfolioTransaction) transaction).getType().toString();
else
throw new UnsupportedOperationException();
}
@Override
public LocalDate getDate()
{
return transaction.getDate();
}
@Override
public Money getAmount()
{
return transaction.getMonetaryAmount();
}
@Override
public long getShares()
{
return transaction.getShares();
}
@Override
public Security getSecurity()
{
return transaction.getSecurity();
}
@Override
public Status apply(ImportAction action, Context context)
{
if (transaction instanceof AccountTransaction)
return action.process((AccountTransaction) transaction, context.getAccount());
else if (transaction instanceof PortfolioTransaction)
return action.process((PortfolioTransaction) transaction, context.getPortfolio());
else
throw new UnsupportedOperationException();
}
}
static class BuySellEntryItem extends Item
{
private final BuySellEntry entry;
public BuySellEntryItem(BuySellEntry entry)
{
this.entry = entry;
}
@Override
public Annotated getSubject()
{
return entry;
}
@Override
public String getTypeInformation()
{
return entry.getAccountTransaction().getType().toString();
}
@Override
public LocalDate getDate()
{
return entry.getAccountTransaction().getDate();
}
@Override
public Money getAmount()
{
return entry.getAccountTransaction().getMonetaryAmount();
}
@Override
public long getShares()
{
return entry.getPortfolioTransaction().getShares();
}
@Override
public Security getSecurity()
{
return entry.getAccountTransaction().getSecurity();
}
@Override
public Status apply(ImportAction action, Context context)
{
return action.process(entry, context.getAccount(), context.getPortfolio());
}
}
static class AccountTransferItem extends Item
{
private final AccountTransferEntry entry;
private final boolean isOutbound;
public AccountTransferItem(AccountTransferEntry entry, boolean isOutbound)
{
this.entry = entry;
this.isOutbound = isOutbound;
}
@Override
public Annotated getSubject()
{
return entry;
}
@Override
public String getTypeInformation()
{
return isOutbound ? PortfolioTransaction.Type.TRANSFER_OUT.toString()
: PortfolioTransaction.Type.TRANSFER_IN.toString();
}
@Override
public LocalDate getDate()
{
return entry.getSourceTransaction().getDate();
}
@Override
public Money getAmount()
{
return entry.getSourceTransaction().getMonetaryAmount();
}
@Override
public Security getSecurity()
{
return null;
}
@Override
public Status apply(ImportAction action, Context context)
{
if (isOutbound)
return action.process(entry, context.getAccount(), context.getSecondaryAccount());
else
return action.process(entry, context.getSecondaryAccount(), context.getAccount());
}
}
static class PortfolioTransferItem extends Item
{
private final PortfolioTransferEntry entry;
public PortfolioTransferItem(PortfolioTransferEntry entry)
{
this.entry = entry;
}
@Override
public Annotated getSubject()
{
return entry;
}
@Override
public String getTypeInformation()
{
return Messages.LabelTransferPortfolio;
}
@Override
public LocalDate getDate()
{
return entry.getSourceTransaction().getDate();
}
@Override
public Money getAmount()
{
return entry.getSourceTransaction().getMonetaryAmount();
}
@Override
public long getShares()
{
return entry.getSourceTransaction().getShares();
}
@Override
public Security getSecurity()
{
return entry.getSourceTransaction().getSecurity();
}
@Override
public Status apply(ImportAction action, Context context)
{
return action.process(entry, context.getPortfolio(), context.getSecondaryPortfolio());
}
}
static class SecurityItem extends Item
{
private Security security;
public SecurityItem(Security security)
{
this.security = security;
}
@Override
public Annotated getSubject()
{
return security;
}
@Override
public String getTypeInformation()
{
return Messages.LabelSecurity;
}
@Override
public LocalDate getDate()
{
return null;
}
@Override
public Security getSecurity()
{
return security;
}
@Override
public Status apply(ImportAction action, Context context)
{
return action.process(security);
}
}
/**
* Returns a readable label for the type of documents
*/
String getLabel();
/**
* Returns the filter extension for the file dialog, e.g. "*.pdf"
*/
String getFilterExtension();
/**
* Returns a list of extracted items.
*/
List<Item> extract(List<File> files, List<Exception> errors);
}