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 "Gutschrifts-/Belastungsanzeige" format #2310

Merged
merged 1 commit into from Jul 10, 2021
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 @@ -1749,6 +1749,59 @@ public void testFinTechWertpapierAusgang04()
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
}

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

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

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

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

// check security
Security security = results.stream().filter(i -> i instanceof SecurityItem).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("CH0585795898"));
assertThat(security.getWkn(), is("UE5KPQ"));
assertThat(security.getName(), is("UBS LDN CALL21 SQ3"));
assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR));

// check buy sell transaction
BuySellEntry entry = (BuySellEntry) results.stream().filter(i -> i instanceof BuySellEntryItem)
.collect(Collectors.toList()).get(0).getSubject();

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

assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-06-25T00:00")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(400)));

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

// check tax-refund buy sell transaction
Optional<Item> item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
item = results.stream().filter(i -> i instanceof TransactionItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class));
AccountTransaction transaction = (AccountTransaction) item.get().getSubject();

assertThat(transaction.getType(), is(AccountTransaction.Type.TAX_REFUND));
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-06-25T00:00")));
assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(88.53))));
}

@Test
public void testFinTechWertpapierEingang01()
{
Expand Down
@@ -0,0 +1,57 @@
PDF Autor: ''
PDFBox Version: 1.8.16
-----------------------------------------
flatexDEGIRO Bank AG
Postfach 100551
41405 Neuss
USt-IdNr.: DE 246 786 363
Kundenservice:
Tel.: +49 (0)9221 - 7035898
E-Mail: kunden@flatex.de
flatexDEGIRO Bank AG - Rotfeder-Ring 7 - 60327 Frankfurt am Main
0302402000002035249970
Herrn
Vorname Nachname
Straße HsNr
12345 Ort
Frankfurt am Main, 26.06.2021
Gutschrifts- / Belastungsanzeige
Kundennummer: 1234567
Kontonummer : 1234567890
Depotnummer : 1234567890
Inhaber : Vorname Nachname
WKN ISIN Wertpapierbezeichnung Anzahl
UE5KPQ CH0585795898 UBS LDN CALL21 SQ3 400,00
Sehr geehrter Herr Nachname,
aufgrund - Ablauf der Optionsfrist - buchen wir folgenden Bestand aus Ihrem
Depot aus.
Stck./Nominale: 400,000000 Betrag/Stck. 0,76 EUR
Devisenkurs : 1,000000
Geldgegenwert 393,73 EUR
Einbeh. Steuer** -88,53 EUR
Steuerpfl. Ertrag 0,00 EUR
Kapitalertragsteuer -83,92 EUR
Kirchensteuer 0,00 EUR
Solidaritätszuschlag -4,61 EUR
Fälligkeitstag 25.06.2021
letzter Handel am 17.06.2021
Transaktions-Nr. 2383311818
* Verrechnung über Ihr Konto: 1234567890
Die Gutschrift erfolgt unter Vorbehalt des Eingangs. Einwendungen müssen
unverzüglich nach Zugang erhoben werden. Die Unterlassung rechtzeitiger
Einwendungen gilt als Genehmigung.
**Einbehaltene Kapitalertragsteuer zuzüglich Solidaritätszuschlag und ggf.
______________________________________________________________________________
Seite 1/2
BLZ 101 308 00 / BIC: BIWBDE33XXX - Aktiengesellschaft, Sitz Frankfurt - Amtsgericht Frankfurt am Main (HRB 105687)
Vorsitzender des Aufsichtsrats: Martin Korbmacher - Vorstand: Frank Niehage (Vorsitzender), Muhamad Said Chahrour, Dr. Benon Janos, Jörn Engelmann, Steffen Jentsch
2000002035249970 0113302400000101
Kirchensteuer (negative Werte bedeuten Steuererstattung). Evtl. Details dazu
finden Sie im Steuerreport unter der Transaktion-Nr.: 1234567890
Diese Mitteilung ist maschinell erstellt und wird nicht unterschrieben.
Für weitergehende Fragen wenden Sie sich bitte an Ihr flatex-Service-Team.
______________________________________________________________________________
Seite 2/2
BLZ 101 308 00 / BIC: BIWBDE33XXX - Aktiengesellschaft, Sitz Frankfurt - Amtsgericht Frankfurt am Main (HRB 105687)
Vorsitzender des Aufsichtsrats: Martin Korbmacher - Vorstand: Frank Niehage (Vorsitzender), Muhamad Said Chahrour, Dr. Benon Janos, Jörn Engelmann, Steffen Jentsch
2000002035249970
Expand Up @@ -893,14 +893,27 @@ private void addTransferOutTransaction()
})

