Skip to content

Commit 78c13f4

Browse files
authored
Updated GenoBroker PDF importer (#4795)
1 parent 8f1ae57 commit 78c13f4

3 files changed

Lines changed: 133 additions & 1 deletion

File tree

name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/genobroker/GenoBrokerPDFExtractorTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,73 @@ public void testWertpapierKauf03WithSecurityInEUR()
184184
}))));
185185
}
186186

187+
@Test
188+
public void testWertpapierKauf04()
189+
{
190+
GenoBrokerPDFExtractor extractor = new GenoBrokerPDFExtractor(new Client());
191+
192+
List<Exception> errors = new ArrayList<>();
193+
194+
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf04.txt"), errors);
195+
196+
assertThat(errors, empty());
197+
assertThat(countSecurities(results), is(1L));
198+
assertThat(countBuySell(results), is(1L));
199+
assertThat(countAccountTransactions(results), is(0L));
200+
assertThat(results.size(), is(2));
201+
new AssertImportActions().check(results, CurrencyUnit.EUR);
202+
203+
// check security
204+
assertThat(results, hasItem(security( //
205+
hasIsin("US75062E1064"), hasWkn("A2JDMF"), hasTicker(null), //
206+
hasName("RAFAEL HOLDINGS INC. REGISTERED SH. CLASS B DL -,01"), //
207+
hasCurrencyCode("USD"))));
208+
209+
// check buy sell transaction
210+
assertThat(results, hasItem(purchase( //
211+
hasDate("2025-06-10T15:33"), hasShares(2000), //
212+
hasSource("Kauf04.txt"), //
213+
hasNote("Auftragsnummer: 625571/30.00 | Limit billigst"), //
214+
hasAmount("EUR", 4222.17), hasGrossValue("EUR", 4156.80), //
215+
hasForexGrossValue("USD", 4740.00), //
216+
hasTaxes("EUR", 0.00), hasFees("EUR", 9.95 + 21.65 + 8.77 + 25.00))));
217+
}
218+
219+
@Test
220+
public void testWertpapierKauf04WithSecurityInEUR()
221+
{
222+
Security security = new Security("Rafael Holdings Inc", CurrencyUnit.EUR);
223+
security.setIsin("US75062E1064");
224+
225+
Client client = new Client();
226+
client.addSecurity(security);
227+
228+
GenoBrokerPDFExtractor extractor = new GenoBrokerPDFExtractor(client);
229+
230+
List<Exception> errors = new ArrayList<>();
231+
232+
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf04.txt"), errors);
233+
234+
assertThat(errors, empty());
235+
assertThat(countSecurities(results), is(0L));
236+
assertThat(countBuySell(results), is(1L));
237+
assertThat(countAccountTransactions(results), is(0L));
238+
assertThat(results.size(), is(1));
239+
new AssertImportActions().check(results, CurrencyUnit.EUR);
240+
241+
// check buy sell transaction
242+
assertThat(results, hasItem(purchase( //
243+
hasDate("2025-06-10T15:33"), hasShares(2000), //
244+
hasSource("Kauf04.txt"), //
245+
hasNote("Auftragsnummer: 625571/30.00 | Limit billigst"), //
246+
hasAmount("EUR", 4222.17), hasGrossValue("EUR", 4156.80), //
247+
hasTaxes("EUR", 0.00), hasFees("EUR", 9.95 + 21.65 + 8.77 + 25.00), check(tx -> {
248+
CheckCurrenciesAction c = new CheckCurrenciesAction();
249+
Status s = c.process((PortfolioTransaction) tx, new Portfolio());
250+
assertThat(s, is(Status.OK_STATUS));
251+
}))));
252+
}
253+
187254
@Test
188255
public void testWertpapierVerkauf01()
189256
{
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
PDFBox Version: 3.0.5
2+
Portfolio Performance Version: 0.77.2.qualifier
3+
System: macosx | aarch64 | 21.0.4+7-LTS | Azul Systems, Inc.
4+
-----------------------------------------
5+
6+
GENO Broker GmbH Kundenservice · Postfach 30 30 · 48016 Münster
7+
Depotnummer 6020732715
8+
9+
Kundennummer 5213915045
10+
YPZCdsc fzDJmi
11+
Auftragsnummer 625571/30.00
12+
HofAoAZ piNopO Datum 11.06.2025
13+
owOjjZPuWTm. 2 Rechnungsnummer C93970-0008804334/25
14+
29956 ajYVlBzWbuyueT Umsatzsteuer-ID Tt076810289
15+
16+
Wertpapier Abrechnung Kauf
17+
Auftrag vom 10.06.2025 10:21:38 Uhr
18+
Nominale Wertpapierbezeichnung ISIN (WKN)
19+
Stück 2.000 RAFAEL HOLDINGS INC. US75062E1064 (A2JDMF)
20+
REGISTERED SH. CLASS B DL -,01
21+
Handels-/Ausführungsplatz New York-NYSE (gemäß Weisung)
22+
Börsensegment XNYS
23+
Market-Order
24+
Limit billigst
25+
Schlusstag/-Zeit 10.06.2025 15:33:35 Auftraggeber Swe Jskejdn Dekjdr
26+
Ortszeit 10.06.2025 10:33:35 Auftragserteilung/ -ort Online-Banking
27+
Ausführungskurs 2,37 USD
28+
Wertpapierrechnung Lagerland USA
29+
Devisenkurs (EUR/USD) 1,1403 vom 11.06.2025
30+
Kurswert 4.156,80- EUR
31+
Provision 9,95- EUR
32+
Fremde Auslagen 21,65- EUR
33+
Fremde Spesen 8,77- EUR
34+
Eigene Spesen 25,00- EUR
35+
Ausmachender Betrag 4.222,17- EUR
36+
37+
Den Gegenwert buchen wir mit Valuta 11.06.2025 zu Lasten des Kontos 0232542 (IBAN Ny24 7795 7076 9779 3579 65),
38+
BLZ 75215158 (BIC XJxDHnp9jbr).
39+
Die Wertpapiere schreiben wir Ihrem Depotkonto gut.
40+
Sofern keine Umsatzsteuer ausgewiesen ist, handelt es sich um eine umsatzsteuerbefreite Finanzdienstleistung.
41+
42+
Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben.
43+
1234.12345678.12345678R07

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ private void addBuySellTransaction()
7474
.find("Nominale Wertpapierbezeichnung ISIN \\(WKN\\)") //
7575
.match("^St.ck [\\.,\\d]+ (?<name>.*) (?<isin>[A-Z]{2}[A-Z0-9]{9}[0-9]) \\((?<wkn>[A-Z0-9]{6})\\)$") //
7676
.match("^(?<name1>.*)$") //
77-
.match("^.*Ausf.hrungskurs [\\.,\\d]+ (?<currency>[\\w]{3}) .*$") //
77+
.match("^.*Ausf.hrungskurs [\\.,\\d]+ (?<currency>[\\w]{3}).*$") //
7878
.assign((t, v) -> { //
7979
if (!v.get("name1").startsWith("Handels-/Ausführungsplatz")) //
8080
v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); //
@@ -476,6 +476,28 @@ private <T extends Transaction<?>> void addFeesSectionsTransaction(T transaction
476476
// @formatter:on
477477
.section("fee", "currency").optional() //
478478
.match("^.bertragungs\\-\\/Liefergeb.hr (?<fee>[\\.,\\d]+)\\-[\\s]{1,}(?<currency>[\\w]{3}).*$") //
479+
.assign((t, v) -> processFeeEntries(t, v, type))
480+
481+
// @formatter:off
482+
// Fremde Spesen 8,77- EUR
483+
// @formatter:on
484+
.section("fee", "currency").optional() //
485+
.match("^Fremde Spesen (?<fee>[\\.,\\d]+)\\-[\\s]{1,}(?<currency>[\\w]{3}).*$") //
486+
.assign((t, v) -> processFeeEntries(t, v, type))
487+
488+
// @formatter:off
489+
// Eigene Spesen 25,00- EUR
490+
// @formatter:on
491+
.section("fee", "currency").optional() //
492+
.match("^Eigene Spesen (?<fee>[\\.,\\d]+)\\-[\\s]{1,}(?<currency>[\\w]{3}).*$") //
493+
.assign((t, v) -> processFeeEntries(t, v, type))
494+
495+
// @formatter:off
496+
// Fremde Auslagen 21,65- EUR
497+
// @formatter:on
498+
.section("fee", "currency").optional() //
499+
.match("Fremde Auslagen (?<fee>[\\.,\\d]+)\\-[\\s]{1,}(?<currency>[\\w]{3}).*$") //
479500
.assign((t, v) -> processFeeEntries(t, v, type));
501+
480502
}
481503
}

0 commit comments

Comments
 (0)