diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/Dividende05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/Dividende05.txt new file mode 100644 index 0000000000..d38232ec6c --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/Dividende05.txt @@ -0,0 +1,82 @@ +PDFBox Version: 1.8.16 +Portfolio Performance Version: 0.60.2 +----------------------------------------- + da + + +Bank Direkt +der Raiffeisenlandesbank OÖ (BLZ: 34000) +Europaplatz 1a b +4020 Linz + + +a +a +Abrechnung Ereignis a +47467310 - 18.01.2023 a +Depotnummer: 12.345.678 +Herrn Max Mustermann +Max Mustermann +Hauptstrasse 123 230/475 +7890 Kufstein Bank Direkt +Wir haben für Sie am 18.01.2023 unten angeführtes Geschäft abgerechnet: +Geschäftsart: Ertrag +221 Stk +Titel: DE000A0D8Q49 iSh.DJ U.S.Select Div.U.ETF DE +Inhaber-Anteile +Fondsgesellschaft: BlackRock Asset Management Deutschl +and AG (KVG) +Ertrag: 0,540118 USD +Verwahrart: WR +Positionsdaten: Loco: Frankfurt am Main +Bruttoertrag: 119,37 USD +KESt ausländische Dividende: -0,64 USD +118,73 USD +Devisenkurs: 1,0856 (13.01.2023) 109,37 EUR +KESt: -10,00 EUR +Inkassogebühr: -1,45 EUR +Umsatzsteuer: -0,29 EUR +Zu Gunsten IBAN AT44 3400 0000 0123 456 97,63 EUR +Valuta 17.01.2023 +Es wurde Umsatzsteuer in der Höhe von 20% berücksichtigt. +Bemessungsgrundlage USt: -1,45 EUR +Umsatzsteuer: -0,29 EUR +KESt wird mit dem Finanzamt für Großbetriebe abgerechnet. +KESt pro Fondsanteil 0,045228 EUR für Neubestand +Auslands-KESt pro Fondsanteil 0,002671 EUR für Neubestand +Extag: 17.01.2023 +18.01.2023 1 / 2 +BIC: RZOOAT2L, Landesgericht Linz, FN 247579m, UID: ATU57834268 +Dieser Beleg wurde durch die Raiffeisenlandesbank Oberösterreich erstellt. +Ohne Unterschrift. Bitte geben Sie Unstimmigkeiten sofort bekannt. +Bank Direkt +der Raiffeisenlandesbank OÖ (BLZ: 34000) +Europaplatz 1a b +4020 Linz +a +a +Abrechnung Ereignis a +47467310 - 18.01.2023 a +Depotnummer: 12.345.678 +Max Mustermann +230/475 +Bank Direkt +Ausgangssituation: +KESt-Neubestand mit Anschaffungskosten nach dem gleitenden +Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG 221 Stk +steuerlicher Anschaffungswert: 14.342,52 EUR +KESt-Neubestand mit Anschaffungskosten nach dem gleitenden +Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG 221 Stk +ausschüttungsgleicher Ertrag: 39,59 EUR +Anschaffungswertreduzierender Betrag: 110,46 EUR +steuerlicher Anschaffungswert: 14.342,52 EUR +Bestand nach Buchung: +KESt-Neubestand mit Anschaffungskosten nach dem gleitenden +Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG 221 Stk +steuerlicher Anschaffungswert: 14.271,65 EUR +Steuerl. Behandlung vorbehaltlich Beurteilung durch BMF + Für ein Veranlagungsgespräch stehen wir Ihnen gerne zur Verfügung. +18.01.2023 2 / 2 +BIC: RZOOAT2L, Landesgericht Linz, FN 247579m, UID: ATU57834268 +Dieser Beleg wurde durch die Raiffeisenlandesbank Oberösterreich erstellt. +Ohne Unterschrift. Bitte geben Sie Unstimmigkeiten sofort bekannt. \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/Dividende06.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/Dividende06.txt new file mode 100644 index 0000000000..477c5b5bc4 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/Dividende06.txt @@ -0,0 +1,72 @@ +PDFBox Version: 1.8.16 +Portfolio Performance Version: 0.60.2 +----------------------------------------- + da + + +Bank Direkt +der Raiffeisenlandesbank OÖ (BLZ: 34000) +Europaplatz 1a b +4020 Linz + + +a +a +Abrechnung Ereignis a +42008422 - 09.01.2023 a +Depotnummer: 12.345.678 +Herrn Max Mustermann +Max Mustermann +Hauptstraße 123 230/475 +9876 Kufstein Bank Direkt +Wir haben für Sie am 09.01.2023 unten angeführtes Geschäft abgerechnet: +Geschäftsart: Ertrag +70 Stk +Titel: DE0007664039 VOLKSWAGEN AG +VORZUGSAKTIEN O.ST. O.N. +Dividende: 19,06 EUR +Verwahrart: WR +Positionsdaten: Loco: Frankfurt am Main +Bruttoertrag: 1.334,20 EUR +Quellensteuer: -351,90 EUR +KESt ausländische Dividende: -166,78 EUR +Inkassogebühr: -1,45 EUR +Umsatzsteuer: -0,29 EUR +Zu Gunsten IBAN AT44 3400 0000 0123 4567 813,78 EUR +Valuta 09.01.2023 +Es wurde Umsatzsteuer in der Höhe von 20% berücksichtigt. +Bemessungsgrundlage USt: -1,45 EUR +Umsatzsteuer: -0,29 EUR +KESt wird mit dem Finanzamt für Großbetriebe abgerechnet. +Quellensteuer: 26,375% +Extag: 19.12.2022 +Record-Tag: 20.12.2022 +09.01.2023 1 / 2 +BIC: RZOOAT2L, Landesgericht Linz, FN 247579m, UID: ATU57834268 +Dieser Beleg wurde durch die Raiffeisenlandesbank Oberösterreich erstellt. +Ohne Unterschrift. Bitte geben Sie Unstimmigkeiten sofort bekannt. +Bank Direkt +der Raiffeisenlandesbank OÖ (BLZ: 34000) +Europaplatz 1a b +4020 Linz +a +a +Abrechnung Ereignis a +42008422 - 09.01.2023 a +Depotnummer: 12.345.678 +Max Mustermann +230/475 +Bank Direkt +Ausgangssituation: +KESt-Neubestand mit Anschaffungskosten nach dem gleitenden +Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG 70 Stk +steuerlicher Anschaffungswert: 9.996,00 EUR +KESt-Neubestand mit Anschaffungskosten nach dem gleitenden +Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG 70 Stk +Ertrag: 1.334,20 EUR +Steuerl. Behandlung vorbehaltlich Beurteilung durch BMF + Für ein Veranlagungsgespräch stehen wir Ihnen gerne zur Verfügung. +09.01.2023 2 / 2 +BIC: RZOOAT2L, Landesgericht Linz, FN 247579m, UID: ATU57834268 +Dieser Beleg wurde durch die Raiffeisenlandesbank Oberösterreich erstellt. +Ohne Unterschrift. Bitte geben Sie Unstimmigkeiten sofort bekannt. \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/raiffeisenbankgruppePDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/raiffeisenbankgruppePDFExtractorTest.java index c057545913..48a656a1e9 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/raiffeisenbankgruppePDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/raiffeisenbankgruppe/raiffeisenbankgruppePDFExtractorTest.java @@ -693,6 +693,136 @@ public void testDividende04WithSecurityInEUR() assertThat(s, is(Status.OK_STATUS)); } + @Test + public void testDividende05() + { + RaiffeisenBankgruppePDFExtractor extractor = new RaiffeisenBankgruppePDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende05.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("DE000A0D8Q49")); + assertThat(security.getName(), is("iSh.DJ U.S.Select Div.U.ETF DE Inhaber-Anteile")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD)); + + // check dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-01-17T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(221))); + assertThat(transaction.getSource(), is("Dividende05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(97.63)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(109.96)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00 + 0.29 + (0.64 / 1.0856))))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.45)))); + + Unit grossValueUnit = transaction.getUnit(Unit.Type.GROSS_VALUE).orElseThrow(IllegalArgumentException::new); + assertThat(grossValueUnit.getForex(), is(Money.of(CurrencyUnit.USD, Values.Amount.factorize(119.37)))); + } + + @Test + public void testDividende05WithSecurityInEUR() + { + Security security = new Security("iSh.DJ U.S.Select Div.U.ETF DE Inhaber-Anteile", CurrencyUnit.EUR); + security.setIsin("DE000A0D8Q49"); + + Client client = new Client(); + client.addSecurity(security); + + RaiffeisenBankgruppePDFExtractor extractor = new RaiffeisenBankgruppePDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende05.txt"), errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(1)); + + // check dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-01-17T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(221))); + assertThat(transaction.getSource(), is("Dividende05.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(97.63)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(109.96)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00 + 0.29 + (0.64 / 1.0856))))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.45)))); + + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Account account = new Account(); + account.setCurrencyCode(CurrencyUnit.EUR); + Status s = c.process(transaction, account); + assertThat(s, is(Status.OK_STATUS)); + } + + @Test + public void testDividende06() + { + RaiffeisenBankgruppePDFExtractor extractor = new RaiffeisenBankgruppePDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende06.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("DE0007664039")); + assertThat(security.getName(), is("VOLKSWAGEN AG VORZUGSAKTIEN O.ST. O.N.")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check dividends transaction + AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) + .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); + + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-01-09T00:00"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(70))); + assertThat(transaction.getSource(), is("Dividende06.txt")); + assertNull(transaction.getNote()); + + assertThat(transaction.getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(813.78)))); + assertThat(transaction.getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1334.20)))); + assertThat(transaction.getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(351.90 + 166.78 + 0.29)))); + assertThat(transaction.getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.45)))); + } + @Test public void testKontoauszug01() { diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/RaiffeisenBankgruppePDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/RaiffeisenBankgruppePDFExtractor.java index 16ef3d1bb7..9628da8fdf 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/RaiffeisenBankgruppePDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/RaiffeisenBankgruppePDFExtractor.java @@ -69,9 +69,9 @@ private void addBuySellTransaction() // Namens-Aktien o.N. // Kurs: 53,47 EUR .section("isin", "name", "name1", "currency").optional() - .match("^Titel: (?[\\w]{12}) (?.*)$") + .match("^Titel: (?[A-Z]{2}[A-Z0-9]{9}[0-9]) (?.*)$") .match("^(?.*)$") - .match("^Kurs: ([\\.,\\d]+) (?[\\w]{3})$") + .match("^Kurs: [\\.,\\d]+ (?[\\w]{3})$") .assign((t, v) -> { if (!v.get("name1").startsWith("Kurs:") || !v.get("name1").startsWith("Fondsgesellschaft:")) v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); @@ -83,7 +83,7 @@ private void addBuySellTransaction() // REGISTERED SHARES DL -,0001 // Ausführungskurs 143,68 EUR Auftragserteilung/ -ort Online-Banking .section("name", "isin", "wkn", "name1", "currency").optional() - .match("^St.ck [\\.,\\d]+ (?.*) (?[\\w]{12}) \\((?.*)\\)$") + .match("^St.ck [\\.,\\d]+ (?.*) (?[A-Z]{2}[A-Z0-9]{9}[0-9]) \\((?[A-Z0-9]{6})\\)$") .match("^(?.*)$") .match("^Ausf.hrungskurs [\\.,\\d]+ (?[\\w]{3}) .*$") .assign((t, v) -> { @@ -104,7 +104,7 @@ private void addBuySellTransaction() // Stück 100 QUALCOMM INC. US7475251036 (883121) section -> section .attributes("shares") - .match("^St.ck (?[\\.,\\d]+) .* [\\w]{12} \\(.*\\)$") + .match("^St.ck (?[\\.,\\d]+) .* [A-Z]{2}[A-Z0-9]{9}[0-9] \\([A-Z0-9]{6}\\)$") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) ) @@ -171,11 +171,13 @@ private void addDividendeTransaction() // Namens-Aktien o.N. // Dividende: 2 EUR .section("isin", "name", "name1", "currency").optional() - .match("^Titel: (?[\\w]{12}) (?.*)$") + .match("^Titel: (?[A-Z]{2}[A-Z0-9]{9}[0-9]) (?.*)$") .match("^(?.*)$") - .match("^Dividende: [\\.,\\d]+ (?[\\w]{3})$") + .match("^(Dividende|Ertrag): [\\.,\\d]+ (?[\\w]{3})$") .assign((t, v) -> { - if (!v.get("name1").startsWith("Dividende:")) + if (!v.get("name1").startsWith("Dividende:") + || !v.get("name1").startsWith("Ertrag:") + || !v.get("name1").startsWith("Fondsgesellschaft:")) v.put("name", trim(v.get("name")) + " " + trim(v.get("name1"))); t.setSecurity(getOrCreateSecurity(v)); @@ -185,7 +187,7 @@ private void addDividendeTransaction() // REGISTERED SHARES DL -,0001 // Zahlbarkeitstag 16.12.2021 Dividende pro Stück 0,68 USD .section("name", "isin", "wkn", "name1", "currency").optional() - .match("^St.ck [\\.,\\d]+ (?.*) (?[\\w]{12}) \\((?.*)\\)$") + .match("^St.ck [\\.,\\d]+ (?.*) (?[A-Z]{2}[A-Z0-9]{9}[0-9]) \\((?[A-Z0-9]{6})\\)$") .match("^(?.*)$") .match("^Zahlbarkeitstag [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} Dividende pro St.ck [\\.,\\d]+ (?[\\w]{3})$") .assign((t, v) -> { @@ -232,19 +234,41 @@ private void addDividendeTransaction() t.setCurrencyCode(asCurrencyCode(v.get("currency"))); }) - // Devisenkurs EUR / USD 1,1360 - // Dividendengutschrift 68,00 USD 59,86+ EUR - .section("baseCurrency", "termCurrency", "exchangeRate", "fxGross", "fxCurrency", "gross", "currency").optional() - .match("^Devisenkurs (?[\\w]{3}) \\/ (?[\\w]{3}) ([\\s]+)?(?[\\.,\\d]+)$") - .match("^Dividendengutschrift (?[\\.,\\d]+) (?[\\w]{3}) (?[\\.,\\d]+)\\+ (?[\\w]{3})$") - .assign((t, v) -> { - type.getCurrentContext().putType(asExchangeRate(v)); + .optionalOneOf( + // Devisenkurs EUR / USD 1,1360 + // Dividendengutschrift 68,00 USD 59,86+ EUR + section -> section + .attributes("baseCurrency", "termCurrency", "exchangeRate", "fxGross", "fxCurrency", "gross", "currency") + .match("^Devisenkurs (?[\\w]{3}) \\/ (?[\\w]{3}) ([\\s]+)?(?[\\.,\\d]+)$") + .match("^Dividendengutschrift (?[\\.,\\d]+) (?[\\w]{3}) (?[\\.,\\d]+)\\+ (?[\\w]{3})$") + .assign((t, v) -> { + type.getCurrentContext().putType(asExchangeRate(v)); - Money gross = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("gross"))); - Money fxGross = Money.of(asCurrencyCode(v.get("fxCurrency")), asAmount(v.get("fxGross"))); + Money gross = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("gross"))); + Money fxGross = Money.of(asCurrencyCode(v.get("fxCurrency")), asAmount(v.get("fxGross"))); - checkAndSetGrossUnit(gross, fxGross, t, type); - }) + checkAndSetGrossUnit(gross, fxGross, t, type); + }) + , + // Bruttoertrag: 119,37 USD + // Devisenkurs: 1,0856 (13.01.2023) 109,37 EUR + section -> section + .attributes("fxGross", "fxCurrency", "exchangeRate", "currency") + .match("^Bruttoertrag: (?[\\.,\\d]+) (?[\\w]{3}).*$") + .match("^Devisenkurs: (?[\\.,\\d]+) \\([\\d]{2}\\.[\\d]{2}\\.[\\d]{4}\\) [\\.,\\d]+ (?[\\w]{3}).*$") + .assign((t, v) -> { + v.put("baseCurrency", asCurrencyCode(v.get("currency"))); + v.put("termCurrency", asCurrencyCode(v.get("fxCurrency"))); + + 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); + + checkAndSetGrossUnit(gross, fxGross, t, type); + }) + ) // Ex-Tag 01.12.2021 Art der Dividende Quartalsdividende .section("note").optional() @@ -281,16 +305,16 @@ private void addAccountStatementTransactions() }); this.addDocumentTyp(type); - Block depositremoval = new Block("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [S|H]$"); - type.addBlock(depositremoval); - Transaction pdfTransactionDepositRemoval = new Transaction() - .subject(() -> { - AccountTransaction entry = new AccountTransaction(); - entry.setType(AccountTransaction.Type.REMOVAL); - return entry; - }); + Block depositRemovalBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [S|H]$"); + type.addBlock(depositRemovalBlock); + depositRemovalBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.REMOVAL); + return entry; + }) - pdfTransactionDepositRemoval // Is type --> "H" change from DEPOSIT to REMOVAL .section("type").optional() .match("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [\\.,\\d]+ (?[S|H])$") @@ -299,6 +323,14 @@ private void addAccountStatementTransactions() t.setType(AccountTransaction.Type.DEPOSIT); }) + // 01.12. 01.12. BASISLASTSCHRIFT PN:931 42,13 S + // 01.12. 01.12. DAUERAUFTRAG PN:900 50,00 S + // 02.12. 03.12. EURO-UEBERWEISUNG PN:801 500,00 S + // 29.12. 29.12. Einnahmen PN:931 1.097,00 H + // 02.08. 02.08. Kartenzahlung girocard PN:931 10,00 S + // 30.08. 30.08. LOHN/GEHALT PN:931 1.200,00 H + // 27.08. 27.08. Auszahlung girocard PN:931 20,00 S + // 08.06. 08.06. Überweisung SEPA 4,00 S .section("day", "month", "amount", "note").optional() .match("^[\\d]{2}\\.[\\d]{2}\\. (?[\\d]{2})\\.(?[\\d]{2})\\. " + "(?i:" @@ -330,7 +362,7 @@ private void addAccountStatementTransactions() t.setCurrencyCode(context.get("currency")); t.setAmount(asAmount(v.get("amount"))); - + // Formatting some notes if ("LOHN/GEHALT".equals(v.get("note"))) v.put("note", "Lohn/Gehalt"); @@ -351,24 +383,21 @@ private void addAccountStatementTransactions() }) .wrap(t -> { - if (t.getAmount() > 0) + if (t.getCurrencyCode() != null && t.getAmount() != 0) return new TransactionItem(t); - else - return null; - }); + return null; + })); - depositremoval.set(pdfTransactionDepositRemoval); + Block interestBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [S|H]$"); + type.addBlock(interestBlock); + interestBlock.set(new Transaction() - Block interest = new Block("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [S|H]$"); - type.addBlock(interest); - Transaction pdfTransactionInterest = new Transaction() - .subject(() -> { - AccountTransaction entry = new AccountTransaction(); - entry.setType(AccountTransaction.Type.INTEREST); - return entry; - }); + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.INTEREST); + return entry; + }) - pdfTransactionInterest // Is type --> "S" change from INTEREST to INTEREST_CHARGE .section("type").optional() .match("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [.,\\d]+ (?[S|H])$") @@ -397,30 +426,28 @@ private void addAccountStatementTransactions() { t.setDateTime(asDate(v.get("day") + "." + v.get("month") + "." + context.get("year"))); } + t.setCurrencyCode(context.get("currency")); t.setAmount(asAmount(v.get("amount1")) + asAmount(v.get("amount2"))); t.setNote(v.get("note")); }) .wrap(t -> { - if (t.getAmount() > 0) + if (t.getCurrencyCode() != null && t.getAmount() != 0) return new TransactionItem(t); - else - return null; - }); + return null; + })); - interest.set(pdfTransactionInterest); + Block feesBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [S|H]$"); + type.addBlock(feesBlock); + feesBlock.set(new Transaction() - Block fees = new Block("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [S|H]$"); - type.addBlock(fees); - Transaction pdfTransactionFees = new Transaction() - .subject(() -> { - AccountTransaction entry = new AccountTransaction(); - entry.setType(AccountTransaction.Type.FEES); - return entry; - }); + .subject(() -> { + AccountTransaction entry = new AccountTransaction(); + entry.setType(AccountTransaction.Type.FEES); + return entry; + }) - pdfTransactionFees // Is type --> "H" change from FEES to FEES_REFUND .section("type").optional() .match("^[\\d]{2}\\.[\\d]{2}\\. [\\d]{2}\\.[\\d]{2}\\. .* [\\.,\\d]+ (?[S|H])$") @@ -455,6 +482,7 @@ private void addAccountStatementTransactions() { t.setDateTime(asDate(v.get("day") + "." + v.get("month") + "." + context.get("year"))); } + t.setCurrencyCode(context.get("currency")); t.setAmount(asAmount(v.get("amount1")) + asAmount(v.get("amount2")) + asAmount(v.get("amount3"))); t.setNote(v.get("note")); @@ -481,19 +509,17 @@ private void addAccountStatementTransactions() { t.setDateTime(asDate(v.get("day") + "." + v.get("month") + "." + context.get("year"))); } + t.setCurrencyCode(context.get("currency")); t.setAmount(asAmount(v.get("amount1")) + asAmount(v.get("amount2"))); t.setNote(v.get("note")); }) .wrap(t -> { - if (t.getAmount() > 0) + if (t.getCurrencyCode() != null && t.getAmount() != 0) return new TransactionItem(t); - else - return null; - }); - - fees.set(pdfTransactionFees); + return null; + })); } private > void addTaxesSectionsTransaction(T transaction, DocumentType type) @@ -524,6 +550,21 @@ private > void addTaxesSectionsTransaction(T transactio .match("^Auslands\\-KESt: \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") .assign((t, v) -> processTaxEntries(t, v, type)) + // KESt ausländische Dividende: -0,64 USD + .section("tax", "currency").optional() + .match("^KESt ausl.ndische Dividende: \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") + .assign((t, v) -> processTaxEntries(t, v, type)) + + // KESt: -10,00 EUR + .section("tax", "currency").optional() + .match("^KESt: \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") + .assign((t, v) -> processTaxEntries(t, v, type)) + + // Umsatzsteuer: -0,29 EUR + .section("tax", "currency").optional() + .match("^Umsatzsteuer: \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") + .assign((t, v) -> processTaxEntries(t, v, type)) + // Kursgewinn-KESt: -696,65 EUR .section("tax", "currency").optional() .match("^Kursgewinn\\-KESt: \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") @@ -576,6 +617,11 @@ private > void addFeesSectionsTransaction(T transaction // Orderleitgebühr: -3,00 EUR .section("fee", "currency").optional() .match("^Orderleitgeb.hr: \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") + .assign((t, v) -> processFeeEntries(t, v, type)) + + // Inkassogebühr: -1,45 EUR + .section("fee", "currency").optional() + .match("^Inkassogeb.hr: \\-(?[\\.,\\d]+) (?[\\w]{3}).*$") .assign((t, v) -> processFeeEntries(t, v, type)); } }