Skip to content

Commit 56ec5cb

Browse files
buchenclaude
andcommitted
Updated SBroker 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 9d6b9e3 commit 56ec5cb

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sbroker/SBrokerPDFExtractorTest.java

Lines changed: 16 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;
@@ -1481,6 +1482,7 @@ public void testDividende04()
14811482
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
14821483

14831484
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-31T00:00")));
1485+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-22T00:00")));
14841486
assertThat(transaction.getShares(), is(Values.Share.factorize(250)));
14851487
assertThat(transaction.getSource(), is("Dividende04.txt"));
14861488
assertThat(transaction.getNote(), is("Abrechnungsnr."));
@@ -1528,6 +1530,7 @@ public void testDividende04WithSecurityInEUR()
15281530
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
15291531

15301532
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-31T00:00")));
1533+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-22T00:00")));
15311534
assertThat(transaction.getShares(), is(Values.Share.factorize(250)));
15321535
assertThat(transaction.getSource(), is("Dividende04.txt"));
15331536
assertThat(transaction.getNote(), is("Abrechnungsnr."));
@@ -1580,6 +1583,7 @@ public void testDividende05()
15801583
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
15811584

15821585
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-31T00:00")));
1586+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-22T00:00")));
15831587
assertThat(transaction.getShares(), is(Values.Share.factorize(150)));
15841588
assertThat(transaction.getSource(), is("Dividende05.txt"));
15851589
assertThat(transaction.getNote(), is("Abrechnungsnr."));
@@ -1627,6 +1631,7 @@ public void testDividende05WithSecurityInEUR()
16271631
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
16281632

16291633
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-31T00:00")));
1634+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-22T00:00")));
16301635
assertThat(transaction.getShares(), is(Values.Share.factorize(150)));
16311636
assertThat(transaction.getSource(), is("Dividende05.txt"));
16321637
assertThat(transaction.getNote(), is("Abrechnungsnr."));
@@ -1679,6 +1684,7 @@ public void testDividende06()
16791684
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
16801685

16811686
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-31T00:00")));
1687+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-11-29T00:00")));
16821688
assertThat(transaction.getShares(), is(Values.Share.factorize(250)));
16831689
assertThat(transaction.getSource(), is("Dividende06.txt"));
16841690
assertThat(transaction.getNote(), is("Abrechnungsnr."));
@@ -1726,6 +1732,7 @@ public void testDividende06WithSecurityInEUR()
17261732
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
17271733

17281734
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-31T00:00")));
1735+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-11-29T00:00")));
17291736
assertThat(transaction.getShares(), is(Values.Share.factorize(250)));
17301737
assertThat(transaction.getSource(), is("Dividende06.txt"));
17311738
assertThat(transaction.getNote(), is("Abrechnungsnr."));
@@ -1778,6 +1785,7 @@ public void testDividende07()
17781785
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
17791786

17801787
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-01-10T00:00")));
1788+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-22T00:00")));
17811789
assertThat(transaction.getShares(), is(Values.Share.factorize(100)));
17821790
assertThat(transaction.getSource(), is("Dividende07.txt"));
17831791
assertThat(transaction.getNote(), is("Abrechnungsnr. | Quartalsdividende"));
@@ -1825,6 +1833,7 @@ public void testDividende07WithSecurityInEUR()
18251833
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
18261834

18271835
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2022-01-10T00:00")));
1836+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2021-12-22T00:00")));
18281837
assertThat(transaction.getShares(), is(Values.Share.factorize(100)));
18291838
assertThat(transaction.getSource(), is("Dividende07.txt"));
18301839
assertThat(transaction.getNote(), is("Abrechnungsnr. | Quartalsdividende"));
@@ -1877,6 +1886,7 @@ public void testDividende08()
18771886
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
18781887

18791888
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-01-31T00:00")));
1889+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2023-01-20T00:00")));
18801890
assertThat(transaction.getShares(), is(Values.Share.factorize(57)));
18811891
assertThat(transaction.getSource(), is("Dividende08.txt"));
18821892
assertNull(transaction.getNote());
@@ -1923,6 +1933,7 @@ public void testDividende08WithSecurityInEUR()
19231933
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
19241934

