Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify Audi Bank PDF-Importer to support new transaction #4333

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,23 @@
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.removal;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.withFailureMessage;
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.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.Messages;
import name.abuchen.portfolio.datatransfer.Extractor.Item;
import name.abuchen.portfolio.datatransfer.actions.AssertImportActions;
import name.abuchen.portfolio.datatransfer.pdf.AudiBankPDFExtractor;
Expand Down Expand Up @@ -51,14 +54,63 @@ public void testKontoauszug01()

// assert transaction
assertThat(results, hasItem(taxes(hasDate("2021-12-25"), hasAmount("EUR", 0.01), //
hasSource("Kontoauszug01.txt"), hasNote(null))));
hasSource("Kontoauszug01.txt"), hasNote("Solidaritätszuschlag"))));

// assert transaction
assertThat(results, hasItem(taxes(hasDate("2021-12-25"), hasAmount("EUR", 0.01), //
hasSource("Kontoauszug01.txt"), hasNote(null))));
hasSource("Kontoauszug01.txt"), hasNote("Kirchensteuer"))));

// assert transaction
assertThat(results, hasItem(taxes(hasDate("2021-12-25"), hasAmount("EUR", 0.20), //
hasSource("Kontoauszug01.txt"), hasNote(null))));
hasSource("Kontoauszug01.txt"), hasNote("Abgeltungsteuer"))));
}

@Test
public void testKontoauszug02()
{
AudiBankPDFExtractor extractor = new AudiBankPDFExtractor(new Client());

List<Exception> errors = new ArrayList<>();

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug02.txt"), errors);

assertThat(errors, empty());
assertThat(countSecurities(results), is(0L));
assertThat(countBuySell(results), is(0L));
assertThat(countAccountTransactions(results), is(7L));
assertThat(results.size(), is(7));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// assert transaction
assertThat(results, hasItem(removal(hasDate("2023-08-22"), hasAmount("EUR", 1.00), //
hasSource("Kontoauszug02.txt"), hasNote(null))));

// assert transaction
assertThat(results, hasItem(removal(hasDate("2023-08-22"), hasAmount("EUR", 1.00), //
hasSource("Kontoauszug02.txt"), hasNote(null))));

// assert transaction
assertThat(results, hasItem(removal(hasDate("2023-08-23"), hasAmount("EUR", 1.00), //
hasSource("Kontoauszug02.txt"), hasNote(null))));

// assert transaction
assertThat(results, hasItem(interest(hasDate("2023-08-25"), hasAmount("EUR", 1.00), //
hasSource("Kontoauszug02.txt"), hasNote(null))));

// assert transaction
assertThat(results, hasItem(taxes(hasDate("2023-08-25"), hasAmount("EUR", 0.01), //
hasSource("Kontoauszug02.txt"), hasNote("Solidaritätszuschlag"))));

// check cancellation transaction
assertThat(results, hasItem(withFailureMessage( //
Messages.MsgErrorTransactionTypeNotSupported, //
taxes( //
hasDate("2023-08-25"), hasAmount("EUR", 0.00), //
hasSource("Kontoauszug02.txt"), hasNote("Kirchensteuer")))));

// assert transaction
assertThat(results, hasItem(taxes(hasDate("2023-08-25"), hasAmount("EUR", 0.25), //
hasSource("Kontoauszug02.txt"), hasNote("Abgeltungsteuer"))));

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.71.2
-----------------------------------------
Audi Bank · 38093 Braunschweig
tNMqKcO JUhnp
sdfasdfasdsf 234
18567 LQtjNogxA Ad CfnAxA
Kontoauszug / Saldenmitteilung Plus Konto online.pur
Kontonummer: 3986077296 Erstellungsdatum: 27.08.2023
Kontobezeichnung: cZekd blcuxjc Kontoauszug Nummer: 000008 / 2023
Bankleitzahl: 27020001 Seite: 1 / 1
BIC: AUDFDE21XXX letzter Auszug vom: 25.07.2023
IBAN: DE57270200013986077296 Ihr Ansprechpartner: Team Anlageberatung
Telefon-Durchwahl: 0531 212-859601
Alter Kontostand in EUR: 5,00
lfd. Buchungs- Umsatzinformationen Wertstellung Soll (EUR) Haben (EUR)
Nr. datum
1 21.08.2023 Telebanking Belastung 22.08.2023 -1,00
fxa cj
LwFWEjF lCuod
BIC JTAMkGM2R92 IBAN DE00000908000000123456
2 21.08.2023 Telebanking Belastung 22.08.2023 -1,00
xJO Sq(4)
WUOxsWf pyeMW
BIC yZJdKbS9M54 IBAN DE00000908000000123456
3 23.08.2023 Belastung 23.08.2023 -1,00
pCiVnhL wkrvv
BIC FCntWI3ChPV IBAN DE00000000000000123456
Rechnungsabschluss 25.08.2023
4 25.08.2023 Habenzinsen 25.08.2023 1,00
5 25.08.2023 Solidaritätszuschlag 25.08.2023 -0,01
6 25.08.2023 Kirchensteuer 25.08.2023 -0,00
7 25.08.2023 Abgeltungsteuer 25.08.2023 -0,25
Neuer Kontostand in EUR: 2,74
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 0,00 EUR 0,00 EUR 0,00 EUR 0,00 8,00 % EUR 0,00
Ihre Freistellungsdaten vom 25.08.2023
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package name.abuchen.portfolio.datatransfer.pdf;

import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block;
import name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType;
import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction;
Expand Down Expand Up @@ -38,6 +39,31 @@ private void addAccountStatementTransaction()

this.addDocumentTyp(type);

// @formatter:off
// 1 21.08.2023 Telebanking Belastung 22.08.2023 -1,00
// 3 23.08.2023 Belastung 23.08.2023 -1,00
// @formatter:on
Block removalBlock = new Block("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (Telebanking )?Belastung [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} \\-[\\.,\\d]+$");
type.addBlock(removalBlock);
removalBlock.set(new Transaction<AccountTransaction>()

.subject(() -> {
AccountTransaction accountTransaction = new AccountTransaction();
accountTransaction.setType(AccountTransaction.Type.REMOVAL);
return accountTransaction;
})

.section("date", "amount") //
.documentContext("currency") //
.match("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (Telebanking )?Belastung (?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) \\-(?<amount>[\\.,\\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
// 1 23.12.2021 Habenzinsen 25.12.2021 0,83
// @formatter:on
Expand Down Expand Up @@ -77,15 +103,23 @@ private void addAccountStatementTransaction()
return accountTransaction;
})

.section("date", "amount") //
.section("note", "date", "amount") //
.documentContext("currency") //
.match("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (Solidarit.tszuschlag|Kirchensteuer|Abgeltungsteuer) (?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) \\-(?<amount>[\\.,\\d]+)$") //
.match("^[\\d]+ [\\d]{2}\\.[\\d]{2}\\.[\\d]{4} (?<note>(Solidarit.tszuschlag|Kirchensteuer|Abgeltungsteuer)) (?<date>[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) \\-(?<amount>[\\.,\\d]+)$") //
.assign((t, v) -> {
t.setDateTime(asDate(v.get("date")));
t.setAmount(asAmount(v.get("amount")));
t.setCurrencyCode(v.get("currency"));
t.setNote(v.get("note"));
})

.wrap(TransactionItem::new));
.wrap((t, ctx) -> {
TransactionItem item = new TransactionItem(t);

if (t.getCurrencyCode() != null && t.getAmount() == 0)
item.setFailureMessage(Messages.MsgErrorTransactionTypeNotSupported);

return item;
}));
}
}