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 LGT Bank AG PDF-Import to support dividends #2074

Closed
wants to merge 1 commit into from
Closed
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
Expand Up @@ -131,7 +131,7 @@ public void testAusschuettung01()
assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
assertThat(transaction.getMonetaryAmount(), is(Money.of("EUR", Values.Amount.factorize(0.30))));
assertThat(transaction.getShares(), is(Values.Share.factorize(4)));
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-12-10T00:00")));
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-12-23T00:00")));

assertThat(transaction.getUnitSum(Unit.Type.TAX), is(Money.of("EUR", Values.Amount.factorize(0.02))));
}
Expand All @@ -156,7 +156,7 @@ public void testAusschuettung02()
assertThat(t.getSecurity().getIsin(), is("US3755581036"));
assertThat(t.getSecurity().getCurrencyCode(), is(CurrencyUnit.EUR));

assertThat(t.getDateTime(), is(LocalDateTime.parse("2020-12-14T00:00")));
assertThat(t.getDateTime(), is(LocalDateTime.parse("2020-12-30T00:00")));
assertThat(t.getShares(), is(Values.Share.factorize(3)));
assertThat(t.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.21))));
assertThat(t.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.25 + 0.21))));
Expand Down Expand Up @@ -188,7 +188,7 @@ public void testAusschuettung03()
assertThat(t.getSecurity().getIsin(), is("US6802231042"));
assertThat(t.getSecurity().getCurrencyCode(), is(CurrencyUnit.EUR));

assertThat(t.getDateTime(), is(LocalDateTime.parse("2021-01-04T00:00")));
assertThat(t.getDateTime(), is(LocalDateTime.parse("2021-01-15T00:00")));
assertThat(t.getShares(), is(Values.Share.factorize(7)));
assertThat(t.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(4.16))));
assertThat(t.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1.58))));
Expand Down Expand Up @@ -220,7 +220,7 @@ public void testAusschuettung04()
assertThat(t.getSecurity().getIsin(), is("US56035L1044"));
assertThat(t.getSecurity().getCurrencyCode(), is(CurrencyUnit.EUR));

assertThat(t.getDateTime(), is(LocalDateTime.parse("2021-01-04T00:00")));
assertThat(t.getDateTime(), is(LocalDateTime.parse("2021-01-15T00:00")));
assertThat(t.getShares(), is(Values.Share.factorize(6)));
assertThat(t.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.73))));
assertThat(t.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.28))));
Expand Down Expand Up @@ -252,7 +252,7 @@ public void testAusschuettung05()
assertThat(t.getSecurity().getIsin(), is("LU0675401409"));
assertThat(t.getSecurity().getCurrencyCode(), is(CurrencyUnit.EUR));

assertThat(t.getDateTime(), is(LocalDateTime.parse("2020-12-09T00:00")));
assertThat(t.getDateTime(), is(LocalDateTime.parse("2020-12-11T00:00")));
assertThat(t.getShares(), is(Values.Share.factorize(6)));
assertThat(t.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.32))));
assertThat(t.getUnitSum(Unit.Type.TAX), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.12 + 0.02))));
Expand Down
@@ -0,0 +1,34 @@
PDF Autor: 'LGT Bank AG'
PDFBox Version: 1.8.16
-----------------------------------------
LGT Bank AG
Herrengasse 12, FL-9490 Vaduz
Tel. +423 235 11 22
info@lgt.com, www.lgt.li, BIC BLFLLI2X
HR Nr.: 1122356-7, Sitz: 9490 Vaduz, MWST-Nr. 50119
UID: CHE-260.887.880
Herr
Max Muster
Schlossallee 4
50859 Köln 1 / 1
DEUTSCHLAND
Vaduz, 14. Mai 2020

Barausschüttung Portfolio: 0012345.006
Auftragsnummer: 256401138 Kontonummer: 0012345.021
Kunde: Max Muster IBAN: LI74 0881 0000 0123 4503 9

Stand Ihres Depots am 12. Mai 2020:
551 Veolia Environnement SA
Namen- und Inhaber-Aktien
ISIN: FR0000124141, Valoren-Nr.: 1098758
Wir rechnen folgende Erträgnisse unter Eingangsvorbehalt ab:
Ausschüttung EUR 0.50
Ex-Datum 12. Mai 2020
Ausschüttungsart Ordentliche Dividende
Betrag EUR 275.50
Quellensteuer 28 % EUR -77.14
Netto EUR 198.36
Zu Ihren Gunsten EUR 198.36
Valuta 14. Mai 2020
0012345 13E T VA I SEA0107 50784613 13:33 14.05.2020 %Media:XML-A4H
@@ -0,0 +1,38 @@
PDF Autor: 'LGT Bank AG'
PDFBox Version: 1.8.16
-----------------------------------------
LGT Bank AG
Herrengasse 12, FL-9490 Vaduz
Tel. +423 235 11 22
info@lgt.com, www.lgt.li, BIC BLFLLI2X
HR Nr.: 1122356-7, Sitz: 9490 Vaduz, MWST-Nr. 50119
UID: CHE-260.887.880
Securities dealer no. 1012328
Herr
Max Mustermann
Schlossallee 1
12345 Buxte
DEUTSCHLAND 1 / 1
Vaduz, 14. April 2020