19251935
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-01-31T00:00")));
1936+
assertThat(transaction.getExDate(), is(LocalDateTime.parse("2023-01-20T00:00")));
19261937
assertThat(transaction.getShares(), is(Values.Share.factorize(57)));
19271938
assertThat(transaction.getSource(), is("Dividende08.txt"));
19281939
assertNull(transaction.getNote());
@@ -2108,6 +2119,7 @@ public void testDividende11()
21082119
// check dividende transaction
21092120
assertThat(results, hasItem(dividend( //
21102121
hasDate("2023-05-09T00:00"), hasShares(28), //
2122+
hasExDate("2023-04-28T00:00"), //
21112123
hasSource("Dividende11.txt"), //
21122124
hasNote("Abrechnungsnr. 12345678 | Zwischendividende"), //
21132125
hasAmount("EUR", 9.10), hasGrossValue("EUR", 14.00), //
@@ -2214,6 +2226,7 @@ public void testDividende14()
22142226
// check dividende transaction
22152227
assertThat(results, hasItem(dividend( //
22162228
hasDate("2023-12-08T00:00"), hasShares(105.000), //
2229+
hasExDate("2023-11-27T00:00"), //
22172230
hasSource("Dividende14.txt"), //
22182231
hasNote("Abrechnungsnr. 84528768080 | Quartalsdividende"), //
22192232
hasAmount("EUR", 43.51), hasGrossValue("EUR", 58.89), //
@@ -2250,6 +2263,7 @@ public void testDividende14WithSecurityInEUR()
22502263
// check dividends transaction
22512264
assertThat(results, hasItem(dividend( //
22522265
hasDate("2023-12-08T00:00"), hasShares(105.000), //
2266+
hasExDate("2023-11-27T00:00"), //
22532267
hasSource("Dividende14.txt"), //
22542268
hasNote("Abrechnungsnr. 84528768080 | Quartalsdividende"), //
22552269
hasAmount("EUR", 43.51), hasGrossValue("EUR", 58.89), //
@@ -2291,6 +2305,7 @@ public void testDividende15()
22912305
// check dividende transaction
22922306
assertThat(results, hasItem(dividend( //
22932307
hasDate("2023-12-14T00:00"), hasShares(47.00), //
2308+
hasExDate("2023-11-15T00:00"), //
22942309
hasSource("Dividende15.txt"), //
22952310
hasNote("Abrechnungsnr. 84953682750 | Quartalsdividende"), //
22962311
hasAmount("EUR", 23.64), hasGrossValue("EUR", 31.99), //
@@ -2327,6 +2342,7 @@ public void testDividende15WithSecurityInEUR()
23272342
// check dividends transaction
23282343
assertThat(results, hasItem(dividend( //
23292344
hasDate("2023-12-14T00:00"), hasShares(47.00), //
2345+
hasExDate("2023-11-15T00:00"), //
23302346
hasSource("Dividende15.txt"), //
23312347
hasNote("Abrechnungsnr. 84953682750 | Quartalsdividende"), //
23322348
hasAmount("EUR", 23.64), hasGrossValue("EUR", 31.99), //

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,14 @@ private void addDividendTransaction()
584584
.match("^(?<note1>Thesaurierung) .* (?<note2>[\\w]{3}) (?<note3>[\\.,\\d]+)$") //
585585
.assign((t, v) -> t.setNote(concatenate(t.getNote(), v.get("note1") + " (" + v.get("note3") + " " + v.get("note2") + ")", " | "))))
586586

587+
// @formatter:off
588+
// Ex-Tag 22.12.2021 Art der Dividende Quartalsdividende
589+
// Ex-Tag 22.12.2021
590+
// @formatter:on
591+
.section("exDate").optional() //
592+
.match("^Ex\\-Tag (?<exDate>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") //
593+
.assign((t, v) -> t.setExDate(asDate(v.get("exDate"))))
594+
587595
.wrap((t, ctx) -> {
588596
var item = new TransactionItem(t);
589597

0 commit comments

Comments
 (0)