Skip to content
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
@@ -1,6 +1,5 @@
package name.abuchen.portfolio.datatransfer.pdf.genobroker;

import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.check;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.dividend;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode;
Expand All @@ -24,8 +23,8 @@
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.withFailureMessage;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransfers;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countItemsWithFailureMessage;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countItemsWithFailureMessage;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
Expand All @@ -38,16 +37,10 @@
import org.junit.Test;

import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.datatransfer.ImportAction.Status;
import name.abuchen.portfolio.datatransfer.actions.AssertImportActions;
import name.abuchen.portfolio.datatransfer.actions.CheckCurrenciesAction;
import name.abuchen.portfolio.datatransfer.pdf.GenoBrokerPDFExtractor;
import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile;
import name.abuchen.portfolio.model.Account;
import name.abuchen.portfolio.model.AccountTransaction;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.Portfolio;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.Security;

@SuppressWarnings("nls")
Expand Down Expand Up @@ -112,7 +105,7 @@ public void testWertpapierKauf02()

// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2023-07-19T08:18"), hasShares(500), //
hasDate("2023-07-19T08:18"), hasShares(500.00), //
hasSource("Kauf02.txt"), //
hasNote("Auftragsnummer: 422576/44.00 | Limit 10,00 EUR"), //
hasAmount("EUR", 4714.55), hasGrossValue("EUR", 4704.50), //
Expand Down Expand Up @@ -145,7 +138,7 @@ public void testWertpapierKauf03()

// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2023-08-03T12:00"), hasShares(2100), //
hasDate("2023-08-03T12:00"), hasShares(2100.00), //
hasSource("Kauf03.txt"), //
hasNote("Auftragsnummer: 896962/04.00"), //
hasAmount("EUR", 506.62), hasGrossValue("EUR", 506.62), //
Expand Down Expand Up @@ -180,16 +173,11 @@ public void testWertpapierKauf03WithSecurityInEUR()

// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2023-08-03T12:00"), hasShares(2100), //
hasDate("2023-08-03T12:00"), hasShares(2100.00), //
hasSource("Kauf03.txt"), //
hasNote("Auftragsnummer: 896962/04.00"), //
hasAmount("EUR", 506.62), hasGrossValue("EUR", 506.62), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00), //
check(tx -> {
var c = new CheckCurrenciesAction();
var s = c.process((PortfolioTransaction) tx, new Portfolio());
assertThat(s, is(Status.OK_STATUS));
}))));
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
Expand Down Expand Up @@ -218,7 +206,7 @@ public void testWertpapierKauf04()

// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2025-06-10T15:33"), hasShares(2000), //
hasDate("2025-06-10T15:33"), hasShares(2000.00), //
hasSource("Kauf04.txt"), //
hasNote("Auftragsnummer: 625571/30.00 | Limit billigst"), //
hasAmount("EUR", 4222.17), hasGrossValue("EUR", 4156.80), //
Expand Down Expand Up @@ -252,16 +240,44 @@ public void testWertpapierKauf04WithSecurityInEUR()

// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2025-06-10T15:33"), hasShares(2000), //
hasDate("2025-06-10T15:33"), hasShares(2000.00), //
hasSource("Kauf04.txt"), //
hasNote("Auftragsnummer: 625571/30.00 | Limit billigst"), //
hasAmount("EUR", 4222.17), hasGrossValue("EUR", 4156.80), //
hasTaxes("EUR", 0.00), hasFees("EUR", 9.95 + 21.65 + 8.77 + 25.00), //
check(tx -> {
var c = new CheckCurrenciesAction();
var s = c.process((PortfolioTransaction) tx, new Portfolio());
assertThat(s, is(Status.OK_STATUS));
}))));
hasTaxes("EUR", 0.00), hasFees("EUR", 9.95 + 21.65 + 8.77 + 25.00))));
}

@Test
public void testWertpapierKauf05()
{
var extractor = new GenoBrokerPDFExtractor(new Client());

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

var results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf05.txt"), errors);

assertThat(errors, empty());
assertThat(countSecurities(results), is(1L));
assertThat(countBuySell(results), is(1L));
assertThat(countAccountTransactions(results), is(0L));
assertThat(countAccountTransfers(results), is(0L));
assertThat(countItemsWithFailureMessage(results), is(0L));
assertThat(results.size(), is(2));
new AssertImportActions().check(results, "EUR");

// check security
assertThat(results, hasItem(security( //
hasIsin("DE0005552004"), hasWkn("555200"), hasTicker(null), //
hasName("DEUTSCHE POST AG NAMENS-AKTIEN O.N."), //
hasCurrencyCode("EUR"))));

// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2025-12-11T16:14"), hasShares(200.00), //
hasSource("Kauf05.txt"), //
hasNote("Auftragsnummer: 210741/20.00 | Limit billigst"), //
hasAmount("EUR", 9391.91), hasGrossValue("EUR", 9374.00), //
hasTaxes("EUR", 0.00), hasFees("EUR", 17.81 + 0.10))));
}

