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 2a2c64e5d2..0391e0e7dc 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 @@ -7,10 +7,12 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.junit.Test; +import name.abuchen.portfolio.datatransfer.Extractor; import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem; import name.abuchen.portfolio.datatransfer.Extractor.Item; import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem; @@ -48,12 +50,16 @@ public void testTagesauszug01() 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("LU0348461897")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); assertThat(security2.getName(), is("DekaLux-BioTech TF")); assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -117,18 +123,24 @@ public void testTagesauszug02() Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security1.getIsin(), is("DE0009771824")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); assertThat(security1.getName(), is("Deka-Liquidität: EURO 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("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("LU0075131606")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); assertThat(security3.getName(), is("Deka-Europa Nebenwerte TF (A)")); assertThat(security3.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -234,12 +246,16 @@ public void testTagesauszug03() Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security1.getIsin(), is("LU0349172725")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); assertThat(security1.getName(), is("DekaLux-GlobalResources 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("DE0009786285")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); assertThat(security2.getName(), is("Deka-EuropaPotential TF")); assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -303,6 +319,8 @@ public void testTagesauszug04() Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security.getIsin(), is("DE000ETFL227")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); assertThat(security.getName(), is("Deka Deutsche Börse EUROGOV Germany Money Market UCITS ETF")); assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -534,12 +552,16 @@ public void testTagesauszug05() Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security1.getIsin(), is("LU1225718409")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); assertThat(security1.getName(), is("Partners Group List. Investm. SICAV-Listed Infrastructure C")); 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)); @@ -603,78 +625,104 @@ public void testTagesauszug06() Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security1.getIsin(), is("IE00B66F4759")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); assertThat(security1.getName(), is("iShares EUR High Yield Corp Bond UCITS ETF")); 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("IE00B9M6RS56")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); assertThat(security2.getName(), is("iShares J.P. Morgan USD EM Bond EUR Hedged UCITS ETF (Dist)")); 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("FR0010296061")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); assertThat(security3.getName(), is("Lyxor MSCI USA UCITS ETF D-EUR")); 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("LU0302447452")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); assertThat(security4.getName(), is("Schroder ISF Global Climate Change Equity C")); 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("IE00B44CGS96")); + assertNull(security5.getWkn()); + assertNull(security5.getTickerSymbol()); assertThat(security5.getName(), is("iShares US Aggregate Bond UCITS ETF")); assertThat(security5.getCurrencyCode(), is(CurrencyUnit.USD)); Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security6.getIsin(), is("LU1602144732")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); assertThat(security6.getName(), is("Amundi Index MSCI Japan UCITS ETF")); 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("LU0703710904")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); assertThat(security7.getName(), is("Deka-Nachhaltigkeit Aktien CF (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("LU1508359509")); + assertNull(security8.getWkn()); + assertNull(security8.getTickerSymbol()); assertThat(security8.getName(), is("Deka-Industrie 4.0 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("DE000ETFL144")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); assertThat(security9.getName(), is("Deka iBoxx EUR Liquid Sovereign Diversified 5-7 UCITS ETF")); 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("DE000ETFL284")); + assertNull(security10.getWkn()); + assertNull(security10.getTickerSymbol()); assertThat(security10.getName(), is("Deka MSCI Europe UCITS ETF")); 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("DE000ETFL375")); + assertNull(security11.getWkn()); + assertNull(security11.getTickerSymbol()); assertThat(security11.getName(), is("Deka iBoxx EUR Liquid Corporates Diversified UCITS ETF")); assertThat(security11.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security12 = results.stream().filter(SecurityItem.class::isInstance).skip(11).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security12.getIsin(), is("LU1275255799")); + assertNull(security12.getWkn()); + assertNull(security12.getTickerSymbol()); assertThat(security12.getName(), is("ComStage CBK Commodity ex-Agri. Monthly EUR Hdg UCITS ETF")); assertThat(security12.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security13 = results.stream().filter(SecurityItem.class::isInstance).skip(12).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security13.getIsin(), is("FR0010429068")); + assertNull(security13.getWkn()); + assertNull(security13.getTickerSymbol()); assertThat(security13.getName(), is("Lyxor MSCI Emerging Markets UCITS ETF")); assertThat(security13.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -1061,36 +1109,48 @@ public void testTagesauszug06WithSecurityInUSD() Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security1.getIsin(), is("IE00B66F4759")); + assertNull(security1.getWkn()); + assertNull(security1.getTickerSymbol()); assertThat(security1.getName(), is("iShares EUR High Yield Corp Bond UCITS ETF")); 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("IE00B9M6RS56")); + assertNull(security2.getWkn()); + assertNull(security2.getTickerSymbol()); assertThat(security2.getName(), is("iShares J.P. Morgan USD EM Bond EUR Hedged UCITS ETF (Dist)")); 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("FR0010296061")); + assertNull(security3.getWkn()); + assertNull(security3.getTickerSymbol()); assertThat(security3.getName(), is("Lyxor MSCI USA UCITS ETF D-EUR")); 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("LU0302447452")); + assertNull(security4.getWkn()); + assertNull(security4.getTickerSymbol()); assertThat(security4.getName(), is("Schroder ISF Global Climate Change Equity C")); assertThat(security4.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security6 = results.stream().filter(SecurityItem.class::isInstance).skip(4).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security6.getIsin(), is("LU1602144732")); + assertNull(security6.getWkn()); + assertNull(security6.getTickerSymbol()); assertThat(security6.getName(), is("Amundi Index MSCI Japan UCITS ETF")); assertThat(security6.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security7 = results.stream().filter(SecurityItem.class::isInstance).skip(5).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security7.getIsin(), is("LU0703710904")); + assertNull(security7.getWkn()); + assertNull(security7.getTickerSymbol()); assertThat(security7.getName(), is("Deka-Nachhaltigkeit Aktien CF (A)")); assertThat(security7.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -1103,30 +1163,40 @@ public void testTagesauszug06WithSecurityInUSD() Security security9 = results.stream().filter(SecurityItem.class::isInstance).skip(7).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security9.getIsin(), is("DE000ETFL144")); + assertNull(security9.getWkn()); + assertNull(security9.getTickerSymbol()); assertThat(security9.getName(), is("Deka iBoxx EUR Liquid Sovereign Diversified 5-7 UCITS ETF")); assertThat(security9.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security10 = results.stream().filter(SecurityItem.class::isInstance).skip(8).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security10.getIsin(), is("DE000ETFL284")); + assertNull(security10.getWkn()); + assertNull(security10.getTickerSymbol()); assertThat(security10.getName(), is("Deka MSCI Europe UCITS ETF")); assertThat(security10.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security11 = results.stream().filter(SecurityItem.class::isInstance).skip(9).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security11.getIsin(), is("DE000ETFL375")); + assertNull(security11.getWkn()); + assertNull(security11.getTickerSymbol()); assertThat(security11.getName(), is("Deka iBoxx EUR Liquid Corporates Diversified UCITS ETF")); assertThat(security11.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security12 = results.stream().filter(SecurityItem.class::isInstance).skip(10).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security12.getIsin(), is("LU1275255799")); + assertNull(security12.getWkn()); + assertNull(security12.getTickerSymbol()); assertThat(security12.getName(), is("ComStage CBK Commodity ex-Agri. Monthly EUR Hdg UCITS ETF")); assertThat(security12.getCurrencyCode(), is(CurrencyUnit.EUR)); Security security13 = results.stream().filter(SecurityItem.class::isInstance).skip(11).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security13.getIsin(), is("FR0010429068")); + assertNull(security13.getWkn()); + assertNull(security13.getTickerSymbol()); assertThat(security13.getName(), is("Lyxor MSCI Emerging Markets UCITS ETF")); assertThat(security13.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -1486,6 +1556,111 @@ public void testTagesauszug06WithSecurityInUSD() is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); } + @Test + public void testTagesauszug07() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Tagesauszug07.txt"), errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(5)); + 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("DE0009786285")); + assertNull(security.getWkn()); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("Deka-EuropaPotential TF")); + assertThat(security.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("2023-02-24T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(33.823))); + assertThat(transaction.getSource(), is("Tagesauszug07.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(63.47)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(78.81)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(15.34)))); + 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("2023-02-24T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(8.848))); + assertThat(transaction.getSource(), is("Tagesauszug07.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.61)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.62)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.01)))); + 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("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.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(63.47)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(63.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 2st 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("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.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.61)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.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)))); + } + @Test public void testQuartalsbericht01() { @@ -1503,66 +1678,88 @@ public void testQuartalsbericht01() 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)); @@ -2959,4 +3156,627 @@ public void testQuartalsbericht01() assertThat(transaction.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); + + assertThat(errors, empty()); + assertThat(results.size(), is(13)); + 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-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(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-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(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-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(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-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(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-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(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-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(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-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(177.6))); + 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)))); + } + + @Test + public void testQuartalsbericht03() + { + DekaBankPDFExtractor extractor = new DekaBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Quartalsbericht03.txt"), errors); + + assertThat(errors, empty()); + 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 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() + .orElseThrow(IllegalArgumentException::new).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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.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("Jahresbericht01.txt")); + assertThat(transaction.getNote(), is("Depotpreis für 2022")); + } } 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/Jahresbericht01.txt new file mode 100644 index 0000000000..b4cd1a433d --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Jahresbericht01.txt @@ -0,0 +1,246 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.61.3 +----------------------------------------- +DekaBank +Herrn Deutsche +Max Mustermann +Stöckach Girozentrale +Franken 7 +88888 Dorf +Januar 2023 +Depotservice +DekaBank Depot +60625 Frankfurt am Main +DekaBank Depot Nr. 0119788888 Telefon (0 69) 71 47 - 6 52 +Jahresdepotauszug und Quartalsbericht per 31.12.2022 Telefax (0 69) 25 46 - 24 83 +www.deka.de +Sehr geehrter Herr Mustermann, +Vorstand +Dr. Georg Stocker +herzlichen Dank, dass Sie der DekaBank auch im vergangenen Jahr Ihr Vertrauen (Vorsitzender) +Dr. Matthias Danne +geschenkt haben. (Stellv. Vorsitzender) +Birgit Dietl-Benzin +Das Kapitalmarktjahr 2022 war vor dem Hintergrund vielfältiger Krisen eines der schwie- Daniel KapfferTorsten Knapmeyer +rigsten der vergangenen Jahrzehnte. Es gibt jedoch gute Chancen, dass die damit ver- Martin K. Müller +bundenen Kursrückgänge in den kommenden Jahren auf breiter Front mehr als aufge- Verwaltungsratsvorsitzender +holt werden. Bereits im neuen Jahr besteht die Perspektive, dass die Weltwirtschaft - Helmut Schleweis +zum Vorteil Ihrer Wertpapierbestände - wieder auf ihren Wachstumspfad einschwenkt. +Gerade in diesen Zeiten zeigt das regelmäßige Investieren seine Stärken, denn Sparer- USt-Id-Nr. +DE 114103563 +innen und Sparer können sehr günstige Einstiegskurse nutzen. +Handelsregister +Wenn sich ab dem kommenden Jahr die Inflationsraten in Richtung der Notenbankziele AmtsgerichtFrankfurt am Main +bewegen, sollte dies an den Aktien- und Rentenmärkten den Boden für einen neuen HRA 16068 +Aufwärtstrend bereiten. Angesichts der anhaltenden Unsicherheit dürfte dieser zunächst Sitz +jedoch weiterhin von Kursschwankungen begleitet werden. Wie geht es mit Inflation, Frankfurt am Main, Berlin +Zinsen und Wirtschaft weiter? In unserem Podcast „Mikro trifft Makro“ erhalten Sie +einen Überblick über die aktuelle Lage an den Kapitalmärkten. Den QR-Code bzw. den +Link hierzu finden Sie am Ende dieses Anschreibens. +In der Anlage dieses Schreibens erhalten Sie heute Ihren Jahresdepotauszug und +Quartalsbericht mit der Depotübersicht und der Umsatz-Jahresübersicht für das +Kalenderjahr 2022. Vereinbaren Sie gerne einen Beratungstermin bei Ihrer Sparkasse, um +auf Basis dieser Unterlagen zu besprechen, ob Ihre Geldanlagen noch zu Ihren Zielen +und Wünschen passen und wie der für Sie passende Anlagemix aussieht. +Wichtiger Hinweis zur Jahressteuerbescheinigung: Aufgrund rechtlicher Vorgaben +müssen die Jahressteuerbescheinigung und weitere Dokumente zum Jahresabschluss +getrennt versendet werden. Sie erhalten daher diese erstmalig mit einem separaten +Schreiben, welches Ihnen in Ihr elektronisches Postfach beziehungsweise auf posta- +lischem Weg zugestellt wird. +jcbZnudASV:jcbZ +Erläuterungen zur Depot- und Umsatz-Jahresübersicht finden Sie auf ZlXZbAGvyY2ZlXZczcRTQYZwVZaacR +Hm69hWwmcZOjupX +www.deka.de/privatkunden/depotberichte oder Qg;b1RdMKJG:HL:BuKL0pjYnBL3F72 +3IgRrlgdEYKKG1P +scannen Sie den nebenstehenden QR-Code. rpp:c0Bfy5Z8oIXZohZecKWNJlzeI: +vppXvzLtLPXlTDP +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 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 +Jahresdepotauszug und Quartalsbericht +per 31.12.2022 +Depotübersicht +Seite: 1 +Depot: 0119788888 +Depotinhaber: +Max Mustermann +Daten für den automatisierten Kirchensteuerabzug liegen +für 2023 vor +Freistellungsauftrag liegt per 31.12.2022 nicht vor +Herrn +Max Mustermann +OT +Straße 7 +88888 Dorf +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 31.12.2022* seit 31.12.2021 1 +LU0348413815 00 Deka-Nachhaltigkeit Gesundheit TF 5.809,41 -108,27 +DE000DK2CFT3 00 Deka-BasisAnlage offensiv 2.296,78 -302,58 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Max Mustermann +DE0009786285 00 Deka-EuropaPotential TF 4.423,71 -2.333,79 +DE0009786285 01 Deka-EuropaPotential TF 1.157,23 -610,51 +Gesamt in EUR 13.687,13 -3.355,15 +* Beachten Sie hierzu bitte die Erläuterungen unter www.deka.de/privatkunden/depotberichte. +1 Hinweis: Der letzte Handelstag kann stichtagsbezogen vom Quartalsultimo abweichen. +Depotpreis inkl. Mehrwertsteuer (MwSt): +12,50 EUR inkl. 2,00 EUR MwSt wurden für 2022 belastet +Entgelte werden gemäß Preis- und Leistungsverzeichnis erhoben. +Wichtiger Hinweis zur Steuerbescheinigung: +Die Steuerbescheinigung für 2022 erhalten Sie gesondert. +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. +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 +Jahresdepotauszug und Quartalsbericht +per 31.12.2022 +Depotübersicht +Seite: 2 +Depot: 0119788888 +Depotinhaber: +Max Musterann +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.2022: +Mandatsreferenz: 0119701788888 (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.2023 +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.2022 +Umsatz-Jahresübersicht +Seite 1 +Depot: 0119788888 +Depotinhaber: +Max Mustermann +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.2022 5.917,68 407,750000 14,513 +Bewertung mit dem Rücknahmepreis vom 30.12.2021 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2022 5.809,41 400,290000 14,513 +Bewertung mit dem Rücknahmepreis vom 30.12.2022 +Deka-BasisAnlage offensiv +ISIN: DE000DK2CFT3 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.2022 2.167,36 233,300000 9,290 +Bewertung mit dem Rücknahmepreis vom 30.12.2021 +Kauf 36,00 241,140000 +0,149 18.01.2022 18.01.2022 +Kauf 36,00 232,640000 +0,155 16.02.2022 16.02.2022 +Kauf 36,00 218,350000 +0,165 16.03.2022 16.03.2022 +Kauf 36,00 227,840000 +0,158 20.04.2022 20.04.2022 +Kauf 36,00 218,170000 +0,165 17.05.2022 17.05.2022 +Kauf 36,00 207,270000 +0,174 17.06.2022 17.06.2022 +Kauf 36,00 216,100000 +0,167 18.07.2022 18.07.2022 +Kauf 36,00 232,850000 +0,155 16.08.2022 16.08.2022 +Kauf 36,00 221,750000 +0,162 16.09.2022 16.09.2022 +Kauf 36,00 208,890000 +0,172 18.10.2022 18.10.2022 +Kauf 36,00 221,220000 +0,163 16.11.2022 16.11.2022 +Kauf 36,00 218,630000 +0,165 16.12.2022 16.12.2022 +Summe der Betragsbewegungen 432,00 +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.2022 +Umsatz-Jahresübersicht +Seite 2 +Depot: 01197088888 +Depotinhaber: +AMax Mustermann +Deka-BasisAnlage offensiv +ISIN: DE000DK2CFT3 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 +Fortsetzung von vorheriger Seite +Bestand am 31.12.2022 2.296,78 204,340000 11,240 +Bewertung mit dem Rücknahmepreis vom 30.12.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 01.01.2022 6.757,50 199,790000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.12.2021 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2022 4.423,71 130,790000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.12.2022 +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 01.01.2022 1.767,74 199,790000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.12.2021 +Summe der Betragsbewegungen 0,00 +Bestand am 31.12.2022 1.157,23 130,790000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.12.2022 +Dieser Depotauszug 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 \ No newline at end of file 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 new file mode 100644 index 0000000000..8ce135c4fd --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht02.txt @@ -0,0 +1,299 @@ +PDFBox Version: 1.8.16 +Portfolio Performance Version: 0.60.1 +----------------------------------------- +DekaBank +Herrn Deutsche +xxx +xxxx Girozentrale +xxxx +Juli 2022 +Depotservice +DekaBank Depot +60625 Frankfurt am Main +DekaBank Depot Nr. 0140484429 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 XXX, +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: xxxxx +Depotinhaber: +xxxx +Herrn +xxxxx +xxxx +xxxx +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 30.06.2022 seit 31.03.2022 1 +DE000DK2CDS0 00 Deka-DividendenStrategie CF (A) 2.789,05 -195,79 +LU1508359509 00 Deka-Industrie 4.0 CF 5.107,49 -1.141,20 +DE0008474503 00 DekaFonds CF 2.358,86 -390,35 +DE0009771824 99 Deka-VarioInvest TF 164,66 -3,50 +Gesamt in EUR 10.420,06 -1.730,84 +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 Rheinhessen Sparkasse an. Diese beraten Sie gerne. +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 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 +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: xxxxxx +Depotinhaber: +xxxxx + +Deka-DividendenStrategie CF (A) +ISIN: DE000DK2CDS0 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 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 +Lastschrifteinzug 50,00 186,290000 +0,268 10.05.2022 10.05.2022 +Mandatsreferenz: 0140484429003 +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 +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 + +Deka-Industrie 4.0 CF +ISIN: LU1508359509 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.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 +Lastschrifteinzug 100,00 162,430000 +0,616 10.05.2022 10.05.2022 +Mandatsreferenz: 0140484429003 +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: 0140484429 +Depotinhaber: +XXXX XXXX + +Deka-Industrie 4.0 CF +ISIN: LU1508359509 Unterdepot: 00 +Verwahrart: GiroSammel +Umsatzart Ein-/Auszahlung Ein-/Auszahlung Preis je Anteil Abgerechnete Buchungs- Abrech- +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 +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 + +DekaFonds CF +ISIN: DE0008474503 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 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 +Lastschrifteinzug 50,00 112,870000 +0,443 10.05.2022 10.05.2022 +Mandatsreferenz: 0140484429003 +Lastschrifteinzug 50,00 116,300000 +0,430 10.06.2022 10.06.2022 +Mandatsreferenz: 0140484429003 +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 +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.2022 +Umsatzübersicht +Seite 3 +Depot: 0140484429 +Depotinhaber: +xxx xxx + +Deka-VarioInvest TF +ISIN: DE0009771824 Unterdepot: 99 +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 168,16 63,890000 2,632 +Bewertung mit dem Rücknahmepreis vom 31.03.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 30.06.2022 164,66 62,560000 2,632 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Dieser Report 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 \ No newline at end of file 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 new file mode 100644 index 0000000000..f853acffd0 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Quartalsbericht03.txt @@ -0,0 +1,177 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.61.3 +----------------------------------------- +DekaBank +Herrn Deutsche +Max Mustermann +OT +Frankenweg 55 +85794 dorf +Oktober 2022 +Depotservice +DekaBank Depot +60625 Frankfurt am Main +DekaBank Depot Nr. 0119708888 Telefon (0 69) 71 47 - 6 52 +Ihr Bericht für das dritte Quartal 2022 Telefax (0 69) 25 46 - 24 83 +www.deka.de +Sehr geehrter Herr Max, +Vorstand +Dr. Georg Stocker +heute erhalten Sie den Bericht für das dritte Quartal 2022 zu Ihrem DekaBank Depot. (Vorsitzender) +Dr. Matthias Danne +(Stellv. Vorsitzender) +Im Juli 2022 hat die Europäische Zentralbank zum ersten Mal seit elf Jahren die Leitzin- Birgit Dietl-Benzin +sen erhöht. Damit ist klar: Die rund vier Jahrzehnte währende Phase tendenziell sinken- Daniel Kapffer +Torsten Knapmeyer +der Zinsen ist beendet. Und die EZB ist nicht allein. Vielmehr erhöhen die meisten Noten- Martin K. Müller +banken weltweit zügig ihre Leitzinsen, um die Inflation in Schach zu halten. Weitere +Verwaltungsratsvorsitzender +Leitzinserhöhungen sind wahrscheinlich, und damit auch weiter steigende Marktzinsen. Helmut Schleweis +Doch selbst mit den höheren Zinsen gibt es wenig Hoffnung auf positive Realzinsen, +denn die Inflationsraten werden wohl höher bleiben als die sicheren Zinsen. USt-Id-Nr. +DE 114103563 +Zugleich gibt es weiterhin viele Unwägbarkeiten am Horizont: die Folgen des Russland- Handelsregister +Ukraine-Kriegs, die nur schlecht funktionierenden globalen Lieferketten sowie die schon Amtsgericht +Frankfurt am Main +spürbaren Bremswirkungen der gestiegenen Zinsen, beispielsweise bei der Konsumakti- HRA 16068 +vität der privaten Haushalte. An den Wertpapiermärkten kann dies alles in den kom- +Sitz +menden Monaten ungewöhnlich hohe Schwankungen auslösen. Frankfurt am Main, Berlin +Mittelfristig erwarten wir jedoch ein moderates, aber stabiles Wirtschaftswachstum. Da- +mit gehört auch in dem aktuell schwierigeren Marktumfeld das regelmäßige und breit +gestreute Anlegen in Wertpapieren zu den besten Möglichkeiten, um das Ersparte vor +Inflation und damit vor Kaufkraftverlust zu schützen. +Eine gute Nachricht: Der Gesetzgeber hat vorgesehen, den Sparer-Pauschbetrag zum +1. Januar 2023 zu erhöhen. Die Höchstbeträge werden von derzeit 801 EUR für allein- +veranlagte bzw. 1.602 EUR für zusammenveranlagte Personen auf 1.000 EUR bzw. +2.000 EUR erhöht. Das heißt für Sie, dass Ihre Kapitaleinkünfte ab 2023 bis zu diesen +neuen Grenzen steuerfrei bleiben. +Für Ihren bereits erteilten Freistellungsauftrag sieht der Gesetzgeber mit Wirkung zum +1. Januar 2023 eine automatische Erhöhung um 24,844% vor. +Sie müssen nichts tun! +Die Höhe Ihres bei uns hinterlegten Freistellungsauftrages finden Sie in Ihrem Jahresde- +potauszug in der Depotübersicht und dort unter „Sparer-Pauschbetrag“. +Weitere Informationen zum „Sparer-Pauschbetrag“ und der Anpassung der Höchstbe- +träge finden Sie unter www.deka.de/investmentsteuer. +Sie haben Fragen? Sie erreichen uns montags bis freitags von 8.00 bis 18.00 Uhr telefo- +nisch 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 Vertriebs-, Produktmanagement Leiter Digitales Multikanalmanagement +und Marketing +Quartalsbericht per 30.09.2022 +Depotübersicht +Seite: 1 +Depot: 0119708888 +Depotinhaber: +Max Mustermann +Herrn +Max Mustermann +OT +Frankenweg 55 +87594 Dorf +ISIN Unter- Bezeichnung Wert Wertentwicklung +depot in EUR in EUR +per 30.09.2022 seit 30.06.2022 1 +LU0348413815 00 Deka-Nachhaltigkeit Gesundheit TF 5.656,15 -76,63 +DE000DK2CFT3 00 Deka-BasisAnlage offensiv 2.146,60 -27,88 +VL-Vertrag: gesperrt bis zum 31.12.2024 +Vertragsinhaber: Max Mustermann +DE0009786285 00 Deka-EuropaPotential TF 4.128,44 -580,06 +DE0009786285 01 Deka-EuropaPotential TF 1.079,99 -151,74 +Gesamt in EUR 13.011,18 -836,31 +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. +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 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 +Quartalsbericht per 30.09.2022 +Umsatzübersicht +Seite 1 +Depot: 0119788888 +Depotinhaber: +Max Mustermann + +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 30.06.2022 5.732,78 395,010000 14,513 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 30.09.2022 5.656,15 389,730000 14,513 +Bewertung mit dem Rücknahmepreis vom 30.09.2022 + +Deka-BasisAnlage offensiv +ISIN: DE000DK2CFT3 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 30.06.2022 2.066,48 201,490000 10,256 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Kauf 36,00 216,100000 +0,167 18.07.2022 18.07.2022 +Kauf 36,00 232,850000 +0,155 16.08.2022 16.08.2022 +Kauf 36,00 221,750000 +0,162 16.09.2022 16.09.2022 +Summe der Betragsbewegungen 108,00 +Bestand am 30.09.2022 2.146,60 199,870000 10,740 +Bewertung mit dem Rücknahmepreis vom 30.09.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.09.2022 +Umsatzübersicht +Seite 2 +Depot: 0119701779 +Depotinhaber: +Max 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 30.06.2022 4.708,50 139,210000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 30.09.2022 4.128,44 122,060000 33,823 +Bewertung mit dem Rücknahmepreis vom 30.09.2022 + +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.2022 1.231,73 139,210000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.06.2022 +Summe der Betragsbewegungen 0,00 +Bestand am 30.09.2022 1.079,99 122,060000 8,848 +Bewertung mit dem Rücknahmepreis vom 30.09.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 \ No newline at end of file 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 new file mode 100644 index 0000000000..b6b6fd457a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dekabank/Tagesauszug07.txt @@ -0,0 +1,75 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.61.3 +----------------------------------------- +Wertpapierabrechnung +Depot-Tagesauszug +Depot: 0119788888 +Depotinhaber: +Herrn Max Mustermann +Max Mustermann +Stöckach Bankverbindung generell:IBAN: +Strasse 7 DExx xxx5 0101 xxxx xxx2 87 +88888 Dorf Spk Schweinfurt-Haßberge +Kontoinhaber: +Mustermann, Max +Vollmachten: +Vollmacht Leben/Tod Karl Mustermann +24. Februar 2023 +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: 24.02.2023 +Anteilbestand am Ertragstermin: 33,823 +Ausschüttung (pro Anteil EUR 2,3300000): EUR 78,81 +Bezeichnung: Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 00 Auftragsnummer: 9457 2850 +Verwahrart: GiroSammel Abrechnungstag: 24.02.2023 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +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 +Kirchensteuer wurde berücksichtigt. + +ERTRAGSAUSSCHÜTTUNG / KAUF AUS ERTRAG +Ertragstermin: 24.02.2023 +Anteilbestand am Ertragstermin: 8,848 +Ausschüttung (pro Anteil EUR 2,3300000): EUR 20,62 +Bezeichnung: Deka-EuropaPotential TF +ISIN: DE0009786285 Unterdepot: 01 Auftragsnummer: 9457 2851 +Verwahrart: GiroSammel Abrechnungstag: 24.02.2023 +Abrechnungsbetrag Betrag in Währung Wertpapierdaten Bestandsdaten +des Wertpapiers je Anteil in Stück +Ausschüttung EUR 20,62 Kurs/Kaufpreis Bestand alt: 8,848 +- Verrechnete Steuern EUR 4,01 EUR 16,61 EUR 138,830000 Anteilumsatz: 0,120 +=Wiederanlagebetrag EUR 16,61 Bestand neu: 8,968 +Kirchensteuer wurde berücksichtigt. +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: 0119788888 +Auszug: 1 / Seite 2 von 2 +Aktuelle steuerliche Daten +Stückzinsen und realisierte Veräußerungsverluste EUR 0,00 +(sonstiger Verlusttopf) +Verfügbarer Sparer-Pauschbetrag EUR 0,00 +Alle steuerlich relevanten Informationen und Daten des aktuellen Jahres werden Ihnen mit der +Steuerbescheinigung übersandt, welche Sie bis Ende Februar 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). +Eine evtl. Meldepflicht nach § 63ff. der Außenwirtschaftsverordnung (AWV) erfüllt die DekaBank. +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 \ No newline at end of file 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 7a5d349bc6..959377bb08 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 @@ -30,6 +30,7 @@ public DekaBankPDFExtractor(Client client) addBuySellTransaction(); addSwapBuyTransaction(); addSwapSellTransaction(); + addReinvestTransaction(); addDividendeTransaction(); addDepotStatementTransaction(); } @@ -52,7 +53,7 @@ private void addBuySellTransaction() return entry; }); - Block firstRelevantLine = new Block("^(LASTSCHRIFTEINZUG|VERKAUF|KAUF AUS ERTRAG)( .*)?$"); + Block firstRelevantLine = new Block("^(LASTSCHRIFTEINZUG|VERKAUF|KAUF AUS ERTRAG).*$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); @@ -65,43 +66,57 @@ private void addBuySellTransaction() t.setType(PortfolioTransaction.Type.SELL); }) - // 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 - .section("name", "isin", "currency").optional() - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[\\w]{12})( .*)?$") - .match("^.* (?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: (\\-)?[\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - - // Bezeichnung: Deka-EuropaPotential TF - // ISIN: DE0009786285 - // Kurs - // EUR 82,110000 - .section("name", "isin", "currency").optional() - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[\\w]{12})$") - .find("Kurs(\\/Kaufpreis)?") - .match("^(?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - + .oneOf( + // @formatter:off + // 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 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .match("^Bezeichnung: (?.*)$") + .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 + // Bezeichnung: Deka-EuropaPotential TF + // ISIN: DE0009786285 + // Kurs + // EUR 82,110000 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .match("^Bezeichnung: (?.*)$") + .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))) + ) + + // @formatter:off // =Abrechnungsbetrag EUR 4.000,00 EUR 4.000,00 EUR 187,770000 Anteilumsatz: 21,303 // Anteilumsatz: -28,939 + // @formatter:on .section("shares") - .match("^(.* )?Anteilumsatz: (\\-)?(?[\\.,\\d]+)$") + .match("^.*Anteilumsatz: (\\-)?(?[\\.,\\d]+)$") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + // @formatter:off // Verwahrart: GiroSammel Abrechnungstag: 18.05.2021 // Abrechnungstag: 14.10.2021 + // @formatter:on .section("date") - .match("^(.* )?Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") .assign((t, v) -> t.setDate(asDate(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 + // @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"))); @@ -124,60 +139,79 @@ private void addSwapBuyTransaction() return entry; }); - Block firstRelevantLine = new Block("^TAUSCH\\/KAUF( .*)?$", "^Bestand neu: .*$"); + Block firstRelevantLine = new Block("^TAUSCH\\/KAUF.*$", "^Bestand neu:.*$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); pdfTransaction - // zu Gunsten - // Bezeichnung: Deka-Liquidität: EURO TF - // ISIN: DE0009771824 - // Kurs/Kaufpreis - // EUR 65,000000 - .section("name", "isin", "currency").optional() - .match("^zu Gunsten$") - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[\\w]{12})( .*)?$") - .find("Kurs(\\/Kaufpreis)?") - .match("^(?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - - // zu Gunsten - // Bezeichnung: Deka Deutsche Börse EUROGOV Germany Money Market UCITS ETF - // ISIN: DE000ETFL227 Unterdepot: 00 Auftragsnummer: 9704 9385 - .section("name", "isin", "currency").optional() - .match("^zu Gunsten$") - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[\\w]{12})( .*)?$") - .find("Kurs(\\/Kaufpreis)? .*") - .match("^Abrechnungsbetrag .* (?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: [\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - + .oneOf( + // @formatter:off + // zu Gunsten + // Bezeichnung: Deka-Liquidität: EURO TF + // ISIN: DE0009771824 + // Kurs/Kaufpreis + // EUR 65,000000 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .find("^zu Gunsten$") + .match("^Bezeichnung: (?.*)$") + .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))) + , + // @formatter:off + // zu Gunsten + // Bezeichnung: Deka Deutsche Börse EUROGOV Germany Money Market UCITS ETF + // ISIN: DE000ETFL227 Unterdepot: 00 Auftragsnummer: 9704 9385 + // Kurs/Kaufpreis Bestand alt: 0,213 + // Abrechnungsbetrag EUR 41,33 EUR 41,33 EUR 69,204000 Anteilumsatz: 0,597 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .find("^zu Gunsten$") + .match("^Bezeichnung: (?.*)$") + .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))) + ) + + // @formatter:off // Anteilumsatz: 5,112 // Abrechnungsbetrag EUR 29,42 EUR 29,42 EUR 69,204000 Anteilumsatz: 0,425 + // @formatter:on .section("shares") - .match("^(.* )?Anteilumsatz: (?[\\.,\\d]+)$") + .match("^.*Anteilumsatz: (?[\\.,\\d]+)$") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + // @formatter:off // Verwahrart: GiroSammel Abrechnungstag: 18.05.2021 // Abrechnungstag: 06.06.2018 + // @formatter:on .section("date") - .match("^(.* )??Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") .assign((t, v) -> t.setDate(asDate(v.get("date")))) + // @formatter:off // Abrechnungsbetrag EUR 332,31 EUR 332,31 + // @formatter:on .section("currency", "amount") - .match("^Abrechnungsbetrag (?[\\w]{3}) (?[\\.,\\d]+)( .*)?$") + .match("^Abrechnungsbetrag (?[\\w]{3}) (?[\\.,\\d]+).*$") .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) + // @formatter:off // Abrechnungsbetrag EUR 6,22 USD 6,88 USD 102,155229 Anteilumsatz: 0,067 + // Devisenkurs Bestand neu: 1,027 // USD 1,106630 + // @formatter:on .section("currency", "gross", "fxCurrency", "fxGross", "termCurrency", "exchangeRate").optional() - .match("^Abrechnungsbetrag (?[\\w]{3}) (?[\\.,\\d]+) (?[\\w]{3}) (?[\\.,\\d]+) .*$") - .find("Devisenkurs .*$") + .match("^Abrechnungsbetrag (?[\\w]{3}) (?[\\.,\\d]+) (?[\\w]{3}) (?[\\.,\\d]+).*$") + .find("Devisenkurs.*$") .match("^(?[\\w]{3}) (?[\\.,\\d]+)$") .assign((t, v) -> { v.put("baseCurrency", asCurrencyCode(v.get("currency"))); @@ -208,53 +242,67 @@ private void addSwapSellTransaction() return entry; }); - Block firstRelevantLine = new Block("^TAUSCH\\/VERKAUF( .*)?$", "^Bestand neu: .*$"); + Block firstRelevantLine = new Block("^TAUSCH\\/VERKAUF.*$", "^Bestand neu:.*$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); pdfTransaction - // zu Lasten - // Bezeichnung: Deka-EuropaPotential TF - // ISIN: DE0009786285 - // Kurs - // EUR 128,610000 - .section("name", "isin", "currency").optional() - .match("zu Lasten") - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[\\w]{12})( .*)?$") - .find("Kurs(\\/Kaufpreis)?") - .match("^(?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - - // zu Lasten - // Bezeichnung: Deka-Industrie 4.0 CF - // ISIN: LU1508359509 Unterdepot: 00 Auftragsnummer: 8108 0595 - // Kurs Bestand alt: 0,277 - // Abrechnungsbetrag EUR 14,74 EUR 14,74 EUR 177,620000 Anteilumsatz: -0,083 - .section("name", "isin", "currency").optional() - .match("^zu Lasten$") - .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[\\w]{12})( .*)?$") - .find("Kurs(\\/Kaufpreis)? .*") - .match("^Abrechnungsbetrag .* (?[\\w]{3}) [\\.,\\d]+ Anteilumsatz: (\\-)?[\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - + .oneOf( + // @formatter:off + // zu Lasten + // Bezeichnung: Deka-EuropaPotential TF + // ISIN: DE0009786285 + // Kurs + // EUR 128,610000 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .find("zu Lasten") + .match("^Bezeichnung: (?.*)$") + .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))) + , + // @formatter:off + // zu Lasten + // Bezeichnung: Deka-Industrie 4.0 CF + // ISIN: LU1508359509 Unterdepot: 00 Auftragsnummer: 8108 0595 + // Kurs Bestand alt: 0,277 + // Abrechnungsbetrag EUR 14,74 EUR 14,74 EUR 177,620000 Anteilumsatz: -0,083 + // @formatter:on + section -> section + .attributes("name", "isin", "currency") + .find("^zu Lasten$") + .match("^Bezeichnung: (?.*)$") + .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))) + ) + + // @formatter:off // Anteilumsatz: -2,598 // Abrechnungsbetrag EUR 14,74 EUR 14,74 EUR 177,620000 Anteilumsatz: -0,083 + // @formatter:on .section("shares") - .match("^(.* )?Anteilumsatz: \\-(?[\\.,\\d]+)$") + .match("^.*Anteilumsatz: \\-(?[\\.,\\d]+)$") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + // @formatter:off // Verwahrart: GiroSammel Abrechnungstag: 18.05.2021 // Abrechnungstag: 06.06.2018 + // @formatter:on .section("date") - .match("^(.* )?Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") .assign((t, v) -> t.setDate(asDate(v.get("date")))) + // @formatter:off // Auszahlungsbetrag EUR 206,74 // Abrechnungsbetrag EUR 14,74 EUR 14,74 EUR 177,620000 Anteilumsatz: -0,083 + // @formatter:on .section("currency", "amount") - .match("^(Auszahlungsbetrag|Abrechnungsbetrag) (?[\\w]{3}) (?[.,\\d]+)( .*)?$") + .match("^(Auszahlungsbetrag|Abrechnungsbetrag) (?[\\w]{3}) (?[.,\\d]+).*$") .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); @@ -265,12 +313,74 @@ private void addSwapSellTransaction() addTaxesSectionsTransaction(pdfTransaction, type); } + private void addReinvestTransaction() + { + DocumentType type = new DocumentType("ERTRAGSAUSSCH.TTUNG \\/ KAUF AUS ERTRAG"); + this.addDocumentTyp(type); + + Transaction pdfTransaction = new Transaction<>(); + pdfTransaction.subject(() -> { + BuySellEntry entry = new BuySellEntry(); + entry.setType(PortfolioTransaction.Type.BUY); + return entry; + }); + + Block firstRelevantLine = new Block("^ERTRAGSAUSSCH.TTUNG \\/ KAUF AUS ERTRAG$"); + 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))) + + // @formatter:off + // - Verrechnete Steuern EUR 15,34 EUR 63,47 EUR 138,830000 Anteilumsatz: 0,457 + // @formatter:on + .section("shares") + .match("^.* Anteilumsatz: (?[\\.,\\d]+)$") + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + + // @formatter:off + // 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")))) + + // @formatter:off + // =Wiederanlagebetrag EUR 63,47 Bestand neu: 34,280 + // @formatter:on + .section("currency", "amount") + .match("^.*Wiederanlagebetrag (?[\\w]{3}) (?[\\.,\\d]+).*$") + .assign((t, v) -> { + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + }) + + // @formatter:off + // =Wiederanlagebetrag EUR 63,47 Bestand neu: 34,280 + // @formatter:on + .section("note") + .match("^.*(?Wiederanlage).* [\\w]{3} [\\.,\\d]+.*$") + .assign((t, v) -> t.setNote(trim(v.get("note")))) + + .wrap(BuySellEntryItem::new); + } + private void addDividendeTransaction() { DocumentType type = new DocumentType("ERTRAGSAUSSCH.TTUNG"); this.addDocumentTyp(type); - Block block = new Block("^ERTRAGSAUSSCH.TTUNG$", "^Bestand neu: .*$"); + Block block = new Block("^ERTRAGSAUSSCH.TTUNG.*$"); type.addBlock(block); Transaction pdfTransaction = new Transaction().subject(() -> { AccountTransaction entry = new AccountTransaction(); @@ -279,26 +389,34 @@ 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 - .section("currency", "name", "isin").optional() + // @formatter:on + .section("currency", "name", "isin") .match("^Aussch.ttung .* (?[\\w]{3}) [\\.,\\d]+$") .match("^Bezeichnung: (?.*)$") - .match("^ISIN: (?[\\w]{12})( .*)?$") + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") .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")))) - + + // @formatter:off // Verwahrart: GiroSammel Abrechnungstag: 31.03.2022 + // @formatter:on .section("date") - .match("^.* Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .match("^.*Abrechnungstag: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") .assign((t, v) -> t.setDateTime(asDate(v.get("date")))) - + + // @formatter:off // Ausschüttung EUR 0,14 Kurs Bestand alt: 0,739 + // @formatter:on .section("currency", "amount") .match("^Aussch.ttung (?[\\w]{3}) (?[.,\\d]+) .*$") .assign((t, v) -> { @@ -306,6 +424,17 @@ private void addDividendeTransaction() t.setAmount(asAmount(v.get("amount"))); }) + // 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 + .section("currency", "tax").optional() + .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); addTaxesSectionsTransaction(pdfTransaction, type); @@ -318,7 +447,7 @@ 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: (?[\\w]{12}) .*$"); + Pattern pIsin = Pattern.compile("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$"); int endBlock = lines.length; String securityCurrency = CurrencyUnit.EUR; @@ -362,7 +491,12 @@ public void addDepotStatementTransaction() }); this.addDocumentTyp(type); - Block buySellBlock = new Block("^(Lastschrifteinzug|Verkauf) .*$"); + // @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(() -> { @@ -371,20 +505,15 @@ public void addDepotStatementTransaction() return entry; }) - // Is type --> "Verkauf" change from BUY to SELL - .section("type").optional() - .match("^(?(Lastschrifteinzug|Verkauf)) .*$") - .assign((t, v) -> { - if (v.get("type").equals("Verkauf")) - t.setType(PortfolioTransaction.Type.SELL); - }) - - // Lastschrifteinzug 250,00 198,660000 +1,258 01.04.2021 01.04.2021 - .section("amount", "shares", "date") - .match("^(Lastschrifteinzug|Verkauf) (?[\\.,\\d]+) [\\.,\\d]+ [\\-|\\+](?[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + .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(); + // Is sign --> "-" change from BUY to SELL + if (v.get("type").equals("-")) + t.setType(PortfolioTransaction.Type.SELL); + Security securityData = getSecurity(context, v.getStartLineNumber()); if (securityData != null) { @@ -392,7 +521,7 @@ public void addDepotStatementTransaction() v.put("isin", securityData.getIsin()); v.put("currency", asCurrencyCode(securityData.getCurrency())); } - + t.setDate(asDate(v.get("date"))); t.setShares(asShares(v.get("shares"))); t.setAmount(asAmount(v.get("amount"))); @@ -406,7 +535,11 @@ public void addDepotStatementTransaction() return null; })); - Block deliveryInOutbondblock = new Block("^(Einbuchung|Ausbuchung) .*$"); + // @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(() -> { @@ -415,18 +548,58 @@ public void addDepotStatementTransaction() return transaction; }) - // Is type --> "Ausbuchung" change from DELIVERY_INBOUND to DELIVERY_OUTBOUND - .section("type").optional() - .match("^(?(Einbuchung|Ausbuchung)) .*$") + .section("type", "shares", "date") + .match("^(Einbuchung|Ausbuchung) .* (?[\\-|\\+])(?[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") .assign((t, v) -> { - if (v.get("type").equals("Ausbuchung")) + Map context = type.getCurrentContext(); + + // Is sign --> "-" change from DELIVERY_INBOUND to DELIVERY_OUTBOUND + if (v.get("type").equals("-")) t.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); + + 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(0L); + t.setCurrencyCode(asCurrencyCode(context.get("accountCurrency"))); + t.setSecurity(getOrCreateSecurity(v)); }) + // @formatter:off // Ausbuchung w/ Fusion -2,140 31.05.2021 28.05.2021 // Einbuchung w/ Fusion +1,315 31.05.2021 28.05.2021 - .section("shares", "date") - .match("^(Einbuchung|Ausbuchung) .* [\\-|\\+](?[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") + // @formatter:on + .section("note").optional() + .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; + })); + + // @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.*$"); + type.addBlock(dividendeBlock); + 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(); @@ -437,19 +610,46 @@ public void addDepotStatementTransaction() 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(0L); + t.setAmount(asAmount(v.get("amount"))); t.setCurrencyCode(asCurrencyCode(context.get("accountCurrency"))); t.setSecurity(getOrCreateSecurity(v)); }) - // Ausbuchung w/ Fusion -2,140 31.05.2021 28.05.2021 - // Einbuchung w/ Fusion +1,315 31.05.2021 28.05.2021 - .section("note").optional() - .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; + })); + + // @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.*$"); + type.addBlock(feesBlock); + 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")); + }) .wrap(t -> { if (t.getCurrencyCode() != null) @@ -461,9 +661,12 @@ public void addDepotStatementTransaction() 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 + // @formatter:on .section("currency", "tax").optional() - .match("^\\+ Verrechnete Steuern (?[\\w]{3}) (?[\\.,\\d]+)$") + .match("^[\\-|\\+] Verrechnete Steuern (?[\\w]{3}) (?[\\.,\\d]+).*$") .assign((t, v) -> processTaxEntries(t, v, type)); }