Skip to content

Commit

Permalink
Modify Easybank PDF-Importer to support new transaction (#4482)
Browse files Browse the repository at this point in the history
  • Loading branch information
Nirus2000 authored Jan 19, 2025
1 parent 2326636 commit 4c21d8b
Show file tree
Hide file tree
Showing 3 changed files with 185 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2863,6 +2863,69 @@ public void testSteuerkorrektur01()
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
public void testSteuerkorrektur02()
{
EasyBankAGPDFExtractor extractor = new EasyBankAGPDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Steuerkorrektur02.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("IE00BF4RFH31"), hasWkn(null), hasTicker(null), //
hasName("iShsIII-MSCI Wld Sm.Ca.UCI.ETF Registered Shares USD(Acc)o.N."), //
hasCurrencyCode("EUR"))));

// check taxes transaction
assertThat(results, hasItem(taxes( //
hasDate("2025-01-10T00:00"), hasShares(753.259), //
hasSource("Steuerkorrektur02.txt"), //
hasNote(null), //
hasAmount("EUR", 23.11), hasGrossValue("EUR", 23.11), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
public void testSteuerkorrektur02WithSecurityInUSD()
{
Security security = new Security("iShsIII-MSCI Wld Sm.Ca.UCI.ETF Registered Shares USD(Acc)o.N.", CurrencyUnit.USD);
security.setIsin("IE00BF4RFH31");

Client client = new Client();
client.addSecurity(security);

EasyBankAGPDFExtractor extractor = new EasyBankAGPDFExtractor(client);

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

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

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

// check taxes transaction
assertThat(results, hasItem(taxes( //
hasDate("2025-01-10T00:00"), hasShares(753.259), //
hasSource("Steuerkorrektur02.txt"), //
hasNote(null), //
hasAmount("EUR", 23.11), hasGrossValue("EUR", 23.11), //
hasForexGrossValue("USD", 23.96), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
public void testDepotauszug01()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.73.0
System: win32 | x86_64 | 21.0.5+11-LTS | Azul Systems, Inc.
-----------------------------------------
Herrn
OmiLkDY MacYiaVMz
BJqylCveRmaviYWHYM 1
0472 ZinJ
Wien, den 09.01.2025
Wir haben für Sie am 09.01.2025 unten angeführtes Geschäft abgerechnet:
Depot: 59504-965-208
Verlusttopf Nr.: 150680691238
Geschäftsart: Ertrag/Steueranteil
Bestand: Stk 753,259
davon
KESt-Neubestand mit Anschaffungskosten: Stk 753,259
Titel: IE00BF4RFH31 iShsIII-MSCI Wld Sm.Ca.UCI.ETF
Registered Shares USD(Acc)o.N.
Ertrag/Steueranteil pro Stk.: 0,011287 EUR
Verwahrart: WR Wertpapierrechnung
Positionsdaten: Loco: Düsseldorf
KESt aus Neubestand: -8,81 USD
Auslands-KESt neu: -15,14 USD
-23,95 USD
Devisenkurs: 1,0366 (09.01.2025) -23,11 EUR
Zu Lasten IBAN gW23 6257 9138 2168 9133 Valuta 10.01.2025 -23,11 EUR
Eingang vorbehalten
Datum/Uhrzeit Auftragseingang: 09.01.2025 13.28.11
Verwaltungsgesellschaft: iShares III PLC
Für ausschüttungsgleiche Erträge von ausländischen Fonds erfolgt eine Belastung in Höhe der zu
entrichtenden KESt. Neubestand: Steuerliche Anschaffungswerte werden erhöht.
Extag: 09.01.2025
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 WGEWTGSDR15ABREP2025011009937P09_a/1142
Hinweis für KESt aus Neubestand mit Anschaffungskosten:
Steuerrelevanter Anschaffungswert: 4.976,29 EUR
Anschaffungswertreduzierender Betrag*: 0,00 EUR
Anschaffungswerterhöhender Betrag**: 109,03 EUR
Steuerrelevanter Anschaffungswert aktuell: 5.085,32 EUR
* Das sind unter anderem Ausschüttungen, Einlagenrückzahlungen und sonstige Kapitalmaßnahmen.
** Entspricht in der Regel den ausschüttungsgleichen Erträgen. Diese unterliegen dem KESt-Abzug.
Hinweis für den Verlustausgleichstopf:
Bemessungsgrundlage KESt
Einkünfteüberhang bisher 470,79 80,08 EUR
Einkünfte 119,85 23,11 EUR
Einkünfteüberhang aktuell 590,64 103,19 EUR
KESt auf Dividende ohne Amtshilfe
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 WGEWTGSDR15ABREP2025011009937P09_a/1143
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ private void addBuySellTransaction()

private void addDividendTransaction()
{
final DocumentType type = new DocumentType("Gesch.ftsart: Ertrag");
final DocumentType type = new DocumentType("Gesch.ftsart: (Dividende|Ertrag)(?!\\/Steueranteil)");
this.addDocumentTyp(type);

Transaction<AccountTransaction> pdfTransaction = new Transaction<>();
Expand Down Expand Up @@ -388,7 +388,7 @@ private void addDividendTransaction()

private void addTaxesLostAdjustmentTransaction()
{
final DocumentType type = new DocumentType("Gesch.ftsart: (Steuerkorrektur|Ertrag|Verkauf|Tilgung)");
final DocumentType type = new DocumentType("Gesch.ftsart: (Steuerkorrektur|(Dividende|Ertrag)(\\/Steueranteil)?|Verkauf|Tilgung)");
this.addDocumentTyp(type);

Transaction<AccountTransaction> pdfTransaction = new Transaction<>();
Expand Down Expand Up @@ -423,6 +423,22 @@ private void addTaxesLostAdjustmentTransaction()
t.setSecurity(getOrCreateSecurity(v));
}),
// @formatter:off
// Titel: IE00BF4RFH31 iShsIII-MSCI Wld Sm.Ca.UCI.ETF
// Registered Shares USD(Acc)o.N.
// Ertrag/Steueranteil pro Stk.: 0,011287 EUR
// @formatter:on
section -> section //
.attributes("isin", "name", "name1", "currency") //
.match("^Titel: (?<isin>[A-Z]{2}[A-Z0-9]{9}[0-9]) (?<name>.*)$") //
.match("^(?<name1>.*)$") //
.match("^(Dividende|Ertrag)\\/Steueranteil pro Stk\\.: [\\.,\\d]+ (?<currency>[\\w]{3}).*$") //
.assign((t, v) -> {
if (!v.get("name1").startsWith("Dividende") || !v.get("name1").startsWith("Ertrag"))
v.put("name", trim(v.get("name")) + " " + trim(v.get("name1")));

t.setSecurity(getOrCreateSecurity(v));
}),
// @formatter:off
// Titel: DE000A14J587 t h y s s e n k r u p p AG
// Medium Term Notes v.15(25)
// Kup. 25.2.2023/GZJ Endfälligkeit 25.2.2025
Expand Down Expand Up @@ -565,6 +581,24 @@ private void addTaxesLostAdjustmentTransaction()
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
}),
// @formatter:off
// KESt aus Neubestand: -8,81 USD
// Auslands-KESt neu: -15,14 USD
// -23,95 USD
// Devisenkurs: 1,0366 (09.01.2025) -23,11 EUR
// Zu Lasten IBAN gW23 6257 9138 2168 9133 Valuta 10.01.2025 -23,11 E
// @formatter:on
section -> section //
.attributes("amount", "currency") //
.find("KESt aus Neubestand: \\-[\\.,\\d]+ [\\w]{3}.*$") //
.find("Auslands\\-KESt neu: \\-[\\.,\\d]+ [\\w]{3}.*$") //
.match("^Zu Lasten .* \\-(?<amount>[\\.,\\d]+) (?<currency>[\\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 //
Expand All @@ -585,7 +619,7 @@ private void addTaxesLostAdjustmentTransaction()
section -> section //
.attributes("termCurrency", "exchangeRate", "gross", "baseCurrency") //
.match("^(Dividende|Ertrag): [\\.,\\d]+ (?<termCurrency>[\\w]{3}).*$") //
.match("^Devisenkurs: (?<exchangeRate>[\\.,\\d]+) \\([\\d]{1,2}\\.[\\d]{1,2}\\.[\\d]{4}\\) [\\-\\.,\\d]+ [\\w]{3}.*$") //
.match("^Devisenkurs: (?<exchangeRate>[\\.,\\d]+) \\([\\d]{1,2}\\.[\\d]{1,2}\\.[\\d]{4}\\) (\\-)?[\\.,\\d]+ [\\w]{3}.*$") //
.match("^Gutschrift aus Verlustausgleich: (?<gross>[\\.,\\d]+) (?<baseCurrency>[\\w]{3}).*$") //
.assign((t, v) -> {
ExtrExchangeRate rate = asExchangeRate(v);
Expand All @@ -594,6 +628,29 @@ private void addTaxesLostAdjustmentTransaction()
Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross")));
Money fxGross = rate.convert(rate.getTermCurrency(), gross);

checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext());
}),
// @formatter:off
// Ertrag/Steueranteil pro Stk.: 0,011287 EUR
// KESt aus Neubestand: -8,81 USD
// Auslands-KESt neu: -15,14 USD
// -23,95 USD
// Devisenkurs: 1,0366 (09.01.2025) -23,11 EUR
// Zu Lasten IBAN gW23 6257 9138 2168 9133 Valuta 10.01.2025 -23,11 EUR
// @formatter:on
section -> section //
.attributes("termCurrency", "exchangeRate", "gross", "baseCurrency") //
.find("Auslands\\-KESt neu:.*")
.match("^\\-[\\.,\\d]+ (?<termCurrency>[\\w]{3}).*$") //
.match("^Devisenkurs: (?<exchangeRate>[\\.,\\d]+) \\([\\d]{1,2}\\.[\\d]{1,2}\\.[\\d]{4}\\) (\\-)?[\\.,\\d]+ [\\w]{3}.*$") //
.match("^Zu Lasten .* \\-(?<gross>[\\.,\\d]+) (?<baseCurrency>[\\w]{3}).*$") //
.assign((t, v) -> {
ExtrExchangeRate rate = asExchangeRate(v);
type.getCurrentContext().putType(rate);

Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross")));
Money fxGross = rate.convert(rate.getTermCurrency(), gross);

checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext());
}))

Expand Down

0 comments on commit 4c21d8b

Please sign in to comment.