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 FlatEx PDF-Importer to support new transaction #3840

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 @@ -3199,7 +3199,7 @@ public void testFlatExVerkauf04()
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-22T00:00")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.5)));
assertThat(entry.getSource(), is("FlatExVerkauf04.txt"));
assertThat(entry.getNote(), is("Spitzenregulierung in CA05156X1087"));
assertThat(entry.getNote(), is("Spitzenregulierung in CA05156X1087 | Transaktions-Nr. 1942669999"));

assertThat(entry.getPortfolioTransaction().getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.86))));
Expand Down Expand Up @@ -4179,18 +4179,51 @@ public void testFlatExDegiroVerkauf02()
// check buy sell transaction
assertThat(results, hasItem(sale( //
hasDate("2023-05-25T00:00"), hasShares(0.385884), //
hasSource("FlatExDegiroVerkauf02.txt"), hasNote("Transaktion-Nr.: 3333333333"), //
hasSource("FlatExDegiroVerkauf02.txt"), //
hasNote("Transaktion-Nr.: 3333333333"), //
hasAmount("EUR", 3.48), hasGrossValue("EUR", 3.51), //
hasTaxes("EUR", 0.03), hasFees("EUR", 0.00))));

// check fee transaction
assertThat(results, hasItem(fee( //
hasDate("2023-05-25T00:00"), hasShares(0.385884), //
hasSource("FlatExDegiroVerkauf02.txt"), hasNote("Transaktion-Nr.: 3333333333"), //
hasSource("FlatExDegiroVerkauf02.txt"), //
hasNote("Transaktion-Nr.: 3333333333"), //
hasAmount("EUR", 5.90), hasGrossValue("EUR", 5.90), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
public void testFlatExDegiroVerkauf03()
{
FinTechGroupBankPDFExtractor extractor = new FinTechGroupBankPDFExtractor(new Client());

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

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

assertThat(errors, empty());
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 security
assertThat(results, hasItem(security( //
hasIsin("NL0000009538"), hasWkn("940602"), hasTicker(null), //
hasName("ROY.PHILIPS BR RG"), //
hasCurrencyCode("EUR"))));

// check buy sell transaction
assertThat(results, hasItem(sale( //
hasDate("2023-05-23T00:00"), hasShares(0.384510), //
hasSource("FlatExDegiroVerkauf03.txt"), //
hasNote("Spitzenregulierung in NL0000009538 | Transaktions-Nr. 3291805526"), //
hasAmount("EUR", 0.03), hasGrossValue("EUR", 0.03), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
public void testFlatExDegiroDividende01WithNegativeAmount()
{
Expand Down
@@ -0,0 +1,44 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.67.3
-----------------------------------------
flatexDEGIRO Bank AG
Kundenservice
Opernring 1 / Top 736
1010 Wien
Tel.: +43 - (0)720 518 777
Mail: info@flatex.at
flatexDEGIRO Bank AG - Opernring 1 / Top 736 - A-1010 Wien
0302402000003239365070
Herrn
Max Mustermann
Musterstrasse 123
1234 Musterhausen
ÖSTERREICH
Wien, 23.05.2023
Spitzenregulierung in NL0000009538
Kundennummer: 1111111
Kontonummer : 11111111111
Depotnummer : 11111111111
Inhaber : Max Mustermann
WKN ISIN Wertpapierbezeichnung Anzahl
940602 NL0000009538 ROY.PHILIPS BR RG 0,384510
Sehr geehrter Herr Mustermann,
Spitzenregulierung 0,03 EUR
Steuerpfl. Ertrag 0,00 EUR
Steuerbetrag** 0,00 EUR
Verrechnung über Ihr Konto: 111111111 Gutschrift 0,03 EUR
Transaktions-Nr. 3291805526
Die Gutschrift erfolgt unter Vorbehalt des Eingangs. Einwendungen müssen
unverzüglich nach Zugang erhoben werden. Die Unterlassung rechtzeitiger
Einwendungen gilt als Genehmigung.
Dieser Beleg ist keine Steuerbescheinigung. Kapitalerträge sind
einkommensteuerpflichtig. Diese Mitteilung ist maschinell erstellt und wird
nicht unterschrieben.
Für weitergehende Fragen wenden Sie sich bitte an Ihr flatex-Service-Team.
______________________________________________________________________________
Seite 1/1
flatexDEGIRO Bank AG Niederlassung Österreich | Aktiengesellschaft | Opernring 1 / Top 736 | 1010 Wien | Handelsgericht Wien | FN 334642 x | DVR 4000544 | UID ATU 65140956
Hauptniederlassung: flatexDEGIRO Bank AG | Omniturm | Große Gallusstr. 16-18 | 60312 Frankfurt am Main (Deutschland) | Amtsgericht Frankfurt am Main | HRB 105687
- Vorsitzender des Aufsichtsrats: Martin Korbmacher | Vorstand: Frank Niehage (Vorsitzender), Muhamad Said Chahrour (stellv. Vorsitzender),
Dr. Benon Janos, Dr. Matthias Heinrich, Steffen Jentsch, Stephan Simmang -
2000003239365070 0351302400000101
Expand Up @@ -652,71 +652,75 @@ else if (t.getPortfolioTransaction().getType().isLiquidation() && t.getPortfolio

private void addSellTransaction()
{
DocumentType type = new DocumentType("Spitzenregulierung .*[\\.,\\d+] [\\w]{3}");
DocumentType type = new DocumentType("Spitzenregulierung in [A-Z]{2}[A-Z0-9]{9}[0-9]", //
"Kontoauszug");
this.addDocumentTyp(type);

Transaction<BuySellEntry> pdfTransaction = new Transaction<>();
pdfTransaction.subject(() -> {
BuySellEntry entry = new BuySellEntry();
entry.setType(PortfolioTransaction.Type.SELL);
return entry;
});

Block firstRelevantLine = new Block("^Kundenservice:$");
Block firstRelevantLine = new Block("^Kundenservice(:)?$");
type.addBlock(firstRelevantLine);
firstRelevantLine.set(pdfTransaction);

pdfTransaction
// @formatter:off
// WKN ISIN Wertpapierbezeichnung Anzahl
// A12GS7 CA05156X1087 AURORA CANNABIS 0,500000
// Spitzenregulierung 5,86 EUR
// @formatter:on
.section("wkn", "isin", "name", "currency")
.find("WKN .*ISIN .*Wertpapierbezeichnung .*Anzahl.*")
.match("^(?<wkn>[A-Z0-9]{6}) ([\\s]+)?(?<isin>[A-Z]{2}[A-Z0-9]{9}[0-9]) ([\\s]+)?(?<name>.*) ([\\s]+)?[\\.,\\d]+.*$")
.match("^Spitzenregulierung .* [\\.,\\d]+ (?<currency>[\\w]{3}).*$")
.assign((t, v) -> t.setSecurity(getOrCreateSecurity(v)))
pdfTransaction //

// @formatter:off
// A12GS7 CA05156X1087 AURORA CANNABIS 0,500000
// @formatter:on
.section("shares")
.match("^[A-Z0-9]{6} ([\\s]+)?[A-Z]{2}[A-Z0-9]{9}[0-9] ([\\s]+)?.* ([\\s]+)?(?<shares>[\\.,\\d]+).*$")
.assign((t, v) -> t.setShares(asShares(v.get("shares"))))
.subject(() -> {
BuySellEntry portfolioTransaction = new BuySellEntry();
portfolioTransaction.setType(PortfolioTransaction.Type.SELL);
return portfolioTransaction;
})

// @formatter:off
// Frankfurt am Main, 22.06.2020
// @formatter:on
.section("date")
.match("^.*, ([\\s]+)?(?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$")
.assign((t, v) -> t.setDate(asDate(v.get("date"))))
// @formatter:off
// WKN ISIN Wertpapierbezeichnung Anzahl
// A12GS7 CA05156X1087 AURORA CANNABIS 0,500000
// Spitzenregulierung 5,86 EUR
// @formatter:on
.section("wkn", "isin", "name", "currency") //
.find("WKN .*ISIN .*Wertpapierbezeichnung .*Anzahl.*") //
.match("^(?<wkn>[A-Z0-9]{6})[\\s]{1,}(?<isin>[A-Z]{2}[A-Z0-9]{9}[0-9]) (?<name>.*)[\\s]{1,}[\\.,\\d]+.*$") //
.match("^Spitzenregulierung .* [\\.,\\d]+ (?<currency>[\\w]{3}).*$") //
.assign((t, v) -> t.setSecurity(getOrCreateSecurity(v)))

// @formatter:off
// Verrechnung über Ihr Konto: 1009999999 Gutschrift 5,86 EUR
// @formatter:on
.section("currency", "amount")
.match("^.* Gutschrift([\\s]+)? (?<amount>[\\.,\\d]+) (?<currency>[\\w]{3}).*$")
.assign((t, v) -> {
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
t.setAmount(asAmount(v.get("amount")));
})
// @formatter:off
// A12GS7 CA05156X1087 AURORA CANNABIS 0,500000
// @formatter:on
.section("shares") //
.match("^[A-Z0-9]{6}[\\s]{1,}[A-Z]{2}[A-Z0-9]{9}[0-9] .*[\\s]{1,}(?<shares>[\\.,\\d]+).*$") //
.assign((t, v) -> t.setShares(asShares(v.get("shares"))))

// @formatter:off
// Spitzenregulierung in CA05156X1087
// @formatter:on
.section("note")
.match("^(?<note>Spitzenregulierung in .*)$")
.assign((t, v) -> t.setNote(trim(v.get("note"))))
// @formatter:off
// Frankfurt am Main, 22.06.2020
// @formatter:on
.section("date") //
.match("^.*,[\\s]{1,}(?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*$") //
.assign((t, v) -> t.setDate(asDate(v.get("date"))))

.wrap((t, ctx) -> {
BuySellEntryItem item = new BuySellEntryItem(t);
// @formatter:off
// Verrechnung über Ihr Konto: 1009999999 Gutschrift 5,86 EUR
// @formatter:on
.section("currency", "amount") //
.match("^.* Gutschrift[\\s]{1,}(?<amount>[\\.,\\d]+) (?<currency>[\\w]{3}).*$") //
.assign((t, v) -> {
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
t.setAmount(asAmount(v.get("amount")));
})

if (ctx.getString(FAILURE) != null)
item.setFailureMessage(ctx.getString(FAILURE));
// @formatter:off
// Spitzenregulierung in CA05156X1087
// @formatter:on
.section("note") //
.match("^(?<note>Spitzenregulierung in .*)$") //
.assign((t, v) -> t.setNote(trim(v.get("note"))))

return item;
});
// @formatter:off
// Transaktions-Nr. 3291805526
// Transaktionsnummer: 921414163
// @formatter:on
.section("note").optional()//
.match("^.*(?<note>Transaktions\\-Nr\\.([:\\s]+)? [\\d]+).*$") //
.assign((t, v) -> t.setNote(concatenate(t.getNote(), replaceMultipleBlanks(v.get("note")), " | ")))

.wrap(BuySellEntryItem::new);

addTaxesSectionsTransaction(pdfTransaction, type);
addFeesSectionsTransaction(pdfTransaction, type);
Expand Down Expand Up @@ -2011,7 +2015,7 @@ private void addAdvanceTaxTransaction()

Transaction<AccountTransaction> pdfTransaction = new Transaction<>();

Block firstRelevantLine = new Block("^Kundenservice:$");
Block firstRelevantLine = new Block("^Kundenservice(:)?$");
type.addBlock(firstRelevantLine);
firstRelevantLine.set(pdfTransaction);

Expand Down