Skip to content

Commit 333c0db

Browse files
authored
Modify Deutsche Bank PDF-Importer to support new transaction (#5218)
Closes #5199
1 parent 4d89cfe commit 333c0db

File tree

3 files changed

+87
-5
lines changed

3 files changed

+87
-5
lines changed

name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/deutschebank/DeutscheBankPDFExtractorTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.removal;
2121
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale;
2222
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security;
23+
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxRefund;
2324
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions;
2425
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransfers;
2526
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell;
@@ -2915,4 +2916,27 @@ public void testGiroKontoauszug10()
29152916
assertThat(results, hasItem(deposit(hasDate("2025-10-15"), hasAmount("EUR", 600.00), //
29162917
hasSource("GiroKontoauszug10.txt"), hasNote("Überweisung von Dr. ICcCbCKba zlKgUWI NwzaZJPVb"))));
29172918
}
2919+
2920+
@Test
2921+
public void testGiroKontoauszug11()
2922+
{
2923+
var extractor = new DeutscheBankPDFExtractor(new Client());
2924+
2925+
List<Exception> errors = new ArrayList<>();
2926+
2927+
var results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "GiroKontoauszug11.txt"), errors);
2928+
2929+
assertThat(errors, empty());
2930+
assertThat(countSecurities(results), is(0L));
2931+
assertThat(countBuySell(results), is(0L));
2932+
assertThat(countAccountTransactions(results), is(1L));
2933+
assertThat(countAccountTransfers(results), is(0L));
2934+
assertThat(countItemsWithFailureMessage(results), is(0L));
2935+
assertThat(results.size(), is(1));
2936+
new AssertImportActions().check(results, "EUR");
2937+
2938+
// assert transaction
2939+
assertThat(results, hasItem(taxRefund(hasDate("2025-08-25"), hasAmount("EUR", 34.30), //
2940+
hasSource("GiroKontoauszug11.txt"), hasNote("Steuererstattung"))));
2941+
}
29182942
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
PDFBox Version: 3.0.6
2+
Portfolio Performance Version: 0.80.5.qualifier
3+
System: linux | x86_64 | 21.0.8+9-LTS | Eclipse Adoptium
4+
-----------------------------------------
5+
Deutsche Bank AG
6+
Filiale
7+
Bankhausen
8+
Bank-Platz 1
9+
Herrn 11111 Bankhausen
10+
Max Mustermann Frau Birgit Bankfrau
11+
Musterstr 1 A Telefon (111) 1111-1111
12+
11111 Bankhausen
13+
24h-Kundenservice (069) 910-10000
14+
29. August 2025
15+
Kontoauszug
16+
Kontoinhaber: Max Mustermann
17+
Auszug Seite von IBAN Alter Saldo
18+
1 1 1 DE12 3456 7890 1234 5678 01 EUR + 0,00
19+
Buchung Valuta Vorgang Soll Haben
20+
25.08. 25.08. Verwendungszweck/ Kundenreferenz + 34,30
21+
2025 2025 Buchung Steuererstattung 2025 zu:
22+
WP1224776431 01569286887 KESt: 32,51 EUR
23+
SolZ: 1,79 EUR WKN: A0GLU5 TURKEY 06/36
24+
Filialnummer Kontonummer Neuer Saldo
25+
100 1234567 01 EUR + 34,30
26+
BIC (SWIFT)
27+
DEUTDEDBHAM
28+
Wichtige Hinweise
29+
Bitte erheben Sie Einwendungen gegen einzelne Buchungen unverzüglich. Schecks, Wechsel und sonstige Lastschriften schreiben wir unter dem Vorbehalt
30+
des Eingangs gut. Der angegebene Kontostand berücksichtigt nicht die Wertstellung der Buchungen (siehe oben unter "Valuta").
31+
Somit können bei Verfügungen1)
32+
möglicherweise Zinsen für die Inanspruchnahme einer eingeräumten oder geduldeten Kontoüberziehung anfallen.
33+
Die abgerechneten Leistungen sind als Bank- oder Finanzdienstleistungen von der Umsatzsteuer befreit, sofern Umsatzsteuer nicht gesondert
34+
ausgewiesen ist. Umsatzsteuer ID Nr.: Deutsche Bank AG, 60262 Frankfurt DE114103379
35+
Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetzes entschädigungsfähig. Nähere Informationen können dem "Informationsbogen
36+
für den Einleger" entnommen werden.
37+
1) Der Begriff umfasst unter anderem die relevanten Zahlungskontendienste "Bargeldauszahlung" und "Überweisung".
38+
0000000003 / 06600800 / 20250830

