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 Raiffeisenbank PDF-Importer to support new transaction #3283

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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,34 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.62.0
-----------------------------------------
VR Bank Niederbayern-Oberpfalz · 93041 Regensburg
Depotnummer 1234567890

Kundennummer 1234567890
Max Mustermann
Abrechnungsnr. 66666666666
Max Mustermann Datum 11.04.2023
Musterstr. 22
11111 Musterstadt

Ertragsgutschrift nach § 27 KStG
Nominale Wertpapierbezeichnung ISIN (WKN)
Stück 111 DEUTSCHE TELEKOM AG DE0005557508 (555750)
NAMENS-AKTIEN O.N.
Zahlbarkeitstag 12.04.2023 Ertrag pro Stück 0,70 EUR
Bestandsstichtag 05.04.2023
Ex-Tag 06.04.2023
Geschäftsjahr 01.01.2022 - 31.12.2022
Dividendengutschrift nach § 27 KStG 77,70+ EUR
Ausmachender Betrag 77,70+ EUR
Lagerstelle CBF w/7268 w/DZ Bank (600502 / 72680000)
Den Betrag buchen wir mit Wertstellung 12.04.2023 zu Gunsten des Kontos 1111111111 (IBAN DE11 1111 1111 1111
1111 11), BLZ 750 909 00 (BIC GENODEF1P18).
Keine Steuerbescheinigung.
Es handelt sich bei der Ausschüttung um Leistungen aus dem steuerlichen Einlagekonto der Kapitalgesellschaft (§27 Abs.
1-7 KStG). Dieser Ertrag unterliegt laut Gesetz zum Zeitpunkt des Zuflusses keinem Steuerabzug und ist
einkommensteuerfrei. Er mindert jedoch im Nachhinein den Kaufkurs der bezogenen Aktie, so dass bei deren Verkauf
möglicherweise ein entsprechend höherer Kursgewinn zu versteuern ist.
Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben.
Bitte ggf. Rückseite beachten.
6666.00123456.0000833ER01
Expand Up @@ -12,6 +12,7 @@

import org.junit.Test;

import name.abuchen.portfolio.Messages;
import name.abuchen.portfolio.datatransfer.Extractor;
import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem;
import name.abuchen.portfolio.datatransfer.Extractor.Item;
Expand All @@ -28,6 +29,7 @@
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.model.Transaction;
import name.abuchen.portfolio.model.Transaction.Unit;
import name.abuchen.portfolio.money.CurrencyUnit;
import name.abuchen.portfolio.money.Money;
Expand Down Expand Up @@ -975,6 +977,49 @@ public void testDividende06()
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.45))));
}

@Test
public void testDividende07()
{
RaiffeisenBankgruppePDFExtractor extractor = new RaiffeisenBankgruppePDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende07.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("DE0005557508"));
assertThat(security.getWkn(), is("555750"));
assertNull(security.getTickerSymbol());
assertThat(security.getName(), is("DEUTSCHE TELEKOM AG NAMENS-AKTIEN 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-04-12T00:00")));
assertThat(transaction.getShares(), is(Values.Share.factorize(111)));
assertThat(transaction.getSource(), is("Dividende07.txt"));
assertNull(transaction.getNote());

assertThat(transaction.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(77.70))));
assertThat(transaction.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(77.70))));
assertThat(transaction.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(transaction.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
}

@Test
public void testKontoauszug01()
{
Expand Down Expand Up @@ -1607,4 +1652,121 @@ public void testKontoauszug04()
assertThat(transaction.getSource(), is("Kontoauszug04.txt"));
assertThat(transaction.getNote(), is("Lohn/Gehalt"));
}

@Test
public void testEinbuchung01()
{
RaiffeisenBankgruppePDFExtractor extractor = new RaiffeisenBankgruppePDFExtractor(new Client());

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

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

assertThat(errors, empty());
assertThat(results.size(), is(4));
new AssertImportActions().check(results, CurrencyUnit.EUR);

// check security
Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security1.getIsin(), is("LU0392496344"));
assertNull(security1.getWkn());
assertNull(security1.getTickerSymbol());
assertThat(security1.getName(), is("Lyxor MSCI Europe SmallCap ETF Inh.-An. I o.N."));
assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR));

Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security2.getIsin(), is("LU2572257470"));
assertNull(security2.getWkn());
assertNull(security2.getTickerSymbol());
assertThat(security2.getName(), is("AIS-MSCI Eu.SC ESG CL.NZ AMCTB Act.Nom. U.ETF EUR Dis. oN"));
assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR));

// check delivery outbound (Auslieferung) transaction
PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance)
.findFirst().orElseThrow(IllegalArgumentException::new).getSubject();

assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND));

assertThat(entry.getDateTime(), is(LocalDateTime.parse("2023-03-10T00:00")));
assertThat(entry.getShares(), is(Values.Share.factorize(433)));
assertThat(entry.getSource(), is("Umtausch01.txt"));
assertThat(entry.getNote(), is("Abrechnungsnummer: 46711492"));