// Fälligkeitstag : 02.12.2009 Letzter Handelstag: 20.11.2009
.section("date")
.section("date").optional()
.match("^F.lligkeitstag([\\s]+)?: ([\\s]+)?(?<date>\\d+.\\d+.\\d{4}).*$")
.assign((t, v) -> t.setDate(asDate(v.get("date"))))

// Fälligkeitstag 25.06.2021
.section("date").optional()
.match("^F.lligkeitstag ([\\s]+)?(?<date>\\d+.\\d+.\\d{4})$")
.assign((t, v) -> t.setDate(asDate(v.get("date"))))

// Verwahrart : GS-Verwahrung Geldgegenwert***: 0,20 EUR
// Geldgegenwert* : 111,22 EUR
.section("amount", "currency").optional()
.match("^(.*) Geldgegenwert\\*.*([\\s]+)?: ([\\s]+)?(?<amount>[.,\\d]+) (?<currency>[\\w]{3})(.*)$")
.match("^(.*) Geldgegenwert\\*.*([\\s]+)?: ([\\s]+)?(?<amount>[.,\\d]+) (?<currency>[\\w]{3})$")
.assign((t, v) -> {
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
t.setAmount(asAmount(v.get("amount")));
})

// Geldgegenwert 393,73 EUR
.section("amount", "currency").optional()
.match("^Geldgegenwert ([\\s]+)?(?<amount>[.,\\d]+) (?<currency>[\\w]{3})$")
.assign((t, v) -> {
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
t.setAmount(asAmount(v.get("amount")));
Expand Down Expand Up @@ -933,6 +946,13 @@ private void addTransferOutTransaction()
t.setAmount(t.getPortfolioTransaction().getAmount() - asAmount(v.get("taxRefund")));
})

// Einbeh. Steuer** -88,53 EUR
.section("taxRefund").optional()
.match("^Einbeh\\. Steuer\\*.* ([\\s]+)?-(?<taxRefund>[.,\\d]+) [\\w]{3}$")
.assign((t, v) -> {
t.setAmount(t.getPortfolioTransaction().getAmount() - asAmount(v.get("taxRefund")));
})

.wrap(BuySellEntryItem::new);

addTaxesSectionsTransaction(pdfTransaction, type);
Expand Down Expand Up @@ -1501,10 +1521,15 @@ private void addTransferInOutTaxReturnBlock(DocumentType type)

// Fälligkeitstag : 02.12.2009 Letzter Handelstag: 20.11.2009
// Datum : 24.11.2015
.section("date")
.section("date").optional()
.match("^(F.lligkeitstag|Datum)([\\s]+)?: ([\\s]+)?(?<date>\\d+.\\d+.\\d{4}).*$")
.assign((t, v) -> t.setDateTime(asDate(v.get("date"))))

// Fälligkeitstag 25.06.2021
.section("date").optional()
.match("^F.lligkeitstag ([\\s]+)?(?<date>\\d+.\\d+.\\d{4})$")
.assign((t, v) -> t.setDateTime(asDate(v.get("date"))))

// Stk./Nominale : 325,000000 Stk Einbeh. Steuer*: -382,12 EUR
// Einbeh. Steuer**: -10,00 EUR
.section("amount", "currency").optional()
Expand All @@ -1514,6 +1539,14 @@ private void addTransferInOutTaxReturnBlock(DocumentType type)
t.setAmount(asAmount(v.get("amount")));
})

// Einbeh. Steuer** -88,53 EUR
.section("amount", "currency").optional()
.match("^Einbeh\\. Steuer\\*.* ([\\s]+)?-(?<amount>[.,\\d]+) (?<currency>[\\w]{3})$")
.assign((t, v) -> {
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
t.setAmount(asAmount(v.get("amount")));
})

.wrap(t -> {
if (t.getCurrencyCode() != null && t.getAmount() != 0)
return new TransactionItem(t);
Expand Down