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;
@SuppressWarnings("nls")
public class CommerzbankPDFExctractor extends AbstractPDFExtractor
{
public CommerzbankPDFExctractor(Client client) throws IOException
{
super(client);
addBankIdentifier("C O M M E R Z B A N K"); //$NON-NLS-1$
addBuyTransaction();
addDividendTransaction();
}
private void addBuyTransaction()
{
DocumentType type = new DocumentType("W e r t p a p i e r k a u f");
this.addDocumentTyp(type);
Block block = new Block("W e r t p a p i e r k a u f");
type.addBlock(block);
block.set(new Transaction<BuySellEntry>()
.subject(() -> {
BuySellEntry entry = new BuySellEntry();
entry.setType(PortfolioTransaction.Type.BUY);
return entry;
})
.section("amount", "currency") //
.match(".*Zu I h r e n L a s t e n.*")
.match("^.* (\\d \\d . \\d \\d . \\d \\d \\d \\d) (?<currency>\\w{3}+)(?<amount>( \\d)*( \\.)?( \\d)* ,( \\d)*)$")
.assign((t, v) -> {
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
t.setAmount(asAmount(stripBlanks(v.get("amount"))));
})
.section("date") //
.match("G e s c h รค f t s t a g : (?<date>\\d \\d . \\d \\d . \\d \\d \\d \\d) .*")
.assign((t, v) -> t.setDate(asDate(stripBlanks(v.get("date")))))
.section("shares") //
.match("S t . (?<shares>[\\d ,.]*) .*")
.assign((t, v) -> t.setShares(asShares(stripBlanks(v.get("shares")))))
.section("wkn", "name", "isin", "currency")
.match(".*W e r t p a p i e r - B e z e i c h n u n g.*").match("(?<name>.*) (?<wkn>\\S*)")
.match("^IBAN.*$") //
.match("^(?<isin>.*) (?<currency>\\w{3}+) (\\d \\d . \\d \\d . \\d \\d \\d \\d) (\\w{3}+)(( \\d)*( \\.)?( \\d)* ,( \\d)*)$")
.assign((t, v) -> {
v.put("isin", stripBlanks(v.get("isin")));
t.setSecurity(getOrCreateSecurity(v));
})
.wrap(BuySellEntryItem::new));
}
private void addDividendTransaction()
{
DocumentType type = new DocumentType("E r t r a g s g u t s c h r i f t");
this.addDocumentTyp(type);
Block block = new Block("E r t r a g s g u t s c h r i f t");
type.addBlock(block);
block.set(new Transaction<AccountTransaction>()
.subject(() -> {
AccountTransaction transaction = new AccountTransaction();
transaction.setType(AccountTransaction.Type.DIVIDENDS);
return transaction;
})
.section("date", "amount", "currency") //
.match(".*Zu I h r e n Gunsten.*")
.match("^.* (?<date>\\d \\d . \\d \\d . \\d \\d \\d \\d) (?<currency>\\w{3}+)(?<amount>( \\d)*( \\.)?( \\d)* ,( \\d)*)$")
.assign((t, v) -> {
t.setDate(asDate(stripBlanks(v.get("date"))));
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
t.setAmount(asAmount(stripBlanks(v.get("amount"))));
})
.section("wkn", "name", "shares", "isin")
//
.match(".*W e r t p a p i e r - B e z e i c h n u n g.*")
.match("p e r \\d \\d . \\d \\d . \\d \\d \\d \\d (?<name>.*) (?<wkn>\\S*)")
.match("^STK (?<shares>(\\d )*(\\. )?(\\d )*, (\\d )*).* (?<isin>\\S*)$").assign((t, v) -> {
// if necessary, create the security with the
// currency of the transaction
v.put("currency", t.getCurrencyCode());
t.setSecurity(getOrCreateSecurity(v));
t.setShares(asShares(stripBlanks(v.get("shares"))));
})
.wrap(TransactionItem::new));
}
private String stripBlanks(String input)
{
return input.replaceAll("\\s", ""); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
public String getLabel()
{
return "Commerzbank"; //$NON-NLS-1$
}
}