Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify DKB PDF-Importer to support new transaction #4002

Merged
merged 1 commit into from
May 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4566,6 +4566,48 @@ public void testGiroKontoauszug27()
hasSource("GiroKontoauszug27.txt"), hasNote("Solidaritätszuschlag"))));
}

@Test
public void testGiroKontoauszug28()
{
DkbPDFExtractor extractor = new DkbPDFExtractor(new Client());

List<Exception> errors = new ArrayList<>();

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "GiroKontoauszug28.txt"),
errors);

assertThat(errors, empty());
assertThat(countSecurities(results), is(0L));
assertThat(countBuySell(results), is(0L));
assertThat(countAccountTransactions(results), is(6L));
assertThat(results.size(), is(6));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// assert transaction
assertThat(results, hasItem(fee(hasDate("2024-01-15"), hasAmount("EUR", 11.88), //
hasSource("GiroKontoauszug28.txt"), hasNote("sonstige Entgelte Girokarte"))));

// assert transaction
assertThat(results, hasItem(removal(hasDate("2024-01-16"), hasAmount("EUR", 65.28), //
hasSource("GiroKontoauszug28.txt"), hasNote("Kartenzahlung"))));

// assert transaction
assertThat(results, hasItem(removal(hasDate("2024-01-17"), hasAmount("EUR", 52.33), //
hasSource("GiroKontoauszug28.txt"), hasNote("Kartenzahlung"))));

// assert transaction
assertThat(results, hasItem(removal(hasDate("2024-01-24"), hasAmount("EUR", 50.00), //
hasSource("GiroKontoauszug28.txt"), hasNote("Kartenzahlung"))));

// assert transaction
assertThat(results, hasItem(removal(hasDate("2024-01-26"), hasAmount("EUR", 4.75), //
hasSource("GiroKontoauszug28.txt"), hasNote("Kartenzahlung (Fremdwährung)"))));

// assert transaction
assertThat(results, hasItem(deposit(hasDate("2024-02-01"), hasAmount("EUR", 2600.00), //
hasSource("GiroKontoauszug28.txt"), hasNote("Zahlungseingang"))));
}

@Test
public void testKreditKontoauszug01()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.68.4
-----------------------------------------
Deutsche Kreditbank AG
Herrn
Internes Zeichen:
yaqxsw cdevfr
180 44 00
ghargafa 44

65894 haghagha






5. Februar 2024

Kontoauszug 2/2024 Seite 1 von 2
Girokonto 2626262662, DE11 1111 1111 1111 1111 11, DKB-Cash

