package name.abuchen.portfolio.datatransfer.pdf; import java.io.IOException; import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block; import name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType; import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction; import name.abuchen.portfolio.model.AccountTransaction; import name.abuchen.portfolio.model.BuySellEntry; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.model.Transaction.Unit; import name.abuchen.portfolio.money.Money; public class INGDiBaExtractor extends AbstractPDFExtractor { public INGDiBaExtractor(Client client) throws IOException { super(client); addBuyTransaction(); addSellTransaction(); addErtragsgutschrift(); addZinsgutschrift(); addDividendengutschrift(); } @Override public String getLabel() { return "ING-DiBa"; //$NON-NLS-1$ } @SuppressWarnings("nls") private void addBuyTransaction() { DocumentType type = new DocumentType("Wertpapierabrechnung Kauf"); this.addDocumentTyp(type); Block block = new Block("Wertpapierabrechnung Kauf.*"); type.addBlock(block); block.set(new Transaction<BuySellEntry>() .subject(() -> { BuySellEntry entry = new BuySellEntry(); entry.setType(PortfolioTransaction.Type.BUY); return entry; }) .section("wkn", "isin", "name") // .match("^ISIN \\(WKN\\) (?<isin>[^ ]*) \\((?<wkn>.*)\\)$") .match("Wertpapierbezeichnung (?<name>.*)").assign((t, v) -> { t.setSecurity(getOrCreateSecurity(v)); }) .section("shares") // .match("^Nominale( St.ck)? (?<shares>[\\d.]+(,\\d+)?).*") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) .section("date") // .match("Valuta (?<date>\\d+.\\d+.\\d{4}+)") // .assign((t, v) -> t.setDate(asDate(v.get("date")))) .section("amount", "currency") // .match("Endbetrag zu Ihren Lasten (?<currency>\\w{3}+) (?<amount>[\\d.]+,\\d+)") // .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) .section("fee", "currency").optional() // .match("Handelsplatzgeb.hr (?<currency>\\w{3}+) (?<fee>[\\d.]+,\\d+)") // .assign((t, v) -> t.getPortfolioTransaction().addUnit(new Unit(Unit.Type.FEE, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fee")))))) .section("fee", "currency").optional() // .match("Provision (?<currency>\\w{3}+) (?<fee>[\\d.]+,\\d+)") // .assign((t, v) -> t.getPortfolioTransaction().addUnit(new Unit(Unit.Type.FEE, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fee")))))) .section("fee", "currency").optional() // .match("Handelsentgelt (?<currency>\\w{3}+) (?<fee>[\\d.]+,\\d+)") // .assign((t, v) -> t.getPortfolioTransaction() .addUnit(new Unit(Unit.Type.FEE, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fee")))))) .wrap(t -> new BuySellEntryItem(t))); } @SuppressWarnings("nls") private void addSellTransaction() { DocumentType type = new DocumentType("Wertpapierabrechnung Verkauf"); this.addDocumentTyp(type); Block block = new Block("Wertpapierabrechnung Verkauf.*"); type.addBlock(block); block.set(new Transaction<BuySellEntry>() .subject(() -> { BuySellEntry entry = new BuySellEntry(); entry.setType(PortfolioTransaction.Type.SELL); return entry; }) .section("wkn", "isin", "name") // .match("^ISIN \\(WKN\\) (?<isin>[^ ]*) \\((?<wkn>.*)\\)$") .match("Wertpapierbezeichnung (?<name>.*)") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) .section("shares") // .match("^Nominale St.ck (?<shares>[\\d.]+(,\\d+)?)") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) .section("date") // .match("Valuta (?<date>\\d+.\\d+.\\d{4}+)") // .assign((t, v) -> t.setDate(asDate(v.get("date")))) .section("amount", "currency") // .match("Endbetrag zu Ihren Gunsten (?<currency>\\w{3}+) (?<amount>[\\d.]+,\\d+)") // .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) .section("fee", "currency").optional() // .match("Handelsplatzgeb.hr (?<currency>\\w{3}+) (?<fee>[\\d.]+,\\d+)") // .assign((t, v) -> t.getPortfolioTransaction().addUnit(new Unit(Unit.Type.FEE, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fee")))))) .section("fee", "currency").optional() // .match("Provision (?<currency>\\w{3}+) (?<fee>[\\d.]+,\\d+)") // .assign((t, v) -> t.getPortfolioTransaction().addUnit(new Unit(Unit.Type.FEE, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fee")))))) .section("fee", "currency").optional() // .match("Handelsentgelt (?<currency>\\w{3}+) (?<fee>[\\d.]+,\\d+)") // .assign((t, v) -> t.getPortfolioTransaction().addUnit(new Unit(Unit.Type.FEE, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("fee")))))) .section("tax", "currency").optional() // .match("Kapitalertragsteuer \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.getPortfolioTransaction().addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .section("tax", "currency").optional() // .match("Solidarit.tszuschlag \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.getPortfolioTransaction().addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .wrap(BuySellEntryItem::new)); } @SuppressWarnings("nls") private void addErtragsgutschrift() { DocumentType type = new DocumentType("Ertragsgutschrift"); this.addDocumentTyp(type); Block block = new Block("Ertragsgutschrift"); type.addBlock(block); block.set(new Transaction<AccountTransaction>() .subject(() -> { AccountTransaction transaction = new AccountTransaction(); transaction.setType(AccountTransaction.Type.DIVIDENDS); return transaction; }) .section("wkn", "isin", "name") // .match("^ISIN \\(WKN\\) (?<isin>[^ ]*) \\((?<wkn>.*)\\)$") .match("Wertpapierbezeichnung (?<name>.*)") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) .section("shares") // .match("^Nominale (?<shares>[\\d.]+(,\\d+)?) .*") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) .section("date") // .match("Valuta (?<date>\\d+.\\d+.\\d{4}+)") // .assign((t, v) -> t.setDate(asDate(v.get("date")))) .section("amount", "currency") // .match("Gesamtbetrag zu Ihren Gunsten (?<currency>\\w{3}+) (?<amount>[\\d.]+,\\d+)") // .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) .section("tax", "currency").optional() // .match("Kapitalertragsteuer \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .section("tax", "currency").optional() // .match("Solidarit.tszuschlag \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .wrap(TransactionItem::new)); } @SuppressWarnings("nls") private void addZinsgutschrift() { DocumentType type = new DocumentType("Zinsgutschrift"); this.addDocumentTyp(type); Block block = new Block("Zinsgutschrift"); type.addBlock(block); block.set(new Transaction<AccountTransaction>() .subject(() -> { AccountTransaction transaction = new AccountTransaction(); transaction.setType(AccountTransaction.Type.DIVIDENDS); return transaction; }) .section("wkn", "isin", "name") // .match("^ISIN \\(WKN\\) (?<isin>[^ ]*) \\((?<wkn>.*)\\)$") .match("Wertpapierbezeichnung (?<name>.*)") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) .section("date") // .match("Valuta (?<date>\\d+.\\d+.\\d{4}+)") // .assign((t, v) -> t.setDate(asDate(v.get("date")))) .section("amount", "currency") // .match("Gesamtbetrag zu Ihren Gunsten (?<currency>\\w{3}+) (?<amount>[\\d.]+,\\d+)") // .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) .section("tax", "currency").optional() // .match("Kapitalertragsteuer \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .section("tax", "currency").optional() // .match("Solidarit.tszuschlag \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .wrap(TransactionItem::new)); } @SuppressWarnings("nls") private void addDividendengutschrift() { DocumentType type = new DocumentType("Dividendengutschrift"); this.addDocumentTyp(type); Block block = new Block("Dividendengutschrift"); type.addBlock(block); block.set(new Transaction<AccountTransaction>() .subject(() -> { AccountTransaction transaction = new AccountTransaction(); transaction.setType(AccountTransaction.Type.DIVIDENDS); return transaction; }) .section("wkn", "isin", "name") // .match("^ISIN \\(WKN\\) (?<isin>[^ ]*) \\((?<wkn>.*)\\)$") .match("Wertpapierbezeichnung (?<name>.*)") .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) .section("shares") // .match("^Nominale (?<shares>[\\d.]+(,\\d+)?) .*") .assign((t, v) -> t.setShares(asShares(v.get("shares")))) .section("date") // .match("Valuta (?<date>\\d+.\\d+.\\d{4}+)") // .assign((t, v) -> t.setDate(asDate(v.get("date")))) .section("amount", "currency") // .match("Gesamtbetrag zu Ihren Gunsten (?<currency>\\w{3}+) (?<amount>[\\d.]+,\\d+)") // .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); }) .section("tax", "currency").optional() // .match("Kapitalertragsteuer \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .section("tax", "currency").optional() // .match("Solidarit.tszuschlag \\d+,\\d+ ?% (?<currency>\\w{3}+) (?<tax>[\\d.]+,\\d+)") .assign((t, v) -> t.addUnit(new Unit(Unit.Type.TAX, Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("tax")))))) .wrap(TransactionItem::new)); } }