package name.abuchen.portfolio.datatransfer.actions;
import java.util.List;
import java.util.Objects;
import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.datatransfer.ImportAction;
import name.abuchen.portfolio.model.Account;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.AccountTransferEntry;
import name.abuchen.portfolio.model.BuySellEntry;
import name.abuchen.portfolio.model.Portfolio;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.PortfolioTransferEntry;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.Transaction;
public class DetectDuplicatesAction implements ImportAction
{
@Override
public Status process(Security security)
{
return Status.OK_STATUS;
}
@Override
public Status process(AccountTransaction transaction, Account account)
{
return check(transaction, account.getTransactions());
}
@Override
public Status process(PortfolioTransaction transaction, Portfolio portfolio)
{
return check(transaction, portfolio.getTransactions());
}
@Override
public Status process(BuySellEntry entry, Account account, Portfolio portfolio)
{
Status status = check(entry.getAccountTransaction(), account.getTransactions());
if (status.getCode() != Status.Code.OK)
return status;
return check(entry.getPortfolioTransaction(), portfolio.getTransactions());
}
@Override
public Status process(AccountTransferEntry entry, Account source, Account target)
{
return check(entry.getSourceTransaction(), source.getTransactions());
}
@Override
public Status process(PortfolioTransferEntry entry, Portfolio source, Portfolio target)
{
return check(entry.getTargetTransaction(), source.getTransactions());
}
private Status check(AccountTransaction subject, List<AccountTransaction> transactions)
{
for (AccountTransaction t : transactions)
{
if (subject.getType() != t.getType())
continue;
if (isPotentialDuplicate(subject, t))
return new Status(Status.Code.WARNING, Messages.LabelPotentialDuplicate);
}
return Status.OK_STATUS;
}
private Status check(PortfolioTransaction subject, List<PortfolioTransaction> transactions)
{
for (PortfolioTransaction t : transactions)
{
if (subject.getType() != t.getType())
continue;
if (isPotentialDuplicate(subject, t))
return new Status(Status.Code.WARNING, Messages.LabelPotentialDuplicate);
}
return Status.OK_STATUS;
}
private boolean isPotentialDuplicate(Transaction subject, Transaction other)
{
if (!other.getDate().equals(subject.getDate()))
return false;
if (!other.getCurrencyCode().equals(subject.getCurrencyCode()))
return false;
if (other.getAmount() != subject.getAmount())
return false;
if (other.getShares() != subject.getShares())
return false;
if (!Objects.equals(other.getSecurity(), subject.getSecurity()))
return false;
return true;
}
}