Skip to content

Commit 087ba03

Browse files
buchenclaude
andcommitted
Updated DKB PDF Extractor to support parsing of dividend ex-date
Issue: portfolio-performance#5439 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 2485f52 commit 087ba03

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dkb/DkbPDFExtractorTest.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount;
77
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode;
88
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate;
9+
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasExDate;
910
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasFees;
1011
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasForexGrossValue;
1112
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasGrossValue;
@@ -1539,6 +1540,7 @@ public void testDividende02()
15391540
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
15401541

15411542
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-04-07T00:00")));
1543+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2016-04-07T00:00")));
15421544
assertThat(transaction.getShares(), is(Values.Share.factorize(30)));
15431545
assertThat(transaction.getSource(), is("Dividende02.txt"));
15441546
assertThat(transaction.getNote(), is("Abrechnungsnr. 59717175720"));
@@ -1584,6 +1586,7 @@ public void testDividende03()
15841586
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
15851587

15861588
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-12-07T00:00")));
1589+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2017-11-30T00:00")));
15871590
assertThat(transaction.getShares(), is(Values.Share.factorize(216)));
15881591
assertThat(transaction.getSource(), is("Dividende03.txt"));
15891592
assertThat(transaction.getNote(), is("Abrechnungsnr. 84033925310"));
@@ -1630,6 +1633,7 @@ public void testDividende04()
16301633
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
16311634

16321635
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-05-15T00:00")));
1636+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2018-05-08T00:00")));
16331637
assertThat(transaction.getShares(), is(Values.Share.factorize(1)));
16341638
assertThat(transaction.getSource(), is("Dividende04.txt"));
16351639
assertThat(transaction.getNote(), is("Abrechnungsnr. 63136911234"));
@@ -1676,6 +1680,7 @@ public void testDividende04WithSecurityInEUR()
16761680
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
16771681

16781682
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-05-15T00:00")));
1683+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2018-05-08T00:00")));
16791684
assertThat(transaction.getShares(), is(Values.Share.factorize(1)));
16801685
assertThat(transaction.getSource(), is("Dividende04.txt"));
16811686
assertThat(transaction.getNote(), is("Abrechnungsnr. 63136911234"));
@@ -1727,6 +1732,7 @@ public void testDividende05()
17271732
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
17281733

17291734
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2018-06-01T00:00")));
1735+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2018-05-12T00:00")));
17301736
assertThat(transaction.getShares(), is(Values.Share.factorize(10)));
17311737
assertThat(transaction.getSource(), is("Dividende05.txt"));
17321738
assertThat(transaction.getNote(), is("Abrechnungsnr. 12345678901"));
@@ -1772,6 +1778,7 @@ public void testDividende06()
17721778
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
17731779

17741780
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-01-11T00:00")));
1781+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2018-12-27T00:00")));
17751782
assertThat(transaction.getShares(), is(Values.Share.factorize(16.3517)));
17761783
assertThat(transaction.getSource(), is("Dividende06.txt"));
17771784
assertThat(transaction.getNote(), is("Abrechnungsnr. 11111"));
@@ -1818,6 +1825,7 @@ public void testDividende06WithSecurityInEUR()
18181825
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
18191826

18201827
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-01-11T00:00")));
1828+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2018-12-27T00:00")));
18211829
assertThat(transaction.getShares(), is(Values.Share.factorize(16.3517)));
18221830
assertThat(transaction.getSource(), is("Dividende06.txt"));
18231831
assertThat(transaction.getNote(), is("Abrechnungsnr. 11111"));
@@ -1914,6 +1922,7 @@ public void testDividende08()
19141922
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
19151923

19161924
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-05-20T00:00")));
1925+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-05-16T00:00")));
19171926
assertThat(transaction.getShares(), is(Values.Share.factorize(92)));
19181927
assertThat(transaction.getSource(), is("Dividende08.txt"));
19191928
assertThat(transaction.getNote(), is("Abrechnungsnr. 63736123456"));
@@ -1959,6 +1968,7 @@ public void testDividende09()
19591968
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
19601969

