Skip to content

Commit

Permalink
Modify Trade Republic PDF-Importer to support new transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
Nirus2000 authored and buchen committed Nov 1, 2023
1 parent ab7f812 commit 5f51ef0
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3684,22 +3684,19 @@ public void testZinsabrechnung01()
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);

// check transaction
Iterator<Extractor.Item> iter = results.stream().filter(TransactionItem.class::isInstance).iterator();
assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(1L));

Item item = iter.next();

// assert transaction
AccountTransaction transaction = (AccountTransaction) item.getSubject();
assertThat(transaction.getType(), is(AccountTransaction.Type.INTEREST));
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-01-31T00:00")));
assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.88))));
assertThat(transaction.getSource(), is("Zinsabrechnung01.txt"));
assertNull(transaction.getNote());
// check interest transaction
assertThat(results, hasItem(interest( //
hasDate("2023-01-31T00:00"), //
hasSource("Zinsabrechnung01.txt"), //
hasNote("2,00%"), //
hasAmount("EUR", 0.88), hasGrossValue("EUR", 0.88), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
Expand All @@ -3713,22 +3710,45 @@ public void testZinsabrechnung02()
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);

// check transaction
Iterator<Extractor.Item> iter = results.stream().filter(TransactionItem.class::isInstance).iterator();
assertThat(results.stream().filter(TransactionItem.class::isInstance).count(), is(1L));
// check interest transaction
assertThat(results, hasItem(interest( //
hasDate("2023-01-31T00:00"), //
hasSource("Zinsabrechnung02.txt"), //
hasNote("2,00%"), //
hasAmount("EUR", 2.58), hasGrossValue("EUR", 2.58), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

Item item = iter.next();
@Test
public void testZinsabrechnung03()
{
TradeRepublicPDFExtractor extractor = new TradeRepublicPDFExtractor(new Client());

// assert transaction
AccountTransaction transaction = (AccountTransaction) item.getSubject();
assertThat(transaction.getType(), is(AccountTransaction.Type.INTEREST));
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-01-31T00:00")));
assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.58))));
assertThat(transaction.getSource(), is("Zinsabrechnung02.txt"));
assertNull(transaction.getNote());
List<Exception> errors = new ArrayList<>();

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Zinsabrechnung03.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);

// check interest transaction
assertThat(results, hasItem(interest( //
hasDate("2023-10-31T00:00"), //
hasSource("Zinsabrechnung03.txt"), //
hasNote("01.10.2023 - 31.10.2023 (4,00%)"), //
hasAmount("EUR", 112.40), hasGrossValue("EUR", 152.67), //
hasTaxes("EUR", 38.17 + 2.10), hasFees("EUR", 0.00))));
}

@Test
Expand All @@ -3741,16 +3761,21 @@ public void testRescontoInteressiMaturati01()
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "RescontoInteressiMaturati01.txt"),
errors);

assertThat(errors, empty());
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(interest(hasDate("2023-05-31"), hasAmount("EUR", 0.12), //
hasSource("RescontoInteressiMaturati01.txt"), hasNote(null))));
// check interest transaction
assertThat(results, hasItem(interest( //
hasDate("2023-05-31"), //
hasSource("RescontoInteressiMaturati01.txt"), //
hasNote("2,00%"), //
hasAmount("EUR", 0.12), hasGrossValue("EUR", 0.12), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
Expand All @@ -3763,15 +3788,20 @@ public void testInterestInvoice01()
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "InterestInvoice01.txt"),
errors);

assertThat(errors, empty());
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(interest(hasDate("2023-09-30"), hasAmount("EUR", 1.47), //
hasSource("InterestInvoice01.txt"), hasNote(null))));
// check interest transaction
assertThat(results, hasItem(interest( //
hasDate("2023-09-30"), //
hasSource("InterestInvoice01.txt"), //
hasNote("2,00%"), //
hasAmount("EUR", 1.47), hasGrossValue("EUR", 1.47), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.65.4
-----------------------------------------
TRADE REPUBLIC BANK GMBH BRUNNENSTRASSE 19-21 10119 BERLIN
Max Mustermann SEITE 1 von 1
Musterstraße 123 DATUM 01.11.2023
01234 Musterstadt VERRECHNUNGSKONTO 0123456789
STEUER-ID 01234567890
ABRECHNUNG ZINSEN
zum 31.10.2023
ÜBERSICHT
VERMÖGENSWERT EINKOMMENSART ZINSEN DATUM GESAMT
Cash Zinsen 4,00% 01.10.2023 - 31.10.2023 152,67 EUR
ABRECHNUNG
POSITION BETRAG
Besteuerungsgrundlage 152,67 EUR
Kapitalertragssteuer -38,17 EUR
Solidaritätszuschlag -2,10 EUR
Gesamt 112,40 EUR
BUCHUNG
IBAN BUCHUNGSDATUM GUTSCHRIFT NACH STEUERN
DE99012345670123456789 01.11.2023 112,40 EUR
Trade Republic Bank GmbH www.traderepublic.com Sitz der Gesellschaft: Berlin Geschäftsführer
Brunnenstraße 19-21 service@traderepublic.com AG Charlottenburg HRB 244347 B Andreas Torner
10119 Berlin USt-ID DE307510626 Gernot Mittendorfer
Original file line number Diff line number Diff line change
Expand Up @@ -1135,15 +1135,41 @@ private void addInterestStatementTransaction()
.assign((t, v) -> t.setDateTime(asDate(v.get("date"))))

// @formatter:off
// IBAN BUCHUNGSDATUM GUTSCHRIFT NACH STEUERN
// DE10123456789123456789 01.02.2023 0,88 EUR
//
// IBAN DATA EMISSIONE TOTALE
// DE93752109007837402856 01.06.2023 0,12 EUR
//
// IBAN BOOKING DATE TOTAL
// DE27502109007011534672 02.10.2023 1,47 EUR
// @formatter:on
.section("currency", "amount") //
.find("IBAN (BUCHUNGSDATUM|DATA EMISSIONE|BOOKING DATE) (GUTSCHRIFT NACH STEUERN|TOTALE|TOTAL)") //
.match("^.* [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?<amount>[\\.,\\d]+) (?<currency>[\\w]{3})$") //
.assign((t, v) -> {
t.setAmount(asAmount(v.get("amount")));
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
})

.optionalOneOf( //
// @formatter:off
// Cash Zinsen 4,00% 01.10.2023 - 31.10.2023 152,67 EUR
// @formatter:on
section -> section //
.attributes("note1", "note2") //
.match("^.* (Zinsen|Interessi|Interest) (?<note1>[\\.,\\d]+%) (?<note2>.*[\\d]{4}).*$") //
.assign((t, v) -> t.setNote(trim(v.get("note2")) + " (" + trim(v.get("note1")) + ")")),
// @formatter:off
// Cash Zinsen 2,00% 2,58 EUR
// Liquidità Interessi 2,00% 0,12 EUR
// Cash Interest 2,00% 1,47 EUR
// @formatter:on
section -> section //
.attributes("note") //
.match("^.* (Zinsen|Interessi|Interest) (?<note>[\\.,\\d]+%).*$")
.assign((t, v) -> t.setNote(v.get("note"))))

.wrap(TransactionItem::new);

addTaxesSectionsTransaction(pdfTransaction, type);
Expand Down

0 comments on commit 5f51ef0

Please sign in to comment.