@Test
Expand Down Expand Up @@ -290,7 +306,7 @@ public void testWertpapierVerkauf01()

// check buy sell transaction
assertThat(results, hasItem(sale( //
hasDate("2023-07-25T16:48"), hasShares(2100), //
hasDate("2023-07-25T16:48"), hasShares(2100.00), //
hasSource("Verkauf01.txt"), //
hasNote("Auftragsnummer: 433499/69.01 | Limit bestens"), //
hasAmount("EUR", 6319.37), hasGrossValue("EUR", 6331.50), //
Expand Down Expand Up @@ -323,7 +339,7 @@ public void testWertpapierVerkauf02()

// check buy sell transaction
assertThat(results, hasItem(sale( //
hasDate("2023-09-05T13:10"), hasShares(500), //
hasDate("2023-09-05T13:10"), hasShares(500.00), //
hasSource("Verkauf02.txt"), //
hasNote("Auftragsnummer: 498470/51.00 | Limit bestens"), //
hasAmount("EUR", 4759.31), hasGrossValue("EUR", 4779.50), //
Expand Down Expand Up @@ -356,7 +372,7 @@ public void testDividende01()

// check dividend transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-07-14T00:00"), hasShares(1000), //
hasDate("2023-07-14T00:00"), hasShares(1000.00), //
hasSource("Dividende01.txt"), //
hasNote("Abrechnungsnr.: 60007000"), //
hasAmount("EUR", 445.94), hasGrossValue("EUR", 615.87), //
Expand Down Expand Up @@ -389,7 +405,7 @@ public void testDividende02()

// check dividend transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-07-10T00:00"), hasShares(2100), //
hasDate("2023-07-10T00:00"), hasShares(2100.00), //
hasSource("Dividende02.txt"), //
hasNote("Abrechnungsnr.: 000000000"), //
hasAmount("EUR", 6107.09), hasGrossValue("EUR", 9475.70), //
Expand Down Expand Up @@ -423,7 +439,7 @@ public void testDividende03()

// check dividend transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-08-29T00:00"), hasShares(600), //
hasDate("2023-08-29T00:00"), hasShares(600.00), //
hasSource("Dividende03.txt"), //
hasNote("Abrechnungsnr.: 74014833940"), //
hasAmount("EUR", 236.34), hasGrossValue("EUR", 486.03), //
Expand Down Expand Up @@ -458,18 +474,11 @@ public void testDividende03WithSecurityInEUR()

// check dividends transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-08-29T00:00"), hasShares(600), //
hasDate("2023-08-29T00:00"), hasShares(600.00), //
hasSource("Dividende03.txt"), //
hasNote("Abrechnungsnr.: 74014833940"), //
hasAmount("EUR", 236.34), hasGrossValue("EUR", 486.03), //
hasTaxes("EUR", 121.51 + 121.50 + 6.68), hasFees("EUR", 0.00), //
check(tx -> {
var c = new CheckCurrenciesAction();
var account = new Account();
account.setCurrencyCode("EUR");
var s = c.process((AccountTransaction) tx, account);
assertThat(s, is(Status.OK_STATUS));
}))));
hasTaxes("EUR", 121.51 + 121.50 + 6.68), hasFees("EUR", 0.00))));
}

@Test
Expand Down Expand Up @@ -498,7 +507,7 @@ public void testDividende04()

// check dividend transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-09-13T00:00"), hasShares(23), //
hasDate("2023-09-13T00:00"), hasShares(23.00), //
hasSource("Dividende04.txt"), //
hasNote("Abrechnungsnr.: 75555439660"), //
hasAmount("EUR", 24.01), hasGrossValue("EUR", 32.26), //
Expand Down Expand Up @@ -537,14 +546,7 @@ public void testDividende04WithSecurityInEUR()
hasSource("Dividende04.txt"), //
hasNote("Abrechnungsnr.: 75555439660"), //
hasAmount("EUR", 24.01), hasGrossValue("EUR", 32.26), //
hasTaxes("EUR", 4.84 + 3.23 + 0.18), hasFees("EUR", 0.00), //
check(tx -> {
var c = new CheckCurrenciesAction();
var account = new Account();
account.setCurrencyCode("EUR");
var s = c.process((AccountTransaction) tx, account);
assertThat(s, is(Status.OK_STATUS));
}))));
hasTaxes("EUR", 4.84 + 3.23 + 0.18), hasFees("EUR", 0.00))));
}

