Skip to content

Commit

Permalink
adding support for Ginmon VL Sparen (#4379)
Browse files Browse the repository at this point in the history
* adding Ginmon documents Account Statements, Buys, Sells, Fees
* Move invoice document to new created Ginmon specific importer.
* Add and improve DAB and Ginmon PDF-Importer
* Add new Ginmon PDF-Importer

---------

Co-authored-by: Alexander Ott <[email protected]>
  • Loading branch information
christen90 and Nirus2000 authored Dec 7, 2024
1 parent b35886d commit 4b3e78d
Show file tree
Hide file tree
Showing 13 changed files with 884 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package name.abuchen.portfolio.datatransfer.pdf.dab;

import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.check;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.deposit;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.dividend;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.fee;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate;
Expand All @@ -18,6 +20,8 @@
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.inboundDelivery;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.outboundDelivery;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.removal;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security;
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxRefund;
Expand Down Expand Up @@ -799,6 +803,37 @@ public void testWertpapierKauf13()
is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.00))));
}

@Test
public void testWertpapierKauf14()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

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

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

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

// check security
assertThat(results, hasItem(security( //
hasIsin("IE00BCBJG560"), hasWkn(null), hasTicker(null), //
hasName("SPDR MSCI Wrld Small Cap U.ETF Registered Shares o.N."), //
hasCurrencyCode("EUR"))));

// check buy sell transaction
assertThat(results, hasItem(purchase( //
hasDate("2024-08-29T12:59:00"), hasShares(0.0425), //
hasSource("Kauf14.txt"), //
hasNote("Abrechnungs-Nr. 92328727"), //
hasAmount("EUR", 4.13), hasGrossValue("EUR", 4.13), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))));
}

@Test
public void testWertpapierVerkauf01()
{
Expand Down Expand Up @@ -1702,6 +1737,37 @@ public void testWertpapierVerkauf13()
hasTaxes("EUR", 100.00 + 10.00 + 10.00), hasFees("EUR", 0.00))));
}

@Test
public void testWertpapierVerkauf14()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

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

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

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

// check security
assertThat(results, hasItem(security( //
hasIsin("IE00BL25JM42"), hasWkn(null), hasTicker(null), //
hasName("Xtr.(IE) - MSCI World Value Registered Shares 1C USD o.N."), //
hasCurrencyCode("EUR"))));

// check buy sell transaction
assertThat(results, hasItem(sale( //
hasDate("2024-11-07T16:00"), hasShares(0.2741), //
hasSource("Verkauf14.txt"), //
hasNote("Abrechnungs-Nr. 64518224"), //
hasAmount("EUR", 11.60), hasGrossValue("EUR", 11.67), //
hasTaxes("EUR", 0.07), hasFees("EUR", 0.00))));
}

@Test
public void testMultipleWertpapierKaufVerkauf01()
{
Expand Down Expand Up @@ -3648,4 +3714,138 @@ public void testKontoumsaetze07()
assertThat(transaction.getSource(), is("Kontoumsaetze07.txt"));
assertThat(transaction.getNote(), is("Porto"));
}

@Test
public void testKontoumsaetze08()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoumsaetze08.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);

// assert transaction
assertThat(results, hasItem(deposit(hasDate("2024-08-28"), hasAmount("EUR", 26.59), //
hasSource("Kontoumsaetze08.txt"), hasNote("vermögenswirksame Leistung"))));
}

@Test
public void testKontoumsaetze09()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoumsaetze09.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);

// assert transaction
assertThat(results, hasItem(withFailureMessage( //
Messages.MsgErrorTransactionAlternativeDocumentRequired, //
fee( //
hasDate("2024-10-09"), //
hasSource("Kontoumsaetze09.txt"), //
hasNote("Ginmon Gebuehrenrechnung September 2024"), //
hasAmount("EUR", 0.02)))));
}

@Test
public void testKontoumsaetze10()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

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

List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoumsaetze10.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);

// assert transaction
assertThat(results, hasItem(removal(hasDate("2024-11-11"), hasAmount("EUR", 50.00), //
hasSource("Kontoumsaetze10.txt"), hasNote("SEPA-Überweisung"))));
}

@Test
public void testKontoumsaetze11()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

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

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

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

// check security
assertThat(results, hasItem(security( //
hasIsin("IE00B52MJY50"), hasWkn(null), hasTicker(null), //
hasName(null), //
hasCurrencyCode("EUR"))));

// assert transaction
assertThat(results, hasItem(withFailureMessage( //
Messages.MsgErrorTransactionAlternativeDocumentRequired, //
sale( //
hasDate("2024-11-11"), hasShares(0.003), //
hasSource("Kontoumsaetze11.txt"), //
hasNote(null), //
hasAmount("EUR", 0.49), hasGrossValue("EUR", 0.49), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))));
}

