Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify DAB PDF-Importer to support new transactions #2989

Merged
merged 1 commit into from Oct 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -2593,6 +2593,231 @@ public void testDividende12()
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(16.19))));
}

@Test
public void testDividende12WithSecurityinEUR()
{
Security security = new Security("McDonald's Corp. Registered Shares DL-,01", CurrencyUnit.EUR);
security.setIsin("US5801351017");

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

DABPDFExtractor extractor = new DABPDFExtractor(client);

List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende12.txt"), errors);

assertThat(errors, empty());
assertThat(results.size(), is(1));
new AssertImportActions().check(results, 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("2013-12-16T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(20)));
assertThat(transaction.getSource(), is("Dividende12.txt"));
assertNull(transaction.getNote());

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.95))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.95 + (2.430 / 1.3841)))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.430 / 1.3841))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
account.setCurrencyCode(CurrencyUnit.EUR);
Status s = c.process(transaction, account);
assertThat(s, is(Status.OK_STATUS));
}

@Test
public void testDividende13()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende13.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("US74348T1025"));
assertThat(security.getWkn(), is("A0B746"));
assertThat(security.getName(), is("Prospect Capital Corp. Registered Shares DL -,001"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD));

// 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("2022-09-21T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(10000)));
assertThat(transaction.getSource(), is("Dividende13.txt"));
assertNull(transaction.getNote());

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(450.84))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(605.57))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(90.83 + 60.57 + 3.33))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

Unit grossValueUnit = transaction.getUnit(Unit.Type.GROSS_VALUE).orElseThrow(IllegalArgumentException::new);
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(600.00))));
}

@Test
public void testDividende13WithSecurityinEUR()
{
Security security = new Security("Prospect Capital Corp. Registered Shares DL -,001", CurrencyUnit.EUR);
security.setIsin("US74348T1025");
security.setWkn("A0B746");

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

DABPDFExtractor extractor = new DABPDFExtractor(client);

List<Exception> errors = new ArrayList<Exception>();
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende13.txt"), errors);

assertThat(errors, empty());
assertThat(results.size(), is(1));
new AssertImportActions().check(results, 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("2022-09-21T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(10000)));
assertThat(transaction.getSource(), is("Dividende13.txt"));
assertNull(transaction.getNote());

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(450.84))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(605.57))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(90.83 + 60.57 + 3.33))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
account.setCurrencyCode(CurrencyUnit.EUR);
Status s = c.process(transaction, account);
assertThat(s, is(Status.OK_STATUS));
}

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

List<Exception> errors = new ArrayList<Exception>();
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("US8288061091"));
assertThat(security.getWkn(), is("916647"));
assertThat(security.getName(), is("SIMON PROPERTY GROUP INC. Reg. Paired Shares DL-,0001"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD));

// 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("2022-09-30T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(850)));
assertThat(transaction.getSource(), is("Dividende14.txt"));
assertNull(transaction.getNote());

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1119.09))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1516.31))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(227.45 + 148.29 + 8.14 + 13.34))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

Unit grossValueUnit = transaction.getUnit(Unit.Type.GROSS_VALUE).orElseThrow(IllegalArgumentException::new);
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(1487.50))));
}

@Test
public void testDividende14WithSecurityinEUR()
{
Security security = new Security("SIMON PROPERTY GROUP INC. Reg. Paired Shares DL-,0001", CurrencyUnit.EUR);
security.setIsin("US8288061091");
security.setWkn("916647");

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

DABPDFExtractor extractor = new DABPDFExtractor(client);

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

assertThat(errors, empty());
assertThat(results.size(), is(1));
new AssertImportActions().check(results, 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("2022-09-30T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(850)));
assertThat(transaction.getSource(), is("Dividende14.txt"));
assertNull(transaction.getNote());

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1119.09))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1516.31))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(227.45 + 148.29 + 8.14 + 13.34))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
account.setCurrencyCode(CurrencyUnit.EUR);
Status s = c.process(transaction, account);
assertThat(s, is(Status.OK_STATUS));
}