name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/DeutscheBankPDFExtractor.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -432,13 +432,13 @@ private void addDividendeTransaction()
432432

433433
private void addAccountStatementTransaction()
434434
{
435-
final var type = new DocumentType("Kontoauszug vom", //
435+
final var type = new DocumentType("Kontoauszug", //
436436
builder -> builder //
437437
.section("currency") //
438438
.match("^.*[\\d]{4} [\\d]{4} [\\d]{4} [\\d]{4} [\\d]{2} .*(?<currency>[A-Z]{3}) [\\-|\\+] [\\.,\\d]+.*$")
439439
.assign((ctx, v) -> ctx.put("currency", asCurrencyCode(v.get("currency"))))
440440

441-
.section("year") //
441+
.section("year").optional() //
442442
.match("^Kontoauszug vom [\\d]{2}\\.[\\d]{2}\\.(?<year>[\\d]{4}) bis [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}.*$")
443443
.assign(Map::putAll));
444444

@@ -471,8 +471,8 @@ private void addAccountStatementTransaction()
471471
// 2025 2025 Dr. kQEbfBPDq ZgltrGG wBPgFcQwn
472472
// @formatter:on
473473
section -> section //
474-
.attributes("date", "note", "type", "amount", "note1") //
475-
.documentContext("currency", "year") //
474+
.attributes("date", "note", "type", "amount", "year", "note1") //
475+
.documentContext("currency") //
476476
.match("^[\\d]{2}\\.[\\d]{2}\\. (?<date>[\\d]{2}\\.[\\d]{2}\\.) " //
477477
+ "(SEPA )?" //
478478
+ "(?<note>(Dauerauftrag" //
@@ -484,7 +484,7 @@ private void addAccountStatementTransaction()
484484
+ "|Verwendungszweck\\/ Kundenreferenz" //
485485
+ "|.bertrag \\(.berweisung\\) von) " //
486486
+ "(?<type>(\\-|\\+)) (?<amount>[\\.,\\d]+)$")
487-
.match("^[\\d]{4} [\\d]{4} (?<note1>.*)$") //
487+
.match("^[\\d]{4} (?<year>[\\d]{4}) (Buchung )?(?<note1>.*)$") //
488488
.assign((t, v) -> {
489489
// @formatter:off
490490
// Is type --> "-" change from DEPOSIT to REMOVAL
@@ -502,6 +502,16 @@ private void addAccountStatementTransaction()
502502
if (v.get("note").startsWith("Verwendungszweck"))
503503
v.put("note", "");
504504

505+
if (v.get("note1").contains("Steuererstattung"))
506+
{
507+
// @formatter:off
508+
// Change from DEPOSIT to TAX_REFUND
509+
// @formatter:on
510+
t.setType(AccountTransaction.Type.TAX_REFUND);
511+
512+
v.put("note", "Steuererstattung");
513+
}
514+
505515
t.setDateTime(asDate(v.get("date") + v.get("year")));
506516
t.setCurrencyCode(v.get("currency"));
507517
t.setAmount(asAmount(v.get("amount")));
@@ -571,6 +581,16 @@ private void addAccountStatementTransaction()
571581
if (v.get("note").startsWith("Verwendungszweck"))
572582
v.put("note", "");
573583

584+
if (v.get("note1").contains("Steuererstattung"))
585+
{
586+
// @formatter:off
587+
// Change from DEPOSIT to TAX_REFUND
588+
// @formatter:on
589+
t.setType(AccountTransaction.Type.TAX_REFUND);
590+
591+
v.put("note", "Steuererstattung");
592+
}
593+
574594
t.setDateTime(asDate(v.get("date") + v.get("year")));
575595
t.setCurrencyCode(v.get("currency"));
576596
t.setAmount(asAmount(v.get("amount")));

0 commit comments

Comments
 (0)