diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/DekaBankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/DekaBankPDFExtractorTest.java index 0391e0e7dc..85c2106571 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/DekaBankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/DekaBankPDFExtractorTest.java @@ -1,6 +1,7 @@ package name.abuchen.portfolio.datatransfer.pdf.dekabank; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.junit.Assert.assertNull; @@ -9,9 +10,11 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; import org.junit.Test; +import name.abuchen.portfolio.Messages; import name.abuchen.portfolio.datatransfer.Extractor; import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem; import name.abuchen.portfolio.datatransfer.Extractor.Item; @@ -25,6 +28,7 @@ import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.model.Security; +import name.abuchen.portfolio.model.Transaction; import name.abuchen.portfolio.model.Transaction.Unit; import name.abuchen.portfolio.money.CurrencyUnit; import name.abuchen.portfolio.money.Money; @@ -42,7 +46,21 @@ public void testTagesauszug01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug01.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(0)); assertThat(results.size(), is(4)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -73,7 +91,7 @@ public void testTagesauszug01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-18T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(21.303))); assertThat(entry.getSource(), is("Tagesauszug01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8103 1017")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); @@ -94,7 +112,7 @@ public void testTagesauszug01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-18T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.093))); assertThat(entry.getSource(), is("Tagesauszug01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8103 3945")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); @@ -115,7 +133,21 @@ public void testTagesauszug02() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug02.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(3)); + assertThat(buySellTransactions.size(), is(4)); + assertThat(accountTransactions.size(), is(0)); assertThat(results.size(), is(7)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -154,7 +186,7 @@ public void testTagesauszug02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-06-06T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.112))); assertThat(entry.getSource(), is("Tagesauszug02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8102 2598")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(332.31)))); @@ -175,7 +207,7 @@ public void testTagesauszug02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-06-06T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.181))); assertThat(entry.getSource(), is("Tagesauszug02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8102 3321")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(206.74)))); @@ -196,7 +228,7 @@ public void testTagesauszug02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-06-06T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.598))); assertThat(entry.getSource(), is("Tagesauszug02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8102 2597")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(332.31)))); @@ -217,7 +249,7 @@ public void testTagesauszug02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-06-06T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.579))); assertThat(entry.getSource(), is("Tagesauszug02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8102 3320")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(206.74)))); @@ -238,7 +270,21 @@ public void testTagesauszug03() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug03.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(0)); assertThat(results.size(), is(4)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -269,7 +315,7 @@ public void testTagesauszug03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-10-14T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(28.939))); assertThat(entry.getSource(), is("Tagesauszug03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8101 4387")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2355.09)))); @@ -290,7 +336,7 @@ public void testTagesauszug03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-10-14T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(20.647))); assertThat(entry.getSource(), is("Tagesauszug03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8102 3387")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); @@ -311,7 +357,21 @@ public void testTagesauszug04() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug04.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(10)); + assertThat(accountTransactions.size(), is(0)); assertThat(results.size(), is(11)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -334,7 +394,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.597))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9704 9385")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(41.33)))); @@ -355,7 +415,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.425))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 0130")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(29.42)))); @@ -376,7 +436,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.551))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 1035")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.12)))); @@ -397,7 +457,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.316))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 1612")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.89)))); @@ -418,7 +478,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.220))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 3372")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.25)))); @@ -439,7 +499,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.324))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 4016")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.45)))); @@ -460,7 +520,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.362))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 4607")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.02)))); @@ -481,7 +541,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.215))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 5155")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.85)))); @@ -502,7 +562,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.360))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 6066")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(24.92)))); @@ -523,7 +583,7 @@ public void testTagesauszug04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-09T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.295))); assertThat(entry.getSource(), is("Tagesauszug04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 6630")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.40)))); @@ -544,7 +604,21 @@ public void testTagesauszug05() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug05.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(0)); assertThat(results.size(), is(4)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -575,7 +649,7 @@ public void testTagesauszug05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.369))); assertThat(entry.getSource(), is("Tagesauszug05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9701 0301")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); @@ -596,7 +670,7 @@ public void testTagesauszug05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-07T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.083))); assertThat(entry.getSource(), is("Tagesauszug05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 8108 0595")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.74)))); @@ -617,7 +691,21 @@ public void testTagesauszug06() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug06.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(13)); + assertThat(buySellTransactions.size(), is(15)); + assertThat(accountTransactions.size(), is(2)); assertThat(results.size(), is(30)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -736,7 +824,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9711 1533")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.00)))); @@ -757,7 +845,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.002))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9715 5001")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.14)))); @@ -778,7 +866,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.018))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9703 5128")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.98)))); @@ -799,7 +887,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.071))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 6371")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.35)))); @@ -820,7 +908,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.052))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9709 6969")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.98)))); @@ -841,7 +929,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.067))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9712 7274")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.22)))); @@ -866,7 +954,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.047))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9714 2092")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.66)))); @@ -887,7 +975,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.012))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9718 1490")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.70)))); @@ -908,7 +996,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9733 9061")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.56)))); @@ -929,7 +1017,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.013))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9734 0025")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.42)))); @@ -950,7 +1038,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.034))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9721 1901")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.73)))); @@ -971,7 +1059,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.282))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9723 4163")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.35)))); @@ -992,7 +1080,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.024))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9724 3146")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.56)))); @@ -1013,7 +1101,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.036))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9727 4488")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.80)))); @@ -1034,7 +1122,7 @@ public void testTagesauszug06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.287))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9728 1854")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.46)))); @@ -1054,7 +1142,7 @@ public void testTagesauszug06() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-03-31T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.655))); assertThat(transaction.getSource(), is("Tagesauszug06.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftragsnummer: 9301 6001")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.00)))); @@ -1074,7 +1162,7 @@ public void testTagesauszug06() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-03-31T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.619))); assertThat(transaction.getSource(), is("Tagesauszug06.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftragsnummer: 9302 2538")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.14)))); @@ -1101,7 +1189,21 @@ public void testTagesauszug06WithSecurityInUSD() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug06.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(12)); + assertThat(buySellTransactions.size(), is(15)); + assertThat(accountTransactions.size(), is(2)); assertThat(results.size(), is(29)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -1210,7 +1312,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9711 1533")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.00)))); @@ -1231,7 +1333,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.002))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9715 5001")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.14)))); @@ -1252,7 +1354,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.018))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9703 5128")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.98)))); @@ -1273,7 +1375,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.071))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9705 6371")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.35)))); @@ -1294,7 +1396,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.052))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9709 6969")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.98)))); @@ -1315,7 +1417,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.067))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9712 7274")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.22)))); @@ -1336,7 +1438,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.047))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9714 2092")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.66)))); @@ -1357,7 +1459,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.012))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9718 1490")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.70)))); @@ -1378,7 +1480,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9733 9061")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.56)))); @@ -1399,7 +1501,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.013))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9734 0025")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.42)))); @@ -1420,7 +1522,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.034))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9721 1901")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.73)))); @@ -1441,7 +1543,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.282))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9723 4163")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.35)))); @@ -1462,7 +1564,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.024))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9724 3146")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.56)))); @@ -1483,7 +1585,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.036))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9727 4488")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.80)))); @@ -1504,7 +1606,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-01T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.287))); assertThat(entry.getSource(), is("Tagesauszug06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftragsnummer: 9728 1854")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.46)))); @@ -1524,7 +1626,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-03-31T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.655))); assertThat(transaction.getSource(), is("Tagesauszug06.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftragsnummer: 9301 6001")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.00)))); @@ -1544,7 +1646,7 @@ public void testTagesauszug06WithSecurityInUSD() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-03-31T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.619))); assertThat(transaction.getSource(), is("Tagesauszug06.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftragsnummer: 9302 2538")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.14)))); @@ -1565,7 +1667,21 @@ public void testTagesauszug07() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug07.txt"), errors); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); assertThat(results.size(), is(5)); new AssertImportActions().check(results, CurrencyUnit.EUR); @@ -1587,7 +1703,7 @@ public void testTagesauszug07() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-02-24T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(33.823))); assertThat(transaction.getSource(), is("Tagesauszug07.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftragsnummer: 9457 2850")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(63.47)))); @@ -1607,7 +1723,7 @@ public void testTagesauszug07() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-02-24T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(8.848))); assertThat(transaction.getSource(), is("Tagesauszug07.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftragsnummer: 9457 2851")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.61)))); @@ -1628,7 +1744,7 @@ public void testTagesauszug07() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-02-24T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.457))); assertThat(entry.getSource(), is("Tagesauszug07.txt")); - assertThat(entry.getNote(), is("Wiederanlage")); + assertThat(entry.getNote(), is("Auftragsnummer: 9457 2850 | Wiederanlage")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(63.47)))); @@ -1649,7 +1765,7 @@ public void testTagesauszug07() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-02-24T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.120))); assertThat(entry.getSource(), is("Tagesauszug07.txt")); - assertThat(entry.getNote(), is("Wiederanlage")); + assertThat(entry.getNote(), is("Auftragsnummer: 9457 2851 | Wiederanlage")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.61)))); @@ -1662,2121 +1778,18874 @@ public void testTagesauszug07() } @Test - public void testQuartalsbericht01() + public void testTagesauszug08() { DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); List errors = new ArrayList<>(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht01.txt"), errors); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug08.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); assertThat(errors, empty()); - assertThat(results.size(), is(80)); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(1)); + assertThat(accountTransactions.size(), is(0)); + assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("DE000DK0ECT0")); - assertNull(security1.getWkn()); - assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("Deka-UmweltInvest TF")); - assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(security.getIsin(), is("LU0268059614")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security2.getIsin(), is("DE000DK0ECV6")); - assertNull(security2.getWkn()); - assertNull(security2.getTickerSymbol()); - assertThat(security2.getName(), is("Deka-GlobalChampions TF")); - assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + // check buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); - Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security3.getIsin(), is("DE000DK0EC91")); - assertNull(security3.getWkn()); - assertNull(security3.getTickerSymbol()); - assertThat(security3.getName(), is("Deka-Sachwerte TF")); - assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security4.getIsin(), is("LU0348413815")); - assertNull(security4.getWkn()); - assertNull(security4.getTickerSymbol()); - assertThat(security4.getName(), is("DekaLux-PharmaTech TF")); - assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-10-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.402))); + assertThat(entry.getSource(), is("Tagesauszug08.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8101 2521")); - Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security5.getIsin(), is("LU0348461897")); - assertNull(security5.getWkn()); - assertNull(security5.getTickerSymbol()); - assertThat(security5.getName(), is("DekaLux-BioTech TF")); - assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } - Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security6.getIsin(), is("LU0349172725")); - assertNull(security6.getWkn()); - assertNull(security6.getTickerSymbol()); - assertThat(security6.getName(), is("DekaLux-GlobalResources TF")); - assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + @Test + public void testTagesauszug09() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); - Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security7.getIsin(), is("LU1508360002")); - assertNull(security7.getWkn()); - assertNull(security7.getTickerSymbol()); - assertThat(security7.getName(), is("Deka-Industrie 4.0 TF")); - assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + List errors = new ArrayList<>(); - Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security8.getIsin(), is("LU1496713741")); - assertNull(security8.getWkn()); - assertNull(security8.getTickerSymbol()); - assertThat(security8.getName(), is("Deka-Europa Nebenwerte CF (A)")); - assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug09.txt"), errors); - Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security9.getIsin(), is("LU0133666759")); - assertNull(security9.getWkn()); - assertNull(security9.getTickerSymbol()); - assertThat(security9.getName(), is("Deka-ConvergenceAktien TF")); - assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); - Security security10 = results.stream().filter(SecurityItem.class::isInstance).skip(9).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security10.getIsin(), is("LU0064405334")); - assertNull(security10.getWkn()); - assertNull(security10.getTickerSymbol()); - assertThat(security10.getName(), is("DekaLux-USA TF")); - assertThat(security10.getCurrencyCode(), is(CurrencyUnit.EUR)); + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); - Security security11 = results.stream().filter(SecurityItem.class::isInstance).skip(10).findFirst() + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(1)); + assertThat(accountTransactions.size(), is(0)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security11.getIsin(), is("LU0075131606")); - assertNull(security11.getWkn()); - assertNull(security11.getTickerSymbol()); - assertThat(security11.getName(), is("Deka-Europa Nebenwerte TF (A)")); - assertThat(security11.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(security.getIsin(), is("LU0268059614")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - // check 1st security buy sell transaction + // check buy sell transaction BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.258))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-03-06T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.373))); + assertThat(entry.getSource(), is("Tagesauszug09.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8101 3955")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1400.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1400.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + @Test + public void testTagesauszug10() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug10.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(1)); + assertThat(accountTransactions.size(), is(0)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("LU0268059614")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.253))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-06-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.977))); + assertThat(entry.getSource(), is("Tagesauszug10.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8101 3074")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + @Test + public void testTagesauszug11() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug11.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(0)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("DE0008474511")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("AriDeka CF")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.269))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-12-14T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.339))); + assertThat(entry.getSource(), is("Tagesauszug11.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 7103 3775")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(72.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(69.31)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.69)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.335))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-12-14T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.465))); + assertThat(entry.getSource(), is("Tagesauszug11.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 7104 1292")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.31)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.69)))); + } - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + @Test + public void testTagesauszug12() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug12.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(3)); + assertThat(results.size(), is(7)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE0008474511")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("AriDeka CF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0009786285")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-EuropaPotential TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(29.811))); + assertThat(transaction.getSource(), is("Tagesauszug12.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9387 9103")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.72)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.72)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(35.950))); + assertThat(transaction.getSource(), is("Tagesauszug12.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9401 7546")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.60)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.60)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check tax refund transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.TAX_REFUND)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(transaction.getSource(), is("Tagesauszug12.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9387 9103")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.43)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.43)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.872))); + assertThat(entry.getSource(), is("Tagesauszug12.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9387 9103 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(29.15)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(29.15)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.095))); + assertThat(entry.getSource(), is("Tagesauszug12.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9401 7546 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.60)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.60)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug13() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug13.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0009771980")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-EuropaBond TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(1.565))); + assertThat(transaction.getSource(), is("Tagesauszug13.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9311 0573")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(49.088))); + assertThat(transaction.getSource(), is("Tagesauszug13.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9329 3756")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(51.54)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(51.54)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.047))); + assertThat(entry.getSource(), is("Tagesauszug13.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9311 0573 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.418))); + assertThat(entry.getSource(), is("Tagesauszug13.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9329 3756 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(51.54)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(51.54)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug14() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug14.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(1)); + assertThat(accountTransactions.size(), is(1)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("LU0348413815")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.795))); + assertThat(transaction.getSource(), is("Tagesauszug14.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9310 0970")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(105.19)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(105.19)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.385))); + assertThat(entry.getSource(), is("Tagesauszug14.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9310 0970 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(105.19)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(105.19)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug15() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug15.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(1)); + assertThat(accountTransactions.size(), is(1)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("LU0052859252")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("DekaLux-Pazifik")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.190))); + assertThat(transaction.getSource(), is("Tagesauszug15.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9307 0124")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.134))); + assertThat(entry.getSource(), is("Tagesauszug15.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9307 0124 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug16() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug16.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(1)); + assertThat(accountTransactions.size(), is(1)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("DE0008474511")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("AriDeka CF")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2014-02-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(34.746))); + assertThat(transaction.getSource(), is("Tagesauszug16.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9398 1226")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.10)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.10)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2014-02-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.451))); + assertThat(entry.getSource(), is("Tagesauszug16.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9398 1226 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.10)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.10)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug17() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug17.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(1)); + assertThat(accountTransactions.size(), is(1)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("LU0052859252")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("DekaLux-Pazifik")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-11-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.032))); + assertThat(transaction.getSource(), is("Tagesauszug17.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9306 3038")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-11-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.058))); + assertThat(entry.getSource(), is("Tagesauszug17.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9306 3038 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug18() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug18.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-LiquiditätsPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0009771980")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-EuropaBond TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(1.023))); + assertThat(transaction.getSource(), is("Tagesauszug18.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9309 1751")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(52.202))); + assertThat(transaction.getSource(), is("Tagesauszug18.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9322 8046")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.013))); + assertThat(entry.getSource(), is("Tagesauszug18.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9309 1751 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.580))); + assertThat(entry.getSource(), is("Tagesauszug18.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9322 8046 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug19() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug19.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(3)); + assertThat(buySellTransactions.size(), is(4)); + assertThat(accountTransactions.size(), is(4)); + assertThat(results.size(), is(11)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0133666759")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0052859252")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0062624902")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.279))); + assertThat(transaction.getSource(), is("Tagesauszug19.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9410 2301")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.97)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.97)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.888))); + assertThat(transaction.getSource(), is("Tagesauszug19.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9410 2302")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.77)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.77)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.558))); + assertThat(transaction.getSource(), is("Tagesauszug19.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9412 4474")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.76)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.76)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(33.486))); + assertThat(transaction.getSource(), is("Tagesauszug19.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9413 5783")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.25)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.25)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.122))); + assertThat(entry.getSource(), is("Tagesauszug19.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9410 2301 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.97)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.97)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.047))); + assertThat(entry.getSource(), is("Tagesauszug19.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9410 2302 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.77)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.77)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.073))); + assertThat(entry.getSource(), is("Tagesauszug19.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9412 4474 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.76)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.76)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-11-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.457))); + assertThat(entry.getSource(), is("Tagesauszug19.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9413 5783 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.25)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.25)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug20() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug20.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE0008474511")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("AriDeka CF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0009786285")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-EuropaPotential TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-02-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(35.197))); + assertThat(transaction.getSource(), is("Tagesauszug20.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9401 1742")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(77.43)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(77.43)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-02-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(36.045))); + assertThat(transaction.getSource(), is("Tagesauszug20.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9426 3111")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.89)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.89)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-02-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.135))); + assertThat(entry.getSource(), is("Tagesauszug20.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9401 1742 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(77.43)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(77.43)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-02-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.118))); + assertThat(entry.getSource(), is("Tagesauszug20.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9426 3111 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.89)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.89)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug21() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug21.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0009771980")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-EuropaBond TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(1.013))); + assertThat(transaction.getSource(), is("Tagesauszug21.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9309 2789")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(50.506))); + assertThat(transaction.getSource(), is("Tagesauszug21.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9324 0160")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); + assertThat(entry.getSource(), is("Tagesauszug21.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9309 2789 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.696))); + assertThat(entry.getSource(), is("Tagesauszug21.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9324 0160 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug22() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug22.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0052859252")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-Pazifik")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0062624902")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.934))); + assertThat(transaction.getSource(), is("Tagesauszug22.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9308 3980")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.324))); + assertThat(transaction.getSource(), is("Tagesauszug22.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9310 4730")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.098))); + assertThat(entry.getSource(), is("Tagesauszug22.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9308 3980 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.047))); + assertThat(entry.getSource(), is("Tagesauszug22.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9310 4730 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug23() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug23.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0052859252")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-Pazifik")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0062624902")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2013-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.324))); + assertThat(transaction.getSource(), is("Tagesauszug23.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9405 8250")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.73)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.73)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2013-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.445))); + assertThat(transaction.getSource(), is("Tagesauszug23.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9406 3275")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.89)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.89)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2013-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.125))); + assertThat(entry.getSource(), is("Tagesauszug23.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9405 8250 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.73)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.73)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2013-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.517))); + assertThat(entry.getSource(), is("Tagesauszug23.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9406 3275 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.89)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.89)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug24() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug24.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(3)); + assertThat(buySellTransactions.size(), is(4)); + assertThat(accountTransactions.size(), is(4)); + assertThat(results.size(), is(11)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0133666759")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0052859252")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0062624902")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.216))); + assertThat(transaction.getSource(), is("Tagesauszug24.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9406 3036")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.864))); + assertThat(transaction.getSource(), is("Tagesauszug24.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9406 3037")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.17)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.17)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.449))); + assertThat(transaction.getSource(), is("Tagesauszug24.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9407 8611")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(53.14)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(53.14)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.962))); + assertThat(transaction.getSource(), is("Tagesauszug24.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9408 5425")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.74)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.74)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.063))); + assertThat(entry.getSource(), is("Tagesauszug24.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9406 3036 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.024))); + assertThat(entry.getSource(), is("Tagesauszug24.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9406 3037 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.17)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.17)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.109))); + assertThat(entry.getSource(), is("Tagesauszug24.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9407 8611 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(53.14)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(53.14)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2014-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.524))); + assertThat(entry.getSource(), is("Tagesauszug24.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9408 5425 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.74)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(52.74)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug25() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug25.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0052859252")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-Pazifik")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0062624902")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.090))); + assertThat(transaction.getSource(), is("Tagesauszug25.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9404 4323")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.371))); + assertThat(transaction.getSource(), is("Tagesauszug25.txt")); + assertThat(transaction.getNote(), is("Auftragsnummer: 9405 0501")); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st reinvest transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.100))); + assertThat(entry.getSource(), is("Tagesauszug25.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9404 4323 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd reinvest transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.074))); + assertThat(entry.getSource(), is("Tagesauszug25.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 9405 0501 | Wiederanlage")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug26() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug26.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(6)); + assertThat(buySellTransactions.size(), is(7)); + assertThat(accountTransactions.size(), is(7)); + assertThat(results.size(), is(20)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0348413815")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0008474511")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("AriDeka CF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0133666759")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0052859252")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0062624902")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("DE0009786285")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("Deka-EuropaPotential TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.882))); + assertThat(entry.getSource(), is("Tagesauszug26.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8101 8358")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(232.27)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(232.27)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.388))); + assertThat(entry.getSource(), is("Tagesauszug26.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8102 9563")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(18.49)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(18.49)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.952))); + assertThat(entry.getSource(), is("Tagesauszug26.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8103 0561")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.18)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.18)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.148))); + assertThat(entry.getSource(), is("Tagesauszug26.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8103 0563")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.13)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.13)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.854))); + assertThat(entry.getSource(), is("Tagesauszug26.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8103 0609")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(494.76)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(494.76)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.726))); + assertThat(entry.getSource(), is("Tagesauszug26.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8103 1685")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.09)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.09)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.901))); + assertThat(entry.getSource(), is("Tagesauszug26.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8103 3824")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(79.92)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(79.92)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st delivery outbound (Auslieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(16))); + assertThat(deliveryTransaction.getSource(), is("Tagesauszug26.txt")); + assertThat(deliveryTransaction.getNote(), is("Auftragsnummer: 8101 8357")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(40))); + assertThat(deliveryTransaction.getSource(), is("Tagesauszug26.txt")); + assertThat(deliveryTransaction.getNote(), is("Auftragsnummer: 8102 9562")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(15))); + assertThat(deliveryTransaction.getSource(), is("Tagesauszug26.txt")); + assertThat(deliveryTransaction.getNote(), is("Auftragsnummer: 8103 0560")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(6))); + assertThat(deliveryTransaction.getSource(), is("Tagesauszug26.txt")); + assertThat(deliveryTransaction.getNote(), is("Auftragsnummer: 8103 0562")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(6))); + assertThat(deliveryTransaction.getSource(), is("Tagesauszug26.txt")); + assertThat(deliveryTransaction.getNote(), is("Auftragsnummer: 8103 0608")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(34))); + assertThat(deliveryTransaction.getSource(), is("Tagesauszug26.txt")); + assertThat(deliveryTransaction.getNote(), is("Auftragsnummer: 8103 1684")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(37))); + assertThat(deliveryTransaction.getSource(), is("Tagesauszug26.txt")); + assertThat(deliveryTransaction.getNote(), is("Auftragsnummer: 8103 3823")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(16))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Tagesauszug26.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Auftragsnummer: 8101 8357")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(40))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Tagesauszug26.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Auftragsnummer: 8102 9562")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(15))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Tagesauszug26.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Auftragsnummer: 8103 0560")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(6))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Tagesauszug26.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Auftragsnummer: 8103 0562")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(6))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Tagesauszug26.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Auftragsnummer: 8103 0608")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(5).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(34))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Tagesauszug26.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Auftragsnummer: 8103 1684")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(6).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(37))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Tagesauszug26.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Auftragsnummer: 8103 3823")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testTagesauszug27() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug27.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(2)); + assertThat(accountTransactions.size(), is(0)); + assertThat(results.size(), is(4)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0133666759")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0268059614")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.864))); + assertThat(entry.getSource(), is("Tagesauszug27.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8101 2364")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2st buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.001))); + assertThat(entry.getSource(), is("Tagesauszug27.txt")); + assertThat(entry.getNote(), is("Auftragsnummer: 8101 2363")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testQuartalsbericht01() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht01.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(11)); + assertThat(buySellTransactions.size(), is(67)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(80)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE000DK0ECT0")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-UmweltInvest TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE000DK0ECV6")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-GlobalChampions TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE000DK0EC91")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-Sachwerte TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0348413815")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0348461897")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-BioTech TF")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0349172725")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-GlobalResources TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("LU1508360002")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-Industrie 4.0 TF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("LU1496713741")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-Europa Nebenwerte CF (A)")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("LU0133666759")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security10 = results.stream().filter(SecurityItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security10.getIsin(), is("LU0064405334")); + assertNull(security10.getWkn()); + assertNull(security10.getTickerSymbol()); + assertThat(security10.getName(), is("DekaLux-USA TF")); + assertThat(security10.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security11 = results.stream().filter(SecurityItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security11.getIsin(), is("LU0075131606")); + assertNull(security11.getWkn()); + assertNull(security11.getTickerSymbol()); + assertThat(security11.getName(), is("Deka-Europa Nebenwerte TF (A)")); + assertThat(security11.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st security buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.258))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.253))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.269))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.335))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(21.303))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.286))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.275))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.087))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(6.736))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1549.55)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1549.55)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.075))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.068))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.082))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.068))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.037))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-25T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.330))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1310.43)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1310.43)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.451))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.439))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.433))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(19.842))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2039.96)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2039.96)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(19).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.431))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(20).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.426))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(21).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.426))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(22).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.735))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(23).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.739))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(24).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.730))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(25).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.230))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1796.19)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1796.19)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(26).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.724))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(27).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.725))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(28).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.704))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(29).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.153))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(764.21)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(764.21)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(30).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.485))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(31).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.492))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(32).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.483))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(33).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.505))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(34).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.093))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(35).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.502))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(36).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.466))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(37).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(12.416))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6556.02)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6556.02)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(38).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.395))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(39).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.340))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(40).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.337))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(41).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.157))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(42).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(16.535))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1309.24)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1309.24)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(43).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.145))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(44).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.094))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(45).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.290))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(46).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.273))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(47).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.301))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(48).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.382))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(49).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.328))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(50).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.298))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(51).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(10.488))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2044.85)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2044.85)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(52).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.267))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(53).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.319))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(54).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.510))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(55).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.534))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(56).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.533))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(57).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-14T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(13.620))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2314.45)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2314.45)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(58).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.465))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(59).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.404))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(60).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-08T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.869))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(521.87)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(521.87)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(61).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.361))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(62).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-07T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.464))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(63).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.452))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(64).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.217))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(65).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(13.391))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1540.37)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1540.37)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(66).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.140))); + assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2021-05-28T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.315))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht01.txt")); + assertThat(deliveryTransaction.getNote(), is("Fusion")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2021-05-28T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(2.140))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht01.txt")); + assertThat(deliveryTransaction.getNote(), is("Fusion")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + TransactionItem cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2021-05-28T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(1.315))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht01.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Fusion")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2021-05-28T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(2.140))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht01.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Fusion")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testQuartalsbericht02() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht02.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(3)); + assertThat(buySellTransactions.size(), is(10)); + assertThat(accountTransactions.size(), is(2)); + assertThat(results.size(), is(15)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE000DK2CDS0")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-DividendenStrategie CF (A)")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU1508359509")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-Industrie 4.0 CF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0008474503")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("DekaFonds CF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st security buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.255))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.268))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-20T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht02.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.271))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.545))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.616))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.598))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.418))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.443))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd security buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.430))); + assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-05-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(16.190 - 0.271 + 0.000 + 0.000))); + assertThat(transaction.getSource(), is("Quartalsbericht02.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-05-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(16.190 - 0.271 - 0.000))); + assertThat(transaction.getSource(), is("Quartalsbericht02.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.43)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.43)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2022-05-20T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.396 + 0.255 + 0.268))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht02.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testQuartalsbericht03() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht03.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(3)); + assertThat(accountTransactions.size(), is(0)); + assertThat(results.size(), is(4)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("DE000DK2CFT3")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("Deka-BasisAnlage offensiv")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-07-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); + assertThat(entry.getSource(), is("Quartalsbericht03.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-08-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.155))); + assertThat(entry.getSource(), is("Quartalsbericht03.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-09-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.162))); + assertThat(entry.getSource(), is("Quartalsbericht03.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testQuartalsbericht04() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht04.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(2)); + assertThat(buySellTransactions.size(), is(4)); + assertThat(accountTransactions.size(), is(1)); + assertThat(results.size(), is(7)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE000DK0ECU8")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GlobalChampions CF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0005424519")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-BR 100")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.140))); + assertThat(entry.getSource(), is("Quartalsbericht04.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-23T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.151))); + assertThat(entry.getSource(), is("Quartalsbericht04.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.156))); + assertThat(entry.getSource(), is("Quartalsbericht04.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-08T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.775))); + assertThat(entry.getSource(), is("Quartalsbericht04.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(80.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(80.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2022-05-17T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.147))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht04.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2021")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.99)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.99)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testQuartalsbericht05() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht05.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(10)); + assertThat(buySellTransactions.size(), is(25)); + assertThat(accountTransactions.size(), is(11)); + assertThat(results.size(), is(46)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE000DK0ECU8")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GlobalChampions CF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0348413815")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0005152631")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-Technologie TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0133666759")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0052859252")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0062624902")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("LU0062625115")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("DekaLux-Europa TF (A)")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009771980")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-EuropaBond TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE0009786285")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-EuropaPotential TF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security10 = results.stream().filter(SecurityItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security10.getIsin(), is("DE0005424519")); + assertNull(security10.getWkn()); + assertNull(security10.getTickerSymbol()); + assertThat(security10.getName(), is("Deka-BR 100")); + assertThat(security10.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-01-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.228))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-02-05T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.216))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-02-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.008))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.46)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.46)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-03-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.212))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-04-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.202))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-05-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.203))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-06-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.204))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-07-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.196))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-08-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.202))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-09-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.196))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-10-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.196))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.186))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-12-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.184))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-08-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.194))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.52)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.52)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.170))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.08)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.08)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.121))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.88)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.88)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.020))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.44)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.44)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 18th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.034))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.44)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.44)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 19th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.045))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.83)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.83)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 20th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(19).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-08-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.140))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.14)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.14)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 21th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(20).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.098))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.52)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.52)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 22th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(21).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-06-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.00))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(80.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(80.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 23th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(22).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-06-25T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.015))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.17)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.17)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 24th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(23).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-10-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(13.373))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1120.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1120.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 25th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(24).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-12-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.019))); + assertThat(entry.getSource(), is("Quartalsbericht05.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.61)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.61)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2019-05-16T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(2.197))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht05.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2018")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(175.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(175.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(1.981 + 0.228 + 0.216))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.46)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.46)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-08-16T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(13.461))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.52)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.52)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(50.822))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.08)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.08)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.598))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.88)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.88)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.391))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.44)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.44)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(11.394))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.44)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.44)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.892))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.83)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.83)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-08-16T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.756))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.14)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.14)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(29.546))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.52)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.52)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(10).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(11L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.50)))); + assertThat(transaction.getSource(), is("Quartalsbericht05.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2019")); + } + + @Test + public void testQuartalsbericht06() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht06.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(9)); + assertThat(buySellTransactions.size(), is(10)); + assertThat(accountTransactions.size(), is(11)); + assertThat(results.size(), is(30)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0348413815")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0005152631")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-Technologie TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0133666759")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0052859252")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLux-Pazifik")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0062624902")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0062625115")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Europa TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0009771980")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-EuropaBond TF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009786285")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-EuropaPotential TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE0005424519")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-BR 100")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.125))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.72)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.72)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.373))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.29)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.29)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-06-08T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.006))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(80.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(80.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.110))); + assertThat(entry.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.39)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.39)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2012-05-21T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(2.621))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht06.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2011")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(101.91)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(101.91)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(12.778))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(50.169))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.454))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.791))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.72)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(54.72)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(10.694))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.332))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(13.772))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.29)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.29)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(28.237))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(33.898 - 0.110))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertNull(entry.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.39)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.39)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht06.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht06.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht06.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht06.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht06.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(5).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht06.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(10).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(11L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht06.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2012")); + } + + @Test + public void testQuartalsbericht07() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht07.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(1)); + assertThat(buySellTransactions.size(), is(12)); + assertThat(accountTransactions.size(), is(1)); + assertThat(results.size(), is(14)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("DE000DK2CFT3")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("Deka-BasisAnlage offensiv")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-01-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.149))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-02-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.155))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.165))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.158))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.165))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.174))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-07-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-08-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.155))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-09-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.162))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-10-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.172))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-11-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.163))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-12-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.165))); + assertThat(entry.getSource(), is("Quartalsbericht07.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(1L)); + + Item item = iter.next(); + + // assert transaction + AccountTransaction transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.50)))); + assertThat(transaction.getSource(), is("Quartalsbericht07.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2022")); + } + + @Test + public void testQuartalsbericht08() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht08.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(3)); + assertThat(buySellTransactions.size(), is(5)); + assertThat(accountTransactions.size(), is(3)); + assertThat(results.size(), is(11)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE000DK0ECU8")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GlobalChampions CF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0009786285")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-EuropaPotential TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0005424519")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-BR 100")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-01-23T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.153))); + assertThat(entry.getSource(), is("Quartalsbericht08.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-02-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.176))); + assertThat(entry.getSource(), is("Quartalsbericht08.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(45.04)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(45.04)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-02-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.151))); + assertThat(entry.getSource(), is("Quartalsbericht08.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-03-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.154))); + assertThat(entry.getSource(), is("Quartalsbericht08.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(40.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-02-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.498))); + assertThat(entry.getSource(), is("Quartalsbericht08.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(69.10)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(69.10)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2023-01-06T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.016))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht08.txt")); + assertThat(deliveryTransaction.getNote(), is("Steuererstattung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.57)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.57)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-02-10T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(10.297 + 0.153))); + assertThat(transaction.getSource(), is("Quartalsbericht08.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(45.04)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(45.04)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-02-24T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(29.658))); + assertThat(transaction.getSource(), is("Quartalsbericht08.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(69.10)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(69.10)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testQuartalsbericht09() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht09.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(10)); + assertThat(buySellTransactions.size(), is(38)); + assertThat(accountTransactions.size(), is(16)); + assertThat(results.size(), is(64)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE0008474511")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("AriDeka")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0052859252")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-Pazifik")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0062624902")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("DekaLux-Deutschland TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("DE0009771824")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("Euro TF")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("DE0009771980")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("Deka-EuropaBond TF")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("DE0009786285")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("Deka-EuropaPotential TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("IE0002262826")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("DekaTeam-GlobalSelect TF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("IE0004907972")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("DekaTeam-EmergingMarkets CF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("IE0005258151")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-PharmaTech TF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security10 = results.stream().filter(SecurityItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security10.getIsin(), is("LU0097654924")); + assertNull(security10.getWkn()); + assertNull(security10.getTickerSymbol()); + assertThat(security10.getName(), is("Deka-EuroStocks TF")); + assertThat(security10.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-01-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.630))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-02-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.032))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.69)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.69)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-02-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.615))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-03-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.622))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-04-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.636))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-05-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.608))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-06-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.588))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-07-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.564))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-08-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.573))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-09-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.546))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-10-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.574))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.539))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.161))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.11)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.11)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.166))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(440.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(440.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-06-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(16.858))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-08-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1594.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1594.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.054))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.64)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.64)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 18th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-12-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.143))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertThat(entry.getNote(), is("Depotpreis 2005")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 19th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-01-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.004))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.28)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.28)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 20th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(19).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 21th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(20).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-01-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(10))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.20)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.20)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 22th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(21).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-02-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(283.36)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(283.36)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 23th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(22).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-03-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(327.12)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(327.12)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 24th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(23).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-04-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(324.88)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(324.88)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 25th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(24).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.494))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.63)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.63)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 26th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(25).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-01-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.002))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.08)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.08)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 27th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(26).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-10-04T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.854))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 28th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(27).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.782))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(560.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(560.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 29th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(28).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 30th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(29).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.100))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.70)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.70)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 31th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(30).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(23.223))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(911.50)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(911.50)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 32th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(31).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.451))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.94)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.94)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 33th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(32).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.025))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 34th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(33).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-09-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.00))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 35th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(34).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.025))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 36th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(35).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-09-14T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 37th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(36).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(12.949))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(570.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(570.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 38th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(37).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-11-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(18.812))); + assertThat(entry.getSource(), is("Quartalsbericht09.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(641.11)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(641.11)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-09-09T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2005-09-14T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-02-18T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(9.135 - 0.539 - 0.574 - 0.546 - 0.573 - 0.564 + - 0.588 - 0.608 - 0.636 - 0.622 - 0.615 - 0.032))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.69)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.69)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-11-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.475 - 1.166 - 0.161))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.11)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.11)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-11-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(20.130 + 0.143 - 0.054))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.64)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.64)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-01-03T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.909))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.28)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.28)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); +// assertThat(transaction.getShares(), is(Values.Share.factorize(0.913))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(43.494 - 2.494))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.63)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.63)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-01-03T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(45.986 - 0.000 - 8.782 - 5.854 - 0.002))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.08)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.08)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(45.986))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.000 + 23.223 - 0.100))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.70)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.70)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(26.268 - 0.451))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.94)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.94)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(10) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(26.194))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th dividends transaction (Storno) + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(11) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(26.194))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(12) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-09-09T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(26.194))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(13) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(26.194))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(14) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-09-14T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(26.194 + 0.025))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(0.913))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2005-12-30T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(31.348 + 0.002 + 5.854 + 8.782))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation (Storno) transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorOrderCancellationUnsupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2005-08-22T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(26.194))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.05)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2005-09-09T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(26.194))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2005-09-14T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(26.194 + 0.025))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht09.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(15).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(16L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2005-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht09.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2005")); + } + + @Test + public void testQuartalsbericht10() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht10.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(9)); + assertThat(buySellTransactions.size(), is(30)); + assertThat(accountTransactions.size(), is(11)); + assertThat(results.size(), is(50)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE0005424519")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-BR 100")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0008474511")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("AriDeka")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0052859252")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("DekaLux-Pazifik")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0062624902")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("DE0009771824")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("Euro TF")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("DE0009771980")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("Deka-EuropaBond TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0009786285")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-EuropaPotential TF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("IE0004907972")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("DekaTeam-EmergingMarkets CF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("IE0005258151")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-PharmaTech TF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.198))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.102))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertThat(entry.getNote(), is("Vertragsgebühr 2006")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.514))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(128.25)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(128.25)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-01-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.523))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-01-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.505))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-02-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.129))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-02-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.499))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-03-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.496))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-04-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.493))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-06-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.521))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-07-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.516))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-08-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.508))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-08-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.496))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-09-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.489))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-10-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.471))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-11-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.475))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.460))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 18th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.157))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(65.65)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(65.65)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 19th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-11-07T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(12.152))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 20th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(19).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.004))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.32)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.32)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 21th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(20).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.117))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertThat(entry.getNote(), is("Depotpreis 2006")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 22th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(21).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-01-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.005))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.31)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.31)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 23th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(22).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-10-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(15.323))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 24th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(23).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 25th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(24).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-08-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.771))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.98)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.98)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 26th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(25).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-01-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.699))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 27th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(26).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 28th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(27).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-08-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.461))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(26.79)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(26.79)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 29th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(28).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-01-04T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(9.089))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 30th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(29).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-08-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.070))); + assertThat(entry.getSource(), is("Quartalsbericht10.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.90)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.90)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht10.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht10.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-02-17T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.716 - 0.460 - 0.475 - 0.471 - 0.489 - 0.496 - 0.508 + - 0.516 - 0.521 - 0.493 - 0.496 - 0.499 - 0.129))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.22)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.475))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(65.65)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(65.65)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(20.130 + 12.152))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.32)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.32)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-01-02T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.913))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.31)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.31)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.913 + 0.005 + 15.323))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-08-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(43.494))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.98)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.98)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(45.986 + 8.699))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-08-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(26.268))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(26.79)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(26.79)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-08-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(39.168 + 9.089))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.90)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.90)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(0.913 + 0.005 + 15.323))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht10.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2006-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(45.986 + 8.699))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht10.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(9).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(11L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2006")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2006-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht10.txt")); + assertThat(transaction.getNote(), is("Vertragsgebühr 2006")); + } + + @Test + public void testQuartalsbericht11() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht11.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(10)); + assertThat(buySellTransactions.size(), is(34)); + assertThat(accountTransactions.size(), is(10)); + assertThat(results.size(), is(54)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0348413815")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0005424519")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-BR 100")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("DE0008474511")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("AriDeka")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0133666759")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0052859252")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Pazifik")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("LU0062624902")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009771824")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Euro TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE0009771980")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-EuropaBond TF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security10 = results.stream().filter(SecurityItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security10.getIsin(), is("IE0005258151")); + assertNull(security10.getWkn()); + assertNull(security10.getTickerSymbol()); + assertThat(security10.getName(), is("Deka-PharmaTech TF")); + assertThat(security10.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-09-03T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.598))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-12-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertThat(entry.getNote(), is("Depotpreis 2008")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(15.795))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1502.30)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1502.30)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2007-12-27T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.952))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(188.25)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(188.25)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-07-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.007))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.27)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.27)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-08-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.926))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(114.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(114.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.494))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-12-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.357))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertThat(entry.getNote(), is("Vertragsgebühr 2008")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-01-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.519))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-02-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.258))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.09)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.09)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-02-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.519))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-03-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.551))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-04-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.519))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-05-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.508))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.578))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-07-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.577))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-08-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.571))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 18th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-09-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.651))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 19th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-10-31T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.775))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 20th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(19).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-11-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.817))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 21th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(20).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-12-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.848))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 22th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(21).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-03-07T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.761))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(997.36)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(997.36)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 23th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(22).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-04-04T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.531))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 24th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(23).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-06-13T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.473))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(450.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(450.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 25th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(24).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-07-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.451))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(600.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 26th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(25).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 27th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(26).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.161))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.51)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.51)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 28th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(27).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-05-05T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.270))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(200.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(200.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 29th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(28).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.078))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.55)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.55)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 30th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(29).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-01-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.168))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.13)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.13)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 31th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(30).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-03-07T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(15.025))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(997.36)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(997.36)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 32th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(31).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.998))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(72.52)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(72.52)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 33th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(32).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 34th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(33).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(48.399))); + assertThat(entry.getSource(), is("Quartalsbericht11.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1502.30)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1502.30)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht11.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2008-06-30T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht11.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-07-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.529 + 3.952))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.27)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.27)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-02-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(21.253 + 0.519))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.09)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.09)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.216))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.934 - 0.161))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.51)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.51)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.324 - 0.078))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.55)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.55)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-01-02T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.00 + 15.025 - 0.168))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.13)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.13)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(49.088 - 1.998))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(72.52)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(72.52)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-06-30T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.000 + 48.399 - 0.000))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2008-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.216))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht11.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2008-06-30T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(0.000 + 48.399 - 0.000))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht11.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(8).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(10L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2008")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2008-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht11.txt")); + assertThat(transaction.getNote(), is("Vertragsgebühr 2008")); + } + + @Test + public void testQuartalsbericht12() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht12.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(9)); + assertThat(buySellTransactions.size(), is(17)); + assertThat(accountTransactions.size(), is(14)); + assertThat(results.size(), is(40)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0348413815")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0005424519")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-BR 100")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("DE0008474511")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("AriDeka CF")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0133666759")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0052859252")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Pazifik")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("LU0062624902")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009771980")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-EuropaBond TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE0009786285")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-EuropaPotential TF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-06-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.977))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.047))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-10-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.402))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(400.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-03-06T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.373))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1400.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1400.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-03-27T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.373))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1401.16)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1401.16)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-07-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-07-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.065))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.83)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.83)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.326))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-01-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.867))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.872))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(29.15)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(29.15)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-02-27T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.998))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(34.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.098))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.047))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.418))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(51.54)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(51.54)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.095))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.60)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.60)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-12-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht12.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-07-02T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht12.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht12.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-12-30T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht12.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2009-11-17T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(10.744))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht12.txt")); + assertThat(deliveryTransaction.getNote(), is("Kauf Zulagenzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(354.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(354.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(2.014 - 0.402 - 0.047))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(46.31)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-07-02T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.795))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-07-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(38.686 - 10.744 - 8.326 - 0.065))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.83)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.83)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-02-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(31.681 - 0.998 - 0.872))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(29.15)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(29.15)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.216))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.032 - 0.098))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.27)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.371 - 0.047))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.23)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2009-07-02T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.795))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht12.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2009-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.216))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht12.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2009-12-30T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(36.045))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht12.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(11).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(14L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2009")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.06)))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertThat(transaction.getNote(), is("Abschluss-/ Vertriebskosten 2009")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2009-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht12.txt")); + assertThat(transaction.getNote(), is("Vertragspreis 2009")); + } + + @Test + public void testQuartalsbericht13() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht13.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(9)); + assertThat(buySellTransactions.size(), is(15)); + assertThat(accountTransactions.size(), is(17)); + assertThat(results.size(), is(41)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-GeldmarktPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0348413815")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0008474511")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("AriDeka CF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0133666759")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0052859252")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Pazifik")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0062624902")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0009771980")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-EuropaBond TF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009786285")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-EuropaPotential TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE0005424519")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-BR 100")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.001))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-07-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-02-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.331))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.06)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.06)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-12-14T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.339))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(72.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(72.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-12-14T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.465))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.864))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-11-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.058))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.696))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-12-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-07-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.059))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.02)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.02)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.448))); + assertThat(entry.getSource(), is("Quartalsbericht13.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-07-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-12-30T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2010-05-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.246))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht13.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2009")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(47.18)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(47.18)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(1.023 - 0.010))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.93)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.795))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-02-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(33.816 - 0.465 - 1.339 - 0.331))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.06)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.06)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.216))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.864))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-11-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.090 - 0.058))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.51)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.371))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-08-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(52.202 - 1.696))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(66.16)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-12-30T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(36.045))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(10) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(47.439 - 7.448 - 0.059))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.02)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.02)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-07-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.795))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.216))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(5.864))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(32.371))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-12-30T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(36.045))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(5).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.FEES)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(0))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertThat(((Transaction) cancellation1.getSubject()).getNote(), is("Vertragspreis (zu Lasten Vertrag) 2010")); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(6).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.FEES)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(0))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertThat(((Transaction) cancellation1.getSubject()).getNote(), is("Weitere Preise (zu Lasten Girokonto) 2010")); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(7).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.FEES)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(0))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht13.txt")); + assertThat(((Transaction) cancellation1.getSubject()).getNote(), is("Weitere Preise (zu Lasten Vertrag) 2010")); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(11).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(17L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2010")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.77)))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertThat(transaction.getNote(), is("Abschluss-/ Vertriebskosten 2010")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertThat(transaction.getNote(), is("Vertragspreis (zu Lasten Girokonto) 2010")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertThat(transaction.getNote(), is("Vertragspreis (zu Lasten Vertrag) 2010")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertThat(transaction.getNote(), is("Weitere Preise (zu Lasten Girokonto) 2010")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht13.txt")); + assertThat(transaction.getNote(), is("Weitere Preise (zu Lasten Vertrag) 2010")); + } + + @Test + public void testQuartalsbericht14() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht14.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(9)); + assertThat(buySellTransactions.size(), is(11)); + assertThat(accountTransactions.size(), is(12)); + assertThat(results.size(), is(32)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-LiquiditätsPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0348413815")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0008474511")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("AriDeka CF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0133666759")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0052859252")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Pazifik")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0062624902")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0009771980")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-EuropaBond TF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009786285")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-EuropaPotential TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE0005424519")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-BR 100")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.013))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-07-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-02-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.166))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.88)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.88)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.100))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.074))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.580))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-12-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-07-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.051))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.92)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.92)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.077))); + assertThat(entry.getSource(), is("Quartalsbericht14.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(270.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-07-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-12-30T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2011-05-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(2.739))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht14.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2010")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(108.89)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(108.89)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(1.036 - 0.013))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.48)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-07-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.795))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-02-18T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(33.982 - 0.166))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.88)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.88)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.216))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.864))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.190 - 0.100))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.73)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-11-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.445 - 0.074))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.86)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-08-19T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(53.782 - 1.580))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.03)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-12-30T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(36.045))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(10) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-07-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(58.306 - 8.077 - 0.051))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.92)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.92)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2011-07-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.795))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.216))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2011-10-04T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(5.864))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2011-12-30T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(36.045))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht14.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(11).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(12L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht14.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2011")); + } + + @Test + public void testQuartalsbericht15() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht15.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(9)); + assertThat(buySellTransactions.size(), is(12)); + assertThat(accountTransactions.size(), is(10)); + assertThat(results.size(), is(31)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0268059614")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-LiquiditätsPlan TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0348413815")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE0008474511")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("AriDeka CF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0133666759")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0052859252")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Pazifik")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0062624902")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0009771980")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-EuropaBond TF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009786285")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-EuropaPotential TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE0005424519")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-BR 100")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-01-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.036))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1023.85)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1023.85)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-02-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.351))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.08)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.08)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-11-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.134))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-07-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(53.782))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2248.63)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2248.63)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-02-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(24.337))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1000.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.275))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.95)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.95)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-12-20T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(17.397))); + assertThat(entry.getSource(), is("Quartalsbericht15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(750.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(750.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2012-05-21T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.617))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht15.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2011")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(62.86)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(62.86)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.795))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-02-17T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(34.333 - 0.351))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.08)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.08)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.216))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(5.864))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-11-20T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.324 - 0.134))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.50)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(32.445))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(36.045))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(101.932 - 17.397 - 0.275))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.95)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.95)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2012-07-02T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.795))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.216))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(5.864))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2012-10-01T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(32.445))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2012-12-28T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(36.045))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht15.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(9).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(10L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2012-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht15.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2012")); + } + + @Test + public void testQuartalsbericht16() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht16.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(7)); + assertThat(buySellTransactions.size(), is(17)); + assertThat(accountTransactions.size(), is(18)); + assertThat(results.size(), is(42)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0348413815")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0008474511")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("AriDeka CF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0133666759")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0052859252")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0062624902")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("DE0009786285")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("Deka-EuropaPotential TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0005424519")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-BR 100")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-08-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.091))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.16)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.16)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-08-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.239))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.38)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.38)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.101))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.27)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.27)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.039))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.50)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.50)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.052))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.91)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.91)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.236))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.16)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.16)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.009))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.13)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.13)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-08-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.220))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(28.53)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(28.53)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-01-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.582))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.80)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.80)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-11-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25.428))); + assertThat(entry.getSource(), is("Quartalsbericht16.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1930.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1930.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st cancellation transaction + BuySellEntryItem cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(5).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th cancellation transaction + cancellation = (BuySellEntryItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(BuySellEntryItem.class::isInstance) // + .skip(6).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(((BuySellEntry) cancellation.getSubject()).getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getShares(), is(Values.Share.factorize(0))); + assertThat(((BuySellEntry) cancellation.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((BuySellEntry) cancellation.getSubject()).getNote()); + + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((BuySellEntry) cancellation.getSubject()).getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2018-05-15T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(2.024))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht16.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2017")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(154.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(154.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(16.642 - 0.091))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-08-17T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(16.642 - 0.091))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.16)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.16)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(39.231 - 0.239))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-08-10T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(39.231 - 0.239))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.38)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.38)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.615 - 0.101))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.615 - 0.101))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.27)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.27)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.018 - 0.039))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.018 - 0.039))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.50)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.50)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.833 - 0.052))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(10) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.833 - 0.052))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.91)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.91)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(11) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(34.621 - 0.236))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(12) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-11-16T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(34.621 - 0.236))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.16)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(27.16)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 13th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(13) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(37.758 - 0.220 - 0.009))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.13)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.13)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(14) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-08-10T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(37.758 - 0.220))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(28.53)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(28.53)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 15th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(15) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(295.513 - 25.428 - 2.024 - 0.582))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(16.642 - 0.091))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(39.231 - 0.239))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(15.615 - 0.101))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(6.0180 - 0.039))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(6.833 - 0.052))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(5).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(34.621 - 0.236))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation1 = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(6).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation1.getSubject()).getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(cancellation1.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation1.getSubject()).getDateTime(), is(LocalDateTime.parse("2017-12-29T00:00"))); + assertThat(((Transaction) cancellation1.getSubject()).getShares(), is(Values.Share.factorize(295.513 - 25.428 - 2.024 - 0.582))); + assertThat(((Transaction) cancellation1.getSubject()).getSource(), is("Quartalsbericht16.txt")); + assertNull(((Transaction) cancellation1.getSubject()).getNote()); + + assertThat(((Transaction) cancellation1.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation1.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(17).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(18L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.50)))); + assertThat(transaction.getSource(), is("Quartalsbericht16.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2018")); + } + + @Test + public void testQuartalsbericht17() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht17.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(7)); + assertThat(buySellTransactions.size(), is(10)); + assertThat(accountTransactions.size(), is(9)); + assertThat(results.size(), is(26)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0348413815")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0008474511")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("AriDeka CF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0133666759")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0052859252")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0062624902")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("DE0009786285")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("Deka-EuropaPotential TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0005424519")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-BR 100")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-08-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.240))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(67.40)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(67.40)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.396))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.50)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.50)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.337))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.24)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.24)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.130))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.45)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.45)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.021))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.44)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.44)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.105))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(13.50)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(13.50)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.125))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.73)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.73)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-06-25T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.051))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.99)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.99)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-12-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.058))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.92)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.92)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-12-13T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(21.727))); + assertThat(entry.getSource(), is("Quartalsbericht17.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1930.00)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1930.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2019-05-16T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(2.197))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht17.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2018")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(175.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(175.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-08-16T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(16.882 - 0.240))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(67.40)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(67.40)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(39.627 - 0.396))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.50)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.50)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(15.952 - 0.337))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.24)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.24)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.148 - 0.130))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.45)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.45)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(6.854 - 0.021))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.44)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.44)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-11-15T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(34.726 - 0.105))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(13.50)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(13.50)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(37.883 - 0.125))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.73)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.73)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(8).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(9L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.50)))); + assertThat(transaction.getSource(), is("Quartalsbericht17.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2019")); + } + + @Test + public void testQuartalsbericht18() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht18.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(7)); + assertThat(buySellTransactions.size(), is(12)); + assertThat(accountTransactions.size(), is(15)); + assertThat(results.size(), is(34)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0348413815")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE0008474511")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("AriDeka CF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0133666759")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-ConvergenceAktien TF")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0052859252")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0062624902")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("DE0009786285")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("Deka-EuropaPotential TF")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0005424519")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-BR 100")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.882))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(232.27)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(232.27)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.761))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.27)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.27)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.388))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(18.49)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(18.49)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.952))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.18)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.18)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.148))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.13)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.13)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-19T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.854))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(494.76)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(494.76)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.726))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.09)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(58.09)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.018))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.65)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.65)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.901))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(79.92)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(79.92)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-05T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25.119))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1977.86)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1977.86)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-11-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(275.911))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertThat(entry.getNote(), is("Schädliche Verwendung")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(23190.32)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(23190.32)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-11-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.580))); + assertThat(entry.getSource(), is("Quartalsbericht18.txt")); + assertThat(entry.getNote(), is("Entgelt Auflösung")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(48.74)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(48.74)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st delivery outbound (Auslieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(16))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(deliveryTransaction.getNote()); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(40))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(deliveryTransaction.getNote()); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(15))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(deliveryTransaction.getNote()); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(6))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(deliveryTransaction.getNote()); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(6))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(deliveryTransaction.getNote()); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(34))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(deliveryTransaction.getNote()); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(37))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(deliveryTransaction.getNote()); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 8th delivery inbound (Einlieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-05-15T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(2.212))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2019")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(175.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(175.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 9th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-11-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.356))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertThat(deliveryTransaction.getNote(), is("Korrekturbuchung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(114.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(114.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 10th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-11-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(45.699))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertThat(deliveryTransaction.getNote(), is("Steuerrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3841.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3841.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 11th delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-11-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(23.331))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht18.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1960.93)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1960.93)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(11).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.000 + 0.388 + 40.000 - 0.761))); + assertThat(transaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.27)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(56.27)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(12) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.000 + 0.901 + 37.000 - 0.018))); + assertThat(transaction.getSource(), is("Quartalsbericht18.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.65)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.65)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + TransactionItem cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(16))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertNull(((Transaction) cancellation.getSubject()).getNote()); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(1).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(40))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertNull(((Transaction) cancellation.getSubject()).getNote()); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(15))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertNull(((Transaction) cancellation.getSubject()).getNote()); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(3).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(6))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertNull(((Transaction) cancellation.getSubject()).getNote()); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(4).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(6))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertNull(((Transaction) cancellation.getSubject()).getNote()); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(5).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(34))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertNull(((Transaction) cancellation.getSubject()).getNote()); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(6).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-03-18T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(37))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertNull(((Transaction) cancellation.getSubject()).getNote()); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check cancellation transaction + cancellation = (TransactionItem) results.stream() // + .filter(i -> i.isFailure()) // + .filter(TransactionItem.class::isInstance) // + .skip(7).findFirst().orElseThrow(IllegalArgumentException::new); + + assertThat(((AccountTransaction) cancellation.getSubject()).getType(), is(AccountTransaction.Type.FEES)); + assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported)); + + assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-12-31T00:00"))); + assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(0))); + assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Quartalsbericht18.txt")); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Depotpreis 2020")); + + assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(13).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(15L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getSource(), is("Quartalsbericht18.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2020")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(48.74)))); + assertThat(transaction.getSource(), is("Quartalsbericht18.txt")); + assertThat(transaction.getNote(), is("Entgelt Auflösung")); + } + + @Test + public void testQuartalsbericht19() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht19.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(3)); + assertThat(buySellTransactions.size(), is(16)); + assertThat(accountTransactions.size(), is(3)); + assertThat(results.size(), is(22)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("DE000DK2CFT3")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("Deka-BasisAnlage A100")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("DE000DK2J6P1")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("Deka-RentenStrategie Global CF")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("LU0230155797")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-Renten konservativ")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-18T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(21.303))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.220))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.286))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.216))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.275))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.213))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 2nd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.087))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.471))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(6.736))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.116))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1549.55)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1549.55)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.075))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.786))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.068))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.082))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.006))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.068))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(14.209))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.037))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.436))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-25T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.330))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.731))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1310.43)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1310.43)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 3rd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.451))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4.077))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.007))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.439))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.014))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.996))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.433))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4.205))); + assertThat(entry.getSource(), is("Quartalsbericht19.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-05-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.422))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht19.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2019")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(68.25)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(68.25)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-05-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.126))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht19.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2019")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(106.75)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(106.75)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(2).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-05-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(21.100 - 0.471))); + assertThat(transaction.getSource(), is("Quartalsbericht19.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + } + + @Test + public void testQuartalsbericht20() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht20.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(9)); + assertThat(buySellTransactions.size(), is(19)); + assertThat(accountTransactions.size(), is(11)); + assertThat(results.size(), is(39)); + new AssertImportActions().check(results, CurrencyUnit.EUR); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0348413815")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-11T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(19.842))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0350482435")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLuxTeam-EmergingMarkets")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2039.96)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2039.96)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE000DK2CFT3")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-BasisAnlage offensiv")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(19).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0052859252")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0052863874")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("Euro")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.431))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0062624902")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0009786186")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-EuropaSelect CF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(20).findFirst() + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE000DK2CDS0")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-DividendenStrategie CF (A)")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE000DK2J6P1")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-RentenStrategie Global CF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.426))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.006))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(21).findFirst() + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.426))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 4th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(22).findFirst() + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.735))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.201))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(23).findFirst() + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.739))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.200))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(24).findFirst() + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.730))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-09-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.197))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(25).findFirst() + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-12T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.230))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-09-08T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(6.143))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1796.19)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4751.73)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1796.19)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4751.73)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(26).findFirst() + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.724))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-26T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.260))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.31)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.31)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(27).findFirst() + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.725))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(9.867))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1192.43)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1192.43)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(28).findFirst() + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.704))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25.910))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1906.72)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1906.72)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(29).findFirst() + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.153))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.013))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); + assertThat(entry.getNote(), is("Vertragspreis 2020")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(764.21)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.95)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(764.21)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.95)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 5th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(30).findFirst() + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.485))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.560))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); + assertThat(entry.getNote(), is("Schädliche Verwendung")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(231.63)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(231.63)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(31).findFirst() + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.492))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.066))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); + assertThat(entry.getNote(), is("Entgelt Auflösung")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.75)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.75)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(32).findFirst() + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.483))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.083))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); + assertThat(entry.getNote(), is("Vertragspreis 2020")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.79)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.79)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(33).findFirst() + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.505))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(9.869))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); + assertThat(entry.getNote(), is("Schädliche Verwendung")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(925.32)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(925.32)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(34).findFirst() + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-18T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.093))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.416))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); + assertThat(entry.getNote(), is("Entgelt Auflösung")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.99)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4000.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.99)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(35).findFirst() + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.502))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4.212))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(36).findFirst() + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.466))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.661))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(37).findFirst() + // check 18th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(12.416))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-27T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6556.02)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6556.02)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 6th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(38).findFirst() + // check 19th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.395))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-27T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.006))); + assertThat(entry.getSource(), is("Quartalsbericht20.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(39).findFirst() + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.340))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.260))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(deliveryTransaction.getNote(), is("Kauf aus Steuererstattung")); - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.29)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.29)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(40).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.337))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.287))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(deliveryTransaction.getNote(), is("Steuerrückzahlung")); - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.60)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.60)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(41).findFirst() + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.741))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.817))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(deliveryTransaction.getNote(), is("Steuerrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(170.40)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(170.40)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(4.693))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(440.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(440.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(5).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(14.513 - 0.006))); + assertThat(transaction.getSource(), is("Quartalsbericht20.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(28.345 - 0.167))); + assertThat(transaction.getSource(), is("Quartalsbericht20.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check transaction + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(7).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(11L)); + + Item item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.95)))); + assertThat(transaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(transaction.getNote(), is("Vertragspreis 2020")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.75)))); + assertThat(transaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(transaction.getNote(), is("Entgelt Auflösung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.79)))); + assertThat(transaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(transaction.getNote(), is("Vertragspreis 2020")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.99)))); + assertThat(transaction.getSource(), is("Quartalsbericht20.txt")); + assertThat(transaction.getNote(), is("Entgelt Auflösung")); + + } + + @Test + public void testQuartalsbericht21() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht21.txt"), errors); + + // Filter securities + results.stream().filter(i -> !(i instanceof SecurityItem)) + .forEach(i -> assertThat(i.getAmount(), notNullValue())); + + List securityItems = results.stream().filter(SecurityItem.class::isInstance) // + .collect(Collectors.toList()); + List buySellTransactions = results.stream().filter(BuySellEntryItem.class::isInstance) // + .collect(Collectors.toList()); + List accountTransactions = results.stream().filter(TransactionItem.class::isInstance) // + .collect(Collectors.toList()); + + assertThat(errors, empty()); + assertThat(securityItems.size(), is(11)); + assertThat(buySellTransactions.size(), is(55)); + assertThat(accountTransactions.size(), is(19)); + assertThat(results.size(), is(85)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security1.getIsin(), is("LU0348413815")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); + assertThat(security1.getName(), is("DekaLux-PharmaTech TF")); + assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security2.getIsin(), is("LU0350482435")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); + assertThat(security2.getName(), is("DekaLuxTeam-EmergingMarkets")); + assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security3.getIsin(), is("DE000DK2CFT3")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); + assertThat(security3.getName(), is("Deka-BasisAnlage offensiv")); + assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security4 = results.stream().filter(SecurityItem.class::isInstance).skip(3).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security4.getIsin(), is("LU0052859252")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); + assertThat(security4.getName(), is("DekaLuxTeam-Aktien Asien")); + assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security5 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security5.getIsin(), is("LU0052863874")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); + assertThat(security5.getName(), is("Euro")); + assertThat(security5.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security6.getIsin(), is("LU0062624902")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); + assertThat(security6.getName(), is("DekaLux-Deutschland TF A")); + assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(6).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security7.getIsin(), is("DE0009786186")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); + assertThat(security7.getName(), is("Deka-EuropaSelect CF")); + assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security8 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security8.getIsin(), is("DE0009786285")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); + assertThat(security8.getName(), is("Deka-EuropaPotential TF")); + assertThat(security8.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security9.getIsin(), is("DE000DK2J6P1")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); + assertThat(security9.getName(), is("Deka-RentenStrategie Global CF")); + assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security10 = results.stream().filter(SecurityItem.class::isInstance).skip(9).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security10.getIsin(), is("DE000DK2CDS0")); + assertNull(security10.getWkn()); + assertNull(security10.getTickerSymbol()); + assertThat(security10.getName(), is("Deka-DividendenStrategie CF (A)")); + assertThat(security10.getCurrencyCode(), is(CurrencyUnit.EUR)); + + Security security11 = results.stream().filter(SecurityItem.class::isInstance).skip(10).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security11.getIsin(), is("LU0230155797")); + assertNull(security11.getWkn()); + assertNull(security11.getTickerSymbol()); + assertThat(security11.getName(), is("Deka-Renten konservativ")); + assertThat(security11.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check 1st buy sell transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.157))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.006))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(42).findFirst() + // check 2nd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(16.535))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1309.24)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1309.24)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(43).findFirst() + // check 3rd buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.145))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-01-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.188))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(44).findFirst() + // check 4th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.094))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-02-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.183))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 7th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(45).findFirst() + // check 5th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.290))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.247))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(46).findFirst() + // check 6th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.273))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.220))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(47).findFirst() + // check 7th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.301))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.216))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(48).findFirst() + // check 8th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.382))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.213))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(49).findFirst() + // check 9th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.328))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.201))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(50).findFirst() + // check 10th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.298))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.200))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(51).findFirst() + // check 11th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-22T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(10.488))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-09-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.197))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2044.85)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2044.85)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 8th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(52).findFirst() + // check 12th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.267))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-10-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.191))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(53).findFirst() + // check 13th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(12).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.319))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-11-13T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.003))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.52)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.52)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 9th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(54).findFirst() + // check 14th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(13).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.510))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-11-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.185))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(55).findFirst() + // check 15th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(14).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.534))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-12-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.185))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(56).findFirst() + // check 16th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(15).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.533))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-09-08T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(6.143))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4751.73)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4751.73)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(57).findFirst() + // check 17th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(16).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-14T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(13.620))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-26T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.260))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2314.45)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.31)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2314.45)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.31)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(58).findFirst() + // check 18th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(17).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.465))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(9.867))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1192.43)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1192.43)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(59).findFirst() + // check 19th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(18).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.404))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.115))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.77)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.77)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 10th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(60).findFirst() + // check 20th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(19).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-08T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.869))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25.910))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(521.87)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1906.72)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(521.87)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1906.72)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(61).findFirst() + // check 21th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(20).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.361))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.016))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.37)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.37)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 11th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(62).findFirst() + // check 22th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(21).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-07T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.464))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.004))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.62)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.62)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(63).findFirst() + // check 23th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(22).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.452))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-22T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.471))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 12th security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(64).findFirst() + // check 24th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(23).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-01T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.217))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.013))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertThat(entry.getNote(), is("Vertragspreis 2020")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.95)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.95)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(65).findFirst() + // check 25th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(24).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-12T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(13.391))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1.560))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertThat(entry.getNote(), is("Schädliche Verwendung")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1540.37)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(231.63)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1540.37)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(231.63)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(66).findFirst() + // check 26th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(25).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.140))); - assertThat(entry.getSource(), is("Quartalsbericht01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.066))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertThat(entry.getNote(), is("Entgelt Auflösung")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.75)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(250.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.75)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check delivery inbound (Einlieferung) transaction - PortfolioTransaction transaction = (PortfolioTransaction) results.stream() - .filter(TransactionItem.class::isInstance).findFirst() + // check 27th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(26).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(transaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-05-28T00:00"))); - assertThat(transaction.getShares(), is(Values.Share.factorize(1.315))); - assertThat(transaction.getSource(), is("Quartalsbericht01.txt")); - assertThat(transaction.getNote(), is("Fusion")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.083))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertThat(entry.getNote(), is("Vertragspreis 2020")); - assertThat(transaction.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getUnitSum(Unit.Type.TAX), + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.79)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.79)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getUnitSum(Unit.Type.FEE), + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check delivery outbound (Auslieferung) transaction - transaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(transaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-05-28T00:00"))); - assertThat(transaction.getShares(), is(Values.Share.factorize(2.140))); - assertThat(transaction.getSource(), is("Quartalsbericht01.txt")); - assertThat(transaction.getNote(), is("Fusion")); - - assertThat(transaction.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - } + // check 28th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(27).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); - @Test - public void testQuartalsbericht02() - { - DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - List errors = new ArrayList<>(); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(9.869))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertThat(entry.getNote(), is("Schädliche Verwendung")); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht02.txt"), errors); + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(925.32)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(925.32)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(errors, empty()); - assertThat(results.size(), is(13)); - new AssertImportActions().check(results, CurrencyUnit.EUR); + // check 29th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(28).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); - // check security - Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("DE000DK2CDS0")); - assertNull(security1.getWkn()); - assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("Deka-DividendenStrategie CF (A)")); - assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security2.getIsin(), is("LU1508359509")); - assertNull(security2.getWkn()); - assertNull(security2.getTickerSymbol()); - assertThat(security2.getName(), is("Deka-Industrie 4.0 CF")); - assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.416))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertThat(entry.getNote(), is("Entgelt Auflösung")); - Security security3 = results.stream().filter(SecurityItem.class::isInstance).skip(2).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security3.getIsin(), is("DE0008474503")); - assertNull(security3.getWkn()); - assertNull(security3.getTickerSymbol()); - assertThat(security3.getName(), is("DekaFonds CF")); - assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.99)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.99)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 1st security buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + // check 30th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(29).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-11T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.255))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.532))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(776.10)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(776.10)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 1st security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + // check 31th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(30).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-10T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.268))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8.102))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(776.10)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(776.10)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 1st security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + // check 32th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(31).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-10T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.271))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.668))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(354.90)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(354.90)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 2nd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + // check 33th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(32).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-11T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.545))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-12T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.757))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(354.90)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(354.90)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 2nd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + // check 34th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(33).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-10T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.616))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-13T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.024))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.05)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.05)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 2nd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + // check 35th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(34).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-10T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.598))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-13T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.033))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.05)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.05)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 3rd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + // check 36th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(35).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-11T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.418))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.248))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(650.44)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(650.44)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 3rd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + // check 37th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(36).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-10T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.443))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.102))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(650.44)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(650.44)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 3rd security buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + // check 38th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(37).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-10T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.430))); - assertThat(entry.getSource(), is("Quartalsbericht02.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(18.994))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1718.96)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1718.96)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 1st dividends transaction - AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + // check 39h buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(38).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-05-20T00:00"))); - assertThat(transaction.getShares(), is(Values.Share.factorize(177.6))); - assertThat(transaction.getSource(), is("Quartalsbericht02.txt")); - assertNull(transaction.getNote()); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(35.626))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertNull(entry.getNote()); - assertThat(transaction.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.43)))); - assertThat(transaction.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(33.43)))); - assertThat(transaction.getUnitSum(Unit.Type.TAX), + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1718.96)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1718.96)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getUnitSum(Unit.Type.FEE), + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - } - - @Test - public void testQuartalsbericht03() - { - DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); - List errors = new ArrayList<>(); + // check 40th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(39).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht03.txt"), errors); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(errors, empty()); - assertThat(results.size(), is(4)); - new AssertImportActions().check(results, CurrencyUnit.EUR); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.116))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); + assertNull(entry.getNote()); - // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("DE000DK2CFT3")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Deka-BasisAnlage offensiv")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 1st buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + // check 41th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(40).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-07-18T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); - assertThat(entry.getSource(), is("Quartalsbericht03.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3.786))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(340.80)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 2nd buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + // check 42th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(41).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-08-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.155))); - assertThat(entry.getSource(), is("Quartalsbericht03.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 3rd buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + // check 43th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(42).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-09-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.162))); - assertThat(entry.getSource(), is("Quartalsbericht03.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-17T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.006))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.50)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - } - - @Test - public void testJahresbericht01() - { - DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); - - List errors = new ArrayList<>(); - - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Jahresbericht01.txt"), errors); - - assertThat(errors, empty()); - assertThat(results.size(), is(14)); - new AssertImportActions().check(results, CurrencyUnit.EUR); - - // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("DE000DK2CFT3")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Deka-BasisAnlage offensiv")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - // check 1st buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + // check 44th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(43).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-01-18T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.149))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(14.209))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 2nd buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(1).findFirst() + // check 45th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(44).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-02-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.155))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-18T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.436))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(682.17)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 3rd buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(2).findFirst() + // check 46th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(45).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-03-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.165))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.731))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 4th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(3).findFirst() + // check 47th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(46).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-20T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.158))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-09T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4.077))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(373.94)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 5th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(4).findFirst() + // check 48th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(47).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.165))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.007))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 6th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(5).findFirst() + // check 49th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(48).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-06-17T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.174))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-10T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.014))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.66)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 7th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(6).findFirst() + // check 50th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(49).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-07-18T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(7.996))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 8th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(7).findFirst() + // check 51th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(50).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-08-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.155))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-30T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4.205))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(386.77)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 9th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(8).findFirst() + // check 55th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(51).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-09-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.162))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4.212))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 10th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(9).findFirst() + // check 53th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(52).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-10-18T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.172))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-24T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.661))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(391.83)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 11th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(10).findFirst() + // check 54th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(53).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-11-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.163))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-27T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.010))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 12th buy sell transaction - entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(11).findFirst() + // check 55th buy sell transaction + entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).skip(54).findFirst() .orElseThrow(IllegalArgumentException::new).getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-12-16T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.165))); - assertThat(entry.getSource(), is("Jahresbericht01.txt")); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-27T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.006))); + assertThat(entry.getSource(), is("Quartalsbericht21.txt")); assertNull(entry.getNote()); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(36.00)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.93)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check delivery inbound (Einlieferung) transaction + PortfolioTransaction deliveryTransaction = (PortfolioTransaction) results.stream() + .filter(TransactionItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.260))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(deliveryTransaction.getNote(), is("Kauf aus Steuererstattung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.29)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.29)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-05-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.422))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2019")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(68.25)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(68.25)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery inbound (Einlieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(2) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-05-19T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.126))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenzahlung 2019")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(106.75)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(106.75)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(3) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.287))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(deliveryTransaction.getNote(), is("Steuerrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.60)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.60)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(4) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(0.741))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(110.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(1.817))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(deliveryTransaction.getNote(), is("Steuerrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(170.40)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(170.40)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check delivery outbound (Auslieferung) transaction + deliveryTransaction = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(deliveryTransaction.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); + + assertThat(deliveryTransaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(deliveryTransaction.getShares(), is(Values.Share.factorize(4.693))); + assertThat(deliveryTransaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(deliveryTransaction.getNote(), is("Zulagenrückzahlung")); + + assertThat(deliveryTransaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(440.00)))); + assertThat(deliveryTransaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(440.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(deliveryTransaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 1st dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .skip(7).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(14.513 - 0.006))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.87)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 2nd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(8) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(28.345 - 0.167))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(22.47)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 3rd dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(9) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-13T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(7.377 - 0.185 - 0.185 - 0.003))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.52)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.52)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 4th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(10) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.000 + 25.910 - 0.115))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.77)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.77)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 5th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(11) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(33.823 - 0.016))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.37)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.37)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 6th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(12) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-02-21T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(8.848 - 0.004))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.62)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.62)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + + // check 7th dividends transaction + transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(13) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-05-22T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(0.000 + 4.693 + 1.817 + 0.416 + 9.869 + + 0.083 + 0.741 + 0.287 + 0.066 + 1.560 + + 0.013 - 0.471))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(42.00)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check transaction - Iterator iter = results.stream().filter(TransactionItem.class::isInstance).iterator(); - assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(1L)); + Iterator iter = results.stream().filter(TransactionItem.class::isInstance).skip(14).iterator(); + assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(19L)); Item item = iter.next(); // assert transaction - AccountTransaction transaction = (AccountTransaction) item.getSubject(); + transaction = (AccountTransaction) item.getSubject(); assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-12-31T00:00"))); - assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.50)))); - assertThat(transaction.getSource(), is("Jahresbericht01.txt")); - assertThat(transaction.getNote(), is("Depotpreis für 2022")); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-12-31T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.18)))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(transaction.getNote(), is("Depotpreis 2020")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.95)))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(transaction.getNote(), is("Vertragspreis 2020")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.75)))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(transaction.getNote(), is("Entgelt Auflösung")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.79)))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(transaction.getNote(), is("Vertragspreis 2020")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-08-24T00:00"))); + assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(38.99)))); + assertThat(transaction.getSource(), is("Quartalsbericht21.txt")); + assertThat(transaction.getNote(), is("Entgelt Auflösung")); } } diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht02.txt index 8ce135c4fd..7864fc82df 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht02.txt +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht02.txt @@ -207,13 +207,13 @@ EUR Fremdwährung EUR Anteile tag nungstag Bestand am 31.03.2022 2.868,27 186,300000 15,396 Bewertung mit dem Rücknahmepreis vom 31.03.2022 Lastschrifteinzug 50,00 195,780000 +0,255 11.04.2022 11.04.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Lastschrifteinzug 50,00 186,290000 +0,268 10.05.2022 10.05.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Ausschüttung / Kauf aus Ertrag 0,00 177,600000 +0,000 20.05.2022 20.05.2022 Verkauf aus Ertrag 33,43 177,600000 +0,000 20.05.2022 20.05.2022 Lastschrifteinzug 50,00 184,490000 +0,271 10.06.2022 10.06.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Summe der Betragsbewegungen 150,00 Bestand am 30.06.2022 2.789,05 172,270000 16,190 Bewertung mit dem Rücknahmepreis vom 30.06.2022 @@ -226,9 +226,9 @@ EUR Fremdwährung EUR Anteile tag nungstag Bestand am 31.03.2022 5.948,69 184,610000 32,223 Bewertung mit dem Rücknahmepreis vom 31.03.2022 Lastschrifteinzug 100,00 183,550000 +0,545 11.04.2022 11.04.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Lastschrifteinzug 100,00 162,430000 +0,616 10.05.2022 10.05.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Bitte prüfen Sie die vorliegenden Informationen. Fortsetzung auf Seite 2 DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: @@ -249,7 +249,7 @@ Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- EUR Fremdwährung EUR Anteile tag nungstag Fortsetzung von vorheriger Seite Lastschrifteinzug 100,00 167,180000 +0,598 10.06.2022 10.06.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Summe der Betragsbewegungen 300,00 Bestand am 30.06.2022 5.107,49 150,300000 33,982 Bewertung mit dem Rücknahmepreis vom 30.06.2022 @@ -262,11 +262,11 @@ EUR Fremdwährung EUR Anteile tag nungstag Bestand am 31.03.2022 2.599,21 116,520000 22,307 Bewertung mit dem Rücknahmepreis vom 31.03.2022 Lastschrifteinzug 50,00 119,560000 +0,418 11.04.2022 11.04.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Lastschrifteinzug 50,00 112,870000 +0,443 10.05.2022 10.05.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Lastschrifteinzug 50,00 116,300000 +0,430 10.06.2022 10.06.2022 -Mandatsreferenz: 0140484429003 +Mandatsreferenz: 01111111111111 Summe der Betragsbewegungen 150,00 Bestand am 30.06.2022 2.358,86 99,960000 23,598 Bewertung mit dem Rücknahmepreis vom 30.06.2022 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht03.txt index f853acffd0..2bef044bb7 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht03.txt +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht03.txt @@ -145,7 +145,7 @@ HRA 16068 Quartalsbericht per 30.09.2022 Umsatzübersicht Seite 2 -Depot: 0119701779 +Depot: 0111111111 Depotinhaber: Max Mustermann diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht04.txt new file mode 100644 index 0000000000..f3b8351ea8 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht04.txt @@ -0,0 +1,312 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- +DekaBank +Herrn Deutsche +Max Muster +Strasse 8 Girozentrale +99999 Stadt +Juli 2022 +Depotservice +DekaBank Depot +60625 Frankfurt am Main +DekaBank Depot Nr. 9999999999 Telefon (0 69) 71 47 - 6 52 +Ihr Bericht für das zweite Quartal 2022 Telefax (0 69) 25 46 - 24 83 +www.deka.de +Sehr geehrter Herr Muster, +Vorstand +Dr. Georg Stocker +die Inflationsraten bleiben in vielen Industrieländern hartnäckig hoch. Um die Inflations- (Vorsitzender) +Dr. Matthias Danne +gefahren einzudämmen, haben sich die Notenbanken auf den Weg gemacht, die geld- (Stellv. Vorsitzender) +politischen Zügel schneller anzuziehen, als noch vor wenigen Wochen gedacht. Und so Birgit Dietl-Benzin +Daniel Kapffer +bewegen sich die Marktzinsen langsam wieder in positives Terrain. Das dürfte für viele Torsten Knapmeyer +ein Grund zur Freude sein, endlich kann man sein Geld wieder sicher mit nennenswer- Martin K. Müller +ten Zinsen anlegen. Doch Vorsicht: die Zinsen für sichere Geldanlagen dürften bis auf Verwaltungsratsvorsitzender +Weiteres deutlich unter den enorm hohen Inflationsraten bleiben. Die regelmäßige, Helmut Schleweis +breit gestreute Anlage in Wertpapiere mit einer gehörigen Portion Aktien ist daher aus +unserer Sicht weiterhin die beste Möglichkeit, vom globalen Wachstum zu profitieren USt-Id-Nr. +DE 114103563 +und der Geldentwertung durch die hohe Inflation gegenzusteuern. +Handelsregister +Wenn Sie mehr darüber erfahren wollen, wie die Entwicklung der geopolitischen Kon- AmtsgerichtFrankfurt am Main +flikte und der Corona-Pandemie die Konjunktur beeinflussen, was steigende Zinsen für HRA 16068 +Wachstum und Finanzmärkte bedeuten oder was zurzeit die wichtigsten Themen für +Wertpapieranlegerinnen und -anleger sind, dann hören Sie doch rein in die Podcast-Serie SitzFrankfurt am Main, Berlin +"Mikro trifft Makro - das Finanzmarktgespräch" mit dem Chefvolkswirt der DekaBank, +Dr. Ulrich Kater. Den Link hierzu finden Sie auf der Rückseite dieses Schreibens. +Anliegend senden wir Ihnen zu Ihrem Depot den Quartalsbericht für das zweite +Quartal 2022. Des Weiteren informieren wir Sie in der beigefügten Anlage über die +Berücksichtigung von Nachhaltigkeitsrisiken und –faktoren in der Anlageberatung. Le- +sen Sie das Dokument bitte aufmerksam durch und nehmen Sie es zu Ihren Unterlagen. +Es besteht kein weiterer Handlungsbedarf. +Profitieren Sie übrigens schon von ermäßigten Depot-Gebühren und jcbZu4NbPjcbZ +ZlXZgZXpZZlXZ +aktuellen Informationen rund um Ihre Geldanlage? Falls nein, dann czcRPxWUXaacR +schalten Sie Ihr Depot für die Online-Nutzung in der Internet-Filiale mBgHw8BgY1kB2pXMVyIKgJeqlP +der Sparkasse frei und melden Sie sich zur ressourcenschonenden pTXLZbM6rp;wX +jcbZN99:uSjx: +Online-Kommunikation an. ZlXZGWwIToBOP +Scannen Sie bitte den nebenstehenden QR-Code oder geben Sie zzzPzPzttt0zP +www.deka.de/online ein, um diesen Service zu nutzen. +Sie haben Fragen zu Ihren Unterlagen? Sie erreichen uns montags bis freitags von 8.00 +bis 18.00 Uhr telefonisch unter (0 69) 71 47 – 6 52. Wir sind gerne für Sie da. +Beste Grüße +DekaBank +Deutsche Girozentrale +Frank Kalter Dr. Olaf Heinrich +Leiter Vertriebsmanagement Leiter Digitales Multikanalmanagement +Hörenswert: Die Podcast-Serie +"Mikro trifft Makro - das Finanzmarktgespräch" +Deka-Chefvolkswirt Dr. Ulrich Kater jcbZ8XgmHiei2jcbZ +und Moderator Dirk Huesmann spre- ZlXZgQRdIpwnPZlXZccbSWwPXuXxZuaaaP +2qUq8XgmpboKDSCxR +chen verständlich und nachvollzieh- 5OxVhSRdHD3fjIWJX +Z8oqsD3SwobMMBHeR +bar über alles, was die Welt und die 9iGWK2NgQ4FRCDFM8ZqbMwU8BbamJ9ZroR +Börsen aktuell bewegt und gehen S3SRZBqsBNrYjbxE8Zs:ZKXh8W7Bzwqkg2 +ucSZkMPICQvkGz4Y0 +auf Hintergründe des Marktgesche- +hens ein. +Reinhören lohnt sich - alle zwei Wochen neu. +www.deka.de/privatkunden/aktuelles/mikro-trifft-makro +Sehenswert: Die Video-Talkserie +"Vom Investieren zum Sinnvestieren" +Gemeinsam mit spannenden Gästen jcbZaeM9HW72E0:jcbZ +geht Moderator Patrick Dewayne ZlXZ1mHHgLlIoZ8ZlXZcabRwPxSYPPwVSRbzzR +Themen rund um Nachhaltigkeit, Zu- Ri6H5X8D;JFm4E:JTN8u8;VIRv5viUdROYPNMR +zWaqX4qQ1CRLUA5I5vX +kunft und Diversität auf den Grund. bEBgimfbKM0hFA;Bx1Z +83ZqyE6oyzDeBf1NQk: +Reinschauen lohnt sich also! y9tSpT0qy;T4SMYRHsRX8TLJ6w9133x50nlowP +jcbZBFDCCc:DpsuSo5Z +ZlXZbG0dEz2O414TO;: +zzzPztPt0tPtP0P0P0P +Alle Folgen finden Sie hier: +https://sinnvestoren.de/videocast/vom-investieren-zum- +sinnvestieren-der-deka-talk-mit-patrick-dewayne +Quartalsbericht per 30.06.2022 +Depotübersicht +Seite: 1 +Depot: 9999999999 +Depotinhaber: +Max Muster +Herrn +Max Muster +Strasse 8 +99999 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 30.06.2022 seit 31.03.2022 1 +DE000DK0ECU8 00 Deka-GlobalChampions CF 2.399,07 -259,02 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Max Muster +LU0348413815 00 DekaLux-PharmaTech TF 5.395,84 -84,01 +LU0052859252 00 DekaLuxTeam-Aktien Asien 5.407,15 -114,50 +DE0009786285 00 Deka-EuropaPotential TF 4.128,69 -899,23 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 10.146,62 -1.246,91 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +6.225,13 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. +Gesamt in EUR 27.477,37 -2.603,67 +1 Hinweis: Der letzte Handelstag kann stichtagsbezogen vom Quartalsultimo abweichen. +Wichtiger Hinweis zu MiFID: +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Hinweis zur Wertentwicklung: +Wir weisen ausdrücklich darauf hin, dass im Markt unterschiedliche Berechnungsmethoden zur Ermittlung der Wertentwicklung verwendet +werden (z.B. geldgewichtete oder zeitgewichtete Berechnungsmethode). Bei Verwendung unterschiedlicher Berechnungsmethoden ist es +möglich, dass die in anderen Informationen ausgewiesenen Wertentwicklungen von der in dieser Information dargestellten Wertentwicklung +abweichen. +Hinweise zum Berater: +Wenn Sie eine Beratung zu Ihren bereits gehaltenen Wertpapieren oder zum Erwerb weiterer Wertpapiere wünschen, sprechen Sie Ihre +Kundenberaterin oder Ihren Kundenberater bei der Sparkasse Schweinfurt-Haßberge an. Diese beraten Sie gerne. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2022 +Depotübersicht +Seite: 2 +Depot: 9999999999 +Depotinhaber: +Max Muster +Ressourcen, Zeit und Geld sparen: Mit einem Online-Zugang haben Sie von überall und jederzeit Zugriff auf Ihr DekaBank Depot sowie die +dazugehörigen Dokumente, z.B. auch über die S-Invest App (www.deka.de/s-invest). +Außerdem helfen Sie dabei, wichtige Ressourcen zu schonen! Jedes auf die Online-Nutzung umgestellte DekaBank Depot bedeutet ca. +6 Briefe im Jahr weniger, die verschickt werden müssen. Und Sie profitieren durch den reduzierten Depotpreis. Weitere Informationen zur +Online-Freischaltung erhalten Sie unter www.deka.de/online oder in Ihrer Sparkasse. +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Einbeziehung von +Nachhaltigkeitsrisiken und -faktoren +in der Anlageberatung +Sehr geehrte Kundin, sehr geehrter Kunde, zenden Branchenstandards berücksichtigt und verstärkt Finanz- +instrumente in das Beratungsuniversum aufgenommen werden, +die keine unangemessen hohen Nachhaltigkeitsrisiken aufweisen. +mit dem nachfolgenden Text informieren wir Sie über die Be- +rücksichtigung von Nachhaltigkeitsrisiken und -faktoren in der Hinweis für DekaBank Depot-Kunden, die von Sparkassen +Anlageberatung. Diese Information erfolgt auch im Namen der beraten werden: Das oben beschriebene Vorgehen zur Be- +beratenden Sparkasse. Lesen Sie das Dokument bitte aufmerk- rücksichtigung der Nachhaltigkeitsrisiken und -faktoren in der +sam durch und nehmen Sie es zu Ihren Unterlagen. Es besteht Anlageberatung trifft auch zu, wenn die Anlageberatung durch +kein weiterer Handlungsbedarf. die Sparkassen erbracht wird und die Verwahrung der Finanzin- +strumente im DekaBank Depot durch die DekaBank erfolgt. In +Über die der Anlageberatung vorgelagerte Produktauswahl ent- diesem Fall trifft die Sparkasse dieselben Maßnahmen, die oben +scheidet die DekaBank unter Berücksichtigung konkreter Pro- für die DekaBank beschrieben werden. Die ausführliche Strate- +dukteigenschaften, welche Finanzinstrumente in das Beratungs- gie zur Einbeziehung von Nachhaltigkeitsrisiken und zur Berück- +universum aufgenommen werden. Durch die Auswahl der Fi- sichtigung der wichtigsten nachteiligen Auswirkungen auf Nach- +nanzinstrumente, welche die DekaBank dem Kunden in der An- haltigkeitsfaktoren bei der Anlageberatung wird auf der Webseite +lageberatung als für diesen geeignet empfiehlt, werden Nach- der jeweiligen Sparkasse veröffentlicht. +haltigkeitsrisiken und die Nachhaltigkeitsfaktoren Umwelt-, So- +zial- und Arbeitnehmerbelange, die Achtung der Menschen- Bei Zinsanleihen und Zertifikaten der DekaBank, die Kunden mit +rechte und die Bekämpfung von Korruption und Bestechung bei und ohne Nachhaltigkeitspräferenz empfohlen werden, berück- +der Anlageberatung einbezogen. Hierfür kooperiert die Deka- sichtigt die DekaBank Nachhaltigkeitsrisiken sowie Nachhaltig- +Bank eng mit ihren Produktpartnern (Unternehmen der Deka- keitsfaktoren durch Grundsätze in Bezug auf die Kreditvergabe +Gruppe und der Sparkassen Finanzgruppe sowie dritte Anbieter). und Eigenanlage. +Unter einem Nachhaltigkeitsrisiko versteht die DekaBank ein Er- Die Strategie zur Einbeziehung von Nachhaltigkeitsrisiken bei der +eignis oder eine Bedingung in den Bereichen Umwelt (Environ- Anlageberatungstätigkeit wird auf der Website der DekaBank +mental), Soziales (Social) oder verantwortungsvolle Unterneh- veröffentlicht. +mensführung (Governance), kurz ESG, dessen bzw. deren Ein- +treten tatsächlich oder potenziell wesentliche negative Auswir- +kungen auf den Wert der Investition der Kunden haben könnte. Bei den Finanzprodukten, welche die DekaBank Anlegern im Rah-men der Anlageberatung empfiehlt, können sich Nachhaltigkeits- +risiken negativ auf die Rendite von Finanzprodukten auswirken. +Die DekaBank empfiehlt ihren Kunden je nach ihrer individuellen Insbesondere können diese zu einer wesentlichen Verschlech- +Nachhaltigkeitspräferenz ein für sie passendes Finanzprodukt. terung der Finanzlage, der Rentabilität oder der Reputation der +Emittenten oder Produkte führen, in die investiert wurde und sich +Bei Finanzprodukten bzw. Vermögensverwaltungen mit Nach- erheblich auf das Bewertungsniveau der Investition auswirken. +haltigkeitsmerkmalen, die die DekaBank ihren Kunden mit einer +Präferenz für nachhaltige Anlagen empfiehlt bzw. vermittelt, Nachhaltigkeitsrisiken können nicht gänzlich ausgeschlossen, aber +werden Nachhaltigkeitsfaktoren wie folgt einbezogen: Im Rah- reduziert werden. Nachhaltigkeitsrisiken können im Anlageent- +men der Produktauswahl orientiert sich die DekaBank an den scheidungsprozess bewusst eingegangen und im Prozess der +Vorgaben ihrer Produkthersteller. Diese sind aufgrund regulato- Nachhaltigkeitsanalyse identifizierte Renditechancen genutzt wer- +rischer Vorgaben oder Branchenstandards generell verpflichtet, den, sodass sich Nachhaltigkeitsrisiken auch positiv auf die Ren- +Nachhaltigkeitsfaktoren im Rahmen ihrer Investitionsentschei- dite dieser Produkte auswirken können. +dungen (bei Investmentfonds und Vermögensverwaltung) oder +über die Auswahl der Basiswerte (bei Zertifikaten) zu berücksich- +tigen. Zum anderen berücksichtigen bestimmte Finanzinstru- Die DekaBank stellt ihren Kunden keine regelmäßige Beurteilung +mente mit Nachhaltigkeitsmerkmalen (Investmentfonds und Zer- der Geeignetheit der von ihr empfohlenen Finanzinstrumente zur +tifikate) sowie Vermögensverwaltungen mit Nachhaltigkeits- Verfügung, d. h., nach einer einmal erfolgten Anlageberatung +merkmalen (sogenannte ESG-Strategieprodukte/-dienstleistun- überprüft die DekaBank nicht ohne ausdrückliche Aufforderung +gen) Nachhaltigkeitsfaktoren, zum Beispiel über Ausschlüsse für seitens des Kunden, ob die empfohlenen Finanzinstrumente im +gewisse Anlagen. Dies soll dazu führen, dass nicht in bestimmte weiteren Zeitverlauf geeignet bleiben. +Unternehmen investiert wird bzw. diese nicht als Basiswerte zu- +grunde gelegt werden, die besonders hohe Nachhaltigkeitsrisi- Die DekaBank möchte darauf hinweisen, dass im Falle der Anla- +ken aufweisen. geberatung – wie auch bei den beratungsfreien Dienstleistungen +– die Überwachung der Wertentwicklung des Portfolios und der +Alternativ dazu wählt die DekaBank auch Finanzinstrumente für einzelnen Finanzinstrumente nicht durch sie erfolgt. Das schließt +die Anlageberatung aus, die in nachhaltige Wirtschaftsaktivitä- jedoch nicht aus, dass die DekaBank – z. B. bei einer Fälligkeit – +ten investieren (Produkte mit Wirkungsbezug). mit Anlageideen auf den Kunden zugeht. +Auch bei Investmentfonds und Vermögensverwaltungen, die die Einzelheiten und Informationen zum jeweiligen Produkt erhalten +DekaBank Kunden ohne Nachhaltigkeitspräferenz empfiehlt, sind die Kunden von ihrem Berater. Gleichfalls sind Wertpapierver- +die Kapitalverwaltungsgesellschaften bzw. Vermögensverwalter kaufsprospekte, die nach dem Wertpapierprospektgesetz und der +aufgrund regulatorischer Vorgaben verpflichtet, darüber zu infor- EU-Prospektverordnung (EU) 2017/1129 veröffentlicht wurden, +mieren, ob sie Nachhaltigkeitsrisiken im Rahmen ihrer Investitions- sowie gegebenenfalls auch wesentliche Anlegerinformationen zu +entscheidungen berücksichtigen. Auf diese Weise trägt der Pro- Investmentfonds, Produktinformationsblätter und Basisinfor- +duktauswahlprozess maßgeblich dazu bei, dass Nachhaltigkeits- mationsblätter auf der Homepage des Emittenten abrufbar. +faktoren auf Basis der gesetzlichen Vorgaben sowie eines ergän- +Quartalsbericht per 30.06.2022 +Umsatzübersicht +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Muster +Deka-GlobalChampions CF +ISIN: DE000DK0ECU8 Unterdepot: 00 +Verwahrart: GiroSammel +VL-Vertrag: gesperrt bis zum 31.12.2024, Vertragsinhaber: Max Muster +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2022 2.538,09 283,490000 8,953 +Bewertung mit dem Rücknahmepreis vom 31.03.2022 +Kauf 40,00 284,870000 +0,140 21.04.2022 21.04.2022 +Kauf 40,00 264,650000 +0,151 23.05.2022 23.05.2022 +Kauf 40,00 256,820000 +0,156 21.06.2022 21.06.2022 +Summe der Betragsbewegungen 120,00 +Bestand am 30.06.2022 2.399,07 255,220000 9,400 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2022 5.479,85 401,160000 13,660 +Bewertung mit dem Rücknahmepreis vom 31.03.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2022 5.395,84 395,010000 13,660 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Bitte prüfen Sie die vorliegenden Informationen. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2022 +Umsatzübersicht +Seite 2 +Depot: 9999999999 +Depotinhaber: +Max Muster +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2022 5.521,65 859,400000 6,425 +Bewertung mit dem Rücknahmepreis vom 31.03.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2022 5.407,15 841,580000 6,425 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2022 5.027,92 169,530000 29,658 +Bewertung mit dem Rücknahmepreis vom 31.03.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2022 4.128,69 139,210000 29,658 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2022 +Umsatzübersicht Deka-BonusRente +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Muster +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 999999999999940500 Zertifizierungs-Nr.: 003604 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.05.2049 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +Bestand am 31.03.2022 Deka-BR 100 11.298,54 107,930000 104,684 +Gesamtbestand des Vertrages am 01.04.2022 11.298,54 +Bewertung mit dem Rücknahmepreis vom 31.03.2022 +Zulagenzahlung 2021 Deka-BR 100 14,99 101,840000 +0,147 17.05.2022 17.05.2022 +Lastschrifteinzug Deka-BR 100 80,00 103,190000 +0,775 08.06.2022 08.06.2022 +Mandatsreferenz: 9999999999001 +Bestand am 30.06.2022 Deka-BR 100 10.146,62 96,080000 105,606 +Gesamtbestand des Vertrages am 30.06.2022 10.146,62 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Bitte prüfen Sie die vorliegenden Informationen. +Dieser Report besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht05.txt new file mode 100644 index 0000000000..af86c80365 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht05.txt @@ -0,0 +1,477 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Depotübersicht +Seite: 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Daten für den automatischen Kirchensteuerabzug liegen +für 2020 vor +Sparer-Pauschbetrag +Erteilt 2019: EUR 131,00 +Beansprucht: EUR 86,77 +Herrn +Max Mustermann +Strasse 8 +99999 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 31.12.2019* für 2019 +DE000DK0ECU8 00 Deka-GlobalChampions CF 956,78 +153,16 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Max Mustermann +LU0348413815 00 DekaLux-PharmaTech TF 4.355,95 +895,40 +DE0005152631 00 Deka-Technologie TF 1.885,17 +540,42 +LU0133666759 00 Deka-ConvergenceAktien TF 1.025,82 +264,83 +LU0052859252 00 DekaLuxTeam-Aktien Asien 4.998,91 +1.003,45 +LU0062624902 00 DekaLux-Deutschland TF A 1.489,18 +292,13 +LU0062625115 00 DekaLux-Europa TF (A) 442,23 +84,26 +DE0009771980 00 Deka-EuropaBond TF 681,94 +43,19 +DE0009786285 00 Deka-EuropaPotential TF 4.064,49 +959,21 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 8.738,94 +1.715,05 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +5.760,46 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. +Gesamt in EUR 28.639,41 +5.951,10 +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem DekaBank Depot / Jahresdepotauszug" auf der Folgeseite. +Depotpreis inkl. 19% Mehrwertsteuer (MwSt): +12,50 EUR inkl. 2,00 EUR MwSt wurden für 2019 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. +Wichtiger Hinweis zur Steuerbescheinigung +Mit Ihrem Jahresdepotauszug erhalten Sie auch Ihre Steuerbescheinigung. Diese finden Sie direkt im Anschluss an Ihre Depotübersicht. Sofern +Sie mehr als ein Depot in unserem Hause haben, können die Angaben von mehreren Depots in EINER Steuerbescheinigung zusammengefasst +sein. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Depotübersicht +Seite: 2 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Dieser Jahresdepotbericht enthält Informationen gem. Artikel 63 Abs. 1 und 2 der Delegierten Verordnung Nr. 2017/565. Diese +vierteljährliche Aufstellung Ihrer Vermögenswerte zum 31.12. wird Ihnen, anders als die Quartalsberichte zu den Stichtagen 31.03., 30.06. +und 30.09. eines Kalenderjahres, nicht gesondert zur Verfügung gestellt. +Besondere Hinweise zur Deka-BonusRente: +Das Jahresendereporting zur Deka-BonusRente ggf. mit dem Antrag auf Altersvorsorgezulage oder den Informationen über gespeicherte +Daten zur Beantragung der Dauerzulage, der Bescheinigung nach § 92 EStG sowie der Jahresinformation nach § 7a +Altersvorsorgeverträge-Zertifizierungsgesetz (AltZertG) geht Ihnen separat zu. Der Versand startet Ende Februar 2020. Sofern uns Ihre +Steueridentifikationsnummer und ggf. die Ihres Ehegatten/Lebenspartners, sowie für die Beantragung von Kinderzulage, die Ihrer Kinder +vorliegt und Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, +übernehmen wir dies auf Grundlage der von Ihnen mitgeteilten Daten. Die Zulage wird nach Eingang Ihrem Deka-BonusRente Vertrag +gutgeschrieben. Zudem übermitteln wir per Datenfernübertragung die von Ihnen gezahlten Beiträge zur Beantragung des +Sonderausgabenabzugs an die Deutsche Rentenversicherung Bund - Zentrale Zulagenstelle für Altersvermögen (ZfA) zur Weiterleitung an Ihr +Wohnsitzfinanzamt. +Hinweise zum Berater: +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Schweinfurt-Haßberge. +Vorabankündigung (Pre-Notification) +Als Beitrag zur Schaffung des einheitlichen Euro-Zahlungsverkehrsraums (Single Euro Payments Area, SEPA) haben wir zum 29.01.2014 auf +das europaweit einheitliche SEPA-Basis-Lastschriftverfahren umgestellt. Wie Ihnen mit dem Jahresdepotauszug 2013 mitgeteilt, wurden die +uns von Ihnen bereits erteilte(en) Einzugsermächtigung(en) automatisch umgewandelt und als SEPA-Lastschriftmandat(e) weiter genutzt. +Entgelte, Kosten, Steuern und Auslagen gemäß AGB und Preis- und Leistungsverzeichnis, werden im Regelfall von der generellen +Bankverbindung belastet. Bei einer unterjährigen Kündigung Ihres Depots werden anfallende Entgelte frühestens 2 Arbeitstage nach +Depotlöschung belastet. +Ein SEPA-Lastschriftmandat wird durch unsere nachfolgend genannte Gläubiger-Identifikationsnummer und Ihre Mandatsreferenz +gekennzeichnet, die von uns bei allen SEPA-Lastschrifteinzügen anzugeben sind. Sollten Sie nicht Inhaber des (der) nachfolgend angegebenen +Kontos (Konten) sein, bitten wir Sie, den Kontoinhaber entsprechend zu informieren. +Unsere Gläubiger-ID: DE02DBD00000081995 +Übersicht Ihrer Mandate und Lastschriften zum Stichtag 31.12.2019: +Mandatsreferenz: 9999999999001 (generelle Bankverbindung) +IBAN: DExx xxx5 0101 xxxx xxx0 63 +Lastschrift für Entgelte, Kosten, Steuern und Auslagen +Belastung gemäß AGB 1.12.4 und Preis- und Leistungsverzeichnis +Betrag (EUR) Gemäß Preis- und Leistungsverzeichnis +Rhythmus jährlich +Ausführungstag 30 +Fälligkeitstag Frühestens 2 Bankarbeitstage nach dem Ausführungstag +Datum Ausführung 11.2020 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Depotübersicht +Seite: 3 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Regelmäßige Lastschrift +XF0009994050 00 Nr. 1 +(Deka-BonusRente) +Betrag (EUR) 80,00 +Rhythmus jährlich +Ausführungstag 08 +Fälligkeitstag Frühestens 2 Bankarbeitstage nach dem Ausführungstag +Datum erste Ausführung +Datum letzte Ausführung +Ruhend von - bis +Nächste Dynamisierung + Zeitraum + Betrag (EUR) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 1 +Steuerbescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Max Mustermann , 99999 Stadt, Strasse 8 +werden für das Kalenderjahr 2019 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge nach Berücksichtigung der teilweisen Steuerfreistellung im Sinne des 86,77 KAP: Zeile 7 +§ 20 Abs. 1 Nr. 6 Satz 9 EStG +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG nach 0,00 KAP: Zeile 9 +Teilfreistellung und im Sinne des § 56 Abs. 3 Satz 4 InvStG 2018 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 10 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 11 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 86,77 KAP: Zeile 12 oder 13 +Kapitalertragsteuer 0,00 KAP: Zeile 48 +Solidaritätszuschlag 0,00 KAP: Zeile 49 +Kirchensteuer zur Kapitalertragsteuer KAP: Zeile 50 +Bistum Würzburg 0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 51 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 0,00 KAP: Zeile 52 +Bei Veräußerung/Rückgabe von vor dem 1. Januar 2018 erworbenen Anteilen an 0,00 +ausländschen Investmentsfonds (Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018): +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen +ausschüttungsgleichen Erträge aus Anteilen an ausländischen Investmentfonds im Sinne des +§ 7 Abs. 1 Satz 1 Nr. 3 InvStG 2004 in Verbindung mit § 56 Abs. 3 Satz 6 InvStG 2018. +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Fortsetzung auf Rück-/Folgeseite(n) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 2 +Max Mustermann , 99999 Stadt, Strasse 8 +Bestandsgeschützte Alt-Anteile im Sinne des § 56 Abs. 6 InvStG 2018 wurden veräußert +nur nachrichtlich: +Höhe der Gewinne im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 (nach Teilfreistellung) 0,00 +Höhe der Verluste im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 (nach Teilfreistellung) 0,00 +Die ausgewiesenen Gewinne sind nach § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 steuerfrei, soweit die insgesamt erzielten Wertveränderungen den +persönlichen Freibetrag von 100.000 Euro nicht übersteigen. Die Steuerfreiheit kann nur im Rahmen der Einkommensteuerveranlagung geltend gemacht +werden. +In der nachrichtlichen Angabe wurden auch Gewinne oder Verluste aufgenommen, bei denen Indizien vorliegen, dass es sich um Anteile an +Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 handeln könnte (Anschaffungsdatum zwischen dem 10. November 2007 und dem 31. Dezember +2008, Anschaffungskosten betragen mindestens 100.000 Euro). Bei Anteilen an Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 sind auch die vor +2018 eingetretenen Wertveränderungen steuerpflichtig und der persönliche Freibetrag von 100.000 Euro ist nicht anwendbar (§ 56 Abs. 6 Satz 6 InvStG +2018). +Bei folgenden Anteilen ist im Rahmen der Veranlagung zu klären, ob es sich um Anteile an Investmentfonds im Sinne des +§ 21 Abs. 2a InvStG 2004 handelt: +Bezeichnung ISIN Anzahl der Anteile Gewinn im Sinne des § 56 +Abs. 6 Satz 1 Nr. 2 InvStG +2018 (nach Teilfreistellung) +Bezeichnung ISIN Anzahl der Anteile Verlust im Sinne des § 56 +Abs. 6 Satz 1 Nr. 2 InvStG +2018 (nach Teilfreistellung) +nur nachrichtlich: +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und ein Gewinn/Verlust nach § 56 Abs. 3 Satz 1 InvStG 2018 erzielt (ohne Fälle der +Ersatzbemessungsgrundlage nach § 56 Abs. 3 Satz 4 InvStG 2018): +Bezeichnung ISIN Anzahl der Anteile Gewinn nach § 56 Abs. 3 +Satz 1 InvStG 2018 +Bezeichnung ISIN Anzahl der Anteile Verlust nach § 56 Abs. 3 +Satz 1 InvStG 2018 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 3 +Max Mustermann , 99999 Stadt, Strasse 8 +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und für die Ermittlung des Gewinns nach § 56 Abs. 3 InvStG 2018 ist nach § 56 Abs. 3 Satz 4 InvStG +2018 folgende Ersatzbemessungsgrundlage anwendbar: +Bezeichnung ISIN Anzahl der Anteile Ersatzbemessungsgrundlage +Eine Ersatzbemessungsgrundlage ist anwendbar, wenn der zum Steuerabzug verpflichteten Stelle relevante Informationen, insbesondere zu +der Höhe der Anschaffungskosten, fehlen. Bei Ansatz einer Ersatzbemessungsgrundlage sind Sie verpflichtet, den tatsächlichen +Veräußerungsgewinn gegenüber dem Finanzamt durch geeignete Unterlagen (z. B. Beleg über die Anschaffung der Investmentanteile) +nachzuweisen. Wenn die Ersatzbemessungsgrundlage aufgrund fehlender Informationen über den Rücknahme-, Markt- oder Börsenpreis +zum 31. Dezember 2017 nicht ermittelt werden konnte, ist in der Spalte "Ersatzbemessungsgrundlage" die Angabe "nicht ermittelbar" +auszuweisen. +Gegenüber dem Steuerpflichtigen wurden nach § 44 Abs. 1 EStG die auf Ausschüttungen eines Investmentfonds abgeführte +Kapitalertragsteuer und der darauf entfallende Solidaritätszuschlag erstattet oder es wurde vom Steuerabzug Abstand genommen. Die +Erstattung oder die Abstandnahme wurden für folgende Investmentanteile vorgenommen: +Bezeichnung ISIN Anzahl der Anteile Höhe der nicht steuerbaren +Ausschüttungen im Sinne +des § 17 Abs. 3 InvStG 2018 +pro Anteil +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer 1111111111111 +abgeführt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 + + +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-GlobalChampions CF +ISIN: DE000DK0ECU8 Unterdepot: 00 +Verwahrart: GiroSammel +VL-Vertrag: gesperrt bis zum 31.12.2024, Vertragsinhaber: Max Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 323,62 163,360000 1,981 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Kauf 40,00 175,350000 +0,228 10.01.2019 10.01.2019 +Kauf 40,00 184,960000 +0,216 05.02.2019 05.02.2019 +Ausschüttung / Kauf aus Ertrag 1,46 179,310000 +0,008 15.02.2019 15.02.2019 +Kauf 40,00 189,000000 +0,212 11.03.2019 11.03.2019 +Kauf 40,00 198,430000 +0,202 10.04.2019 10.04.2019 +Kauf 40,00 197,170000 +0,203 09.05.2019 09.05.2019 +Kauf 40,00 195,960000 +0,204 11.06.2019 11.06.2019 +Kauf 40,00 204,340000 +0,196 11.07.2019 11.07.2019 +Kauf 40,00 197,900000 +0,202 12.08.2019 12.08.2019 +Kauf 40,00 204,580000 +0,196 11.09.2019 11.09.2019 +Kauf 40,00 204,160000 +0,196 11.10.2019 11.10.2019 +Kauf 40,00 214,850000 +0,186 11.11.2019 11.11.2019 +Kauf 40,00 217,490000 +0,184 10.12.2019 10.12.2019 +Summe der Betragsbewegungen 480,00 +Bestand am 31.12.2019 956,78 216,760000 4,414 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 2 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 3.460,55 257,080000 13,461 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 54,52 280,920000 +0,194 16.08.2019 16.08.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 4.355,95 319,000000 13,655 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Deka-Technologie TF +ISIN: DE0005152631 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 1.344,75 26,460000 50,822 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 5,08 29,970000 +0,170 22.02.2019 22.02.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 1.885,17 36,970000 50,992 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 3 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 760,99 135,940000 5,598 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 20,88 172,700000 +0,121 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 1.025,82 179,370000 5,719 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 3.995,46 625,170000 6,391 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 14,44 736,070000 +0,020 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 4.998,91 779,740000 6,411 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 4 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 1.197,05 105,060000 11,394 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 4,44 129,150000 +0,034 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 1.489,18 130,310000 11,428 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +DekaLux-Europa TF (A) +ISIN: LU0062625115 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 357,97 51,940000 6,892 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 2,83 62,240000 +0,045 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 442,23 63,750000 6,937 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Fortsetzung auf Seite 5 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 5 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-EuropaBond TF +ISIN: DE0009771980 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 638,75 40,540000 15,756 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 6,14 43,850000 +0,140 16.08.2019 16.08.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 681,94 42,900000 15,896 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 3.105,28 105,100000 29,546 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 11,52 117,600000 +0,098 22.02.2019 22.02.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 4.064,49 137,110000 29,644 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Dieser Depotauszug besteht aus 5 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 999999999999940500 Zertifizierungs-Nr.: 003604 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.05.2049 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +31.12.2018 Deka-BR 100 5.648,89 67,300000 83,936 +Gesamtbestand des Vertrages am 31.12.2018 5.648,89 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Zulagenzahlung 2018 Deka-BR 100 175,00 79,670000 +2,197 16.05.2019 16.05.2019 +Lastschrifteinzug Deka-BR 100 80,00 79,970000 +1,000 11.06.2019 11.06.2019 +Mandatsreferenz: 9999999999001 +Lastschrifteinzug Deka-BR 100 1,17 78,220000 +0,015 25.06.2019 25.06.2019 +Lastschrifteinzug Deka-BR 100 1.120,00 83,750000 +13,373 21.10.2019 21.10.2019 +Mandatsreferenz: 9999999999001 +Lastschrifteinzug Deka-BR 100 1,61 84,870000 +0,019 10.12.2019 10.12.2019 +Bestand am 31.12.2019 Deka-BR 100 8.738,94 86,920000 100,540 +Gesamtbestand des Vertrages am 31.12.2019 8.738,94 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Mitteilung zu Ihrem VL-Vertrag für Max Mustermann +Für Ihren angegebenen vermögenswirksamen Sparvertrag werden wir folgende Daten an die Finanzverwaltung übermitteln. Bitte beachten +Sie, dass eine Übermittlung nur möglich ist, wenn alle unten stehenden Felder vollständig/richtig befüllt sind und kein Widerspruch zur +Datenübermittlung vorliegt. +Vertragsinhaber Mustermann, Max +1. Vertrag 2. Vertrag +Straße, Hausnummer Strasse 8 +Postleitzahl, Wohnort 99999 Stadt +Postalische Ergänzung +Vertragsnummer 11111111111111 +Vermögenswirksame Leistungen 480,00 +(auf volle Euro gerundet) +Steuer-Identifikationsnummer 11111111111 +Geburtsdatum Vertragsinhaber 01.01.1980 +Datenübermittlung Einwilligung liegt vor +Ende der Sperrfrist 31.12.2024 +Institutsschlüssel 1111111 +Meldejahr 2019 +Anlageinstitut, Unternehmen, Empfänger +DekaBank +Deutsche Girozentrale +60625 Frankfurt am Main +Informationen zur elektronischen Vermögensbildungsbescheinigung +Ihre Arbeitnehmer-Sparzulage beantragen Sie weiterhin über Ihre Steuererklärung. Diese Mitteilung ist nicht für die +Finanzverwaltung, sondern nur für Ihre Unterlagen bestimmt. +Liegt uns Ihre Einwilligung zur Datenübermittlung nicht vor oder haben Sie diese widerrufen? +Das erkennen Sie auf Ihrer VL-Mitteilung unter "Datenübermittlung". Liegt uns keine Zustimmung oder ein Widerruf zur +Datenübermittlung vor, werden wir keine Daten an die Finanzverwaltung übermitteln. Eine nachträgliche Zustimmung ist spätestens +bis zum Ablauf des zweiten Kalenderjahres, das auf das Kalenderjahr der Anlage der vermögenswirksamen Leistungen folgt, zu +erteilen. Bitte nutzen Sie hierfür ausschließlich unseren Vordruck "Vermögenswirksamer Sparvertrag in Wertpapieren DekaBank +Depot". Diesen finden Sie auf unserer Homepage www.deka.de unter dem Menüpunkt "Formulare". Alternativ können Sie sich an +Ihren Berater bei der Sparkasse/Landesbank wenden. +Die Daten übermitteln wir ausschließlich elektronisch an die Finanzverwaltung. +Sofern Ihre Daten unvollständig oder fehlerhaft sind, wenden Sie sich bitte an Ihren Berater bei der Sparkasse/Landesbank, da bei +Änderung Ihrer persönlichen Daten eine bestätigte Kopie Ihres aktuellen Legitimationsdokumentes erforderlich ist. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht06.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht06.txt new file mode 100644 index 0000000000..27e4c1eff5 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht06.txt @@ -0,0 +1,298 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- +Jahresdepotauszug per 31.12.2012 +Depotübersicht +Depot: 9999999999 +Depotinhaber: +........ Max Mustermann .... Bankverbindung: +Konto: 0000999999 BLZ: 999 999 99 +Spk Ostunterfranken +Herrn Inh.: Mustermann, Max +Max Mustermann Sparer-Pauschbetrag +Strasse 9 Erteilt 2012: EUR 131,00 +99999 Stadt Beansprucht: EUR 80,24 + +ISIN Unterdepot Bezeichnung Wert Wertentwicklung +in EUR in EUR +per 31.12.2012 * für 2012 +LU0348413815 00 DekaLux-PharmaTech TF 1.749,69 +186,69 +DE0005152631 00 Deka-Technologie TF 578,45 +58,20 +LU0133666759 00 Deka-ConvergenceAktien TF 859,93 +114,37 +LU0052859252 00 DekaLux-Pazifik 2.668,89 +321,68 +LU0062624902 00 DekaLux-Deutschland TF A 926,96 +202,66 +LU0062625115 00 DekaLux-Europa TF 297,22 +32,10 +DE0009771980 00 Deka-EuropaBond TF 594,66 +68,71 +DE0009786285 00 Deka-EuropaPotential TF 1.883,41 +254,42 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 1.399,65 +147,82 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +1.271,80 EUR + Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. + Gesamt in EUR 10.958,86 +1.386,65 +* Beachten Sie hierzu bitte die Erläuterungen unter "Informationen zum DekaBank Depot" auf der Folgeseite. +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Ostunterfranken +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Depotübersicht +Depot: 9999999999 +Depotinhaber: +Max Mustermann +D epotpreis inkl. 19% MwSt: +10,00 EUR wurden für 2012 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. + +Besondere Hinweise zur Deka-BonusRente: +Das Jahresendereporting zur Deka-BonusRente mit der Bescheinigung nach § 92 EStG sowie der Zusatzinformation nach § 7 Abs. 4 +Altersvorsorgeverträge-Zertifizierungsgesetz (AltZertG) geht Ihnen separat zu. Der Versand startet Ende Februar 2013. Sofern Sie die DekaBank per +Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, übernehmen wir dies auf Grundlage der von +Ihnen mitgeteilten Daten. Die Zulage wird nach Eingang Ihrem Deka-BonusRente Vertrag gutgeschrieben. Liegt uns Ihre Zustimmung zur +Datenübermittlung der gezahlten Beiträge zur Beantragung des Sonderausgabenabzugs vor, erfolgt per Datenfernübertragung eine Meldung an die +Deutsche Rentenversicherung Bund - Zentrale Zulagenstelle für Altersvermögen (ZfA). +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + + +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 1.563,00 122,320000 12,778 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 134,330000 +0,000 02.07.2012 02.07.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 1.749,69 136,930000 12,778 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Deka-Technologie TF +ISIN: DE0005152631 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 520,25 10,370000 50,169 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 11,530000 +0,000 28.12.2012 28.12.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 578,45 11,530000 50,169 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 745,56 136,700000 5,454 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 152,790000 +0,000 01.10.2012 01.10.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 859,93 157,670000 5,454 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht +Seite 2 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 2.347,21 405,320000 5,791 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Ausschüttung 54,72 438,170000 +0,125 20.11.2012 20.11.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 2.668,89 451,130000 5,916 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 724,30 67,730000 10,694 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 81,810000 +0,000 01.10.2012 01.10.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 926,96 86,680000 10,694 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +DekaLux-Europa TF +ISIN: LU0062625115 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 265,12 41,870000 6,332 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 45,720000 +0,000 01.10.2012 01.10.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 297,22 46,940000 6,332 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht +Seite 3 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-EuropaBond TF +ISIN: DE0009771980 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 525,95 38,190000 13,772 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Ausschüttung 15,29 40,990000 +0,373 20.08.2012 20.08.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 594,66 42,040000 14,145 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 1.628,99 57,690000 28,237 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 66,700000 +0,000 28.12.2012 28.12.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 1.883,41 66,700000 28,237 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Dieser Depotauszug besteht aus 3 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 999999999999940500 Z ertifizierungs-Nr.: 003604 + +Aktuelle Phase: Ansparphase B eginn der Auszahlungsphase: 01.05.2049 +Übersicht der angesparten Fonds + Fondsname ISIN Verwahrart + Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je A nteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Bestand am 31.12.2011 Deka-BR 100 1.069,92 36,690000 29,161 +Gesamtbestand des Vertrages am 31.12.2011 1.069,92 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Zulagenzahlung 2011 Deka-BR 100 101,91 38,880000 +2,621 21.05.2012 21.05.2012 +Lastschrifteinzug Deka-BR 100 80,00 39,880000 +2,006 08.06.2012 08.06.2012 +Abrechnungsbetrag Thesaurierung Deka-BR 100 4,39 39,790000 +0,110 02.07.2012 02.07.2012 +Bestand am 31.12.2012 Deka-BR 100 1.399,65 41,290000 33,898 +Gesamtbestand des Vertrages am 31.12.2012 1.399,65 + Bewertung mit dem Rücknahmepreis vom 28.12.2012 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Bescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Max Mustermann , 99999 Stadt, Strasse 9 + + werden für das Kalenderjahr 2012 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge 80,24 KAP: Zeile 7 +davon: Gewinn aus Kapitalerträgen im Sinne des § 20 Abs. 2 EStG 0,00 KAP: Zeile 8 +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG 0,00 KAP: Zeile 11 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 12 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 13 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 80,24 KAP: Zeile 14 oder 15 +Kapitalertragsteuer 0,00 KAP: Zeile 50 +Solidaritätszuschlag 0,00 KAP: Zeile 51 +Kirchensteuer zur Kapitalertragsteuer 0,00 KAP: Zeile 52 +0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 53 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 4,78 KAP: Zeile 54 +Ausländischer thesaurierender Investmentfonds vorhanden +nur nachrichtlich: +Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden 9,64 KAP: Zeile 17 +Investmentvermögen +Hierauf entfallende anrechenbare ausländische Steuern 1,31 KAP: Zeile 54 +Bei Veräußerung/Rückgabe von Anteilen 0,00 +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen Erträge +aus Anteilen an ausländischen Investmentvermögen in Fällen des § 7 Abs. 1 Satz 1 Nr. 3 +InvStG +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer +1111111111111 abgeführt. +Das Ankreuzfeld "Ausländischer thesaurierender Investmentfonds vorhanden" bezieht sich auf den Stichtag 31.12. +Bei der inländischen Thesaurierung für den LINGOHR-EUROPA-SYSTEMATIC-LBB-INVEST (DE0005320097) und den +LINGOHR-SYSTEMATIC-LBB-INVEST (DE0009774794) vom 3. Januar 2012 konnte ein Kirchensteuerabzug nicht berücksichtigt werden. Bitte +holen Sie die Besteuerung in der Veranlagung nach, wenn Sie kirchensteuerpflichtig sind (siehe Informationen zum DekaBank Depot). +Der Thesaurierungsbetrag aus der Zeile "nur nachrichtlich: Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden +Investmentvermögen" wurde nicht der Kapitalertragsteuer unterworfen. Deshalb müssen Sie diesen Betrag gegebenenfalls in Ihrer +Steuererklärung angeben. Bei Fragen wenden Sie sich bitte an Ihren steuerlichen Berater oder an Ihr Finanzamt. +Zusätzliche Informationen zu Ihrer Steuerbescheinigung finden Sie auf der Rück-/Folgeseite und in den Informationen zum DekaBank Depot. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Max Mustermann , 99999 Stadt, Strasse 9 +Aufgrund rechtlicher Vorgaben sind anrechenbare Quellensteuer und Verluste bzw. gezahlte Zwischengewinne grundsätzlich direkt mit +positiven Kapitalerträgen zu verrechnen. Abweichend hiervon ist die Verrechnung jedoch für bestimmte Konstellationen ausgeschlossen, dies +gilt insbesondere bei der Abwicklung von Nachlassfällen oder bei Wechsel des Steuerstatus von Steuerinländer in Steuerausländer oder +umgekehrt. Daher erhalten Sie den nachfolgenden Verlustausweis bzw. den Ausweis anrechenbarer ausländischer Steuer. Die Beträge +können im Rahmen der Veranlagung geltend gemacht werden. +Betrag EUR +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 1,31 +(inklusive der anrechenbaren ausländischen Steuer aus ausländischen thesaurierenden Investmentfonds) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Jahresbericht01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht07.txt similarity index 99% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Jahresbericht01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht07.txt index b4cd1a433d..bb4848ee7f 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Jahresbericht01.txt +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht07.txt @@ -4,7 +4,7 @@ Portfolio Performance Version: 0.61.3 DekaBank Herrn Deutsche Max Mustermann -Stöckach Girozentrale +Musterstraße Girozentrale Franken 7 88888 Dorf Januar 2023 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht08.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht08.txt new file mode 100644 index 0000000000..649e419d75 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht08.txt @@ -0,0 +1,330 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.0 +----------------------------------------- +DekaBank +Herrn Deutsche +Max Mustermann +Strasse. 8 Girozentrale +99999 Stadt +April 2023 +Depotservice +DekaBank Depot +60625 Frankfurt am Main +DekaBank Depot Nr. 9999999999 Telefon (0 69) 71 47 - 9 99 +Ihr Bericht für das erste Quartal 2023 Telefax (0 69) 25 46 - 24 83 +www.deka.de +Sehr geehrter Herr Mustermann, +Vorstand +Dr. Georg Stocker +der Start in das neue Jahr begann vielversprechend – die Kurse haben in den ersten (Vorsitzender) +Dr. Matthias Danne +Wochen des Jahres deutlich zugelegt. Doch die ausgeprägten Kursschwankungen zeigen (Stellv. Vorsitzender) +auch, dass die Märkte nach der Rückkehr der Inflation auf der Suche nach einem neuen Birgit Dietl-Benzin +Daniel Kapffer +Gleichgewicht sind. Zum einen haben die Notenbanken in den letzten Monaten durch Torsten Knapmeyer +die Erhöhung der Leitzinsen beherzt die geldpolitischen Zügel angezogen und damit Martin K. Müller +ihren Willen demonstriert, die Inflation im Zaum zu halten. Zum anderen keimt die Hoff- Verwaltungsratsvorsitzender +nung auf, dass die Wende hin zu sinkenden Leitzinsen schon bald erfolgen könnte. Helmut Schleweis +Entsprechend sind die Aktien- und Rentenmärkte hin- und hergerissen. Dieser Findungs- +prozess dürfte noch geraume Zeit anhalten. USt-Id-Nr. +DE 114103563 +Gerade in solch einer Phase der Neuorientierung empfiehlt sich neben der Einmalanlage +in Wertpapieren das regelmäßige Investieren in Form eines Wertpapiersparplans. Da- Handelsregister +Amtsgericht +durch werden Schwankungen ausgeglichen und der langfristige Erfolg in den Vorder- Frankfurt am Main +grund gestellt. HRA 16068 +Sitz +Wenn Sie sich für die Gründe und Hintergründe von aktuellen Marktbewegungen Frankfurt am Main, Berlin +interessieren und sich fragen, in welcher Form Themen aus Wirtschaft und Politik die +Märkte bewegen, dann hören Sie doch einfach mal in unseren Podcast "Mikro trifft +Makro" rein. Hier sprechen Deka-Chefvolkswirt Dr. Ulrich Kater und Moderator Dirk +Huesmann über tagesaktuelle Ereignisse aus den Medien und erläutern auf unterhalt- +same Weise das Marktgeschehen sowie grundlegende Marktmechanismen und +-zusammenhänge. Mehr Informationen hierzu finden Sie am Ende dieses Anschreibens. +Anliegend senden wir Ihnen zu Ihrem Depot den Bericht für das erste Quartal 2023 +sowie, zu Ihrer Information, den Kostenausweis für das Jahr 2022. Erläuterungen zum +Kostenausweis stehen für Sie unter der Überschrift „Kosteninformationen“ auf: +deka.de/privatkunden/depotberichte bereit. +jcbZ8XRrRjcbZ +Sie nutzen noch nicht die Onlinefunktionen für Ihr DekaBank Depot? ZlXZgQg3:ZlXZ99bSWwQVQ999P +kfjqRXRqVK;M8 +Dann aktivieren Sie einfach die Online-Funktion für Ihr Depot. Scannen Sie x9rffQbSISaoRX99Lrf3QnvrM8 +jc999ZNSuSkGZ +bitte den nebenstehenden QR-Code oder geben Sie www.deka.de/online ZlXZuw83uURtZ99zPzt00t0zzP +ein, um von ermäßigten Depot-Gebühren und aktuellen Informationen rund +um Ihre Geldanlage zu profitieren. +Sie haben Fragen zu Ihren Unterlagen? Sie erreichen uns montags bis freitags von 8.00 +bis 18.00 Uhr telefonisch unter (0 69) 71 47 – 9 99. Wir sind gerne für Sie da. +Beste Grüße +DekaBank +Deutsche Girozentrale +Frank Kalter Dr. Olaf Heinrich +Leiter Vertriebs-, Produktmanagement Leiter Digitales Multikanalmanagement +und Marketing +Hörenswert: Die Podcast-Serie +"Mikro trifft Makro - das Finanzmarktgespräch" +jcbZ8XgmHiei2jcbZ +Wie funktioniert Volkswirtschaft? ZlXZgQRdIpwnPZlXZccbSWwPXuXxZuaaaP +Wie beeinflussen aktuelle Themen aus 2qUq8XgmpboKDSCxR5OxVhSRdHD3fjIWJX +Z8oqsD3SwobMMBHeR +Wirtschaft und Politik die Märkte? 9iGWK2NgQ4FRCDFM8 +ZqbMwU8BbamJ9ZroR +Im Podcast "Mikro trifft Makro" sprechen S3SRZBqsBNrYjbxE8Zs:ZKXh8W7Bzwqkg2 +Deka-Chefvolkswirt Dr. Ulrich Kater und ucSZkMPICQvkGz4Y0 +Moderator Dirk Huesmann über alles, was die Welt, die +Börsen und Sie bewegt. +Reinhören lohnt sich. +www.deka.de/privatkunden/aktuelles/mikro-trifft-makro +Quartalsbericht per 31.03.2023 +Depotübersicht +Seite: 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Herrn +Max Mustermann +Strasse. 8 +99999 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 31.03.2023 seit 01.01.2023 1 +DE000DK0ECU8 00 Deka-GlobalChampions CF 2.791,34 +188,42 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Max Mustermann +LU0348413815 00 Deka-Nachhaltigkeit Gesundheit TF 5.194,08 -273,88 +LU0052859252 00 DekaLuxTeam-Aktien Asien 5.331,36 +151,85 +DE0009786285 00 Deka-EuropaPotential TF 4.031,56 +152,59 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 10.562,20 +293,07 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +6.235,13 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. +Gesamt in EUR 27.910,54 +512,05 +1 Hinweis: Der letzte Handelstag kann stichtagsbezogen vom Quartalsultimo abweichen. +Wichtiger Hinweis zu MiFID: +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Hinweis zur Wertentwicklung: +Wir weisen ausdrücklich darauf hin, dass im Markt unterschiedliche Berechnungsmethoden zur Ermittlung der Wertentwicklung verwendet +werden (z.B. geldgewichtete oder zeitgewichtete Berechnungsmethode). Bei Verwendung unterschiedlicher Berechnungsmethoden ist es +möglich, dass die in anderen Informationen ausgewiesenen Wertentwicklungen von der in dieser Information dargestellten Wertentwicklung +abweichen. +Hinweise zum Berater: +Wenn Sie eine Beratung zu Ihren bereits gehaltenen Wertpapieren oder zum Erwerb weiterer Wertpapiere wünschen, sprechen Sie Ihre +Kundenberaterin oder Ihren Kundenberater bei der Sparkasse Schweinfurt-Haßberge an. Diese beraten Sie gerne. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 9 99 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 31.03.2023 +Depotübersicht +Seite: 2 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Ressourcen, Zeit und Geld sparen: Mit einem Online-Zugang haben Sie von überall und jederzeit Zugriff auf Ihr DekaBank Depot sowie die +dazugehörigen Dokumente, z.B. auch über die S-Invest App (www.deka.de/s-invest). +Außerdem helfen Sie dabei, wichtige Ressourcen zu schonen! Jedes auf die Online-Nutzung umgestellte DekaBank Depot bedeutet ca. +6 Briefe im Jahr weniger, die verschickt werden müssen. Und Sie profitieren durch den reduzierten Depotpreis. Weitere Informationen zur +Online-Freischaltung erhalten Sie unter www.deka.de/online oder in Ihrer Sparkasse. +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 9 99 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 31.03.2023 +Umsatzübersicht +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-GlobalChampions CF +ISIN: DE000DK0ECU8 Unterdepot: 00 +Verwahrart: GiroSammel +VL-Vertrag: gesperrt bis zum 31.12.2024, Vertragsinhaber: Max Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 01.01.2023 2.482,92 241,130000 10,297 +Bewertung mit dem Rücknahmepreis vom 30.12.2022 +Kauf 40,00 261,390000 +0,153 23.01.2023 23.01.2023 +Ausschüttung / Kauf aus Ertrag 45,04 255,950000 +0,176 10.02.2023 10.02.2023 +Kauf 40,00 264,640000 +0,151 21.02.2023 21.02.2023 +Kauf 40,00 258,950000 +0,154 21.03.2023 21.03.2023 +Summe der Betragsbewegungen 120,00 +Bestand am 31.03.2023 2.791,34 255,360000 10,931 +Bewertung mit dem Rücknahmepreis vom 31.03.2023 +Deka-Nachhaltigkeit Gesundheit TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 01.01.2023 5.467,96 400,290000 13,660 +Bewertung mit dem Rücknahmepreis vom 30.12.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 31.03.2023 5.194,08 380,240000 13,660 +Bewertung mit dem Rücknahmepreis vom 31.03.2023 +Bitte prüfen Sie die vorliegenden Informationen. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 9 99 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 31.03.2023 +Umsatzübersicht +Seite 2 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 01.01.2023 5.179,51 797,830000 6,492 +Bewertung mit dem Rücknahmepreis vom 30.12.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 31.03.2023 5.331,36 821,220000 6,492 +Bewertung mit dem Rücknahmepreis vom 31.03.2023 +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 01.01.2023 3.878,97 130,790000 29,658 +Bewertung mit dem Rücknahmepreis vom 30.12.2022 +Ausschüttung / Kauf aus Ertrag 69,10 138,830000 +0,498 24.02.2023 24.02.2023 +Summe der Betragsbewegungen 0,00 +Bestand am 31.03.2023 4.031,56 133,690000 30,156 +Bewertung mit dem Rücknahmepreis vom 31.03.2023 +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 9 99 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 31.03.2023 +Umsatzübersicht Deka-BonusRente +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 999999999999940500 Zertifizierungs-Nr.: 003604 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.05.2049 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +Bestand am 01.01.2023 Deka-BR 100 10.269,13 97,240000 105,606 +Gesamtbestand des Vertrages am 01.01.2023 10.269,13 +Bewertung mit dem Rücknahmepreis vom 31.12.2022 +Steuererstattung Deka-BR 100 1,57 98,050000 +0,016 06.01.2023 06.01.2023 +Bestand am 31.03.2023 Deka-BR 100 10.562,20 100,000000 105,622 +Gesamtbestand des Vertrages am 31.03.2023 10.562,20 +Bewertung mit dem Rücknahmepreis vom 31.03.2023 +Bitte prüfen Sie die vorliegenden Informationen. +Dieser Report besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 9 99 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 1 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Herrn +Max Mustermann +Strasse. 8 +99999 Stadt +31.03.2023 +Informationen über Kosten und Nebenkosten für das Jahr 2022 +Sehr geehrter Herr Mustermann, +seit dem 3.1.2018 gelten neue gesetzliche Regelungen für das Wertpapiergeschäft. Diese beruhen auf der EU-Finanzmarkt-Richtlinie +MiFID II und setzen neue Standards für Ihren Schutz als Anleger. Zur Erfüllung der Vorgabe des Art. 50 der Verordnung (EU) 2017/565 +erhalten Sie jährlich diese Aufstellung. Sie verschafft Ihnen die Transparenz über die im abgelaufenen Jahr angefallenen Produkt- und +Dienstleistungskosten für die von Ihnen gehalten Finanzinstrumente bzw. damit verbundenen Dienstleistungen. +Die nachfolgend aufgeführten Kosten und Nebenkosten im Zusammenhang mit Ihrem Depot sind dem Vorjahr zuzuordnen +und wurden bereits beglichen. Die Darstellung dient daher ausschließlich Ihrer Information. Das gilt auch für den Fall, dass +Sie Ihr Depot bereits aufgelöst haben. +Eine dieser Regelungen betrifft die gesetzlich verpflichtende Information über alle angefallenen Kosten und Nebenkosten des vergangenen +Jahres für Ihre Wertpapiere und den damit verbundenen Dienstleistungen. +Unter den Produktkosten werden produktinterne Kosten ausgewiesen, die im Produktpreis selbst bereits berücksichtigt sind. Unter den +Dienstleistungskosten wird u.a. der Ausgabeaufschlag von Fonds oder Zertifikaten ausgewiesen. Außerdem werden Vertriebsprovisionen +auf Bestände den Dienstleistungskosten zugerechnet. Ihnen entstehen aus der Gewährung von Zuwendungen keine zusätzlichen Kosten, +da diese bereits in den Dienstleistungskosten enthalten sind. +Wenn Sie Fragen haben, rufen Sie an, schreiben Sie oder sprechen Sie mit Ihrem Berater der Sparkasse / Landesbank. Uns erreichen Sie +montags bis freitags von 8.00 bis 18.00 Uhr unter der Servicenummer (0 69) 71 47 - 9 99. Wir sind gern für Sie da. +Weitergehende Informationen über Kosten und Nebenkosten finden Sie im Internet unter www.deka.de/pflicht. +Informationen zum Dienstleistungs- ... davon Produktkosten Fremdwährungs- Summe je +Finanzinstrument kosten Zuwendungen kosten Produkt/ISIN1 +in EUR in EUR in EUR in EUR in EUR +Deka-BR 100 37,72 37,72 96,59 0,00 134,31 +DE0005424519 +Deka-EuropaPotential TF 54,46 54,46 70,11 0,00 124,57 +DE0009786285 +Deka-GlobalChampions CF 28,33 28,33 28,16 0,00 56,49 +DE000DK0ECU8 +DekaLuxTeam-Aktien Asien 23,51 23,51 73,62 0,00 97,13 +LU0052859252 +Deka-Nachhaltigkeit GesundheitTF 63,10 63,10 61,12 0,00 124,22 +LU0348413815 +Übergreifende Kosten 22,50 0,00 0,00 0,00 22,50 +1 Die hier aufgeführten Kosten mindern die Wertentwicklung der dargestellten Finanzinstrumente. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 9 99 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 2 +Depot: 9999999999 +Depotinhaber: +Max Mustermann +Informationen zum Dienstleistungs- ... davon Produktkosten Fremdwährungs- Summe je +Finanzinstrument kosten Zuwendungen kosten Produkt/ISIN1 +in EUR in EUR in EUR in EUR in EUR +Fortsetzung von vorheriger Seite +Gesamtkosten 559,22 +1 Die hier aufgeführten Kosten mindern die Wertentwicklung der dargestellten Finanzinstrumente. +Kostenzusammenfassung +Ein-/Ausstiegskosten Laufende Kosten Gesamtkosten +(einmalig) in EUR +in EUR in % 2 in EUR in % 3 +Dienstleistungskosten 17,40 2,77 212,22 0,74 229,62 + davon Zuwendungen an DekaBank FFM 11,64 1,85 0,00 0,00 11,64 + davon Zuwendungen an SK Schweinfurt-Haßb. 5,76 0,92 189,72 0,66 195,48 +Produktkosten 0,00 0,00 329,60 1,15 329,60 +Fremdwährungskosten 0,00 0,00 0,00 0,00 0,00 +Gesamtkosten 17,40 2,77 541,82 1,90 559,22 +2 Prozentwert bezogen auf das Umsatzvolumen in Höhe von 628,83 EUR +3 Prozentwert bezogen auf den bewerteten Durchschnittsbestand von 28.565,49 EUR +Erläuterungen +Die Aufstellung enthält die im angegebenen Berichtszeitraum angefallenen Kosten und Zuwendungen für die aufgeführten +Finanzinstrumente sowie die erbrachten Wertpapierdienstleistungen sowie Wertpapiernebendienstleistungen. +Die Kosten sind, soweit möglich, den einzelnen Finanzinstrumenten direkt zugeordnet. Übergreifende Kosten sind separat ausgewiesen (z.B. +Depotpreis), diese werden nicht auf die gehaltenen Finanzinstrumente verteilt. +Für Depots der Vermögensverwaltung werden pauschale Vermögensverwaltungskosten als übergreifende Kosten ausgewiesen; ggf. können +sich übergreifende Kosten auch auf Vermögensgegenstände beziehen, die nicht der Depotverwahrung unterliegen. +Der Ausweis der Kosten erfolgt nach dem modifizierten Zuflussprinzip. Das heißt, die Darstellung enthält die Zahlungen, die im +Berichtszeitraum verursacht und bis zu einem bestimmten Stichtag tatsächlich geflossen sind. Damit werden Kosten weitgehend dem Jahr +zugeordnet, in dem sie wirtschaftlich angefallen sind. +Hinsichtlich der Kosten beruht diese Aufstellung auch auf der Datenbereitstellung der Emittenten und Kapitalverwaltungsgesellschaften. +Waren zum Zeitpunkt der Erstellung die tatsächlich angefallenen Kosten nicht bekannt, wurden die voraussichtlichen Kosten zur Berechnung +herangezogen. +Unter den Zuwendungen werden Zahlungen an das vermittelnde Institut ausgewiesen. Dabei handelt es sich in der Regel um +Vertriebsvergütungen. Zuwendungen sind bereits in den aufgeführten Kosten enthalten. +Während die angegebenen Kosten die eventuell anfallende Umsatzsteuer beinhalten, werden Zuwendungen ohne Umsatzsteuer +ausgewiesen, da diese netto gezahlt werden. +Im Rahmen einer Gesamtbetrachtung werden die einmaligen Kosten dem Umsatzvolumen der Berichtsperiode und die laufenden Kosten dem +in der Berichtsperiode durchschnittlich investierten Kapital gegenübergestellt. Diese Angaben erfolgen als Prozentsatz. Das durchschnittlich +investierte Kapital im Kalenderjahr wird ermittelt, indem der Depotbestand zu jedem Tagesende über das Jahr ermittelt und der Durchschnitt +auf dieser Basis berechnet wird. +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 9 99 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht09.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht09.txt new file mode 100644 index 0000000000..165cae64da --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht09.txt @@ -0,0 +1,470 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Depot für InvestmentFonds +Depotübersicht zum 31.12.2005 DekaBank +Deutsche Girozentrale +60625 Frankfurt +Telefon (0 69) 71 47 - 6 52 Depot-/Investmentservice +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Freistellungsauftrag +Erteilt 2005: EUR 205,00 +Herrn Beansprucht: EUR 108,13 +Richard Mustermann +Musterstraße 9 +11111 Stadt +ISIN Unterkonto Bezeichnung Bestand in Preis je Stück in Kurswert in EUR +Stück Fondswährung per 31.12.2005 +per 31.12.2005 +DE0008474511 847451 00 AriDeka 9,135 61,490000 EUR 561,71 + (Anteile gemäß VermBG gesperrt bis zum: 31.12.2010) +LU0052859252 973242 00 DekaLux-Pazifik 5,475 386,610000 EUR 2.116,69 +LU0062624902 974587 00 DekaLux-Deutschland TF 20,130 70,560000 EUR 1.420,37 +DE0009771824 977182 00 Deka-Geldmarkt: Euro TF 0,913 64,500000 EUR 58,89 +DE0009771980 977198 00 Deka-EuropaBond TF 43,494 40,200000 EUR 1.748,46 +DE0009786285 978628 00 Deka-EuropaPotential TF 45,986 67,740000 EUR 3.115,09 +IE0004907972 987887 00 DekaTeam-EmergingMarkets CF 26,268 59,170000 EUR 1.554,28 +IE0005258151 989094 00 Deka-PharmaTech TF 39,168 44,150000 EUR 1.729,27 +Gesamt in EUR 12.304,76 + + +Depotpreis incl. 16% MWSt: 10,00 belastet im Depot 0111111111 974587 00 +E ntgelte werden gemäß Preisverzeichnis erhoben. + + +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +WICHTIGE HINWEISE Steuerfreie Erträge nach dem Doppelbesteuerungsabkommen +unterliegen nicht der deutschen Einkommensteuer aber dem +Umsatz-Jahresübersicht sogenannten Progressionsvorbehalt und sind daher in der Anlage AUS +auszuweisen. +Verwahrung des Anteilsbestandes: +Weitere Informationen erhalten Sie bei Ihrem Steuerberater. +Die Anteile werden im Girosammel-Depot oder in Form einer Gutschrift +in Wertpapierrechnung verwahrt. Die Anteilbruchteile stellen das +Beanspruchter Freistellungsauftrag für das Kalenderjahr 2005: +Miteigentum an einer Bruchteilgemeinschaft dar. +Aufgrund der gesetzlichen Bestimmungen muss der im Kalenderjahr +2005 benötigte Freistellungsauftrag auf die verschiedenen Erträge +Der Wert der Anteile berechnet sich aus dem Bestand in Stück +aufgeteilt, ausgewiesen werden. Die Höhe des von Ihnen erteilten +multipliziert mit dem Preis je Stück zum 31. Dezember 2005. +Freistellungsauftrages entnehmen Sie bitte dem Kopfteil Ihrer +Depotübersicht. Bitte beachten Sie, dass die Bemessungsgrundlage für +Jahres-Steuerbescheinigung 2005: die Zinsabschlagsteuer und die Einkommensteuer in vielen Fällen nicht +Wurde Ihnen im Kalenderjahr 2005 Zinsabschlagsteuer und identisch ist. Deshalb kann die Höhe des beanspruchten +Solidaritätszuschlag einbehalten oder Kapitalertragsteuer (20 %) auf Freistellungsauftrages von den "inländischen bzw. ausländischen +inländische Dividendenanteile nicht voll bzw. gar nicht erstattet, Kapitalerträgen aus Investmentanteilen bei Privatvermögen" +erhalten Sie mit dem Depot-Jahresauszug zum 31. Dezember 2005 abweichen. +eine Jahres-Steuerbescheinigung. In der tabellarischen +Zusammenfassung sind die jeweiligen Summen angedruckt. Wurden Werbungskosten: +keine deutschen Steuern einbehalten, entfällt die Werbungskosten, z.B. Depotpreis, die Ihnen im Zusammenhang mit +Jahres-Steuerbescheinigung. +Ihren Investmentanteilen entstanden sind, müssen im Rahmen der +Einkommensteuererklärung auf die Kapitalerträge, die dem +Jahresbescheinigung 2005: Halbeinkünfteverfahren unterliegen und die übrigen steuerpflichtigen +Mit in Kraft treten des Steueränderungsgesetzes 2003 sind Kapitalerträge aufgeteilt werden. Aufteilungsmaßstab kann hierbei das +Kreditinstitute verpflichtet, für die bei ihnen geführten Depots eine Verhältnis der voll steuerpflichtigen Erträge zu den Erträgen, die dem +Jahresbescheinigung zu erstellen. Sind im Kalenderjahr 2005 Halbeinkünfteverfahren unterliegen, sein. +Kapitalerträge oder private Veräußerungsgeschäfte angefallen, werden +Ihnen diese zum 31. Dezember 2005 in der Jahresbescheinigung Bescheinigung vermögenswirksamer Leistungen für 2005: +ausgewiesen. Wenn in Ihrem Depot vermögenswirksame Leistungen (VL) verwahrt +werden, erhalten Sie mit dem Depot-Jahresauszug zum 31. Dezember +Die gesetzliche Verpflichtung zur Erstellung besteht gegenüber +2005 eine Bescheinigung der im Kalenderjahr 2005 eingezahlten +unbeschränkt einkommensteuerpflichtigen natürlichen Personen. +VL-Leistungen. Bitte fügen Sie diese Bescheinigung Ihrer +Haben Sie mehr als ein Depot in unserem Hause, dann können die +Einkommensteuererklärung bei. Sie dient als Antrag zur Gewährung +Angaben von mehreren Depots in einer Jahresbescheinigung +einer Sparzulage. +zusammengefasst sein. Bei betrieblichen Konten besteht keine +Verpflichtung zur Ausstellung einer Jahresbescheinigung, wenn das +Zahlungseingänge, die nicht mehr im Kalenderjahr 2005 erfolgen, (z.B. +Institut weiß, dass es sich um ein betriebliches Depot handelt. +im Januar 2006 für Dezember 2005) werden erst in der Bescheinigung +für das Kalenderjahr 2006 ausgewiesen. +Inländische Kapitalerträge aus Investmentanteilen bei +Privatvermögen errechnen sich aus dem steuerpflichtigen Anteil von Sollten auf Ihrem Vertrag Zahlungseingänge fehlen, fragen Sie bitte +Ausschüttungen und Thesaurierungen des Kalenderjahres 2005 erst bei Ihrem Arbeitgeber nach, auf welches Konto die +bezogen auf deutsche Fonds. In der Jahresbescheinigung sowie der vermögenswirksamen Leistungen überwiesen wurden. Erst mit dieser +Jahres-Steuerbescheinigung erfolgt der Ausweis in den Information können wir die Zahlungseingänge überprüfen. +Einzelpositionen "Zinsen und andere Erträge (ohne Dividenden) aus +Investmentanteilen" und "Dividenden und ähnliche Erträge Vermögensbeteiligungen gem. Paragraph 19a EStG: +(Halbeinkünfteverfahren) aus Investmentanteilen". Die gesetzliche Sperrfrist von sechs Jahren ist seit dem +Steueränderungsgesetz 2001 entfallen. Die Vermögensbeteiligungen +Ausländische Kapitalerträge aus Investmentanteilen bei sind frei verfügbar. Ggf. sind zivilrechtlich vereinbarte Haltedauern +Privatvermögen errechnen sich analog, aber bezogen auf Fonds, die zwischen Arbeitnehmer und Arbeitgeber zu beachten. +nach dem für Großbritannien, Irland, Luxemburg und die Schweiz +geltendem Recht aufgelegt wurden. In der Jahresbescheinigung sowie Zinsinformationsverordnung: +der Jahres-Steuerbescheinigung erfolgt der Ausweis in den Aufgrund der am 01. Juli 2005 in Kraft getretenen +Einzelpositionen "Zinsen und andere Erträge (ohne Dividenden) aus +Zinsinformationsverordnung (auf Grundlage der EU-Zinsrichtlinie 2003/ +Investmentanteilen", "Dividenden und ähnliche Erträge +48 / EG des Rates vom 03. Juni 2003) ist die DekaBank verpflichtet, +(Halbeinkünfteverfahren) aus ausländischen Investmentanteilen" und +Zinserträge von wirtschaftlichen Eigentümern mit ausländischem +"Erträge aus ausländischen Investmentanteilen". +Wohnsitz innerhalb der angeschlossenen EU-Staaten an das +Bundesamt für Finanzen zu melden. +Die Positionen anrechenbare Kapitalertragsteuer (20 % ) und Dieser Richtlinie unterliegen alle Depots von Privatanlegern, die in +anrechenbarer Zinsabschlag (30 %) und anrechenbarer einem anderen Mitgliedstaat der Europäischen Union ansässig sind. +Solidaritätszuschlag werden in der Jahres-Steuerbescheinigung Ziel dieser Richtlinie ist es, innerhalb der Europäischen Union durch +ausgewiesen. Damit kann eine Anrechnung im Rahmen der Austausch von Informationen eine effektive Besteuerung von +Einkommensteuererklärung erfolgen. Zinserträgen zu ermöglichen. Dazu gehören nach den Bestimmungen +der Zinsinformationsverordnung, unter Beachtung bestimmter +Ausländische Quellensteuern können in der Anlage AUS der Sonderregelungen, auch solche Zinserträge, die im Rahmen von +Einkommensteuererklärung ausgewiesen werden. Ausschüttungen oder Anteilscheinrückgaben von Investmentfonds +gezahlt werden. +Depot für InvestmentFonds +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2005 Seite 1 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +AriDeka/ ISIN: DE0008474511 +Unterkonto: 847451 00 Verwahrart: GiroSammel +Anteile gemäß VermBG gesperrt bis zum: 31.12.2010 + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 131,76 ********** 50,520000 2,608 ******** ******** +Kauf 34,00 54,000000 + 0,630 31.01.2005 31.01.2005 +Abrechnungsbetrag Ausschüttung 1,69 52,470000 + 0,032 18.02.2005 18.02.2005 +Kauf 34,00 55,240000 + 0,615 28.02.2005 28.02.2005 +Kauf 34,00 54,640000 + 0,622 30.03.2005 30.03.2005 +Kauf 34,00 53,450000 + 0,636 28.04.2005 28.04.2005 +Kauf 34,00 55,880000 + 0,608 30.05.2005 30.05.2005 +Kauf 34,00 57,810000 + 0,588 29.06.2005 29.06.2005 +Kauf 34,00 60,310000 + 0,564 29.07.2005 29.07.2005 +Kauf 34,00 59,370000 + 0,573 30.08.2005 30.08.2005 +Kauf 34,00 62,280000 + 0,546 29.09.2005 29.09.2005 +Kauf 34,00 59,280000 + 0,574 28.10.2005 28.10.2005 +Kauf 34,00 63,090000 + 0,539 30.11.2005 30.11.2005 +Bestand am 31.12.2005 561,71 ********** 61,490000 9,135 ******** ******** +DekaLux-Pazifik/ ISIN: LU0052859252 +Unterkonto: 973242 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 1.204,00 ********** 290,260000 4,148 ******** ******** +Abrechnungsbetrag Ausschüttung 58,11 360,610000 + 0,161 21.11.2005 21.11.2005 +Lastschrifteinzug 440,00 377,340000 + 1,166 22.11.2005 22.11.2005 +Bestand am 31.12.2005 2.116,69 ********** 386,610000 5,475 ******** ******** +DekaLux-Deutschland TF/ ISIN: LU0062624902 +Unterkonto: 974587 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 1.591,34 ********** 56,110000 28,361 ******** ******** +Lastschrifteinzug 1.000,00 59,320000 + 16,858 28.06.2005 28.06.2005 +Verkauf 1.594,00 63,760000 - 25,000 09.08.2005 09.08.2005 +Abrechnungsbetrag Ausschüttung 3,64 67,210000 + 0,054 21.11.2005 21.11.2005 +Depotpreis 10,00 69,740000 - 0,143 16.12.2005 16.12.2005 +Bestand am 31.12.2005 1.420,37 ********** 70,560000 20,130 ******** ******** +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +Depot für InvestmentFonds +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2005 Seite 2 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Deka-Geldmarkt: Euro TF/ ISIN: DE0009771824 +Unterkonto: 977182 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 58,03 ********** 63,840000 0,909 ******** ******** +Kauf aus Ertrag 0,28 63,520000 + 0,004 03.01.2005 03.01.2005 +Abrechnungsbetrag Thesaurierung 0,00 64,500000 0,000 30.12.2005 30.12.2005 +Bestand am 31.12.2005 58,89 ********** 64,500000 0,913 ******** ******** +Deka-EuropaBond TF/ ISIN: DE0009771980 +Unterkonto: 977198 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 320,16 ********** 40,020000 8,000 ******** ******** +Lastschrifteinzug 400,20 40,020000 + 10,000 03.01.2005 03.01.2005 +Lastschrifteinzug 283,36 40,480000 + 7,000 01.02.2005 01.02.2005 +Lastschrifteinzug 327,12 40,890000 + 8,000 02.03.2005 02.03.2005 +Lastschrifteinzug 324,88 40,610000 + 8,000 01.04.2005 01.04.2005 +Abrechnungsbetrag Ausschüttung 99,63 39,950000 + 2,494 22.08.2005 22.08.2005 +Bestand am 31.12.2005 1.748,46 ********** 40,200000 43,494 ******** ******** +Deka-EuropaPotential TF/ ISIN: DE0009786285 +Unterkonto: 978628 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 1.535,11 ********** 48,970000 31,348 ******** ******** +Kauf aus Ertrag 0,08 49,480000 + 0,002 03.01.2005 03.01.2005 +Lastschrifteinzug 400,00 68,330000 + 5,854 04.10.2005 04.10.2005 +Lastschrifteinzug 560,00 63,770000 + 8,782 21.11.2005 21.11.2005 +Abrechnungsbetrag Thesaurierung 0,00 67,740000 0,000 30.12.2005 30.12.2005 +Bestand am 31.12.2005 3.115,09 ********** 67,740000 45,986 ******** ******** +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 3 +Depot für InvestmentFonds +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2005 Seite 3 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +DekaTeam-GlobalSelect TF/ ISIN: IE0002262826 +Unterkonto: 987318 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 744,33 ********** 32,190000 23,123 ******** ******** +Abrechnungsbetrag Ausschüttung 3,70 36,930000 + 0,100 22.08.2005 22.08.2005 +Verkauf 911,50 39,250000 - 23,223 21.11.2005 21.11.2005 +Bestand am 31.12.2005 0,00 ********** 40,580000 0,000 ******** ******** +DekaTeam-EmergingMarkets CF/ ISIN: IE0004907972 +Unterkonto: 987887 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 996,28 ********** 38,590000 25,817 ******** ******** +Abrechnungsbetrag Ausschüttung 21,94 48,700000 + 0,451 22.08.2005 22.08.2005 +Bestand am 31.12.2005 1.554,28 ********** 59,170000 26,268 ******** ******** +Deka-PharmaTech TF/ ISIN: IE0005258151 +Unterkonto: 989094 00 Verwahrart: GiroSammel +Am 22. August 2005 erfolgte eine Ertragsausschüttung, bei der die Kapitalertragsteuer den Ausschüttungsbetrag überstieg. Aufgrund +einer gesetzlichen Änderung, ist in diesem Fall eine Teilausschüttung und eine Thesaurierung zum Geschäftsjahresende des Fonds +notwendig. Dies wurde uns seitens der Kapitalanlagegesellschaft erst nach der Buchung mitgeteilt. Deshalb wurde erneut eine +Ertragsausschüttung ohne Berechnung von Kapitalertragsteuer am 09. September 2005, auf Ihren Anteilsbestand zum 22. August 2005, +gebucht. Zusätzlich wurde eine Thesaurierung mit den steuerrelevanten Daten am 14. September 2005, auf Ihren Anteilsbestand zum 30. +Juni 2005, gebucht. Die Ertragsausschüttung vom 22. August 2005 ist damit gegenstandslos. Die dadurch entstandenen Irritationen bitten +wir zu entschuldigen. + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 957,39 ********** 36,550000 26,194 ******** ******** +Abrechnungsbetrag Ausschüttung 1,05 41,970000 + 0,025 22.08.2005 22.08.2005 +Ertragsausschüttung-Storno 1,05 41,970000 - 0,025 07.09.2005 22.08.2005 +Abrechnungsbetrag Ausschüttung 0,00 42,280000 0,000 09.09.2005 09.09.2005 +Kauf aus Ertrag 1,05 41,970000 + 0,025 09.09.2005 22.08.2005 +Abrechnungsbetrag Thesaurierung 0,00 42,280000 0,000 14.09.2005 14.09.2005 +Lastschrifteinzug 570,00 44,020000 + 12,949 22.11.2005 22.11.2005 +Bestand am 31.12.2005 1.729,27 ********** 44,150000 39,168 ******** ******** +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 4 +Depot für InvestmentFonds +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2005 Seite 4 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Deka-EuroStocks TF/ ISIN: LU0097654924 +Unterkonto: 989585 00 Verwahrart: GiroSammel + +Umsatzart / Sonstige Ein-/Auszahlung Ein-/Auszahlung Preis je Anteilumsatz Buchungs- Abrech- +Abrechnungsdaten bzw. Bestand in bzw. Bestand in Stück bzw. Bestand tag nungstag +EUR Fremdwährung in EUR in Stück +Bestand am 31.12.2004 546,30 ********** 29,040000 18,812 ******** ******** +Verkauf 641,11 34,080000 - 18,812 18.11.2005 18.11.2005 +Bestand am 31.12.2005 0,00 ********** 35,590000 0,000 ******** ******** +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 4 Seiten +vom Name und Vorname Steuernummer +Arbeit-b 2005 +nehmer +auszu- +füllen 99 1 5 + 9 +Anlage VL 87 +Wichtiger Hinweis: +Diese Bescheinigung benötigen Sie, wenn Sie eine +Herrn Arbeitnehmer-Sparzulage beantragen wollen. In diesem +Richard Mustermann Fall fügen Sie bitte die Bescheinigung Ihrer +Musterstraße 9 Einkommensteuererklärung / Ihrem Antrag auf +11111 Stadt Arbeitnehmer-Sparzulage bei. +Bescheinigung vermögenswirksamer Leistungen für 2005 +(§ 15 Abs. 1 des 5. VermBG, § 5 VermBDV 1994) +Vertragsnummer der DekaBank: V111111111 (1. Vertrag) +Arbeitnehmer (Name und Vorname) geboren am +Mustermann, Richard 01.01.1988 +Straße, Hausnummer +Musterstraße 9 +Postleitzahl, Wohnort +11111 Stadt +*) 1 = Sparvertrag über Wertpapiere oder andere Vermögensbeteiligungen (§ 4 des 5. VermBG) +1. Vertrag 2. Vertrag +Art der Anlage *) Kennzahl der Anlageart Kennzahl der Anlageart0 0 +1 +Institutsschlüssel +für Arbeitnehmer- 1 1111111 1 +Sparzulage +Vertrags-Nummer 2 11111111111111 2 +(nur für Finanzamt) +Vermögenswirksame +Leistungen (auf volle 3 374,00 3 +Euro aufgerundet) +Ende der Sperrfrist 4 31.12.2010 4 +Anlageinstitut, Unternehmen, Empfänger +DekaBank +Deutsche Girozentrale +60625 Frankfurt am Main +erstellt per 31. Dezember 2005 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. Irrtum vorbehalten. +DekaBank +Deutsche Girozentrale +60625 Frankfurt +Telefon (0 69) 71 47 - 6 52 Depot-/Investmentservice +Jahresbescheinigung über Kapitalerträge und Veräußerungsgeschäfte aus Finanzanlagen für die bei uns geführten Depots für +Investmentfonds (§24c EStG) des Privatvermögens + +Für Richard Mustermann, 11111 Stadt, Musterstraße 9 + +werden für den Zeitraum vom 01.01.2005 bis 31.12.2005 folgende Angaben für die Besteuerung der Einkünfte aus +Kapitalvermögen nach §20 EStG sowie der Einkünfte aus privaten Veräußerungsgeschäften nach §23 Abs. 1 Satz 1 Nr. 2 bis +4 EStG bescheinigt: +Einnahmen Anzurechnende Anzurechnender +Inländische Kapitalerträge (Anl. KAP) Kapitalertragsteuer Zinsabschlag +EUR EUR / CT EUR / CT +Zinsen und andere Erträge (ohne Dividenden) aus Investmentanteilen (einschließlich +Zwischengewinne) Zeile 8 Anlage KAP 95,17 0,00 +Dividenden und ähnliche Erträge - Halbeinkünfteverfahren - aus Investmentanteilen +Zeile 23 Anlage KAP 1,96 0,00 +Einnahmen Anzurechnende Anzurechnender +Ausländische Kapitalerträge ( Anl. KAP) Kapitalertragsteuer Zinsabschlag +EUR EUR / CT EUR / CT +Erträge aus ausländischen Investmentanteilen (Auslandinvestment-Gesetz) +Zeile 33 Anlage KAP 0,00 0,00 +Zinsen und andere Erträge (ohne Dividenden) aus ausländischen Investmentanteilen +(Investmentsteuergesetz) +Zeile 34 Anlage KAP 16,62 0,00 +Dividenden und ähnliche Erträge - Halbeinkünfteverfahren - aus ausländischen +Investmentanteilen (Investmentsteuergesetz) +Zeile 36 Anlage KAP 84,29 +Anzurechnende Solidaritätszuschläge (Anl. KAP) EUR / CT +Summe aller anzurechnenden Solidaritätszuschläge zur Kapitalertragsteuer / zum Zinsabschlag +Zeile 52 Anlage KAP 0,00 +Aufwendungen (Anl. KAP) EUR +Aufwendungen im Zusammenhang mit Kapitalerträgen 10,00 +Ausländische Einkünfte und Steuern (Anl. AUS) 1. Staat/Fonds 2. Staat/Fonds 3. Staat/Fonds +AriDeka DekaLux-Pazifik DekaLux-Deutschland TF +Kapitalvermögen Einkunftsquelle Einkunftsquelle Einkunftsquelle +Einnahmen, die in den Zeilen 33, 34 und 44 der Anlage KAP enthalten sind EUR EUR EUR +Zeile 5 Anlage AUS 3,56 +Einnahmen, die in den Zeilen 35 und 36 der Anlage KAP enthalten sind 58,09 +Zeile 6 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die +das Halbeinkünfteverfahren nicht gilt +Zeile 7 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die 0,60 +das Halbeinkünfteverfahren gilt +Zeile 8 Anlage AUS +Ausl. Steuern (Wahlrecht zur Anrechnung oder zum Abzug gemäß der Anleitung zur Anlage 0,16 +AUS "zu den Zeilen 2 bis 18, Zeilen 11 und 16, Zeile 17 bzw. Zeile 22") +Seite 1 +DekaBank +Deutsche Girozentrale +60625 Frankfurt +Telefon (0 69) 71 47 - 6 52 Depot-/Investmentservice +Ausländische Einkünfte und Steuern (Anl. AUS) 4. Staat/Fonds 5. Staat/Fonds 6. Staat/Fonds +Deka-EuropaBond TF DekaTeam-GlobalSelect TF DekaTeam-EmergingMarkets +CF +Kapitalvermögen Einkunftsquelle Einkunftsquelle Einkunftsquelle +Einnahmen, die in den Zeilen 33, 34 und 44 der Anlage KAP enthalten sind EUR EUR EUR +Zeile 5 Anlage AUS 7,83 1,60 +Einnahmen, die in den Zeilen 35 und 36 der Anlage KAP enthalten sind 26,20 +Zeile 6 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die 0,06 +das Halbeinkünfteverfahren nicht gilt +Zeile 7 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die +das Halbeinkünfteverfahren gilt +Zeile 8 Anlage AUS +Ausl. Steuern (Wahlrecht zur Anrechnung oder zum Abzug gemäß der Anleitung zur Anlage 0,98 +AUS "zu den Zeilen 2 bis 18, Zeilen 11 und 16, Zeile 17 bzw. Zeile 22") +Ausländische Einkünfte und Steuern (Anl. AUS) 7. Staat/Fonds 8. Staat/Fonds 9. Staat/Fonds +Deka-PharmaTech TF +Kapitalvermögen Einkunftsquelle Einkunftsquelle Einkunftsquelle +Einnahmen, die in den Zeilen 33, 34 und 44 der Anlage KAP enthalten sind EUR EUR EUR +Zeile 5 Anlage AUS 3,63 +Einnahmen, die in den Zeilen 35 und 36 der Anlage KAP enthalten sind +Zeile 6 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die +das Halbeinkünfteverfahren nicht gilt +Zeile 7 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die +das Halbeinkünfteverfahren gilt +Zeile 8 Anlage AUS +Ausl. Steuern (Wahlrecht zur Anrechnung oder zum Abzug gemäß der Anleitung zur Anlage +AUS "zu den Zeilen 2 bis 18, Zeilen 11 und 16, Zeile 17 bzw. Zeile 22") + +Private Veräußerungsgeschäfte (Anl. SO) + Art des Wirtschaftsguts Zeitpunkt der Zeitpunkt der Veräußerungspreis Anschaffungskosten Aufwendungen im Ergebnis (EUR) Dem +(Wertpapierkennnummer, Anschaffung (Datum) Veräußerung (Datum) (EUR) oder an deren Stelle Zusammenhang mit Halbeinkünftever- +ISIN, tretender Wert (EUR) dem Veräußerungs- fahren unterliegend +Wertpapierbezeichnung) geschäft (nur Trans- (ja/nein) +aktionskosten) (EUR) +9 89585, LU0097654924, 22.11.2004 18.11.2005 3,85 3,18 0,67 nein +Deka-EuroStocks TF, +Anteile 0,113 +9 87318, IE0002262826, 22.08.2005 21.11.2005 3,93 3,69 0,24 nein +DekaTeam-GlobalSelect +TF, Anteile 0,100 +Seite 2 +DekaBank +Deutsche Girozentrale +60625 Frankfurt +Telefon (0 69) 71 47 - 6 52 Depot-/Investmentservice +Die Jahresbescheinigung über Kapitalerträge und Veräußerungsgeschäfte aus Finanzanlagen soll Ihnen das Ausfüllen der Anlagen KAP, AUS und SO zur Einkommensteuer-/ +Feststellungserklärung erleichtern. +Haben Sie weitere, hier nicht aufgeführte Einnahmen aus Kapitalvermögen erzielt oder private Veräußerungsgeschäfte getätigt, müssen diese zusätzlich in den +Anlagen KAP, AUS oder SO erklärt werden. +Die Jahresbescheinigung ersetzt NICHT die Steuerbescheinigung nach §45a Abs. 2 oder 3 EStG. Für die Anrechnung von Kapitalertragsteuer / Zinsabschlag ist weiterhin die +Steuerbescheinigung der Einkommensteuer- / Feststellungserklärung beizufügen. +Bei der Übernahme der bescheinigten Angaben in der Einkommensteuer- / Feststellungserklärung beachten Sie bitte folgende Hinweise: +Soweit die bescheinigten Erträge und / oder Aufwendungen zu den Einkünften aus Land- und Forstwirtschaft, aus Gewerbebetrieb, aus selbständiger Arbeit oder aus Vermietung +und Verpachtung gehören, sind sie diesen Einkünften zuzurechnen und in den dafür vorgesehenen Anlagen zur Einkommensteuer-/ Feststellungserklärung anzugeben. +Kapitalerträge (Anlage KAP) +Die Einnahmen sind einschließlich freigestellter Einnahmen (Freistellungsauftrag), anzurechnender / erstatteter Kapitalertragsteuer / Zinsabschlag / Solidaritätszuschlag +bescheinigt. +Bei der Veräußerung oder Rückgabe von Anteilen an ausländischen thesaurierenden Fonds unterliegen nicht nur die zum Ende des letzten Geschäftsjahres des Fonds als +zugeflossen geltenden Erträge, sondern auch zum Ende früherer Geschäftsjahre als zugeflossen geltenden Erträge dem Zinsabschlag. In der Einkommensteuer-/ +Feststellungserklärung sind jedoch die im Jahr der Veräußerung oder Rückgabe des Investmentanteils als zugeflossen geltenden Erträge anzugeben, weil die zum Ende früherer +Geschäftsjahre als zugeflossen geltenden Erträge bereits in früheren Kalenderjahren zu versteuern waren. +Die Erträge aus ausländischen Wertpapieren unterliegen der Einkommensteuer mit dem Bruttobetrag, d.h. einschließlich der ausländischen Steuern. +Aufwendungen sind nur insoweit bescheinigt, als sie im Zusammenhang mit der Konto- und/oder Depotführung entstanden sind (Depotgebühren, Kosten der +Erträgnisaufstellung, Beratungsgebühren, Entgelte für Verwaltungsdienstleistungen). +Die Prüfung, ob + - die angeführten Aufwendungen tatsächlich Werbungskosten sind oder + - weitere Aufwendungen, die in die Anlage KAP zu übernehmen sind, entstanden sind, obliegt dem Steuerpflichtigen. +Veräußerungsgeschäfte bei Wertpapieren (Anlage SO): +Die Bescheinigung enthält Angaben nur, soweit die erforderlichen Daten bei dem Institut vorhanden sind (z.B. nur Veräußerungszeitpunkt und Veräußerungskosten). Die Prüfung, +ob + - es sich um ein steuerpflichtiges Veräußerungsgeschäft innerhalb der Behaltensfrist (Kauf und Verkauf innerhalb von einem Jahr) handelt, + - die angeführten Aufwendungen tatsächlich Werbungskosten sind oder + - weitere Aufwendungen, die in die Anlage SO zu übernehmen sind, entstanden sind, + obliegt dem Steuerpflichtigen. +Neben den gesetzlich vorgeschriebenen Informationen stellen wir Ihnen zusätzlich unten genannte Angaben zur Verfügung +EUR /CT +Durch Freistellungsauftrag freigestellte Zinsen und andere Erträge (ohne Dividenden) aus inländischen Investmentanteilen 95,74 +Zeile 8 Spalte 4 Anlage KAP +Durch Freistellungsauftrag freigestellte Dividenden und ähnliche Erträge -Halbeinkünfteverfahren- aus inländischen 0,10 +Investmentanteilen +Zeile 23 Spalte 4 Anlage KAP +Durch Freistellungsauftrag freigestellte Erträge aus ausländischen Investmentanteilen (Auslandinvestment-Gesetz) 0,00 +Zeile 33 Spalte 4 Anlage KAP +Durch Freistellungsauftrag freigestellte Zinsen und andere Erträge (ohne Dividenden) aus ausländischen Investmentanteilen 12,29 +(Investmentsteuergesetz) +Zeile 34 Spalte 4 Anlage KAP +Steuerfreie Erträge nach Doppelbesteuerungsabkommen 0,00 + +Zeile 39 Anlage AUS +In der Tabelle "Private Veräußerungsgeschäfte (Anl. SO)" wurden bei der Berechnung von Veräußerungsgewinnen/-verlusten bereits Zwischengewinne und ggf. +Thesaurierungsbeträge berücksichtigt. + +Seite 3 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht10.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht10.txt new file mode 100644 index 0000000000..adc4407f06 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht10.txt @@ -0,0 +1,540 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Depotübersicht zum 31.12.2006 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Freistellungsauftrag +.... Erteilt 2006: EUR 205,00 +........ Beansprucht: EUR 78,15 Neu : EUR 116,00 ab 01.01.2007 +Herrn +Richard Mustermann +Musterstraße 9 +11111 Stadt +ISIN Unterkonto Bezeichnung Wert * Wertentwicklung +in EUR in EUR +per 31.12.2006 per 31.12.2006 +DE0008474511 847451 00 AriDeka 1.103,26 99,55 + VL-Vertrag: gesperrt bis zum 31.12.2010, Vertragsinhaber: Richard Mustermann +LU0052859252 973242 00 DekaLux-Pazifik 2.490,13 373,44 +LU0062624902 974587 00 DekaLux-Deutschland TF A 2.769,43 349,06 +DE0009771824 977182 00 Deka-Geldmarkt: Euro TF 1.067,03 8,14 +DE0009771980 977198 00 Deka-EuropaBond TF 1.746,78 -1,68 +DE0009786285 978628 00 Deka-EuropaPotential TF 4.776,73 1.061,64 +IE0004907972 987887 00 DekaTeam-EmergingMarkets CF 1.814,63 260,35 +IE0005258151 989094 00 Deka-PharmaTech TF 2.027,80 -101,47 +XF0009994050 999405 00 Deka-BonusRente +DE0005424519 542451 00 - Deka-BR 100 177,43 -10,82 + Gesamt in EUR 17.973,22 2.038,21 +Depotpreis inkl. 16% MwSt: 10,00 EUR belastet im Depot 0111111111 974587 00 +Entgelte werden gemäß Preisverzeichnis erhoben. + +Besondere Hinweise zur Deka-BonusRente: +Mit diesem Depot-Jahresauszug erhalten Sie Zusatzinformationen nach § 7 Abs. 4 AltZertG zu Ihrer Deka-BonusRente. Das Jahresendereporting zur +Deka-BonusRente mit den Bescheinigungen nach § 92 und § 10 a Abs. 5 EStG geht Ihnen mit separater Post im März 2007 zu. Die Bescheinigung +nach § 10 a Abs. 5 EStG benötigen Sie im Rahmen der Einkommensteuer, um einen zusätzlichen Sonderausgabenabzug geltend zu machen. +Sofern Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, wird diese auf +Grundlage der von Ihnen mitgeteilten Daten beantragt und nach Eingang der Zulage Ihrem Deka-BonusRente Vertrag gutgeschrieben. +Weitere Informationen entnehmen Sie unserer Homepage www.deka.de (Menüpunkt Service) oder rufen Sie uns unter (0 69) 71 47 - 6 52 montags bis +freitags in der Zeit von 8.00 bis 18.00 Uhr an. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +Depotübersicht zum 31.12.2006 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Freistellungsauftrag +.... Erteilt 2006: EUR 205,00 ........ Beansprucht: EUR 78,15 Neu : EUR 116,00 ab 01.01.2007 +Herrn +Richard Mustermann +Musterstraße 9 +11111 Stadt + +Hinweis zum Ausweis der Wertentwicklung: +Die Berechnung der Wertentwicklung im Rahmen des Depot-Jahresauszuges erfolgt für den Betrachtungszeitraum 1. Januar bis 31. Dezember des +betreffenden Kalenderjahres. Wenn der Beginn des Betrachtungszeitraums vor dem Datum der Depoteröffnung liegt, wird die Berechnung +automatisch ab dem Eröffnungsdatum durchgeführt. +Für die Berechnung der Wertentwicklung werden für den Betrachtungszeitraum die Anfangs- und Endbestände sowie Buchungen bei denen es zu +einer stücke- und/oder geldmäßigen Bewegung kam, herangezogen. Gegebenenfalls abgeführte Steuern werden hierbei nicht berücksichtigt. +Eventuell einbehaltene Gebühren und Ausgabeaufschläge reduzieren Ihre Wertentwicklung. Es wird keine Wertentwicklung für das Unterkonto +ausgewiesen, wenn dieses im Betrachtungszeitraum ohne Bestand ist. + +Allgemeine Risikohinweise: +Anteile an Investmentfonds sind Wertpapiere, deren Preise durch die börsentäglichen Kursschwankungen der im jeweiligen Investmentfonds befindlichen +Vermögenswerte bestimmt werden und deshalb steigen oder auch fallen können. Kursänderungen bei den Vermögensgegenständen (z.B. Aktien, Anleihen) +und Wechselkursschwankungen können somit den Wert einer Anlage in Investmentfonds sowohl positiv als auch negativ beeinflussen. +* Die Bewertung der Fonds erfolgt mit dem jeweils letzten verfügbaren Rücknahmepreis, der zum Zeitpunkt der Erstellung dieses Auszugs +vorlag. Bitte entnehmen Sie den Fondspreis zum letzten Handelstag des Jahres dem Jahresbericht der betreffenden Fonds. +Bitte Rück-/ Folgeseite beachten. +Weitere Informationen entnehmen Sie unserer Homepage www.deka.de (Menüpunkt Service) oder rufen Sie uns unter (0 69) 71 47 - 6 52 montags bis +freitags in der Zeit von 8.00 bis 18.00 Uhr an. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +HINWEISE ZU IHREM DEPOTJAHRESAUSZUG Jahres-Steuerbescheinigung 2006: +Wurde Ihnen im Kalenderjahr 2006 Zinsabschlagsteuer und +Verwahrung des Anteilsbestandes: Solidaritätszuschlag einbehalten oder Kapitalertragsteuer (20 %) auf +Die Anteile werden im Girosammel-Depot oder in Form einer Gutschrift inländische Dividendenanteile nicht voll bzw. gar nicht erstattet, +in Wertpapierrechnung verwahrt. Die Anteilbruchteile stellen das erhalten Sie mit dem Depot-Jahresauszug zum 31. Dezember 2006 +Miteigentum an einer Bruchteilgemeinschaft dar. eine Jahres-Steuerbescheinigung. In der tabellarischen +Zusammenfassung sind die jeweiligen Summen angedruckt. Wurden +keine deutschen Steuern einbehalten, entfällt die +Der Wert der Investmentanlage berechnet sich aus dem +Jahres-Steuerbescheinigung. +Anteilsbestand zum 31. Dezember 2006 multipliziert mit dem Preis je +Anteil . Die Bewertung des Fonds erfolgt mit dem jeweils letzten +Jahresbescheinigung 2006: +verfügbaren Rücknahmepreis, der zum Zeitpunkt der Erstellung dieses +Auszugs vorlag. Mit in Kraft treten des Steueränderungsgesetzes 2003 sind +Kreditinstitute verpflichtet, für die bei ihnen geführten Depots eine +Beanspruchter Freistellungsauftrag für das Kalenderjahr 2006: Jahresbescheinigung zu erstellen. Sind im Kalenderjahr 2006 +Kapitalerträge oder private Veräußerungsgeschäfte angefallen, werden +Die Höhe des von Ihnen erteilten Freistellungsauftrages entnehmen Sie +Ihnen diese zum 31. Dezember 2006 in der Jahresbescheinigung +bitte dem Kopfteil Ihrer Depotübersicht oder Ihrem Depotauszug. Bitte +ausgewiesen. +beachten Sie, dass die Bemessungsgrundlage für die +Zinsabschlagsteuer und die Einkommensteuer in vielen Fällen nicht +Die gesetzliche Verpflichtung zur Erstellung besteht gegenüber +identisch ist. Deshalb kann die Höhe des beanspruchten +unbeschränkt einkommensteuerpflichtigen natürlichen Personen. +Freistellungsauftrages von den "inländischen bzw. ausländischen +Haben Sie mehr als ein Depot in unserem Hause, dann können die +Kapitalerträgen aus Investmentanteilen bei Privatvermögen" +Angaben von mehreren Depots in einer Jahresbescheinigung +abweichen. +zusammengefasst sein. Bei betrieblichen Konten besteht keine +Verpflichtung zur Ausstellung einer Jahresbescheinigung, wenn das +Werbungskosten: Institut weiß, dass es sich um ein betriebliches Depot handelt. +Werbungskosten, z.B. Depotpreis, die Ihnen im Zusammenhang mit +Ihren Investmentanteilen entstanden sind, müssen im Rahmen der Zinsinformationsverordnung: +Einkommensteuererklärung auf die Kapitalerträge, die dem Aufgrund der am 01. Juli 2005 in Kraft getretenen +Halbeinkünfteverfahren unterliegen und die übrigen steuerpflichtigen Zinsinformationsverordnung (auf Grundlage der EU-Zinsrichtlinie 2003/ +Kapitalerträge aufgeteilt werden. Aufteilungsmaßstab kann hierbei das 48 / EG des Rates vom 03. Juni 2003) ist die DekaBank verpflichtet, +Verhältnis der voll steuerpflichtigen Erträge zu den Erträgen, die dem Zinserträge von wirtschaftlichen Eigentümern mit ausländischem +Halbeinkünfteverfahren unterliegen, sein. Wohnsitz innerhalb der angeschlossenen EU-Staaten an das +Bundeszentralamt für Steuern zu melden. +Inländische Kapitalerträge aus Investmentanteilen bei Dieser Richtlinie unterliegen alle Depots von Privatanlegern, die in +Privatvermögen errechnen sich aus dem steuerpflichtigen Anteil von einem anderen Mitgliedstaat der Europäischen Union ansässig sind. +Ausschüttungen und Thesaurierungen des Kalenderjahres 2006 Ziel dieser Richtlinie ist es, innerhalb der Europäischen Union durch +bezogen auf deutsche Fonds. In der Jahresbescheinigung sowie der Austausch von Informationen eine effektive Besteuerung von +Jahres-Steuerbescheinigung erfolgt der Ausweis in den Zinserträgen zu ermöglichen. Dazu gehören nach den Bestimmungen +Einzelpositionen "Zinsen und andere Erträge (ohne Dividenden) aus der Zinsinformationsverordnung, unter Beachtung bestimmter +Investmentanteilen" und "Dividenden und ähnliche Erträge Sonderregelungen, auch solche Zinserträge, die im Rahmen von +(Halbeinkünfteverfahren) aus Investmentanteilen". Ausschüttungen oder Anteilscheinrückgaben von Investmentfonds +gezahlt werden. +Ausländische Kapitalerträge aus Investmentanteilen bei +Privatvermögen errechnen sich analog, aber bezogen auf Fonds, die Bescheinigung vermögenswirksamer Leistungen für 2006: +nach dem für Großbritannien, Irland, Luxemburg und die Schweiz Wenn in Ihrem Depot vermögenswirksame Leistungen (VL) verwahrt +geltenden Recht aufgelegt wurden. In der Jahresbescheinigung sowie werden, erhalten Sie mit dem Depot-Jahresauszug zum 31. Dezember +der Jahres-Steuerbescheinigung erfolgt der Ausweis in den 2006 eine Bescheinigung der im Kalenderjahr 2006 eingezahlten +Einzelpositionen "Zinsen und andere Erträge (ohne Dividenden) aus VL-Leistungen. Bitte fügen Sie diese Bescheinigung Ihrer +ausländischen Investmentanteilen" und "Dividenden und ähnliche Einkommensteuererklärung bei. Sie dient als Antrag zur Gewährung +Erträge (Halbeinkünfteverfahren) aus ausländischen einer Sparzulage. +Investmentanteilen". +Zahlungseingänge, die nicht mehr im Kalenderjahr 2006 erfolgen, (z.B. +Die Positionen anrechenbare Kapitalertragsteuer (20 % ) und im Januar 2007 für Dezember 2006) werden erst in der Bescheinigung +anrechenbarer Zinsabschlag (30 %) und anrechenbarer für das Kalenderjahr 2007 ausgewiesen. +Solidaritätszuschlag werden in der Jahres-Steuerbescheinigung +ausgewiesen. Damit kann eine Anrechnung im Rahmen der Sollten auf Ihrem Vertrag Zahlungseingänge fehlen, fragen Sie bitte +Einkommensteuererklärung erfolgen. erst bei Ihrem Arbeitgeber nach, auf welches Konto die +vermögenswirksamen Leistungen überwiesen wurden. Erst mit dieser +Ausländische Quellensteuern können in der Anlage AUS der Information können wir die Zahlungseingänge überprüfen. +Einkommensteuererklärung ausgewiesen werden. +Vermögensbeteiligungen gem. Paragraph 19a EStG: +Steuerfreie Erträge nach dem Doppelbesteuerungsabkommen Die gesetzliche Sperrfrist von sechs Jahren ist seit dem +unterliegen nicht der deutschen Einkommensteuer, aber dem Steueränderungsgesetz 2001 entfallen. Die Vermögensbeteiligungen +sogenannten Progressionsvorbehalt und sind daher in der Anlage AUS sind frei verfügbar. Ggf. sind zivilrechtlich vereinbarte Haltedauern +auszuweisen. zwischen Arbeitnehmer und Arbeitgeber zu beachten. +Weitere Informationen erhalten Sie bei Ihrem Steuerberater. +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2006 +Seite 1 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Deka-BonusRente Vertragsnr.: 0111111111 999405 00 +Deka-BR 100 +ISIN: DE0005424519 +Unterkonto: 542451 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Lastschrifteinzug 60,00 50,100000 + 1,198 11.12.2006 11.12.2006 +Vertragsgebühr 5,00 49,040000 - 0,102 15.12.2006 15.12.2006 +Lastschrifteinzug 128,25 51,020000 + 2,514 28.12.2006 28.12.2006 +Bestand am 31.12.2006 177,43 49,150000 3,610 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +AriDeka +ISIN: DE0008474511 +Unterkonto: 847451 00 Verwahrart: GiroSammel +VL-Vertrag: gesperrt bis zum 31.12.2010, Vertragsinhaber: Richard Mustermann + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 561,71 61,490000 9,135 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Kauf 34,00 64,980000 + 0,523 02.01.2006 02.01.2006 +Kauf 34,00 67,350000 + 0,505 31.01.2006 31.01.2006 +Abrechnungsbetrag Ausschüttung 8,22 63,890000 + 0,129 17.02.2006 17.02.2006 +Kauf 34,00 68,130000 + 0,499 28.02.2006 28.02.2006 +Kauf 34,00 68,500000 + 0,496 31.03.2006 31.03.2006 +Kauf 34,00 68,910000 + 0,493 28.04.2006 28.04.2006 +Kauf 34,00 65,230000 + 0,521 01.06.2006 01.06.2006 +Kauf 34,00 65,830000 + 0,516 03.07.2006 03.07.2006 +Kauf 34,00 66,870000 + 0,508 01.08.2006 01.08.2006 +Kauf 34,00 68,610000 + 0,496 31.08.2006 31.08.2006 +Kauf 34,00 69,470000 + 0,489 29.09.2006 29.09.2006 +Kauf 34,00 72,190000 + 0,471 31.10.2006 31.10.2006 +Kauf 34,00 71,590000 + 0,475 30.11.2006 30.11.2006 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2006 +Seite 2 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Kauf 34,00 73,960000 + 0,460 28.12.2006 28.12.2006 +Bestand am 31.12.2006 1.103,26 70,200000 15,716 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +DekaLux-Pazifik +ISIN: LU0052859252 +Unterkonto: 973242 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 2.116,69 386,610000 5,475 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Abrechnungsbetrag Ausschüttung 65,65 417,910000 + 0,157 20.11.2006 20.11.2006 +Bestand am 31.12.2006 2.490,13 442,140000 5,632 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +DekaLux-Deutschland TF A +ISIN: LU0062624902 +Unterkonto: 974587 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 1.420,37 70,560000 20,130 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Lastschrifteinzug 1.000,00 82,290000 + 12,152 07.11.2006 07.11.2006 +Abrechnungsbetrag Ausschüttung 0,32 82,890000 + 0,004 20.11.2006 20.11.2006 +Depotpreis 10,00 85,110000 - 0,117 15.12.2006 15.12.2006 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 3 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2006 +Seite 3 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Bestand am 31.12.2006 2.769,43 86,090000 32,169 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +Deka-Geldmarkt: Euro TF +ISIN: DE0009771824 +Unterkonto: 977182 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 58,89 64,500000 0,913 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Kauf aus Ertrag 0,31 64,170000 + 0,005 02.01.2006 02.01.2006 +Lastschrifteinzug 1.000,00 65,260000 + 15,323 09.10.2006 09.10.2006 +Abrechnungsbetrag Thesaurierung 0,00 65,700000 0,000 29.12.2006 29.12.2006 +Bestand am 31.12.2006 1.067,03 65,700000 16,241 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +Deka-EuropaBond TF +ISIN: DE0009771980 +Unterkonto: 977198 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 1.748,46 40,200000 43,494 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Abrechnungsbetrag Ausschüttung 66,98 37,820000 + 1,771 21.08.2006 21.08.2006 +Bestand am 31.12.2006 1.746,78 38,590000 45,265 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 4 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2006 +Seite 4 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Deka-EuropaPotential TF +ISIN: DE0009786285 +Unterkonto: 978628 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 3.115,09 67,740000 45,986 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Lastschrifteinzug 600,00 68,970000 + 8,699 03.01.2006 03.01.2006 +Abrechnungsbetrag Thesaurierung 0,00 87,350000 0,000 29.12.2006 29.12.2006 +Bestand am 31.12.2006 4.776,73 87,350000 54,685 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +DekaTeam-EmergingMarkets CF +ISIN: IE0004907972 +Unterkonto: 987887 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 1.554,28 59,170000 26,268 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Abrechnungsbetrag Ausschüttung 26,79 58,120000 + 0,461 21.08.2006 21.08.2006 +Bestand am 31.12.2006 1.814,63 67,890000 26,729 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +Deka-PharmaTech TF +ISIN: IE0005258151 +Unterkonto: 989094 00 Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2005 1.729,27 44,150000 39,168 +Bewertung mit dem Rücknahmepreis vom 30.12.2005 +Lastschrifteinzug 400,00 44,010000 + 9,089 04.01.2006 04.01.2006 +Abrechnungsbetrag Ausschüttung 2,90 41,610000 + 0,070 21.08.2006 21.08.2006 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 5 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +Umsatz-Jahresübersicht +Depot-Auszug zum 31.12.2006 +Seite 5 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Bestand am 31.12.2006 2.027,80 41,960000 48,327 +Bewertung mit dem Rücknahmepreis vom 29.12.2006 + +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 5 Seiten. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +vom Name, Vorname Steuernummer +Arbeit- +nehmerb 2006 +auszu- +füllen 99 1 5 + 9 +Anlage VL 87 +Wichtiger Hinweis: +Diese Bescheinigung benötigen Sie, wenn Sie eine +Herrn Arbeitnehmer-Sparzulage nach dem Fünften +Richard Mustermann Vermögensbildungsgesetz (VermBG) beantragen wollen. +Musterstraße 9 In diesem Fall fügen Sie bitte die Bescheinigung Ihrer +11111 Stadt Einkommensteuererklärung / Ihrem Antrag auf +Arbeitnehmer-Sparzulage bei. +Bescheinigung vermögenswirksamer Leistungen für 2006 +(§ 15 Abs. 1 VermBG, § 5 VermBDV 1994) +Vertragsnummer der DekaBank: V111111111 (1. Vertrag) +Arbeitnehmer (Name, Vorname) geboren am +Mustermann, Richard 01.01.1980 +Straße, Hausnummer +Musterstraße 9 +Postleitzahl, Wohnort +11111 Stadt +1. Vertrag 2. Vertrag +Art der Anlage *) 0 0 +1 +Institutsschlüssel für die +Arbeitnehmer- 1 1111111 1 +Sparzulage +Vertragsnummer 2 11111111111111 2 +(nur für Finanzamt) +Vermögenswirksame +Leistungen (auf volle 3 442,00 3 +Euro aufgerundet) +Ende der Sperrfrist +(Format: TT.MM.JJJJ) 4 31.12.2010 4 +Anlageinstitut, Unternehmen, Empfänger +DekaBank +Deutsche Girozentrale +60625 Frankfurt am Main +erstellt per 31. Dezember 2006 +*) 1 = Sparvertrag über Wertpapiere oder andere Vermögensbeteiligungen (§ 4 VermBG) +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. Irrtum vorbehalten. +Seite 1 +Jahresbescheinigung über Kapitalerträge und Veräußerungsgeschäfte aus Finanzanlagen für +die bei uns geführten Depots für Investmentfonds (§24c EStG) des Privatvermögens + +Richard Mustermann, 11111 Stadt, Musterstraße 9 + +Für den Zeitraum vom 01.01.2006 bis 31.12.2006 werden folgende Angaben für die Besteuerung der Einkünfte aus Kapitalvermögen nach §20 EStG sowie +der Einkünfte aus privaten Veräußerungsgeschäften nach §23 Abs. 1 Satz 1 Nr. 2 bis 4 EStG bescheinigt: +Einnahmen Anzurechnende inländische (r) +Inländische Kapitalerträge (Anl. KAP) Zinsabschlag / Kapitalertragsteuer +EUR EUR / CT +Zinsen und andere Erträge (ohne Dividenden) aus Investmentanteilen (einschließlich +Zwischengewinne) Zeile 8 Anlage KAP 76,93 0,00 +Dividenden und ähnliche Erträge - Halbeinkünfteverfahren - aus Investmentanteilen +Zeile 22 Anlage KAP 8,81 0,00 +Einnahmen Anzurechnender inländischer +Ausländische Kapitalerträge ( Anl. KAP) Zinsabschlag +EUR EUR / CT +Zinsen und andere Erträge (ohne Dividenden) aus ausländischen Investmentanteilen +(Investmentsteuergesetz) 0,30 0,00 +Zeile 32 Anlage KAP +Dividenden und ähnliche Erträge - Halbeinkünfteverfahren - aus ausländischen +Investmentanteilen (Investmentsteuergesetz) 95,27 +Zeile 34 Anlage KAP +Anzurechnende Solidaritätszuschläge (Anl. KAP) EUR / CT +Summe aller anzurechnenden Solidaritätszuschläge zur Kapitalertragsteuer / zum Zinsabschlag +Zeile 45 Anlage KAP 0,00 +Aufwendungen (Anl. KAP) EUR +Aufwendungen im Zusammenhang mit Kapitalerträgen 10,00 +Ausländische Einkünfte und Steuern (Anl. AUS) 1. Staat/Fonds 2. Staat/Fonds 3. Staat/Fonds +LU0052859252 IE0004907972 IE0005258151 +Kapitalvermögen Einkunftsquelle Einkunftsquelle Einkunftsquelle +Einnahmen, die in den Zeilen 31, 32 und 41 der Anlage KAP enthalten sind EUR EUR EUR +Zeile 6 Anlage AUS 0,30 +Einnahmen, die in den Zeilen 33 und 34 der Anlage KAP enthalten sind 65,64 29,63 +Zeile 7 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die +das Halbeinkünfteverfahren nicht gilt +Zeile 8 Anlage AUS +Einnahmen aus einem inländ. Sondervermögen, die aus ausländ. Quellen stammen, für die +das Halbeinkünfteverfahren gilt +Zeile 9 Anlage AUS +Ausl. Steuern (Wahlrecht zur Anrechnung oder zum Abzug gemäß der Anleitung zur Anlage +AUS "zu den Zeilen 4 bis 18 bzw. zu den Zeilen 12 und 16") +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +Seite 2 +Richard Mustermann, 11111 Stadt, Musterstraße 9 + +Private Veräußerungsgeschäfte (Anl. SO) + Art des Wirtschaftsguts Zeitpunkt der Zeitpunkt der Veräußerungspreis Anschaffungskosten Aufwendungen im Ergebnis (EUR) Dem +(Wertpapierkennnummer, Anschaffung (Datum) Veräußerung (Datum) (EUR) oder an deren Stelle Zusammenhang mit Halbeinkünftever- +ISIN, tretender Wert (EUR) dem Veräußerungs- fahren unterliegend +Wertpapierbezeichnung) geschäft (nur Trans- (ja/nein) +aktionskosten) (EUR) +Private Veräußerungsgeschäfte wurden nicht getätigt. + +Die Jahresbescheinigung über Kapitalerträge und Veräußerungsgeschäfte aus Finanzanlagen soll Ihnen das Ausfüllen der Anlagen KAP, AUS und SO zur Einkommensteuer-/ +Feststellungserklärung erleichtern. +Haben Sie weitere, hier nicht aufgeführte Einnahmen aus Kapitalvermögen erzielt oder private Veräußerungsgeschäfte getätigt, müssen diese zusätzlich in den +Anlagen KAP, AUS oder SO erklärt werden. +Die Jahresbescheinigung ersetzt NICHT die Steuerbescheinigung nach §45a Abs. 2 oder 3 EStG. Für die Anrechnung von Kapitalertragsteuer / Zinsabschlag / Körperschaftsteuer ist +weiterhin die Steuerbescheinigung der Einkommensteuer- / Feststellungserklärung beizufügen. +Bei der Übernahme der bescheinigten Angaben in der Einkommensteuer- / Feststellungserklärung beachten Sie bitte folgende Hinweise: +Soweit die bescheinigten Erträge und / oder Aufwendungen zu den Einkünften aus Land- und Forstwirtschaft, aus Gewerbebetrieb, aus selbständiger Arbeit oder aus Vermietung +und Verpachtung gehören, sind sie diesen Einkünften zuzurechnen und in den dafür vorgesehenen Anlagen zur Einkommensteuer-/ Feststellungserklärung anzugeben. +Kapitalerträge (Anlage KAP) +Die Einnahmen sind einschließlich freigestellter Einnahmen (Freistellungsauftrag), anzurechnender / erstatteter Kapitalertragsteuer / Zinsabschlag / Solidaritätszuschlag +bescheinigt. +Bei der Veräußerung oder Rückgabe von Anteilen an ausländischen thesaurierenden Fonds unterliegen nicht nur die zum Ende des letzten Geschäftsjahres des Fonds als +zugeflossen geltenden Erträge, sondern auch zum Ende früherer Geschäftsjahre als zugeflossen geltenden Erträge dem Zinsabschlag. In der Einkommensteuer-/ +Feststellungserklärung sind jedoch die im Jahr der Veräußerung oder Rückgabe des Investmentanteils als zugeflossen geltenden Erträge anzugeben, weil die zum Ende früherer +Geschäftsjahre als zugeflossen geltenden Erträge bereits in früheren Kalenderjahren zu versteuern waren. Der Zinsabschlag kann nur angerechnet werden, soweit die zum Ende +früherer Geschäftsjahre thesaurierten Erträge bei der Veranlagung erfasst wurden. Bisher nicht bei der Veranlagung erfasste Erträge sind für die betreffenden Jahre nachzumelden. +Die Erträge aus ausländischen Wertpapieren unterliegen der Einkommensteuer mit dem Bruttobetrag, d.h. einschließlich der ausländischen Steuern. +Aufwendungen sind nur insoweit bescheinigt, als sie im Zusammenhang mit der Konto- und/oder Depotführung entstanden sind (Depotgebühren, Kosten der +Erträgnisaufstellung, Beratungsgebühren, Entgelte für Verwaltungsdienstleistungen). +Die Prüfung, ob + - die angeführten Aufwendungen tatsächlich Werbungskosten sind oder + - weitere Aufwendungen, die in die Anlage KAP zu übernehmen sind, entstanden sind, obliegt dem Steuerpflichtigen. +Veräußerungsgeschäfte bei Wertpapieren (Anlage SO): +Die Bescheinigung enthält Angaben nur, soweit die erforderlichen Daten bei dem Institut vorhanden sind (z.B. nur Veräußerungszeitpunkt und Veräußerungskosten). Die Prüfung, +ob + - es sich um ein steuerpflichtiges Veräußerungsgeschäft innerhalb der Behaltensfrist (Kauf und Verkauf innerhalb von einem Jahr) handelt, + - die angeführten Aufwendungen tatsächlich Werbungskosten sind oder + - weitere Aufwendungen, die in die Anlage SO zu übernehmen sind, entstanden sind, obliegt dem Steuerpflichtigen. +Im Jahr der Veräußerung oder Rückgabe von Anteilen an Investmentfonds sind der vereinnahmte Veräußerungspreis um hierin enthaltene Zwischengewinne und thesaurierte +Kapitaleinnahmen sowie die Anschaffungskosten um gezahlte Zwischengewinne zu bereinigen. Das bereinigte Veräußerungsergebnis unterliegt der Besteuerung und ist in die +Steuererklärung zu übernehmen. Bitte prüfen Sie, ob das Kreditinstitut seiner Verpflichtung, das Veräußerungsergebnis so zu berechnen und zu bescheinigen, nachgekommen ist. +Vermerke des bescheinigenden Instituts: +Für eine Aufteilung von steuerfreien Erträgen nach Doppelbesteuerungsabkommen auf einzelne Länder verweisen wir auf die "steuerlichen Hinweise" im +jeweiligen Rechenschaftsbericht. +Die vorliegende Bescheinigung kann nicht zur Verwendung für betriebliche Zwecke genutzt werden. + +EUR / CT +Steuerfreie Erträge nach Doppelbesteuerungsabkommen 0,00 + +Zeile 36 Anlage AUS +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 +Depot: 0111111111 +Depotinhaber: Richard Mustermann +Vertragsnummer: 011111111111111111 +Diese Bescheinigung ist für Ihre Unterlagen bestimmt. +Zusatzinformationen nach §7 Abs.4 AltZertG +n Verwendung der eingezahlten Altersvorsorgebeiträge +188,25 Euro wurden in den Fonds Deka-BR 100 investiert. +n Einbehaltene anteilige Abschluss- und Vertriebskosten +Ausgabeaufschlag : D eka-BR 100 +3,50 % des Anteilwertes +n Einbehaltene Kosten für die Verwaltung des gebildeten Kapitals +Verwaltungsvergütung p.a.: D eka-BR 100 +1,00 % des durchschnittl. Fondsvermögens +Depotbankgebühr p.a.: D eka-BR 100 +0,10 % des durchschnittl. Fondsvermögens +Vertragsgebühr in 2006 5,00 Euro +n Erwirtschaftete Erträge +Deka-BR 100 +0,00 Euro +Nächster Thesaurierungszeitpunkt des Fonds ist der 30.06.2007 +Nach §7 Abs. 4 AltZertG informieren wir Sie, dass ethische, soziale und ökologische Belange bei der +Verwendung der eingezahlten Altersvorsorgebeiträge nicht berücksichtigt werden. +Allein verbindliche Informationsgrundlage zu den Fonds ist der jeweils gültige Verkaufsprospekt mit den +Vertragsbedingungen, den zuletzt veröffentlichten Rechenschafts- und Halbjahresberichten sowie das +Preisverzeichnis. Diese erhalten Sie auf Wunsch von Ihrem Berater ausgehändigt oder können Sie bei der +DekaBank Deutsche Girozentrale, Postfach 11 05 23, 60040 Frankfurt (Telefon: 069/7147-652; Internet: +www.deka.de) anfordern. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. + +DekaBank Depot-/Investmentservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale 60625 Frankfurt Telefax: (0 69) 25 46 - 24 83 Frankfurt am Main D E 114103563 +Ø Finanzgruppe www.deka.de HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht11.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht11.txt new file mode 100644 index 0000000000..3c424de35d --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht11.txt @@ -0,0 +1,611 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Jahresdepotauszug per 31.12.2008 +Depotübersicht +Depot: 0111111111 +Depotinhaber: +... +.. +... Richard Mustermann .... Freistellungsauftrag +Erteilt 2008: EUR 600,00 +Beansprucht: EUR 85,44 +Herrn +Richard Mustermann +Musterstraße 9 +11111 Stadt + +ISIN Unterkonto Bezeichnung Wert Wertentwicklung +in EUR in EUR +per 31.12.2008 * per 31.12.2008 +LU0268059614 00 Deka-GeldmarktPlan TF 597,21 -2,79 +LU0348413815 00 DekaLux-PharmaTech TF 1.419,65 -82,65 +DE0008474511 00 AriDeka 1.102,77 -806,33 + VL-Vertrag: gesperrt bis zum 31.12.2010, Vertragsinhaber: Richard Mustermann +LU0133666759 00 Deka-ConvergenceAktien TF 1.148,35 -1.499,01 +LU0052859252 00 DekaLux-Pazifik 1.576,43 -1.390,66 +LU0062624902 00 DekaLux-Deutschland TF A 1.749,70 -1.450,30 +DE0009771824 00 Deka-Geldmarkt: Euro TF 0,00 +0,75 +DE0009771980 00 Deka-EuropaBond TF 1.691,57 -57,82 +DE0009786285 00 Deka-EuropaPotential TF 1.449,50 -1.621,71 +IE0005258151 00 Deka-PharmaTech TF 0,00 -353,80 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 534,52 -278,50 + Beitragszusage: Auf Basis der bisher eingezahlten Altersvorsorgebeiträge +(einschließlich Zulagen) stehen Ihnen aus Ihrem Altersvorsorgevertrag +Deka-BonusRente zu Beginn der Auszahlungsphase mindestens 874,50 +EUR zur Verfügung. + Gesamt in EUR 11.269,70 -7.542,82 +Depotpreis inkl. 19% MwSt: 10,00 EUR belastet im Depot 0111111111 LU0268059614 00 +Entgelte werden gemäß Preisverzeichnis erhoben. + +Besondere Hinweise zur Deka-BonusRente: +Mit diesem Jahresdepotauszug erhalten Sie Zusatzinformationen nach § 7 Abs. 4 AltZertG zu Ihrer Deka-BonusRente. Das Jahresendereporting zur +Deka-BonusRente mit den Bescheinigungen nach § 92 und § 10 a Abs. 5 EStG geht Ihnen mit separater Post Ende Februar 2009 zu. Die +Bescheinigung nach § 10 a Abs. 5 EStG benötigen Sie im Rahmen der Einkommensteuererklärung, um einen zusätzlichen Sonderausgabenabzug +geltend zu machen. +Sofern Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, wird diese auf +Grundlage der von Ihnen mitgeteilten Daten beantragt und nach Eingang der Zulage Ihrem Deka-BonusRente Vertrag gutgeschrieben. + +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem Jahresdepotauszug" auf der Rück- bzw. Folgeseite +Weitere Informationen entnehmen Sie unserer Homepage www.deka.de (Menüpunkt Service) oder rufen Sie uns unter (0 69) 71 47 - 6 52 montags bis +freitags in der Zeit von 8.00 bis 18.00 Uhr an. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +HINWEISE ZU IHREM JAHRESDEPOTAUSZUG Jahresbescheinigung 2008: +Mit in Kraft treten des Steueränderungsgesetzes 2003 sind Kreditinstitute +Wert in EUR per 31.12.2008: verpflichtet, für die bei ihnen geführten Depots eine Jahresbescheinigung zu +Der Wert der Investmentanlage berechnet sich aus dem Anteilsbestand per 31. erstellen. Sind im Kalenderjahr 2008 Kapitalerträge oder private +Dezember 2008 multipliziert mit dem Preis je Anteil . Die Bewertung des Fonds Veräußerungsgeschäfte angefallen, werden Ihnen diese per 31. Dezember 2008 +erfolgt mit dem jeweils letzten verfügbaren Rücknahmepreis, der zum Zeitpunkt in der Jahresbescheinigung ausgewiesen. +der Erstellung dieses Auszugs vorlag. Bitte entnehmen Sie den Fondspreis zum +letzten Handelstag des Jahres dem Jahresbericht der betreffenden Fonds. Die gesetzliche Verpflichtung zur Erstellung besteht gegenüber unbeschränkt +einkommensteuerpflichtigen natürlichen Personen. Haben Sie mehr als ein Depot +Wertentwicklung in EUR per 31.12.2008: in unserem Hause, dann können die Angaben von mehreren Depots in einer +Die Berechnung der Wertentwicklung im Rahmen des Jahresdepotauszuges Jahresbescheinigung zusammengefasst sein. Bei betrieblichen Konten besteht +erfolgt für den Betrachtungszeitraum 1. Januar bis 31. Dezember des keine Verpflichtung zur Ausstellung einer Jahresbescheinigung, wenn das Institut +betreffenden Kalenderjahres. weiß, dass es sich um ein betriebliches Depot handelt. +Für die Berechnung der Wertentwicklung werden für den Betrachtungszeitraum +die Anfangs- und Endbestände sowie Buchungen bei denen es zu einer stücke- Inländische Kapitalerträge aus Investmentanteilen bei Privatvermögen +und/oder geldmäßigen Bewegung kam, herangezogen. Gegebenenfalls errechnen sich aus dem steuerpflichtigen Anteil von Ausschüttungen und +abgeführte Steuern werden hierbei nicht berücksichtigt. Eventuell einbehaltene Thesaurierungen des Kalenderjahres 2008 bezogen auf deutsche Fonds. In der +Gebühren und Ausgabeaufschläge reduzieren Ihre Wertentwicklung. Es wird Jahresbescheinigung sowie der Jahres-Steuerbescheinigung erfolgt der Ausweis +keine Wertentwicklung für das Unterkonto ausgewiesen, wenn dieses im in den Einzelpositionen "Zinsen und andere Erträge (ohne Dividenden) aus +Betrachtungszeitraum ohne Bestand ist. Investmentanteilen" und "Dividenden und ähnliche Erträge aus +Allgemeine Risikohinweise: Investmentanteilen". +Anteile an Investmentfonds sind Wertpapiere, deren Preise durch die +börsentäglichen Kursschwankungen der im jeweiligen Investmentfonds Ausländische Kapitalerträge aus Investmentanteilen bei Privatvermögen +befindlichen Vermögenswerte bestimmt werden und deshalb steigen oder auch errechnen sich analog, aber bezogen auf Fonds, die nach dem für +fallen können. Kursänderungen bei den Vermögensgegenständen (z. B. Aktien, Großbritannien, Irland, Luxemburg oder die Schweiz geltenden Recht aufgelegt +Anleihen) und Wechselkursschwankungen können somit den Wert einer Anlage wurden. In der Jahresbescheinigung sowie der Jahres-Steuerbescheinigung +in Investmentfonds sowohl positiv als auch negativ beeinflussen. erfolgt der Ausweis in den Einzelpositionen "Zinsen und andere Erträge (ohne +Dividenden) aus ausländischen Investmentanteilen" und "Dividenden und +Verwahrung des Anteilsbestandes: ähnliche Erträge aus ausländischen Investmentanteilen". +Die Anteile werden im Girosammel-Depot oder in Form einer Gutschrift in +Wertpapierrechnung verwahrt. Die Anteilbruchteile stellen das Miteigentum an Ausländische Quellensteuern können in der Anlage AUS der +einer Bruchteilgemeinschaft dar. Einkommensteuererklärung ausgewiesen werden. +Beanspruchter Freistellungsauftrag für das Kalenderjahr 2008: Steuerfreie Erträge nach dem Doppelbesteuerungsabkommen unterliegen nicht +Die Höhe des von Ihnen erteilten Freistellungsauftrages entnehmen Sie bitte Ihrer der deutschen Einkommensteuer, aber dem sogenannten Progressionsvorbehalt +Depotübersicht oder Ihrem Depotauszug. Für 2008 und Folgejahre gestellte und sind daher in der Anlage AUS auszuweisen. +Freistellungsaufträge gelten für alle bestehenden und zukünftigen freistellbaren +DekaBank Depots, die von einem vermittelnden Institut betreut werden. Bitte Weitere Informationen erhalten Sie bei Ihrem Steuerberater. +beachten Sie, dass die Bemessungsgrundlage für die Zinsabschlagsteuer und die +Einkommensteuer in vielen Fällen nicht identisch ist. Deshalb kann die Höhe des Werbungskosten: +beanspruchten Freistellungsauftrages von den "inländischen bzw. ausländischen Werbungskosten, z.B. Depotpreis, die Ihnen im Zusammenhang mit Ihren +Kapitalerträgen aus Investmentanteilen bei Privatvermögen" abweichen. Investmentanteilen entstanden sind, müssen im Rahmen der +Einkommensteuererklärung auf die Kapitalerträge, die dem +Bescheinigung vermögenswirksamer Leistungen für 2008: Halbeinkünfteverfahren unterliegen und die übrigen steuerpflichtigen +Wenn in Ihrem Depot vermögenswirksame Leistungen (VL) verwahrt werden, Kapitalerträge aufgeteilt werden. Aufteilungsmaßstab kann hierbei das Verhältnis +erhalten Sie mit dem Jahresdepotauszug per 31. Dezember 2008 eine der voll steuerpflichtigen Erträge zu den Erträgen, die dem +Bescheinigung der im Kalenderjahr 2008 eingezahlten VL-Leistungen. Bitte fügen Halbeinkünfteverfahren unterliegen, sein. +Sie diese Bescheinigung Ihrer Einkommensteuererklärung bei. Sie dient als Antrag +zur Gewährung einer Sparzulage. Zinsinformationsverordnung: +Aufgrund der am 01. Juli 2005 in Kraft getretenen Zinsinformationsverordnung +Zahlungseingänge, die nicht mehr im Kalenderjahr 2008 erfolgen, (z.B. im Januar (auf Grundlage der EU-Zinsrichtlinie 2003/ 48 / EG des Rates vom 03. Juni 2003) +2009 für Dezember 2008) werden erst in der Bescheinigung für das Kalenderjahr ist die DekaBank verpflichtet, Zinserträge von wirtschaftlichen Eigentümern mit +2009 ausgewiesen. ausländischem Wohnsitz innerhalb der angeschlossenen EU-Staaten an das +Bundeszentralamt für Steuern zu melden. +Sollten auf Ihrem Vertrag Zahlungseingänge fehlen, fragen Sie bitte erst bei Dieser Richtlinie unterliegen alle Depots von Privatanlegern, die in einem anderen +Ihrem Arbeitgeber nach, auf welches Konto die vermögenswirksamen Leistungen Mitgliedstaat der Europäischen Union ansässig sind. +überwiesen wurden. Erst mit dieser Information können wir die Ziel dieser Richtlinie ist es, innerhalb der Europäischen Union durch Austausch +Zahlungseingänge überprüfen. von Informationen eine effektive Besteuerung von Zinserträgen zu ermöglichen. +Dazu gehören nach den Bestimmungen der Zinsinformationsverordnung, unter +Vermögensbeteiligungen gem. Paragraph 19a EStG: Beachtung bestimmter Sonderregelungen, auch solche Zinserträge, die im +Die gesetzliche Sperrfrist von sechs Jahren ist seit dem Steueränderungsgesetz Rahmen von Ausschüttungen oder Anteilscheinrückgaben von Investmentfonds +2001 entfallen. Die Vermögensbeteiligungen sind frei verfügbar. Ggf. sind gezahlt werden. +zivilrechtlich vereinbarte Haltedauern zwischen Arbeitnehmer und Arbeitgeber zu +beachten. +Jahres-Steuerbescheinigung 2008: +Wurde Ihnen im Kalenderjahr 2008 Zinsabschlagsteuer und Solidaritätszuschlag +einbehalten oder Kapitalertragsteuer (20 %) auf inländische Dividendenanteile +nicht voll bzw. gar nicht erstattet, erhalten Sie mit dem Jahresdepotauszug per +31. Dezember 2008 eine Jahres-Steuerbescheinigung. In der tabellarischen +Zusammenfassung sind die jeweiligen Summen angedruckt. Für die in den +Positionen "anrechenbarer Zinsabschlag (30%)", "anrechenbare +Kapitalertragsteuer (20%)" und "anrechenbarer Solidaritätszuschlag" +ausgewiesenen Beträge kann eine Anrechnung im Rahmen der +Einkommensteuerklärung erfolgen. Wurden keine deutschen Steuern +einbehalten, entfällt die Jahres-Steuerbescheinigung. + +Jahresdepotauszug per 31.12.2008 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Lastschrifteinzug 600,00 1.003,330000 +0,598 03.09.2008 03.09.2008 +Depotpreis 10,00 1.013,930000 -0,010 12.12.2008 12.12.2008 +Bestand am 31.12.2008 597,21 1.015,670000 0,588 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Kauf 1.502,30 95,110000 +15,795 30.06.2008 30.06.2008 +Bestand am 31.12.2008 1.419,65 89,880000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +Deka-BonusRente Vertragsnr.: 0111111111 999405 00 +Deka-BR 100 +ISIN: DE0005424519 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 250,19 45,250000 5,529 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Lastschrifteinzug 188,25 47,630000 +3,952 19.02.2008 27.12.2007 +Abrechnungsbetrag Thesaurierung 0,27 37,340000 +0,007 01.07.2008 01.07.2008 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2008 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Lastschrifteinzug 114,00 38,960000 +2,926 03.09.2008 18.08.2008 +Lastschrifteinzug 270,00 36,030000 +7,494 01.10.2008 01.10.2008 +Vertragsgebühr 10,00 28,040000 -0,357 12.12.2008 12.12.2008 +Bestand am 31.12.2008 534,52 27,340000 19,551 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +AriDeka +ISIN: DE0008474511 Unterkonto: 00 +Verwahrart: GiroSammel +VL-Vertrag: gesperrt bis zum 31.12.2010, Vertragsinhaber: Richard Mustermann + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 1.501,10 70,630000 21,253 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Kauf 34,00 65,460000 +0,519 31.01.2008 31.01.2008 +Abrechnungsbetrag Ausschüttung 16,09 62,470000 +0,258 22.02.2008 22.02.2008 +Kauf 34,00 65,490000 +0,519 29.02.2008 29.02.2008 +Kauf 34,00 61,660000 +0,551 31.03.2008 31.03.2008 +Kauf 34,00 65,480000 +0,519 30.04.2008 30.04.2008 +Kauf 34,00 66,890000 +0,508 30.05.2008 30.05.2008 +Kauf 34,00 58,850000 +0,578 30.06.2008 30.06.2008 +Kauf 34,00 58,900000 +0,577 31.07.2008 31.07.2008 +Kauf 34,00 59,510000 +0,571 29.08.2008 29.08.2008 +Kauf 34,00 52,190000 +0,651 30.09.2008 30.09.2008 +Kauf 34,00 43,870000 +0,775 31.10.2008 31.10.2008 +Kauf 34,00 41,630000 +0,817 28.11.2008 28.11.2008 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2008 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Kauf 34,00 40,100000 +0,848 30.12.2008 30.12.2008 +Bestand am 31.12.2008 1.102,77 38,100000 28,944 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Kauf 997,36 173,110000 +5,761 07.03.2008 07.03.2008 +Lastschrifteinzug 600,00 169,920000 +3,531 04.04.2008 04.04.2008 +Lastschrifteinzug 450,00 181,970000 +2,473 13.06.2008 13.06.2008 +Lastschrifteinzug 600,00 173,860000 +3,451 01.07.2008 01.07.2008 +Abrechnungsbetrag Thesaurierung 0,00 127,530000 +0,000 01.10.2008 01.10.2008 +Bestand am 31.12.2008 1.148,35 75,470000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +DekaLux-Pazifik +ISIN: LU0052859252 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 2.967,09 513,960000 5,773 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2008 +Umsatz-Jahresübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Abrechnungsbetrag Ausschüttung 38,51 239,570000 +0,161 20.11.2008 20.11.2008 +Bestand am 31.12.2008 1.576,43 265,660000 5,934 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 3.000,00 100,080000 29,976 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Lastschrifteinzug 200,00 88,100000 +2,270 05.05.2008 05.05.2008 +Abrechnungsbetrag Ausschüttung 3,55 45,320000 +0,078 20.11.2008 20.11.2008 +Bestand am 31.12.2008 1.749,70 54,130000 32,324 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +Deka-Geldmarkt: Euro TF +ISIN: DE0009771824 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 996,61 67,080000 14,857 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Kauf aus Ertrag 11,13 66,330000 +0,168 02.01.2008 02.01.2008 +Fortsetzung auf Seite 5 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2008 +Umsatz-Jahresübersicht +Seite 5 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Verkauf 997,36 66,380000 -15,025 07.03.2008 07.03.2008 +Bestand am 31.12.2008 0,00 66,510000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +Deka-EuropaBond TF +ISIN: DE0009771980 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 1.749,39 37,150000 47,090 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Abrechnungsbetrag Ausschüttung 72,52 36,290000 +1,998 20.08.2008 20.08.2008 +Bestand am 31.12.2008 1.691,57 34,460000 49,088 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 3.071,21 85,430000 35,950 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Bestand am 31.12.2008 1.449,50 40,320000 35,950 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 + +Fortsetzung auf Seite 6 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2008 +Umsatz-Jahresübersicht +Seite 6 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-PharmaTech TF +ISIN: IE0005258151 Unterkonto: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2007 1.856,10 38,350000 48,399 +Bewertung mit dem Rücknahmepreis vom 28.12.2007 +Abrechnungsbetrag Thesaurierung 0,00 31,040000 +0,000 30.06.2008 30.06.2008 +Verkauf 1.502,30 31,040000 -48,399 30.06.2008 30.06.2008 +Bestand am 31.12.2008 0,00 31,040000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.06.2008 + +Dieser Depotauszug besteht aus 6 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +vom Name, Vorname Steuernummer / Identifikationsnummer +Arbeit- +nehmer +auszu- 2008 +füllen +99 1 5 +Anlage VL 9 +Wichtiger Hinweis: 87 +Herrn +Richard Mustermann Diese Bescheinigung benötigen Sie, wenn Sie eine +Musterstraße 9 Arbeitnehmer-Sparzulage nach dem Fünften +11111 Stadt Vermögensbildungsgesetz (VermBG) beantragen wollen. In + diesem Fall fügen Sie bitte die Bescheinigung Ihrer +Einkommensteuererklärung / Ihrem Antrag auf +Arbeitnehmer-Sparzulage bei. +Bescheinigung vermögenswirksamer Leistungen für 2008 +(§ 15 Abs. 1 VermBG, § 5 VermBDV 1994) +Arbeitnehmer (Name, Vorname) geboren am +Mustermann, Richard 01.01.1980 +Straße, Hausnummer +Musterstraße 9 +Postleitzahl, Wohnort +11111 Stadt +1. Vertrag 2. Vertrag +Art der Anlage *) 0 1 0 +Institutsschlüssel für die +Arbeitnehmer- Sparzulage 1 1111111 1 +Vertragsnummer +(nur für Finanzamt) 2 11111111111111 2 +Vermögenswirksame Leistungen +(auf volle Euro aufgerundet) 3 408,00 3 +Ende der Sperrfrist +(Format: TT.MM.JJJJ) 4 31.12.2010 4 +Anlageinstitut, Unternehmen, Empfänger +DekaBank +Deutsche Girozentrale +60625 Frankfurt am Main erstellt per 31. Dezember 2008 +*) 1 = Sparvertrag über Wertpapiere oder andere Vermögensbeteiligungen (§ 4 VermBG) +Vertragsnummer der DekaBank: V119701696 (1. Vertrag) +Anlage VL +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. Irrtum vorbehalten. +Seite 1 +Jahresbescheinigung über Kapitalerträge und Veräußerungsgeschäfte aus Finanzanlagen für +die bei uns geführten Depots für Investmentfonds (§24c EStG) des Privatvermögens + +Richard Mustermann, 11111 Stadt, Musterstraße 9 + +Für den Zeitraum vom 01.01.2008 bis 31.12.2008 werden folgende Angaben für die Besteuerung der Einkünfte aus Kapitalvermögen nach §20 EStG sowie +der Einkünfte aus privaten Veräußerungsgeschäften nach §23 Abs. 1 Satz 1 Nr. 2 bis 4 EStG bescheinigt: +Einnahmen Anzurechnende inländische (r) +Inländische Kapitalerträge (Anl. KAP) Zinsabschlag / Kapitalertragsteuer +EUR EUR / CT +Zinsen und andere Erträge (ohne Dividenden) aus Investmentanteilen (einschließlich +Zwischengewinne) Zeile 8 Anlage KAP 76,06 0,00 +Dividenden und ähnliche Erträge aus Investmentanteilen +Zeile 19 Anlage KAP 15,60 0,00 +Einnahmen Anzurechnender inländischer +Ausländische Kapitalerträge ( Anl. KAP) Zinsabschlag +EUR EUR / CT +Zinsen und andere Erträge (ohne Dividenden) aus ausländischen Investmentanteilen +(Investmentsteuergesetz) 1,26 0,00 +Zeile 32 Anlage KAP +Dividenden und ähnliche Erträge aus ausländischen Investmentanteilen +(Investmentsteuergesetz) 48,12 +Zeile 34 Anlage KAP +Anzurechnende Solidaritätszuschläge (Anl. KAP) EUR / CT +Summe aller anzurechnenden Solidaritätszuschläge zur Kapitalertragsteuer / zum Zinsabschlag +Zeile 44 Anlage KAP 0,00 +Aufwendungen (Anl. KAP) EUR +Aufwendungen im Zusammenhang mit Kapitalerträgen 10,00 +Ausländische Einkünfte und Steuern (Anl. AUS) 1. Staat/Fonds 2. Staat/Fonds 3. Staat/Fonds +LU0268059614 LU0133666759 LU0052859252 +Kapitalvermögen Einkunftsquelle Einkunftsquelle Einkunftsquelle +Einnahmen, die in den Zeilen 31und 32 der Anlage KAP enthalten sind EUR EUR EUR +Zeile 6 Anlage AUS -2,93 +Einnahmen, die in den Zeilen 33 und 34 der Anlage KAP enthalten sind 4,73 43,39 +Zeile 7 Anlage AUS +Zinsen und andere Erträge (ohne Dividenden) aus einem inländ. Sondervermögen, die aus +ausländ. Quellen stammen +Zeile 8 Anlage AUS +Dividenden und ähnliche Erträge aus einem inländ. Sondervermögen, die aus ausländ. +Quellen stammen +Zeile 9 Anlage AUS +Ausl. Steuern (Wahlrecht zur Anrechnung oder zum Abzug gemäß der Anleitung zur Anlage +AUS "zu den Zeilen 4 bis 20 bzw. zu den Zeilen 12, 13 und 17") +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Seite 2 +Richard Mustermann, 11111 Stadt, Musterstraße 9 + + + +Ausländische Einkünfte und Steuern (Anl. AUS) 4. Staat/Fonds 5. Staat/Fonds 6. Staat/Fonds +LU0062624902 +Kapitalvermögen Einkunftsquelle Einkunftsquelle Einkunftsquelle +Einnahmen, die in den Zeilen 31und 32 der Anlage KAP enthalten sind EUR EUR EUR +Zeile 6 Anlage AUS 4,19 +Einnahmen, die in den Zeilen 33 und 34 der Anlage KAP enthalten sind +Zeile 7 Anlage AUS +Zinsen und andere Erträge (ohne Dividenden) aus einem inländ. Sondervermögen, die aus +ausländ. Quellen stammen +Zeile 8 Anlage AUS +Dividenden und ähnliche Erträge aus einem inländ. Sondervermögen, die aus ausländ. +Quellen stammen +Zeile 9 Anlage AUS +Ausl. Steuern (Wahlrecht zur Anrechnung oder zum Abzug gemäß der Anleitung zur Anlage +AUS "zu den Zeilen 4 bis 20 bzw. zu den Zeilen 12, 13 und 17") + +Private Veräußerungsgeschäfte (Anl. SO) +A rt des Wirtschaftsguts Zeitpunkt der Zeitpunkt der Veräußerungspreis Anschaffungskosten Aufwendungen im Ergebnis (EUR) Dem +(ISIN, Anschaffung (Datum) Veräußerung (Datum) (EUR) oder an deren Stelle Zusammenhang mit Halbeinkünftever- +Wertpapierbezeichnung) tretender Wert (EUR) dem Veräußerungs- fahren unterliegend +geschäft (nur Trans- (ja/nein) +aktionskosten) (EUR) + DE0009771824, 02.01.2008 07.03.2008 11,15 11,14 0,01 nein +Deka-Geldmarkt: Euro TF, +Anteile 0,168 + IE0005258151, 30.06.2008 Transfer * +Deka-PharmaTech TF, +Anteile 48,399 + LU0268059614, 03.09.2008 12.12.2008 10,10 9,98 0,12 nein +Deka-GeldmarktPlan TF, +Anteile 0,010 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Seite 3 +Richard Mustermann, 11111 Stadt, Musterstraße 9 +Die Jahresbescheinigung über Kapitalerträge und Veräußerungsgeschäfte aus Finanzanlagen soll Ihnen das Ausfüllen der Anlagen KAP, AUS und SO zur Einkommensteuer-/ +Feststellungserklärung erleichtern. +Haben Sie weitere, hier nicht aufgeführte Einnahmen aus Kapitalvermögen erzielt oder private Veräußerungsgeschäfte getätigt, müssen diese zusätzlich in den +Anlagen KAP, AUS oder SO erklärt werden. +Die Jahresbescheinigung ersetzt NICHT die Steuerbescheinigung nach § 45 a Abs. 2 oder 3 EStG. Für die Anrechnung von Kapitalertragsteuer / Zinsabschlag / Körperschaftsteuer +ist weiterhin die Steuerbescheinigung der Einkommensteuer- / Feststellungserklärung beizufügen. +Bei der Übernahme der bescheinigten Angaben in der Einkommensteuer- / Feststellungserklärung beachten Sie bitte folgende Hinweise: +Soweit die bescheinigten Erträge und / oder Aufwendungen zu den Einkünften aus Land- und Forstwirtschaft, aus Gewerbebetrieb, aus selbständiger Arbeit oder aus Vermietung +und Verpachtung gehören, sind sie diesen Einkünften zuzurechnen und in den dafür vorgesehenen Anlagen zur Einkommensteuer-/ Feststellungserklärung anzugeben. +Kapitalerträge (Anlage KAP) +Die Einnahmen sind einschließlich freigestellter Einnahmen (Freistellungsauftrag), anzurechnender / erstatteter Kapitalertragsteuer / Zinsabschlag / Solidaritätszuschlag +bescheinigt. +Bei der Veräußerung oder Rückgabe von Anteilen an ausländischen thesaurierenden Fonds unterliegen nicht nur die zum Ende des letzten Geschäftsjahres des Fonds als +zugeflossen geltenden Erträge, sondern auch zum Ende früherer Geschäftsjahre als zugeflossen geltenden Erträge dem Zinsabschlag. In der Einkommensteuer-/ +Feststellungserklärung sind jedoch die im Jahr der Veräußerung oder Rückgabe des Investmentanteils als zugeflossen geltenden Erträge anzugeben, weil die zum Ende früherer +Geschäftsjahre als zugeflossen geltenden Erträge bereits in früheren Kalenderjahren zu versteuern waren. Der Zinsabschlag kann nur angerechnet werden, soweit die zum Ende +früherer Geschäftsjahre thesaurierten Erträge bei der Veranlagung erfasst wurden. Bisher nicht bei der Veranlagung erfasste Erträge sind für die betreffenden Jahre nachzumelden. +Die Erträge aus ausländischen Wertpapieren unterliegen der Einkommensteuer mit dem Bruttobetrag, d.h. einschließlich der ausländischen Steuern. +Aufwendungen sind nur insoweit bescheinigt, als sie im Zusammenhang mit der Konto- und/oder Depotführung entstanden sind (Depotgebühren, Kosten der +Erträgnisaufstellung, Beratungsgebühren, Entgelte für Verwaltungsdienstleistungen). +Die Prüfung, ob + - die angeführten Aufwendungen tatsächlich Werbungskosten sind oder + - weitere Aufwendungen, die in die Anlage KAP zu übernehmen sind, entstanden sind, obliegt dem Steuerpflichtigen. +Veräußerungsgeschäfte bei Wertpapieren (Anlage SO): +Die Bescheinigung enthält Angaben nur, soweit die erforderlichen Daten bei dem Institut vorhanden sind (z.B. nur Veräußerungszeitpunkt und Veräußerungskosten). Die Prüfung, +ob + - es sich um ein steuerpflichtiges Veräußerungsgeschäft innerhalb der Behaltensfrist (Kauf und Verkauf innerhalb von einem Jahr) handelt, + - die angeführten Aufwendungen tatsächlich Werbungskosten sind oder + - weitere Aufwendungen, die in die Anlage SO zu übernehmen sind, entstanden sind, +obliegt dem Steuerpflichtigen. +Im Jahr der Veräußerung oder Rückgabe von Anteilen an Investmentfonds sind der vereinnahmte Veräußerungspreis um hierin enthaltene Zwischengewinne und thesaurierte +Kapitaleinnahmen sowie die Anschaffungskosten um gezahlte Zwischengewinne zu bereinigen. Das bereinigte Veräußerungsergebnis unterliegt der Besteuerung und ist in die +Steuererklärung zu übernehmen. Bitte prüfen Sie, ob das Kreditinstitut seiner Verpflichtung, das Veräußerungsergebnis so zu berechnen und zu bescheinigen, nachgekommen ist. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Seite 4 +Richard Mustermann, 11111 Stadt, Musterstraße 9 +Vermerke des bescheinigenden Instituts: +* Transfer des Sondervermögens innerhalb des DekaBank Konzerns, daher keine Realisierung von Spekulationsgewinnen bzw. -verlusten. +Für eine Aufteilung von steuerfreien Erträgen nach Doppelbesteuerungsabkommen auf einzelne Länder verweisen wir auf die "steuerlichen Hinweise" im jeweiligen +Rechenschaftsbericht. +Ausländische Einkünfte und Steuern (Anl. AUS) +Das Bundesministerium für Finanzen sieht für die Einkommensteuererklärung in der Anlage AUS eine Trennung der anrechenbaren/abziehbaren ausländischen +Quellensteuer für Zinsen und Dividenden nach dem Halbeinkünfteverfahren vor. Im amtlichen Muster der Jahresbescheinigung wird diese Trennung allerdings vom +Bundesministerium für Finanzen nicht berücksichtigt. Bitte beachten Sie, dass für den Fonds DE0007483612 (Deka-ImmobilienGlobal), den Fonds DE0009809566 +(Deka-ImmobilienEuropa) und den Fonds DE0008474263 (DWS Convertibles) in der Jahresbescheinigung (Feld: Ausl. Steuern (Wahlrecht zur Anrechnung oder zum Abzug +gemäß der Anleitung zur Anlage AUS ''zu den Zeilen 4 bis 20 bzw. zu den Zeilen 12, 13 und 17") sowohl anrechenbare/abziehbare ausländische Quellensteuer aus Zinsen +und aus Dividenden in einem Betrag ausgewiesen sind. Haben Sie diese Fonds zum Ertragstermin im Bestand gehalten, dann berücksichtigen Sie bitte folgende Werte für +Ihre Einkommensteuer: +- DE0007483612 (Deka-ImmobilienGlobal), anrechenbare Quellensteuer auf Zinsen 0,0207406 EUR pro Anteil und auf Dividenden 0,0589223 EUR pro Anteil +- DE0009809566 (Deka-ImmobilienEuropa), anrechenbare Quellensteuer auf Zinsen 0,0171105 EUR pro Anteil und auf Dividenden 0,0068846 EUR pro Anteil +- DE0008474263 (DWS Convertibles), anrechenbare Quellensteuer auf Zinsen 0,0131000 EUR pro Anteil und auf Dividenden 0,0107000 EUR pro Anteil +Als Anteilbestand gilt der für die Ertragsausschüttung vom 7. Januar 2008 bzw 21. November 2008 gültige Depotbestand. Bitte tragen Sie die Beträge in voller Höhe in die +Einkommensteuererklärung ein, da das Finanzamt automatisch für Dividenden das Halbeinkünfteverfahren berücksichtigt. +Die vorliegende Bescheinigung kann nicht zur Verwendung für betriebliche Zwecke genutzt werden. + +EUR / CT +Steuerfreie Erträge nach Doppelbesteuerungsabkommen 0,00 + +Zeile 35 Anlage AUS +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann + + Vertragsnummer: 01111111111111110 +Diese Bescheinigung ist für Ihre Unterlagen bestimmt. +Zusatzinformationen nach §7 Abs.4 AltZertG +n Verwendung der eingezahlten Altersvorsorgebeiträge +384,00 Euro wurden in den Fonds Deka-BR 100 investiert. +n Einbehaltene anteilige Abschluss- und Vertriebskosten +Ausgabeaufschlag : D eka-BR 100 +3,50 % des Anteilwertes +n Einbehaltene Kosten für die Verwaltung des gebildeten Kapitals +Verwaltungsvergütung p.a.: D eka-BR 100 +1,00 % des durchschnittl. Fondsvermögens +Depotbankgebühr p.a.: D eka-BR 100 +0,10 % des durchschnittl. Fondsvermögens +Vertragsgebühr in 2008 10,00 Euro +n Erwirtschaftete Erträge +Deka-BR 100 +5,25 Euro +Nächster Thesaurierungszeitpunkt des Fonds ist der 30.06.2009 +Nach §7 Abs. 4 AltZertG informieren wir Sie, dass ethische, soziale und ökologische Belange bei der +Verwendung der eingezahlten Altersvorsorgebeiträge nicht berücksichtigt werden. +Allein verbindliche Informationsgrundlage zu den Fonds ist der jeweils gültige Verkaufsprospekt mit den +Vertragsbedingungen, den zuletzt veröffentlichten Rechenschafts- und Halbjahresberichten sowie das +Preisverzeichnis. Diese erhalten Sie auf Wunsch von Ihrem Berater ausgehändigt oder können Sie bei der +DekaBank Deutsche Girozentrale, Postfach 11 05 23, 60040 Frankfurt (Telefon: 069/7147-652; Internet: +www.deka.de) anfordern. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht12.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht12.txt new file mode 100644 index 0000000000..0a6f859b90 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht12.txt @@ -0,0 +1,488 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Jahresdepotauszug per 31.12.2009 +Depotübersicht +Depot: 0111111111 +Depotinhaber: +........ Richard Mustermann .... Bankverbindung: +Konto: 0000111111 BLZ: 793 517 30 +Spk Ostunterfranken +Herrn Inh.: Richard Mustermann +Richard Mustermann Sparer-Pauschbetrag +Musterstraße 9 Erteilt 2009: EUR 600,00 +11111 Stadt Beansprucht: EUR 163,08 + +ISIN Unterdepot Bezeichnung Wert Wertentwicklung +in EUR in EUR +per 31.12.2009 * für 2009 +LU0268059614 00 Deka-GeldmarktPlan TF 2.009,05 +1,84 +LU0268059614 01 Deka-GeldmarktPlan TF 0,00 +1,16 +LU0348413815 00 DekaLux-PharmaTech TF 1.703,02 +283,37 +DE0008474511 00 AriDeka CF 1.499,78 +329,01 + VL-Vertrag: gesperrt bis zum 31.12.2010, Vertragsinhaber: Richard +Mustermann +LU0133666759 00 Deka-ConvergenceAktien TF 2.143,93 +995,58 +LU0052859252 00 DekaLux-Pazifik 2.453,52 +877,09 +LU0062624902 00 DekaLux-Deutschland TF A 2.321,65 +571,95 +DE0009771980 00 Deka-EuropaBond TF 1.841,95 +150,38 +DE0009786285 00 Deka-EuropaPotential TF 2.042,31 +592,81 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 1.284,38 +115,86 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +1.508,50 EUR + Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. + Gesamt in EUR 17.299,59 +3.919,05 +Depotpreis inkl. 19% MwSt: 10,00 EUR am 04.12.2009 belastet von Konto-Nr. 0000111111 BLZ 79351730 +Entgelte werden gemäß Preisverzeichnis erhoben. + +Besondere Hinweise zur Deka-BonusRente: +Mit diesem Jahresdepotauszug erhalten Sie Zusatzinformationen nach § 7 Abs. 4 AltZertG zu Ihrer Deka-BonusRente. Das Jahresendereporting zur +Deka-BonusRente mit den Bescheinigungen nach § 92 und § 10 a Abs. 5 EStG geht Ihnen mit separater Post Ende Februar 2010 zu. Die +Bescheinigung nach § 10 a Abs. 5 EStG benötigen Sie im Rahmen der Einkommensteuererklärung, um einen zusätzlichen Sonderausgabenabzug +geltend zu machen. +Sofern Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, wird diese auf +Grundlage der von Ihnen mitgeteilten Daten beantragt und nach Eingang der Zulage Ihrem Deka-BonusRente Vertrag gutgeschrieben. +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem Jahresdepotauszug" auf der Rück- bzw. Folgeseite +Weitere Informationen entnehmen Sie unserer Homepage www.deka.de (Menüpunkt Service) oder rufen Sie uns unter (0 69) 71 47 - 6 52 montags bis +freitags in der Zeit von 8.00 bis 18.00 Uhr an. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2009 +Depotübersicht +Depot: 0111111111 +Depotinhaber: +Richard Mustermann + +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +HINWEISE ZU IHREM JAHRESDEPOTAUSZUG Verkäufen mit Ersatzbemessungsgrundlage) bzw. eine freiwillige Veranlagung in +Betracht kommen kann (z. B. Günstigerprüfung, Verrechnung Kapitalerträge von +Wert in EUR per 31.12.2009: mehreren Kreditinstituten etc). Nähere Informationen entnehmen Sie bitte der +Der Wert der Investmentanlage berechnet sich aus dem Anteilbestand per 31. Broschüre "Steuerleitfaden Abgeltungsteuer", die Sie bei Ihrer +Dezember 2009 multipliziert mit dem Preis je Anteil. Die Bewertung des Fonds Sparkasse/Landesbank oder unter deka.de (Service -> Broschüren) erhalten. +erfolgt mit dem jeweils letzten verfügbaren Rücknahmepreis, der zum Zeitpunkt Jahresbescheinigung 2009: +der Erstellung dieses Auszugs vorlag. Bitte entnehmen Sie den Fondspreis zum Die bisherige Erstellung einer Jahresbescheinigung entfällt. Die für das Jahr 2009 +letzten Handels- bzw Bewertungstag des Jahres dem Jahresbericht der getätigten Veräußerungsgeschäfte innerhalb der einjährigen Spekulationsfrist +betreffenden Fonds. werden Ihnen in einer gesonderten Aufstellung ausgewiesen. +Wertentwicklung in EUR per 31.12.2009: Höhe der Kapitalerträge aus Investmentanteilen bei Privatvermögen +Die Berechnung der Wertentwicklung im Rahmen des Jahresdepotauszuges Diese errechnet sich aus den kapitalertragsteuerpflichtigen Anteilen von +erfolgt für den Betrachtungszeitraum 1. Januar bis 31. Dezember des Ausschüttungen, Thesaurierungen und Veräußerungsgeschäften des +betreffenden Kalenderjahres. Kalenderjahres 2009. Sie werden um den verrechenbaren +Für die Berechnung der Wertentwicklung werden für den Betrachtungszeitraum Verlustverrechnungstopf (gezahlte Zwischengewinne und Veräußerungsverluste) +die Anfangs- und Endbestände sowie Buchungen bei denen es zu einer stücke- gemindert. Bei ausländisch thesaurierenden Fonds oder bei Ausweis der +und/oder geldmäßigen Bewegung kam, herangezogen. Gegebenenfalls Ersatzbemessungsgrundlage kann die tatsächliche Einkommensteuerpflicht nur +abgeführte Steuern werden hierbei nicht berücksichtigt. Eventuell einbehaltene im Wege der Veranlagung ermittelt werden. +Gebühren und Ausgabeaufschläge reduzieren Ihre Wertentwicklung. Es wird Kapitalerträge aus Investmentanteilen bei Betriebsvermögen +keine Wertentwicklung für das Unterdepot ausgewiesen, wenn dieses im Diese Werte errechnen sich aus dem mit Kapitalertragsteuer belasteten Anteil von +Betrachtungszeitraum ohne Bestand ist. Ausschüttungen und Thesaurierungen des Kalenderjahres 2009. +Allgemeine Risikohinweise: Veräußerungsgeschäfte werden berücksichtigt sofern eine Kapitalertragsteuer +Anteile an Investmentfonds sind Wertpapiere, deren Preise durch die aufgrund der Rechtsform oder fehlender Freistellung belastet wurde. Für +börsentäglichen Kursschwankungen der im jeweiligen Investmentfonds betriebliche Anleger stellt die Abgeltungsteuer nur eine Vorauszahlung auf die +befindlichen Vermögenswerte bestimmt werden und deshalb steigen oder auch Einkommen- oder Körperschaftsteuerschuld dar und hat keine abgeltende +fallen können. Kursänderungen bei den Vermögensgegenständen (z. B. Aktien, Wirkung. +Anleihen) und Wechselkursschwankungen können somit den Wert einer Anlage Übergangsregelung für die Veräußerung von Anteilen an +in Investmentfonds sowohl positiv als auch negativ beeinflussen. steueroptimierten Geldmarktfonds +Verwahrung des Anteilsbestandes: Besondere Übergangsregelungen gelten für die Veräußerungsgewinne aus sog. +Die Anteile werden im Girosammel-Depot oder in Form einer Gutschrift in steueroptimierten Geldmarktfonds, d. h. solchen Fonds, deren Anlagepolitik auf +Wertpapierrechnung verwahrt. Die Anteilbruchteile stellen das Miteigentum an die Erzielung einer Geldmarktrendite ausgerichtet ist und deren Termingeschäfts- +einer Bruchteilgemeinschaft dar. und Wertpapierveräußerungsgewinne die ordentlichen Erträge übersteigen: +Beanspruchter Sparer-Pauschbetrag für das Kalenderjahr 2009: Wurden diese Anteile nach dem 18. September 2008 angeschafft, so unterliegen +Der neue Sparer-Pauschbetrag von 801 bzw. 1.602 EUR ersetzt den früheren die Gewinne haltedauerunabhängig der Abgeltungsteuer. Vor dem 19. +Sparer-Freibetrag. Die Höhe des von Ihnen erteilten Sparer-Pauschbetrages September 2008 angeschaffte Fondsanteile können weiterhin außerhalb der +entnehmen Sie bitte Ihrer Depotübersicht oder Ihrem Depotauszug. Der in einjährigen Haltefrist steuerfrei veräußert werden. Für Verkäufe ab dem 1. Juli +Anspruch genommene Betrag wird in der Steuerbescheinigung ausgewiesen. 2009 wurde dies bereits auf Depotebene berücksichtigt. Für alle Verkäufe +Eingereichte Freistellungsaufträge gelten für alle bestehenden und zukünftigen zwischen dem 1. Januar 2009 bis 30. Juni 2009 müssen Sie in der Veranlagung +DekaBank Depots, die von einem vermittelnden Institut betreut werden. Ab die Besteuerung nachholen. +2010 findet am Jahresende eine ehegattenübergreifende Verlustverrechnung Fonds mit Mindestanlagesumme +statt, falls ein gemeinsamer Freistellungsauftrag vorliegt. Zum Zweck der Die allgemeine gesetzliche Übergangsregelung, nach der Gewinne aus der +übergreifenden Verlustverrechnung kann der Freistellungsauftrag ab 2010 auch Veräußerung von Fondsanteilen steuerfrei sind, wenn der Fondsanteil bis zum 31. +in Höhe von 0 EUR eingereicht werden, wenn Ehegatten ihr gemeinsames Dezember 2008 erworben wurde und die Spekulationsfrist zum Zeitpunkt des +Freistellungsvolumen schon bei anderen Instituten ausgeschöpft haben. Ist keine Verkaufs abgelaufen ist, wurde durch das Jahressteuergesetz 2007 für spezielle +übergreifende Verlustverrechnung gewünscht (getrennte Veranlagung), können Fondsanteile eingeschränkt (§ 18 Abs. 2a InvStG-neu). Der unbeschränkten +für Einzeldepots getrennte Freistellungsaufträge erteilt werden. Veräußerungsgewinnbesteuerung (kein Bestandsschutz) unterliegen u. a. +Werbungskosten: Investmentvermögen, die nach dem 9. November 2007 erworben werden und +Werbungskosten, z. B. Depotgebühren, die Ihnen im Zusammenhang mit Ihren für die entsprechend deren Vertragsbedingungen eine Mindestanlagesumme +Investmentanteilen entstanden sind, können im Rahmen der von 100.000 Euro oder mehr vorgeschrieben ist. Haben Sie zwischen dem 9. +Einkommensteuererklärung nicht mehr individuell steuerlich geltend gemacht November 2007 und dem 1. Januar 2009 Anteile solcher Fonds im privaten +werden. Diese gelten als im Rahmen des Sparer-Pauschbetrages bereits Vermögen erworben und nach dem 31. Dezember 2008 zurückgegeben, dann +berücksichtigt. unterliegt der Gewinn daraus (unabhängig von einer Haltedauer) der +Bescheinigung vermögenswirksamer Leistungen für 2009: Abgeltungsteuer. Somit ist der gesamte Rückgabe- oder Veräußerungsgewinn +Wenn in Ihrem Depot vermögenswirksame Leistungen (VL) verwahrt werden, steuerpflichtig. +erhalten Sie mit dem Jahresdepotauszug per 31. Dezember 2009 eine Bitte berücksichtigen sie dies bei den Angaben in Ihrer Steuererklärung. Für +Bescheinigung der im Kalenderjahr 2009 eingezahlten VL-Leistungen. Bitte fügen weitere Informationen wenden Sie sich bitte an eine steuerfachkundige Person +Sie diese Bescheinigung Ihrer Einkommensteuererklärung bei. Sie dient als Antrag oder Ihr Wohnsitzfinanzamt. +zur Gewährung einer Sparzulage. Zinsinformationsverordnung: +Zahlungseingänge, die nicht mehr im Kalenderjahr 2009 erfolgen, (z. B. im Aufgrund der am 1. Juli 2005 in Kraft getretenen Zinsinformationsverordnung +Januar 2010 für Dezember 2009) werden erst in der Bescheinigung für das (auf Grundlage der EU-Zinsrichtlinie 2003/ 48 / EG des Rates vom 3. Juni 2003) ist +Kalenderjahr 2010 ausgewiesen. die DekaBank verpflichtet, Zinserträge von wirtschaftlichen Eigentümern mit +Sollten auf Ihrem Vertrag Zahlungseingänge fehlen, fragen Sie bitte erst bei ausländischem Wohnsitz innerhalb der angeschlossenen EU-Staaten an das +Ihrem Arbeitgeber nach, auf welches Konto die vermögenswirksamen Leistungen Bundeszentralamt für Steuern zu melden. +überwiesen wurden. Erst mit dieser Information können wir die Dieser Richtlinie unterliegen alle Depots von Privatanlegern, die in einem anderen +Zahlungseingänge überprüfen. Mitgliedstaat der Europäischen Union ansässig sind. +Vermögensbeteiligungen gem. Paragraph 19a EStG: Ziel dieser Richtlinie ist es, innerhalb der Europäischen Union durch Austausch +Die gesetzliche Sperrfrist von sechs Jahren ist seit dem Steueränderungsgesetz von Informationen eine effektive Besteuerung von Zinserträgen zu ermöglichen. +2001 entfallen. Die Vermögensbeteiligungen sind frei verfügbar. Ggf. sind Dazu gehören nach den Bestimmungen der Zinsinformationsverordnung, unter +zivilrechtlich vereinbarte Haltedauern zwischen Arbeitnehmer und Arbeitgeber zu Beachtung bestimmter Sonderregelungen, auch solche Zinserträge, die im +beachten. Rahmen von Ausschüttungen oder Anteilscheinrückgaben von Investmentfonds +Steuerbescheinigung 2009: gezahlt werden. +Mit Einführung der Abgeltungsteuer wurde die Steuerbescheinigung vom +Bundesministerium für Finanzen neu gestaltet. Darin enthalten ist die abgeführte +Kapitalertragsteuer, der Solidaritätszuschlag sowie die gegebenenfalls abgeführte +Kirchensteuer und die dem Steuerabzug zugrunde liegenden Kapitalerträge +sowie Veräußerungsgewinne. Bitte berücksichtigen Sie, dass trotz +Abgeltungsteuer durch bestimmte Tatbestände eine Pflicht zur Veranlagung +durch das Wohnsitzfinanzamt besteht (z. B. bei ausländisch thesaurierenden +Fonds, unberücksichtigter Kirchensteuer bei inländisch thesaurierenden Fonds, +bei +Jahresdepotauszug per 31.12.2009 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 597,21 1.015,670000 0,588 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Lastschrifteinzug 1.000,00 1.023,350000 +0,977 16.06.2009 16.06.2009 +Abrechnungsbetrag Ausschüttung 46,31 995,430000 +0,047 20.08.2009 20.08.2009 +Lastschrifteinzug 400,00 996,160000 +0,402 02.10.2009 02.10.2009 +Bestand am 31.12.2009 2.009,05 997,540000 2,014 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterdepot: 01 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Lastschrifteinzug 1.400,00 1.019,470000 +1,373 06.03.2009 06.03.2009 +Verkauf 1.401,16 1.020,510000 -1,373 27.03.2009 27.03.2009 +Bestand am 31.12.2009 0,00 997,540000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 1.419,65 89,880000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Abrechnungsbetrag Thesaurierung 0,00 91,150000 +0,000 02.07.2009 02.07.2009 +Bestand am 31.12.2009 1.703,02 107,820000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2009 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-BonusRente Vertragsnr.: 0111111111 999405 00 +Deka-BR 100 +ISIN: DE0005424519 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 534,52 27,340000 19,551 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Abrechnungsbetrag Thesaurierung 1,83 28,130000 +0,065 01.07.2009 01.07.2009 +Lastschrifteinzug 270,00 32,430000 +8,326 01.10.2009 01.10.2009 +Kauf Zulagenzahlung 354,00 32,950000 +10,744 17.11.2009 17.11.2009 +Bestand am 31.12.2009 1.284,38 33,200000 38,686 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 +Verwahrart: GiroSammel +Wichtige Information: der Fonds AriDeka wurde mit Wirkung zum 09.02.09 in AriDeka CF umbenannt. +VL-Vertrag: gesperrt bis zum 31.12.2010, Vertragsinhaber: Richard Mustermann + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 1.102,77 38,100000 28,944 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Kauf 34,00 39,210000 +0,867 30.01.2009 30.01.2009 +Abrechnungsbetrag Ausschüttung 29,15 33,420000 +0,872 20.02.2009 20.02.2009 +Kauf 34,00 34,070000 +0,998 27.02.2009 27.02.2009 +Bestand am 31.12.2009 1.499,78 47,340000 31,681 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 1.148,35 75,470000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Abrechnungsbetrag Thesaurierung 0,00 128,680000 +0,000 01.10.2009 01.10.2009 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2009 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Fortsetzung von vorheriger Seite +Bestand am 31.12.2009 2.143,93 140,900000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 1.576,43 265,660000 5,934 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Abrechnungsbetrag Ausschüttung 38,27 389,640000 +0,098 20.11.2009 20.11.2009 +Bestand am 31.12.2009 2.453,52 406,750000 6,032 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 1.749,70 54,130000 32,324 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Abrechnungsbetrag Ausschüttung 3,23 68,740000 +0,047 20.11.2009 20.11.2009 +Bestand am 31.12.2009 2.321,65 71,720000 32,371 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2009 +Umsatz-Jahresübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-EuropaBond TF + +ISIN: DE0009771980 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 1.691,57 34,460000 49,088 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Abrechnungsbetrag Ausschüttung 51,54 36,340000 +1,418 20.08.2009 20.08.2009 +Bestand am 31.12.2009 1.841,95 36,470000 50,506 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel + +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2008 1.449,50 40,320000 35,950 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Abrechnungsbetrag Ausschüttung 3,60 37,990000 +0,095 20.02.2009 20.02.2009 +Abrechnungsbetrag Thesaurierung 0,00 56,660000 +0,000 30.12.2009 30.12.2009 +Bestand am 31.12.2009 2.042,31 56,660000 36,045 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +Dieser Depotauszug besteht aus 4 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +vom Name, Vorname Steuernummer / Identifikationsnummer +Arbeit- +nehmer +auszu- 2009 +füllen +99 1 5 +Anlage VL 9 +Wichtiger Hinweis: 87 +Herrn +Richard Mustermann Diese Bescheinigung benötigen Sie, wenn Sie eine +Musterstraße 9 Arbeitnehmer-Sparzulage nach dem Fünften +11111 Stadt Vermögensbildungsgesetz (VermBG) beantragen wollen. In + diesem Fall fügen Sie bitte die Bescheinigung Ihrer +Einkommensteuererklärung / Ihrem Antrag auf +Arbeitnehmer-Sparzulage bei. +Bescheinigung vermögenswirksamer Leistungen für 2009 +(§ 15 Abs. 1 VermBG, § 5 VermBDV 1994) +Arbeitnehmer (Name, Vorname) geboren am +Mustermann, Richard 01.01.1980 +Straße, Hausnummer +Musterstraße 9 +Postleitzahl, Wohnort +11111 Stadt +1. Vertrag 2. Vertrag +Art der Anlage *) 0 1 0 +Institutsschlüssel für die +Arbeitnehmer- Sparzulage 1 1111111 1 +Vertragsnummer +(nur für Finanzamt) 2 11111111111111 2 +Vermögenswirksame Leistungen +(auf volle Euro aufgerundet) 3 68,00 3 +Ende der Sperrfrist +(Format: TT.MM.JJJJ) 4 31.12.2010 4 +Anlageinstitut, Unternehmen, Empfänger +DekaBank +Deutsche Girozentrale +60625 Frankfurt am Main erstellt per 31. Dezember 2009 +*) 1 = Sparvertrag über Wertpapiere oder andere Vermögensbeteiligungen (§ 4 VermBG) +Vertragsnummer der DekaBank: V119701696 (1. Vertrag) +Anlage VL +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. Irrtum vorbehalten. + Bescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Richard Mustermann, 11111 Stadt, Musterstraße 9 + werden für das Kalenderjahr 2009 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge 163,08 KAP: Zeile 7 +davon: Gewinn aus Kapitalerträgen im Sinne des § 20 Abs. 2 EStG 0,00 KAP: Zeile 8 +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG 0,00 KAP: Zeile 11 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 12 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 13 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 163,08 KAP: Zeile 14 +Kapitalertragsteuer 0,00 KAP: Zeile 49 +Solidaritätszuschlag 0,00 KAP: Zeile 50 +Kirchensteuer zur Kapitalertragsteuer 0,00 KAP: Zeile 51 +Kirchensteuer zur Kapitalertragsteuer 0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 52 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 8,00 KAP: Zeile 53 +Ausländischer thesaurierender Investmentfonds vorhanden +nur nachrichtlich: 12,12 KAP: Zeile 15 +Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden +Investmentvermögen +Bei Veräußerung/Rückgabe von Anteilen 0,00 +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen Erträge +aus Anteilen an ausländischen Investmentvermögen in Fällen des § 7 Abs. 1 Satz 1 Nr. 3 +InvStG +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer +1111111111111 abgeführt. +Das Ankreuzfeld "Ausländischer thesaurierender Investmentfonds vorhanden" bezieht sich auf den Stichtag 31.12.. +Sie finden zusätzliche Informationen zu Ihrer Steuerbescheinigung auf der Rückseite. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Richard Mustermann, 11111 Stadt, Musterstraße 9 +Aufgrund der rechtlichen Vorgaben können anrechenbare Quellensteuer und Verluste grundsätzlich direkt mit gezahlter Kapitalertragsteuer +verrechnet werden. In bestimmten Fällen, z. B. Erbfälle, Quellensteuer für beschränkt Steuerpflichtige oder Quellensteuer aus ausländisch +thesaurierenden Fonds ist diese Verrechnung jedoch nicht möglich. +Die Beträge sind nicht in der Steuerbescheinigung enthalten und können nur im Rahmen der Veranlagung geltend gemacht werden. +Zusätzlich erfolgt für beschränkt Steuerpflichtige der Ausweis der steuerpflichtigen Beträge und bereits gezahlter Kapitalertragsteuer und +Solidaritätszuschlag aus inländischen Dividenden. +Betrag EUR +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 4,94 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Zusatzinformation nach § 7 Abs. 4 AltZertG +per 31.12.2009 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann + D eka-BonusRente +ISIN: XF0009994050 +Vertragsnummer: 011111111199940500 Zertifizierungs-Nr.: 003604 +Ihr Altersvorsorgevertrag in 2009 +Betrag +EUR +Guthaben am 31.12.2008 534,52 +Bewertung mit dem Rücknahmepreis vom 30.12.2008 +Eingezahlte Beiträge +280,00 +Zulage +354,00 +Abschluss- und Vertriebskosten (Ausgabeaufschlag) -21,06 +Laufende Verwaltungskosten: +Vertragspreis -10,00 +Performance Ihres Altersvorsorgevertrages +146,92 +Guthaben am 31.12.2009 1.284,38 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 + +Bestand Ihrer Fondsanteile +Kosten für die Verwaltung +Verwaltungs- Depotbank- Preis je Anteil Gegenwert +Fondsname ISIN vergütung* gebühr * EUR Anteile EUR +Deka-BR 100 DE0005424519 1,00 % 0,10 % 33,200000 38,686 1.284,38 +* Nachrichtlicher Wert. Diese Kosten werden direkt dem Fondsvermögen entnommen (Berechnung erfolgt in % des durchschittlichen Fondsvermögens) +Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): 1.508,50 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der Auszahlungsphase +mindestens zur Verfügung. +W ichtige Rahmenbedingungen +Vertragsbeginn: 11.12.2006 +Zahlungsweise in 2010: jährlich (Lastschrifteinzug Nr. 1) +Diese Mitteilung wird jährlich erstellt zum: 31.12. +-Weitere Informationen +- Die Berechnung "Performance Ihres Altersvorsorgevertrages" weicht von der Betrachtungsweise auf Einzelfondsebene in der "Depotübersicht" +(dort "Wertentwicklung in EUR") ab. Der Wert "Performance Ihres Altersvorsorgevertrages" stellt eine Gesamtbetrachtung Ihres Vertrages dar, +bei der z. B. auch Vertragskosten berücksichtigt wurden. +- Die in Ihrem privaten Altersvorsorgevertrag gebuchten Einzelumsätze entnehmen Sie bitte der Umsatz-Jahresübersicht. +- Bei den hier aufgeführten Zulage-Zahlungen handelt es sich um einen kumulierten Wert, ggf. inklusive Zulagerückforderungen und +Rückforderungen aus Steuerermäßigungen, sofern der Vertrag belastet wurde. Einen detaillierten Ausweis entnehmen Sie bitte der Bescheinigung +nach § 92 EStG (Zusendung erfolgt separat). +- Ethische, soziale und ökologische Belange wurden bei der Verwendung der eingezahlten Altersvorsorgebeiträge nicht berücksichtigt. +Allein verbindliche Informationsgrundlage zu den in Ihrem Altersvorsorgevertrag geführten Fonds ist der jeweils gültige Verkaufsprospekt mit den +Vertragsbedingungen, den zuletzt veröffentlichten Rechenschafts- und Halbjahresberichten sowie das Preis- und Leistungsverzeichnis zum +DekaBank Depot. Diese Unterlagen erhalten Sie auf Wunsch von Ihrem Berater ausgehändigt. Sie können sie bei uns anfordern oder über +www.deka.de abrufen. +- Diese Bescheinigung ist für Ihre Unterlagen bestimmt. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht13.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht13.txt new file mode 100644 index 0000000000..1fe8818b2b --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht13.txt @@ -0,0 +1,453 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Jahresdepotauszug per 31.12.2010 +Depotübersicht +Depot: 0111111111 +Depotinhaber: +........ Richard Mustermann +.... Bankverbindung: +Konto: 0000111111 BLZ: 793 517 30 +Spk Ostunterfranken +Herrn Inh.: Richard Mustermann +Richard Mustermann Sparer-Pauschbetrag +Musterstraße 9 Erteilt 2010: EUR 600,00 +11111 Stadt Beansprucht: EUR 138,43 + +ISIN Unterdepot Bezeichnung Wert Wertentwicklung +in EUR in EUR +per 31.12.2010 * für 2010 +LU0268059614 00 Deka-GeldmarktPlan TF 1.014,65 +5,60 +LU0348413815 00 DekaLux-PharmaTech TF 1.802,21 +99,19 +DE0008474511 00 AriDeka CF 1.747,27 +150,49 + VL-Vertrag: gesperrt bis zum 31.12.2010 + Vertragsinhaber: Richard Mustermann +LU0133666759 00 Deka-ConvergenceAktien TF 2.712,25 +568,32 +LU0133666759 01 Deka-ConvergenceAktien TF 1.045,26 +45,26 +LU0052859252 00 DekaLux-Pazifik 2.998,23 +544,71 +LU0062624902 00 DekaLux-Deutschland TF A 2.791,03 +469,38 +DE0009771980 00 Deka-EuropaBond TF 1.973,24 +131,29 +DE0009786285 00 Deka-EuropaPotential TF 2.602,81 +560,50 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 1.861,03 +259,47 + Gesamt in EUR 20.547,98 +2.834,21 + Depotpreis inkl. 19% MwSt: +10,00 EUR wurden für 2010 belastet +Entgelte werden gemäß Preisverzeichnis erhoben. + +Besondere Hinweise zur Deka-BonusRente: +Mit diesem Jahresdepotauszug erhalten Sie Zusatzinformationen nach § 7 Abs. 4 AltZertG zu Ihrer Deka-BonusRente. Das Jahresendereporting zur +Deka-BonusRente mit der Bescheinigung nach § 92 EStG geht Ihnen mit separater Post Ende Februar 2011 zu. Diese Bescheinigung wurde um +wichtige Angaben zur Beantragung des Sonderausgabenabzuges erweitert. Wir empfehlen Ihnen, eine Kopie der Bescheinigung Ihrer +Steuererklärung beizulegen. +Wichtiger Hinweis: Die bisher dem Jahresendereporting Deka-BonusRente beigefügte § 10 a EStG Bescheinigung an das Finanzamt entfällt! Sofern +Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, wird diese auf Grundlage +der von Ihnen mitgeteilten Daten beantragt und nach Eingang der Zulage Ihrem Deka-BonusRente Vertrag gutgeschrieben. +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem Jahresdepotauszug" auf der Rück- bzw. Folgeseite. +Weitere Informationen entnehmen Sie unserer Homepage www.deka.de (Menüpunkt Service) oder rufen Sie uns unter (0 69) 71 47 - 6 52 montags bis +freitags in der Zeit von 8.00 bis 18.00 Uhr an. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +HINWEISE ZU IHREM JAHRESDEPOTAUSZUG Bescheinigung vermögenswirksamer Leistungen für 2010: +Wenn in Ihrem Depot vermögenswirksame Leistungen (VL) verwahrt werden, +Wert in EUR per 31.12.2010: erhalten Sie mit dem Jahresdepotauszug per 31. Dezember 2010 eine +Der Wert der Investmentanlage berechnet sich aus dem Anteilbestand per 31. Bescheinigung der im Kalenderjahr 2010 eingezahlten VL-Leistungen. Bitte fügen +Dezember 2010 multipliziert mit dem Preis je Anteil. Die Bewertung des Fonds Sie diese Bescheinigung Ihrer Einkommensteuererklärung bei. Sie dient als Antrag +erfolgt mit dem jeweils letzten verfügbaren Rücknahmepreis, der zum Zeitpunkt zur Gewährung einer Sparzulage.Zahlungseingänge, die nicht mehr im +der Erstellung dieses Auszugs vorlag. Bitte entnehmen Sie den Fondspreis zum Kalenderjahr 2010 erfolgten (z. B. im Januar 2011 für Dezember 2010), werden +letzten Handels- bzw. Bewertungstag des Jahres dem Jahresbericht der erst in der Bescheinigung für das Kalenderjahr 2011 ausgewiesen. Sollten auf +betreffenden Fonds. Ihrem Vertrag Zahlungseingänge fehlen, fragen Sie bitte erst bei Ihrem +Wertentwicklung in EUR per 31.12.2010: Arbeitgeber nach, auf welches Konto die vermögenswirksamen Leistungen +Die Berechnung der Wertentwicklung im Rahmen des Jahresdepotauszuges überwiesen wurden. Erst mit dieser Information können wir die +erfolgt für den Betrachtungszeitraum 01. Januar bis 31. Dezember des Zahlungseingänge überprüfen. +betreffenden Kalenderjahres. Vermögensbeteiligungen gem. Paragraph 19a EStG: +Für die Berechnung der Wertentwicklung werden für den Betrachtungszeitraum Die gesetzliche Sperrfrist von sechs Jahren ist seit dem Steueränderungsgesetz +die Anfangs- und Endbestände sowie Buchungen, bei denen es zu einer stücke- 2001 entfallen. Die Vermögensbeteiligungen sind frei verfügbar. Ggf. sind +und/oder geldmäßigen Bewegung kam, herangezogen. Gegebenenfalls zivilrechtlich vereinbarte Haltedauern zwischen Arbeitnehmer und Arbeitgeber zu +abgeführte Steuern werden hierbei nicht berücksichtigt. Eventuell einbehaltene beachten. +Gebühren und Ausgabeaufschläge reduzieren Ihre Wertentwicklung. Es wird Steuerbescheinigung 2010: +keine Wertentwicklung für das Unterdepot ausgewiesen, wenn dieses im Mit Einführung der Abgeltungsteuer wurde die Steuerbescheinigung vom +Betrachtungszeitraum ohne Bestand ist. Bundesministerium der Finanzen neu gestaltet. Diese enthält grundsätzlich alle im +Allgemeine Risikohinweise: Kalenderjahr zugrunde liegenden Kapitalerträge, die mit Kapitalertragsteuer, +Anteile an Investmentfonds sind Wertpapiere, deren Preise durch die Solidaritätszuschlag, ggf. Kirchensteuer belastet wurden. Veräußerungsgewinne +börsentäglichen Kursschwankungen der im jeweiligen Investmentfonds wie auch ausländische Quellensteuern werden ebenso ausgewiesen. Außerdem +befindlichen Vermögenswerte bestimmt werden (und deshalb steigen oder auch werden nicht ausgeglichene Verluste bescheinigt, wenn ein Antrag auf +fallen können). Kursänderungen bei den Vermögensgegenständen (z. B. Aktien, Verlustbescheinigung bis zum 15. Dezember gestellt wurde. Ist bis zu diesem +Anleihen) und Wechselkursschwankungen können somit den Wert einer Anlage Datum kein Antrag auf Verlustbescheinigung gestellt worden, werden nicht +in Investmentfonds sowohl positiv als auch negativ beeinflussen. ausgeglichene Verrechnungssalden auf das nächste Kalenderjahr übertragen. +Verwahrung des Anteilsbestandes: Bitte berücksichtigen Sie, dass trotz Abgeltungsteuer durch bestimmte +Die Anteile werden im Girosammel-Depot oder in Form einer Gutschrift in Tatbestände eine Pflicht zur Veranlagung durch das Wohnsitzfinanzamt besteht +Wertpapierrechnung verwahrt. Die Anteilsbruchteile stellen das Miteigentum an (z. B. unberücksichtigte Kirchensteuer bei inländischen thesaurierenden Fonds) +einer Bruchteilgemeinschaft dar. bzw. eine freiwillige Veranlagung in Betracht kommen kann (z. B. +Beanspruchter Sparer-Pauschbetrag für das Kalenderjahr 2010: Günstigerprüfung, Berücksichtigung anrechenbarer aber noch nicht +Die Höhe des von Ihnen erteilten Sparer-Pauschbetrages entnehmen Sie bitte angerechneter ausländischer Quellensteuer, Verrechnung von Kapitalerträgen bei +Ihrer Depotübersicht oder Ihrem Depotauszug. Der in Anspruch genommene mehreren Kreditinstituten etc.). Nähere Informationen entnehmen Sie bitte der +Betrag wird in der Steuerbescheinigung ausgewiesen. Eingereichte Broschüre "Die Abgeltungsteuer, Alles Wissenswerte im Überblick", die Sie bei +Freistellungsaufträge gelten für alle bestehenden und zukünftigen DekaBank Ihrer Sparkasse/Landesbank oder unter deka.de erhalten. +Depots, die von einem vermittelnden Institut betreut werden. Kapitalerträge aus Investmentanteilen bei Privatvermögen +Ab dem 01. 01. 2011 wird zur Erteilung eines Freistellungsauftrages die Die Kapitalerträge errechnen sich aus dem Gesamtbetrag aller +persönliche Steueridentifikationsnummer benötigt. kapitalertragsteuerpflichtigen Erträge von Ausschüttungen, Thesaurierungen und +Ehegattenübergreifende Verlustverrechnung Veräußerungsgeschäften des Kalenderjahres 2010. Diese werden um den +Bei Vorlage eines gemeinschaftlichen Freistellungsauftrages von Ehegatten wird verrechenbaren Verlustverrechnungstopf (gezahlte Zwischengewinne und +mit dem Kalenderjahr 2010 eine ehegattenübergreifende Verlustverrechnung Veräußerungsverluste) gemindert. Bei Angaben zu besitzanteiligen akkumulierten +durchgeführt. Diese erfolgt stets zum Jahresende. Die ehegattenübergreifende Thesaurierungen aus dem Verkauf von ausländisch thesaurierenden Fonds oder +Verlustverrechnung erfolgt immer unter sämtlichen für die Ehegatten geführten bei Ausweis der Ersatzbemessungsgrundlage (Anwendung wegen fehlender +Depots (Einzeldepots/Gemeinschaftsdepots) und zwar unabhängig davon, ob die Anschaffungskosten bzw. Veräußerungserlöse) kann die tatsächliche +tatsächlichen Voraussetzungen einer Zusammenveranlagung i. S. des § 26 Absatz Einkommensteuerpflicht nur im Wege der Veranlagung ermittelt werden. +1 Satz 1 EStG gegeben sind. Kapitalerträge aus Investmentanteilen bei Betriebsvermögen +Ist keine übergreifende Verlustverrechnung gewünscht bzw. liegen die Die Kapitalerträge errechnen sich aus mit Kapitalertragsteuer belasteten Erträgen +Voraussetzungen einer Zusammenveranlagung i. S. des § 26 Absatz 1 Satz 1 aus Ausschüttungen, Thesaurierungen und kapitalertragsteuerpflichtigen +EStG nicht vor (da getrennte Veranlagung), können für Einzeldepots getrennte Erträgen aus Verkäufen (vereinnahmte Zwischengewinne und/oder besitzanteilig +Freistellungsaufträge erteilt werden. Eine Darstellung zu den infolge der akkumulierte Thesaurierungen) des Kalenderjahres 2010. Eine +ehegattenübergreifenden Verlustverrechnung übertragenen bzw. erhaltenen Verlustverrechnung findet grundsätzlich nicht statt. Veräußerungsgeschäfte +Beständen, finden Sie im nichtamtlichen Teil der Steuerbescheinigung. Zum werden berücksichtigt, sofern eine Kapitalertragsteuer aufgrund der Rechtsform +Zweck der übergreifenden Verlustverrechnung kann ein Freistellungsauftrag auch oder fehlender Freistellung belastet wurde. Für betriebliche Anleger stellt die +in Höhe von 0,00 EUR eingereicht werden, z. B. wenn Ehegatten ihren Abgeltungsteuer nur eine Vorauszahlung auf die Einkommen- oder +gemeinsamen Sparerpauschbetrag bereits bei anderen Instituten ausgeschöpft Körperschaftsteuerschuld dar und hat keine abgeltende Wirkung. +haben. Dabei ist zu beachten, dass eine auf Bankebene erfolgte Fonds mit Mindestanlagesumme von 100.000 EUR nach § 18 Abs. 2a +Verlustverrechnung nach Auffassung der Finanzverwaltung in der Veranlagung InvStG +nicht mehr rückgängig gemacht werden kann. Haben Sie zwischen dem 09. November 2007 und dem 01. Januar 2009 Anteile +Ausweis von Umsätzen mit 0,000 Anteilen infolge kaufmännischer der oben genannten Fonds im privaten Vermögen erworben und nach dem 31. +Rundungen: Dezember 2008 zurückgegeben, dann unterliegt der Gewinn daraus +Fondsanteile werden im DekaBank Depot mit drei Nachkommastellen abgebildet. (unabhängig von einer Haltedauer) der Abgeltungsteuer. Somit ist der gesamte +Hierdurch kann es bei Buchungen von Kleinstbeträgen, speziell auch bei Rückgabe- oder Veräußerungsgewinn steuerpflichtig. +Erstattungen von Kapitalertragsteuer und Solidaritätszuschlag mittels Kauf von Bitte berücksichtigen Sie dies bei den Angaben in Ihrer Steuererklärung. Für +Fondsanteilen zu Rundungsdifferenzen kommen (Berechnung des Umsatzes / weitere Informationen wenden Sie sich bitte an eine steuerfachkundige Person +Anteilpreis), so dass eventuell 0,000 Anteile ausgewiesen werden. oder Ihr Wohnsitzfinanzamt. +Werbungskosten: Zinsinformationsverordnung: +Werbungskosten, z. B. Depotgebühren, die Ihnen im Zusammenhang mit Ihren Aufgrund der am 01. Juli 2005 in Kraft getretenen Zinsinformationsverordnung +Investmentanteilen entstanden sind, können im Rahmen der (auf Grundlage der EU-Zinsrichtlinie 2003/ 48 / EG des Rates vom 03. Juni 2003) +Einkommensteuererklärung nicht mehr individuell steuerlich geltend gemacht ist die DekaBank verpflichtet, Zinserträge die im Rahmen von Ausschüttungen +werden. Diese gelten im Rahmen des Sparer-Pauschbetrages als bereits gezahlt wurden bzw. den Gegenwert von Anteilscheinrücknahmen von +berücksichtigt. Investmentfonds von wirtschaftlichen Eigentümern mit ausländischem +steuerlichen Wohnsitz innerhalb der angeschlossenen Staaten in bestimmten +Fällen an das Bundeszentralamt für Steuern zu melden. +Jahresdepotauszug per 31.12.2010 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 2.009,05 997,540000 2,014 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Verkauf / Tausch 1.000,00 998,720000 -1,001 16.04.2010 16.04.2010 +Abrechnungsbetrag Ausschüttung 9,93 990,310000 +0,010 20.08.2010 20.08.2010 +Bestand am 31.12.2010 1.014,65 991,840000 1,023 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 1.703,02 107,820000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Abrechnungsbetrag Thesaurierung 0,00 109,660000 +0,000 01.07.2010 01.07.2010 +Bestand am 31.12.2010 1.802,21 114,100000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 +Verwahrart: GiroSammel +VL-Vertrag: gesperrt bis zum 31.12.2010, Vertragsinhaber: Richard Mustermann + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 1.499,78 47,340000 31,681 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Abrechnungsbetrag Ausschüttung 15,06 45,510000 +0,331 19.02.2010 19.02.2010 +Kauf 72,00 53,780000 +1,339 14.12.2010 14.12.2010 +Kauf 25,00 53,780000 +0,465 14.12.2010 14.12.2010 +Bestand am 31.12.2010 1.747,27 51,670000 33,816 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2010 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 2.143,93 140,900000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Abrechnungsbetrag Thesaurierung 0,00 160,450000 +0,000 01.10.2010 01.10.2010 +Bestand am 31.12.2010 2.712,25 178,250000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Kauf / Tausch 1.000,00 170,520000 +5,864 16.04.2010 16.04.2010 +Abrechnungsbetrag Thesaurierung 0,00 160,450000 +0,000 01.10.2010 01.10.2010 +Bestand am 31.12.2010 1.045,26 178,250000 5,864 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 2.453,52 406,750000 6,032 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Abrechnungsbetrag Ausschüttung 27,51 470,850000 +0,058 22.11.2010 22.11.2010 +Bestand am 31.12.2010 2.998,23 492,320000 6,090 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel + +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2010 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 2.321,65 71,720000 32,371 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Abrechnungsbetrag Thesaurierung 0,00 77,070000 +0,000 01.10.2010 01.10.2010 +Bestand am 31.12.2010 2.791,03 86,220000 32,371 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +Deka-EuropaBond TF +ISIN: DE0009771980 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 1.841,95 36,470000 50,506 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Abrechnungsbetrag Ausschüttung 66,16 39,000000 +1,696 20.08.2010 20.08.2010 +Bestand am 31.12.2010 1.973,24 37,800000 52,202 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2009 2.042,31 56,660000 36,045 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Abrechnungsbetrag Thesaurierung 0,00 72,210000 +0,000 30.12.2010 30.12.2010 +Bestand am 31.12.2010 2.602,81 72,210000 36,045 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 + +Dieser Depotauszug besteht aus 3 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2010 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 011111111199940500 Z ertifizierungs-Nr.: 003604 + +Aktuelle Phase: Ansparphase B eginn der Auszahlungsphase: 01.10.2047 +Übersicht der angesparten Fonds + Fondsname ISIN Verwahrart + Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je A nteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Bestand am 31.12.2009 Deka-BR 100 1.284,38 33,200000 38,686 +Gesamtbestand des Vertrages am 31.12.2009 1.284,38 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Zulagenzahlung 2009 Deka-BR 100 47,18 37,860000 +1,246 19.05.2010 19.05.2010 +Abrechnungsbetrag Thesaurierung Deka-BR 100 2,02 34,310000 +0,059 01.07.2010 01.07.2010 +Lastschrifteinzug Deka-BR 100 270,00 36,250000 +7,448 01.10.2010 01.10.2010 +Bestand am 31.12.2010 Deka-BR 100 1.861,03 39,230000 47,439 +Gesamtbestand des Vertrages am 31.12.2010 1.861,03 + Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Bescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Richard Mustermann , 11111 Stadt, Musterstraße 9 + werden für das Kalenderjahr 2010 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge 138,43 KAP: Zeile 7 +davon: Gewinn aus Kapitalerträgen im Sinne des § 20 Abs. 2 EStG 0,00 KAP: Zeile 8 +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG 0,00 KAP: Zeile 11 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 12 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 13 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 138,43 KAP: Zeile 14 +Kapitalertragsteuer 0,00 KAP: Zeile 49 +Solidaritätszuschlag 0,00 KAP: Zeile 50 +Kirchensteuer zur Kapitalertragsteuer 0,00 KAP: Zeile 51 +Kirchensteuer zur Kapitalertragsteuer 0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 52 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 6,54 KAP: Zeile 53 +Ausländischer thesaurierender Investmentfonds vorhanden +nur nachrichtlich: 11,33 KAP: Zeile 15 +Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden +Investmentvermögen +Bei Veräußerung/Rückgabe von Anteilen 0,00 +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen Erträge +aus Anteilen an ausländischen Investmentvermögen in Fällen des § 7 Abs. 1 Satz 1 Nr. 3 +InvStG +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer +1111111111111 abgeführt. +Das Ankreuzfeld "Ausländischer thesaurierender Investmentfonds vorhanden" bezieht sich auf den Stichtag 31.12.. +Bei inländisch thesaurierenden Fonds kann ein Kirchensteuerantrag nicht berücksichtigt werden. Bitte holen Sie die Besteuerung in der +Veranlagung nach, wenn Sie Kirchensteuerpflichtig sind. +Der Thesaurierungsbetrag aus der Zeile "nur nachrichtlich: Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden +Investmentvermögen" wurde nicht der Kapitalsteuer unterworfen. Deshalb müssen Sie diesen Betrag gegebenenfalls in Ihrer +Steuerbescheinigung angeben. Bei Fragen wenden Sie sich bitte an Ihren steuerlichen Berater oder an Ihr Finanzamt. +Sie finden zusätzliche Informationen zu Ihrer Steuerbescheinigung auf der Rückseite. +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Richard Mustermann , 11111 Stadt, Musterstraße 9 +Aufgrund der rechtlichen Vorgaben können anrechenbare Quellensteuer und Verluste grundsätzlich direkt mit gezahlter Kapitalertragsteuer +verrechnet werden. In bestimmten Fällen, z. B. Erbfälle, Quellensteuer für beschränkt Steuerpflichtige oder Quellensteuer aus ausländisch +thesaurierenden Fonds ist diese Verrechnung jedoch nicht möglich. +Die Beträge sind nicht in der Steuerbescheinigung enthalten und können nur im Rahmen der Veranlagung geltend gemacht werden. +Zusätzlich erfolgt für beschränkt Steuerpflichtige der Ausweis der steuerpflichtigen Beträge und bereits gezahlter Kapitalertragsteuer und +Solidaritätszuschlag aus inländischen Dividenden. +Betrag EUR +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 +Summe der angerechneten Verluste auf die Kapitalerträge unter Vorlage einer gültigen NV-Bescheinigung 0,00 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 2,36 +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Zusatzinformation nach § 7 Abs. 4 AltZertG +per 31.12.2010 +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +D eka-BonusRente +ISIN: XF0009994050 +Vertragsnummer: 011111111199940500 Zertifizierungs-Nr.: 003604 +Ihr Altersvorsorgevertrag in 2010 +Ansparphase DekaBank Nachrichtlich Betrag +EUR EUR +Guthaben am 31.12.2009 1.284,38 +Bewertung mit dem Rücknahmepreis vom 30.12.2009 +Ihre eingezahlten Beiträge +280,00 +Gezahlte Zulage im Kalenderjahr 2010 (Grund- und ggfs. Kinderzulage*) +47,18 +Abschluss- und Vertriebskosten - Ausgabeaufschlag -10,77 +Laufende Verwaltungskosten: +Vertragspreis (zu Lasten Girokonto) -10,00 +Vertragspreis (zu Lasten Vertrag) 0,00 +Weitere Preise (zu Lasten Girokonto) 0,00 +Weitere Preise (zu Lasten Vertrag) 0,00 +Performance Ihres Altersvorsorgevertrages +260,24 +Guthaben am 31.12.2010 1.861,03 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +* Kumulierter Wert (ggf. inkl. Zulagerückforderungen). Gliederung nach Beitragsjahren erfolgt zusätzlich in der § 92 EStG-Bescheinigung. + +Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): 1.835,68 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der Auszahlungsphase +mindestens zur Verfügung. + +Gesamtbetrachtung seit Vertragsbeginn am 11.12.2006 bis zum 31.12.2010 +Ansparphase DekaBank Betrag +EUR +Ihre eingezahlten Beiträge gesamt 1.320,50 +Gezahlte Zulage gesamt (Grund- und ggfs. Kinderzulage) 515,18 +Abschluss- und Vertriebskosten - Ausgabeaufschläge gesamt 61,41 +Laufende Verwaltungskosten gesamt +Vertragspreis gesamt 45,00 +Weitere Preise gesamt 0,00 + +Bestand Ihrer Fondsanteile +Kosten für die Verwaltung +Verwaltungs- Depotbank- Preis je Anteil Gegenwert +Fondsname ISIN vergütung* gebühr * EUR Anteile EUR +Deka-BR 100 DE0005424519 1,00 % 0,10 % 39,230000 47,439 1.861,03 +* Kosten für die Verwaltung des gebildeten Kapitals in % des durchschittlichen Fondsvermögens (Kosten entstehen direkt im Fonds) +Wichtige Rahmenbedingungen +Vertragsbeginn: 11.12.2006 +Zahlungsweise in 2011: jährlich (Lastschrifteinzug Nr. 1) +Diese Bescheinigung ist maschinell erstellt und wird nicht unterschrieben. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Zusatzinformation nach § 7 Abs. 4 AltZertG +per 31.12.2010 +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Mitteilung jeweils jährlich zum: 31.12. +Vollmacht Dauerzulage liegt vor: Ja +Verfügungsdatum: 0 1.10.2047 +(Beginn Auszahlungsphase) +W- eitere Informationen +- Die Berechnung "Performance Ihres Altersvorsorgevertrages" weicht von der Betrachtungsweise auf Einzelfondsebene in der "Depotübersicht" +(dort "Wertentwicklung in EUR") ab. Der Wert "Performance Ihres Altersvorsorgevertrages" stellt eine Gesamtbetrachtung Ihres Vertrages dar, +bei der z. B. auch Vertragskosten berücksichtigt wurden. +- Die in Ihrem privaten Altersvorsorgevertrag gebuchten Einzelumsätze entnehmen Sie bitte der Umsatz-Jahresübersicht. +- Ethische, soziale und ökologische Belange wurden bei der Verwendung der eingezahlten Altersvorsorgebeiträge nicht berücksichtigt. +- Allein verbindliche Informationsgrundlage zu den in Ihrem Altersvorsorgevertrag geführten Fonds ist der jeweils gültige Verkaufsprospekt mit den +Vertragsbedingungen, den zuletzt veröffentlichten Rechenschafts- und Halbjahresberichten sowie das Preis- und Leistungsverzeichnis zum +DekaBank Depot. Diese Unterlagen erhalten Sie auf Wunsch von Ihrem Berater ausgehändigt, Sie können sie bei uns anfordern oder über +www.deka.de abrufen. +- Diese Bescheinigung ist für Ihre Unterlagen bestimmt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht14.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht14.txt new file mode 100644 index 0000000000..5f9ccbb007 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht14.txt @@ -0,0 +1,384 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Jahresdepotauszug per 31.12.2011 +Depotübersicht +Depot: 0111111111 +Depotinhaber: +... +.. +. +.. Richard Mustermann +.... Bankverbindung: +Konto: 0000111111 BLZ: 793 517 30 +Spk Ostunterfranken +Herrn Inh.: Richard Mustermann +Richard Mustermann Sparer-Pauschbetrag +Musterstraße 9 Erteilt 2011: EUR 600,00 +11111 Stadt Beansprucht: EUR 141,81 + +ISIN Unterdepot Bezeichnung Wert Wertentwicklung +in EUR in EUR +per 31.12.2011 * für 2011 +LU0268059614 00 Deka-LiquiditätsPlan TF 1.023,10 +8,45 +LU0348413815 00 DekaLux-PharmaTech TF 1.932,04 +129,83 +DE0008474511 00 AriDeka CF 1.537,35 -209,92 +LU0133666759 00 Deka-ConvergenceAktien TF 2.080,03 -632,22 +LU0133666759 01 Deka-ConvergenceAktien TF 801,61 -243,65 +LU0052859252 00 DekaLux-Pazifik 2.508,93 -489,30 +LU0062624902 00 DekaLux-Deutschland TF A 2.197,50 -593,53 +DE0009771980 00 Deka-EuropaBond TF 2.053,93 +80,69 +DE0009786285 00 Deka-EuropaPotential TF 2.079,44 -523,37 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 2.139,25 -100,67 + Gesamt in EUR 18.353,18 -2.573,69 +D epotpreis inkl. 19% MwSt: +10,00 EUR wurden für 2011 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. + +Besondere Hinweise zur Deka-BonusRente: +Das Jahresendereporting zur Deka-BonusRente mit der Bescheinigung nach § 92 EStG sowie der Zusatzinformation nach § 7 Abs. 4 +Altersvorsorgeverträge-Zertifizierungsgesetz (AltZertG) geht Ihnen mit separater Post Ende Februar 2012 zu. Sofern Sie die DekaBank per +Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, übernehmen wir dies auf Grundlage der von +Ihnen mitgeteilten Daten. Die Zulage wird nach Eingang Ihrem Deka-BonusRente Vertrag gutgeschrieben. Liegt uns Ihre Zustimmung zur +Datenübermittlung der gezahlten Beiträge zur Beantragung des Sonderausgabenabzugs vor, erfolgt per Datenfernübertragung eine Meldung an die +Deutsche Rentenversicherung Bund - Zentrale Zulagenstelle für Altersvermögen (ZfA). +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem Jahresdepotauszug" auf der Rück- bzw. Folgeseite. +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Ostunterfranken +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +HINWEISE ZU IHREM JAHRESDEPOTAUSZUG +Wert in EUR per 31.12.2011: +Der Wert der Investmentanlage berechnet sich aus dem Anteilbestand per 31. Dezember 2011 multipliziert mit dem Preis je Anteil. Die Bewertung des Fonds erfolgt mit dem +jeweils letzten verfügbaren Rücknahmepreis, der zum Zeitpunkt der Erstellung dieses Auszugs vorlag. +Wertentwicklung in EUR per 31.12.2011: +Die Berechnung der Wertentwicklung im Rahmen des Jahresdepotauszuges erfolgt für den Betrachtungszeitraum 01. Januar bis 31. Dezember des betreffenden Kalenderjahres. +Für die Berechnung der Wertentwicklung werden für den Betrachtungszeitraum die Anfangs- und Endbestände sowie Buchungen, bei denen es zu einer stücke- und/oder +geldmäßigen Bewegung kam, herangezogen. Gegebenenfalls abgeführte Steuern werden hierbei nicht berücksichtigt. Eventuell einbehaltene Gebühren und Ausgabeaufschläge +reduzieren Ihre Wertentwicklung. Es wird keine Wertentwicklung für das Unterdepot ausgewiesen, wenn dieses im Betrachtungszeitraum ohne Bestand ist. +Allgemeine Risikohinweise: +Anteile an Investmentfonds sind Wertpapiere, deren Preise durch die börsentäglichen Kursschwankungen der im jeweiligen Investmentfonds befindlichen Vermögenswerte +bestimmt werden (und deshalb steigen oder auch fallen können). Kursänderungen bei den Vermögensgegenständen (z. B. Aktien, Anleihen) und Wechselkursschwankungen +können somit den Wert einer Anlage in Investmentfonds sowohl positiv als auch negativ beeinflussen. +Verwahrung des Anteilsbestandes: +Die Anteile werden im Girosammel-Depot oder in Form einer Gutschrift in Wertpapierrechnung verwahrt. Die Anteilsbruchteile stellen das Miteigentum an einer +Bruchteilgemeinschaft dar. +Beanspruchter Sparer-Pauschbetrag für das Kalenderjahr 2011: +Die Höhe des von Ihnen erteilten Sparer-Pauschbetrages entnehmen Sie bitte Ihrer Depotübersicht oder Ihrem Depotauszug. Der in Anspruch genommene Betrag wird in der +Steuerbescheinigung ausgewiesen. Eingereichte Freistellungsaufträge gelten für alle bestehenden und zukünftigen DekaBank Depots, die von einem vermittelnden Institut betreut +werden. +Der Freistellungsauftrag muss zur steuerlichen Wirksamkeit die angeforderten persönlichen Daten enthalten (Name, abweichender Geburtsname, Vorname, Geburtsdatum, +vollständige Anschrift und seit 01. Januar 2011 zwingend auch die Steuer-ID-Nr.). +Ab dem Jahr 2016 verlieren alte - also bis zum 31.12.2010 ohne Steuer-ID-Nr. erteilte - Freistellungsaufträge ihre Wirksamkeit. In diesen Fällen obliegt es den Kreditinstituten die +Steuer-ID-Nr. beim Kunden zu erfragen oder - soweit der Kunde nicht widerspricht - die Steuer-ID-Nr. beim Bundeszentralamt für Steuern abzufragen. +Ehegattenübergreifende Verlustverrechnung: +Bei Vorlage eines gemeinschaftlichen Freistellungsauftrages von Ehegatten wird seit dem Kalenderjahr 2010 eine ehegattenübergreifende Verlustverrechnung durchgeführt. Diese +erfolgt stets zum Jahresende. Die ehegattenübergreifende Verlustverrechnung erfolgt immer unter sämtlichen für die Ehegatten geführten Depots +(Einzeldepots/Gemeinschaftsdepots) und zwar unabhängig davon, ob die tatsächlichen Voraussetzungen einer Zusammenveranlagung i. S. des § 26 Absatz 1 Satz 1 EStG gegeben +sind. + Ist keine übergreifende Verlustverrechnung gewünscht bzw. liegen die Voraussetzungen einer Zusammenveranlagung i. S. des § 26 Absatz 1 Satz 1 EStG nicht vor (da getrennte +Veranlagung), können für Einzeldepots getrennte Freistellungsaufträge erteilt werden. Eine Darstellung zu den infolge der ehegattenübergreifenden Verlustverrechnung +übertragenen bzw. erhaltenen Beständen finden Sie im nichtamtlichen Teil der Steuerbescheinigung. +Zum Zweck der übergreifenden Verlustverrechnung kann ein Freistellungsauftrag auch in Höhe von 0,00 EUR eingereicht werden, z. B. wenn Ehegatten ihren gemeinsamen +Sparerpauschbetrag bereits bei anderen Instituten ausgeschöpft haben. Dabei ist zu beachten, dass eine auf Bankebene erfolgte Verlustverrechnung nach derzeitiger Auffassung +der Finanzverwaltung in der Veranlagung nicht mehr rückgängig gemacht werden kann. +Fehlerkorrekturen bei Privatanlegern: +Bei der Erhebung der Abgeltungsteuer können auf Ebene des deutschen Kreditinstituts Fehler beim Abgeltungsteuerabzug nicht vollständig ausgeschlossen werden. +Grundsätzlich erfolgt die Korrektur von Fehlern rückwirkend. +In Fällen kalenderjahresübergreifender Fehler erfolgt die Korrektur grundsätzlich nur mit Wirkung für die Zukunft, d.h. es erfolgt keine Stornierung und Neuabrechnung des +ursprünglichen Geschäftsvorfalls. Für Zwecke der Korrektur wird dann auf den Kundenstatus und dessen steuerlichen Merkmale zum Zeitpunkt des Bekanntwerdens des Fehlers +abgestellt. +Eine solche Korrektur mit Wirkung in die Zukunft hat den Vorteil, dass eine Rückforderung und Neuausstellung der bereits erteilten und fehlerhaften Steuerbescheinigung für das +Fehlerjahr und diesem nachfolgenden Jahren unterbleiben kann. +Ausweis von Umsätzen mit 0,000 Anteilen infolge kaufmännischer Rundungen: +Fondsanteile werden im DekaBank Depot mit drei Nachkommastellen abgebildet. Hierdurch kann es bei Buchungen von Kleinstbeträgen, speziell auch bei Erstattungen von +Kapitalertragsteuer und Solidaritätszuschlag mittels Kauf von Fondsanteilen zu Rundungsdifferenzen kommen (Berechnung des Umsatzes / Anteilpreis), so dass eventuell 0,000 +Anteile ausgewiesen werden. +Werbungskosten: +Werbungskosten, z. B. Depotgebühren, die Ihnen im Zusammenhang mit Ihren Investmentanteilen entstanden sind, können im Rahmen der Einkommensteuererklärung nicht mehr +individuell steuerlich geltend gemacht werden. Diese gelten im Rahmen des Sparer-Pauschbetrages als bereits berücksichtigt. +Bescheinigung vermögenswirksamer Leistungen für 2011: +Wenn in Ihrem Depot vermögenswirksame Leistungen (VL) verwahrt werden, erhalten Sie mit dem Jahresdepotauszug per 31. Dezember 2011 eine Bescheinigung der im +Kalenderjahr 2011 eingezahlten VL-Leistungen. Bitte fügen Sie diese Bescheinigung Ihrer Einkommensteuererklärung bei. Sie dient als Antrag zur Gewährung einer Sparzulage. +Zahlungseingänge, die nicht mehr im Kalenderjahr 2011 erfolgten (z. B. im Januar 2012 für Dezember 2011), werden erst in der Bescheinigung für das Kalenderjahr 2012 +ausgewiesen. +Sollten auf Ihrem Vertrag Zahlungseingänge fehlen, fragen Sie bitte erst bei Ihrem Arbeitgeber nach, auf welches Konto die vermögenswirksamen Leistungen überwiesen wurden. +Erst mit dieser Information können wir die Zahlungseingänge überprüfen. +Steuerbescheinigung 2011: +Die Steuerbescheinigung enthält grundsätzlich alle im Kalenderjahr zugrunde liegenden Kapitalerträge, die mit Kapitalertragsteuer, Solidaritätszuschlag und ggf. Kirchensteuer +belastet wurden. Veräußerungsgewinne wie auch ausländische Quellensteuern werden ebenso ausgewiesen. Außerdem werden nicht ausgeglichene Verluste bescheinigt, wenn +ein Antrag auf Verlustbescheinigung bis zum 15. Dezember gestellt wurde. Ist bis zu diesem Datum kein Antrag auf Verlustbescheinigung gestellt worden, werden nicht +ausgeglichene Verrechnungssalden auf das nächste Kalenderjahr übertragen. Bitte berücksichtigen Sie, dass trotz Abgeltungsteuer durch bestimmte Tatbestände eine Pflicht zur +Veranlagung durch das Wohnsitzfinanzamt besteht (z. B. unberücksichtigte Kirchensteuer bei inländischen thesaurierenden Fonds) bzw. eine freiwillige Veranlagung in Betracht +kommen kann (z. B. Günstigerprüfung, Berücksichtigung anrechenbarer aber noch nicht angerechneter ausländischer Quellensteuer, Verrechnung von Kapitalerträgen bei +mehreren Kreditinstituten etc.). Nähere Informationen entnehmen Sie bitte der Broschüre "Die Abgeltungsteuer, Alles Wissenswerte im Überblick", die Sie bei Ihrer +Sparkasse/Landesbank oder unter deka.de erhalten. +Kapitalerträge aus Investmentanteilen bei Privatvermögen: +Die Kapitalerträge errechnen sich aus dem Gesamtbetrag aller kapitalertragsteuerpflichtigen Erträge (z.B. Ausschüttungen, Thesaurierungen, Veräußerungsgeschäfte) des +Kalenderjahres 2011. Diese werden um den verrechenbaren Verlustverrechnungstopf (gezahlte Zwischengewinne und Veräußerungsverluste) gemindert. Bei Angaben zu +besitzanteiligen akkumulierten Thesaurierungen aus dem Verkauf von ausländisch thesaurierenden Fonds oder bei Ausweis der Ersatzbemessungsgrundlage (Anwendung wegen +fehlender Anschaffungskosten) kann die tatsächliche Einkommensteuerpflicht nur im Wege der Veranlagung ermittelt werden. +Kapitalerträge aus Investmentanteilen bei Betriebsvermögen: +Die Kapitalerträge errechnen sich aus mit Kapitalertragsteuer belasteten Erträgen aus Ausschüttungen, Thesaurierungen und kapitalertragsteuerpflichtigen Erträgen aus Verkäufen +(vereinnahmte Zwischengewinne und/oder besitzanteilig akkumulierte Thesaurierungen) des Kalenderjahres 2011. Eine Verlustverrechnung findet grundsätzlich nicht statt. +Veräußerungsgeschäfte werden berücksichtigt, sofern eine Kapitalertragsteuer aufgrund der Rechtsform oder fehlender Freistellung belastet wurde. Für betriebliche Anleger stellt +die Abgeltungsteuer nur eine Vorauszahlung auf die Einkommen- oder Körperschaftsteuerschuld dar und hat keine abgeltende Wirkung. +Fonds mit Mindestanlagesumme von 100.000 EUR nach § 18 Abs. 2a InvStG: +Haben Sie zwischen dem 09. November 2007 und dem 01. Januar 2009 Anteile der oben genannten Fonds im privaten Vermögen erworben und nach dem 31. Dezember 2008 +zurückgegeben, dann unterliegt der Gewinn daraus (unabhängig von einer Haltedauer) der Abgeltungsteuer. Somit ist der gesamte Rückgabe- oder Veräußerungsgewinn +steuerpflichtig. +Bitte berücksichtigen Sie dies bei den Angaben in Ihrer Steuererklärung. Für weitere Informationen wenden Sie sich bitte an eine steuerfachkundige Person oder Ihr +Wohnsitzfinanzamt. +Zinsinformationsverordnung: +Aufgrund der am 01. Juli 2005 in Kraft getretenen Zinsinformationsverordnung (auf Grundlage der EU-Zinsrichtlinie 2003/ 48 / EG des Rates vom 03. Juni 2003) ist die DekaBank +verpflichtet, Zinserträge die im Rahmen von Ausschüttungen gezahlt wurden bzw. den Gegenwert von Anteilscheinrücknahmen von Investmentfonds von wirtschaftlichen +Eigentümern mit ausländischem steuerlichen Wohnsitz innerhalb der angeschlossenen Staaten in bestimmten Fällen an das Bundeszentralamt für Steuern zu melden. +Jahresdepotauszug per 31.12.2011 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-LiquiditätsPlan TF +ISIN: LU0268059614 Unterdepot: 00 +Verwahrart: GiroSammel +Wichtige Information: Der Fonds Deka-GeldmarktPlan TF wurde mit Wirkung zum 01.07.11 in Deka-LiquiditätsPlan TF umbenannt. + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 1.014,65 991,840000 1,023 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Ausschüttung 12,48 983,890000 +0,013 19.08.2011 19.08.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 1.023,10 987,550000 1,036 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 1.802,21 114,100000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Thesaurierung 0,00 116,320000 +0,000 01.07.2011 01.07.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 1.932,04 122,320000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 1.747,27 51,670000 33,816 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Ausschüttung 8,88 53,480000 +0,166 18.02.2011 18.02.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 1.537,35 45,240000 33,982 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2011 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 2.712,25 178,250000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Thesaurierung 0,00 127,080000 +0,000 04.10.2011 04.10.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 2.080,03 136,700000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 1.045,26 178,250000 5,864 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Thesaurierung 0,00 127,080000 +0,000 04.10.2011 04.10.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 801,61 136,700000 5,864 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 2.998,23 492,320000 6,090 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Ausschüttung 38,73 387,930000 +0,100 21.11.2011 21.11.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 2.508,93 405,320000 6,190 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2011 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 2.791,03 86,220000 32,371 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Ausschüttung 4,86 65,340000 +0,074 21.11.2011 21.11.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 2.197,50 67,730000 32,445 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +Deka-EuropaBond TF +ISIN: DE0009771980 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 1.973,24 37,800000 52,202 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Ausschüttung 60,03 38,000000 +1,580 19.08.2011 19.08.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 2.053,93 38,190000 53,782 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2010 2.602,81 72,210000 36,045 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Abrechnungsbetrag Thesaurierung 0,00 57,690000 +0,000 30.12.2011 30.12.2011 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2011 2.079,44 57,690000 36,045 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 + +Dieser Depotauszug besteht aus 3 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2011 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 011111111199940500 Z ertifizierungs-Nr.: 003604 + +Aktuelle Phase: Ansparphase B eginn der Auszahlungsphase: 01.10.2047 +Übersicht der angesparten Fonds + Fondsname ISIN Verwahrart + Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je A nteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Bestand am 31.12.2010 Deka-BR 100 1.861,03 39,230000 47,439 +Gesamtbestand des Vertrages am 31.12.2010 1.861,03 +Bewertung mit dem Rücknahmepreis vom 30.12.2010 +Zulagenzahlung 2010 Deka-BR 100 108,89 39,750000 +2,739 19.05.2011 19.05.2011 +Abrechnungsbetrag Thesaurierung Deka-BR 100 1,92 37,340000 +0,051 01.07.2011 01.07.2011 +Lastschrifteinzug Deka-BR 100 270,00 33,430000 +8,077 04.10.2011 04.10.2011 +Bestand am 31.12.2011 Deka-BR 100 2.139,25 36,690000 58,306 +Gesamtbestand des Vertrages am 31.12.2011 2.139,25 + Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Bescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Richard Mustermann , 11111 Stadt, Musterstraße 9 + werden für das Kalenderjahr 2011 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge 141,81 KAP: Zeile 7 +davon: Gewinn aus Kapitalerträgen im Sinne des § 20 Abs. 2 EStG 0,00 KAP: Zeile 8 +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG 0,00 KAP: Zeile 11 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 12 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 13 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 141,81 KAP: Zeile 14 +Kapitalertragsteuer 0,00 KAP: Zeile 49 +Solidaritätszuschlag 0,00 KAP: Zeile 50 +Kirchensteuer zur Kapitalertragsteuer 0,00 KAP: Zeile 51 +Kirchensteuer zur Kapitalertragsteuer 0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 52 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 5,18 KAP: Zeile 53 +Ausländischer thesaurierender Investmentfonds vorhanden +nur nachrichtlich: +Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden 3,73 KAP: Zeile 15 +Investmentvermögen +Bei Veräußerung/Rückgabe von Anteilen 0,00 +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen Erträge +aus Anteilen an ausländischen Investmentvermögen in Fällen des § 7 Abs. 1 Satz 1 Nr. 3 +InvStG +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer +1111111111111 abgeführt. +Das Ankreuzfeld "Ausländischer thesaurierender Investmentfonds vorhanden" bezieht sich auf den Stichtag 31.12.. +Bei inländisch thesaurierenden Fonds kann ein Kirchensteuerantrag nicht berücksichtigt werden. Bitte holen Sie die Besteuerung in der +Veranlagung nach, wenn Sie Kirchensteuerpflichtig sind. +Der Thesaurierungsbetrag aus der Zeile "nur nachrichtlich: Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden +Investmentvermögen" wurde nicht der Kapitalertragsteuer unterworfen. Deshalb müssen Sie diesen Betrag gegebenenfalls in Ihrer +Steuererklärung angeben. Bei Fragen wenden Sie sich bitte an Ihren steuerlichen Berater oder an Ihr Finanzamt. +Sie finden zusätzliche Informationen zu Ihrer Steuerbescheinigung auf der Rückseite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Richard Mustermann , 11111 Stadt, Musterstraße 9 +Aufgrund der rechtlichen Vorgaben können anrechenbare Quellensteuer und Verluste grundsätzlich direkt mit gezahlter Kapitalertragsteuer +verrechnet werden. In bestimmten Fällen, z. B. Erbfälle, Quellensteuer für beschränkt Steuerpflichtige oder Quellensteuer aus ausländisch +thesaurierenden Fonds ist diese Verrechnung jedoch nicht möglich. +Die Beträge sind nicht in der Steuerbescheinigung enthalten und können gegebenenfalls nur im Rahmen der Veranlagung geltend gemacht +werden. Zusätzlich erfolgt für beschränkt steuerpflichtige Depotinhaber der Ausweis der steuerpflichtigen Beträge und bereits gezahlter +Kapitalertragsteuer und Solidaritätszuschlag aus inländischen Dividenden. +Betrag EUR +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 0,76 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht15.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht15.txt new file mode 100644 index 0000000000..71cdfeac2c --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht15.txt @@ -0,0 +1,317 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Jahresdepotauszug per 31.12.2012 +Depotübersicht +Depot: 0111111111 +Depotinhaber: +..... +. Richard Mustermann +.. +. +... Bankverbindung: +Konto: 0000111111 BLZ: 793 517 30 +Spk Ostunterfranken +Herrn Inh.: Mustermann, Richard +Richard Mustermann Sparer-Pauschbetrag +Musterstraße 9 Erteilt 2012: EUR 600,00 +11111 Stadt Beansprucht: EUR 149,03 + +ISIN Unterdepot Bezeichnung Wert Wertentwicklung +in EUR in EUR +per 31.12.2012 * für 2012 +LU0268059614 00 Deka-LiquiditätsPlan TF 0,00 +0,75 +LU0348413815 00 DekaLux-PharmaTech TF 2.162,81 +230,77 +DE0008474511 00 AriDeka CF 1.748,24 +210,89 +LU0133666759 00 Deka-ConvergenceAktien TF 2.399,11 +319,08 +LU0133666759 01 Deka-ConvergenceAktien TF 924,58 +122,97 +LU0052859252 00 DekaLux-Pazifik 2.852,95 +344,02 +LU0062624902 00 DekaLux-Deutschland TF A 2.812,33 +614,83 +DE0009771980 00 Deka-EuropaBond TF 0,00 +194,70 +DE0009786285 00 Deka-EuropaPotential TF 2.404,20 +324,76 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 4.208,77 +256,66 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +4.047,43 EUR + Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. + Gesamt in EUR 19.512,99 +2.619,43 +* Beachten Sie hierzu bitte die Erläuterungen unter "Informationen zum DekaBank Depot" auf der Folgeseite. +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Ostunterfranken +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Depotübersicht +Depot: 0111111111 +Depotinhaber: +Richard Mustermann + Depotpreis inkl. 19% MwSt: +10,00 EUR wurden für 2012 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. + +Besondere Hinweise zur Deka-BonusRente: +Das Jahresendereporting zur Deka-BonusRente mit der Bescheinigung nach § 92 EStG sowie der Zusatzinformation nach § 7 Abs. 4 +Altersvorsorgeverträge-Zertifizierungsgesetz (AltZertG) geht Ihnen separat zu. Der Versand startet Ende Februar 2013. Sofern Sie die DekaBank per +Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, übernehmen wir dies auf Grundlage der von +Ihnen mitgeteilten Daten. Die Zulage wird nach Eingang Ihrem Deka-BonusRente Vertrag gutgeschrieben. Liegt uns Ihre Zustimmung zur +Datenübermittlung der gezahlten Beiträge zur Beantragung des Sonderausgabenabzugs vor, erfolgt per Datenfernübertragung eine Meldung an die +Deutsche Rentenversicherung Bund - Zentrale Zulagenstelle für Altersvermögen (ZfA). +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + + +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-LiquiditätsPlan TF +ISIN: LU0268059614 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 1.023,10 987,550000 1,036 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Verkauf 1.023,85 988,270000 -1,036 30.01.2012 30.01.2012 +Summe der Betragsbewegungen -1.023,85 +Bestand am 31.12.2012 0,00 978,120000 0,000 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 1.932,04 122,320000 15,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 134,330000 +0,000 02.07.2012 02.07.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 2.162,81 136,930000 15,795 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 1.537,35 45,240000 33,982 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Ausschüttung 17,08 48,630000 +0,351 17.02.2012 17.02.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 1.748,24 50,920000 34,333 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 2.080,03 136,700000 15,216 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 152,790000 +0,000 01.10.2012 01.10.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 2.399,11 157,670000 15,216 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 801,61 136,700000 5,864 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 152,790000 +0,000 01.10.2012 01.10.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 924,58 157,670000 5,864 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 2.508,93 405,320000 6,190 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Ausschüttung 58,50 438,170000 +0,134 20.11.2012 20.11.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 2.852,95 451,130000 6,324 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 2.197,50 67,730000 32,445 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 81,810000 +0,000 01.10.2012 01.10.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 2.812,33 86,680000 32,445 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Deka-EuropaBond TF +ISIN: DE0009771980 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 2.053,93 38,190000 53,782 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Verkauf 2.248,63 41,810000 -53,782 30.07.2012 30.07.2012 +Summe der Betragsbewegungen -2.248,63 +Bestand am 31.12.2012 0,00 42,040000 0,000 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel + Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2011 2.079,44 57,690000 36,045 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Abrechnungsbetrag Thesaurierung 0,00 66,700000 +0,000 28.12.2012 28.12.2012 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2012 2.404,20 66,700000 36,045 +Bewertung mit dem Rücknahmepreis vom 28.12.2012 + +Dieser Depotauszug besteht aus 3 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Jahresdepotauszug per 31.12.2012 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 011111111199940500 Z ertifizierungs-Nr.: 003604 + +Aktuelle Phase: Ansparphase B eginn der Auszahlungsphase: 01.10.2047 +Übersicht der angesparten Fonds + Fondsname ISIN Verwahrart + Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je A nteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Bestand am 31.12.2011 Deka-BR 100 2.139,25 36,690000 58,306 +Gesamtbestand des Vertrages am 31.12.2011 2.139,25 +Bewertung mit dem Rücknahmepreis vom 30.12.2011 +Lastschrifteinzug Deka-BR 100 1.000,00 41,090000 +24,337 20.02.2012 20.02.2012 +Zulagenzahlung 2011 Deka-BR 100 62,86 38,880000 +1,617 21.05.2012 21.05.2012 +Abrechnungsbetrag Thesaurierung Deka-BR 100 10,95 39,790000 +0,275 02.07.2012 02.07.2012 +Lastschrifteinzug Deka-BR 100 750,00 43,110000 +17,397 20.12.2012 20.12.2012 +Bestand am 31.12.2012 Deka-BR 100 4.208,77 41,290000 101,932 +Gesamtbestand des Vertrages am 31.12.2012 4.208,77 + Bewertung mit dem Rücknahmepreis vom 28.12.2012 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich schriftlich an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Bescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Richard Mustermann , 11111 Stadt, Musterstraße 9 + + werden für das Kalenderjahr 2012 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge 149,02 KAP: Zeile 7 +davon: Gewinn aus Kapitalerträgen im Sinne des § 20 Abs. 2 EStG 14,73 KAP: Zeile 8 +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG 0,00 KAP: Zeile 11 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 12 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 13 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 149,03 KAP: Zeile 14 oder 15 +Kapitalertragsteuer 0,00 KAP: Zeile 50 +Solidaritätszuschlag 0,00 KAP: Zeile 51 +Kirchensteuer zur Kapitalertragsteuer 0,00 KAP: Zeile 52 +0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 53 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 6,17 KAP: Zeile 54 +Ausländischer thesaurierender Investmentfonds vorhanden +nur nachrichtlich: +Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden 14,18 KAP: Zeile 17 +Investmentvermögen +Hierauf entfallende anrechenbare ausländische Steuern 1,62 KAP: Zeile 54 +Bei Veräußerung/Rückgabe von Anteilen 0,00 +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen Erträge +aus Anteilen an ausländischen Investmentvermögen in Fällen des § 7 Abs. 1 Satz 1 Nr. 3 +InvStG +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer +1111111111111 abgeführt. +Das Ankreuzfeld "Ausländischer thesaurierender Investmentfonds vorhanden" bezieht sich auf den Stichtag 31.12. +Bei der inländischen Thesaurierung für den LINGOHR-EUROPA-SYSTEMATIC-LBB-INVEST (DE0005320097) und den +LINGOHR-SYSTEMATIC-LBB-INVEST (DE0009774794) vom 3. Januar 2012 konnte ein Kirchensteuerabzug nicht berücksichtigt werden. Bitte +holen Sie die Besteuerung in der Veranlagung nach, wenn Sie kirchensteuerpflichtig sind (siehe Informationen zum DekaBank Depot). +Der Thesaurierungsbetrag aus der Zeile "nur nachrichtlich: Höhe der ausschüttungsgleichen Erträge aus ausländischen thesaurierenden +Investmentvermögen" wurde nicht der Kapitalertragsteuer unterworfen. Deshalb müssen Sie diesen Betrag gegebenenfalls in Ihrer +Steuererklärung angeben. Bei Fragen wenden Sie sich bitte an Ihren steuerlichen Berater oder an Ihr Finanzamt. +Zusätzliche Informationen zu Ihrer Steuerbescheinigung finden Sie auf der Rück-/Folgeseite und in den Informationen zum DekaBank Depot. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 + Richard Mustermann , 11111 Stadt, Musterstraße 9 +Aufgrund rechtlicher Vorgaben sind anrechenbare Quellensteuer und Verluste bzw. gezahlte Zwischengewinne grundsätzlich direkt mit +positiven Kapitalerträgen zu verrechnen. Abweichend hiervon ist die Verrechnung jedoch für bestimmte Konstellationen ausgeschlossen, dies +gilt insbesondere bei der Abwicklung von Nachlassfällen oder bei Wechsel des Steuerstatus von Steuerinländer in Steuerausländer oder +umgekehrt. Daher erhalten Sie den nachfolgenden Verlustausweis bzw. den Ausweis anrechenbarer ausländischer Steuer. Die Beträge +können im Rahmen der Veranlagung geltend gemacht werden. +Betrag EUR +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 1,62 +(inklusive der anrechenbaren ausländischen Steuer aus ausländischen thesaurierenden Investmentfonds) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht16.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht16.txt new file mode 100644 index 0000000000..f7e99c4bfd --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht16.txt @@ -0,0 +1,372 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Jahresdepotauszug und Quartalsbericht +per 31.12.2018 +Depotübersicht +Seite: 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Daten für den automatischen Kirchensteuerabzug liegen +für 2019 vor +Sparer-Pauschbetrag +Erteilt 2018: EUR 600,00 +Beansprucht: EUR 105,62 +Herrn +Richard Mustermann +Musterstraße +Frankenweg 7 +11111 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 31.12.2018* für 2018 +LU0348413815 00 DekaLux-PharmaTech TF 4.278,33 +120,55 +DE0008474511 00 AriDeka CF 2.289,91 -363,50 +LU0133666759 00 Deka-ConvergenceAktien TF 2.122,70 -183,46 +LU0133666759 01 Deka-ConvergenceAktien TF 818,09 -70,69 +LU0052859252 00 DekaLuxTeam-Aktien Asien 4.271,79 -600,02 +LU0062624902 00 DekaLux-Deutschland TF A 3.637,28 -860,28 +DE0009786285 00 Deka-EuropaPotential TF 3.968,37 -666,09 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 19.888,02 -1.526,69 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +15.961,43 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. +Gesamt in EUR 41.274,49 -4.150,18 +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem DekaBank Depot / Jahresdepotauszug" auf der Folgeseite. +Depotpreis inkl. 19% Mehrwertsteuer (MwSt): +12,50 EUR inkl. 2,00 EUR MwSt wurden für 2018 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Dieser Jahresdepotbericht enthält Informationen gem. Artikel 63 Abs. 1 und 2 der Delegierten Verordnung Nr. 2017/565. Diese +vierteljährliche Aufstellung Ihrer Vermögenswerte zum 31.12. wird Ihnen, anders als die Quartalsberichte zu den Stichtagen 31.03., 30.06. +und 30.09. eines Kalenderjahres, nicht gesondert zur Verfügung gestellt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2018 +Depotübersicht +Seite: 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Besondere Hinweise zur Deka-BonusRente: +Das Jahresendereporting zur Deka-BonusRente mit der Bescheinigung nach § 92 EStG sowie der Jahresinformation nach § 7a +Altersvorsorgeverträge-Zertifizierungsgesetz (AltZertG) geht Ihnen separat zu. Der Versand startet Ende Februar 2019. Sofern die +Steueridentifikationsnummer vorliegt und Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie +automatisch zu beantragen, übernehmen wir dies auf Grundlage der von Ihnen mitgeteilten Daten. Die Zulage wird nach Eingang Ihrem +Deka-BonusRente Vertrag gutgeschrieben. Liegt uns Ihre Zustimmung zur Datenübermittlung der gezahlten Beiträge zur Beantragung des +Sonderausgabenabzugs vor, erfolgt per Datenfernübertragung eine Meldung an die Deutsche Rentenversicherung Bund - Zentrale +Zulagenstelle für Altersvermögen (ZfA). +Hinweise zum Berater: +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Schweinfurt-Haßberge. +Vorabankündigung (Pre-Notification) +Als Beitrag zur Schaffung des einheitlichen Euro-Zahlungsverkehrsraums (Single Euro Payments Area, SEPA) haben wir zum 29.01.2014 auf +das europaweit einheitliche SEPA-Basis-Lastschriftverfahren umgestellt. Wie Ihnen mit dem Jahresdepotauszug 2013 mitgeteilt, wurden die +uns von Ihnen bereits erteilte(en) Einzugsermächtigung(en) automatisch umgewandelt und als SEPA-Lastschriftmandat(e) weiter genutzt. +Entgelte, Kosten, Steuern und Auslagen gemäß AGB und Preis- und Leistungsverzeichnis, werden im Regelfall von der generellen +Bankverbindung belastet. Bei einer unterjährigen Kündigung Ihres Depots werden anfallende Entgelte frühestens 2 Arbeitstage nach +Depotlöschung belastet. +Ein SEPA-Lastschriftmandat wird durch unsere nachfolgend genannte Gläubiger-Identifikationsnummer und Ihre Mandatsreferenz +gekennzeichnet, die von uns bei allen SEPA-Lastschrifteinzügen anzugeben sind. Sollten Sie nicht Inhaber des (der) nachfolgend angegebenen +Kontos (Konten) sein, bitten wir Sie, den Kontoinhaber entsprechend zu informieren. +Unsere Gläubiger-ID: DE02DBD00000081995 +Übersicht Ihrer Mandate und Lastschriften zum Stichtag 31.12.2018: +Mandatsreferenz: 0111111111001 (generelle Bankverbindung) +IBAN: DE34 7935 0111 0111 1111 81 +Lastschrift für Entgelte, Kosten, Steuern und Auslagen +Belastung gemäß AGB 1.12.4 und Preis- und Leistungsverzeichnis +Betrag (EUR) Gemäß Preis- und Leistungsverzeichnis +Rhythmus jährlich +Ausführungstag 30 +Fälligkeitstag Frühestens 2 Bankarbeitstage nach dem Ausführungstag +Datum Ausführung 11.2019 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 + + + + + + +Jahresdepotauszug und Quartalsbericht +per 31.12.2018 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2017 4.157,78 251,210000 16,551 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag 0,00 251,210000 +0,000 26.01.2018 29.12.2017 +Ausschüttung / Kauf aus Ertrag 25,16 277,850000 +0,091 17.08.2018 17.08.2018 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2018 4.278,33 257,080000 16,642 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2017 2.653,41 68,050000 38,992 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag 0,00 68,050000 +0,000 26.01.2018 29.12.2017 +Ausschüttung / Kauf aus Ertrag 16,38 68,570000 +0,239 10.08.2018 10.08.2018 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2018 2.289,91 58,370000 39,231 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2018 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2017 2.306,16 148,650000 15,514 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag 0,00 148,650000 +0,000 24.01.2018 29.12.2017 +Ausschüttung / Kauf aus Ertrag 14,27 141,790000 +0,101 16.11.2018 16.11.2018 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2018 2.122,70 135,940000 15,615 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2017 888,78 148,650000 5,979 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag 0,00 148,650000 +0,000 24.01.2018 29.12.2017 +Ausschüttung / Kauf aus Ertrag 5,50 141,790000 +0,039 16.11.2018 16.11.2018 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2018 818,09 135,940000 6,018 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2018 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2017 4.871,81 718,450000 6,781 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag 0,00 718,450000 +0,000 26.01.2018 29.12.2017 +Ausschüttung / Kauf aus Ertrag 33,91 648,230000 +0,052 16.11.2018 16.11.2018 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2018 4.271,79 625,170000 6,833 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2017 4.497,56 130,800000 34,385 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag 0,00 130,800000 +0,000 26.01.2018 29.12.2017 +Ausschüttung / Kauf aus Ertrag 27,16 115,150000 +0,236 16.11.2018 16.11.2018 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2018 3.637,28 105,060000 34,621 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2018 +Umsatz-Jahresübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Abgerechnete Buchungs- Abrech- +EUR Fremdwährung Anteil Anteile tag nungstag +EUR +Bestand am 31.12.2017 4.634,46 123,490000 37,529 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag 1,13 123,490000 +0,009 12.01.2018 29.12.2017 +Ausschüttung / Kauf aus Ertrag 28,53 129,630000 +0,220 10.08.2018 10.08.2018 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2018 3.968,37 105,100000 37,758 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Dieser Depotauszug besteht aus 4 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2018 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 011111111199940500 Zertifizierungs-Nr.: 003604 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.10.2047 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +Bestand am 31.12.2017 Deka-BR 100 19.330,71 72,270000 267,479 +Gesamtbestand des Vertrages am 31.12.2017 19.330,71 +Bewertung mit dem Rücknahmepreis vom 29.12.2017 +Thesaurierung / Kauf aus Ertrag Deka-BR 100 0,00 72,270000 +0,000 12.01.2018 29.12.2017 +Kauf aus Ertrag Deka-BR 100 42,80 73,530000 +0,582 12.01.2018 12.01.2018 +Zulagenzahlung 2017 Deka-BR 100 154,00 76,100000 +2,024 15.05.2018 15.05.2018 +Lastschrifteinzug Deka-BR 100 1.930,00 75,900000 +25,428 30.11.2018 30.11.2018 +Mandatsreferenz: 0111111111001 +Bestand am 31.12.2018 Deka-BR 100 19.888,02 67,300000 295,513 +Gesamtbestand des Vertrages am 31.12.2018 19.888,02 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 1 +Steuerbescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Richard Mustermann , 11111 Stadt, Frankenweg 7 +werden für das Kalenderjahr 2018 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge nach Berücksichtigung der teilweisen Steuerfreistellung im Sinne des 105,62 KAP: Zeile 7 +§ 20 Abs. 1 Nr. 6 Satz 9 EStG +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG nach 0,00 KAP: Zeile 9 +Teilfreistellung und im Sinne des § 56 Abs. 3 Satz 4 InvStG 2018 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 10 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 11 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 105,62 KAP: Zeile 12 oder 13 +Kapitalertragsteuer 0,00 KAP: Zeile 48 +Solidaritätszuschlag 0,00 KAP: Zeile 49 +Kirchensteuer zur Kapitalertragsteuer KAP: Zeile 50 +Bistum Würzburg 0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 51 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 0,00 KAP: Zeile 52 +Bei Veräußerung/Rückgabe von vor dem 1. Januar 2018 erworbenen Anteilen an 0,00 +ausländschen Investmentsfonds (Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018): +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen +ausschüttungsgleichen Erträge aus Anteilen an ausländischen Investmentfonds im Sinne des +§ 7 Abs. 1 Satz 1 Nr. 3 InvStG 2004 in Verbindung mit § 56 Abs. 3 Satz 6 InvStG 2018. +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Fortsetzung auf Rück-/Folgeseite(n) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 2 +Richard Mustermann , 11111 Stadt, Frankenweg 7 +Bestandsgeschützte Alt-Anteile im Sinne des § 56 Abs. 6 InvStG 2018 wurden veräußert +nur nachrichtlich: +Höhe der Gewinne im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 (nach Teilfreistellung) 0,00 +Höhe der Verluste im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 (nach Teilfreistellung) 0,00 +Die ausgewiesenen Gewinne sind nach § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 steuerfrei, soweit die insgesamt erzielten Wertveränderungen den +persönlichen Freibetrag von 100.000 Euro nicht übersteigen. Die Steuerfreiheit kann nur im Rahmen der Einkommensteuerveranlagung geltend gemacht +werden. +In der nachrichtlichen Angabe wurden auch Gewinne oder Verluste aufgenommen, bei denen Indizien vorliegen, dass es sich um Anteile an +Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 handeln könnte (Anschaffungsdatum zwischen dem 10. November 2007 und dem 31. Dezember +2008, Anschaffungskosten betragen mindestens 100.000 Euro). Bei Anteilen an Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 sind auch die vor +2018 eingetretenen Wertveränderungen steuerpflichtig und der persönliche Freibetrag von 100.000 Euro ist nicht anwendbar (§ 56 Abs. 6 Satz 6 InvStG +2018). +Bei folgenden Anteilen ist im Rahmen der Veranlagung zu klären, ob es sich um Anteile an Investmentfonds im Sinne des +§ 21 Abs. 2a InvStG 2004 handelt: +Bezeichnung ISIN Anzahl der Anteile Gewinn im Sinne des § 56 +Abs. 6 Satz 1 Nr. 2 InvStG +2018 (nach Teilfreistellung) +Bezeichnung ISIN Anzahl der Anteile Verlust im Sinne des § 56 +Abs. 6 Satz 1 Nr. 2 InvStG +2018 (nach Teilfreistellung) +nur nachrichtlich: +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und ein Gewinn/Verlust nach § 56 Abs. 3 Satz 1 InvStG 2018 erzielt (ohne Fälle der +Ersatzbemessungsgrundlage nach § 56 Abs. 3 Satz 4 InvStG 2018): +Bezeichnung ISIN Anzahl der Anteile Gewinn nach § 56 Abs. 3 +Satz 1 InvStG 2018 +Bezeichnung ISIN Anzahl der Anteile Verlust nach § 56 Abs. 3 +Satz 1 InvStG 2018 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 3 +Richard Mustermann , 11111 Stadt, Frankenweg 7 +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und für die Ermittlung des Gewinns nach § 56 Abs. 3 InvStG 2018 ist nach § 56 Abs. 3 Satz 4 InvStG +2018 folgende Ersatzbemessungsgrundlage anwendbar: +Bezeichnung ISIN Anzahl der Anteile Ersatzbemessungsgrundlage +Eine Ersatzbemessungsgrundlage ist anwendbar, wenn der zum Steuerabzug verpflichteten Stelle relevante Informationen, insbesondere zu +der Höhe der Anschaffungskosten, fehlen. Bei Ansatz einer Ersatzbemessungsgrundlage sind Sie verpflichtet, den tatsächlichen +Veräußerungsgewinn gegenüber dem Finanzamt durch geeignete Unterlagen (z. B. Beleg über die Anschaffung der Investmentanteile) +nachzuweisen. Wenn die Ersatzbemessungsgrundlage aufgrund fehlender Informationen über den Rücknahme-, Markt- oder Börsenpreis +zum 31. Dezember 2017 nicht ermittelt werden konnte, ist in der Spalte "Ersatzbemessungsgrundlage" die Angabe "nicht ermittelbar" +auszuweisen. +Gegenüber dem Steuerpflichtigen wurden nach § 44 Abs. 1 EStG die auf Ausschüttungen eines Investmentfonds abgeführte +Kapitalertragsteuer und der darauf entfallende Solidaritätszuschlag erstattet oder es wurde vom Steuerabzug Abstand genommen. Die +Erstattung oder die Abstandnahme wurden für folgende Investmentanteile vorgenommen: +Bezeichnung ISIN Anzahl der Anteile Höhe der nicht steuerbaren +Ausschüttungen im Sinne +des § 17 Abs. 3 InvStG 2018 +pro Anteil +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer 1111111111111 +abgeführt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht17.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht17.txt new file mode 100644 index 0000000000..39fc30b111 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht17.txt @@ -0,0 +1,361 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Depotübersicht +Seite: 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Daten für den automatischen Kirchensteuerabzug liegen +für 2020 vor +Sparer-Pauschbetrag +Erteilt 2019: EUR 600,00 +Beansprucht: EUR 152,08 +Herrn +Richard Mustermann +Musterstraße +Frankenweg 7 +11111 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 31.12.2019* für 2019 +LU0348413815 00 DekaLux-PharmaTech TF 5.385,36 +1.107,03 +DE0008474511 00 AriDeka CF 2.895,54 +605,63 +LU0133666759 00 Deka-ConvergenceAktien TF 2.861,31 +738,61 +LU0133666759 01 Deka-ConvergenceAktien TF 1.102,77 +284,68 +LU0052859252 00 DekaLuxTeam-Aktien Asien 5.344,34 +1.072,55 +LU0062624902 00 DekaLux-Deutschland TF A 4.525,15 +887,87 +DE0009786285 00 Deka-EuropaPotential TF 5.194,14 +1.225,77 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 27.774,94 +5.781,92 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +18.076,43 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. +Gesamt in EUR 55.083,55 +11.704,06 +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem DekaBank Depot / Jahresdepotauszug" auf der Folgeseite. +Depotpreis inkl. 19% Mehrwertsteuer (MwSt): +12,50 EUR inkl. 2,00 EUR MwSt wurden für 2019 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. +Wichtiger Hinweis zur Steuerbescheinigung +Mit Ihrem Jahresdepotauszug erhalten Sie auch Ihre Steuerbescheinigung. Diese finden Sie direkt im Anschluss an Ihre Depotübersicht. Sofern +Sie mehr als ein Depot in unserem Hause haben, können die Angaben von mehreren Depots in EINER Steuerbescheinigung zusammengefasst +sein. +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Dieser Jahresdepotbericht enthält Informationen gem. Artikel 63 Abs. 1 und 2 der Delegierten Verordnung Nr. 2017/565. Diese +vierteljährliche Aufstellung Ihrer Vermögenswerte zum 31.12. wird Ihnen, anders als die Quartalsberichte zu den Stichtagen 31.03., 30.06. +und 30.09. eines Kalenderjahres, nicht gesondert zur Verfügung gestellt. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Depotübersicht +Seite: 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Besondere Hinweise zur Deka-BonusRente: +Das Jahresendereporting zur Deka-BonusRente ggf. mit dem Antrag auf Altersvorsorgezulage oder den Informationen über gespeicherte +Daten zur Beantragung der Dauerzulage, der Bescheinigung nach § 92 EStG sowie der Jahresinformation nach § 7a +Altersvorsorgeverträge-Zertifizierungsgesetz (AltZertG) geht Ihnen separat zu. Der Versand startet Ende Februar 2020. Sofern uns Ihre +Steueridentifikationsnummer und ggf. die Ihres Ehegatten/Lebenspartners, sowie für die Beantragung von Kinderzulage, die Ihrer Kinder +vorliegt und Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, +übernehmen wir dies auf Grundlage der von Ihnen mitgeteilten Daten. Die Zulage wird nach Eingang Ihrem Deka-BonusRente Vertrag +gutgeschrieben. Zudem übermitteln wir per Datenfernübertragung die von Ihnen gezahlten Beiträge zur Beantragung des +Sonderausgabenabzugs an die Deutsche Rentenversicherung Bund - Zentrale Zulagenstelle für Altersvermögen (ZfA) zur Weiterleitung an Ihr +Wohnsitzfinanzamt. +Hinweise zum Berater: +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Schweinfurt-Haßberge. +Vorabankündigung (Pre-Notification) +Als Beitrag zur Schaffung des einheitlichen Euro-Zahlungsverkehrsraums (Single Euro Payments Area, SEPA) haben wir zum 29.01.2014 auf +das europaweit einheitliche SEPA-Basis-Lastschriftverfahren umgestellt. Wie Ihnen mit dem Jahresdepotauszug 2013 mitgeteilt, wurden die +uns von Ihnen bereits erteilte(en) Einzugsermächtigung(en) automatisch umgewandelt und als SEPA-Lastschriftmandat(e) weiter genutzt. +Entgelte, Kosten, Steuern und Auslagen gemäß AGB und Preis- und Leistungsverzeichnis, werden im Regelfall von der generellen +Bankverbindung belastet. Bei einer unterjährigen Kündigung Ihres Depots werden anfallende Entgelte frühestens 2 Arbeitstage nach +Depotlöschung belastet. +Ein SEPA-Lastschriftmandat wird durch unsere nachfolgend genannte Gläubiger-Identifikationsnummer und Ihre Mandatsreferenz +gekennzeichnet, die von uns bei allen SEPA-Lastschrifteinzügen anzugeben sind. Sollten Sie nicht Inhaber des (der) nachfolgend angegebenen +Kontos (Konten) sein, bitten wir Sie, den Kontoinhaber entsprechend zu informieren. +Unsere Gläubiger-ID: DE02DBD00000081995 +Übersicht Ihrer Mandate und Lastschriften zum Stichtag 31.12.2019: +Mandatsreferenz: 0111111111001 (generelle Bankverbindung) +IBAN: DExx xxx5 0101 xxxx xxx7 81 +Lastschrift für Entgelte, Kosten, Steuern und Auslagen +Belastung gemäß AGB 1.12.4 und Preis- und Leistungsverzeichnis +Betrag (EUR) Gemäß Preis- und Leistungsverzeichnis +Rhythmus jährlich +Ausführungstag 30 +Fälligkeitstag Frühestens 2 Bankarbeitstage nach dem Ausführungstag +Datum Ausführung 11.2020 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 1 +Steuerbescheinigung +Bescheinigung für alle Privatdepots +Verlustbescheinigung im Sinne des § 43 a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Richard Mustermann , 11111 Stadt, Frankenweg 7 +werden für das Kalenderjahr 2019 folgende Angaben bescheinigt: +Betrag EUR Anlage KAP der +Einkommensteuer- +erklärung +Höhe der Kapitalerträge nach Berücksichtigung der teilweisen Steuerfreistellung im Sinne des 152,08 KAP: Zeile 7 +§ 20 Abs. 1 Nr. 6 Satz 9 EStG +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG nach 0,00 KAP: Zeile 9 +Teilfreistellung und im Sinne des § 56 Abs. 3 Satz 4 InvStG 2018 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 10 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 11 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 152,08 KAP: Zeile 12 oder 13 +Kapitalertragsteuer 0,00 KAP: Zeile 48 +Solidaritätszuschlag 0,00 KAP: Zeile 49 +Kirchensteuer zur Kapitalertragsteuer KAP: Zeile 50 +Bistum Würzburg 0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 51 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 0,00 KAP: Zeile 52 +Bei Veräußerung/Rückgabe von vor dem 1. Januar 2018 erworbenen Anteilen an 0,00 +ausländschen Investmentsfonds (Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018): +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen +ausschüttungsgleichen Erträge aus Anteilen an ausländischen Investmentfonds im Sinne des +§ 7 Abs. 1 Satz 1 Nr. 3 InvStG 2004 in Verbindung mit § 56 Abs. 3 Satz 6 InvStG 2018. +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Fortsetzung auf Rück-/Folgeseite(n) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 2 +Richard Mustermann , 11111 Stadt, Frankenweg 7 +Bestandsgeschützte Alt-Anteile im Sinne des § 56 Abs. 6 InvStG 2018 wurden veräußert +nur nachrichtlich: +Höhe der Gewinne im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 (nach Teilfreistellung) 0,00 +Höhe der Verluste im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 (nach Teilfreistellung) 0,00 +Die ausgewiesenen Gewinne sind nach § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 steuerfrei, soweit die insgesamt erzielten Wertveränderungen den +persönlichen Freibetrag von 100.000 Euro nicht übersteigen. Die Steuerfreiheit kann nur im Rahmen der Einkommensteuerveranlagung geltend gemacht +werden. +In der nachrichtlichen Angabe wurden auch Gewinne oder Verluste aufgenommen, bei denen Indizien vorliegen, dass es sich um Anteile an +Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 handeln könnte (Anschaffungsdatum zwischen dem 10. November 2007 und dem 31. Dezember +2008, Anschaffungskosten betragen mindestens 100.000 Euro). Bei Anteilen an Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 sind auch die vor +2018 eingetretenen Wertveränderungen steuerpflichtig und der persönliche Freibetrag von 100.000 Euro ist nicht anwendbar (§ 56 Abs. 6 Satz 6 InvStG +2018). +Bei folgenden Anteilen ist im Rahmen der Veranlagung zu klären, ob es sich um Anteile an Investmentfonds im Sinne des +§ 21 Abs. 2a InvStG 2004 handelt: +Bezeichnung ISIN Anzahl der Anteile Gewinn im Sinne des § 56 +Abs. 6 Satz 1 Nr. 2 InvStG +2018 (nach Teilfreistellung) +Bezeichnung ISIN Anzahl der Anteile Verlust im Sinne des § 56 +Abs. 6 Satz 1 Nr. 2 InvStG +2018 (nach Teilfreistellung) +nur nachrichtlich: +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und ein Gewinn/Verlust nach § 56 Abs. 3 Satz 1 InvStG 2018 erzielt (ohne Fälle der +Ersatzbemessungsgrundlage nach § 56 Abs. 3 Satz 4 InvStG 2018): +Bezeichnung ISIN Anzahl der Anteile Gewinn nach § 56 Abs. 3 +Satz 1 InvStG 2018 +Bezeichnung ISIN Anzahl der Anteile Verlust nach § 56 Abs. 3 +Satz 1 InvStG 2018 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 3 +Richard Mustermann , 11111 Stadt, Frankenweg 7 +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und für die Ermittlung des Gewinns nach § 56 Abs. 3 InvStG 2018 ist nach § 56 Abs. 3 Satz 4 InvStG +2018 folgende Ersatzbemessungsgrundlage anwendbar: +Bezeichnung ISIN Anzahl der Anteile Ersatzbemessungsgrundlage +Eine Ersatzbemessungsgrundlage ist anwendbar, wenn der zum Steuerabzug verpflichteten Stelle relevante Informationen, insbesondere zu +der Höhe der Anschaffungskosten, fehlen. Bei Ansatz einer Ersatzbemessungsgrundlage sind Sie verpflichtet, den tatsächlichen +Veräußerungsgewinn gegenüber dem Finanzamt durch geeignete Unterlagen (z. B. Beleg über die Anschaffung der Investmentanteile) +nachzuweisen. Wenn die Ersatzbemessungsgrundlage aufgrund fehlender Informationen über den Rücknahme-, Markt- oder Börsenpreis +zum 31. Dezember 2017 nicht ermittelt werden konnte, ist in der Spalte "Ersatzbemessungsgrundlage" die Angabe "nicht ermittelbar" +auszuweisen. +Gegenüber dem Steuerpflichtigen wurden nach § 44 Abs. 1 EStG die auf Ausschüttungen eines Investmentfonds abgeführte +Kapitalertragsteuer und der darauf entfallende Solidaritätszuschlag erstattet oder es wurde vom Steuerabzug Abstand genommen. Die +Erstattung oder die Abstandnahme wurden für folgende Investmentanteile vorgenommen: +Bezeichnung ISIN Anzahl der Anteile Höhe der nicht steuerbaren +Ausschüttungen im Sinne +des § 17 Abs. 3 InvStG 2018 +pro Anteil +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer 1111111111111 +abgeführt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 + + +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 4.278,33 257,080000 16,642 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 67,40 280,920000 +0,240 16.08.2019 16.08.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 5.385,36 319,000000 16,882 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 2.289,91 58,370000 39,231 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 25,50 64,430000 +0,396 22.02.2019 22.02.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 2.895,54 73,070000 39,627 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 2.122,70 135,940000 15,615 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 58,24 172,700000 +0,337 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 2.861,31 179,370000 15,952 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 818,09 135,940000 6,018 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 22,45 172,700000 +0,130 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 1.102,77 179,370000 6,148 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 4.271,79 625,170000 6,833 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 15,44 736,070000 +0,021 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 5.344,34 779,740000 6,854 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 3.637,28 105,060000 34,621 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 13,50 129,150000 +0,105 15.11.2019 15.11.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 4.525,15 130,310000 34,726 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2018 3.968,37 105,100000 37,758 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Ausschüttung / Kauf aus Ertrag 14,73 117,600000 +0,125 22.02.2019 22.02.2019 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2019 5.194,14 137,110000 37,883 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Dieser Depotauszug besteht aus 4 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2019 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 011111111199940500 Zertifizierungs-Nr.: 003604 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.10.2047 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +31.12.2018 Deka-BR 100 19.888,02 67,300000 295,513 +Gesamtbestand des Vertrages am 31.12.2018 19.888,02 +Bewertung mit dem Rücknahmepreis vom 28.12.2018 +Zulagenzahlung 2018 Deka-BR 100 175,00 79,670000 +2,197 16.05.2019 16.05.2019 +Lastschrifteinzug Deka-BR 100 3,99 78,220000 +0,051 25.06.2019 25.06.2019 +Lastschrifteinzug Deka-BR 100 4,92 84,870000 +0,058 10.12.2019 10.12.2019 +Lastschrifteinzug Deka-BR 100 1.930,00 88,830000 +21,727 13.12.2019 13.12.2019 +Mandatsreferenz: 0111111111001 +Bestand am 31.12.2019 Deka-BR 100 27.774,94 86,920000 319,546 +Gesamtbestand des Vertrages am 31.12.2019 27.774,94 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht18.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht18.txt new file mode 100644 index 0000000000..87103f8fb4 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht18.txt @@ -0,0 +1,668 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +DekaBank +Herrn Deutsche +Richard Mustermann +Musterstraße Girozentrale +Frankenweg 7 +11111 Stadt +Januar 2021 +Mainzer Landstraße 16 +DekaBank Depot Nr. 0111111111 60325 Frankfurt am Main +Ihr Jahresdepotauszug 2020 sowie weitere wichtige Unterlagen Postfach 11 05 23 +60040 Frankfurt am Main +Sehr geehrter Herr Mustermann, Telefon (0 69) 71 47 - 0 +Telefax (0 69) 71 47 - 13 76 +www.dekabank.de +ein außerordentlich bewegtes Jahr mit Höhen und Tiefen liegt hinter uns. +Als Wertpapierhaus der Sparkassen haben wir alles darangesetzt, Ihnen auch während +Vorstand +der Corona-Zeit mit einem umfassenden Lösungs- und Serviceangebot zur Seite zu Dr. Georg Stocker +stehen. Und es zeigt sich schon jetzt: Auf gute Beratung und besonnenes Handeln zu (Vorsitzender) +setzen, war – wie so oft beim Blick zurück – die richtige Entscheidung. Für Ihr Vertrauen Dr. Matthias Danne +(Stellv. Vorsitzender) +in die DekaBank möchten wir uns ganz herzlich bedanken. Birgit Dietl-Benzin +Daniel Kapffer +Sie erhalten heute Ihren Jahresdepotauszug für das Kalenderjahr 2020. Neben der Martin K. Müller +Depot- und Umsatzübersicht können Sie in den Unterlagen auch Ihre Jahressteuer- Verwaltungsratsvorsitzender +bescheinigung finden. Bitte beachten Sie außerdem die Änderungen der Allgemeinen Helmut Schleweis +Geschäftsbedingungen für DekaBank Depots zum 1. Mai 2021. +USt-Id-Nr. +Zu Ihrer Unterstützung haben wir detaillierte Informationen in den Hinweisen zum DE 114103563 +DekaBank Depot und zum Jahresdepotauszug zusammengestellt. Handelsregister +Amtsgericht +Auf der Rückseite dieses Schreibens finden Sie eine aktuelle Konjunktur- und Markt- Frankfurt am Main +HRA 16068 +einschätzung von Dr. Ulrich Kater, Chefvolkswirt der DekaBank. Darin geht er auf die +außerordentlichen Marktentwicklungen des Jahres 2020 sowie auf die Aussichten für Sitz +die Finanzmärkte und die Auswirkungen auf Ihre Geldanlagen ein. Frankfurt am Main, Berlin +Sie haben Fragen zu Ihren Unterlagen? Sie erreichen uns montags bis freitags von +8.00 bis 18.00 Uhr telefonisch unter (0 69) 71 47 – 6 52. Wir sind gerne für Sie da. +Bleiben Sie bitte gesund! +Beste Grüße +DekaBank +Deutsche Girozentrale +Frank Kalter Dr. Olaf Heinrich +Leiter Vertriebsmanagement Leiter Digitales Multikanalmanagement +Den Niedrigzinsen die Stirn bieten. +Dr. Ulrich Kater +Chefvolkswirt +Liebe Anlegerinnen und Anleger, Bewältigung des Schocks zu unterstützen, werden +ihre Maßnahmen dazu führen, dass ein sichtbarer +was war 2020 für ein bewegtes Jahr! Mit der Anstieg der Zinsen bis in die zweite Hälfte der +Corona-Pandemie hielt ein Jahrhundertereignis Zwanzigerjahre vertagt wird. Das bedeutet noch +Einzug in die Lebenswirklichkeit der Menschen, länger noch niedrigere Zinsen. Doch auch die +in die Wirtschaft und in die Finanzmärkte. Hinzu Digitalisierung und die Nachhaltigkeitsdiskussion +kamen der US-Wahlkrimi und das nicht enden erfuhren durch die Gesundheitskrise einen enormen +wollende „Finale“ der Brexit-Verhandlungen. Schub. Und die Art der Globalisierung ändert sich +Monatelang schwankten die Märkte zwischen ebenfalls zusehends, indem zwar die internationale +Hoffen und Bangen. So fiel der Deutsche Aktienindex Arbeitsteilung weiter vorangetrieben, zum Teil aber +DAX im März auf fast 8.400 Punkte, nachdem er wieder stärker regional konzentriert wird. +nur einen Monat zuvor noch knapp an der Marke +von 13.800 Punkten gescheitert war, um im Herbst Was bedeutet dies alles für Sie als Anleger? Das +wieder deutlich über 13.000 Punkte anzusteigen. vergangene Jahr hat einmal mehr bestätigt, dass +Und der Goldpreis vollführte mehrfach größere an den Kapitalmärkten Schwankungen an der +Sprünge in der Spanne zwischen 1.480 US-Dollar Tagesordnung sind. Zu einem Kursrückgang gehört +(Mitte März) und über 2.050 US-Dollar je Feinunze allerdings auch die Kurserholung. Das hat das +(Anfang August). zurückliegende Jahr erneut eindrucksvoll gezeigt. +Das regelmäßige Investieren in Wertpapiere ist in +Für viele Beobachter war unverständlich, dass die einem solchen Umfeld eine angemessene Strategie. +schweren Wirtschaftseinbrüche durch die Corona- Und man muss es klar benennen: Für die langfristigen +Beschränkungen an den Börsen so schnell wieder Anteile des Vermögens ist eine global diversifizierte +abgeschüttelt wurden. Aber die Marktteilnehmer Aktienanlage noch wichtiger geworden, trotz der +waren schnell zu dem Ergebnis gekommen, dass zurückliegenden Krise – oder gerade wegen der +die Corona-Krise zeitlich begrenzt und durch die dadurch hervorgerufenen Verlängerung des zinslosen +Wirtschaftspolitik gut abgefedert sein würde. Die Zustandes. Wirtschaft war nie einfach, und der +medizinischen Erfolge im Kampf gegen das vor uns liegende Strukturwandel bringt große +Coronavirus unterstützen diese Sichtweise. Noch Herausforderungen mit sich. Wie immer bedeutet ein +aber muss die Krise abgearbeitet werden. Trotzdem solcher Veränderungsprozess aber auch Chancen in +wenden sich viele Marktakteure bereits neuen neuen Wirtschaftszweigen, wie es viele neue, +Zukunftsthemen zu, die zum Teil zwar gar nicht so erfolgreiche Firmen über die vergangenen Monate +neu sind, durch die Corona-Pandemie jedoch gezeigt haben. +nochmals mehr Dynamik entfalten werden. +Mit freundlichen Grüßen +An erster Stelle dieser Themenliste stehen die +Niedrigzinsen. Nachdem die Notenbanken in der +Corona-Pandemie alles daransetzten, eine Finanzkrise Ihr Ulrich Kater +zu verhindern und die Weltwirtschaft bei der Chefvolkswirt DekaBank +Weitere aktuelle Informationen zu volkswirtschaftlichen Themen finden Sie unter: www.deka.de/privatkunden/aktuelles/deka-analyse +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Depotübersicht +Seite: 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Daten für den automatischen Kirchensteuerabzug liegen +für 2021 vor +Sparer-Pauschbetrag +Erteilt 2020: EUR 101,00 bis 31.12.2020 +Beansprucht: EUR 76,97 +Herrn +Richard Mustermann +Musterstraße +Frankenweg 7 +11111 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 31.12.2020* seit 31.12.2019 1 +LU0348413815 00 DekaLux-PharmaTech TF 0,00 -887,81 +DE0008474511 00 AriDeka CF 0,00 -971,05 +LU0133666759 00 Deka-ConvergenceAktien TF 0,00 -1.015,03 +LU0133666759 01 Deka-ConvergenceAktien TF 0,00 -391,20 +LU0052859252 00 DekaLuxTeam-Aktien Asien 0,00 -1.277,78 +LU0062624902 00 DekaLux-Deutschland TF A 0,00 -1.746,38 +DE0009786285 00 Deka-EuropaPotential TF 0,00 -1.832,32 +XF0009994050 00 Deka-BonusRente +DE0005424519 00 - Deka-BR 100 0,00 -772,81 +Gesamt in EUR 0,00 -8.894,38 +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem DekaBank Depot und zum Jahresdepotauszug". +1 Hinweis: Der letzte Handelstag kann stichtagsbezogen vom Quartalsultimo abweichen. +Depotpreis inkl. Mehrwertsteuer (MwSt): +0,00 EUR +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. +Wichtiger Hinweis zur Steuerbescheinigung: +Mit Ihrem Jahresdepotauszug erhalten Sie auch Ihre Steuerbescheinigung. Diese finden Sie direkt im Anschluss an Ihre Depotübersicht. Sofern +Sie mehr als ein Depot in unserem Hause haben, können die Angaben von mehreren Depots in EINER Steuerbescheinigung zusammengefasst +sein. +Sofern in Ihrem Depot ausschließlich Deka-BonusRente und/oder Deka-ZukunftsPlan Verträge geführt werden, sind Erträge hieraus während +der Ansparphase steuerfrei und Sie erhalten KEINE Steuerbescheinigung. +Wichtiger Hinweis zu MiFID: +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Dieser Jahresdepotbericht enthält Informationen gem. Artikel 63 Abs. 1 und 2 der Delegierten Verordnung Nr. 2017/565. Diese +vierteljährliche Aufstellung Ihrer Vermögenswerte zum 31.12. wird Ihnen, anders als die Quartalsberichte zu den Stichtagen 31.03., 30.06. +und 30.09. eines Kalenderjahres, nicht gesondert zur Verfügung gestellt. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Depotübersicht +Seite: 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Hinweise zum Berater: +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Schweinfurt-Haßberge. +Vorabankündigung (Pre-Notification) +Als Beitrag zur Schaffung des einheitlichen Euro-Zahlungsverkehrsraums (Single Euro Payments Area, SEPA) haben wir zum 29.01.2014 auf +das europaweit einheitliche SEPA-Basis-Lastschriftverfahren umgestellt. Wie Ihnen mit dem Jahresdepotauszug 2013 mitgeteilt, wurden die +uns von Ihnen bereits erteilte(en) Einzugsermächtigung(en) automatisch umgewandelt und als SEPA-Lastschriftmandat(e) weiter genutzt. +Entgelte, Kosten, Steuern und Auslagen gemäß AGB und Preis- und Leistungsverzeichnis, werden im Regelfall von der generellen +Bankverbindung belastet. Bei einer unterjährigen Kündigung Ihres Depots werden anfallende Entgelte frühestens 2 Arbeitstage nach +Depotlöschung belastet. +Ein SEPA-Lastschriftmandat wird durch unsere nachfolgend genannte Gläubiger-Identifikationsnummer und Ihre Mandatsreferenz +gekennzeichnet, die von uns bei allen SEPA-Lastschrifteinzügen anzugeben sind. Sollten Sie nicht Inhaber des (der) nachfolgend angegebenen +Kontos (Konten) sein, bitten wir Sie, den Kontoinhaber entsprechend zu informieren. +Unsere Gläubiger-ID: DE02DBD00000081995 +Übersicht Ihrer Mandate und Lastschriften zum Stichtag 31.12.2020: +Mandatsreferenz: 0111111111001 (generelle Bankverbindung) +IBAN: DExx xxx5 0101 xxxx xxx7 81 +Lastschrift für Entgelte, Kosten, Steuern und Auslagen +Belastung gemäß AGB 1.12.4 und Preis- und Leistungsverzeichnis +Betrag (EUR) Gemäß Preis- und Leistungsverzeichnis +Rhythmus jährlich +Ausführungstag 30 +Fälligkeitstag Frühestens 2 Bankarbeitstage nach dem Ausführungstag +Datum Ausführung 11.2021 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 1 +Steuerbescheinigung +Bescheinigung für alle Privatdepots + Verlustbescheinigung im Sinne des § 43a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Richard Mustermann , 11111 Stadt, Frankenweg 7 +werden für das Kalenderjahr 2020 folgende Angaben bescheinigt: +Betrag in EUR Anlage KAP zur +Einkommensteuer- +erklärung +Höhe der Kapitalerträge nach Berücksichtigung der teilweisen Steuerfreistellung im Sinne des 76,98 KAP: Zeile 7 +§ 20 Abs. 1 Nr. 6 Satz 9 EStG +davon: Gewinne aus der Veräußerung bestandsgeschützter Alt-Anteile im Sinne des 0,00 KAP: Zeile 10 + § 56 Abs. 6 Satz 1 Nr. 2 InvStG 20181 + (nach Teilfreistellung) +1 Die ausgewiesenen Gewinne sind nach § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 steuerfrei, +soweit die insgesamt ab dem 1. Januar 2018 eingetretenen und durch Veräußerung +realisierten Wertveränderungen den persönlichen Freibetrag von 100.000 € nicht übersteigen. +Die Steuerfreiheit kann nur im Rahmen der Einkommensteuerveranlagung geltend gemacht +werden. +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG nach 0,00 KAP: Zeile 11 +Teilfreistellung und im Sinne des § 56 Abs. 3 Satz 4 InvStG 2018 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 12 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 13 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 76,97 KAP: Zeile 16 oder 17 +Kapitalertragsteuer 0,00 KAP: Zeile 37 +Solidaritätszuschlag 0,00 KAP: Zeile 38 +Kirchensteuer zur Kapitalertragsteuer KAP: Zeile 39 +Bistum Würzburg 0,00 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 40 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 0,00 KAP: Zeile 41 +Bei Veräußerung/Rückgabe von vor dem 1. Januar 2018 erworbenen Anteilen an 2,34 +ausländschen Investmentsfonds (Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018): +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen +ausschüttungsgleichen Erträge aus Anteilen an ausländischen Investmentfonds im Sinne des +§ 7 Abs. 1 Satz 1 Nr. 3 InvStG 2004 in Verbindung mit § 56 Abs. 3 Satz 6 InvStG 2018. +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Fortsetzung auf Rück-/Folgeseite(n) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 2 +Richard Mustermann , 11111 Stadt, Frankenweg 7 +nur nachrichtlich: +Bestandsgeschützte Alt-Anteile im Sinne des § 56 Abs. 6 InvStG 2018 wurden veräußert, bei denen Indizien vorliegen, dass es sich um +Anteile an Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 handeln könnte (Anschaffungsdatum zwischen dem 10. November +2007 und dem 31. Dezember 2008, Anschaffungskosten betragen mindestens 100.000 Euro): +Bei Anteilen an Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 sind auch die vor 2018 eingetretenen Wertveränderungen +steuerpflichtig und der persönliche Freibetrag von 100.000 Euro ist nicht anwendbar (§ 56 Abs. 6 Satz 4 InvStG 2018). Verluste aus der +Veräußerung von bestandsgeschützten Alt-Anteilen sind im Davon-Ausweis der Gewinne aus der Veräußerung bestandsgeschützter +Alt-Anteile im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 nicht enthalten. Zur Prüfung des § 56 Abs. 6 Satz 4 InvStG 2018 i. V. m. § +21 Abs. 2a InvStG 2004 sind diese Verluste dennoch in der nachfolgenden Tabelle ausgewiesen. +Bei folgenden Anteilen ist im Rahmen der Veranlagung zu klären, ob es sich um Anteile an Investmentfonds im Sinne des § 21 Abs. 2a +InvStG 2004 handelt: +Bezeichnung ISIN Anzahl der Anteile Gewinn/Verlust 2 im Gewinn/Verlust aus +Sinne des § 56 Abs. 6 der fiktiven +Satz 1 Nr. 2 InvStG 2018 Veräußerung nach +(nach Teilfreistellung) § 56 Abs. 3 Satz 1 +InvStG 2018 +2 Bei Verlusten wurde ein negatives Zeichen (Minuszeichen) verwendet. +nur nachrichtlich +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und für die Ermittlung des Gewinns nach § 56 Abs. 3 InvStG 2018 ist nach § 56 Abs. 3 Satz 4 InvStG +2018 folgende Ersatzbemessungsgrundlage anwendbar: +Bezeichnung ISIN Anzahl der Anteile Ersatzbemessungsgrundlage +Eine Ersatzbemessungsgrundlage ist anwendbar, wenn der zum Steuerabzug verpflichteten Stelle relevante Informationen, insbesondere zu +der Höhe der Anschaffungskosten, fehlen. Bei Ansatz einer Ersatzbemessungsgrundlage sind Sie verpflichtet, den tatsächlichen +Veräußerungsgewinn gegenüber dem Finanzamt durch geeignete Unterlagen (z. B. Beleg über die Anschaffung der Investmentanteile) +nachzuweisen. Wenn die Ersatzbemessungsgrundlage aufgrund fehlender Informationen über den Rücknahme-, Markt- oder Börsenpreis +zum 31. Dezember 2017 nicht ermittelt werden konnte, ist in der Spalte "Ersatzbemessungsgrundlage" die Angabe "nicht ermittelbar" +auszuweisen. +Gegenüber dem Steuerpflichtigen wurden nach § 44 Abs. 1 EStG die auf Ausschüttungen eines Investmentfonds abgeführte +Kapitalertragsteuer und der darauf entfallende Solidaritätszuschlag erstattet oder es wurde vom Steuerabzug Abstand genommen. Die +Erstattung oder die Abstandnahme wurden für folgende Investmentanteile vorgenommen: +Bezeichnung ISIN Anzahl der Anteile Höhe der nicht steuerbaren +Ausschüttungen im Sinne +des § 17 Abs. 3 InvStG 2018 +pro Anteil +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer 1111111111111 +abgeführt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Hinweise zu Ihrem DekaBank Depot und +zum Jahresdepotauszug +Aktuelle Mitteilungen Aktualität Ihrer Daten +Generelle Bankverbindung zu Ihrem Depot +Solidaritätszuschlag 2021 Bitte stellen Sie sicher, dass uns Ihre aktuelle Bankverbindung +Zum 1. Januar entfällt der Solidaritätszuschlag auf Einkommen vorliegt. Die uns bekannte Bankverbindung finden Sie in diesem +ganz oder teilweise für über 90 % der Steuerzahler. Jahresdepotauszug unter „Übersicht Ihrer Mandate“. +Unabhängig davon bleibt der Solidaritätszuschlag bei solchen Änderungen teilen Sie bitte Ihrer Sparkasse/Landesbank mit. +Kapitalerträgen bestehen, für die wegen fehlender Freistellung +eine Kapitalertragsteuer angefallen ist. Hinweis aufgrund rechtlicher Vorgaben +Eine Erstattung des Solidaritätszuschlages bei Kapitalerträgen ist Im Zusammenhang mit der Anwendung der Europäischen +unter bestimmten Voraussetzungen nur im Rahmen der Richtlinie über Märkte für Finanzinstrumente (MiFID II) sind wir +Veranlagung (Günstigerprüfung) möglich. dazu verpflichtet, Sie auf Folgendes hinzuweisen: +Hierfür empfehlen wir, sich gegebenenfalls an einen Wir gehen davon aus, dass die Angaben, die Sie Ihrer +Steuerberater oder eine steuerfachkundige Person zu wenden. Sparkasse/Landesbank mitgeteilt haben, aktuell und +vollständig sind. +Bitte informieren Sie Ihre Sparkasse/Landesbank, wenn sich +Tipp: Nutzen Sie die Soli-Ersparnis für den im Hinblick auf diese Angaben Veränderungen ergeben +Ausbau Ihres Vermögensaufbaus und Ihrer haben. +Vorsorge. +Steuerliche Meldepflichten zu Auslandsbeteiligungen nach +Gehören Sie auch zur Mehrzahl der Arbeitnehmer, § 138 Abs. 2 AO +die ab 2021 gar keinen Solidaritätszuschlag mehr +oder einen reduzierten Satz von ihrem Einkommen Die Meldepflichten betreffen Anleger, die im Inland +zahlen müssen? steuerpflichtig sind. +Wenn Sie wissen möchten, wie hoch Ihre Nach § 138 Abs. 2 AO müssen deutsche Steuerpflichtige ihrem +voraussichtliche Ersparnis ist, nutzen Sie unseren Finanzamt unter anderem den Erwerb/die Veräußerung von +Soli-Rechner auf www.deka.de/soli-rechner. Beteiligungen an einer ausländischen Körperschaft (z.B. +ausländische Aktie) oder an einem ausländischen +Dort finden Sie weitere Informationen, auch zu Investmentfonds melden, wenn Beteiligungen von mindestens + Anlagemöglichkeiten mit Deka Investmentfonds. 10 % an dieser Körperschaft oder diesem Investmentfonds +bestehen oder die Anschaffungskosten für die Beteiligungen an +dieser Aktie beziehungsweise diesem Investmentfonds 150.000 +Weitere Informationen € übersteigen. +Sie haben keine Steuerbescheinigung erhalten? Letztere Grenze greift nicht, wenn börsengehandelte +Beteiligungen an einer Gesellschaft von weniger als 1 % +Wenn Sie in den vorliegenden Unterlagen keine erworben/veräußert werden. +Steuerbescheinigung gefunden haben, kann das verschiedene +Gründe haben: Entsprechende Meldungen sind mit der Steuererklärung für den +Besteuerungszeitraum abzugeben, in den der +Z.B. werden für Depots, in denen ausschließlich mitteilungspflichtige Erwerb beziehungsweise die +Altersvorsorgeprodukte verwahrt werden, grundsätzlich keine mitteilungspflichtige Veräußerung fällt; spätestens binnen 14 +Steuerbescheinigungen erstellt. Monaten nach dem Zeitraum. +Bei mehreren Depots erhalten Sie die Steuerbescheinigung Wichtig: Für die Klärung, ob eine Meldepflicht im individuellen +nur einmal zu einem Ihrer Jahresdepotauszüge. Fall besteht, ist ein Steuerberater oder eine steuerfachkundige +Wenn Sie Immobilienfonds im Depot haben, kann eine Person zuständig. Bitte beachten Sie, dass die DekaBank nicht +spätere Erstellung erforderlich sein. In diesem Fall erhalten zur Steuerberatung befugt ist. +Sie Ihre Steuerbescheinigung mit späterer/separater Post. +Erläuterungen zur Vorabpauschale +Für Kunden mit einem Vermögenswirksamen (VL-) +Sparvertrag Abführung von Abgeltungsteuer auf die Vorabpauschaleim DekaBank Depot +Angaben zur elektronischen Wenn für Ihr Depot eine Steuer auf Vorabpauschale fällig wird, +Vermögensbildungsbescheinigung 2020 gilt Folgendes: +Anliegend zum Jahresdepotauszug erhalten Sie die „Mitteilung Sie erhalten ein gesondertes Schreiben außerhalb des +zu Ihrem VL-Vertrag“ mit allen Angaben zur elektronischen Jahresdepotauszugs. +Vermögensbildungsbescheinigung 2020. Diese werden wir - +gemäß den gesetzlichen Vorgaben - der Finanzverwaltung zur Es gelten die gleichen Teilfreistellungen wie für die +Verfügung stellen. Besteuerung von Ausschüttungen und +Freistellungsmöglichkeiten wie etwa Freistellungsauftrag +Bitte prüfen Sie die Angaben und beachten Sie die Hinweise oder Nichtveranlagungsbescheinigung. +und Erläuterungen. Eine anfallende Steuer wird von der DekaBank im Regelfall +Weitere Mitteilungen zur elektronischen von Ihrem Girokonto eingezogen (hierzu ist das +Vermögensbildungsbescheinigung sind nicht vorgesehen. depotführende Kreditinstitut auch ohne Einwilligung des +Anlegers berechtigt). Sollte das nicht möglich sein, werden +Fondsanteile in entsprechender Höhe verkauft. +Wenn der Betrag von der DekaBank nicht eingezogen und FATCA-Abkommen (falls zutreffend) +abgeführt werden kann, leiten wir die Information an Ihr +Finanzamt weiter. Wir sind im Rahmen des FATCA-Abkommens (FATCA: Foreign +Account Tax Compliance Act) zwischen der Bundesrepublik +Deutschland und den USA verpflichtet, Kunden, die sogenannte +Erläuterungen und Hinweise zu einzelnen US-Indizien aufweisen bzw. in den USA steuerpflichtig sind, zu +Angaben auf der Depotübersicht melden. Relevante Kunden sind Depotinhaber, wirtschaftlich +Berechtigte, Rechtsträger mit Geschäfts- oder Gründungsort in +Wert in EUR per 31. Dezember 2020 den USA sowie beherrschende Personen von Rechtsträgern. +Der Wert der Wertpapieranlage berechnet sich aus dem Finanzkonten-Informationsaustauschgesetz +Anteilbestand per 31. Dezember 2020 multipliziert mit dem (falls zutreffend) +Preis je Anteil. Die Bewertung des Wertpapieres erfolgt mit dem Depots mit diesem Hinweis unterliegen den Meldepflichten im +jeweils letzten verfügbaren Preis, der zum Zeitpunkt der Rahmen des Finanzkonten-Informationsaustauschgesetzes. +Erstellung dieses Auszugs vorlag. +Das betrifft Kunden, die im Ausland (ohne USA) steuerpflichtig +Wertentwicklung in EUR für 2020 sind. +Die Berechnung der Wertentwicklung erfolgt für den Meldepflichten für FATCA und +Betrachtungszeitraum 1. Januar bis 31. Dezember des +betreffenden Kalenderjahres. Für den Zeitraum werden die Finanzkonten-Informationsaustauschgesetz: +Anfangs- und Endbestände sowie Buchungen, bei denen es zu Die DekaBank meldet folgende Angaben an das +einer stücke- und/oder geldmäßigen Bewegung kam, Bundeszentralamt für Steuern: +herangezogen. +Name, Adresse und Steuer-ID-Nr. +Abgeführte Steuern werden in der Regel nicht berücksichtigt. Depotsaldo zum Ende des Jahres/Saldo unmittelbar vor einer +Die Wertentwicklung wird durch gezahlte Ausgabeaufschläge Kontoschließung bzw. die Information, dass das Depot +reduziert. Für ein Unterdepot, das im Betrachtungszeitraum geschlossen wurde. +ohne Bestand war, wird keine Wertentwicklung ausgewiesen. +Im Depot gebuchte Erträge sowie Veräußerungserlöse. Die +Wichtig: Wir weisen ausdrücklich darauf hin, dass im Markt Angaben werden im Rahmen des automatischen +unterschiedliche Berechnungsmethoden zur Ermittlung der „Austauschs von Kontodaten in Steuerangelegenheiten“ +Wertentwicklung verwendet werden, z.B. geld- oder vom Bundeszentralamt für Steuern an die jeweilige nationale +zeitgewichtete Berechnungsmethode. Bei Verwendung Finanzbehörde weitergeleitet. +unterschiedlicher Berechnungsmethoden ist es möglich, dass +die in anderen Informationen ausgewiesenen +Wertentwicklungen von der in dieser Information dargestellten +Wertentwicklung abweichen. Ausgewählte Services für mehr Flexibilität bei +Ihrer Geldanlage. +Sparer-Pauschbetrag (falls erteilt) Ihr Depot bei der Deka ist noch nicht für die +Bei gemeinschaftlichen Freistellungsaufträgen wird auf jeder Online-Nutzung aktiviert? Dann schalten Sie es +Depotübersicht die Höhe der insgesamt erteilten und jetzt frei, um Ressourcen nachhaltig zu schonen, +beanspruchten Freistellung angezeigt. Ihr Freistellungsauftrag/ flexibler zu werden und Geld zu sparen. +Ihre Nichtveranlagungsbescheinigung gilt für alle bestehenden +und zukünftigen DekaBank Depots, die von Ihrer Sparkasse/ Sie möchten immer aktuelle Finanztipps und +Landesbank betreut werden. Investment-Informationen von den Deka-Experten +per E-Mail? Dann melden Sie sich gleich für die +Daten für den automatischen Kirchensteuerabzug liegen Online-Kommunikation rund um Deka +für 2021 vor (falls zutreffend) Investments an. +Wir sind gesetzlich verpflichtet, den Kirchensteuerabzug Um diese und weitere Services genauer +vorzunehmen - vorausgesetzt, Sie gehören einer kennenzulernen und dann bei Ihrer Geldanlage +steuererhebenden Religionsgemeinschaft an. noch flexibler zu sein, scannen Sie jetzt den +nebenstehenden QR-Code oder geben Sie +Hierzu fragen wir das sogenannte +Kirchensteuerabzugsmerkmal beim Bundeszentralamt für www.deka.de/online ein. jcbZu4NbPjcbZZlXZgZXpZZlXZ +Steuern ab. Sollten uns entsprechende Informationen czcRPxWUXaacRmBgHw8BgY1kB2 +vorliegen, erhalten Sie den o.g. Hinweistext. pXMVyIKgJeqlPpTXLZbM6rp;wX +jcbZN99:uSjx: +ZlXZGWwIToBOP +Wenn der Hinweistext fehlt, liegt uns das zzzPzPzttt0zP +Kirchensteuerabzugsmerkmal nicht vor. Das kann +verschiedene Gründe haben, zum Beispiel, dass der +DekaBank keine gültige Steuer-Identifikationsnummer +vorliegt und die Abfrage der Religionszugehörigkeit daher Ergänzende Informationen rund um das Thema Steuern +nicht ausgeführt werden konnte. finden Sie im Internet auf: +Der Abzug von Kirchensteuer ist nur möglich bei Einzeldepots www.deka.de/privatkunden/informationen/investmentsteuer +und bei Gemeinschaftsdepots von Ehegatten bzw. unter anderem zu: Sparer-Pauschbetrag, Steuerbescheinigung, +eingetragenen Lebenspartnern. Teilfreistellung, Kirchensteuer. +Aktuelle Informationen +zum DekaBank Depot. +Sehr geehrte Kundin, sehr geehrter Kunde, Zum Abschnitt Änderung der Allgemeinen +Geschäftsbedingungen +Im Abschnitt Änderung der Allgemeinen Geschäftsbedingungen +wir informieren Sie über wurden redaktionelle Anpassungen vorgenommen: +a) die Änderung der Allgemeinen Geschäftsbedingungen für Änderungen der Allgemeinen Geschäftsbedingungen, der be- + DekaBank Depots (AGB), sonderen Bedingungen Sonderbedingungen sowie die Einfüh- +b) die Änderung des Preis- und Leistungsverzeichnisses zum rung zusätzlicher Bedingungen Sonderbedingungen werden + DekaBank Depot, dem Kunden spätestens zwei Monate vor dem vorgeschlagenen +c) die Änderung der Sonderbedingungen für DekaBank Zeitpunkt ihres Wirksamwerdens in der jeweils gesetzlich zuge- +Depots betreffend Inhaberschuldverschreibungen und lassenen Form angeboten. Die Zustimmung des Kunden zum +d) die Neuregelung der Informationspflichten bei Angebot der DekaBank gilt als erteilt, wenn er seine Ablehnung +Prospektnachträgen gemäß der EU-Prospektverordnung. nicht vor dem vorgeschlagenen Zeitpunkt des Wirksamwerdens +der Änderungen angezeigt hat. Auf diese Genehmigungswir- +a) Änderung der AGB zum 1. Mai 2021 kung wird ihn die DekaBank in ihrem Angebot besonders hin- +weisen. Die DekaBank wird dann die geänderte Fassung der All- +Zu Ziffer 2.7 Ertragsausschüttung gemeinen Geschäftsbedingungen, die geänderten besonderen +Im Zusammenhang mit der Verwahrfähigkeit von Exchange Bedingungen Sonderbedingungen bzw. die zusätzlich einge- +Traded Funds (ETF) im DekaBank Depot wird am Ende von führten Bedingungen Sonderbedingungen der weiteren Ge- +Absatz 2 folgende Regelung angefügt: schäftsbeziehung zugrunde legen. +Bei Exchange Traded Funds (ETF) der Deka Investment GmbH Ihre Zustimmung zu den angebotenen Änderungen der AGB gilt +und bei ETF anderer Verwaltungsgesellschaften erfolgt die als erteilt, wenn Sie Ihre Ablehnung nicht binnen zwei Monaten +Wiederanlage zum Schlusskurs des Tages, an dem die DekaBank nach Bekanntgabe in Textform anzeigen. +den Auftrag nach Ausführung abrechnet. +Darüber hinaus informieren wir Sie, dass die AGB um die +Zu Ziffer 3.2 Verzicht des Kunden auf die Herausgabe von „Hinweise zu außergerichtlichen Streitschlichtungsverfahren“ +Vertriebsvergütungen gegenüber seiner Sparkasse / Bank erweitert werden (vgl. auch entsprechenden Abschnitt in Punkt +(Vertrag zugunsten Dritter zwischen dem Kunden und der b)). Diese Anpassung bedarf nicht Ihrer Zustimmung. +DekaBank) +Im Zusammenhang mit der Verwahrfähigkeit von Exchange Die DekaBank wird die geänderte Fassung der AGB fristgerecht +Traded Funds (ETF) im DekaBank Depot wird nach Absatz 4 ein der weiteren Geschäftsbeziehung zugrunde legen. +neuer Absatz eingefügt: Die vollständige neue Fassung der AGB können Sie auf +Beim Erwerb von Anteilen an Exchange Traded Funds (ETF) nach www.deka.de einsehen. Gerne senden wir Ihnen diese auf +Maßgabe der Sonderbedingungen für DekaBank Depots Wunsch per Post zu. +betreffend Exchange Traded Funds wird der Antrag des Kunden +auf Erwerb von ETF-Anteilen regelmäßig durch die Sparkasse des b) Änderung des Preis- und Leistungsverzeichnisses zum +Kunden an die DekaBank übermittelt. In diesem Fall zahlt die DekaBank Depot zum 1. Januar 2021 +DekaBank an die Sparkasse des Kunden, die diesen bei In der ab 1. Januar 2021 gültigen Fassung des Preis- und +Wertpapiergeschäften betreut, einmalige Vertriebsvergütungen, Leistungsverzeichnisses wird im Zusammenhang mit der +die anlässlich des Geschäftsabschlusses umsatzabhängig gezahlt Verwahrfähigkeit von Exchange Traded Funds im DekaBank +werden. Die Höhe der an die Sparkasse geleisteten einmaligen Depot im Abschnitt „Zahlungsverkehr“ der Unterpunkt +Vertriebsvergütung beträgt in der Regel zwischen 90 % und 95 „Umrechnung bei Fremdwährungsfonds und Fremdwäh- +% des vom Kunden entrichteten Orderentgelts. rungs-Inhaberschuldverschreibungen“ wie folgt ergänzt: +Satz 1 des darauffolgenden Absatzes wird aus dem gleichen Lautet die Fondswährung eines Exchange Traded Funds nicht auf +Grund angepasst: Euro, erfolgt eine Umrechnung zum Devisenmittelkurs. Die +Einzelheiten zur Höhe der Vertriebsvergütungen für ein DekaBank ermittelt bankarbeitstäglich den Mittelkurs auf Basis +konkretes Wertpapier, auch zur Höhe der einmaligen freigehandelter Marktkurse. Der Mittelkurs ist auf Anfrage bei +Vertriebsvergütungen für Anteile eines konkreten ETFs, werden der DekaBank erhältlich. +dem Kunden im Rahmen der aufsichtsrechtlich erforderlichen Des Weiteren werden dem Preis- und Leistungsverzeichnis die +Kostentransparenz unaufgefordert mitgeteilt. „Hinweise zu außergerichtlichen Streitschlichtungsverfahren“ + entnommen. Sie werden zukünftig am Ende der AGB zu finden +sein. +c) Änderung der Sonderbedingungen für DekaBank De- d) Neuregelung der Informationspflichten bei Prospekt- +pots betreffend Inhaberschuldverschreibungen zum 1. nachträgen gemäß der EU-Prospektverordnung +April 2021 +Der gemäß der EU-Prospektverordnung (Verordnung (EU) +Sofern Sie diese Sonderbedingungen mit uns vereinbart haben, 2017/1129) erstellte Wertpapierprospekt enthält eine ausführli- +gelten für Sie die nachfolgenden Änderungen. che Beschreibung der jeweiligen Inhaberschuldverschreibung. +Zu Ziffer 1. Geltungsbereich der Sonderbedingungen; Es besteht unter bestimmten gesetzlichen Voraussetzungen die +Geltung der Allgemeinen Geschäftsbedingungen Möglichkeit, dass ein Nachtrag zum Wertpapierprospekt veröf- +Es wurden lediglich redaktionelle Anpassungen vorgenommen. fentlicht wird. So ist jeder wichtige neue Umstand, jede wesent- +liche Unrichtigkeit oder jede wesentliche Ungenauigkeit in Be- +Zu Ziffer 10. Änderungen der Sonderbedingungen zug auf die im Wertpapierprospekt enthaltenen Angaben in ei- +Die Widerspruchsfrist für Änderungen der Sonderbedingungen nem Nachtrag zum Wertpapierprospekt zu benennen. +wird zu Gunsten des Kunden von sechs Wochen auf zwei Mo- +nate verlängert: Jeder solcher Nachtrag wird entsprechend der gesetzlichen Vor- +gaben vom jeweiligen Emittenten auf seiner Website veröffent- +10. Änderungen der Sonderbedingungen licht. +Die DekaBank wird dem Kunden eine Änderung dieser Sonder- +bedingungen schriftlich mitteilen. Hat der Kunde mit der Deka- Wenn Sie eine Inhaberschuldverschreibung für Ihr DekaBank De- +Bank im Rahmen der Geschäftsbeziehung einen elektronischen pot erworben oder gezeichnet haben und der hierfür maßgebli- +Kommunikationsweg vereinbart (z. B. die Teilnahme an che Wertpapierprospekt Gegenstand eines Nachtrags ist, kann +deka.de), können die Änderungen auch auf diesem Weg Ihnen gemäß Artikel 23 Absatz 2 der EU-Prospektverordnung ein +übermittelt werden. Die Änderung gilt als genehmigt, wenn der Widerrufsrecht zustehen. Die gesetzliche Widerrufsfrist beträgt +Kunde ihr nicht binnen sechs Wochen nach Bekanntgabe in derzeit 2 Arbeitstage. Der Nachtrag wird Angaben zum Ablauf +Textform widerspricht. Die DekaBank wird dann die geänderte der Frist enthalten, die der Emittent freiwillig verlängern kann. +Fassung der Sonderbedingungen der weiteren Ihr Berater wird Ihnen bei der Ausübung des Widerrufsrechts +Geschäftsbeziehung zugrunde legen. Die DekaBank wird den gerne behilflich sein. +Kunden bei der Bekanntgabe der Änderung auf die Folgen Wir werden Sie über jeden Nachtrag zeitnah informieren, soweit +besonders hinweisen. Die Frist ist gewahrt, wenn der Ihnen ein Widerrufsrecht für die betreffende Inhaberschuldver- +Widerspruch innerhalb von sechs Wochen nach Bekanntgabe schreibung zustehen könnte, aber aufgrund der oben genann- +abgesandt worden ist. ten kurzen Fristen nur, wenn Sie ein elektronisches Postfach ha- +Änderungen dieser Sonderbedingungen werden dem Kunden ben. Wenn Sie noch kein elektronisches Postfach haben, wen- +spätestens zwei Monate vor dem vorgeschlagenen Zeitpunkt ih- den Sie sich bitte an Ihren Berater Ihrer Sparkasse. +res Wirksamwerdens in der jeweils gesetzlich zugelassenen Form +angeboten. Die Zustimmung des Kunden zum Angebot der De- +kaBank gilt als erteilt, wenn er seine Ablehnung nicht vor dem +vorgeschlagenen Zeitpunkt des Wirksamwerdens der Änderun- +gen angezeigt hat. Auf diese Genehmigungswirkung wird ihn +die DekaBank in ihrem Angebot besonders hinweisen. Die Deka- +Bank wird dann die geänderte Fassung der Sonderbedingungen +der weiteren Geschäftsbeziehung zugrunde legen. +Die Änderungen der Sonderbedingungen gelten als akzeptiert, +wenn Sie nicht binnen sechs Wochen nach Bekanntgabe in +Textform widersprechen. +Die DekaBank wird die geänderte Fassung der Sonderbedingun- +gen fristgerecht der weiteren Geschäftsbeziehung zugrunde le- +gen. +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 5.385,36 319,000000 16,882 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Auslieferung -16,000 20.03.2020 18.03.2020 +Verkauf 232,27 263,350000 -0,882 20.03.2020 19.03.2020 +Summe der Betragsbewegungen -232,27 +Bestand am 31.12.2020 0,00 323,430000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 2.895,54 73,070000 39,627 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Ausschüttung / Kauf aus Ertrag 56,27 73,930000 +0,761 21.02.2020 21.02.2020 +Auslieferung -40,000 20.03.2020 18.03.2020 +Verkauf 18,49 47,650000 -0,388 20.03.2020 18.03.2020 +Summe der Betragsbewegungen -18,49 +Bestand am 31.12.2020 0,00 70,080000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 2.861,31 179,370000 15,952 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Auslieferung -15,000 20.03.2020 18.03.2020 +Verkauf 110,18 115,740000 -0,952 20.03.2020 18.03.2020 +Summe der Betragsbewegungen -110,18 +Bestand am 31.12.2020 0,00 161,570000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 1.102,77 179,370000 6,148 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Auslieferung -6,000 20.03.2020 18.03.2020 +Verkauf 17,13 115,740000 -0,148 20.03.2020 18.03.2020 +Summe der Betragsbewegungen -17,13 +Bestand am 31.12.2020 0,00 161,570000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 5.344,34 779,740000 6,854 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Auslieferung -6,000 20.03.2020 18.03.2020 +Verkauf 494,76 579,350000 -0,854 20.03.2020 19.03.2020 +Summe der Betragsbewegungen -494,76 +Bestand am 31.12.2020 0,00 881,660000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 4.525,15 130,310000 34,726 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Auslieferung -34,000 20.03.2020 18.03.2020 +Verkauf 58,09 80,020000 -0,726 20.03.2020 18.03.2020 +Summe der Betragsbewegungen -58,09 +Bestand am 31.12.2020 0,00 127,990000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 5.194,14 137,110000 37,883 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Ausschüttung / Kauf aus Ertrag 2,65 144,570000 +0,018 21.02.2020 21.02.2020 +Auslieferung -37,000 20.03.2020 18.03.2020 +Verkauf 79,92 88,700000 -0,901 20.03.2020 18.03.2020 +Summe der Betragsbewegungen -79,92 +Bestand am 31.12.2020 0,00 167,260000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Dieser Depotauszug besteht aus 4 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht Deka-BonusRente +Seite 1 +Depot: 0111111111 +Depotinhaber: +Richard Mustermann +Deka-BonusRente +ISIN: XF0009994050 Unterdepot: 00 +Vertragsnummer: 011111111199940500 Zertifizierungs-Nr.: 003604 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.10.2047 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-BR 100 DE0005424519 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +Bestand am 31.12.2019 Deka-BR 100 27.774,94 86,920000 319,546 +Gesamtbestand des Vertrages am 31.12.2019 27.774,94 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Lastschrifteinzug Deka-BR 100 1.977,86 78,740000 +25,119 05.05.2020 05.05.2020 +Mandatsreferenz: 0111111111001 +Zulagenzahlung 2019 Deka-BR 100 175,00 79,130000 +2,212 15.05.2020 15.05.2020 +Korrekturbuchung Deka-BR 100 114,00 84,050000 -1,356 24.11.2020 24.11.2020 +Schädliche Verwendung Deka-BR 100 23.190,32 84,050000 -275,911 24.11.2020 24.11.2020 +Entgelt Auflösung Deka-BR 100 48,74 84,050000 -0,580 24.11.2020 24.11.2020 +Steuerrückzahlung Deka-BR 100 3.841,00 84,050000 -45,699 24.11.2020 24.11.2020 +Zulagenrückzahlung Deka-BR 100 1.960,93 84,050000 -23,331 24.11.2020 24.11.2020 +Bestand am 31.12.2020 Deka-BR 100 0,00 85,750000 0,000 +Gesamtbestand des Vertrages am 31.12.2020 0,00 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Dieser Depotauszug besteht aus 1 Seite. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht19.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht19.txt new file mode 100644 index 0000000000..72df871c33 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht19.txt @@ -0,0 +1,278 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Quartalsbericht per 30.06.2020 +Depotübersicht +Seite: 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Herrn +Armin Mustermann +Musterstraße +Frankenweg 7 +11111 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 30.06.2020 seit 31.03.2020 1 +LU0348413815 00 DekaLux-PharmaTech TF 4.573,48 +436,37 +LU0350482435 00 DekaLuxTeam-EmergingMarkets 3.680,89 +460,43 +DE000DK2CFT3 00 Deka-BasisAnlage A100 1.017,71 +110,04 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Armin Mustermann +LU0052859252 00 DekaLuxTeam-Aktien Asien 4.359,93 +539,35 +LU0062624902 00 DekaLux-Deutschland TF A 1.133,92 +200,30 +DE0009786186 00 Deka-EuropaSelect CF 1.839,87 +265,84 +DE0009786285 00 Deka-EuropaPotential TF 4.372,98 +883,46 +DE0009786285 01 Deka-EuropaPotential TF 1.143,96 +231,11 +XF0009995000 00 Deka-ZukunftsPlan Variante: Select +LU0230155797 00 - Deka-Renten konservativ 0,00 +16,98 +DE000DK2J6P1 00 - Deka-RentenStrategie Global CF 1.940,78 +50,51 + Garantiertes Kapital zu Beginn der Auszahlungsphase (Beitragszusage): +2.351,25 EUR +Dieser Betrag steht Ihnen auf Basis der bisher eingezahlten +Altersvorsorgebeiträge (einschließlich Zulagen) zu Beginn der +Auszahlungsphase mindestens zur Verfügung. +Gesamt in EUR 24.063,52 +3.194,39 +1 Hinweis: Der letzte Handelstag kann stichtagsbezogen vom Quartalsultimo abweichen. +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Wir weisen ausdrücklich darauf hin, dass im Markt unterschiedliche Berechnungsmethoden zur Ermittlung der Wertentwicklung verwendet +werden (z.B. geldgewichtete oder zeitgewichtete Berechnungsmethode). Bei Verwendung unterschiedlicher Berechnungsmethoden ist es +möglich, dass die in anderen Informationen ausgewiesenen Wertentwicklungen von der in dieser Information dargestellten Wertentwicklung +abweichen. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2020 +Depotübersicht +Seite: 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Hinweise zum Berater: +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Schweinfurt-Haßberge. +Gute Neuigkeiten für Sie: Der deutsche Gesetzgeber hat die Mehrwertsteuersätze im Rahmen seines Zweiten Corona-Steuerhilfegesetzes +im Zeitraum vom 1. Juli 2020 bis zum 31. Dezember 2020 gesenkt. In der Depotführung des DekaBank Depots geben wir diese Senkung +gerne in vollem Umfang an unsere Kunden weiter. Die reduzierten Preise haben wir in unser Preis- und Leistungsverzeichnis zum DekaBank +Depot für den genannten Zeitraum aufgenommen. Anschließend gilt das reguläre Preis- und Leistungsverzeichnis weiter. Die aktuelle Fassung +finden Sie auf unserer Homepage www.deka.de. +Ressourcen, Zeit und Geld sparen: Mit einem Online-Zugang haben Sie von überall und jederzeit Zugriff auf Ihr DekaBank Depot sowie die +dazugehörigen Dokumente, z.B. auch über die S-Invest App (www.deka.de/s-invest). +Außerdem helfen Sie dabei, wichtige Ressourcen zu schonen! Jedes auf die Online-Nutzung umgestellte DekaBank Depot bedeutet ca. +6 Briefe im Jahr weniger, die verschickt werden müssen. Und Sie profitieren durch den reduzierten Depotpreis. Weitere Informationen zur +Online-Freischaltung erhalten Sie unter www.deka.de/online oder in Ihrer Sparkasse. +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2020 +Umsatzübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 4.137,11 285,180000 14,507 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2020 4.573,48 315,260000 14,507 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +DekaLuxTeam-EmergingMarkets +ISIN: LU0350482435 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 3.220,46 114,290000 28,178 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2020 3.680,89 130,630000 28,178 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Bitte prüfen Sie die vorliegenden Informationen. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2020 +Umsatzübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-BasisAnlage A100 +ISIN: DE000DK2CFT3 Unterdepot: 00 +Verwahrart: GiroSammel +VL-Vertrag: gesperrt bis zum 31.12.2024, Vertragsinhaber: Armin Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 799,67 143,670000 5,566 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Kauf 36,00 163,400000 +0,220 16.04.2020 16.04.2020 +Kauf 36,00 166,760000 +0,216 18.05.2020 18.05.2020 +Kauf 36,00 169,100000 +0,213 16.06.2020 16.06.2020 +Summe der Betragsbewegungen 108,00 +Bestand am 30.06.2020 1.017,71 163,750000 6,215 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 3.820,58 621,940000 6,143 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2020 4.359,93 709,740000 6,143 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2020 +Umsatzübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 933,62 94,620000 9,867 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2020 1.133,92 114,920000 9,867 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Deka-EuropaSelect CF +ISIN: DE0009786186 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 1.574,03 60,750000 25,910 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2020 1.839,87 71,010000 25,910 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 3.489,52 103,170000 33,823 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2020 4.372,98 129,290000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2020 +Umsatzübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 01 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.03.2020 912,85 103,170000 8,848 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2020 1.143,96 129,290000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Dieser Report besteht aus 4 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2020 +Umsatzübersicht Deka-ZukunftsPlan +Seite 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-ZukunftsPlan +ISIN: XF0009995000 Unterdepot: 00 Variante: Select +Vertragsnummer: 011970177999950000 Zertifizierungs-Nr.: 004455 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.02.2062 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-Renten konservativ LU0230155797 GiroSammel +Deka-RentenStrategie Global CF DE000DK2J6P1 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +Bestand am 31.03.2020 Deka-Renten konservativ 1.698,29 47,670000 35,626 +Gesamtbestand des Vertrages am 01.04.2020 1.698,29 +Bewertung mit dem Rücknahmepreis vom 31.03.2020 +Zulagenzahlung 2019 Deka-Renten konservativ 68,25 48,000000 +1,422 19.05.2020 19.05.2020 +Zulagenzahlung 2019 Deka-RentenStrategie 106,75 94,790000 +1,126 19.05.2020 19.05.2020 +Global CF +Ausschüttung / Kauf aus Ertrag Deka-RentenStrategie 42,00 89,200000 +0,471 22.05.2020 22.05.2020 +Global CF +Zusammenfassung der Umschichtungen (Details siehe nachfolgende "Übersicht der Umschichtungen") +Deka-Renten konservativ -37,048 +Deka-RentenStrategie +19,503 +Global CF +Bestand am 30.06.2020 Deka-Renten konservativ 0,00 48,370000 0,000 +Bestand am 30.06.2020 Deka-RentenStrategie 1.940,78 91,980000 21,100 +Global CF +Gesamtbestand des Vertrages am 30.06.2020 1.940,78 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Übersicht der Umschichtungen +Umsatzart Fondsname Betrag Preis je Anteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Verkauf / Tausch Deka-Renten konservativ 340,80 47,890000 -7,116 16.04.2020 16.04.2020 +Kauf / Tausch Deka-RentenStrategie 340,80 90,020000 +3,786 16.04.2020 16.04.2020 +Global CF +Verkauf / Tausch Deka-Renten konservativ 0,50 47,900000 -0,010 17.04.2020 17.04.2020 +Kauf / Tausch Deka-RentenStrategie 0,50 90,200000 +0,006 17.04.2020 17.04.2020 +Global CF +Verkauf / Tausch Deka-Renten konservativ 682,17 48,010000 -14,209 18.05.2020 18.05.2020 +Kauf / Tausch Deka-RentenStrategie 682,17 91,740000 +7,436 18.05.2020 18.05.2020 +Global CF +Verkauf / Tausch Deka-Renten konservativ 373,94 48,370000 -7,731 09.06.2020 09.06.2020 +Kauf / Tausch Deka-RentenStrategie 373,94 91,710000 +4,077 09.06.2020 09.06.2020 +Global CF +Verkauf / Tausch Deka-RentenStrategie 0,66 91,580000 -0,007 10.06.2020 10.06.2020 +Global CF +Kauf / Tausch Deka-Renten konservativ 0,66 48,370000 +0,014 10.06.2020 10.06.2020 +Bitte prüfen Sie die vorliegenden Informationen. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.06.2020 +Umsatzübersicht Deka-ZukunftsPlan +Seite 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Umsatzart Fondsname Betrag Preis je Anteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Fortsetzung von vorheriger Seite +Verkauf / Tausch Deka-Renten konservativ 386,77 48,370000 -7,996 30.06.2020 30.06.2020 +Kauf / Tausch Deka-RentenStrategie 386,77 91,980000 +4,205 30.06.2020 30.06.2020 +Global CF +Summe Deka-Renten konservativ -37,048 +Summe Deka-RentenStrategie +19,503 +Global CF +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht20.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht20.txt new file mode 100644 index 0000000000..4f91f7745b --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht20.txt @@ -0,0 +1,313 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Quartalsbericht per 30.09.2020 +Depotübersicht +Seite: 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Herrn +Armin Mustermann +Musterstraße +Frankenweg 7 +11111 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 30.09.2020 seit 30.06.2020 1 +LU0348413815 00 DekaLux-PharmaTech TF 4.561,58 -11,90 +LU0350482435 00 DekaLuxTeam-EmergingMarkets 3.791,71 +110,82 +DE000DK2CFT3 00 Deka-BasisAnlage offensiv 1.186,08 +60,37 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Armin Mustermann +LU0052859252 00 DekaLuxTeam-Aktien Asien 0,00 +391,80 +LU0052863874 99 DekaLux-Geldmarkt: Euro 0,00 +0,02 +LU0062624902 00 DekaLux-Deutschland TF A 0,00 +58,51 +DE0009786186 00 Deka-EuropaSelect CF 0,00 +66,85 +DE0009786285 00 Deka-EuropaPotential TF 4.809,97 +436,99 +DE0009786285 01 Deka-EuropaPotential TF 1.258,27 +114,31 +XF0009995000 00 Deka-ZukunftsPlan Variante: Select +DE000DK2CDS0 00 - Deka-DividendenStrategie CF (A) 0,00 +3,17 +DE000DK2J6P1 00 - Deka-RentenStrategie Global CF 0,00 +34,49 +Gesamt in EUR 15.607,61 +1.265,43 +1 Hinweis: Der letzte Handelstag kann stichtagsbezogen vom Quartalsultimo abweichen. +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Wir weisen ausdrücklich darauf hin, dass im Markt unterschiedliche Berechnungsmethoden zur Ermittlung der Wertentwicklung verwendet +werden (z.B. geldgewichtete oder zeitgewichtete Berechnungsmethode). Bei Verwendung unterschiedlicher Berechnungsmethoden ist es +möglich, dass die in anderen Informationen ausgewiesenen Wertentwicklungen von der in dieser Information dargestellten Wertentwicklung +abweichen. +Hinweise zum Berater: +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Schweinfurt-Haßberge. +Ressourcen, Zeit und Geld sparen: Mit einem Online-Zugang haben Sie von überall und jederzeit Zugriff auf Ihr DekaBank Depot sowie die +dazugehörigen Dokumente, z.B. auch über die S-Invest App (www.deka.de/s-invest). +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Depotübersicht +Seite: 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Außerdem helfen Sie dabei, wichtige Ressourcen zu schonen! Jedes auf die Online-Nutzung umgestellte DekaBank Depot bedeutet ca. +6 Briefe im Jahr weniger, die verschickt werden müssen. Und Sie profitieren durch den reduzierten Depotpreis. Weitere Informationen zur +Online-Freischaltung erhalten Sie unter www.deka.de/online oder in Ihrer Sparkasse. +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Umsatzübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 4.573,48 315,260000 14,507 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Ausschüttung / Kauf aus Ertrag 1,87 318,970000 +0,006 21.08.2020 21.08.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.09.2020 4.561,58 314,310000 14,513 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +DekaLuxTeam-EmergingMarkets +ISIN: LU0350482435 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 3.680,89 130,630000 28,178 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Ausschüttung / Kauf aus Ertrag 22,47 134,190000 +0,167 21.08.2020 21.08.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.09.2020 3.791,71 133,770000 28,345 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +Bitte prüfen Sie die vorliegenden Informationen. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Umsatzübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-BasisAnlage offensiv +ISIN: DE000DK2CFT3 Unterdepot: 00 +Verwahrart: GiroSammel +Wichtige Information: Der Fonds Deka-BasisAnlage A100 wurde / wird mit Wirkung zum 01.07.2020 in Deka-BasisAnlage offensiv +umbenannt. +VL-Vertrag: gesperrt bis zum 31.12.2024, Vertragsinhaber: Armin Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 1.017,71 163,750000 6,215 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Kauf 36,00 178,860000 +0,201 16.07.2020 16.07.2020 +Kauf 36,00 179,850000 +0,200 18.08.2020 18.08.2020 +Kauf 36,00 182,900000 +0,197 16.09.2020 16.09.2020 +Summe der Betragsbewegungen 108,00 +Bestand am 30.09.2020 1.186,08 174,090000 6,813 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 4.359,93 709,740000 6,143 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Verkauf 4.751,73 773,520000 -6,143 08.09.2020 08.09.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen -4.751,73 +Bestand am 30.09.2020 0,00 776,830000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Umsatzübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +DekaLux-Geldmarkt: Euro +ISIN: LU0052863874 Unterdepot: 99 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Kauf aus Steuererstattung 12,29 47,355000 +0,260 19.08.2020 19.08.2020 +Verkauf 12,31 47,350000 -0,260 26.08.2020 26.08.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen 0,00 +Bestand am 30.09.2020 0,00 47,337000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 1.133,92 114,920000 9,867 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Verkauf 1.192,43 120,850000 -9,867 18.08.2020 18.08.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen -1.192,43 +Bestand am 30.09.2020 0,00 117,550000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Umsatzübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-EuropaSelect CF +ISIN: DE0009786186 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 1.839,87 71,010000 25,910 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Verkauf 1.906,72 73,590000 -25,910 17.08.2020 17.08.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen -1.906,72 +Bestand am 30.09.2020 0,00 74,110000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 4.372,98 129,290000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 30.09.2020 4.809,97 142,210000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 01 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 30.06.2020 1.143,96 129,290000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Summe der Betragsbewegungen 0,00 +Fortsetzung auf Seite 5 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Umsatzübersicht +Seite 5 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 01 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Fortsetzung von vorheriger Seite +Bestand am 30.09.2020 1.258,27 142,210000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +Dieser Report besteht aus 5 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Umsatzübersicht Deka-ZukunftsPlan +Seite 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-ZukunftsPlan +ISIN: XF0009995000 Unterdepot: 00 Variante: Select +Vertragsnummer: 011970177999950000 Zertifizierungs-Nr.: 004455 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.02.2062 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-DividendenStrategie CF (A) DE000DK2CDS0 GiroSammel +Deka-RentenStrategie Global CF DE000DK2J6P1 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +Bestand am 30.06.2020 Deka-RentenStrategie 1.940,78 91,980000 21,100 +Global CF +Gesamtbestand des Vertrages am 01.07.2020 1.940,78 +Bewertung mit dem Rücknahmepreis vom 30.06.2020 +Vertragspreis Deka-DividendenStrategi 1,95 148,480000 -0,013 24.08.2020 24.08.2020 +e CF (A +Schädliche Verwendung Deka-DividendenStrategi 231,63 148,480000 -1,560 24.08.2020 24.08.2020 +e CF (A +Entgelt Auflösung Deka-DividendenStrategi 9,75 148,480000 -0,066 24.08.2020 24.08.2020 +e CF (A +Steuerrückzahlung Deka-DividendenStrategi 42,60 148,480000 -0,287 24.08.2020 24.08.2020 +e CF (A +Zulagenrückzahlung Deka-DividendenStrategi 110,00 148,480000 -0,741 24.08.2020 24.08.2020 +e CF (A +Vertragspreis Deka-RentenStrategie 7,79 93,760000 -0,083 24.08.2020 24.08.2020 +Global CF +Schädliche Verwendung Deka-RentenStrategie 925,32 93,760000 -9,869 24.08.2020 24.08.2020 +Global CF +Entgelt Auflösung Deka-RentenStrategie 38,99 93,760000 -0,416 24.08.2020 24.08.2020 +Global CF +Steuerrückzahlung Deka-RentenStrategie 170,40 93,760000 -1,817 24.08.2020 24.08.2020 +Global CF +Zulagenrückzahlung Deka-RentenStrategie 440,00 93,760000 -4,693 24.08.2020 24.08.2020 +Global CF +Zusammenfassung der Umschichtungen (Details siehe nachfolgende "Übersicht der Umschichtungen") +Deka-DividendenStrategi +2,667 +e CF (A +Deka-RentenStrategie -4,222 +Global CF +Bestand am 30.09.2020 Deka-DividendenStrategi 0,00 145,380000 0,000 +e CF (A +Bestand am 30.09.2020 Deka-RentenStrategie 0,00 93,420000 0,000 +Global CF +Gesamtbestand des Vertrages am 30.09.2020 0,00 +Bewertung mit dem Rücknahmepreis vom 30.09.2020 +Bitte prüfen Sie die vorliegenden Informationen. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Quartalsbericht per 30.09.2020 +Umsatzübersicht Deka-ZukunftsPlan +Seite 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Übersicht der Umschichtungen +Umsatzart Fondsname Betrag Preis je Anteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Verkauf / Tausch Deka-RentenStrategie 391,83 93,030000 -4,212 24.07.2020 24.07.2020 +Global CF +Kauf / Tausch Deka-DividendenStrategi 391,83 147,230000 +2,661 24.07.2020 24.07.2020 +e CF (A) +Verkauf / Tausch Deka-RentenStrategie 0,93 93,100000 -0,010 27.07.2020 27.07.2020 +Global CF +Kauf / Tausch Deka-DividendenStrategi 0,93 146,220000 +0,006 27.07.2020 27.07.2020 +e CF (A) +Summe Deka-DividendenStrategi +2,667 +e CF (A) +Summe Deka-RentenStrategie -4,222 +Global CF +Dieser Report besteht aus 2 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht21.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht21.txt new file mode 100644 index 0000000000..7fcee46944 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht21.txt @@ -0,0 +1,881 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +DekaBank +Herrn Deutsche +Armin Mustermann +Musterstraße Girozentrale +Frankenweg 7 +11111 Stadt +Januar 2021 +Mainzer Landstraße 16 +DekaBank Depot Nr. 0111111111 60325 Frankfurt am Main +Ihr Jahresdepotauszug 2020 sowie weitere wichtige Unterlagen Postfach 11 05 23 +60040 Frankfurt am Main +Sehr geehrter Herr Mustermann, Telefon (0 69) 71 47 - 0 +Telefax (0 69) 71 47 - 13 76 +www.dekabank.de +ein außerordentlich bewegtes Jahr mit Höhen und Tiefen liegt hinter uns. +Als Wertpapierhaus der Sparkassen haben wir alles darangesetzt, Ihnen auch während +Vorstand +der Corona-Zeit mit einem umfassenden Lösungs- und Serviceangebot zur Seite zu Dr. Georg Stocker +stehen. Und es zeigt sich schon jetzt: Auf gute Beratung und besonnenes Handeln zu (Vorsitzender) +setzen, war – wie so oft beim Blick zurück – die richtige Entscheidung. Für Ihr Vertrauen Dr. Matthias Danne +(Stellv. Vorsitzender) +in die DekaBank möchten wir uns ganz herzlich bedanken. Birgit Dietl-Benzin +Daniel Kapffer +Sie erhalten heute Ihren Jahresdepotauszug für das Kalenderjahr 2020. Neben der Martin K. Müller +Depot- und Umsatzübersicht können Sie in den Unterlagen auch Ihre Jahressteuer- Verwaltungsratsvorsitzender +bescheinigung finden. Bitte beachten Sie außerdem die Änderungen der Allgemeinen Helmut Schleweis +Geschäftsbedingungen für DekaBank Depots zum 1. Mai 2021. +USt-Id-Nr. +Zu Ihrer Unterstützung haben wir detaillierte Informationen in den Hinweisen zum DE 114103563 +DekaBank Depot und zum Jahresdepotauszug zusammengestellt. Handelsregister +Amtsgericht +Auf der Rückseite dieses Schreibens finden Sie eine aktuelle Konjunktur- und Markt- Frankfurt am Main +HRA 16068 +einschätzung von Dr. Ulrich Kater, Chefvolkswirt der DekaBank. Darin geht er auf die +außerordentlichen Marktentwicklungen des Jahres 2020 sowie auf die Aussichten für Sitz +die Finanzmärkte und die Auswirkungen auf Ihre Geldanlagen ein. Frankfurt am Main, Berlin +Sie haben Fragen zu Ihren Unterlagen? Sie erreichen uns montags bis freitags von +8.00 bis 18.00 Uhr telefonisch unter (0 69) 71 47 – 6 52. Wir sind gerne für Sie da. +Bleiben Sie bitte gesund! +Beste Grüße +DekaBank +Deutsche Girozentrale +Frank Kalter Dr. Olaf Heinrich +Leiter Vertriebsmanagement Leiter Digitales Multikanalmanagement +Den Niedrigzinsen die Stirn bieten. +Dr. Ulrich Kater +Chefvolkswirt +Liebe Anlegerinnen und Anleger, Bewältigung des Schocks zu unterstützen, werden +ihre Maßnahmen dazu führen, dass ein sichtbarer +was war 2020 für ein bewegtes Jahr! Mit der Anstieg der Zinsen bis in die zweite Hälfte der +Corona-Pandemie hielt ein Jahrhundertereignis Zwanzigerjahre vertagt wird. Das bedeutet noch +Einzug in die Lebenswirklichkeit der Menschen, länger noch niedrigere Zinsen. Doch auch die +in die Wirtschaft und in die Finanzmärkte. Hinzu Digitalisierung und die Nachhaltigkeitsdiskussion +kamen der US-Wahlkrimi und das nicht enden erfuhren durch die Gesundheitskrise einen enormen +wollende „Finale“ der Brexit-Verhandlungen. Schub. Und die Art der Globalisierung ändert sich +Monatelang schwankten die Märkte zwischen ebenfalls zusehends, indem zwar die internationale +Hoffen und Bangen. So fiel der Deutsche Aktienindex Arbeitsteilung weiter vorangetrieben, zum Teil aber +DAX im März auf fast 8.400 Punkte, nachdem er wieder stärker regional konzentriert wird. +nur einen Monat zuvor noch knapp an der Marke +von 13.800 Punkten gescheitert war, um im Herbst Was bedeutet dies alles für Sie als Anleger? Das +wieder deutlich über 13.000 Punkte anzusteigen. vergangene Jahr hat einmal mehr bestätigt, dass +Und der Goldpreis vollführte mehrfach größere an den Kapitalmärkten Schwankungen an der +Sprünge in der Spanne zwischen 1.480 US-Dollar Tagesordnung sind. Zu einem Kursrückgang gehört +(Mitte März) und über 2.050 US-Dollar je Feinunze allerdings auch die Kurserholung. Das hat das +(Anfang August). zurückliegende Jahr erneut eindrucksvoll gezeigt. +Das regelmäßige Investieren in Wertpapiere ist in +Für viele Beobachter war unverständlich, dass die einem solchen Umfeld eine angemessene Strategie. +schweren Wirtschaftseinbrüche durch die Corona- Und man muss es klar benennen: Für die langfristigen +Beschränkungen an den Börsen so schnell wieder Anteile des Vermögens ist eine global diversifizierte +abgeschüttelt wurden. Aber die Marktteilnehmer Aktienanlage noch wichtiger geworden, trotz der +waren schnell zu dem Ergebnis gekommen, dass zurückliegenden Krise – oder gerade wegen der +die Corona-Krise zeitlich begrenzt und durch die dadurch hervorgerufenen Verlängerung des zinslosen +Wirtschaftspolitik gut abgefedert sein würde. Die Zustandes. Wirtschaft war nie einfach, und der +medizinischen Erfolge im Kampf gegen das vor uns liegende Strukturwandel bringt große +Coronavirus unterstützen diese Sichtweise. Noch Herausforderungen mit sich. Wie immer bedeutet ein +aber muss die Krise abgearbeitet werden. Trotzdem solcher Veränderungsprozess aber auch Chancen in +wenden sich viele Marktakteure bereits neuen neuen Wirtschaftszweigen, wie es viele neue, +Zukunftsthemen zu, die zum Teil zwar gar nicht so erfolgreiche Firmen über die vergangenen Monate +neu sind, durch die Corona-Pandemie jedoch gezeigt haben. +nochmals mehr Dynamik entfalten werden. +Mit freundlichen Grüßen +An erster Stelle dieser Themenliste stehen die +Niedrigzinsen. Nachdem die Notenbanken in der +Corona-Pandemie alles daransetzten, eine Finanzkrise Ihr Ulrich Kater +zu verhindern und die Weltwirtschaft bei der Chefvolkswirt DekaBank +Weitere aktuelle Informationen zu volkswirtschaftlichen Themen finden Sie unter: www.deka.de/privatkunden/aktuelles/deka-analyse +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Depotübersicht +Seite: 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Daten für den automatischen Kirchensteuerabzug liegen +für 2021 vor +Sparer-Pauschbetrag +Erteilt 2020: EUR 151,00 bis 31.12.2020 +Beansprucht: EUR 151,00 +Herrn +Armin Mustermann +Musterstraße +Frankenweg 7 +11111 Stadt +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 31.12.2020* seit 31.12.2019 1 +LU0348413815 00 DekaLux-PharmaTech TF 4.693,94 +66,21 +LU0350482435 00 DekaLuxTeam-EmergingMarkets 4.496,65 +287,14 +DE000DK2CFT3 00 Deka-BasisAnlage offensiv 1.401,26 +72,63 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Armin Mustermann +LU0052859252 00 DekaLuxTeam-Aktien Asien 0,00 -38,21 +LU0052863874 99 DekaLux-Geldmarkt: Euro 0,00 +0,02 +LU0062624902 00 DekaLux-Deutschland TF A 0,00 -93,34 +DE0009786186 00 Deka-EuropaSelect CF 0,00 +34,78 +DE0009786285 00 Deka-EuropaPotential TF 5.657,23 +1.021,95 +DE0009786285 01 Deka-EuropaPotential TF 1.479,92 +267,32 +XF0009995000 00 Deka-ZukunftsPlan Variante: Select +LU0230155797 00 - Deka-Renten konservativ 0,00 -3,69 +DE000DK2CDS0 00 - Deka-DividendenStrategie CF (A) 0,00 -483,18 +DE000DK2J6P1 00 - Deka-RentenStrategie Global CF 0,00 +19,46 +Gesamt in EUR 17.729,00 +1.151,09 +* Beachten Sie hierzu bitte die Erläuterungen unter "Hinweise zu Ihrem DekaBank Depot und zum Jahresdepotauszug". +1 Hinweis: Der letzte Handelstag kann stichtagsbezogen vom Quartalsultimo abweichen. +Depotpreis inkl. Mehrwertsteuer (MwSt): +12,18 EUR inkl. 1,68 EUR MwSt wurden für 2020 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. +Wichtiger Hinweis zur Steuerbescheinigung: +Mit Ihrem Jahresdepotauszug erhalten Sie auch Ihre Steuerbescheinigung. Diese finden Sie direkt im Anschluss an Ihre Depotübersicht. Sofern +Sie mehr als ein Depot in unserem Hause haben, können die Angaben von mehreren Depots in EINER Steuerbescheinigung zusammengefasst +sein. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Depotübersicht +Seite: 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Sofern in Ihrem Depot ausschließlich Deka-BonusRente und/oder Deka-ZukunftsPlan Verträge geführt werden, sind Erträge hieraus während +der Ansparphase steuerfrei und Sie erhalten KEINE Steuerbescheinigung. +Wichtiger Hinweis zu MiFID: +Alle auf dieser Depotübersicht aufgeführten Vermögenswerte fallen unter die Regelungen der Richtlinie 2014/65/EU (MiFID II) und deren +Durchführungsmaßnahmen bzw. der sie umsetzenden nationalen Regelungen. +Dieser Jahresdepotbericht enthält Informationen gem. Artikel 63 Abs. 1 und 2 der Delegierten Verordnung Nr. 2017/565. Diese +vierteljährliche Aufstellung Ihrer Vermögenswerte zum 31.12. wird Ihnen, anders als die Quartalsberichte zu den Stichtagen 31.03., 30.06. +und 30.09. eines Kalenderjahres, nicht gesondert zur Verfügung gestellt. +Besondere Hinweise zum Deka-ZukunftsPlan: +Das Jahresendereporting zum Deka-ZukunftsPlan ggf. mit dem Antrag auf Altersvorsorgezulage oder den Informationen über gespeicherte +Daten zur Beantragung der Dauerzulage, der Bescheinigung nach § 92 Einkommensteuergesetz (EStG) sowie der Jahresinformation nach § 7a +Altersvorsorgeverträge-Zertifizierungsgesetz (AltZertG) geht Ihnen separat zu. Der Versand startet Ende Februar 2021. Sofern uns Ihre +Steueridentifikationsnummer und ggf. die Ihres Ehegatten/Lebenspartners, sowie für die Beantragung von Kinderzulage, die Ihrer Kinder +vorliegt und Sie die DekaBank per Dauerzulageantrag bevollmächtigt haben, die Zulage jedes Jahr für Sie automatisch zu beantragen, +übernehmen wir dies auf Grundlage der von Ihnen mitgeteilten Daten. Die Zulage wird nach Eingang Ihrem Deka-ZukunftsPlan Vertrag +gutgeschrieben. Zudem übermitteln wir per Datenfernübertragung die von Ihnen gezahlten Beiträge zur Beantragung des +Sonderausgabenabzugs an die Deutsche Rentenversicherung Bund - Zentrale Zulagenstelle für Altersvermögen (ZfA) zur Weiterleitung an Ihr +Wohnsitzfinanzamt. +Neuer Online-Service: +Haben Sie sich bereits für einen Online-Zugang auf Ihr DekaBank Depot entschieden, werden Ihnen ab 2021 auch Ihre Altersvorsorgereports, +u.a. das Jahresendereporting 2020, inkl. der Unterlagen zur Beantragung von Altersvorsorgezulagen, in Ihrem ePostfach zur Verfügung +gestellt. Bitte beachten Sie, dass auch weiterhin eine Neubeantragung von Zulagen bzw. Änderungen, aufgrund gesetzlicher Vorgaben +schriftlich erfolgen muss (z.B. per Telefax). +Hinweise zum Berater: +Zu allen Themen rund um Ihr DekaBank Depot informiert Sie Ihr Berater der Sparkasse Schweinfurt-Haßberge. +Vorabankündigung (Pre-Notification) +Als Beitrag zur Schaffung des einheitlichen Euro-Zahlungsverkehrsraums (Single Euro Payments Area, SEPA) haben wir zum 29.01.2014 auf +das europaweit einheitliche SEPA-Basis-Lastschriftverfahren umgestellt. Wie Ihnen mit dem Jahresdepotauszug 2013 mitgeteilt, wurden die +uns von Ihnen bereits erteilte(en) Einzugsermächtigung(en) automatisch umgewandelt und als SEPA-Lastschriftmandat(e) weiter genutzt. +Entgelte, Kosten, Steuern und Auslagen gemäß AGB und Preis- und Leistungsverzeichnis, werden im Regelfall von der generellen +Bankverbindung belastet. Bei einer unterjährigen Kündigung Ihres Depots werden anfallende Entgelte frühestens 2 Arbeitstage nach +Depotlöschung belastet. +Ein SEPA-Lastschriftmandat wird durch unsere nachfolgend genannte Gläubiger-Identifikationsnummer und Ihre Mandatsreferenz +gekennzeichnet, die von uns bei allen SEPA-Lastschrifteinzügen anzugeben sind. Sollten Sie nicht Inhaber des (der) nachfolgend angegebenen +Kontos (Konten) sein, bitten wir Sie, den Kontoinhaber entsprechend zu informieren. +Unsere Gläubiger-ID: DE02DBD00000081995 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Depotübersicht +Seite: 3 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Übersicht Ihrer Mandate und Lastschriften zum Stichtag 31.12.2020: +Mandatsreferenz: 0111101111001 (generelle Bankverbindung) +IBAN: DExx xxx5 0101 xxxx xxx2 87 +Lastschrift für Entgelte, Kosten, Steuern und Auslagen +Belastung gemäß AGB 1.12.4 und Preis- und Leistungsverzeichnis +Betrag (EUR) Gemäß Preis- und Leistungsverzeichnis +Rhythmus jährlich +Ausführungstag 30 +Fälligkeitstag Frühestens 2 Bankarbeitstage nach dem Ausführungstag +Datum Ausführung 11.2021 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 1 +Steuerbescheinigung +Bescheinigung für alle Privatdepots + Verlustbescheinigung im Sinne des § 43a Abs. 3 Satz 4 EStG für alle Privatdepots +Für +Armin Mustermann , 11111 Stadt, Frankenweg 7 +werden für das Kalenderjahr 2020 folgende Angaben bescheinigt: +Betrag in EUR Anlage KAP zur +Einkommensteuer- +erklärung +Höhe der Kapitalerträge nach Berücksichtigung der teilweisen Steuerfreistellung im Sinne des 618,67 KAP: Zeile 7 +§ 20 Abs. 1 Nr. 6 Satz 9 EStG +davon: Gewinne aus der Veräußerung bestandsgeschützter Alt-Anteile im Sinne des 347,28 KAP: Zeile 10 + § 56 Abs. 6 Satz 1 Nr. 2 InvStG 20181 + (nach Teilfreistellung) +1 Die ausgewiesenen Gewinne sind nach § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 steuerfrei, +soweit die insgesamt ab dem 1. Januar 2018 eingetretenen und durch Veräußerung +realisierten Wertveränderungen den persönlichen Freibetrag von 100.000 € nicht übersteigen. +Die Steuerfreiheit kann nur im Rahmen der Einkommensteuerveranlagung geltend gemacht +werden. +Ersatzbemessungsgrundlage im Sinne des § 43a Abs. 2 Satz 7, 10, 13 und 14 EStG nach 0,00 KAP: Zeile 11 +Teilfreistellung und im Sinne des § 56 Abs. 3 Satz 4 InvStG 2018 +Enthalten in den bescheinigten Kapitalerträgen +Höhe des nicht ausgeglichenen Verlustes ohne Verlust aus der Veräußerung von Aktien 0,00 KAP: Zeile 12 +Höhe des nicht ausgeglichenen Verlustes aus der Veräußerung von Aktien im Sinne des § 20 0,00 KAP: Zeile 13 +Abs. 2 Satz 1 Nr. 1 EStG +Höhe des in Anspruch genommenen Sparer-Pauschbetrages 151,00 KAP: Zeile 16 oder 17 +Kapitalertragsteuer 114,63 KAP: Zeile 37 +Solidaritätszuschlag 6,29 KAP: Zeile 38 +Kirchensteuer zur Kapitalertragsteuer KAP: Zeile 39 +Bistum Würzburg 9,16 +Summe der angerechneten ausländischen Steuer 0,00 KAP: Zeile 40 +Summe der anrechenbaren noch nicht angerechneten ausländischen Steuer 0,00 KAP: Zeile 41 +Bei Veräußerung/Rückgabe von vor dem 1. Januar 2018 erworbenen Anteilen an 13,97 +ausländschen Investmentsfonds (Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018): +Summe der als zugeflossen geltenden, noch nicht dem Steuerabzug unterworfenen +ausschüttungsgleichen Erträge aus Anteilen an ausländischen Investmentfonds im Sinne des +§ 7 Abs. 1 Satz 1 Nr. 3 InvStG 2004 in Verbindung mit § 56 Abs. 3 Satz 6 InvStG 2018. +(Diese Summe ist in der bescheinigten Höhe der Kapitalerträge enthalten und in der Anlage +KAP von der Höhe der Kapitalerträge abzuziehen.) +Fortsetzung auf Rück-/Folgeseite(n) +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Seite 2 +Armin Mustermann , 11111 Stadt, Frankenweg 7 +nur nachrichtlich: +Bestandsgeschützte Alt-Anteile im Sinne des § 56 Abs. 6 InvStG 2018 wurden veräußert, bei denen Indizien vorliegen, dass es sich um +Anteile an Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 handeln könnte (Anschaffungsdatum zwischen dem 10. November +2007 und dem 31. Dezember 2008, Anschaffungskosten betragen mindestens 100.000 Euro): +Bei Anteilen an Investmentfonds im Sinne des § 21 Abs. 2a InvStG 2004 sind auch die vor 2018 eingetretenen Wertveränderungen +steuerpflichtig und der persönliche Freibetrag von 100.000 Euro ist nicht anwendbar (§ 56 Abs. 6 Satz 4 InvStG 2018). Verluste aus der +Veräußerung von bestandsgeschützten Alt-Anteilen sind im Davon-Ausweis der Gewinne aus der Veräußerung bestandsgeschützter +Alt-Anteile im Sinne des § 56 Abs. 6 Satz 1 Nr. 2 InvStG 2018 nicht enthalten. Zur Prüfung des § 56 Abs. 6 Satz 4 InvStG 2018 i. V. m. § +21 Abs. 2a InvStG 2004 sind diese Verluste dennoch in der nachfolgenden Tabelle ausgewiesen. +Bei folgenden Anteilen ist im Rahmen der Veranlagung zu klären, ob es sich um Anteile an Investmentfonds im Sinne des § 21 Abs. 2a +InvStG 2004 handelt: +Bezeichnung ISIN Anzahl der Anteile Gewinn/Verlust 2 im Gewinn/Verlust aus +Sinne des § 56 Abs. 6 der fiktiven +Satz 1 Nr. 2 InvStG 2018 Veräußerung nach +(nach Teilfreistellung) § 56 Abs. 3 Satz 1 +InvStG 2018 +2 Bei Verlusten wurde ein negatives Zeichen (Minuszeichen) verwendet. +nur nachrichtlich +Alt-Anteile im Sinne des § 56 Abs. 2 Satz 1 InvStG 2018, die keine bestandsgeschützten Alt-Anteile im Sinne des § 56 Abs. 6 InvStG +2018 sind, wurden veräußert und für die Ermittlung des Gewinns nach § 56 Abs. 3 InvStG 2018 ist nach § 56 Abs. 3 Satz 4 InvStG +2018 folgende Ersatzbemessungsgrundlage anwendbar: +Bezeichnung ISIN Anzahl der Anteile Ersatzbemessungsgrundlage +Eine Ersatzbemessungsgrundlage ist anwendbar, wenn der zum Steuerabzug verpflichteten Stelle relevante Informationen, insbesondere zu +der Höhe der Anschaffungskosten, fehlen. Bei Ansatz einer Ersatzbemessungsgrundlage sind Sie verpflichtet, den tatsächlichen +Veräußerungsgewinn gegenüber dem Finanzamt durch geeignete Unterlagen (z. B. Beleg über die Anschaffung der Investmentanteile) +nachzuweisen. Wenn die Ersatzbemessungsgrundlage aufgrund fehlender Informationen über den Rücknahme-, Markt- oder Börsenpreis +zum 31. Dezember 2017 nicht ermittelt werden konnte, ist in der Spalte "Ersatzbemessungsgrundlage" die Angabe "nicht ermittelbar" +auszuweisen. +Gegenüber dem Steuerpflichtigen wurden nach § 44 Abs. 1 EStG die auf Ausschüttungen eines Investmentfonds abgeführte +Kapitalertragsteuer und der darauf entfallende Solidaritätszuschlag erstattet oder es wurde vom Steuerabzug Abstand genommen. Die +Erstattung oder die Abstandnahme wurden für folgende Investmentanteile vorgenommen: +Bezeichnung ISIN Anzahl der Anteile Höhe der nicht steuerbaren +Ausschüttungen im Sinne +des § 17 Abs. 3 InvStG 2018 +pro Anteil +Vermerke des bescheinigenden Institutes: +Gegebenenfalls zu zahlende Steuern wurden an das Finanzamt Frankfurt am Main V - Höchst, 60305 Frankfurt unter der Steuernummer 1111111111111 +abgeführt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Hinweise zu Ihrem DekaBank Depot und +zum Jahresdepotauszug +Aktuelle Mitteilungen Aktualität Ihrer Daten +Generelle Bankverbindung zu Ihrem Depot +Solidaritätszuschlag 2021 Bitte stellen Sie sicher, dass uns Ihre aktuelle Bankverbindung +Zum 1. Januar entfällt der Solidaritätszuschlag auf Einkommen vorliegt. Die uns bekannte Bankverbindung finden Sie in diesem +ganz oder teilweise für über 90 % der Steuerzahler. Jahresdepotauszug unter „Übersicht Ihrer Mandate“. +Unabhängig davon bleibt der Solidaritätszuschlag bei solchen Änderungen teilen Sie bitte Ihrer Sparkasse/Landesbank mit. +Kapitalerträgen bestehen, für die wegen fehlender Freistellung +eine Kapitalertragsteuer angefallen ist. Hinweis aufgrund rechtlicher Vorgaben +Eine Erstattung des Solidaritätszuschlages bei Kapitalerträgen ist Im Zusammenhang mit der Anwendung der Europäischen +unter bestimmten Voraussetzungen nur im Rahmen der Richtlinie über Märkte für Finanzinstrumente (MiFID II) sind wir +Veranlagung (Günstigerprüfung) möglich. dazu verpflichtet, Sie auf Folgendes hinzuweisen: +Hierfür empfehlen wir, sich gegebenenfalls an einen Wir gehen davon aus, dass die Angaben, die Sie Ihrer +Steuerberater oder eine steuerfachkundige Person zu wenden. Sparkasse/Landesbank mitgeteilt haben, aktuell und +vollständig sind. +Bitte informieren Sie Ihre Sparkasse/Landesbank, wenn sich +Tipp: Nutzen Sie die Soli-Ersparnis für den im Hinblick auf diese Angaben Veränderungen ergeben +Ausbau Ihres Vermögensaufbaus und Ihrer haben. +Vorsorge. +Steuerliche Meldepflichten zu Auslandsbeteiligungen nach +Gehören Sie auch zur Mehrzahl der Arbeitnehmer, § 138 Abs. 2 AO +die ab 2021 gar keinen Solidaritätszuschlag mehr +oder einen reduzierten Satz von ihrem Einkommen Die Meldepflichten betreffen Anleger, die im Inland +zahlen müssen? steuerpflichtig sind. +Wenn Sie wissen möchten, wie hoch Ihre Nach § 138 Abs. 2 AO müssen deutsche Steuerpflichtige ihrem +voraussichtliche Ersparnis ist, nutzen Sie unseren Finanzamt unter anderem den Erwerb/die Veräußerung von +Soli-Rechner auf www.deka.de/soli-rechner. Beteiligungen an einer ausländischen Körperschaft (z.B. +ausländische Aktie) oder an einem ausländischen +Dort finden Sie weitere Informationen, auch zu Investmentfonds melden, wenn Beteiligungen von mindestens + Anlagemöglichkeiten mit Deka Investmentfonds. 10 % an dieser Körperschaft oder diesem Investmentfonds +bestehen oder die Anschaffungskosten für die Beteiligungen an +dieser Aktie beziehungsweise diesem Investmentfonds 150.000 +Weitere Informationen € übersteigen. +Sie haben keine Steuerbescheinigung erhalten? Letztere Grenze greift nicht, wenn börsengehandelte +Beteiligungen an einer Gesellschaft von weniger als 1 % +Wenn Sie in den vorliegenden Unterlagen keine erworben/veräußert werden. +Steuerbescheinigung gefunden haben, kann das verschiedene +Gründe haben: Entsprechende Meldungen sind mit der Steuererklärung für den +Besteuerungszeitraum abzugeben, in den der +Z.B. werden für Depots, in denen ausschließlich mitteilungspflichtige Erwerb beziehungsweise die +Altersvorsorgeprodukte verwahrt werden, grundsätzlich keine mitteilungspflichtige Veräußerung fällt; spätestens binnen 14 +Steuerbescheinigungen erstellt. Monaten nach dem Zeitraum. +Bei mehreren Depots erhalten Sie die Steuerbescheinigung Wichtig: Für die Klärung, ob eine Meldepflicht im individuellen +nur einmal zu einem Ihrer Jahresdepotauszüge. Fall besteht, ist ein Steuerberater oder eine steuerfachkundige +Wenn Sie Immobilienfonds im Depot haben, kann eine Person zuständig. Bitte beachten Sie, dass die DekaBank nicht +spätere Erstellung erforderlich sein. In diesem Fall erhalten zur Steuerberatung befugt ist. +Sie Ihre Steuerbescheinigung mit späterer/separater Post. +Erläuterungen zur Vorabpauschale +Für Kunden mit einem Vermögenswirksamen (VL-) +Sparvertrag Abführung von Abgeltungsteuer auf die Vorabpauschaleim DekaBank Depot +Angaben zur elektronischen Wenn für Ihr Depot eine Steuer auf Vorabpauschale fällig wird, +Vermögensbildungsbescheinigung 2020 gilt Folgendes: +Anliegend zum Jahresdepotauszug erhalten Sie die „Mitteilung Sie erhalten ein gesondertes Schreiben außerhalb des +zu Ihrem VL-Vertrag“ mit allen Angaben zur elektronischen Jahresdepotauszugs. +Vermögensbildungsbescheinigung 2020. Diese werden wir - +gemäß den gesetzlichen Vorgaben - der Finanzverwaltung zur Es gelten die gleichen Teilfreistellungen wie für die +Verfügung stellen. Besteuerung von Ausschüttungen und +Freistellungsmöglichkeiten wie etwa Freistellungsauftrag +Bitte prüfen Sie die Angaben und beachten Sie die Hinweise oder Nichtveranlagungsbescheinigung. +und Erläuterungen. Eine anfallende Steuer wird von der DekaBank im Regelfall +Weitere Mitteilungen zur elektronischen von Ihrem Girokonto eingezogen (hierzu ist das +Vermögensbildungsbescheinigung sind nicht vorgesehen. depotführende Kreditinstitut auch ohne Einwilligung des +Anlegers berechtigt). Sollte das nicht möglich sein, werden +Fondsanteile in entsprechender Höhe verkauft. +Wenn der Betrag von der DekaBank nicht eingezogen und FATCA-Abkommen (falls zutreffend) +abgeführt werden kann, leiten wir die Information an Ihr +Finanzamt weiter. Wir sind im Rahmen des FATCA-Abkommens (FATCA: Foreign +Account Tax Compliance Act) zwischen der Bundesrepublik +Deutschland und den USA verpflichtet, Kunden, die sogenannte +Erläuterungen und Hinweise zu einzelnen US-Indizien aufweisen bzw. in den USA steuerpflichtig sind, zu +Angaben auf der Depotübersicht melden. Relevante Kunden sind Depotinhaber, wirtschaftlich +Berechtigte, Rechtsträger mit Geschäfts- oder Gründungsort in +Wert in EUR per 31. Dezember 2020 den USA sowie beherrschende Personen von Rechtsträgern. +Der Wert der Wertpapieranlage berechnet sich aus dem Finanzkonten-Informationsaustauschgesetz +Anteilbestand per 31. Dezember 2020 multipliziert mit dem (falls zutreffend) +Preis je Anteil. Die Bewertung des Wertpapieres erfolgt mit dem Depots mit diesem Hinweis unterliegen den Meldepflichten im +jeweils letzten verfügbaren Preis, der zum Zeitpunkt der Rahmen des Finanzkonten-Informationsaustauschgesetzes. +Erstellung dieses Auszugs vorlag. +Das betrifft Kunden, die im Ausland (ohne USA) steuerpflichtig +Wertentwicklung in EUR für 2020 sind. +Die Berechnung der Wertentwicklung erfolgt für den Meldepflichten für FATCA und +Betrachtungszeitraum 1. Januar bis 31. Dezember des +betreffenden Kalenderjahres. Für den Zeitraum werden die Finanzkonten-Informationsaustauschgesetz: +Anfangs- und Endbestände sowie Buchungen, bei denen es zu Die DekaBank meldet folgende Angaben an das +einer stücke- und/oder geldmäßigen Bewegung kam, Bundeszentralamt für Steuern: +herangezogen. +Name, Adresse und Steuer-ID-Nr. +Abgeführte Steuern werden in der Regel nicht berücksichtigt. Depotsaldo zum Ende des Jahres/Saldo unmittelbar vor einer +Die Wertentwicklung wird durch gezahlte Ausgabeaufschläge Kontoschließung bzw. die Information, dass das Depot +reduziert. Für ein Unterdepot, das im Betrachtungszeitraum geschlossen wurde. +ohne Bestand war, wird keine Wertentwicklung ausgewiesen. +Im Depot gebuchte Erträge sowie Veräußerungserlöse. Die +Wichtig: Wir weisen ausdrücklich darauf hin, dass im Markt Angaben werden im Rahmen des automatischen +unterschiedliche Berechnungsmethoden zur Ermittlung der „Austauschs von Kontodaten in Steuerangelegenheiten“ +Wertentwicklung verwendet werden, z.B. geld- oder vom Bundeszentralamt für Steuern an die jeweilige nationale +zeitgewichtete Berechnungsmethode. Bei Verwendung Finanzbehörde weitergeleitet. +unterschiedlicher Berechnungsmethoden ist es möglich, dass +die in anderen Informationen ausgewiesenen +Wertentwicklungen von der in dieser Information dargestellten +Wertentwicklung abweichen. Ausgewählte Services für mehr Flexibilität bei +Ihrer Geldanlage. +Sparer-Pauschbetrag (falls erteilt) Ihr Depot bei der Deka ist noch nicht für die +Bei gemeinschaftlichen Freistellungsaufträgen wird auf jeder Online-Nutzung aktiviert? Dann schalten Sie es +Depotübersicht die Höhe der insgesamt erteilten und jetzt frei, um Ressourcen nachhaltig zu schonen, +beanspruchten Freistellung angezeigt. Ihr Freistellungsauftrag/ flexibler zu werden und Geld zu sparen. +Ihre Nichtveranlagungsbescheinigung gilt für alle bestehenden +und zukünftigen DekaBank Depots, die von Ihrer Sparkasse/ Sie möchten immer aktuelle Finanztipps und +Landesbank betreut werden. Investment-Informationen von den Deka-Experten +per E-Mail? Dann melden Sie sich gleich für die +Daten für den automatischen Kirchensteuerabzug liegen Online-Kommunikation rund um Deka +für 2021 vor (falls zutreffend) Investments an. +Wir sind gesetzlich verpflichtet, den Kirchensteuerabzug Um diese und weitere Services genauer +vorzunehmen - vorausgesetzt, Sie gehören einer kennenzulernen und dann bei Ihrer Geldanlage +steuererhebenden Religionsgemeinschaft an. noch flexibler zu sein, scannen Sie jetzt den +nebenstehenden QR-Code oder geben Sie +Hierzu fragen wir das sogenannte +Kirchensteuerabzugsmerkmal beim Bundeszentralamt für www.deka.de/online ein. jcbZu4NbPjcbZZlXZgZXpZZlXZ +Steuern ab. Sollten uns entsprechende Informationen czcRPxWUXaacRmBgHw8BgY1kB2 +vorliegen, erhalten Sie den o.g. Hinweistext. pXMVyIKgJeqlPpTXLZbM6rp;wX +jcbZN99:uSjx: +ZlXZGWwIToBOP +Wenn der Hinweistext fehlt, liegt uns das zzzPzPzttt0zP +Kirchensteuerabzugsmerkmal nicht vor. Das kann +verschiedene Gründe haben, zum Beispiel, dass der +DekaBank keine gültige Steuer-Identifikationsnummer +vorliegt und die Abfrage der Religionszugehörigkeit daher Ergänzende Informationen rund um das Thema Steuern +nicht ausgeführt werden konnte. finden Sie im Internet auf: +Der Abzug von Kirchensteuer ist nur möglich bei Einzeldepots www.deka.de/privatkunden/informationen/investmentsteuer +und bei Gemeinschaftsdepots von Ehegatten bzw. unter anderem zu: Sparer-Pauschbetrag, Steuerbescheinigung, +eingetragenen Lebenspartnern. Teilfreistellung, Kirchensteuer. +Aktuelle Informationen +zum DekaBank Depot. +Sehr geehrte Kundin, sehr geehrter Kunde, Zum Abschnitt Änderung der Allgemeinen +Geschäftsbedingungen +Im Abschnitt Änderung der Allgemeinen Geschäftsbedingungen +wir informieren Sie über wurden redaktionelle Anpassungen vorgenommen: +a) die Änderung der Allgemeinen Geschäftsbedingungen für Änderungen der Allgemeinen Geschäftsbedingungen, der be- + DekaBank Depots (AGB), sonderen Bedingungen Sonderbedingungen sowie die Einfüh- +b) die Änderung des Preis- und Leistungsverzeichnisses zum rung zusätzlicher Bedingungen Sonderbedingungen werden + DekaBank Depot, dem Kunden spätestens zwei Monate vor dem vorgeschlagenen +c) die Änderung der Sonderbedingungen für DekaBank Zeitpunkt ihres Wirksamwerdens in der jeweils gesetzlich zuge- +Depots betreffend Inhaberschuldverschreibungen und lassenen Form angeboten. Die Zustimmung des Kunden zum +d) die Neuregelung der Informationspflichten bei Angebot der DekaBank gilt als erteilt, wenn er seine Ablehnung +Prospektnachträgen gemäß der EU-Prospektverordnung. nicht vor dem vorgeschlagenen Zeitpunkt des Wirksamwerdens +der Änderungen angezeigt hat. Auf diese Genehmigungswir- +a) Änderung der AGB zum 1. Mai 2021 kung wird ihn die DekaBank in ihrem Angebot besonders hin- +weisen. Die DekaBank wird dann die geänderte Fassung der All- +Zu Ziffer 2.7 Ertragsausschüttung gemeinen Geschäftsbedingungen, die geänderten besonderen +Im Zusammenhang mit der Verwahrfähigkeit von Exchange Bedingungen Sonderbedingungen bzw. die zusätzlich einge- +Traded Funds (ETF) im DekaBank Depot wird am Ende von führten Bedingungen Sonderbedingungen der weiteren Ge- +Absatz 2 folgende Regelung angefügt: schäftsbeziehung zugrunde legen. +Bei Exchange Traded Funds (ETF) der Deka Investment GmbH Ihre Zustimmung zu den angebotenen Änderungen der AGB gilt +und bei ETF anderer Verwaltungsgesellschaften erfolgt die als erteilt, wenn Sie Ihre Ablehnung nicht binnen zwei Monaten +Wiederanlage zum Schlusskurs des Tages, an dem die DekaBank nach Bekanntgabe in Textform anzeigen. +den Auftrag nach Ausführung abrechnet. +Darüber hinaus informieren wir Sie, dass die AGB um die +Zu Ziffer 3.2 Verzicht des Kunden auf die Herausgabe von „Hinweise zu außergerichtlichen Streitschlichtungsverfahren“ +Vertriebsvergütungen gegenüber seiner Sparkasse / Bank erweitert werden (vgl. auch entsprechenden Abschnitt in Punkt +(Vertrag zugunsten Dritter zwischen dem Kunden und der b)). Diese Anpassung bedarf nicht Ihrer Zustimmung. +DekaBank) +Im Zusammenhang mit der Verwahrfähigkeit von Exchange Die DekaBank wird die geänderte Fassung der AGB fristgerecht +Traded Funds (ETF) im DekaBank Depot wird nach Absatz 4 ein der weiteren Geschäftsbeziehung zugrunde legen. +neuer Absatz eingefügt: Die vollständige neue Fassung der AGB können Sie auf +Beim Erwerb von Anteilen an Exchange Traded Funds (ETF) nach www.deka.de einsehen. Gerne senden wir Ihnen diese auf +Maßgabe der Sonderbedingungen für DekaBank Depots Wunsch per Post zu. +betreffend Exchange Traded Funds wird der Antrag des Kunden +auf Erwerb von ETF-Anteilen regelmäßig durch die Sparkasse des b) Änderung des Preis- und Leistungsverzeichnisses zum +Kunden an die DekaBank übermittelt. In diesem Fall zahlt die DekaBank Depot zum 1. Januar 2021 +DekaBank an die Sparkasse des Kunden, die diesen bei In der ab 1. Januar 2021 gültigen Fassung des Preis- und +Wertpapiergeschäften betreut, einmalige Vertriebsvergütungen, Leistungsverzeichnisses wird im Zusammenhang mit der +die anlässlich des Geschäftsabschlusses umsatzabhängig gezahlt Verwahrfähigkeit von Exchange Traded Funds im DekaBank +werden. Die Höhe der an die Sparkasse geleisteten einmaligen Depot im Abschnitt „Zahlungsverkehr“ der Unterpunkt +Vertriebsvergütung beträgt in der Regel zwischen 90 % und 95 „Umrechnung bei Fremdwährungsfonds und Fremdwäh- +% des vom Kunden entrichteten Orderentgelts. rungs-Inhaberschuldverschreibungen“ wie folgt ergänzt: +Satz 1 des darauffolgenden Absatzes wird aus dem gleichen Lautet die Fondswährung eines Exchange Traded Funds nicht auf +Grund angepasst: Euro, erfolgt eine Umrechnung zum Devisenmittelkurs. Die +Einzelheiten zur Höhe der Vertriebsvergütungen für ein DekaBank ermittelt bankarbeitstäglich den Mittelkurs auf Basis +konkretes Wertpapier, auch zur Höhe der einmaligen freigehandelter Marktkurse. Der Mittelkurs ist auf Anfrage bei +Vertriebsvergütungen für Anteile eines konkreten ETFs, werden der DekaBank erhältlich. +dem Kunden im Rahmen der aufsichtsrechtlich erforderlichen Des Weiteren werden dem Preis- und Leistungsverzeichnis die +Kostentransparenz unaufgefordert mitgeteilt. „Hinweise zu außergerichtlichen Streitschlichtungsverfahren“ + entnommen. Sie werden zukünftig am Ende der AGB zu finden +sein. +c) Änderung der Sonderbedingungen für DekaBank De- d) Neuregelung der Informationspflichten bei Prospekt- +pots betreffend Inhaberschuldverschreibungen zum 1. nachträgen gemäß der EU-Prospektverordnung +April 2021 +Der gemäß der EU-Prospektverordnung (Verordnung (EU) +Sofern Sie diese Sonderbedingungen mit uns vereinbart haben, 2017/1129) erstellte Wertpapierprospekt enthält eine ausführli- +gelten für Sie die nachfolgenden Änderungen. che Beschreibung der jeweiligen Inhaberschuldverschreibung. +Zu Ziffer 1. Geltungsbereich der Sonderbedingungen; Es besteht unter bestimmten gesetzlichen Voraussetzungen die +Geltung der Allgemeinen Geschäftsbedingungen Möglichkeit, dass ein Nachtrag zum Wertpapierprospekt veröf- +Es wurden lediglich redaktionelle Anpassungen vorgenommen. fentlicht wird. So ist jeder wichtige neue Umstand, jede wesent- +liche Unrichtigkeit oder jede wesentliche Ungenauigkeit in Be- +Zu Ziffer 10. Änderungen der Sonderbedingungen zug auf die im Wertpapierprospekt enthaltenen Angaben in ei- +Die Widerspruchsfrist für Änderungen der Sonderbedingungen nem Nachtrag zum Wertpapierprospekt zu benennen. +wird zu Gunsten des Kunden von sechs Wochen auf zwei Mo- +nate verlängert: Jeder solcher Nachtrag wird entsprechend der gesetzlichen Vor- +gaben vom jeweiligen Emittenten auf seiner Website veröffent- +10. Änderungen der Sonderbedingungen licht. +Die DekaBank wird dem Kunden eine Änderung dieser Sonder- +bedingungen schriftlich mitteilen. Hat der Kunde mit der Deka- Wenn Sie eine Inhaberschuldverschreibung für Ihr DekaBank De- +Bank im Rahmen der Geschäftsbeziehung einen elektronischen pot erworben oder gezeichnet haben und der hierfür maßgebli- +Kommunikationsweg vereinbart (z. B. die Teilnahme an che Wertpapierprospekt Gegenstand eines Nachtrags ist, kann +deka.de), können die Änderungen auch auf diesem Weg Ihnen gemäß Artikel 23 Absatz 2 der EU-Prospektverordnung ein +übermittelt werden. Die Änderung gilt als genehmigt, wenn der Widerrufsrecht zustehen. Die gesetzliche Widerrufsfrist beträgt +Kunde ihr nicht binnen sechs Wochen nach Bekanntgabe in derzeit 2 Arbeitstage. Der Nachtrag wird Angaben zum Ablauf +Textform widerspricht. Die DekaBank wird dann die geänderte der Frist enthalten, die der Emittent freiwillig verlängern kann. +Fassung der Sonderbedingungen der weiteren Ihr Berater wird Ihnen bei der Ausübung des Widerrufsrechts +Geschäftsbeziehung zugrunde legen. Die DekaBank wird den gerne behilflich sein. +Kunden bei der Bekanntgabe der Änderung auf die Folgen Wir werden Sie über jeden Nachtrag zeitnah informieren, soweit +besonders hinweisen. Die Frist ist gewahrt, wenn der Ihnen ein Widerrufsrecht für die betreffende Inhaberschuldver- +Widerspruch innerhalb von sechs Wochen nach Bekanntgabe schreibung zustehen könnte, aber aufgrund der oben genann- +abgesandt worden ist. ten kurzen Fristen nur, wenn Sie ein elektronisches Postfach ha- +Änderungen dieser Sonderbedingungen werden dem Kunden ben. Wenn Sie noch kein elektronisches Postfach haben, wen- +spätestens zwei Monate vor dem vorgeschlagenen Zeitpunkt ih- den Sie sich bitte an Ihren Berater Ihrer Sparkasse. +res Wirksamwerdens in der jeweils gesetzlich zugelassenen Form +angeboten. Die Zustimmung des Kunden zum Angebot der De- +kaBank gilt als erteilt, wenn er seine Ablehnung nicht vor dem +vorgeschlagenen Zeitpunkt des Wirksamwerdens der Änderun- +gen angezeigt hat. Auf diese Genehmigungswirkung wird ihn +die DekaBank in ihrem Angebot besonders hinweisen. Die Deka- +Bank wird dann die geänderte Fassung der Sonderbedingungen +der weiteren Geschäftsbeziehung zugrunde legen. +Die Änderungen der Sonderbedingungen gelten als akzeptiert, +wenn Sie nicht binnen sechs Wochen nach Bekanntgabe in +Textform widersprechen. +Die DekaBank wird die geänderte Fassung der Sonderbedingun- +gen fristgerecht der weiteren Geschäftsbeziehung zugrunde le- +gen. +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 4.627,73 319,000000 14,507 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Ausschüttung / Kauf aus Ertrag 1,87 318,970000 +0,006 21.08.2020 21.08.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2020 4.693,94 323,430000 14,513 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +DekaLuxTeam-EmergingMarkets +ISIN: LU0350482435 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 4.209,51 149,390000 28,178 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Ausschüttung / Kauf aus Ertrag 22,47 134,190000 +0,167 21.08.2020 21.08.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2020 4.496,65 158,640000 28,345 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-BasisAnlage offensiv +ISIN: DE000DK2CFT3 Unterdepot: 00 +Verwahrart: GiroSammel +Wichtige Information: Der Fonds Deka-BasisAnlage A100 wurde / wird mit Wirkung zum 01.07.2020 in Deka-BasisAnlage offensiv +umbenannt. +VL-Vertrag: gesperrt bis zum 31.12.2024, Vertragsinhaber: Armin Mustermann +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 896,63 181,210000 4,948 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Kauf 36,00 191,670000 +0,188 16.01.2020 16.01.2020 +Kauf 36,00 197,040000 +0,183 18.02.2020 18.02.2020 +Kauf 36,00 145,650000 +0,247 17.03.2020 17.03.2020 +Kauf 36,00 163,400000 +0,220 16.04.2020 16.04.2020 +Kauf 36,00 166,760000 +0,216 18.05.2020 18.05.2020 +Kauf 36,00 169,100000 +0,213 16.06.2020 16.06.2020 +Kauf 36,00 178,860000 +0,201 16.07.2020 16.07.2020 +Kauf 36,00 179,850000 +0,200 18.08.2020 18.08.2020 +Kauf 36,00 182,900000 +0,197 16.09.2020 16.09.2020 +Kauf 36,00 188,400000 +0,191 16.10.2020 16.10.2020 +Ausschüttung / Kauf aus Ertrag 0,52 184,040000 +0,003 13.11.2020 13.11.2020 +Kauf 36,00 194,660000 +0,185 17.11.2020 17.11.2020 +Kauf 36,00 195,000000 +0,185 16.12.2020 16.12.2020 +Summe der Betragsbewegungen 432,00 +Bestand am 31.12.2020 1.401,26 189,950000 7,377 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 3 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 4.789,94 779,740000 6,143 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Verkauf 4.751,73 773,520000 -6,143 08.09.2020 08.09.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen -4.751,73 +Bestand am 31.12.2020 0,00 881,660000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +DekaLux-Geldmarkt: Euro +ISIN: LU0052863874 Unterdepot: 99 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Kauf aus Steuererstattung 12,29 47,355000 +0,260 19.08.2020 19.08.2020 +Verkauf 12,31 47,350000 -0,260 26.08.2020 26.08.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2020 0,00 47,284000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Fortsetzung auf Seite 4 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 4 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 1.285,77 130,310000 9,867 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Verkauf 1.192,43 120,850000 -9,867 18.08.2020 18.08.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen -1.192,43 +Bestand am 31.12.2020 0,00 127,990000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Deka-EuropaSelect CF +ISIN: DE0009786186 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 1.871,94 72,570000 25,795 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Ausschüttung / Kauf aus Ertrag 8,77 76,060000 +0,115 21.02.2020 21.02.2020 +Verkauf 1.906,72 73,590000 -25,910 17.08.2020 17.08.2020 +Mandatsreferenz: 0111101111001 +Summe der Betragsbewegungen -1.906,72 +Bestand am 31.12.2020 0,00 80,130000 0,000 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Fortsetzung auf Seite 5 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht +Seite 5 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 4.635,28 137,110000 33,807 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Ausschüttung / Kauf aus Ertrag 2,37 144,570000 +0,016 21.02.2020 21.02.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2020 5.657,23 167,260000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 01 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR Fremdwährung EUR Anteile tag nungstag +Bestand am 31.12.2019 1.212,60 137,110000 8,844 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Ausschüttung / Kauf aus Ertrag 0,62 144,570000 +0,004 21.02.2020 21.02.2020 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2020 1.479,92 167,260000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Dieser Depotauszug besteht aus 5 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht Deka-ZukunftsPlan +Seite 1 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Deka-ZukunftsPlan +ISIN: XF0009995000 Unterdepot: 00 Variante: Select +Vertragsnummer: 011970177999950000 Zertifizierungs-Nr.: 004455 +Aktuelle Phase: Ansparphase Beginn der Auszahlungsphase: 01.02.2062 +Übersicht der angesparten Fonds +Fondsname ISIN Verwahrart +Deka-Renten konservativ LU0230155797 GiroSammel +Deka-DividendenStrategie CF (A) DE000DK2CDS0 GiroSammel +Deka-RentenStrategie Global CF DE000DK2J6P1 GiroSammel +Übersicht der erfolgten Zahlungen +Umsatzart Fondsname Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +EUR EUR Anteile tag nungstag +Bestand am 31.12.2019 Deka-DividendenStrategi 2.270,84 168,560000 13,472 +e CF (A +Gesamtbestand des Vertrages am 31.12.2019 2.270,84 +Bewertung mit dem Rücknahmepreis vom 30.12.2019 +Zulagenzahlung 2019 Deka-Renten konservativ 68,25 48,000000 +1,422 19.05.2020 19.05.2020 +Zulagenzahlung 2019 Deka-RentenStrategie 106,75 94,790000 +1,126 19.05.2020 19.05.2020 +Global CF +Ausschüttung / Kauf aus Ertrag Deka-RentenStrategie 42,00 89,200000 +0,471 22.05.2020 22.05.2020 +Global CF +Vertragspreis Deka-DividendenStrategi 1,95 148,480000 -0,013 24.08.2020 24.08.2020 +e CF (A +Schädliche Verwendung Deka-DividendenStrategi 231,63 148,480000 -1,560 24.08.2020 24.08.2020 +e CF (A +Entgelt Auflösung Deka-DividendenStrategi 9,75 148,480000 -0,066 24.08.2020 24.08.2020 +e CF (A +Steuerrückzahlung Deka-DividendenStrategi 42,60 148,480000 -0,287 24.08.2020 24.08.2020 +e CF (A +Zulagenrückzahlung Deka-DividendenStrategi 110,00 148,480000 -0,741 24.08.2020 24.08.2020 +e CF (A +Vertragspreis Deka-RentenStrategie 7,79 93,760000 -0,083 24.08.2020 24.08.2020 +Global CF +Schädliche Verwendung Deka-RentenStrategie 925,32 93,760000 -9,869 24.08.2020 24.08.2020 +Global CF +Entgelt Auflösung Deka-RentenStrategie 38,99 93,760000 -0,416 24.08.2020 24.08.2020 +Global CF +Steuerrückzahlung Deka-RentenStrategie 170,40 93,760000 -1,817 24.08.2020 24.08.2020 +Global CF +Zulagenrückzahlung Deka-RentenStrategie 440,00 93,760000 -4,693 24.08.2020 24.08.2020 +Global CF +Zusammenfassung der Umschichtungen (Details siehe nachfolgende "Übersicht der Umschichtungen") +Deka-Renten konservativ -1,422 +Deka-DividendenStrategi -10,805 +e CF (A +Deka-RentenStrategie +15,281 +Global CF +Bitte prüfen Sie den Anteilbestand. Bei etwaigen Unstimmigkeiten wenden Sie sich in Textform an unsere Revisionsabteilung. +Diese Aufstellung gilt als anerkannt, wenn Sie Ihre Einwendungen nicht innerhalb eines Monats nach Zugang abgesandt haben. +Fortsetzung auf Seite 2 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht Deka-ZukunftsPlan +Seite 2 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Bestand am 31.12.2020 Deka-Renten konservativ 0,00 48,590000 0,000 +Bestand am 31.12.2020 Deka-DividendenStrategi 0,00 155,810000 0,000 +e CF (A +Bestand am 31.12.2020 Deka-RentenStrategie 0,00 96,700000 0,000 +Global CF +Gesamtbestand des Vertrages am 31.12.2020 0,00 +Bewertung mit dem Rücknahmepreis vom 30.12.2020 +Übersicht der Umschichtungen +Umsatzart Fondsname Betrag Preis je Anteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Verkauf / Tausch Deka-DividendenStrategi 776,10 140,300000 -5,532 11.03.2020 11.03.2020 +e CF (A) +Kauf / Tausch Deka-RentenStrategie 776,10 95,790000 +8,102 11.03.2020 11.03.2020 +Global CF +Verkauf / Tausch Deka-DividendenStrategi 354,90 133,010000 -2,668 12.03.2020 12.03.2020 +e CF (A) +Kauf / Tausch Deka-RentenStrategie 354,90 94,460000 +3,757 12.03.2020 12.03.2020 +Global CF +Verkauf / Tausch Deka-DividendenStrategi 3,05 125,290000 -0,024 13.03.2020 13.03.2020 +e CF (A) +Kauf / Tausch Deka-RentenStrategie 3,05 92,740000 +0,033 13.03.2020 13.03.2020 +Global CF +Verkauf / Tausch Deka-DividendenStrategi 650,44 123,940000 -5,248 16.03.2020 16.03.2020 +e CF (A) +Kauf / Tausch Deka-RentenStrategie 650,44 91,580000 +7,102 16.03.2020 16.03.2020 +Global CF +Verkauf / Tausch Deka-RentenStrategie 1.718,96 90,500000 -18,994 17.03.2020 17.03.2020 +Global CF +Kauf / Tausch Deka-Renten konservativ 1.718,96 48,250000 +35,626 17.03.2020 17.03.2020 +Verkauf / Tausch Deka-Renten konservativ 340,80 47,890000 -7,116 16.04.2020 16.04.2020 +Kauf / Tausch Deka-RentenStrategie 340,80 90,020000 +3,786 16.04.2020 16.04.2020 +Global CF +Verkauf / Tausch Deka-Renten konservativ 0,50 47,900000 -0,010 17.04.2020 17.04.2020 +Kauf / Tausch Deka-RentenStrategie 0,50 90,200000 +0,006 17.04.2020 17.04.2020 +Global CF +Verkauf / Tausch Deka-Renten konservativ 682,17 48,010000 -14,209 18.05.2020 18.05.2020 +Kauf / Tausch Deka-RentenStrategie 682,17 91,740000 +7,436 18.05.2020 18.05.2020 +Global CF +Verkauf / Tausch Deka-Renten konservativ 373,94 48,370000 -7,731 09.06.2020 09.06.2020 +Kauf / Tausch Deka-RentenStrategie 373,94 91,710000 +4,077 09.06.2020 09.06.2020 +Global CF +Verkauf / Tausch Deka-RentenStrategie 0,66 91,580000 -0,007 10.06.2020 10.06.2020 +Global CF +Kauf / Tausch Deka-Renten konservativ 0,66 48,370000 +0,014 10.06.2020 10.06.2020 +Verkauf / Tausch Deka-Renten konservativ 386,77 48,370000 -7,996 30.06.2020 30.06.2020 +Kauf / Tausch Deka-RentenStrategie 386,77 91,980000 +4,205 30.06.2020 30.06.2020 +Global CF +Verkauf / Tausch Deka-RentenStrategie 391,83 93,030000 -4,212 24.07.2020 24.07.2020 +Global CF +Kauf / Tausch Deka-DividendenStrategi 391,83 147,230000 +2,661 24.07.2020 24.07.2020 +e CF (A) +Verkauf / Tausch Deka-RentenStrategie 0,93 93,100000 -0,010 27.07.2020 27.07.2020 +Global CF +Fortsetzung auf Seite 3 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Jahresdepotauszug und Quartalsbericht +per 31.12.2020 +Umsatz-Jahresübersicht Deka-ZukunftsPlan +Seite 3 +Depot: 0111111111 +Depotinhaber: +Armin Mustermann +Umsatzart Fondsname Betrag Preis je Anteil Abgerechnete Buchungs- Abrech- + EUR EUR Anteile tag nungstag +Fortsetzung von vorheriger Seite +Kauf / Tausch Deka-DividendenStrategi 0,93 146,220000 +0,006 27.07.2020 27.07.2020 +e CF (A) +Summe Deka-Renten konservativ -1,422 +Summe Deka-DividendenStrategi -10,805 +e CF (A) +Summe Deka-RentenStrategie +15,281 +Global CF +Dieser Depotauszug besteht aus 3 Seiten. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Mitteilung zu Ihrem VL-Vertrag für Armin Mustermann +Für Ihren angegebenen vermögenswirksamen Sparvertrag werden wir folgende Daten an die Finanzverwaltung übermitteln. Bitte beachten +Sie, dass eine Übermittlung nur möglich ist, wenn alle unten stehenden Felder vollständig/richtig befüllt sind und kein Widerspruch zur +Datenübermittlung vorliegt. +Vertragsinhaber Mustermann, Armin +1. Vertrag 2. Vertrag +Straße, Hausnummer Frankenweg 7 +Postleitzahl, Wohnort 11111 Stadt +Postalische Ergänzung Musterstraße +Vertragsnummer 11970177900900 +Vermögenswirksame Leistungen 432,00 +(auf volle Euro gerundet) +Steuer-Identifikationsnummer 45716398228 +Geburtsdatum Vertragsinhaber 17.01.1995 +Datenübermittlung Einwilligung liegt vor +Ende der Sperrfrist 31.12.2024 +Institutsschlüssel 1111111 +Meldejahr 2020 +Anlageinstitut, Unternehmen, Empfänger +DekaBank +Deutsche Girozentrale +60625 Frankfurt am Main +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug07.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug07.txt index b6b6fd457a..8dc90e9156 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug07.txt +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug07.txt @@ -7,7 +7,7 @@ Depot: 0119788888 Depotinhaber: Herrn Max Mustermann Max Mustermann -Stöckach Bankverbindung generell:IBAN: +Musterstraße Bankverbindung generell:IBAN: Strasse 7 DExx xxx5 0101 xxxx xxx2 87 88888 Dorf Spk Schweinfurt-Haßberge Kontoinhaber: diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug08.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug08.txt new file mode 100644 index 0000000000..337612ff0a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug08.txt @@ -0,0 +1,74 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Max Mustermann +Max Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +2. Oktober 2009 +Kauf von Fondsanteilen Auszug: 5 / Seite 1 von 2 + +Sehr geehrter Herr Mustermann, +folgende Buchung haben wir für Ihr Depot durchgeführt: +LASTSCHRIFTEINZUG +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 8101 2521 +Verwahrart: GiroSammel Abrechnungstag: 02.10.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Einzugsbetrag EUR 400,00 Preis Bestand alt: 1,612 += Abrechnungsbetrag EUR 400,00 EUR 400,00 EUR 996,160000 Anteilumsatz: 0,402 +Bestand neu: 2,014 +Ihr erteilter Sparer-Pauschbetrag für Max Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 485,63 +Anrechenbare ausländische Quellensteuer EUR 3,72 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungssteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Bitte prüfen Sie die vorliegenden Informationen. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 5 / Seite 2 von 2 + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Über Chancen, Risiken und Kosten der Anlage informiert Sie das Fondsporträt des jeweiligen Fonds. +Wünschen Sie aktuelle Informationen zu unseren Fonds, können Sie diese jederzeit im Internet über +www.deka.de aufrufen. + +Deka ist "Top-Fondsgesellschaft" + +Die Höchstnote von 5 Sternen wurde der Deka bei einer +Preisverleihung des Wirtschaftsmagazins "Capital" im Januar +2009 verliehen. + +Capital untersuchte dabei 100 Fondsgesellschaften nach +Lückenlosigkeit der Produktpalette, Fondsqualität, Management +und Service. Von diesen erhielten lediglich 8 weitere Anbieter die +Bestnote. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug09.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug09.txt new file mode 100644 index 0000000000..a3429feef6 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug09.txt @@ -0,0 +1,82 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Max Mustermann +Max Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0111111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +6. März 2009 +Kauf von Fondsanteilen Auszug: 2 / Seite 1 von 2 + +Sehr geehrter Herr Mustermann, +folgende Buchung haben wir für Ihr Depot durchgeführt: +LASTSCHRIFTEINZUG erteilt per Deka.de - Internet +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 01 Auftragsnummer: 8101 3955 +Verwahrart: GiroSammel Abrechnungstag: 06.03.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Einzugsbetrag EUR 1.400,00 Preis Bestand alt: 0,000 += Abrechnungsbetrag EUR 1.400,00 EUR 1.400,00 EUR 1.019,470000 Anteilumsatz: 1,373 +Zwischengewinn Bestand neu: 1,373 +EUR 20,900000 +Ihr erteilter Sparer-Pauschbetrag für Max Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 28,70 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 560,62 +Anrechenbare ausländische Quellensteuer EUR 2,97 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. +Bitte prüfen Sie die vorliegenden Informationen. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 2 von 2 + +Über Chancen, Risiken und Kosten der Anlage informiert Sie das Fondsporträt des jeweiligen Fonds. +Wünschen Sie aktuelle Informationen zu unseren Fonds, können Sie diese jederzeit im Internet über +www.deka.de aufrufen. + +Wichtig: +Bitte prüfen Sie, ob in Ihrem DekaBank Depot eine generelle Bankverbindung hinterlegt ist. Ist dies der Fall, +finden Sie diese rechts neben Ihrer Anschrift. + +Haben Sie keine Bankverbindung hinterlegt, bzw. ist diese nicht mehr aktuell, dann teilen Sie uns bitte Ihre +neue Bankverbindung mit. Künftige Aufträge können dann ohne Verzögerung ausgeführt werden. Vielen +Dank. + + +Deka ist "Top-Fondsgesellschaft" + +Die Höchstnote von 5 Sternen wurde der Deka bei einer +Preisverleihung des Wirtschaftsmagazins "Capital" im Januar +2009 verliehen. + +Capital untersuchte dabei 100 Fondsgesellschaften nach +Lückenlosigkeit der Produktpalette, Fondsqualität, Management +und Service. Von diesen erhielten lediglich 8 weitere Anbieter die +Bestnote. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug10.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug10.txt new file mode 100644 index 0000000000..af7a9c54da --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug10.txt @@ -0,0 +1,73 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Max Mustermann +Max Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +16. Juni 2009 +Kauf von Fondsanteilen Auszug: 3 / Seite 1 von 2 + +Sehr geehrter Herr Mustermann, +folgende Buchung haben wir für Ihr Depot durchgeführt: +LASTSCHRIFTEINZUG +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 8101 3074 +Verwahrart: GiroSammel Abrechnungstag: 16.06.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Einzugsbetrag EUR 1.000,00 Preis Bestand alt: 0,588 += Abrechnungsbetrag EUR 1.000,00 EUR 1.000,00 EUR 1.023,350000 Anteilumsatz: 0,977 +Zwischengewinn Bestand neu: 1,565 +EUR 27,690000 +Ihr erteilter Sparer-Pauschbetrag für Max Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 27,05 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 559,46 +Anrechenbare ausländische Quellensteuer EUR 2,97 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. +Bitte prüfen Sie die vorliegenden Informationen. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 3 / Seite 2 von 2 + +Über Chancen, Risiken und Kosten der Anlage informiert Sie das Fondsporträt des jeweiligen Fonds. +Wünschen Sie aktuelle Informationen zu unseren Fonds, können Sie diese jederzeit im Internet über +www.deka.de aufrufen. + +Deka ist "Top-Fondsgesellschaft" + +Die Höchstnote von 5 Sternen wurde der Deka bei einer +Preisverleihung des Wirtschaftsmagazins "Capital" im Januar +2009 verliehen. + +Capital untersuchte dabei 100 Fondsgesellschaften nach +Lückenlosigkeit der Produktpalette, Fondsqualität, Management +und Service. Von diesen erhielten lediglich 8 weitere Anbieter die +Bestnote. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug11.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug11.txt new file mode 100644 index 0000000000..13bfb48e7a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug11.txt @@ -0,0 +1,78 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Richard Mustermann +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +14. Dezember 2010 +Käufe von Fondsanteilen Auszug: 4 / Seite 1 von 2 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +KAUF +Fondsbezeichnung: AriDeka CF +ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 7103 3775 +Verwahrart: GiroSammel Abrechnungstag: 1 4.12.2010 +Ausgabeaufschlag: 5,260% +Bei dieser Buchung handelt es sich um die Sparzulage vom Finanzamt +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Preis Bestand alt: 32,012 +Abrechnungsbetrag EUR 72,00 EUR 72,00 EUR 53,780000 Anteilumsatz: 1,339 +Bestand neu: 33,351 +KAUF +Fondsbezeichnung: AriDeka CF +ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 7104 1292 +Verwahrart: GiroSammel Abrechnungstag: 1 4.12.2010 +Ausgabeaufschlag: 5,260% +Bei dieser Buchung handelt es sich um die Sparzulage vom Finanzamt +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Preis Bestand alt: 33,351 +Abrechnungsbetrag EUR 25,00 EUR 25,00 EUR 53,780000 Anteilumsatz: 0,465 +Bestand neu: 33,816 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 4 / Seite 2 von 2 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 461,57 +Anrechenbare ausländische Quellensteuer EUR 6,54 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungsteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Bitte prüfen Sie die vorliegenden Informationen. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Über Chancen, Risiken und Kosten der Anlage informiert Sie das Fondsporträt des jeweiligen Fonds. +Wünschen Sie aktuelle Informationen zu unseren Fonds, können Sie diese jederzeit im Internet über +www.deka.de aufrufen. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug12.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug12.txt new file mode 100644 index 0000000000..c58f807adc --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug12.txt @@ -0,0 +1,107 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Max Mustermann +Max Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. Februar 2009 +Ertragsausschüttungen Auszug: 1 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSABRECHNUNG +Am 20.02.2009 fand die Ertragsausschüttung des AriDeka CF statt. Der Ausschüttungsbetrag pro Anteil +beträgt EUR 0,9300000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 29,811 Anteilen zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: AriDeka CF +ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 9387 9103 +Verwahrart: GiroSammel Abrechnungstag: 20.02.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 27,72 Preis Bestand alt: 29,811 ++Verrechnete Steuern EUR 1,43 EUR 29,15 EUR 33,420000 Anteilumsatz: 0,872 +=Wiederanlagebetrag EUR 29,15 Zwischengewinn Bestand neu: 30,683 +EUR 0,010000 +ERTRAGSABRECHNUNG +Am 20.02.2009 fand die Ertragsausschüttung des Deka-EuropaPotential TF statt. Der Ausschüttungsbetrag +pro Anteil beträgt EUR 0,1000000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 35,950 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: Deka-EuropaPotential TF +ISIN: DE0009786285 Unterkonto: 00 Auftragsnummer: 9401 7546 +Verwahrart: GiroSammel Abrechnungstag: 20.02.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 3,60 Preis Bestand alt: 35,950 += Wiederanlagebetrag EUR 3,60 EUR 3,60 EUR 37,990000 Anteilumsatz: 0,095 +Bestand neu: 36,045 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 1 / Seite 2 von 3 +Ihr erteilter Sparer-Pauschbetrag für Max Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 560,61 +Anrechenbare ausländische Quellensteuer EUR 2,97 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Wichtig: +Bitte prüfen Sie, ob in Ihrem DekaBank Depot eine generelle Bankverbindung hinterlegt ist. Ist dies der Fall, +finden Sie diese rechts neben Ihrer Anschrift. + +Haben Sie keine Bankverbindung hinterlegt, bzw. ist diese nicht mehr aktuell, dann teilen Sie uns bitte Ihre +neue Bankverbindung mit. Künftige Aufträge können dann ohne Verzögerung ausgeführt werden. Vielen +Dank. + + +Deka ist "Top-Fondsgesellschaft" + +Die Höchstnote von 5 Sternen wurde der Deka bei einer +Preisverleihung des Wirtschaftsmagazins "Capital" im Januar +2009 verliehen. + +Capital untersuchte dabei 100 Fondsgesellschaften nach +Lückenlosigkeit der Produktpalette, Fondsqualität, Management +und Service. Von diesen erhielten lediglich 8 weitere Anbieter die +Bestnote. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist ein wichtiger Bestandteil für einen systematischen Vermögensaufbau. Und die ideale +Ergänzung zu einer Einmalanlage. Nutzen Sie die Chance, mit einem Deka-FondsSparplan Ihre persönlichen +Anlageziele noch leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und +einem variablen Einzahlungsrhythmus. Für eine Neuanlage oder die Erhöhung eines Deka-FondsSparplans +schicken Sie den folgenden Auftrag einfach ausgefüllt an uns zurück. +Depotnummer: 0111111111 +Depotinhaber: Max Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: AriDeka CF +ISIN: DE0008474511 Ausgabeaufschlag¹: 5,260 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug13.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug13.txt new file mode 100644 index 0000000000..fcdc91ae5b --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug13.txt @@ -0,0 +1,108 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. August 2009 +Ertragsausschüttungen Auszug: 4 / Seite 1 von 4 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSABRECHNUNG +Am 20.08.2009 fand die Ertragsausschüttung des Deka-GeldmarktPlan TF statt. Der Ausschüttungsbetrag pro +Anteil beträgt EUR 29,5900000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 1,565 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 9311 0573 +Verwahrart: GiroSammel Abrechnungstag: 20.08.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 46,31 Preis Bestand alt: 1,565 += Wiederanlagebetrag EUR 46,31 EUR 46,31 EUR 995,430000 Anteilumsatz: 0,047 +Bestand neu: 1,612 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 4 / Seite 2 von 4 +ERTRAGSABRECHNUNG +Am 20.08.2009 fand die Ertragsausschüttung des Deka-EuropaBond TF statt. Der Ausschüttungsbetrag pro +Anteil beträgt EUR 1,0500000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 49,088 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: Deka-EuropaBond TF +ISIN: DE0009771980 Unterkonto: 00 Auftragsnummer: 9329 3756 +Verwahrart: GiroSammel Abrechnungstag: 20.08.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 51,54 Preis Bestand alt: 49,088 += Wiederanlagebetrag EUR 51,54 EUR 51,54 EUR 36,340000 Anteilumsatz: 1,418 +Zwischengewinn Bestand neu: 50,506 +EUR 0,280000 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,40 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 485,23 +Anrechenbare ausländische Quellensteuer EUR 3,72 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungssteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 4 / Seite 3 von 4 + +Deka ist "Top-Fondsgesellschaft" + +Die Höchstnote von 5 Sternen wurde der Deka bei einer +Preisverleihung des Wirtschaftsmagazins "Capital" im Januar +2009 verliehen. + +Capital untersuchte dabei 100 Fondsgesellschaften nach +Lückenlosigkeit der Produktpalette, Fondsqualität, Management +und Service. Von diesen erhielten lediglich 8 weitere Anbieter die +Bestnote. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu Ihrer Geldanlage. Nutzen Sie die Chance, mit dem Deka-FondsSparplan Ihre persönlichen Anlageziele noch +leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Ausgabeaufschlag¹: 0,000 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug14.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug14.txt new file mode 100644 index 0000000000..ebc828577f --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug14.txt @@ -0,0 +1,76 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann +Bankverbindung generell: +Musterstraße +IBAN: +Frankenweg 7 DE07793517300000111111 +11111 Stadt BIC: BYLADEM1HAS +Spk Ostunterfranken +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. August 2015 +Ertragsabrechnung Auszug: 2 / Seite 1 von 2 + +Sehr geehrter Herr Mustermann, +folgende Buchung haben wir für Ihr Depot durchgeführt: +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 20.08.2015 +Anteilbestand am Ertragstermin: 15,795 +Ausschüttung (pro Anteil EUR 6,6600000): EUR 105,19 +Bezeichnung: DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 Auftragsnummer: 9310 0970 +Verwahrart: GiroSammel Abrechnungstag: 20.08.2015 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 105,19 Kurs Bestand alt: 15,795 += Wiederanlagebetrag EUR 105,19 EUR 105,19 EUR 273,280000 Anteilumsatz: 0,385 +Bestand neu: 16,180 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn, Stückzinsen und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 398,49 +Anrechenbare ausländische Quellensteuer EUR 9,49 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente, +Deka-ZukunftsPlan und Deka-RenteDirekt sind in der Ansparphase abgeltungsteuerfrei. Die Leistungen +werden in der Regel erst in der Auszahlphase als sog. Sonstige Einkünfte versteuert. Leistungen, die auf +geförderten Beiträgen beruhen, werden in der Auszahlungsphase voll besteuert (persönlicher Steuersatz). +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 2 von 2 + +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Capital-Fonds-Kompass 2015 +Das Wirtschaftsmagazin Capital hat die Deka zum dritten Mal in Folge mit der Höchstnote von fünf Sternen +ausgezeichnet. Im "Capital-Fonds-Kompass" verbesserte die Deka das gute Vorjahresergebnis leicht auf 77,1 +Punkte und platzierte sich im Ranking der Universalanbieter auf Platz 7 (von 59). In allen Kategorien konnte +die Deka an die sehr guten Ergebnisse der Vorjahre anknüpfen. Mit 166 getesteten Fonds und der damit +zweitgrößten Angebotspalette wurde hier die Höchstpunktzahl von 10 Punkten erreicht. Capital konstatiert: +Auch beim Service und der Managementqualität liegt die Gesellschaft weit vorn. +(Quelle: Capital Heft 3/2015) +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug15.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug15.txt new file mode 100644 index 0000000000..2335a6df59 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug15.txt @@ -0,0 +1,76 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. November 2012 +Ertragsabrechnung Auszug: 1 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchung haben wir für Ihr Depot durchgeführt: +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 20.11.2012 +Anteilbestand am Ertragstermin: 6,190 +Ausschüttung (pro Anteil EUR 9,4500000): EUR 58,50 +Bezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 Auftragsnummer: 9307 0124 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2012 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 58,50 Kurs Bestand alt: 6,190 += Wiederanlagebetrag EUR 58,50 EUR 58,50 EUR 438,170000 Anteilumsatz: 0,134 +Bestand neu: 6,324 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn, Stückzinsen und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 450,97 +Anrechenbare ausländische Quellensteuer EUR 6,17 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente, +Deka-ZukunftsPlan und Deka-RenteDirekt sind in der Ansparphase abgeltungsteuerfrei. Die Leistungen +werden in der Regel erst in der Auszahlphase als sog. Sonstige Einkünfte versteuert. Leistungen, die auf +geförderten Beiträgen beruhen, werden in der Auszahlungsphase voll besteuert (persönlicher Steuersatz). +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 1 / Seite 2 von 3 + +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu Ihrer Geldanlage. Nutzen Sie die Chance, mit dem Deka-FondsSparplan Ihre persönlichen Anlageziele noch +leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Ausgabeaufschlag¹: 5,260 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug16.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug16.txt new file mode 100644 index 0000000000..8ae456b6d5 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug16.txt @@ -0,0 +1,78 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße IBAN: +Musterstraße 7 DE07793517300000111111 +11111 Stadt BIC: BYLADEM1HAS +Spk Ostunterfranken +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +21. Februar 2014 +Ertragsabrechnung Auszug: 1 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchung haben wir für Ihr Depot durchgeführt: +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 21.02.2014 +Anteilbestand am Ertragstermin: 34,746 +Ausschüttung (pro Anteil EUR 0,7800000): EUR 27,10 +Bezeichnung: AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 Auftragsnummer: 9398 1226 +Verwahrart: GiroSammel Abrechnungstag: 21.02.2014 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 27,10 Kurs Bestand alt: 34,746 += Wiederanlagebetrag EUR 27,10 EUR 27,10 EUR 60,030000 Anteilumsatz: 0,451 +Bestand neu: 35,197 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn, Stückzinsen und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 566,26 +Anrechenbare ausländische Quellensteuer EUR 1,30 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente, +Deka-ZukunftsPlan und Deka-RenteDirekt sind in der Ansparphase abgeltungsteuerfrei. Die Leistungen +werden in der Regel erst in der Auszahlphase als sog. Sonstige Einkünfte versteuert. Leistungen, die auf +geförderten Beiträgen beruhen, werden in der Auszahlungsphase voll besteuert (persönlicher Steuersatz). +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 1 / Seite 2 von 3 + +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu einer Geldanlage. Der Deka-FondsSparplan bietet die Chance, persönliche Anlageziele noch leichter und +flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Stammbankverbindung: IBAN: DE01111111100000111111 (Konto-Nr.: 0000111111) BIC: BYLADEM1HAS +(BLZ: 793 517 30) Spk Ostunterfranken +Fondsbezeichnung: AriDeka CF +ISIN: DE0008474511 Ausgabeaufschlag¹: 5,260 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug17.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug17.txt new file mode 100644 index 0000000000..1be7c613f4 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug17.txt @@ -0,0 +1,77 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Richard Mustermann +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +22. November 2010 +Ertragsausschüttung Auszug: 3 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchung haben wir für Ihr Depot durchgeführt: +ERTRAGSABRECHNUNG +Am 22.11.2010 fand die Ertragsausschüttung des DekaLux-Pazifik statt. Der Ausschüttungsbetrag pro Anteil +beträgt EUR 4,5600000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 6,032 Anteilen zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Unterkonto: 00 Auftragsnummer: 9306 3038 +Verwahrart: GiroSammel Abrechnungstag: 22.11.2010 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 27,51 Preis Bestand alt: 6,032 += Wiederanlagebetrag EUR 27,51 EUR 27,51 EUR 470,850000 Anteilumsatz: 0,058 +Bestand neu: 6,090 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 461,57 +Anrechenbare ausländische Quellensteuer EUR 6,54 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungsteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 3 / Seite 2 von 3 + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu Ihrer Geldanlage. Nutzen Sie die Chance, mit dem Deka-FondsSparplan Ihre persönlichen Anlageziele noch +leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Ausgabeaufschlag¹: 5,260 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug18.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug18.txt new file mode 100644 index 0000000000..e0894753b7 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug18.txt @@ -0,0 +1,103 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Richard Mustermann +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +19. August 2011 +Ertragsausschüttungen Auszug: 1 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSABRECHNUNG +Am 19.08.2011 fand die Ertragsausschüttung des Deka-LiquiditätsPlan TF statt. Der Ausschüttungsbetrag pro +Anteil beträgt EUR 12,2000000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 1,023 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilbestand aus. +Fondsbezeichnung: Deka-LiquiditätsPlan TF +ISIN: LU0268059614 Unterdepot: 00 Auftragsnummer: 9309 1751 +Verwahrart: GiroSammel Abrechnungstag: 19.08.2011 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 12,48 Preis Bestand alt: 1,023 += Wiederanlagebetrag EUR 12,48 EUR 12,48 EUR 983,890000 Anteilumsatz: 0,013 +Zwischengewinn Bestand neu: 1,036 +EUR 3,420000 + +Wichtige Information: +Der Fonds Deka-GeldmarktPlan TF (LU0268059614) wurde mit Wirkung zum 01.07.2011 in +Deka-LiquiditätsPlan TF umbenannt. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 1 / Seite 2 von 3 +ERTRAGSABRECHNUNG +Am 19.08.2011 fand die Ertragsausschüttung des Deka-EuropaBond TF statt. Der Ausschüttungsbetrag pro +Anteil beträgt EUR 1,1500000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 52,202 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilbestand aus. +Fondsbezeichnung: Deka-EuropaBond TF +ISIN: DE0009771980 Unterdepot: 00 Auftragsnummer: 9322 8046 +Verwahrart: GiroSammel Abrechnungstag: 19.08.2011 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 60,03 Preis Bestand alt: 52,202 += Wiederanlagebetrag EUR 60,03 EUR 60,03 EUR 38,000000 Anteilumsatz: 1,580 +Zwischengewinn Bestand neu: 53,782 +EUR 0,300000 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,47 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 511,81 +Anrechenbare ausländische Quellensteuer EUR 0,92 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungsteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Bestens informiert. Mit dem Deka-FondsNewsletter. +Mit dem Deka-FondsNewsletter informieren wir Sie monatlich aktuell per E-Mail rund um das Thema Deka +Investmentfonds - kostenlos und unverbindlich. +Melden Sie sich einfach unter www.deka.de/fondsnewsletter an. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu Ihrer Geldanlage. Nutzen Sie die Chance, mit dem Deka-FondsSparplan Ihre persönlichen Anlageziele noch +leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: Deka-LiquiditätsPlan TF +ISIN: LU0268059614 Ausgabeaufschlag¹: 0,000 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug19.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug19.txt new file mode 100644 index 0000000000..440c338df6 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug19.txt @@ -0,0 +1,116 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße IBAN: +Frankenweg 7 DE07793517300000111111 +11111 Stadt BIC: BYLADEM1HAS +Spk Ostunterfranken +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +19. November 2015 +Ertragsabrechnungen Auszug: 3 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 19.11.2015 +Anteilbestand am Ertragstermin: 15,279 +Ausschüttung (pro Anteil EUR 0,9800000): EUR 14,97 +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 Auftragsnummer: 9410 2301 +Verwahrart: GiroSammel Abrechnungstag: 19.11.2015 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 14,97 Kurs Bestand alt: 15,279 += Wiederanlagebetrag EUR 14,97 EUR 14,97 EUR 122,300000 Anteilumsatz: 0,122 +Bestand neu: 15,401 +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 19.11.2015 +Anteilbestand am Ertragstermin: 5,888 +Ausschüttung (pro Anteil EUR 0,9800000): EUR 5,77 +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 Auftragsnummer: 9410 2302 +Verwahrart: GiroSammel Abrechnungstag: 19.11.2015 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 5,77 Kurs Bestand alt: 5,888 += Wiederanlagebetrag EUR 5,77 EUR 5,77 EUR 122,300000 Anteilumsatz: 0,047 +Bestand neu: 5,935 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 3 / Seite 2 von 3 +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 19.11.2015 +Anteilbestand am Ertragstermin: 6,558 +Ausschüttung (pro Anteil EUR 5,9100000): EUR 38,76 +Bezeichnung: DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 Auftragsnummer: 9412 4474 +Verwahrart: GiroSammel Abrechnungstag: 19.11.2015 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 38,76 Kurs Bestand alt: 6,558 += Wiederanlagebetrag EUR 38,76 EUR 38,76 EUR 529,490000 Anteilumsatz: 0,073 +Bestand neu: 6,631 +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 19.11.2015 +Anteilbestand am Ertragstermin: 33,486 +Ausschüttung (pro Anteil EUR 1,6200000): EUR 54,25 +Bezeichnung: DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 Auftragsnummer: 9413 5783 +Verwahrart: GiroSammel Abrechnungstag: 19.11.2015 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 54,25 Kurs Bestand alt: 33,486 += Wiederanlagebetrag EUR 54,25 EUR 54,25 EUR 118,600000 Anteilumsatz: 0,457 +Bestand neu: 33,943 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn, Stückzinsen und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 255,39 +Anrechenbare ausländische Quellensteuer EUR 24,38 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente, +Deka-ZukunftsPlan und Deka-RenteDirekt sind in der Ansparphase abgeltungsteuerfrei. Die Leistungen +werden in der Regel erst in der Auszahlphase als sog. Sonstige Einkünfte versteuert. Leistungen, die auf +geförderten Beiträgen beruhen, werden in der Auszahlungsphase voll besteuert (persönlicher Steuersatz). +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 3 / Seite 3 von 3 + +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Capital-Fonds-Kompass 2015 +Das Wirtschaftsmagazin Capital hat die Deka zum dritten Mal in Folge mit der Höchstnote von fünf Sternen +ausgezeichnet. Im "Capital-Fonds-Kompass" verbesserte die Deka das gute Vorjahresergebnis leicht auf 77,1 +Punkte und platzierte sich im Ranking der Universalanbieter auf Platz 7 (von 59). In allen Kategorien konnte +die Deka an die sehr guten Ergebnisse der Vorjahre anknüpfen. Mit 166 getesteten Fonds und der damit +zweitgrößten Angebotspalette wurde hier die Höchstpunktzahl von 10 Punkten erreicht. Capital konstatiert: +Auch beim Service und der Managementqualität liegt die Gesellschaft weit vorn. +(Quelle: Capital Heft 3/2015) +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug20.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug20.txt new file mode 100644 index 0000000000..f5e3ebd5aa --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug20.txt @@ -0,0 +1,85 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße IBAN: +Frankenweg 7 DE07793517300000111111 +11111 Stadt BIC: BYLADEM1HAS +Spk Ostunterfranken +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. Februar 2015 +Ertragsabrechnungen Auszug: 1 / Seite 1 von 2 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 20.02.2015 +Anteilbestand am Ertragstermin: 35,197 +Ausschüttung (pro Anteil EUR 2,2000000): EUR 77,43 +Bezeichnung: AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 Auftragsnummer: 9401 1742 +Verwahrart: GiroSammel Abrechnungstag: 20.02.2015 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 77,43 Kurs Bestand alt: 35,197 += Wiederanlagebetrag EUR 77,43 EUR 77,43 EUR 68,210000 Anteilumsatz: 1,135 +Bestand neu: 36,332 +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 20.02.2015 +Anteilbestand am Ertragstermin: 36,045 +Ausschüttung (pro Anteil EUR 0,3300000): EUR 11,89 +Bezeichnung: Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 Auftragsnummer: 9426 3111 +Verwahrart: GiroSammel Abrechnungstag: 20.02.2015 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 11,89 Kurs Bestand alt: 36,045 += Wiederanlagebetrag EUR 11,89 EUR 11,89 EUR 100,570000 Anteilumsatz: 0,118 +Bestand neu: 36,163 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 1 / Seite 2 von 2 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn, Stückzinsen und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 519,33 +Anrechenbare ausländische Quellensteuer EUR 1,47 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente, +Deka-ZukunftsPlan und Deka-RenteDirekt sind in der Ansparphase abgeltungsteuerfrei. Die Leistungen +werden in der Regel erst in der Auszahlphase als sog. Sonstige Einkünfte versteuert. Leistungen, die auf +geförderten Beiträgen beruhen, werden in der Auszahlungsphase voll besteuert (persönlicher Steuersatz). +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Capital Award 2014 + +Höchstnote! Die Deka wurde vom Wirtschaftsmagazin Capital ausgezeichnet. Von 57 +Fonds-Universalanbietern bekamen nur die Deka und fünf weitere fünf Sterne und den Titel +Top-Fondsgesellschaft. Fragen Sie Ihren Berater nach weiteren Investmentfondslösungen der Deka (Quelle: +Capital Heft 3/2014). + +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug21.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug21.txt new file mode 100644 index 0000000000..301e11e11b --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug21.txt @@ -0,0 +1,100 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Richard Mustermann +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. August 2010 +Ertragsausschüttungen Auszug: 2 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSABRECHNUNG +Am 20.08.2010 fand die Ertragsausschüttung des Deka-GeldmarktPlan TF statt. Der Ausschüttungsbetrag pro +Anteil beträgt EUR 9,8000000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 1,013 Anteilen zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 9309 2789 +Verwahrart: GiroSammel Abrechnungstag: 20.08.2010 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 9,93 Preis Bestand alt: 1,013 += Wiederanlagebetrag EUR 9,93 EUR 9,93 EUR 990,310000 Anteilumsatz: 0,010 +Zwischengewinn Bestand neu: 1,023 +EUR 0,130000 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 2 von 3 +ERTRAGSABRECHNUNG +Am 20.08.2010 fand die Ertragsausschüttung des Deka-EuropaBond TF statt. Der Ausschüttungsbetrag pro +Anteil beträgt EUR 1,3100000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 50,506 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: Deka-EuropaBond TF +ISIN: DE0009771980 Unterkonto: 00 Auftragsnummer: 9324 0160 +Verwahrart: GiroSammel Abrechnungstag: 20.08.2010 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 66,16 Preis Bestand alt: 50,506 += Wiederanlagebetrag EUR 66,16 EUR 66,16 EUR 39,000000 Anteilumsatz: 1,696 +Zwischengewinn Bestand neu: 52,202 +EUR 0,240000 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,41 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 497,61 +Anrechenbare ausländische Quellensteuer EUR 1,97 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungsteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Ausgezeichnet: Die hervorragende Arbeit des Deka-Rentenfondsmanagements wurde im April 2010 nun +auch bei den Morningstar Fund Awards gewürdigt. Im Rahmen der diesjährigen Preisverleihung wurde der +DekaBank-Konzern als beste große Rentenfondsgesellschaft Deutschlands ausgezeichnet. In den +Betrachtungszeitraum ist die Wertentwicklung der letzten 5 Jahre eingeflossen. Weitere Informationen hierzu +erhalten Sie in der Handelsblatt-Ausgabe vom 16.04.2010 bzw. unter www.deka.de + +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu Ihrer Geldanlage. Nutzen Sie die Chance, mit dem Deka-FondsSparplan Ihre persönlichen Anlageziele noch +leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Ausgabeaufschlag¹: 0,000 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug22.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug22.txt new file mode 100644 index 0000000000..72dbaabd1f --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug22.txt @@ -0,0 +1,106 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. November 2009 +Ertragsausschüttungen Auszug: 6 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSABRECHNUNG +Am 20.11.2009 fand die Ertragsausschüttung des DekaLux-Pazifik statt. Der Ausschüttungsbetrag pro Anteil +beträgt EUR 6,4500000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 5,934 Anteilen zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Unterkonto: 00 Auftragsnummer: 9308 3980 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 38,27 Preis Bestand alt: 5,934 += Wiederanlagebetrag EUR 38,27 EUR 38,27 EUR 389,640000 Anteilumsatz: 0,098 +Bestand neu: 6,032 +ERTRAGSABRECHNUNG +Am 20.11.2009 fand die Ertragsausschüttung des DekaLux-Deutschland TF A statt. Der Ausschüttungsbetrag +pro Anteil beträgt EUR 0,1000000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 32,324 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilsumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilsbestand aus. +Fondsbezeichnung: DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterkonto: 00 Auftragsnummer: 9310 4730 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2009 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 3,23 Preis Bestand alt: 32,324 += Wiederanlagebetrag EUR 3,23 EUR 3,23 EUR 68,740000 Anteilumsatz: 0,047 +Bestand neu: 32,371 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 6 / Seite 2 von 3 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 436,92 +Anrechenbare ausländische Quellensteuer EUR 8,00 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungsteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Die DekaBank informiert: + +Der jährliche Depotpreis, anfallende Vertragspreise und evtl. weitere Gebühren werden 2009 erstmals von +Ihrer Stammbankverbindung eingezogen (siehe Information zur AGB Änderung im Oktober 2008). + + +Deka ist "Top-Fondsgesellschaft" + +Die Höchstnote von 5 Sternen wurde der Deka bei einer +Preisverleihung des Wirtschaftsmagazins "Capital" im Januar +2009 verliehen. + +Capital untersuchte dabei 100 Fondsgesellschaften nach +Lückenlosigkeit der Produktpalette, Fondsqualität, Management +und Service. Von diesen erhielten lediglich 8 weitere Anbieter die +Bestnote. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu Ihrer Geldanlage. Nutzen Sie die Chance, mit dem Deka-FondsSparplan Ihre persönlichen Anlageziele noch +leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Ausgabeaufschlag¹: 5,260 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug23.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug23.txt new file mode 100644 index 0000000000..4c436c47cd --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug23.txt @@ -0,0 +1,88 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. November 2013 +Ertragsabrechnungen Auszug: 1 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 20.11.2013 +Anteilbestand am Ertragstermin: 6,324 +Ausschüttung (pro Anteil EUR 8,9700000): EUR 56,73 +Bezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 Auftragsnummer: 9405 8250 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2013 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 56,73 Kurs Bestand alt: 6,324 += Wiederanlagebetrag EUR 56,73 EUR 56,73 EUR 455,640000 Anteilumsatz: 0,125 +Bestand neu: 6,449 +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 20.11.2013 +Anteilbestand am Ertragstermin: 32,445 +Ausschüttung (pro Anteil EUR 1,6300000): EUR 52,89 +Bezeichnung: DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 Auftragsnummer: 9406 3275 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2013 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 52,89 Kurs Bestand alt: 32,445 += Wiederanlagebetrag EUR 52,89 EUR 52,89 EUR 102,220000 Anteilumsatz: 0,517 +Bestand neu: 32,962 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 1 / Seite 2 von 3 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn, Stückzinsen und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 452,58 +Anrechenbare ausländische Quellensteuer EUR 5,74 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente, +Deka-ZukunftsPlan und Deka-RenteDirekt sind in der Ansparphase abgeltungsteuerfrei. Die Leistungen +werden in der Regel erst in der Auszahlphase als sog. Sonstige Einkünfte versteuert. Leistungen, die auf +geförderten Beiträgen beruhen, werden in der Auszahlungsphase voll besteuert (persönlicher Steuersatz). +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu einer Geldanlage. Der Deka-FondsSparplan bietet die Chance, persönliche Anlageziele noch leichter und +flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Ausgabeaufschlag¹: 5,260 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug24.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug24.txt new file mode 100644 index 0000000000..2c1ce93e0a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug24.txt @@ -0,0 +1,115 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße IBAN: +Frankenweg 7 DE07793517300000111111 +11111 Stadt BIC: BYLADEM1HAS +Spk Ostunterfranken +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. November 2014 +Ertragsabrechnungen Auszug: 2 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 20.11.2014 +Anteilbestand am Ertragstermin: 15,216 +Ausschüttung (pro Anteil EUR 0,5400000): EUR 8,22 +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 Auftragsnummer: 9406 3036 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2014 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 8,22 Kurs Bestand alt: 15,216 += Wiederanlagebetrag EUR 8,22 EUR 8,22 EUR 130,550000 Anteilumsatz: 0,063 +Bestand neu: 15,279 +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 20.11.2014 +Anteilbestand am Ertragstermin: 5,864 +Ausschüttung (pro Anteil EUR 0,5400000): EUR 3,17 +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 Auftragsnummer: 9406 3037 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2014 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 3,17 Kurs Bestand alt: 5,864 += Wiederanlagebetrag EUR 3,17 EUR 3,17 EUR 130,550000 Anteilumsatz: 0,024 +Bestand neu: 5,888 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 2 von 3 +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 20.11.2014 +Anteilbestand am Ertragstermin: 6,449 +Ausschüttung (pro Anteil EUR 8,2400000): EUR 53,14 +Bezeichnung: DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 Auftragsnummer: 9407 8611 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2014 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 53,14 Kurs Bestand alt: 6,449 += Wiederanlagebetrag EUR 53,14 EUR 53,14 EUR 485,620000 Anteilumsatz: 0,109 +Bestand neu: 6,558 +ERTRAGSAUSSCHÜTTUNG +Ertragstermin: 20.11.2014 +Anteilbestand am Ertragstermin: 32,962 +Ausschüttung (pro Anteil EUR 1,6000000): EUR 52,74 +Bezeichnung: DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 Auftragsnummer: 9408 5425 +Verwahrart: GiroSammel Abrechnungstag: 20.11.2014 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten B estandsdaten +des Wertpapiers je Anteil in Stück + Ausschüttung EUR 52,74 Kurs Bestand alt: 32,962 += Wiederanlagebetrag EUR 52,74 EUR 52,74 EUR 100,700000 Anteilumsatz: 0,524 +Bestand neu: 33,486 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn, Stückzinsen und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 411,05 +Anrechenbare ausländische Quellensteuer EUR 13,82 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente, +Deka-ZukunftsPlan und Deka-RenteDirekt sind in der Ansparphase abgeltungsteuerfrei. Die Leistungen +werden in der Regel erst in der Auszahlphase als sog. Sonstige Einkünfte versteuert. Leistungen, die auf +geförderten Beiträgen beruhen, werden in der Auszahlungsphase voll besteuert (persönlicher Steuersatz). +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 3 von 3 + +Capital Award 2014 + +Höchstnote! Die Deka wurde vom Wirtschaftsmagazin Capital ausgezeichnet. Von 57 +Fonds-Universalanbietern bekamen nur die Deka und fünf weitere fünf Sterne und den Titel +Top-Fondsgesellschaft. Fragen Sie Ihren Berater nach weiteren Investmentfondslösungen der Deka (Quelle: +Capital Heft 3/2014). + +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug25.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug25.txt new file mode 100644 index 0000000000..ba768dc8b4 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug25.txt @@ -0,0 +1,96 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Stadt BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Richard Mustermann +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +21. November 2011 +Ertragsausschüttungen Auszug: 2 / Seite 1 von 3 + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +ERTRAGSABRECHNUNG +Am 21.11.2011 fand die Ertragsausschüttung des DekaLux-Pazifik statt. Der Ausschüttungsbetrag pro Anteil +beträgt EUR 6,3600000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 6,090 Anteilen zugrunde. +Bitte beachten Sie: Weitere Anteilumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilbestand aus. +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Unterdepot: 00 Auftragsnummer: 9404 4323 +Verwahrart: GiroSammel Abrechnungstag: 21.11.2011 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 38,73 Preis Bestand alt: 6,090 += Wiederanlagebetrag EUR 38,73 EUR 38,73 EUR 387,930000 Anteilumsatz: 0,100 +Bestand neu: 6,190 +ERTRAGSABRECHNUNG +Am 21.11.2011 fand die Ertragsausschüttung des DekaLux-Deutschland TF A statt. Der Ausschüttungsbetrag +pro Anteil beträgt EUR 0,1500000. Ihrer Ertragsausschüttung lag ein Anteilbestand von 32,371 Anteilen +zugrunde. +Bitte beachten Sie: Weitere Anteilumsätze können den "Bestand alt" verändert haben. Diese Abrechnung +weist Ihnen den aktuellen Anteilbestand aus. +Fondsbezeichnung: DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 Auftragsnummer: 9405 0501 +Verwahrart: GiroSammel Abrechnungstag: 21.11.2011 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Ausschüttung EUR 4,86 Preis Bestand alt: 32,371 += Wiederanlagebetrag EUR 4,86 EUR 4,86 EUR 65,340000 Anteilumsatz: 0,074 +Bestand neu: 32,445 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 2 von 3 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 458,19 +Anrechenbare ausländische Quellensteuer EUR 5,18 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungsteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Eine evtl. Meldepflicht nach § 59ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Bestens informiert. Mit dem Deka-FondsNewsletter. +Mit dem Deka-FondsNewsletter informieren wir Sie monatlich aktuell per E-Mail rund um das Thema Deka +Investmentfonds - kostenlos und unverbindlich. +Melden Sie sich einfach unter www.deka.de/fondsnewsletter an. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Sehr geehrte Kundin, sehr geehrter Kunde, +regelmäßiges Sparen ist die Grundlage für einen zielgerichteten Vermögensaufbau. Und die ideale Ergänzung +zu Ihrer Geldanlage. Nutzen Sie die Chance, mit dem Deka-FondsSparplan Ihre persönlichen Anlageziele noch +leichter und flexibler zu erreichen - mit einer monatlichen Sparrate schon ab 25 Euro und einem individuellen +Zahlungsrhythmus. Wenn Sie Ihren Deka-FondsSparplan erhöhen oder mit einem neuen Deka-FondsSparplan +regelmäßig sparen möchten, senden Sie diesen Auftrag ausgefüllt an uns zurück. Mit der Zusendung unserer +Bestätigung ist Ihr Sparplan automatisch eingerichtet. +Depotnummer: 0111111111 +Depotinhaber: Richard Mustermann +Generelle Bankverbindung: Konto: 0000111111 BLZ: 793 517 30 Spk Ostunterfranken +Fondsbezeichnung: DekaLux-Pazifik +ISIN: LU0052859252 Ausgabeaufschlag¹: 5,260 % diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug26.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug26.txt new file mode 100644 index 0000000000..1ab8f3f332 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug26.txt @@ -0,0 +1,255 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann +Stöckach Bankverbindung generell:IBAN: +Frankenweg 7 DExx xxx5 0101 xxxx xxx7 81 +97494 Bundorf Spk Schweinfurt-Haßberge +Kontoinhaber: +Mustermann, Richard +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +20. März 2020 +Verkäufe von Wertpapieren Auszug: 2 / Seite 1 von 6 +Auslieferungen von Wertpapieren +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +AUSLIEFERUNG +Ihrem Auftrag entsprechend haben wir Ihre Wertpapiere auf Depot: 1001111111 Depotinhaber: Richard Mustermann +bei der flatex Bank übertragen. +Bezeichnung: DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 Auftragsnummer: 8101 8357 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Bestand alt: 16,882 +Anteilumsatz: -16,000 +Bestand neu: 0,882 +Bitte beachten Sie, dass nur ganze Stücke übertragen werden können. Eventuell vorhandene Bruchstücke +werden wir, sofern Sie uns hierzu einen Auftrag erteilt haben, verkaufen und den Erlös zu Gunsten der von +Ihnen angegebenen Bankverbindung überweisen. +VERKAUF +Bankverbindung: IBAN: DE49 1011 0110 1001 1111 11 +Kontoinhaber: Mustermann,Richard +flatex Bank +Bezeichnung: DekaLux-PharmaTech TF +ISIN: LU0348413815 Unterdepot: 00 Auftragsnummer: 8101 8358 +Verwahrart: GiroSammel Abrechnungstag: 19.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Auszahlungsbetrag EUR 232,27 Kurs Bestand alt: 0,882 +=Abrechnungsbetrag EUR 232,27 EUR 232,27 EUR 263,350000 Anteilumsatz: -0,882 +Bestand neu: 0,000 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 2 von 6 +AUSLIEFERUNG +Ihrem Auftrag entsprechend haben wir Ihre Wertpapiere auf Depot: 1001111111 Depotinhaber: Richard Mustermann +bei der flatex Bank übertragen. +Bezeichnung: AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 Auftragsnummer: 8102 9562 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Bestand alt: 40,388 +Anteilumsatz: -40,000 +Bestand neu: 0,388 +Bitte beachten Sie, dass nur ganze Stücke übertragen werden können. Eventuell vorhandene Bruchstücke +werden wir, sofern Sie uns hierzu einen Auftrag erteilt haben, verkaufen und den Erlös zu Gunsten der von +Ihnen angegebenen Bankverbindung überweisen. +VERKAUF +Bankverbindung: IBAN: DE49 1011 0110 1001 1111 11 +Kontoinhaber: Mustermann,Richard +flatex Bank +Bezeichnung: AriDeka CF +ISIN: DE0008474511 Unterdepot: 00 Auftragsnummer: 8102 9563 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Auszahlungsbetrag EUR 18,49 Kurs Bestand alt: 0,388 +=Abrechnungsbetrag EUR 18,49 EUR 18,49 EUR 47,650000 Anteilumsatz: -0,388 +Bestand neu: 0,000 +AUSLIEFERUNG +Ihrem Auftrag entsprechend haben wir Ihre Wertpapiere auf Depot: 1001111111 Depotinhaber: Richard Mustermann +bei der flatex Bank übertragen. +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 Auftragsnummer: 8103 0560 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Bestand alt: 15,952 +Anteilumsatz: -15,000 +Bestand neu: 0,952 +Bitte beachten Sie, dass nur ganze Stücke übertragen werden können. Eventuell vorhandene Bruchstücke +werden wir, sofern Sie uns hierzu einen Auftrag erteilt haben, verkaufen und den Erlös zu Gunsten der von +Ihnen angegebenen Bankverbindung überweisen. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 3 von 6 +VERKAUF +Bankverbindung: IBAN: DE49 1011 0110 1001 1111 11 +Kontoinhaber: Mustermann,Richard +flatex Bank +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 00 Auftragsnummer: 8103 0561 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Auszahlungsbetrag EUR 110,18 Kurs Bestand alt: 0,952 +=Abrechnungsbetrag EUR 110,18 EUR 110,18 EUR 115,740000 Anteilumsatz: -0,952 +Bestand neu: 0,000 +AUSLIEFERUNG +Ihrem Auftrag entsprechend haben wir Ihre Wertpapiere auf Depot: 1001111111 Depotinhaber: Richard Mustermann +bei der flatex Bank übertragen. +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 Auftragsnummer: 8103 0562 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Bestand alt: 6,148 +Anteilumsatz: -6,000 +Bestand neu: 0,148 +Bitte beachten Sie, dass nur ganze Stücke übertragen werden können. Eventuell vorhandene Bruchstücke +werden wir, sofern Sie uns hierzu einen Auftrag erteilt haben, verkaufen und den Erlös zu Gunsten der von +Ihnen angegebenen Bankverbindung überweisen. +VERKAUF +Bankverbindung: IBAN: DE49 1011 0110 1001 1111 11 +Kontoinhaber: Mustermann,Richard +flatex Bank +Bezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterdepot: 01 Auftragsnummer: 8103 0563 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Auszahlungsbetrag EUR 17,13 Kurs Bestand alt: 0,148 +=Abrechnungsbetrag EUR 17,13 EUR 17,13 EUR 115,740000 Anteilumsatz: -0,148 +Bestand neu: 0,000 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 4 von 6 +AUSLIEFERUNG +Ihrem Auftrag entsprechend haben wir Ihre Wertpapiere auf Depot: 1001111111 Depotinhaber: Richard Mustermann +bei der flatex Bank übertragen. +Bezeichnung: DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 Auftragsnummer: 8103 0608 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Bestand alt: 6,854 +Anteilumsatz: -6,000 +Bestand neu: 0,854 +Bitte beachten Sie, dass nur ganze Stücke übertragen werden können. Eventuell vorhandene Bruchstücke +werden wir, sofern Sie uns hierzu einen Auftrag erteilt haben, verkaufen und den Erlös zu Gunsten der von +Ihnen angegebenen Bankverbindung überweisen. +VERKAUF +Bankverbindung: IBAN: DE49 1011 0110 1001 1111 11 +Kontoinhaber: Mustermann,Richard +flatex Bank +Bezeichnung: DekaLuxTeam-Aktien Asien +ISIN: LU0052859252 Unterdepot: 00 Auftragsnummer: 8103 0609 +Verwahrart: GiroSammel Abrechnungstag: 19.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Auszahlungsbetrag EUR 494,76 Kurs Bestand alt: 0,854 +=Abrechnungsbetrag EUR 494,76 EUR 494,76 EUR 579,350000 Anteilumsatz: -0,854 +Bestand neu: 0,000 +AUSLIEFERUNG +Ihrem Auftrag entsprechend haben wir Ihre Wertpapiere auf Depot: 1001111111 Depotinhaber: Richard Mustermann +bei der flatex Bank übertragen. +Bezeichnung: DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 Auftragsnummer: 8103 1684 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Bestand alt: 34,726 +Anteilumsatz: -34,000 +Bestand neu: 0,726 +Bitte beachten Sie, dass nur ganze Stücke übertragen werden können. Eventuell vorhandene Bruchstücke +werden wir, sofern Sie uns hierzu einen Auftrag erteilt haben, verkaufen und den Erlös zu Gunsten der von +Ihnen angegebenen Bankverbindung überweisen. +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 5 von 6 +VERKAUF +Bankverbindung: IBAN: DE49 1011 0110 1001 1111 11 +Kontoinhaber: Mustermann,Richard +flatex Bank +Bezeichnung: DekaLux-Deutschland TF A +ISIN: LU0062624902 Unterdepot: 00 Auftragsnummer: 8103 1685 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Auszahlungsbetrag EUR 58,09 Kurs Bestand alt: 0,726 +=Abrechnungsbetrag EUR 58,09 EUR 58,09 EUR 80,020000 Anteilumsatz: -0,726 +Bestand neu: 0,000 +AUSLIEFERUNG +Ihrem Auftrag entsprechend haben wir Ihre Wertpapiere auf Depot: 1001111111 Depotinhaber: Richard Mustermann +bei der flatex Bank übertragen. +Bezeichnung: Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 Auftragsnummer: 8103 3823 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Bestand alt: 37,901 +Anteilumsatz: -37,000 +Bestand neu: 0,901 +Bitte beachten Sie, dass nur ganze Stücke übertragen werden können. Eventuell vorhandene Bruchstücke +werden wir, sofern Sie uns hierzu einen Auftrag erteilt haben, verkaufen und den Erlös zu Gunsten der von +Ihnen angegebenen Bankverbindung überweisen. +VERKAUF +Bankverbindung: IBAN: DE49 1011 0110 1001 1111 11 +Kontoinhaber: Mustermann,Richard +flatex Bank +Bezeichnung: Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 Auftragsnummer: 8103 3824 +Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Auszahlungsbetrag EUR 79,92 Kurs Bestand alt: 0,901 +=Abrechnungsbetrag EUR 79,92 EUR 79,92 EUR 88,700000 Anteilumsatz: -0,901 +Bestand neu: 0,000 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 250,00. +Aktuelle steuerliche Daten +Stückzinsen und realisierte Veräußerungsverluste EUR 0,00 +(sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 173,03 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 2 / Seite 6 von 6 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis Ende Januar des Folgejahres erhalten. Die +erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und Deka-ZukunftsPlan sind +in der Ansparphase abgeltungsteuerfrei. Die Leistungen werden in der Regel erst in der Auszahlungsphase als +sog. Sonstige Einkünfte versteuert. Leistungen, die auf geförderten Beiträgen beruhen, werden in der +Auszahlungsphase voll versteuert (persönlicher Steuersatz). +Bitte prüfen Sie die vorliegenden Informationen. +Zu Ihrer persönlichen Anlagestrategie beraten Sie gern die Berater der Sparkasse Schweinfurt-Haßberge. +Dort erhalten Sie ebenfalls die aktuellen Verkaufsunterlagen und Dokumentationen mit den Details Ihrer +Vermögensanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: USt-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht DE 114103563 +60625 Frankfurt www.deka.de Frankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug27.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug27.txt new file mode 100644 index 0000000000..98ba1789b5 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug27.txt @@ -0,0 +1,84 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.62.1.qualifier +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0111111111 +Depotinhaber: +Herrn Richard Mustermann +Richard Mustermann Bankverbindung generell: +Musterstraße 9 Konto: 0000111111 +11111 Bundorf BLZ: 793 517 30 +Spk Ostunterfranken +Kontoinhaber: +Richard Mustermann +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +16. April 2010 +Verkauf wegen Tausch von Fondsanteilen Auszug: 1 / Seite 1 von 2 +Kauf aus Tausch von Fondsanteilen + +Sehr geehrter Herr Mustermann, +folgende Buchungen haben wir für Ihr Depot durchgeführt: +TAUSCH/VERKAUF erteilt per Deka.de - Internet +zu Gunsten +Fondsbezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterkonto: 01 +zu Lasten +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 8101 2363 +Verwahrart: GiroSammel Abrechnungstag: 16.04.2010 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Preis Bestand alt: 2,014 +Abrechnungsbetrag EUR 1.000,00 EUR 1.000,00 EUR 998,720000 Anteilumsatz: -1,001 +Zwischengewinn Bestand neu: 1,013 +EUR 4,890000 +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 +Depot: 0111111111 +Auszug: 1 / Seite 2 von 2 +TAUSCH/KAUF erteilt per Deka.de - Internet +zu Lasten +Fondsbezeichnung: Deka-GeldmarktPlan TF +ISIN: LU0268059614 Unterkonto: 00 +zu Gunsten +Fondsbezeichnung: Deka-ConvergenceAktien TF +ISIN: LU0133666759 Unterkonto: 01 Auftragsnummer: 8101 2364 +Verwahrart: GiroSammel Abrechnungstag: 16.04.2010 +Abrechnungsbetrag Abrechnungsbetrag Fondsdaten je Anteil B estandsdaten +in Fondswährung in Fondswährung in Stück + Preis Bestand alt: 0,000 +Abrechnungsbetrag EUR 1.000,00 EUR 1.000,00 EUR 170,520000 Anteilumsatz: 5,864 +Bestand neu: 5,864 +Ihr erteilter Sparer-Pauschbetrag für Richard Mustermann beträgt EUR 600,00. +Aktuelle steuerliche Daten +Gezahlter Zwischengewinn und realisierte E UR 0,00 +Veräußerungsverluste (sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 578,28 +Anrechenbare ausländische Quellensteuer EUR 1,52 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der Jahres- +Steuerbescheinigung des Jahresdepotauszuges übersandt, den Sie bis spätestens Ende Januar des Folgejahres +erhalten. Die erwirtschafteten Erträge der Vorsorgeprodukte Deka-BonusRente, Deka-BasisRente und +Deka-ZukunftsPlan sind in der Ansparphase abgeltungsteuerfrei. Diese werden erst in der Auszahlphase +steuerlich berücksichtigt! +Bitte prüfen Sie die vorliegenden Informationen. + +Zu Ihrer persönlichen Anlagestrategie mit Deka Investmentfonds und den Fonds unserer Kooperationspartner +beraten Sie gern die Berater der Sparkasse Ostunterfranken. + +Dort erhalten Sie ebenfalls den aktuellen Rechenschaftsbericht und Verkaufsprospekt mit den Details Ihrer +Fondsanlage. Diese Unterlagen können Sie auch bei uns anfordern oder über www.deka.de abrufen. + +Über Chancen, Risiken und Kosten der Anlage informiert Sie das Fondsporträt des jeweiligen Fonds. +Wünschen Sie aktuelle Informationen zu unseren Fonds, können Sie diese jederzeit im Internet über +www.deka.de aufrufen. +Mit freundlichen Grüßen +DekaBank +Deutsche Girozentrale +DekaBank Depotservice Telefon: (0 69) 71 47 - 6 52 Handelsregister: U St-Id-Nr.: +Deutsche Girozentrale DekaBank Depot Telefax: (0 69) 25 46 - 24 83 Amtsgericht D E 114103563 +60625 Frankfurt www.deka.de F rankfurt am Main +HRA 16068 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/util/TextUtilTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/util/TextUtilTest.java index 302aeda07e..8ea29b8fe0 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/util/TextUtilTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/util/TextUtilTest.java @@ -73,6 +73,13 @@ public void testStripBlanks() assertThat(TextUtil.stripBlanks(" a b c "), is("abc")); } + @Test + public void testReplaceMultipleBlanksBetween() + { + assertThat(TextUtil.replaceMultipleBlanks("a b c"), is("a b c")); + assertThat(TextUtil.replaceMultipleBlanks(" a b c "), is(" a b c ")); + } + @Test public void testStripBlanksAndUnderscores() { diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/DekaBankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/DekaBankPDFExtractor.java index 959377bb08..e3097a470b 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/DekaBankPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/DekaBankPDFExtractor.java @@ -1,12 +1,24 @@ package name.abuchen.portfolio.datatransfer.pdf; +import static name.abuchen.portfolio.datatransfer.ExtractorUtils.checkAndSetFee; import static name.abuchen.portfolio.datatransfer.ExtractorUtils.checkAndSetGrossUnit; + +import static name.abuchen.portfolio.util.TextUtil.replaceMultipleBlanks; +import static name.abuchen.portfolio.util.TextUtil.stripBlanks; import static name.abuchen.portfolio.util.TextUtil.trim; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; +import name.abuchen.portfolio.Messages; +import name.abuchen.portfolio.datatransfer.DocumentContext; import name.abuchen.portfolio.datatransfer.ExtrExchangeRate; import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block; import name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType; @@ -17,10 +29,13 @@ import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.money.CurrencyUnit; import name.abuchen.portfolio.money.Money; +import name.abuchen.portfolio.money.Values; @SuppressWarnings("nls") public class DekaBankPDFExtractor extends AbstractPDFExtractor { + private static final DateTimeFormatter DATEFORMAT = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + public DekaBankPDFExtractor(Client client) { super(client); @@ -32,6 +47,7 @@ public DekaBankPDFExtractor(Client client) addSwapSellTransaction(); addReinvestTransaction(); addDividendeTransaction(); + addDeliveryInOutBoundTransaction(); addDepotStatementTransaction(); } @@ -43,7 +59,7 @@ public String getLabel() private void addBuySellTransaction() { - DocumentType type = new DocumentType("(LASTSCHRIFTEINZUG|VERKAUF|KAUF AUS ERTRAG)"); + DocumentType type = new DocumentType("(LASTSCHRIFTEINZUG|VERKAUF|KAUF|KAUF AUS ERTRAG)"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -53,16 +69,16 @@ private void addBuySellTransaction() return entry; }); - Block firstRelevantLine = new Block("^(LASTSCHRIFTEINZUG|VERKAUF|KAUF AUS ERTRAG).*$"); + Block firstRelevantLine = new Block("^(LASTSCHRIFTEINZUG|VERKAUF|KAUF|KAUF AUS ERTRAG) .*$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); pdfTransaction // Is type --> "Verkauf" change from BUY to SELL .section("type").optional() - .match("^(?(LASTSCHRIFTEINZUG|VERKAUF|KAUF AUS ERTRAG)) .*$") + .match("^(?(LASTSCHRIFTEINZUG|VERKAUF|KAUF|KAUF AUS ERTRAG)).*$") .assign((t, v) -> { - if (v.get("type").equals("VERKAUF")) + if ("VERKAUF".equals(v.get("type"))) t.setType(PortfolioTransaction.Type.SELL); }) @@ -71,10 +87,14 @@ private void addBuySellTransaction() // Bezeichnung: Deka-UmweltInvest TF // ISIN: DE000DK0ECT0 Unterdepot: 00 Auftragsnummer: 8103 1017 // =Abrechnungsbetrag EUR 4.000,00 EUR 4.000,00 EUR 494,260000 Anteilumsatz: 8,093 + // + // Fondsbezeichnung: Deka-GeldmarktPlan TF + // ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 8101 2521 + // = Abrechnungsbetrag EUR 400,00 EUR 400,00 EUR 996,160000 Anteilumsatz: 0,402 // @formatter:on section -> section .attributes("name", "isin", "currency") - .match("^Bezeichnung: (?.*)$") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") .match("^.*(?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: (\\-)?[\\.,\\d]+$") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) @@ -87,9 +107,8 @@ private void addBuySellTransaction() // @formatter:on section -> section .attributes("name", "isin", "currency") - .match("^Bezeichnung: (?.*)$") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") - .find("Kurs(\\/Kaufpreis)?.*") .match("^(?[\\w]{3}) [\\.,\\d]+$") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) ) @@ -105,26 +124,36 @@ private void addBuySellTransaction() // @formatter:off // Verwahrart: GiroSammel Abrechnungstag: 18.05.2021 // Abrechnungstag: 14.10.2021 + // Verwahrart: GiroSammel Abrechnungstag: 1 4.12.2010 // @formatter:on .section("date") - .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> t.setDate(asDate(v.get("date")))) + .match("^.*Abrechnungstag: (?[\\d\\s]+\\.[\\d\\s]+\\.[\\d\\s]+)$") + .assign((t, v) -> t.setDate(asDate(stripBlanks(v.get("date"))))) // @formatter:off // Einzugsbetrag EUR 4.000,00 Kurs/Kaufpreis Bestand alt: 11,291 // Auszahlungsbetrag EUR 2.355,09 // Abrechnungsbetrag EUR 1,00 EUR 1,00 EUR 96,576000 Anteilumsatz: 0,010 + // Einzugsbetrag EUR 400,00 Preis Bestand alt: 1,612 // @formatter:on .section("currency", "amount") - .match("^(Einzugsbetrag|Auszahlungsbetrag|Abrechnungsbetrag) (?[\\w]{3}) (?[\\.,\\d]+).*$") + .match("^.*(Einzugsbetrag|Auszahlungsbetrag|Abrechnungsbetrag) (?[\\w]{3}) (?[\\.,\\d]+).*$") .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) + // @formatter:off + // ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 8101 2521 + // @formatter:on + .section("note").optional() + .match("^.* (?Auftragsnummer: .*)$") + .assign((t, v) -> t.setNote(trim(v.get("note")))) + .wrap(BuySellEntryItem::new); addTaxesSectionsTransaction(pdfTransaction, type); + addFeesSectionsTransaction(pdfTransaction, type); } private void addSwapBuyTransaction() @@ -154,10 +183,9 @@ private void addSwapBuyTransaction() // @formatter:on section -> section .attributes("name", "isin", "currency") - .find("^zu Gunsten$") - .match("^Bezeichnung: (?.*)$") + .find("zu Gunsten") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") - .find("Kurs(\\/Kaufpreis)?.*") .match("^(?[\\w]{3}) [\\.,\\d]+$") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) , @@ -170,10 +198,9 @@ private void addSwapBuyTransaction() // @formatter:on section -> section .attributes("name", "isin", "currency") - .find("^zu Gunsten$") - .match("^Bezeichnung: (?.*)$") + .find("zu Gunsten") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") - .find("Kurs(\\/Kaufpreis)?.*") .match("^Abrechnungsbetrag .* (?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: [\\.,\\d]+$") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) ) @@ -191,8 +218,8 @@ private void addSwapBuyTransaction() // Abrechnungstag: 06.06.2018 // @formatter:on .section("date") - .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> t.setDate(asDate(v.get("date")))) + .match("^.*Abrechnungstag: (?[\\d\\s]+\\.[\\d\\s]+\\.[\\d\\s]+)$") + .assign((t, v) -> t.setDate(asDate(stripBlanks(v.get("date"))))) // @formatter:off // Abrechnungsbetrag EUR 332,31 EUR 332,31 @@ -225,6 +252,13 @@ private void addSwapBuyTransaction() checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); }) + // @formatter:off + // ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 8101 2521 + // @formatter:on + .section("note").optional() + .match("^.* (?Auftragsnummer: .*)$") + .assign((t, v) -> t.setNote(trim(v.get("note")))) + .wrap(BuySellEntryItem::new); addTaxesSectionsTransaction(pdfTransaction, type); @@ -258,9 +292,8 @@ private void addSwapSellTransaction() section -> section .attributes("name", "isin", "currency") .find("zu Lasten") - .match("^Bezeichnung: (?.*)$") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") - .find("Kurs(\\/Kaufpreis)?.*") .match("^(?[\\w]{3}) [\\.,\\d]+$") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) , @@ -273,10 +306,9 @@ private void addSwapSellTransaction() // @formatter:on section -> section .attributes("name", "isin", "currency") - .find("^zu Lasten$") - .match("^Bezeichnung: (?.*)$") + .find("zu Lasten") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") - .find("Kurs(\\/Kaufpreis)?.*") .match("^Abrechnungsbetrag .* (?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: (\\-)?[\\.,\\d]+$") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) ) @@ -294,8 +326,8 @@ private void addSwapSellTransaction() // Abrechnungstag: 06.06.2018 // @formatter:on .section("date") - .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> t.setDate(asDate(v.get("date")))) + .match("^.*Abrechnungstag: (?[\\d\\s]+\\.[\\d\\s]+\\.[\\d\\s]+)$") + .assign((t, v) -> t.setDate(asDate(stripBlanks(v.get("date"))))) // @formatter:off // Auszahlungsbetrag EUR 206,74 @@ -308,6 +340,13 @@ private void addSwapSellTransaction() t.setAmount(asAmount(v.get("amount"))); }) + // @formatter:off + // ISIN: LU0268059614 Unterkonto: 00 Auftragsnummer: 8101 2521 + // @formatter:on + .section("note").optional() + .match("^.* (?Auftragsnummer: .*)$") + .assign((t, v) -> t.setNote(trim(v.get("note")))) + .wrap(BuySellEntryItem::new); addTaxesSectionsTransaction(pdfTransaction, type); @@ -315,7 +354,7 @@ private void addSwapSellTransaction() private void addReinvestTransaction() { - DocumentType type = new DocumentType("ERTRAGSAUSSCH.TTUNG \\/ KAUF AUS ERTRAG"); + DocumentType type = new DocumentType("(ERTRAGSAUSSCH.TTUNG \\/ KAUF AUS ERTRAG|ERTRAGSABRECHNUNG|ERTRAGSAUSSCH.TTUNG)"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -325,21 +364,36 @@ private void addReinvestTransaction() return entry; }); - Block firstRelevantLine = new Block("^ERTRAGSAUSSCH.TTUNG \\/ KAUF AUS ERTRAG$"); + Block firstRelevantLine = new Block("^(ERTRAGSAUSSCH.TTUNG \\/ KAUF AUS ERTRAG|ERTRAGSABRECHNUNG|ERTRAGSAUSSCH.TTUNG)$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); pdfTransaction - // @formatter:off - // Ausschüttung (pro Anteil EUR 2,3300000): EUR 78,81 - // Bezeichnung: Deka-EuropaPotential TF - // ISIN: DE0009786285 Unterdepot: 00 Auftragsnummer: 9457 2850 - // @formatter:on - .section("currency", "name", "isin") - .match("^Aussch.ttung .* (?[\\w]{3}) [\\.,\\d]+$") - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + .oneOf( + // @formatter:off + // Ausschüttung (pro Anteil EUR 2,3300000): EUR 78,81 + // Bezeichnung: Deka-EuropaPotential TF + // ISIN: DE0009786285 Unterdepot: 00 Auftragsnummer: 9457 2850 + // @formatter:on + section -> section + .attributes("currency", "name", "isin") + .match("^Aussch.ttung .* (?[\\w]{3}) [\\.,\\d]+$") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + , + // @formatter:off + // Fondsbezeichnung: AriDeka CF + // ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 9387 9103 + // +Verrechnete Steuern EUR 1,43 EUR 29,15 EUR 33,420000 Anteilumsatz: 0,872 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") + .match("^.*(?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: [\\.,\\d]+$") + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + ) // @formatter:off // - Verrechnete Steuern EUR 15,34 EUR 63,47 EUR 138,830000 Anteilumsatz: 0,457 @@ -352,13 +406,13 @@ private void addReinvestTransaction() // Verwahrart: GiroSammel Abrechnungstag: 24.02.2023 // @formatter:on .section("date") - .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> t.setDate(asDate(v.get("date")))) + .match("^.*Abrechnungstag: (?[\\d\\s]+\\.[\\d\\s]+\\.[\\d\\s]+)$") + .assign((t, v) -> t.setDate(asDate(stripBlanks(v.get("date"))))) // @formatter:off // =Wiederanlagebetrag EUR 63,47 Bestand neu: 34,280 // @formatter:on - .section("currency", "amount") + .section("currency", "amount").optional() .match("^.*Wiederanlagebetrag (?[\\w]{3}) (?[\\.,\\d]+).*$") .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); @@ -368,19 +422,35 @@ private void addReinvestTransaction() // @formatter:off // =Wiederanlagebetrag EUR 63,47 Bestand neu: 34,280 // @formatter:on - .section("note") - .match("^.*(?Wiederanlage).* [\\w]{3} [\\.,\\d]+.*$") + .section("note").optional() + .match("^.* (?Auftragsnummer: .*)$") .assign((t, v) -> t.setNote(trim(v.get("note")))) - .wrap(BuySellEntryItem::new); + // @formatter:off + // =Wiederanlagebetrag EUR 63,47 Bestand neu: 34,280 + // @formatter:on + .section("note").optional() + .match("^.*(?Wiederanlage).* [\\w]{3} [\\.,\\d]+.*$") + .assign((t, v) -> { + if (t.getNote() != null) + t.setNote(t.getNote() + " | " + trim(v.get("note"))); + else + t.setNote(trim(v.get("note"))); + }) + + .wrap(t -> { + if (t.getPortfolioTransaction().getCurrencyCode() != null && t.getPortfolioTransaction().getAmount() != 0) + return new BuySellEntryItem(t); + return null; + }); } private void addDividendeTransaction() { - DocumentType type = new DocumentType("ERTRAGSAUSSCH.TTUNG"); + DocumentType type = new DocumentType("(ERTRAGSAUSSCH.TTUNG|ERTRAGSABRECHNUNG)"); this.addDocumentTyp(type); - Block block = new Block("^ERTRAGSAUSSCH.TTUNG.*$"); + Block block = new Block("^(ERTRAGSAUSSCH.TTUNG|ERTRAGSABRECHNUNG).*$"); type.addBlock(block); Transaction pdfTransaction = new Transaction().subject(() -> { AccountTransaction entry = new AccountTransaction(); @@ -389,328 +459,1310 @@ private void addDividendeTransaction() }); pdfTransaction - // @formatter:off - // Ausschüttung (pro Anteil EUR 0,2292000): EUR 0,14 - // Bezeichnung: iShares J.P. Morgan USD EM Bond EUR Hedged UCITS ETF (Dist) - // ISIN: IE00B9M6RS56 Unterdepot: 00 Auftragsnummer: 9302 2538 - // @formatter:on - .section("currency", "name", "isin") - .match("^Aussch.ttung .* (?[\\w]{3}) [\\.,\\d]+$") - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + .oneOf( + // @formatter:off + // Ausschüttung (pro Anteil EUR 0,2292000): EUR 0,14 + // Bezeichnung: iShares J.P. Morgan USD EM Bond EUR Hedged UCITS ETF (Dist) + // ISIN: IE00B9M6RS56 Unterdepot: 00 Auftragsnummer: 9302 2538 + // @formatter:on + section -> section + .attributes("currency", "name", "isin") + .match("^Aussch.ttung .* (?[\\w]{3}) [\\.,\\d]+$") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + , + // @formatter:off + // Fondsbezeichnung: AriDeka CF + // ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 9387 9103 + // +Verrechnete Steuern EUR 1,43 EUR 29,15 EUR 33,420000 Anteilumsatz: 0,872 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") + .match("^.*(?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: [\\.,\\d]+$") + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + ) - // @formatter:off - // Anteilbestand am Ertragstermin: 0,619 - // @formatter:on - .section("shares") - .match("^Anteilbestand am Ertragstermin: (?[\\.,\\d]+)$") - .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + .oneOf( + // @formatter:off + // Anteilbestand am Ertragstermin: 0,619 + // @formatter:on + section -> section + .attributes("shares") + .match("^Anteilbestand am Ertragstermin: (?[\\.,\\d]+)$") + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + , + // @formatter:off + // Ausschüttung EUR 27,72 Preis Bestand alt: 29,811 + // @formatter:on + section -> section + .attributes("shares") + .match("^.* Bestand alt: (?[\\.,\\d]+)$") + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + ) // @formatter:off // Verwahrart: GiroSammel Abrechnungstag: 31.03.2022 // @formatter:on .section("date") - .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> t.setDateTime(asDate(v.get("date")))) + .match("^.*Abrechnungstag: (?[\\d\\s]+\\.[\\d\\s]+\\.[\\d\\s]+)$") + .assign((t, v) -> t.setDateTime(asDate(stripBlanks(v.get("date"))))) // @formatter:off // Ausschüttung EUR 0,14 Kurs Bestand alt: 0,739 + // Ausschüttung EUR 27,72 Preis Bestand alt: 29,811 // @formatter:on .section("currency", "amount") - .match("^Aussch.ttung (?[\\w]{3}) (?[.,\\d]+) .*$") + .match("^.*Aussch.ttung (?[\\w]{3}) (?[.,\\d]+) .*$") .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) + // @formatter:off // Ausschüttung EUR 78,81 Kurs/Kaufpreis Bestand alt: 33,823 // - Verrechnete Steuern EUR 15,34 EUR 63,47 EUR 138,830000 Anteilumsatz: 0,457 // =Wiederanlagebetrag EUR 63,47 Bestand neu: 34,280 + // @formatter:on .section("currency", "tax").optional() - .match("^\\- Verrechnete Steuern (?[\\w]{3}) (?[\\.,\\d]+).*$") + .match("^\\-.*Verrechnete Steuern (?[\\w]{3}) (?[\\.,\\d]+).*$") .assign((t, v) -> { Money tax = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax"))); - t.setMonetaryAmount(t.getMonetaryAmount().subtract(tax)); }) - .wrap(TransactionItem::new); + // @formatter:off + // ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 9387 9103 + // @formatter:on + .section("note").optional() + .match("^.* (?Auftragsnummer: .*)$") + .assign((t, v) -> t.setNote(trim(v.get("note")))) + + // @formatter:off + // If the taxes are positive, it is a tax refund. + // + // +Verrechnete Steuern EUR 1,43 EUR 29,15 EUR 33,420000 Anteilumsatz: 0,872 + // @formatter:on + .section("noTax").optional() + .match("^(?\\+).*Verrechnete Steuern [\\w]{3} [\\.,\\d]+.*$") + .assign((t, v) -> type.getCurrentContext().put("noTax", "X")) + + .wrap(t -> { + // If we have multiple entries in the document, then + // the "noTax" flag must be removed. + type.getCurrentContext().remove("noTax"); + + return new TransactionItem(t); + }); addTaxesSectionsTransaction(pdfTransaction, type); + addTaxReturnBlock(type); block.set(pdfTransaction); } + private void addDeliveryInOutBoundTransaction() + { + DocumentType type = new DocumentType("AUSLIEFERUNG"); + this.addDocumentTyp(type); + + Transaction pdfTransaction = new Transaction<>(); + pdfTransaction.subject(() -> { + PortfolioTransaction entry = new PortfolioTransaction(); + entry.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); + return entry; + }); + + Block firstRelevantLine = new Block("^AUSLIEFERUNG.*$"); + type.addBlock(firstRelevantLine); + firstRelevantLine.set(pdfTransaction); + + pdfTransaction + // @formatter:off + // Bezeichnung: DekaLux-PharmaTech TF + // ISIN: LU0348413815 Unterdepot: 00 Auftragsnummer: 8101 8357 + // @formatter:on + .section("name", "isin") + .match("^(Bezeichnung|Fondsbezeichnung): (?.*)$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") + .assign((t, v) -> { + t.setSecurity(getOrCreateSecurity(v)); + + v.getTransactionContext().put(FAILURE, Messages.MsgErrorTransactionTypeNotSupported); + t.setCurrencyCode(CurrencyUnit.EUR); + t.setAmount(0L); + }) + + // @formatter:off + // Anteilumsatz: -16,000 + // @formatter:on + .section("shares") + .match("^.*Anteilumsatz: (\\-)?(?[\\.,\\d]+)$") + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + + // @formatter:off + // Verwahrart: GiroSammel Abrechnungstag: 18.03.2020 + // @formatter:on + .section("date") + .match("^.*Abrechnungstag: (?[\\d\\s]+\\.[\\d\\s]+\\.[\\d\\s]+)$") + .assign((t, v) -> t.setDateTime(asDate(stripBlanks(v.get("date"))))) + + // @formatter:off + // ISIN: LU0348413815 Unterdepot: 00 Auftragsnummer: 8101 8357 + // @formatter:on + .section("note").optional() + .match("^.* (?Auftragsnummer: .*)$") + .assign((t, v) -> t.setNote(trim(v.get("note")))) + + .wrap((t, ctx) -> { + TransactionItem item = new TransactionItem(t); + + if (ctx.getString(FAILURE) != null) + item.setFailureMessage(ctx.getString(FAILURE)); + + return item; + }); + } + public void addDepotStatementTransaction() { - final DocumentType type = new DocumentType("Quartalsbericht per [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}", (context, lines) -> { - Pattern pAccountCurrency = Pattern.compile("^depot in (?[\\w]{3}) in [\\w]{3}$"); - Pattern pSecurityCurrency = Pattern.compile("^(?[\\w]{3}) Fremdw.hrung [\\w]{3}$"); - Pattern pIsin = Pattern.compile("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$"); + final DocumentType type = new DocumentType("(Quartalsbericht|Umsatz\\-Jahres.bersicht)", (context, lines) -> { + + Pattern pSecurity = Pattern.compile("^(?[A-Z]{2}[A-Z0-9]{9}[0-9])( [\\d]+)? ([\\s]+)?[\\d]{2}( \\-)?( .*: )?(?.*) ([\\s]+)?[\\.,\\d]+( [\\.,\\d]+ [\\w]{3})? ([\\-|\\+])?[\\.,\\d]+$"); + Pattern pISIN = Pattern.compile("^((?.*)\\/ )?ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$"); + Pattern pDate = Pattern.compile("^(Jahresdepotauszug|Depot.bersicht) (per|zum) (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$"); + Pattern pShares = Pattern.compile("^.* ([\\.,\\d]+)?(?(?[\\-\\+\\s]+)[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$"); + Pattern pSharesTotal = Pattern.compile("^Bestand am [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}(?.*) ([\\s]+)?([\\.,\\d]+) ([\\s\\*]+)?([\\.,\\d]+) ([\\s]+)?(?[\\.,\\d]+).*$"); + Pattern pSecurityName = Pattern.compile("^(Zulagenzahlung([\\s]+)?([\\d]{4})?" + + "|.*Ertrag|.*Tausch|.*zahlung|.*preis|.*buchung|.*verwendung|.*Verwendung|.*Aufl.sung|.*einzug|.*erstattung)?" + + "(?.*) ([\\s])?([\\.,\\d]+) ([\\s])?([\\.,\\d]+)?(?(?[\\-\\+\\s]+)[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$"); - int endBlock = lines.length; - String securityCurrency = CurrencyUnit.EUR; + // Create a helper to store the list of security items found in the document + SecurityListHelper securityListHelper = new SecurityListHelper(); + context.putType(securityListHelper); - for (int i = lines.length - 1; i >= 0; i--) + // Extract security information using pSecurity pattern + List securityItems = new ArrayList<>(); + + for (String line : lines) { - Matcher m = pAccountCurrency.matcher(lines[i]); - if (m.matches()) - context.put("accountCurrency", m.group("accountCurrency")); + Matcher mDate = pDate.matcher(line); + if (mDate.matches()) + context.put("documentDate", mDate.group("documentDate")); + + Matcher mSecurity = pSecurity.matcher(line); + if (mSecurity.matches()) + { + SecurityItem securityItem = new SecurityItem(); + securityItem.isin = mSecurity.group("isin"); + securityItem.name = trim(mSecurity.group("name")) != null ? trim(mSecurity.group("name")) : ""; + securityItems.add(securityItem); + } + } - m = pIsin.matcher(lines[i]); - if (m.matches()) + // Iterate through lines again to find ISIN patterns and update security items + SecurityItem currentSecurityItem = null; + for (int i = 0; i < lines.length; i++) + { + Matcher mISIN = pISIN.matcher(lines[i]); + if (mISIN.matches()) { - // Search the security currency in the block - for (int ii = i; ii < endBlock; ii++) + // Find the security item matching the ISIN and update its line numbers + for (SecurityItem securityItem : securityItems) { - Matcher m1 = pSecurityCurrency.matcher(lines[ii]); - if (m1.matches()) - securityCurrency = m1.group("securityCurrency"); + if (securityItem.isin.equals(mISIN.group("isin")) && securityItem.lineNoStart == 0) + { + securityItem.lineNoStart = i + 1; + + if (currentSecurityItem != null) + currentSecurityItem.lineNoEnd = i; + + currentSecurityItem = securityItem; + break; + } + else if (currentSecurityItem != null && currentSecurityItem == securityItem) + { + currentSecurityItem.lineNoEnd = i; + } } - // @formatter:off - // Stringbuilder: - // security_(security name)_(currency)_(start@line)_(end@line) = isin - // - // Example: - // Deka-GlobalChampions TF - // ISIN: DE000DK0ECV6 Unterdepot: 00 - // EUR Fremdwährung EUR Anteile tag nungstag - // @formatter:on - StringBuilder securityListKey = new StringBuilder("security_"); - securityListKey.append(trim(lines[i - 1])).append("_"); - securityListKey.append(securityCurrency).append("_"); - securityListKey.append(Integer.toString(i)).append("_"); - securityListKey.append(Integer.toString(endBlock)); - context.put(securityListKey.toString(), m.group("isin")); - - endBlock = i; + // If no matching SecurityItem is found, create a new one + if (currentSecurityItem == null || !currentSecurityItem.isin.equals(mISIN.group("isin"))) + { + currentSecurityItem = new SecurityItem(); + currentSecurityItem.isin = mISIN.group("isin"); + currentSecurityItem.lineNoStart = i + 1; + currentSecurityItem.name = trim(mISIN.group("name")) != null ? trim(mISIN.group("name")) : ""; + securityItems.add(currentSecurityItem); + } } } - }); - this.addDocumentTyp(type); - // @formatter:off - // Lastschrifteinzug 250,00 198,660000 +1,258 01.04.2021 01.04.2021 - // Verkauf 2.039,96 102,810000 -19,842 11.05.2021 11.05.2021 - // Kauf 36,00 216,100000 +0,167 18.07.2022 18.07.2022 - // @formatter:on - Block buySellBlock = new Block("^(Lastschrifteinzug|Verkauf|Kauf)(?! aus Ertrag).*$"); - type.addBlock(buySellBlock); - buySellBlock.set(new Transaction() - .subject(() -> { - BuySellEntry entry = new BuySellEntry(); - entry.setType(PortfolioTransaction.Type.BUY); - return entry; - }) + // If currentSecurityItem is not null and its lineNoEnd has not been updated, set it to the last line + if (currentSecurityItem != null && currentSecurityItem.lineNoEnd == 0) + currentSecurityItem.lineNoEnd = lines.length - 1; - .section("amount", "type", "shares", "date") - .match("^(Lastschrifteinzug|Verkauf|Kauf) (?[\\.,\\d]+) [\\.,\\d]+ (?[\\-|\\+])(?[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> { - Map context = type.getCurrentContext(); + // Add security items to helper, ignoring those without names + for (SecurityItem securityItem : securityItems) + { + if (!securityItem.name.isEmpty()) + securityListHelper.items.add(securityItem); + } - // Is sign --> "-" change from BUY to SELL - if (v.get("type").equals("-")) - t.setType(PortfolioTransaction.Type.SELL); + // Create a helper to save the list of shares by securities transaction found in the document + SharesListHelper sharesListHelper = new SharesListHelper(); + context.putType(sharesListHelper); - Security securityData = getSecurity(context, v.getStartLineNumber()); - if (securityData != null) - { - v.put("name", securityData.getName()); - v.put("isin", securityData.getIsin()); - v.put("currency", asCurrencyCode(securityData.getCurrency())); - } + // Extract security information using pSecurity pattern + List shareItems = new ArrayList<>(); - t.setDate(asDate(v.get("date"))); - t.setShares(asShares(v.get("shares"))); - t.setAmount(asAmount(v.get("amount"))); - t.setCurrencyCode(asCurrencyCode(context.get("accountCurrency"))); - t.setSecurity(getOrCreateSecurity(v)); - }) + for (SecurityItem securityItem : securityListHelper.items) + { + long shares = 0; + long sharesTotal = 0; - .wrap(t -> { - if (t.getPortfolioTransaction().getCurrencyCode() != null) - return new BuySellEntryItem(t); - return null; - })); + // Searches for the regex pattern of sharesTotal in the current line + for (int i = securityItem.lineNoEnd; i > securityItem.lineNoStart; i--) + { + Matcher mSharesTotal = pSharesTotal.matcher(lines[i]); + if (mSharesTotal.matches()) + { + sharesTotal = asShares(mSharesTotal.group("sharesTotal")); + break; + } + } - // @formatter:off - // Ausbuchung w/ Fusion -2,140 31.05.2021 28.05.2021 - // Einbuchung w/ Fusion +1,315 31.05.2021 28.05.2021 - // @formatter:on - Block deliveryInOutbondblock = new Block("^(Einbuchung|Ausbuchung).*$"); - type.addBlock(deliveryInOutbondblock); - deliveryInOutbondblock.set(new Transaction() - .subject(() -> { - PortfolioTransaction transaction = new PortfolioTransaction(); - transaction.setType(PortfolioTransaction.Type.DELIVERY_INBOUND); - return transaction; - }) + // Iterates through the lines within the current SecurityItem + for (int i = securityItem.lineNoEnd - 1; i > securityItem.lineNoStart; i--) + { + Matcher mShares = pShares.matcher(lines[i]); + if (mShares.matches()) + { + boolean isPositive = !"-".equals(trim(mShares.group("type"))); + + ShareItem shareItem = new ShareItem(); + shareItem.isin = securityItem.isin; + shareItem.lineNo = i; + shareItem.date = LocalDate.parse(mShares.group("date"), DATEFORMAT); + shareItem.addShare = asShares(trim(mShares.group("addShare").replace("+", "").replace("-", ""))); + + if (shares == 0) + { + shares = isPositive ? (sharesTotal - shareItem.addShare) : (sharesTotal + shareItem.addShare); + shareItem.shares = shares; + } + else + { + shares += isPositive ? -shareItem.addShare : shareItem.addShare; + shareItem.shares = shares; + } + + shareItems.add(shareItem); + } + } + } - .section("type", "shares", "date") - .match("^(Einbuchung|Ausbuchung) .* (?[\\-|\\+])(?[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> { - Map context = type.getCurrentContext(); + for (int i = lines.length - 1 ; i >= 0; i--) + { + long shares = 0; + long sharesTotal = 0; - // Is sign --> "-" change from DELIVERY_INBOUND to DELIVERY_OUTBOUND - if (v.get("type").equals("-")) - t.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); + Matcher mSharesTotal = pSharesTotal.matcher(lines[i]); + if (mSharesTotal.matches()) + { + String trimmedName = trim(mSharesTotal.group("name")); - Security securityData = getSecurity(context, v.getStartLineNumber()); - if (securityData != null) + for (SecurityItem securityItem : securityItems) { - v.put("name", securityData.getName()); - v.put("isin", securityData.getIsin()); - v.put("currency", asCurrencyCode(securityData.getCurrency())); + if (securityItem.name.contains(trimmedName) && !trimmedName.isEmpty()) + { + sharesTotal = asShares(mSharesTotal.group("sharesTotal")); + for (int ii = i + 1 ; ii >= 0; ii--) + { + Matcher mISIN = pISIN.matcher(lines[ii]); + if (mISIN.matches()) + break; + + Matcher mSecurityName = pSecurityName.matcher(lines[ii]); + if (mSecurityName.matches() && securityItem.name.contains(trim(mSharesTotal.group("name")))) + { + boolean isPositive = !"-".equals(trim(mSecurityName.group("type"))); + + ShareItem shareItem = new ShareItem(); + shareItem.isin = securityItem.isin; + shareItem.lineNo = ii; + shareItem.date = LocalDate.parse(mSecurityName.group("date"), DATEFORMAT); + shareItem.addShare = asShares(trim(mSecurityName.group("addShare").replace("+", "").replace("-", ""))); + + if (shares == 0) + { + shares = isPositive ? (sharesTotal - shareItem.addShare) : (sharesTotal + shareItem.addShare); + shareItem.shares = shares; + } + else + { + shares += isPositive ? -shareItem.addShare : shareItem.addShare; + shareItem.shares = shares; + } + + shareItems.add(shareItem); + } + } + break; + } } + } + } - t.setDateTime(asDate(v.get("date"))); - t.setShares(asShares(v.get("shares"))); - t.setAmount(0L); - t.setCurrencyCode(asCurrencyCode(context.get("accountCurrency"))); - t.setSecurity(getOrCreateSecurity(v)); - }) + // Add shares of the securities transaction to the helper + for (ShareItem shareItem : shareItems) + { + if (!shareItem.isin.isEmpty()) + sharesListHelper.items.add(shareItem); + } + }); + this.addDocumentTyp(type); + + Block buySellBlock = new Block("^(Lastschrifteinzug" + + "|Verkauf( \\/ Tausch)?(?! aus Ertrag)" + + "|Kauf( aus Ertrag| \\/ Tausch)?(?! (aus )?(Zulagenzahlung|Steuererstattung))" + + "|Thesaurierung \\/ Kauf aus Ertrag" + + "|Aussch.ttung \\/ Kauf aus Ertrag" + + "|Abrechnungsbetrag Aussch.ttung" + + "|Abrechnungsbetrag Thesaurierung" + + "|Depotpreis(?! (inkl|incl)\\.)" + + "|Vertragsgeb.hr(?! in [\\d]{4})" + + "|Sch.dliche Verwendung" + + "|Entgelt Aufl.sung" + + "|Vertragspreis(?! (\\(zu Lasten (Girokonto|Vertrag)\\)|gesamt|[\\-\\+\\.,\\d]+))" + + ")" + + " .*$"); + type.addBlock(buySellBlock); + buySellBlock.set(new Transaction().subject(() -> { + BuySellEntry entry = new BuySellEntry(); + entry.setType(PortfolioTransaction.Type.BUY); + return entry; + }) + + .oneOf( + // @formatter:off + // Lastschrifteinzug 250,00 198,660000 +1,258 01.04.2021 01.04.2021 + // Lastschrifteinzug 1.000,00 59,320000 + 16,858 28.06.2005 28.06.2005 + // Verkauf 2.039,96 102,810000 -19,842 11.05.2021 11.05.2021 + // Kauf 36,00 216,100000 +0,167 18.07.2022 18.07.2022 + // Kauf 34,00 55,240000 + 0,615 28.02.2005 28.02.2005 + // Kauf aus Ertrag 0,28 63,520000 + 0,004 03.01.2005 03.01.2005 + // Abrechnungsbetrag Ausschüttung 54,72 438,170000 +0,125 20.11.2012 20.11.2012 + // Depotpreis 10,00 69,740000 - 0,143 16.12.2005 16.12.2005 + // Vertragsgebühr 5,00 49,040000 - 0,102 15.12.2006 15.12.2006 + // Thesaurierung / Kauf aus Ertrag 100 0,00 72,270000 +0,000 12.01.2018 29.12.2017 + // @formatter:on + section -> section + .attributes("note", "amount", "type", "shares", "date") + .match("^(?(Lastschrifteinzug" + + "|Verkauf( \\/ Tausch)?(?! aus Ertrag)" + + "|Kauf( aus Ertrag| \\/ Tausch)?(?! aus Steuererstattung)" + + "|Thesaurierung \\/ Kauf aus Ertrag" + + "|Aussch.ttung \\/ Kauf aus Ertrag" + + "|Abrechnungsbetrag Aussch.ttung" + + "|Abrechnungsbetrag Thesaurierung" + + "|Depotpreis(?! (inkl|incl)\\.)" + + "|Vertragsgeb.hr(?! in [\\d]{4})" + + "|Sch.dliche Verwendung" + + "|Entgelt Aufl.sung" + + "|Vertragspreis(?! (\\(zu Lasten (Girokonto|Vertrag)\\)|gesamt|[\\-\\+\\.,\\d]+)))) " + + "(?[\\.,\\d]+) " + + "[\\.,\\d]+" + + "(?[\\-\\+\\s]+)" + + "(?[\\.,\\d]+) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + DocumentContext context = type.getCurrentContext(); + + // Is type --> "-" change from BUY to SELL + if ("-".equals(trim(v.get("type")))) + t.setType(PortfolioTransaction.Type.SELL); + + SecurityListHelper securityListHelper = context.getType(SecurityListHelper.class).orElseGet(SecurityListHelper::new); + Optional securityItem = securityListHelper.findItemByLineNoStart(v.getStartLineNumber()); + + if (securityItem.isPresent()) + { + v.put("name", securityItem.get().name); + v.put("isin", securityItem.get().isin); + } + else + { + Optional securityItemByName = securityListHelper.findItemByName(trim(v.get("name"))); + if (securityItemByName.isPresent()) + { + v.put("name", securityItemByName.get().name); + v.put("isin", securityItemByName.get().isin); + } + } + + t.setSecurity(getOrCreateSecurity(v)); + t.setDate(asDate(v.get("date"))); + t.setShares(asShares(v.get("shares"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + + // Formatting some notes + if ("Depotpreis".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + + if ("Vertragsgebühr".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + + if ("Schädliche Verwendung".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + + if ("Entgelt Auflösung".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + + if ("Vertragspreis".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + }) + , + // @formatter:off + // Lastschrifteinzug Deka-BR 100 80,00 103,190000 +0,775 08.06.2022 08.06.2022 + // Lastschrifteinzug Deka-BR 100 80,00 39,880000 +2,006 08.06.2012 08.06.2012 + // Abrechnungsbetrag Thesaurierung Deka-BR 100 4,39 39,790000 +0,110 02.07.2012 02.07.2012 + // Thesaurierung / Kauf aus Ertrag Deka-BR 100 0,00 72,270000 +0,000 12.01.2018 29.12.2017 + // Schädliche Verwendung Deka-BR 100 23.190,32 84,050000 -275,911 24.11.2020 24.11.2020 + // Entgelt Auflösung Deka-BR 100 48,74 84,050000 -0,580 24.11.2020 24.11.2020 + // Verkauf / Tausch Deka-Renten konservativ 340,80 47,890000 -7,116 16.04.2020 16.04.2020 + // + // Vertragspreis Deka-DividendenStrategi 1,95 148,480000 -0,013 24.08.2020 24.08.2020 + // e CF (A + // @formatter:on + section -> section + .attributes("note", "name", "amount", "type", "shares", "date") + .match("^(?(Lastschrifteinzug" + + "|Verkauf( \\/ Tausch)?(?! aus Ertrag)" + + "|Kauf( aus Ertrag| \\/ Tausch)?(?! aus Steuererstattung)" + + "|Thesaurierung \\/ Kauf aus Ertrag" + + "|Aussch.ttung \\/ Kauf aus Ertrag" + + "|Abrechnungsbetrag Aussch.ttung" + + "|Abrechnungsbetrag Thesaurierung" + + "|Depotpreis(?! (inkl|incl)\\.)" + + "|Vertragsgeb.hr(?! in [\\d]{4})" + + "|Sch.dliche Verwendung" + + "|Entgelt Aufl.sung" + + "|Vertragspreis(?! (\\(zu Lasten (Girokonto|Vertrag)\\)|gesamt|[\\-\\+\\.,\\d]+)))) " + + "(?.*) " + + "(?[\\.,\\d]+) " + + "[\\.,\\d]+" + + "(?[\\-\\+\\s]+)" + + "(?[\\.,\\d]+) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + DocumentContext context = type.getCurrentContext(); + + // Is type --> "-" change from BUY to SELL + if ("-".equals(trim(v.get("type")))) + t.setType(PortfolioTransaction.Type.SELL); + + SecurityListHelper securityListHelper = context.getType(SecurityListHelper.class).orElseGet(SecurityListHelper::new); + Optional securityItem = securityListHelper.findItemByLineNoStart(v.getStartLineNumber()); + + if (securityItem.isPresent()) + { + v.put("name", securityItem.get().name); + v.put("isin", securityItem.get().isin); + } + else + { + Optional securityItemByName = securityListHelper.findItemByName(trim(v.get("name"))); + if (securityItemByName.isPresent()) + { + v.put("name", securityItemByName.get().name); + v.put("isin", securityItemByName.get().isin); + } + } + + t.setSecurity(getOrCreateSecurity(v)); + t.setDate(asDate(v.get("date"))); + t.setShares(asShares(v.get("shares"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + + // Formatting some notes + if ("Depotpreis".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + + if ("Vertragsgebühr".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + + if ("Schädliche Verwendung".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note"))); + + if ("Entgelt Auflösung".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note"))); + + if ("Vertragspreis".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getPortfolioTransaction().getDateTime().getYear()); + }) + ) + + .wrap(t -> { + BuySellEntryItem item = new BuySellEntryItem(t); + + if (t.getPortfolioTransaction().getCurrencyCode() != null && t.getPortfolioTransaction().getAmount() == 0) + item.setFailureMessage(Messages.MsgErrorTransactionTypeNotSupported); + + return item; + })); + + Block deliveryInOutbondblock = new Block("^(Einbuchung" + + "|Ausbuchung|Auslieferung" + + "|Zulagenzahlung" + + "|Zulagenr.ckzahlung" + + "|Korrekturbuchung" + + "|Steuerr.ckzahlung" + + "|Steuererstattung" + + "|Kauf (aus )?(Zulagenzahlung|Steuererstattung))" + + " .*$"); + type.addBlock(deliveryInOutbondblock); + deliveryInOutbondblock.set(new Transaction().subject(() -> { + PortfolioTransaction transaction = new PortfolioTransaction(); + transaction.setType(PortfolioTransaction.Type.DELIVERY_INBOUND); + return transaction; + }) + .oneOf( + // @formatter:off + // Kauf aus Steuererstattung 12,29 47,355000 +0,260 19.08.2020 19.08.2020 + // Kauf Zulagenzahlung 354,00 32,950000 +10,744 17.11.2009 17.11.2009 + // @formatter:on + section -> section + .attributes("note", "amount", "type", "shares", "date") + .match("^(?(Zulagenzahlung .* [\\d]{4}" + + "|Kauf Zulagenzahlung" + + "|Zulagenr.ckzahlung" + + "|Korrekturbuchung" + + "|Steuererstattung" + + "|Steuerr.ckzahlung" + + "|Kauf (aus )?(Zulagenzahlung|Steuererstattung))) " + + "(?[\\.,\\d]+) " + + "[\\.,\\d]+" + + "(?[\\-\\+\\s]+)" + + "(?[\\.,\\d]+) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + DocumentContext context = type.getCurrentContext(); + + // Is type --> "-" change from BUY to SELL + if ("-".equals(trim(v.get("type")))) + t.setType(PortfolioTransaction.Type.SELL); + + SecurityListHelper securityListHelper = context.getType(SecurityListHelper.class).orElseGet(SecurityListHelper::new); + Optional securityItem = securityListHelper.findItemByLineNoStart(v.getStartLineNumber()); + + if (securityItem.isPresent()) + { + v.put("name", securityItem.get().name); + v.put("isin", securityItem.get().isin); + } + else + { + Optional securityItemByName = securityListHelper.findItemByName(trim(v.get("name"))); + if (securityItemByName.isPresent()) + { + v.put("name", securityItemByName.get().name); + v.put("isin", securityItemByName.get().isin); + } + } + + t.setSecurity(getOrCreateSecurity(v)); + t.setDateTime(asDate(v.get("date"))); + t.setShares(asShares(v.get("shares"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + t.setNote(trim(replaceMultipleBlanks(v.get("note")))); + }) + , + // @formatter:off + // Zulagenzahlung 2021 Deka-BR 100 14,99 101,840000 +0,147 17.05.2022 17.05.2022 + // Zulagenzahlung 2011 Deka-BR 100 101,91 38,880000 +2,621 21.05.2012 21.05.2012 + // Zulagenrückzahlung Deka-BR 100 1.960,93 84,050000 -23,331 24.11.2020 24.11.2020 + // Korrekturbuchung Deka-BR 100 114,00 84,050000 -1,356 24.11.2020 24.11.2020 + // Steuererstattung Deka-BR 100 1,57 98,050000 +0,016 06.01.2023 06.01.2023 + // + // Steuerrückzahlung Deka-DividendenStrategi 42,60 148,480000 -0,287 24.08.2020 24.08.2020 + // e CF (A + // @formatter:on + section -> section + .attributes("note", "name", "amount", "type", "shares", "date") + .match("^(?(Zulagenzahlung .* [\\d]{4}" + + "|Zulagenr.ckzahlung" + + "|Korrekturbuchung" + + "|Steuererstattung" + + "|Steuerr.ckzahlung" + + "|Kauf (aus )?(Zulagenzahlung|Steuererstattung))) " + + "(?.*) " + + "(?[\\.,\\d]+) " + + "[\\.,\\d]+" + + "(?[\\-\\+\\s]+)" + + "(?[\\.,\\d]+) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + DocumentContext context = type.getCurrentContext(); + + // Is type --> "-" change from DELIVERY_INBOUND to DELIVERY_OUTBOUND + if ("-".equals(trim(v.get("type")))) + t.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); + + SecurityListHelper securityListHelper = context.getType(SecurityListHelper.class).orElseGet(SecurityListHelper::new); + Optional securityItem = securityListHelper.findItemByLineNoStart(v.getStartLineNumber()); + + if (securityItem.isPresent()) + { + v.put("name", securityItem.get().name); + v.put("isin", securityItem.get().isin); + } + else + { + Optional securityItemByName = securityListHelper.findItemByName(trim(v.get("name"))); + if (securityItemByName.isPresent()) + { + v.put("name", securityItemByName.get().name); + v.put("isin", securityItemByName.get().isin); + } + } + + t.setSecurity(getOrCreateSecurity(v)); + t.setDateTime(asDate(v.get("date"))); + t.setShares(asShares(v.get("shares"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + t.setNote(trim(replaceMultipleBlanks(v.get("note")))); + }) + , + // @formatter:off + // Ausbuchung w/ Fusion -2,140 31.05.2021 28.05.2021 + // Einbuchung w/ Fusion +1,315 31.05.2021 28.05.2021 + // Auslieferung -16,000 20.03.2020 18.03.2020 + // @formatter:on + section -> section + .attributes("type", "shares", "date") + .match("^(Einbuchung|Ausbuchung|Auslieferung) .*" + + "(?[\\-|\\+])" + + "(?[\\.,\\d]+) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + DocumentContext context = type.getCurrentContext(); + + // Is type --> "-" change from DELIVERY_INBOUND to DELIVERY_OUTBOUND + if ("-".equals(v.get("type"))) + t.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); + + SecurityListHelper securityListHelper = context.getType(SecurityListHelper.class).orElseGet(SecurityListHelper::new); + Optional securityItem = securityListHelper.findItemByLineNoStart(v.getStartLineNumber()); + + if (securityItem.isPresent()) + { + v.put("name", securityItem.get().name); + v.put("isin", securityItem.get().isin); + } + else + { + Optional securityItemByName = securityListHelper.findItemByName(trim(v.get("name"))); + if (securityItemByName.isPresent()) + { + v.put("name", securityItemByName.get().name); + v.put("isin", securityItemByName.get().isin); + } + } + + t.setSecurity(getOrCreateSecurity(v)); + t.setDateTime(asDate(v.get("date"))); + t.setShares(asShares(v.get("shares"))); + t.setAmount(0L); + t.setCurrencyCode(CurrencyUnit.EUR); + }) + ) // @formatter:off // Ausbuchung w/ Fusion -2,140 31.05.2021 28.05.2021 // Einbuchung w/ Fusion +1,315 31.05.2021 28.05.2021 // @formatter:on .section("note").optional() - .match("^(Einbuchung|Ausbuchung) .* (?.*) [\\-|\\+][\\.,\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}$") + .match("^(Einbuchung|Ausbuchung) .* (?.*) ([\\-|\\+])[\\.,\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}$") .assign((t, v) -> t.setNote(trim(v.get("note")))) - .wrap(t -> { - if (t.getCurrencyCode() != null) - return new TransactionItem(t); - return null; + .wrap((t, ctx) -> { + TransactionItem item = new TransactionItem(t); + + if (t.getCurrencyCode() != null && t.getAmount() == 0) + item.setFailureMessage(Messages.MsgErrorTransactionTypeNotSupported); + + return item; })); - // @formatter:off - // Verkauf aus Ertrag 33,43 177,600000 +0,000 20.05.2022 20.05.2022 - // @formatter:on - Block dividendeBlock = new Block("^Verkauf aus Ertrag.*$"); + Block dividendeBlock = new Block("^(Verkauf aus Ertrag" + + "|Aussch.ttung \\/ Kauf aus Ertrag" + + "|Abrechnungsbetrag Ausschüttung" + + "|Abrechnungsbetrag Thesaurierung" + + "|Ertragsaussch.ttung\\-Storno" + + "|Kauf aus Ertrag" + + "|Thesaurierung \\/ Kauf aus Ertrag) .*$"); type.addBlock(dividendeBlock); - dividendeBlock.set(new Transaction() - .subject(() -> { - AccountTransaction entry = new AccountTransaction(); - entry.setType(AccountTransaction.Type.DIVIDENDS); - return entry; + dividendeBlock.set(new Transaction().subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.DIVIDENDS); + return entry; }) - .section("amount", "shares", "date") - .match("^Verkauf aus Ertrag (?[\\.,\\d]+) (?[\\.,\\d]+) \\+[\\.,\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .assign((t, v) -> { - Map context = type.getCurrentContext(); - - Security securityData = getSecurity(context, v.getStartLineNumber()); - if (securityData != null) - { - v.put("name", securityData.getName()); - v.put("isin", securityData.getIsin()); - v.put("currency", asCurrencyCode(securityData.getCurrency())); - } - - t.setDateTime(asDate(v.get("date"))); - t.setShares(asShares(v.get("shares"))); - t.setAmount(asAmount(v.get("amount"))); - t.setCurrencyCode(asCurrencyCode(context.get("accountCurrency"))); - t.setSecurity(getOrCreateSecurity(v)); - }) - - .wrap(t -> { - if (t.getCurrencyCode() != null) - return new TransactionItem(t); - return null; + .oneOf( + // @formatter:off + // Verkauf aus Ertrag 33,43 177,600000 +0,000 20.05.2022 20.05.2022 + // Ausschüttung / Kauf aus Ertrag 1,46 179,310000 +0,008 15.02.2019 15.02.2019 + // Abrechnungsbetrag Ausschüttung 54,72 438,170000 +0,125 20.11.2012 20.11.2012 + // Abrechnungsbetrag Thesaurierung 0,00 64,500000 0,000 30.12.2005 30.12.2005 + // Ertragsausschüttung-Storno 1,05 41,970000 - 0,025 07.09.2005 22.08.2005 + // @formatter:on + section -> section + .attributes("type", "amount", "shares", "date") + .match("^(?(Verkauf aus Ertrag" + + "|Aussch.ttung \\/ Kauf aus Ertrag" + + "|Abrechnungsbetrag Ausschüttung" + + "|Abrechnungsbetrag Thesaurierung" + + "|Ertragsaussch.ttung-Storno" + + "|Kauf aus Ertrag" + + "|Thesaurierung \\/ Kauf aus Ertrag)) " + + "(?[\\.,\\d]+) " + + "[\\.,\\d]+" + + "([\\+\\-\\s]+)?(?[\\.,\\d]+) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + DocumentContext context = type.getCurrentContext(); + + if ("Ertragsausschüttung-Storno".equals(v.get("type"))) + v.getTransactionContext().put(FAILURE, Messages.MsgErrorOrderCancellationUnsupported); + + SecurityListHelper securityListHelper = context.getType(SecurityListHelper.class).orElseGet(SecurityListHelper::new); + SharesListHelper sharesListHelper = context.getType(SharesListHelper.class).orElseGet(SharesListHelper::new); + + Optional securityItem = securityListHelper.findItemByLineNoStart(v.getStartLineNumber()); + + if (securityItem.isPresent()) + { + v.put("name", securityItem.get().name); + v.put("isin", securityItem.get().isin); + + Optional shareItem = sharesListHelper.findItem(v.get("isin"), // + securityItem.get().lineNoEnd, // + LocalDate.parse(v.get("date"), DATEFORMAT), // + asShares(v.get("shares"))); + + if (shareItem.isPresent()) + t.setShares(shareItem.get().shares); + } + else + { + Optional securityItemByName = securityListHelper.findItemByName(trim(v.get("name"))); + if (securityItemByName.isPresent()) + { + v.put("name", securityItemByName.get().name); + v.put("isin", securityItemByName.get().isin); + + Optional shareItem = sharesListHelper.findItem(v.get("isin"), // + securityItemByName.get().lineNoEnd, // + LocalDate.parse(v.get("date"), DATEFORMAT), // + asShares(v.get("shares"))); + + if (shareItem.isPresent()) + t.setShares(shareItem.get().shares); + } + } + + t.setSecurity(getOrCreateSecurity(v)); + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + }) + , + // @formatter:off + // Abrechnungsbetrag Thesaurierung Deka-BR 100 4,39 39,790000 +0,110 02.07.2012 02.07.2012 + // Kauf aus Ertrag Deka-BR 100 42,80 73,530000 +0,582 12.01.2018 12.01.2018 + // Thesaurierung / Kauf aus Ertrag Deka-BR 100 0,00 72,270000 +0,000 12.01.2018 29.12.2017 + // @formatter:on + section -> section + .attributes("name", "amount", "shares", "date") + .match("^(?(Verkauf aus Ertrag" + + "|Aussch.ttung \\/ Kauf aus Ertrag" + + "|Abrechnungsbetrag Ausschüttung" + + "|Abrechnungsbetrag Thesaurierung" + + "|Ertragsaussch.ttung\\-Storno" + + "|Kauf aus Ertrag" + + "|Thesaurierung \\/ Kauf aus Ertrag)) " + + "(?.*) " + + "(?[\\.,\\d]+) " + + "[\\.,\\d]+" + + "([\\+\\-\\s]+)?(?[\\.,\\d]+) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + DocumentContext context = type.getCurrentContext(); + + if ("Ertragsausschüttung-Storno".equals(v.get("type"))) + v.getTransactionContext().put(FAILURE, Messages.MsgErrorOrderCancellationUnsupported); + + SecurityListHelper securityListHelper = context.getType(SecurityListHelper.class).orElseGet(SecurityListHelper::new); + SharesListHelper sharesListHelper = context.getType(SharesListHelper.class).orElseGet(SharesListHelper::new); + + Optional securityItem = securityListHelper.findItemByLineNoStart(v.getStartLineNumber()); + + if (securityItem.isPresent()) + { + v.put("name", securityItem.get().name); + v.put("isin", securityItem.get().isin); + + Optional shareItem = sharesListHelper.findItem(v.get("isin"), // + securityItem.get().lineNoEnd, // + LocalDate.parse(v.get("date"), DATEFORMAT), // + asShares(v.get("shares"))); + + if (shareItem.isPresent()) + t.setShares(shareItem.get().shares); + } + else + { + Optional securityItemByName = securityListHelper.findItemByName(trim(v.get("name"))); + if (securityItemByName.isPresent()) + { + v.put("name", securityItemByName.get().name); + v.put("isin", securityItemByName.get().isin); + + Optional shareItem = sharesListHelper.findItem(v.get("isin"), // + securityItemByName.get().lineNoEnd, // + LocalDate.parse(v.get("date"), DATEFORMAT), // + asShares(v.get("shares"))); + + if (shareItem.isPresent()) + t.setShares(shareItem.get().shares); + } + } + + t.setSecurity(getOrCreateSecurity(v)); + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + }) + ) + + .wrap((t, ctx) -> { + TransactionItem item = new TransactionItem(t); + + if (t.getCurrencyCode() != null && t.getAmount() == 0) + item.setFailureMessage(Messages.MsgErrorTransactionTypeNotSupported); + + if (ctx.getString(FAILURE) != null) + item.setFailureMessage(ctx.getString(FAILURE)); + + return item; })); - // @formatter:off - // per 31.12.2022* seit 31.12.2021 1 - // Depotpreis inkl. Mehrwertsteuer (MwSt): - // 12,50 EUR inkl. 2,00 EUR MwSt wurden für 2022 belastet - // Depotübersicht - // @formatter:on - Block feesBlock = new Block("^Depotpreis inkl\\. Mehrwertsteuer.*$"); + Block feesBlock = new Block("^.*(Vertragsgeb.hr in [\\d]{4}|.* (inkl|incl)\\.( [\\d]+%)? (Mehrwertsteuer \\(MwSt\\)|MwSt|MWSt)" + + "|Entgelt Aufl.sung " + + "|Vertragspreis(?!.*gesamt) " + + "|Weitere Preise(?!.*gesamt) " + + "|Abschluss\\- und Vertriebskosten(?!.*gesamt) " + + ").*$"); type.addBlock(feesBlock); - feesBlock.set(new Transaction() - .subject(() -> { - AccountTransaction entry = new AccountTransaction(); - entry.setType(AccountTransaction.Type.FEES); - return entry; + feesBlock.set(new Transaction().subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.FEES); + return entry; }) - .section("note1", "amount", "currency", "note2", "date") - .find("(?Depotpreis) inkl\\. Mehrwertsteuer.*") - .match("^(?[\\.,\\d]+) (?[\\w]{3}+) .*(? f.r [\\d]{4}).*$") - .match("^per (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") - .match("^Depot.bersicht$") - .assign((t, v) -> { - t.setDateTime(asDate(v.get("date"))); - t.setAmount(asAmount(v.get("amount"))); - t.setCurrencyCode(asCurrencyCode(v.get("accountCurrency"))); - t.setNote(v.get("note1") + v.get("note2")); - }) + .oneOf( + // @formatter:off + // Vertragspreis (zu Lasten Girokonto) -10,00 + // Vertragspreis (zu Lasten Vertrag) 0,00 + // Weitere Preise (zu Lasten Girokonto) 0,00 + // Weitere Preise (zu Lasten Vertrag) 0,00 + // Vertragspreis -10,00 + // Abschluss- und Vertriebskosten (Ausgabeaufschlag) -21,06 + // Abschluss- und Vertriebskosten - Ausgabeaufschlag -10,77 + // @formatter:on + section -> section + .attributes("note", "amount") + .match("^(?(Vertragspreis" + + "|Weitere Preise" + + "|Abschluss\\- und Vertriebskosten(?!.*gesamt).*)" + + "( \\(zu Lasten (Girokonto|Vertrag)\\))?)" + + " ([\\-\\s]+)?(?[\\.,\\d]+).*$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + t.setDateTime(asDate(context.get("documentDate"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + t.setNote(trim(v.get("note"))); + + // Formatting some notes + if (t.getNote().startsWith("Abschluss")) + t.setNote("Abschluss-/ Vertriebskosten"); + + t.setNote(t.getNote() + " " + t.getDateTime().getYear()); + }) + , + // @formatter:off + // Entgelt Auflösung Deka-BR 100 48,74 84,050000 -0,580 24.11.2020 24.11.2020 + // + // Vertragspreis Deka-DividendenStrategi 1,95 148,480000 -0,013 24.08.2020 24.08.2020 + // e CF (A + // @formatter:on + section -> section + .attributes("note", "amount", "date") + .match("^(?Entgelt Aufl.sung " + + "|Vertragspreis ).* " + + "(?[\\.,\\d]+) " + + "[\\.,\\d]+ [\\-\\+\\s]+[\\.,\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + t.setNote(trim(v.get("note"))); + + // Formatting some note + if ("Vertragspreis".equals(trim(v.get("note")))) + t.setNote(trim(v.get("note")) + " " + t.getDateTime().getYear()); + }) + , + // @formatter:off + // Vertragsgebühr in 2006 5,00 Euro + // @formatter:on + section -> section + .attributes("note", "amount") + .match("^.*(?Vertragsgeb.hr) in [\\d]{4} (\\-)?(?[\\.,\\d]+).*$") + .assign((t, v) -> { + Map context = type.getCurrentContext(); + + t.setDateTime(asDate(context.get("documentDate"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + t.setNote(v.get("note") + " " + t.getDateTime().getYear()); + }) + , + // @formatter:off + // Depotpreis incl. 16% MWSt: 10,00 belastet im Depot 0111111111 974587 00 + // Depot-Auszug zum 31.12.2005 Seite 1 + // @formatter:on + section -> section + .attributes("note", "amount", "date") + .match("^.*(?Depotpreis) (inkl|incl)\\.( [\\d]+%)? .*: (?[\\.,\\d]+) .*$") + .match("^(Depot.bersicht|Depot\\-Auszug|Jahresdepotauszug) (zum|per) (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(CurrencyUnit.EUR); + t.setNote(v.get("note") + " " + t.getDateTime().getYear()); + }) + , + // @formatter:off + // Depotpreis inkl. 16% MwSt: 10,00 EUR belastet im Depot 0111111111 974587 00 + // Depotübersicht zum 31.12.2006 + // + // Depotpreis inkl. 19% MwSt: 10,00 EUR belastet im Depot 0111111111 LU0268059614 00 + // Jahresdepotauszug per 31.12.2008 + // @formatter:on + section -> section + .attributes("note", "amount", "currency", "date") + .match("^.*(?Depotpreis) (inkl|incl)\\.( [\\d]+%)? .*: (?[\\.,\\d]+) (?[\\w]{3}) .*$") + .match("^(Depot.bersicht|Depot\\-Auszug|Jahresdepotauszug) (zum|per) (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setNote(v.get("note") + " " + t.getDateTime().getYear()); + }) + , + // @formatter:off + // Depotpreis inkl. 19% Mehrwertsteuer (MwSt): + // 12,50 EUR inkl. 2,00 EUR MwSt wurden für 2019 belastet + // per 31.12.2019 + // + // D epotpreis inkl. 19% MwSt: + // 10,00 EUR wurden für 2012 belastet + // Jahresdepotauszug per 31.12.2012 + // + // Depotpreis inkl. Mehrwertsteuer (MwSt): + // 0,00 EUR + // @formatter:on + section -> section + .attributes("note", "amount", "currency", "date") + .match("^(?.*) (inkl|incl)\\. .*$") + .match("^(?[\\.,\\d]+) (?[\\w]{3})( .* [\\d]{4} )?.*$") + .match("^(Jahresdepotauszug )?per (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setNote(trim(stripBlanks(v.get("note"))) + " " + t.getDateTime().getYear()); + }) + ) .wrap(t -> { - if (t.getCurrencyCode() != null) - return new TransactionItem(t); - return null; + TransactionItem item = new TransactionItem(t); + if (t.getCurrencyCode() != null && t.getAmount() == 0) + item.setFailureMessage(Messages.MsgErrorTransactionTypeNotSupported); + return item; })); } + private void addTaxReturnBlock(DocumentType type) + { + Block block = new Block("^(ERTRAGSAUSSCH.TTUNG|ERTRAGSABRECHNUNG)$"); + type.addBlock(block); + block.set(new Transaction().subject(() -> { + AccountTransaction t = new AccountTransaction(); + t.setType(AccountTransaction.Type.TAX_REFUND); + return t; + }) + + .oneOf( + // @formatter:off + // Ausschüttung (pro Anteil EUR 0,2292000): EUR 0,14 + // Bezeichnung: iShares J.P. Morgan USD EM Bond EUR Hedged UCITS ETF (Dist) + // ISIN: IE00B9M6RS56 Unterdepot: 00 Auftragsnummer: 9302 2538 + // @formatter:on + section -> section + .attributes("currency", "name", "isin") + .match("^Aussch.ttung .* (?[\\w]{3}) [\\.,\\d]+$") + .match("^Bezeichnung: (?.*)$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + , + // @formatter:off + // Fondsbezeichnung: AriDeka CF + // ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 9387 9103 + // +Verrechnete Steuern EUR 1,43 EUR 29,15 EUR 33,420000 Anteilumsatz: 0,872 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .match("^Fondsbezeichnung: (?.*)$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") + .match("^.*(?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: [\\.,\\d]+$") + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + ) + + .oneOf( + // @formatter:off + // Anteilbestand am Ertragstermin: 0,619 + // @formatter:on + section -> section + .attributes("shares") + .match("^Anteilbestand am Ertragstermin: (?[\\.,\\d]+)$") + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + , + // @formatter:off + // Ausschüttung EUR 27,72 Preis Bestand alt: 29,811 + // @formatter:on + section -> section + .attributes("shares") + .match("^.* Bestand alt: (?[\\.,\\d]+)$") + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + ) + + // @formatter:off + // Verwahrart: GiroSammel Abrechnungstag: 31.03.2022 + // @formatter:on + .section("date") + .match("^.*Abrechnungstag: (?[\\d\\s]+\\.[\\d\\s]+\\.[\\d\\s]+)$") + .assign((t, v) -> t.setDateTime(asDate(stripBlanks(v.get("date"))))) + + // @formatter:off + // Ausschüttung EUR 78,81 Kurs/Kaufpreis Bestand alt: 33,823 + // +Verrechnete Steuern EUR 1,43 EUR 29,15 EUR 33,420000 Anteilumsatz: 0,872 + // @formatter:on + .section("currency", "amount").optional() + .match("^\\+.*Verrechnete Steuern (?[\\w]{3}) (?[\\.,\\d]+).*$") + .assign((t, v) -> { + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + }) + + // @formatter:off + // ISIN: DE0008474511 Unterkonto: 00 Auftragsnummer: 9387 9103 + // @formatter:on + .section("note").optional().match("^.* (?Auftragsnummer: .*)$") + .assign((t, v) -> t.setNote(trim(v.get("note")))) + + .wrap(t -> { + if (t.getCurrencyCode() != null && t.getAmount() != 0) + return new TransactionItem(t); + return null; + })); + } + private > void addTaxesSectionsTransaction(T transaction, DocumentType type) { transaction // @formatter:off // + Verrechnete Steuern EUR 1,72 // - Verrechnete Steuern EUR 15,34 EUR 63,47 EUR 138,830000 Anteilumsatz: 0,457 + // +Verrechnete Steuern EUR 1,43 EUR 29,15 EUR 33,420000 Anteilumsatz: 0,872 // @formatter:on .section("currency", "tax").optional() - .match("^[\\-|\\+] Verrechnete Steuern (?[\\w]{3}) (?[\\.,\\d]+).*$") - .assign((t, v) -> processTaxEntries(t, v, type)); + .match("^([\\-|\\+]).*Verrechnete Steuern (?[\\w]{3}) (?[\\.,\\d]+).*$") + .assign((t, v) -> { + if (!"X".equals(type.getCurrentContext().get("noTax"))) + processTaxEntries(t, v, type); + }); + } + + private > void addFeesSectionsTransaction(T transaction, DocumentType type) + { + transaction + // @formatter:off + // Ausgabeaufschlag: 5,260% + // Abrechnungsbetrag EUR 72,00 EUR 72,00 EUR 53,780000 Anteilumsatz: 1,339 + // @formatter:on + .section("percentageFee", "amount", "currency").optional() + .match("^Ausgabeaufschlag: (?[\\.,\\d]+)%$") + .match("^.*(Einzugsbetrag|Auszahlungsbetrag|Abrechnungsbetrag) [\\w]{3} [\\.,\\d]+ [\\w]{3} [\\.,\\d]+ (?[\\w]{3}) (?[\\.,\\d]+).*$") + .assign((t, v) -> { + BigDecimal percentageFee = asBigDecimal(v.get("percentageFee")); + BigDecimal amount = asBigDecimal(v.get("amount")); + + if (percentageFee.compareTo(BigDecimal.ZERO) != 0) + { + // @formatter:off + // fxFee = (amount / (1 + percentageFee / 100)) * (percentageFee / 100) + // @formatter:on + BigDecimal fxFee = amount + .divide(percentageFee.divide(BigDecimal.valueOf(100)) + .add(BigDecimal.ONE), Values.MC) + .multiply(percentageFee, Values.MC); + + Money fee = Money.of(asCurrencyCode(v.get("currency")), + fxFee.setScale(0, Values.MC.getRoundingMode()).longValue()); + + checkAndSetFee(fee, t, type.getCurrentContext()); + } + }); } - private Security getSecurity(Map context, Integer entry) + private static class SecurityListHelper { - for (String key : context.keySet()) + private List items = new ArrayList<>(); + + // Finds a SecurityItem in the list that starts on the specified line + // number + public Optional findItemByLineNoStart(int lineNo) { - String[] parts = key.split("_"); //$NON-NLS-1$ - if (parts[0].equalsIgnoreCase("security")) //$NON-NLS-1$ + if (items.isEmpty()) + return Optional.empty(); + + for (int i = items.size() - 1; i >= 0; i--) // NOSONAR { - if (entry >= Integer.parseInt(parts[3]) && entry <= Integer.parseInt(parts[4])) - // returns security name, isin, security currency - return new Security(parts[1], context.get(key), parts[2]); + SecurityItem item = items.get(i); + + if ((item.lineNoStart > lineNo) || (item.lineNoEnd < lineNo)) + continue; + + return Optional.of(item); } + + return Optional.empty(); } - return null; - } - private static class Security - { - public Security(String name, String isin, String currency) + // Finds a SecurityItem in the list that starts on the specified name + public Optional findItemByName(String name) { - this.name = name; - this.isin = isin; - this.currency = currency; + if (items.isEmpty()) + return Optional.empty(); + + for (int i = items.size() - 1; i >= 0; i--) // NOSONAR + { + SecurityItem item = items.get(i); + + // We cannot take "equals" because the security names continue + // on the next line as well. Therefore we take "contains". + if (!item.name.contains(name)) + continue; + + return Optional.of(item); + } + + return Optional.empty(); } + } - private String name; - private String isin; - private String currency; + private static class SecurityItem + { + String isin; + String name; + int lineNoStart; + int lineNoEnd; - public String getName() + @Override + public String toString() { - return name; + return "SecurityItem [isin=" + isin + ", name=" + name + ", lineNoStart=" + lineNoStart + ", lineNoEnd=" + + lineNoEnd + "]"; } + } + + private static class SharesListHelper + { + private List items = new ArrayList<>(); - public String getIsin() + public Optional findItem(String isin, int securitylineNoEnd, LocalDate date, Long addShares) { - return isin; + if (items.isEmpty()) + return Optional.empty(); + + for (int i = items.size() - 1; i >= 0; i--) // NOSONAR + { + ShareItem item = items.get(i); + + if (!item.isin.equals(isin)) + continue; + + if (securitylineNoEnd != 0) + { + if (item.lineNo >= securitylineNoEnd) + continue; + } + + if (!item.date.equals(date)) + continue; + + if (!item.addShare.equals(addShares)) + continue; + + return Optional.of(item); + } + + return Optional.empty(); } + } - public String getCurrency() + private static class ShareItem + { + String isin; + int lineNo; + LocalDate date; + Long addShare; + Long shares; + + @Override + public String toString() { - return currency; + return "ShareItem [isin=" + isin + ", lineNo=" + lineNo + ", date=" + date + ", addShare=" + + addShare + ", shares=" + shares + "]"; } } } diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/util/TextUtil.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/util/TextUtil.java index 58617d5061..e8cde28a25 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/util/TextUtil.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/util/TextUtil.java @@ -130,6 +130,14 @@ public static String stripBlanksAndUnderscores(String input) return input == null ? null : Pattern.compile("[\\s_]").matcher(input).replaceAll(""); //$NON-NLS-1$ //$NON-NLS-2$ } + /** + * Replace all blanks between strings and replace with a single blank. + */ + public static String replaceMultipleBlanks(String input) + { + return input == null ? null : Pattern.compile("\\s+").matcher(input).replaceAll(" "); //$NON-NLS-1$ //$NON-NLS-2$ + } + /** * Removes unwanted characters before and after any number characters. Used * when importing data from CSV files.