diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/comdirect/ComdirectPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/comdirect/ComdirectPDFExtractorTest.java index ae359f46cb..163f0b4d10 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/comdirect/ComdirectPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/comdirect/ComdirectPDFExtractorTest.java @@ -744,6 +744,101 @@ public void testWertpapierKauf14WithSecurityInEUR() assertThat(s, is(Status.OK_STATUS)); } + @Test + public void testWertpapierKauf15() + { + ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf15.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("NL0000687663")); + assertThat(security.getWkn(), is("A0LFB3")); + assertThat(security.getName(), is("AerCap Holdings N.V. Aandelen op naam EO -,01")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD)); + + // 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.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(720))); + assertThat(entry.getSource(), is("Kauf15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25847.07)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25759.28)))); + 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(62.90 + (27.90 / 1.120800))))); + + Unit grossValueUnit = entry.getPortfolioTransaction().getUnit(Unit.Type.GROSS_VALUE) + .orElseThrow(IllegalArgumentException::new); + assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(28870.99)))); + } + + @Test + public void testWertpapierKauf15WithSecurityInEUR() + { + Security security = new Security("AerCap Holdings N.V. Aandelen op naam EO -,01", CurrencyUnit.EUR); + security.setIsin("NL0000687663"); + security.setWkn("A0LFB3"); + + Client client = new Client(); + client.addSecurity(security); + + ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf15.txt"), errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, 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.BUY)); + assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); + + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-03-11T00:00"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(720))); + assertThat(entry.getSource(), is("Kauf15.txt")); + assertNull(entry.getNote()); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25847.07)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25759.28)))); + 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(62.90 + (27.90 / 1.120800))))); + + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Account account = new Account(); + account.setCurrencyCode(CurrencyUnit.EUR); + Status s = c.process(entry, account, entry.getPortfolio()); + assertThat(s, is(Status.OK_STATUS)); + } + @Test public void testWertpapierVerkauf01() { diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/comdirect/Kauf15.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/comdirect/Kauf15.txt new file mode 100644 index 0000000000..7b2e2c4d4c --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/comdirect/Kauf15.txt @@ -0,0 +1,215 @@ +PDFBox Version: 1.8.16 +----------------------------------------- +Ihren Auftrag haben wir gemäß unseren produktbezogenen +Geschäftsbedingungen "Trading" wie nachstehend ausgeführt. +Die Wertpapiere haben wir der Abrechnung entsprechend gebucht. +Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und +Vollständigkeit zu überprüfen und etwaige Einwendungen +25449 Quickborn unverzüglich zu erheben. + +Telefon : 04106-708 25 00 + + + + + 11111 010 +Depotnr.: 1111111 00 + BLZ: 111 111 11 +Vorname Nachname +und Frau Vorname Nachname +Straße 1 +11111 Stadt + + + + + +GESCHÄFTSABRECHNUNG VOM 12.03.2020 + +* +Wertpapierkauf +Geschäftsnummer : 11 111111 bis 11 111112 +Ordernummer : 000121111681 Rechnungsnummer : 511138111156DA65 +Geschäftstag : 11.03.2020 Ausführungsplatz : NEW YORK -NYSE- LISTED + (Kommissionsgeschäft) + +Wertpapier-Bezeichnung WPKNR/ISIN +AerCap Holdings N.V. A0LFB3 +Aandelen op naam EO -,01 NL0000687663 + + +Ihre Order wurde wie folgt ausgeführt: + +Handelszeit Nennwert Zum Kurs von Kurswert + 20:28 St. 100 USD 40,09 USD 4.009,00 + 20:28 St. 1 USD 40,09 USD 40,09 + 20:28 St. 100 USD 40,10 USD 4.010,00 + 20:28 St. 34 USD 40,10 USD 1.363,40 + 20:28 St. 100 USD 40,10 USD 4.010,00 + 20:28 St. 71 USD 40,10 USD 2.847,10 + 20:28 St. 1 USD 40,10 USD 40,10 + 20:28 St. 1 USD 40,10 USD 40,10 + 20:28 St. 100 USD 40,10 USD 4.010,00 + 20:28 St. 100 USD 40,10 USD 4.010,00 + 20:28 St. 11 USD 40,10 USD 441,10 + 20:28 St. 1 USD 40,10 USD 40,10 + 20:28 St. 100 USD 40,10 USD 4.010,00 +-------------------------------------------------------------------------------- + Summe St. 720 USD 40,098597 USD 28.870,99 +(ggf. gerundet) + Ausmachender Betrag USD 28.898,89 + Umrechn. zum Dev. kurs 1,120800 vom 12.03.2020 : EUR 25.784,17 +-------------------------------------------------------------------------------- +Eigene Entgelte + Gesamtprovision : EUR 62,90 +-------------------------------------------------------------------------------- +Fremde Kosten + Fremde Spesen : USD 27,90 +-------------------------------------------------------------------------------- + + +IBAN Valuta Zu Ihren Lasten vor Steuern +D11 1111 1111 1111 1111 11 EUR 13.03.2020 EUR 25.847,07 + +Verwahrungs-Art: WERTPAPIERRECHNUNG USA/KANADA +Ihre Wertpapier-Order wurde über das Online Banking erteilt. +Teilausführung Ihrer Order + + + +Informationen zur steuerlichen Behandlung dieses Geschäftsvorgangs und den auf +Ihrem Konto gebuchten Endbetrag finden Sie auf der separaten Steuermitteilung. + + + Fortsetzung auf Blatt 2 +A113 +DO15DD/16/04/2010 + Vorname Nachname +Depotnr.: 1111111 00 und Frau Vorname Nachname +BLZ: 111 111 11 Straße 11 Blatt: 02 +1111 Stadt +GESCHÄFTSABRECHNUNG VOM 12.03.2020 +Geschäftsnummer : 11 111111 bis 11 111112 +Ordernummer : 000111112681 Rechnungsnummer : 511111111411DA65 + +Bei Fragen geben Sie bitte die Ordernummer an. + +comdirect bank AG + +Diese Abrechnung wird von der Bank nicht unterschrieben +Die Leistung ist gemäß §4 Nr.8 UStG umsatzsteuerfrei. USt-Id-Nr.: DE 812 279 461 +* +A113 +DO15N/16/04/2010 +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +Kundennr. /BLZ Bezeichnung +1111111 Vorname Nachnam und Frau Vorname Nachname + + +111 111 11 Straße 1 1111 Stadt +abweichend wirtschaftlich Berechtigter + + ---- + c o m d i r e c t b a n k A G + +2 5 4 5 1 Q u i c k b o r n +0 1 0 1 1823 + +T e le f o n : 0 4 1 0 6 - 7 0 8 25 00 + H e r r n +Vornam D a t u m : 1 2 . 0 3 .2020 e N a c hname +u n d F r a u V o r n a m e Nachname D e p o t n u m m er: 1 1 1 1 1 1 1 00 + S t S r a ß e 1 1 1 1 1 1 1 1 +11111 Stadt R e f e r e n z - N u mmer: 1 1 1 1 1 1 1 1 1 110011Z + + + + +Steuerliche Behandlung: Wertpapierkauf Nr. 91111084 vom 11.03.2020 +Stk. 720 AERCAP HOLDINGS EO -,01 , WKN / ISIN: A0LFB3 / NL0000687663 +Z u Ih r e n L a s te n v o r S te u e r n: E U R -25.847,0 7 + + + + + + + + + S te u e rb e m e ss u n g s g r u n d la g e E U R 0 , 0 0 + + +K ap i ta le r tr a gs t e ue r E U R 0 , 0 0 +S ol id a ri tä t sz u s c hl a g E U R 0 , 0 0 +K irc h e n s te u e r E_ _U R_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0_ ,_ _0 0_ + ab g e f ü h rt e S t e u er n _E _U _R _ _ _ _ _ _ _ _ __ _ _ _ _0__,0_ _0 + + Zu Ih r e n L a s te n n a ch S te u e r n : E U R -25.847,0 7 + + + + + +Die Belastung erfolgt mit Valuta 13.03.2020 auf Konto EUR mit der IBAN DE11 1111 1111 1111 1111 11 + + + + + + + + +KEINE STEUERBESCHEINIGUNG ... +Bisher einbehaltene bzw. angerechnete Steuer in EUR (4) +in 2020 einbehaltene einbehaltener einbehaltene angerechneteKapitalertragsteuer Solidaritätszuschlag Kirchensteuer ausländische Quellensteuer +vor Ermittlung + 839,08 46,02 + 75,41 173,49 +nach Ermittlung + 839,08 46,02 75,41 173,49 +Verrechnungssalden in EUR (4) +in 2020 Gewinne / Verluste sonstige anrechenbare verfügbareraus Aktien Gewinne / Verluste ausländische Quellensteuer Freistellungsauftrag +vor Ermittlung + -33.942,53 5.727,96 0,00 0,00 +nach Ermittlung + -33.942,53 5.727,96 + 0,00 0,00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +comdirect bank AG +Diese Abrechnung ist maschinell erstellt und wird nicht unterschrieben. + + + + + +(4) Die ausgewiesenen EUR-Beträge spiegeln den Stand zum Abrechnungszeitpunkt wider. +KEINE STEUERBESCHEINIGUNG \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ComdirectPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ComdirectPDFExtractor.java index a230d6b544..30df66fae2 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ComdirectPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ComdirectPDFExtractor.java @@ -204,6 +204,26 @@ private void addBuySellTransaction() checkAndSetGrossUnit(gross, fxGross, t, type); }) + // Summe St. 720 USD 40,098597 USD 28.870,99 + // Ausmachender Betrag USD 28.898,89 + // Umrechn. zum Dev. kurs 1,120800 vom 12.03.2020 : EUR 25.784,17 + .section("fxCurrency", "fxGross", "termCurrency", "exchangeRate", "baseCurrency", "currency").optional() + .match("^(([\\s]+)?Summe ([\\s]+)?)?St. ([\\s]+)?[\\.,\\d]+ ([\\s]+)?[\\w]{3} ([\\s]+)?[\\.,\\d]+ ([\\s]+)?(?[\\w]{3}) ([\\s]+)?(?[\\.,\\d]+).*$") + .match("^.* Ausmachender Betrag ([\\s]+)?(?[\\w]{3}) ([\\s]+)?[\\.,\\d]+.*$") + .match("^.* (Umrechn\\. zum Dev\\. kurs|Umrechnung zum Devisenkurs) (?[\\.,\\d]+).* : (?[\\w]{3}).*$") + .match("^.* [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} ([\\s]+)?(?[\\w]{3}) ([\\s]+)?[\\.,\\d]+.*$") + .assign((t, v) -> { + PDFExchangeRate rate = asExchangeRate(v); + type.getCurrentContext().putType(asExchangeRate(v)); + + Money fxGross = Money.of(asCurrencyCode(v.get("fxCurrency")), asAmount(v.get("fxGross"))); + Money gross = rate.convert(asCurrencyCode(v.get("currency")), fxGross); + + type.getCurrentContext().putType(asExchangeRate(v)); + + checkAndSetGrossUnit(gross, fxGross, t, type); + }) + // If the taxes are negative, this is a tax refund // transaction and we subtract this from the amount and // reset this. @@ -742,6 +762,7 @@ private void addTaxReturnBlock(DocumentType type) t.setCurrencyCode(asCurrencyCode(stripBlanksAndUnderscores(v.get("currency")))); }) + // Kurswert : USD 1.573,75 // Umrechn. zum Dev. kurs 1,222500 vom 16.12.2020 : EUR 1.275,95 // er s ta t te t e S t e ue r n E_ U_ R_ _ _ _ _ _ _ _ _ __ _ __ _10_,_8_ 4_ .section("termCurrency", "exchangeRate", "baseCurrency", "currency", "gross").optional()