Package org.openbankdata.bank.sveadirekt.service

Source Code of org.openbankdata.bank.sveadirekt.service.SveaDirektTransactionService

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);
  }
}
TOP

Related Classes of org.openbankdata.bank.sveadirekt.service.SveaDirektTransactionService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.