Datum Erläuterung Betrag Soll EUR Betrag Haben EUR
4.053,05
Kontostand am 04.01.2024, Auszug Nr. 1
-2.501,50
08.01.2024 Wertpapierabrechnung / Wert: 09.01.2024
Depot 2525325252 Wertp.Abrechn. 05.01.2024
000006617842600 WKN A2PKXG Gesch.Art KV VANG.FTSE
A.W. DLA ISIN IE00BK5BQT80 Ihr Fondssparplan Preis
106,08000000 EUR Stück 23,5671
-11,88
15.01.2024 sonstige Entgelte / Wert: 13.01.2024
Rechnung DEUTSCHE KREDITBANK AG Entgelt Girokarte
für 2024/KartNr.******1234 yaqxsw cdevfr
20240115-BY111-00262626264
-150,69
16.01.2024 Wertpapierabrechnung / Wert: 04.01.2024
Depot 2525325252 Wertpapierertrag 15.01.2024
000053456860780 WKN A2PKXG VANG.FTSE A.W. DLA ISIN
IE00BK5BQT80
-65,28
16.01.2024 Kartenzahlung
xxx
2024-01-15T17:16 Debitk.0 2024-12
-52,33
17.01.2024 Kartenzahlung
xxx
ME0 IC-1612552553769 61725532525252551730
Gläubiger-ID: yyyy
-50,00
24.01.2024 Kartenzahlung
xxx
Debitk.0 2024-12
-4,75
26.01.2024 Kartenzahlung FW
xxx
2024-01-25T23:26 Debitk.79 2099-12 Original 5,15 USD 1
Euro=1,08421050 USD Zahl.System VISA Debit
2.600,00
01.02.2024 Zahlungseingang
yaqxsw cdevfr Einzahlung DKB
3.816,62
Kontostand am 02.02.2024 um 18:05 Uhr
Ihr Dispositionskredit EUR: 500,00
Gesamtumsatzsummen Summe Soll EUR Anzahl Summe Haben EUR Anzahl
-2.836,43 7 2.600,00 1
.
Deutsche Kreditbank AG Vorsitzender des Aufsichtsrats Telefon 030 120 300 00 BIC: BYLADEM1001
Taubenstraße 7 - 9 Stephan Winkelmeier Telefax 030 120 300 01
10117 Berlin Vorstand USt-ID-Nr.: DE137178746
Stefan Unterlandstättner (Vorsitzender) info@dkb.de Handelsregister
Ein Unternehmen der Tilo Hacke, Jan Walther, www.dkb.de Berlin-Charlottenburg
Bayerischen Landesbank Arnulf Keese, Kristina Mikenberg (HRB 34165 B)
Kontoauszug 2/2024 Seite 2 von 2
Girokonto 2626262662, DE11 1111 1111 1111 1111 11, DKB-Cash, yaqxsw cdevfr
Hinweise zum Kontoauszug:
Sehr geehrte Kundin, sehr geehrter Kunde,
Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetzes entschädigungsfähig. Nähere Informationen können
dem Informationsbogen für Einleger entnommen werden, den Sie auch unter www.dkb.de/kundenservice/einlagensicherung
einsehen können. Bitte beachten Sie nachstehenden Auszug aus unseren Allgemeinen Geschäftsbedingungen, sowie die mit Ihnen
getroffene Regelung über die Erteilung von Rechnungsabschlüssen:
l Der angegebene Kontostand berücksichtigt nicht die Wertstellung der einzelnen Buchungen. Dies bedeutet, dass der genannte
Betrag nicht dem für die Zinsrechnung maßgeblichen Kontostand entsprechen muss und bei Verfügungen möglicherweise
Zinsen für die Inanspruchnahme einer eingeräumten oder geduldeten Kontoüberziehung anfallen können.
l Schreibt die Bank den Gegenwert von Schecks, Lastschriften oder anderen Einzugspapieren schon vor ihrer Einlösung gut, so
geschieht dies unter dem Vorbehalt der Einlösung und des Einganges des Gegenwertes (E.v.Gutschrift). Das gilt auch dann, wenn
die Schecks, Lastschriften oder anderen Einzugspapiere bei der Bank selbst zahlbar sind. Werden Schecks oder Lastschriften
nicht eingelöst oder geht der Bank der Gegenwert aus einem anderen Einzugspapier nicht zu, so macht sie die Gutschrift gemäß
Nr. 23 dieser AGB rückgängig (Stornobuchung), und zwar auch nach einem zwischenzeitlich erfolgten Rechnungsabschluss.
l Schecks und andere Einzugspapiere sind erst eingelöst, wenn die Belastungsbuchung nicht bis zum Ablauf des übernächsten
Bankarbeitstages rückgängig gemacht wird. Sie sind auch eingelöst, wenn die Bank ihren Einlösungswillen schon vorher Dritten
gegenüber erkennbar bekundet hat (z. B. durch Bezahltmeldung). Für Lastschriften gelten die Einlöseregeln in den hierfür
vereinbarten besonderen Bedingungen. Über die Abrechnungsstelle der Bundesbank eingezogene Schecks sind eingelöst, wenn