assertThat(entry.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

// check delivery inbound (Einlieferung) transaction
entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1).findFirst()
.orElseThrow(IllegalArgumentException::new).getSubject();

assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND));

assertThat(entry.getDateTime(), is(LocalDateTime.parse("2023-03-10T00:00")));
assertThat(entry.getShares(), is(Values.Share.factorize(433)));
assertThat(entry.getSource(), is("Umtausch01.txt"));
assertThat(entry.getNote(), is("Abrechnungsnummer: 45664992 | Verhältnis: 1 : 1"));

assertThat(entry.getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(entry.getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

// check 1st cancellation (Amount 0,00) transaction
TransactionItem cancellation = (TransactionItem) results.stream() //
.filter(i -> i.isFailure()) //
.filter(TransactionItem.class::isInstance) //
.findFirst().orElseThrow(IllegalArgumentException::new);

assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND));
assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported));

assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2023-03-10T00:00")));
assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(433)));
assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Umtausch01.txt"));
assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Abrechnungsnummer: 46711492"));

assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(((Transaction) cancellation.getSubject()).getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));

// check 2nd cancellation (Amount 0,00) transaction
cancellation = (TransactionItem) results.stream() //
.filter(i -> i.isFailure()) //
.filter(TransactionItem.class::isInstance) //
.skip(1).findFirst().orElseThrow(IllegalArgumentException::new);

assertThat(((PortfolioTransaction) cancellation.getSubject()).getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND));
assertThat(cancellation.getFailureMessage(), is(Messages.MsgErrorTransactionTypeNotSupported));

assertThat(((Transaction) cancellation.getSubject()).getDateTime(), is(LocalDateTime.parse("2023-03-10T00:00")));
assertThat(((Transaction) cancellation.getSubject()).getShares(), is(Values.Share.factorize(433)));
assertThat(((Transaction) cancellation.getSubject()).getSource(), is("Umtausch01.txt"));
assertThat(((Transaction) cancellation.getSubject()).getNote(), is("Abrechnungsnummer: 45664992 | Verhältnis: 1 : 1"));

assertThat(((Transaction) cancellation.getSubject()).getMonetaryAmount(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(((Transaction) cancellation.getSubject()).getGrossValue(),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
assertThat(((Transaction) cancellation.getSubject()).getUnitSum(Unit.Type.FEE),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00))));
}
}
@@ -0,0 +1,76 @@
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.61.4
-----------------------------------------
da


Bank Direkt
der Raiffeisenlandesbank OÖ (BLZ: 34000)
Europaplatz 1a b
4020 Linz


a
a
Abrechnung Ereignis a
45664992 - 16.03.2023 a
Depotnummer: 12.345.678
Herrn Max Muster
Max Muster
Dorf 124 230/475
6789 Kufstein Bank Direkt
Wir haben für Sie am 16.03.2023 unten angeführtes Geschäft abgerechnet:
Abrechnungsnummer/-datum: 46711492 - 16.03.2023
Geschäftsart: Ausbuchung
wegen Steuerlicher Umtausch
Abgang: 433 Stk
Titel: LU0392496344 Lyxor MSCI Europe SmallCap ETF
Inh.-An. I o.N.
Fondsgesellschaft: Lyxor
Verwahrart: WR
Positionsdaten: Loco: Frankfurt am Main
Zu Gunsten IBAN AT44 3400 0000 0123 4567 0,00 EUR
Valuta 10.03.2023
Abrechnungsnummer/-datum: 45664992 - 16.03.2023
Geschäftsart: Einbuchung
wegen Steuerlicher Umtausch
im Verhältnis: 1 : 1
Zugang: 433 Stk
Titel: LU2572257470 AIS-MSCI Eu.SC ESG CL.NZ AMCTB
Act.Nom. U.ETF EUR Dis. oN
Fondsgesellschaft: Amundi Index Solutions
Verwahrart: WR
Positionsdaten: Loco: Frankfurt am Main
Zu Gunsten IBAN AT44 3400 0000 0123 4567 0,00 EUR
Valuta 10.03.2023
Extag: 10.03.2023
16.03.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
45664992 - 16.03.2023 a
Depotnummer: 12.345.678
Max Muster
230/475
Bank Direkt
Ausgangssituation:
KESt-Neubestand mit Anschaffungskosten nach dem gleitenden
Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG 433 Stk
steuerlicher Anschaffungswert: 18.484,94 EUR
Bezogene Kategorie: LU2572257470
KESt-Neubestand mit Anschaffungskosten nach dem gleitenden
Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG 433 Stk
steuerlicher Anschaffungswert: 18.484,94 EUR
Steuerl. Behandlung vorbehaltlich Beurteilung durch BMF
Für ein Veranlagungsgespräch stehen wir Ihnen gerne zur Verfügung.
16.03.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.