diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bawagag/BawagAgPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bawagag/BawagAgPDFExtractorTest.java new file mode 100644 index 0000000000..a52dd624b7 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bawagag/BawagAgPDFExtractorTest.java @@ -0,0 +1,57 @@ +package name.abuchen.portfolio.datatransfer.pdf.bawagag; + +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.deposit; +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.removal; +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.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +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.BawagAGPDFExtractor; +import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; +import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.money.CurrencyUnit; + +@SuppressWarnings("nls") +public class BawagAgPDFExtractorTest +{ + @Test + public void testKreditKontoauszug01() + { + BawagAGPDFExtractor extractor = new BawagAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "KreditKontoauszug01.txt"), + errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(2L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2025-02-07"), hasAmount("EUR", 38.32), // + hasSource("KreditKontoauszug01.txt"), hasNote("Per Lastschrift dankend erhalten")))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2025-01-22"), hasAmount("EUR", 52.99), // + hasSource("KreditKontoauszug01.txt"), hasNote("PAYPAL *DOCMORRIS 59BA 00000000000")))); + } +} diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bawagag/KreditKontoauszug01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bawagag/KreditKontoauszug01.txt new file mode 100644 index 0000000000..aefe2848ba --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bawagag/KreditKontoauszug01.txt @@ -0,0 +1,114 @@ +``` +PDFBox Version: 3.0.3 != 1.8.17 +Portfolio Performance Version: 0.74.1 +System: win32 | x86_64 | 21.0.5+11-LTS | Azul Systems, Inc. +----------------------------------------- +BAWAG AG Niederlassung Deutschland +Gasstraße 4 c +BAWAG AG Niederlassung Deutschland | 22792 Hamburg 22761 Hamburg +Vorname Nachname Produkt ID: 1234567890 +Straße 1 +12345 Ort +Kontoauszug zu Ihrer Barclays Kreditkarte vom 10. Februar 2025 +Abrechnungszeitraum: 11.01.2025 - 10.02.2025 Alter Saldo: EUR 71,64 - +Kontonummer: 1234567890 Neuer Saldo: EUR 86,31 - +IBAN: DE75 2013 0600 0000 0000 00 Kreditrahmen: EUR 4.000,00 +BIC: BARCDEHAXXX Offener Verfügungsrahmen: EUR 3.913,69 +Bitte beachten Sie: Aufgrund der letzten beiden EZB-Leitzinssenkungen senken wir wie in Ziffer 8 unserer AGB +vereinbart den Zinssatz um 0,50 Prozentpunkte ab Ihrer nächsten Abrechnungsperiode. Ihren neuen Zinssatz werden Sie +entsprechend in Ihrem März Kontoauszug unter der Sektion "Zinssätze" einsehen können. +Konto-Saldo und Rückzahlung +Bezeichnung/Individueller Verwendungszweck Neuer Saldo Rückzahlungsoptionen Nächste Zahlung +(EUR) (EUR) +Allgemeine Umsätze 52,99- 100,0 % 52,99 +Ratenkauf: Amazon Marketp... 17.11.24 33,32- 1 offene Raten 33,32 +Gesamt (EUR) 86,31- 86,31 +Wie mit Ihnen vereinbart, ziehen wir zum 10.03.2025 den Betrag in Höhe von EUR 86,31 von Ihrem Konto mit der IBAN +DE00 0000 0000 0000 0000 00 und BIC BICXXXXX ein. Dieser Betrag vermindert sich um vorab eingegangene +Einzahlungen auf Ihrem Konto bei uns. +Ihre Mandatsreferenz zu dieser Transaktion lautet P200000000000000, unsere Gläubiger-Identifikationsnummer ist +DE66ZZZ00002739613. +Ihre Rückzahlungsoptionen können Sie jederzeit per Barclays Privatkunden App oder im Online-Banking einsehen und +anpassen. + Seite 1 von 3 +BAWAG AG Niederlassung Deutschland | Gasstraße 4 c | 22761 Hamburg | Amtsgericht Hamburg HRB 188720 | Niederlassungsleiter: Tobias Grieß | UID: DE 338324415 | +Hauptniederlassung: BAWAG P.S.K. Bank für Arbeit und Wirtschaft und Österreichische Postspartasse Aktiengesellschaft, Wiedner Gürtel 11, 1100 Wien | Firmenbuchgericht: +Handelsgericht Wien | FB-Nummer: 205340x | Vorstand: Anas Abuzaakouk (CEO), Guido Jestädt, David O'Leary, Sat Shah, Enver Sirucic, Andrew Wise | Aufsichtsratvorsitzender: +Egbert Fleischer. +Umsatzübersicht +Beleg- Buchungs-/ Beschreibung Karte Betrag (EUR) +datum Valutadatum +Alter Saldo vom 10. Januar 2025 71,64- +Hauptkarte/n, Vorname Nachname +21.01.2025 22.01.2025 PAYPAL *DOCMORRIS 59BA 00000000000 NL Visa 52,99- +Sonstige Umsätze +07.02.2025 07.02.2025 Per Lastschrift dankend erhalten 38,32+ +P200000000000000 +DE66ZZZ00002739613 +Neuer Saldo am 10. Februar 2025 86,31- +Hauptkarte/n, Vorname Nachname +Umsätze Visa Karten-Nr. 123456XXXXXX7890 EUR 52,99 +Zinssätze +Allgemeine Umsätze +Allgemeine Umsätze sind alle Umsätze, für deren Rückzahlung Sie keinen Ratenkauf eingerichtet haben. Für diese +allgemeinen Umsätze gelten folgende Sollzinssätze: +Sollzinsen bei Einkäufen und Überweisungen (einschl. möglicher Gebühren) 20,64 % p.a. +Sollzinsen bei Barabhebungen (einschl. möglicher Gebühren) 20,64 % p.a. +Sofern Sie alle allgemeinen Umsätze bis zum 10.03.2025 vollständig zurückgezahlt haben, fallen die oben genannten +Zinsen nicht an. Bei Teilzahlung werden Zinsen taggenau ab dem Buchungs-/Valutadatum berechnet. +Ratenkäufe +Für Ihre nachfolgend aufgeführten Ratenkäufe gelten ab Einrichtung bis zur Auflösung oder Beendigung des jeweiligen +Ratenkaufs folgende Sollzinssätze: +Ratenkauf: " SchuheLampen " - aufgelöst seit 10.12.2024 0,00 % p.a. +Ratenkauf: " HORNBACH 28.09.24 " - aufgelöst seit 10.12.2024 0,00 % p.a. +Ratenkauf: " Amazon Marketp... 17.11.24 " - aufgelöst seit 10.02.2025 0,00 % p.a. + Seite 2 von 3 +BAWAG AG Niederlassung Deutschland | Gasstraße 4 c | 22761 Hamburg | Amtsgericht Hamburg HRB 188720 | Niederlassungsleiter: Tobias Grieß | UID: DE 338324415 | +Hauptniederlassung: BAWAG P.S.K. Bank für Arbeit und Wirtschaft und Österreichische Postspartasse Aktiengesellschaft, Wiedner Gürtel 11, 1100 Wien | Firmenbuchgericht: +Handelsgericht Wien | FB-Nummer: 205340x | Vorstand: Anas Abuzaakouk (CEO), Guido Jestädt, David O'Leary, Sat Shah, Enver Sirucic, Andrew Wise | Aufsichtsratvorsitzender: +Egbert Fleischer. +Der Barclays Ratenkauf +Für einzelne Umsätze ab 95 Euro bieten wir Ihnen auch den Barclays Ratenkauf an. Diesen richten Sie ganz einfach per +App oder im Online-Banking zu einem vergünstigten Sollzinssatz ein. Die Gesamtkosten werden Ihnen vor der +Aktivierung transparent ausgewiesen. Bitte beachten Sie, dass Ihr Konto bei uns für die Nutzung eines Barclays +Ratenkaufs nicht im Zahlungsverzug sein darf. Mehr Infos unter: barclays.de/ratenkauf +Wichtige Hinweise +Reklamation +Bei Unstimmigkeiten Ihrer Umsätze nehmen Sie bitte direkt Kontakt zu Ihrem Händler auf. Wenn Sie keine Einigung +erzielen konnten, sind wir für Sie da und versuchen in Ihrem Namen eine Klärung herbeizuführen. +Informationen zum Reklamationsprozess finden Sie unter: barclays.de/hilfe-und-kontakt/reklamation +Reklamationen müssen innerhalb von 6 Wochen nach Zugang des Kontoauszuges an Barclays abgesendet werden. Wird +diese Frist nicht eingehalten, gelten die aufgeführten Umsätze als akzeptiert. +Betrug +Wenn Sie ungewöhnliche Bewegungen auf Ihrem Konto bemerken, die Sie nicht selbst getätigt haben, informieren Sie +uns umgehend über unsere 24h-Notfall-Hotline: +49 40 890 99-900 +Einlagensicherung +Guthaben auf Ihrem Konto sind als Einlagen nach Maßgabe des Einlagensicherungsgesetzes entschädigungsfähig. +Nähere Informationen finden Sie im "Informationsbogen für Einleger" unter: barclays.de/einlagensicherung +Karten-PIN Management +Mit der Barclays Privatkunden App und im Online-Banking können Sie Ihre Karten-PIN jederzeit sicher abrufen, ändern +und bei Bedarf entsperren. Damit die neue Karten-PIN nach einer Änderung aktiviert wird, muss zunächst immer ein +Umsatz an einem Online-Terminal getätigt werden, z. B. durch eine Bargeldabhebung an einem Geldautomaten. Bitte +beachten Sie dabei den Mindestbetrag von 50 € und das Tageslimit von 500 €. Bargeldabhebungen in Geschäften sind +mit der Barclays Kreditkarte nicht möglich. Mehr Details unter: barclays.de/karten-pin +Aktuelles +Zeit für ein wichtiges Update: Bitte prüfen Sie die Angaben zu Ihrer Lebenssituation und passen Sie diese bei Bedarf in +der Barclays Privatkunden App oder im Online-Banking an. +barclays.de/aktuelle-angaben + 1. In der App/ im Online-Banking auf "Einstellungen" klicken + 2. "Persönliche Daten" auswählen + 3. "Aktuelle Angaben" wählen +Die Barclays Privatkunden App - einfach, schnell und sicher +Mit der Barclays Privatkunden App können Sie mit wenigen Klicks Ihren Kontostand abrufen, Umsätze checken, +Kontoauszüge überprüfen und vieles mehr. Für einzelne Ausgaben oder die ganze Monatsrechnung ab 95 Euro können +Sie per App ganz einfach Ratenkäufe einrichten - sogar noch bis zu 8 Wochen nachträglich. Einfach Höhe der +Monatsrate auswählen, Namen vergeben, fertig. Mehr erfahren Sie unter: barclays.de/ratenkauf +Vielen Dank, dass Sie Ihre Barclays Kreditkarten eingesetzt haben! + Seite 3 von 3 +BAWAG AG Niederlassung Deutschland | Gasstraße 4 c | 22761 Hamburg | Amtsgericht Hamburg HRB 188720 | Niederlassungsleiter: Tobias Grieß | UID: DE 338324415 | +Hauptniederlassung: BAWAG P.S.K. Bank für Arbeit und Wirtschaft und Österreichische Postspartasse Aktiengesellschaft, Wiedner Gürtel 11, 1100 Wien | Firmenbuchgericht: +Handelsgericht Wien | FB-Nummer: 205340x | Vorstand: Anas Abuzaakouk (CEO), Guido Jestädt, David O'Leary, Sat Shah, Enver Sirucic, Andrew Wise | Aufsichtsratvorsitzender: +Egbert Fleischer. + + +``` \ No newline at end of file diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BawagAGPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BawagAGPDFExtractor.java new file mode 100644 index 0000000000..0583dc97dd --- /dev/null +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BawagAGPDFExtractor.java @@ -0,0 +1,136 @@ +package name.abuchen.portfolio.datatransfer.pdf; + +import static name.abuchen.portfolio.util.TextUtil.replaceMultipleBlanks; +import static name.abuchen.portfolio.util.TextUtil.trim; + +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; +import name.abuchen.portfolio.model.Transaction.Unit; +import name.abuchen.portfolio.money.Money; + +@SuppressWarnings("nls") +public class BawagAGPDFExtractor extends AbstractPDFExtractor +{ + public BawagAGPDFExtractor(Client client) + { + super(client); + + addBankIdentifier("BAWAG AG Niederlassung Deutschland"); + + addCreditcardStatementTransaction(); + } + + @Override + public String getLabel() + { + return "BAWAG AG"; + } + + private void addCreditcardStatementTransaction() + { + final DocumentType type = new DocumentType("Kontoauszug", // + documentContext -> documentContext // + // @formatter:off + // Beleg- Buchungs-/ Beschreibung Karte Betrag (EUR) + // Gebucht am Wertstellung am Verwendungszweck Betrag (EUR) + // @formatter:on + .section("currency") // + .match("^.* \\((?[A-Z]{3})\\)$") // + .assign((ctx, v) -> ctx.put("currency", asCurrencyCode(v.get("currency"))))); + + this.addDocumentTyp(type); + + // @formatter:off + // 23.12.2023 25.12.2023 Lidl sagt Danke Ort DE Visa B A 60,78- + // 23.12.2023 28.12.2023 Lidl sagt Danke Ort DE Visa B A 60,78+ + // @formatter:on + Block depositRemovalBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " + + "(?!(Abgeltungsteuer|Solidarit.tszuschlag)).* [\\.,\\d]+[\\-|\\+]$"); + type.addBlock(depositRemovalBlock); + depositRemovalBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.DEPOSIT); + return accountTransaction; + }) + + .section("date", "note", "amount", "type") // + .documentContext("currency") // + .match("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) " // + + "(?.{1,36})" // + + ".* " // + + "(?[\\.,\\d]+)" // + + "(?[\\-|\\+])$") // + .assign((t, v) -> { + // Is type --> "-" change from DEPOSIT to REMOVAL + if ("-".equals(v.get("type"))) + t.setType(AccountTransaction.Type.REMOVAL); + + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(v.get("currency")); + t.setNote(trim(replaceMultipleBlanks(v.get("note")))); + }) + + .wrap(TransactionItem::new)); + + Block interestBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} Habenzinsen [\\.,\\d]+$"); + type.addBlock(interestBlock); + interestBlock.setMaxSize(4); + interestBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.INTEREST); + return accountTransaction; + }) + + // @formatter:off + // 31.12.2023 31.12.2023 Habenzinsen 4,80 + // @formatter:on + .section("date", "amount") // + .documentContext("currency") // + .match("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} " // + + "(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) " // + + "Habenzinsen " // + + "(?[\\.,\\d]+)$") // + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(v.get("currency")); + }) + + // @formatter:off + // 31.12.2023 31.12.2023 Abgeltungsteuer -1,20 + // @formatter:on + .section("tax").optional() // + .documentContext("currency") // + .match("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} Abgeltungsteuer \\-(?[\\.,\\d]+)$") // + .assign((t, v) -> { + Money tax = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax"))); + + t.addUnit(new Unit(Unit.Type.TAX, tax)); + t.setMonetaryAmount(t.getMonetaryAmount().subtract(tax)); + }) + + // @formatter:off + // 31.12.2023 31.12.2023 Solidaritätszuschlag -0,06 + // @formatter:on + .section("tax").optional() // + .documentContext("currency") // + .match("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4} [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} Solidarit.tszuschlag \\-(?[\\.,\\d]+)$") // + .assign((t, v) -> { + Money tax = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax"))); + + t.addUnit(new Unit(Unit.Type.TAX, tax)); + t.setMonetaryAmount(t.getMonetaryAmount().subtract(tax)); + }) + + .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 96f874cfbf..15cb97fd50 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 @@ -42,6 +42,7 @@ public PDFImportAssistant(Client client, List files) extractors.add(new BankSLMPDFExtractor(client)); extractors.add(new BarclaysBankIrelandPLCPDFExtractor(client)); extractors.add(new BasellandschaftlicheKantonalbankPDFExtractor(client)); + extractors.add(new BawagAGPDFExtractor(client)); extractors.add(new BigbankPDFExtractor(client)); extractors.add(new BisonPDFExtractor(client)); extractors.add(new BondoraCapitalPDFExtractor(client));