sie nach deren Allgemeinen Geschäftsbedingungen nicht mehr zurückgegeben werden können. Barschecks sind mit Zahlung an
den Scheckvorleger eingelöst.
l Aufgrund gesetzlicher Bestimmungen (§ 355 HGB) sind wir verpflichtet, Ihnen in regelmäßigen Abständen einen
Rechnungsabschluss zu erteilen. Wir haben festgelegt, dass dies bei Kontoabrechnungsbuchungen (Zinsen und/oder sonstige
Entgelte), zumindest aber einmal jährlich geschieht. Beachten Sie bitte, dass dieser Kontoauszug einen Rechnungsabschluss
darstellt, wenn er als solcher bezeichnet ist. Im Abschlusssaldo sind Zinsen und/oder sonstige Entgelte bis zum letzten
Zinsabschlusstermin berücksichtigt.
l Bitte prüfen Sie den Abschlusssaldo des Rechnungsabschlusses. Rechnungsabschlüsse gelten als genehmigt, sofern Sie
innerhalb von 6 Wochen nach Zugang keine Einwendungen erheben. Einwendungen gegen Rechnungsabschlüsse müssen der
Deutsche Kreditbank AG, Bereich Revision, Taubenstraße 7-9, 10117 Berlin schriftlich oder, wenn im Rahmen der
Geschäftsbeziehung der elektronische Kommunikationsweg vereinbart wurde (z. B. Onlinebanking), auf diesem Wege zugehen.
Zur Fristwahrung genügt die rechtzeitige Absendung (Nr. 7 Abs. 3 unserer Allgemeinen Geschäftsbedingungen).
Dieser Kontoauszug gilt im Zusammenhang mit dem zugrunde liegenden Vertrag laut angegebener Kontonummer als Rechnung im
Sinne des UStG.
Mit freundlichen Grüßen
Ihre Deutsche Kreditbank AG
Deutsche Kreditbank AG Vorsitzender des Aufsichtsrats Telefon 030 120 300 00 BIC: BYLADEM1001
Taubenstraße 7 - 9 Stephan Winkelmeier Telefax 030 120 300 01
10117 Berlin Vorstand USt-ID-Nr.: DE137178746
Stefan Unterlandstättner (Vorsitzender) info@dkb.de Handelsregister
Ein Unternehmen der Tilo Hacke, Jan Walther, www.dkb.de Berlin-Charlottenburg
Bayerischen Landesbank Arnulf Keese, Kristina Mikenberg (HRB 34165 B)
Original file line number Diff line number Diff line change
Expand Up @@ -877,22 +877,22 @@ private void addAccountStatementTransaction_Format01()
t.setCurrencyCode(v.get("currency"));

// Formatting some notes
if ("Kreditkartenabr.".equals(v.get("note")))
if ("Kreditkartenabr.".equalsIgnoreCase(v.get("note")))
v.put("note", "Kreditkartenabrechnung");

if ("Verfügung Geldautomat".equals(v.get("note")))
if ("Verfügung Geldautomat".equalsIgnoreCase(v.get("note")))
v.put("note", "Geldautomat");

if ("Verfüg. Geldautom. FW".equals(v.get("note")))
if ("Verfüg. Geldautom. FW".equalsIgnoreCase(v.get("note")))
v.put("note", "Geldautomat (Fremdwährung)");

if ("Kartenzahlung onl".equals(v.get("note")))
if ("Kartenzahlung onl".equalsIgnoreCase(v.get("note")))
v.put("note", "Kartenzahlung online");

if ("Überweis. entgeltfr.".equals(v.get("note")))
if ("Überweis. entgeltfr.".equalsIgnoreCase(v.get("note")))
v.put("note", "Überweisung entgeltfrei");

if ("Kartenzahlung FW".equals(v.get("note")))
if ("Kartenzahlung FW".equalsIgnoreCase(v.get("note")))
v.put("note", "Kartenzahlung (Fremdwährung)");

t.setNote(v.get("note"));
Expand Down Expand Up @@ -946,18 +946,18 @@ private void addAccountStatementTransaction_Format01()
t.setCurrencyCode(v.get("currency"));

// Formatting some notes
if ("Eingang Echtzeitüberw".equals(v.get("note")))
if ("Eingang Echtzeitüberw".equalsIgnoreCase(v.get("note")))
v.put("note", "Eingang Echtzeitüberweisung");

if ("Bareinzahlung am GA".equals(v.get("note")))
if ("Bareinzahlung am GA".equalsIgnoreCase(v.get("note")))
v.put("note", "Bareinzahlung am Geldautomat");

t.setNote(v.get("note"));
})

.wrap(TransactionItem::new));

