Skip to content

Commit 421a5f4

Browse files
ZfT2buchen
authored andcommitted
Updated Onvista PDF Extractor to support parsing of ex-date of dividends
Issue: #5439
1 parent 78c0049 commit 421a5f4

File tree

3 files changed

+54
-2
lines changed

3 files changed

+54
-2
lines changed

name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/ExtractorMatchers.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,17 @@ public static Matcher<Transaction> hasDate(String dateString)
396396
Transaction::getDateTime);
397397
}
398398

399+
public static Matcher<Transaction> hasExDate(String dateString)
400+
{
401+
var expected = dateString.contains("T") //$NON-NLS-1$
402+
? LocalDateTime.parse(dateString)
403+
: LocalDate.parse(dateString).atStartOfDay();
404+
405+
return new PropertyMatcher<>("exDate", //$NON-NLS-1$
406+
expected, //
407+
t -> ((AccountTransaction) t).getExDate());
408+
}
409+
399410
public static Matcher<Transaction> hasShares(double value)
400411
{
401412
// work with BigDecimal to have better assertion failed messages

name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/onvista/OnvistaPDFExtractorTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount;
99
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode;
1010
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate;
11+
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasExDate;
1112
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasFees;
1213
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasForexGrossValue;
1314
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasGrossValue;
@@ -37,6 +38,7 @@
3738
import static org.hamcrest.CoreMatchers.hasItem;
3839
import static org.hamcrest.CoreMatchers.is;
3940
import static org.hamcrest.MatcherAssert.assertThat;
41+
import static org.hamcrest.Matchers.nullValue;
4042
import static org.hamcrest.collection.IsEmptyCollection.empty;
4143
import static org.junit.Assert.assertNull;
4244

@@ -2053,6 +2055,7 @@ public void testDividende01()
20532055
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
20542056

20552057
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-04-21T00:00")));
2058+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2016-04-21T00:00")));
20562059
assertThat(transaction.getShares(), is(Values.Share.factorize(50)));
20572060
assertThat(transaction.getSource(), is("Dividende01.txt"));
20582061
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 77110599"));
@@ -2113,6 +2116,7 @@ public void testDividende02()
21132116
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
21142117

21152118
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-16T00:00")));
2119+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2016-12-14T00:00")));
21162120
assertThat(transaction.getShares(), is(Values.Share.factorize(1.0545)));
21172121
assertThat(transaction.getSource(), is("Dividende02.txt"));
21182122
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 55746925 | Ertrag für 2016/17"));
@@ -2129,6 +2133,7 @@ public void testDividende02()
21292133
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
21302134

21312135
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-16T00:00")));
2136+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2016-12-14T00:00")));
21322137
assertThat(transaction.getShares(), is(Values.Share.factorize(1.2879)));
21332138
assertThat(transaction.getSource(), is("Dividende02.txt"));
21342139
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 97603916 | Ertrag für 2016/17"));
@@ -2145,6 +2150,7 @@ public void testDividende02()
21452150
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
21462151

21472152
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-16T00:00")));
2153+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2016-12-14T00:00")));
21482154
assertThat(transaction.getShares(), is(Values.Share.factorize(9.9225)));
21492155
assertThat(transaction.getSource(), is("Dividende02.txt"));
21502156
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 33071326 | Ertrag für 2016"));
@@ -2189,6 +2195,7 @@ public void testDividende03()
21892195
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
21902196

21912197
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-07-15T00:00")));
2198+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-06-27T00:00")));
21922199
assertThat(transaction.getShares(), is(Values.Share.factorize(100)));
21932200
assertThat(transaction.getSource(), is("Dividende03.txt"));
21942201
assertNull(transaction.getNote());
@@ -2234,6 +2241,7 @@ public void testDividende03WithSecurityInEUR()
22342241
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
22352242

22362243
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-07-15T00:00")));
2244+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-06-27T00:00")));
22372245
assertThat(transaction.getShares(), is(Values.Share.factorize(100)));
22382246
assertThat(transaction.getSource(), is("Dividende03.txt"));
22392247
assertNull(transaction.getNote());
@@ -2285,6 +2293,7 @@ public void testDividende04()
22852293
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
22862294

22872295
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-03-26T00:00")));
2296+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-03-22T00:00")));
22882297
assertThat(transaction.getShares(), is(Values.Share.factorize(6)));
22892298
assertThat(transaction.getSource(), is("Dividende04.txt"));
22902299
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 29013705"));
@@ -2329,6 +2338,7 @@ public void testDividende04WithSecurityInEUR()
23292338
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
23302339

23312340
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-03-26T00:00")));
2341+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-03-22T00:00")));
23322342
assertThat(transaction.getShares(), is(Values.Share.factorize(6)));
23332343
assertThat(transaction.getSource(), is("Dividende04.txt"));
23342344
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 29013705"));
@@ -2379,6 +2389,7 @@ public void testDividende05()
23792389
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
23802390

23812391
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-02-14T00:00")));
2392+
assertNull(transaction.getExDate());
23822393
assertThat(transaction.getShares(), is(Values.Share.factorize(50)));
23832394
assertThat(transaction.getSource(), is("Dividende05.txt"));
23842395
assertNull(transaction.getNote());
@@ -2424,6 +2435,7 @@ public void testDividende06()
24242435
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
24252436

24262437
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2015-03-04T00:00")));
2438+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2015-03-02T00:00")));
24272439
assertThat(transaction.getShares(), is(Values.Share.factorize(28)));
24282440
assertThat(transaction.getSource(), is("Dividende06.txt"));
24292441
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 96937413 | Ertrag für 2014"));
@@ -2469,6 +2481,7 @@ public void testDividende07()
24692481
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
24702482

24712483
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2016-12-15T00:00")));
2484+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2016-12-15T00:00")));
24722485
assertThat(transaction.getShares(), is(Values.Share.factorize(5.8192)));
24732486
assertThat(transaction.getSource(), is("Dividende07.txt"));
24742487
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 14053767 | Ertrag für 2016/17"));
@@ -2513,6 +2526,7 @@ public void testDividende08()
25132526
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
25142527

25152528
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-05T00:00")));
2529+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-01-31T00:00")));
25162530
assertThat(transaction.getShares(), is(Values.Share.factorize(32)));
25172531
assertThat(transaction.getSource(), is("Dividende08.txt"));
25182532
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 12345 | Ertrag für 2018"));
@@ -2557,6 +2571,7 @@ public void testDividende08WithSecurityInEUR()
25572571
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
25582572

25592573
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-02-05T00:00")));
2574+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-01-31T00:00")));
25602575
assertThat(transaction.getShares(), is(Values.Share.factorize(32)));
25612576
assertThat(transaction.getSource(), is("Dividende08.txt"));
25622577
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 12345 | Ertrag für 2018"));
@@ -2607,6 +2622,7 @@ public void testDividende09()
26072622
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
26082623

26092624
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2019-09-11T00:00")));
2625+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2019-08-08T00:00")));
26102626
assertThat(transaction.getShares(), is(Values.Share.factorize(40)));
26112627
assertThat(transaction.getSource(), is("Dividende09.txt"));
26122628
assertNull(transaction.getNote());
@@ -2652,6 +2668,7 @@ public void testDividende10()
26522668
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
26532669

26542670
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-25T00:00")));
2671+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2020-09-29T00:00")));
26552672
assertThat(transaction.getShares(), is(Values.Share.factorize(46)));
26562673
assertThat(transaction.getSource(), is("Dividende10.txt"));
26572674
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 11223344"));
@@ -2697,6 +2714,7 @@ public void testDividende10WithSecurityInEUR()
26972714
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
26982715

26992716
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-25T00:00")));
2717+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2020-09-29T00:00")));
27002718
assertThat(transaction.getShares(), is(Values.Share.factorize(46)));
27012719
assertThat(transaction.getSource(), is("Dividende10.txt"));
27022720
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 11223344"));
@@ -2748,6 +2766,7 @@ public void testDividende11()
27482766
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
27492767

27502768
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-12T00:00")));
2769+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2020-11-04T00:00")));
27512770
assertThat(transaction.getShares(), is(Values.Share.factorize(500)));
27522771
assertThat(transaction.getSource(), is("Dividende11.txt"));
27532772
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 23344420 | Ertrag für 2020"));
@@ -2793,6 +2812,7 @@ public void testDividende11WithSecurityInEUR()
27932812
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
27942813

27952814
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-11-12T00:00")));
2815+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2020-11-04T00:00")));
27962816
assertThat(transaction.getShares(), is(Values.Share.factorize(500)));
27972817
assertThat(transaction.getSource(), is("Dividende11.txt"));
27982818
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 23344420 | Ertrag für 2020"));
@@ -2844,6 +2864,7 @@ public void testDividende12()
28442864
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
28452865

28462866
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2010-11-17T00:00")));
2867+
assertNull(transaction.getExDate());
28472868
assertThat(transaction.getShares(), is(Values.Share.factorize(1)));
28482869
assertThat(transaction.getSource(), is("Dividende12.txt"));
28492870
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 63302459"));
@@ -2888,6 +2909,7 @@ public void testDividende13()
28882909
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
28892910

28902911
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-09-15T00:00")));
2912+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-09-15T00:00")));
28912913
assertThat(transaction.getShares(), is(Values.Share.factorize(549)));
28922914
assertThat(transaction.getSource(), is("Dividende13.txt"));
28932915
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 34091609 | Ertrag für 2021/22"));
@@ -2933,6 +2955,7 @@ public void testDividende14()
29332955
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
29342956

29352957
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-17T00:00")));
2958+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-02T00:00")));
29362959
assertThat(transaction.getShares(), is(Values.Share.factorize(1000)));
29372960
assertThat(transaction.getSource(), is("Dividende14.txt"));
29382961
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 59788848"));
@@ -2978,6 +3001,7 @@ public void testDividende14WithSecurityInEUR()
29783001
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
29793002

29803003
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-17T00:00")));
3004+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-02T00:00")));
29813005
assertThat(transaction.getShares(), is(Values.Share.factorize(1000)));
29823006
assertThat(transaction.getSource(), is("Dividende14.txt"));
29833007
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 59788848"));
@@ -3029,6 +3053,7 @@ public void testDividende15()
30293053
assertThat(transaction.getType(), is(AccountTransaction.Type.TAXES));
30303054

30313055
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2017-10-20T00:00")));
3056+
assertThat(transaction.getExDate(), is(nullValue()));
30323057
assertThat(transaction.getShares(), is(Values.Share.factorize(0.4512)));
30333058
assertThat(transaction.getSource(), is("Dividende15.txt"));
30343059
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 12345678 | Ertrag für 2017"));
@@ -3073,6 +3098,7 @@ public void testDividende16()
30733098
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
30743099

30753100
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-30T00:00")));
3101+
assertNull(transaction.getExDate());
30763102
assertThat(transaction.getShares(), is(Values.Share.factorize(15)));
30773103
assertThat(transaction.getSource(), is("Dividende16.txt"));
30783104
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 42739637 | Kapitalrückzahlung"));
@@ -3117,6 +3143,7 @@ public void testDividende16WithSecurityInEUR()
31173143
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
31183144

31193145
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-09-30T00:00")));
3146+
assertNull(transaction.getExDate());
31203147
assertThat(transaction.getShares(), is(Values.Share.factorize(15)));
31213148
assertThat(transaction.getSource(), is("Dividende16.txt"));
31223149
assertThat(transaction.getNote(), is("Abrechnungs-Nr. 42739637 | Kapitalrückzahlung"));
@@ -3160,6 +3187,7 @@ public void testDividende17()
31603187
// check dividends transaction
31613188
assertThat(results, hasItem(dividend( //
31623189
hasDate("2019-09-09"), hasShares(60), //
3190+
hasExDate("2019-08-30"), //
31633191
hasSource("Dividende17.txt"), //
31643192
hasNote("Abrechnungs-Nr. 26128781"), //
31653193
hasAmount("EUR", 7.65), hasGrossValue("EUR", 15.73), //
@@ -3194,6 +3222,7 @@ public void testDividende17WithSecurityInEUR()
31943222
// check dividends transaction
31953223
assertThat(results, hasItem(dividend( //
31963224
hasDate("2019-09-09"), hasShares(60), //
3225+
hasExDate("2019-08-30"), //
31973226
hasSource("Dividende17.txt"), hasNote("Abrechnungs-Nr. 26128781"), //
31983227
hasAmount("EUR", 7.65), hasGrossValue("EUR", 15.73), //
31993228
hasTaxes("EUR", (39.00 / 9.9148) + 3.93 + 0.22), hasFees("EUR", 0.00), //
@@ -3234,6 +3263,7 @@ public void testDividende18()
32343263
// check dividends transaction
32353264
assertThat(results, hasItem(dividend( //
32363265
hasDate("2015-12-17T00:00"), hasShares(156.729), //
3266+
hasExDate("2015-12-15"), //
32373267
hasSource("Dividende18.txt"), //
32383268
hasNote("Abrechnungs-Nr. 70187215 | Ertrag für 2014/15"), //
32393269
hasAmount("EUR", 7.68), hasGrossValue("EUR", 11.84), //
@@ -3278,6 +3308,8 @@ public void testDividendeStorno01()
32783308

32793309
assertThat(((Transaction) cancellation.getSubject()).getDateTime(),
32803310
is(LocalDateTime.parse("2020-05-15T00:00")));
3311+
assertThat(((AccountTransaction) cancellation.getSubject()).getExDate(),
3312+
is(LocalDateTime.parse("2020-04-29T00:00")));
32813313
assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(46)));
32823314
assertThat(((Transaction) cancellation.getSubject()).getSource(), is("DividendeStorno01.txt"));
32833315
assertThat(((Transaction) cancellation.getSubject()).getNote(), is(

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,15 +566,17 @@ private void addDividendeTransaction()
566566
// STK 50,000 21.04.2016 21.04.2016 EUR 0,200000
567567
// @formatter:on
568568
section -> section //
569-
.attributes("name", "isin", "name1", "currency") //
569+
.attributes("exDate", "name", "isin", "name1", "currency") //
570570
.find("Gattungsbezeichnung ISIN") //
571571
.match("^(?<name>.*) (?<isin>[A-Z]{2}[A-Z0-9]{9}[0-9])$") //
572572
.match("^([\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} )?(?<name1>.*)$") //
573-
.match("^STK [\\.,\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?<currency>[A-Z]{3}) [\\.,\\d]+$") //
573+
.match("^STK [\\.,\\d]+ (?<exDate>[\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4}) [\\d]{2}\\.[\\d]{2}\\.[\\d]{2,4} (?<currency>[A-Z]{3}) [\\.,\\d]+$") //
574574
.assign((t, v) -> {
575575
if (!v.get("name1").startsWith("Nominal"))
576576
v.put("name", trim(v.get("name")) + " " + trim(v.get("name1")));
577577

578+
t.setExDate(asDate(v.get("exDate")));
579+
578580
t.setSecurity(getOrCreateSecurity(v));
579581
}),
580582
// @formatter:off
@@ -914,6 +916,13 @@ private void addDividendeTransaction()
914916
if (ctx.getString(FAILURE) != null)
915917
item.setFailureMessage(ctx.getString(FAILURE));
916918

919+
// ex-date is only supported for dividend
920+
// transactions. if there is a
921+
// 'Ertragsthesaurierung', then we have a tax
922+
// transaction without ex-date.
923+
if (t.getType() != AccountTransaction.Type.DIVIDENDS && t.getExDate() != null)
924+
t.setExDate(null);
925+
917926
return item;
918927
});
919928

0 commit comments

Comments
 (0)