From ccd521eb8a6f5fd9ea3e8ecf2ebba819414d0705 Mon Sep 17 00:00:00 2001 From: Alexander Ott <45203494+Nirus2000@users.noreply.github.com> Date: Sat, 2 Nov 2024 08:19:49 +0100 Subject: [PATCH] Add new Audi Bank PDF-Importer (#4324) https://forum.portfolio-performance.info/t/pdf-import-von-audi-bank/30187/4 --- .../audibank/AudiBankPDFExtractorTest.java | 64 +++++++++++++ .../pdf/audibank/Kontoauszug01.txt | 36 ++++++++ .../pdf/AudiBankPDFExtractor.java | 91 +++++++++++++++++++ .../datatransfer/pdf/PDFImportAssistant.java | 1 + 4 files changed, 192 insertions(+) create mode 100644 name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/AudiBankPDFExtractorTest.java create mode 100644 name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/Kontoauszug01.txt create mode 100644 name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/AudiBankPDFExtractor.java diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/AudiBankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/AudiBankPDFExtractorTest.java new file mode 100644 index 0000000000..b1ca0fec4f --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/AudiBankPDFExtractorTest.java @@ -0,0 +1,64 @@ +package name.abuchen.portfolio.datatransfer.pdf.audibank; + +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasNote; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasSource; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.interest; +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; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.collection.IsEmptyCollection.empty; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import name.abuchen.portfolio.datatransfer.Extractor.Item; +import name.abuchen.portfolio.datatransfer.actions.AssertImportActions; +import name.abuchen.portfolio.datatransfer.pdf.AudiBankPDFExtractor; +import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; +import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.money.CurrencyUnit; + +@SuppressWarnings("nls") +public class AudiBankPDFExtractorTest +{ + @Test + public void testKontoauszug01() + { + AudiBankPDFExtractor extractor = new AudiBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(4L)); + assertThat(results.size(), is(4)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // assert transaction + assertThat(results, hasItem(interest(hasDate("2021-12-25"), hasAmount("EUR", 0.83), // + hasSource("Kontoauszug01.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(taxes(hasDate("2021-12-25"), hasAmount("EUR", 0.01), // + hasSource("Kontoauszug01.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(taxes(hasDate("2021-12-25"), hasAmount("EUR", 0.01), // + hasSource("Kontoauszug01.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(taxes(hasDate("2021-12-25"), hasAmount("EUR", 0.20), // + hasSource("Kontoauszug01.txt"), hasNote(null)))); + } +} diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/Kontoauszug01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/Kontoauszug01.txt new file mode 100644 index 0000000000..e4f04e8ad8 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/audibank/Kontoauszug01.txt @@ -0,0 +1,36 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.71.2 +----------------------------------------- +Audi Bank · 38093 Braunschweig +VdmFnXH deSiV +asddsfsf 243 +13913 xVwIXDvEE Th QfnbVl +Kontoauszug / Saldenmitteilung Plus Konto online.pur +Kontonummer: 3363081904 Erstellungsdatum: 26.12.2021 +Kontobezeichnung: YrRBg oHyEpik Kontoauszug Nummer: 000003 / 2021 +Bankleitzahl: 27020001 Seite: 1 / 1 +BIC: AUDFDE21XXX letzter Auszug vom: 25.11.2021 +IBAN: DE57270200013363081904 Ihr Ansprechpartner: Team Anlageberatung +Telefon-Durchwahl: 0531 212-859601 +Alter Kontostand in EUR: 1.001,29 +lfd. Buchungs- Umsatzinformationen Wertstellung Soll (EUR) Haben (EUR) +Nr. datum +Rechnungsabschluss 25.12.2021 +1 23.12.2021 Habenzinsen 25.12.2021 0,83 +2 23.12.2021 Solidaritätszuschlag 25.12.2021 -0,01 +3 23.12.2021 Kirchensteuer 25.12.2021 -0,01 +4 23.12.2021 Abgeltungsteuer 25.12.2021 -0,20 +Neuer Kontostand in EUR: 1.001,90 +Freistellungs- NV Gültig bis Gesamt- Verbleibender Abgeltungsteuer/ Solidaritäts- Kirchen- Kirchensteuer- +auftrag zinserträge Freibetrag Kapitalertragsteuer zuschlag steuer Betrag +EUR 0,00 Nein 00.00.0000 EUR 2,02 EUR 0,00 EUR 0,49 EUR 0,02 8,00 % EUR 0,02 +Ihre Freistellungsdaten vom 23.12.2021 +Genehmigung des Rechnungsabschlusses +Einwendungen wegen Unrichtigkeit oder Unvollständigkeit des Rechnungsabschlusses müssen Sie spätestens vor Ablauf von sechs Wochen nach +dessen Zugang erheben. Sofern Sie Ihre Einwendungen schriftlich oder - falls diese Form vereinbart ist - in Textform geltend machen, genügt die +Absendung innerhalb der Sechs-Wochen-Frist. Sie können Ihre Einwendungen an die interne Revision der Volkswagen Bank GmbH, +Gifhorner Str. 57, 38 112 Braunschweig, richten. Das Unterlassen rechtzeitiger Einwendungen gilt als Genehmigung des Rechnungsabschlusses. +Bitte beachten Sie, dass Zinserträge einkommensteuerpflichtig sind. +Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetzes entschädigungsfähig. Nähere Informationen können dem "Informationsbogen für den Einleger" entnommen werden. +206500 +A // B // M \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/AudiBankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/AudiBankPDFExtractor.java new file mode 100644 index 0000000000..e7f1d95ea4 --- /dev/null +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/AudiBankPDFExtractor.java @@ -0,0 +1,91 @@ +package name.abuchen.portfolio.datatransfer.pdf; + +import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block; +import name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType; +import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction; +import name.abuchen.portfolio.model.AccountTransaction; +import name.abuchen.portfolio.model.Client; + +@SuppressWarnings("nls") +public class AudiBankPDFExtractor extends AbstractPDFExtractor +{ + public AudiBankPDFExtractor(Client client) + { + super(client); + + addBankIdentifier("Audi Bank"); + + addAccountStatementTransaction(); + } + + @Override + public String getLabel() + { + return "Audi Bank"; + } + + + private void addAccountStatementTransaction() + { + final DocumentType type = new DocumentType("Kontoauszug / Saldenmitteilung", // + documentContext -> documentContext // + // @formatter:off + // Alter Kontostand in EUR: 1.001,29 + // @formatter:on + .section("currency") // + .match("^Alter Kontostand in (?[\\w]{3}):.*$") // + .assign((ctx, v) -> ctx.put("currency", asCurrencyCode(v.get("currency"))))); + + this.addDocumentTyp(type); + + // @formatter:off + // 1 23.12.2021 Habenzinsen 25.12.2021 0,83 + // @formatter:on + Block interestBlock = new Block("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} Habenzinsen [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} [\\.,\\d]+$"); + type.addBlock(interestBlock); + interestBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.INTEREST); + return accountTransaction; + }) + + .section("date", "amount") // + .documentContext("currency") // + .match("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} Habenzinsen (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) (?[\\.,\\d]+)$") + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(v.get("currency")); + }) + + .wrap(TransactionItem::new)); + + // @formatter:off + // 2 23.12.2021 Solidaritätszuschlag 25.12.2021 -0,01 + // 3 23.12.2021 Kirchensteuer 25.12.2021 -0,01 + // 4 23.12.2021 Abgeltungsteuer 25.12.2021 -0,20 + // @formatter:on + Block taxesBlock = new Block("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (Solidarit.tszuschlag|Kirchensteuer|Abgeltungsteuer) [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} \\-[\\.,\\d]+$"); + type.addBlock(taxesBlock); + taxesBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.TAXES); + return accountTransaction; + }) + + .section("date", "amount") // + .documentContext("currency") // + .match("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (Solidarit.tszuschlag|Kirchensteuer|Abgeltungsteuer) (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) \\-(?[\\.,\\d]+)$") // + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(v.get("currency")); + }) + + .wrap(TransactionItem::new)); + } +} diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/PDFImportAssistant.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/PDFImportAssistant.java index 274bd5a2e1..5333f291a9 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/PDFImportAssistant.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/PDFImportAssistant.java @@ -33,6 +33,7 @@ public PDFImportAssistant(Client client, List files) extractors.add(new AJBellSecuritiesLimitedPDFExtractor(client)); extractors.add(new AkfBankPDFExtractor(client)); extractors.add(new ArkeaDirectBankPDFExtractor(client)); + extractors.add(new AudiBankPDFExtractor(client)); extractors.add(new AlpacCapitalPDFExtractor(client)); extractors.add(new AvivaPLCPDFExtractor(client)); extractors.add(new BaaderBankPDFExtractor(client));