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 Vanguard PDF-Importer to support new transaction #3581

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
@@ -0,0 +1,80 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.65.3
-----------------------------------------
So erreichen Sie uns:
Web: www.de.vanguard
Telefon: (030) 3119 6465
E-Mail: kundenservice@vanguard.com
Herr
Max Mustermann
Musterstraße 123
12345 Musterhausen Außerdem können Sie
uns eine Nachricht aus
dem Postfach Ihres
Benutzerkontos
schreiben.
Bardividende
Portfolio 12345678.001
Wir teilen Ihnen mit, dass wir die folgenden Erträgnisse unter Eingangsvorbehalt
abgerechnet haben:
Wertpapierbezeichnung FDIX Vanguard S&P 500 UCITS ETF (USD)
Distributing (IE00B3XXRP09)
ISIN IE00B3XXRP09
Verwahrart Wertpapierrechnung
Lagerland Luxemburg
Nominal/Stück 2,535612 ST
Währung EUR
Original-Ausschüttung USD 0,267572 pro Stück
Wechselkurs 1,066199
Dividendenart Ordentliche Dividende
Ex-Tag 14.09.2023
Bruttobetrag EUR 0,64
Kapitalertragsteuer EUR -0,11
Solidaritätszuschlag EUR 0,00
Kirchensteuer EUR 0,00
Netto-Betrag EUR 0,53
Ausmachender Betrag EUR 0,53
Der Abrechnungsbetrag wird mit Valuta 27.9.2023 über Ihr Konto 12345678 gebucht.
Vanguard Group Europe GmbH Postanschrift: Geschäftsführung: Rechtsform: Gesellschaft mit
Kurfürstendamm 21 Kurfürstendamm 21 Sebastian Külps beschränkter Haftung
10719 Berlin 10719 Berlin Julia Maschkow Sitz: Berlin
kundenservice@vanguard.com 030 31196465 Vorsitzender des Aufsichtsrats: Amtsgericht:Charlottenburg,
www.de.vanguard Sean Hagerty Berlin
HRB Nr. 222205
Umsatzsteuer-ID-Nr.
DE336773878
Kundenname: Herr Max Matthias Mustermann Seite 2 von 3
Kundennummer: 12345678
Bitte beachten Sie Ihre eventuelle Meldepflicht nach § 67 AWV.
Bitte beachten Sie, dass dieser Beleg keine Steuerbescheinigung darstellt.
Dieses Dokument ist maschinell erstellt und wird nicht unterschrieben.
Vanguard Group Europe GmbH Postanschrift: Geschäftsführung: Rechtsform: Gesellschaft mit
Kurfürstendamm 21 Kurfürstendamm 21 Sebastian Külps beschränkter Haftung
10719 Berlin 10719 Berlin Julia Maschkow Sitz: Berlin
kundenservice@vanguard.com 030 31196465 Vorsitzender des Aufsichtsrats: Amtsgericht:Charlottenburg,
www.de.vanguard Sean Hagerty Berlin
HRB Nr. 222205
Umsatzsteuer-ID-Nr.
DE336773878
Kundenname: Herr Max Matthias Mustermann Seite 3 von 3
Kundennummer: 12345678
Steuerliche Informationen - Bardividende
Bardividende
Portfolio 12345678.001
Ausschüttungsbetrag EUR 0,64
Steuerpfl. Betrag nach Freistellungsauftrag EUR 0,45
Anrechenbare ausländische Quellensteuer EUR 0,00
Anrechenbare fiktive Quellensteuer EUR
Bemessungsgrundlage für Kapitalertragsteuer EUR 0,45
Kapitalertragsteuer EUR -0,11
Solidaritätszuschlag EUR 0,00
Kirchensteuer EUR 0,00
Keine Steuerbescheinigung.
Vanguard Group Europe GmbH Postanschrift: Geschäftsführung: Rechtsform: Gesellschaft mit
Kurfürstendamm 21 Kurfürstendamm 21 Sebastian Külps beschränkter Haftung
10719 Berlin 10719 Berlin Julia Maschkow Sitz: Berlin
kundenservice@vanguard.com 030 31196465 Vorsitzender des Aufsichtsrats: Amtsgericht:Charlottenburg,
www.de.vanguard Sean Hagerty Berlin
HRB Nr. 222205
Umsatzsteuer-ID-Nr.
DE336773878
@@ -1,19 +1,12 @@
package name.abuchen.portfolio.datatransfer.pdf.vanguardgroupeurope;

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;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasFees;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasForexGrossValue;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasGrossValue;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasIsin;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasName;
Expand All @@ -24,6 +17,14 @@
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security;
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 All @@ -34,9 +35,12 @@
import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem;
import name.abuchen.portfolio.datatransfer.Extractor.Item;
import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem;
import name.abuchen.portfolio.datatransfer.ImportAction.Status;
import name.abuchen.portfolio.datatransfer.actions.AssertImportActions;
import name.abuchen.portfolio.datatransfer.actions.CheckCurrenciesAction;
import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile;
import name.abuchen.portfolio.datatransfer.pdf.VanguardGroupEuropePDFExtractor;
import name.abuchen.portfolio.model.Account;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.BuySellEntry;
import name.abuchen.portfolio.model.Client;
Expand Down Expand Up @@ -213,8 +217,79 @@ public void testDividende01()
// check dividende transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-06-28T00:00"), hasShares(102.185154), //
hasSource("Dividende01.txt"), hasNote("Ordentliche Dividende"), //
hasSource("Dividende01.txt"), //
hasNote("Ordentliche Dividende"), //
hasAmount("EUR", 26.91), hasGrossValue("EUR", 33.00), //
hasTaxes("EUR", 5.78 + 0.31), hasFees("EUR", 0.00))));
}

@Test
public void testDividende02()
{
VanguardGroupEuropePDFExtractor extractor = new VanguardGroupEuropePDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende02.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("IE00B3XXRP09"), hasWkn(null), hasTicker(null), //
hasName("FDIX Vanguard S&P 500 UCITS ETF (USD) Distributing"), //
hasCurrencyCode("USD"))));

// check dividende transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-09-27T00:00"), hasShares(2.535612), //
hasSource("Dividende02.txt"), //
hasNote("Ordentliche Dividende"), //
hasAmount("EUR", 0.53), hasGrossValue("EUR", 0.64), //
hasForexGrossValue("USD", 0.68), //
hasTaxes("EUR", 0.11), hasFees("EUR", 0.00))));
}

@Test
public void testDividende02WithSecurityInEUR()
{
Security security = new Security("FDIX Vanguard S&P 500 UCITS ETF (USD) Distributin", CurrencyUnit.EUR);
security.setIsin("IE00B3XXRP09");

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

VanguardGroupEuropePDFExtractor extractor = new VanguardGroupEuropePDFExtractor(client);

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende02.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 dividends transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-09-27T00:00"), hasShares(2.535612), //
hasSource("Dividende02.txt"), //
hasNote("Ordentliche Dividende"), //
hasAmount("EUR", 0.53), hasGrossValue("EUR", 0.64), //
hasTaxes("EUR", 0.11), 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));
}))));
}
}