@Test
public void testEinbuchung01()
{
Expand Down
@@ -0,0 +1,63 @@
PDFBox Version: 1.8.16
Portfolio Performance Version: 0.59.1
-----------------------------------------
Postfach 12 02 • 90002 Nürnberg
Depotnummer: 0123456789
1500225645/00
Vermerk der Bank: 5104
2
Max Mustermann
Musterstr. 3 Datum: 22.09.2022
01234 Musterhausen Seite: 1 von 2
Ertragsgutschrift
Wertpapierbezeichnung WKN ISIN
Prospect Capital Corp. Registered Shares DL -,001 A0B746 US74348T1025
Bestand
10.000 Stück
Ertragsausschüttung je Anteil 0,06 USD Schlusstag 25.08.2022
Brutto in USD 600,00 USD
abzgl. Quellensteuer 15,00 % von 600,00 USD 89,99 USD
Zwischensumme in USD 510,01 USD
Devisenkurs 0,990800 USD / EUR
Brutto in EUR 605,56 EUR
Quellensteuer in EUR 90,82 EUR
Zwischensumme in EUR 514,74 EUR
abzgl. Kapitalertragsteuer 25,00 % von 242,27 EUR 60,57 EUR
abzgl. Solidaritätszuschlag 5,50 % von 60,57 EUR 3,33 EUR
Netto zugunsten IBAN DE90 1234 5678 1234 5678 90 450,84 EUR
Valuta 21.09.2022 BIC DABBDEMMXXX
Anrechenbare Quellensteuer 0,009 USD pro Stück 90,82 EUR
Bitte beachten Sie die weiteren Informationen auf Seite 2.
BNP Paribas Wealth Management ist ein Geschäftsbereich der BNP Paribas S.A. Niederlassung Deutschland (AG nach franz. Recht).
Standort Frankfurt: Senckenberganlage 19, 60325 Frankfurt am Main, HRB Frankfurt am Main 40950, Fon +49 (0) 69 / 56 00 41-200
Standort Nürnberg: Bahnhofstraße 55, 90402 Nürnberg, HRB Nürnberg 31129, Fon +49 (0) 911 / 369-20 00, Fax +49 (0) 911 / 369-10 00
wealthmanagement-de@bnpparibas.com, www.wealthmanagement.bnpparibas.de, USt-IdNr. DE191528929
Sitz der BNP Paribas S.A.: 16, boulevard des Italiens, 75009 Paris, Frankreich, Registergericht: R.C.S. Paris 662 042 449
Président du Conseil d‘Administration (Präsident des Verwaltungsrates): Jean Lemierre, Directeur Général (Generaldirektor): Jean-Laurent Bonnafé
Depotnummer: 0123456789
1500225645/00
Vermerk der Bank: 5104
2
Datum: 22.09.2022
Seite: 2 von 2
Details zur Abrechnung
Informationen zum Investmentsteuergesetz
Ausschüttung gem. §2 Abs. 11 InvStG 605,56 EUR
abzgl. Teilfreistellung 0,00 % von 605,56 EUR 0,00 EUR
Ertragsausschüttung mit Teilfreistellung 605,56 EUR
Steuerpflichtiger Gesamtertrag 605,56 EUR
Mit Verrechnungstopf "Allgemein" verrechnet 0,00 EUR
Mit Sparerpauschbetrag verrechnet 0,00 EUR
Mit Quellensteuer verrechnet -363,30 EUR
somit verrechnete Quellensteuer -90,82 EUR
Bemessungsgrundlage für Kapitalertragsteuer gesamt 242,27 EUR
Details zu den Verrechnungstöpfen
Verrechnungstopf "Allgemein" vor der Abrechnung 0,00 EUR
Mit Verrechnungstopf "Allgemein" verrechnet 0,00 EUR
Verrechnungstopf "Allgemein" nach der Abrechnung 0,00 EUR
Sparerpauschbetrag vor der Abrechnung 0,00 EUR
Mit Sparerpauschbetrag verrechnet 0,00 EUR
Sparerpauschbetrag nach der Abrechnung 0,00 EUR
Verrechnungstopf "Quellensteuer" vor der Abrechnung 0,00 EUR
Änderung Verrechnungstopf "Quellensteuer" 0,00 EUR
Verrechnungstopf "Quellensteuer" nach der Abrechnung 0,00 EUR
@@ -0,0 +1,88 @@
PDFBox Version: 1.8.16
Portfolio Performance Version: 0.59.1
-----------------------------------------
Postfach 12 02 • 90002 Nürnberg
Depotnummer: 0123456789
1119275220/00
Vermerk der Bank: 5104
2
Vorname Nachname
Vorname Nachname2 Datum: 03.10.2022
Strasse Seite: 1 von 3
PLZ Ort
Ertragsgutschrift
Wertpapierbezeichnung WKN ISIN
SIMON PROPERTY GROUP INC. Reg. Paired Shares DL-,0001 916647 US8288061091
Bestand
850 Stück
Ertragsausschüttung je Anteil 1,75 USD Schlusstag 07.09.2022
Brutto in USD 1.487,50 USD
abzgl. Quellensteuer 15,00 % von 1.487,50 USD 223,13 USD
Zwischensumme in USD 1.264,37 USD
Devisenkurs 0,981000 USD / EUR
Brutto in EUR 1.516,31 EUR
Quellensteuer in EUR 227,45 EUR
Zwischensumme in EUR 1.288,86 EUR
abzgl. Kapitalertragsteuer 148,29 EUR
abzgl. Solidaritätszuschlag 8,14 EUR
abzgl. Kirchensteuer 13,34 EUR
Netto zugunsten IBAN DE49 7603 0010 0111 1111 11 1.119,09 EUR
Valuta 30.09.2022 BIC CSDBDE71XXX
Anrechenbare Quellensteuer 0,2625 USD pro Stück 227,45 EUR
Bitte beachten Sie die weiteren Informationen auf Seite 2.
BNP Paribas Wealth Management ist ein Geschäftsbereich der BNP Paribas S.A. Niederlassung Deutschland (AG nach franz. Recht).
Standort Frankfurt: Senckenberganlage 19, 60325 Frankfurt am Main, HRB Frankfurt am Main 40950, Fon +49 (0) 69 / 56 00 41-200
Standort Nürnberg: Bahnhofstraße 55, 90402 Nürnberg, HRB Nürnberg 31129, Fon +49 (0) 911 / 369-20 00, Fax +49 (0) 911 / 369-10 00
wealthmanagement-de@bnpparibas.com, www.wealthmanagement.bnpparibas.de, USt-IdNr. DE191528929
Sitz der BNP Paribas S.A.: 16, boulevard des Italiens, 75009 Paris, Frankreich, Registergericht: R.C.S. Paris 662 042 449
Président du Conseil d‘Administration (Präsident des Verwaltungsrates): Jean Lemierre, Directeur Général (Generaldirektor): Jean-Laurent Bonnafé
Depotnummer: 0123456789
1119275220/00
Vermerk der Bank: 5104
2
Datum: 03.10.2022
Seite: 2 von 3
Details zur Abrechnung
Informationen zum Investmentsteuergesetz
Ausschüttung gem. §2 Abs. 11 InvStG 1.516,31 EUR
abzgl. Teilfreistellung 0,00 % von 1.516,31 EUR 0,00 EUR
Ertragsausschüttung mit Teilfreistellung 1.516,31 EUR
Steuerpflichtiger Gesamtertrag 1.516,31 EUR
Mit Verrechnungstopf "Allgemein" verrechnet 0,00 EUR
Mit Sparerpauschbetrag verrechnet 0,00 EUR
Mit Quellensteuer verrechnet -909,80 EUR
somit verrechnete Quellensteuer -227,45 EUR
Bemessungsgrundlage für Kapitalertragsteuer 606,51 EUR
Details zu den Verrechnungstöpfen
Verrechnungstopf "Allgemein" vor der Abrechnung 0,00 EUR
Mit Verrechnungstopf "Allgemein" verrechnet 0,00 EUR
Verrechnungstopf "Allgemein" nach der Abrechnung 0,00 EUR
Sparerpauschbetrag vor der Abrechnung 0,00 EUR
Mit Sparerpauschbetrag verrechnet 0,00 EUR
Sparerpauschbetrag nach der Abrechnung 0,00 EUR
Verrechnungstopf "Quellensteuer" vor der Abrechnung 0,00 EUR
Änderung Verrechnungstopf "Quellensteuer" 0,00 EUR
Verrechnungstopf "Quellensteuer" nach der Abrechnung 0,00 EUR
Depotnummer: 0123456789
1119275220/00
Vermerk der Bank: 5104
2
Datum: 03.10.2022
Seite: 3 von 3
Details zur Steuerberechnung
Bemessungsgrundlage für Kapitalertragsteuer (Hälftige Aufteilung gem. § 51a Absatz 2c Satz 7 und § 2 Absatz 8 EStG)
Inhaber 1 303,26 EUR
Inhaber 2 303,25 EUR
Bemessungsgrundlage für Kapitalertragsteuer gesamt 606,51 EUR
Kapitalertragsteuer
Inhaber 1 24,45 % von 303,26 EUR 74,15 EUR
Inhaber 2 24,45 % von 303,25 EUR 74,14 EUR
Kapitalertragsteuer gesamt 148,29 EUR
Solidaritätszuschlag
Inhaber 1 5,50 % von 74,15 EUR 4,07 EUR
Inhaber 2 5,50 % von 74,14 EUR 4,07 EUR
Solidaritätszuschlag gesamt 8,14 EUR
Kirchensteuer
Inhaber 1 9,00 % von 74,15 EUR 6,67 EUR
Inhaber 2 9,00 % von 74,14 EUR 6,67 EUR
Kirchensteuer gesamt 13,34 EUR