diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java index 93d3c6974..d8f7cef38 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java @@ -4004,6 +4004,78 @@ public class ConsorsbankPDFExtractorTest hasTaxes("USD", 27.00), hasFees("USD", 0.00)))); } + @Test + public void testDividende31() + { + var extractor = new ConsorsbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + var results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende31.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(countAccountTransfers(results), is(0L)); + assertThat(countItemsWithFailureMessage(results), is(0L)); + assertThat(countSkippedItems(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "USD"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("US1912161007"), hasWkn("850663"), hasTicker(null), // + hasName("COCA-COLA CO., THE Registered Shares DL -,25"), // + hasCurrencyCode("USD")))); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2026-07-01T00:00"), hasExDate(null), // + hasShares(25.00), // + hasSource("Dividende31.txt"), // + hasNote(null), // + hasAmount("USD", 11.26), hasGrossValue("USD", 13.25), // + hasTaxes("USD", 1.99), hasFees("USD", 0.00)))); + } + + @Test + public void testDividende31WithSecurityInEUR() + { + var security = new Security("COCA-COLA CO., THE Registered Shares DL -,25", "EUR"); + security.setIsin("US1912161007"); + security.setWkn("850663"); + + var client = new Client(); + client.addSecurity(security); + + var extractor = new ConsorsbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + var results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende31.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(countAccountTransfers(results), is(0L)); + assertThat(countItemsWithFailureMessage(results), is(0L)); + assertThat(countSkippedItems(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "USD"); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2026-07-01T00:00"), hasExDate(null), // + hasShares(25.00), // + hasSource("Dividende31.txt"), // + hasNote(null), // + hasAmount("USD", 11.26), hasGrossValue("USD", 13.25), // + hasForexGrossValue("EUR", 11.56), // + hasTaxes("USD", 1.99), hasFees("USD", 0.00)))); + } + @Test public void testAnleiheZinsen01() { diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/Dividende31.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/Dividende31.txt new file mode 100644 index 000000000..9ecdaa3bd --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/Dividende31.txt @@ -0,0 +1,64 @@ +PDFBox Version: 3.0.7 +Portfolio Performance Version: 0.87.0 +System: macosx | aarch64 | 21.0.5+11-LTS | Azul Systems, Inc. +----------------------------------------- +Consorsbank • 90318 Nürnberg +Depotnummer: 7731468801 +1501642667/00 +Vermerk der Bank: 1000 +2 +nCeld sjDqXgRv +Datum: 07.07.2026 +Fk XesBURSLC 6 +Seite: 1 von 2 +58381 MVwNApE +Dividendengutschrift +Wertpapierbezeichnung WKN ISIN +COCA-COLA CO., THE Registered Shares DL -,25 850663 US1912161007 +Bestand +25 Stück +Dividende pro Stück 0,53 USD Schlusstag 14.06.2026 +Brutto in USD 13,25 USD +abzgl. Quellensteuer 15,00 % von 13,25 USD 1,99 USD +11,26 USD +Netto in USD +Devisenkurs 1,14630 USD / EUR +11,56 EUR +Brutto in EUR +1,74 EUR +Quellensteuer in EUR +11,26 USD +Netto in USD zugunsten IBAN DE49 6789 3605 4408 5892 04 +Valuta 01.07.2026 BIC DABBDEMMXXX +Anrechenbare Quellensteuer EUR +15,00 % von 13,25 USD 1,74 +Bitte beachten Sie die weiteren Informationen auf Seite 2. +Consorsbank ist eine eingetragene Marke der BNP Paribas S.A. Niederlassung Deutschland (AG nach franz. Recht). +Standort Nürnberg: Bahnhofstraße 55, 90402 Nürnberg, HRB Nürnberg 31129, USt-IdNr. DE191528929 +Fon +49 (0) 911 / 369-30 00, Fax +49 (0) 911 / 369-10 00, info@consorsbank.de, www.consorsbank.de +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é +1EEB2591-3A99-CFFD-D19E-17X22315LRv0 +Depotnummer: 0428318068 +1501642667/00 +Vermerk der Bank: 1000 +2 +Datum: 07.07.2026 +Seite: 2 von 2 +Details zur Abrechnung +Steuerpflichtiger Gesamtertrag 11,56 EUR +Mit Verrechnungstopf "Allgemein" verrechnet 0,00 EUR +Mit Sparerpauschbetrag verrechnet -11,56 EUR +Mit Quellensteuer verrechnet 0,00 EUR +somit verrechnete Quellensteuer 0,00 EUR +Bemessungsgrundlage für Kapitalertragsteuer gesamt 0,00 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 673,33 EUR +Mit Sparerpauschbetrag verrechnet -11,56 EUR +Sparerpauschbetrag nach der Abrechnung 661,77 EUR +Verrechnungstopf "Quellensteuer" vor der Abrechnung 73,69 EUR +Änderung Verrechnungstopf "Quellensteuer" 1,74 EUR +Verrechnungstopf "Quellensteuer" nach der Abrechnung 75,43 EUR diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java index 2fd2f7b24..9abeec194 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java @@ -635,6 +635,33 @@ public class ConsorsbankPDFExtractor extends AbstractPDFExtractor t.setAmount(asAmount(v.get("amount"))); }), // @formatter:off + // Without German capital gains tax (e.g. Sparerpauschbetrag), + // there is no "Netto in EUR" line. The "Netto in USD" label + // then is the subtotal *before* the currency conversion and + // the amount credited to the foreign currency account equals + // the amount preceding that label. + // + // 11,26 USD + // Netto in USD + // Devisenkurs 1,14630 USD / EUR + // 11,56 EUR + // Brutto in EUR + // 1,74 EUR + // Quellensteuer in EUR + // 11,26 USD + // Netto in USD zugunsten IBAN DE49 6789 3605 4408 5892 04 + // @formatter:on + section -> section // + .attributes("amount", "currency") // + .match("^(?[\\.,\\d]+) (?[A-Z]{3})$") // + .match("^Netto in [A-Z]{3}$") // + .find("Devisenkurs.*") // + .match("^Netto in [A-Z]{3} (zugunsten|zulasten) .*$") // + .assign((t, v) -> { + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + }), + // @formatter:off // 67,74 EUR // Netto in EUR // 78,68 USD