diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Dividende17.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Dividende17.txt new file mode 100644 index 0000000000..6b330eedcd --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Dividende17.txt @@ -0,0 +1,56 @@ +PDF Author: '' +PDFBox Version: 1.8.16 +----------------------------------------- +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=372650000 +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Erträgnisgutschrift aus Wertpapieren ADRESSZEILE1=Frau +ADRESSZEILE2=XNAMEX XNachnahmeX +ADRESSZEILE3=XADRESSEX 11 +ADRESSZEILE4=1111 XORTX +Dividende für +Frau ADRESSZEILE5=01.01.2019 - 31.12.2019 +XNAMEX XNachnahmeX ADRESSZEILE6= +Depot-Nr. Abrechnungs-Nr. +XADRESSEX 11 BELEGNUMMER=7667 +1111 XORTX 372650000 26128781 / 09.09.2019 SEITENNUMMER=1STEUERERSTATTUNG=N +ERSTATTUNGSFÄHIGE +Depotinhaber +XNAME XNachnahmeX +Frankfurt am Main, 09.09.2019 +Dividendengutschrift +Gattungsbezeichnung ISIN +Mowi ASA Navne-Aksjer NK 7,50 NO0003054108 +Nominal Ex-Tag Zahltag Dividenden-Betrag pro Stück +STK 60,000 30.08.2019 09.09.2019 NOK 2,600000 +Wert Konto-Nr. Devisenkurs Betrag zu Ihren Gunsten +09.09.2019 372650044 EUR/NOK 9,9148 EUR 7,65 +Hinweise zur steuerlichen Verrechnung: vorher aktuell +ausländische Dividende EUR 15,73 +ausländische Quellensteuer 25% NOK 39,00 +erstattungsfähige Quellensteuer 10% NOK 15,60 +Aktienverlusttopf EUR 0,00 0,00 +allgemeiner Verlusttopf EUR 0,00 0,00 +Quellensteuertopf EUR 0,00 0,00 +zu versteuern EUR 15,73 +einbehaltene Kapitalertragsteuer EUR 3,93 +einbehaltener Solidaritätszuschlag EUR 0,22 +im laufenden Jahr einbehaltene Kapitalertragsteuer EUR 45,31 +im laufenden Jahr einbehaltener Solidaritätszuschlag EUR 2,49 +Kapitalertragsteuer, Solidaritätszuschlag und ggf. Kirchensteuer nach gemeldetem Kirchensteuersatz verrechnet mit dem +Finanzamt Itzehoe, Steuernummer 18/297/13562. +Steuerlicher Stichtag: 09.09.2019 +Jahressteuerbescheinigung folgt +Verwahrart: Wertpapierrechnung Lagerland: Norwegen +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Arno Walter (Vorsitzender), Dietmar von Blücher, Matthias Hach, Frauke Hegemann Vorsitzender des Aufsichtsrates: Michael Mandel +3.20/ABREEREIERTR/GDBERTRG/007667/100919/003053 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/DividendeWithReinvest02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/DividendeWithReinvest02.txt new file mode 100644 index 0000000000..c2b93e98b8 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/DividendeWithReinvest02.txt @@ -0,0 +1,79 @@ +PDF Autor: '' +PDFBox Version: 1.8.16 +----------------------------------------- +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=12345678 +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Erträgnisgutschrift aus Wertpapieren ADRESSZEILE1=Herr +Reinvestierung ADRESSZEILE2=Max Mustermann +ADRESSZEILE3=Musterstrasse 123 +ADRESSZEILE4=12345 Berlin +Dividende für +Herr ADRESSZEILE5=01.04.2018 - 31.03.2019 +Max Mustermann ADRESSZEILE6= +Depot-Nr. Abrechnungs-Nr. +Musterstrasse 123 BELEGNUMMER=1149 +12345 Berlin 123456789 12345678 / 18.03.2020 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +Max Mustermann +Frankfurt am Main, 18.03.2020 +Dividendengutschrift +Gattungsbezeichnung ISIN +SSE PLC Shs LS-,50 GB0007908733 +Nominal Ex-Tag Zahltag Dividenden-Betrag pro Stück +STK 75,000 16.01.2020 13.03.2020 GBP 0,240000 +Hinweise zur steuerlichen Verrechnung: vorher aktuell +ausländische Dividende EUR 20,39 +Aktienverlusttopf EUR 810,63 810,63 +allgemeiner Verlusttopf EUR 0,00 0,00 +Freistellungsauftrag (eingereicht: EUR 700,00) EUR 640,06 619,67 +Quellensteuertopf EUR 9,00 9,00 +zu versteuern EUR 0,00 +im laufenden Jahr einbehaltene Kapitalertragsteuer EUR 0,00 +im laufenden Jahr einbehaltener Solidaritätszuschlag EUR 0,00 +Steuerlicher Stichtag: 13.03.2020 +Jahressteuerbescheinigung folgt +Die Ausschüttung/Dividende wurde wie folgt in neue Anteile/Aktien reinvestiert: +Gattungsbezeichnung ISIN +SSE PLC Shs LS-,50 GB0007908733 +Nominal Reinvestierungspreis +STK 1,000 GBP 14,910000 +Barausgleich GBP 3,09 +Gebühren GBP 8,83- +Wert Konto-Nr. Devisenkurs Betrag zu Ihren Lasten +13.03.2020 123456789 EUR/GBP 0,88295 EUR 6,50 +Es folgt Seite 2 +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Frauke Hegemann (Vorsitzende), Dietmar von Blücher, Matthias Hach Vorsitzender des Aufsichtsrates: Dr. Jochen Sutor +3.20/ABREEREIREIN/GDBREINV/001149/190320/003539 +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=123456789 +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +ADRESSZEILE1=Herr +Depot-Nr. Abrechnungs-Nr. Seite-Nr. ADRESSZEILE2=Max Mustermann +352663000 53054631 2 ADRESSZEILE3=Musterstrasse 123 +ADRESSZEILE4=12345 Berlin +ADRESSZEILE5= +ADRESSZEILE6= +BELEGNUMMER=1149 +SEITENNUMMER=2 +STEUERERSTATTUNG=N +Verwahrart: Wertpapierrechnung Lagerland: Grossbritannien +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Frauke Hegemann (Vorsitzende), Dietmar von Blücher, Matthias Hach Vorsitzender des Aufsichtsrates: Dr. Jochen Sutor +3.20/ABREEREIREIN/GDBREINV/001149/190320/003539 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Kauf12.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Kauf12.txt new file mode 100644 index 0000000000..189d475867 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Kauf12.txt @@ -0,0 +1,129 @@ +PDF Author: +PDFBox Version: 1.8.16 +----------------------------------------- +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=987654321 +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Wertpapierabrechnung ADRESSZEILE1=Herr +ADRESSZEILE2=Vorname Nachname +Kauf Sparplan ADRESSZEILE3=Straße Hausnummer +Kommissionsgeschäft ADRESSZEILE4=12345 Stadt +Herr ADRESSZEILE5= +Vorname Nachname ADRESSZEILE6= +Depot-Nr. Abrechnungs-Nr. +Straße Hausnummer BELEGNUMMER=18522 +12345 Stadt 987654321 77199603 / 03.12.2018 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +Vorname Nachname +Frankfurt am Main, 03.12.2018 +Wir haben für Sie gekauft +Gattungsbezeichnung ISIN +iShsIII-Core MSCI World U.ETF Registered Shs USD (Acc) o.N. IE00B4L5Y983 +Nominal Kurs +STK 12,483 EUR 48,0650 +Handelstag 03.12.2018 Kurswert EUR 600,00- +Handelszeit 09:10 +Handelsplatz Börse Xetra/EDE +Verwahrart Wertpapierrechnung +Lagerland Irland +Wert Konto-Nr. Betrag zu Ihren Lasten +05.12.2018 123456789 EUR 600,00 +Die jährlich zu zahlende Verwaltungsvergütung und die Gesamtkostenquote sind dem Verkaufsprospekt bzw. den +Vertragsbedingungen zu entnehmen. +Sparplan mit ID 248915037 +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Arno Walter (Vorsitzender), Dietmar von Blücher, Matthias Hach Vorsitzender des Aufsichtsrates: Michael Mandel +3.18/ABREABHNHANDKF/GAAASAFG/018522/041218/033410 +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=987654321 +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Wertpapierabrechnung ADRESSZEILE1=Herr +ADRESSZEILE2=Vorname Nachname +Kauf Sparplan ADRESSZEILE3=Straße Hausnummer +Kommissionsgeschäft ADRESSZEILE4=12345 Stadt +Herr ADRESSZEILE5= +Vorname Nachname ADRESSZEILE6= +Depot-Nr. Abrechnungs-Nr. +Straße Hausnummer BELEGNUMMER=18523 +12345 Stadt 987654321 55390681 / 03.12.2018 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +Vorname Nachname +Frankfurt am Main, 03.12.2018 +Wir haben für Sie gekauft +Gattungsbezeichnung ISIN +ComStage-SDAX UCITS ETF Inhaber-Anteile I o.N. LU0603942888 +Nominal Kurs +STK 8,1741 EUR 97,8700 +Handelstag 03.12.2018 Kurswert EUR 800,00- +Handelszeit 09:06 +Handelsplatz Börse Xetra/EDE +Verwahrart Girosammelverwahrung +Wert Konto-Nr. Betrag zu Ihren Lasten +05.12.2018 123456789 EUR 800,00 +Die jährlich zu zahlende Verwaltungsvergütung und die Gesamtkostenquote sind dem Verkaufsprospekt bzw. den +Vertragsbedingungen zu entnehmen. +Wir werden in Ihrem Depot wie angegeben buchen. +Sparplan mit ID 248915040 +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Arno Walter (Vorsitzender), Dietmar von Blücher, Matthias Hach Vorsitzender des Aufsichtsrates: Michael Mandel +3.18/ABREABHNHANDKF/GAAASAFG/018523/041218/033410 +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=987654321 +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Wertpapierabrechnung ADRESSZEILE1=Herr +ADRESSZEILE2=Vorname Nachname +Kauf Sparplan ADRESSZEILE3=Straße Hausnummer +Kommissionsgeschäft ADRESSZEILE4=12345 Stadt +Herr ADRESSZEILE5= +Vorname Nachname ADRESSZEILE6= +Depot-Nr. Abrechnungs-Nr. +Straße Hausnummer BELEGNUMMER=18524 +12345 Stadt 987654321 13722388 / 03.12.2018 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +Vorname Nachname +Frankfurt am Main, 03.12.2018 +Wir haben für Sie gekauft +Gattungsbezeichnung ISIN +ComSta.-MSCI Em.Mkts.TRN U.ETF Inhaber-Anteile I o.N. LU0635178014 +Nominal Kurs +STK 20,2778 EUR 39,4520 +Handelstag 03.12.2018 Kurswert EUR 800,00- +Handelszeit 09:06 +Handelsplatz Börse Xetra/EDE +Verwahrart Girosammelverwahrung +Wert Konto-Nr. Betrag zu Ihren Lasten +05.12.2018 123456789 EUR 800,00 +Die jährlich zu zahlende Verwaltungsvergütung und die Gesamtkostenquote sind dem Verkaufsprospekt bzw. den +Vertragsbedingungen zu entnehmen. +Wir werden in Ihrem Depot wie angegeben buchen. +Sparplan mit ID 248915041 +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Arno Walter (Vorsitzender), Dietmar von Blücher, Matthias Hach Vorsitzender des Aufsichtsrates: Michael Mandel +3.18/ABREABHNHANDKF/GAAASAFG/018524/041218/033410 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Kauf13.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Kauf13.txt new file mode 100644 index 0000000000..0936bc8d49 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Kauf13.txt @@ -0,0 +1,46 @@ +PDF Author: '' +PDFBox Version: 1.8.16 +----------------------------------------- +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=123456000 +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Wertpapierabrechnung ADRESSZEILE1=Frau +ADRESSZEILE2=Vorname Nachname +Kauf Limitauftrag ADRESSZEILE3=Adresse 1234 +Kommissionsgeschäft ADRESSZEILE4=12345 Ort +Frau ADRESSZEILE5= +Vorname Nachname ADRESSZEILE6= +Depot-Nr. Abrechnungs-Nr. +Adresse 1234 BELEGNUMMER=9271 +12345 Ort 123456000 93213477 / 03.02.2016 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +Vorname Nachname +Frankfurt am Main, 03.02.2016 +Wir haben für Sie gekauft +Gattungsbezeichnung ISIN +Allianz SE vink.Namens-Aktien o.N. DE0008404005 +Nominal Kurs +STK 7,000 EUR 140,7880 +Handelstag 03.02.2016 Kurswert EUR 985,52- +Handelszeit 16:04 Fremdspesen EUR 1,50- +Börse Quotrix/EDO +Verwahrart Girosammelverwahrung +Wert Konto-Nr. Betrag zu Ihren Lasten +05.02.2016 123456044 EUR 987,02 +Fremde Spesen beinhalten ggf. gesetzliche MwSt. +Wir werden in Ihrem Depot wie angegeben buchen. +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +3.18/ABREABHNHANDKFDI/GAAASAFG/009271/040216/003851 +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Arno Walter (Vorsitzender), Dietmar von Blücher, Matthias Hach Vorsitzender des Aufsichtsrates: Michael Mandel \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/OnvistaPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/OnvistaPDFExtractorTest.java index 48d8e1bc52..8ef0ebb4db 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/OnvistaPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/OnvistaPDFExtractorTest.java @@ -1,10 +1,35 @@ package name.abuchen.portfolio.datatransfer.pdf.onvista; +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; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasNote; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasShares; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasSource; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTaxes; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.withFailureMessage; + import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Iterator; @@ -27,6 +52,7 @@ import name.abuchen.portfolio.model.AccountTransaction; import name.abuchen.portfolio.model.BuySellEntry; import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.model.Portfolio; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.model.Transaction; @@ -70,7 +96,7 @@ public void testWertpapierKauf01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-08-15T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.7445))); assertThat(entry.getSource(), is("Kauf01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 65655059")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(150.01)))); @@ -114,7 +140,7 @@ public void testWertpapierKauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-08-19T15:30"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(35))); assertThat(entry.getSource(), is("Kauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 59157179")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1536.13)))); @@ -159,7 +185,7 @@ public void testWertpapierKauf02WithSecurityInEUR() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-08-19T15:30"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(35))); assertThat(entry.getSource(), is("Kauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 59157179")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1536.13)))); @@ -209,7 +235,7 @@ public void testWertpapierKauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-03-03T15:32"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4))); assertThat(entry.getSource(), is("Kauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 23456957")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1924.52)))); @@ -253,7 +279,7 @@ public void testWertpapierKauf04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-01-12T10:11"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5))); assertThat(entry.getSource(), is("Kauf04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 27097281")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(59.55)))); @@ -306,7 +332,7 @@ public void testWertpapierKauf05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-12-15T15:30"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(40))); assertThat(entry.getSource(), is("Kauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 28514820")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1926.20)))); @@ -331,7 +357,7 @@ public void testWertpapierKauf05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-12-15T16:11"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(80))); assertThat(entry.getSource(), is("Kauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 52329327")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3965.72)))); @@ -355,7 +381,7 @@ public void testWertpapierKauf05() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-12-15T16:11"))); assertThat(transaction.getShares(), is(Values.Share.factorize(80))); assertThat(transaction.getSource(), is("Kauf05.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 59592727")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.10)))); @@ -376,7 +402,7 @@ public void testWertpapierKauf05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-12-16T12:17"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5000))); assertThat(entry.getSource(), is("Kauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 15336433")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1021.99)))); @@ -424,7 +450,7 @@ public void testWertpapierKauf05WithSecurityInEUR() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-12-15T15:30"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(40))); assertThat(entry.getSource(), is("Kauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 28514820")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1926.20)))); @@ -445,7 +471,7 @@ public void testWertpapierKauf05WithSecurityInEUR() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-12-15T16:11"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(80))); assertThat(entry.getSource(), is("Kauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 52329327")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3965.72)))); @@ -465,7 +491,7 @@ public void testWertpapierKauf05WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-12-15T16:11"))); assertThat(transaction.getShares(), is(Values.Share.factorize(80))); assertThat(transaction.getSource(), is("Kauf05.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 59592727")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(14.10)))); @@ -486,7 +512,7 @@ public void testWertpapierKauf05WithSecurityInEUR() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-12-16T12:17"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5000))); assertThat(entry.getSource(), is("Kauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 15336433")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1021.99)))); @@ -536,7 +562,7 @@ public void testWertpapierKauf06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-05-30T12:19"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(8))); assertThat(entry.getSource(), is("Kauf06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 17910528")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(6.40)))); @@ -580,7 +606,7 @@ public void testWertpapierKauf07() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-07-17T09:04"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.5638))); assertThat(entry.getSource(), is("Kauf07.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 79899478")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50.00)))); @@ -600,7 +626,7 @@ public void testWertpapierKauf07() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-07-17T09:04"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.5638))); assertThat(transaction.getSource(), is("Kauf07.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 86298863")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.06)))); @@ -688,7 +714,7 @@ public void testWertpapierKauf09() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-11-08T09:46"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(670))); assertThat(entry.getSource(), is("Kauf09.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 11111111")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11062.00)))); @@ -827,7 +853,7 @@ public void testWertpapierKauf11() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-12-01T18:08"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(10))); assertThat(entry.getSource(), is("Kauf11.txt")); - assertThat(entry.getNote(), is("Stückzinsaufwand EUR 82,55")); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 15666666 | Stückzinsaufwand EUR 82,55")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(991.35)))); @@ -839,6 +865,88 @@ public void testWertpapierKauf11() is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.00 + 2.00)))); } + @Test + public void testWertpapierKauf12() + { + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf12.txt"), errors); + + assertThat(countSecurities(results), is(3L)); + assertThat(countBuySell(results), is(3L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(6)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("IE00B4L5Y983"), hasWkn(null), hasTicker(null), // + hasName("iShsIII-Core MSCI World U.ETF Registered Shs USD (Acc) o.N."), // + hasCurrencyCode("EUR")))); + + assertThat(results, hasItem(security( // + hasIsin("LU0603942888"), hasWkn(null), hasTicker(null), // + hasName("ComStage-SDAX UCITS ETF Inhaber-Anteile I o.N."), // + hasCurrencyCode("EUR")))); + + assertThat(results, hasItem(security( // + hasIsin("LU0635178014"), hasWkn(null), hasTicker(null), // + hasName("ComSta.-MSCI Em.Mkts.TRN U.ETF Inhaber-Anteile I o.N."), // + hasCurrencyCode("EUR")))); + + // check 1st buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2018-12-03T09:10"), hasShares(12.483), // + hasSource("Kauf12.txt"), hasNote("Abrechnungs-Nr. 77199603"), // + hasAmount("EUR", 600.00), hasGrossValue("EUR", 600.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + + // check 2nd buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2018-12-03T09:06"), hasShares(8.1741), // + hasSource("Kauf12.txt"), hasNote("Abrechnungs-Nr. 55390681"), // + hasAmount("EUR", 800.00), hasGrossValue("EUR", 800.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + + // check 3rd buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2018-12-03T09:06"), hasShares(20.2778), // + hasSource("Kauf12.txt"), hasNote("Abrechnungs-Nr. 13722388"), // + hasAmount("EUR", 800.00), hasGrossValue("EUR", 800.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testWertpapierKauf13() + { + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf13.txt"), errors); + + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("DE0008404005"), hasWkn(null), hasTicker(null), // + hasName("Allianz SE vink.Namens-Aktien o.N."), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2016-02-03T16:04"), hasShares(7.00), // + hasSource("Kauf13.txt"), hasNote("Abrechnungs-Nr. 93213477"), // + hasAmount("EUR", 987.02), hasGrossValue("EUR", 985.52), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + @Test public void testWertpapierVerkauf01() { @@ -871,7 +979,7 @@ public void testWertpapierVerkauf01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2016-09-02T09:10"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(20))); assertThat(entry.getSource(), is("Verkauf01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 12345678")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(623.49)))); @@ -892,7 +1000,7 @@ public void testWertpapierVerkauf01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2016-09-02T09:10"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(80))); assertThat(entry.getSource(), is("Verkauf01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 1234567")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2508.47)))); @@ -944,7 +1052,7 @@ public void testWertpapierVerkauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2016-09-14T09:02"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(14))); assertThat(entry.getSource(), is("Verkauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 12345678")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(32.70)))); @@ -964,7 +1072,7 @@ public void testWertpapierVerkauf02() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-09-14T09:02"))); assertThat(transaction.getShares(), is(Values.Share.factorize(14))); assertThat(transaction.getSource(), is("Verkauf02.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 47883712")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.18)))); @@ -985,7 +1093,7 @@ public void testWertpapierVerkauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2016-09-14T12:54"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(55))); assertThat(entry.getSource(), is("Verkauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 12345678")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1665.41)))); @@ -1029,7 +1137,7 @@ public void testWertpapierVerkauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2011-04-08T12:30"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4))); assertThat(entry.getSource(), is("Verkauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 78345409")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.45)))); @@ -1049,7 +1157,7 @@ public void testWertpapierVerkauf03() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2011-04-08T12:30"))); assertThat(transaction.getShares(), is(Values.Share.factorize(4))); assertThat(transaction.getSource(), is("Verkauf03.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 30158878")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.28)))); @@ -1137,7 +1245,7 @@ public void testWertpapierVerkauf05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2013-05-06T12:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.5))); assertThat(entry.getSource(), is("Verkauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 66867433")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.41)))); @@ -1157,7 +1265,7 @@ public void testWertpapierVerkauf05() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2013-05-06T12:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.5))); assertThat(transaction.getSource(), is("Verkauf05.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 56072633")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.05)))); @@ -1201,7 +1309,7 @@ public void testWertpapierVerkauf06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-09-25T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(65))); assertThat(entry.getSource(), is("Verkauf06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 10283354")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2563.60)))); @@ -1221,7 +1329,7 @@ public void testWertpapierVerkauf06() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-09-25T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(65))); assertThat(transaction.getSource(), is("Verkauf06.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 18633554")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(74.63)))); @@ -1265,7 +1373,7 @@ public void testWertpapierVerkauf07() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2014-11-17T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1))); assertThat(entry.getSource(), is("Verkauf07.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 25720768")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(51.85)))); @@ -1477,7 +1585,7 @@ public void testWertpapierVerkauf09() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-08-08T15:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); assertThat(entry.getSource(), is("Verkauf09.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 98765432")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4361.00)))); @@ -1498,7 +1606,7 @@ public void testWertpapierVerkauf09() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-08-08T17:27"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); assertThat(entry.getSource(), is("Verkauf09.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 68411850")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4293.60)))); @@ -1519,7 +1627,7 @@ public void testWertpapierVerkauf09() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2018-08-08T17:28"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(40))); assertThat(entry.getSource(), is("Verkauf09.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 80926283")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4234.10)))); @@ -1539,7 +1647,7 @@ public void testWertpapierVerkauf09() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-08-08T17:27"))); assertThat(transaction.getShares(), is(Values.Share.factorize(100))); assertThat(transaction.getSource(), is("Verkauf09.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 80817950")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.78)))); @@ -1583,7 +1691,7 @@ public void testWertpapierVerkauf10() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-12-14T18:55"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); assertThat(entry.getSource(), is("Verkauf10.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 60770481")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1259.14)))); @@ -1628,7 +1736,7 @@ public void testWertpapierVerkauf10WithSecurityInEUR() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-12-14T18:55"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); assertThat(entry.getSource(), is("Verkauf10.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 60770481")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1259.14)))); @@ -1678,7 +1786,7 @@ public void testWertpapierVerkauf11() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-12-14T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(250))); assertThat(entry.getSource(), is("Verkauf11.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 42189222")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.25)))); @@ -1698,7 +1806,7 @@ public void testWertpapierVerkauf11() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-14T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(250))); assertThat(transaction.getSource(), is("Verkauf11.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 54606022")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(43.32)))); @@ -1741,7 +1849,7 @@ public void testDividende01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-04-21T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(50))); assertThat(transaction.getSource(), is("Dividende01.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 77110599")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00)))); @@ -1800,7 +1908,7 @@ public void testDividende02() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-16T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(1.0545))); assertThat(transaction.getSource(), is("Dividende02.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2016/17")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 55746925 | Ertrag für 2016/17")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.80)))); @@ -1820,7 +1928,7 @@ public void testDividende02() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-16T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(1.2879))); assertThat(transaction.getSource(), is("Dividende02.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2016/17")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 97603916 | Ertrag für 2016/17")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.80)))); @@ -1840,7 +1948,7 @@ public void testDividende02() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-16T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(9.9225))); assertThat(transaction.getSource(), is("Dividende02.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2016")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 33071326 | Ertrag für 2016")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.89)))); @@ -1975,7 +2083,7 @@ public void testDividende04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-03-26T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(6))); assertThat(transaction.getSource(), is("Dividende04.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 29013705")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.02)))); @@ -2018,7 +2126,7 @@ public void testDividende04WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-03-26T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(6))); assertThat(transaction.getSource(), is("Dividende04.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 29013705")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.02)))); @@ -2110,7 +2218,7 @@ public void testDividende06() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-03-04T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(28))); assertThat(transaction.getSource(), is("Dividende06.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2014")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 96937413 | Ertrag für 2014")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(21.69)))); @@ -2153,7 +2261,7 @@ public void testDividende07() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-15T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(5.8192))); assertThat(transaction.getSource(), is("Dividende07.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2016/17")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 14053767 | Ertrag für 2016/17")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.16)))); @@ -2196,7 +2304,7 @@ public void testDividende08() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-05T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(32))); assertThat(transaction.getSource(), is("Dividende08.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2018")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 12345 | Ertrag für 2018")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(39.60)))); @@ -2240,7 +2348,7 @@ public void testDividende08WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-05T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(32))); assertThat(transaction.getSource(), is("Dividende08.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2018")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 12345 | Ertrag für 2018")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(39.60)))); @@ -2332,7 +2440,7 @@ public void testDividende10() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-25T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(46))); assertThat(transaction.getSource(), is("Dividende10.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 11223344")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.91)))); @@ -2375,7 +2483,7 @@ public void testDividende10WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-25T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(46))); assertThat(transaction.getSource(), is("Dividende10.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 11223344")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(16.91)))); @@ -2424,7 +2532,7 @@ public void testDividende11() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-12T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(500))); assertThat(transaction.getSource(), is("Dividende11.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2020")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 23344420 | Ertrag für 2020")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(23.53)))); @@ -2467,7 +2575,7 @@ public void testDividende11WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-12T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(500))); assertThat(transaction.getSource(), is("Dividende11.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2020")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 23344420 | Ertrag für 2020")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(23.53)))); @@ -2516,7 +2624,7 @@ public void testDividende12() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-11-17T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(1))); assertThat(transaction.getSource(), is("Dividende12.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 63302459")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.14)))); @@ -2559,7 +2667,7 @@ public void testDividende13() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-09-15T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(549))); assertThat(transaction.getSource(), is("Dividende13.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2021/22")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 34091609 | Ertrag für 2021/22")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(113.75)))); @@ -2602,7 +2710,7 @@ public void testDividende14() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-17T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(1000))); assertThat(transaction.getSource(), is("Dividende14.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 59788848")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(269.63)))); @@ -2645,7 +2753,7 @@ public void testDividende14WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-17T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(1000))); assertThat(transaction.getSource(), is("Dividende14.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 59788848")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(269.63)))); @@ -2695,7 +2803,7 @@ public void testDividende15() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-10-20T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.4512))); assertThat(transaction.getSource(), is("Dividende15.txt")); - assertThat(transaction.getNote(), is("Ertrag für 2017")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 12345678 | Ertrag für 2017")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.02)))); @@ -2739,7 +2847,7 @@ public void testDividende16() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-30T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(15))); assertThat(transaction.getSource(), is("Dividende16.txt")); - assertThat(transaction.getNote(), is("Kapitalrückzahlung")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 42739637 | Kapitalrückzahlung")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.21)))); @@ -2782,7 +2890,7 @@ public void testDividende16WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-30T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(15))); assertThat(transaction.getSource(), is("Dividende16.txt")); - assertThat(transaction.getNote(), is("Kapitalrückzahlung")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 42739637 | Kapitalrückzahlung")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(8.21)))); @@ -2800,6 +2908,68 @@ public void testDividende16WithSecurityInEUR() assertThat(s, is(Status.OK_STATUS)); } + @Test + public void testDividende17() + { + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende17.txt"), errors); + + 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("NO0003054108"), hasWkn(null), hasTicker(null), // + hasName("Mowi ASA Navne-Aksjer NK 7,50"), // + hasCurrencyCode("NOK")))); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2019-09-09"), hasShares(60), // + hasSource("Dividende17.txt"), hasNote("Abrechnungs-Nr. 26128781"), // + hasAmount("EUR", 7.65), hasGrossValue("EUR", 15.73), hasForexGrossValue("NOK", 155.96), // + hasTaxes("EUR", (39.00 / 9.9148) + 3.93 + 0.22), hasFees("EUR", 0.00)))); + } + + @Test + public void testDividende17WithSecurityInEUR() + { + Security security = new Security("Mowi ASA Navne-Aksjer NK 7,50", CurrencyUnit.EUR); + security.setIsin("NO0003054108"); + + Client client = new Client(); + client.addSecurity(security); + + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende17.txt"), errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(1)); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2019-09-09"), hasShares(60), // + hasSource("Dividende17.txt"), hasNote("Abrechnungs-Nr. 26128781"), // + hasAmount("EUR", 7.65), hasGrossValue("EUR", 15.73), // + hasTaxes("EUR", (39.00 / 9.9148) + 3.93 + 0.22), 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 testDividendeStorno01() { @@ -2834,7 +3004,7 @@ public void testDividendeStorno01() assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-05-15T00:00"))); assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(46))); assertThat(((Transaction) cancellation.getSubject()).getSource(), is("DividendeStorno01.txt")); - assertNull(((Transaction) cancellation.getSubject()).getNote()); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Abrechnungs-Nr. 31510000 | Storno unserer Dividendengutschrift Nr. 67390000 vom 15.05.2020.")); assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(13.73)))); @@ -2863,18 +3033,18 @@ public void testDividendeWithReinvest01() // check security Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("DE000A1TNRX5")); + assertThat(security1.getIsin(), is("DE0005557508")); assertNull(security1.getWkn()); assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("Deutsche Telekom AG Dividend in Kind-Cash Line")); + assertThat(security1.getName(), is("Deutsche Telekom AG Namens-Aktien o.N.")); 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("DE0005557508")); + assertThat(security2.getIsin(), is("DE000A1TNRX5")); assertNull(security2.getWkn()); assertNull(security2.getTickerSymbol()); - assertThat(security2.getName(), is("Deutsche Telekom AG Namens-Aktien o.N.")); + assertThat(security2.getName(), is("Deutsche Telekom AG Dividend in Kind-Cash Line")); assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); // check dividends transaction @@ -2886,11 +3056,11 @@ public void testDividendeWithReinvest01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2013-05-17T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(25))); assertThat(transaction.getSource(), is("DividendeWithReinvest01.txt")); - assertThat(transaction.getNote(), is("neue Aktien reinvestiert: DE000A1TNRX5")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 17299829")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.50)))); - assertThat(transaction.getGrossValue(), + assertThat(transaction.getGrossValue(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.50)))); assertThat(transaction.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); @@ -2907,7 +3077,7 @@ public void testDividendeWithReinvest01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2013-05-17T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25))); assertThat(entry.getSource(), is("DividendeWithReinvest01.txt")); - assertThat(entry.getNote(), is("Reinvestierung: DE0005557508")); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 17299829 | Reinvestierung: DE0005557508")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.50)))); @@ -2918,7 +3088,91 @@ public void testDividendeWithReinvest01() assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); } - + + @Test + public void testDividendeWithReinvest02() + { + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "DividendeWithReinvest02.txt"), errors); + + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("GB0007908733"), hasWkn(null), hasTicker(null), // + hasName("SSE PLC Shs LS-,50"), // + hasCurrencyCode("GBP")))); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2020-03-13"), hasShares(75), // + hasSource("DividendeWithReinvest02.txt"), hasNote("Abrechnungs-Nr. 12345678"), // + hasAmount("EUR", 20.39), hasGrossValue("EUR", 20.39), hasForexGrossValue("GBP", 18.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2020-03-13"), hasShares(1), // + hasSource("DividendeWithReinvest02.txt"), hasNote("Abrechnungs-Nr. 12345678 | Reinvestierung: GB0007908733"), // + hasAmount("EUR", 26.89), hasGrossValue("EUR", 16.89), hasForexGrossValue("GBP", 14.91), // + hasTaxes("EUR", 0.00), hasFees("EUR", (8.83 / 0.88295))))); + } + + @Test + public void testDividendeWithReinvest02WithSecurityInEUR() + { + Security security = new Security("SSE PLC Shs LS-,50", CurrencyUnit.EUR); + security.setIsin("GB0007908733"); + + Client client = new Client(); + client.addSecurity(security); + + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "DividendeWithReinvest02.txt"), errors); + + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2020-03-13"), hasShares(75), // + hasSource("DividendeWithReinvest02.txt"), hasNote("Abrechnungs-Nr. 12345678"), // + hasAmount("EUR", 20.39), hasGrossValue("EUR", 20.39), // + hasTaxes("EUR", 0.00), 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)); + })))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2020-03-13"), hasShares(1), // + hasSource("DividendeWithReinvest02.txt"), hasNote("Abrechnungs-Nr. 12345678 | Reinvestierung: GB0007908733"), // + hasAmount("EUR", 26.89), hasGrossValue("EUR", 16.89), // + hasTaxes("EUR", 0.00), hasFees("EUR", (8.83 / 0.88295)), + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + @Test public void testDividendeWithOutbondDelivery() { @@ -2951,6 +3205,7 @@ public void testDividendeWithOutbondDelivery() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-05-25T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(6))); assertThat(transaction.getSource(), is("DividendeWithOutbondDelivery01.txt")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 12134880")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.96)))); assertThat(transaction.getGrossValue(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.96)))); @@ -2968,13 +3223,16 @@ public void testDividendeWithOutbondDelivery() assertThat(entry.getDateTime(), is(LocalDateTime.parse("2022-05-23T00:00"))); assertThat(entry.getShares(), is(Values.Share.factorize(6))); assertThat(entry.getSource(), is("DividendeWithOutbondDelivery01.txt")); - assertThat(entry.getNote(), - is("Im Zuge der Geldzahlung erfolgt die Ausbuchung der Rechte. Ein separater Beleg wird nicht erstellt.")); + assertThat(entry.getNote(), is("Ausbuchung der Rechte")); - assertThat(entry.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(entry.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); } @Test @@ -3016,7 +3274,7 @@ public void testVorabpauschale01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-01-02T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.4298))); assertThat(transaction.getSource(), is("Vorabpauschale01.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 21408694")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.02)))); @@ -3036,7 +3294,7 @@ public void testVorabpauschale01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-01-02T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(0.9265))); assertThat(transaction.getSource(), is("Vorabpauschale01.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 96003514")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.09)))); @@ -3082,7 +3340,7 @@ public void testVorabpauschale02() assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2020-01-02T00:00"))); assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(100))); assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Vorabpauschale02.txt")); - assertNull(((Transaction) cancellation.getSubject()).getNote()); + assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Ausführungs-Nr. 82128903")); assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); @@ -3094,6 +3352,82 @@ public void testVorabpauschale02() is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); } + @Test + public void testVorabpauschale03() + { + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Vorabpauschale03.txt"), errors); + + assertThat(countSecurities(results), is(2L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(2L)); + assertThat(results.size(), is(4)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("IE00BTJRMP35"), hasWkn(null), hasTicker(null), // + hasName("Xtr.(IE)-MSCI Emerging Markets Reg. Shares 1C USD o.N."), // + hasCurrencyCode("EUR")))); + + assertThat(results, hasItem(security( // + hasIsin("LU0908508814"), hasWkn(null), hasTicker(null), // + hasName("Xtr.II Gbl Infl.-Linked Bond Inhaber-Anteile 5C o.N."), // + hasCurrencyCode("EUR")))); + + // check cancellation (Amount = 0,00) transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + taxes( // + hasDate("2021-01-04"), hasShares(0.1), // + hasSource("Vorabpauschale03.txt"), hasNote("Ausführungs-Nr. 66023908"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + + // check cancellation (Amount = 0,00) transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + taxes( // + hasDate("2021-01-04"), hasShares(0.1), // + hasSource("Vorabpauschale03.txt"), hasNote("Ausführungs-Nr. 55108371"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + } + + @Test + public void testVorabpauschale04() + { + OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Vorabpauschale04.txt"), errors); + + 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("IE00B4L5Y983"), hasWkn(null), hasTicker(null), // + hasName("iShsIII-Core MSCI World U.ETF Registered Shs USD (Acc) o.N."), // + hasCurrencyCode("EUR")))); + + // check cancellation (Amount = 0,00) transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + taxes( // + hasDate("2020-01-02"), hasShares(171.6149), // + hasSource("Vorabpauschale04.txt"), hasNote("Ausführungs-Nr. 66023908"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + } + @Test public void testKapitalerhoehung01() { @@ -3205,7 +3539,7 @@ public void testKapitalherabsetzung01() assertThat(entry.getDateTime(), is(LocalDateTime.parse("2013-04-23T00:00"))); assertThat(entry.getShares(), is(Values.Share.factorize(5.5))); assertThat(entry.getSource(), is("Kapitalherabsetzung01.txt")); - assertThat(entry.getNote(), is("Verhältnis 10:1.")); + assertThat(entry.getNote(), is("Verhältnis 10:1")); assertThat(entry.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); @@ -3449,7 +3783,7 @@ public void testDividendeWithCashCompensation01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2013-06-11T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25))); assertThat(entry.getSource(), is("DividendeWithCashCompensation01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 60738913")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(17.50)))); @@ -3490,10 +3824,10 @@ public void testRegistrierungsgebuehr01() assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-07-22T00:00"))); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-07-24T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(6))); assertThat(transaction.getSource(), is("Registrierungsgebuehr01.txt")); - assertThat(transaction.getNote(), is("Registrierung der Namens-Aktien")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 63550522 | Registrierung der Namens-Aktien")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.89)))); @@ -3537,7 +3871,7 @@ public void testZwangsabfindung01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2015-09-22T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25))); assertThat(entry.getSource(), is("Zwangsabfindung01.txt")); - assertThat(entry.getNote(), is("Zwangsabfindung gemäß Hauptversammlungsbeschluss vom 22. Juli 2015.")); + assertThat(entry.getNote(), is("Abrechnungs-Nr. 79573870 | Zwangsabfindung gemäß Hauptversammlungsbeschluss vom 22. Juli 2015.")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(167.00)))); @@ -3647,7 +3981,7 @@ public void testUmtausch02() assertThat(transaction.getType(), is(AccountTransaction.Type.TAX_REFUND)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-11-26T00:00"))); assertThat(transaction.getSource(), is("Umtausch02.txt")); - assertThat(transaction.getNote(), is("Steuerausgleich")); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 68366911")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(7.90)))); @@ -3685,7 +4019,7 @@ public void testUmtausch02() assertThat(transaction.getType(), is(AccountTransaction.Type.TAXES)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-11-23T00:00"))); assertThat(transaction.getSource(), is("Umtausch02.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 96911811")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(11.23 + 0.62 + 1.01)))); @@ -3774,7 +4108,7 @@ public void testUmtausch03() assertThat(transaction.getType(), is(AccountTransaction.Type.TAXES)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-22T00:00"))); assertThat(transaction.getSource(), is("Umtausch03.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Abrechnungs-Nr. 91490290")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.27)))); @@ -3905,7 +4239,7 @@ public void testKontoauszug01() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug01.txt"), errors); @@ -3989,7 +4323,7 @@ public void testKontoauszug02() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug02.txt"), errors); @@ -4018,7 +4352,7 @@ public void testKontoauszug03() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug03.txt"), errors); @@ -4047,7 +4381,7 @@ public void testKontoauszug04() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug04.txt"), errors); @@ -4088,7 +4422,7 @@ public void testKontoauszug05() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug05.txt"), errors); @@ -4239,7 +4573,7 @@ public void testKontoauszug06() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug06.txt"), errors); @@ -4357,7 +4691,7 @@ public void testKontoauszug07() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug07.txt"), errors); @@ -4453,7 +4787,7 @@ public void testKontoauszug08() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug08.txt"), errors); @@ -4538,7 +4872,7 @@ public void testKontoauszug09() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug09.txt"), errors); @@ -4590,7 +4924,7 @@ public void testKontoauszug10() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug10.txt"), errors); @@ -4642,7 +4976,7 @@ public void testKontoauszug11() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug11.txt"), errors); @@ -4694,7 +5028,7 @@ public void testKontoauszug12() { OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client()); - List errors = new ArrayList(); + List errors = new ArrayList<>(); List results = extractor.extract( PDFInputFile.loadTestCase(getClass(), "Kontoauszug12.txt"), errors); diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Vorabpauschale03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Vorabpauschale03.txt new file mode 100644 index 0000000000..102f836bb2 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Vorabpauschale03.txt @@ -0,0 +1,105 @@ +PDF Autor: '' +PDFBox Version: 1.8.16 +----------------------------------------- +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=[*] +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Steuerbelastung ADRESSZEILE1=Herr +aus Wertpapieren ADRESSZEILE2=[*]ADRESSZEILE3=[*] +ADRESSZEILE4=[*] +Herr ADRESSZEILE5= +[*] ADRESSZEILE6= +Depot-Nr. Ausführungs-Nr. +123 BELEGNUMMER=33647 +123 123 66023908 / 12.01.2021 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +Max Mustermann +Steuerpflichtige Vorabpauschale Frankfurt am Main, 12.01.2021 +(§ 18 InvStG) +Gattungsbezeichnung ISIN +Xtr.(IE)-MSCI Emerging Markets Reg. Shares 1C USD o.N. IE00BTJRMP35 +Nominal Ex-Tag Zahltag Jahreswert Vorabpauschale pro Stück +STK 0,1 04.01.2021 04.01.2021 EUR 0,0232 +Investmentertrag für 2020 (besitzzeitanteilig, vor Teilfreistellung) EUR [*] +Hinweise zur steuerlichen Verrechnung: vorher aktuell +steuerpflichtige Vorabpauschale vor Teilfreistellung (TFQ) EUR [*] +steuerpflichtige Vorabpauschale nach Teilfreistellung EUR [*] +Aktienverlusttopf EUR 0,00 0,00 +allgemeiner Verlusttopf EUR [*] [*] +Quellensteuertopf EUR 0,00 0,00 +zu versteuern EUR 0,00 +im laufenden Jahr einbehaltene Kapitalertragsteuer EUR 0,00 +im laufenden Jahr einbehaltener Solidaritätszuschlag EUR 0,00 +Steuerlicher Stichtag: 04.01.2021 +Jahressteuerbescheinigung folgt +Im Jahr des Erwerbs der Fondsanteile vermindert sich die Vorabpauschale um 1/12 für jeden vollen Monat, der dem Monat +des Erwerbs vorangeht (besitzzeitanteilige Ermittlung gem. § 18 Abs. 2 InvStG). Um eine doppelte Besteuerung +auszuschließen, werden die während der Besitzzeit angesetzten Vorabpauschalen vom Veräußerungsergebnis abgezogen. +Dabei werden diese, ungeachtet einer möglichen Teilfreistellung, in voller Höhe berücksichtigt (§ 19 Abs. 1 Satz 3 und 4 +InvStG). +Weitere Informationen zur Vorabpauschale sowie wichtige FAQs finden Sie auf unserer Aktionsseite +www.onvista-bank.de/vorabpauschale +Verwahrart: Wertpapierrechnung Lagerland: Irland +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +onvista bank - eine Marke der Commerzbank AG Wildunger Straße 6a 60487 Frankfurt am Main +Kundenservice: +49 (0)69-7107-530 T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 E: info@onvista-bank.de W: www.onvista-bank.de +Commerzbank AG 60261 Frankfurt am Main AG Frankfurt am Main HRB 32000 Vorstand: Manfred Knof (Vorsitzender), +Marcus Chromik, Jörg Hessenmüller, Bettina Orlopp, Sabine Schmittroth Vorsitzender des Aufsichtsrates: Hans-Jörg Vetter +3.20/DUANDEREEREIERTR/GDBERTRG/033647/130121/010747 +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=[*] +DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=EBOX +Steuerbelastung ADRESSZEILE1=Herr +aus Wertpapieren ADRESSZEILE2=[*]ADRESSZEILE3=[*] +ADRESSZEILE4=[*] +Herr ADRESSZEILE5= +[*] ADRESSZEILE6= +Depot-Nr. Ausführungs-Nr. +123 BELEGNUMMER=[*] +123 123 55108371 / 12.01.2021 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +[*] +Steuerpflichtige Vorabpauschale Frankfurt am Main, 12.01.2021 +(§ 18 InvStG) +Gattungsbezeichnung ISIN +Xtr.II Gbl Infl.-Linked Bond Inhaber-Anteile 5C o.N. LU0908508814 +Nominal Ex-Tag Zahltag Jahreswert Vorabpauschale pro Stück +STK 0,1 04.01.2021 04.01.2021 EUR 0,0114 +Investmentertrag für 2020 (besitzzeitanteilig, vor Teilfreistellung) EUR [*] +Hinweise zur steuerlichen Verrechnung: vorher aktuell +steuerpflichtige Vorabpauschale vor Teilfreistellung (TFQ) [*] +steuerpflichtige Vorabpauschale nach Teilfreistellung EUR [*] +Aktienverlusttopf EUR 0,00 0,00 +allgemeiner Verlusttopf EUR [*] [*] +Quellensteuertopf EUR 0,00 0,00 +zu versteuern EUR 0,00 +im laufenden Jahr einbehaltene Kapitalertragsteuer EUR 0,00 +im laufenden Jahr einbehaltener Solidaritätszuschlag EUR 0,00 +Steuerlicher Stichtag: 04.01.2021 +Jahressteuerbescheinigung folgt +Im Jahr des Erwerbs der Fondsanteile vermindert sich die Vorabpauschale um 1/12 für jeden vollen Monat, der dem Monat +des Erwerbs vorangeht (besitzzeitanteilige Ermittlung gem. § 18 Abs. 2 InvStG). Um eine doppelte Besteuerung +auszuschließen, werden die während der Besitzzeit angesetzten Vorabpauschalen vom Veräußerungsergebnis abgezogen. +Dabei werden diese, ungeachtet einer möglichen Teilfreistellung, in voller Höhe berücksichtigt (§ 19 Abs. 1 Satz 3 und 4 +InvStG). +Weitere Informationen zur Vorabpauschale sowie wichtige FAQs finden Sie auf unserer Aktionsseite +www.onvista-bank.de/vorabpauschale +Verwahrart: Girosammelverwahrung +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +onvista bank - eine Marke der Commerzbank AG Wildunger Straße 6a 60487 Frankfurt am Main +Kundenservice: +49 (0)69-7107-530 T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 E: info@onvista-bank.de W: www.onvista-bank.de +Commerzbank AG 60261 Frankfurt am Main AG Frankfurt am Main HRB 32000 Vorstand: Manfred Knof (Vorsitzender), +Marcus Chromik, Jörg Hessenmüller, Bettina Orlopp, Sabine Schmittroth Vorsitzender des Aufsichtsrates: Hans-Jörg Vetter +3.20/DUANDEREEREIERTR/GDBERTRG/033648/130121/010747 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Vorabpauschale04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Vorabpauschale04.txt new file mode 100644 index 0000000000..1792aa35f7 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/Vorabpauschale04.txt @@ -0,0 +1,54 @@ +PDF Autor: '' +PDFBox Version: 1.8.16 +----------------------------------------- +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N + +Steuerbelastung ADRESSZEILE1=Herr +aus Wertpapieren ADRESSZEILE2=[*]ADRESSZEILE3=[*] +ADRESSZEILE4=[*] +Herr ADRESSZEILE5= +[*] ADRESSZEILE6= +Depot-Nr. Ausführungs-Nr. +123 BELEGNUMMER=33647 +123 123 66023908 / 12.01.2021 SEITENNUMMER=1STEUERERSTATTUNG=N +Depotinhaber +Max Mustermann + +Steuerpflichtige Vorabpauschale Frankfurt am Main, 15.01.2020 +(§ 18 InvStG) +Gattungsbezeichnung ISIN +iShsIII-Core MSCI World U.ETF Registered Shs USD (Acc) o.N. IE00B4L5Y983 +Nominal Ex-Tag Zahltag Jahreswert Vorabpauschale pro Stück +STK 171,6149 02.01.2020 02.01.2020 EUR 0,1583 +Investmentertrag für 2019 (besitzzeitanteilig, vor Teilfreistellung) EUR 9,84 +Hinweise zur steuerlichen Verrechnung: vorher aktuell +steuerpflichtige Vorabpauschale vor Teilfreistellung (TFQ) EUR 9,84 +steuerpflichtige Vorabpauschale nach Teilfreistellung EUR 6,87 +Aktienverlusttopf EUR 0,00 0,00 +allgemeiner Verlusttopf EUR 121,98 115,11 +Quellensteuertopf EUR 0,00 0,00 +zu versteuern EUR 0,00 +im laufenden Jahr einbehaltene Kapitalertragsteuer EUR 0,00 +im laufenden Jahr einbehaltener Solidaritätszuschlag EUR 0,00 +im laufenden Jahr einbehaltene Kirchensteuer EUR 0,00 +Steuerlicher Stichtag: 02.01.2020 +Jahressteuerbescheinigung folgt +Im Jahr des Erwerbs der Fondsanteile vermindert sich die Vorabpauschale um 1/12 für jeden vollen Monat, der dem Monat +des Erwerbs vorangeht (besitzzeitanteilige Ermittlung gem. § 18 Abs. 2 InvStG). Um eine doppelte Besteuerung +auszuschließen, werden die während der Besitzzeit angesetzten Vorabpauschalen vom Veräußerungsergebnis abgezogen. +Dabei werden diese, ungeachtet einer möglichen Teilfreistellung, in voller Höhe berücksichtigt (§ 19 Abs. 1 Satz 3 und 4 +InvStG). +Weitere Informationen zur Vorabpauschale sowie wichtige FAQs finden Sie auf unserer Aktionsseite +www.onvista-bank.de/vorabpauschale +Verwahrart: Wertpapierrechnung Lagerland: Irland +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen +unverzüglich zu erheben. +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +onvista bank Wildunger Straße 6a 60487 Frankfurt am Main T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de +onvista bank ist eine Marke der comdirect bank AG +Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de +Vorstand: Frauke Hegemann (Vorsitzende), Dietmar von Blücher, Matthias Hach Vorsitzender des Aufsichtsrates: Dr. Jochen Sutor +3.20/DUANDEREEREIERTR/GDBERTRG/013868/160120/002805 \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/OnvistaPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/OnvistaPDFExtractor.java index 0dd80baead..82efb95af3 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/OnvistaPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/OnvistaPDFExtractor.java @@ -1,6 +1,7 @@ package name.abuchen.portfolio.datatransfer.pdf; import static name.abuchen.portfolio.datatransfer.ExtractorUtils.checkAndSetGrossUnit; + import static name.abuchen.portfolio.util.TextUtil.trim; import java.math.BigDecimal; @@ -34,13 +35,13 @@ public OnvistaPDFExtractor(Client client) addBankIdentifier("Frankfurt am Main"); addBuySellTransaction(); - addReinvestTransaction(); addDividendeTransaction(); + addReinvestTransaction(); addAdvanceTaxTransaction(); addDeliveryInOutBoundTransaction(); + addTaxesBlockForDeliveryInOutBoundTransaction(); addRegistrationFeeTransaction(); addAccountStatementTransaction(); - addTaxesBlock(); } @Override @@ -61,7 +62,7 @@ private void addBuySellTransaction() return entry; }); - Block firstRelevantLine = new Block("^(Spitze )?(Kauf|Verkauf|Gesamtf.lligkeit|Ausbuchung:)( .*)?$"); + Block firstRelevantLine = new Block("^(Spitze )?(Kauf|Verkauf|Gesamtf.lligkeit|Abrechnung)( .*)?$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); @@ -78,112 +79,124 @@ private void addBuySellTransaction() } }) - // Gattungsbezeichnung ISIN - // DWS Deutschland Inhaber-Anteile LC DE0008490962 - // STK 0,7445 EUR 200,1500 - .section("name", "isin", "name1", "currency").optional() - .find("Gattungsbezeichnung ISIN") - .match("^(?.*) (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") - .match("^([\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} )?(?.*)$") - .match("^[\\w]{3} [\\.,\\d]+ (?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> { - if (!v.get("name1").startsWith("Nominal")) - v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); - - t.setSecurity(getOrCreateSecurity(v)); - }) - - // Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN - // Morgan Stanley & Co. Intl PLC DIZ 25.09.20 25.09.2020 DE000MC55366 - // Fres. SE - // STK 65,000 EUR 39,4400 - .section("name", "isin", "name1", "currency").optional() - .find("Gattungsbezeichnung F.lligkeit n.ch. Zinstermin ISIN") - .match("^(?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") - .match("^(?.*)$") - .match("^[\\w]{3} [\\.,\\d]+ (?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> { - if (!v.get("name1").startsWith("Nominal")) - v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); - - t.setSecurity(getOrCreateSecurity(v)); - }) - - // Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN - // Société Générale Effekten GmbH DISC.Z 13.05.2021 DE000SE8F9E8 - // 13.05.21 NVIDIA 498 - .section("name", "isin", "name1", "currency").optional() - .find("Gattungsbezeichnung F.lligkeit n.ch. Zinstermin ISIN") - .match("^(?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") - .match("^([\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} )?(?.*)$") - .match("^[\\w]{3} [\\.,\\d]+ (?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> { - if (!v.get("name1").startsWith("Nominal")) - v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); + .oneOf( + // @formatter:off + // Gattungsbezeichnung ISIN + // Sky Deutschland AG Namens-Aktien o.N. DE000SKYD000 + // Nominal Ex-Tag + // Abfindung zu: + // EUR 6,680000 + // @formatter:on + section -> section + .attributes("name", "isin", "name1", "currency") + .find("Gattungsbezeichnung ISIN") + .match("^(?.*) (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") + .match("^(?.*)") + .find("Abfindung zu:") + .match("^(?[\\w]{3}) [\\.,\\d]+$") + .assign((t, v) -> { + if (!v.get("name1").startsWith("Nominal")) + v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); - t.setSecurity(getOrCreateSecurity(v)); - }) + t.setSecurity(getOrCreateSecurity(v)); + }) + , + // @formatter:off + // Gattungsbezeichnung ISIN + // DWS Deutschland Inhaber-Anteile LC DE0008490962 + // STK 0,7445 EUR 200,1500 + // Nominal Ex-Tag + // @formatter:on + section -> section + .attributes("name", "isin", "name1", "currency") + .find("Gattungsbezeichnung ISIN") + .match("^(?.*) (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") + .match("^([\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} )?(?.*)$") + .match("^STK [\\.,\\d]+ (?[\\w]{3}) [\\.,\\d]+$") + .assign((t, v) -> { + if (!v.get("name1").startsWith("Nominal")) + v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); - // Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN - // 11,5% UniCredit Bank AG HVB Aktienanleihe 24.11.2023 24.11.2023 DE000HB4GEE2 - // v.22(23)SDF - // Nominal Kurs - // EUR 1.000,000 90,1800 % - .section("name", "isin", "name1", "currency").optional() - .find("Gattungsbezeichnung F.lligkeit n.ch. Zinstermin ISIN") - .match("^(?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") - .match("^([\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} )?(?.*)$") - .match("^(?[\\w]{3}) [\\.,\\d]+ [\\.,\\d]+ %$") - .assign((t, v) -> { - if (!v.get("name1").startsWith("Nominal")) - v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); + t.setSecurity(getOrCreateSecurity(v)); + }) + , + // @formatter:off + // Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN + // Morgan Stanley & Co. Intl PLC DIZ 25.09.20 25.09.2020 DE000MC55366 + // Fres. SE + // STK 65,000 EUR 39,4400 + // Nominal Ex-Tag + // @formatter:on + section -> section + .attributes("name", "isin", "name1", "currency") + .find("Gattungsbezeichnung F.lligkeit n.ch. Zinstermin ISIN") + .match("^(?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") + .match("^(?.*)$") + .match("^STK [\\.,\\d]+ (?[\\w]{3}) [\\.,\\d]+$") + .assign((t, v) -> { + if (!v.get("name1").startsWith("Nominal")) + v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); - t.setSecurity(getOrCreateSecurity(v)); - }) + t.setSecurity(getOrCreateSecurity(v)); + }) + , + // @formatter:off + // Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN + // Société Générale Effekten GmbH DISC.Z 13.05.2021 DE000SE8F9E8 + // 13.05.21 NVIDIA 498 + // Nominal Kurs + // STK 4,000 EUR 480,6300 + // @formatter:on + section -> section + .attributes("name", "isin", "name1", "currency") + .find("Gattungsbezeichnung F.lligkeit n.ch. Zinstermin ISIN") + .match("^(?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") + .match("^([\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} )?(?.*)$") + .match("^STK [\\.,\\d]+ (?[\\w]{3}) [\\.,\\d]+$") + .assign((t, v) -> { + if (!v.get("name1").startsWith("Nominal")) + v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); - // Gattungsbezeichnung ISIN - // Sky Deutschland AG Namens-Aktien o.N. DE000SKYD000 - // Abfindung zu: - // EUR 6,680000 - .section("name", "isin", "name1", "currency").optional() - .find("Gattungsbezeichnung ISIN") - .match("^(?.*) (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") - .match("^(?.*)") - .find("Abfindung zu:") - .match("^(?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> { - if (!v.get("name1").startsWith("Nominal")) - v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); + t.setSecurity(getOrCreateSecurity(v)); + }) + , + // @formatter:off + // Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN + // 11,5% UniCredit Bank AG HVB Aktienanleihe 24.11.2023 24.11.2023 DE000HB4GEE2 + // v.22(23)SDF + // Nominal Kurs + // EUR 1.000,000 90,1800 % + // @formatter:on + section -> section + .attributes("name", "isin", "name1", "currency") + .find("Gattungsbezeichnung F.lligkeit n.ch. Zinstermin ISIN") + .match("^(?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") + .match("^([\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} )?(?.*)$") + .match("^(?[\\w]{3}) [\\.,\\d]+ [\\.,\\d]+ %$") + .assign((t, v) -> { + if (!v.get("name1").startsWith("Nominal")) + v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); - t.setSecurity(getOrCreateSecurity(v)); - }) + t.setSecurity(getOrCreateSecurity(v)); + }) + ) .oneOf( - // Nominal Einlösung zu: + // @formatter:off // STK 65,000 EUR 39,4400 - // Nominal Kurs - // STK 0,7445 EUR 200,1500 - section -> section - .attributes("shares") - .find("Nominal (Kurs|Einl.sung zu:|Ex-Tag)") - .match("^STK (?[\\.,\\d]+) [\\w]{3} [\\.,\\d]+$") - .assign((t, v) -> t.setShares(asShares(v.get("shares")))) - , - // Nominal Ex-Tag // STK 25,000 22.09.2015 - // Nominal Schlusstag - // STK 33,000 06.06.2011 + // @formatter:on section -> section .attributes("shares") - .find("Nominal (Kurs|Einl.sung zu:|Ex-Tag|Schlusstag)") - .match("^STK (?[\\.,\\d]+) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}$") + .match("^STK (?[\\.,\\d]+) .*$") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) , + // @formatter:off // Nominal Kurs // EUR 1.000,000 90,1800 % + // @formatter:on section -> section .attributes("shares") - .find("Nominal (Kurs|Einl.sung zu:|Ex-Tag)") .match("^[\\w]{3} (?[\\.,\\d]+) [\\.,\\d]+ %$") .assign((t, v) -> { // Percentage quotation, workaround for bonds @@ -192,17 +205,21 @@ private void addBuySellTransaction() }) ) + // @formatter:off // Handelszeit 15:30 Orderprovision USD 11,03- // Handelszeit 12:00 + // @formatter:on .section("time").optional() - .match("^Handelszeit (?