Abrechnung Kauf Portfolio: 0032132.001
Auftragsnummer: 323232609 Kundenportfolio
Kunde: Cüneyt Beceren
Titel Novo Nordisk A/S
Namen-Aktien -B-
ISIN DK0060534915
Valorennummer 23159222
Wertpapierkennnummer A1XA8R
Abschlussdatum 14.04.2020 09:00:00
Börsenplatz NASDAQ Copenhagen
Anzahl 180 Stück
Kurs DKK 396.00
Kurswert DKK 71'280.00
Eidg. Umsatzabgabe DKK 106.90
Courtage DKK 1'414.16
Broker Kommission DKK 10.69
Belastung DKK Konto 0032132.002 DKK 72'811.75
Valuta 16.04.2020
Wir haben die Titel in das oben genannte Depot eingebucht.
Die Gutschrift im oben erwähnten Depot erfolgt vorbehaltlich der effektiven Lieferung.
0048082 13E T VA I TRD1001 50784613 9:32 14.04.2020 %Media:XML-A4H
Expand Up @@ -15,6 +15,8 @@
import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem;
import name.abuchen.portfolio.datatransfer.Extractor.Item;
import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem;
import name.abuchen.portfolio.datatransfer.Extractor.TransactionItem;
import name.abuchen.portfolio.datatransfer.actions.AssertImportActions;
import name.abuchen.portfolio.datatransfer.pdf.LGTBankPDFExtractor;
import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile;
import name.abuchen.portfolio.model.AccountTransaction;
Expand All @@ -29,7 +31,6 @@
@SuppressWarnings("nls")
public class LGTBankPDFExtractorTest
{

@Test
public void testWertpapierKauf01()
{
Expand All @@ -46,7 +47,7 @@ public void testWertpapierKauf01()
Security security = results.stream().filter(i -> i instanceof SecurityItem).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DK0010244508"));
assertThat(security.getName(), is("A.P. Moeller - Maersk A/S"));
assertThat(security.getName(), is("A.P. Moeller - Maersk A/S Namen- und Inhaber-Aktien -B-"));

// check buy sell transaction
Optional<Item> item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
Expand All @@ -57,11 +58,75 @@ public void testWertpapierKauf01()
assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY));

assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(82452.21)));
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-14T09:00:02")));
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(12)));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("DKK", Values.Amount.factorize(1534.90 + 12.12))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of("DKK", Values.Amount.factorize(121.19))));
}

@Test
public void testWertpapierKauf02()
{
LGTBankPDFExtractor extractor = new LGTBankPDFExtractor(new Client());

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

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

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

// check security
Security security = results.stream().filter(i -> i instanceof SecurityItem).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("DK0060534915"));
assertThat(security.getName(), is("Novo Nordisk A/S Namen-Aktien -B-"));

// check buy sell transaction
Optional<Item> item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst();
assertThat(item.orElseThrow(IllegalArgumentException::new).getSubject(), instanceOf(BuySellEntry.class));
BuySellEntry entry = (BuySellEntry) item.orElseThrow(IllegalArgumentException::new).getSubject();

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

assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(72811.75)));
assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-04-16T00:00")));
assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(180)));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE),
is(Money.of("DKK", Values.Amount.factorize(1414.16 + 10.69))));
assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX),
is(Money.of("DKK", Values.Amount.factorize(106.90))));
}

@Test
public void testAusschuettung01()
{
LGTBankPDFExtractor extractor = new LGTBankPDFExtractor(new Client());

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

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

assertThat(errors, empty());
assertThat(results.size(), is(2));
new AssertImportActions().check(results, "EUR");

Security security = results.stream().filter(i -> i instanceof SecurityItem).findFirst()
.orElseThrow(IllegalArgumentException::new).getSecurity();
assertThat(security.getIsin(), is("FR0000124141"));
assertThat(security.getName(), is("Veolia Environnement SA Namen- und Inhaber-Aktien"));

AccountTransaction transaction = (AccountTransaction) results.stream().filter(i -> i instanceof TransactionItem)
.findFirst().orElseThrow(IllegalArgumentException::new).getSubject();

assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS));
assertThat(transaction.getMonetaryAmount(), is(Money.of("EUR", Values.Amount.factorize(198.36))));
assertThat(transaction.getShares(), is(Values.Share.factorize(551)));
assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2020-05-14T00:00")));
assertThat(transaction.getUnitSum(Unit.Type.TAX), is(Money.of("EUR", Values.Amount.factorize(77.14))));
}
}
Expand Up @@ -47,9 +47,9 @@ private void addBuySellTransaction()

Transaction<BuySellEntry> pdfTransaction = new Transaction<>();
pdfTransaction.subject(() -> {
BuySellEntry entry = new BuySellEntry();
entry.setType(PortfolioTransaction.Type.BUY);
return entry;
BuySellEntry entry = new BuySellEntry();
entry.setType(PortfolioTransaction.Type.BUY);
return entry;
});

Block firstRelevantLine = new Block(".*Abrechnung Kauf.*");
Expand Down