19611970
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-02-23T00:00")));
1971+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2015-01-29T00:00")));
19621972
assertThat(transaction.getShares(), is(Values.Share.factorize(53)));
19631973
assertThat(transaction.getSource(), is("Dividende09.txt"));
19641974
assertThat(transaction.getNote(), is("Abrechnungsnr. 8127381273"));
@@ -2005,6 +2015,7 @@ public void testDividende09WithSecurityInEUR()
20052015
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
20062016

20072017
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-02-23T00:00")));
2018+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2015-01-29T00:00")));
20082019
assertThat(transaction.getShares(), is(Values.Share.factorize(53)));
20092020
assertThat(transaction.getSource(), is("Dividende09.txt"));
20102021
assertThat(transaction.getNote(), is("Abrechnungsnr. 8127381273"));
@@ -2056,6 +2067,7 @@ public void testDividende10()
20562067
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
20572068

20582069
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-10-04T00:00")));
2070+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2017-09-18T00:00")));
20592071
assertThat(transaction.getShares(), is(Values.Share.factorize(10.6841)));
20602072
assertThat(transaction.getSource(), is("Dividende10.txt"));
20612073
assertThat(transaction.getNote(), is("Abrechnungsnr. 123456789"));
@@ -2102,6 +2114,7 @@ public void testDividende10WithSecurityInEUR()
21022114
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
21032115

21042116
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-10-04T00:00")));
2117+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2017-09-18T00:00")));
21052118
assertThat(transaction.getShares(), is(Values.Share.factorize(10.6841)));
21062119
assertThat(transaction.getSource(), is("Dividende10.txt"));
21072120
assertThat(transaction.getNote(), is("Abrechnungsnr. 123456789"));
@@ -2153,6 +2166,7 @@ public void testDividende11()
21532166
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
21542167

21552168
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-02-20T00:00")));
2169+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2017-02-09T00:00")));
21562170
assertThat(transaction.getShares(), is(Values.Share.factorize(66)));
21572171
assertThat(transaction.getNote(), is("Abrechnungsnr. 123456789 | Quartalsdividende"));
21582172
assertThat(transaction.getSource(), is("Dividende11.txt"));
@@ -2199,6 +2213,7 @@ public void testDividende11WithSecurityInEUR()
21992213
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
22002214

22012215
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-02-20T00:00")));
2216+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2017-02-09T00:00")));
22022217
assertThat(transaction.getShares(), is(Values.Share.factorize(66)));
22032218
assertThat(transaction.getNote(), is("Abrechnungsnr. 123456789 | Quartalsdividende"));
22042219
assertThat(transaction.getSource(), is("Dividende11.txt"));
@@ -2250,6 +2265,7 @@ public void testDividende12()
22502265
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
22512266

22522267
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-07-01T00:00")));
2268+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-03-27T00:00")));
22532269
assertThat(transaction.getShares(), is(Values.Share.factorize(715)));
22542270
assertThat(transaction.getNote(), is("Abrechnungsnr. 111111111 | Schlussdividende"));
22552271
assertThat(transaction.getSource(), is("Dividende12.txt"));
@@ -2297,6 +2313,7 @@ public void testDividende12WithSecurityInEUR()
22972313
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
22982314

22992315
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-07-01T00:00")));
2316+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-03-27T00:00")));
23002317
assertThat(transaction.getShares(), is(Values.Share.factorize(715)));
23012318
assertThat(transaction.getNote(), is("Abrechnungsnr. 111111111 | Schlussdividende"));
23022319
assertThat(transaction.getSource(), is("Dividende12.txt"));
@@ -2349,6 +2366,7 @@ public void testDividende13()
23492366
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
23502367

23512368
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-10-13T00:00")));
2369+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2015-09-10T00:00")));
23522370
assertThat(transaction.getShares(), is(Values.Share.factorize(450)));
23532371
assertThat(transaction.getNote(), is("Abrechnungsnr. 12345678901 | Zwischendividende"));
23542372
assertThat(transaction.getSource(), is("Dividende13.txt"));
@@ -2395,6 +2413,7 @@ public void testDividende13WithSecurityInEUR()
23952413
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
23962414

