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 Raiffeisenbank PDF-Importer to support new transaction #3247

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 @@ -53,6 +53,8 @@ public void testWertpapierKauf01()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DE000BAY0017"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Bayer AG Namens-Aktien o.N."));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand All @@ -66,7 +68,7 @@ public void testWertpapierKauf01()
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-03T13:45:18")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2)));
assertThat(entry.getSource(), is("Kauf01.txt"));
assertNull(entry.getNote());
assertThat(entry.getNote(), is("Auftrags-Nr.: 11441163"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(107.26))));
Expand Down Expand Up @@ -96,6 +98,7 @@ public void testWertpapierKauf02()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("US7475251036"));
assertThat(security.getWkn(), is("883121"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("QUALCOMM INC. REGISTERED SHARES DL -,0001"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand Down Expand Up @@ -138,6 +141,8 @@ public void testWertpapierKauf03()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("IE00B6YX5C33"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("SPDR S&P 500 UCITS ETF Registered Shares USD o.N."));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand All @@ -151,7 +156,7 @@ public void testWertpapierKauf03()
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-01-12T16:42:58")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(6)));
assertThat(entry.getSource(), is("Kauf03.txt"));
assertNull(entry.getNote());
assertThat(entry.getNote(), is("Auftrags-Nr.: 12345678"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2510.00))));
Expand Down Expand Up @@ -180,6 +185,8 @@ public void testWertpapierKauf04()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("CA1363851017"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Canadian Natural Resources Ltd Registered Shares o.N."));
assertThat(security.getCurrencyCode(), is("CAD"));

Expand All @@ -193,7 +200,7 @@ public void testWertpapierKauf04()
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-01-19T15:30")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(22)));
assertThat(entry.getSource(), is("Kauf04.txt"));
assertNull(entry.getNote());
assertThat(entry.getNote(), is("Auftrags-Nr.: 12345678"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1121.40))));
Expand Down Expand Up @@ -237,7 +244,7 @@ public void testWertpapierKauf04WithSecurityInEUR()
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-01-19T15:30")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(22)));
assertThat(entry.getSource(), is("Kauf04.txt"));
assertNull(entry.getNote());
assertThat(entry.getNote(), is("Auftrags-Nr.: 12345678"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1121.40))));
Expand Down Expand Up @@ -266,6 +273,8 @@ public void testWertpapierKauf05()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("IE00BK5BQT80"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Vanguard FTSE All-World U.ETF Reg. Shs USD Acc. oN"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand All @@ -279,7 +288,7 @@ public void testWertpapierKauf05()
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-03-24T12:20:52")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(200)));
assertThat(entry.getSource(), is("Kauf05.txt"));
assertNull(entry.getNote());
assertThat(entry.getNote(), is("Auftrags-Nr.: 44083824"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(18521.34))));
Expand Down Expand Up @@ -308,6 +317,8 @@ public void testWertpapierKauf06()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("IE00BK5BQT80"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Vanguard FTSE All-World U.ETF Reg. Shs USD Acc. oN"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand All @@ -321,7 +332,7 @@ public void testWertpapierKauf06()
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-03-06T10:46:12")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100)));
assertThat(entry.getSource(), is("Kauf06.txt"));
assertNull(entry.getNote());
assertThat(entry.getNote(), is("Auftrags-Nr.: 41601727"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9681.58))));
Expand Down Expand Up @@ -350,6 +361,8 @@ public void testWertpapierVerkauf01()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("AT0000837307"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Zumtobel Group AG Inhaber-Aktien o.N."));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand All @@ -360,7 +373,7 @@ public void testWertpapierVerkauf01()
assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL));
assertThat(entry.getSource(), is("Verkauf01.txt"));
assertNull(entry.getNote());
assertThat(entry.getNote(), is("Auftrags-Nr.: 21112411"));

assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-07T11:17:43")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4500)));
Expand Down Expand Up @@ -393,6 +406,7 @@ public void testWertpapierVerkauf02()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("US09075V1026"));
assertThat(security.getWkn(), is("A2PSR2"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("BIONTECH SE NAM.-AKT.(SP.ADRS)1/O.N."));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand Down Expand Up @@ -436,6 +450,7 @@ public void testWertpapierVerkauf03()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("US5949181045"));
assertThat(security.getWkn(), is("870747"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("MICROSOFT CORP. REGISTERED SHARES DL-,00000625"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand All @@ -461,6 +476,50 @@ public void testWertpapierVerkauf03()
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.49 + 0.10))));
}

@Test
public void testWertpapierVerkauf04()
{
RaiffeisenBankgruppePDFExtractor extractor = new RaiffeisenBankgruppePDFExtractor(new Client());

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

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

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

// check security
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DE0009848119"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("DWS Top Dividende Inhaber-Anteile LD"));
assertThat(security.getCurrencyCode(), is(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.SELL));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL));
assertThat(entry.getSource(), is("Verkauf04.txt"));
assertThat(entry.getNote(), is("Auftrags-Nr.: 47199493"));

assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2023-03-27T00:00")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(200)));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(26000.00))));
assertThat(entry.getPortfolioTransaction().getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(26000.00))));
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))));
}

@Test
public void testDividende01()
{
Expand All @@ -478,6 +537,8 @@ public void testDividende01()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DE000BAY0017"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("Bayer AG Namens-Aktien o.N."));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand Down Expand Up @@ -520,6 +581,7 @@ public void testDividende02()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("US7475251036"));
assertThat(security.getWkn(), is("883121"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("QUALCOMM INC. REGISTERED SHARES DL -,0001"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD));

Expand Down Expand Up @@ -612,6 +674,7 @@ public void testDividende03()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("US17275R1023"));
assertThat(security.getWkn(), is("878841"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("CISCO SYSTEMS INC. SHARES REGISTERED SHARES DL-,001"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD));

Expand Down Expand Up @@ -704,6 +767,7 @@ public void testDividende04()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("US3703341046"));
assertThat(security.getWkn(), is("853862"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("GENERAL MILLS INC. REGISTERED SHARES DL -,10"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD));

Expand Down Expand Up @@ -794,6 +858,8 @@ public void testDividende05()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DE000A0D8Q49"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("iSh.DJ U.S.Select Div.U.ETF DE Inhaber-Anteile"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD));

Expand Down Expand Up @@ -883,6 +949,8 @@ public void testDividende06()
Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DE0007664039"));
assertNull(security.getWkn());
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("VOLKSWAGEN AG VORZUGSAKTIEN O.ST. O.N."));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

Expand Down
@@ -0,0 +1,44 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.61.4
-----------------------------------------
da


Bank Direkt
der Raiffeisenlandesbank OÖ (BLZ: 34000)
Europaplatz 1a b
4020 Linz


a
a
Abrechnung a
41423542 - 28.03.2023 a
Depotnummer: 12.345.678
Herrn Max Mustermann
Max Musterman
Dorf 123 230/475
6789 Kufstein Bank Direkt
Wir haben für Sie am 28.03.2023 unten angeführtes Geschäft abgerechnet:
Geschäftsart: Rücknahme Fonds Auftrags-Nr.: 47199493 - 27.03.2023
Auftragseingang: 27.03.2023 - 11:48:52
Abgang: 200 Stk
Titel: DE0009848119 DWS Top Dividende
Inhaber-Anteile LD
Fondsgesellschaft: DWS Investment GmbH
Kurs: 130 EUR
Handelsplatz: DE_F Fonds Deutschland
Handelszeit: 27.03.2023
Verwahrart: WR
Positionsdaten: Loco: Luxemburg
Kurswert: 26.000,00 EUR
Zu Gunsten IBAN AT44 3400 0000 0123 459 26.000,00 EUR
Valuta 29.03.2023
Schlusstag: 27.03.2023
Kassatag: 29.03.2023
KESt-Altbestand: 200 Stk
Steuerl. Behandlung vorbehaltlich Beurteilung durch BMF
28.03.2023 1 / 1
BIC: RZOOAT2L, Landesgericht Linz, FN 247579m, UID: ATU57834268
Dieser Beleg wurde durch die Raiffeisenlandesbank Oberösterreich erstellt.
Ohne Unterschrift. Bitte geben Sie Unstimmigkeiten sofort bekannt.
Expand Up @@ -43,7 +43,7 @@ public String getLabel()

private void addBuySellTransaction()
{
DocumentType type = new DocumentType("(Kauf|Verkauf)");
DocumentType type = new DocumentType("(Kauf|Verkauf|R.cknahme Fonds)");
this.addDocumentTyp(type);

Transaction<BuySellEntry> pdfTransaction = new Transaction<>();
Expand All @@ -53,16 +53,16 @@ private void addBuySellTransaction()
return entry;
});

