From 2dd534e15b03547a508432803ebb6b7d1110724a Mon Sep 17 00:00:00 2001 From: Alexander Ott <45203494+Nirus2000@users.noreply.github.com> Date: Fri, 6 Dec 2024 04:29:18 +0100 Subject: [PATCH] Modify Consorbank PDF-Importer to support new transaction (#4386) https://forum.portfolio-performance.info/t/consors-kauf-eurex-pdf/30661/3 --- .../ConsorsbankPDFExtractorTest.java | 31 ++++++++++++++ .../datatransfer/pdf/consorsbank/Kauf29.txt | 40 +++++++++++++++++++ .../pdf/ConsorsbankPDFExtractor.java | 14 +++---- 3 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/Kauf29.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java index 5c96ec3e77..abce777a6e 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/ConsorsbankPDFExtractorTest.java @@ -1543,6 +1543,37 @@ public void testWertpapierKauf28() hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } + @Test + public void testWertpapierKauf29() + { + ConsorsbankPDFExtractor extractor = new ConsorsbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf29.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("DE0006231004"), hasWkn("623100"), hasTicker(null), // + hasName("INFINEON TECH.AG NA O.N."), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2009-01-07T08:42:15"), hasShares(200.00), // + hasSource("Kauf29.txt"), // + hasNote("35641755.001"), // + hasAmount("EUR", 1059.45), hasGrossValue("EUR", 1040.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 12.55 + 4.95 + 1.95)))); + } + @Test public void testWertpapierBezug01() { diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/Kauf29.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/Kauf29.txt new file mode 100644 index 0000000000..76a29feef2 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/consorsbank/Kauf29.txt @@ -0,0 +1,40 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.72.2 +----------------------------------------- +Cortal Consors • Postfach 17 43 • 90006 Nürnberg +Depotnummer 6744441154 +1000301887/00 +GXbzzG uYZed +ohjonbP 6 Vermerk der Bank 2000 +16789 RsQdqivkQ 02 +WERTPAPIERABRECHNUNG +KAUF EUREX AM 07.01.2009 UM 08:42:15 IN FRANKFURT NR. 35641755.001 +Wertpapier WKN ISIN +INFINEON TECH.AG NA O.N. 623100 DE0006231004 +Einheit Umsatz +ST 200,00000 +Kurs 5,200000 EUR P.ST. FRANCO COURTAGE +Kurswert EUR 0.040,00 +Provision EUR 12,55 +Grundgebuehr EUR 4,95 +Eig. Spesen EUR 1,95 +Wert 09.01.2009 EUR 1.059,45 +zulasten Konto-Nr. 0700616347 +Wertpapiere zugunsten Girosammelverwahrung +Eigene Spesen enthalten 1,95 EUR Umschreibegebühr inkl. 19 % MWST +Auslosung an der Eurex +Clearstream Bk Ffm 2126 +Hinweis für Kontoauszüge, Wertpapierabrechnungen und Depotbuchungsanzeigen: +Kapitalerträge und Spekulationsgewinne sind einkommensteuerpflichtig. +Einwendungen wegen Unrichtigkeit oder Unvollständigkeit dieser Mitteilung oder die Nichtgenehmigung einer im Wege der Einzugsermächtigung erfolgten +Lastschriftabbuchung müssen unverzüglich erhoben werden, vgl. Ziffer I. 11 (4) und (5) der Allgemeine Geschäftsbedingungen von Cortal Consors. Umsätze und +Kontobuchungen, die nach dem Erstellungsdatum anfallen und sich auf den Abrechnungssaldo des abgelaufenen Abrechnungszeitraumes auswirken, werden erst +mit dem folgenden Kontoauszug ausgewiesen. Korrekturen werden seitens der Bank gekennzeichnet. +Machen Sie Ihre Einwendungen schriftlich geltend, ist der Versand Ihres Schreibens an Cortal Consors S.A. Zweigniederlassung Deutschland (Revision) innerhalb +der Sechs-Wochen-Frist ausreichend. +Cortal Consors S.A. Zweigniederlassung Deutschland • Bahnhofstraße 55 • D-90402 Nürnberg• HR Nürnberg B 20075 • USt-IdNr. DE225900761 +Fon 0180 3 / 25 25 01* • Fax 0180 3 / 25 25 32* • info@cortalconsors.de • www.cortalconsors.de +* (0,09 € / Min. aus dem Festnetz der Deutschen Telekom, evtl. abweichende Preise für Anrufe aus den Netzen anderer Anbieter oder Mobilfunknetzen) +Sitz der Cortal Consors S.A.: 1, boulevard Haussmann • F-75318 Paris Cedex 09 • Registergericht: R.C.S. Paris 327 787 909 +Président du Conseil d‘Administration (Verwaltungsratsvorsitzender) und Directeur Général (Generaldirektor) der Cortal Consors S.A.: Olivier Le Grand +Leitung der Zweigniederlassung Deutschland: Martin Daut (CEO), Olivier Le Grand, Richard Döppmann, Uwe Trittin \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java index 42f7f362c2..517b88c5ad 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ConsorsbankPDFExtractor.java @@ -75,11 +75,11 @@ private void addBuySellTransaction() Transaction pdfTransaction = new Transaction<>(); - Block firstRelevantLine = new Block("^(?i).*(Kauf" // - + "|Bezug" // - + "|Verkauf" // - + "|VERK\\. TEIL\\-\\/BEZUGSR\\." // - + "|VERKAUF KAPITALMA.*) ([\\s]+)?AM .*$"); + Block firstRelevantLine = new Block("^(?i).*(Kauf" + + "|Bezug" + + "|Verkauf" + + "|VERK\\. TEIL\\-\\/BEZUGSR\\." + + "|VERKAUF KAPITALMA.*) .*AM .*$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); @@ -95,7 +95,7 @@ private void addBuySellTransaction() .section("type").optional() // .match("^(?i).*(?Verkauf" // + "|VERK\\. TEIL\\-\\/BEZUGSR\\." // - + "|VERKAUF KAPITALMA.*)[\\s]{1,}AM .*$") + + "|VERKAUF KAPITALMA.*) .*AM .*$") .assign((t, v) -> { if ("VERKAUF".equalsIgnoreCase(v.get("type")) // || "Verkauf".equalsIgnoreCase(v.get("type")) // @@ -231,7 +231,7 @@ private void addBuySellTransaction() + "|Bezug" // + "|Verkauf" // + "|VERK\\. TEIL\\-\\/BEZUGSR\\." // - + "|VERKAUF KAPITALMA.*)[\\s]{1,}AM (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") // + + "|VERKAUF KAPITALMA.*).*AM (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") // .assign((t, v) -> { if (type.getCurrentContext().get("time") != null) t.setDate(asDate(v.get("date"), type.getCurrentContext().get("time")));