Skip to content

Commit

Permalink
Modify Erste Bank PDF-Importer to support new transaction
Browse files Browse the repository at this point in the history
If the market price is higher than the NAV, this is referred to as a "premium".

If the market price is below the NAV, this is referred to as a "discount".

https://forum.portfolio-performance.info/t/pdf-import-von-erste-bank-brokerjet-sparkassengruppe-osterreich/15433/36

https://forum.portfolio-performance.info/t/pdf-import-von-erste-bank-brokerjet-sparkassengruppe-osterreich/15433/39
  • Loading branch information
Nirus2000 committed Apr 9, 2024
1 parent a476976 commit 9cf629a
Show file tree
Hide file tree
Showing 4 changed files with 289 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTaxes;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell;
import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities;
Expand Down Expand Up @@ -180,11 +182,11 @@ public void testWertpapierKauf03()
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.96))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(98.19))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(96.42))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.77))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.77 + 1.77))));
}

@Test
Expand Down Expand Up @@ -224,11 +226,11 @@ public void testWertpapierKauf04()
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.97))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.97))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(98.21))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.76))));
}

@Test
Expand Down Expand Up @@ -400,11 +402,11 @@ public void testWertpapierKauf08()
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.82))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(99.82))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(97.63))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.19))));
}

@Test
Expand Down Expand Up @@ -539,15 +541,15 @@ public void testWertpapierKauf10()
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(149.94))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(145.77))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(142.27))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize((0.44 / 1.2169) + 3.81))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize((0.44 / 1.2169) + 3.81 + (4.26 / 1.2169)))));

Unit grossValueUnit = entry.getPortfolioTransaction().getUnit(Unit.Type.GROSS_VALUE)
.orElseThrow(IllegalArgumentException::new);
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(177.38))));
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(173.13))));
}

@Test
Expand Down Expand Up @@ -584,11 +586,11 @@ public void testWertpapierKauf10WithSecurityInEUR()
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(149.94))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(145.77))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(142.27))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize((0.44 / 1.2169) + 3.81))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize((0.44 / 1.2169) + 3.81 + (4.26 / 1.2169)))));

CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
Expand Down Expand Up @@ -634,15 +636,15 @@ public void testWertpapierKauf11()
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(149.87))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(145.70))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(141.92))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.81 + 0.36))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize((0.41 / 1.1229) + 3.81 + (4.24 / 1.1229)))));

Unit grossValueUnit = entry.getPortfolioTransaction().getUnit(Unit.Type.GROSS_VALUE)
.orElseThrow(IllegalArgumentException::new);
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(163.60))));
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(159.36))));
}

@Test
Expand Down Expand Up @@ -679,11 +681,11 @@ public void testWertpapierKauf11WithSecurityInEUR()
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(149.87))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(145.70))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(141.92))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.81 + 0.36))));
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize((0.41 / 1.1229) + 3.81 + (4.24 / 1.1229)))));

CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
Expand Down Expand Up @@ -828,6 +830,53 @@ public void testWertpapierKauf14()
assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(697.27))));
}

@Test
public void testWertpapierKauf14WithSecurityInEUR()
{
Security security = new Security("ABBVIE INC. REGISTERED SHARES DL -,01", CurrencyUnit.EUR);
security.setIsin("US00287Y1091");

Client client = new Client();
client.addSecurity(security);

ErsteBankPDFExtractor extractor = new ErsteBankPDFExtractor(client);

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf14.txt"), errors);

assertThat(errors, empty());
assertThat(results.size(), is(1));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// check buy sell transaction
BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSubject();

assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));

assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-09-08T18:32:23")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5)));
assertThat(entry.getSource(), is("Kauf14.txt"));
assertThat(entry.getNote(), is("Limit: Bestens"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(750.95))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(700.42))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(35.00 + 3.54 + 5.00 + 6.99))));

CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
account.setCurrencyCode(CurrencyUnit.EUR);
Status s = c.process(entry, account, entry.getPortfolio());
assertThat(s, is(Status.OK_STATUS));
}

@Test
public void testWertpapierKauf15()
{
Expand Down Expand Up @@ -873,50 +922,34 @@ public void testWertpapierKauf15()
}

@Test
public void testWertpapierKauf14WithSecurityInEUR()
public void testWertpapierKauf16()
{
Security security = new Security("ABBVIE INC. REGISTERED SHARES DL -,01", CurrencyUnit.EUR);
security.setIsin("US00287Y1091");

Client client = new Client();
client.addSecurity(security);

ErsteBankPDFExtractor extractor = new ErsteBankPDFExtractor(client);
ErsteBankPDFExtractor extractor = new ErsteBankPDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf14.txt"), errors);
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf16.txt"), errors);

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

// check buy sell transaction
BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSubject();

assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));

assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-09-08T18:32:23")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5)));
assertThat(entry.getSource(), is("Kauf14.txt"));
assertThat(entry.getNote(), is("Limit: Bestens"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(750.95))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(700.42))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(35.00 + 3.54 + 5.00 + 6.99))));
// check security
assertThat(results, hasItem(security( //
hasIsin("DE0009769794"), hasWkn(null), hasTicker(null), //
hasName("DWS TOP 50 WELT"), //
hasCurrencyCode("EUR"))));

CheckCurrenciesAction c = new CheckCurrenciesAction();
Account account = new Account();
account.setCurrencyCode(CurrencyUnit.EUR);
Status s = c.process(entry, account, entry.getPortfolio());
assertThat(s, is(Status.OK_STATUS));
// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2009-07-21T18:00"), hasShares(2.214), //
hasSource("Kauf16.txt"), //
hasNote(null), //
hasAmount("EUR", 99.94), hasGrossValue("EUR", 98.39), //
hasTaxes("EUR", 0.02), hasFees("EUR", 1.53))));
}

@Test
Expand Down Expand Up @@ -2773,4 +2806,25 @@ public void testDividende23()
hasAmount("EUR", 262.50), hasGrossValue("EUR", 262.50), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
public void testVerlustbescheinigung01()
{
ErsteBankPDFExtractor extractor = new ErsteBankPDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verlustbescheinigung01.txt"), errors);

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

// assert transaction
assertThat(results, hasItem(taxes(hasDate("2013-04-28"), hasAmount("EUR", 198.21), //
hasSource("Verlustbescheinigung01.txt"), hasNote("01.04.2012 bis 31.12.2012"))));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.68.3
-----------------------------------------
Ab. BLZ: 12345
Abcd Abcdefghijk Referenz Nr: 12-1234567-1
Ab. 12 Kunden Nr.: 12345
1234 Abcdefghi Depot Nr.: 12345-01
Austria
Wien, 21. Juli 2009

WERTPAPIERBESTÄTIGUNG
IHR KAUF

Ausserbörslich Kurswert: EUR 99,97
Wertpapier: DWS TOP 50 WELT KESt II EUR 0,02-
WP-Kenn-Nr. : DE0009769794
Stück: 2,214 Gesamtbetrag: EUR 99,94
NAV: EUR 44,4609
Preis: EUR 45,1513
Handelstag: 20. Juli 2009
Valutatag: 22. Juli 2009
Lagerort: Wien
Verwahrart: WR
Abrechnung:
Wir belasten Ihr EUR Konto Nummer 12345 mit Valuta 22. Juli 2009.
Wir erkennen Ihr Wertpapierdepot Nummer 12345-1.
Ausführung:
Ausführungsdatum: 21. Juli 2009 Ausführungszeit: 18:00:00
Überprüfen Sie bitte die Richtigkeit dieser Bestätigung. Sollten Sie innerhalb von 6 Wochen nach Erhalt dieser Bestätigung keine
Einwände gegen die Richtigkeit erheben, so gelten die angeführten Erklärungen und Leistungen als genehmigt.
ecetra Central European e-Finance AG | Mariahilferstraße 121B | A-1060 Wien
e-mail: support@ecetra.com | Fax: +43-1-53689-13550 | www.ecetra.com
Sitz Wien | Handelsgericht Wien | FB-Nr. 193944m | DVR 1052322 | UID ATU49227901
Ein Unternehmen der ERSTE BANK GRUPPE
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.67.3
-----------------------------------------



Abcd Depotkreis: 12345_2012
Abcd Abcdefghijk Währung: EUR
Ab. 12
1234 Abcdefghi

Abcdefghijkl: 12.12.2012 Wien, 28.04.2013



BESCHEINIGUNG ÜBER DEN VERLUSTAUSGLEICH
für den Zeitraum 01.04.2012 bis 31.12.2012

Berücksichtigte Depots:
Depot Von-Datum Bis-Datum
12345-1 01.04.2012 31.12.2012


Zusammenfassung:
Bemessungsgrundlage Gewinne Verluste
Zinsen/Dividenden: 1.345,06 0,00
Fondsausschüttungen: 45,72 0,00
Gewinne/Verluste aus realisierten Wertsteigerungen: 1.244,80 -792,84
Gewinne/Verluste aus Derivaten 0,00 0,00
Summe: 2.635,58 -792,84
Saldo Erträge/Gewinne/Verluste: 1.842,74

abgeführte KESt: -559,17
gegengerechnete KESt: 198,21

Es wurde Ihnen dieser Betrag gutgebucht: 198,21

Brokerjet Bank AG | Mariahilfer Straße 121B | A-1060 Wien Seite 1 von 2
e-mail: support@brokerjet.com | Fax: +43 1 53689-13550 | www.brokerjet.at
Wien | Handelsgericht Wien | FB-Nr. 193944m | DVR 1052322 | UID ATU49227901
Ein Unternehmen der Erste Bank-Gruppe
Loading

0 comments on commit 9cf629a

Please sign in to comment.