diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/fintechgroupbank/FinTechGroupBankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/fintechgroupbank/FinTechGroupBankPDFExtractorTest.java index 69134293a8..f44477d975 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/fintechgroupbank/FinTechGroupBankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/fintechgroupbank/FinTechGroupBankPDFExtractorTest.java @@ -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 errors = new ArrayList<>(); + + List 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 = 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() { diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/fintechgroupbank/FinTechWertpapierAusgang05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/fintechgroupbank/FinTechWertpapierAusgang05.txt new file mode 100644 index 0000000000..79f2526b84 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/fintechgroupbank/FinTechWertpapierAusgang05.txt @@ -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 \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/FinTechGroupBankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/FinTechGroupBankPDFExtractor.java index fd2b25a86a..f4b142642a 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/FinTechGroupBankPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/FinTechGroupBankPDFExtractor.java @@ -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]+)?(?\\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]+)?(?\\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]+)?(?[.,\\d]+) (?[\\w]{3})(.*)$") + .match("^(.*) Geldgegenwert\\*.*([\\s]+)?: ([\\s]+)?(?[.,\\d]+) (?[\\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]+)?(?[.,\\d]+) (?[\\w]{3})$") .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); @@ -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]+)?-(?[.,\\d]+) [\\w]{3}$") + .assign((t, v) -> { + t.setAmount(t.getPortfolioTransaction().getAmount() - asAmount(v.get("taxRefund"))); + }) + .wrap(BuySellEntryItem::new); addTaxesSectionsTransaction(pdfTransaction, type); @@ -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]+)?(?\\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]+)?(?\\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() @@ -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]+)?-(?[.,\\d]+) (?[\\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);