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

Fix Onvista PDF import adding tax refund for credit notes #1927

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,78 @@
PDF Autor: ''
PDFBox Version: 1.8.16
-----------------------------------------
BELEGDRUCK=J
ORIGINAL=1
FAXVERSAND=N
EMAILVERSAND=N
DEPOTNUMMER=270749000
DEPOTUNTERBEZEICHNUNG=
VERSANDARTENSCHLUESSEL=EBOX
Gesamtfälligkeit ADRESSZEILE1=Herr
ADRESSZEILE2=Max Mustermann
ADRESSZEILE3=Straße 123
ADRESSZEILE4=12345 Musterstadt
Herr ADRESSZEILE5=
Max Mustermann ADRESSZEILE6=
Depot-Nr. Abrechnungs-Nr.
Straße 123 BELEGNUMMER=567
12345 Musterstadt 123456000 10283354 / 24.09.2020 SEITENNUMMER=1STEUERERSTATTUNG=N
Depotinhaber
Max Mustermann
Frankfurt am Main, 24.09.2020
Gutschriftsanzeige
Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN
Morgan Stanley & Co. Intl PLC DIZ 25.09.20 25.09.2020 DE000MC55366
Fres. SE
Nominal Einlösung zu:
STK 65,000 EUR 39,4400
Verwahrart Girosammelverwahrung Kurswert EUR 2.563,60
Wert Konto-Nr. Betrag zu Ihren Gunsten
25.09.2020 123456789 EUR 2.563,60
Hinweise zur steuerlichen Verrechnung: vorher aktuell
Veräußerungsverlust Sonstige EUR 266,55
Aktienverlusttopf EUR 0,00 0,00
allgemeiner Verlusttopf EUR 0,00 0,00
Freistellungsauftrag (eingereicht: EUR 123,45) EUR 0,00 0,00
Quellensteuertopf EUR 0,00 0,00
zu versteuern (negativ) EUR 266,55
Steuerausgleich nach § 43a EStG:
Kapitalertragsteuer EUR 65,18
Solidaritätszuschlag EUR 3,59
Kirchensteuer EUR 5,86
Wert Konto-Nr. Abrechnungs-Nr. Betrag zu Ihren Gunsten
24.09.2020 270749047 18633554 EUR 74,63
Es folgt Seite 2
onvista bank ist eine Marke der comdirekt bank AG Wildunger Straße 6a 60487 Frankfurt am Main
Kundenservice: +49 (0)69-7107-530 T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de
Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de
Vorstand: Frauke Hegemann (Vorsitzende), Matthias Hach Vorsitzender des Aufsichtsrates: Dr. Jochen Sutor
3.20/ABREEREITILG/GDBTILAN/000567/250920/004041
BELEGDRUCK=J
ORIGINAL=1
FAXVERSAND=N
EMAILVERSAND=N
DEPOTNUMMER=270749000
DEPOTUNTERBEZEICHNUNG=
VERSANDARTENSCHLUESSEL=EBOX
ADRESSZEILE1=Herr
Depot-Nr. Abrechnungs-Nr. Seite-Nr. ADRESSZEILE2=Max Mustermann
123456000 10283354 2 ADRESSZEILE3=Straße 123
ADRESSZEILE4=12345 Musterstadt
ADRESSZEILE5=
ADRESSZEILE6=
BELEGNUMMER=567
im laufenden Jahr einbehaltene Kapitalertragsteuer EUR 476,67 SEITENNUMMER=2
im laufenden Jahr einbehaltener Solidaritätszuschlag EUR 26,21 STEUERERSTATTUNG=N
im laufenden Jahr einbehaltene Kirchensteuer EUR 42,90
Kapitalertragsteuer, Solidaritätszuschlag und ggf. Kirchensteuer nach gemeldetem Kirchensteuersatz verrechnet mit dem
Finanzamt Musterort, Steuernummer 12/345/12345.
Jahressteuerbescheinigung folgt
Wir bitten Sie, diese Abrechnung auf ihre Richtigkeit und Vollständigkeit zu überprüfen und etwaige Einwendungen
unverzüglich zu erheben.
Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben.
onvista bank ist eine Marke der comdirekt bank AG Wildunger Straße 6a 60487 Frankfurt am Main
Kundenservice: +49 (0)69-7107-530 T: +49 (0)69-7107-0 F: +49 (0)69-7107-100 info@onvista-bank.de www.onvista-bank.de
Sitz der comdirect bank AG: Pascalkehre 15 25451 Quickborn (AG Pinneberg HRB 4889) T: +49 (0)4106-704-0 F: +49 (0)4106-708-258-5 www.comdirect.de
Vorstand: Frauke Hegemann (Vorsitzende), Matthias Hach Vorsitzender des Aufsichtsrates: Dr. Jochen Sutor
3.20/ABREEREITILG/GDBTILAN/000567/250920/004041
Expand Up @@ -765,6 +765,54 @@ public void testErtragsgutschriftErtraegnisgutschrift6()
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3.16 + 0.18 + 4.74))));
}

@Test
public void testGutschriftsanzeige1()
{
OnvistaPDFExtractor extractor = new OnvistaPDFExtractor(new Client());

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

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

assertThat(errors, empty());
assertThat(results.size(), is(3));

// check security
Security security = results.stream() //
.filter(i -> i instanceof Extractor.SecurityItem) //
.map(Item::getSecurity) //
.findFirst().orElseThrow(IllegalArgumentException::new);
assertThat(security.getIsin(), is("DE000MC55366"));

// check transaction
Optional<Item> item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.isPresent(), is(true));
assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.get().getSubject();

assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL));
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL));

assertThat(entry.getPortfolioTransaction().getCurrencyCode(), is(CurrencyUnit.EUR));
assertThat(entry.getPortfolioTransaction().getSecurity(), is(security));
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-09-25T00:00")));
assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2563.60))));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(65)));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0))));

// check transaction
item = results.stream().filter(i -> i instanceof TransactionItem).findFirst();
AccountTransaction transaction = (AccountTransaction) item.orElseThrow(IllegalArgumentException::new)
.getSubject();
assertThat(transaction.getType(), is(AccountTransaction.Type.TAX_REFUND));
assertThat(transaction.getCurrencyCode(), is(CurrencyUnit.EUR));
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-09-24T00:00")));
assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(74.63))));
}

@Test
public void testWertpapierKaufAktien() throws IOException // Aktien
{
Expand Down
Expand Up @@ -1618,7 +1618,7 @@ private void addTaxReturnTransaction()
Block block1 = new Block("Wir haben für Sie (ge|ver)kauft(.*)");
type.addBlock(block1);

Block block2 = new Block("(Aus|Ein)buchung:(.*)");
Block block2 = new Block("Gutschriftsanzeige|(Aus|Ein)buchung:(.*)");
type.addBlock(block2);

Transaction<AccountTransaction> taxRefundTransaction = new Transaction<AccountTransaction>()
Expand All @@ -1630,7 +1630,7 @@ private void addTaxReturnTransaction()
})

.section("name", "isin") //
.find("Gattungsbezeichnung ISIN") //
.find("Gattungsbezeichnung (.*)ISIN") //
.match("(?<name>.*) (?<isin>[^ ]\\S*)$") //
.assign((t, v) -> t.setSecurity(getOrCreateSecurity(v)))

Expand Down