@Test
Expand Down Expand Up @@ -573,7 +575,7 @@ public void testDividende05()

// check dividend transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-12-29T00:00"), hasShares(30), //
hasDate("2023-12-29T00:00"), hasShares(30.00), //
hasSource("Dividende05.txt"), //
hasNote("Abrechnungsnr.: 86249245170"), //
hasAmount("EUR", 6.03), hasGrossValue("EUR", 7.50), //
Expand Down Expand Up @@ -608,18 +610,11 @@ public void testDividende05WithSecurityInEUR()

// check dividends transaction
assertThat(results, hasItem(dividend( //
hasDate("2023-12-29T00:00"), hasShares(30), //
hasDate("2023-12-29T00:00"), hasShares(30.00), //
hasSource("Dividende05.txt"), //
hasNote("Abrechnungsnr.: 86249245170"), //
hasAmount("EUR", 6.03), hasGrossValue("EUR", 7.50), //
hasTaxes("EUR", 1.29 + 0.07 + 0.11), hasFees("EUR", 0.00), //
check(tx -> {
var c = new CheckCurrenciesAction();
var account = new Account();
account.setCurrencyCode("EUR");
var s = c.process((AccountTransaction) tx, account);
assertThat(s, is(Status.OK_STATUS));
}))));
hasTaxes("EUR", 1.29 + 0.07 + 0.11), hasFees("EUR", 0.00))));
}

@Test
Expand Down Expand Up @@ -648,7 +643,7 @@ public void testDividende06()

// check dividend transaction
assertThat(results, hasItem(dividend( //
hasDate("2024-04-30T00:00"), hasShares(75), //
hasDate("2024-04-30T00:00"), hasShares(75.00), //
hasSource("Dividende06.txt"), //
hasNote("Abrechnungsnr.: 08172459718"), //
hasAmount("EUR", 255.00), hasGrossValue("EUR", 255.00), //
Expand Down Expand Up @@ -681,7 +676,7 @@ public void testDividende07()

// check dividend transaction
assertThat(results, hasItem(dividend( //
hasDate("2024-04-30T00:00"), hasShares(23), //
hasDate("2024-04-30T00:00"), hasShares(23.00), //
hasSource("Dividende07.txt"), //
hasNote("Abrechnungsnr.: 20967773045"), //
hasAmount("EUR", 309.07), hasGrossValue("EUR", 345.00 + 216.60), //
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
PDFBox Version: 3.0.5
Portfolio Performance Version: 0.80.4
System: win32 | x86_64 | 21.0.5+11-LTS | Azul Systems, Inc.
-----------------------------------------

GENO Broker GmbH Kundenservice · Postfach 30 30 · 48016 Münster
Depotnummer
9193874968
Kundennummer 0333801865
GgLtcNK KaKWxv
Auftragsnummer 210741/20.00
BsGscIE IcEsTa Datum 11.12.2025
Tannholzstr. 2 Rechnungsnummer W07700-0000535645/25
42469 SEixHjCMWqMRtD Umsatzsteuer-ID DE288411485

Wertpapier Abrechnung Kauf
Nominale Wertpapierbezeichnung ISIN (WKN)
Stück 200 DEUTSCHE POST AG DE0005552004 (555200)
NAMENS-AKTIEN O.N.
Handels-/Ausführungsplatz Tradegate (gemäß Weisung)
Börsensegment XGAT
Market-Order
Limit billigst
Schlusstag/-Zeit 11.12.2025 16:14:10 KcoZutzKyufI nDe OUNmdWDm qkPCFD
Ausführungskurs 46,87 EUR Auftragserteilung/ -ort Online-Banking
Girosammelverwahrung - Sammel-Urkunden in Namensaktien
Kurswert 9.374,00- EUR
Provision 0,1900 % vom Kurswert 17,81- EUR
Übertragungs-/Liefergebühr 0,10- EUR
Ausmachender Betrag 9.391,91- EUR

Den Gegenwert buchen wir mit Valuta 15.12.2025 zu Lasten des Kontos 3282155 (IBAN DE05 7206 9274 0003 2821 55),
BLZ 72069274 (BIC GENODEF1ZUS).
Die Wertpapiere schreiben wir Ihrem Depotkonto gut.
Sofern keine Umsatzsteuer ausgewiesen ist, handelt es sich um eine umsatzsteuerbefreite Finanzdienstleistung.

Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben.
7700.12111732.0001276OR07