Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify Erste Bank PDF-Importer to support new transaction #3921

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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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"))));
}
}
@@ -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
@@ -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