Block taxReturnBlock = new Block( "^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. [\\d]+ Steuerausgleich [\\.,\\d]+$");
Block taxReturnBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. [\\d]+ (?i)Steuerausgleich [\\.,\\d]+$");
type.addBlock(taxReturnBlock);
taxReturnBlock.set(new Transaction<AccountTransaction>()

Expand Down Expand Up @@ -1013,7 +1013,7 @@ private void addAccountStatementTransaction_Format01()
+ "|Buchung" //
+ "|sonstige Entgelte)) " //
+ "(?<amount>[\\.,\\d]+)$")
.match("^.*" + "(?i)(?<note2>(Bargeldeinzahlung" //
.match("^.*(?i)(?<note2>(Bargeldeinzahlung" //
+ "|R.ckruf\\/Nachforschung" //
+ "|Identifikationscode" //
+ "|Stornorechnung" //
Expand Down Expand Up @@ -1043,10 +1043,10 @@ private void addAccountStatementTransaction_Format01()
t.setNote(v.get("note1") + " " + v.get("note2"));

// Formatting some notes
if ("BUCHUNG IDENTIFIKATIONSCODE".equals(t.getNote()))
if ("BUCHUNG IDENTIFIKATIONSCODE".equalsIgnoreCase(t.getNote()))
t.setNote("Buchung Identifikationscode");

if ("Rechnung Entgelt für Konto ohne".equals(t.getNote()))
if ("Rechnung Entgelt für Konto ohne".equalsIgnoreCase(t.getNote()))
t.setNote("Entgelt für Konto ohne mtl. Eingang");
})

Expand Down Expand Up @@ -1088,9 +1088,9 @@ private void addAccountStatementTransaction_Format02()
.section("type", "amount", "date", "note").optional() //
.documentContext("currency") //
.match("^[\\s]+ (?<type>[\\-\\s])(?<amount>[\\.,\\d]+)$") //
.match("^(?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) (?<note>"
.match("^(?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) " //
+ "(?!(Wertpapierabrechnung|Abrechnung [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}))" //
+ "(Lohn, Gehalt, Rente" //
+ "(?<note>(Lohn, Gehalt, Rente" //
+ "|Zahlungseingang" //
+ "|Storno Gutschrift" //
+ "|Bareinzahlung am GA" //
Expand Down Expand Up @@ -1154,6 +1154,57 @@ private void addAccountStatementTransaction_Format02()
return null;
}));

Block feesBlock = new Block("^[\\s]+ (\\-)?[\\.,\\d]+$");
type.addBlock(feesBlock);
feesBlock.setMaxSize(3);
feesBlock.set(new Transaction<AccountTransaction>()

.subject(() -> {
AccountTransaction accountTransaction = new AccountTransaction();
accountTransaction.setType(AccountTransaction.Type.FEES_REFUND);
return accountTransaction;
})

.section("type", "amount", "date", "note1", "note2").optional() //
.documentContext("currency") //
.match("^[\\s]+ (?<type>[\\-\\s])(?<amount>[\\.,\\d]+)$") //
.match("^(?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) " //
+ "(?!(Wertpapierabrechnung|Abrechnung [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}))" //
+ "(?<note1>(Rechnung" //
+ "|Buchung" //
+ "|sonstige Entgelte)).*$") //
.match("^.* (?<note2>(Bargeldeinzahlung" //
+ "|R.ckruf\\/Nachforschung" //
+ "|Identifikationscode" //
+ "|Stornorechnung" //
+ "|Girokarte" //
+ "|Entgelt f.r Konto ohne)).*$") //
.assign((t, v) -> {
// @formatter:off
// Is type is "-" change from FEES_REFUND to FEES
// @formatter:on
if ("-".equals(trim(v.get("type"))))
t.setType(AccountTransaction.Type.FEES);

t.setDateTime(asDate(v.get("date")));
t.setAmount(asAmount(v.get("amount")));
t.setCurrencyCode(v.get("currency"));
t.setNote(v.get("note1") + " " + v.get("note2"));

// Formatting some notes
if ("Rechnung Entgelt für Konto ohne".equals(t.getNote()))
t.setNote("Entgelt für Konto ohne mtl. Eingang");
})

.wrap((t) -> {
TransactionItem item = new TransactionItem(t);

if (t.getDateTime() != null)
return item;

return null;
}));

// @formatter:off
// Abrechnungszeitraum vom 01.07.2023 bis 30.09.2023
// Zinsen für eingeräumte Kontoüberziehung 0,01-
Expand Down