package org.openbankdata.bank.sveadirekt.service;
import org.openbankdata.bank.sveadirekt.client.SveaDirektBankClient;
import org.openbankdata.core.Account;
import org.openbankdata.core.Transaction;
import org.openbankdata.core.client.BankClient;
import org.openbankdata.core.client.BankRequest;
import org.openbankdata.core.client.BankResponse;
import org.openbankdata.core.service.AbstractTransactionService;
import org.joda.time.LocalDate;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Currency;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Service class for accessing transaction data at SveaDirekt.
*/
public class SveaDirektTransactionService extends AbstractTransactionService {
private static final String TRANSACTIONS_URL =
"https://services.sveadirekt.se/faces/WEB-INF/britney_jsp_s/balance.jsp";
private BankClient mBankClient;
public SveaDirektTransactionService(SveaDirektBankClient pBankClient) {
mBankClient = pBankClient;
}
@Override
public List<Transaction> getTransactions(Account pAccount, LocalDate pFromDate,
LocalDate pToDate) {
List<Transaction> vTransactions = new ArrayList<Transaction>();
BankResponse response = fetchTransactionData(pAccount);
vTransactions.addAll(parseTransactions(response.body()));
return filterTransactions(vTransactions, pFromDate, pToDate);
}
BankResponse fetchTransactionData(Account pAccount) {
return mBankClient.post(createTransactionRequest(pAccount));
}
private String createAccountFormInput(Account pAccount) {
String vAccountId = pAccount.getId();
return "balanceForm:accountsList:" + vAccountId.substring(vAccountId.indexOf(':') + 1);
}
private String createAccountFormName(Account pAccount) {
String vAccountId = pAccount.getId();
String vId = vAccountId.substring(0, vAccountId.indexOf(':'));
return "balanceForm:" + vId;
}
private List<Transaction> parseTransactions(String pResponse) {
List<Transaction> vTransactions = new ArrayList<Transaction>();
Document doc = Jsoup.parse(pResponse);
Elements vTransactionElements =
doc.getElementById("balanceForm:transactionPostList").select("tbody tr");
for (Element element : vTransactionElements) {
Transaction vTransaction = new Transaction();
Elements vTransactionElement = element.select("td");
vTransaction.setAmount(new BigDecimal(vTransactionElement.get(1).text()
.replaceAll("[^\\d-]", "")));
vTransaction.setDescription(vTransactionElement.get(2).text());
if (!vTransaction.hasDescription()) {
vTransaction
.setDescription(vTransaction.getAmount().compareTo(BigDecimal.ZERO) > 0 ? "Insättning"
: "Uttag");
}
vTransaction.setCurrency(Currency.getInstance("SEK"));
vTransaction.setTransactionDate(new LocalDate(vTransactionElement.first().text()));
vTransactions.add(vTransaction);
}
return vTransactions;
}
BankRequest createTransactionRequest(Account pAccount) {
Map<String, String> params = new HashMap<String, String>();
params.put("balanceForm", "balanceForm");
params.put(createAccountFormName(pAccount), createAccountFormInput(pAccount));
return new BankRequest().setUri(TRANSACTIONS_URL).setParams(params);
}
}