@Test
public void testKontoumsaetze12()
{
DABPDFExtractor extractor = new DABPDFExtractor(new Client());

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

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

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

// check security
assertThat(results, hasItem(security( //
hasIsin("IE00BL25JM42"), hasWkn(null), hasTicker(null), //
hasName(null), //
hasCurrencyCode("EUR"))));

// assert transaction
assertThat(results, hasItem(withFailureMessage( //
Messages.MsgErrorTransactionAlternativeDocumentRequired, //
purchase(//
hasDate("2024-10-01"), hasShares(0.15), //
hasSource("Kontoumsaetze12.txt"), //
hasNote(null), //
hasAmount("EUR", 6.26), hasGrossValue("EUR", 6.26), //
hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
```
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.72.2
-----------------------------------------
BELEGDRUCK=J
ORIGINAL=1
FAXVERSAND=N
EMAILVERSAND=N
DEPOTNUMMER=0000000000
Wertpapierabrechnung DEPOTUNTERBEZEICHNUNG=
VERSANDARTENSCHLUESSEL=DRUCK
ADRESSZEILE1=Herr
Kauf ADRESSZEILE2=Vorname Nachname
Kommissionsgeschäft ADRESSZEILE3=Straße 1
ADRESSZEILE4=12345 Ort
Depot-Nr. Abrechnungs-Nr. ADRESSZEILE5=
0000000000 92328727 / 29.08.2024 ADRESSZEILE6=
BELEGNUMMER=11349
Herr SEITENNUMMER=1
Vorname Nachname STEUERERSTATTUNG=N
Straße 1 Depotinhaber
12345 Ort Vorname Nachname
München, 29.08.2024
Wir haben für Sie gekauft
Gattungsbezeichnung ISIN
SPDR MSCI Wrld Small Cap U.ETF Registered Shares o.N. IE00BCBJG560
Nominal Kurs
STK 0,0425 EUR 97,1400
Handelstag 29.08.2024 Kurswert EUR 4,13-
Handelszeit 12:59*
Börse Tradegate/EDG
Verwahrart Wertpapierrechnung
Lagerland Irland
Wert Konto-Nr. Betrag zu Ihren Lasten
02.09.2024 0000000000 EUR 4,13
Die Höhe des von der KVG festgelegten Ausgabeauf- bzw. Rücknahmeabschlages sowie die jährlich zu zahlende Ver-
waltungsvergütung und die Gesamtkostenquote sind dem Verkaufsprospekt bzw. den Vertragsbedingungen zu entnehmen.
Aggregierte Order ggf. zum Mischkurs.
* Die angegebene Zeit entspricht den Angaben der Handelspartner gemäß der lokalen Zeit in Deutschland (Mitteleuropäische Zeit bzw. Mitteleuropäische Sommerzeit).
Widerrufsbelehrung für den Erwerb von Anteilen oder Aktien eines offenen Investmentvermögens: Ist der Käufer von Anteilen oder Aktien eines offenen Investmentvermögens
durch mündliche Verhandlungen außerhalb der ständigen Geschäftsräume desjenigen, der die Anteile oder Aktien verkauft oder den Verkauf vermittelt hat, dazu bestimmt worden,
eine auf den Kauf gerichtete Willenserklärung abzugeben, so ist er an diese Erklärung nur gebunden, wenn er sie nicht innerhalb einer Frist von zwei Wochen bei der
Verwaltungsgesellschaft oder einem Repräsentanten im Sinne des § 319 KAGB schriftlich widerruft.
Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben.
BNP Paribas S.A. Niederlassung Deutschland > Standort: München > Landsberger Straße 300 > 80687 München > Postadresse: DAB BNP Paribas > Postfach 2547 >
90011 Nürnberg > Sitz: Nürnberg HRB Nürnberg 31129 > USt.-Ident-Nr.: DE191528929 > Sitz der Hauptniederlassung der BNP Paribas S.A.: 16, boulevard des Italiens
> 75009 Paris > Frankreich > Registergericht: R.C.S. Paris 662 042 449 > Président du Conseil d‘Administration: Jean Lemierre > Directeur Général: Jean-Laurent Bonnafé
3.19/ABREABHNHANDKF/GABAUFTL/011349/290824/210432

```
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
```
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.72.2
-----------------------------------------
Kontoauszug DAB Verrechnungskonto Kontonummer: 0000000000 KOPIE
BLZ: 701 204 00
IBAN: DE00000000000000000000
BIC (SWIFT-Code): DABBDEMMXXX
Vorname Nachname
Letzter Auszug Nr. 000 vom 00.00.0000
Umsatzzeitraum
Ginmon Vermögensverwaltung GmbH 28.08.2024 - 28.08.2024 Seite 1/1
Mainzer Landstr. 33a
60329 Frankfurt Auszug Nr. 001
28.08.2024
Buchung Valuta Buchungsinformation Soll Haben
00.00. Alter Kontostand: EUR 0,00+
28.08. 28.08. vermögenswirksame Leistung 26,59+
Company where VL is payed from 000/UVXY VL
Nachname, Vo.
28.08. Neuer Kontostand: EUR 26,59+
Hinweis
Der Kontostand /Saldo kann auch noch nicht wertgestellte Beträge enthalten, über die bis zur Wertstellung noch nicht ohne Abzug von Sollzinsen
verfügt werden kann.
Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetztes entschädigungsfähig. Nähere Informationen können dem
„Informationsbogen für den Einleger“ entnommen werden.
BNP Paribas S.A. Niederlassung Deutschland > Standort: München > Landsberger Straße 300 > 80687 München > Postadresse: DAB BNP Paribas > Postfach 2547 >
90011 Nürnberg > Sitz: Nürnberg HRB Nürnberg 31129 > USt.-Ident-Nr.: DE 191528929 > Sitz der Hauptniederlassung der BNP Paribas S.A.: 16, boulevard des Italiens,
75009 Paris, Frankreich, Registergericht: R.C.S. Paris 662 042 449 > Président du Conseil d‘Administration: Jean Lemierre, Directeur Général: Jean-Laurent Bonnafé

```
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
```
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.72.2
-----------------------------------------
Kontoauszug DAB Verrechnungskonto Kontonummer: 0000000000 KOPIE
BLZ: 701 204 00
IBAN: DE00000000000000000000
BIC (SWIFT-Code): DABBDEMMXXX
Vorname Nachname
Letzter Auszug Nr. 004 vom 27.09.2024
Umsatzzeitraum
Ginmon Vermögensverwaltung GmbH 28.09.2024 - 09.10.2024 Seite 1/1
Mainzer Landstr. 33a
60329 Frankfurt Auszug Nr. 005
09.10.2024
Buchung Valuta Buchungsinformation Soll Haben
27.09. Alter Kontostand: EUR 0,60+
09.10. 09.10. Verwalterpreis 0,02-
Ginmon Gebuehrenrechnung September 2024 End to End-
ID:SEPA-EINZUG
IBAN: DE62701204003335687004
BIC: DABBDEMMXXX
Empfänger: Ginmon Vermoegensverwaltung GmbH
09.10. Neuer Kontostand: EUR 0,58+
Hinweis
Der Kontostand /Saldo kann auch noch nicht wertgestellte Beträge enthalten, über die bis zur Wertstellung noch nicht ohne Abzug von Sollzinsen
verfügt werden kann.
Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetztes entschädigungsfähig. Nähere Informationen können dem
„Informationsbogen für den Einleger“ entnommen werden.
BNP Paribas S.A. Niederlassung Deutschland > Standort: München > Landsberger Straße 300 > 80687 München > Postadresse: DAB BNP Paribas > Postfach 2547 >
90011 Nürnberg > Sitz: Nürnberg HRB Nürnberg 31129 > USt.-Ident-Nr.: DE 191528929 > Sitz der Hauptniederlassung der BNP Paribas S.A.: 16, boulevard des Italiens,
75009 Paris, Frankreich, Registergericht: R.C.S. Paris 662 042 449 > Président du Conseil d‘Administration: Jean Lemierre, Directeur Général: Jean-Laurent Bonnafé

```
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
```
PDFBox Version: 1.8.17
Portfolio Performance Version: 0.72.2
-----------------------------------------
Kontoauszug DAB Verrechnungskonto Kontonummer: 0000000000 KOPIE
BLZ: 701 204 00
IBAN: DE00000000000000000000
BIC (SWIFT-Code): DABBDEMMXXX
Vorname Nachname
Letzter Auszug Nr. 009 vom 08.11.2024
Umsatzzeitraum
Ginmon Vermögensverwaltung GmbH 09.11.2024 - 11.11.2024 Seite 1/1
Mainzer Landstr. 33a
60329 Frankfurt Auszug Nr. 010
11.11.2024
Buchung Valuta Buchungsinformation Soll Haben
08.11. Alter Kontostand: EUR 50,32+
11.11. 11.11. SEPA-Überweisung 50,00-
AGKRGWWWRHABNBNBOZSPCR Ginmon End to End-
ID:DAB/B3/480606009/2024-11-11
IBAN: DE00000000000000000000
BIC: BICXXXXX001
Empfänger: Vorname Nachname
11.11. Neuer Kontostand: EUR 0,32+
Hinweis
Der Kontostand /Saldo kann auch noch nicht wertgestellte Beträge enthalten, über die bis zur Wertstellung noch nicht ohne Abzug von Sollzinsen
verfügt werden kann.
Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetztes entschädigungsfähig. Nähere Informationen können dem
„Informationsbogen für den Einleger“ entnommen werden.
BNP Paribas S.A. Niederlassung Deutschland > Standort: München > Landsberger Straße 300 > 80687 München > Postadresse: DAB BNP Paribas > Postfach 2547 >
90011 Nürnberg > Sitz: Nürnberg HRB Nürnberg 31129 > USt.-Ident-Nr.: DE 191528929 > Sitz der Hauptniederlassung der BNP Paribas S.A.: 16, boulevard des Italiens,
75009 Paris, Frankreich, Registergericht: R.C.S. Paris 662 042 449 > Président du Conseil d‘Administration: Jean Lemierre, Directeur Général: Jean-Laurent Bonnafé

```
Loading

0 comments on commit 4b3e78d

Please sign in to comment.