From f4dd14cdf307f464a790831028c4ec0a7fe21944 Mon Sep 17 00:00:00 2001 From: christen90 Date: Sun, 2 Feb 2025 13:04:27 +0100 Subject: [PATCH] =?UTF-8?q?adding=20inbound=20and=20outbound=20Echtzeit?= =?UTF-8?q?=C3=BCberweisungen.=20(#4505)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pdf/traderepublic/Kontoauszug25.txt | 43 +++++++++++++ .../TradeRepublicPDFExtractorTest.java | 29 +++++++++ .../pdf/TradeRepublicPDFExtractor.java | 64 +++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kontoauszug25.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kontoauszug25.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kontoauszug25.txt new file mode 100644 index 0000000000..7066cd9cac --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kontoauszug25.txt @@ -0,0 +1,43 @@ +``` +PDFBox Version: 3.0.3 != 1.8.17 +Portfolio Performance Version: 0.74.0 +System: win32 | x86_64 | 21.0.5+11-LTS | Azul Systems, Inc. +----------------------------------------- +VORNAME NACHNAME DATUM 01 Jan. 2025 - 31 Jan. 2025 +Straße 1, 12345 IBAN DE00000000000000000000 +Ort, DE BIC TRBKDEBBXXX +KONTOÜBERSICHT +PRODUKT ANFANGSSALDO ZAHLUNGSEINGANG ZAHLUNGSAUSGANG ENDSALDO +Cashkonto 81,76 € 500,00 € 393,51 € 188,25 € +UMSATZÜBERSICHT +DATUM TYP BESCHREIBUNG ZAHLUNGSEINGANG ZAHLUNGSAUSGANG SALDO +23 +SEPA +Jan. Incoming transfer from Vorname Nachname 500,00 € 581,76 € +Echtzeitüberweisung +2025 +24 +Jan. Kartentransaktion Lidl sagt Danke 34,14 € 547,62 € +2025 +24 +SEPA +Jan. Outgoing transfer for Möbel Heidenreich GmbH 359,37 € 188,25 € +Echtzeitüberweisung +2025 +Seite 3 von 4 +Erstellt am 01 Feb. 2025 +Trade Republic Bank GmbH +HAFTUNGSAUSSCHLUSS +Sehr geehrte Kundin, sehr geehrter Kunde +Bitte überprüfe unbedingt deine Buchungen, Berechnungen und den Schlusssaldo auf dem Kontoauszug, der gleichzeitig deinen Rechnungsabschluss +darstellt. Der Rechnungsabschluss gilt als anerkannt, wenn du innerhalb von sechs Wochen nach Zugang keine Einwendungen erhebst. Einwendungen +gegen Kontoauszüge sind schriftlich an uns zu richten. Guthaben sind einlagefähig im Sinne des Einlagensicherungsgesetzes (EinSiG). Weitere +Informationen entnehme bitte dem Merkblatt für den Einleger, das zusammen mit unseren Allgemeinen Geschäftsbedingungen eingesehen werden kann. +Trade Republic Bank GmbH Kontakt Sitz der Gesellschaft: Berlin +Brunnenstraße 19-21 www.traderepublic.com AG Charlottenburg HRB 244347 B +10119 Berlin service@traderepublic.com Umsatzsteuer-ID DE307510626 +Seite 4 von 4 +Erstellt am 01 Feb. 2025 +Trade Republic Bank GmbH + +``` \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java index c65f02495d..72dc108ed8 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java @@ -2472,6 +2472,35 @@ public void testKontoauszug24() hasSource("Kontoauszug24.txt"), hasNote("Lidl sagt Danke")))); } + @Test + public void testKontoauszug25() + { + TradeRepublicPDFExtractor extractor = new TradeRepublicPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug25.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(deposit(hasDate("2025-01-23"), hasAmount("EUR", 500.00), + hasSource("Kontoauszug25.txt"), hasNote("Vorname Nachname")))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2025-01-24"), hasAmount("EUR", 34.14), + hasSource("Kontoauszug25.txt"), hasNote("Lidl sagt Danke")))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2025-01-24"), hasAmount("EUR", 359.37), + hasSource("Kontoauszug25.txt"), hasNote("Möbel Heidenreich GmbH")))); + } + @Test public void testReleveDeCompte01() { diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/TradeRepublicPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/TradeRepublicPDFExtractor.java index abf5230d6f..57b8a5affb 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/TradeRepublicPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/TradeRepublicPDFExtractor.java @@ -2281,6 +2281,70 @@ private void addAccountStatementTransaction_Format02() return null; })); + Block depositRemovalBlock_Format04 = new Block("^[\\d]{2}[\\s]$"); + type.addBlock(depositRemovalBlock_Format04); + depositRemovalBlock_Format04.setMaxSize(5); + depositRemovalBlock_Format04.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.DEPOSIT); + return accountTransaction; + }) + + .optionalOneOf( // + // @formatter:off + // 24 + // SEPA + // Jan. Outgoing transfer for Möbel Heidenreich GmbH 359,37 € 188,25 € + // Echtzeitüberweisung + // 2025 + // @formatter:on + section -> section // + .attributes("day", "month", "year", "note", "amount", "currency") // + .match("^(?[\\d]{2})[\\s]$") // + .match("^SEPA[\\s]$") // + .match("^(?[\\p{L}]{3,4}([\\.]{1})?) Outgoing transfer for " // + + "(?.*) " // + + "(?[\\.,\\d]+) (?\\p{Sc}) ([\\.,\\d]+) (\\p{Sc})$") // + .match("^Echtzeit.berweisung$") // + .match("^(?[\\d]{4})$") // + .assign((t, v) -> { + t.setType(AccountTransaction.Type.REMOVAL); + t.setDateTime(asDate(v.get("day") + " " + v.get("month") + " " + v.get("year"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setNote(trim(v.get("note"))); + }), + // @formatter:off + // 23 + // SEPA + // Jan. Incoming transfer from Vorname Nachname 500,00 € 581,76 € + // Echtzeitüberweisung + // 2025 + // @formatter:on + section -> section // + .attributes("day", "month", "year", "note", "amount", "currency") // + .match("^(?[\\d]{2})[\\s]$") // + .match("^SEPA[\\s]$") // + .match("^(?[\\p{L}]{3,4}([\\.]{1})?) " // + + "(Incoming transfer from)" // + + "(?.*) " // + + "(?[\\.,\\d]+) (?\\p{Sc}) [\\.,\\d]+ \\p{Sc}$") // + .match("^(?[\\d]{4})$") // + .assign((t, v) -> { + t.setDateTime(asDate(v.get("day") + " " + v.get("month") + " " + v.get("year"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setNote(trim(v.get("note"))); + })) + + .wrap(t -> { + if (t.getCurrencyCode() != null && t.getAmount() != 0) + return new TransactionItem(t); + return null; + })); + // @formatter:off // 03 Apr. // 2024 Gebühren Trade Republic Card 5,00 € 49.997,41 €