23972415
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-10-13T00:00")));
2416+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2015-09-10T00:00")));
23982417
assertThat(transaction.getShares(), is(Values.Share.factorize(450)));
23992418
assertThat(transaction.getNote(), is("Abrechnungsnr. 12345678901 | Zwischendividende"));
24002419
assertThat(transaction.getSource(), is("Dividende13.txt"));
@@ -2446,6 +2465,7 @@ public void testDividende14()
24462465
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
24472466

24482467
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-03-05T00:00")));
2468+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-02-18T00:00")));
24492469
assertThat(transaction.getShares(), is(Values.Share.factorize(935)));
24502470
assertThat(transaction.getSource(), is("Dividende14.txt"));
24512471
assertThat(transaction.getNote(), is("Abrechnungsnr. 12345678901"));
@@ -2493,6 +2513,7 @@ public void testDividende14WithSecurityInEUR()
24932513
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
24942514

24952515
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-03-05T00:00")));
2516+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-02-18T00:00")));
24962517
assertThat(transaction.getShares(), is(Values.Share.factorize(935)));
24972518
assertThat(transaction.getSource(), is("Dividende14.txt"));
24982519
assertThat(transaction.getNote(), is("Abrechnungsnr. 12345678901"));
@@ -2642,6 +2663,7 @@ public void testDividende16()
26422663
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
26432664

26442665
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2014-05-14T00:00")));
2666+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2014-05-14T00:00")));
26452667
assertThat(transaction.getShares(), is(Values.Share.factorize(200)));
26462668
assertThat(transaction.getSource(), is("Dividende16.txt"));
26472669
assertThat(transaction.getNote(), is("Abrechnungsnr. 63310000000"));
@@ -2679,7 +2701,8 @@ public void testDividende17()
26792701

26802702
// check dividends transaction
26812703
assertThat(results, hasItem(dividend( //
2682-
hasDate("2023-12-19T00:00"), hasShares(497.00), //
2704+
hasDate("2023-12-19T00:00"), hasExDate("2023-12-07T00:00"), //
2705+
hasShares(497.00), //
26832706
hasSource("Dividende17.txt"), //
26842707
hasNote("Abrechnungsnr. 85345940130 | Monatliche Dividende"), //
26852708
hasAmount("EUR", 141.90), hasGrossValue("EUR", 192.24), //
@@ -2715,7 +2738,8 @@ public void testDividende17WithSecurityInEUR()
27152738

27162739
// check dividends transaction
27172740
assertThat(results, hasItem(dividend( //
2718-
hasDate("2023-12-19T00:00"), hasShares(497.00), //
2741+
hasDate("2023-12-19T00:00"), hasExDate("2023-12-07T00:00"), //
2742+
hasShares(497.00), //
27192743
hasSource("Dividende17.txt"), //
27202744
hasNote("Abrechnungsnr. 85345940130 | Monatliche Dividende"), //
27212745
hasAmount("EUR", 141.90), hasGrossValue("EUR", 192.24), //

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,14 @@ private void addDividendTransaction()
411411
.match("^Den Betrag buchen wir mit Wertstellung (?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) .*$") //
412412
.assign((t, v) -> t.setDateTime(asDate(v.get("date"))))
413413

414+
// @formatter:off
415+
// Ex-Tag 09.02.2017 Art der Dividende Quartalsdividende
416+
// Ex-Tag 07.04.2016
417+
// @formatter:on
418+
.section("exDate").optional() //
419+
.match("^Ex\\-Tag (?<exDate>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") //
420+
.assign((t, v) -> t.setExDate(asDate(v.get("exDate"))))
421+
414422
// @formatter:off
415423
// Ausmachender Betrag 144,52+ EUR
416424
// @formatter:on

0 commit comments

Comments
 (0)