Skip to content

Commit

Permalink
Modify Baader PDF-Importer to support new transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
Nirus2000 authored and buchen committed Oct 30, 2023
1 parent 79331af commit 1858cb8
Show file tree
Hide file tree
Showing 3 changed files with 198 additions and 54 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,5 @@
package name.abuchen.portfolio.datatransfer.pdf.baaderbank;

import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsEmptyCollection.empty;
import static org.junit.Assert.assertNull;

import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.check;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.dividend;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount;
Expand All @@ -28,6 +19,14 @@
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.withFailureMessage;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsEmptyCollection.empty;
import static org.junit.Assert.assertNull;

import java.time.LocalDateTime;
import java.util.ArrayList;
Expand Down Expand Up @@ -2844,49 +2843,6 @@ public void testDividende13()
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(30.00))));
}

@Test
public void testDividende14()
{
BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client());

List<Exception> errors = new ArrayList<>();

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende14.txt"), errors);

assertThat(errors, empty());
assertThat(results.size(), is(2));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// check security
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DE0005557508"));
assertThat(security.getWkn(), is("555750"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Deutsche Telekom AG"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

// check dividends transaction
AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance)
.findFirst().orElseThrow(IllegalArgumentException::new).getSubject();

assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));

assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-04-12T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(13.629)));
assertThat(transaction.getSource(), is("Dividende14.txt"));
assertThat(transaction.getNote(), is("Vorgangs-Nr.: 00000000"));

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.54))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.54))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
}

@Test
public void testDividende13WithSecurityInEUR()
{
Expand Down Expand Up @@ -2934,6 +2890,49 @@ public void testDividende13WithSecurityInEUR()
assertThat(s, is(Status.OK_STATUS));
}

@Test
public void testDividende14()
{
BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client());

List<Exception> errors = new ArrayList<>();

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende14.txt"), errors);

assertThat(errors, empty());
assertThat(results.size(), is(2));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// check security
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DE0005557508"));
assertThat(security.getWkn(), is("555750"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Deutsche Telekom AG"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

// check dividends transaction
AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance)
.findFirst().orElseThrow(IllegalArgumentException::new).getSubject();

assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));

assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-04-12T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(13.629)));
assertThat(transaction.getSource(), is("Dividende14.txt"));
assertThat(transaction.getNote(), is("Vorgangs-Nr.: 00000000"));

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.54))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.54))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
}

@Test
public void testDividendeStorno01()
{
Expand Down Expand Up @@ -3091,6 +3090,82 @@ public void testDividendeStorno03WithSecurityInEUR()
})))));
}

@Test
public void testDividendeStorno04()
{
BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client());

List<Exception> errors = new ArrayList<>();

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "DividendeStorno04.txt"), errors);

assertThat(errors, empty());
assertThat(countSecurities(results), is(1L));
assertThat(countBuySell(results), is(0L));
assertThat(countAccountTransactions(results), is(1L));
assertThat(results.size(), is(2));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// check security
assertThat(results, hasItem(security( //
hasIsin("US29670E1073"), hasWkn("A2JN57"), hasTicker(null), //
hasName("Essential Properties Real.Tr."), //
hasCurrencyCode("USD"))));

// check cancellation (Storno) transaction
assertThat(results, hasItem(withFailureMessage( //
Messages.MsgErrorOrderCancellationUnsupported, //
dividend( //
hasDate("2023-01-13T00:00"), hasShares(39.00), //
hasSource("DividendeStorno04.txt"), //
hasNote("Vorgangs-Nr.: 19658986"), //
hasAmount("EUR", 1.45), hasGrossValue("EUR", 2.00), //
hasForexGrossValue("USD", 2.17), //
hasTaxes("EUR", 0.49 + 0.04 + 0.02), hasFees("EUR", 0.00)))));
}

@Test
public void testDividendeStorno04WithSecurityInEUR()
{
Security security = new Security("Essential Properties Real.Tr.",
CurrencyUnit.EUR);
security.setIsin("US29670E1073");
security.setWkn("A2JN57");

Client client = new Client();
client.addSecurity(security);

BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(client);

List<Exception> errors = new ArrayList<>();

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "DividendeStorno04.txt"), errors);

assertThat(errors, empty());
assertThat(countSecurities(results), is(0L));
assertThat(countBuySell(results), is(0L));
assertThat(countAccountTransactions(results), is(1L));
assertThat(results.size(), is(1));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// check cancellation (Storno) transaction
assertThat(results, hasItem(withFailureMessage( //
Messages.MsgErrorOrderCancellationUnsupported, //
dividend( //
hasDate("2023-01-13T00:00"), hasShares(39.00), //
hasSource("DividendeStorno04.txt"), //
hasNote("Vorgangs-Nr.: 19658986"), //
hasAmount("EUR", 1.45), hasGrossValue("EUR", 2.00), //
hasTaxes("EUR", 0.49 + 0.04 + 0.02), hasFees("EUR", 0.00), //
check(tx -> {
CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
account.setCurrencyCode(CurrencyUnit.EUR);
Status s = c.process((AccountTransaction) tx, account);
assertThat(s, is(Status.OK_STATUS));
})))));
}

