diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Depotauszug08.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Depotauszug08.txt new file mode 100644 index 0000000000..a43e4db860 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Depotauszug08.txt @@ -0,0 +1,41 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.71.2 +----------------------------------------- +Kontoauszug +Konto-Nr 6017439440 EUR +IBAN DE24101106006017439400 +Nachname, Vorname +Kontokorrentkonto +Datum 31.01.2012 +Herrn Auszug-Nr 1 +Vorname Nachname Blatt-Nr 1 von 1 +Straße +PLZ Ort Betreuer Stangl, Richard +Abteilung Honorarberater +Telefon +49 (0) 911 249 299 10 + +E-Mail richard.stangl@quirinbank.de +Buchungshinweise Buchungsdatum Valuta Umsatz +Überweisungsauftrag, Ref: UT-0239371469 30.01.2012 30.01.2012 -500,00 EUR +für: Vorname Nachname +Kto-Nr: 6017439400EUR BLZ: DE 10110600 +Gutschrift +Zins-/Dividendenzahlung, Ref: DZ-0239771929 31.01.2012 25.01.2012 156,00 EUR +DE0007236101 SIEMENS AG NA +DZ:865782 +Erträgniszahlung +Steuerbuchung Abgeltungsteuer, Ref: H-0239773789 31.01.2012 31.01.2012 -1,38 EUR +DE0007236101 SIEMENS AG NA +KEST: 1,23 SOLI: 0,06 +KIST: 0,09 +DZ:865782 +letzter Auszug: 30.12.2011 alter Saldo: 917,47 EUR +Umsatz: -345,38 EUR +Limit: 0,00 Saldo: 572,09 EUR +quirin bank AG Telefon +49 (0) 30 89 021-300 Aufsichtsratsvorsitzender: Vorstand: +Kurfürstendamm 119 - 10711 Berlin Telefax +49 (0) 30 89 021-321 Holger Timm Karl Matthäus Schmidt, Johannes +Postfach 311105 - 10641 Berlin BLZ 10110600 Eismann, Klaus-Gerd Kleversaat, +Gerichtsstand: Berlin USt-Id. DE 1956 61729 Christian Maria Kreuser, Stefan +Handelsregister: Berlin-Charlottenb., HR B 87859 BIC QUBKDEBBXXX Spannagl +Internet www.quirinbank.de +KTO_AUSZ 0000#816767668049#0000026624 VJ4717583 (10) 6.8.9.1 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Depotauszug09.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Depotauszug09.txt new file mode 100644 index 0000000000..c9a8a3ad92 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Depotauszug09.txt @@ -0,0 +1,138 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.71.2 +----------------------------------------- +Kontoauszug +Konto-Nr 6017439400 EUR +IBAN DE24101106006017439400 +Nachname, Vorname +Kontokorrentkonto +Datum 31.03.2014 +Herrn Auszug-Nr 3 +Vorname Nachname Blatt-Nr 1 von 2 +Straße +PLZ Ort Betreuer Stangl, Richard +Abteilung Honorarberater +Telefon +49 (0) 911 249 299 10 + +E-Mail richard.stangl@quirinbank.de +Buchungshinweise Buchungsdatum Valuta Umsatz +Honorar, Ref: KA-0383911958 03.03.2014 03.03.2014 -100,00 EUR +Honorar:Feb/2014 BMG:64.569,82 Brutto: 100,00 Netto: 95,21 +MWSt: 4,79 +6017439400 +K-0013300467 +Steuerbuchung Abgeltungsteuer, Ref: H-0383929197 03.03.2014 03.03.2014 13,91 EUR +Steuern auf Kontoabschluss +KEST: -12,26 SOLI: -0,67 +KIST: -0,98 +K-0013300467 + +Überweisungsgutschrift, Ref: EU-0384051229 03.03.2014 03.03.2014 75,00 EUR + +von: Nachname Vorname + +Kto-Nr: Konto BLZ: DE 76069611 + NOTPROVIDED +SPARPLAN LUKAS +B:0000044518 + +Wertpapiere, Ref: AB-0385544471 07.03.2014 1 0.03.2014 -75,00 EUR +FR0010135103 CARMIGN.PATRIMOI. AEO ACC +O:002831939:1 Nom:.1318 Whg:EUR + +Ansparplan + + +Steuerbuchung Abgeltungsteuer, Ref: H-0385544516 07.03.2014 10.03.2014 0,05EUR + +FR0010135103 CARMIGN.PATRIMOI. AEO ACC + +KEST: -0,04 SOLI: 0,0 +KIST: -0,01 +O:002831939:1 + +Wertpapiere, Ref: AB-0385635258 07.03.2014 07.03.2014 -50,00 EUR +LU0397221945 DB X-TR.PTF.TOT.R ET.1C +O:002832132:1 Nom:.30385 Whg: EUR +Ansparplan + +Überweisungsauftrag, R ef: UI-0385701357 10.03.2014 09.03.2014 -1.198,98 EUR +für: Vorname Nachname + DE57700202700780026943 HYVEDEMMXXX + 6017439400EURUI-0385701357 +Optionale Sondertilgung zum +30.03.2014 +quirin bank AG Telefon +49 (0) 30 89 021-300 Aufsichtsratsvorsitzender: Vorstand: +Kurfürstendamm 119 - 10711 Berlin Telefax +49 (0) 30 89 021-321 Holger Timm Karl Matthäus Schmidt, Johannes +Postfach 311105 - 10641 Berlin BLZ 10110600 Eismann, Klaus-Gerd Kleversaat, Dr. +Gerichtsstand: Berlin USt-Id. DE 1956 61729 Marcel Morschbach, Stefan Spannagl +Handelsregister: Berlin-Charlottenb., HR B 87859 BIC QUBKDEBBXXX +Internet www.quirinbank.de +O10KTO_AUSZ 816767668049#0000026624 VJ8530089 (10) 7.1.4.0.0 +Kontoauszug +Konto-Nr 6017439400 EUR +IBAN DE24101106006017439400 +Nachname, Vorname +Kontokorrentkonto +Datum 31.03.2014 +Herrn Auszug-Nr 3 +Vorname Nachname Blatt-Nr 2 von 2 +Straße +PLZ Ort Betreuer Stangl, Richard +Abteilung Honorarberater +Telefon +49 (0) 911 249 299 10 + +E-Mail richard.stangl@quirinbank.de +Buchungshinweise Buchungsdatum Valuta Umsatz +Zins-/Dividendenzahlung, Ref: DZ-0387701526 17.03.2014 17.03.2014 51,53 EUR +DE0002635307 ISH.STOX.EUROPE 600 U.ETF +DZ:1415291 +Erträgniszahlung +Steuerbuchung Abgeltungsteuer, Ref: H-0387701642 17.03.2014 17.03.2014 -12,13 EUR +DE0002635307 ISH.STOX.EUROPE 600 U.ETF +KEST: 10,68 SOLI: 0,59 +KIST: 0,86 +DZ:1415291 + +Zins-/Dividendenzahlung, Ref: DZ-0388398221 19.03.2014 19.03.2014 39,29 EUR + +DE0002643889 ISHS-S+P 500 DZ + +DZ:1418411 + +Erträgniszahlung + +Steuerbuchung Abgeltungsteuer, Ref: H-0388398949 19.03.2014 19.03.2014 -4,21 EUR +DE0002643889 ISHS-S+P 500 DZ +KEST: 3,72 SOLI: 0,2 +KIST: 0,29 +DZ:1418411 + +Zins-/Dividendenzahlung, Ref: DZ-0388408995 19.0 3.2014 19.03.2014 9,98EUR +DE000A0HGZT7 ISHS-MSCI EM UCITS ETF DZ + +DZ:1419048 + +Erträgniszahlung + + +Steuerbuchung Abgeltungsteuer, Ref: H-0388411586 19.03.2014 19.03.2014 -1,81 EUR + +DE000A0HGZT7 ISHS-MSCI EM UCITS ETF D Z +KEST: 1,59 SOLI: 0,09 +KIST: 0,13 +DZ:1419048 + + + +letzter Auszug: 28.02.2014 alter Saldo: 2.225,17EUR + +Umsatz: -1.252,37 EUR +Limit: 0,00 Saldo: 972,80 EUR +quirin bank AG Telefon +49 (0) 30 89 021-300 Aufsichtsratsvorsitzender: Vorstand: +Kurfürstendamm 119 - 10711 Berlin Telefax +49 (0) 30 89 021-321 Holger Timm Karl Matthäus Schmidt, Johannes +Postfach 311105 - 10641 Berlin BLZ 10110600 Eismann, Klaus-Gerd Kleversaat, Dr. +Gerichtsstand: Berlin USt-Id. DE 1956 61729 Marcel Morschbach, Stefan Spannagl +Handelsregister: Berlin-Charlottenb., HR B 87859 BIC QUBKDEBBXXX +Internet www.quirinbank.de +O10KTO_AUSZ 816767668049#0000026624 VJ8530089 (10) 7.1.4.0.0 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Dividende05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Dividende05.txt new file mode 100644 index 0000000000..a3d6014955 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Dividende05.txt @@ -0,0 +1,54 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.71.2 +----------------------------------------- +Ertrag aus Investments +Referenz DZ:1415291 +Datum 17.03.2014 +Depot Depotnr. +Nachname, Vorname +Herrn +Vorname Nachname Betreuer Stangl, Richard +Straße Abteilung Honorarberater +PLZ Ort Telefon +49 (0) 911 249 299 10 +E-Mail richard.stangl@quirinbank.de + +Für aus Ihrem Depot fällig gewordene Erträgnisse erteilen wir nachstehende Abrechnung. +Nominal/Stück iSh.STOXX Europe 600 U.ETF DE Inhaber-Anteile +ST 459 ISIN DE0002635307 WKN 263530 +Abrechnungskonditionen: Abrechnungswerte: +Ausschüttung 01.05.2013-30.04.2014 Bruttobetrag 51,53 EUR +Ausschüttung pro Stück 0,112275 EUR +inländische Dividende 0,0101876 EUR +ausländ. Dividende inkl. VG 0,0976563 EUR +Zinsen 0,0080359 EUR +Inländische Mieterträge, VG aus Immobilien 0,00000 EUR +Thesaurierung brutto 0,0016933 EUR +Extag 17.03.2014 +Zahlungstag 17.03.2014 + + +Devisenkurs 1,000000 +Verwahrart Inland + +Keine Steuerbescheinigung! Ausmachender Betrag vor Steuer 51,53 EUR + + + +Kapitalertragsteuerpflichtiger Betrag 53,19 EU R Kapitalertragsteuer -10,68 EUR + Solidaritätszuschlag -0,59 EUR +Verrechnete sonstige negative Kapitalerträge Kirchensteuer -0,86 EUR +Verrechnungstopf Aktien 0,00 EUR Steuerbetrag -12,13 EUR +Verrechnungstopf Sonstige 0,00 EUR +Verrechneter Sparer-Pauschalbetrag 0,00 EUR +Anrechenbare ausländ. Quellensteuer 9,60 EUR Den Bruttoabrechnungsbetrag und die separate Steuerbuchung werden - +Bemessungsgrundlage KESt 43,59 EUR wir über Konto Kontonr. EUR buchen. + + + +quirin bank AG Telefon +49 (0) 30 89 021-300 Aufsichtsratsvorsitzender: Vorstand: +Kurfürstendamm 119 - 10711 Berlin Telefax +49 (0) 30 89 021-321 Holger Timm Karl Matthäus Schmidt, Johannes +Postfach 311105 - 10641 Berlin BLZ 10110600 Eismann, Klaus-Gerd Kleversaat, Dr. +Gerichtsstand: Berlin USt-Id. DE 1956 61729 Marcel Morschbach, Stefan +Handelsregister: Berlin-Charlottenb., HR B 87859 BIC QUBKDEBBXXX Spannagl +Internet www.quirinbank.de +O10ABR_DIVTH_E 816767668049#0000026624 VJ8609946 (10) 7.1.5.0.0 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Kauf04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Kauf04.txt new file mode 100644 index 0000000000..3d2e3d7140 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Kauf04.txt @@ -0,0 +1,43 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.71.2 +----------------------------------------- +Kauf +Referenz O:002831939:1 +Datum 07.03.2014 +Depot Depotnr. +Nachname, Vorname +Herrn +Vorname Nachname Betreuer Stangl, Richard +Straße Abteilung Honorarberater +PLZ Ort Telefon +49 (0) 911 249 299 10 +E-Mail richard.stangl@quirinbank.de + +Nominal/Stück Carmignac Patrimoine FCP Act.au Port.A EUR acc o.N. +ST 0,1318 ISIN FR0010135103 WKN A0DPW0 +Abrechnungskonditionen: Abrechnungswerte: +Kurs 569,060000 EUR Kurswert -75,00 EUR +Ausführungsplatz Sparplan Fondshandel FDB Courtage * 0,00 EUR +Handelstag/-zeit 05.03.2014 Bank-Provision 0,00 EUR +Verwahrart Wertpapierrechnung Spesen * 0,00 EUR +Lagerland CBL-Luxemburg Abwickl.Gebühr * 0,00 EUR +Zahlungstag 10.03.2014 +Devisenkurs 1,000000 Zwischengewinn 0,17 EUR +Poolfaktor 1,000000000 +* Fremde Gebühren und Kosten +Ausmachender Betrag vor Steuer(n) -75,00 EUR +Keine Steuerbescheinigung! +Kapitalertragsteuerpflichtiger Betrag 0,00 EUR Kapitalertragsteuer 0,04 EUR +Verrechnete sonstige negative Kapitalerträge Solidaritätszuschlag 0,00 EUR +Verrechnungstopf Aktien 0,00 EUR Kirchensteuer 0,01 EUR +Verrechnungstopf Sonstige 0,00 EUR Steuerbetrag 0,05 EUR +Verrechneter Sparer-Pauschalbetrag 0,00 EUR +Anrechenbare ausländ. Quellensteuer 0,00 EUR Den Bruttoabrechnungsbetrag und die separate Steuerbuchung werden wir mit +Bemessungsgrundlage KESt -0,17 EUR Valuta 10.03.2014 über Konto Kontonr. EUR buchen. +Order aus Ansparplan +quirin bank AG Telefon +49 (0) 30 89 021-300 Aufsichtsratsvorsitzender: Vorstand: +Kurfürstendamm 119 - 10711 Berlin Telefax +49 (0) 30 89 021-321 Holger Timm Karl Matthäus Schmidt, Johannes +Postfach 311105 - 10641 Berlin BLZ 10110600 Eismann, Klaus-Gerd Kleversaat, +Gerichtsstand: Berlin USt-Id. DE 1956 61729 Dr. Marcel Morschbach, Stefan +Handelsregister: Berlin-Charlottenb., HR B 87859 BIC QUBKDEBBXXX Spannagl +Internet www.quirinbank.de +O10ABR_WPR_E 0000#816767668049#0000026624 VJ8568776 (10) 7.1.5.0.0 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Kauf05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Kauf05.txt new file mode 100644 index 0000000000..16bec60717 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Kauf05.txt @@ -0,0 +1,37 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.71.2 +----------------------------------------- +Kauf +Referenz O:003198103:1 +Datum 15.09.2014 +Depot Depotnr. +Nachname, Vorname +Herrn +Vornamen Nachname Betreuer Stangl, Richard +Straße Abteilung Honorarberater +PLZ Ort Telefon +49 (0) 911 249 299 10 +E-Mail richard.stangl@quirinbank.de + +Nominal/Stück iSh.STOXX Europe 600 U.ETF DE Inhaber-Anteile +ST 31 ISIN DE0002635307 WKN 263530 +Abrechnungskonditionen: Abrechnungswerte: +Kurs 34,900000 EUR Kurswert -1.081,90 EUR +Ausführungsplatz Xetra Courtage * 0,00 EUR +Handelstag/-zeit 12.09.2014 16:22:33 Bank-Provision 0,00 EUR +Verwahrart Girosammel-Verwahrung (umsatzsteuerpflichtiges Entgelt) +Lagerland 099 - CBL - Bundesrepublik Deutschland Mehrwertsteuer (19%) -0,78 EUR +Zahlungstag 16.09.2014 Spesen * -0,75 EUR +Devisenkurs 1,000000 Abwickl.Gebühr * -4,12 EUR +Poolfaktor 1,000000000 +* Fremde Gebühren und Kosten +Ausmachender Betrag -1.087,55 EUR +Den Gesamtbetrag werden wir mit Valuta 16.09.2014 auf Ihrem +Konto Kontonr. EUR buchen. +auf Verkaufsunterlagen verzichtet. Diesem Geschäft liegt keine Anlageberatung der Bank zugrunde. +quirin bank AG Telefon +49 (0) 30 89 021-300 Aufsichtsratsvorsitzender: Vorstand: +Kurfürstendamm 119 - 10711 Berlin Telefax +49 (0) 30 89 021-321 Holger Timm Karl Matthäus Schmidt, Johannes +Postfach 311105 - 10641 Berlin BLZ 10110600 Eismann, Dr. Marcel Morschbach, +Gerichtsstand: Berlin USt-Id. DE 1956 61729 Stefan Spannagl +Handelsregister: Berlin-Charlottenb., HR B 87859 BIC QUBKDEBBXXX +Internet www.quirinbank.de +O10ABR_WPR_E 0000#816767668049#0000026624 VJ9780022 (10) 7.1.8.0.0 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/QuirinPrivatbankAGPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/QuirinPrivatbankAGPDFExtractorTest.java index ea7d4cd088..6c74f08d94 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/QuirinPrivatbankAGPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/QuirinPrivatbankAGPDFExtractorTest.java @@ -18,6 +18,9 @@ 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.removal; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxRefund; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes; @@ -51,6 +54,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.Unit; @@ -93,7 +97,7 @@ public void testWertpapierKauf01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2016-12-30T12:46:28"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(140))); assertThat(entry.getSource(), is("Kauf01.txt")); - assertThat(entry.getNote(), is("Referenz-Nr 28522373")); + assertThat(entry.getNote(), is("Ref.-Nr.: 28522373")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(30090.76)))); @@ -137,7 +141,7 @@ public void testWertpapierKauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-02-10T17:08:23"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(515))); assertThat(entry.getSource(), is("Kauf02.txt")); - assertThat(entry.getNote(), is("Referenz O:000481758:1")); + assertThat(entry.getNote(), is("Ref.-Nr.: O:000481758:1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3997.09)))); @@ -181,7 +185,7 @@ public void testWertpapierKauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-08-20T15:46:50"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(150))); assertThat(entry.getSource(), is("Kauf03.txt")); - assertThat(entry.getNote(), is("Referenz O:000745405:1")); + assertThat(entry.getNote(), is("Ref.-Nr.: O:000745405:1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4749.86)))); @@ -226,7 +230,7 @@ public void testWertpapierKauf03WithSecurityInEUR() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-08-20T15:46:50"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(150))); assertThat(entry.getSource(), is("Kauf03.txt")); - assertThat(entry.getNote(), is("Referenz O:000745405:1")); + assertThat(entry.getNote(), is("Ref.-Nr.: O:000745405:1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4749.86)))); @@ -244,6 +248,76 @@ public void testWertpapierKauf03WithSecurityInEUR() assertThat(s, is(Status.OK_STATUS)); } + @Test + public void testWertpapierKauf04() + { + QuirinBankAGPDFExtractor extractor = new QuirinBankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf04.txt"), errors); + + assertThat(errors, empty()); + 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("FR0010135103"), hasWkn("A0DPW0"), hasTicker(null), // + hasName("Carmignac Patrimoine FCP Act.au Port.A EUR acc o.N."), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2014-03-05T00:00"), hasShares(0.1318), // + hasSource("Kauf04.txt"), // + hasNote("Ref.-Nr.: O:002831939:1"), // + hasAmount("EUR", 75.00), hasGrossValue("EUR", 75.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + + // check taxes transaction + assertThat(results, hasItem(taxes( // + hasDate("2014-03-10T00:00"), hasShares(0.1320), // + hasSource("Kauf04.txt"), // + hasNote("Zwischengewinn 0,17 EUR | Ref.-Nr.: O:002831939:1"), // + hasAmount("EUR", 0.05), hasGrossValue("EUR", 0.05), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testWertpapierKauf05() + { + QuirinBankAGPDFExtractor extractor = new QuirinBankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf05.txt"), errors); + + assertThat(errors, empty()); + 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("DE0002635307"), hasWkn("263530"), hasTicker(null), // + hasName("iSh.STOXX Europe 600 U.ETF DE Inhaber-Anteile"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2014-09-12T16:22:33"), hasShares(31.00), // + hasSource("Kauf05.txt"), // + hasNote("Ref.-Nr.: O:003198103:1"), // + hasAmount("EUR", 1087.55), hasGrossValue("EUR", 1082.68), // + hasTaxes("EUR", 0.00), hasFees("EUR", 4.12 + 0.75)))); + } + @Test public void testWertpapierVerkauf01() { @@ -276,7 +350,7 @@ public void testWertpapierVerkauf01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-12-06T16:52:15"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(325))); assertThat(entry.getSource(), is("Verkauf01.txt")); - assertThat(entry.getNote(), is("Referenz-Nr 123452676")); + assertThat(entry.getNote(), is("Ref.-Nr.: 123452676")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12766.68)))); @@ -320,7 +394,7 @@ public void testWertpapierVerkauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-11-23T11:00:15"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(22))); assertThat(entry.getSource(), is("Verkauf02.txt")); - assertThat(entry.getNote(), is("Referenz O:000409887:1")); + assertThat(entry.getNote(), is("Ref.-Nr.: O:000409887:1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1261.61)))); @@ -364,12 +438,12 @@ public void testWertpapierVerkauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2010-05-07T16:20:11"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(515))); assertThat(entry.getSource(), is("Verkauf03.txt")); - assertThat(entry.getNote(), is("Referenz O:000591758:1")); + assertThat(entry.getNote(), is("Ref.-Nr.: O:000591758:1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4515.86)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4515.86 - 144.33)))); assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4660.88)))); + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4516.55)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(127.15 + 7.00 + 10.18)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), @@ -408,7 +482,7 @@ public void testWertpapierVerkauf04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-11-23T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(378.362))); assertThat(entry.getSource(), is("Verkauf04.txt")); - assertThat(entry.getNote(), is("Referenz O:000409894:1")); + assertThat(entry.getNote(), is("Ref.-Nr.: O:000409894:1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3046.43)))); @@ -453,7 +527,7 @@ public void testWertpapierVerkauf04WithSecurityInEUR() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2009-11-23T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(378.362))); assertThat(entry.getSource(), is("Verkauf04.txt")); - assertThat(entry.getNote(), is("Referenz O:000409894:1")); + assertThat(entry.getNote(), is("Ref.-Nr.: O:000409894:1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3046.43)))); @@ -471,6 +545,75 @@ public void testWertpapierVerkauf04WithSecurityInEUR() assertThat(s, is(Status.OK_STATUS)); } + @Test + public void testWertpapierVerkauf05() + { + QuirinBankAGPDFExtractor extractor = new QuirinBankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf05.txt"), errors); + + assertThat(errors, empty()); + 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("LU0052750758"), hasWkn("973909"), hasTicker(null), // + hasName("Fr.Temp.Inv.Fds-T.China Fd Namens-Anteile A (acc.) o.N."), // + hasCurrencyCode("USD")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2014-09-15T00:00"), hasShares(340.00), // + hasSource("Verkauf05.txt"), // + hasNote("Ref.-Nr.: O:003198102:1"), // + hasAmount("EUR", 6185.81 - 87.65), hasGrossValue("EUR", 6192.31), // + hasForexGrossValue("USD", 8024.00), // + hasTaxes("EUR", 77.22 + 4.25 + 6.18), hasFees("EUR", 6.50)))); + } + + @Test + public void testWertpapierVerkauf05WithSecurityInEUR() + { + Security security = new Security("Fr.Temp.Inv.Fds-T.China Fd Namens-Anteile A (acc.) o.N.", CurrencyUnit.EUR); + security.setIsin("LU0052750758"); + security.setWkn("973909"); + + Client client = new Client(); + client.addSecurity(security); + + QuirinBankAGPDFExtractor extractor = new QuirinBankAGPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf05.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2014-09-15T00:00"), hasShares(340.00), // + hasSource("Verkauf05.txt"), // + hasNote("Ref.-Nr.: O:003198102:1"), + hasAmount("EUR", 6185.81 - 87.65), hasGrossValue("EUR", 6192.31), // + hasTaxes("EUR", 77.22 + 4.25 + 6.18), hasFees("EUR", 6.50), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + @Test public void testDividende01() { @@ -502,7 +645,7 @@ public void testDividende01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-09-16T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(700))); assertThat(transaction.getSource(), is("Dividende01.txt")); - assertThat(transaction.getNote(), is("Referenz-Nr 12345858")); + assertThat(transaction.getNote(), is("Ref.-Nr.: 12345858")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(343.46)))); @@ -545,7 +688,7 @@ public void testDividende02() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-01-27T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(52))); assertThat(transaction.getSource(), is("Dividende02.txt")); - assertThat(transaction.getNote(), is("Referenz DZ:255990")); + assertThat(transaction.getNote(), is("Ref.-Nr.: DZ:255990")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(83.20)))); @@ -588,7 +731,7 @@ public void testDividende03() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-27T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(350))); assertThat(transaction.getSource(), is("Dividende03.txt")); - assertThat(transaction.getNote(), is("Referenz DZ:368384")); + assertThat(transaction.getNote(), is("Ref.-Nr.: DZ:368384")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(92.67)))); @@ -631,7 +774,7 @@ public void testDividende03WithSecurityInEUR() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-27T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(350))); assertThat(transaction.getSource(), is("Dividende03.txt")); - assertThat(transaction.getNote(), is("Referenz DZ:368384")); + assertThat(transaction.getNote(), is("Ref.-Nr.: DZ:368384")); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(92.67)))); @@ -674,8 +817,10 @@ public void testDividende04() // check dividende transaction assertThat(results, hasItem(dividend( // hasDate("2023-07-26T00:00"), hasShares(1.9983), // - hasSource("Dividende04.txt"), hasNote("Referenz-Nr 12345858"), // - hasAmount("EUR", 1.41), hasGrossValue("EUR", 1.41), hasForexGrossValue("USD", 1.57), // + hasSource("Dividende04.txt"), // + hasNote("Ref.-Nr.: 12345858"), // + hasAmount("EUR", 1.41), hasGrossValue("EUR", 1.41), // + hasForexGrossValue("USD", 1.57), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @@ -705,7 +850,8 @@ public void testDividende04WithSecurityInEUR() // check buy sell transaction assertThat(results, hasItem(dividend( // hasDate("2023-07-26T00:00"), hasShares(1.9983), // - hasSource("Dividende04.txt"), hasNote("Referenz-Nr 12345858"), // + hasSource("Dividende04.txt"), // + hasNote("Ref.-Nr.: 12345858"), // hasAmount("EUR", 1.41), hasGrossValue("EUR", 1.41), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00), // check(tx -> { @@ -717,6 +863,38 @@ public void testDividende04WithSecurityInEUR() })))); } + @Test + public void testDividende05() + { + QuirinBankAGPDFExtractor extractor = new QuirinBankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende05.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("DE0002635307"), hasWkn("263530"), hasTicker(null), // + hasName("iSh.STOXX Europe 600 U.ETF DE Inhaber-Anteile"), // + hasCurrencyCode("EUR")))); + + // check dividende transaction + assertThat(results, hasItem(dividend( // + hasDate("2014-03-17T00:00"), hasShares(459.00), // + hasSource("Dividende05.txt"), // + hasNote("Ref.-Nr.: DZ:1415291"), // + hasAmount("EUR", 39.40), hasGrossValue("EUR", 51.53), // + hasTaxes("EUR", 10.68 + 0.59 + 0.86), hasFees("EUR", 0.00)))); + } + + @Test public void testVorabpauschale01() { @@ -743,7 +921,7 @@ public void testVorabpauschale01() assertThat(results, hasItem(taxes( // hasDate("2024-01-02T00:00"), hasShares(852.8631), // hasSource("Vorabpauschale01.txt"), // - hasNote("Referenz-Nr 350705756"), // + hasNote("Ref.-Nr.: 350705756"), // hasAmount("EUR", 4.66), hasGrossValue("EUR", 4.66), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @@ -774,7 +952,7 @@ public void testVorabpauschale02() assertThat(results, hasItem(taxes( // hasDate("2024-01-02T00:00"), hasShares(1734.0725), // hasSource("Vorabpauschale02.txt"), // - hasNote("Referenz-Nr 437935500"), // + hasNote("Ref.-Nr.: 437935500"), // hasAmount("EUR", 1.92), hasGrossValue("EUR", 1.92), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @@ -806,7 +984,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-05-28T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(3000.00))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Kontoübertrag 1197537 | Ref.: 86991330")); + assertThat(transaction.getNote(), is("Kontoübertrag 1197537 | Ref.-Nr.: 86991330")); item = iter.next(); @@ -817,7 +995,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-12-19T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(5000.00))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Sammelgutschrift | Ref.: 105892216")); + assertThat(transaction.getNote(), is("Sammelgutschrift | Ref.-Nr.: 105892216")); item = iter.next(); @@ -828,7 +1006,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-01-31T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.84))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Interne Buchung | Ref.: 110934428")); + assertThat(transaction.getNote(), is("Interne Buchung | Ref.-Nr.: 110934428")); item = iter.next(); @@ -839,7 +1017,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-12-27T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2000.00))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Überweisungsgutschrift Inland | Ref.: 106509889")); + assertThat(transaction.getNote(), is("Überweisungsgutschrift Inland | Ref.-Nr.: 106509889")); item = iter.next(); @@ -850,7 +1028,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-12-19T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(5002.84))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Rücküberweisung Inland | Ref.: 106317528")); + assertThat(transaction.getNote(), is("Rücküberweisung Inland | Ref.-Nr.: 106317528")); item = iter.next(); @@ -861,7 +1039,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-06-12T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(36.82))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Steueroptimierung | Ref.: 135435928")); + assertThat(transaction.getNote(), is("Steueroptimierung | Ref.-Nr.: 135435928")); item = iter.next(); @@ -872,7 +1050,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-01-03T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.40))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Steueroptimierung | Ref.: 107410183")); + assertThat(transaction.getNote(), is("Steueroptimierung | Ref.-Nr.: 107410183")); item = iter.next(); @@ -883,7 +1061,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-08-31T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(5.75))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Vermögensverwaltungshonorar | Ref.: 94613532")); + assertThat(transaction.getNote(), is("Vermögensverwaltungshonorar | Ref.-Nr.: 94613532")); item = iter.next(); @@ -894,7 +1072,7 @@ public void testDepotauszug01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-09-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(6.98))); assertThat(transaction.getSource(), is("Depotauszug01.txt")); - assertThat(transaction.getNote(), is("Vermögensverwaltungshonorar | Ref.: 97492689")); + assertThat(transaction.getNote(), is("Vermögensverwaltungshonorar | Ref.-Nr.: 97492689")); } @Test @@ -924,7 +1102,7 @@ public void testDepotauszug02() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-12-31T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.70))); assertThat(transaction.getSource(), is("Depotauszug02.txt")); - assertThat(transaction.getNote(), is("Vermögensverwaltungshonorar | Ref.: 123458336")); + assertThat(transaction.getNote(), is("Vermögensverwaltungshonorar | Ref.-Nr.: 123458336")); } @Test @@ -949,12 +1127,12 @@ public void testDepotauszug03() // assert transaction AccountTransaction transaction = (AccountTransaction) item.getSubject(); - assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getType(), is(AccountTransaction.Type.TAXES)); assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-06-30T00:00"))); - assertThat(transaction.getAmount(), is(Values.Amount.factorize(75.00))); + assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.28))); assertThat(transaction.getSource(), is("Depotauszug03.txt")); - assertThat(transaction.getNote(), is("Flatrate Gebühren 01.06.2010 - 30.06.2010")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0139925023")); item = iter.next(); @@ -963,31 +1141,31 @@ public void testDepotauszug03() assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-06-30T00:00"))); - assertThat(transaction.getAmount(), is(Values.Amount.factorize(29.55))); + assertThat(transaction.getAmount(), is(Values.Amount.factorize(75.00))); assertThat(transaction.getSource(), is("Depotauszug03.txt")); - assertThat(transaction.getNote(), is("Volumen Fee Gebühren 01.04.2010 - 30.06.2010")); + assertThat(transaction.getNote(), is("Flatrate Gebühren 01.06.2010 - 30.06.2010 | Ref.-Nr.: KA-0139816662")); item = iter.next(); // assert transaction transaction = (AccountTransaction) item.getSubject(); - assertThat(transaction.getType(), is(AccountTransaction.Type.INTEREST)); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-06-30T00:00"))); - assertThat(transaction.getAmount(), is(Values.Amount.factorize(4.61))); + assertThat(transaction.getAmount(), is(Values.Amount.factorize(29.55))); assertThat(transaction.getSource(), is("Depotauszug03.txt")); - assertThat(transaction.getNote(), is("Haben-Zinsen Kontoabschluss | Ref: KA-0139907281")); + assertThat(transaction.getNote(), is("Volumen Fee Gebühren 01.04.2010 - 30.06.2010 | Ref.-Nr.: KA-0139816664")); item = iter.next(); // assert transaction transaction = (AccountTransaction) item.getSubject(); - assertThat(transaction.getType(), is(AccountTransaction.Type.TAXES)); + assertThat(transaction.getType(), is(AccountTransaction.Type.INTEREST)); assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-06-30T00:00"))); - assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.28))); + assertThat(transaction.getAmount(), is(Values.Amount.factorize(4.61))); assertThat(transaction.getSource(), is("Depotauszug03.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0139925023")); + assertThat(transaction.getNote(), is("Haben-Zinsen Kontoabschluss | Ref.-Nr.: KA-0139907281")); } @Test @@ -1012,23 +1190,12 @@ public void testDepotauszug04() // assert transaction AccountTransaction transaction = (AccountTransaction) item.getSubject(); - assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); - assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR)); - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); - assertThat(transaction.getAmount(), is(Values.Amount.factorize(75.00))); - assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Flatrate Gebühren 01.07.2010 - 30.07.2010")); - - item = iter.next(); - - // assert transaction - transaction = (AccountTransaction) item.getSubject(); assertThat(transaction.getType(), is(AccountTransaction.Type.TAXES)); assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR)); assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.73))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144748177")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144748177")); item = iter.next(); @@ -1039,7 +1206,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(3.77))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144754954")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144754954")); item = iter.next(); @@ -1050,7 +1217,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.59))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144767171")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144767171")); item = iter.next(); @@ -1061,7 +1228,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.28))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144772794")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144772794")); item = iter.next(); @@ -1072,7 +1239,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.24))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144774420")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144774420")); item = iter.next(); @@ -1083,7 +1250,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.33))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144775628")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144775628")); item = iter.next(); @@ -1094,7 +1261,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.19))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144776788")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144776788")); item = iter.next(); @@ -1105,7 +1272,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.65))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144794566")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144794566")); item = iter.next(); @@ -1116,7 +1283,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.52))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144796585")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144796585")); item = iter.next(); @@ -1127,7 +1294,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.39))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144798144")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144798144")); item = iter.next(); @@ -1138,7 +1305,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.19))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144802453")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144802453")); item = iter.next(); @@ -1149,7 +1316,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.20))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144802618")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144802618")); item = iter.next(); @@ -1160,7 +1327,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(10.57))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144827860")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144827860")); item = iter.next(); @@ -1171,7 +1338,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.07))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144835278")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144835278")); item = iter.next(); @@ -1182,7 +1349,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.52))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144836892")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144836892")); item = iter.next(); @@ -1193,7 +1360,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.35))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144976464")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144976464")); item = iter.next(); @@ -1204,7 +1371,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.56))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144989517")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144989517")); item = iter.next(); @@ -1215,7 +1382,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.73))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144994720")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144994720")); item = iter.next(); @@ -1226,7 +1393,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.24))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144996297")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144996297")); item = iter.next(); @@ -1237,7 +1404,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.26))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144996479")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144996479")); item = iter.next(); @@ -1248,7 +1415,18 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.72))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref: H-0144999672")); + assertThat(transaction.getNote(), is("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0144999672")); + + item = iter.next(); + + // assert transaction + transaction = (AccountTransaction) item.getSubject(); + assertThat(transaction.getType(), is(AccountTransaction.Type.FEES)); + assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); + assertThat(transaction.getAmount(), is(Values.Amount.factorize(75.00))); + assertThat(transaction.getSource(), is("Depotauszug04.txt")); + assertThat(transaction.getNote(), is("Flatrate Gebühren 01.07.2010 - 30.07.2010 | Ref.-Nr.: KA-0144715444")); item = iter.next(); @@ -1259,7 +1437,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.63))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0140363002 | Ref: KA -0144680022")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0140363002 | Ref.-Nr.: KA -0144680022")); item = iter.next(); @@ -1270,7 +1448,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.03))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0303756539 | Ref: KA-0144683460")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0303756539 | Ref.-Nr.: KA-0144683460")); item = iter.next(); @@ -1281,7 +1459,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(1.02))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0075056555 | Ref: KA-0144689194")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0075056555 | Ref.-Nr.: KA-0144689194")); item = iter.next(); @@ -1292,7 +1470,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.85))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0066902890 | Ref: KA-0144691722")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0066902890 | Ref.-Nr.: KA-0144691722")); item = iter.next(); @@ -1303,7 +1481,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.90))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0121747215 | Ref: KA-0144692430")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0121747215 | Ref.-Nr.: KA-0144692430")); item = iter.next(); @@ -1314,7 +1492,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(3.12))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision DE0008490822 | Ref: KA-0144692886")); + assertThat(transaction.getNote(), is("Bestandsprovision DE0008490822 | Ref.-Nr.: KA-0144692886")); item = iter.next(); @@ -1325,7 +1503,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(4.78))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0052750758 | Ref: KA-0144693436")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0052750758 | Ref.-Nr.: KA-0144693436")); item = iter.next(); @@ -1336,7 +1514,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.10))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0303756539 | Ref: KA-0144700356")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0303756539 | Ref.-Nr.: KA-0144700356")); item = iter.next(); @@ -1347,7 +1525,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.59))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0140363002 | Ref: KA-0144701132")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0140363002 | Ref.-Nr.: KA-0144701132")); item = iter.next(); @@ -1358,7 +1536,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.88))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0121747215 | Ref: KA-0144701836")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0121747215 | Ref.-Nr.: KA-0144701836")); item = iter.next(); @@ -1369,7 +1547,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(4.93))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0052750758 | Ref: KA-01 44703846")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0052750758 | Ref.-Nr.: KA-01 44703846")); item = iter.next(); @@ -1380,7 +1558,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.98))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovisio n LU0075056555 | Ref: KA-0144703918")); + assertThat(transaction.getNote(), is("Bestandsprovisio n LU0075056555 | Ref.-Nr.: KA-0144703918")); item = iter.next(); @@ -1391,7 +1569,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.89))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0066902890 | Ref: KA-0144717889")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0066902890 | Ref.-Nr.: KA-0144717889")); item = iter.next(); @@ -1402,7 +1580,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.94))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision DE0008490822 | Ref: KA-0144723419")); + assertThat(transaction.getNote(), is("Bestandsprovision DE0008490822 | Ref.-Nr.: KA-0144723419")); item = iter.next(); @@ -1413,7 +1591,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(4.83))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0052750758 | Ref: KA-0144724147")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0052750758 | Ref.-Nr.: KA-0144724147")); item = iter.next(); @@ -1424,7 +1602,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.85))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0121747215 | Ref: KA-0144726719")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0121747215 | Ref.-Nr.: KA-0144726719")); item = iter.next(); @@ -1435,7 +1613,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.05))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0303756539 | Ref: KA-0144732844")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0303756539 | Ref.-Nr.: KA-0144732844")); item = iter.next(); @@ -1446,7 +1624,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.61))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision DE0008490822 | Ref: KA-0144735471")); + assertThat(transaction.getNote(), is("Bestandsprovision DE0008490822 | Ref.-Nr.: KA-0144735471")); item = iter.next(); @@ -1457,7 +1635,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.86))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0066902890 | Ref: KA-0144736296")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0066902890 | Ref.-Nr.: KA-0144736296")); item = iter.next(); @@ -1468,7 +1646,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(0.94))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0075056555 | Ref: KA-0144736391")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0075056555 | Ref.-Nr.: KA-0144736391")); item = iter.next(); @@ -1479,7 +1657,7 @@ public void testDepotauszug04() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-07-30T00:00"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(2.58))); assertThat(transaction.getSource(), is("Depotauszug04.txt")); - assertThat(transaction.getNote(), is("Bestandsprovision LU0140363002 | Ref: KA-01 44738244")); + assertThat(transaction.getNote(), is("Bestandsprovision LU0140363002 | Ref.-Nr.: KA-01 44738244")); } @Test @@ -1501,11 +1679,11 @@ public void testDepotauszug05() // assert transaction assertThat(results, hasItem(deposit(hasDate("2023-10-02"), hasAmount("EUR", 250.00), // - hasSource("Depotauszug05.txt"), hasNote("Sammelgutschrift | Ref.: 4*******2")))); + hasSource("Depotauszug05.txt"), hasNote("Sammelgutschrift | Ref.-Nr.: 4*******2")))); // assert transaction assertThat(results, hasItem(fee(hasDate("2023-10-16"), hasAmount("EUR", 0.48), // - hasSource("Depotauszug05.txt"), hasNote("Vermögensverwaltungshonorar | Ref.: 4******6")))); + hasSource("Depotauszug05.txt"), hasNote("Vermögensverwaltungshonorar | Ref.-Nr.: 4******6")))); } @Test @@ -1527,7 +1705,7 @@ public void testDepotauszug06() // assert transaction assertThat(results, hasItem(deposit(hasDate("2021-02-23"), hasAmount("EUR", 1000.00), // - hasSource("Depotauszug06.txt"), hasNote("Sammelgutschrift | Ref.: 193396101")))); + hasSource("Depotauszug06.txt"), hasNote("Sammelgutschrift | Ref.-Nr.: 193396101")))); } @Test @@ -1549,38 +1727,90 @@ public void testDepotauszug07() // assert transaction assertThat(results, hasItem(taxRefund(hasDate("2024-04-02"), hasAmount("EUR", 56.07), // - hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.: 464710285")))); + hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.-Nr.: 464710285")))); // assert transaction assertThat(results, hasItem(fee(hasDate("2024-03-31"), hasAmount("EUR", 2.04), // - hasSource("Depotauszug07.txt"), hasNote("Bestandsprovision LU1274520086 01.01.2024 - 31.03.2024 | Ref.: 467260165")))); + hasSource("Depotauszug07.txt"), hasNote("Bestandsprovision LU1274520086 01.01.2024 - 31.03.2024 | Ref.-Nr.: 467260165")))); // assert transaction assertThat(results, hasItem(fee(hasDate("2024-03-31"), hasAmount("EUR", 3.17), // - hasSource("Depotauszug07.txt"), hasNote("Bestandsprovision LU1233758587 01.01.2024 - 31.03.2024 | Ref.: 467260166")))); + hasSource("Depotauszug07.txt"), hasNote("Bestandsprovision LU1233758587 01.01.2024 - 31.03.2024 | Ref.-Nr.: 467260166")))); // assert transaction assertThat(results, hasItem(fee(hasDate("2024-04-30"), hasAmount("EUR", 440.14), // - hasSource("Depotauszug07.txt"), hasNote("Vermögensverwaltungshonorar | Ref.: 474917266")))); + hasSource("Depotauszug07.txt"), hasNote("Vermögensverwaltungshonorar | Ref.-Nr.: 474917266")))); // assert transaction assertThat(results, hasItem(taxRefund(hasDate("2024-05-02"), hasAmount("EUR", 53.38), // - hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.: 475292925")))); + hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.-Nr.: 475292925")))); // assert transaction assertThat(results, hasItem(taxRefund(hasDate("2024-05-21"), hasAmount("EUR", 132.52), // - hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.: 481573598")))); + hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.-Nr.: 481573598")))); // assert transaction assertThat(results, hasItem(fee(hasDate("2024-05-31"), hasAmount("EUR", 459.73), // - hasSource("Depotauszug07.txt"), hasNote("Vermögensverwaltungshonorar | Ref.: 484298415")))); + hasSource("Depotauszug07.txt"), hasNote("Vermögensverwaltungshonorar | Ref.-Nr.: 484298415")))); // assert transaction assertThat(results, hasItem(taxRefund(hasDate("2024-06-03"), hasAmount("EUR", 55.78), // - hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.: 484782044")))); + hasSource("Depotauszug07.txt"), hasNote("Steueroptimierung | Ref.-Nr.: 484782044")))); // assert transaction assertThat(results, hasItem(fee(hasDate("2024-06-30"), hasAmount("EUR", 451.89), // - hasSource("Depotauszug07.txt"), hasNote("Vermögensverwaltungshonorar | Ref.: 494534896")))); + hasSource("Depotauszug07.txt"), hasNote("Vermögensverwaltungshonorar | Ref.-Nr.: 494534896")))); + } + + @Test + public void testDepotauszug08() + { + QuirinBankAGPDFExtractor extractor = new QuirinBankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Depotauszug08.txt"), + errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2012-01-30"), hasAmount("EUR", 500.00), // + hasSource("Depotauszug08.txt"), hasNote("Überweisungsauftrag | Ref.-Nr.: UT-0239371469")))); + } + + @Test + public void testDepotauszug09() + { + QuirinBankAGPDFExtractor extractor = new QuirinBankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Depotauszug09.txt"), + errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(3L)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // assert transaction + assertThat(results, hasItem(fee(hasDate("2014-03-03"), hasAmount("EUR", 100.00), // + hasSource("Depotauszug09.txt"), hasNote("Honorar Feb/2014 | Ref.-Nr.: KA-0383911958")))); + + // assert transaction + assertThat(results, hasItem(taxRefund(hasDate("2014-03-03"), hasAmount("EUR", 13.91), // + hasSource("Depotauszug09.txt"), hasNote("Steuerbuchung Abgeltungsteuer | Ref.-Nr.: H-0383929197")))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2014-03-09"), hasAmount("EUR", 1198.98), // + hasSource("Depotauszug09.txt"), hasNote("Überweisungsauftrag | Ref.-Nr.: UI-0385701357")))); } } diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Verkauf05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Verkauf05.txt new file mode 100644 index 0000000000..0a6d832cdf --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/quirinbankag/Verkauf05.txt @@ -0,0 +1,44 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.71.2 +----------------------------------------- +Verkauf +Referenz O:003198102:1 +Datum 17.09.2014 +Depot Depotnr. +Nachname, Vorname +Herrn +Vornamen Nachname Betreuer Stangl, Richard +Straße Abteilung Honorarberater +PLZ Ort Telefon +49 (0) 911 249 299 10 +E-Mail richard.stangl@quirinbank.de + +Nominal/Stück Fr.Temp.Inv.Fds-T.China Fd Namens-Anteile A (acc.) o.N. +ST 340 ISIN LU0052750758 WKN 973909 +Abrechnungskonditionen: Abrechnungswerte: +Kurs 23,600000 USD Kurswert 8.024,00 USD 6.192,31 EUR +Ausführungsplatz Fondshandel außerbörslich(FFF) Courtage * 0,00 EUR +Handelstag/-zeit 15.09.2014 Bank-Provision 0,00 EUR +Verwahrart Wertpapierrechnung Spesen * -6,50 EUR +Lagerland CBL-Luxemburg Abwickl.Gebühr * 0,00 EUR +Zahlungstag 18.09.2014 +Devisenkurs 1,295800 +Akkum. Ertrag 315,08 EUR +Poolfaktor 1,000000000 +* Fremde Gebühren und Kosten +Ausmachender Betrag vor Steuer(n) 6.185,81 EUR +Keine Steuerbescheinigung! Ausmachender Betrag vor Steuer(n) 8.015,58 USD +Kapitalertragsteuerpflichtiger Betrag 315,08 EUR Kapitalertragsteuer -100,06 USD -77,22 EUR +Verrechnete sonstige negative Kapitalerträge Solidaritätszuschlag -5,50 USD -4,25 EUR +Verrechnungstopf Aktien 0,00 EUR Kirchensteuer -8,01 USD -6,18 EUR +Verrechnungstopf Sonstige 0,00 EUR Steuerbetrag -113,57 USD -87,65 EUR +Verrechneter Sparer-Pauschalbetrag 0,00 EUR +Anrechenbare ausländ. Quellensteuer 0,00 EUR Den Bruttoabrechnungsbetrag und die separate Steuerbuchung werden wir mit +Bemessungsgrundlage KESt 315,08 EUR Valuta 18.09.2014 über Konto Kontonr. EUR buchen. + Diesem Geschäft liegt keine Anlageberatung der Bank zugrunde. +quirin bank AG Telefon +49 (0) 30 89 021-300 Aufsichtsratsvorsitzender: Vorstand: +Kurfürstendamm 119 - 10711 Berlin Telefax +49 (0) 30 89 021-321 Holger Timm Karl Matthäus Schmidt, Johannes +Postfach 311105 - 10641 Berlin BLZ 10110600 Eismann, Dr. Marcel Morschbach, +Gerichtsstand: Berlin USt-Id. DE 1956 61729 Stefan Spannagl +Handelsregister: Berlin-Charlottenb., HR B 87859 BIC QUBKDEBBXXX +Internet www.quirinbank.de +O10ABR_WPR_E 0000#816767668049#0000026624 VJ9797124 (10) 7.1.8.0.0 \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/QuirinBankAGPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/QuirinBankAGPDFExtractor.java index 7afa277543..d590a87345 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/QuirinBankAGPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/QuirinBankAGPDFExtractor.java @@ -1,9 +1,13 @@ package name.abuchen.portfolio.datatransfer.pdf; import static name.abuchen.portfolio.datatransfer.ExtractorUtils.checkAndSetGrossUnit; +import static name.abuchen.portfolio.util.TextUtil.concatenate; +import static name.abuchen.portfolio.util.TextUtil.replaceMultipleBlanks; import static name.abuchen.portfolio.util.TextUtil.stripBlanks; import static name.abuchen.portfolio.util.TextUtil.trim; +import java.util.Map; + import name.abuchen.portfolio.datatransfer.ExtrExchangeRate; import name.abuchen.portfolio.datatransfer.ExtractorUtils; import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block; @@ -14,6 +18,7 @@ import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.money.Money; +import name.abuchen.portfolio.money.Values; @SuppressWarnings("nls") public class QuirinBankAGPDFExtractor extends AbstractPDFExtractor @@ -107,8 +112,8 @@ private void addBuySellTransaction_Format01() // Referenz-Nr 28522373 // @formatter:on .section("note").optional() // - .match("^(?Referenz\\-Nr .*)$") // - .assign((t, v) -> t.setNote(trim(v.get("note")))) + .match("^Referenz\\-Nr (?.*)$") // + .assign((t, v) -> t.setNote("Ref.-Nr.: " + trim(v.get("note")))) .wrap(BuySellEntryItem::new); @@ -127,6 +132,9 @@ private void addBuySellTransaction_Format02() type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); + // Handshake for taxes on interim profits on purchase transaction + Map context = type.getCurrentContext(); + pdfTransaction // .subject(() -> { @@ -143,28 +151,68 @@ private void addBuySellTransaction_Format02() t.setType(PortfolioTransaction.Type.SELL); }) - // @formatter:off - // Nominal/Stück Bayer.Hypo- und Vereinsbank AG DAX Indexzert(2006/unlim.) - // ST 22 ISIN DE0007873200 - // Abrechnungskonditionen: Abrechnungswerte: - // Kurs 57,5000 EUR Kurswert 1.265,00 EUR - // - // Nominal/Stück Hewlett-Packard Co. Registered Shares DL -,01 - // ST 150 ISIN US4282361033 - // Kurs 39,99667 USD Kurswert -5.999,50 USD -4.734,08 EUR - // @formatter:on - .section("name", "isin", "currency") // - .match("^Nominal\\/St.ck (?.*)$") // - .match("^ST [\\.,\\d]+ ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") // - .match("^Kurs[\\s]{1,}[\\.,\\d]+ (?[\\w]{3}) .*$") // - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + .oneOf( // + // @formatter:off + // Nominal/Stück Bayer.Hypo- und Vereinsbank AG DAX Indexzert(2006/unlim.) + // ST 22 ISIN DE0007873200 + // Abrechnungskonditionen: Abrechnungswerte: + // Kurs 57,5000 EUR Kurswert 1.265,00 EUR + // + // Nominal/Stück Hewlett-Packard Co. Registered Shares DL -,01 + // ST 150 ISIN US4282361033 + // Kurs 39,99667 USD Kurswert -5.999,50 USD -4.734,08 EUR + // @formatter:on + section -> section // + .attributes("name", "isin", "currency") // + .match("^Nominal\\/St.ck (?.*)$") // + .match("^ST [\\.,\\d]+ ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") // + .match("^Kurs[\\s]{1,}[\\.,\\d]+ (?[\\w]{3}) .*$") // + .assign((t, v) -> { + t.setSecurity(getOrCreateSecurity(v)); + + // @formatter:off + // Handshake for taxes on interim profits on purchase transaction + // @formatter:on + context.put("name", t.getPortfolioTransaction().getSecurity().getName()); + context.put("isin", t.getPortfolioTransaction().getSecurity().getIsin()); + context.put("wkn", t.getPortfolioTransaction().getSecurity().getWkn()); + }), + // @formatter:off + // Nominal/Stück Carmignac Patrimoine FCP Act.au Port.A EUR acc o.N. + // ST 0,1318 ISIN FR0010135103 WKN A0DPW0 + // Kurs 569,060000 EUR Kurswert -75,00 EUR + // @formatter:on + section -> section // + .attributes("name", "isin", "wkn", "currency") // + .match("^Nominal\\/St.ck (?.*)$") // + .match("^ST [\\.,\\d]+ ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9]) WKN (?[A-Z0-9]{6})$") // + .match("^Kurs[\\s]{1,}[\\.,\\d]+ (?[\\w]{3}) .*$") // + .assign((t, v) -> { + t.setSecurity(getOrCreateSecurity(v)); + + // @formatter:off + // Handshake for taxes on interim profits on purchase transaction + // @formatter:on + context.put("name", t.getPortfolioTransaction().getSecurity().getName()); + context.put("isin", t.getPortfolioTransaction().getSecurity().getIsin()); + context.put("wkn", t.getPortfolioTransaction().getSecurity().getWkn()); + })) // @formatter:off // ST 22 ISIN DE0007873200 + // ST 0,1318 ISIN FR0010135103 WKN A0DPW0 // @formatter:on .section("shares") // - .match("^ST (?[\\.,\\d]+) ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") // - .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + .match("^ST (?[\\.,\\d]+) ISIN [A-Z]{2}[A-Z0-9]{9}[0-9].*$") // + .assign((t, v) -> { + t.setShares(asShares(v.get("shares"))); + + // @formatter:off + // Use number for that is also used to (later) convert it back to a number + // @formatter:on + context.put("shares", getNumberFormat() // + .format(t.getPortfolioTransaction().getShares() / Values.Share.divider())); + }) .oneOf( // // @formatter:off @@ -187,14 +235,27 @@ private void addBuySellTransaction_Format02() // @formatter:off // Keine Steuerbescheinigung! Ausmachender Betrag vor Steuern 1.261,61 EUR // Den Gesamtbetrag werden wir mit Valuta 12.02.2010 auf Ihrem Ausmachender Betrag -3.997,09 EUR + // Ausmachender Betrag vor Steuer(n) -75,00 EUR // @formatter:on .section("amount", "currency") // - .match("^.* Ausmachender Betrag.* (\\-)?(?[\\.,\\d]+) (?[\\w]{3})$") // + .match("^.*Ausmachender Betrag.* (\\-)?(?[\\.,\\d]+) (?[\\w]{3})$") // .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) + // @formatter:off + // Verrechnungstopf Sonstige 0,00 EUR Steuerbetrag -144,33 EUR + // Verrechnungstopf Sonstige 0,00 EUR Steuerbetrag -113,57 USD -87,65 EUR + // @formatter:on + .section("tax", "currency").optional() // + .match("^.* Steuerbetrag .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // + .assign((t, v) -> { + Money tax = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax"))); + + t.setMonetaryAmount(t.getPortfolioTransaction().getMonetaryAmount().subtract(tax)); + }) + // @formatter:off // Kurs 39,99667 USD Kurswert -5.999,50 USD -4.734,08 EUR // Devisenkurs 1,267300 @@ -216,13 +277,14 @@ private void addBuySellTransaction_Format02() // Referenz O:000409887:1 // @formatter:on .section("note").optional() // - .match("^(?Referenz .*)$") // - .assign((t, v) -> t.setNote(trim(v.get("note")))) + .match("^Referenz (?.*)$") // + .assign((t, v) -> t.setNote("Ref.-Nr.: " + trim(v.get("note")))) .wrap(BuySellEntryItem::new); addTaxesSectionsTransaction(pdfTransaction, type); addFeesSectionsTransaction(pdfTransaction, type); + addTaxesLostAdjustmentTransaction(context, type); } private void addDividendeTransaction_Format01() @@ -327,8 +389,8 @@ private void addDividendeTransaction_Format01() // Referenz-Nr 28522373 .section("note").optional() // - .match("^(?Referenz\\-Nr .*)$") // - .assign((t, v) -> t.setNote(trim(v.get("note")))) + .match("^Referenz\\-Nr (?.*)$") // + .assign((t, v) -> t.setNote("Ref.-Nr.: " + trim(v.get("note")))) .wrap(TransactionItem::new); @@ -338,12 +400,14 @@ private void addDividendeTransaction_Format01() private void addDividendeTransaction_Format02() { - DocumentType type = new DocumentType("Dividendenabrechnung"); + DocumentType type = new DocumentType("(Dividendenabrechnung" // + + "|Ertrag aus Investments)"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); - Block firstRelevantLine = new Block("^Dividendenabrechnung$"); + Block firstRelevantLine = new Block("^(Dividendenabrechnung" // + + "|Ertrag aus Investments)$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); @@ -355,22 +419,36 @@ private void addDividendeTransaction_Format02() return accountTransaction; }) - // @formatter:off - // Nominal/Stück Siemens AG Namens-Aktien o.N. - // ST 52 ISIN DE0007236101 - // Dividenden pro Stück 1,60000 EUR - // @formatter:on - .section("name", "isin", "currency") // - .match("^Nominal\\/St.ck (?.*)$") // - .match("^ST [\\.,\\d]+ ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") // - .match("^Dividenden pro St.ck[\\s]{1,}[\\.,\\d]+ (?[\\w]{3})$") // - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) + .oneOf( // + // @formatter:off + // Nominal/Stück Siemens AG Namens-Aktien o.N. + // ST 52 ISIN DE0007236101 + // Dividenden pro Stück 1,60000 EUR + // @formatter:on + section -> section // + .attributes("name", "isin", "currency") // + .match("^Nominal\\/St.ck (?.*)$") // + .match("^ST [\\.,\\d]+ ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") // + .match("^(Dividenden|Aussch.ttung) pro St.ck[\\s]{1,}[\\.,\\d]+ (?[\\w]{3})$") // + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))), + // @formatter:off + // Nominal/Stück iSh.STOXX Europe 600 U.ETF DE Inhaber-Anteile + // ST 459 ISIN DE0002635307 WKN 263530 + // Ausschüttung pro Stück 0,112275 EUR + // @formatter:on + section -> section // + .attributes("name", "isin", "wkn", "currency") // + .match("^Nominal\\/St.ck (?.*)$") // + .match("^ST [\\.,\\d]+ ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9]) WKN (?[A-Z0-9]{6})$") // + .match("^(Dividenden|Aussch.ttung) pro St.ck[\\s]{1,}[\\.,\\d]+ (?[\\w]{3})$") // + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v)))) // @formatter:off // ST 52 ISIN DE0007236101 + // ST 459 ISIN DE0002635307 WKN 263530 // @formatter:on .section("shares") // - .match("^ST (?[\\.,\\d]+) ISIN (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") // + .match("^ST (?[\\.,\\d]+) ISIN [A-Z]{2}[A-Z0-9]{9}[0-9].*$") // .assign((t, v) -> t.setShares(asShares(v.get("shares")))) // @formatter:off @@ -401,7 +479,7 @@ private void addDividendeTransaction_Format02() // Verrechnungstopf Sonstige 0, 00 EUR Steuerbetrag -9,07 USD -6,93 EUR // @formatter:on .section("tax", "currency").optional() // - .match("^.* Steuerbetrag .*\\-(?[\\.,\\d]+) (?[\\w]{3})$") // + .match("^.* Steuerbetrag .*\\-([\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // .assign((t, v) -> { Money tax = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax"))); @@ -412,7 +490,7 @@ private void addDividendeTransaction_Format02() // Ausl. Quellensteuer -32,62 USD -24,90 EUR // @formatter:on .section("tax", "currency").optional() // - .match("^Ausl\\. Quellensteuer .*\\-(?[\\.,\\d]+) (?[\\w]{3}).*$") // + .match("^Ausl\\. Quellensteuer .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // .assign((t, v) -> { Money tax = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax"))); @@ -440,8 +518,8 @@ private void addDividendeTransaction_Format02() // Referenz DZ:255990 // @formatter:on .section("note").optional() // - .match("^(?Referenz .*)$") // - .assign((t, v) -> t.setNote(trim(v.get("note")))) + .match("^Referenz (?.*)$") // + .assign((t, v) -> t.setNote("Ref.-Nr.: " + trim(v.get("note")))) .conclude(ExtractorUtils.fixGrossValueA()) @@ -523,8 +601,8 @@ private void addAdvanceTaxTransaction() // Referenz-Nr 28522373 .section("note").optional() // - .match("^(?Referenz\\-Nr .*)$") // - .assign((t, v) -> t.setNote(trim(v.get("note")))) + .match("^Referenz\\-Nr (?.*)$") // + .assign((t, v) -> t.setNote("Ref.-Nr.: " + trim(v.get("note")))) .wrap(TransactionItem::new); } @@ -545,7 +623,7 @@ private void addDepotStatementTransaction() + "|Interne Buchung" // + "|.berweisungsgutschrift Inland) " // + ".* " // - + "[\\.,\\d]+([\\s])?[\\w]{3}.*$"); + + "[\\.,\\d]+[\s]{1,}[\\w]{3}.*$"); type.addBlock(depositBlock); depositBlock.setMaxSize(5); depositBlock.set(new Transaction() @@ -562,22 +640,21 @@ private void addDepotStatementTransaction() + "|Interne Buchung" // + "|.berweisungsgutschrift Inland)) " // + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // - .match("^(?Ref\\.: .*)$") // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^Ref\\.: (?.*)$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " | " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); }) .wrap(TransactionItem::new)); - // @formatter:off - // Rücküberweisung Inland 23.12.2019 19.12.2019 -5.002,84 EUR - // @formatter:on - Block removalBlock = new Block("^R.ck.berweisung Inland .* \\-[\\.,\\d]+([\\s])?[\\w]{3}.*$"); + Block removalBlock = new Block("^(R.ck.berweisung Inland" // + + "|.berweisungsauftrag,) " // + + ".* \\-[\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); type.addBlock(removalBlock); removalBlock.setMaxSize(5); removalBlock.set(new Transaction() @@ -588,28 +665,87 @@ private void addDepotStatementTransaction() return accountTransaction; }) - .section("note1", "note2", "date", "amount") // - .match("^(?R.ck.berweisung Inland) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "\\-(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // - .match("^(?Ref\\.: .*)$") // + .oneOf( // + // @formatter:off + // Rücküberweisung Inland 23.12.2019 19.12.2019 -5.002,84 EUR + // @formatter:on + section -> section // + .attributes("note1", "note2", "date", "amount") // + .match("^(?R.ck.berweisung Inland) " + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "\\-(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^Ref\\.: (?.*)$") // + .assign((t, v) -> { + t.setDateTime(asDate(stripBlanks(v.get("date")))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); + }), + // @formatter:off + // Überweisungsauftrag, .*: UT-0239371469 30.01.2012 30.01.2012 -500,00 EUR + //Überweisungsauftrag, R ef: UI-0385701357 10.03.2014 09.03.2014 -1.198,98 EUR + // @formatter:on + section -> section // + .attributes("note1", "note2", "date", "amount", "currency") // + .match("^(?.berweisungsauftrag),[\\s]{1,}.*: (?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" + + "\\-(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .assign((t, v) -> { + t.setDateTime(asDate(stripBlanks(v.get("date")))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); + })) + + .wrap(TransactionItem::new)); + + // @formatter:off + // Steuerbuchung Abgeltungsteuer, .*: H-0139925023 30.06.2010 30.06.2010 -1,28 EUR + // Steuern auf Kontoabschluss + // + // Steuerbuchung Abgeltungsteuer, Ref: H-0144775628 30.07.2010 30.07.2010 -1,33 EUR + // + // Steuern auf Kontoabschluss + // @formatter:on + Block taxesBlock = new Block("^Steuerbuchung Abgeltungsteuer, .* \\-[\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); + type.addBlock(taxesBlock); + taxesBlock.setMaxSize(3); + taxesBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.TAXES); + return accountTransaction; + }) + + .section("note1", "note2", "date", "amount", "currency").optional() // + .match("^(?Steuerbuchung Abgeltungsteuer),[\\s]{1,}.*: (?.*) " // + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "\\-(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^Steuern auf Kontoabschluss.*$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " | " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); }) - .wrap(TransactionItem::new)); + .wrap(t -> { + if (t.getCurrencyCode() != null && t.getAmount() != 0) + return new TransactionItem(t); + return null; + })); // @formatter:off // Steueroptimierung 02.04.2024 02.04.2024 56,07 EUR // Ref.: 464710285 // @formatter:on - Block taxReturnBlock = new Block("^Steueroptimierung .* [\\.,\\d]+([\\s])?[\\w]{3}.*$"); - type.addBlock(taxReturnBlock); - taxReturnBlock.setMaxSize(5); - taxReturnBlock.set(new Transaction() + Block taxRefundBlock01 = new Block("^Steueroptimierung .* [\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); + type.addBlock(taxRefundBlock01); + taxRefundBlock01.setMaxSize(5); + taxRefundBlock01.set(new Transaction() .subject(() -> { AccountTransaction accountTransaction = new AccountTransaction(); @@ -619,23 +755,57 @@ private void addDepotStatementTransaction() .section("note1", "note2", "date", "amount", "currency") // .match("^(?Steueroptimierung) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // - .match("^(?Ref\\.: .*)$") // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^Ref\\.: (?.*)$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " | " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); }) .wrap(TransactionItem::new)); + // @formatter:off + // Steuerbuchung Abgeltungsteuer, Ref: H-0383929197 03.03.2014 03.03.2014 13,91 EUR + // Steuern auf Kontoabschluss + // @formatter:on + Block taxRefundBlock02 = new Block("^Steuerbuchung Abgeltungsteuer, .* [\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); + type.addBlock(taxRefundBlock02); + taxRefundBlock02.setMaxSize(3); + taxRefundBlock02.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.TAX_REFUND); + return accountTransaction; + }) + + .section("note1", "note2", "date", "amount", "currency").optional() // + .match("^(?Steuerbuchung Abgeltungsteuer),[\\s]{1,}.*: (?.*) " // + + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^Steuern auf Kontoabschluss.*$") // + .assign((t, v) -> { + t.setDateTime(asDate(stripBlanks(v.get("date")))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); + }) + + .wrap(t -> { + if (t.getCurrencyCode() != null && t.getAmount() != 0) + return new TransactionItem(t); + return null; + })); + // @formatter:off // Vermögensverwaltungshonorar 31.08.2019 31.08.2019 -5,75 EUR // Vermögensverwaltungshonorar 0000000000, 01.09.2019 - 30.09.2019 30.09.2019 30.09.2019 -6,98 EUR // @formatter:on - Block feesBlock01 = new Block("^Verm.gensverwaltungshonorar.* \\-[\\.,\\d]+([\\s])?[\\w]{3}.*$"); + Block feesBlock01 = new Block("^Verm.gensverwaltungshonorar.* \\-[\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); type.addBlock(feesBlock01); feesBlock01.setMaxSize(5); feesBlock01.set(new Transaction() @@ -648,23 +818,23 @@ private void addDepotStatementTransaction() .section("note1", "date", "amount", "currency", "note2") // .match("^(?Verm.gensverwaltungshonorar).* [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "\\-(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // - .match("^(?Ref\\.: .*)$") // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "\\-(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^Ref\\.: (?.*)$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " | " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); }) .wrap(TransactionItem::new)); // @formatter:off - // Flatrate, Ref: KA-0139816662 30.06.2010 30.06.2010 -75,00 EUR + // Flatrate, .*: KA-0139816662 30.06.2010 30.06.2010 -75,00 EUR // Gebühren 01.06.2010 - 30.06.2010 // @formatter:on - Block feesBlock02 = new Block("^Flatrate, .* \\-[\\.,\\d]+([\\s])?[\\w]{3}.*$"); + Block feesBlock02 = new Block("^Flatrate, .* \\-[\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); type.addBlock(feesBlock02); feesBlock02.setMaxSize(5); feesBlock02.set(new Transaction() @@ -675,25 +845,25 @@ private void addDepotStatementTransaction() return accountTransaction; }) - .section("note1", "date", "amount", "currency", "note2") // - .match("^(?Flatrate),( .*)? [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "\\-(?[\\.,\\d]+)([\\s])?(?[\\w]{3})$") // - .match("^(?Geb.hren [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} \\- [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") // + .section("note1", "note2", "date", "amount", "currency", "note3") // + .match("^(?Flatrate),[\\s]{1,}.*: (?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "\\-(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3})$") // + .match("^(?Geb.hren [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} \\- [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " " + trim(v.get("note3")) + " | Ref.-Nr.: " + trim(v.get("note2"))); }) .wrap(TransactionItem::new)); // @formatter:off - // Volumen Fee, Ref: KA-0139816664 30.06.2010 30.06.2010 -29,55 EUR + // Volumen Fee, .*: KA-0139816664 30.06.2010 30.06.2010 -29,55 EUR // Gebühren Depot Konto/Depot-Nr. 01.04.2010 - 30.06.2010 // @formatter:on - Block feesBlock03 = new Block("^Volumen Fee, .* \\-[\\.,\\d]+([\\s])?[\\w]{3}.*$"); + Block feesBlock03 = new Block("^Volumen Fee, .* \\-[\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); type.addBlock(feesBlock03); feesBlock03.set(new Transaction() @@ -703,16 +873,16 @@ private void addDepotStatementTransaction() return accountTransaction; }) - .section("note1", "date", "amount", "currency", "note2", "note3") // - .match("^(?Volumen Fee),( .*)? [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "\\-(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // - .match("^(?Geb.hren).* (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} \\- [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") // + .section("note1", "note2", "date", "amount", "currency", "note3", "note4") // + .match("^(?Volumen Fee),[\\s]{1,}.*: (?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "\\-(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^(?Geb.hren).* (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} \\- [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " " + trim(v.get("note2")) + " " + trim(v.get("note3"))); + t.setNote(v.get("note1") + " " + trim(v.get("note3")) + " " + trim(v.get("note4")) + " | Ref.-Nr.: " + trim(v.get("note2"))); }) .wrap(TransactionItem::new)); @@ -723,7 +893,7 @@ private void addDepotStatementTransaction() // Gesamtbetrag: 2,50 EUR (KEST: -0,44 EUR, SOLI: -0,02 EUR) // Ref.: 467260165 // @formatter:on - Block feeBlock04 = new Block("^[\\d]+ Bestand.*, .* [\\.,\\d]+([\\s])?[\\w]{3}.*$"); + Block feeBlock04 = new Block("^[\\d]+ Bestand.*, .* [\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); type.addBlock(feeBlock04); feeBlock04.setMaxSize(5); feeBlock04.set(new Transaction() @@ -739,117 +909,156 @@ private void addDepotStatementTransaction() + "(?.*), " + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]+) " - + "(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // + + "(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // .match("^(?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") // - .match("^(?Ref\\.: .*)$") // + .match("^Ref\\.: (?.*)$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " " + trim(v.get("note3")) + " " + trim(v.get("note2")) + " | " + trim(v.get("note4"))); + t.setNote(v.get("note1") + " " + trim(v.get("note3")) + " " + trim(v.get("note2")) + " | Ref.-Nr.: " + trim(v.get("note4"))); }) - .wrap(t -> { - if (t.getCurrencyCode() != null && t.getAmount() != 0) - return new TransactionItem(t); - return null; - })); + .wrap(TransactionItem::new)); // @formatter:off - // Haben-Zinsen Kontoabschluss, Ref: KA-0139907281 30.06.2010 30.06.2010 4,61EUR + // Honorar, Ref: KA-0383911958 03.03.2014 03.03.2014 -100,00 EUR + // Honorar:Feb/2014 BMG:64.569,82 Brutto: 100,00 Netto: 95,21 // @formatter:on - Block interestBlock = new Block("^Haben\\-Zinsen Kontoabschluss, .* [\\.,\\d]+([\\s])?[\\w]{3}.*$"); - type.addBlock(interestBlock); - interestBlock.set(new Transaction() + Block feesBlock05 = new Block("^Honorar, .* \\-[\\.,\\d]+[\\s]{1,}[\\w]{3}.*$"); + type.addBlock(feesBlock05); + feesBlock05.set(new Transaction() .subject(() -> { AccountTransaction accountTransaction = new AccountTransaction(); - accountTransaction.setType(AccountTransaction.Type.INTEREST); + accountTransaction.setType(AccountTransaction.Type.FEES); return accountTransaction; }) - .section("note1", "note2", "date", "amount", "currency") // - .match("^(?Haben\\-Zinsen Kontoabschluss), " // - + "(?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // + .section("note1", "note2", "date", "amount", "currency", "note3") // + .match("^(?Honorar),[\\s]{1,}.*: (?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "\\-(?[\\.,\\d]+)[\\s]{1,}(?[\\w]{3}).*$") // + .match("^Honorar:(?.*\\/[\\d]{4}) .*$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " | " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " " + trim(v.get("note3")) + " | Ref.-Nr.: " + trim(v.get("note2"))); }) .wrap(TransactionItem::new)); // @formatter:off - // Steuerbuchung Abgeltungsteuer, Ref: H-0139925023 30.06.2010 30.06.2010 -1,28 EUR - // Steuern auf Kontoabschluss + // Rückvergütung Bestandsprovision, .*: KA-0144683460 30.07.2010 30.07.2010 2,03EUR + // + // Bestand LU0303756539 // @formatter:on - Block taxesBlock = new Block("^Steuerbuchung Abgeltungsteuer, .* \\-[\\.,\\d]+([\\s])?[\\w]{3}.*$"); - type.addBlock(taxesBlock); - taxesBlock.setMaxSize(5); - taxesBlock.set(new Transaction() + Block feeRefundBlock = new Block("^R.ckverg.tung Bestand.*, .* [\\.,\\d]+([\s]+)?[\\w]{3}.*$"); + type.addBlock(feeRefundBlock); + feeRefundBlock.setMaxSize(5); + feeRefundBlock.set(new Transaction() .subject(() -> { AccountTransaction accountTransaction = new AccountTransaction(); - accountTransaction.setType(AccountTransaction.Type.TAXES); + accountTransaction.setType(AccountTransaction.Type.FEES_REFUND); return accountTransaction; }) - .section("note1", "note2", "date", "amount", "currency").optional() // - .match("^(?Steuerbuchung Abgeltungsteuer), (?.*) " // + .section("note1", "note2", "date", "amount", "currency", "note3") // + .match("^R.ckverg.tung (?Bestand.*), .*: (?.*) " // + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "\\-(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // - .match("^Steuern auf Kontoabschluss.*$") // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "(?[\\.,\\d]+)([\\s]+)?(?[\\w]{3}).*$") // + .match("^Bestand (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " | " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " " + trim(v.get("note3")) + " | Ref.-Nr.: " + trim(v.get("note2"))); }) - .wrap(t -> { - if (t.getCurrencyCode() != null && t.getAmount() != 0) - return new TransactionItem(t); - return null; - })); + .wrap(TransactionItem::new)); // @formatter:off - // Rückvergütung Bestandsprovision, Ref: KA-0144683460 30.07.2010 30.07.2010 2,03EUR - // - // Bestand LU0303756539 + // Haben-Zinsen Kontoabschluss, .*: KA-0139907281 30.06.2010 30.06.2010 4,61EUR // @formatter:on - Block feeRefundBlock = new Block("^R.ckverg.tung Bestand.*, .* [\\.,\\d]+([\\s])?[\\w]{3}.*$"); - type.addBlock(feeRefundBlock); - feeRefundBlock.setMaxSize(5); - feeRefundBlock.set(new Transaction() + Block interestBlock = new Block("^Haben\\-Zinsen Kontoabschluss, .* [\\.,\\d]+([\\s]+)?[\\w]{3}.*$"); + type.addBlock(interestBlock); + interestBlock.set(new Transaction() .subject(() -> { AccountTransaction accountTransaction = new AccountTransaction(); - accountTransaction.setType(AccountTransaction.Type.FEES_REFUND); + accountTransaction.setType(AccountTransaction.Type.INTEREST); return accountTransaction; }) - .section("note1", "note2", "date", "amount", "currency", "note3") // - .match("^R.ckverg.tung (?Bestand.*), (?.*) " // - + "[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // - + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+) ([\\s])?" // - + "(?[\\.,\\d]+)([\\s])?(?[\\w]{3}).*$") // - .match("^Bestand (?[A-Z]{2}[A-Z0-9]{9}[0-9]).*$") // + .section("note1", "note2", "date", "amount", "currency") // + .match("^(?Haben\\-Zinsen Kontoabschluss), " // + + ".*: (?.*) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (\\- )?" // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d\\s]+)[\\s]{1,}" // + + "(?[\\.,\\d]+)([\\s]+)?(?[\\w]{3}).*$") // .assign((t, v) -> { t.setDateTime(asDate(stripBlanks(v.get("date")))); t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); - t.setNote(v.get("note1") + " " + trim(v.get("note3")) + " | " + trim(v.get("note2"))); + t.setNote(v.get("note1") + " | Ref.-Nr.: " + trim(v.get("note2"))); }) + .wrap(TransactionItem::new)); + } + + private void addTaxesLostAdjustmentTransaction(Map context, DocumentType type) + { + Transaction pdfTransaction = new Transaction<>(); + + Block firstRelevantLine = new Block("^Kauf$"); + type.addBlock(firstRelevantLine); + firstRelevantLine.set(pdfTransaction); + + pdfTransaction // + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.TAXES); + return accountTransaction; + }) + + // @formatter:off + // Verrechnungstopf Sonstige 0,00 EUR Steuerbetrag 0,05 EUR + // Bemessungsgrundlage KESt -0,17 EUR Valuta 10.03.2014 über Konto Kontonr. EUR buchen. + // @formatter:on + .section("amount", "currency", "date").optional() // + .match("^Verrechnungstopf Sonstige .* Steuerbetrag[\\s]{1,}(?[\\.,\\d]+) (?[\\w]{3}).*$") // + .match("^Bemessungsgrundlage KESt .* Valuta (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) .*$") // + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setShares(asShares(context.get("shares"))); + t.setSecurity(getOrCreateSecurity(context)); + + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + }) + + // @formatter:off + // Devisenkurs 1,000000 Zwischengewinn 0,17 EUR + // @formatter:on + .section("note").optional() // + .match("^.* (?Zwischengewinn[\\s]{1,}[\\.,\\d]+ [\\w]{3}).*$") // + .assign((t, v) -> t.setNote(trim(replaceMultipleBlanks(v.get("note"))))) + + // @formatter:off + // Referenz O:000409887:1 + // @formatter:on + .section("note").optional() // + .match("^Referenz (?.*)$") // + .assign((t, v) -> t.setNote(concatenate(t.getNote(), trim(v.get("note")), " | Ref.-Nr.: "))) + .wrap(t -> { if (t.getCurrencyCode() != null && t.getAmount() != 0) return new TransactionItem(t); return null; - })); + }); } private > void addTaxesSectionsTransaction(T transaction, DocumentType type) @@ -868,7 +1077,7 @@ private > void addTaxesSectionsTransaction(T transactio // Kapitalertragsteuer EUR -73,71 // @formatter:on .section("currency", "tax").optional() // - .match("^Kapitalertragsteuer (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+)$") // + .match("^Kapitalertrags(s)?teuer (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+).*$") // .assign((t, v) -> processTaxEntries(t, v, type)) // @formatter:off @@ -876,7 +1085,7 @@ private > void addTaxesSectionsTransaction(T transactio // Solidaritätszuschlag EUR -4,05 // @formatter:on .section("currency", "tax").optional() // - .match("^Solidarit.tszuschlag (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+)$") // + .match("^Solidarit.tszuschlag (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+).*$") // .assign((t, v) -> processTaxEntries(t, v, type)) // @formatter:off @@ -884,15 +1093,16 @@ private > void addTaxesSectionsTransaction(T transactio // Kirchensteuer EUR -1,00 // @formatter:on .section("currency", "tax").optional() // - .match("^Kirchensteuer (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+)$") // + .match("^Kirchensteuer (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+).*$") // .assign((t, v) -> processTaxEntries(t, v, type)) // @formatter:off // Verrechnungstopf Sonstige 0,00 EUR Steuerbetrag -144,33 EUR // Verrechnungstopf Sonstige 0, 00 EUR Steuerbetrag -9,07 USD -6,93 EUR + // Verrechnungstopf Sonstige 0,00 EUR Steuerbetrag -113,57 USD -87,65 EUR // @formatter:on .section("tax", "currency").optional() // - .match("^.* Steuerbetrag .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3})$") // + .match("^.* Steuerbetrag .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // .assign((t, v) -> processTaxEntries(t, v, type)); } @@ -904,66 +1114,62 @@ private > void addFeesSectionsTransaction(T transaction // Abwicklungsgebühren * EUR - 4,90 // @formatter:on .section("currency", "fee").optional() // - .match("^Abwicklungsgeb.hren \\* (?[\\w]{3}) \\-([\\s])?(?[\\.,'\\d]+)$") // + .match("^Abwicklungsgeb.hren \\* (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+).*$") // .assign((t, v) -> processFeeEntries(t, v, type)) // @formatter:off - // Courtage * EUR 0,00 - // @formatter:on - .section("currency", "fee").optional() // - .match("^Courtage \\* (?[\\w]{3}) \\-([\\s])?(?[\\.,'\\d]+)$") // - .assign((t, v) -> processFeeEntries(t, v, type)) - - // @formatter:off - // Spesen * EUR 0,00 + // Lagerland CBL-Deutschland Abwickl.Gebühr * -0,04 EUR + // Devisenkurs 1,000000 Abwickl.Gebühr * -4,12 EUR // @formatter:on - .section("currency", "fee").optional() // - .match("^Spesen \\* (?[\\w]{3}) \\-([\\s])?(?[\\.,'\\d]+)$") // + .section("fee", "currency").optional() // + .match("^.*Abwickl\\.Geb.hr \\* .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // .assign((t, v) -> processFeeEntries(t, v, type)) // @formatter:off - // Bank-Provision EUR 0,00 + // Courtage * EUR 0,00 // @formatter:on .section("currency", "fee").optional() // - .match("^.*Bank\\-Provision (?[\\w]{3}) \\-([\\s])?(?[\\.,'\\d]+)$") // + .match("^Courtage \\* (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+).*$") // .assign((t, v) -> processFeeEntries(t, v, type)) // @formatter:off - // Verwahrart Girosammel-Verwahrung Spesen * -0,69 EUR - // Verwahrart Wertpapierrechnung / Drittverw. Spesen * -6,50 EUR + // Ausführungsplatz Xetra Courtage * -0,08 EUR + // Ausführungsplatz Fondshandel außerbörslich(FFF) Courtage * 0,00 EUR + // Ausführungsplatz Stuttgart Courtage * -3,39 EUR // @formatter:on .section("fee", "currency").optional() // - .match("^Verwahrart .* Spesen \\* .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3})$") // + .match("^.* .* Courtage \\* .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // .assign((t, v) -> processFeeEntries(t, v, type)) // @formatter:off - // Lagerland CBL-Deutschland Abwickl.Gebühr * -0,04 EUR + // Spesen * EUR 0,00 // @formatter:on - .section("fee", "currency").optional() // - .match("^Lagerland .* Abwickl\\.Geb.hr \\* .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3})$") // + .section("currency", "fee").optional() // + .match("^Spesen \\* (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+).*$") // .assign((t, v) -> processFeeEntries(t, v, type)) // @formatter:off + // Verwahrart Girosammel-Verwahrung Spesen * -0,69 EUR + // Verwahrart Wertpapierrechnung / Drittverw. Spesen * -6,50 EUR + // Zahlungstag 16.09.2014 Spesen * -0,75 EUR // Lagerland USA Aktien/Renten Spesen * -20,00 USD -15,78 EUR // @formatter:on .section("fee", "currency").optional() // - .match("^Lagerland .* Spesen \\* .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3})$") // + .match("^.*Spesen \\* \\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // .assign((t, v) -> processFeeEntries(t, v, type)) // @formatter:off - // Ausführungsplatz Xetra Courtage * -0,08 EUR - // Ausführungsplatz Fondshandel außerbörslich(FFF) Courtage * 0,00 EUR - // Ausführungsplatz Stuttgart Courtage * -3,39 EUR + // Bank-Provision EUR 0,00 // @formatter:on - .section("fee", "currency").optional() // - .match("^.* .* Courtage \\* .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3})$") // + .section("currency", "fee").optional() // + .match("^.*Bank\\-Provision (?[\\w]{3}) \\-([\\s])?(?[\\.,\\d]+).*$") // .assign((t, v) -> processFeeEntries(t, v, type)) // @formatter:off // Handelstag/-zeit 10.02.2010 17:08:23 Bank-Provision -0,02 EUR // @formatter:on .section("fee", "currency").optional() // - .match("^.* Bank\\-Provision .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3})$") // + .match("^.* Bank\\-Provision .*\\-([\\s])?(?[\\.,\\d]+) (?[\\w]{3}).*$") // .assign((t, v) -> processFeeEntries(t, v, type)); } }