Block firstRelevantLine = new Block("^(Gesch.ftsart:|Wertpapier Abrechnung) (Kauf|Verkauf).*$");
Block firstRelevantLine = new Block("^(Gesch.ftsart:|Wertpapier Abrechnung) (Kauf|Verkauf|R.cknahme Fonds).*$");
type.addBlock(firstRelevantLine);
firstRelevantLine.set(pdfTransaction);

pdfTransaction
// Is type --> "Verkauf" change from BUY to SELL
.section("type").optional()
.match("^(Gesch.ftsart:|Wertpapier Abrechnung) (?<type>(Kauf|Verkauf)) .*$")
.match("^(Gesch.ftsart:|Wertpapier Abrechnung) (?<type>(Kauf|Verkauf|R.cknahme Fonds)) .*$")
.assign((t, v) -> {
if (v.get("type").equals("Verkauf"))
if (v.get("type").equals("Verkauf") || v.get("type").equals("Rücknahme Fonds"))
t.setType(PortfolioTransaction.Type.SELL);
})

Expand Down Expand Up @@ -121,13 +121,24 @@ private void addBuySellTransaction()
.assign((t, v) -> t.setShares(asShares(v.get("shares"))))
)

// @formatter:off
// Handelszeit: 03.05.2021 13:45:18
// Schlusstag/-Zeit 09.11.2021 09:58:45 Auftraggeber Muster
// @formatter:on
.section("date", "time")
.match("^(Handelszeit:|Schlusstag\\/\\-Zeit) (?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) (?<time>[\\d]{2}:[\\d]{2}:[\\d]{2}).*$")
.assign((t, v) -> t.setDate(asDate(v.get("date"), v.get("time"))))
.oneOf(
// @formatter:off
// Handelszeit: 03.05.2021 13:45:18
// Schlusstag/-Zeit 09.11.2021 09:58:45 Auftraggeber Muster
// @formatter:on
section -> section
.attributes("date", "time")
.match("^(Handelszeit:|Schlusstag\\/\\-Zeit) (?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) (?<time>[\\d]{2}:[\\d]{2}:[\\d]{2}).*$")
.assign((t, v) -> t.setDate(asDate(v.get("date"), v.get("time"))))
,
// @formatter:off
// Handelszeit: 27.03.2023
// @formatter:on
section -> section
.attributes("date")
.match("^Handelszeit: (?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$")
.assign((t, v) -> t.setDate(asDate(v.get("date"))))
)

// @formatter:off
// Zu Lasten IBAN AT99 9999 9000 0011 1110 -107,26 EUR
Expand Down Expand Up @@ -161,12 +172,24 @@ private void addBuySellTransaction()
checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext());
})

// @formatter:off
// Geschäftsart: Rücknahme Fonds Auftrags-Nr.: 47199493 - 27.03.2023
// @formatter:on
.section("note").optional()
.match("^.*(?<note>Auftrags\\-Nr\\.: [\\d]+).*$")
.assign((t, v) -> t.setNote(trim(v.get("note"))))

// @formatter:off
// Limit bestens
// @formatter:on
.section("note").optional()
.match("^(?<note>Limit .*)$")
.assign((t, v) -> t.setNote(trim(v.get("note"))))
.assign((t, v) -> {
if (t.getNote() == null)
t.setNote(trim(v.get("note")));
else
t.setNote(t.getNote() + " | " + trim(v.get("note")));
})

.wrap(BuySellEntryItem::new);

Expand Down