package name.abuchen.portfolio.datatransfer.pdf.comdirect;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.collection.IsEmptyCollection.empty;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Scanner;
import org.junit.Test;
import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem;
import name.abuchen.portfolio.datatransfer.Extractor.Item;
import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem;
import name.abuchen.portfolio.datatransfer.Extractor.TransactionItem;
import name.abuchen.portfolio.datatransfer.pdf.ComdirectPDFExtractor;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.BuySellEntry;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.Transaction.Unit;
import name.abuchen.portfolio.money.CurrencyUnit;
import name.abuchen.portfolio.money.Money;
import name.abuchen.portfolio.money.Values;
@SuppressWarnings("nls")
public class ComdirectPDFExtractorTest
{
@Test
public void testWertpapierKauf() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("Name der Security"));
assertThat(security.getIsin(), is("DE000BASF111"));
assertThat(security.getWkn(), is("BASF11"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1.0)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2000-01-01")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(0.0))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1)));
}
@Test
public void testWertpapierKauf2() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf2.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("ComSta foobar .ETF"));
assertThat(security.getIsin(), is("LU1234444444"));
assertThat(security.getWkn(), is("ETF999"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1413.46)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2011-01-01")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(13.6))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(42)));
}
@Test
public void testWertpapierKauf3() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf3.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("NXP Semiconductors NV"));
assertThat(security.getIsin(), is("NL0009538784"));
assertThat(security.getWkn(), is("A1C5WJ"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(822.66)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-06-27")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(9.9))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(12)));
}
@Test
public void testWertpapierKauf4() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf4.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("Medtronic PLC"));
assertThat(security.getIsin(), is("IE00BTN1Y115"));
assertThat(security.getWkn(), is("A14M2J"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1431.40)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-11-22")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(11.40))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(20)));
}
@Test
public void testWertpapierKauf5() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf5.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("Boeing Co."));
assertThat(security.getIsin(), is("US0970231058"));
assertThat(security.getWkn(), is("850471"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(19359.18)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-07-18")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(55.66))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(160)));
}
@Test
public void testWertpapierKauf6() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf6.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("BayWa AG"));
assertThat(security.getIsin(), is("DE0005194062"));
assertThat(security.getWkn(), is("519406"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(16312.80)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2013-03-14")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(47.66))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1437)));
}
@Test
public void testWertpapierKauf7() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf7.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("Allianz SE"));
assertThat(security.getIsin(), is("DE0008404005"));
assertThat(security.getWkn(), is("840400"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(7586.80)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2008-10-16")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(23.80 + 1.5 + 0.6))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100)));
}
@Test
public void testWertpapierKauf8() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Kauf8.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("T. Rowe Price Group Inc."));
assertThat(security.getIsin(), is("US74144T1088"));
assertThat(security.getWkn(), is("870967"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1469.55)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-11-08")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(2.9 + 9.9))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25)));
}
@Test
public void testWertpapierVerkauf() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Verkauf.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("FooBar. ETF"));
assertThat(security.getIsin(), is("DE1234567890"));
assertThat(security.getWkn(), is("ABC123"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL));
// expected total is total amount minux taxes
long expectedTotal = Values.Amount.factorize(10111.11 - 11.11);
assertThat(entry.getPortfolioTransaction().getAmount(), is(expectedTotal));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2010-01-01")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(11.51))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of("EUR", Values.Amount.factorize(11.11))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100)));
}
@Test
public void testWertpapierVerkauf2() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Verkauf2.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("Boeing Co."));
assertThat(security.getIsin(), is("US0970231058"));
assertThat(security.getWkn(), is("850471"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(20413.33)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-12-08")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(56.07))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1140)));
}
@Test
public void testWertpapierVerkauf3() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectWertpapierabrechnung_Verkauf3.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(3));
Optional<Item> item;
// security
item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getName(), is("ITC Holdings Corp."));
assertThat(security.getIsin(), is("US4656851056"));
assertThat(security.getWkn(), is("A0F401"));
item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL));
assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(21239.83)));
assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-02-25")));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("EUR", Values.Amount.factorize(66.47))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(570)));
// tax refund
AccountTransaction t = (AccountTransaction) results.stream().filter(i -> i instanceof TransactionItem)
.findFirst().get().getSubject();
assertThat(t.getSecurity(), is(security));
assertThat(t.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(71.73))));
}
@Test
public void testGutschrift() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectGutschrift.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
// security
Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getIsin(), is("DE000A9AXXX6"));
assertThat(security.getName(), is("i S h a r e s I I I x x x x x x x x x x x x x x x E T F"));
assertThat(security.getWkn(), is("A1XXXX"));
item = results.stream().filter(i -> i instanceof TransactionItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class));
AccountTransaction transaction = (AccountTransaction) item.get().getSubject();
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
assertThat(transaction.getSecurity(), is(security));
assertThat(transaction.getDate(), is(LocalDate.parse("2011-01-08")));
assertThat(transaction.getAmount(), is(Values.Amount.factorize(21.99)));
assertThat(transaction.getShares(), is(Values.Share.factorize(14)));
}
@Test
public void testGutschrift2() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from("comdirectGutschrift2.txt");
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
// security
Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getIsin(), is("US0991991039"));
assertThat(security.getName(), is("F oo B a r I n c ."));
assertThat(security.getWkn(), is("123456"));
item = results.stream().filter(i -> i instanceof TransactionItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class));
AccountTransaction transaction = (AccountTransaction) item.get().getSubject();
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
assertThat(transaction.getSecurity(), is(security));
assertThat(transaction.getDate(), is(LocalDate.parse("2011-01-09")));
assertThat(transaction.getAmount(), is(Values.Amount.factorize(13.78)));
assertThat(transaction.getShares(), is(Values.Share.factorize(40)));
}
@Test
public void testDividende1() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from(file.getName());
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("comdirectDividende1.txt")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
// security
Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getIsin(), is("NL0000009355"));
assertThat(security.getName(), is("U n il e ve r N . V ."));
assertThat(security.getWkn(), is("A0JMZB"));
item = results.stream().filter(i -> i instanceof TransactionItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class));
AccountTransaction transaction = (AccountTransaction) item.get().getSubject();
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
assertThat(transaction.getSecurity(), is(security));
assertThat(transaction.getDate(), is(LocalDate.parse("2010-12-15")));
assertThat(transaction.getAmount(), is(Values.Amount.factorize(335.92)));
assertThat(transaction.getShares(), is(Values.Share.factorize(1900)));
assertThat(transaction.getUnitSum(Unit.Type.TAX).getAmount(), is(Values.Amount.factorize(59.28)));
}
@Test
public void testDividende2() throws IOException
{
ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client())
{
@Override
protected String strip(File file) throws IOException
{
return from(file.getName());
}
};
List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(Arrays.asList(new File("comdirectDividende2.txt")), errors);
assertThat(errors, empty());
assertThat(results.size(), is(2));
// security
Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst();
assertThat(item.isPresent(), is(true));
Security security = ((SecurityItem) item.get()).getSecurity();
assertThat(security.getIsin(), is("DE0008232125"));
assertThat(security.getName(), is("De u t s c he L uf t h a n s a A G"));
assertThat(security.getWkn(), is("823212"));
item = results.stream().filter(i -> i instanceof TransactionItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class));
AccountTransaction transaction = (AccountTransaction) item.get().getSubject();
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
assertThat(transaction.getSecurity(), is(security));
assertThat(transaction.getDate(), is(LocalDate.parse("2009-04-27")));
assertThat(transaction.getAmount(), is(Values.Amount.factorize(1546.13)));
assertThat(transaction.getShares(), is(Values.Share.factorize(3000)));
assertThat(transaction.getUnitSum(Unit.Type.TAX).getAmount(), is(Values.Amount.factorize(525 + 28.87)));
}
private String from(String resource)
{
try (Scanner scanner = new Scanner(getClass().getResourceAsStream(resource), StandardCharsets.UTF_8.name()))
{
return scanner.useDelimiter("\\A").next();
}
}
}