@Test
public void testSteuerausgleichsrechnung01()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.65.4
-----------------------------------------
Baader Bank AG Weihenstephaner Straße 4 85716 Unterschleißheim Scalable Capital GmbH
T 00800 00 586336* F +49 89 5150 2442 [email protected] Seitzstraße 8e
80538 München
[email protected]
Seite 1/2
Herrn München
25.10.2023
Max Mustermann
Aktienstr. 92 Max Mustermann
12345 Musterstadt Stamm-Nr.: 1234567 Portfolio: 1
Depot-Nr.: 1234567890
Vorgangs-Nr.: 19658986
Referenz-Nr.: 473980434
Reklassifizierung
Ex-Tag: 29.12.2022
Nominale ISIN: US29670E1073 WKN: A2JN57 Ausschüttung
STK 39 Essential Properties Real.Tr. USD 0,0557 p.STK
Zahlungszeitraum: 01.01.2022 - 31.12.2022
Zahltag: 13.01.2023
Umrechnungskurs: EUR/USD 1,085
Bruttobetrag USD 2,17
Bruttobetrag EUR 2,00
Kapitalertragsteuer EUR 0,49 -
Kirchensteuer EUR 0,04 -
Solidaritätszuschlag EUR 0,02 -
Zu Gunsten Konto 2320592005 Valuta: 13.01.2023 EUR 1,45
Bitte beachten Sie Ihre eventuelle Meldepflicht nach § 67 AWV.
Einkünfte aus Kapitalvermögen im Sinne von § 20 EStG sind einkommensteuerpflichtig.
Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben.
Scalable Capital GmbH • Geschäftsführung: Erik Podzuweit, Florian Prucker, Martin Krebs, Dirk Urmoneit, Dirk Franzmeyer • HRB 217778, Amtsgericht
München • USt-IdNr. DE300434774 • www.scalable.capital

Herausgeberin und verantwortlich für den Inhalt ist die Baader Bank Aktiengesellschaft • Weihenstephaner Straße 4 • 85716 Unterschleißheim • Deutschland
Vorstand: Nico Baader (Vorsitzender), Oliver Riedel (stv. Vorsitzender) • Vorsitzender des Aufsichtsrates: Helmut Schreyer • Amtsgericht München HRB
121537 • Sitz der Gesellschaft: Unterschleißheim • StNr. 143/107/04009 • USt-IdNr. DE114123893 • LEI: 529900JFOPPEDUR61H13 • T 00800 00 586336*
[email protected] DCUP-055.048

* Kostenfreie Telefonnummer aus dem (inter-) nationalen Festnetz. Für Anrufe aus anderen Netzen können Gebühren anfallen.
Reklassifizierung
Fortsetzung: Seite 2/2
Darstellung der steuerlichen Berechnungsgrundlagen:
Merkposten / Steuertöpfe vorher Erhöhung/Reduktion nachher
Kapitalertragsteuer EUR 57,65 EUR 0,49 EUR 58,14
Bemessungsgrundlagen Steuerpflicht brutto Steuerpflicht netto
Ausschüttung sonstiger Fonds vor Teilfreistellung EUR 2,00 EUR 2,00
Ausschüttung sonstiger Fonds nach Teilfreistellung EUR 2,00 EUR 2,00
Bemessungsgrundlage zur Kapitalertragsteuer bei 9% Kirchensteuer EUR 2,00 EUR 2,00
Bemessungsgrundlage zur Kapitalertragsteuer bei 9% Kirchensteuer
Kapitalertragsteuer 24,45 % EUR 0,49 - EUR 0,49 -
Kirchensteuer 9,00 % EUR 0,04 - EUR 0,04 -
Solidaritätszuschlag 5,50 % EUR 0,02 - EUR 0,02 -
Bitte beachten Sie Ihre eventuelle Meldepflicht nach § 67 AWV.
Einkünfte aus Kapitalvermögen im Sinne von § 20 EStG sind einkommensteuerpflichtig.
Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben.
Scalable Capital GmbH • Geschäftsführung: Erik Podzuweit, Florian Prucker, Martin Krebs, Dirk Urmoneit, Dirk Franzmeyer • HRB 217778, Amtsgericht
München • USt-IdNr. DE300434774 • www.scalable.capital

Herausgeberin und verantwortlich für den Inhalt ist die Baader Bank Aktiengesellschaft • Weihenstephaner Straße 4 • 85716 Unterschleißheim • Deutschland
Vorstand: Nico Baader (Vorsitzender), Oliver Riedel (stv. Vorsitzender) • Vorsitzender des Aufsichtsrates: Helmut Schreyer • Amtsgericht München HRB
121537 • Sitz der Gesellschaft: Unterschleißheim • StNr. 143/107/04009 • USt-IdNr. DE114123893 • LEI: 529900JFOPPEDUR61H13 • T 00800 00 586336*
[email protected] DCUP-055.048

* Kostenfreie Telefonnummer aus dem (inter-) nationalen Festnetz. Für Anrufe aus anderen Netzen können Gebühren anfallen.
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ private void addDividendeTransaction()
+ "|Aussch.ttung aus"
+ "|Wahldividende"
+ "|Fund Distribution"
+ "|Dividende)", "(Kontoauszug|Account Statement)");
+ "|Dividende"
+ "|Reklassifizierung)", "(Kontoauszug|Account Statement)");
this.addDocumentTyp(type);

Transaction<AccountTransaction> pdfTransaction = new Transaction<>();
Expand Down Expand Up @@ -309,9 +310,11 @@ private void addDividendeTransaction()
//
// Fondsausschüttung KOPIE
// STORNO
//
// Reklassifizierung
// @formatter:on
.section("type").optional()
.match("^((Dividendenabrechnung|Fondsaussch.ttung) )?(?<type>STORNO)$")
.match("^((Dividendenabrechnung|Fondsaussch.ttung) )?(?<type>(STORNO|Reklassifizierung))$")
.assign((t, v) -> v.getTransactionContext().put(FAILURE, Messages.MsgErrorOrderCancellationUnsupported))

// @formatter:off
Expand Down

0 comments on commit 1858cb8

Please sign in to comment.