diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/easybankag/EasyBankAGPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/easybankag/EasyBankAGPDFExtractorTest.java index b488ce7d77..e4750f711f 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/easybankag/EasyBankAGPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/easybankag/EasyBankAGPDFExtractorTest.java @@ -19,6 +19,7 @@ import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxRefund; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes; import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions; import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell; import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities; @@ -2831,6 +2832,37 @@ public void testDividende20WithSecurityInEUR() hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } + @Test + public void testSteuerkorrektur01() + { + EasyBankAGPDFExtractor extractor = new EasyBankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Steuerkorrektur01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("IE00B0M62Q58"), hasWkn(null), hasTicker(null), // + hasName("iShs-MSCI World UCITS ETF Registered Shares USD (Dist)oN"), // + hasCurrencyCode("EUR")))); + + // check taxes transaction + assertThat(results, hasItem(taxes( // + hasDate("2024-12-31T00:00"), hasShares(57.802), // + hasSource("Steuerkorrektur01.txt"), // + hasNote("Steuerkorrektur | 47346359-18.12.2024/Nr.1"), // + hasAmount("EUR", 1.76), hasGrossValue("EUR", 1.76), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + @Test public void testDepotauszug01() { diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/easybankag/Steuerkorrektur01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/easybankag/Steuerkorrektur01.txt new file mode 100644 index 0000000000..1efef7de9f --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/easybankag/Steuerkorrektur01.txt @@ -0,0 +1,68 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.73.0 +System: win32 | x86_64 | 21.0.5+11-LTS | Azul Systems, Inc. +----------------------------------------- +KsBOD +NzPfTOj bzOqqtYFc +BbRYegGUKnUXPJISHu 1 +0092 NzTo +NzTo, den 31.12.2024 +Wir haben für Sie am 31.12.2024 unten angeführtes Geschäft abgerechnet: +Depot: 99279-241-108 +Verlusttopf Nr.: 674459348557 +Geschäftsart: Steuerkorrektur - Abrechnung Verkauf 47346359-18.12.2024/Nr.1 +Abgang: Stk 57,802 +davon +KESt-Neubestand mit Anschaffungskosten: Stk 57,802 +Titel: IE00B0M62Q58 iShs-MSCI World UCITS ETF +Registered Shares USD (Dist)oN +Kurs: 77,284 EUR +Verwahrart: WR Wertpapierrechnung +Positionsdaten: Loco: Düsseldorf +Steuerkorrektur KESt aus Neubestand: -1,76 EUR +Zu Lasten IBAN oF94 4801 5892 6067 2199 Valuta 31.12.2024 -1,76 EUR +Handelsplatz: Lang & Schwarz +Eingang vorbehalten +Schlusstag/-zeit: 17.12.2024 17:46:53 +Kassatag: 19.12.2024 +Datum/Uhrzeit Auftragseingang: 17.12.2024 17.46.41 +Verwaltungsgesellschaft: iShares PLC +KESt-pflichtiges Wertpapier +Steuerrelevante Hinweise finden Sie auf der Rückseite. +Seite 1 von 2 +easybank Service Center | www.easybank.at | Wiedner Gürtel 11 | 1100 Wien +BAWAG P.S.K. Bank für Arbeit und Wirtschaft und Österreichische Postsparkasse Aktiengesellschaft | Handelsgericht Wien | FN 205340x +GEODRU02 WGEWTGSDR15ABREP2024123109861P31_a/113 +Korrigiertes Geschäft / Abrechnungsnummer 31861061 - 31.12.2024 : +Hinweis für KESt aus Neubestand mit Anschaffungskosten: +Steuerrelevanter Anschaffungswert: 4.017,71 EUR +Steuerrelevanter Veräußerungswert : 4.467,17 EUR +Steuerpflichtiger Kursgewinn: 449,46 EUR +Hinweis für den Verlustausgleichstopf: +Bisheriger Stand KESt aus Verlust: -87,14 EUR +KESt aus Verlust Storno: 123,60 EUR +Aktueller Stand KESt bezahlt: 36,46 EUR +Gutschrift aus Verlustausgleich: 87,14 EUR +Die Steuerdaten zum korrigierten Geschäft ersetzen die Steuerdaten zum ursprünglichen Geschäft. +Ursprüngliches Geschäft / Abrechnungsnummer 86501537 - 18.12.2024 /Nr. 1 : +Hinweis für KESt aus Neubestand mit Anschaffungskosten: +Steuerrelevanter Anschaffungswert: 4.024,12 EUR +Steuerrelevanter Veräußerungswert : 4.467,17 EUR +Steuerpflichtiger Kursgewinn: 443,05 EUR +Hinweis für den Verlustausgleichstopf: +Bisheriger Stand KESt aus Verlust: -145,65 EUR +KESt bezahlt: 121,84 EUR +Aktueller Stand KESt aus Verlust: -23,81 EUR +Gutschrift aus Verlustausgleich: 121,84 EUR +Eine allfällige KESt-Abfuhr erfolgt an das Finanzamt für Großbetriebe. +Die BAWAG erbringt keine Steuerberatung und übernimmt keine Haftung für eventuelle steuerliche +Nachteile im Zusammenhang mit Wertpapiertransaktionen und Wertpapierveranlagungen ihrer +Kunden. Die Besteuerung der Kapitaleinkünfte hängt von den persönlichen Verhältnissen des Anlegers +ab und kann künftigen Änderungen unterworfen sein. Vor einer Veranlagungsentscheidung sollten Sie +sich bei Ihrem Steuerberater über die damit verbundenen steuerlichen Konsequenzen und +Meldepflichten informieren. +Mit freundlichen Grüßen +Ihr easybank Service Center +Dieser Beleg wird von der Bank nicht unterfertigt. +Seite 2 von 2 +GEODRU02 WGEWTGSDR15ABREP2024123109861P31_a/114 \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/EasyBankAGPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/EasyBankAGPDFExtractor.java index 598eaed950..77ad5c3ee7 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/EasyBankAGPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/EasyBankAGPDFExtractor.java @@ -388,7 +388,7 @@ private void addDividendTransaction() private void addTaxesLostAdjustmentTransaction() { - final DocumentType type = new DocumentType("Gesch.ftsart: (Ertrag|Verkauf|Tilgung)"); + final DocumentType type = new DocumentType("Gesch.ftsart: (Steuerkorrektur|Ertrag|Verkauf|Tilgung)"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -542,21 +542,38 @@ private void addTaxesLostAdjustmentTransaction() .assign((t, v) -> t.setDateTime(asDate(v.get("date")))), // @formatter:off // Zu Gunsten IBAN AT11 1111 1111 1111 1111 Valuta 07.06.2022 478,50 EUR + // Zu Lasten IBAN oF94 4801 5892 6067 2199 Valuta 31.12.2024 -1,76 EUR // @formatter:on section -> section // .attributes("date") // - .match("^Zu Gunsten .* Valuta (?[\\d]{1,2}\\.[\\d]{1,2}\\.[\\d]{4}).*$") // + .match("^Zu (Gunsten|Lasten) .* Valuta (?[\\d]{1,2}\\.[\\d]{1,2}\\.[\\d]{4}).*$") // .assign((t, v) -> t.setDateTime(asDate(v.get("date"))))) - // @formatter:off - // Gutschrift aus Verlustausgleich: 2,36 EUR - // @formatter:on - .section("amount", "currency").optional() // - .match("^Gutschrift aus Verlustausgleich: (?[\\.,\\d]+) (?[\\w]{3}).*$") // - .assign((t, v) -> { - t.setAmount(asAmount(v.get("amount"))); - t.setCurrencyCode(asCurrencyCode(v.get("currency"))); - }) + .optionalOneOf( // + // @formatter:off + // Steuerkorrektur KESt aus Neubestand: -1,76 EUR + // Zu Lasten IBAN oF94 4801 5892 6067 2199 Valuta 31.12.2024 -1,76 EUR + // @formatter:on + section -> section // + .attributes("amount", "currency") // + .find("Steuerkorrektur KESt aus Neubestand: \\-[\\.,\\d]+ [\\w]{3}.*$") // + .match("^Zu Lasten .* \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") // + .assign((t, v) -> { + t.setType(AccountTransaction.Type.TAXES); + + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + }), + // @formatter:off + // Gutschrift aus Verlustausgleich: 2,36 EUR + // @formatter:on + section -> section // + .attributes("amount", "currency") // + .match("^Gutschrift aus Verlustausgleich: (?[\\.,\\d]+) (?[\\w]{3}).*$") // + .assign((t, v) -> { + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + })) .optionalOneOf( // // @formatter:off @@ -580,6 +597,20 @@ private void addTaxesLostAdjustmentTransaction() checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); })) + // @formatter:off + // Geschäftsart: Steuerkorrektur - Abrechnung Verkauf 47346359-18.12.2024/Nr.1 + // @formatter:on + .section("note").optional() // + .match("^.*(?Steuerkorrektur).*$") // + .assign((t, v) -> t.setNote(v.get("note"))) + + // @formatter:off + // Geschäftsart: Steuerkorrektur - Abrechnung Verkauf 47346359-18.12.2024/Nr.1 + // @formatter:on + .section("note").optional() // + .match("^.*Abrechnung Verkauf(?.*).*$") // + .assign((t, v) -> t.setNote(concatenate(t.getNote(), trim(v.get("note")), " | "))) + .wrap(t -> { if (t.getCurrencyCode() != null && t.getAmount() != 0) return new TransactionItem(t);